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

Commit 1eb301d

Browse files
authored
Merge pull request #110 from samtstern/experimental
Refactor to delegate to helpers
2 parents 8c71f48 + 595b4f3 commit 1eb301d

9 files changed

+440
-257
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: 123 additions & 254 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.content.Context;
6+
import android.support.annotation.NonNull;
7+
import android.support.annotation.StringRes;
8+
import android.support.v4.app.ActivityCompat;
9+
10+
/**
11+
* Permissions helper for {@link Activity}.
12+
*/
13+
class ActivityPermissionHelper extends PermissionHelper<Activity> {
14+
15+
public ActivityPermissionHelper(Activity host) {
16+
super(host);
17+
}
18+
19+
@Override
20+
@SuppressLint("NewApi")
21+
public void requestPermissions(@NonNull String rationale,
22+
@StringRes int positiveButton,
23+
@StringRes int negativeButton,
24+
int requestCode,
25+
@NonNull String... perms) {
26+
27+
if (shouldShowRationale(perms)) {
28+
showRationaleDialogFragment(
29+
getHost().getFragmentManager(),
30+
rationale,
31+
positiveButton,
32+
negativeButton,
33+
requestCode,
34+
perms);
35+
} else {
36+
ActivityCompat.requestPermissions(getHost(), perms, requestCode);
37+
}
38+
}
39+
40+
@Override
41+
public boolean shouldShowRequestPermissionRationale(@NonNull String perm) {
42+
return ActivityCompat.shouldShowRequestPermissionRationale(getHost(), perm);
43+
}
44+
45+
@Override
46+
public Context getContext() {
47+
return getHost();
48+
}
49+
}
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.Fragment;
5+
import android.content.Context;
6+
import android.support.annotation.NonNull;
7+
import android.support.annotation.StringRes;
8+
9+
/**
10+
* Permissions helper for {@link Fragment} from the framework.
11+
*/
12+
class FrameworkFragmentPermissionHelper extends PermissionHelper<Fragment> {
13+
14+
public FrameworkFragmentPermissionHelper(@NonNull Fragment 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, int requestCode,
23+
@NonNull String... perms) {
24+
25+
if (shouldShowRationale(perms)) {
26+
showRationaleDialogFragment(
27+
getHost().getChildFragmentManager(),
28+
rationale,
29+
positiveButton,
30+
negativeButton,
31+
requestCode,
32+
perms);
33+
} else {
34+
getHost().requestPermissions(perms, requestCode);
35+
}
36+
}
37+
38+
@Override
39+
@SuppressLint("NewApi")
40+
public boolean shouldShowRequestPermissionRationale(@NonNull String perm) {
41+
return getHost().shouldShowRequestPermissionRationale(perm);
42+
}
43+
44+
@Override
45+
@SuppressLint("NewApi")
46+
public Context getContext() {
47+
return getHost().getActivity();
48+
}
49+
}
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.content.Context;
4+
import android.support.annotation.NonNull;
5+
import android.support.annotation.StringRes;
6+
7+
/**
8+
* Permissions helper for apps built against API < 23, which do not need runtime permissions.
9+
*/
10+
class LowApiPermissionsHelper extends PermissionHelper<Object> {
11+
12+
public LowApiPermissionsHelper(@NonNull Object host) {
13+
super(host);
14+
}
15+
16+
@Override
17+
public void requestPermissions(@NonNull String rationale,
18+
@StringRes int positiveButton,
19+
@StringRes int negativeButton,
20+
int requestCode,
21+
@NonNull String... perms) {
22+
23+
throw new IllegalStateException("Should never be requesting permissions on API < 23!");
24+
}
25+
26+
@Override
27+
public boolean shouldShowRequestPermissionRationale(@NonNull String perm) {
28+
return false;
29+
}
30+
31+
@Override
32+
public Context getContext() {
33+
return null;
34+
}
35+
}
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
package pub.devrel.easypermissions.helper;
2+
3+
import android.app.Activity;
4+
import android.content.Context;
5+
import android.os.Build;
6+
import android.support.annotation.NonNull;
7+
import android.support.annotation.RequiresApi;
8+
import android.support.annotation.RestrictTo;
9+
import android.support.annotation.StringRes;
10+
import android.support.v4.app.Fragment;
11+
12+
import java.util.List;
13+
14+
import pub.devrel.easypermissions.RationaleDialogFragment;
15+
16+
/**
17+
* Delegate class to make permission calls based on the 'host' (Fragment, Activity, etc).
18+
*/
19+
@RestrictTo(RestrictTo.Scope.LIBRARY)
20+
public abstract class PermissionHelper<T> {
21+
22+
private static final String TAG = "PermissionHelper";
23+
24+
private T mHost;
25+
26+
@NonNull
27+
public static PermissionHelper newInstance(Activity host) {
28+
if (Build.VERSION.SDK_INT < 23) {
29+
return new LowApiPermissionsHelper(host);
30+
}
31+
32+
return new ActivityPermissionHelper(host);
33+
}
34+
35+
@NonNull
36+
public static PermissionHelper newInstance(Fragment host) {
37+
if (Build.VERSION.SDK_INT < 23) {
38+
return new LowApiPermissionsHelper(host);
39+
}
40+
41+
return new SupportFragmentPermissionHelper(host);
42+
}
43+
44+
@NonNull
45+
public static PermissionHelper newInstance(android.app.Fragment host) {
46+
if (Build.VERSION.SDK_INT < 23) {
47+
return new LowApiPermissionsHelper(host);
48+
}
49+
50+
return new FrameworkFragmentPermissionHelper(host);
51+
}
52+
53+
// ============================================================================
54+
// Public concrete methods
55+
// ============================================================================
56+
57+
public PermissionHelper(@NonNull T host) {
58+
mHost = host;
59+
}
60+
61+
public boolean shouldShowRationale(@NonNull String... perms) {
62+
for (String perm : perms) {
63+
if (shouldShowRequestPermissionRationale(perm)) {
64+
return true;
65+
}
66+
}
67+
return false;
68+
}
69+
70+
public boolean somePermissionPermanentlyDenied(@NonNull List<String> perms) {
71+
for (String deniedPermission : perms) {
72+
if (permissionPermanentlyDenied(deniedPermission)) {
73+
return true;
74+
}
75+
}
76+
77+
return false;
78+
}
79+
80+
public boolean permissionPermanentlyDenied(@NonNull String perms) {
81+
return !shouldShowRequestPermissionRationale(perms);
82+
}
83+
84+
public boolean somePermissionDenied(@NonNull String... perms) {
85+
return shouldShowRationale(perms);
86+
}
87+
88+
@NonNull
89+
public T getHost() {
90+
return mHost;
91+
}
92+
93+
// ============================================================================
94+
// Public abstract methods
95+
// ============================================================================
96+
97+
public abstract void requestPermissions(@NonNull String rationale,
98+
@StringRes int positiveButton,
99+
@StringRes int negativeButton,
100+
int requestCode,
101+
@NonNull String... perms);
102+
103+
public abstract boolean shouldShowRequestPermissionRationale(@NonNull String perm);
104+
105+
public abstract Context getContext();
106+
107+
// ============================================================================
108+
// Protected methods
109+
// ============================================================================
110+
111+
/**
112+
* Show a {@link RationaleDialogFragment} explaining permission request rationale.
113+
*/
114+
@RequiresApi(api = Build.VERSION_CODES.HONEYCOMB)
115+
protected void showRationaleDialogFragment(@NonNull android.app.FragmentManager fragmentManager,
116+
@NonNull String rationale,
117+
@StringRes int positiveButton,
118+
@StringRes int negativeButton,
119+
int requestCode,
120+
@NonNull String... perms) {
121+
122+
RationaleDialogFragment
123+
.newInstance(positiveButton, negativeButton, rationale, requestCode, perms)
124+
.show(fragmentManager, RationaleDialogFragment.TAG);
125+
}
126+
127+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package pub.devrel.easypermissions.helper;
2+
3+
import android.annotation.SuppressLint;
4+
import android.content.Context;
5+
import android.support.annotation.NonNull;
6+
import android.support.annotation.StringRes;
7+
import android.support.v4.app.Fragment;
8+
9+
import pub.devrel.easypermissions.RationaleDialogFragmentCompat;
10+
11+
/**
12+
* Permissions helper for {@link Fragment} from the support library.
13+
*/
14+
class SupportFragmentPermissionHelper extends PermissionHelper<Fragment> {
15+
16+
public SupportFragmentPermissionHelper(@NonNull Fragment host) {
17+
super(host);
18+
}
19+
20+
@Override
21+
@SuppressLint("NewApi")
22+
public void requestPermissions(@NonNull String rationale,
23+
@StringRes int positiveButton,
24+
@StringRes int negativeButton,
25+
int requestCode,
26+
@NonNull String... perms) {
27+
28+
if (shouldShowRationale(perms)) {
29+
RationaleDialogFragmentCompat
30+
.newInstance(positiveButton, negativeButton, rationale, requestCode, perms)
31+
.show(getHost().getChildFragmentManager(), RationaleDialogFragmentCompat.TAG);
32+
} else {
33+
getHost().requestPermissions(perms, requestCode);
34+
}
35+
}
36+
37+
@Override
38+
public boolean shouldShowRequestPermissionRationale(@NonNull String perm) {
39+
return getHost().shouldShowRequestPermissionRationale(perm);
40+
}
41+
42+
@Override
43+
public Context getContext() {
44+
return getHost().getActivity();
45+
}
46+
}

0 commit comments

Comments
 (0)