diff --git a/kmp-common-sdk b/kmp-common-sdk index bf69265fe..f03f1897a 160000 --- a/kmp-common-sdk +++ b/kmp-common-sdk @@ -1 +1 @@ -Subproject commit bf69265fec8f09bd93d7b8d10eac3a41320591dd +Subproject commit f03f1897a35519502cbe513adc8dc3d4a3a352a9 diff --git a/mindbox-huawei-starter/build.gradle.kts b/mindbox-huawei-starter/build.gradle.kts index 084b0628c..f114e2835 100644 --- a/mindbox-huawei-starter/build.gradle.kts +++ b/mindbox-huawei-starter/build.gradle.kts @@ -10,7 +10,8 @@ android { defaultConfig { consumerProguardFiles( - "consumer-rules.pro" + "consumer-rules.pro", + "../proguard/proguard-huawei.pro" ) } diff --git a/proguard/proguard-huawei.pro b/proguard/proguard-huawei.pro index 7a7ed6b62..cdd68b40f 100644 --- a/proguard/proguard-huawei.pro +++ b/proguard/proguard-huawei.pro @@ -1,6 +1,6 @@ -keepattributes *Annotation* -keepattributes Exceptions --keepattributes InnerClasses +-keepattributes InnerClasses,EnclosingMethod -keepattributes Signature -keepattributes SourceFile,LineNumberTable -keep class com.huawei.hianalytics.**{*;} @@ -8,4 +8,22 @@ -keep class com.huawei.hms.**{*;} -keep class com.huawei.hms.ads.** { *; } -keep interface com.huawei.hms.ads.** { *; } --keep class cloud.mindbox.mindbox_huawei.MindboxHuawei { *; } \ No newline at end of file +-keep class cloud.mindbox.mindbox_huawei.MindboxHuawei { *; } + +-dontwarn android.telephony.HwTelephonyManager +-dontwarn com.huawei.android.os.BuildEx$VERSION +-dontwarn com.huawei.hianalytics.process.HiAnalyticsConfig$Builder +-dontwarn com.huawei.hianalytics.process.HiAnalyticsConfig +-dontwarn com.huawei.hianalytics.process.HiAnalyticsInstance$Builder +-dontwarn com.huawei.hianalytics.process.HiAnalyticsInstance +-dontwarn com.huawei.hianalytics.process.HiAnalyticsManager +-dontwarn com.huawei.hianalytics.util.HiAnalyticTools +-dontwarn com.huawei.hms.availableupdate.UpdateAdapterMgr +-dontwarn com.huawei.libcore.io.ExternalStorageFile +-dontwarn com.huawei.libcore.io.ExternalStorageFileInputStream +-dontwarn com.huawei.libcore.io.ExternalStorageFileOutputStream +-dontwarn com.huawei.libcore.io.ExternalStorageRandomAccessFile +-dontwarn org.bouncycastle.crypto.BlockCipher +-dontwarn org.bouncycastle.crypto.engines.AESEngine +-dontwarn org.bouncycastle.crypto.prng.SP800SecureRandom +-dontwarn org.bouncycastle.crypto.prng.SP800SecureRandomBuilder \ No newline at end of file diff --git a/sdk/consumer-rules.pro b/sdk/consumer-rules.pro index 80767f1d5..77ab8f4ce 100644 --- a/sdk/consumer-rules.pro +++ b/sdk/consumer-rules.pro @@ -1,6 +1,15 @@ -# Keep model classes -keepclassmembers class cloud.mindbox.mobile_sdk.models** { *; } -keep class cloud.mindbox.mobile_sdk.MindboxConfiguration { *; } -keep class cloud.mindbox.mobile_sdk.pushes.PushAction { *; } -keepclassmembers class cloud.mindbox.mobile_sdk.inapp.data.dto.** { *; } -keep class cloud.mindbox.mobile_sdk.inapp.domain.models** { *; } + +-keepclasseswithmembers,allowobfuscation class cloud.mindbox.** { + @com.google.gson.annotations.SerializedName ; + (...); +} + +-keepclassmembers class cloud.mindbox.** { + (...); + ; +} diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/Event.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/Event.kt index 567d05ff4..970c20bbd 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/Event.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/models/Event.kt @@ -3,6 +3,7 @@ package cloud.mindbox.mobile_sdk.models import androidx.room.Entity import androidx.room.PrimaryKey import cloud.mindbox.mobile_sdk.managers.DbManager.EVENTS_TABLE_NAME +import com.google.gson.annotations.SerializedName import com.google.gson.reflect.TypeToken import java.util.UUID @@ -18,7 +19,10 @@ internal data class Event( val body: String? = null, ) -internal sealed class EventType(val operation: String, val endpoint: String) { +internal sealed class EventType( + @SerializedName("operation") val operation: String, + @SerializedName("endpoint") val endpoint: String, +) { companion object { diff --git a/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/handler/MessageHandlingState.kt b/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/handler/MessageHandlingState.kt index c3cde01d2..3c84e86b1 100644 --- a/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/handler/MessageHandlingState.kt +++ b/sdk/src/main/java/cloud/mindbox/mobile_sdk/pushes/handler/MessageHandlingState.kt @@ -1,5 +1,7 @@ package cloud.mindbox.mobile_sdk.pushes.handler +import com.google.gson.annotations.SerializedName + /** * Current conditions under which the image is loaded * @@ -7,6 +9,8 @@ package cloud.mindbox.mobile_sdk.pushes.handler * @param isMessageDisplayed The message has been shown */ public data class MessageHandlingState( + @SerializedName("attemptNumber") val attemptNumber: Int, + @SerializedName("isMessageDisplayed") val isMessageDisplayed: Boolean, ) diff --git a/sdk/src/test/java/cloud/mindbox/mobile_sdk/converters/MindboxRoomConverterTest.kt b/sdk/src/test/java/cloud/mindbox/mobile_sdk/converters/MindboxRoomConverterTest.kt new file mode 100644 index 000000000..40dd8f24f --- /dev/null +++ b/sdk/src/test/java/cloud/mindbox/mobile_sdk/converters/MindboxRoomConverterTest.kt @@ -0,0 +1,36 @@ +package cloud.mindbox.mobile_sdk.converters + +import cloud.mindbox.mobile_sdk.models.EventType +import org.junit.Assert.assertEquals +import org.junit.Test + +// Events queued by earlier SDK versions sit in the database in this format and must still be readable. +class MindboxRoomConverterTest { + + @Test + fun eventTypeToString_writesOrdinalAndJsonNames() { + val stored = MindboxRoomConverter.eventTypeToString(EventType.SyncOperation("Website.Operation")) + + assertEquals("""6;{"operation":"Website.Operation","endpoint":"/v3/operations/sync"}""", stored) + } + + @Test + fun stringToEventType_readsStoredOperation() { + val eventType = MindboxRoomConverter.stringToEventType( + """5;{"operation":"Website.Operation","endpoint":"/v3/operations/async"}""" + ) + + assertEquals(EventType.AsyncOperation::class, eventType::class) + assertEquals("Website.Operation", eventType.operation) + assertEquals("/v3/operations/async", eventType.endpoint) + } + + @Test + fun stringToEventType_readsStoredDataObject() { + val eventType = MindboxRoomConverter.stringToEventType( + """0;{"operation":"MobilePush.ApplicationInstalled","endpoint":"/v3/operations/async"}""" + ) + + assertEquals(EventType.AppInstalled, eventType) + } +}