From 533ddcf3cc976c8d5db498324edcf61a74eff876 Mon Sep 17 00:00:00 2001 From: Gavriil Sitnikov Date: Fri, 11 Dec 2015 00:36:59 +0300 Subject: [PATCH] permissions request added to activity --- .../navigation/AbstractBaseActivity.java | 63 ++++++++++++++++++- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/roboswag/components/navigation/AbstractBaseActivity.java b/src/main/java/org/roboswag/components/navigation/AbstractBaseActivity.java index d41ec09..936a98c 100644 --- a/src/main/java/org/roboswag/components/navigation/AbstractBaseActivity.java +++ b/src/main/java/org/roboswag/components/navigation/AbstractBaseActivity.java @@ -22,12 +22,15 @@ package org.roboswag.components.navigation; import android.app.ActivityManager; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; +import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.view.MenuItem; import android.view.View; @@ -35,17 +38,32 @@ import android.view.inputmethod.InputMethodManager; import org.roboswag.components.utils.UiUtils; +import java.util.HashMap; +import java.util.Map; + +import rx.Observable; +import rx.subjects.PublishSubject; + /** * Created by Gavriil Sitnikov on 21/10/2015. * TODO: fill description */ +@SuppressWarnings("PMD.GodClass") public abstract class AbstractBaseActivity extends AppCompatActivity implements FragmentManager.OnBackStackChangedListener, OnFragmentStartedListener { private static final String TOP_FRAGMENT_TAG_MARK = "TOP_FRAGMENT"; + private static final String REQUESTED_PERMISSION_EXTRA = "REQUESTED_PERMISSION_EXTRA"; + private static final int REQUESTED_PERMISSION_REQUEST_CODE = 17; + + private final Map permissionsMap = new HashMap<>(); + private boolean isPaused; + @Nullable + private String requestedPermission; + private final PublishSubject requestPermissionsEvent = PublishSubject.create(); /* Returns id of main fragments container where navigation-node fragments should be */ protected int getFragmentContainerId() { @@ -81,10 +99,39 @@ public abstract class AbstractBaseActivity extends AppCompatActivity return false; } + @NonNull + public Observable requestPermission(@NonNull final String permission) { + final Boolean isPermissionGrantedCache = permissionsMap.get(permission); + if (isPermissionGrantedCache != null) { + return Observable.just(isPermissionGrantedCache); + } else if (ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED) { + permissionsMap.put(permission, true); + return Observable.just(true); + } + requestedPermission = permission; + ActivityCompat.requestPermissions(this, new String[]{permission}, REQUESTED_PERMISSION_REQUEST_CODE); + return requestPermissionsEvent; + } + + @SuppressWarnings("PMD.UseVarargs") + @Override + public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode == REQUESTED_PERMISSION_REQUEST_CODE) { + final boolean isGranted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED; + permissionsMap.put(requestedPermission, isGranted); + requestedPermission = null; + requestPermissionsEvent.onNext(isGranted); + } + } + @Override protected void onCreate(@Nullable final Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportFragmentManager().addOnBackStackChangedListener(this); + if (savedInstanceState != null) { + requestedPermission = savedInstanceState.getString(REQUESTED_PERMISSION_EXTRA); + } } @Override @@ -99,6 +146,12 @@ public abstract class AbstractBaseActivity extends AppCompatActivity super.onPause(); } + @Override + public void onSaveInstanceState(final Bundle stateToSave) { + super.onSaveInstanceState(stateToSave); + stateToSave.putString(REQUESTED_PERMISSION_EXTRA, requestedPermission); + } + @Override public void onFragmentStarted(@NonNull final AbstractBaseFragment fragment) { hideSoftInput(); @@ -111,6 +164,7 @@ public abstract class AbstractBaseActivity extends AppCompatActivity } /* Setting fragment of special class as first in stack */ + public T setFirstFragment(@NonNull final Class fragmentClass) { return setFirstFragment(fragmentClass, null); } @@ -165,7 +219,8 @@ public abstract class AbstractBaseActivity extends AppCompatActivity } /* Setting fragment of special class as top with args */ - public T setFragment(@NonNull final Class fragmentClass, @Nullable final Bundle args) { + public T setFragment(@NonNull final Class fragmentClass, + @Nullable final Bundle args) { return addFragmentToStack(fragmentClass, args, fragmentClass.getName() + ' ' + TOP_FRAGMENT_TAG_MARK); } @@ -175,7 +230,8 @@ public abstract class AbstractBaseActivity extends AppCompatActivity } /* Pushing fragment of special class with args to fragments stack */ - public T pushFragment(@NonNull final Class fragmentClass, @Nullable final Bundle args) { + public T pushFragment(@NonNull final Class fragmentClass, + @Nullable final Bundle args) { return addFragmentToStack(fragmentClass, args, fragmentClass.getName()); } @@ -221,7 +277,8 @@ public abstract class AbstractBaseActivity extends AppCompatActivity } } - private void findTopFragmentAndPopBackStackToIt(@NonNull final FragmentManager fragmentManager, final int stackSize) { + private void findTopFragmentAndPopBackStackToIt(@NonNull final FragmentManager fragmentManager, + final int stackSize) { String lastFragmentName = fragmentManager.getBackStackEntryAt(stackSize - 1).getName(); for (int i = stackSize - 2; i >= 0; i--) { final String currentFragmentName = fragmentManager.getBackStackEntryAt(i).getName();