- Adds support for custom handshake domain configuration in android manifest
- Adds support for custom code in-app templates definitions through a json scheme. Please refer to the CustomCodeTemplates.md for further details.
- Fixes an
ArrayIndexOutOfBoundsException
in a rarerace condition
scenario due to un-synchronised list - Fixes an issue where the Android Permission popup is not triggered from
PushPrimer
when usingInAppType.HALF_INTERSTITIAL
- Adds support for triggering InApps based on user attribute changes.
- Adds support for custom code templates for InApp notifications. Please refer to the CustomCodeTemplates.md for further details.
- Removes character limit of maximum 3 lines from AppInbox messages.
- Adds support for File Types for Variables. Please refer to Variables.md for further details.
- Adds new API
clearFileResources(boolean expiredOnly)
- This API allows you to delete all types of files which are preloaded for SDK features like Custom In-App Templates, App Functions, Variables etc.
- Fixes a race-condition bug where the App Launch event was triggered twice when using a custom CleverTap ID.
- Fixes an ANR caused by extremely old InApp campaigns.
- Fixes an issue where incorrect callbacks were sent for InApps when the phone was rotated.
- Fixes an issue where an InApp was displayed even after all the campaigns were stopped.
- Fixes an issue where the InApp image was not shown when the phone was rotated to landscape.
- Fixes an issue where certain URLs loaded incorrectly in custom HTML InApp templates.
- Adds support for
AndroidX Media3
in lieu of the deprecation ofExoPlayer
. While Clevertap continues to supportExoPlayer
, migration is recommended. For migration refer here.
This hotfix release addresses the following issue in v6.2.0
:
- Fixes a crash
IllegalArgumentException
caused byallowedPushType
XPS enum.
⚠️ NOTE 6.2.0 produces a crash, please update to 6.2.1 and above.
- Extends the push primer callback to notify permission denial when cancel button is clicked on
PromptForSettings
alert dialog. - Fixes #576 - a crash due to
ClassNotFoundException
forCTBackgroundJobService
. - Fixes a crash due to
NullPointerException
related todeviceInfo.deviceId
. - Fixes an ANR related to
isMainProcess
check. - Fixes an ANR due to eager initialisation of
CtApi
triggered by DeviceId generation.
- Removes all Xiaomi related public methods as the Xiaomi SDK has been discontinued. Details here.
- Fixes an issue of incorrect endpoint in the case of network handshake.
- Fixes a bug in Client Side InApps with regards to frequency limits.
For developers with BACKGROUND_SYNC enabled in their previous app version and now upgrading to clevertap-android-sdk v6.1.0 or clevertap-android-sdk v6.1.1 , please add this to your AndroidManifest.xml
to avoid ClassNotFoundException
related crashes
<service
android:name="com.clevertap.android.sdk.pushnotification.amp.CTBackgroundJobService"
android:exported="false"
android:enabled="false"
tools:ignore="MissingClass"/>
⚠️ NOTE Please update to 6.1.1 and above
- Supports Android 14, made it compliant with Android 14 requirements. Details here
- Upgrades AGP to 8.2.2 for building the SDK and adds related consumer proguard rules
- Deprecates Xiaomi public methods as we are sunsetting SDK. Details here.
- Adds Accessibility ids for UI components of SDK
- Migrates JobScheduler to WorkManager for Pull Notifications.
- CTPushAmpWorker breaks custom WorkerFactory implementation of an App:
- If you are using custom
WorkFactory
implementation ofWorkManager
then make sure that you correctly handle workers defined by CleverTap SDK and other third party dependencies. - You must return
null
fromcreateWorker()
for any unknown workerClassName. Please check implementation provided in the blog here
- If you are using custom
- Fixes InApps crash in a rare activity destroyed race condition
- Fixes Potential ANR in a race condition of SDK initialisation in multithreaded setup
- Fixes #456 - Build issues due to AGP 8
- Adds support for client-side in-apps.
- Adds new API
clearInAppResources(boolean expiredOnly)
- This API allows you to delete images and gifs which are preloaded for InApps in
client-side
mode.
- This API allows you to delete images and gifs which are preloaded for InApps in
- Fixes no empty message for app inbox without tabs
- Removes onClickListener for Image of Cover InApp
- Adds support for exoplayer
v2.19.1
- Migrates SDK dependency management to Version Catalog
- Fixes a bug where JavaScript was not working for custom html InApp header/footer templates.
- Fixes an NPE related to AppInbox APIs.
- Fixes a ClassCastException in
defineVariable
API of Product Experiences. - Fixes a resource name conflict with the firebase library in
fcm_fallback_notification_channel_label
- Fixes the scope of
CTInboxMessageContent.java
to allow access to its methods. - Fixes a StrictMode Violation spawning from
ctVariables.init()
. - Removes use of lossy conversions leading to an issue in PushTemplates.
- Handles an edge case related to migration of encryption level when local db is out of memory
- Adds Custom Proxy Domain functionality for Push Impressions and Events raised from CleverTap SDK. Please refer to EXAMPLES.md file to read more on how to configure custom proxy domains.
- Adds new API,
setLocale(String locale)
- This API allows you to set a custom locale for the required clevertap instance. Different instances can have different locales
- Adds support for Integration Debugger
- Adds support for encryption of PII data wiz. Email, Identity, Name and Phone. Please refer to EXAMPLES.md file to read more on how to enable/disable encryption.
- Adds support for custom KV pairs common to all inbox messages in AppInbox.
- Fixes a bug where addMultiValueForKey and addMultiValuesForKey were overwriting the current values of the user properties instead of appending it.
- Fixes #393 - push permission flow crash when context in CoreMetadata is null.
⚠️ NOTE
Please remove the integrated Rendermax SDK before you upgrade to Android SDK v5.1.0
- Adds new APIs,
getNotificationBitmapWithTimeout( Context context, Bundle bundle, String bitmapSrcUrl, boolean fallbackToAppIcon, long timeoutInMillis)
- This API allows you to retrieve a notification bitmap from the specified
bitmapSrcUrl
with a specified timeout. In case the bitmap retrieval fails, you can choose to fallback to the app icon by setting thefallbackToAppIcon
parameter. This API provides more control over the bitmap retrieval process for custom rendering.
- This API allows you to retrieve a notification bitmap from the specified
getNotificationBitmapWithTimeoutAndSize( Context context, Bundle bundle, String bitmapSrcUrl, boolean fallbackToAppIcon, long timeoutInMillis, int sizeInBytes)
- This API extends the functionality of the previous one by additionally allowing you to specify the desired size in bytes for the retrieved bitmap. This is useful when you need to limit the size of the bitmap to optimize memory usage. By utilizing these new APIs, you can enhance the push delivery experience for custom rendering and ensure efficient handling of notification bitmaps in your Android app.
- Adds support for developer defined default notification channel. Please refer to the EXAMPLES.md file to read more on how to setup default channel in your app.Also please note that this is only supported for clevertap core notifications. Support for push templates will be released soon.
- RenderMax Push SDK functionality is now supported directly within the CleverTap Core SDK.
- Adds interface for
Leanplum
APIs. This interface wrapsCleverTapAPI
methods insideLeanplum
APIs to ensure a smoother migration experience.
- Adds
SCCampaignOptOut
Event to Restricted Events Name List for internal use. - Adds custom sdk versions to
af
field for internal use.
-
CTFlushPushImpressionsWork breaks custom WorkerFactory implementation of an App:
- If you are using custom
WorkFactory
implementation ofWorkManager
then make sure that you correctly handle workers defined by CleverTap SDK and other third party dependencies. - You must return
null
fromcreateWorker()
for any unknown workerClassName. Please check implementation provided in the blog here
- If you are using custom
-
Behavioral change of
createNotification
methods:- The following APIs now run on the caller's thread. Make sure to call it
in
onMessageReceive()
of messaging service:CTFcmMessageHandler().createNotification(getApplicationContext(), message)
CleverTapAPI.createNotification(getApplicationContext(), extras)
CTXiaomiMessageHandler().createNotification(getApplicationContext(), message)
CTHmsMessageHandler().createNotification(getApplicationContext(), message)
- This API should always be called on a background thread.
- The following APIs now run on the caller's thread. Make sure to call it
in
- Fixes #428 - Race-condition when detecting if an in-app message should show.
- Fixes Push primer alert dialog freeze behavior, which became unresponsive when clicked outside the window.
- Adds support for Remote Config Variables. Please refer to the Variables.md file to read more on how to integrate this to your app.
- Adds new APIs,
markReadInboxMessagesForIDs(ArrayList<String> messageIDs)
anddeleteInboxMessagesForIDs(ArrayList<String> messageIDs)
to mark read and delete an array of Inbox Messages.
- Deprecated: The following methods and classes related to Product Config and Feature Flags have
been marked as deprecated in this release, instead use new remote config variables feature. These
methods and classes will be removed in the future versions with prior notice.
- Product config
productConfig()
productConfig().setDefaults()
productConfig().fetch()
productConfig().fetch(intervalInSeconds)
productConfig().activate()
productConfig().fetchAndActivate()
setCTProductConfigListener()
onInit()
onFetched()
onActivated()
productConfig().setMinimumFetchIntervalInSeconds(seconds)
productConfig().getBoolean(key)
productConfig().getDouble(key)
productConfig().getLong(key)
productConfig().getString(key)
productConfig().reset()
productConfig().getLastFetchTimeStampInMillis()
- Feature flags
featureFlag()
setCTFeatureFlagsListener()
featureFlagsUpdated()
featureFlag().get(key,defaultVal)
- Product config
-
Signature change of
onInboxItemClicked
callback: It is changed fromonInboxItemClicked(CTInboxMessage message)
toonInboxItemClicked(CTInboxMessage message, int contentPageIndex, int buttonIndex)
. ThecontentPageIndex
corresponds to the page index of the content, which ranges from 0 to the total number of pages for carousel templates. For non-carousel templates, the value is always 0, as they only have one page of content. ThebuttonIndex
represents the index of the App Inbox button clicked (0, 1, or 2). A value of -1 indicates the App Inbox item is clicked. -
Behavioral change of
onInboxItemClicked
callback:- Previously, the callback was raised when the App Inbox Item is clicked.
- Now, it is also raised when the App Inbox button and Item is clicked.
- Fixes a bug where App Inbox was not respecting the App Inbox background color when no tabs are provided.
- Fixes the non-EU retry mechanism bug
- Bug fixes and performance improvements.
- Bug fixes and performance improvements.
- Fixes message UI for footer in-app.
- Fixes NPE when clicked on body of InboxMessage with deep link in
CTInboxListFragment
- Other bug fixes and performance improvements.
- Fixes a crash (
ClassCastException
) in header/footer InApp templates.
- Fixes ANR on main thread for static initialization of
SimpleDateFormat()
. - Add Proguard rules to keep
CREATOR
instance for Parcelable classes to preventClassNotFoundException
when unmarshalling:androidx.fragment.app.FragmentManagerState
- Made calls to
getInstallReferrer()
async to prevent ANR when called on main thread. - Used
ConcurrentHashMap
instead ofHashMap
for storingCleverTapAPI
instances to prevent ConcurrentModificationException when trying to access the instances concurrently. - Made calls to
findCTPushProvider()
andfindCustomEnabledPushTypes()
async to prevent ANR when called on main thread. - Renames
setPushPermissionNotificationResponseListener(PushPermissionResponseListener)
toregisterPushPermissionNotificationResponseListener(PushPermissionResponseListener)
. EachPushPermissionResponseListener
instance passed in this method is now maintained in a list of thePushPermissionResponseListener
type and the Push Primer result is notified to all the elements of this list. - Adds
unregisterPushPermissionNotificationResponseListener(PushPermissionResponseListener)
method inCleverTapAPI
class to unregister thePushPermissionResponseListener
instance to stop observing the Push Primer result. - Use v4.7.2, this version contains a bug which causes a crash (
ClassCastException
) in header/footer InApp templates.
- Adds below new public APIs for supporting Android 13 notification runtime permission
isPushPermissionGranted()
Usage can be found herepromptPushPrimer(JSONObject)
Usage can be found herepromptForPushPermission(boolean showFallbackSettings)
Usage can be found here
- New
CTLocalInApp
builder class available to create half-interstitial & alert local in-apps to request notification permission Usage can be found here - New callback
PushPermissionResponseListener
available which returns after user Allows/Denies notification permission Usage can be found here - From 4.7.0+ existing callback
InAppNotificationListener
will now haveonShow(CTInAppNotification)
method which needs to implemented - Minimum Android SDK version bumped to API 19 (Android 4.4)
- Use v4.7.2, this version contains a bug which causes a crash (
ClassCastException
) in header/footer InApp templates.
- Renames the
itemIndex
parameter of theonInboxItemClicked
callback with thecontentPageIndex
. It's not a breaking change. - [Parity with CleverTap iOS SDK]:
The
onInboxItemClicked
callback now provides a different value for contentPageIndex(ex-itemIndex
) compared to before. Previously, it used to indicate the position of the clicked item within the list container of the App Inbox. However, now it indicates the page index of the content, which ranges from 0 to the total number of pages for carousel templates. For non-carousel templates, the value is always 0, as they only have one page of content.
-
Signature change of
onInboxItemClicked
callback: It is changed fromonInboxItemClicked(CTInboxMessage message)
toonInboxItemClicked(CTInboxMessage message, int itemIndex, int buttonIndex)
. TheitemIndex
corresponds the index of the item clicked in the list whereas thebuttonIndex
for the App Inbox button clicked (0, 1, or 2). A value of -1 indicates the App Inbox item is clicked. -
Behavioral change of
onInboxItemClicked
callback:- Previously, the callback was raised when the App Inbox Item is clicked.
- Now, it is also raised when the App Inbox button and Item is clicked.
- Adds the new public API
dismissAppInbox()
viaCleverTapAPI
class to dismiss the App Inbox.
- Bug fixes and performance improvements.
- Note: This release is being done for Android 12 targeted users, satisfying below points.
- Targeting Android 12 and
- Using RenderMax and/or using Push Templates
- Fixes App Inbox bug where an Inbox message's video would not play when new Inbox messages were available
- Allows more special characters when setting custom CleverTap ID
- Bug fixes and improvements
- Fix crash in App inbox when No additional tabs are used .
- Support for exoplayer
v2.17.1
. Note : this upgrade will result in minor ui changes for interstitial in app and inbox notifications that uses exoplayer - Note: Kindly upgrade to version CleverTap Android SDK v4.6.3 and above if you face any issues with app inbox
- App inbox blue dot fix : This release fixes the bug where new entries in inbox would continue showing blue dot when scrolled up and down . expected behaviour is to stop showing blue dot after 2 seconds.
- App inbox onMessage Click Callback : user can now pass an
InboxMessageListener
in addition toInboxMessageButtonListener
to receive inbox item click - Note: Kindly upgrade to version CleverTap Android SDK v4.6.3 and above if you face any issues with app inbox
- Improved push synchronization for multiple push services
- Fixes a bug for notification CTA deeplink for Android 12 and above devices - On clicking notification CTA, deeplink launches third party app instead of X app even though X app is capable of handling deeplink. For example, if X app is capable of handling https://google.com(sample link) but deeplink launches browser instead of X app.
- New Feature : You can now call
onUserLogin
,incrementValue
anddecrementValue
method via WebView Interface. - Improvement : Updated SSL Pinning Certificates
removeValueForKey()
inCleverTapAPI
can now remove PII data like Email, Phone and Date Of Birth.- Improved the
ActivityLifecycleCallback
’sonPaused
logic so that it runs on the background thread to avoid any runtime issues. Fixes #221. - Adds support to change credentials for the CleverTap Xiaomi Push SDK using
changeXiaomiCredentials
. Contribution PR #269. - Adds support to enable/disable the CleverTap Xiaomi Push SDK using
enableXiaomiPushOn
method. CleverTap Xiaomi Push SDK can now be enabled/disabled forALL_DEVICES
,XIAOMI_MIUI_DEVICES
andNO_DEVICES
. - Adds analytics support for upcoming CleverTap Direct Call Android SDK.
- Sets up CI/CD using Github Actions.
Note : If you are facing
ClassNotFoundException
"org.jacoco.agent.rt.internal_28bab1d.Offline" after updating to 4.5.0, Please update the SDK to v4.5.1
- Adds below new public APIs for smooth and easy integration of Custom Android Push Notifications Handling(FCM),Custom Pull Notifications Handling and Push Templates
CTFcmMessageHandler().createNotification(applicationContext, message)
CTFcmMessageHandler().processPushAmp(applicationContext, message)
CleverTapAPI.setNotificationHandler(notificationHandler)
- Adds support for Firebase Cloud Messaging v21 and above
- Fixes a Strict Mode Read violation for low RAM devices
- Adds support for apps targeting Android 12 (API 31) This version is compatible with all new Android 12 changes like Notification Trampolines, Pending Intents Mutability and Safer Component Exporting. For more information check out the CleverTap documentation for Android 12 here
- Deprecated
CTPushNotificationReceiver
andCTNotificationIntentService
as a part of Notification Trampoline restrictions in Android 12 (API 31) - Last version with support for custom FCM Sender ID for generating the FCM token
- Fixes a bug where
UTM Visited
event was not being raised on click of a direct deep link
- Adds public methods for suspending/discarding & resuming InApp Notifications
- Adds public methods to increment/decrement values set via User properties
- Adds a new public method
getCleverTapID(OnInitCleverTapIDListener)
to get CleverTap ID throughOnInitCleverTapIDListener
callback - Deprecated
SyncListener
interface and will be removed in future versions, usegetCleverTapID(OnInitCleverTapIDListener)
instead - Deprecated
getCleverTapAttributionIdentifier()
method and will be removed in future versions, usegetCleverTapID(OnInitCleverTapIDListener)
instead - Adds new
CleverTapAPI.LogLevel.VERBOSE
level for debugging - Fixes App Inbox UI for Android Tablets
- Fixes
recordScreen()
NPE crash - Fixes a few Strict Mode Read violations that caused ANRs
- Other performance improvements and improved logging
- Adds
setFirstTabTitle
method to set the name of the first tab in App Inbox - Adds
pushChargedEvent
toCTWebInterface
class to allow raising Charged Event from JS - Removes a
NoClassDefFoundError
raised in Android Kitkat (v4.4) - #168 - Removes a
NullPointerException
raised while handlingInstallReferrerClient
- #166 - Other bug fixes
- Adds support for Android 11
- Reduces the SDK size and added performance improvements
- Removes the deprecated Product Experiences (Screen AB/Dynamic Variables) related code
- Removes support for JCenter
- Fixes a bug where Xiaomi, Huawei, Baidu and other push service tokens were not switched to new profiles when using
onUserLogin
- Fixed FCM token refresh issue when multiple Firebase Projects are integrated in the application. If you're using multiple Firebase projects in your app, use this version instead of v4.0.0 ~ v4.0.3
- Fix for In-apps/Inbox not rendering in v4.0.1 on using configurable Clevertap Identities feature introduced in v4.0.1
- Adds support for configurable CleverTap identifiers.
- Adds deprecation warnings for Product A/B Tests public methods.
- Fix for multiple App Launched and App Installed events in the first session.
- Fixes crash which occurred due to wrong classification of some mobile devices as tablets #116.
- Optimized proguard rules for better obfuscation.
- Adds support for Android 10 and AndroidX support libraries.
- This is a major release, please find the list of all changes here