Skip to content

Commit 46840ab

Browse files
committed
PR-697 changes (#699)
* feat(android): runtime notifications for sdk-33 * Fix checkNotifications implementation * Add requestNotifications support * Perform the version check on TS side * Update README Co-authored-by: Artur Yorsh <[email protected]> Fix merge conflicts
1 parent 0a96049 commit 46840ab

File tree

5 files changed

+41
-29
lines changed

5 files changed

+41
-29
lines changed

README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ Add all wanted permissions to your app `android/app/src/main/AndroidManifest.xml
168168
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
169169
<uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
170170
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
171+
<uses-permission android:name="com.android.voicemail.permission.ADD_VOICEMAIL" />
171172
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
172173
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
173174
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
@@ -176,6 +177,7 @@ Add all wanted permissions to your app `android/app/src/main/AndroidManifest.xml
176177
<uses-permission android:name="android.permission.CALL_PHONE" />
177178
<uses-permission android:name="android.permission.CAMERA" />
178179
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
180+
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
179181
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
180182
<uses-permission android:name="android.permission.READ_CALENDAR" />
181183
<uses-permission android:name="android.permission.READ_CALL_LOG" />
@@ -195,7 +197,6 @@ Add all wanted permissions to your app `android/app/src/main/AndroidManifest.xml
195197
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
196198
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
197199
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
198-
<uses-permission android:name="com.android.voicemail.permission.ADD_VOICEMAIL" />
199200

200201
<!---->
201202

@@ -788,8 +789,8 @@ checkNotifications().then(({status, settings}) => {
788789

789790
Request notifications permission status and get notifications settings values.
790791

791-
You cannot request notifications permissions on Windows. Disabling or enabling notifications can only be done through the App Settings.
792-
`requestNotifications` is iOS-only. To request notifications permissions on Android, use `request(PERMISSIONS.ANDROID.POST_NOTIFICATIONS)`
792+
- You have to target at least SDK 33 to perform request on Android 13+. The permission is always granted for prior versions.
793+
- You cannot request notifications permissions on Windows. Disabling / enabling them can only be done through the App Settings.
793794

794795
```ts
795796
// only used on iOS

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

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,10 @@ public String getName() {
8383
return "CAMERA";
8484
if (permission.equals("android.permission.GET_ACCOUNTS"))
8585
return "GET_ACCOUNTS";
86-
if (permission.equals("android.permission.PROCESS_OUTGOING_CALLS"))
87-
return "PROCESS_OUTGOING_CALLS";
8886
if (permission.equals("android.permission.POST_NOTIFICATIONS"))
8987
return "POST_NOTIFICATIONS";
88+
if (permission.equals("android.permission.PROCESS_OUTGOING_CALLS"))
89+
return "PROCESS_OUTGOING_CALLS";
9090
if (permission.equals("android.permission.READ_CALENDAR"))
9191
return "READ_CALENDAR";
9292
if (permission.equals("android.permission.READ_CALL_LOG"))
@@ -143,13 +143,16 @@ private boolean permissionExists(final String permission) {
143143

144144
@ReactMethod
145145
public void checkNotifications(final Promise promise) {
146-
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
147-
this.checkNotificationsCompat(promise);
148-
return;
149-
}
146+
final boolean enabled = NotificationManagerCompat
147+
.from(getReactApplicationContext()).areNotificationsEnabled();
148+
149+
final WritableMap output = Arguments.createMap();
150+
final WritableMap settings = Arguments.createMap();
151+
152+
output.putString("status", enabled ? GRANTED : BLOCKED);
153+
output.putMap("settings", settings);
150154

151-
String fieldName = this.getFieldName("android.permission.POST_NOTIFICATIONS");
152-
this.checkPermission(fieldName, promise);
155+
promise.resolve(output);
153156
}
154157

155158
@ReactMethod
@@ -367,19 +370,6 @@ public boolean onRequestPermissionsResult(int requestCode, String[] permissions,
367370
return mCallbacks.size() == 0;
368371
}
369372

370-
private void checkNotificationsCompat(final Promise promise) {
371-
final boolean enabled = NotificationManagerCompat
372-
.from(getReactApplicationContext()).areNotificationsEnabled();
373-
374-
final WritableMap output = Arguments.createMap();
375-
final WritableMap settings = Arguments.createMap();
376-
377-
output.putString("status", enabled ? GRANTED : BLOCKED);
378-
output.putMap("settings", settings);
379-
380-
promise.resolve(output);
381-
}
382-
383373
private PermissionAwareActivity getPermissionAwareActivity() {
384374
Activity activity = getCurrentActivity();
385375
if (activity == null) {

example/android/app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
<uses-permission android:name="android.permission.CALL_PHONE" />
1919
<uses-permission android:name="android.permission.CAMERA" />
2020
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
21-
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
2221
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
22+
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
2323
<uses-permission android:name="android.permission.READ_CALENDAR" />
2424
<uses-permission android:name="android.permission.READ_CALL_LOG" />
2525
<uses-permission android:name="android.permission.READ_CONTACTS" />

src/methods.android.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ import {
66
openLimitedPhotoLibraryPicker,
77
requestLocationAccuracy,
88
} from './unsupportedPlatformMethods';
9-
import {uniq} from './utils';
9+
import {platformVersion, uniq} from './utils';
10+
11+
const TIRAMISU_VERSION_CODE = 33;
1012

1113
const NativeModule: {
1214
checkPermission: (permission: Permission) => Promise<PermissionStatus>;
@@ -60,8 +62,22 @@ async function request(permission: Permission, rationale?: Rationale): Promise<P
6062
return NativeModule.requestPermission(permission);
6163
}
6264

63-
function checkNotifications(): Promise<NotificationsResponse> {
64-
return NativeModule.checkNotifications();
65+
async function checkNotifications(): Promise<NotificationsResponse> {
66+
if (platformVersion < TIRAMISU_VERSION_CODE) {
67+
return NativeModule.checkNotifications();
68+
}
69+
70+
const status = await check('android.permission.POST_NOTIFICATIONS');
71+
return {status, settings: {}};
72+
}
73+
74+
async function requestNotifications(): Promise<NotificationsResponse> {
75+
if (platformVersion < TIRAMISU_VERSION_CODE) {
76+
return NativeModule.checkNotifications();
77+
}
78+
79+
const status = await request('android.permission.POST_NOTIFICATIONS');
80+
return {status, settings: {}};
6581
}
6682

6783
function checkMultiple<P extends Permission[]>(
@@ -88,5 +104,5 @@ export const methods: Contract = {
88104
request,
89105
requestLocationAccuracy,
90106
requestMultiple,
91-
requestNotifications: checkNotifications,
107+
requestNotifications,
92108
};

src/utils.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
import {Platform} from 'react-native';
2+
3+
export const platformVersion =
4+
typeof Platform.Version === 'string' ? parseInt(Platform.Version, 10) : Platform.Version;
5+
16
export function uniq<T>(array: T[]): T[] {
27
return array.filter((item, index) => item != null && array.indexOf(item) === index);
38
}

0 commit comments

Comments
 (0)