@@ -5,6 +5,7 @@ import cloud.mindbox.mobile_sdk.Mindbox
55import cloud.mindbox.mobile_sdk.MindboxConfiguration
66import cloud.mindbox.mobile_sdk.inapp.domain.InAppRepository
77import cloud.mindbox.mobile_sdk.inapp.mapper.InAppMessageMapper
8+ import cloud.mindbox.mobile_sdk.inapp.presentation.InAppMessageManager
89import cloud.mindbox.mobile_sdk.logger.MindboxLogger
910import cloud.mindbox.mobile_sdk.logger.MindboxLoggerImpl
1011import cloud.mindbox.mobile_sdk.managers.GatewayManager
@@ -13,13 +14,16 @@ import cloud.mindbox.mobile_sdk.models.InAppConfig
1314import cloud.mindbox.mobile_sdk.models.InAppEventType
1415import cloud.mindbox.mobile_sdk.models.SegmentationCheckInApp
1516import cloud.mindbox.mobile_sdk.models.operation.request.InAppHandleRequest
17+ import cloud.mindbox.mobile_sdk.models.operation.response.FormDto
1618import cloud.mindbox.mobile_sdk.models.operation.response.InAppConfigResponse
19+ import cloud.mindbox.mobile_sdk.models.operation.response.InAppConfigResponseBlank
1720import cloud.mindbox.mobile_sdk.models.operation.response.PayloadDto
1821import cloud.mindbox.mobile_sdk.repository.MindboxPreferences
1922import cloud.mindbox.mobile_sdk.utils.LoggingExceptionHandler
2023import cloud.mindbox.mobile_sdk.utils.RuntimeTypeAdapterFactory
2124import com.google.gson.Gson
2225import com.google.gson.GsonBuilder
26+ import com.google.gson.JsonObject
2327import com.google.gson.reflect.TypeToken
2428import kotlinx.coroutines.flow.Flow
2529import kotlinx.coroutines.flow.map
@@ -84,20 +88,76 @@ internal class InAppRepositoryImpl : InAppRepository {
8488 }
8589
8690 override fun listenInAppConfig (): Flow <InAppConfig ?> {
87- return MindboxPreferences .inAppConfigFlow.map { inAppConfigDto ->
88- val config = inAppMapper.mapInAppConfigResponseToInAppConfig(
89- GsonBuilder ().registerTypeAdapterFactory(RuntimeTypeAdapterFactory .of(
90- PayloadDto ::class .java,
91- TYPE_JSON_NAME )
92- .registerSubtype(PayloadDto .SimpleImage ::class .java,
93- SIMPLE_IMAGE_JSON_NAME ))
94- .create()
95- .fromJson(inAppConfigDto,
96- InAppConfigResponse ::class .java)
91+ return MindboxPreferences .inAppConfigFlow.map { inAppConfigString ->
92+ MindboxLoggerImpl .d(
93+ parent = this @InAppRepositoryImpl,
94+ message = " CachedConfig : $inAppConfigString "
9795 )
98- MindboxLoggerImpl .d(this , " Providing config: $config " )
99- config
96+ val configBlank = deserializeToConfigDtoBlank(inAppConfigString)
97+ val filteredInApps = configBlank?.inApps
98+ ?.filter { validateInAppVersion(it) }
99+ ?.map { inAppDtoBlank ->
100+ inAppMapper.mapToInAppDto(
101+ inAppDtoBlank = inAppDtoBlank,
102+ formDto = deserializeToInAppFormDto(inAppDtoBlank.form),
103+ )
104+ }
105+ val filteredConfig = InAppConfigResponse (
106+ inApps = filteredInApps
107+ )
108+ return @map inAppMapper.mapInAppConfigResponseToInAppConfig(filteredConfig).also { inAppConfig ->
109+ MindboxLoggerImpl .d(
110+ parent = this @InAppRepositoryImpl,
111+ message = " Providing config: $inAppConfig "
112+ )
113+ }
114+ }
115+ }
116+
117+ private fun deserializeToConfigDtoBlank (inAppConfig : String ): InAppConfigResponseBlank ? {
118+ val result = runCatching {
119+ gson.fromJson(inAppConfig, InAppConfigResponseBlank ::class .java)
100120 }
121+ result.exceptionOrNull()?.let { error ->
122+ MindboxLoggerImpl .e(
123+ parent = this @InAppRepositoryImpl,
124+ message = " Failed to parse inAppConfig: $inAppConfig " ,
125+ exception = error
126+ )
127+ }
128+ return result.getOrNull()
129+ }
130+
131+ private fun deserializeToInAppFormDto (inAppForm : JsonObject ? ): FormDto ? {
132+ val result = runCatching {
133+ GsonBuilder ().registerTypeAdapterFactory(RuntimeTypeAdapterFactory .of(
134+ PayloadDto ::class .java,
135+ TYPE_JSON_NAME )
136+ .registerSubtype(PayloadDto .SimpleImage ::class .java,
137+ SIMPLE_IMAGE_JSON_NAME ))
138+ .create()
139+ .fromJson(inAppForm,
140+ FormDto ::class .java)
141+ }
142+ result.exceptionOrNull()?.let { error ->
143+ MindboxLoggerImpl .e(
144+ parent = this @InAppRepositoryImpl,
145+ message = " Failed to parse JsonObject: $inAppForm " ,
146+ exception = error
147+ )
148+ }
149+ return result.getOrNull()
150+ }
151+
152+ private fun validateInAppVersion (inAppDto : InAppConfigResponseBlank .InAppDtoBlank ): Boolean {
153+ val sdkVersion = inAppDto.sdkVersion ? : return false
154+ val minVersionValid = sdkVersion.minVersion?.let { min ->
155+ min <= InAppMessageManager .CURRENT_IN_APP_VERSION
156+ } ? : true
157+ val maxVersionValid = sdkVersion.maxVersion?.let { max ->
158+ max >= InAppMessageManager .CURRENT_IN_APP_VERSION
159+ } ? : true
160+ return minVersionValid && maxVersionValid
101161 }
102162
103163 companion object {
0 commit comments