in firebase-inappmessaging-display/src/main/java/com/google/firebase/inappmessaging/display/FirebaseInAppMessagingDisplay.java [295:434]
private void inflateBinding(final Activity activity, final BindingWrapper bindingWrapper) {
// On click listener when X button or collapse button is clicked
final View.OnClickListener dismissListener =
new View.OnClickListener() {
@Override
public void onClick(View v) {
if (callbacks != null) {
callbacks.messageDismissed(InAppMessagingDismissType.CLICK);
}
dismissFiam(activity);
}
};
Map<Action, View.OnClickListener> actionListeners = new HashMap<>();
for (Action action : extractActions(inAppMessage)) {
final View.OnClickListener actionListener;
// TODO: need an onclick listener per action
// If the message has an action and an action url, set up an intent to handle the url
if (action != null && !TextUtils.isEmpty(action.getActionUrl())) {
actionListener =
new View.OnClickListener() {
@Override
public void onClick(View v) {
if (callbacks != null) {
Logging.logi("Calling callback for click action");
callbacks.messageClicked(action);
}
launchUriIntent(activity, Uri.parse(action.getActionUrl()));
notifyFiamClick();
// Ensure that we remove the displayed FIAM, and ensure that on re-load, the message
// isn't re-displayed
removeDisplayedFiam(activity);
inAppMessage = null;
callbacks = null;
}
};
} else {
Logging.logi("No action url found for action. Treating as dismiss.");
actionListener = dismissListener;
}
actionListeners.put(action, actionListener);
}
final OnGlobalLayoutListener layoutListener =
bindingWrapper.inflate(actionListeners, dismissListener);
if (layoutListener != null) {
bindingWrapper.getImageView().getViewTreeObserver().addOnGlobalLayoutListener(layoutListener);
}
// Show fiam after image successfully loads
loadNullableImage(
activity,
bindingWrapper,
extractImageData(inAppMessage),
new FiamImageLoader.Callback() {
@Override
public void onSuccess() {
// Setup dismiss on touch outside
if (!bindingWrapper.getConfig().backgroundEnabled()) {
bindingWrapper
.getRootView()
.setOnTouchListener(
new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
if (callbacks != null) {
callbacks.messageDismissed(
InAppMessagingDismissType.UNKNOWN_DISMISS_TYPE);
}
dismissFiam(activity);
return true;
}
return false;
}
});
}
// Setup impression timer
impressionTimer.start(
new RenewableTimer.Callback() {
@Override
public void onFinish() {
if (inAppMessage != null && callbacks != null) {
Logging.logi(
"Impression timer onFinish for: "
+ inAppMessage.getCampaignMetadata().getCampaignId());
callbacks.impressionDetected();
}
}
},
IMPRESSION_THRESHOLD_MILLIS,
INTERVAL_MILLIS);
// Setup auto dismiss timer
if (bindingWrapper.getConfig().autoDismiss()) {
autoDismissTimer.start(
new RenewableTimer.Callback() {
@Override
public void onFinish() {
if (inAppMessage != null && callbacks != null) {
callbacks.messageDismissed(InAppMessagingDismissType.AUTO);
}
dismissFiam(activity);
}
},
DISMISS_THRESHOLD_MILLIS,
INTERVAL_MILLIS);
}
activity.runOnUiThread(
new Runnable() {
@Override
public void run() {
windowManager.show(bindingWrapper, activity);
if (bindingWrapper.getConfig().animate()) {
// Animate entry
animator.slideIntoView(application, bindingWrapper.getRootView(), TOP);
}
}
});
}
@Override
public void onError(Exception e) {
Logging.loge("Image download failure ");
if (layoutListener != null) {
bindingWrapper
.getImageView()
.getViewTreeObserver()
.removeGlobalOnLayoutListener(layoutListener);
}
cancelTimers(); // Not strictly necessary.
inAppMessage = null;
callbacks = null;
}
});
}