diff --git a/example/app/build.gradle b/example/app/build.gradle
index 648f97d63..f80009394 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.10.0-rc'
- implementation 'cloud.mindbox:mindbox-firebase:2.10.0-rc'
- implementation 'cloud.mindbox:mindbox-huawei:2.10.0-rc'
+ implementation 'cloud.mindbox:mobile-sdk:2.10.0'
+ implementation 'cloud.mindbox:mindbox-firebase'
+ implementation 'cloud.mindbox:mindbox-huawei'
//Glade for custom loader
implementation 'com.github.bumptech.glide:glide:4.15.1'
diff --git a/example/app/src/main/java/com/mindbox/example/MindboxFirebaseMessagingServiceMyService.kt b/example/app/src/main/java/com/mindbox/example/MindboxFirebaseMessagingServiceMyService.kt
index d12924c19..13a8eb51c 100644
--- a/example/app/src/main/java/com/mindbox/example/MindboxFirebaseMessagingServiceMyService.kt
+++ b/example/app/src/main/java/com/mindbox/example/MindboxFirebaseMessagingServiceMyService.kt
@@ -23,6 +23,7 @@ class MindboxFirebaseMessagingService : FirebaseMessagingService() {
val defaultActivity = MainActivity::class.java
// Method for rendering mobile push from Mindbox
+ // Override resource mindbox_default_notification_color to change color pushSmallIcon
val messageWasHandled = Mindbox.handleRemoteMessage(
context = applicationContext,
message = message,
diff --git a/example/app/src/main/java/com/mindbox/example/MindboxHuaweiMessagingService.kt b/example/app/src/main/java/com/mindbox/example/MindboxHuaweiMessagingService.kt
index f2c7e429d..a70113e87 100644
--- a/example/app/src/main/java/com/mindbox/example/MindboxHuaweiMessagingService.kt
+++ b/example/app/src/main/java/com/mindbox/example/MindboxHuaweiMessagingService.kt
@@ -33,6 +33,7 @@ class MindboxHuaweiMessagingService : HmsMessageService() {
val defaultActivity = MainActivity::class.java
// Method for rendering mobile push from Mindbox
+ // Override resource mindbox_default_notification_color to change color pushSmallIcon
val messageWasHandled = Mindbox.handleRemoteMessage(
context = applicationContext,
message = message,
diff --git a/example/app/src/main/res/values/colors.xml b/example/app/src/main/res/values/colors.xml
index c8524cd96..7ba97503b 100644
--- a/example/app/src/main/res/values/colors.xml
+++ b/example/app/src/main/res/values/colors.xml
@@ -2,4 +2,5 @@
#FF000000
#FFFFFFFF
+ #FF000000
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
index e8f6f708a..dc68ea7c5 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -20,4 +20,4 @@ android.enableJetifier=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official
# SDK version property
-SDK_VERSION_NAME=2.10.0-rc
\ No newline at end of file
+SDK_VERSION_NAME=2.10.0
\ No newline at end of file
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 e0566b711..eb8d97cf2 100644
--- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/Extensions.kt
+++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/Extensions.kt
@@ -33,6 +33,10 @@ import org.threeten.bp.format.DateTimeFormatter
import java.nio.charset.Charset
import java.util.Queue
import kotlin.math.roundToInt
+import kotlin.time.Duration.Companion.days
+import kotlin.time.Duration.Companion.hours
+import kotlin.time.Duration.Companion.minutes
+import kotlin.time.Duration.Companion.seconds
internal fun SessionDelay(): SessionDelay {
return Frequency.Delay.TimeDelay(0, InAppTime.SECONDS)
@@ -211,4 +215,19 @@ internal fun verifyMainThreadExecution(methodName: String) {
if (Looper.myLooper() != Looper.getMainLooper()) {
logE("Method $methodName must be called by main thread")
}
-}
\ No newline at end of file
+}
+
+fun String.parseTimeSpanToMillis(): Long {
+ val regex = """(-)?(\d+\.)?([01]?\d|2[0-3]):([0-5]?\d):([0-5]?\d)(\.\d{1,7})?""".toRegex()
+ val matchResult = regex.matchEntire(this)
+ ?: throw IllegalArgumentException("Invalid timeSpan format")
+ val (sign, days, hours, minutes, seconds, fraction) = matchResult.destructured
+ val daysCorrected = if (days.isBlank()) "0" else days.dropLast(1)
+
+ val duration = daysCorrected.toLong().days +
+ hours.toLong().hours +
+ minutes.toLong().minutes +
+ (seconds + fraction).toDouble().seconds
+
+ return if (sign == "-") duration.inWholeMilliseconds * -1 else duration.inWholeMilliseconds
+}
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 678f67575..c8a5a9f23 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
@@ -468,11 +468,8 @@ internal class InAppMapper {
)
}
- fun mapToTtlDto(inAppTtlDtoBlank: SettingsDtoBlank.TtlParametersDtoBlank) = TtlDto(
- TtlParametersDto(
- inAppTtlDtoBlank.unit.enumValue(),
- inAppTtlDtoBlank.value!!
- )
+ fun mapToTtlDto(inAppTtlDtoBlank: SettingsDtoBlank.TtlDtoBlank) = TtlDto(
+ inApps = inAppTtlDtoBlank.inApps!!
)
private fun getTargetingProductSegmentationsList(targeting: TreeTargeting): List {
diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/repositories/MobileConfigRepositoryImpl.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/repositories/MobileConfigRepositoryImpl.kt
index 5f7cd1e44..0b1021634 100644
--- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/repositories/MobileConfigRepositoryImpl.kt
+++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/repositories/MobileConfigRepositoryImpl.kt
@@ -1,8 +1,8 @@
package cloud.mindbox.mobile_sdk.inapp.data.repositories
import cloud.mindbox.mobile_sdk.Mindbox
-import cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler.DataManager
import cloud.mindbox.mobile_sdk.inapp.data.managers.SessionStorageManager
+import cloud.mindbox.mobile_sdk.inapp.data.managers.data_filler.DataManager
import cloud.mindbox.mobile_sdk.inapp.data.mapper.InAppMapper
import cloud.mindbox.mobile_sdk.inapp.data.validators.*
import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.MobileConfigSerializationManager
@@ -162,7 +162,7 @@ internal class MobileConfigRepositoryImpl(
private fun getInAppTtl(configBlank: InAppConfigResponseBlank?): TtlDto? =
try {
- configBlank?.settings?.ttl?.inApps?.takeIf { ttlParametersDtoBlank ->
+ configBlank?.settings?.ttl?.takeIf { ttlParametersDtoBlank ->
ttlParametersValidator.isValid(ttlParametersDtoBlank)
}?.let { ttlParametersDtoBlank ->
inAppMapper.mapToTtlDto(ttlParametersDtoBlank)
diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/validators/InAppConfigTtlValidator.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/validators/InAppConfigTtlValidator.kt
index e3fcc5501..769315fac 100644
--- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/validators/InAppConfigTtlValidator.kt
+++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/validators/InAppConfigTtlValidator.kt
@@ -2,7 +2,7 @@ package cloud.mindbox.mobile_sdk.inapp.data.validators
import cloud.mindbox.mobile_sdk.inapp.domain.models.InAppTtlData
import cloud.mindbox.mobile_sdk.logger.mindboxLogI
-import cloud.mindbox.mobile_sdk.models.operation.response.TtlParametersDto
+import cloud.mindbox.mobile_sdk.parseTimeSpanToMillis
import cloud.mindbox.mobile_sdk.repository.MindboxPreferences
import cloud.mindbox.mobile_sdk.utils.LoggingExceptionHandler
import java.util.Date
@@ -23,12 +23,12 @@ internal class InAppConfigTtlValidator : Validator {
}
}
- private fun isConfigValid(ttl: TtlParametersDto?): Boolean {
+ private fun isConfigValid(ttl: String?): Boolean {
return LoggingExceptionHandler.runCatching(true) {
ttl?.let {
val configUpdatedTime = MindboxPreferences.inAppConfigUpdatedTime.toULong()
val currentTime = System.currentTimeMillis().toULong()
- val ttlTime = ttl.unit.toMillis(ttl.value).toULong()
+ val ttlTime = ttl.parseTimeSpanToMillis().toULong()
val safeTtlTime = minOf(Long.MAX_VALUE.toULong(), configUpdatedTime + ttlTime)
mindboxLogI("Check In-Apps ttl. Current time $currentTime , config updated time $configUpdatedTime , ttl settings $ttlTime")
mindboxLogI("Cached config valid to ${Date(safeTtlTime.toLong())}")
diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/validators/TtlParametersValidator.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/validators/TtlParametersValidator.kt
index 4229077c2..02242d01b 100644
--- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/validators/TtlParametersValidator.kt
+++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/data/validators/TtlParametersValidator.kt
@@ -1,22 +1,12 @@
package cloud.mindbox.mobile_sdk.inapp.data.validators
-import cloud.mindbox.mobile_sdk.enumValue
-import cloud.mindbox.mobile_sdk.inapp.domain.models.InAppTime
import cloud.mindbox.mobile_sdk.models.operation.response.SettingsDtoBlank
-import cloud.mindbox.mobile_sdk.utils.LoggingExceptionHandler
+import cloud.mindbox.mobile_sdk.parseTimeSpanToMillis
+import cloud.mindbox.mobile_sdk.utils.loggingRunCatching
-internal class TtlParametersValidator : Validator {
+internal class TtlParametersValidator : Validator {
- override fun isValid(item: SettingsDtoBlank.TtlParametersDtoBlank): Boolean =
- unitIsValid(item) && valueIsValid(item)
-
- private fun unitIsValid(ttlParameters: SettingsDtoBlank.TtlParametersDtoBlank): Boolean {
- return LoggingExceptionHandler.runCatching(defaultValue = false) {
- ttlParameters.unit?.enumValue() != null
- }
- }
-
- private fun valueIsValid(ttlParameters: SettingsDtoBlank.TtlParametersDtoBlank?): Boolean {
- return ttlParameters?.value?.let { it >= 0 } ?: false
+ override fun isValid(item: SettingsDtoBlank.TtlDtoBlank): Boolean = loggingRunCatching(false) {
+ item.inApps!!.parseTimeSpanToMillis() >= 0
}
}
\ No newline at end of file
diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/actions/PushActivationActivity.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/actions/PushActivationActivity.kt
index 2fa9ce678..438a4f454 100644
--- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/actions/PushActivationActivity.kt
+++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/inapp/presentation/actions/PushActivationActivity.kt
@@ -22,7 +22,7 @@ internal class PushActivationActivity : Activity() {
companion object {
private const val PERMISSION_REQUEST_CODE = 125129
- private const val TIME_BETWEEN_RESUME = 350
+ private const val TIME_BETWEEN_RESUME = 700
}
@RequiresApi(Build.VERSION_CODES.M)
@@ -84,12 +84,13 @@ internal class PushActivationActivity : Activity() {
override fun onResume() {
resumeTimes.add(SystemClock.elapsedRealtime())
if (shouldCheckDialogShowing) {
- if ((resumeTimes.last() - resumeTimes.first()) < TIME_BETWEEN_RESUME) {
+ val duration = resumeTimes.last() - resumeTimes.first()
+ if (duration < TIME_BETWEEN_RESUME) {
resumeTimes.clear()
- mindboxLogI("System dialog not shown -> open settings")
+ mindboxLogI("System dialog not shown because timeout=$duration -> open settings")
mindboxNotificationManager.openNotificationSettings(this)
} else {
- mindboxLogI("User dismiss permission request ")
+ mindboxLogI("User dismiss permission request because timeout=$duration")
requestPermissionManager.decreaseRequestCounter()
}
shouldCheckDialogShowing = false
diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/operation/response/InAppConfigResponse.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/operation/response/InAppConfigResponse.kt
index f0e68053a..bd0dbde27 100644
--- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/operation/response/InAppConfigResponse.kt
+++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/operation/response/InAppConfigResponse.kt
@@ -2,7 +2,6 @@ package cloud.mindbox.mobile_sdk.models.operation.response
import cloud.mindbox.mobile_sdk.inapp.data.dto.PayloadDto
-import cloud.mindbox.mobile_sdk.inapp.domain.models.InAppTime
import cloud.mindbox.mobile_sdk.models.TreeTargetingDto
import com.google.gson.JsonObject
import com.google.gson.annotations.SerializedName
@@ -32,14 +31,7 @@ internal data class SettingsDtoBlank(
internal data class TtlDtoBlank(
@SerializedName("inapps")
- val inApps: TtlParametersDtoBlank?
- )
-
- internal data class TtlParametersDtoBlank(
- @SerializedName("unit")
- val unit: String?,
- @SerializedName("value")
- val value: Long?
+ val inApps: String?
)
}
@@ -56,14 +48,7 @@ internal data class OperationDto(
internal data class TtlDto(
@SerializedName("inapps")
- val inApps: TtlParametersDto?
-)
-
-internal data class TtlParametersDto(
- @SerializedName("unit")
- val unit: InAppTime,
- @SerializedName("value")
- val value: Long
+ val inApps: String
)
internal data class LogRequestDto(
@@ -116,8 +101,8 @@ internal sealed class FrequencyDto {
internal companion object {
const val FREQUENCY_PERIODIC_JSON_NAME = "periodic"
- const val FREQUENCY_UNIT_HOURS = "MINUTES"
- const val FREQUENCY_UNIT_MINUTES = "HOURS"
+ const val FREQUENCY_UNIT_HOURS = "HOURS"
+ const val FREQUENCY_UNIT_MINUTES = "MINUTES"
const val FREQUENCY_UNIT_DAYS = "DAYS"
const val FREQUENCY_UNIT_SECONDS = "SECONDS"
}
diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/PushNotificationManager.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/PushNotificationManager.kt
index b5232350b..e592131f8 100644
--- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/PushNotificationManager.kt
+++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/PushNotificationManager.kt
@@ -6,19 +6,24 @@ import android.app.Notification.VISIBILITY_PRIVATE
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
+import android.graphics.Color
import android.os.Build
import androidx.annotation.DrawableRes
import androidx.annotation.RequiresApi
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
+import androidx.core.content.ContextCompat
import cloud.mindbox.mobile_sdk.Mindbox
+import cloud.mindbox.mobile_sdk.R
import cloud.mindbox.mobile_sdk.logger.MindboxLoggerImpl
+import cloud.mindbox.mobile_sdk.logger.mindboxLogI
import cloud.mindbox.mobile_sdk.pushes.handler.MessageHandlingState
import cloud.mindbox.mobile_sdk.pushes.handler.MindboxMessageHandler
import cloud.mindbox.mobile_sdk.pushes.handler.image.ImageRetryStrategy
import cloud.mindbox.mobile_sdk.services.BackgroundWorkManager
import cloud.mindbox.mobile_sdk.utils.Generator
import cloud.mindbox.mobile_sdk.utils.LoggingExceptionHandler
+import cloud.mindbox.mobile_sdk.utils.loggingRunCatching
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.net.UnknownHostException
@@ -475,6 +480,7 @@ internal object PushNotificationManager {
.setAutoCancel(true)
.setOnlyAlertOnce(true)
.setVisibility(NotificationCompat.VISIBILITY_PRIVATE)
+ .setIconColor(context)
.handlePushClick(
context = context,
notificationId = notificationId,
@@ -659,6 +665,17 @@ internal object PushNotificationManager {
)
}
+ private fun NotificationCompat.Builder.setIconColor(context: Context) = apply {
+ loggingRunCatching {
+ ContextCompat.getColor(context, R.color.mindbox_default_notification_color).takeIf {
+ it != Color.TRANSPARENT
+ }?.let { defaultColor ->
+ setColor(defaultColor)
+ mindboxLogI("Notification color overridden to ${Integer.toHexString(defaultColor)}")
+ }
+ }
+ }
+
private fun getIntent(
context: Context,
activity: Class<*>,
@@ -677,4 +694,4 @@ internal object PushNotificationManager {
`package` = context.packageName
}
-}
+}
\ No newline at end of file
diff --git a/sdk/src/main/res/values/colors.xml b/sdk/src/main/res/values/colors.xml
new file mode 100644
index 000000000..507819734
--- /dev/null
+++ b/sdk/src/main/res/values/colors.xml
@@ -0,0 +1,4 @@
+
+
+ @android:color/transparent
+
\ No newline at end of file
diff --git a/sdk/src/test/java/cloud/mindbox/mobile_sdk/ParseTimeSpanTest.kt b/sdk/src/test/java/cloud/mindbox/mobile_sdk/ParseTimeSpanTest.kt
new file mode 100644
index 000000000..88f16acf2
--- /dev/null
+++ b/sdk/src/test/java/cloud/mindbox/mobile_sdk/ParseTimeSpanTest.kt
@@ -0,0 +1,78 @@
+package cloud.mindbox.mobile_sdk
+
+import org.junit.Assert
+import org.junit.Assert.assertThrows
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@RunWith(Parameterized::class)
+class ParseTimeSpanTest(
+ private val str: String,
+ private val value: Long?
+) {
+
+ companion object {
+ @JvmStatic
+ @Parameterized.Parameters(name = "{index}: string({0}) parse to {1}")
+ fun data(): Iterable> = listOf(
+ arrayOf("6", null),
+ arrayOf("6:12", null),
+ arrayOf("1.6:12", null),
+ arrayOf("1.6:12.1", null),
+ arrayOf("6:12:14:45", null),
+ arrayOf("6:24:14:45", null),
+ arrayOf("6:99:14:45", null),
+ arrayOf("6:00:24:99", null),
+ arrayOf("6:00:99:45", null),
+ arrayOf("6:00:60:45", null),
+ arrayOf("6:00:44:60", null),
+ arrayOf("6:00:44:60", null),
+ arrayOf("6:99:99:99", null),
+ arrayOf("1:1:1:1:1", null),
+ arrayOf("qwe", null),
+ arrayOf("", null),
+ arrayOf("999999999:0:0", null),
+ arrayOf("0:0:0.12345678", null),
+ arrayOf(".0:0:0.1234567", null),
+ arrayOf("0:0:0.", null),
+ arrayOf("0:000:0", null),
+ arrayOf("00:000:00", null),
+ arrayOf("000:00:00", null),
+ arrayOf("00:00:000", null),
+ arrayOf("+0:0:0", null),
+ arrayOf("12345678901234567890.00:00:00.00", null),
+
+ arrayOf("0:0:0.1234567", 123L),
+ arrayOf("0:0:0.1", 100L),
+ arrayOf("0:0:0.01", 10L),
+ arrayOf("0:0:0.001", 1L),
+ arrayOf("0:0:0.0001", 0L),
+ arrayOf("01.01:01:01.10", 90061100L),
+ arrayOf("1.1:1:1.1", 90061100L),
+ arrayOf("1.1:1:1", 90061000L),
+ arrayOf("99.23:59:59", 8639999000L),
+ arrayOf("999.23:59:59", 86399999000L),
+ arrayOf("6:12:14", 22334000L),
+ arrayOf("6.12:14:45", 562485000L),
+ arrayOf("1.00:00:00", 86400000L),
+ arrayOf("0.00:00:00.0", 0L),
+ arrayOf("00:00:00", 0L),
+ arrayOf("0:0:0", 0L),
+ arrayOf("-0:0:0", 0L),
+ arrayOf("-0:0:0.001", -1L),
+ arrayOf("-1.0:0:0", -86400000L),
+ arrayOf("10675199.02:48:05.4775807", 922337203685477L),
+ arrayOf("-10675199.02:48:05.4775808", -922337203685477L),
+ )
+ }
+
+ @Test
+ fun `parseTimeSpanToMillis is valid`() {
+ if (value == null) {
+ assertThrows(IllegalArgumentException::class.java) { str.parseTimeSpanToMillis() }
+ } else {
+ Assert.assertEquals(value, str.parseTimeSpanToMillis())
+ }
+ }
+}
diff --git a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/validators/InAppConfigTtlValidatorTest.kt b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/validators/InAppConfigTtlValidatorTest.kt
index 219c63b36..a9cb3d804 100644
--- a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/validators/InAppConfigTtlValidatorTest.kt
+++ b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/validators/InAppConfigTtlValidatorTest.kt
@@ -1,9 +1,7 @@
package cloud.mindbox.mobile_sdk.inapp.data.validators
-import cloud.mindbox.mobile_sdk.enumValue
import cloud.mindbox.mobile_sdk.inapp.domain.models.InAppTtlData
import cloud.mindbox.mobile_sdk.models.operation.response.TtlDto
-import cloud.mindbox.mobile_sdk.models.operation.response.TtlParametersDto
import cloud.mindbox.mobile_sdk.repository.MindboxPreferences
import io.mockk.every
import io.mockk.mockkObject
@@ -40,7 +38,7 @@ class InAppConfigTtlValidatorTest {
@Test
fun `isValid returns true when TTL has not expired and unit is HOURS`() {
- val mockTtl = TtlDto(TtlParametersDto(unit = "HOURS".enumValue(), value = 1L))
+ val mockTtl = TtlDto(inApps = "01:00:00")
val currentTime = System.currentTimeMillis()
val inAppTtlData = InAppTtlData(shouldCheckInAppTtl = true, ttl = mockTtl)
every { MindboxPreferences.inAppConfigUpdatedTime } returns currentTime - MINUTES_59
@@ -54,7 +52,7 @@ class InAppConfigTtlValidatorTest {
@Test
fun `isValid returns false when TTL has expired and unit is HOURS`() {
- val mockTtl = TtlDto(TtlParametersDto(unit = "HOURS".enumValue(), value = 1L))
+ val mockTtl = TtlDto(inApps = "01:00:00")
val currentTime = System.currentTimeMillis()
val inAppTtlData = InAppTtlData(shouldCheckInAppTtl = true, ttl = mockTtl)
every { MindboxPreferences.inAppConfigUpdatedTime } returns currentTime - MINUTES_61
@@ -68,7 +66,7 @@ class InAppConfigTtlValidatorTest {
@Test
fun `isValid returns true when TTL has not expired and unit is DAYS`() {
- val mockTtl = TtlDto(TtlParametersDto(unit = "DAYS".enumValue(), value = 1L))
+ val mockTtl = TtlDto(inApps = "1.00:00:00")
val currentTime = System.currentTimeMillis()
val inAppTtlData = InAppTtlData(shouldCheckInAppTtl = true, ttl = mockTtl)
every { MindboxPreferences.inAppConfigUpdatedTime } returns currentTime - HOURS_23_MINUTES_59
@@ -82,7 +80,7 @@ class InAppConfigTtlValidatorTest {
@Test
fun `isValid returns false when TTL has expired and unit is DAYS`() {
- val mockTtl = TtlDto(TtlParametersDto(unit = "DAYS".enumValue(), value = 1L))
+ val mockTtl = TtlDto(inApps = "1.00:00:00")
val currentTime = System.currentTimeMillis()
val inAppTtlData = InAppTtlData(shouldCheckInAppTtl = true, ttl = mockTtl)
every { MindboxPreferences.inAppConfigUpdatedTime } returns currentTime - HOURS_24_SECONDS_1
@@ -96,7 +94,7 @@ class InAppConfigTtlValidatorTest {
@Test
fun `isValid returns true when TTL has not expired and unit is MINUTES`() {
- val mockTtl = TtlDto(TtlParametersDto(unit = "MINUTES".enumValue(), value = 1L))
+ val mockTtl = TtlDto(inApps = "00:01:00")
val currentTime = System.currentTimeMillis()
val inAppTtlData = InAppTtlData(shouldCheckInAppTtl = true, ttl = mockTtl)
every { MindboxPreferences.inAppConfigUpdatedTime } returns currentTime - SECONDS_59
@@ -110,7 +108,7 @@ class InAppConfigTtlValidatorTest {
@Test
fun `isValid returns false when TTL has expired and unit is MINUTES`() {
- val mockTtl = TtlDto(TtlParametersDto(unit = "MINUTES".enumValue(), value = 1L))
+ val mockTtl = TtlDto(inApps = "00:01:00")
val currentTime = System.currentTimeMillis()
val inAppTtlData = InAppTtlData(shouldCheckInAppTtl = true, ttl = mockTtl)
every { MindboxPreferences.inAppConfigUpdatedTime } returns currentTime - MINUTES_1_SECOND_1
@@ -124,7 +122,7 @@ class InAppConfigTtlValidatorTest {
@Test
fun `isValid returns true when TTL has not expired and unit is SECONDS`() {
- val mockTtl = TtlDto(TtlParametersDto(unit = "SECONDS".enumValue(), value = 30L))
+ val mockTtl = TtlDto(inApps = "00:00:30")
val currentTime = System.currentTimeMillis()
val inAppTtlData = InAppTtlData(shouldCheckInAppTtl = true, ttl = mockTtl)
every { MindboxPreferences.inAppConfigUpdatedTime } returns currentTime - SECONDS_29
@@ -138,7 +136,7 @@ class InAppConfigTtlValidatorTest {
@Test
fun `isValid returns false when TTL has not expired and unit is SECONDS`() {
- val mockTtl = TtlDto(TtlParametersDto(unit = "SECONDS".enumValue(), value = 30L))
+ val mockTtl = TtlDto(inApps = "00:00:30")
val currentTime = System.currentTimeMillis()
val inAppTtlData = InAppTtlData(shouldCheckInAppTtl = true, ttl = mockTtl)
every { MindboxPreferences.inAppConfigUpdatedTime } returns currentTime - SECONDS_31
@@ -164,7 +162,7 @@ class InAppConfigTtlValidatorTest {
fun `isValid returns true when shouldCheckInAppTtl is false and ttl is not null`() {
val currentTime = System.currentTimeMillis()
- val mockTtl = TtlDto(TtlParametersDto(unit = "SECONDS".enumValue(), value = 1L))
+ val mockTtl = TtlDto(inApps = "00:00:01")
val inAppTtlData = InAppTtlData(shouldCheckInAppTtl = false, ttl = mockTtl)
every { MindboxPreferences.inAppConfigUpdatedTime } returns currentTime
val validator = InAppConfigTtlValidator()
@@ -188,12 +186,7 @@ class InAppConfigTtlValidatorTest {
@Test
fun `isValid returns true if ttl is Long MAX_VALUE `() {
val currentTime = System.currentTimeMillis()
- val mockTtl = TtlDto(
- TtlParametersDto(
- unit = "SECONDS".enumValue(),
- value = Long.MAX_VALUE
- )
- )
+ val mockTtl = TtlDto(inApps = "10675199.02:48:05.4775807")
val inAppTtlData = InAppTtlData(shouldCheckInAppTtl = true, ttl = mockTtl)
val validator = InAppConfigTtlValidator()
every { MindboxPreferences.inAppConfigUpdatedTime } returns currentTime - SECONDS_31
diff --git a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/validators/TtlParametersValidatorTest.kt b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/validators/TtlParametersValidatorTest.kt
index 3b26f8724..02ab6ac7a 100644
--- a/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/validators/TtlParametersValidatorTest.kt
+++ b/sdk/src/test/java/cloud/mindbox/mobile_sdk/inapp/data/validators/TtlParametersValidatorTest.kt
@@ -10,71 +10,63 @@ class TtlParametersValidatorTest {
@Test
fun `isValid returns true for valid unit HOURS and non-negative value`() {
- val validTtl = SettingsDtoBlank.TtlParametersDtoBlank(unit = "HOURS", value = 1L)
+ val validTtl = SettingsDtoBlank.TtlDtoBlank("01:00:00")
assertTrue(validator.isValid(validTtl))
}
@Test
fun `isValid returns true for valid unit DAYS and non-negative value`() {
- val validTtl = SettingsDtoBlank.TtlParametersDtoBlank(unit = "DAYS", value = 1L)
+ val validTtl = SettingsDtoBlank.TtlDtoBlank("1.00:00:00")
assertTrue(validator.isValid(validTtl))
}
@Test
fun `isValid returns true for valid unit MINUTES and non-negative value`() {
- val validTtl = SettingsDtoBlank.TtlParametersDtoBlank(unit = "MINUTES", value = 1L)
+ val validTtl = SettingsDtoBlank.TtlDtoBlank("00:01:00")
assertTrue(validator.isValid(validTtl))
}
@Test
fun `isValid returns true for valid unit SECONDS and non-negative value`() {
- val validTtl = SettingsDtoBlank.TtlParametersDtoBlank(unit = "SECONDS", value = 1L)
+ val validTtl = SettingsDtoBlank.TtlDtoBlank("00:00:01")
assertTrue(validator.isValid(validTtl))
}
@Test
fun `isValid returns false for invalid unit`() {
- val invalidUnitTtl =
- SettingsDtoBlank.TtlParametersDtoBlank(unit = "INVALID_UNIT", value = 1L)
+ val invalidUnitTtl = SettingsDtoBlank.TtlDtoBlank("1:00:00:00")
assertFalse(validator.isValid(invalidUnitTtl))
}
@Test
fun `isValid returns false for negative value`() {
- val negativeValueTtl = SettingsDtoBlank.TtlParametersDtoBlank(unit = "HOURS", value = -1L)
+ val negativeValueTtl = SettingsDtoBlank.TtlDtoBlank("-1:00:00")
assertFalse(validator.isValid(negativeValueTtl))
}
@Test
fun `isValid returns true when value is 0`() {
- val negativeValueTtl = SettingsDtoBlank.TtlParametersDtoBlank(unit = "HOURS", value = 0L)
+ val negativeValueTtl = SettingsDtoBlank.TtlDtoBlank("-00:00:00")
assertTrue(validator.isValid(negativeValueTtl))
}
@Test
- fun `isValid returns false for null unit and value`() {
- val nullTtl = SettingsDtoBlank.TtlParametersDtoBlank(unit = null, value = null)
+ fun `isValid returns false for null value`() {
+ val nullTtl = SettingsDtoBlank.TtlDtoBlank(null)
assertFalse(validator.isValid(nullTtl))
}
@Test
- fun `isValid returns false when unit null and value is valid`() {
- val nullTtl = SettingsDtoBlank.TtlParametersDtoBlank(unit = null, value = 1L)
-
- assertFalse(validator.isValid(nullTtl))
- }
-
- @Test
- fun `isValid returns false when unit is valid and value is null`() {
- val nullTtl = SettingsDtoBlank.TtlParametersDtoBlank(unit = "DAYS", value = null)
+ fun `isValid returns false when ttl is valid string`() {
+ val nullTtl = SettingsDtoBlank.TtlDtoBlank("one day")
assertFalse(validator.isValid(nullTtl))
}