Coverage Summary for Class: SnackbarInAppViewHolder (cloud.mindbox.mobile_sdk.inapp.presentation.view)
| Class |
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| SnackbarInAppViewHolder |
0%
(0/7)
|
0%
(0/16)
|
0%
(0/59)
|
0%
(0/319)
|
| SnackbarInAppViewHolder$bind$$inlined$doOnLayout$1 |
0%
(0/2)
|
|
| SnackbarInAppViewHolder$initView$1 |
0%
(0/1)
|
|
0%
(0/2)
|
0%
(0/7)
|
| SnackbarInAppViewHolder$WhenMappings |
|
| Total |
0%
(0/10)
|
0%
(0/16)
|
0%
(0/61)
|
0%
(0/326)
|
package cloud.mindbox.mobile_sdk.inapp.presentation.view
import android.view.ViewGroup
import androidx.core.view.doOnLayout
import androidx.core.view.isInvisible
import cloud.mindbox.mobile_sdk.SnackbarPosition
import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.InAppImageSizeStorage
import cloud.mindbox.mobile_sdk.inapp.domain.models.*
import cloud.mindbox.mobile_sdk.inapp.presentation.InAppCallback
import cloud.mindbox.mobile_sdk.inapp.presentation.MindboxView
import cloud.mindbox.mobile_sdk.logger.mindboxLogI
import cloud.mindbox.mobile_sdk.px
internal class SnackbarInAppViewHolder(
wrapper: InAppTypeWrapper<InAppType.Snackbar>,
controller: InAppViewHolder.InAppController,
inAppCallback: InAppCallback,
private val inAppImageSizeStorage: InAppImageSizeStorage,
private val isFirstShow: Boolean = true,
) : AbstractInAppViewHolder<InAppType.Snackbar>(wrapper, controller, inAppCallback) {
private var requiredSizes: HashMap<String, Size> = HashMap()
override fun show(currentRoot: MindboxView) {
super.show(currentRoot)
mindboxLogI("Try to show in-app with id ${wrapper.inAppType.inAppId}")
wrapper.inAppType.layers.forEach { layer ->
when (layer) {
is Layer.ImageLayer -> {
addUrlSource(layer, inAppCallback)
}
else -> {}
}
}
mindboxLogI("Show ${wrapper.inAppType.inAppId} on ${this.hashCode()}")
currentDialog.requestFocus()
}
override fun initView(currentRoot: ViewGroup) {
super.initView(currentRoot)
inAppLayout.setSwipeToDismissCallback {
mindboxLogI("In-app dismissed by swipe")
closeWithAnimation()
}
}
override fun addUrlSource(
layer: Layer.ImageLayer,
inAppCallback: InAppCallback
) {
super.addUrlSource(layer, inAppCallback)
when (layer.source) {
is Layer.ImageLayer.Source.UrlSource -> {
InAppImageView(currentDialog.context).also { inAppImageView ->
inAppImageView.isInvisible = true
inAppLayout.addView(inAppImageView)
when (wrapper.inAppType.position.margin.kind) {
InAppType.Snackbar.Position.Margin.MarginKind.DP -> {
if (!requiredSizes.containsKey(wrapper.inAppType.inAppId)) {
requiredSizes[wrapper.inAppType.inAppId] = inAppImageSizeStorage.getSizeByIdAndUrl(
wrapper.inAppType.inAppId,
layer.source.url
)
}
inAppImageView.prepareViewForSnackBar(
requiredSizes[wrapper.inAppType.inAppId]!!,
wrapper.inAppType.position.margin.left.px,
wrapper.inAppType.position.margin.right.px
)
preparedImages[inAppImageView] = false
}
}
getImageFromCache(layer.source.url, inAppImageView)
}
}
}
}
override fun bind() {
wrapper.inAppType.elements.forEach { element ->
when (element) {
is Element.CloseButton -> {
val inAppCrossView = InAppCrossView(currentDialog.context, element).apply {
setOnClickListener {
mindboxLogI("In-app dismissed by close click")
closeWithAnimation()
}
}
inAppLayout.addView(inAppCrossView)
inAppCrossView.prepareViewForSnackbar(inAppLayout)
}
}
}
if (isFirstShow) {
currentDialog.doOnLayout {
when (wrapper.inAppType.position.gravity.vertical) {
SnackbarPosition.TOP -> inAppLayout.slideDown()
SnackbarPosition.BOTTOM -> inAppLayout.slideUp()
}
}
}
}
private fun closeWithAnimation() {
inAppCallback.onInAppDismissed(wrapper.inAppType.inAppId)
when (wrapper.inAppType.position.gravity.vertical) {
SnackbarPosition.TOP -> inAppLayout.slideDown(
isReverse = true,
onAnimationEnd = inAppController::close
)
SnackbarPosition.BOTTOM -> inAppLayout.slideUp(
isReverse = true,
onAnimationEnd = inAppController::close
)
}
}
}