layout |
---|
userguide |
In-App Messaging (IAM) module allows app developers to easily configure and display messages or campaigns within their app.
- Requirements
- Configuration
- Final Code Preview (Sample)
- Using the SDK
- Advanced Features
- SDK Logic
- Troubleshooting
- FAQ
- Changelog
minSdkVersion
>=23
targetSdkVersion
andcompileSdkVersion
>=33
Subscription Key
from the Dashboard
allprojects {
repositories {
mavenCentral()
}
}
dependencies {
implementation 'io.github.rakutentech.inappmessaging:inappmessaging:${latest_version}'
}
Note:
- This SDK only uses AndroidX libraries. Apps should migrate to AndroidX to avoid duplicate dependencies.
- For the latest version, refer to Changelog.
<meta-data
android:name="com.rakuten.tech.mobile.inappmessaging.subscriptionkey"
android:value="change-to-your-subsrcription-key"/>
<meta-data
android:name="com.rakuten.tech.mobile.inappmessaging.configurl"
android:value="change-to-config-url"/>
Note: These can also be set at runtime, as described here.
If you want to enable SDK debug logging (tags begins with "IAM_"), add this metadata in AndroidManifest.xml
:
<meta-data
android:name="com.rakuten.tech.mobile.inappmessaging.debugging"
android:value="true"/>
This method initializes the SDK and should be called in your Application's onCreate
.
An optional lambda function callback can be set to receive exceptions that caused failed configuration or non-fatal failures in the SDK.
class MainApplication : Application() {
override fun onCreate() {
// This can be used for analytics and logging of encountered configuration issues.
InAppMessaging.errorCallback = { Log.e(TAG, it.localizedMessage, it.cause) }
// If using Java, call with `InAppMessaging.Companion.configure(context: Context)`.
InAppMessaging.configure(
context = this,
subscriptionKey = "your_subscription_key", // Optional
configUrl = "endpoint for fetching configuration", // Optional
enableTooltipFeature = true // Optional (disabled by default)
)
}
}
Notes:
- Specifying values for
subscriptionKey
and/orconfigUrl
overrides the values set fromAndroidManifest.xml
.- To enable tooltips (beta feature) you must set
enableTooltipFeature
flag to true.- If
configure()
is not called, subsequent calls to other public API SDK functions have no effect.
We recommend, as good engineering practice, that you integrate with a remote config service so that you can fetch a feature flag, e.g. Enable_IAM_SDK
, and use its value to dynamically enable/disable the SDK without making an app release. There are many remote config services on the market, both free and paid.
By the end of this guide, your SDK integration code will look something like this:
(click to expand)
MainApplication.kt
class MainApplication: Application() {
val yourUserProvider = YourUserInfoProvider()
override fun onCreate() {
InAppMessaging.configure(this)
InAppMessaging.instance().registerPreference(yourUserProvider)
}
}
YourUserInfoProvider.kt
class YourUserInfoProvider: UserInfoProvider() {
// Update during login or logout
var userId = ""
var accessToken = ""
var idTracking = ""
override fun provideUserId() = userId
override fun provideAccessToken() = accessToken
override fun provideIdTrackingIdentifier() = idTracking
}
MainActivity.kt
class MainActivity: AppCompatActivity(), View.OnClickListener {
override fun onStart() {
InAppMessaging.instance().logEvent(AppStartEvent())
}
override fun onResume() {
InAppMessaging.instance().registerMessageDisplayActivity(this)
}
override fun onPause() {
InAppMessaging.instance().unregisterMessageDisplayActivity()
}
override fun onClick(v: View) {
// Log the events based on your use-cases
when (v.id) {
R.id.purchase_button_tapped -> InAppMessaging.instance().logEvent(PurchaseSuccessfulEvent())
R.id.home_tab_tapped -> InAppMessaging.instance().logEvent(CustomEvent("tab_visit").addAttribute("tab_name", "home"))
R.id.cart_tab_tapped -> InAppMessaging.instance().logEvent(CustomEvent("tab_visit").addAttribute("tab_name", "cart"))
}
}
fun onUserLogin() {
yourUserProvider.userId = "<userId>"
yourUserProvider.accessToken = "<accessToken>" // or idTracking
InAppMessaging.instance().logEvent(LoginSuccessfulEvent())
}
fun onUserLogout() {
yourUserProvider.userId = ""
yourUserProvider.accessToken = "" // or idTracking
}
}
Decide which activities in your app can display messages, then, call registerMessageDisplayActivity()
method in those activities' onResume
. It should be paired with unregisterMessageDisplayActivity()
in onPause
.
The activities will be kept in a WeakReference
object, so it will not cause any memory leaks.
override fun onResume() {
super.onResume()
InAppMessaging.instance().registerMessageDisplayActivity(this)
}
override fun onPause() {
super.onPause()
InAppMessaging.instance().unregisterMessageDisplayActivity()
}
This method initiates the display of a message whenever a specific event or a set of events occur. Call this method at appropriate locations in your app, and based on your use-case.
For each logged event, the SDK will match it with the ongoing message's triggers that are configured in the Dashboard. Once all of the required events are logged by the app, the message will be displayed in the current registered activity. If no activity is registered, it will be displayed in the next registered activity.
Log this event on app launch from terminated state. Recommended to log this event in app's main activity's Activity#onStart()
.
App Start Event is persistent, meaning, once it's logged it will always satisfy corresponding trigger in a message. All subsequent logs of this event are ignored. Messages that require only AppStartEvent are shown once per app session.
class MainActivity: AppCompatActivity() {
override fun onStart() {
super.onStart()
InAppMessaging.instance().logEvent(AppStartEvent())
}
}
Note: Because this event is logged almost instantly after app launch, there may be situation wherein user information is not yet available due to some delay, and may cause unexpected behavior. Therefore we recommend to ensure user information is up-to-date (see User Targeting section for details) when using AppStart-only as trigger, or combine it with other event wherein user information is guaranteed to be available.
Log this every time the user logs in successfully.
InAppMessaging.instance().logEvent(LoginSuccessfulEvent())
Log this event after every successful purchase.
InAppMessaging.instance().logEvent(PurchaseSuccessfulEvent())
Log this after app-defined states are reached or conditions are met. Example use-case is an event based on tabs or certain screens in your app.
Custom events can have attributes with names and values. Attributes can be integer
, double
, String
, boolean
, or java.util.Date
type.
- Every custom event requires a name(case insensitive), but doesn't require to add any attributes with the custom event.
- Each custom event attribute also requires a name(case insensitive), and a value.
- Recommended to use English characters only.
- Because the custom event's name will be used when matching messages with triggers; therefore, please make sure the actual message event's name and attribute's name must match with the logged events to SDK.
InAppMessaging.instance().logEvent(CustomEvent("search").addAttribute("keyword", "book").addAttribute("number_of_keyword", 1))
Required if you want to target messages to specific users.
To identify users, you must provide the following user information (the required data varies based on the login SDK used):
User Info | Description | For Mobile Login SDK users | For ID SDK users |
---|---|---|---|
User ID | ID when registering a Rakuten account (e.g. email address or username) | Required | Optional |
Access Token | Access token value provided by the internal Mobile Login SDK | Required | Do not override or leave empty |
ID Tracking Identifier | Tracking identifier value provided by the internal ID SDK | Do not override or leave empty | Required |
import com.rakuten.tech.mobile.inappmessaging.runtime.UserInfoProvider
class YourUserInfoProvider: UserInfoProvider() {
// Update during login or logout
var userId = ""
var accessToken = ""
var idTracking = ""
override fun provideUserId() = userId
override fun provideAccessToken() = accessToken
override fun provideIdTrackingIdentifier() = idTracking
}
You must provide the relevant information through this class. It will be retrieved by SDK on demand, so make sure values are up-to-date.
After logout is complete, please ensure that all UserInfoProvider
methods in the preference object return null
or empty string.
Notes:
- Regarding access token:
- Only provide access token if the user is logged in
- The internal Backend only supports production access token
- Migrating from legacy Mobile Login SDK to ID SDK
- Update your
UserInfoProvider
and override theprovideIdTrackingIdentifier()
method. Do not override other methods or leave them as null or empty- Impact: User will be treated as a new user, therefore if there are active messages that were previously displayed/opted-out by the user, then it will be displayed again
Call registerPreference()
method right after configure()
.
class MainApplication : Application() {
override fun onCreate() {
// configure called here...
InAppMessaging.instance().registerPreference(YourUserInfoProvider())
}
}
Message contexts are used to add more control on when messages are displayed. A context can be defined as the text inside "[]" within the Dashboard's "Campaign Name" e.g. the message name is "[ctx1] title" so the context is "ctx1". Multiple contexts are supported. In order to handle defined contexts in the code an optional callback is called before a message is displayed:
InAppMessaging.instance().onVerifyContext = { contexts: List<String>, campaignTitle: String -> Boolean
if /* check your condition e.g. are you on the correct screen to display this message? */ {
true // campaign message will be displayed
} else {
false // campaign message won't be displayed
}
}
There may be cases where apps need to manually close the messages without user interaction.
An example is when a different user logs-in and the currently displayed message does not target the new user. It is possible that the new user did not close the message (tapping the 'X' button) when logging in. The app can force-close the message by calling this method.
An optional parameter, clearQueuedCampaigns
, can be set to true
(false
by default) which will additionally remove all messages that were queued to be displayed.
InAppMessaging.instance().closeMessage(clearQueuedCampaigns = true|false)
Note: Calling this method will not increment the campaign's impression (i.e not counted as displayed)
The SDK can optionally use custom fonts on the message' header and body texts, and button texts. The default Android system font will be used if custom fonts are not added.
To use custom fonts:
- Add the font files,
ttf
orotf
format, to thefont
resource folder of your app. - To use custom font for the following message parts, define a string resource in the app's
res/values/string.xml
:
- for message header texts, set font filename to
iam_custom_font_header
resource name - for message body texts, set font filename to
iam_custom_font_body
resource name - for message button texts, set font filename to
iam_custom_font_button
resource name
Note: You can set the same font filename for the different string resources to use the same font.
...
├── res
├── font
├── your_app_font.otf // or ttf format
├── your_app_other_font.otf // or ttf format
in strings.xml:
<string name="iam_custom_font_header">your_app_font</string>
<string name="iam_custom_font_body">your_app_font</string>
<string name="iam_custom_font_button">your_app_other_font</string>
Tooltips are messages attached to particular anchor views within the app. To enable this feature, refer to the Configuration section.
This feature is in beta testing, therefore its features and behavior might change in the future. Please refer to the internal guide for more information.
(click to expand)
If user (with valid identifiers in UserInfoProvider
) opts out from a message, that information is saved in user cache locally on the device and the message won't be shown again for that user on the same device. The opt-out status is not shared between devices. The same applies for anonymous user.
- Each user has a separate cache container that is persisted in
SharedPreferences
. Each combination of userId and idTrackingIdentifier is treated as a different user including a special - anonymous user - that represents non logged-in user (userId and idTrackingIdentifier are null or empty).
Message impressions (displays) are counted locally for each user. Meaning that a message with maxImpression value of 3 will be displayed to each user (different identifiers in UserInfoProvider
class) max 3 times. Max impression number can be modified in the Dashboard. Then the SDK, after next ping call, will compare new value with old max impression number and add the difference to the current impression counter. The max impression data is not shared between devices. The same applies for anonymous user.
(click to expand)
Caused by: java.io.IOException: proguard.ParseException: Unknown option '-if' in line 84 of file
This error will be thrown during compilation if `minifyEnabled = true`, and your Proguard version is below 6.0.
(click to expand)
Recommendation: Update your project's Android Gradle Plugin to the latest version, it includes the latest version of Proguard.Less optimal solution: Force Gradle to use the latest version of Proguard(https://sourceforge.net/p/proguard/discussion/182455/thread/89a4d63d/):
buildscript {
...
configurations.all {
resolutionStrategy {
force 'net.sf.proguard:proguard-gradle:6.0.3'
force 'net.sf.proguard:proguard-base:6.0.3'
}
}
}
Build Error: java.lang.RuntimeException: Duplicate class com.rakuten.tech.mobile.manifestconfig.annotations.ManifestConfig
(click to expand)
This build error could occur if you are using older versions of other libraries from com.rakuten.tech.mobile
.
Some of the dependencies in this SDK have changed to a new Group ID of io.github.rakutentech
(due to the JCenter shutdown).
This means that if you have another library in your project which depends on the older dependencies using the Group ID com.rakuten.tech.mobile
, then you will have duplicate classes.
To avoid this, please add the following to your build.gradle
in order to exclude the old com.rakuten.tech.mobile
dependencies from your project.
configurations.all {
exclude group: 'com.rakuten.tech.mobile', module: 'manifest-config-processor'
exclude group: 'com.rakuten.tech.mobile', module: 'manifest-config-annotations'
}
Rakuten developers experiencing any other problems should refer to the Troubleshooting Guide on the internal developer documentation portal.
(click to expand)
When creating messages, you can specify the app version - such as debug, staging, or production version.
<versionName>.<versionCode>
is the format when specifying the versions; for example, 1.0.0-staging.101, 1.0.0-prod.203, or 0.x.x.4.
The max impression is handled by SDK and is bound to user per device.
- Scenario- Max impression is set to 2. User does not login with any ID. So It will be shown 2 times.
- Scenario- Max impression is set to 2. User login with any ID for 2 devices. It will show 2 times for each device.
- The message start time can be shown
Please refer to max impression handling for more details.
All the events "launch the app event, login event, purchase successful event, custom event" work as AND. It will send to the device only all defined event are triggered.
(click to expand)
- Improvements:
- RMCCX-6876: Improved console logging.
- RMC SDK updates:
- RMCCX-7186: Supported Clickable Image through CustomJson.
- RMCCX-7327: Supported customizable modal campaign background opacity through CustomJson.
- Improvements:
- SDKCF-6327: Updated compile and target SDK to API 34 (Android 14).
- RMCCX-6695: Improved the userguide.
- RMC SDK updates:
- RMCCX-6698: Supported Push Primer feature through CustomJson.
- RMCCX-6711: Supported redirecting to App Notification Settings on tapping PushPrimer button action.
- RMCCX-6706: Prevented showing Push Primer campaign for unsupported devices (Android 12 and below) and when push permission is granted.
- RMCCX-6711: Limited CustomJson feature to RMC SDK.
- RMCCX-6936: Supported sending
_rem_rmc_iam_impressions
event to app and SDK RAT accounts upon impression. - RMCCX-6937: Supported sending
_rem_rmc_iam_pushprimer
event to app and SDK RAT accounts upon selection from the native push permission prompt.
- SDKCF-6575: Added sending of device Id in all IAM requests.
- Improved the following classes to increase code coverage:
- InAppMessagingConstants (SDKCF-6497)
- InAppMessageSlideUpView (SDKCF-6478)
- InAppMessagingTooltipView (SDKCF-6438)
- InAppMessageModalView (SDKCF-6611)
- InAppMessageBaseView (SDKCF-6486)
- MessageEventReconciliationUtil (SDKCF-6398)
- MessageReadinessManager (SDKCF-6458)
- TriggerAttributesValidator (SDKCF-6399)
- BuildVersionChecker (SDKCF-6513)
- ImpressionWorker (SDKCF-6613)
- SDKCF-6596: Updated minor version and dependency check suppression of the following dependencies:
- Kotlin to
1.6.21
- Dokka to
1.8.10
- Robolectric to
4.10.3
- Dependency Check to
8.2.1
- Kotlin to
- SDKCF-6736: Improved worker to abort further processing when config URL is empty.
- SDKCF-6547: Fixed impression is not incremented when tooltip campaign is displayed.
- SDKCF-6518: Fixed and suppressed some SonarCloud code smells.
- Updates for RMC SDK:
- Prevent calling
configure()
when RMC SDK is integrated (SDKCF-6711) - Added sending of
rmcSdkVersion
in IAM requests (SDKCF-6708)
- Prevent calling
- SDKCF-6321: Updated detekt version to
1.22.0
. - SDKCF-6395: Removed unused utility function
getImage()
(downloading image with Retrofit). - SDKCF-6126: Fixed incorrect tooltip position on scroll views and during device screen rotation.
- SDKCF-6267: Fixed issue where campaign is sometimes not displayed on app launch.
- SDKCF-6391: Fixed campaign being displayed multiple times when upgrading to version
7.2.0
or later. - SDKCF-6440: Fixed campaigns are not displayed when prior campaign in queue is cancelled through
onVerifyContext
. - SDKCF-6394: Refactored data classes to remove unnecessary annotation and grouped related data classes.
- SDKCF-5835: Updated dependencies to remove vulnerabilities.
- SDKCF-5893: Added campaign UX Improvements related to texts' wrapping for readability:
- For Android 13 devices using Japanese language, wrapping by Bunsetsu is applied
- For devices using English language, hyphenation is applied
- SDKCF-5601: Fixed close button's content label accessibility warnings.
- SDKCF-5900: Refactored code to remove most of the suppressions for code smells.
- SDKCF-5948: Added tooltip campaigns feature.
- SDKCF-6076: Updated
configure()
API to enable/disable tooltip campaigns feature (disabled by default). Please see usage section for details. - SDKCF-6035: Added
closeTooltip()
API to manually close displayed tooltip byviewId
(UIElement
identifier). - SDKCF-6009: Fixed issue on campaign not displayed after going to background.
- SDKCF-6025: Added Push Primer opt-in tracking for Android 13 and up devices. Please see usage section for details.
- SDKCF-6010: Fixed re-display of AppStart-only campaigns when switching users, and to align with iOS.
- SDKCF-5038: Refactored event logging logic and campaign repository to align with iOS.
- Impact: Data stored from SharedPreferences is cleared to use the new format. Therefore please ensure that there are no pending campaigns when updating to this version, for the campaign's impressions left will be reset to "max lifetime impressions count" and opt-out status to "not opted out" affecting the visibility of the pending campaign.
- SDKCF-5510: Updated SDK Utils dependency to v2.1.1.
- SDKCF-5242: Added handling to change opt-out color when background is dark.
- SDKCF-5637: Fixed issue where test campaigns are not being displayed.
- SDKCF-5777: Enabled triggers validation for test campaigns.
- SDKCF-5778: Updated compile and target SDK to API 33 (Android 13).
- SDKCF-5565: Added Push Primer feature for Android 13 and up devices. Please see usage section for details.
- SDKCF-5612: Updated
configure()
API to optionally override subscription ID and config URL at runtime.
- SDKCF-5256: Added sending of impression events with campaign details to analytics account.
- SDKCF-4919: Added support for building using Java 11.
- SDKCF-5173: Updated detekt to stricter check.
- SDKCF-5295: Updated SDK Utils version to update default
initOrder
of content provider.
- SDKCF-4941: Breaking Changes: Updated configuration API to align with iOS.
- Renamed
init()
API toconfigure()
. - Removed optional
errorCallback
lambda function parameter inconfigure()
, and changed as static variable. - Please see Configuring In-App Messaging SDK section for details and sample code.
- Renamed
- SDKCF-4904: Updated dependencies to fix vulnerability issues.
- SDKCF-5002: Campaign UX Improvements: Added handling for new flags in campaign payload:
- Setting to Hide the top right "x" closing button.
- "End Date" setting in order to have a "Never ends" option.
- "Max Lifetime impressions" setting in order to have several options (No limits/Only once/Multiple times). By default set it to "Only Once".
- SDKCF-4859: Fixed campaign button boundaries when campaign and button backgrounds have the same color.
- SDKCF-5019: Updated SDK Utils to v1.1.0.
- SDKCF-4860: Added Jetpack Compose sample app.
(click to expand)
- SDKCF-4470: Updated the layout for close and campaign buttons. Added feature to customize text and button fonts, please see custom font section for details.
- SDKCF-4684: Fixed Picasso bitmap retrieval to avoid crash on large images.
- SDKCF-4650: Refactored handling for different responses from endpoint requests for consistency and better logging.
- SDKCF-4690: Changed common code to use SDK Utils: Logger and SharedPreferences
- SDKCF-4799: Fixed reported issues due to version update of SonarQube
- SDKCF-4636: Refactored handling for different responses from endpoint requests for consistency and better logging.
- SDKCF-4729: Added error handling for display permission request.
- SDKCF-4151: Breaking Changes:
- Renamed method for providing access token in
UserInfoProvider
interface class fromprovideRaeToken
toprovideAccessToken
. - Removed
provideRakutenId
method for Rakuten Id inUserInfoProvider
interface class. Please useprovideUserId
for specific user targeting. - All the methods in
UserInfoProvider
class are optional for Kotlin class implementing the interface.
- Renamed method for providing access token in
- SDKCF-4468: Breaking Change: Removed deprecated updateSession() API.
- SDKCF-4530: Fixed handling for case-sensitivity update for custom event and attribute name.
- SDKCF-4196: Updated dependencies due to JCenter shutdown.
- SDKCF-4190: Updated Kluent dependency version due to deprecated mocking feature.
- SDKCF-4427: Updated compile and target SDK to API 31 (Android 12).
- SDKCF-3978: Updated endpoint response models to fix optional and required parameters.
- SDKCF-4440: Changed image downloader dependency from Fresco to Picasso.
- SDKCF-3979: Added displaying delay between campaign messages.
- SDKCF-3826: Removed deprecated kotlin-android-extensions plugin.
- SDKCF-4117: Added handling for send IAM events to analytics backend if the dependency exists.
(click to expand)
- SDKCF-4071: Breaking Change: Added new method for providing id tracking identifier in
UserInfoProvider
interface class.- The new method is optional for Kotlin class implementing the interface.
- SDKCF-4174: Updated support link in documentation.
- SDKCF-4219: Fixed issue regarding incorrect behavior of closeMessage API when queue is not cleared.
- SDKCF-3651: Changed Config API call to /GET with query params. This allows the backend to filter requests if required.
- SDKCF-3653: Added handling for Config and Ping API calls for "429 too many requests" response. The SDK will start exponential backoff (plus a random factor) retries to space out the requests to the backend when code 429 is received.
- SDKCF-3655: Handled opt-out and max impression tracking logic solely on SDK. This change reduces the backend's load per request.
- SDKCF-3664: Added support on roll-out percentage for computing if In-App Messaging is enabled. This allows the backend to gradually increase campaign distribution.
- SDKCF-3715: Included subscription key in Config API request header to enable better filtering of requests.
- SDKCF-3742: Fixed opt-out wording in JP and EN for consistency with iOS.
- SDKCF-3820: Added disabling of SDK features when response received from backend is disabled config.
- SDKCF-3908: Changed auto-initialization to explicit init for better control and handling for any initialization issue. Please refer to SDK Integration for details.
- SDKCF-3939: Added recommendation to use a remote feature flag to enable/disable the SDK.
- SDKCF-3916: Added internal handling of OS exception and triggering
errorCallback
if set. - SDKCF-3957: Increased the "hit area" of the close button.
- SDKCF-3992: Updated minimum SDK to API 23.
- SDKCF-3450: Update Fresco dependency to v2.4.0 to fix SoLoader issue.
- SDKCF-3454: Changed Maven Group ID to
io.github.rakutentech.inappmessaging
. You must update your dependency declarations to the following:io.github.rakutentech.inappmessaging:inappmessaging:3.0.0
- Migrated publishing to Maven Central due to Bintray/JCenter being shutdown. You must add
mavenCentral()
to yourrepositories
.
- SDKCF-3199: Add
closeMessage
API for programmatically closing campaigns without user action. - SDKCF-3129: Fix close button layout issue in slide-up campaign
- SDKCF-3117: Fix ANDROID_ID crash on AQUOS devices
- SDKCF-3219: Add closing of campaign when activity is unregistered
- SDKCF-2870: Allow host app to control if a campaign should be displayed in the current screen (using contexts)
- SDKCF-2980: Fix Android 11 issue where user are not redirected after tapping a campaign's redirect/deeplink button
- SDKCF-2967: Fix issue for campaigns getting displayed multiple times for campaign triggered by the AppLaunch event
- SDKCF-2872: Fix issue for Slide Up campaign was getting shown again after being closed and when user moved to another tab
- SDKCF-2568: Deprecate updateSession() API
- session update will be done internally when event is triggered and user info was changed
- will be removed on next major version
- SDKCF-2054: Converted In-App Messaging to Kotlin
- SDKCF-1614: Polish the Public API (removed unnecessary public APIs)
- SDKCF-1616: Auto Initialize the SDK
- SDKCF-2342: ID tracking identifier targeting
- SDKCF-2353: Rakuten ID targeting
- SDKCF-2402: Update locale parameter format
- SDKCF-2429: Prevent trigger of Launch App Event multiple times
- SDKCF-1619 SDKCF-1617: Remove unnecessary dependencies (Espresso and Lombok)
- Adding feature embedded event in action buttons.
- Fix UI bug on SlideUp messages.
- Fix race condition bug when initializing SDK.
- Adding support of Full Screen messages.
- Adding support of Slide Up messages.
- Adding support of message opt-out option for Full Screen and Modal messages.
- Adding Gif support.
- Removing RAT Broadcaster dependency, hence completely removing Android Support Libraries from InAppMessaging SDK.