Android 13 Updates
Overview
Android 13 (API 33) has rolled out new features and API changes. Refer to Android Behavior changes for Apps targeting Android 13.
There are changes for all apps, whether targeting API 33 or just running on Android 13. Some of these changes include runtime notification permission, Foreground Service Task Manager, and Battery Resource Utilization. For a complete list of these changes, refer to Android Developer documentation.
CleverTap Android SDK 4.7.0 supports Android 13
If you plan to increase the target API of your app to 33, you must upgrade the CleverTap Android SDK to version 4.7.0 or higher. The CleverTap SDK version 4.7.0 and higher now support Android SDK from API 19(Android 4.4) and higher.
Push Notification Permission
All apps targeting Android 13 and above must request permission from the user before pushing notifications. All newly-installed apps must get user permission before they can send notifications. This means that you have one chance to ask for permission from the user. However, existing apps will get grandfathered in after a short grace period until the next app launch on Android 13. For more information, refer to Android Developer Documentation - notification permission.
With the latest update, Android 13 allows you to monitor opt-in rates for Push Notifications. To access this feature, ensure you upgrade to SDK version 50100 or higher. As soon as the user grants permission to receive push notifications on the push primer, CleverTap raises an event named Channel Subscribed. And the Channel Unsubscribed event is raised when end-users unsubscribe from the push campaigns. For more information about the event and its properties, refer to System Events.
A Push Primer can explain to your users the need for push notifications and help with your engagement rates. It is an InApp notification that you can show to your users before requesting notification permission. It helps with the following :
- Allows you to educate your users on why you are asking for this permission before invoking a system dialog that asks the user to allow or deny it.
- Acts as a precursor to the hard system dialog and thus allows you to ask for permission multiple times if previously denied without making your users search the device settings.
The following are the three ways to handle the new push notification changes:
- Use a push primer using Half-Interstitial InApp notification
- Use a push primer using In-App alert
Invoke Android Permission Dialog (Without Push Primer)
ThepromptForPushPermission(boolean)
method is a public method that can be used to request permission on behalf of your application directly. If showFallbackSettings
is true, then it shows an alert dialog that routes to the app's notification settings page.
cleverTapAPI.promptForPushPermission(true) //Takes boolean as a parameter. If true and the permission is denied then we fallback to appβs notification settings, if itβs false then we just throw a verbose log saying permission is denied.
cleverTapAPI.promptForPushPermission(true) // Takes boolean as a parameter. If true and the permission is denied then we fallback to appβs notification settings, if itβs false then we just throw a verbose log saying permission is denied.
Check Status of Push Permission
The isPushPermissionGranted
method can be used to check the status of the push notification permission for your application.
cleverTapAPI.isPushPermissionGranted() // Returns true if permission is granted, else returns false if permission is denied.
cleverTapAPI.isPushPermissionGranted // Returns true if permission is granted, else returns false if permission is denied.
Invoke Push Primer Flow
promptPushPrimer(JSONObject)
- Calls the push primer flow for Android 13 and above devices.
cleverTapAPI.promptPushPrimer(jsonObject);
Available Callbacks for Push Primer
Based on notification permission grant/deny, we provide a callback on PushPermissionResponse
(boolean).
-
Register
PushPermissionResponseListener
instance to receive the Push Primer result:
TheCleverTapAPI
class exposes aregisterPushPermissionNotificationResponseListener(PushPermissionResponseListener)
method. Use this method to register yourPushPermissionResponseListener
instance. EachPushPermissionResponseListener
instance passed in this method is added to aList
of thePushPermissionResponseListener
type, and the Push Primer result is notified to all the elements of that list. -
Unregister
PushPermissionResponseListener
instance to stop receiving the Push Primer result:
TheCleverTapAPI
class exposes aunregisterPushPermissionNotificationResponseListener(PushPermissionResponseListener)
method.
Use this method to unregister your previously registeredPushPermissionResponseListener
instance.
Note
Call
registerPushPermissionNotificationResponseListener(PushPermissionResponseListener)
only from theonCreate()
method of the Activity/Fragment and unregister the listener instance from theonDestroy()
method usingunregisterPushPermissionNotificationResponseListener(PushPermissionResponseListener)
.
The following is a sample implementation to get the permission result:
public class MainActivity extends AppCompatActivity implements PushPermissionResponseListener {
private CleverTapAPI cleverTapDefaultInstance;
@Override
protected void onCreate(Bundle savedInstanceState) {
cleverTapDefaultInstance = CleverTapAPI.getDefaultInstance(this);
if (cleverTapDefaultInstance != null) {
cleverTapDefaultInstance.registerPushPermissionNotificationResponseListener(this);
}
}
@Override
public void onPushPermissionResponse(boolean accepted) {
Log.i(TAG, "onPushPermissionResponse : InApp---> response() called accepted="+accepted);
if(accepted){
CleverTapAPI.createNotificationChannel(getApplicationContext(), "BRTesting", "Testing Channel",
"Testing Channel for BR", NotificationManager.IMPORTANCE_HIGH, true);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (cleverTapDefaultInstance != null) {
cleverTapDefaultInstance.unregisterPushPermissionNotificationResponseListener(this);
}
}
}
class MainActivity : AppCompatActivity(), PushPermissionResponseListener {
var cleverTapDefaultInstance: CleverTapAPI? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
cleverTapDefaultInstance = CleverTapAPI.getDefaultInstance(this)
cleverTapDefaultInstance?.registerPushPermissionNotificationResponseListener(this)
}
override fun onPushPermissionResponse(accepted: Boolean) {
Log.i(TAG, "onPushPermissionResponse : InApp---> response() called accepted=$accepted")
if (accepted) {
CleverTapAPI.createNotificationChannel(getApplicationContext(), "BRTesting", "Testing Channel",
"Testing Channel for BR", NotificationManager.IMPORTANCE_HIGH, true);
}
}
override fun onDestroy() {
super.onDestroy()
cleverTapDefaultInstance?.unregisterPushPermissionNotificationResponseListener(this)
}
}
New Method for InAppNotificationListener
Use the following method from CleverTap SDK version 4.7.0 and above:
@Override public void onShow(CTInAppNotification ctInAppNotification) { }
Updated 7 months ago