Skip to content
This repository was archived by the owner on Oct 3, 2024. It is now read-only.

Commit 6d8c936

Browse files
committed
Refactor to delegate to helpers
1 parent 8c71f48 commit 6d8c936

9 files changed

+372
-304
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ ext {
2929

3030
mavenGroup = 'pub.devrel'
3131
mavenArtifactId = 'easypermissions'
32-
mavenVersion = '0.3.1'
32+
mavenVersion = '0.4.0'
3333

3434
bintrayOrg = 'easygoogle'
3535

easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java

Lines changed: 22 additions & 301 deletions
Large diffs are not rendered by default.

easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogFragment.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,22 @@
88
import android.os.Bundle;
99
import android.support.annotation.NonNull;
1010
import android.support.annotation.RequiresApi;
11+
import android.support.annotation.RestrictTo;
1112
import android.support.annotation.StringRes;
1213

1314
/**
1415
* {@link DialogFragment} to display rationale for permission requests when the request comes from
1516
* a Fragment or Activity that can host a Fragment.
1617
*/
1718
@RequiresApi(Build.VERSION_CODES.HONEYCOMB)
19+
@RestrictTo(RestrictTo.Scope.LIBRARY)
1820
public class RationaleDialogFragment extends DialogFragment {
1921

22+
public static final String TAG = "RationaleDialogFragment";
23+
2024
private EasyPermissions.PermissionCallbacks mPermissionCallbacks;
2125

22-
static RationaleDialogFragment newInstance(
26+
public static RationaleDialogFragment newInstance(
2327
@StringRes int positiveButton, @StringRes int negativeButton,
2428
@NonNull String rationaleMsg, int requestCode, @NonNull String[] permissions) {
2529

easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogFragmentCompat.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import android.os.Bundle;
77
import android.support.annotation.NonNull;
88
import android.support.annotation.RequiresApi;
9+
import android.support.annotation.RestrictTo;
910
import android.support.annotation.StringRes;
1011
import android.support.v7.app.AppCompatDialogFragment;
1112

@@ -14,11 +15,14 @@
1415
* comes from a Fragment or Activity that can host a Fragment.
1516
*/
1617
@RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
18+
@RestrictTo(RestrictTo.Scope.LIBRARY)
1719
public class RationaleDialogFragmentCompat extends AppCompatDialogFragment {
1820

21+
public static final String TAG = "RationaleDialogFragmentCompat";
22+
1923
private EasyPermissions.PermissionCallbacks mPermissionCallbacks;
2024

21-
static RationaleDialogFragmentCompat newInstance(
25+
public static RationaleDialogFragmentCompat newInstance(
2226
@StringRes int positiveButton, @StringRes int negativeButton,
2327
@NonNull String rationaleMsg, int requestCode, @NonNull String[] permissions) {
2428

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package pub.devrel.easypermissions.helper;
2+
3+
import android.annotation.SuppressLint;
4+
import android.app.Activity;
5+
import android.support.annotation.NonNull;
6+
import android.support.annotation.StringRes;
7+
import android.support.v4.app.ActivityCompat;
8+
9+
/**
10+
* Permissions helper for {@link Activity}.
11+
*/
12+
class ActivityPermissionHelper extends PermissionHelper<Activity> {
13+
14+
public ActivityPermissionHelper(Activity host) {
15+
super(host);
16+
}
17+
18+
@Override
19+
@SuppressLint("NewApi")
20+
public void requestPermissions(@NonNull String rationale,
21+
@StringRes int positiveButton,
22+
@StringRes int negativeButton,
23+
int requestCode,
24+
@NonNull String... perms) {
25+
26+
// Check for permissions before dispatching
27+
if (hasPermissions(getHost(), perms)) {
28+
notifyAlreadyHasPermissions(getHost(), requestCode, perms);
29+
return;
30+
}
31+
32+
if (shouldShowRationale(perms)) {
33+
showRationaleDialogFragment(
34+
getHost().getFragmentManager(),
35+
rationale,
36+
positiveButton,
37+
negativeButton,
38+
requestCode,
39+
perms);
40+
} else {
41+
ActivityCompat.requestPermissions(getHost(), perms, requestCode);
42+
}
43+
}
44+
45+
@Override
46+
public boolean shouldShowRequestPermissionRationale(@NonNull String perm) {
47+
return ActivityCompat.shouldShowRequestPermissionRationale(getHost(), perm);
48+
}
49+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package pub.devrel.easypermissions.helper;
2+
3+
import android.annotation.SuppressLint;
4+
import android.app.Fragment;
5+
import android.support.annotation.NonNull;
6+
import android.support.annotation.StringRes;
7+
8+
/**
9+
* Permissions helper for {@link Fragment} from the framework.
10+
*/
11+
class FrameworkFragmentPermissionHelper extends PermissionHelper<Fragment> {
12+
13+
public FrameworkFragmentPermissionHelper(@NonNull Fragment host) {
14+
super(host);
15+
}
16+
17+
@Override
18+
@SuppressLint("NewApi")
19+
public void requestPermissions(@NonNull String rationale,
20+
@StringRes int positiveButton,
21+
@StringRes int negativeButton, int requestCode,
22+
@NonNull String... perms) {
23+
24+
// Check for permissions before dispatching
25+
if (hasPermissions(getHost().getActivity(), perms)) {
26+
notifyAlreadyHasPermissions(getHost(), requestCode, perms);
27+
return;
28+
}
29+
30+
if (shouldShowRationale(perms)) {
31+
showRationaleDialogFragment(
32+
getHost().getChildFragmentManager(),
33+
rationale,
34+
positiveButton,
35+
negativeButton,
36+
requestCode,
37+
perms);
38+
} else {
39+
getHost().requestPermissions(perms, requestCode);
40+
}
41+
}
42+
43+
@Override
44+
@SuppressLint("NewApi")
45+
public boolean shouldShowRequestPermissionRationale(@NonNull String perm) {
46+
return getHost().shouldShowRequestPermissionRationale(perm);
47+
}
48+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package pub.devrel.easypermissions.helper;
2+
3+
import android.support.annotation.NonNull;
4+
import android.support.annotation.StringRes;
5+
6+
/**
7+
* Permissions helper for apps built against API < 23, which do not need runtime permissions.
8+
*/
9+
class LowApiPermissionsHelper extends PermissionHelper<Object> {
10+
11+
public LowApiPermissionsHelper(@NonNull Object host) {
12+
super(host);
13+
}
14+
15+
@Override
16+
public void requestPermissions(@NonNull String rationale,
17+
@StringRes int positiveButton,
18+
@StringRes int negativeButton,
19+
int requestCode,
20+
@NonNull String... perms) {
21+
22+
// Check for permissions before dispatching
23+
if (hasPermissions(null, perms)) {
24+
notifyAlreadyHasPermissions(getHost(), requestCode, perms);
25+
return;
26+
}
27+
28+
throw new IllegalStateException("Should never be requesting permissions on API < 23!");
29+
}
30+
31+
@Override
32+
public boolean shouldShowRequestPermissionRationale(@NonNull String perm) {
33+
return false;
34+
}
35+
}
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
package pub.devrel.easypermissions.helper;
2+
3+
import android.app.Activity;
4+
import android.content.Context;
5+
import android.content.pm.PackageManager;
6+
import android.os.Build;
7+
import android.support.annotation.NonNull;
8+
import android.support.annotation.RequiresApi;
9+
import android.support.annotation.RestrictTo;
10+
import android.support.annotation.StringRes;
11+
import android.support.v4.app.Fragment;
12+
import android.support.v4.content.ContextCompat;
13+
import android.util.Log;
14+
15+
import java.util.List;
16+
17+
import pub.devrel.easypermissions.EasyPermissions;
18+
import pub.devrel.easypermissions.RationaleDialogFragment;
19+
20+
/**
21+
* Delegate class to make permission calls based on the 'host' (Fragment, Activity, etc).
22+
*/
23+
@RestrictTo(RestrictTo.Scope.LIBRARY)
24+
public abstract class PermissionHelper<T> {
25+
26+
private static final String TAG = "PermissionHelper";
27+
28+
private T mHost;
29+
30+
@NonNull
31+
public static PermissionHelper getInstance(Object host) {
32+
// If the API version is < M, just return an PermissionsHelper that does not do anything.
33+
if (Build.VERSION.SDK_INT < 23) {
34+
return new LowApiPermissionsHelper(host);
35+
}
36+
37+
if (host instanceof Activity) {
38+
return new ActivityPermissionHelper((Activity) host);
39+
} else if (host instanceof Fragment) {
40+
return new SupportFragmentPermissionHelper((Fragment) host);
41+
} else if (host instanceof android.app.Fragment) {
42+
return new FrameworkFragmentPermissionHelper((android.app.Fragment) host);
43+
} else {
44+
throw new IllegalArgumentException("Host object must be an Activity or Fragment");
45+
}
46+
}
47+
48+
// ============================================================================
49+
// Public concrete methods
50+
// ============================================================================
51+
52+
public PermissionHelper(@NonNull T host) {
53+
this.mHost = host;
54+
}
55+
56+
public static boolean hasPermissions(Context context, String... perms) {
57+
// Always return true for SDK < M, let the system deal with the permissions
58+
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
59+
Log.w(TAG, "hasPermissions: API version < M, returning true by default");
60+
61+
// DANGER ZONE!!! Changing this will break the library.
62+
return true;
63+
}
64+
65+
for (String perm : perms) {
66+
if (ContextCompat.checkSelfPermission(context, perm)
67+
!= PackageManager.PERMISSION_GRANTED) {
68+
return false;
69+
}
70+
}
71+
72+
return true;
73+
}
74+
75+
public void requestPermissions(@NonNull String rationale,
76+
int requestCode,
77+
@NonNull String... perms) {
78+
// Use default Android OK and Cancel strings
79+
requestPermissions(rationale,
80+
android.R.string.ok,
81+
android.R.string.cancel,
82+
requestCode,
83+
perms);
84+
}
85+
86+
public boolean shouldShowRationale(@NonNull String[] perms) {
87+
for (String perm : perms) {
88+
if (shouldShowRequestPermissionRationale(perm)) {
89+
return true;
90+
}
91+
}
92+
return false;
93+
}
94+
95+
public boolean somePermissionPermanentlyDenied(@NonNull List<String> perms) {
96+
for (String deniedPermission : perms) {
97+
if (permissionPermanentlyDenied(deniedPermission)) {
98+
return true;
99+
}
100+
}
101+
102+
return false;
103+
}
104+
105+
public boolean permissionPermanentlyDenied(@NonNull String perms) {
106+
return !shouldShowRequestPermissionRationale(perms);
107+
}
108+
109+
public boolean somePermissionDenied(@NonNull String[] perms) {
110+
return shouldShowRationale(perms);
111+
}
112+
113+
// ============================================================================
114+
// Public abstract methods
115+
// ============================================================================
116+
117+
public abstract void requestPermissions(@NonNull String rationale,
118+
@StringRes int positiveButton,
119+
@StringRes int negativeButton,
120+
int requestCode,
121+
@NonNull String... perms);
122+
123+
public abstract boolean shouldShowRequestPermissionRationale(@NonNull String perm);
124+
125+
// ============================================================================
126+
// Protected methods
127+
// ============================================================================
128+
129+
/**
130+
* Show a {@link RationaleDialogFragment} explaining permission request rationale.
131+
*/
132+
@RequiresApi(api = Build.VERSION_CODES.HONEYCOMB)
133+
protected void showRationaleDialogFragment(@NonNull android.app.FragmentManager fragmentManager,
134+
@NonNull String rationale,
135+
@StringRes int positiveButton,
136+
@StringRes int negativeButton,
137+
int requestCode,
138+
@NonNull String... perms) {
139+
140+
RationaleDialogFragment
141+
.newInstance(positiveButton, negativeButton, rationale, requestCode, perms)
142+
.show(fragmentManager, RationaleDialogFragment.TAG);
143+
}
144+
145+
protected void notifyAlreadyHasPermissions(Object object,
146+
int requestCode,
147+
@NonNull String[] perms) {
148+
int[] grantResults = new int[perms.length];
149+
for (int i = 0; i < perms.length; i++) {
150+
grantResults[i] = PackageManager.PERMISSION_GRANTED;
151+
}
152+
153+
EasyPermissions.onRequestPermissionsResult(requestCode, perms, grantResults, object);
154+
}
155+
156+
@NonNull
157+
protected T getHost() {
158+
return mHost;
159+
}
160+
161+
}

0 commit comments

Comments
 (0)