diff --git a/android/src/androidTest/java/com/formbricks/android/FormbricksInstrumentedTest.kt b/android/src/androidTest/java/com/formbricks/android/FormbricksInstrumentedTest.kt index 4f4ee70..8a7b1d5 100644 --- a/android/src/androidTest/java/com/formbricks/android/FormbricksInstrumentedTest.kt +++ b/android/src/androidTest/java/com/formbricks/android/FormbricksInstrumentedTest.kt @@ -125,7 +125,7 @@ class FormbricksInstrumentedTest { assertNotNull("Should have click_demo_button action class", clickDemoButtonAction) val triggers = firstSurveyBeforeTrack?.triggers ?: listOf() - val matchingTrigger = triggers.firstOrNull { it.actionClass?.id == clickDemoButtonAction?.id } + val matchingTrigger = triggers.firstOrNull { it.actionClass?.name == clickDemoButtonAction?.name } assertNotNull("Survey should have matching trigger", matchingTrigger) // Now track the event diff --git a/android/src/androidTest/java/com/formbricks/android/manager/SurveyManagerInstrumentedTest.kt b/android/src/androidTest/java/com/formbricks/android/manager/SurveyManagerInstrumentedTest.kt index 3079afd..9d4b56f 100644 --- a/android/src/androidTest/java/com/formbricks/android/manager/SurveyManagerInstrumentedTest.kt +++ b/android/src/androidTest/java/com/formbricks/android/manager/SurveyManagerInstrumentedTest.kt @@ -1,7 +1,6 @@ package com.formbricks.android.manager import androidx.test.ext.junit.runners.AndroidJUnit4 -import com.formbricks.android.Formbricks import com.formbricks.android.model.environment.* import com.formbricks.android.model.user.Display import org.junit.Assert.* @@ -9,7 +8,6 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import java.util.Date -import java.util.concurrent.TimeUnit @RunWith(AndroidJUnit4::class) class SurveyManagerInstrumentedTest { diff --git a/android/src/main/java/com/formbricks/android/manager/SurveyManager.kt b/android/src/main/java/com/formbricks/android/manager/SurveyManager.kt index 9d151c6..6813f41 100644 --- a/android/src/main/java/com/formbricks/android/manager/SurveyManager.kt +++ b/android/src/main/java/com/formbricks/android/manager/SurveyManager.kt @@ -7,10 +7,13 @@ import com.formbricks.android.extensions.expiresAt import com.formbricks.android.extensions.guard import com.formbricks.android.logger.Logger import com.formbricks.android.model.environment.EnvironmentDataHolder +import com.formbricks.android.model.environment.SegmentFilterResource +import com.formbricks.android.model.environment.SegmentFilterResourceDeserializer import com.formbricks.android.model.environment.Survey import com.formbricks.android.model.error.SDKError import com.formbricks.android.model.user.Display import com.google.gson.Gson +import com.google.gson.GsonBuilder import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -36,6 +39,16 @@ object SurveyManager { private val prefManager by lazy { Formbricks.applicationContext.getSharedPreferences(FORMBRICKS_PREFS, Context.MODE_PRIVATE) } internal var filteredSurveys: MutableList = mutableListOf() + // 1) Build your Gson once, registering only the SegmentFilterResource adapter: + val gson = GsonBuilder() + .registerTypeAdapter( + SegmentFilterResource::class.java, + SegmentFilterResourceDeserializer() + ) + .create() + + + private var environmentDataHolderJson: String? get() { return prefManager.getString(PREF_FORMBRICKS_DATA_HOLDER, "") @@ -57,7 +70,7 @@ object SurveyManager { synchronized(this) { backingEnvironmentDataHolder = environmentDataHolderJson?.let { json -> try { - Gson().fromJson(json, EnvironmentDataHolder::class.java) + gson.fromJson(json, EnvironmentDataHolder::class.java) } catch (e: Exception) { Logger.e(RuntimeException("Unable to retrieve environment data from the local storage.")) null diff --git a/android/src/main/java/com/formbricks/android/model/environment/ActionClassReference.kt b/android/src/main/java/com/formbricks/android/model/environment/ActionClassReference.kt index e299d74..712ee28 100644 --- a/android/src/main/java/com/formbricks/android/model/environment/ActionClassReference.kt +++ b/android/src/main/java/com/formbricks/android/model/environment/ActionClassReference.kt @@ -5,6 +5,5 @@ import kotlinx.serialization.Serializable @Serializable data class ActionClassReference( - @SerializedName("id") val id: String?, @SerializedName("name") val name: String? ) \ No newline at end of file diff --git a/android/src/main/java/com/formbricks/android/model/environment/SegmentFilterResourceDeserializer.kt b/android/src/main/java/com/formbricks/android/model/environment/SegmentFilterResourceDeserializer.kt new file mode 100644 index 0000000..9fbca43 --- /dev/null +++ b/android/src/main/java/com/formbricks/android/model/environment/SegmentFilterResourceDeserializer.kt @@ -0,0 +1,25 @@ +package com.formbricks.android.model.environment + +import com.google.gson.* +import com.google.gson.reflect.TypeToken +import java.lang.reflect.Type + +class SegmentFilterResourceDeserializer : JsonDeserializer { + override fun deserialize( + json: JsonElement, + typeOfT: Type, + context: JsonDeserializationContext + ): SegmentFilterResource { + return if (json.isJsonArray) { + // JSON is an array → treat it as a Group + val listType = object : TypeToken>() {}.type + val filters: List = context.deserialize(json, listType) + SegmentFilterResource.Group(filters) + } else { + // JSON is an object → treat it as a Primitive + val prim: SegmentPrimitiveFilter = + context.deserialize(json, SegmentPrimitiveFilter::class.java) + SegmentFilterResource.Primitive(prim) + } + } +} diff --git a/sonar-project.properties b/sonar-project.properties index 0f4e603..86e5641 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -25,6 +25,7 @@ sonar.coverage.exclusions=**/test/**/*,**/androidTest/**/*,**/*.js,**/*.json,\ **/*_Factory.kt,\ **/*_MembersInjector.kt,\ **/FormbricksAPIError.kt,\ + **/network/FormbricksService.kt,\ **/Logger.kt,\ **/Guard.kt,\ **/DateExtensions.kt,\