package com.appboy.ui.inappmessage.listeners; import android.app.Activity; import android.net.Uri; import android.view.View; import com.appboy.Constants; import com.appboy.enums.Channel; import com.appboy.enums.inappmessage.ClickAction; import com.appboy.models.IInAppMessage; import com.appboy.models.IInAppMessageHtml; import com.appboy.models.IInAppMessageImmersive; import com.appboy.models.MessageButton; import com.appboy.support.AppboyFileUtils; import com.appboy.support.AppboyLogger; import com.appboy.support.BundleUtils; import com.appboy.support.WebContentUtils; import com.appboy.ui.AppboyNavigator; import com.appboy.ui.actions.ActionFactory; import com.appboy.ui.actions.NewsfeedAction; import com.appboy.ui.actions.UriAction; import com.appboy.ui.inappmessage.AppboyInAppMessageManager; import com.appboy.ui.inappmessage.InAppMessageCloser; import java.io.File; public class AppboyInAppMessageViewLifecycleListener implements IInAppMessageViewLifecycleListener { private static final String TAG = String.format("%s.%s", Constants.APPBOY_LOG_TAG_PREFIX, AppboyInAppMessageViewLifecycleListener.class.getName()); @Override public void beforeOpened(View inAppMessageView, IInAppMessage inAppMessage) { AppboyLogger.d(TAG, "InAppMessageViewWrapper.IInAppMessageViewLifecycleListener.beforeOpened called."); inAppMessage.logImpression(); } @Override public void afterOpened(View inAppMessageView, IInAppMessage inAppMessage) { AppboyLogger.d(TAG, "InAppMessageViewWrapper.IInAppMessageViewLifecycleListener.afterOpened called."); } @Override public void beforeClosed(View inAppMessageView, IInAppMessage inAppMessage) { AppboyLogger.d(TAG, "InAppMessageViewWrapper.IInAppMessageViewLifecycleListener.beforeClosed called."); } @Override public void afterClosed(IInAppMessage inAppMessage) { AppboyLogger.d(TAG, "InAppMessageViewWrapper.IInAppMessageViewLifecycleListener.afterClosed called."); getInAppMessageManager().resetAfterInAppMessageClose(); if (inAppMessage instanceof IInAppMessageHtml) { startClearHtmlInAppMessageAssetsThread(); } inAppMessage.onAfterClosed(); } @Override public void onClicked(InAppMessageCloser inAppMessageCloser, View inAppMessageView, IInAppMessage inAppMessage) { AppboyLogger.d(TAG, "InAppMessageViewWrapper.IInAppMessageViewLifecycleListener.onClicked called."); inAppMessage.logClick(); // Perform the in-app message clicked listener action from the host application first. This give // the app the option to override the values that are sent from the server and handle the // in-app message differently depending on where the user is in the app. // // To modify the default in-app message clicked behavior, mutate the necessary in-app message members. As // an example, if the in-app message were to navigate to the news feed when it was clicked, the // behavior can be cancelled by setting the click action to NONE. boolean handled = getInAppMessageManager().getInAppMessageManagerListener().onInAppMessageClicked(inAppMessage, inAppMessageCloser); if (!handled) { // Perform the default (or modified) in-app message clicked behavior. performInAppMessageClicked(inAppMessage, inAppMessageCloser); } } @Override public void onButtonClicked(InAppMessageCloser inAppMessageCloser, MessageButton messageButton, IInAppMessageImmersive inAppMessageImmersive) { AppboyLogger.d(TAG, "InAppMessageViewWrapper.IInAppMessageViewLifecycleListener.onButtonClicked called."); inAppMessageImmersive.logButtonClick(messageButton); boolean handled = getInAppMessageManager().getInAppMessageManagerListener().onInAppMessageButtonClicked(messageButton, inAppMessageCloser); if (!handled) { // Perform the default (or modified) in-app message button clicked behavior. performInAppMessageButtonClicked(messageButton, inAppMessageImmersive, inAppMessageCloser); } } @Override public void onDismissed(View inAppMessageView, IInAppMessage inAppMessage) { AppboyLogger.d(TAG, "InAppMessageViewWrapper.IInAppMessageViewLifecycleListener.onDismissed called."); getInAppMessageManager().getInAppMessageManagerListener().onInAppMessageDismissed(inAppMessage); } private void performInAppMessageButtonClicked(MessageButton messageButton, IInAppMessage inAppMessage, InAppMessageCloser inAppMessageCloser) { performClickAction(messageButton.getClickAction(), inAppMessage, inAppMessageCloser, messageButton.getUri(), messageButton.getOpenUriInWebview()); } private void performInAppMessageClicked(IInAppMessage inAppMessage, InAppMessageCloser inAppMessageCloser) { performClickAction(inAppMessage.getClickAction(), inAppMessage, inAppMessageCloser, inAppMessage.getUri(), inAppMessage.getOpenUriInWebView()); } private void performClickAction(ClickAction clickAction, IInAppMessage inAppMessage, InAppMessageCloser inAppMessageCloser, Uri clickUri, boolean openUriInWebview) { if (getInAppMessageManager().getActivity() == null) { AppboyLogger.w(TAG, "Can't perform click action because the cached activity is null."); return; } switch (clickAction) { case NEWS_FEED: inAppMessageCloser.close(false); NewsfeedAction newsfeedAction = new NewsfeedAction(BundleUtils.mapToBundle(inAppMessage.getExtras()), Channel.INAPP_MESSAGE); AppboyNavigator.getAppboyNavigator().gotoNewsFeed(getInAppMessageManager().getActivity(), newsfeedAction); break; case URI: inAppMessageCloser.close(false); UriAction uriAction = ActionFactory.createUriActionFromUri(clickUri, BundleUtils.mapToBundle(inAppMessage.getExtras()), openUriInWebview, Channel.INAPP_MESSAGE); AppboyNavigator.getAppboyNavigator().gotoUri(getInAppMessageManager().getActivity(), uriAction); break; case NONE: inAppMessageCloser.close(inAppMessage.getAnimateOut()); break; default: inAppMessageCloser.close(false); break; } } private AppboyInAppMessageManager getInAppMessageManager() { return AppboyInAppMessageManager.getInstance(); } private void startClearHtmlInAppMessageAssetsThread() { new Thread(new Runnable() { @Override public void run() { Activity inAppMessageActivity = AppboyInAppMessageManager.getInstance().getActivity(); if (inAppMessageActivity != null) { File internalStorageCacheDirectory = WebContentUtils.getHtmlInAppMessageAssetCacheDirectory(inAppMessageActivity); AppboyFileUtils.deleteFileOrDirectory(internalStorageCacheDirectory); } } }).start(); } }