diff --git a/app/build.gradle b/app/build.gradle
index 2ab2f8a..c100a9c 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -22,7 +22,7 @@ android {
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
- compile 'com.android.support:appcompat-v7:23.1.1'
- compile 'com.android.support:design:23.1.1'
+ compile 'com.android.support:appcompat-v7:23.3.0'
+ compile 'com.android.support:design:23.3.0'
compile project(':permiso')
}
diff --git a/app/src/main/java/com/greysonparrelli/permisodemo/MainActivity.java b/app/src/main/java/com/greysonparrelli/permisodemo/MainActivity.java
index 4120a4e..5b987fe 100644
--- a/app/src/main/java/com/greysonparrelli/permisodemo/MainActivity.java
+++ b/app/src/main/java/com/greysonparrelli/permisodemo/MainActivity.java
@@ -96,7 +96,8 @@ public void onPermissionResult(Permiso.ResultSet resultSet) {
if (resultSet.isPermissionGranted(Manifest.permission.READ_CALENDAR)) {
numGranted++;
}
- Toast.makeText(MainActivity.this, numGranted + R.string.two_permission_granted, Toast.LENGTH_SHORT).show();
+ String message = getString(R.string.X_permissions_granted, numGranted);
+ Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
}
@Override
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index cc7fa89..6a1ba7d 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -6,5 +6,5 @@
Permission Granted!
Permission Permanently Denied.
Permission Denied.
- 2 Permissions Granted.
+ %1$d Permissions Granted.
diff --git a/build.gradle b/build.gradle
index 6e9f8d2..9ca9021 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,7 +5,7 @@ buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:1.3.0'
+ classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 0dd6551..0bcd3d4 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/permiso/build.gradle b/permiso/build.gradle
index bbef923..6857e77 100644
--- a/permiso/build.gradle
+++ b/permiso/build.gradle
@@ -45,7 +45,7 @@ android {
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
- compile 'com.android.support:appcompat-v7:23.1.1'
+ compile 'com.android.support:appcompat-v7:23.3.0'
}
// Only add in the bintray stuff if we're building locally
diff --git a/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java b/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java
index 59584bd..2814e2f 100644
--- a/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java
+++ b/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java
@@ -3,10 +3,13 @@
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Bundle;
+import android.os.Handler;
import android.support.annotation.MainThread;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentManager;
import android.support.v4.content.ContextCompat;
import android.util.Log;
@@ -34,9 +37,9 @@ public class Permiso {
/**
* The active activity. Used to make permissions requests. This must be set by the library-user through
- * {@link Permiso#setActivity(Activity)} or else bad things will happen.
+ * {@link Permiso#setActivity(FragmentActivity)} or else bad things will happen.
*/
- private WeakReference mActivity;
+ private WeakReference mActivity;
/**
* This is just a value we increment to generate new request codes for use with
@@ -81,13 +84,13 @@ private Permiso() {
* Important: If your activity subclasses {@link PermisoActivity}, this is already handled for you.
* @param activity The activity that is currently active.
*/
- public void setActivity(@NonNull Activity activity) {
+ public void setActivity(@NonNull FragmentActivity activity) {
mActivity = new WeakReference<>(activity);
}
/**
* Request one or more permissions from the system. Make sure that you are either subclassing {@link PermisoActivity}
- * or that you have set your current activity using {@link Permiso#setActivity(Activity)}!
+ * or that you have set your current activity using {@link Permiso#setActivity(FragmentActivity)}!
* @param callback
* A callback that will be triggered when the results of your permission request are available.
* @param permissions
@@ -96,13 +99,13 @@ public void setActivity(@NonNull Activity activity) {
*/
@MainThread
public void requestPermissions(@NonNull IOnPermissionResult callback, String... permissions) {
- checkActivity();
+ FragmentActivity activity = checkActivity();
final RequestData requestData = new RequestData(callback, permissions);
// Mark any permissions that are already granted
for (String permission : permissions) {
- if (ContextCompat.checkSelfPermission(mActivity.get(), permission) == PackageManager.PERMISSION_GRANTED) {
+ if (ContextCompat.checkSelfPermission(activity, permission) == PackageManager.PERMISSION_GRANTED) {
requestData.resultSet.grantPermissions(permission);
}
}
@@ -122,7 +125,7 @@ public void requestPermissions(@NonNull IOnPermissionResult callback, String...
final int requestCode = markRequestAsActive(requestData);
// First check if there's any permissions for which we need to provide a rationale for using
- String[] permissionsThatNeedRationale = requestData.resultSet.getPermissionsThatNeedRationale(mActivity.get());
+ String[] permissionsThatNeedRationale = requestData.resultSet.getPermissionsThatNeedRationale(activity);
// If there are some that need a rationale, show that rationale, then continue with the request
if (permissionsThatNeedRationale.length > 0) {
@@ -152,15 +155,23 @@ public void onRationaleProvided() {
* The grant results given to you by {@link Activity#onRequestPermissionsResult(int, String[], int[])}.
*/
@MainThread
- public void onRequestPermissionResult(int requestCode, String[] permissions, int[] grantResults) {
- if (mCodesToRequests.containsKey(requestCode)) {
- RequestData requestData = mCodesToRequests.get(requestCode);
- requestData.resultSet.parsePermissionResults(permissions, grantResults, mActivity.get());
- requestData.onResultListener.onPermissionResult(requestData.resultSet);
- mCodesToRequests.remove(requestCode);
- } else {
- Log.w(TAG, "onRequestPermissionResult() was given an unrecognized request code.");
- }
+ public void onRequestPermissionResult(final int requestCode, final String[] permissions, final int[] grantResults) {
+ // If we don't do this, android.support.v4.app.DialogFragment will throw IllegalStateException. See bug:
+ // https://code.google.com/p/android/issues/detail?id=190966
+ new Handler().post(new Runnable() {
+ @Override
+ public void run() {
+ FragmentActivity activity = checkActivity();
+ if (mCodesToRequests.containsKey(requestCode)) {
+ RequestData requestData = mCodesToRequests.get(requestCode);
+ requestData.resultSet.parsePermissionResults(permissions, grantResults, activity);
+ requestData.onResultListener.onPermissionResult(requestData.resultSet);
+ mCodesToRequests.remove(requestCode);
+ } else {
+ Log.w(TAG, "onRequestPermissionResult() was given an unrecognized request code.");
+ }
+ }
+ });
}
/**
@@ -178,9 +189,17 @@ public void onRequestPermissionResult(int requestCode, String[] permissions, int
*/
@MainThread
public void showRationaleInDialog(@Nullable String title, @NonNull String message, @Nullable String buttonText, @NonNull final IOnRationaleProvided rationaleCallback) {
- checkActivity();
+ FragmentActivity activity = checkActivity();
+
+ FragmentManager fm = activity.getSupportFragmentManager();
+
+ PermisoDialogFragment dialogFragment = (PermisoDialogFragment) fm.findFragmentByTag(PermisoDialogFragment.TAG);
+ if (dialogFragment != null)
+ {
+ dialogFragment.dismiss();
+ }
- PermisoDialogFragment dialogFragment = PermisoDialogFragment.newInstance(title, message, buttonText);
+ dialogFragment = PermisoDialogFragment.newInstance(title, message, buttonText);
// We show the rationale after the dialog is closed. We use setRetainInstance(true) in the dialog to ensure that
// it retains the listener after an app rotation.
@@ -190,7 +209,7 @@ public void onClose() {
rationaleCallback.onRationaleProvided();
}
});
- dialogFragment.show(mActivity.get().getFragmentManager(), PermisoDialogFragment.TAG);
+ dialogFragment.show(fm, PermisoDialogFragment.TAG);
}
@@ -257,18 +276,21 @@ private int markRequestAsActive(RequestData requestData) {
* @param requestCode The request code of the request you want to run.
*/
private void makePermissionRequest(int requestCode) {
+ FragmentActivity activity = checkActivity();
RequestData requestData = mCodesToRequests.get(requestCode);
- ActivityCompat.requestPermissions(mActivity.get(), requestData.resultSet.getUngrantedPermissions(), requestCode);
+ ActivityCompat.requestPermissions(activity, requestData.resultSet.getUngrantedPermissions(), requestCode);
}
/**
* Ensures that our WeakReference to the Activity is still valid. If it isn't, throw an exception saying that the
* Activity needs to be set.
*/
- private void checkActivity() {
- if (mActivity.get() == null) {
+ private FragmentActivity checkActivity() {
+ FragmentActivity activity = mActivity.get();
+ if (activity == null) {
throw new IllegalStateException("No activity set. Either subclass PermisoActivity or call Permiso.setActivity() in onCreate() and onResume() of your Activity.");
}
+ return activity;
}
diff --git a/permiso/src/main/java/com/greysonparrelli/permiso/PermisoActivity.java b/permiso/src/main/java/com/greysonparrelli/permiso/PermisoActivity.java
index 32a417b..87cc872 100644
--- a/permiso/src/main/java/com/greysonparrelli/permiso/PermisoActivity.java
+++ b/permiso/src/main/java/com/greysonparrelli/permiso/PermisoActivity.java
@@ -3,13 +3,14 @@
import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.NonNull;
+import android.support.v4.app.FragmentActivity;
import android.support.v7.app.AppCompatActivity;
/**
* An Activity that handles the small amount of boilerplate that {@link Permiso} requires to run. If you'd rather not
* use this as your base activity class, simply remember to do the following in each of your activities:
*
- * - Call {@link Permiso#setActivity(Activity)} in {@link Activity#onCreate(Bundle)} and {@link Activity#onResume()}
+ * - Call {@link Permiso#setActivity(FragmentActivity)} in {@link Activity#onCreate(Bundle)} and {@link Activity#onResume()}
* - Call {@link Permiso#onRequestPermissionResult(int, String[], int[])} in
* {@link Activity#onRequestPermissionsResult(int, String[], int[])}
*
@@ -29,7 +30,7 @@ protected void onResume() {
}
@Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
Permiso.getInstance().onRequestPermissionResult(requestCode, permissions, grantResults);
}
diff --git a/permiso/src/main/java/com/greysonparrelli/permiso/PermisoDialogFragment.java b/permiso/src/main/java/com/greysonparrelli/permiso/PermisoDialogFragment.java
index 6fe543f..64a4d48 100644
--- a/permiso/src/main/java/com/greysonparrelli/permiso/PermisoDialogFragment.java
+++ b/permiso/src/main/java/com/greysonparrelli/permiso/PermisoDialogFragment.java
@@ -1,11 +1,11 @@
package com.greysonparrelli.permiso;
import android.app.Dialog;
-import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
+import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
/**
@@ -70,6 +70,7 @@ public void onDestroyView() {
super.onDestroyView();
}
+ @NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());