From 5b6cfd1c88818bc70723795ee97ccc1e1719a65f Mon Sep 17 00:00:00 2001 From: Andrey Emtsov <109513788+AndreyEmtsov@users.noreply.github.com> Date: Fri, 16 Feb 2024 15:01:05 +0300 Subject: [PATCH 1/8] Update sdk version for example --- example/app/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/example/app/build.gradle b/example/app/build.gradle index 2bfffd795..e9c5b0423 100644 --- a/example/app/build.gradle +++ b/example/app/build.gradle @@ -52,9 +52,9 @@ dependencies { implementation 'com.huawei.hms:push:6.11.0.300' //Mindbox - implementation 'cloud.mindbox:mobile-sdk:2.8.3' - implementation 'cloud.mindbox:mindbox-firebase:2.8.3' - implementation 'cloud.mindbox:mindbox-huawei:2.8.3' + implementation 'cloud.mindbox:mobile-sdk:2.8.4' + implementation 'cloud.mindbox:mindbox-firebase:2.8.4' + implementation 'cloud.mindbox:mindbox-huawei:2.8.4' //Glade for custom loader implementation 'com.github.bumptech.glide:glide:4.15.1' From ae62aceb807f5859f0b4688249766b3627ad0a25 Mon Sep 17 00:00:00 2001 From: Robert Alimbekov Date: Mon, 19 Feb 2024 16:33:41 +0500 Subject: [PATCH 2/8] fix version upgrading script --- .github/workflows/publish.yml | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 350592275..5309ee740 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -30,7 +30,7 @@ jobs: run: ./gradlew --no-daemon check unit: - runs-on: ubuntu-latest + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -48,8 +48,8 @@ jobs: run: ./gradlew --no-daemon testDebugUnitTest build: - needs: [unit, lint] - runs-on: ubuntu-latest + needs: [ unit, lint ] + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -64,7 +64,7 @@ jobs: run: ./gradlew --no-daemon assembleDebug publish: - needs: [build] + needs: [ build ] runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 @@ -91,7 +91,7 @@ jobs: ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true' - name: Publish to Jitpack - # To create release in Jitpack we need to create Github release + # To create release in Jitpack we need to create Github release run: ./git-release.sh "${{secrets.GITHUBACCESSTOKEN}}" "${{secrets.GITHUBUSER}}" - name: Publish to Sonatype @@ -99,7 +99,16 @@ jobs: #To update version in Github README.md - name: Version Upgrade - run: ./maven-version-update.sh + run: | + chmod +x ./maven-version-update.sh + ./maven-version-update.sh + - name: Commit and push if it changed + run: | + git diff + git config --global user.email "actions@github.com" + git config --global user.name "GitHub Actions" + git commit -am "Update README.md" || exit 0 + git push origin HEAD:develop - name: Job status notification uses: rtCamp/action-slack-notify@v2 From 408a07e4edf7d9fa896d6279403f370c3e8567b0 Mon Sep 17 00:00:00 2001 From: Robert Alimbekov Date: Mon, 19 Feb 2024 16:36:47 +0500 Subject: [PATCH 3/8] fix url of maven badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e1f135af9..e68ac7f6f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Maven Central](https://maven-badges.herokuapp.com/maven-central/cloud.mindbox/mobile-sdk/badge.svg)](https://search.maven.org/artifact/cloud.mindbox/mobile-sdk/2.8.3/aar) +[![Maven Central](https://maven-badges.herokuapp.com/maven-central/cloud.mindbox/mobile-sdk/badge.svg)](https://central.sonatype.com/artifact/cloud.mindbox/mobile-sdk) # Mindbox SDK for Android From f069c2a3551c3fc7f59c83ae0b47a5012c307520 Mon Sep 17 00:00:00 2001 From: Sergey Sozinov <103035673+sergeysozinov@users.noreply.github.com> Date: Tue, 27 Feb 2024 12:55:01 +0300 Subject: [PATCH 4/8] MBX-3143: update fcm version (#433) --- dependencies.gradle | 4 ++-- example/app/build.gradle | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index ad0370c88..c67db5d0b 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -4,8 +4,8 @@ ext { kotlin_stdlib: 'org.jetbrains.kotlin:kotlin-stdlib:1.4.20', androidx_core_ktx: 'androidx.core:core-ktx:1.7.0', androidx_annotations: 'androidx.annotation:annotation:1.3.0', - firebase_bom: 'com.google.firebase:firebase-bom:26.1.1', - firebase_messaging: 'com.google.firebase:firebase-messaging:21.0.0', + firebase_bom: 'com.google.firebase:firebase-bom:32.7.2', + firebase_messaging: 'com.google.firebase:firebase-messaging', gms_play_services_basement: 'com.google.android.gms:play-services-basement:18.0.0', gms_play_services_base: 'com.google.android.gms:play-services-base:18.0.1', gms_play_services_ads_identifier: 'com.google.android.gms:play-services-ads-identifier:18.0.1', diff --git a/example/app/build.gradle b/example/app/build.gradle index e9c5b0423..93951c080 100644 --- a/example/app/build.gradle +++ b/example/app/build.gradle @@ -37,7 +37,13 @@ android { buildConfig = true } } - +// If the version of firebase-bom used in the sdk is higher, then it will be applied +// To change the dependency resolution strategy use the code below +/* configurations.configureEach { + resolutionStrategy { + force 'com.google.firebase:firebase-bom:32.7.1' + } +} */ dependencies { implementation 'androidx.core:core-ktx:1.12.0' From 4886192cf704fe06156226a85b9566993931ff1f Mon Sep 17 00:00:00 2001 From: Sergey Sozinov Date: Thu, 29 Feb 2024 09:57:20 +0300 Subject: [PATCH 5/8] MBX-3155: fix null title for Huawei --- .../mindbox_firebase/MindboxFirebaseTest.kt | 17 +++++++++++++++++ .../mindbox/mindbox_huawei/HuaweiMessage.kt | 2 +- .../mindbox/mindbox_huawei/MindboxHuawei.kt | 2 +- .../mindbox/mindbox_huawei/MindboxHuaweiTest.kt | 17 +++++++++++++++++ 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/mindbox-firebase/src/test/kotlin/cloud/mindbox/mindbox_firebase/MindboxFirebaseTest.kt b/mindbox-firebase/src/test/kotlin/cloud/mindbox/mindbox_firebase/MindboxFirebaseTest.kt index 59662af32..48edb1b70 100644 --- a/mindbox-firebase/src/test/kotlin/cloud/mindbox/mindbox_firebase/MindboxFirebaseTest.kt +++ b/mindbox-firebase/src/test/kotlin/cloud/mindbox/mindbox_firebase/MindboxFirebaseTest.kt @@ -11,6 +11,7 @@ class MindboxFirebaseTest { private val remoteMessageWithData = mockk() private val remoteMessageWithoutData = mockk() + private val remoteMessageWithoutTitle = mockk() init { every { remoteMessageWithData.data } returns mapOf( @@ -23,6 +24,14 @@ class MindboxFirebaseTest { "payload" to "any-value7" ) every { remoteMessageWithoutData.data } returns emptyMap() + every { remoteMessageWithoutTitle.data } returns mapOf( + "uniqueKey" to "any-value1", + "message" to "any-value3", + "imageUrl" to "any-value4", + "buttons" to "any-value5", + "clickUrl" to "any-value6", + "payload" to "any-value7" + ) } @Test @@ -51,5 +60,13 @@ class MindboxFirebaseTest { MindboxFirebase.convertToMindboxRemoteMessage(remoteMessageWithoutData) Assert.assertNull(mindboxRemoteMessage) } + + @Test + fun `convertToMindboxRemoteMessage returns non null for remote message without title`() { + val mindboxRemoteMessage = + MindboxFirebase.convertToMindboxRemoteMessage(remoteMessageWithoutTitle) + Assert.assertNotNull(mindboxRemoteMessage) + Assert.assertEquals("", mindboxRemoteMessage?.title) + } } diff --git a/mindbox-huawei/src/main/java/cloud/mindbox/mindbox_huawei/HuaweiMessage.kt b/mindbox-huawei/src/main/java/cloud/mindbox/mindbox_huawei/HuaweiMessage.kt index f6fd0de4d..f630d1915 100644 --- a/mindbox-huawei/src/main/java/cloud/mindbox/mindbox_huawei/HuaweiMessage.kt +++ b/mindbox-huawei/src/main/java/cloud/mindbox/mindbox_huawei/HuaweiMessage.kt @@ -4,7 +4,7 @@ import com.google.gson.annotations.SerializedName internal data class HuaweiMessage( @SerializedName("uniqueKey") val uniqueKey: String, - @SerializedName("title") val title: String, + @SerializedName("title") val title: String?, @SerializedName("message") val message: String, @SerializedName("buttons") val buttons: List, @SerializedName("clickUrl") val clickUrl: String?, diff --git a/mindbox-huawei/src/main/java/cloud/mindbox/mindbox_huawei/MindboxHuawei.kt b/mindbox-huawei/src/main/java/cloud/mindbox/mindbox_huawei/MindboxHuawei.kt index 87cce8572..665ac0565 100644 --- a/mindbox-huawei/src/main/java/cloud/mindbox/mindbox_huawei/MindboxHuawei.kt +++ b/mindbox-huawei/src/main/java/cloud/mindbox/mindbox_huawei/MindboxHuawei.kt @@ -44,7 +44,7 @@ object MindboxHuawei : MindboxPushService { val parsedMessage = gson.fromJson(data, HuaweiMessage::class.java) ?: return null return MindboxRemoteMessage( uniqueKey = parsedMessage.uniqueKey, - title = parsedMessage.title, + title = parsedMessage.title ?: "", description = parsedMessage.message, pushActions = parsedMessage.buttons.map { pushAction -> MindboxPushAction( diff --git a/mindbox-huawei/src/test/kotlin/cloud/mindbox/mindbox_huawei/MindboxHuaweiTest.kt b/mindbox-huawei/src/test/kotlin/cloud/mindbox/mindbox_huawei/MindboxHuaweiTest.kt index fc00fd7df..6fc27d652 100644 --- a/mindbox-huawei/src/test/kotlin/cloud/mindbox/mindbox_huawei/MindboxHuaweiTest.kt +++ b/mindbox-huawei/src/test/kotlin/cloud/mindbox/mindbox_huawei/MindboxHuaweiTest.kt @@ -10,6 +10,7 @@ class MindboxHuaweiTest { private val remoteMessageWithData = mockk() private val remoteMessageWithoutData = mockk() + private val remoteMessageWithoutTitle = mockk() init { every { remoteMessageWithData.data } returns mapOf( @@ -21,6 +22,14 @@ class MindboxHuaweiTest { "payload" to "payload" ).toString() every { remoteMessageWithoutData.data } returns "" + every { remoteMessageWithoutTitle.data } returns mapOf( + "uniqueKey" to "key", + "message" to "message", + "imageUrl" to "image", + "buttons" to "[{\"uniqueKey\": \"button_key\", \"text\": \"button_text\", \"url\": \"button_url\"}]", + "clickUrl" to "clickUrl", + "payload" to "payload" + ).toString() } @@ -49,4 +58,12 @@ class MindboxHuaweiTest { val result = MindboxHuawei.convertToMindboxRemoteMessage(remoteMessageWithoutData) Assert.assertNull(result) } + + @Test + fun `convertToMindboxRemoteMessage returns non null for remote message without title`() { + val mindboxRemoteMessage = + MindboxHuawei.convertToMindboxRemoteMessage(remoteMessageWithoutTitle) + Assert.assertNotNull(mindboxRemoteMessage) + Assert.assertEquals("", mindboxRemoteMessage?.title) + } } \ No newline at end of file From 5b7be9ce15dab28f34d76a06f5ad8764d071f110 Mon Sep 17 00:00:00 2001 From: Robalim <112554128+Robalim@users.noreply.github.com> Date: Thu, 7 Mar 2024 20:10:41 +0500 Subject: [PATCH 6/8] Feature/mbx 3149 (#435) * adding targeting request --- .../cloud/mindbox/mobile_sdk/Extensions.kt | 1 - .../java/cloud/mindbox/mobile_sdk/Mindbox.kt | 28 +-- .../mobile_sdk/di/modules/DataModule.kt | 1 + .../mobile_sdk/di/modules/DomainModule.kt | 13 +- .../mobile_sdk/di/modules/MindboxModule.kt | 31 +-- .../inapp/data/managers/DataManager.kt | 3 + .../data/managers/SessionStorageManager.kt | 5 +- .../CloseButtonModalElementDtoDataFiller.kt | 2 +- ...CloseButtonSnackbarElementDtoDataFiller.kt | 5 +- .../managers/{ => data_filler}/DataFiller.kt | 2 +- .../ModalElementDtoDataFiller.kt | 2 +- .../ModalWindowDtoDataFiller.kt | 2 +- .../SnackBarDtoDataFiller.kt | 2 +- .../SnackbarElementDtoDataFiller.kt | 5 +- .../data/repositories/InAppRepositoryImpl.kt | 33 +++ .../InAppSegmentationRepositoryImpl.kt | 8 +- .../inapp/domain/InAppEventManagerImpl.kt | 12 +- .../inapp/domain/InAppFilteringManagerImpl.kt | 13 +- .../inapp/domain/InAppInteractorImpl.kt | 47 +++- ...rImpl.kt => InAppProcessingManagerImpl.kt} | 26 ++- .../interfaces/interactors/InAppInteractor.kt | 3 + .../managers/InAppFilteringManager.kt | 2 + ...ngManager.kt => InAppProcessingManager.kt} | 4 +- .../repositories/InAppRepository.kt | 11 + .../InAppSegmentationRepository.kt | 2 - .../inapp/presentation/InAppMessageManager.kt | 2 +- .../presentation/InAppMessageManagerImpl.kt | 50 +++-- .../managers/MindboxEventManager.kt | 6 +- ...loseButtonModalElementDtoDataFillerTest.kt | 1 + ...eButtonSnackbarElementDtoDataFillerTest.kt | 1 + .../data/managers/DefaultDataManagerTest.kt | 2 + .../managers/ModalElementDtoDataFillerTest.kt | 2 + .../managers/ModalWindowDtoDataFillerTest.kt | 2 + .../managers/SnackBarDtoDataFillerTest.kt | 2 + .../SnackbarElementDtoDataFillerTest.kt | 2 + .../data/repositories/InAppRepositoryTest.kt | 24 +-- .../InAppSegmentationRepositoryTest.kt | 20 +- .../inapp/domain/InAppFilteringManagerTest.kt | 6 +- ...rTest.kt => InAppProcessingManagerTest.kt} | 203 ++++++++++++------ .../presentation/InAppMessageManagerTest.kt | 33 ++- 40 files changed, 420 insertions(+), 199 deletions(-) rename sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/{ => data_filler}/CloseButtonModalElementDtoDataFiller.kt (97%) rename sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/{ => data_filler}/CloseButtonSnackbarElementDtoDataFiller.kt (94%) rename sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/{ => data_filler}/DataFiller.kt (50%) rename sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/{ => data_filler}/ModalElementDtoDataFiller.kt (90%) rename sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/{ => data_filler}/ModalWindowDtoDataFiller.kt (88%) rename sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/{ => data_filler}/SnackBarDtoDataFiller.kt (98%) rename sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/{ => data_filler}/SnackbarElementDtoDataFiller.kt (83%) rename sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/{InAppChoosingManagerImpl.kt => InAppProcessingManagerImpl.kt} (87%) rename sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/managers/{InAppChoosingManager.kt => InAppProcessingManager.kt} (73%) rename sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/domain/{InAppChoosingManagerTest.kt => InAppProcessingManagerTest.kt} (54%) diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/Extensions.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/Extensions.kt index ca5253fd4..025c6cce2 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/Extensions.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/Extensions.kt @@ -29,7 +29,6 @@ import java.nio.charset.Charset import java.util.Queue import kotlin.math.roundToInt - internal fun Map.toUrlQueryString() = LoggingExceptionHandler.runCatching( defaultValue = "" ) { diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/Mindbox.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/Mindbox.kt index c71cc0385..634800ce7 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/Mindbox.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/Mindbox.kt @@ -516,11 +516,13 @@ object Mindbox : MindboxLog { if (activity != null && lifecycleManager.isCurrentActivityResumed) { inAppMessageManager.registerCurrentActivity(activity) mindboxScope.launch { - inAppMessageManager.listenEventAndInApp() - inAppMessageManager.initInAppMessages() - MindboxEventManager.eventFlow.emit(MindboxEventManager.appStarted()) - inAppMessageManager.requestConfig().join() - firstInitCall = false + mutex.withLock { + firstInitCall = false + inAppMessageManager.listenEventAndInApp() + inAppMessageManager.initLogs() + MindboxEventManager.eventFlow.emit(MindboxEventManager.appStarted()) + inAppMessageManager.requestConfig().join() + } } } } @@ -568,13 +570,15 @@ object Mindbox : MindboxLog { ) if (firstInitCall) { mindboxScope.launch { - InitializeLock.await(InitializeLock.State.SAVE_MINDBOX_CONFIG) - if (!firstInitCall) return@launch - inAppMessageManager.listenEventAndInApp() - inAppMessageManager.initInAppMessages() - MindboxEventManager.eventFlow.emit(MindboxEventManager.appStarted()) - inAppMessageManager.requestConfig().join() - firstInitCall = false + mutex.withLock { + InitializeLock.await(InitializeLock.State.SAVE_MINDBOX_CONFIG) + if (!firstInitCall) return@launch + firstInitCall = false + inAppMessageManager.listenEventAndInApp() + inAppMessageManager.initLogs() + MindboxEventManager.eventFlow.emit(MindboxEventManager.appStarted()) + inAppMessageManager.requestConfig().join() + } } } }, diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/di/modules/DataModule.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/di/modules/DataModule.kt index 06dfc915a..73e3debb4 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/di/modules/DataModule.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/di/modules/DataModule.kt @@ -5,6 +5,7 @@ import cloud.mindbox.mobile_sdk.inapp.data.dto.ElementDto import cloud.mindbox.mobile_sdk.inapp.data.dto.PayloadBlankDto import cloud.mindbox.mobile_sdk.inapp.data.dto.PayloadDto import cloud.mindbox.mobile_sdk.inapp.data.managers.* +import cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler.* import cloud.mindbox.mobile_sdk.inapp.data.mapper.InAppMapper import cloud.mindbox.mobile_sdk.inapp.data.repositories.* import cloud.mindbox.mobile_sdk.inapp.data.validators.* diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/di/modules/DomainModule.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/di/modules/DomainModule.kt index 55ab4dfc2..d89185276 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/di/modules/DomainModule.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/di/modules/DomainModule.kt @@ -5,13 +5,13 @@ import cloud.mindbox.mobile_sdk.abtests.CustomerAbMixer import cloud.mindbox.mobile_sdk.abtests.CustomerAbMixerImpl import cloud.mindbox.mobile_sdk.abtests.InAppABTestLogic import cloud.mindbox.mobile_sdk.inapp.domain.CallbackInteractorImpl -import cloud.mindbox.mobile_sdk.inapp.domain.InAppChoosingManagerImpl +import cloud.mindbox.mobile_sdk.inapp.domain.InAppProcessingManagerImpl import cloud.mindbox.mobile_sdk.inapp.domain.InAppEventManagerImpl import cloud.mindbox.mobile_sdk.inapp.domain.InAppFilteringManagerImpl import cloud.mindbox.mobile_sdk.inapp.domain.InAppInteractorImpl import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.interactors.CallbackInteractor import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.interactors.InAppInteractor -import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppChoosingManager +import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppProcessingManager import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppEventManager import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppFilteringManager @@ -30,19 +30,20 @@ internal fun DomainModule( inAppSegmentationRepository = inAppSegmentationRepository, inAppFilteringManager = inAppFilteringManager, inAppEventManager = inAppEventManager, - inAppChoosingManager = inAppChoosingManager, - inAppABTestLogic = inAppABTestLogic, + inAppProcessingManager = inAppProcessingManager, + inAppABTestLogic = inAppABTestLogic ) } override val callbackInteractor: CallbackInteractor by lazy { CallbackInteractorImpl(callbackRepository) } - override val inAppChoosingManager: InAppChoosingManager by lazy { - InAppChoosingManagerImpl( + override val inAppProcessingManager: InAppProcessingManager by lazy { + InAppProcessingManagerImpl( inAppGeoRepository = inAppGeoRepository, inAppSegmentationRepository = inAppSegmentationRepository, inAppContentFetcher = inAppContentFetcher, + inAppRepository = inAppRepository ) } diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/di/modules/MindboxModule.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/di/modules/MindboxModule.kt index 20cb4aaa5..722b66ca8 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/di/modules/MindboxModule.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/di/modules/MindboxModule.kt @@ -3,35 +3,18 @@ package cloud.mindbox.mobile_sdk.di.modules import android.app.Application import cloud.mindbox.mobile_sdk.abtests.CustomerAbMixer import cloud.mindbox.mobile_sdk.abtests.InAppABTestLogic -import cloud.mindbox.mobile_sdk.inapp.data.managers.* import cloud.mindbox.mobile_sdk.inapp.data.managers.DataManager -import cloud.mindbox.mobile_sdk.inapp.data.managers.ModalWindowDtoDataFiller import cloud.mindbox.mobile_sdk.inapp.data.managers.SessionStorageManager +import cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler.* import cloud.mindbox.mobile_sdk.inapp.data.mapper.InAppMapper import cloud.mindbox.mobile_sdk.inapp.data.validators.* -import cloud.mindbox.mobile_sdk.inapp.data.validators.ABTestValidator -import cloud.mindbox.mobile_sdk.inapp.data.validators.JsonValidator -import cloud.mindbox.mobile_sdk.inapp.data.validators.OperationNameValidator -import cloud.mindbox.mobile_sdk.inapp.data.validators.OperationValidator -import cloud.mindbox.mobile_sdk.inapp.data.validators.SdkVersionValidator -import cloud.mindbox.mobile_sdk.inapp.data.validators.UrlValidator -import cloud.mindbox.mobile_sdk.inapp.data.validators.XmlValidator import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.InAppContentFetcher import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.InAppImageLoader import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.InAppImageSizeStorage import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.interactors.CallbackInteractor import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.interactors.InAppInteractor -import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.GeoSerializationManager -import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppChoosingManager -import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppEventManager -import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppFilteringManager -import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppSerializationManager -import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.MobileConfigSerializationManager -import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.CallbackRepository -import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.InAppGeoRepository -import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.InAppRepository -import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.InAppSegmentationRepository -import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.MobileConfigRepository +import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.* +import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.* import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.validators.InAppValidator import cloud.mindbox.mobile_sdk.inapp.presentation.ActivityManager import cloud.mindbox.mobile_sdk.inapp.presentation.ClipboardManager @@ -42,11 +25,7 @@ import cloud.mindbox.mobile_sdk.monitoring.data.mappers.MonitoringMapper import cloud.mindbox.mobile_sdk.monitoring.data.room.MonitoringDatabase import cloud.mindbox.mobile_sdk.monitoring.data.room.dao.MonitoringDao import cloud.mindbox.mobile_sdk.monitoring.data.validators.MonitoringValidator -import cloud.mindbox.mobile_sdk.monitoring.domain.interfaces.LogRequestDataManager -import cloud.mindbox.mobile_sdk.monitoring.domain.interfaces.LogResponseDataManager -import cloud.mindbox.mobile_sdk.monitoring.domain.interfaces.LogStoringDataChecker -import cloud.mindbox.mobile_sdk.monitoring.domain.interfaces.MonitoringInteractor -import cloud.mindbox.mobile_sdk.monitoring.domain.interfaces.MonitoringRepository +import cloud.mindbox.mobile_sdk.monitoring.domain.interfaces.* import cloud.mindbox.mobile_sdk.network.MindboxServiceGenerator import com.android.volley.RequestQueue import com.google.gson.Gson @@ -134,7 +113,7 @@ internal interface MonitoringModule : MindboxModule { internal interface DomainModule : MindboxModule { val inAppInteractor: InAppInteractor val callbackInteractor: CallbackInteractor - val inAppChoosingManager: InAppChoosingManager + val inAppProcessingManager: InAppProcessingManager val inAppEventManager: InAppEventManager val inAppFilteringManager: InAppFilteringManager val customerAbMixer: CustomerAbMixer diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/DataManager.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/DataManager.kt index ebb02f16f..0fff937fb 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/DataManager.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/DataManager.kt @@ -1,6 +1,9 @@ package cloud.mindbox.mobile_sdk.inapp.data.managers import cloud.mindbox.mobile_sdk.inapp.data.dto.PayloadDto +import cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler.DataFiller +import cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler.ModalWindowDtoDataFiller +import cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler.SnackBarDtoDataFiller import cloud.mindbox.mobile_sdk.models.operation.response.FormDto internal class DataManager( diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/SessionStorageManager.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/SessionStorageManager.kt index ddf623957..d4c6ab86a 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/SessionStorageManager.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/SessionStorageManager.kt @@ -5,7 +5,8 @@ import cloud.mindbox.mobile_sdk.inapp.domain.models.* internal class SessionStorageManager { var inAppCustomerSegmentations: SegmentationCheckWrapper? = null - var operationalInApps: HashMap> = HashMap() + var unShownOperationalInApps: HashMap> = HashMap() + var operationalInApps: HashMap> = hashMapOf() var isInAppMessageShown: Boolean = false var customerSegmentationFetchStatus: CustomerSegmentationFetchStatus = CustomerSegmentationFetchStatus.SEGMENTATION_NOT_FETCHED @@ -14,5 +15,7 @@ internal class SessionStorageManager { ProductSegmentationFetchStatus.SEGMENTATION_NOT_FETCHED var inAppProductSegmentations: HashMap> = HashMap() + var currentSessionInApps: List = mutableListOf() + var shownInAppIdsWithEvents = mutableMapOf>() } \ No newline at end of file diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/CloseButtonModalElementDtoDataFiller.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/data_filler/CloseButtonModalElementDtoDataFiller.kt similarity index 97% rename from sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/CloseButtonModalElementDtoDataFiller.kt rename to sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/data_filler/CloseButtonModalElementDtoDataFiller.kt index 4bdd5be12..6bef1cf08 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/CloseButtonModalElementDtoDataFiller.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/data_filler/CloseButtonModalElementDtoDataFiller.kt @@ -1,4 +1,4 @@ -package cloud.mindbox.mobile_sdk.inapp.data.managers +package cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler import android.graphics.Color import cloud.mindbox.mobile_sdk.inapp.data.dto.ElementDto diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/CloseButtonSnackbarElementDtoDataFiller.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/data_filler/CloseButtonSnackbarElementDtoDataFiller.kt similarity index 94% rename from sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/CloseButtonSnackbarElementDtoDataFiller.kt rename to sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/data_filler/CloseButtonSnackbarElementDtoDataFiller.kt index 035358e56..2eb8497f3 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/CloseButtonSnackbarElementDtoDataFiller.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/data_filler/CloseButtonSnackbarElementDtoDataFiller.kt @@ -1,10 +1,11 @@ -package cloud.mindbox.mobile_sdk.inapp.data.managers +package cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler import android.graphics.Color import cloud.mindbox.mobile_sdk.inapp.data.dto.ElementDto import cloud.mindbox.mobile_sdk.logger.mindboxLogI -internal class CloseButtonSnackbarElementDtoDataFiller: DataFiller { +internal class CloseButtonSnackbarElementDtoDataFiller: + DataFiller { internal companion object { const val CLOSE_BUTTON_ELEMENT_JSON_NAME = "closeButton" private const val defaultColor = "#FFFFFF" diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/DataFiller.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/data_filler/DataFiller.kt similarity index 50% rename from sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/DataFiller.kt rename to sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/data_filler/DataFiller.kt index baa1578f5..2d7b12c4b 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/DataFiller.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/data_filler/DataFiller.kt @@ -1,4 +1,4 @@ -package cloud.mindbox.mobile_sdk.inapp.data.managers +package cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler internal interface DataFiller { diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/ModalElementDtoDataFiller.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/data_filler/ModalElementDtoDataFiller.kt similarity index 90% rename from sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/ModalElementDtoDataFiller.kt rename to sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/data_filler/ModalElementDtoDataFiller.kt index eb1bade41..fe757189a 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/ModalElementDtoDataFiller.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/data_filler/ModalElementDtoDataFiller.kt @@ -1,4 +1,4 @@ -package cloud.mindbox.mobile_sdk.inapp.data.managers +package cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler import cloud.mindbox.mobile_sdk.inapp.data.dto.ElementDto diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/ModalWindowDtoDataFiller.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/data_filler/ModalWindowDtoDataFiller.kt similarity index 88% rename from sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/ModalWindowDtoDataFiller.kt rename to sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/data_filler/ModalWindowDtoDataFiller.kt index 1e40365aa..ffeceebe1 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/ModalWindowDtoDataFiller.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/data_filler/ModalWindowDtoDataFiller.kt @@ -1,4 +1,4 @@ -package cloud.mindbox.mobile_sdk.inapp.data.managers +package cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler import cloud.mindbox.mobile_sdk.inapp.data.dto.PayloadDto diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/SnackBarDtoDataFiller.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/data_filler/SnackBarDtoDataFiller.kt similarity index 98% rename from sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/SnackBarDtoDataFiller.kt rename to sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/data_filler/SnackBarDtoDataFiller.kt index 4824d1ce6..4a4ef93b4 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/SnackBarDtoDataFiller.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/data_filler/SnackBarDtoDataFiller.kt @@ -1,4 +1,4 @@ -package cloud.mindbox.mobile_sdk.inapp.data.managers +package cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler import cloud.mindbox.mobile_sdk.inapp.data.dto.PayloadDto import cloud.mindbox.mobile_sdk.inapp.data.dto.PayloadDto.SnackbarDto.ContentDto.PositionDto diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/SnackbarElementDtoDataFiller.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/data_filler/SnackbarElementDtoDataFiller.kt similarity index 83% rename from sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/SnackbarElementDtoDataFiller.kt rename to sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/data_filler/SnackbarElementDtoDataFiller.kt index 30149518a..181a9598a 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/SnackbarElementDtoDataFiller.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/managers/data_filler/SnackbarElementDtoDataFiller.kt @@ -1,8 +1,9 @@ -package cloud.mindbox.mobile_sdk.inapp.data.managers +package cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler import cloud.mindbox.mobile_sdk.inapp.data.dto.ElementDto -internal class SnackbarElementDtoDataFiller(private val closeButtonSnackbarElementDtoDataFiller: CloseButtonSnackbarElementDtoDataFiller): DataFiller?> { +internal class SnackbarElementDtoDataFiller(private val closeButtonSnackbarElementDtoDataFiller: CloseButtonSnackbarElementDtoDataFiller): + DataFiller?> { override fun fillData(item: List?): List? { return item?.map { elementDto -> when (elementDto) { diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/repositories/InAppRepositoryImpl.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/repositories/InAppRepositoryImpl.kt index 1070a3735..6b31240e5 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/repositories/InAppRepositoryImpl.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/repositories/InAppRepositoryImpl.kt @@ -16,6 +16,39 @@ internal class InAppRepositoryImpl( private val inAppSerializationManager: InAppSerializationManager, ) : InAppRepository { + override fun saveCurrentSessionInApps(inApps: List) { + sessionStorageManager.currentSessionInApps = inApps + } + + override fun getCurrentSessionInApps(): List { + return sessionStorageManager.currentSessionInApps + } + + override fun getTargetedInApps(): Map> { + return sessionStorageManager.shownInAppIdsWithEvents + } + + override fun saveTargetedInAppWithEvent(inAppId: String, eventHashcode: Int) { + sessionStorageManager.shownInAppIdsWithEvents[inAppId] = + sessionStorageManager.shownInAppIdsWithEvents.getOrElse(inAppId) { + mutableSetOf() + }.apply { + add(eventHashcode) + } + } + + override fun saveUnShownOperationalInApp(operation: String, inApp: InApp) { + sessionStorageManager.unShownOperationalInApps[operation] = + sessionStorageManager.unShownOperationalInApps.getOrElse(operation) { + mutableListOf() + }.apply { + add(inApp) + } + } + + override fun getUnShownOperationalInAppsByOperation(operation: String): List { + return sessionStorageManager.unShownOperationalInApps[operation.lowercase()] ?: emptyList() + } override fun saveOperationalInApp(operation: String, inApp: InApp) { sessionStorageManager.operationalInApps[operation] = diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/repositories/InAppSegmentationRepositoryImpl.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/repositories/InAppSegmentationRepositoryImpl.kt index 9fffc5b72..1800b8ab0 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/repositories/InAppSegmentationRepositoryImpl.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/repositories/InAppSegmentationRepositoryImpl.kt @@ -16,10 +16,8 @@ internal class InAppSegmentationRepositoryImpl( private val gatewayManager: GatewayManager, ) : InAppSegmentationRepository { - override var unShownInApps: List = mutableListOf() - override suspend fun fetchCustomerSegmentations() { - if (unShownInApps.isEmpty()) { + if (sessionStorageManager.currentSessionInApps.isEmpty()) { MindboxLoggerImpl.d( this, "No unshown inapps. Do not request segmentations" @@ -36,7 +34,7 @@ internal class InAppSegmentationRepositoryImpl( val response = gatewayManager.checkCustomerSegmentations( configuration = configuration, segmentationCheckRequest = inAppMapper.mapToCustomerSegmentationCheckRequest( - unShownInApps + sessionStorageManager.currentSessionInApps ) ) sessionStorageManager.inAppCustomerSegmentations = @@ -52,7 +50,7 @@ internal class InAppSegmentationRepositoryImpl( val segmentationCheckRequest = inAppMapper.mapToProductSegmentationCheckRequest( product, - unShownInApps + sessionStorageManager.currentSessionInApps ) val result = gatewayManager.checkProductSegmentation( configuration, diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppEventManagerImpl.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppEventManagerImpl.kt index 95a0468ab..204db8b4f 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppEventManagerImpl.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppEventManagerImpl.kt @@ -1,12 +1,22 @@ package cloud.mindbox.mobile_sdk.inapp.domain import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppEventManager +import cloud.mindbox.mobile_sdk.managers.MindboxEventManager import cloud.mindbox.mobile_sdk.models.EventType import cloud.mindbox.mobile_sdk.models.InAppEventType internal class InAppEventManagerImpl : InAppEventManager { override fun isValidInAppEvent(event: InAppEventType): Boolean { - return event is InAppEventType.AppStartup || (event is InAppEventType.OrdinalEvent && (event.eventType is EventType.SyncOperation || event.eventType is EventType.AsyncOperation)) + val isAppStartUp = event is InAppEventType.AppStartup + val isOrdinalEvent = + event is InAppEventType.OrdinalEvent && (event.eventType is EventType.SyncOperation || event.eventType is EventType.AsyncOperation) + val isNotInAppEvent = (listOf( + MindboxEventManager.IN_APP_OPERATION_VIEW_TYPE, + MindboxEventManager.IN_APP_OPERATION_TARGETING_TYPE, + MindboxEventManager.IN_APP_OPERATION_CLICK_TYPE + ).contains(event.name).not()) + return isAppStartUp || (isOrdinalEvent && + isNotInAppEvent) } } \ No newline at end of file diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppFilteringManagerImpl.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppFilteringManagerImpl.kt index 31b34e465..dd5e0c01c 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppFilteringManagerImpl.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppFilteringManagerImpl.kt @@ -29,13 +29,22 @@ internal class InAppFilteringManagerImpl(private val inAppRepository: InAppRepos return inApps.filterNot { inApp -> inApp.targeting.hasSegmentationNode() } } - override fun filterInAppsByEvent(inApps: List, event: InAppEventType): List = + override fun filterUnShownInAppsByEvent(inApps: List, event: InAppEventType): List = if (event == InAppEventType.AppStartup) { inApps } else { - inAppRepository.getOperationalInAppsByOperation(event.name) + inAppRepository.getUnShownOperationalInAppsByOperation(event.name) } + override fun filterInAppsByEvent( + inApps: List, + event: InAppEventType + ): List { + return if (event is InAppEventType.AppStartup) inApps else inAppRepository.getOperationalInAppsByOperation( + event.name + ) + } + override fun filterABTestsInApps( inApps: List, abtestsInAppsPool: Collection diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppInteractorImpl.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppInteractorImpl.kt index 0f9118ed0..bca88d414 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppInteractorImpl.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppInteractorImpl.kt @@ -3,9 +3,9 @@ package cloud.mindbox.mobile_sdk.inapp.domain import cloud.mindbox.mobile_sdk.InitializeLock import cloud.mindbox.mobile_sdk.abtests.InAppABTestLogic import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.interactors.InAppInteractor -import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppChoosingManager import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppEventManager import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppFilteringManager +import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppProcessingManager import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.InAppRepository import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.InAppSegmentationRepository import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.MobileConfigRepository @@ -15,6 +15,7 @@ import cloud.mindbox.mobile_sdk.inapp.domain.models.ProductSegmentationFetchStat import cloud.mindbox.mobile_sdk.logger.MindboxLog import cloud.mindbox.mobile_sdk.logger.mindboxLogD import cloud.mindbox.mobile_sdk.models.InAppEventType +import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.* internal class InAppInteractorImpl( @@ -23,13 +24,21 @@ internal class InAppInteractorImpl( private val inAppSegmentationRepository: InAppSegmentationRepository, private val inAppFilteringManager: InAppFilteringManager, private val inAppEventManager: InAppEventManager, - private val inAppChoosingManager: InAppChoosingManager, - private val inAppABTestLogic: InAppABTestLogic, + private val inAppProcessingManager: InAppProcessingManager, + private val inAppABTestLogic: InAppABTestLogic ) : InAppInteractor, MindboxLog { + private val inAppTargetingChannel = Channel(Channel.UNLIMITED) + override suspend fun processEventAndConfig(): Flow { val inApps: List = mobileConfigRepository.getInAppsSection() .let { inApps -> + inAppRepository.saveCurrentSessionInApps(inApps) + for (inApp in inApps) { + for (operation in inApp.targeting.getOperationsSet()) { + inAppRepository.saveOperationalInApp(operation.lowercase(), inApp) + } + } val inAppIds = inAppABTestLogic.getInAppsPool(inApps.map { it.id }) inAppFilteringManager.filterABTestsInApps(inApps, inAppIds).also { filteredInApps -> logI("InApps after abtest logic ${filteredInApps.map { it.id }}") @@ -41,29 +50,28 @@ internal class InAppInteractorImpl( ) }.also { unShownInApps -> logI("Filtered config has ${unShownInApps.size} inapps") - inAppSegmentationRepository.unShownInApps = unShownInApps for (inApp in unShownInApps) { for (operation in inApp.targeting.getOperationsSet()) { - inAppRepository.saveOperationalInApp(operation.lowercase(), inApp) + inAppRepository.saveUnShownOperationalInApp(operation.lowercase(), inApp) } } } - return inAppRepository.listenInAppEvents() .filter { event -> inAppEventManager.isValidInAppEvent(event) } .onEach { mindboxLogD("Event triggered: ${it.name}") - }.filter { + }.filter { event -> + if (isInAppShown()) inAppTargetingChannel.send(event) !isInAppShown().also { mindboxLogD("InApp shown: $it") } }.map { event -> - val filteredInApps = inAppFilteringManager.filterInAppsByEvent(inApps, event) + val filteredInApps = inAppFilteringManager.filterUnShownInAppsByEvent(inApps, event) mindboxLogD("Event: ${event.name} combined with $filteredInApps") - - inAppChoosingManager.chooseInAppToShow( + inAppProcessingManager.chooseInAppToShow( filteredInApps, event ).also { inAppType -> inAppType ?: mindboxLogD("No innaps to show found") + if (!isInAppShown()) inAppTargetingChannel.send(event) if (event == InAppEventType.AppStartup) { InitializeLock.complete(InitializeLock.State.APP_STARTED) } @@ -89,6 +97,25 @@ internal class InAppInteractorImpl( inAppRepository.sendInAppClicked(inAppId) } + override suspend fun listenToTargetingEvents() { + val inApps = mobileConfigRepository.getInAppsSection() + val inAppsMap = inAppRepository.getTargetedInApps() + logI("Whole InApp list = $inApps") + logI("InApps that has already sent targeting ${inAppsMap.entries}") + inAppTargetingChannel.consumeAsFlow().collect { event -> + val filteredInApps = + inAppFilteringManager.filterInAppsByEvent(inApps, event) + logI("inapps for event $event are = $filteredInApps") + for (inApp in filteredInApps) { + if (inAppsMap[inApp.id]?.contains(event.hashCode()) != true) { + inAppProcessingManager.sendTargetedInApp(inApp, event) + } + } + } + + + } + override fun isInAppShown(): Boolean { return inAppRepository.isInAppShown() } diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppChoosingManagerImpl.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppProcessingManagerImpl.kt similarity index 87% rename from sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppChoosingManagerImpl.kt rename to sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppProcessingManagerImpl.kt index e049269cd..990f3ef7d 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppChoosingManagerImpl.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppProcessingManagerImpl.kt @@ -1,9 +1,11 @@ package cloud.mindbox.mobile_sdk.inapp.domain +import cloud.mindbox.mobile_sdk.Mindbox.logI import cloud.mindbox.mobile_sdk.getErrorResponseBodyData import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.InAppContentFetcher -import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppChoosingManager +import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppProcessingManager import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.InAppGeoRepository +import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.InAppRepository import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.InAppSegmentationRepository import cloud.mindbox.mobile_sdk.inapp.domain.models.* import cloud.mindbox.mobile_sdk.logger.MindboxLoggerImpl @@ -14,16 +16,18 @@ import cloud.mindbox.mobile_sdk.models.InAppEventType import com.android.volley.VolleyError import kotlinx.coroutines.* -internal class InAppChoosingManagerImpl( +internal class InAppProcessingManagerImpl( private val inAppGeoRepository: InAppGeoRepository, private val inAppSegmentationRepository: InAppSegmentationRepository, - private val inAppContentFetcher: InAppContentFetcher -) : InAppChoosingManager { + private val inAppContentFetcher: InAppContentFetcher, + private val inAppRepository: InAppRepository +) : InAppProcessingManager { companion object { private const val RESPONSE_STATUS_CUSTOMER_SEGMENTS_REQUIRE_CUSTOMER = "CheckCustomerSegments requires customer" } + override suspend fun chooseInAppToShow( inApps: List, triggerEvent: InAppEventType, @@ -112,12 +116,26 @@ internal class InAppChoosingManagerImpl( mindboxLogD("Skipping inApp with id = ${inApp.id} due to targeting is false") } if (targetingCheck) { + sendTargetedInApp(inApp, triggerEvent) + inAppRepository.saveTargetedInAppWithEvent( + inAppId = inApp.id, + triggerEvent.hashCode() + ) return inApp.form.variants.firstOrNull() } } return null } + override suspend fun sendTargetedInApp(inApp: InApp, triggerEvent: InAppEventType) { + val data = getTargetingData(triggerEvent) + inApp.targeting.fetchTargetingInfo(data) + if (inApp.targeting.checkTargeting(data)) { + logI("InApp with id = ${inApp.id} sends targeting by event $triggerEvent") + inAppRepository.sendUserTargeted(inAppId = inApp.id) + } + } + private fun getTargetingData(triggerEvent: InAppEventType): TargetingData { val ordinalEvent = triggerEvent as? InAppEventType.OrdinalEvent diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/interactors/InAppInteractor.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/interactors/InAppInteractor.kt index 38281121f..da794895e 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/interactors/InAppInteractor.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/interactors/InAppInteractor.kt @@ -1,10 +1,13 @@ package cloud.mindbox.mobile_sdk.inapp.domain.interfaces.interactors import cloud.mindbox.mobile_sdk.inapp.domain.models.InAppType +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow internal interface InAppInteractor { + suspend fun listenToTargetingEvents() + fun isInAppShown(): Boolean fun setInAppShown() suspend fun processEventAndConfig(): Flow diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/managers/InAppFilteringManager.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/managers/InAppFilteringManager.kt index a01310861..0be08bd54 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/managers/InAppFilteringManager.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/managers/InAppFilteringManager.kt @@ -13,6 +13,8 @@ internal interface InAppFilteringManager { fun filterSegmentationFreeInApps(inApps: List): List + fun filterUnShownInAppsByEvent(inApps: List, event: InAppEventType): List + fun filterInAppsByEvent(inApps: List, event: InAppEventType): List fun filterABTestsInApps(inApps: List, abtestsInAppsPool: Collection): List diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/managers/InAppChoosingManager.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/managers/InAppProcessingManager.kt similarity index 73% rename from sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/managers/InAppChoosingManager.kt rename to sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/managers/InAppProcessingManager.kt index bf2a84837..540172d87 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/managers/InAppChoosingManager.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/managers/InAppProcessingManager.kt @@ -4,7 +4,9 @@ import cloud.mindbox.mobile_sdk.inapp.domain.models.InApp import cloud.mindbox.mobile_sdk.inapp.domain.models.InAppType import cloud.mindbox.mobile_sdk.models.InAppEventType -internal interface InAppChoosingManager { +internal interface InAppProcessingManager { suspend fun chooseInAppToShow(inApps: List, triggerEvent: InAppEventType): InAppType? + + suspend fun sendTargetedInApp(inApp: InApp, triggerEvent: InAppEventType) } \ No newline at end of file diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/repositories/InAppRepository.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/repositories/InAppRepository.kt index d99deff47..5ec5ed1a2 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/repositories/InAppRepository.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/repositories/InAppRepository.kt @@ -5,6 +5,17 @@ import cloud.mindbox.mobile_sdk.models.InAppEventType import kotlinx.coroutines.flow.Flow internal interface InAppRepository { + fun saveCurrentSessionInApps(inApps: List) + + fun getCurrentSessionInApps(): List + + fun getTargetedInApps(): Map> + + fun saveTargetedInAppWithEvent(inAppId: String, eventHashcode: Int) + + fun saveUnShownOperationalInApp(operation: String, inApp: InApp) + + fun getUnShownOperationalInAppsByOperation(operation: String): List fun saveOperationalInApp(operation: String, inApp: InApp) diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/repositories/InAppSegmentationRepository.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/repositories/InAppSegmentationRepository.kt index 987fc0b56..a1672f5ad 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/repositories/InAppSegmentationRepository.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/interfaces/repositories/InAppSegmentationRepository.kt @@ -4,8 +4,6 @@ import cloud.mindbox.mobile_sdk.inapp.domain.models.* internal interface InAppSegmentationRepository { - var unShownInApps: List - suspend fun fetchCustomerSegmentations() suspend fun fetchProductSegmentation(product: Pair) diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/InAppMessageManager.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/InAppMessageManager.kt index 1322079fe..ff5ab4298 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/InAppMessageManager.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/InAppMessageManager.kt @@ -10,6 +10,6 @@ internal interface InAppMessageManager { fun onPauseCurrentActivity(activity: Activity) fun onStopCurrentActivity(activity: Activity) fun registerInAppCallback(inAppCallback: InAppCallback) - fun initInAppMessages() + fun initLogs() fun onResumeCurrentActivity(activity: Activity, shouldUseBlur: Boolean) } \ No newline at end of file diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/InAppMessageManagerImpl.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/InAppMessageManagerImpl.kt index 77d3de2c2..ba66328f0 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/InAppMessageManagerImpl.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/InAppMessageManagerImpl.kt @@ -29,30 +29,35 @@ internal class InAppMessageManagerImpl( override fun listenEventAndInApp() { inAppScope.launch { - inAppInteractor.processEventAndConfig() - .collect { inAppMessage -> - withContext(Dispatchers.Main) { - if (inAppMessageViewDisplayer.isInAppActive()) { - this@InAppMessageManagerImpl.mindboxLogD("Inapp is active. Skip ${inAppMessage.inAppId}") - return@withContext - } - - if (inAppInteractor.isInAppShown()) { - this@InAppMessageManagerImpl.mindboxLogD("Inapp already shown. Skip ${inAppMessage.inAppId}") - return@withContext - } + launch { + inAppInteractor.listenToTargetingEvents() + } + launch { + inAppInteractor.processEventAndConfig() + .collect { inAppMessage -> + withContext(Dispatchers.Main) { + if (inAppMessageViewDisplayer.isInAppActive()) { + this@InAppMessageManagerImpl.mindboxLogD("Inapp is active. Skip ${inAppMessage.inAppId}") + return@withContext + } - inAppMessageViewDisplayer.tryShowInAppMessage( - inAppType = inAppMessage, - onInAppClick = { - inAppInteractor.sendInAppClicked(inAppMessage.inAppId) - }, - onInAppShown = { - inAppInteractor.saveShownInApp(inAppMessage.inAppId) + if (inAppInteractor.isInAppShown()) { + this@InAppMessageManagerImpl.mindboxLogD("Inapp already shown. Skip ${inAppMessage.inAppId}") + return@withContext } - ) + + inAppMessageViewDisplayer.tryShowInAppMessage( + inAppType = inAppMessage, + onInAppClick = { + inAppInteractor.sendInAppClicked(inAppMessage.inAppId) + }, + onInAppShown = { + inAppInteractor.saveShownInApp(inAppMessage.inAppId) + } + ) + } } - } + } } } @@ -69,6 +74,7 @@ internal class InAppMessageManagerImpl( MindboxLoggerImpl.w(InAppMessageManagerImpl, "Config not found", error) MindboxPreferences.inAppConfig = "" } + else -> { // needed to trigger flow event MindboxPreferences.inAppConfig = MindboxPreferences.inAppConfig @@ -87,7 +93,7 @@ internal class InAppMessageManagerImpl( } } - override fun initInAppMessages() { + override fun initLogs() { monitoringInteractor.processLogs() } diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/managers/MindboxEventManager.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/managers/MindboxEventManager.kt index 79fe19900..5fd5a0dd9 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/managers/MindboxEventManager.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/managers/MindboxEventManager.kt @@ -23,9 +23,9 @@ internal object MindboxEventManager { private const val EMPTY_JSON_OBJECT = "{}" private const val NULL_JSON = "null" - private const val IN_APP_OPERATION_VIEW_TYPE = "Inapp.Show" - private const val IN_APP_OPERATION_CLICK_TYPE = "Inapp.Click" - private const val IN_APP_OPERATION_TARGETING_TYPE = "Inapp.Targeting" + const val IN_APP_OPERATION_VIEW_TYPE = "Inapp.Show" + const val IN_APP_OPERATION_CLICK_TYPE = "Inapp.Click" + const val IN_APP_OPERATION_TARGETING_TYPE = "Inapp.Targeting" private val gson = Gson() diff --git a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/CloseButtonModalElementDtoDataFillerTest.kt b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/CloseButtonModalElementDtoDataFillerTest.kt index dfc08e76a..e83ef53f6 100644 --- a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/CloseButtonModalElementDtoDataFillerTest.kt +++ b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/CloseButtonModalElementDtoDataFillerTest.kt @@ -1,6 +1,7 @@ package cloud.mindbox.mobile_sdk.inapp.data.managers import cloud.mindbox.mobile_sdk.inapp.data.dto.ElementDto +import cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler.CloseButtonModalElementDtoDataFiller import cloud.mindbox.mobile_sdk.models.InAppStub import org.junit.Assert.assertEquals import org.junit.Test diff --git a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/CloseButtonSnackbarElementDtoDataFillerTest.kt b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/CloseButtonSnackbarElementDtoDataFillerTest.kt index 5c7f53d61..fcb215d03 100644 --- a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/CloseButtonSnackbarElementDtoDataFillerTest.kt +++ b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/CloseButtonSnackbarElementDtoDataFillerTest.kt @@ -1,6 +1,7 @@ package cloud.mindbox.mobile_sdk.inapp.data.managers import cloud.mindbox.mobile_sdk.inapp.data.dto.ElementDto +import cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler.CloseButtonSnackbarElementDtoDataFiller import cloud.mindbox.mobile_sdk.models.InAppStub import org.junit.Assert.assertEquals import org.junit.Test diff --git a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/DefaultDataManagerTest.kt b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/DefaultDataManagerTest.kt index ad58bf926..386df97b7 100644 --- a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/DefaultDataManagerTest.kt +++ b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/DefaultDataManagerTest.kt @@ -1,5 +1,7 @@ package cloud.mindbox.mobile_sdk.inapp.data.managers +import cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler.ModalWindowDtoDataFiller +import cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler.SnackBarDtoDataFiller import cloud.mindbox.mobile_sdk.models.InAppStub import io.mockk.every import io.mockk.impl.annotations.MockK diff --git a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/ModalElementDtoDataFillerTest.kt b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/ModalElementDtoDataFillerTest.kt index c4ee9499f..22e8fec8c 100644 --- a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/ModalElementDtoDataFillerTest.kt +++ b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/ModalElementDtoDataFillerTest.kt @@ -1,6 +1,8 @@ package cloud.mindbox.mobile_sdk.inapp.data.managers import cloud.mindbox.mobile_sdk.inapp.data.dto.ElementDto +import cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler.CloseButtonModalElementDtoDataFiller +import cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler.ModalElementDtoDataFiller import cloud.mindbox.mobile_sdk.models.InAppStub import io.mockk.every import io.mockk.impl.annotations.MockK diff --git a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/ModalWindowDtoDataFillerTest.kt b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/ModalWindowDtoDataFillerTest.kt index 8c94f4657..208749fc5 100644 --- a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/ModalWindowDtoDataFillerTest.kt +++ b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/ModalWindowDtoDataFillerTest.kt @@ -2,6 +2,8 @@ package cloud.mindbox.mobile_sdk.inapp.data.managers import cloud.mindbox.mobile_sdk.inapp.data.dto.ElementDto import cloud.mindbox.mobile_sdk.inapp.data.dto.PayloadDto +import cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler.ModalElementDtoDataFiller +import cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler.ModalWindowDtoDataFiller import cloud.mindbox.mobile_sdk.models.InAppStub import io.mockk.every import io.mockk.impl.annotations.MockK diff --git a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/SnackBarDtoDataFillerTest.kt b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/SnackBarDtoDataFillerTest.kt index 89fe9ab77..60fece51f 100644 --- a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/SnackBarDtoDataFillerTest.kt +++ b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/SnackBarDtoDataFillerTest.kt @@ -1,6 +1,8 @@ package cloud.mindbox.mobile_sdk.inapp.data.managers import cloud.mindbox.mobile_sdk.inapp.data.dto.PayloadDto +import cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler.SnackBarDtoDataFiller +import cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler.SnackbarElementDtoDataFiller import cloud.mindbox.mobile_sdk.models.InAppStub import cloud.mindbox.mobile_sdk.models.PayloadDtoStub import io.mockk.every diff --git a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/SnackbarElementDtoDataFillerTest.kt b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/SnackbarElementDtoDataFillerTest.kt index 72c7676d2..8a359a40c 100644 --- a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/SnackbarElementDtoDataFillerTest.kt +++ b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/managers/SnackbarElementDtoDataFillerTest.kt @@ -1,6 +1,8 @@ package cloud.mindbox.mobile_sdk.inapp.data.managers import cloud.mindbox.mobile_sdk.inapp.data.dto.ElementDto +import cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler.CloseButtonSnackbarElementDtoDataFiller +import cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler.SnackbarElementDtoDataFiller import cloud.mindbox.mobile_sdk.models.InAppStub import io.mockk.every import io.mockk.impl.annotations.MockK diff --git a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/repositories/InAppRepositoryTest.kt b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/repositories/InAppRepositoryTest.kt index b54847119..09122d907 100644 --- a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/repositories/InAppRepositoryTest.kt +++ b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/repositories/InAppRepositoryTest.kt @@ -47,13 +47,13 @@ class InAppRepositoryTest { val newInApp = InAppStub.getInApp().copy(id = "newInAppId") val existingInApp = InAppStub.getInApp().copy(id = "existingId") val expectedList = mutableListOf(existingInApp, newInApp) - every { sessionStorageManager.operationalInApps } returns hashMapOf( + every { sessionStorageManager.unShownOperationalInApps } returns hashMapOf( testOperation to mutableListOf( existingInApp ) ) - inAppRepository.saveOperationalInApp(testOperation, newInApp) - assertEquals(expectedList, sessionStorageManager.operationalInApps[testOperation]) + inAppRepository.saveUnShownOperationalInApp(testOperation, newInApp) + assertEquals(expectedList, sessionStorageManager.unShownOperationalInApps[testOperation]) } @Test @@ -61,17 +61,17 @@ class InAppRepositoryTest { val testOperation = "testOperation" val newInApp = InAppStub.getInApp().copy(id = "newInAppId") val expectedList = mutableListOf(newInApp) - every { sessionStorageManager.operationalInApps } returns hashMapOf() - inAppRepository.saveOperationalInApp(testOperation, newInApp) - assertEquals(expectedList, sessionStorageManager.operationalInApps[testOperation]) + every { sessionStorageManager.unShownOperationalInApps } returns hashMapOf() + inAppRepository.saveUnShownOperationalInApp(testOperation, newInApp) + assertEquals(expectedList, sessionStorageManager.unShownOperationalInApps[testOperation]) } @Test fun `get operation inApps returns null`() { val testOperation = "testOperation" val expectedResult = mutableListOf() - every { sessionStorageManager.operationalInApps[testOperation.lowercase()] } returns null - val actualResult = inAppRepository.getOperationalInAppsByOperation(testOperation) + every { sessionStorageManager.unShownOperationalInApps[testOperation.lowercase()] } returns null + val actualResult = inAppRepository.getUnShownOperationalInAppsByOperation(testOperation) assertEquals(expectedResult, actualResult) } @@ -79,8 +79,8 @@ class InAppRepositoryTest { fun `get operation inApps no inApps`() { val testOperation = "testOperation" val expectedResult = mutableListOf() - every { sessionStorageManager.operationalInApps[testOperation.lowercase()] } returns expectedResult - val actualResult = inAppRepository.getOperationalInAppsByOperation(testOperation) + every { sessionStorageManager.unShownOperationalInApps[testOperation.lowercase()] } returns expectedResult + val actualResult = inAppRepository.getUnShownOperationalInAppsByOperation(testOperation) assertEquals(expectedResult, actualResult) } @@ -90,8 +90,8 @@ class InAppRepositoryTest { val expectedResult = mutableListOf( InAppStub.getInApp() ) - every { sessionStorageManager.operationalInApps[testOperation.lowercase()] } returns expectedResult - val actualResult = inAppRepository.getOperationalInAppsByOperation(testOperation) + every { sessionStorageManager.unShownOperationalInApps[testOperation.lowercase()] } returns expectedResult + val actualResult = inAppRepository.getUnShownOperationalInAppsByOperation(testOperation) assertEquals(expectedResult, actualResult) } diff --git a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/repositories/InAppSegmentationRepositoryTest.kt b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/repositories/InAppSegmentationRepositoryTest.kt index 366a25977..6bb595bbd 100644 --- a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/repositories/InAppSegmentationRepositoryTest.kt +++ b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/repositories/InAppSegmentationRepositoryTest.kt @@ -31,7 +31,15 @@ class InAppSegmentationRepositoryTest { val mockkRule = MockKRule(this) private val inAppMapper = mockk() - private val sessionStorageManager = mockk() + private val sessionStorageManager = mockk(relaxUnitFun = true) { + every { + currentSessionInApps + } returns emptyList() + every { + currentSessionInApps = any() + } just runs + } + private val gatewayManager = mockk() private val inAppSegmentationRepository = InAppSegmentationRepositoryImpl( @@ -51,7 +59,9 @@ class InAppSegmentationRepositoryTest { @Test fun `request customer segmentations success`() = runTest { - inAppSegmentationRepository.unShownInApps = mutableListOf(InAppStub.getInApp()) + every { + sessionStorageManager.currentSessionInApps + } returns mutableListOf(InAppStub.getInApp()) coEvery { DbManager.listenConfigurations() } answers { flow { emit(configuration) @@ -88,7 +98,7 @@ class InAppSegmentationRepositoryTest { @Test fun `request customer segmentations no inApps`() = runTest { - inAppSegmentationRepository.unShownInApps = mutableListOf() + sessionStorageManager.currentSessionInApps = mutableListOf() every { sessionStorageManager.customerSegmentationFetchStatus = CustomerSegmentationFetchStatus.SEGMENTATION_FETCH_ERROR @@ -109,7 +119,9 @@ class InAppSegmentationRepositoryTest { @Test fun `request customer segmentation error`() = runTest { - inAppSegmentationRepository.unShownInApps = mutableListOf(InAppStub.getInApp()) + every { + sessionStorageManager.currentSessionInApps + } returns mutableListOf(InAppStub.getInApp()) coEvery { DbManager.listenConfigurations() } answers { flow { emit(configuration) diff --git a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppFilteringManagerTest.kt b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppFilteringManagerTest.kt index 3ab3ee276..196af5e09 100644 --- a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppFilteringManagerTest.kt +++ b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppFilteringManagerTest.kt @@ -43,7 +43,7 @@ internal class InAppFilteringManagerTest { fun `filter inApp by event with App startUp`() { val testInApps = listOf(InAppStub.getInApp().copy(id = "otherInAppId")) val actualResult = - inAppFilteringManager.filterInAppsByEvent(testInApps, InAppEventType.AppStartup) + inAppFilteringManager.filterUnShownInAppsByEvent(testInApps, InAppEventType.AppStartup) assertEquals(testInApps, actualResult) } @@ -51,9 +51,9 @@ internal class InAppFilteringManagerTest { fun `filter inApp by event with Ordinal event`() { val testInApps = listOf(InAppStub.getInApp().copy(id = "otherInAppId")) val expectedResult = listOf(InAppStub.getInApp().copy(id = "testInAppId")) - every { inAppRepository.getOperationalInAppsByOperation(any()) } returns expectedResult + every { inAppRepository.getUnShownOperationalInAppsByOperation(any()) } returns expectedResult val actualResult = - inAppFilteringManager.filterInAppsByEvent( + inAppFilteringManager.filterUnShownInAppsByEvent( testInApps, InAppEventType.OrdinalEvent(EventType.SyncOperation("")) ) diff --git a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppChoosingManagerTest.kt b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppProcessingManagerTest.kt similarity index 54% rename from sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppChoosingManagerTest.kt rename to sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppProcessingManagerTest.kt index 194fe5be0..afa24ee6f 100644 --- a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppChoosingManagerTest.kt +++ b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppProcessingManagerTest.kt @@ -1,6 +1,7 @@ package cloud.mindbox.mobile_sdk.inapp.domain import cloud.mindbox.mobile_sdk.di.MindboxDI +import cloud.mindbox.mobile_sdk.inapp.data.managers.SessionStorageManager import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.InAppContentFetcher import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.InAppGeoRepository import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.InAppRepository @@ -19,7 +20,7 @@ import org.junit.Rule import org.junit.Test @OptIn(ExperimentalCoroutinesApi::class) -internal class InAppChoosingManagerTest { +internal class InAppProcessingManagerTest { @get:Rule val mockkRule = MockKRule(this) @@ -30,6 +31,16 @@ internal class InAppChoosingManagerTest { coEvery { fetchContent(any(), any()) } returns true } + + private val mockInAppRepository = mockk { + every { + sendUserTargeted(any()) + } just runs + every { + saveTargetedInAppWithEvent(any(), any()) + } just runs + } + private val mockkInAppGeoRepository = mockk { every { getGeoFetchedStatus() } returns GeoFetchStatus.GEO_FETCH_SUCCESS coEvery { fetchGeo() } just runs @@ -62,34 +73,89 @@ internal class InAppChoosingManagerTest { every { MindboxDI.appModule } returns mockk { every { inAppGeoRepository } returns mockkInAppGeoRepository every { inAppSegmentationRepository } returns mockkInAppSegmentationRepository + every { inAppRepository } returns mockInAppRepository } } - private val inAppChoosingManager = InAppChoosingManagerImpl( + private val inAppProcessingManager = InAppProcessingManagerImpl( inAppGeoRepository = mockkInAppGeoRepository, inAppSegmentationRepository = mockkInAppSegmentationRepository, - inAppContentFetcher = mockkInAppContentFetcher + inAppContentFetcher = mockkInAppContentFetcher, + inAppRepository = mockInAppRepository ) + @Test + fun `check targeting returns false sends 0 targeted requests`() = runTest { + val testInApp = mockk(relaxed = true) + every { + testInApp.targeting.checkTargeting(any()) + } returns false + coEvery { + testInApp.targeting.fetchTargetingInfo(any()) + } just runs + inAppProcessingManager.sendTargetedInApp( + testInApp, + InAppEventType.OrdinalEvent(EventType.AsyncOperation(""), "") + ) + verify(exactly = 0) { + mockInAppRepository.sendUserTargeted(any()) + } + } + + @Test + fun `check targeting returns true sends inApp count targeted requests`() = runTest { + val testInApp = mockk(relaxed = true) + val testInApp2 = mockk(relaxed = true) + every { + testInApp.targeting.checkTargeting(any()) + } returns true + coEvery { + testInApp.targeting.fetchTargetingInfo(any()) + } just runs + every { + testInApp2.targeting.checkTargeting(any()) + } returns true + coEvery { + testInApp2.targeting.fetchTargetingInfo(any()) + } just runs + inAppProcessingManager.sendTargetedInApp( + testInApp, + InAppEventType.OrdinalEvent(EventType.AsyncOperation(""), "") + ) + inAppProcessingManager.sendTargetedInApp( + testInApp2, + InAppEventType.OrdinalEvent(EventType.AsyncOperation(""), "") + ) + verify(exactly = 2) { + mockInAppRepository.sendUserTargeted(any()) + } + } + @Test fun `choose inApp to show chooses first correct inApp`() = runTest { val validId = "validId" val expectedResult = InAppStub.getModalWindow().copy(inAppId = validId) - val actualResult = inAppChoosingManager.chooseInAppToShow( + val actualResult = inAppProcessingManager.chooseInAppToShow( listOf( InAppStub.getInApp().copy( - id = "123", targeting = InAppStub.getTargetingRegionNode().copy( - type = "", kind = Kind.POSITIVE, ids = listOf("otherRegionId") + id = "123", targeting = InAppStub.getTargetingRegionNode().copy( + type = "", kind = Kind.POSITIVE, ids = listOf("otherRegionId") + ) + ), + InAppStub.getInApp() + .copy( + id = validId, + targeting = InAppStub.getTargetingTrueNode(), + form = InAppStub.getInApp().form.copy( + listOf( + InAppStub.getModalWindow().copy( + inAppId = validId + ) + ) ) ), - InAppStub.getInApp() - .copy(id = validId, targeting = InAppStub.getTargetingTrueNode(), form = InAppStub.getInApp().form.copy( - listOf(InAppStub.getModalWindow().copy( - inAppId = validId - )) - )), ), event ) @@ -99,18 +165,18 @@ internal class InAppChoosingManagerTest { @Test fun `choose inApp to show has no choosable inApps`() = runTest { assertNull( - inAppChoosingManager.chooseInAppToShow( + inAppProcessingManager.chooseInAppToShow( listOf( InAppStub.getInApp().copy( - id = "123", targeting = InAppStub.getTargetingRegionNode().copy( - type = "", kind = Kind.POSITIVE, ids = listOf("otherRegionId") - ) - ), + id = "123", targeting = InAppStub.getTargetingRegionNode().copy( + type = "", kind = Kind.POSITIVE, ids = listOf("otherRegionId") + ) + ), InAppStub.getInApp().copy( - id = "123", targeting = InAppStub.getTargetingRegionNode().copy( - type = "", kind = Kind.POSITIVE, ids = listOf("otherRegionId2") - ) - ), + id = "123", targeting = InAppStub.getTargetingRegionNode().copy( + type = "", kind = Kind.POSITIVE, ids = listOf("otherRegionId2") + ) + ), ), event ) @@ -123,18 +189,18 @@ internal class InAppChoosingManagerTest { assertThrows(Throwable::class.java) { runBlocking { - MindboxDI.appModule.inAppChoosingManager.chooseInAppToShow( + MindboxDI.appModule.inAppProcessingManager.chooseInAppToShow( listOf( InAppStub.getInApp().copy( - id = "123", targeting = InAppStub.getTargetingRegionNode().copy( - type = "", kind = Kind.POSITIVE, ids = listOf("otherRegionId") - ) - ), + id = "123", targeting = InAppStub.getTargetingRegionNode().copy( + type = "", kind = Kind.POSITIVE, ids = listOf("otherRegionId") + ) + ), InAppStub.getInApp().copy( - id = "123", targeting = InAppStub.getTargetingRegionNode().copy( - type = "", kind = Kind.POSITIVE, ids = listOf("otherRegionId2") - ) - ), + id = "123", targeting = InAppStub.getTargetingRegionNode().copy( + type = "", kind = Kind.POSITIVE, ids = listOf("otherRegionId2") + ) + ), ), event ) @@ -147,26 +213,30 @@ internal class InAppChoosingManagerTest { val validId = "validId" val testInAppList = listOf( InAppStub.getInApp().copy( - id = "123", targeting = InAppStub.getTargetingSegmentNode().copy( - type = "", - kind = Kind.POSITIVE, - segmentationExternalId = "segmentationExternalId1", - segmentExternalId = "segmentExternalId1" - ) - ), InAppStub.getInApp().copy( - id = "124", targeting = InAppStub.getTargetingSegmentNode().copy( - type = "", - kind = Kind.POSITIVE, - segmentationExternalId = "segmentationExternalId2", - segmentExternalId = "segmentExternalId2" - ) - ), InAppStub.getInApp().copy( - id = validId, targeting = InAppStub.getTargetingTrueNode(), form = InAppStub.getInApp().form.copy( - listOf(InAppStub.getModalWindow().copy( - inAppId = validId - )) + id = "123", targeting = InAppStub.getTargetingSegmentNode().copy( + type = "", + kind = Kind.POSITIVE, + segmentationExternalId = "segmentationExternalId1", + segmentExternalId = "segmentExternalId1" + ) + ), InAppStub.getInApp().copy( + id = "124", targeting = InAppStub.getTargetingSegmentNode().copy( + type = "", + kind = Kind.POSITIVE, + segmentationExternalId = "segmentationExternalId2", + segmentExternalId = "segmentExternalId2" ) + ), InAppStub.getInApp().copy( + id = validId, + targeting = InAppStub.getTargetingTrueNode(), + form = InAppStub.getInApp().form.copy( + listOf( + InAppStub.getModalWindow().copy( + inAppId = validId + ) + ) ) + ) ) coEvery { mockkInAppSegmentationRepository.fetchCustomerSegmentations() @@ -175,7 +245,7 @@ internal class InAppChoosingManagerTest { mockkInAppSegmentationRepository.setCustomerSegmentationStatus(any()) } just runs val expectedResult = InAppStub.getModalWindow().copy(inAppId = validId) - val actualResult = inAppChoosingManager.chooseInAppToShow( + val actualResult = inAppProcessingManager.chooseInAppToShow( testInAppList, event ) assertEquals(expectedResult, actualResult) @@ -186,32 +256,37 @@ internal class InAppChoosingManagerTest { val validId = "validId" val testInAppList = listOf( InAppStub.getInApp().copy( - id = "123", targeting = InAppStub.getTargetingRegionNode().copy( - type = "", kind = Kind.POSITIVE, ids = listOf("otherRegionId") - ) - ), InAppStub.getInApp().copy( - id = "124", targeting = InAppStub.getTargetingRegionNode().copy( - type = "", kind = Kind.POSITIVE, ids = listOf("otherRegionId2") - ) - ), InAppStub.getInApp().copy( - id = validId, targeting = InAppStub.getTargetingTrueNode(), form = InAppStub.getInApp().form.copy( - listOf(InAppStub.getModalWindow().copy( - inAppId = validId - )) + id = "123", targeting = InAppStub.getTargetingRegionNode().copy( + type = "", kind = Kind.POSITIVE, ids = listOf("otherRegionId") + ) + ), InAppStub.getInApp().copy( + id = "124", targeting = InAppStub.getTargetingRegionNode().copy( + type = "", kind = Kind.POSITIVE, ids = listOf("otherRegionId2") ) + ), InAppStub.getInApp().copy( + id = validId, + targeting = InAppStub.getTargetingTrueNode(), + form = InAppStub.getInApp().form.copy( + listOf( + InAppStub.getModalWindow().copy( + inAppId = validId + ) + ) ) + ) ) - val inAppChoosingManager = InAppChoosingManagerImpl( + val inAppProcessingManager = InAppProcessingManagerImpl( inAppGeoRepository = mockk { coEvery { fetchGeo() } throws GeoError(VolleyError()) }, inAppSegmentationRepository = mockkInAppSegmentationRepository, - inAppContentFetcher = mockkInAppContentFetcher + inAppContentFetcher = mockkInAppContentFetcher, + inAppRepository = mockInAppRepository ) val expectedResult = InAppStub.getModalWindow().copy(inAppId = validId) - val actualResult = inAppChoosingManager.chooseInAppToShow( + val actualResult = inAppProcessingManager.chooseInAppToShow( testInAppList, event ) assertEquals(expectedResult, actualResult) diff --git a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/presentation/InAppMessageManagerTest.kt b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/presentation/InAppMessageManagerTest.kt index 175c27b6c..a8e0c8ec0 100644 --- a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/presentation/InAppMessageManagerTest.kt +++ b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/presentation/InAppMessageManagerTest.kt @@ -51,6 +51,9 @@ internal class InAppMessageManagerTest { mockkObject(MindboxPreferences) mockkObject(MindboxLoggerImpl) mockkStatic(Log::class) + coEvery { + inAppMessageInteractor.listenToTargetingEvents() + } just runs every { Log.isLoggable(any(), any()) }.answers { @@ -117,10 +120,8 @@ internal class InAppMessageManagerTest { StandardTestDispatcher(testScheduler), monitoringRepository ) - every { - runBlocking { - inAppMessageInteractor.processEventAndConfig() - } + coEvery { + inAppMessageInteractor.processEventAndConfig() }.answers { flow { emit( @@ -128,17 +129,22 @@ internal class InAppMessageManagerTest { ) } } + inAppMessageManager.listenEventAndInApp() advanceUntilIdle() + inAppMessageInteractor.processEventAndConfig().test { awaitItem() awaitComplete() } + verify(exactly = 1) { + inAppMessageViewDisplayer.tryShowInAppMessage(any(), any(), any()) + } every { inAppMessageViewDisplayer.tryShowInAppMessage(any(), any(), any()) } just runs - verify(exactly = 1) { - inAppMessageViewDisplayer.tryShowInAppMessage(any(), any(), any()) + coVerify(exactly = 1) { + inAppMessageInteractor.listenToTargetingEvents() } } @@ -151,10 +157,11 @@ internal class InAppMessageManagerTest { StandardTestDispatcher(testScheduler), monitoringRepository ) - every { - runBlocking { - inAppMessageInteractor.processEventAndConfig() - } + coEvery { + inAppMessageInteractor.listenToTargetingEvents() + } just runs + coEvery { + inAppMessageInteractor.processEventAndConfig() }.answers { flow { emit( @@ -174,6 +181,9 @@ internal class InAppMessageManagerTest { verify(exactly = 0) { inAppMessageViewDisplayer.tryShowInAppMessage(any(), any(), any()) } + coVerify(exactly = 1) { + inAppMessageInteractor.listenToTargetingEvents() + } } @Test @@ -203,6 +213,9 @@ internal class InAppMessageManagerTest { MindboxLoggerImpl.e(Mindbox, "Mindbox caught unhandled error", any()) } } + coVerify(exactly = 1) { + inAppMessageInteractor.listenToTargetingEvents() + } } private fun (() -> Any?).shouldNotThrow() = try { From 152746a403d5ba0a2ff5b67b6a4093cc62b2ef56 Mon Sep 17 00:00:00 2001 From: Sergey Sozinov Date: Thu, 7 Mar 2024 18:19:24 +0300 Subject: [PATCH 7/8] Bump SDK version to 2.8.5 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 3789c1f62..d3c4a2fc7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -21,4 +21,4 @@ android.enableJetifier=true kotlin.code.style=official # SDK version property -SDK_VERSION_NAME=2.8.3 \ No newline at end of file +SDK_VERSION_NAME=2.8.5 \ No newline at end of file From 0f422b2df75aa21a5c22e9e6d390853cd0ac4f92 Mon Sep 17 00:00:00 2001 From: Robert Alimbekov Date: Wed, 13 Mar 2024 21:05:50 +0500 Subject: [PATCH 8/8] fixing system name lowercase --- .../mindbox/mobile_sdk/inapp/data/mapper/InAppMapper.kt | 8 +++----- .../mobile_sdk/inapp/domain/InAppInteractorImpl.kt | 2 -- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/mapper/InAppMapper.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/mapper/InAppMapper.kt index 94d1c1121..3591a7b92 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/mapper/InAppMapper.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/mapper/InAppMapper.kt @@ -7,8 +7,6 @@ import cloud.mindbox.mobile_sdk.inapp.data.dto.ElementDto import cloud.mindbox.mobile_sdk.inapp.data.dto.GeoTargetingDto import cloud.mindbox.mobile_sdk.inapp.data.dto.PayloadDto import cloud.mindbox.mobile_sdk.inapp.domain.models.* -import cloud.mindbox.mobile_sdk.inapp.domain.models.InAppType.ModalWindow.* -import cloud.mindbox.mobile_sdk.inapp.data.dto.PayloadDto.ModalWindowDto.* import cloud.mindbox.mobile_sdk.inapp.domain.models.ProductResponse import cloud.mindbox.mobile_sdk.models.TreeTargetingDto import cloud.mindbox.mobile_sdk.models.operation.Ids @@ -202,10 +200,10 @@ internal class InAppMapper { left = payloadDto.content.position.margin.left!!.roundToInt(), right = payloadDto.content.position.margin.right!!.roundToInt(), bottom = payloadDto.content.position.margin.bottom!!.roundToInt() - ), + ), - ) + ) ) } @@ -235,7 +233,7 @@ internal class InAppMapper { ) } ?: emptyList(), operations = inAppConfigResponse.settings?.map { (key, value) -> - key.enumValue() to OperationSystemName(value.systemName) + key.enumValue() to OperationSystemName(value.systemName.lowercase()) }?.toMap() ?: emptyMap(), abtests = inAppConfigResponse.abtests?.map { dto -> ABTest( diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppInteractorImpl.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppInteractorImpl.kt index bca88d414..71ae77b48 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppInteractorImpl.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/domain/InAppInteractorImpl.kt @@ -112,8 +112,6 @@ internal class InAppInteractorImpl( } } } - - } override fun isInAppShown(): Boolean {