Skip to content

Commit 742adc6

Browse files
author
Rafael Dominiquini
committed
Merge remote-tracking branch 'origin/new-fluent-api'
# Conflicts: # gradle/wrapper/gradle-wrapper.properties
2 parents c06edce + a8cd3b9 commit 742adc6

File tree

14 files changed

+383
-79
lines changed

14 files changed

+383
-79
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ android:
44
components:
55
- tools
66
- build-tools-23.0.2
7+
- platform-tools
78
- android-23
89
- extra-android-support
910
- extra-google-m2repository

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Screenshots
1818
Usage
1919
-----
2020

21-
To start using the library you just need to initialize Dexter with a ``Context``, preferably your ``Application`` as it won't be destroyed during your app lifetime:
21+
To start using the library you just need to initialize Dexter with an ``Activity``. Remember to stop Dexter during the ``onDestroy`` stage to avoid memory leaks.
2222

2323
```java
2424
public MyApplication extends Application {
@@ -27,6 +27,11 @@ public MyApplication extends Application {
2727
Dexter.initialize(context);
2828
}
2929
}
30+
31+
@Override protected void onDestroy() {
32+
Dexter.stop();
33+
super.onDestroy();
34+
}
3035
```
3136

3237
Once the library is initialized you can start checking permissions at will. You have two options, you can either check for a single permission or check for multiple permissions at once.

dexter/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
<activity
2323
android:name=".DexterActivity"
2424
android:theme="@style/Theme.Transparent"
25-
android:launchMode="singleTask"
25+
android:launchMode="singleInstance"
2626
/>
2727
</application>
2828

dexter/src/main/java/com/karumi/dexter/AndroidPermissionService.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import android.app.Activity;
2020
import android.content.Context;
2121
import android.support.annotation.NonNull;
22+
import android.support.annotation.Nullable;
2223
import android.support.v4.app.ActivityCompat;
2324
import android.support.v4.content.ContextCompat;
2425

@@ -37,16 +38,24 @@ int checkSelfPermission(@NonNull Context context, @NonNull String permission) {
3738
/**
3839
* @see ActivityCompat#requestPermissions
3940
*/
40-
void requestPermissions(@NonNull Activity activity, @NonNull String[] permissions,
41+
void requestPermissions(@Nullable Activity activity, @NonNull String[] permissions,
4142
int requestCode) {
43+
if (activity == null) {
44+
return;
45+
}
46+
4247
ActivityCompat.requestPermissions(activity, permissions, requestCode);
4348
}
4449

4550
/**
4651
* @see ActivityCompat#shouldShowRequestPermissionRationale
4752
*/
48-
boolean shouldShowRequestPermissionRationale(@NonNull Activity activity,
53+
boolean shouldShowRequestPermissionRationale(@Nullable Activity activity,
4954
@NonNull String permission) {
55+
if (activity == null) {
56+
return false;
57+
}
58+
5059
return ActivityCompat.shouldShowRequestPermissionRationale(activity, permission);
5160
}
5261
}

dexter/src/main/java/com/karumi/dexter/Dexter.java

Lines changed: 132 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,34 +18,136 @@
1818

1919
import android.app.Activity;
2020
import android.content.Context;
21+
import com.karumi.dexter.listener.EmptyPermissionRequestErrorListener;
22+
import com.karumi.dexter.listener.PermissionRequestErrorListener;
23+
import com.karumi.dexter.listener.multi.EmptyMultiplePermissionsListener;
2124
import com.karumi.dexter.listener.multi.MultiplePermissionsListener;
2225
import com.karumi.dexter.listener.single.PermissionListener;
26+
import java.util.ArrayList;
2327
import java.util.Arrays;
2428
import java.util.Collection;
29+
import java.util.Collections;
2530

2631
/**
2732
* Class to simplify the management of Android runtime permissions
2833
* Dexter needs to be initialized before checking for a permission using {@link
29-
* #initialize(Context)}
34+
* #initialize(Activity)}
3035
*/
31-
public final class Dexter {
36+
public final class Dexter
37+
implements DexterBuilder, DexterBuilder.Permission, DexterBuilder.SinglePermissionListener,
38+
DexterBuilder.MultiPermissionListener {
3239

3340
private static DexterInstance instance;
3441

42+
private Collection<String> permissions;
43+
private MultiplePermissionsListener listener = new EmptyMultiplePermissionsListener();
44+
private PermissionRequestErrorListener errorListener = new EmptyPermissionRequestErrorListener();
45+
private boolean shouldExecuteOnSameThread = false;
46+
47+
private Dexter(Activity activity) {
48+
initialize(activity);
49+
}
50+
51+
public static DexterBuilder.Permission withActivity(Activity activity) {
52+
return new Dexter(activity);
53+
}
54+
55+
@Override public DexterBuilder.SinglePermissionListener withPermission(String permission) {
56+
permissions = Collections.singletonList(permission);
57+
return this;
58+
}
59+
60+
@Override public DexterBuilder.MultiPermissionListener withPermissions(String... permissions) {
61+
this.permissions = Arrays.asList(permissions);
62+
return this;
63+
}
64+
65+
@Override
66+
public DexterBuilder.MultiPermissionListener withPermissions(Collection<String> permissions) {
67+
this.permissions = new ArrayList<>(permissions);
68+
return this;
69+
}
70+
71+
@Override public void continueRequestingPendingPermissions(PermissionListener listener) {
72+
instance.continuePendingRequestIfPossible(listener, ThreadFactory.makeMainThread());
73+
}
74+
75+
@Override public void continueRequestingPendingPermissions(MultiplePermissionsListener listener) {
76+
instance.continuePendingRequestsIfPossible(listener, ThreadFactory.makeMainThread());
77+
}
78+
79+
@Override public DexterBuilder withListener(PermissionListener listener) {
80+
this.listener = new MultiplePermissionsListenerToPermissionListenerAdapter(listener);
81+
return this;
82+
}
83+
84+
@Override public DexterBuilder withListener(MultiplePermissionsListener listener) {
85+
this.listener = listener;
86+
return this;
87+
}
88+
89+
@Override public DexterBuilder onSameThread() {
90+
shouldExecuteOnSameThread = true;
91+
return this;
92+
}
93+
94+
@Override public DexterBuilder withErrorListener(PermissionRequestErrorListener errorListener) {
95+
this.errorListener = errorListener;
96+
return this;
97+
}
98+
99+
@Override public void check() {
100+
try {
101+
Thread thread = getThread();
102+
instance.checkPermissions(listener, permissions, thread);
103+
} catch (DexterException e) {
104+
errorListener.onError(e.error);
105+
}
106+
}
107+
108+
private Thread getThread() {
109+
Thread thread;
110+
111+
if (shouldExecuteOnSameThread) {
112+
thread = ThreadFactory.makeSameThread();
113+
} else {
114+
thread = ThreadFactory.makeMainThread();
115+
}
116+
117+
return thread;
118+
}
119+
35120
/**
36-
* Initializes the library
121+
* Initializes the library.
37122
*
38123
* @param context Context used by Dexter. Use your {@link android.app.Application} to make sure
39-
* the instance is not cleaned up during your app lifetime
124+
* the instance is not cleaned up during your app lifetime.
125+
* @deprecated use the initialize overloaded method using an {@link android.app.Activity} instance
126+
* as param instead of this one. This method will be removed in the next major release.
40127
*/
41-
public static void initialize(Context context) {
128+
@Deprecated public static void initialize(Context context) {
42129
if (instance == null) {
43130
AndroidPermissionService androidPermissionService = new AndroidPermissionService();
44131
IntentProvider intentProvider = new IntentProvider();
45132
instance = new DexterInstance(context, androidPermissionService, intentProvider);
46133
}
47134
}
48135

136+
/**
137+
* Initializes the library.
138+
*
139+
* @param activity context used by Dexter. Remember to invoke {@link com.karumi.dexter.Dexter}
140+
* stop method to avoid memory leaks.
141+
* @deprecated Use the non static constructor: new Dexter(Activity activity)
142+
*/
143+
@Deprecated public static void initialize(Activity activity) {
144+
if (instance == null) {
145+
AndroidPermissionService androidPermissionService = new AndroidPermissionService();
146+
IntentProvider intentProvider = new IntentProvider();
147+
instance = new DexterInstance(activity, androidPermissionService, intentProvider);
148+
}
149+
}
150+
49151
/**
50152
* Checks the permission and notifies the listener of its state.
51153
* It is important to note that permissions still have to be declared in the manifest.
@@ -54,8 +156,10 @@ public static void initialize(Context context) {
54156
*
55157
* @param listener The class that will be reported when the state of the permission is ready
56158
* @param permission One of the values found in {@link android.Manifest.permission}
159+
* @deprecated
57160
*/
58-
public static void checkPermissionOnSameThread(PermissionListener listener, String permission) {
161+
@Deprecated public static void checkPermissionOnSameThread(PermissionListener listener,
162+
String permission) {
59163
checkInstanceNotNull();
60164
instance.checkPermission(listener, permission, ThreadFactory.makeSameThread());
61165
}
@@ -68,8 +172,9 @@ public static void checkPermissionOnSameThread(PermissionListener listener, Stri
68172
*
69173
* @param listener The class that will be reported when the state of the permission is ready
70174
* @param permission One of the values found in {@link android.Manifest.permission}
175+
* @deprecated
71176
*/
72-
public static void checkPermission(PermissionListener listener, String permission) {
177+
@Deprecated public static void checkPermission(PermissionListener listener, String permission) {
73178
checkInstanceNotNull();
74179
instance.checkPermission(listener, permission, ThreadFactory.makeMainThread());
75180
}
@@ -82,12 +187,12 @@ public static void checkPermission(PermissionListener listener, String permissio
82187
*
83188
* @param listener The class that will be reported when the state of the permissions are ready
84189
* @param permissions Array of values found in {@link android.Manifest.permission}
190+
* @deprecated
85191
*/
86-
public static void checkPermissionsOnSameThread(MultiplePermissionsListener listener,
192+
@Deprecated public static void checkPermissionsOnSameThread(MultiplePermissionsListener listener,
87193
String... permissions) {
88194
checkInstanceNotNull();
89-
instance.checkPermissions(listener, Arrays.asList(permissions),
90-
ThreadFactory.makeSameThread());
195+
instance.checkPermissions(listener, Arrays.asList(permissions), ThreadFactory.makeSameThread());
91196
}
92197

93198
/**
@@ -98,11 +203,12 @@ public static void checkPermissionsOnSameThread(MultiplePermissionsListener list
98203
*
99204
* @param listener The class that will be reported when the state of the permissions are ready
100205
* @param permissions Array of values found in {@link android.Manifest.permission}
206+
* @deprecated
101207
*/
102-
public static void checkPermissions(MultiplePermissionsListener listener, String... permissions) {
208+
@Deprecated public static void checkPermissions(MultiplePermissionsListener listener,
209+
String... permissions) {
103210
checkInstanceNotNull();
104-
instance.checkPermissions(listener, Arrays.asList(permissions),
105-
ThreadFactory.makeMainThread());
211+
instance.checkPermissions(listener, Arrays.asList(permissions), ThreadFactory.makeMainThread());
106212
}
107213

108214
/**
@@ -111,8 +217,9 @@ public static void checkPermissions(MultiplePermissionsListener listener, String
111217
*
112218
* @param listener The class that will be reported when the state of the permissions are ready
113219
* @param permissions Collection of values found in {@link android.Manifest.permission}
220+
* @deprecated
114221
*/
115-
public static void checkPermissions(MultiplePermissionsListener listener,
222+
@Deprecated public static void checkPermissions(MultiplePermissionsListener listener,
116223
Collection<String> permissions) {
117224
checkInstanceNotNull();
118225
instance.checkPermissions(listener, permissions, ThreadFactory.makeMainThread());
@@ -122,8 +229,10 @@ public static void checkPermissions(MultiplePermissionsListener listener,
122229
* Checks is there is any permission request still ongoing.
123230
* If so, state of permissions must not be checked until it is resolved
124231
* or it will cause an exception.
232+
*
233+
* @deprecated
125234
*/
126-
public static boolean isRequestOngoing() {
235+
@Deprecated public static boolean isRequestOngoing() {
127236
checkInstanceNotNull();
128237
return instance.isRequestOngoing();
129238
}
@@ -132,8 +241,11 @@ public static boolean isRequestOngoing() {
132241
* Requests pending permissions if there were permissions lost. This method can be used to
133242
* recover the Dexter state during a configuration change, for example when the device is
134243
* rotated.
244+
*
245+
* @deprecated
135246
*/
136-
public static void continuePendingRequestsIfPossible(MultiplePermissionsListener listener) {
247+
@Deprecated public static void continuePendingRequestsIfPossible(
248+
MultiplePermissionsListener listener) {
137249
checkInstanceNotNull();
138250
instance.continuePendingRequestsIfPossible(listener, ThreadFactory.makeMainThread());
139251
}
@@ -142,13 +254,15 @@ public static void continuePendingRequestsIfPossible(MultiplePermissionsListener
142254
* Requests pending permission if there was a permissions lost. This method can be used to
143255
* recover the Dexter state during a configuration change, for example when the device is
144256
* rotated.
257+
*
258+
* @deprecated
145259
*/
146-
public static void continuePendingRequestIfPossible(PermissionListener listener) {
260+
@Deprecated public static void continuePendingRequestIfPossible(PermissionListener listener) {
147261
checkInstanceNotNull();
148262
instance.continuePendingRequestIfPossible(listener, ThreadFactory.makeMainThread());
149263
}
150264

151-
private static void checkInstanceNotNull() {
265+
@Deprecated private static void checkInstanceNotNull() {
152266
if (instance == null) {
153267
throw new NullPointerException("context == null \n Must call \"initialize\" on Dexter");
154268
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* Copyright (C) 2016 Karumi.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
18+
package com.karumi.dexter;
19+
20+
import com.karumi.dexter.listener.PermissionRequestErrorListener;
21+
import com.karumi.dexter.listener.multi.MultiplePermissionsListener;
22+
import com.karumi.dexter.listener.single.PermissionListener;
23+
import java.util.Collection;
24+
25+
public interface DexterBuilder {
26+
27+
DexterBuilder onSameThread();
28+
29+
DexterBuilder withErrorListener(PermissionRequestErrorListener errorListener);
30+
31+
void check();
32+
33+
interface Permission {
34+
DexterBuilder.SinglePermissionListener withPermission(String permission);
35+
36+
DexterBuilder.MultiPermissionListener withPermissions(String... permissions);
37+
38+
DexterBuilder.MultiPermissionListener withPermissions(Collection<String> permissions);
39+
40+
void continueRequestingPendingPermissions(PermissionListener listener);
41+
42+
void continueRequestingPendingPermissions(MultiplePermissionsListener listener);
43+
}
44+
45+
interface SinglePermissionListener {
46+
DexterBuilder withListener(PermissionListener listener);
47+
}
48+
49+
interface MultiPermissionListener {
50+
DexterBuilder withListener(MultiplePermissionsListener listener);
51+
}
52+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.karumi.dexter;
2+
3+
import com.karumi.dexter.listener.DexterError;
4+
5+
final class DexterException extends IllegalStateException {
6+
7+
public final DexterError error;
8+
9+
public DexterException(String detailMessage, DexterError error) {
10+
super(detailMessage);
11+
this.error = error;
12+
}
13+
}

0 commit comments

Comments
 (0)