Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 15 additions & 6 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
run: ./gradlew --no-daemon check

unit:
runs-on: ubuntu-latest
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3

Expand All @@ -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

Expand All @@ -64,7 +64,7 @@ jobs:
run: ./gradlew --no-daemon assembleDebug

publish:
needs: [build]
needs: [ build ]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
Expand All @@ -91,15 +91,24 @@ 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
run: ./gradlew --no-daemon publish -PsonatypeUsername=${{secrets.OSSRHUSERNAME}} -PsonatypePassword=${{secrets.OSSRHPASSWORD}}

#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
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -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

Expand Down
4 changes: 2 additions & 2 deletions dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
14 changes: 10 additions & 4 deletions example/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand All @@ -52,9 +58,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'
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,4 @@ android.enableJetifier=true
kotlin.code.style=official

# SDK version property
SDK_VERSION_NAME=2.8.4
SDK_VERSION_NAME=2.8.5
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ class MindboxFirebaseTest {

private val remoteMessageWithData = mockk<RemoteMessage>()
private val remoteMessageWithoutData = mockk<RemoteMessage>()
private val remoteMessageWithoutTitle = mockk<RemoteMessage>()

init {
every { remoteMessageWithData.data } returns mapOf(
Expand All @@ -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
Expand Down Expand Up @@ -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)
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -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<PushAction>,
@SerializedName("clickUrl") val clickUrl: String?,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class MindboxHuaweiTest {

private val remoteMessageWithData = mockk<RemoteMessage>()
private val remoteMessageWithoutData = mockk<RemoteMessage>()
private val remoteMessageWithoutTitle = mockk<RemoteMessage>()

init {
every { remoteMessageWithData.data } returns mapOf(
Expand All @@ -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()
}


Expand Down Expand Up @@ -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)
}
}
1 change: 0 additions & 1 deletion sdk/src/main/java/cloud/mindbox/mobile_sdk/Extensions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import java.nio.charset.Charset
import java.util.Queue
import kotlin.math.roundToInt


internal fun Map<String, String>.toUrlQueryString() = LoggingExceptionHandler.runCatching(
defaultValue = ""
) {
Expand Down
28 changes: 16 additions & 12 deletions sdk/src/main/java/cloud/mindbox/mobile_sdk/Mindbox.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}
}
}
}
Expand Down Expand Up @@ -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()
}
}
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import cloud.mindbox.mobile_sdk.inapp.domain.models.*
internal class SessionStorageManager {

var inAppCustomerSegmentations: SegmentationCheckWrapper? = null
var operationalInApps: HashMap<String, MutableList<InApp>> = HashMap()
var unShownOperationalInApps: HashMap<String, MutableList<InApp>> = HashMap()
var operationalInApps: HashMap<String, MutableList<InApp>> = hashMapOf()
var isInAppMessageShown: Boolean = false
var customerSegmentationFetchStatus: CustomerSegmentationFetchStatus =
CustomerSegmentationFetchStatus.SEGMENTATION_NOT_FETCHED
Expand All @@ -14,5 +15,7 @@ internal class SessionStorageManager {
ProductSegmentationFetchStatus.SEGMENTATION_NOT_FETCHED
var inAppProductSegmentations: HashMap<String, Set<ProductSegmentationResponseWrapper>> =
HashMap()
var currentSessionInApps: List<InApp> = mutableListOf()
var shownInAppIdsWithEvents = mutableMapOf<String, MutableSet<Int>>()

}
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Loading