From 479f50ca10436640fc78b972ce291e68fba462c6 Mon Sep 17 00:00:00 2001 From: tafilovic Date: Mon, 13 Jul 2026 11:06:54 +0200 Subject: [PATCH 1/2] Fixed by AI agent possible errors for web inapp template not shown --- gradle/libs.versions.toml | 14 ++++---- .../ui/inapp/nativ/NativeFactoryTest.kt | 13 +++++++- .../internal/ui/inapp/web/WebFactoryTest.kt | 13 +++++++- .../internal/model/response/inapp/Location.kt | 12 +++++-- .../appoxee/internal/ui/inapp/InappSizing.kt | 7 ++++ .../internal/ui/inapp/nativ/NativeFactory.kt | 6 ++-- .../nativ/StandardImageNativeTemplate.kt | 9 +++-- .../ui/inapp/nativ/StandardNativeTemplate.kt | 9 +++-- .../ui/inapp/web/BannerWebTemplate.kt | 9 +++-- .../ui/inapp/web/StandardWebTemplate.kt | 11 ++++--- .../internal/ui/inapp/web/WebFactory.kt | 7 ++-- .../internal/util/LibraryExtensions.kt | 4 ++- .../model/response/inapp/LocationTest.kt | 33 +++++++++++++++++++ 13 files changed, 115 insertions(+), 32 deletions(-) create mode 100644 mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/InappSizing.kt create mode 100644 mapp-engage-sdk/src/test/java/com/appoxee/internal/model/response/inapp/LocationTest.kt diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 160ec63..822c497 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,25 +1,25 @@ [versions] glide = "5.0.7" -kotlin = "2.3.20" +kotlin = "2.3.21" core-ktx = "1.19.0" appcompat = "1.7.1" material = "1.14.0" -lifecycle-runtime-ktx = "2.10.0" +lifecycle-runtime-ktx = "2.11.0" coroutines-ktx = "1.11.0" activity-ktx = "1.13.0" fragment-ktx = "1.8.9" -lifecycle-viewmodel-ktx = "2.10.0" +lifecycle-viewmodel-ktx = "2.11.0" browser = "1.10.0" recycler = "1.4.0" constraint-layout = "2.2.1" -firebase-bom = "34.14.1" +firebase-bom = "34.15.0" datastore-preferences = "1.2.1" coil = "2.7.0" media3 = "1.10.1" work-manager = "2.11.2" -play-services-location = "21.3.0" +play-services-location = "21.4.0" junit = "4.13.2" -junit-jupiter = "6.1.0" +junit-jupiter = "6.1.1" mockk = "1.14.11" truth = "1.4.5" json = "20260522" @@ -29,7 +29,7 @@ androidx-test-junit = "1.3.0" androidx-test-espresso = "3.7.0" androidx-test-core = "1.7.0" androidx-test-mockk = "1.14.11" -lifecycle-process = "2.10.0" +lifecycle-process = "2.11.0" mapp-engage="7.1.0" [libraries] diff --git a/mapp-engage-sdk/src/androidTest/java/com/appoxee/internal/ui/inapp/nativ/NativeFactoryTest.kt b/mapp-engage-sdk/src/androidTest/java/com/appoxee/internal/ui/inapp/nativ/NativeFactoryTest.kt index 035a620..918cddc 100644 --- a/mapp-engage-sdk/src/androidTest/java/com/appoxee/internal/ui/inapp/nativ/NativeFactoryTest.kt +++ b/mapp-engage-sdk/src/androidTest/java/com/appoxee/internal/ui/inapp/nativ/NativeFactoryTest.kt @@ -80,6 +80,17 @@ class NativeFactoryTest { } } + @Test + fun getDelay_returns_delay_in_milliseconds() { + val message = mockk(relaxed = true) { + every { behaviour } returns Behaviour(3, 0) + } + + val result = factory.getDelay(message) + + Truth.assertThat(result).isEqualTo(3000) + } + @Test fun fullscreen_content_type_creates_fullscreen_template() { // Arrange @@ -201,4 +212,4 @@ class NativeFactoryTest { // Assert Truth.assertThat(result).isInstanceOf(BannerNativeTemplate::class.java) } -} \ No newline at end of file +} diff --git a/mapp-engage-sdk/src/androidTest/java/com/appoxee/internal/ui/inapp/web/WebFactoryTest.kt b/mapp-engage-sdk/src/androidTest/java/com/appoxee/internal/ui/inapp/web/WebFactoryTest.kt index a83f50d..0cc7824 100644 --- a/mapp-engage-sdk/src/androidTest/java/com/appoxee/internal/ui/inapp/web/WebFactoryTest.kt +++ b/mapp-engage-sdk/src/androidTest/java/com/appoxee/internal/ui/inapp/web/WebFactoryTest.kt @@ -81,6 +81,17 @@ class WebFactoryTest { } } + @Test + fun getDelay_returns_delay_in_milliseconds() { + val message = mockk(relaxed = true) { + every { behaviour } returns Behaviour(3, 0) + } + + val result = factory.getDelay(message) + + Truth.assertThat(result).isEqualTo(3000) + } + @Test fun fullscreen_message_type_creates_fullscreen_template() { // Arrange @@ -154,4 +165,4 @@ class WebFactoryTest { // Assert Truth.assertThat(result).isInstanceOf(BannerWebTemplate::class.java) } -} \ No newline at end of file +} diff --git a/mapp-engage-sdk/src/main/java/com/appoxee/internal/model/response/inapp/Location.kt b/mapp-engage-sdk/src/main/java/com/appoxee/internal/model/response/inapp/Location.kt index 56d5914..a09dc3e 100644 --- a/mapp-engage-sdk/src/main/java/com/appoxee/internal/model/response/inapp/Location.kt +++ b/mapp-engage-sdk/src/main/java/com/appoxee/internal/model/response/inapp/Location.kt @@ -9,12 +9,20 @@ data class Location( val width: Int ) { companion object { + private const val DEFAULT_SIZE_PERCENT = 100 + fun fromJSON(json: JSONObject): Location { return Location( bannerPosition = BannerPosition.fromValue(json.getLongOrDefault("position", 0).toInt()), - height = json.getLongOrDefault("height", 0).toInt(), - width = json.getLongOrDefault("width", 0).toInt() + height = json.getSizePercent("height"), + width = json.getSizePercent("width") ) } + + private fun JSONObject.getSizePercent(name: String): Int { + return getLongOrDefault(name, DEFAULT_SIZE_PERCENT.toLong()) + .toInt() + .takeIf { it > 0 } ?: DEFAULT_SIZE_PERCENT + } } } diff --git a/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/InappSizing.kt b/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/InappSizing.kt new file mode 100644 index 0000000..ddb6e84 --- /dev/null +++ b/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/InappSizing.kt @@ -0,0 +1,7 @@ +package com.appoxee.internal.ui.inapp + +internal const val DEFAULT_INAPP_SIZE_PERCENT = 100 + +internal fun Int?.inappSizePercentOrDefault(): Int { + return this?.takeIf { it > 0 } ?: DEFAULT_INAPP_SIZE_PERCENT +} diff --git a/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/nativ/NativeFactory.kt b/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/nativ/NativeFactory.kt index a569e59..8999958 100644 --- a/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/nativ/NativeFactory.kt +++ b/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/nativ/NativeFactory.kt @@ -35,10 +35,10 @@ internal class NativeFactory( onMessageClosed: ((T, TrackingKey, TrackingParams) -> Unit)? = null ) { val inappActionHandler = actionContainer.inappActionHandler - val delaySeconds = getDelay(message) + val delayMillis = getDelay(message) var template: Template job = scope.launch { - delay(TimeUnit.SECONDS.toMillis(delaySeconds)) + delay(delayMillis) withContext(dispatchersProvider.mainDispatcher) { if (context.isDestroyed) return@withContext template = createTemplate( @@ -98,4 +98,4 @@ internal class NativeFactory( val seconds = (message.behaviour?.delaySeconds ?: 0).toLong() return TimeUnit.SECONDS.toMillis(seconds) } -} \ No newline at end of file +} diff --git a/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/nativ/StandardImageNativeTemplate.kt b/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/nativ/StandardImageNativeTemplate.kt index b739abf..36b4730 100644 --- a/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/nativ/StandardImageNativeTemplate.kt +++ b/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/nativ/StandardImageNativeTemplate.kt @@ -26,6 +26,7 @@ import com.appoxee.internal.model.response.inapp.NativeInappMessage import com.appoxee.internal.model.response.inapp.TrackingParams import com.appoxee.internal.ui.inapp.InappActionHandler import com.appoxee.internal.ui.inapp.Template +import com.appoxee.internal.ui.inapp.inappSizePercentOrDefault import com.appoxee.internal.util.DispatchersProvider import com.appoxee.internal.util.LibraryExtensions.getDisplayMetrics import com.appoxee.internal.util.LibraryExtensions.toColor @@ -56,10 +57,12 @@ internal class StandardImageNativeTemplate( val view = inflater.inflate(layoutRes, null) width = - (activity.getDisplayMetrics().widthPixels * ((message.location?.width ?: 100) / 100f)) + (activity.getDisplayMetrics().widthPixels * + (message.location?.width.inappSizePercentOrDefault() / 100f)) .toInt() height = - (activity.getDisplayMetrics().heightPixels * ((message.location?.height ?: 100) / 100f)) + (activity.getDisplayMetrics().heightPixels * + (message.location?.height.inappSizePercentOrDefault() / 100f)) .toInt() alertDialog = AlertDialog.Builder(activity).create().apply { onViewCreated(message, view) { onDismiss() } @@ -145,4 +148,4 @@ internal class StandardImageNativeTemplate( ColorStateList.valueOf((message as NativeInappMessage).templateBackgroundColor.toColor()) } } -} \ No newline at end of file +} diff --git a/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/nativ/StandardNativeTemplate.kt b/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/nativ/StandardNativeTemplate.kt index df00b43..439537d 100644 --- a/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/nativ/StandardNativeTemplate.kt +++ b/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/nativ/StandardNativeTemplate.kt @@ -26,6 +26,7 @@ import com.appoxee.internal.model.response.inapp.NativeInappMessage import com.appoxee.internal.model.response.inapp.TrackingParams import com.appoxee.internal.ui.inapp.InappActionHandler import com.appoxee.internal.ui.inapp.Template +import com.appoxee.internal.ui.inapp.inappSizePercentOrDefault import com.appoxee.internal.util.DispatchersProvider import com.appoxee.internal.util.LibraryExtensions.getDisplayMetrics import com.appoxee.internal.util.LibraryExtensions.toColor @@ -56,10 +57,12 @@ internal class StandardNativeTemplate( val view = inflater.inflate(layoutRes, null) width = - (activity.getDisplayMetrics().widthPixels * ((message.location?.width ?: 100) / 100f)) + (activity.getDisplayMetrics().widthPixels * + (message.location?.width.inappSizePercentOrDefault() / 100f)) .toInt() height = - (activity.getDisplayMetrics().heightPixels * ((message.location?.height ?: 100) / 100f)) + (activity.getDisplayMetrics().heightPixels * + (message.location?.height.inappSizePercentOrDefault() / 100f)) .toInt() alertDialog = AlertDialog.Builder(activity).create().apply { onViewCreated(message, view) { onDismiss() } @@ -145,4 +148,4 @@ internal class StandardNativeTemplate( ColorStateList.valueOf((message as NativeInappMessage).templateBackgroundColor.toColor()) } } -} \ No newline at end of file +} diff --git a/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/web/BannerWebTemplate.kt b/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/web/BannerWebTemplate.kt index e675063..eb673f4 100644 --- a/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/web/BannerWebTemplate.kt +++ b/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/web/BannerWebTemplate.kt @@ -21,6 +21,7 @@ import com.appoxee.internal.model.response.inapp.WebInappMessage import com.appoxee.internal.ui.custom.MappWebView import com.appoxee.internal.ui.inapp.InappActionHandler import com.appoxee.internal.ui.inapp.Template +import com.appoxee.internal.ui.inapp.inappSizePercentOrDefault import com.appoxee.internal.util.DispatchersProvider import com.appoxee.internal.util.LibraryExtensions.getDisplayMetrics import com.appoxee.internal.util.Logger @@ -49,10 +50,12 @@ internal class BannerWebTemplate( val inflater = activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater val position = BannerPosition.fromValue(message.location?.bannerPosition?.position ?: 0) val width = - (activity.getDisplayMetrics().widthPixels * ((message.location?.width ?: 100) / 100f)) + (activity.getDisplayMetrics().widthPixels * + (message.location?.width.inappSizePercentOrDefault() / 100f)) .toInt() val height = - (activity.getDisplayMetrics().heightPixels * ((message.location?.height ?: 100) / 100f)) + (activity.getDisplayMetrics().heightPixels * + (message.location?.height.inappSizePercentOrDefault() / 100f)) .toInt() view = inflater.inflate(layoutRes, null) windowManager = activity.getSystemService(Context.WINDOW_SERVICE) as WindowManager @@ -120,4 +123,4 @@ internal class BannerWebTemplate( job?.cancel() onMessageClosed?.invoke(message, trackingKeyResult, trackingParams) } -} \ No newline at end of file +} diff --git a/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/web/StandardWebTemplate.kt b/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/web/StandardWebTemplate.kt index 48a96f3..e3e2b1f 100644 --- a/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/web/StandardWebTemplate.kt +++ b/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/web/StandardWebTemplate.kt @@ -19,6 +19,7 @@ import com.appoxee.internal.model.response.inapp.WebInappMessage import com.appoxee.internal.ui.custom.MappWebView import com.appoxee.internal.ui.inapp.InappActionHandler import com.appoxee.internal.ui.inapp.Template +import com.appoxee.internal.ui.inapp.inappSizePercentOrDefault import com.appoxee.internal.util.DispatchersProvider import com.appoxee.internal.util.LibraryExtensions.getDisplayMetrics import com.appoxee.internal.util.LibraryExtensions.toPx @@ -47,10 +48,10 @@ internal class StandardWebTemplate( val inflater = activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater val view = inflater.inflate(layoutRes, null) - width = (activity.getDisplayMetrics().widthPixels * ((message.location?.width - ?: 100) / 100f)).toInt() - height = (activity.getDisplayMetrics().heightPixels * ((message.location?.height - ?: 100) / 100f)).toInt() + width = (activity.getDisplayMetrics().widthPixels * + (message.location?.width.inappSizePercentOrDefault() / 100f)).toInt() + height = (activity.getDisplayMetrics().heightPixels * + (message.location?.height.inappSizePercentOrDefault() / 100f)).toInt() alertDialog = AlertDialog.Builder(activity).create().apply { onViewCreated(message, view) { onDismiss() } setupViews(activity, view, (message as WebInappMessage)) @@ -107,4 +108,4 @@ internal class StandardWebTemplate( }) } } -} \ No newline at end of file +} diff --git a/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/web/WebFactory.kt b/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/web/WebFactory.kt index 23263e9..17e8ad5 100644 --- a/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/web/WebFactory.kt +++ b/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/web/WebFactory.kt @@ -34,12 +34,13 @@ internal class WebFactory( onMessageClosed: ((T, TrackingKey, TrackingParams) -> Unit)? = null ) { val inappActionHandler = actionContainer.inappActionHandler - val delaySeconds = getDelay(message) + val delayMillis = getDelay(message) var template: Template job = scope.launch { Logger.d(TAG, "createBanner: ${message.type.name}") - delay(TimeUnit.SECONDS.toMillis(delaySeconds)) + delay(delayMillis) withContext(dispatchersProvider.mainDispatcher) { + if (context.isDestroyed) return@withContext template = createTemplate(context, inappActionHandler, message, onMessageClosed) template.show() onShow?.invoke(message) @@ -95,4 +96,4 @@ internal class WebFactory( val seconds = (message.behaviour?.delaySeconds ?: 0).toLong() return TimeUnit.SECONDS.toMillis(seconds) } -} \ No newline at end of file +} diff --git a/mapp-engage-sdk/src/main/java/com/appoxee/internal/util/LibraryExtensions.kt b/mapp-engage-sdk/src/main/java/com/appoxee/internal/util/LibraryExtensions.kt index 81108c5..a2a4a3e 100644 --- a/mapp-engage-sdk/src/main/java/com/appoxee/internal/util/LibraryExtensions.kt +++ b/mapp-engage-sdk/src/main/java/com/appoxee/internal/util/LibraryExtensions.kt @@ -41,7 +41,9 @@ object LibraryExtensions { internal fun Activity.getDisplayMetrics(): DisplayMetrics { val displayMetrics = DisplayMetrics() displayMetrics.widthPixels = this.window.decorView.width + .takeIf { it > 0 } ?: this.resources.displayMetrics.widthPixels displayMetrics.heightPixels = this.window.decorView.height + .takeIf { it > 0 } ?: this.resources.displayMetrics.heightPixels return displayMetrics } @@ -206,4 +208,4 @@ object LibraryExtensions { null } } -} \ No newline at end of file +} diff --git a/mapp-engage-sdk/src/test/java/com/appoxee/internal/model/response/inapp/LocationTest.kt b/mapp-engage-sdk/src/test/java/com/appoxee/internal/model/response/inapp/LocationTest.kt new file mode 100644 index 0000000..41b8450 --- /dev/null +++ b/mapp-engage-sdk/src/test/java/com/appoxee/internal/model/response/inapp/LocationTest.kt @@ -0,0 +1,33 @@ +package com.appoxee.internal.model.response.inapp + +import com.google.common.truth.Truth.assertThat +import org.json.JSONObject +import org.junit.Test + +class LocationTest { + + @Test + fun fromJSON_defaults_missing_size_to_full_screen_percent() { + val location = Location.fromJSON(JSONObject("{}")) + + assertThat(location.height).isEqualTo(100) + assertThat(location.width).isEqualTo(100) + } + + @Test + fun fromJSON_defaults_zero_size_to_full_screen_percent() { + val location = Location.fromJSON( + JSONObject( + """ + { + "height": 0, + "width": 0 + } + """.trimIndent() + ) + ) + + assertThat(location.height).isEqualTo(100) + assertThat(location.width).isEqualTo(100) + } +} From b9c04aba9eb2ae48630b86728dfef4da9787fa7c Mon Sep 17 00:00:00 2001 From: tafilovic Date: Mon, 13 Jul 2026 20:50:32 +0200 Subject: [PATCH 2/2] Fixed displaying of inapp web templates --- gradle/libs.versions.toml | 8 +- mapp-engage-sdk/build.gradle.kts | 6 +- mapp-engage-sdk/gradle.properties | 2 +- .../internal/AppoxeeImplAndroidTest.kt | 5 +- .../com/appoxee/internal/ui/inapp/Template.kt | 4 +- .../appoxee/internal/ui/inapp/TemplateTest.kt | 98 +++++++++++++++++++ sample-java/build.gradle | 6 +- sample-kotlin/build.gradle.kts | 6 +- shared-ui/build.gradle.kts | 4 +- 9 files changed, 119 insertions(+), 20 deletions(-) create mode 100644 mapp-engage-sdk/src/test/java/com/appoxee/internal/ui/inapp/TemplateTest.kt diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 822c497..9dfe4de 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] glide = "5.0.7" kotlin = "2.3.21" -core-ktx = "1.19.0" +core-ktx = "1.18.0" appcompat = "1.7.1" material = "1.14.0" lifecycle-runtime-ktx = "2.11.0" @@ -12,14 +12,14 @@ lifecycle-viewmodel-ktx = "2.11.0" browser = "1.10.0" recycler = "1.4.0" constraint-layout = "2.2.1" -firebase-bom = "34.15.0" +firebase-bom = "34.16.0" datastore-preferences = "1.2.1" coil = "2.7.0" media3 = "1.10.1" work-manager = "2.11.2" play-services-location = "21.4.0" junit = "4.13.2" -junit-jupiter = "6.1.1" +junit-jupiter = "6.1.2" mockk = "1.14.11" truth = "1.4.5" json = "20260522" @@ -30,7 +30,7 @@ androidx-test-espresso = "3.7.0" androidx-test-core = "1.7.0" androidx-test-mockk = "1.14.11" lifecycle-process = "2.11.0" -mapp-engage="7.1.0" +mapp-engage="7.1.1" [libraries] ## BASE diff --git a/mapp-engage-sdk/build.gradle.kts b/mapp-engage-sdk/build.gradle.kts index 4d630ef..7ef6c73 100644 --- a/mapp-engage-sdk/build.gradle.kts +++ b/mapp-engage-sdk/build.gradle.kts @@ -118,11 +118,11 @@ fun isPlainDataClass(lines: List, startIndex: Int): Boolean { extensions.configure { namespace = "com.appoxee.sdk" - compileSdk = 37 - buildToolsVersion = "37.0.0" + compileSdk = 36 + buildToolsVersion = "36.1.0" lint { - targetSdk = 37 + targetSdk = 36 checkReleaseBuilds = false } diff --git a/mapp-engage-sdk/gradle.properties b/mapp-engage-sdk/gradle.properties index c285a24..8e0ed38 100644 --- a/mapp-engage-sdk/gradle.properties +++ b/mapp-engage-sdk/gradle.properties @@ -1,7 +1,7 @@ ################ GROUP=com.mapp.sdk POM_ARTIFACT_ID=engage-android -VERSION_NAME=7.1.0 +VERSION_NAME=7.1.2 POM_NAME=Mapp Engage Android SDK POM_DESCRIPTION=The Mapp Engage Android SDK (v7) diff --git a/mapp-engage-sdk/src/androidTest/java/com/appoxee/internal/AppoxeeImplAndroidTest.kt b/mapp-engage-sdk/src/androidTest/java/com/appoxee/internal/AppoxeeImplAndroidTest.kt index 7732146..bd9b5f1 100644 --- a/mapp-engage-sdk/src/androidTest/java/com/appoxee/internal/AppoxeeImplAndroidTest.kt +++ b/mapp-engage-sdk/src/androidTest/java/com/appoxee/internal/AppoxeeImplAndroidTest.kt @@ -6,7 +6,7 @@ import com.appoxee.internal.container.PushContainer import com.appoxee.internal.model.response.DefaultResponse import com.appoxee.internal.model.response.DevicePayload import com.appoxee.internal.model.response.ResponseData -import com.appoxee.internal.model.response.inbox.InboxMessage +import com.appoxee.internal.model.response.inbox.InboxMessageDto import com.appoxee.internal.model.response.inbox.InboxMessagesResponse import com.appoxee.internal.network.EngageApiImpl import com.appoxee.internal.network.response.Response @@ -16,6 +16,7 @@ import com.appoxee.internal.storage.Storage import com.appoxee.internal.ui.push.base.PushManagerImpl import com.appoxee.shared.AppoxeeObserver import com.appoxee.shared.AppoxeeOptions +import com.appoxee.shared.InboxMessage import com.appoxee.shared.MappResult import com.google.common.truth.Truth import com.google.firebase.messaging.RemoteMessage @@ -121,7 +122,7 @@ class AppoxeeImplAndroidTest { @Test fun fetchInboxMessages() { runBlocking { - val inboxMessage = mockk() + val inboxMessage = mockk() coEvery { engageApiImpl.fetchInboxMessages(any()) } coAnswers { Response.success( 200, InboxMessagesResponse("app_open", listOf(inboxMessage)) diff --git a/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/Template.kt b/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/Template.kt index 2723cf5..e6bba14 100644 --- a/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/Template.kt +++ b/mapp-engage-sdk/src/main/java/com/appoxee/internal/ui/inapp/Template.kt @@ -91,7 +91,7 @@ internal abstract class Template( } } - message.behaviour?.displaySeconds?.toLong()?.let { seconds -> + message.behaviour?.displaySeconds?.takeIf { it > 0 }?.toLong()?.let { seconds -> job = scope.launch { delay(TimeUnit.SECONDS.toMillis(seconds)) withContext(dispatchersProvider.mainDispatcher) { @@ -104,4 +104,4 @@ internal abstract class Template( } abstract fun show() -} \ No newline at end of file +} diff --git a/mapp-engage-sdk/src/test/java/com/appoxee/internal/ui/inapp/TemplateTest.kt b/mapp-engage-sdk/src/test/java/com/appoxee/internal/ui/inapp/TemplateTest.kt new file mode 100644 index 0000000..1add705 --- /dev/null +++ b/mapp-engage-sdk/src/test/java/com/appoxee/internal/ui/inapp/TemplateTest.kt @@ -0,0 +1,98 @@ +package com.appoxee.internal.ui.inapp + +import android.view.View +import android.widget.ImageButton +import com.appoxee.internal.model.response.inapp.Behaviour +import com.appoxee.internal.model.response.inapp.Message +import com.appoxee.internal.util.DispatchersProvider +import com.appoxee.sdk.R +import com.google.common.truth.Truth.assertThat +import io.mockk.every +import io.mockk.mockk +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.advanceTimeBy +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Test + +class TemplateTest { + + @Test + fun `zero display seconds does not dismiss immediately`() = runTest { + val dispatcher = StandardTestDispatcher(testScheduler) + val template = testTemplate(this, dispatcher) + val view = viewWithoutCloseButton() + var dismissed = false + + template.createView(message(displaySeconds = 0), view) { + dismissed = true + } + advanceUntilIdle() + + assertThat(dismissed).isFalse() + } + + @Test + fun `positive display seconds dismisses after expiration`() = runTest { + val dispatcher = StandardTestDispatcher(testScheduler) + val template = testTemplate(this, dispatcher) + val view = viewWithoutCloseButton() + var dismissed = false + + template.createView(message(displaySeconds = 1), view) { + dismissed = true + } + advanceTimeBy(999) + runCurrent() + assertThat(dismissed).isFalse() + + advanceTimeBy(1) + runCurrent() + + assertThat(dismissed).isTrue() + } + + private fun testTemplate( + scope: CoroutineScope, + dispatcher: CoroutineDispatcher + ): TestTemplate { + return TestTemplate( + scope = scope, + dispatchersProvider = object : DispatchersProvider { + override val ioDispatcher: CoroutineDispatcher = dispatcher + override val mainDispatcher: CoroutineDispatcher = dispatcher + override val defaultDispatcher: CoroutineDispatcher = dispatcher + } + ) + } + + private fun message(displaySeconds: Int): Message { + return mockk(relaxed = true) { + every { behaviour } returns Behaviour(delaySeconds = 0, displaySeconds = displaySeconds) + } + } + + private fun viewWithoutCloseButton(): View { + return mockk(relaxed = true) { + every { findViewById(R.id.ibClose) } returns null + } + } + + private class TestTemplate( + scope: CoroutineScope, + dispatchersProvider: DispatchersProvider + ) : Template( + inappActionHandler = mockk(relaxed = true), + scope = scope, + dispatchersProvider = dispatchersProvider + ) { + fun createView(message: Message, view: View, onDismiss: (() -> Unit)?) { + onViewCreated(message, view, onDismiss) + } + + override fun show() = Unit + } +} diff --git a/sample-java/build.gradle b/sample-java/build.gradle index 3294fcf..27a7765 100644 --- a/sample-java/build.gradle +++ b/sample-java/build.gradle @@ -11,13 +11,13 @@ if (localPropertiesFile.exists()) { android { namespace 'com.mapp.engagesample' - compileSdk = 37 - buildToolsVersion = '37.0.0' + compileSdk = 36 + buildToolsVersion = '36.1.0' defaultConfig { applicationId "com.appoxee.example" minSdk = 23 - targetSdk = 37 + targetSdk = 36 versionCode 30 versionName "2.0.1" diff --git a/sample-kotlin/build.gradle.kts b/sample-kotlin/build.gradle.kts index 044008e..a07d1f1 100644 --- a/sample-kotlin/build.gradle.kts +++ b/sample-kotlin/build.gradle.kts @@ -15,12 +15,12 @@ if (localPropertiesFile.exists()) { extensions.configure { namespace = "com.mapp.engagesample" - compileSdk = 37 - buildToolsVersion = "37.0.0" + compileSdk = 36 + buildToolsVersion = "36.1.0" defaultConfig { applicationId = "com.appoxee.example" minSdk = 23 - targetSdk = 37 + targetSdk = 36 versionCode = 30 versionName = "2.0.1" diff --git a/shared-ui/build.gradle.kts b/shared-ui/build.gradle.kts index 01e76d2..87149f7 100644 --- a/shared-ui/build.gradle.kts +++ b/shared-ui/build.gradle.kts @@ -7,8 +7,8 @@ plugins { extensions.configure { namespace = "eu.brrm.shared_ui" - compileSdk = 37 - buildToolsVersion = "37.0.0" + compileSdk = 36 + buildToolsVersion = "36.1.0" defaultConfig { minSdk = 23