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: * @@ -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());