Skip to content

Commit ee01f2c

Browse files
committed
Add Android 13 notification permission prompting
1 parent 28b76bf commit ee01f2c

File tree

6 files changed

+82
-2
lines changed

6 files changed

+82
-2
lines changed

Examples/OneSignalDemo/app/src/main/java/com/onesignal/sdktest/model/MainActivityViewModel.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,6 @@ private void setupSubscriptionSwitch() {
546546
boolean isPermissionEnabled = deviceState != null && deviceState.areNotificationsEnabled();
547547
final boolean isSubscribed = deviceState != null && deviceState.isSubscribed();
548548

549-
subscriptionSwitch.setEnabled(isPermissionEnabled);
550549
subscriptionSwitch.setChecked(isSubscribed);
551550

552551
if (isPermissionEnabled) {
@@ -561,6 +560,8 @@ private void setupSubscriptionSwitch() {
561560

562561
subscriptionSwitch.setOnClickListener(v -> {
563562
OneSignal.disablePush(!subscriptionSwitch.isChecked());
563+
if (subscriptionSwitch.isChecked())
564+
OneSignal.promptForPushNotifications();
564565
});
565566
}
566567

OneSignalSDK/onesignal/src/main/AndroidManifest.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
<!-- OneSignal SDK has runtime checks Android version. -->
55
<!--<uses-sdk tools:overrideLibrary="android.support.customtabs"/>-->
66

7+
<!-- Required runtime permission to display notifications on Android 13 -->
8+
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
9+
710
<!-- Required so the device can access the internet. -->
811
<uses-permission android:name="android.permission.INTERNET" />
912

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.onesignal
2+
3+
import android.content.Context
4+
import android.content.Intent
5+
6+
object NavigateToAndroidSettingsForNotifications {
7+
fun show(context: Context) {
8+
val intent = Intent()
9+
intent.action = "android.settings.APP_NOTIFICATION_SETTINGS"
10+
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
11+
12+
//for Android 5-7
13+
intent.putExtra("app_package", context.getPackageName())
14+
intent.putExtra("app_uid", context.getApplicationInfo().uid)
15+
16+
// for Android 8 and above
17+
intent.putExtra("android.provider.extra.APP_PACKAGE", context.getPackageName())
18+
context.startActivity(intent)
19+
}
20+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.onesignal
2+
3+
object NotificationPermissionController : PermissionsActivity.PermissionCallback {
4+
private const val PERMISSION_TYPE = "NOTIFICATION"
5+
6+
init {
7+
PermissionsActivity.registerAsCallback(PERMISSION_TYPE, this)
8+
}
9+
10+
fun prompt(
11+
fallbackToSettings: Boolean,
12+
androidPermissionString: String,
13+
) {
14+
PermissionsActivity.startPrompt(
15+
fallbackToSettings,
16+
PERMISSION_TYPE,
17+
androidPermissionString,
18+
this::class.java
19+
)
20+
}
21+
22+
override fun onAccept() {
23+
OneSignal.refreshNotificationPermissionState()
24+
}
25+
26+
override fun onReject(fallbackToSettings: Boolean) {
27+
if (fallbackToSettings) showFallbackAlertDialog()
28+
}
29+
30+
private fun showFallbackAlertDialog() {
31+
val activity = OneSignal.getCurrentActivity() ?: return
32+
AlertDialogPrepromptForAndroidSettings.show(
33+
activity,
34+
activity.getString(R.string.notification_permission_name_for_title),
35+
activity.getString(R.string.notification_permission_settings_message),
36+
object : AlertDialogPrepromptForAndroidSettings.Callback {
37+
override fun onAccept() {
38+
NavigateToAndroidSettingsForNotifications.show(activity)
39+
}
40+
override fun onDecline() {
41+
}
42+
}
43+
)
44+
}
45+
}

OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignal.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1414,6 +1414,10 @@ static void onAppFocus() {
14141414
}
14151415

14161416
static void onAppStartFocusLogic() {
1417+
refreshNotificationPermissionState();
1418+
}
1419+
1420+
static void refreshNotificationPermissionState() {
14171421
getCurrentPermissionState(appContext).refreshAsTo();
14181422
}
14191423

@@ -1431,7 +1435,7 @@ private static void onAppFocusLogic() {
14311435

14321436
OSNotificationRestoreWorkManager.beginEnqueueingWork(appContext, false);
14331437

1434-
getCurrentPermissionState(appContext).refreshAsTo();
1438+
refreshNotificationPermissionState();
14351439

14361440
if (trackFirebaseAnalytics != null && getFirebaseAnalyticsEnabled())
14371441
trackFirebaseAnalytics.trackInfluenceOpenEvent();
@@ -2834,6 +2838,10 @@ void onAnswered(OneSignal.PromptActionResult result) {
28342838
LocationController.getLocation(appContext, true, fallbackToSettings, locationHandler);
28352839
}
28362840

2841+
public static void promptForPushNotifications() {
2842+
NotificationPermissionController.INSTANCE.prompt(true, "android.permission.POST_NOTIFICATIONS");
2843+
}
2844+
28372845
/**
28382846
* Removes all OneSignal notifications from the Notification Shade. If you just use
28392847
* {@link NotificationManager#cancelAll()}, OneSignal notifications will be restored when

OneSignalSDK/onesignal/src/main/res/values/strings.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,7 @@
99

1010
<string name="location_permission_name_for_title">Location</string>
1111
<string name="location_permission_settings_message">sharing your device location</string>
12+
13+
<string name="notification_permission_name_for_title">Notifications</string>
14+
<string name="notification_permission_settings_message">Notifications</string>
1215
</resources>

0 commit comments

Comments
 (0)