Coverage Summary for Class: InAppRepositoryImpl (cloud.mindbox.mobile_sdk.inapp.data.repositories)
| Class |
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| InAppRepositoryImpl |
45.5%
(10/22)
|
50%
(16/32)
|
59.2%
(45/76)
|
55.5%
(228/411)
|
| InAppRepositoryImpl$Companion |
|
| Total |
45.5%
(10/22)
|
50%
(16/32)
|
59.2%
(45/76)
|
55.5%
(228/411)
|
package cloud.mindbox.mobile_sdk.inapp.data.repositories
import android.content.Context
import cloud.mindbox.mobile_sdk.inapp.data.managers.SessionStorageManager
import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppSerializationManager
import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.InAppRepository
import cloud.mindbox.mobile_sdk.inapp.domain.models.Frequency
import cloud.mindbox.mobile_sdk.inapp.domain.models.InApp
import cloud.mindbox.mobile_sdk.logger.mindboxLogI
import cloud.mindbox.mobile_sdk.managers.MindboxEventManager
import cloud.mindbox.mobile_sdk.models.InAppEventType
import cloud.mindbox.mobile_sdk.models.Timestamp
import cloud.mindbox.mobile_sdk.models.operation.request.InAppShowFailure
import cloud.mindbox.mobile_sdk.repository.MindboxPreferences
import cloud.mindbox.mobile_sdk.utils.SystemTimeProvider
import kotlinx.coroutines.flow.Flow
import java.util.concurrent.TimeUnit
internal class InAppRepositoryImpl(
private val context: Context,
private val sessionStorageManager: SessionStorageManager,
private val inAppSerializationManager: InAppSerializationManager,
private val timeProvider: SystemTimeProvider
) : InAppRepository {
companion object {
private const val IN_APP_SHOWN_EXPIRATION_DAYS = 2L
}
override fun saveCurrentSessionInApps(inApps: List<InApp>) {
sessionStorageManager.currentSessionInApps = inApps
}
override fun getCurrentSessionInApps(): List<InApp> {
return sessionStorageManager.currentSessionInApps
}
override fun getTargetedInApps(): Map<String, MutableSet<Int>> {
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<InApp> {
return sessionStorageManager.unShownOperationalInApps[operation.lowercase()] ?: emptyList()
}
override fun saveOperationalInApp(operation: String, inApp: InApp) {
sessionStorageManager.operationalInApps[operation] =
sessionStorageManager.operationalInApps.getOrElse(operation) {
mutableListOf()
}.apply {
add(inApp)
}
}
override fun getOperationalInAppsByOperation(operation: String): List<InApp> {
return sessionStorageManager.operationalInApps[operation.lowercase()] ?: emptyList()
}
override fun getShownInApps(): Map<String, List<Long>> {
return inAppSerializationManager.deserializeToShownInAppsMap(MindboxPreferences.shownInApps)
}
override fun listenInAppEvents(): Flow<InAppEventType> {
return MindboxEventManager.eventFlow
}
override fun saveShownInApp(id: String, timeStamp: Long) {
val currentShownInApps = getShownInApps()
val currentTime = timeProvider.currentTimeMillis()
val newShownInAppsById = currentShownInApps.getOrElse(id) { emptyList() }
.filter { currentTime - it <= TimeUnit.DAYS.toMillis(IN_APP_SHOWN_EXPIRATION_DAYS) }
.plus(timeStamp)
val shownInApps = currentShownInApps + (id to newShownInAppsById)
inAppSerializationManager.serializeToShownInAppsString(shownInApps).also {
if (it.isNotBlank()) {
MindboxPreferences.shownInApps = it
}
}
mindboxLogI("Increase count of shown inapp per day")
}
override fun sendInAppShown(inAppId: String, timeToDisplay: String, tags: Map<String, String>?) {
inAppSerializationManager.serializeToInAppShownActionString(inAppId, timeToDisplay, tags).apply {
if (isNotBlank()) {
MindboxEventManager.inAppShown(
context,
this
)
}
}
}
override fun sendInAppClicked(inAppId: String) {
inAppSerializationManager.serializeToInAppActionString(inAppId).apply {
if (isNotBlank()) {
MindboxEventManager.inAppClicked(
context,
this
)
}
}
}
override fun sendUserTargeted(inAppId: String) {
inAppSerializationManager.serializeToInAppActionString(inAppId).apply {
if (isNotBlank()) {
MindboxEventManager.sendUserTargeted(
context,
this
)
}
}
}
override fun sendInAppShowFailure(failures: List<InAppShowFailure>) {
failures
.takeIf { it.isNotEmpty() }
?.let {
inAppSerializationManager.serializeToInAppShowFailuresString(failures)
.takeIf { it.isNotBlank() }
?.let { operationBody ->
MindboxEventManager.inAppShowFailure(context, operationBody)
}
}
}
override fun isInAppShown(inAppId: String): Boolean {
return sessionStorageManager.inAppMessageShownInSession.any { it == inAppId }
}
override fun clearInAppEvents() {
MindboxEventManager.resetEventFlowCache()
}
override fun isTimeDelayInapp(inAppId: String): Boolean =
sessionStorageManager.currentSessionInApps
.any { it.id == inAppId && it.frequency.delay is Frequency.Delay.TimeDelay }
override fun setInAppShown(inAppId: String) {
mindboxLogI("Increase count of shown inapp per session, previous count ${sessionStorageManager.inAppMessageShownInSession.size}")
sessionStorageManager.inAppMessageShownInSession.add(inAppId)
}
override fun getLastInappDismissTime(): Timestamp = MindboxPreferences.lastInappChangeStateTime
override fun saveInAppStateChangeTime(timeStamp: Timestamp) {
mindboxLogI("Save last inapp state changed with timestamp $timeStamp")
MindboxPreferences.lastInappChangeStateTime = timeStamp
}
}