diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/view/BackButtonHandler.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/view/BackButtonHandler.kt deleted file mode 100644 index d57d97d1..00000000 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/view/BackButtonHandler.kt +++ /dev/null @@ -1,22 +0,0 @@ -package cloud.mindbox.mobile_sdk.inapp.presentation.view - -import android.view.KeyEvent -import android.view.View -import android.view.ViewGroup - -internal class BackButtonHandler( - private val viewGroup: ViewGroup, - private val listener: View.OnClickListener?, -) { - /** Returning "true" or "false" if the event was handled, "null" otherwise. */ - fun dispatchKeyEvent(event: KeyEvent?): Boolean? { - if (event != null && event.keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_UP) { - if (listener != null) { - listener.onClick(viewGroup) - return true - } - return false - } - return null - } -} diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/view/BackButtonLayout.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/view/BackButtonLayout.kt deleted file mode 100644 index e07afa05..00000000 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/view/BackButtonLayout.kt +++ /dev/null @@ -1,7 +0,0 @@ -package cloud.mindbox.mobile_sdk.inapp.presentation.view - -import android.view.View - -internal interface BackButtonLayout { - fun setDismissListener(listener: View.OnClickListener?) -} diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/view/InAppConstraintLayout.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/view/InAppConstraintLayout.kt index 796093bf..e213de23 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/view/InAppConstraintLayout.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/view/InAppConstraintLayout.kt @@ -15,9 +15,7 @@ import cloud.mindbox.mobile_sdk.logger.mindboxLogI import cloud.mindbox.mobile_sdk.px import kotlin.math.abs -internal class InAppConstraintLayout : ConstraintLayout, BackButtonLayout { - - private var backButtonHandler: BackButtonHandler? = null +internal class InAppConstraintLayout : ConstraintLayout { fun setSwipeToDismissCallback(callback: () -> Unit) { swipeToDismissCallback = callback @@ -255,22 +253,6 @@ internal class InAppConstraintLayout : ConstraintLayout, BackButtonLayout { ) : super( context, attrs, defStyleAttr, defStyleRes ) - - override fun setDismissListener(listener: OnClickListener?) { - backButtonHandler = BackButtonHandler(this, listener) - } - - override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean = - if (keyCode == KeyEvent.KEYCODE_BACK && backButtonHandler != null) { - true - } else { - super.onKeyDown(keyCode, event) - } - - override fun dispatchKeyEvent(event: KeyEvent?): Boolean { - val handled = backButtonHandler?.dispatchKeyEvent(event) - return handled ?: super.dispatchKeyEvent(event) - } } internal data class InAppInsets( diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/view/ModalWindowInAppViewHolder.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/view/ModalWindowInAppViewHolder.kt index 53bc685a..89ff7583 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/view/ModalWindowInAppViewHolder.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/view/ModalWindowInAppViewHolder.kt @@ -4,6 +4,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.FrameLayout +import androidx.activity.OnBackPressedCallback import androidx.core.view.isVisible import cloud.mindbox.mobile_sdk.R import cloud.mindbox.mobile_sdk.inapp.domain.models.Element @@ -21,16 +22,30 @@ internal class ModalWindowInAppViewHolder( ) : AbstractInAppViewHolder() { private var currentBackground: ViewGroup? = null + private var backPressedCallback: OnBackPressedCallback? = null override val isActive: Boolean get() = isInAppMessageActive - override fun bind() { - inAppLayout.setDismissListener { - inAppCallback.onInAppDismissed(wrapper.inAppType.inAppId) - mindboxLogI("In-app dismissed by dialog click") - hide() + private fun registerBackPressedCallback(): OnBackPressedCallback { + clearBackPressedCallback() + val callback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + inAppCallback.onInAppDismissed(wrapper.inAppType.inAppId) + mindboxLogI("In-app dismissed by back press") + hide() + } } + backPressedCallback = callback + return callback + } + + private fun clearBackPressedCallback() { + backPressedCallback?.remove() + backPressedCallback = null + } + + override fun bind() { wrapper.inAppType.elements.forEach { element -> when (element) { is Element.CloseButton -> { @@ -88,6 +103,12 @@ internal class ModalWindowInAppViewHolder( } mindboxLogI("Show ${wrapper.inAppType.inAppId} on ${this.hashCode()}") currentDialog.requestFocus() + currentRoot.registerBack(registerBackPressedCallback()) + } + + override fun hide() { + clearBackPressedCallback() + super.hide() } override fun initView(currentRoot: ViewGroup) { diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/view/WebViewInappViewHolder.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/view/WebViewInappViewHolder.kt index f3cb5aae..eb288fad 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/view/WebViewInappViewHolder.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/view/WebViewInappViewHolder.kt @@ -87,13 +87,7 @@ internal class WebViewInAppViewHolder( override val isActive: Boolean get() = isInAppMessageActive - override fun bind() { - inAppLayout.setDismissListener { - inAppCallback.onInAppDismissed(wrapper.inAppType.inAppId) - mindboxLogI("In-app dismissed by dialog click") - hide() - } - } + override fun bind() {} suspend fun sendActionAndAwaitResponse( controller: WebViewController,