Skip to content

Commit 4e08185

Browse files
authored
3.4.0 beta (supports Ask next time, Only this time, etc) (#696)
* Bump dependencies * Remove SharedPreferences usage * Update permission app * Use Snackbar in example App * Set beta.1 * Remove shouldShowRequestPermissionRationale pre-check * Update Android flow chart * Update README.md * Update dependencies * Improve example app look
1 parent adeaed5 commit 4e08185

File tree

10 files changed

+1207
-1324
lines changed

10 files changed

+1207
-1324
lines changed

README.md

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ Add all wanted permissions to your app `android/app/src/main/AndroidManifest.xml
190190
<uses-permission android:name="android.permission.RECORD_AUDIO" />
191191
<uses-permission android:name="android.permission.SEND_SMS" />
192192
<uses-permission android:name="android.permission.USE_SIP" />
193+
<uses-permission android:name="android.permission.UWB_RANGING" />
193194
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
194195
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
195196
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
@@ -354,32 +355,32 @@ As permissions are not handled in the same way on iOS and Android, this library
354355
╚═════╝ │ RESULTS.UNAVAILABLE │
355356
│ └─────────────────────┘
356357
Is the permission
357-
requestable ?
358-
│ ╔════╗
359-
├───────────║ NO ║──────────────┐
360-
│ ╚════
361-
╔═════╗
362-
YES ║ ┌───────────────────┐
363-
╚════RESULTS.BLOCKED /
364-
│ RESULTS.GRANTED │
365-
└───────────────────┘
358+
already granted ?
359+
│ ╔════
360+
├───────────║ YES ║─────────────┐
361+
│ ╚═════╝
362+
╔════
363+
NO ║ ┌───────────────────┐
364+
╚════╝ RESULTS.GRANTED
365+
└───────────────────┘
366+
366367
┌────────────────┐
367368
│ RESULTS.DENIED │◀──────────────────────┐
368369
└────────────────┘ │
369370
│ │
370371
▼ │
371-
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ╔════╗
372-
┃ request(PERMISSIONS.ANDROID.CAMERA) ┃ ║ NO
373-
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ╚════╝
372+
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ╔════
373+
┃ request(PERMISSIONS.ANDROID.CAMERA) ┃ ║ YES
374+
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ╚════
374375
│ │
375376
Does the user accept │
376377
the request ? │
377-
│ ╔════╗ Does the user check
378-
├───────────║ NO ║─────"Never ask again" ?
378+
│ ╔════╗ Is the permission
379+
├───────────║ NO ║──── still requestable ?
379380
│ ╚════╝ │
380-
╔═════╗ ╔════
381-
║ YES ║ ║ YES
382-
╚═════╝ ╚════
381+
╔═════╗ ╔════╗
382+
║ YES ║ ║ NO
383+
╚═════╝ ╚════╝
383384
│ │
384385
▼ ▼
385386
┌─────────────────┐ ┌─────────────────┐
@@ -476,6 +477,7 @@ PERMISSIONS.ANDROID.RECEIVE_WAP_PUSH;
476477
PERMISSIONS.ANDROID.RECORD_AUDIO;
477478
PERMISSIONS.ANDROID.SEND_SMS;
478479
PERMISSIONS.ANDROID.USE_SIP;
480+
PERMISSIONS.ANDROID.UWB_RANGING;
479481
PERMISSIONS.ANDROID.WRITE_CALENDAR;
480482
PERMISSIONS.ANDROID.WRITE_CALL_LOG;
481483
PERMISSIONS.ANDROID.WRITE_CONTACTS;

android/src/main/java/com/zoontek/rnpermissions/RNPermissionsModule.java

Lines changed: 24 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
package com.zoontek.rnpermissions;
22

33
import android.Manifest;
4-
import android.annotation.SuppressLint;
54
import android.app.Activity;
65
import android.content.Context;
76
import android.content.Intent;
8-
import android.content.SharedPreferences;
97
import android.content.pm.PackageManager;
108
import android.net.Uri;
119
import android.os.Build;
@@ -36,10 +34,8 @@ public class RNPermissionsModule extends ReactContextBaseJavaModule implements P
3634

3735
private static final String ERROR_INVALID_ACTIVITY = "E_INVALID_ACTIVITY";
3836
public static final String MODULE_NAME = "RNPermissions";
39-
private static final String SETTING_NAME = "@RNPermissions:NonRequestables";
4037

41-
private final SharedPreferences mSharedPrefs;
42-
private final SparseArray<Request> mRequests;
38+
private final SparseArray<Callback> mCallbacks;
4339
private int mRequestCode = 0;
4440
private final String GRANTED = "granted";
4541
private final String DENIED = "denied";
@@ -48,26 +44,14 @@ public class RNPermissionsModule extends ReactContextBaseJavaModule implements P
4844

4945
public RNPermissionsModule(ReactApplicationContext reactContext) {
5046
super(reactContext);
51-
mSharedPrefs = reactContext.getSharedPreferences(SETTING_NAME, Context.MODE_PRIVATE);
52-
mRequests = new SparseArray<Request>();
47+
mCallbacks = new SparseArray<Callback>();
5348
}
5449

5550
@Override
5651
public String getName() {
5752
return MODULE_NAME;
5853
}
5954

60-
private class Request {
61-
62-
public boolean[] rationaleStatuses;
63-
public Callback callback;
64-
65-
public Request(boolean[] rationaleStatuses, Callback callback) {
66-
this.rationaleStatuses = rationaleStatuses;
67-
this.callback = callback;
68-
}
69-
}
70-
7155
private @Nullable String getFieldName(final String permission) {
7256
if (permission.equals("android.permission.ACCEPT_HANDOVER"))
7357
return "ACCEPT_HANDOVER";
@@ -79,10 +63,10 @@ public Request(boolean[] rationaleStatuses, Callback callback) {
7963
return "ACCESS_FINE_LOCATION";
8064
if (permission.equals("android.permission.ACCESS_MEDIA_LOCATION"))
8165
return "ACCESS_MEDIA_LOCATION";
82-
if (permission.equals("com.android.voicemail.permission.ADD_VOICEMAIL"))
83-
return "ADD_VOICEMAIL";
8466
if (permission.equals("android.permission.ACTIVITY_RECOGNITION"))
8567
return "ACTIVITY_RECOGNITION";
68+
if (permission.equals("com.android.voicemail.permission.ADD_VOICEMAIL"))
69+
return "ADD_VOICEMAIL";
8670
if (permission.equals("android.permission.ANSWER_PHONE_CALLS"))
8771
return "ANSWER_PHONE_CALLS";
8872
if (permission.equals("android.permission.BLUETOOTH_ADVERTISE"))
@@ -127,6 +111,8 @@ public Request(boolean[] rationaleStatuses, Callback callback) {
127111
return "SEND_SMS";
128112
if (permission.equals("android.permission.USE_SIP"))
129113
return "USE_SIP";
114+
if (permission.equals("android.permission.UWB_RANGING"))
115+
return "UWB_RANGING";
130116
if (permission.equals("android.permission.WRITE_CALENDAR"))
131117
return "WRITE_CALENDAR";
132118
if (permission.equals("android.permission.WRITE_CALL_LOG"))
@@ -157,16 +143,13 @@ private boolean permissionExists(final String permission) {
157143
public void checkNotifications(final Promise promise) {
158144
final boolean enabled = NotificationManagerCompat
159145
.from(getReactApplicationContext()).areNotificationsEnabled();
146+
160147
final WritableMap output = Arguments.createMap();
161148
final WritableMap settings = Arguments.createMap();
162149

163-
if (enabled) {
164-
output.putString("status", "granted");
165-
} else {
166-
output.putString("status", "blocked");
167-
}
168-
150+
output.putString("status", enabled ? GRANTED : BLOCKED);
169151
output.putMap("settings", settings);
152+
170153
promise.resolve(output);
171154
}
172155

@@ -207,8 +190,6 @@ public void checkPermission(final String permission, final Promise promise) {
207190

208191
if (context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED) {
209192
promise.resolve(GRANTED);
210-
} else if (mSharedPrefs.getBoolean(permission, false)) {
211-
promise.resolve(BLOCKED);
212193
} else {
213194
promise.resolve(DENIED);
214195
}
@@ -248,20 +229,14 @@ public void requestPermission(final String permission, final Promise promise) {
248229
if (context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED) {
249230
promise.resolve(GRANTED);
250231
return;
251-
} else if (mSharedPrefs.getBoolean(permission, false)) {
252-
promise.resolve(BLOCKED); // not supporting reset the permission with "Ask me every time"
253-
return;
254232
}
255233

256234
try {
257235
PermissionAwareActivity activity = getPermissionAwareActivity();
258-
boolean[] rationaleStatuses = new boolean[1];
259-
rationaleStatuses[0] = activity.shouldShowRequestPermissionRationale(permission);
260236

261-
mRequests.put(mRequestCode, new Request(
262-
rationaleStatuses,
237+
mCallbacks.put(
238+
mRequestCode,
263239
new Callback() {
264-
@SuppressLint("ApplySharedPref")
265240
@Override
266241
public void invoke(Object... args) {
267242
int[] results = (int[]) args[0];
@@ -270,18 +245,15 @@ public void invoke(Object... args) {
270245
promise.resolve(GRANTED);
271246
} else {
272247
PermissionAwareActivity activity = (PermissionAwareActivity) args[1];
273-
boolean[] rationaleStatuses = (boolean[]) args[2];
274248

275-
if (rationaleStatuses[0] &&
276-
!activity.shouldShowRequestPermissionRationale(permission)) {
277-
mSharedPrefs.edit().putBoolean(permission, true).commit(); // enforce sync
278-
promise.resolve(BLOCKED);
279-
} else {
249+
if (activity.shouldShowRequestPermissionRationale(permission)) {
280250
promise.resolve(DENIED);
251+
} else {
252+
promise.resolve(BLOCKED);
281253
}
282254
}
283255
}
284-
}));
256+
});
285257

286258
activity.requestPermissions(new String[] {permission}, mRequestCode, this);
287259
mRequestCode++;
@@ -309,8 +281,6 @@ public void checkMultiplePermissions(final ReadableArray permissions, final Prom
309281
: BLOCKED);
310282
} else if (context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED) {
311283
output.putString(permission, GRANTED);
312-
} else if (mSharedPrefs.getBoolean(permission, false)) {
313-
output.putString(permission, BLOCKED); // not supporting reset the permission with "Ask me every time"
314284
} else {
315285
output.putString(permission, DENIED);
316286
}
@@ -345,9 +315,6 @@ public void requestMultiplePermissions(final ReadableArray permissions, final Pr
345315
} else if (context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED) {
346316
output.putString(permission, GRANTED);
347317
checkedPermissionsCount++;
348-
} else if (mSharedPrefs.getBoolean(permission, false)) {
349-
output.putString(permission, BLOCKED); // not supporting reset the permission with "Ask me every time"
350-
checkedPermissionsCount++;
351318
} else {
352319
permissionsToCheck.add(permission);
353320
}
@@ -360,42 +327,32 @@ public void requestMultiplePermissions(final ReadableArray permissions, final Pr
360327

361328
try {
362329
PermissionAwareActivity activity = getPermissionAwareActivity();
363-
boolean[] rationaleStatuses = new boolean[permissionsToCheck.size()];
364330

365-
for (int i = 0; i < permissionsToCheck.size(); i++) {
366-
rationaleStatuses[i] = activity
367-
.shouldShowRequestPermissionRationale(permissionsToCheck.get(i));
368-
}
369-
370-
mRequests.put(mRequestCode, new Request(
371-
rationaleStatuses,
331+
mCallbacks.put(
332+
mRequestCode,
372333
new Callback() {
373-
@SuppressLint("ApplySharedPref")
374334
@Override
375335
public void invoke(Object... args) {
376336
int[] results = (int[]) args[0];
377337
PermissionAwareActivity activity = (PermissionAwareActivity) args[1];
378-
boolean[] rationaleStatuses = (boolean[]) args[2];
379338

380339
for (int j = 0; j < permissionsToCheck.size(); j++) {
381340
String permission = permissionsToCheck.get(j);
382341

383342
if (results.length > 0 && results[j] == PackageManager.PERMISSION_GRANTED) {
384343
output.putString(permission, GRANTED);
385344
} else {
386-
if (rationaleStatuses[j] &&
387-
!activity.shouldShowRequestPermissionRationale(permission)) {
388-
mSharedPrefs.edit().putBoolean(permission, true).commit(); // enforce sync
389-
output.putString(permission, BLOCKED);
390-
} else {
345+
if (activity.shouldShowRequestPermissionRationale(permission)) {
391346
output.putString(permission, DENIED);
347+
} else {
348+
output.putString(permission, BLOCKED);
392349
}
393350
}
394351
}
395352

396353
promise.resolve(output);
397354
}
398-
}));
355+
});
399356

400357
activity.requestPermissions(permissionsToCheck.toArray(new String[0]), mRequestCode, this);
401358
mRequestCode++;
@@ -406,10 +363,9 @@ public void invoke(Object... args) {
406363

407364
@Override
408365
public boolean onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
409-
Request request = mRequests.get(requestCode);
410-
request.callback.invoke(grantResults, getPermissionAwareActivity(), request.rationaleStatuses);
411-
mRequests.remove(requestCode);
412-
return mRequests.size() == 0;
366+
mCallbacks.get(requestCode).invoke(grantResults, getPermissionAwareActivity());
367+
mCallbacks.remove(requestCode);
368+
return mCallbacks.size() == 0;
413369
}
414370

415371
private PermissionAwareActivity getPermissionAwareActivity() {

0 commit comments

Comments
 (0)