diff --git a/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/display/impl/InAppMessageView.kt b/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/display/impl/InAppMessageView.kt index ac3e42150d..2a75305e29 100644 --- a/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/display/impl/InAppMessageView.kt +++ b/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/display/impl/InAppMessageView.kt @@ -14,7 +14,6 @@ import android.view.ViewGroup import android.view.WindowManager import android.view.animation.Animation import android.webkit.WebView -import android.widget.PopupWindow import android.widget.RelativeLayout import androidx.cardview.widget.CardView import androidx.core.widget.PopupWindowCompat @@ -51,7 +50,7 @@ internal class InAppMessageView( private val disableDragDismiss: Boolean, private val hideGrayOverlay: Boolean, ) { - private var popupWindow: PopupWindow? = null + private var popupWindow: OSPopupWindow? = null internal interface InAppMessageViewListener { fun onMessageWasDisplayed() @@ -86,6 +85,16 @@ internal class InAppMessageView( private var isDismissTimerSet: Boolean = false private var cancelDismissTimer: Boolean = false + private val popupWindowListener = + object : OSPopupWindow.PopupWindowListener { + override fun onDismiss(wasDismissedManually: Boolean?) { + if (wasDismissedManually != true) { + Logging.debug("PopupWindowListener.onDismiss called by the system.") + messageController?.onMessageWasDismissed() + } + } + } + init { setMarginsFromContent(messageContent) } @@ -271,11 +280,12 @@ internal class InAppMessageView( */ private fun createPopupWindow(parentRelativeLayout: RelativeLayout) { popupWindow = - PopupWindow( + OSPopupWindow( parentRelativeLayout, if (hasBackground) WindowManager.LayoutParams.MATCH_PARENT else pageWidth, if (hasBackground) WindowManager.LayoutParams.MATCH_PARENT else WindowManager.LayoutParams.WRAP_CONTENT, false, + popupWindowListener, ) popupWindow?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) popupWindow?.isTouchable = true @@ -486,17 +496,14 @@ internal class InAppMessageView( */ fun removeAllViews() { Logging.debug("InAppMessageView.removeAllViews()") + popupWindow?.wasDismissedManually = true if (isDismissTimerSet) { // Dismissed before the dismiss delay cancelDismissTimer = true } - if (draggableRelativeLayout != null) { - draggableRelativeLayout!!.removeAllViews() - } - if (popupWindow != null) { - popupWindow!!.dismiss() - } + draggableRelativeLayout?.removeAllViews() + popupWindow?.dismiss() dereferenceViews() } diff --git a/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/display/impl/OSPopupWindow.kt b/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/display/impl/OSPopupWindow.kt new file mode 100644 index 0000000000..9b54313240 --- /dev/null +++ b/OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/display/impl/OSPopupWindow.kt @@ -0,0 +1,32 @@ +package com.onesignal.inAppMessages.internal.display.impl + +import android.view.View +import android.widget.PopupWindow + +/** + * Custom PopupWindow to listen to dismiss event + */ +internal class OSPopupWindow( + contentView: View?, + width: Int, + height: Int, + focusable: Boolean, + private val listener: PopupWindowListener, +) : PopupWindow(contentView, width, height, focusable) { + /** + * Used to differentiate when this popup window has been dismissed programmatically by OneSignal vs by the system. + * When the back button is pressed while an IAM is displaying, the system will dismiss the popup window + * without the SDK's awareness. We need to know of this event and run the post-dismissal flows. + * Using this flag will prevent duplicate flows from triggering. + */ + var wasDismissedManually: Boolean? = null + + internal interface PopupWindowListener { + fun onDismiss(wasDismissedManually: Boolean?) + } + + override fun dismiss() { + super.dismiss() + listener.onDismiss(wasDismissedManually) + } +}