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)) }