TP-76272 | Common deserializers and serializers for home (#11994)

This commit is contained in:
Naman Khurmi
2024-08-06 15:42:13 +05:30
committed by GitHub
parent 52f324539c
commit ced5ee43c0
17 changed files with 181 additions and 193 deletions

View File

@@ -11,12 +11,13 @@ import com.google.gson.JsonDeserializationContext
import com.google.gson.JsonElement
import com.navi.common.uitron.deserializer.CustomWidgetUiTronDataDeserializer
import com.navi.naviwidgets.utils.VIEW_TYPE
import com.navi.uitron.model.data.EmptyData
import com.navi.uitron.model.data.UiTronData
import com.naviapp.home.compose.model.ProfileHeaderWidgetData
import com.naviapp.home.model.HomeScreenCustomWidgetType
import com.naviapp.home.model.HomeCustomWidgetType
import java.lang.reflect.Type
class CustomHomeWidgetDataDeSerializer : CustomWidgetUiTronDataDeserializer() {
class HomeCustomWidgetDataDeSerializer : CustomWidgetUiTronDataDeserializer() {
override fun deserialize(
json: JsonElement?,
typeOfT: Type?,
@@ -26,8 +27,11 @@ class CustomHomeWidgetDataDeSerializer : CustomWidgetUiTronDataDeserializer() {
val jsonObject = it.asJsonObject
if (jsonObject[VIEW_TYPE] == null) return null
return when (jsonObject[VIEW_TYPE].asString) {
HomeScreenCustomWidgetType.PROFILE_HEADER_WIDGET.name ->
HomeCustomWidgetType.ProfileHeaderWidget.value ->
context?.deserialize(json, ProfileHeaderWidgetData::class.java)
HomeCustomWidgetType.ScrollFadingWidget.value,
HomeCustomWidgetType.RotatingView.value ->
context?.deserialize(json, EmptyData::class.java)
else -> super.deserialize(json, typeOfT, context)
}
}

View File

@@ -10,23 +10,27 @@ package com.naviapp.common.serializer
import com.google.gson.JsonElement
import com.google.gson.JsonSerializationContext
import com.navi.common.uitron.serializer.CommonUiTronDataSerializer
import com.navi.uitron.model.data.EmptyData
import com.navi.uitron.model.data.UiTronData
import com.naviapp.home.compose.model.ProfileHeaderWidgetData
import com.naviapp.home.model.HomeScreenCustomWidgetType
import com.naviapp.home.model.HomeCustomWidgetType
import java.lang.reflect.Type
class CustomHomeWidgetDataSerializer : CommonUiTronDataSerializer() {
class HomeCustomWidgetDataSerializer : CommonUiTronDataSerializer() {
override fun serialize(
src: UiTronData?,
typeOfSrc: Type?,
context: JsonSerializationContext?
): JsonElement? {
return when (src?.viewType) {
HomeScreenCustomWidgetType.PROFILE_HEADER_WIDGET.name ->
HomeCustomWidgetType.ProfileHeaderWidget.value ->
context?.serialize(
src as ProfileHeaderWidgetData,
ProfileHeaderWidgetData::class.java
)
HomeCustomWidgetType.ScrollFadingWidget.value,
HomeCustomWidgetType.RotatingView.value ->
context?.serialize(src as EmptyData, EmptyData::class.java)
else -> super.serialize(src, typeOfSrc, context)
}
}

View File

@@ -16,7 +16,7 @@ import com.navi.uitron.model.UiTronResponse
import com.navi.uitron.render.UiTronRenderer
import com.naviapp.forge.model.WidgetModelDefinition
import com.naviapp.forge.model.WidgetTypes
import com.naviapp.home.model.HomeScreenCustomWidgetType
import com.naviapp.home.model.HomeCustomWidgetType
import com.naviapp.home.viewmodel.ProfileVM
@OptIn(ExperimentalMaterial3Api::class)
@@ -38,9 +38,9 @@ fun ProfileScreenWidgetRenderer(
}
WidgetTypes.NATIVE_WIDGET.name -> {
when (widget.widgetName) {
HomeScreenCustomWidgetType.PROFILE_HEADER_WIDGET.name ->
HomeCustomWidgetType.ProfileHeaderWidget.value ->
AnimatedProfileContent(widget, viewModel, drawerState)
HomeScreenCustomWidgetType.UPI_SETTINGS_WIDGET.name -> UPISettingSDK(drawerState)
HomeCustomWidgetType.UpiSettingsWidget.value -> UPISettingSDK(drawerState)
else -> Unit
}
}

View File

@@ -13,7 +13,7 @@ import com.navi.common.uitron.deserializer.CommonUiTronPropertyDeserializer
import com.navi.uitron.model.ui.BaseProperty
import com.naviapp.home.compose.uiTron.model.viewProperties.RotatingViewProperty
import com.naviapp.home.compose.uiTron.model.viewProperties.ScrollFadingCardProperty
import com.naviapp.home.model.HomeScreenCustomWidgetType
import com.naviapp.home.model.HomeCustomWidgetType
import java.lang.reflect.Type
class HomeUitronPropertyDeserializer : CommonUiTronPropertyDeserializer() {
@@ -27,10 +27,10 @@ class HomeUitronPropertyDeserializer : CommonUiTronPropertyDeserializer() {
val jsonObject = it.asJsonObject
if (jsonObject["viewType"] == null) return null
return when (jsonObject["viewType"].asString) {
HomeScreenCustomWidgetType.RotatingView.name -> {
HomeCustomWidgetType.RotatingView.value -> {
context?.deserialize(jsonObject, RotatingViewProperty::class.java)
}
HomeScreenCustomWidgetType.ScrollFadingWidget.name -> {
HomeCustomWidgetType.ScrollFadingWidget.value -> {
context?.deserialize(jsonObject, ScrollFadingCardProperty::class.java)
}
else -> super.deserialize(json, typeOfT, context)

View File

@@ -13,7 +13,7 @@ import com.navi.common.uitron.serializer.CommonUiTronPropertySerializer
import com.navi.uitron.model.ui.BaseProperty
import com.naviapp.home.compose.uiTron.model.viewProperties.RotatingViewProperty
import com.naviapp.home.compose.uiTron.model.viewProperties.ScrollFadingCardProperty
import com.naviapp.home.model.HomeScreenCustomWidgetType
import com.naviapp.home.model.HomeCustomWidgetType
import java.lang.reflect.Type
class HomeUitronPropertySerializer : CommonUiTronPropertySerializer() {
@@ -23,10 +23,10 @@ class HomeUitronPropertySerializer : CommonUiTronPropertySerializer() {
context: JsonSerializationContext?
): JsonElement? {
return when (src?.viewType) {
HomeScreenCustomWidgetType.RotatingView.name -> {
HomeCustomWidgetType.RotatingView.value -> {
context?.serialize(src as RotatingViewProperty, RotatingViewProperty::class.java)
}
HomeScreenCustomWidgetType.ScrollFadingWidget.name -> {
HomeCustomWidgetType.ScrollFadingWidget.value -> {
context?.serialize(
src as ScrollFadingCardProperty,
ScrollFadingCardProperty::class.java

View File

@@ -20,7 +20,7 @@ import com.navi.uitron.render.UiTronRenderer
import com.navi.uitron.viewmodel.UiTronViewModel
import com.naviapp.home.compose.uiTron.model.viewProperties.RotatingViewProperty
import com.naviapp.home.compose.uiTron.model.viewProperties.ScrollFadingCardProperty
import com.naviapp.home.model.HomeScreenCustomWidgetType
import com.naviapp.home.model.HomeCustomWidgetType
class HomeCustomUiTronRenderer(private val homeScrollState: () -> ScrollState) :
CommonCustomUiTronRenderer() {
@@ -33,7 +33,7 @@ class HomeCustomUiTronRenderer(private val homeScrollState: () -> ScrollState) :
uiTronViewModel: UiTronViewModel
) {
when (composeView.property?.viewType) {
HomeScreenCustomWidgetType.RotatingView.name -> {
HomeCustomWidgetType.RotatingView.value -> {
(composeView.property as? RotatingViewProperty)?.let {
RotatingViewRenderer(
childrenComposeViews = composeView.childrenViews.orEmpty(),
@@ -53,7 +53,7 @@ class HomeCustomUiTronRenderer(private val homeScrollState: () -> ScrollState) :
)
}
}
HomeScreenCustomWidgetType.ScrollFadingWidget.name -> {
HomeCustomWidgetType.ScrollFadingWidget.value -> {
(composeView.property as? ScrollFadingCardProperty)?.let {
ScrollFadingCardRenderer(
childrenComposeViews = composeView.childrenViews.orEmpty(),

View File

@@ -0,0 +1,20 @@
/*
*
* * Copyright © 2024 by Navi Technologies Limited
* * All rights reserved. Strictly confidential
*
*/
package com.naviapp.home.model
import com.naviapp.utils.Constants.HomeCustomWidgetConstants.PROFILE_HEADER_WIDGET
import com.naviapp.utils.Constants.HomeCustomWidgetConstants.ROTATING_VIEW
import com.naviapp.utils.Constants.HomeCustomWidgetConstants.SCROLL_FADING_WIDGET
import com.naviapp.utils.Constants.HomeCustomWidgetConstants.UPI_SETTINGS_WIDGET
enum class HomeCustomWidgetType(val value: String) {
ProfileHeaderWidget(PROFILE_HEADER_WIDGET),
UpiSettingsWidget(UPI_SETTINGS_WIDGET),
RotatingView(ROTATING_VIEW),
ScrollFadingWidget(SCROLL_FADING_WIDGET)
}

View File

@@ -1,15 +0,0 @@
/*
*
* * Copyright © 2024 by Navi Technologies Limited
* * All rights reserved. Strictly confidential
*
*/
package com.naviapp.home.model
enum class HomeScreenCustomWidgetType {
PROFILE_HEADER_WIDGET,
UPI_SETTINGS_WIDGET,
RotatingView,
ScrollFadingWidget
}

View File

@@ -94,7 +94,8 @@ import com.naviapp.home.model.HomeCtaTypes
import com.naviapp.home.respository.HomeRepository
import com.naviapp.home.ui.state.HomeScreenState
import com.naviapp.models.response.HomeFeatureResponse
import com.naviapp.network.util.getGsonBuilderForWidgetizedResponse
import com.naviapp.network.di.DataDeserializers
import com.naviapp.network.di.DataSerializers
import com.naviapp.nux.handler.NewUserExperienceHandler
import com.naviapp.part_prepayment.PartPrePaymentActivity
import com.naviapp.payment.activities.NaviPaymentActivity
@@ -109,7 +110,6 @@ import com.naviapp.utils.Constants.Notification.SHOW_NOTIFICATION_COUNT
import com.naviapp.utils.Constants.OFFER_VIEWED
import com.naviapp.utils.LOAN_ACCOUNT_NUMBER
import com.naviapp.utils.NOTIFICATION_PERMISSION_SHOWN
import com.naviapp.utils.naviAppSerializerGsonBuilder
import dagger.Lazy
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@@ -135,7 +135,8 @@ class HomeVM
constructor(
private val repository: HomeRepository,
private val lottieRemoteHelper: LottieRemoteHelper,
private val gson: Gson,
@DataDeserializers private val dataDeserializers: Gson,
@DataSerializers private val dataSerializers: Gson,
private val naviCacheRepository: NaviCacheRepositoryImpl,
private val connectivityObserver: ConnectivityObserver,
private val naviPayCustomerStatusHandler: NaviPayCustomerStatusHandler,
@@ -402,14 +403,18 @@ constructor(
handleActionsFromJson(
actionsString = uiTronActionHandler?.actionsString ?: "",
variableMap = uiTronActionHandler?.variableMap ?: emptyMap(),
gson = gson
gson = dataDeserializers
)
}
fun triggerOnHiddenUiTronActionList() {
try {
getHomeScreenData()?.extraData?.onHiddenUiTronActionList?.forEach {
handleActionsFromJson(actionsString = it, variableMap = emptyMap(), gson = gson)
handleActionsFromJson(
actionsString = it,
variableMap = emptyMap(),
gson = dataDeserializers
)
}
} catch (e: Exception) {
e.log()
@@ -447,18 +452,21 @@ constructor(
version = BuildConfig.VERSION_CODE
)
)
deserializeWidgetResponseString(response = getHomeTabFromDatabase())?.let {
responseData ->
homePageDataUpdateHandler.updateHomePageData(
responseData,
::updateHomePageSuccess
)
_homeScreenExtraData.emit(HomePageExtraData(responseData.extraData))
_showFabButton.update {
responseData.extraData?.fabButtonData?.isVisible ?: true
dataDeserializers
.fromJson(getHomeTabFromDatabase()?.value, WidgetResponse::class.java)
.let { responseData ->
homePageDataUpdateHandler.updateHomePageData(
responseData,
::updateHomePageSuccess
)
_homeScreenExtraData.emit(HomePageExtraData(responseData.extraData))
_showFabButton.update {
responseData.extraData?.fabButtonData?.isVisible ?: true
}
selectiveRefreshHandler.handleSuccessState(this@HomeVM)
}
selectiveRefreshHandler.handleSuccessState(this@HomeVM)
}
updateApiTsForHomePage()
getHomeTabFromDatabase()?.updatedAt?.let { timestamp ->
@@ -500,41 +508,46 @@ constructor(
emitMultipleValues = true,
)
.collect { response ->
deserializeWidgetResponseString(response.data)?.let { widgetResponse ->
try {
if (
showLoader.not() &&
getHomeScreenData().isNotNull() &&
response.data?.value == homeTabFromDatabase?.value
) {
updateCachedResponse(true)
} else {
if (response.isCurrentAndAltDataSame.orFalse().not()) {
homePageDataUpdateHandler.updateHomePageData(
widgetResponse,
::updateHomePageSuccess
)
_homeScreenExtraData.emit(
HomePageExtraData(widgetResponse.extraData)
)
_showFabButton.update {
widgetResponse.extraData?.fabButtonData?.isVisible
?: true
dataDeserializers
.fromJson(response.data?.value, WidgetResponse::class.java)
.let { widgetResponse ->
try {
if (
showLoader.not() &&
getHomeScreenData().isNotNull() &&
response.data?.value == homeTabFromDatabase?.value
) {
updateCachedResponse(true)
} else {
if (response.isCurrentAndAltDataSame.orFalse().not()) {
homePageDataUpdateHandler.updateHomePageData(
widgetResponse,
::updateHomePageSuccess
)
_homeScreenExtraData.emit(
HomePageExtraData(widgetResponse.extraData)
)
_showFabButton.update {
widgetResponse.extraData
?.fabButtonData
?.isVisible ?: true
}
updateApiTsForHomePage()
response.data?.updatedAt?.let { timestamp ->
homeTabLastUpdateTimestamp = timestamp
}
preCacheLottieUrls(widgetResponse)
}
updateApiTsForHomePage()
response.data?.updatedAt?.let { timestamp ->
homeTabLastUpdateTimestamp = timestamp
if (response.isComingFromAltSource.orFalse()) {
selectiveRefreshHandler.handleSuccessState(
this@HomeVM
)
}
preCacheLottieUrls(widgetResponse)
}
if (response.isComingFromAltSource.orFalse()) {
selectiveRefreshHandler.handleSuccessState(this@HomeVM)
}
} catch (e: Exception) {
e.log()
}
} catch (e: Exception) {
e.log()
}
}
}
Timber.d("Home page refresh job Ended")
}
@@ -549,9 +562,6 @@ constructor(
fun getHomeContentList() = homePageDataUpdateHandler.getHomeContentList()
private fun deserializeWidgetResponseString(response: NaviCacheEntity?): WidgetResponse? =
getGsonBuilderForWidgetizedResponse().fromJson(response?.value, WidgetResponse::class.java)
private suspend fun getHomeTabFromDatabase(): NaviCacheEntity? =
naviCacheRepository.get(NaviSharedDbKeys.HOME_TAB.name)
@@ -646,7 +656,7 @@ constructor(
return NaviCacheAltSourceEntity(isSuccess = false)
}
return NaviCacheAltSourceEntity(
value = naviAppSerializerGsonBuilder().toJson(response.data),
value = dataSerializers.toJson(response.data),
version = BuildConfig.VERSION_CODE,
isSuccess = true
)

View File

@@ -8,6 +8,7 @@
package com.naviapp.home.viewmodel
import androidx.lifecycle.viewModelScope
import com.google.gson.Gson
import com.navi.base.cache.model.NaviCacheEntity
import com.navi.base.cache.repository.NaviCacheRepository
import com.navi.base.cache.util.NaviSharedDbKeys
@@ -26,8 +27,8 @@ import com.navi.uitron.model.data.UiTronActionData
import com.naviapp.forge.model.ScreenDefinition
import com.naviapp.home.respository.ProfileRepository
import com.naviapp.home.ui.state.ProfileScreenState
import com.naviapp.utils.naviAppDeserializerGsonBuilder
import com.naviapp.utils.naviAppSerializerGsonBuilder
import com.naviapp.network.di.DataDeserializers
import com.naviapp.network.di.DataSerializers
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
import kotlinx.coroutines.Dispatchers
@@ -43,7 +44,9 @@ class ProfileVM
@Inject
constructor(
private val repository: ProfileRepository,
private val naviCacheRepository: NaviCacheRepository
private val naviCacheRepository: NaviCacheRepository,
@DataDeserializers private val dataDeserializers: Gson,
@DataSerializers private val dataSerializers: Gson
) : BaseVM() {
private val _profileScreenDataState =
@@ -128,7 +131,7 @@ constructor(
naviCacheRepository.get(key = NaviSharedDbKeys.NAVI_APP_PROFILE.keyName)
if (profilePageResponse?.value != null) {
cacheResponse =
naviAppDeserializerGsonBuilder.fromJson(
dataDeserializers.fromJson(
profilePageResponse.value,
ScreenDefinition::class.java
)
@@ -145,7 +148,7 @@ constructor(
naviCacheRepository.save(
NaviCacheEntity(
key = NaviSharedDbKeys.NAVI_APP_PROFILE.keyName,
value = naviAppSerializerGsonBuilder().toJson(response.data),
value = dataSerializers.toJson(response.data),
version = 1
)
)

View File

@@ -14,6 +14,10 @@ import com.navi.base.utils.BaseUtils
import com.navi.common.model.NetworkInfo
import com.navi.common.network.converter.EmptyBodyHandlingConverterFactory
import com.navi.common.network.requestmanager.PriorityRequestManagerFacade
import com.navi.common.uitron.model.action.UploadDataConfig
import com.navi.common.uitron.serializer.UiTronActionSerializer
import com.navi.common.uitron.serializer.UiTronTriggerApiActionSerializer
import com.navi.common.uitron.serializer.UiTronUploadDataSerializer
import com.navi.naviwidgets.WidgetDataDeserializer
import com.navi.naviwidgets.models.GenericWidgetDataInfo
import com.navi.naviwidgets.models.NaviWidget
@@ -21,17 +25,28 @@ import com.navi.naviwidgets.models.ParameterValue
import com.navi.naviwidgets.validations.BaseInputValidation
import com.navi.naviwidgets.validations.ValidationJsonDeserializer
import com.navi.naviwidgets.widgets.NaviWidgetJsonDeserializer
import com.navi.naviwidgets.widgets.NaviWidgetJsonSerializer
import com.navi.naviwidgets.widgets.ParameterValueJsonDeserializer
import com.navi.pay.common.utils.DateTimeConverterAdapter
import com.navi.uitron.deserializer.animationsDeserializers.AnimationSpecDeserializer
import com.navi.uitron.deserializer.animationsDeserializers.PropertyAnimatorDeserializer
import com.navi.uitron.model.action.TriggerApiAction
import com.navi.uitron.model.animations.AnimationSpec
import com.navi.uitron.model.animations.PropertyAnimator
import com.navi.uitron.model.data.UiTronAction
import com.navi.uitron.model.data.UiTronData
import com.navi.uitron.model.ui.BaseProperty
import com.navi.uitron.model.visualtransformation.VisualTransformationData
import com.navi.uitron.serializer.UiTronValidationSerializer
import com.navi.uitron.serializer.VisualTransformationDataSerializer
import com.navi.uitron.serializer.animationsSerializers.AnimationSpecSerializer
import com.navi.uitron.serializer.animationsSerializers.PropertyAnimatorSerializer
import com.naviapp.BuildConfig
import com.naviapp.app.NaviApplication
import com.naviapp.common.deserializer.CustomHomeWidgetDataDeSerializer
import com.naviapp.common.deserializer.HomeCustomWidgetDataDeSerializer
import com.naviapp.common.serializer.HomeCustomWidgetDataSerializer
import com.naviapp.home.compose.uiTron.model.deserializer.HomeUitronPropertyDeserializer
import com.naviapp.home.compose.uiTron.model.serializer.HomeUitronPropertySerializer
import com.naviapp.models.response.WidgetConfig
import com.naviapp.network.retrofit.NaviHttpClient
import com.naviapp.network.retrofit.RetrofitService
@@ -44,6 +59,7 @@ import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
import org.joda.time.DateTime
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
@@ -81,6 +97,7 @@ object NetworkModule {
fun providesOkHttpClientForFeeds(@FeedsRetroFit networkInfo: NetworkInfo): NaviHttpClient =
NaviHttpClient(networkInfo, NaviApplication.instance.applicationContext)
@DataDeserializers
@Singleton
@Provides
fun providesDeserializer(): Gson =
@@ -90,18 +107,39 @@ object NetworkModule {
.registerTypeAdapter(NaviWidget::class.java, NaviWidgetJsonDeserializer())
.registerTypeAdapter(BaseInputValidation::class.java, ValidationJsonDeserializer())
.registerTypeAdapter(ParameterValue::class.java, ParameterValueJsonDeserializer())
.registerApUiTronDeSerializers()
.registerTypeAdapter(UiTronData::class.java, CustomHomeWidgetDataDeSerializer())
.registerTypeAdapter(BaseProperty::class.java, HomeUitronPropertyDeserializer())
.registerTypeAdapter(DateTime::class.java, DateTimeConverterAdapter())
.registerTypeAdapter(AnimationSpec::class.java, AnimationSpecDeserializer())
.registerTypeAdapter(PropertyAnimator::class.java, PropertyAnimatorDeserializer())
.registerApUiTronDeSerializers()
.registerTypeAdapter(UiTronData::class.java, HomeCustomWidgetDataDeSerializer())
.registerTypeAdapter(BaseProperty::class.java, HomeUitronPropertyDeserializer())
.create()
@DataSerializers
@Singleton
@Provides
fun providesSerializer(): Gson =
GsonBuilder()
.registerTypeAdapter(NaviWidget::class.java, NaviWidgetJsonSerializer())
.registerTypeAdapter(BaseProperty::class.java, HomeUitronPropertySerializer())
.registerTypeAdapter(UiTronData::class.java, HomeCustomWidgetDataSerializer())
.registerTypeAdapter(UiTronAction::class.java, UiTronActionSerializer())
.registerTypeAdapter(UploadDataConfig::class.java, UiTronUploadDataSerializer())
.registerTypeAdapter(BaseInputValidation::class.java, UiTronValidationSerializer())
.registerTypeAdapter(TriggerApiAction::class.java, UiTronTriggerApiActionSerializer())
.registerTypeAdapter(AnimationSpec::class.java, AnimationSpecSerializer())
.registerTypeAdapter(PropertyAnimator::class.java, PropertyAnimatorSerializer())
.registerTypeAdapter(
VisualTransformationData::class.java,
VisualTransformationDataSerializer()
)
.create()
@Singleton
@Provides
fun provideRetrofit(
naviHttpClient: NaviHttpClient,
deserializer: Gson,
@DataDeserializers deserializer: Gson,
priorityRequestManagerFacade: PriorityRequestManagerFacade
): Retrofit {
val updatedBaseUrl = BaseUtils.getUpdatedBaseUrl()
@@ -127,7 +165,7 @@ object NetworkModule {
@Provides
@SuperAppRetroFit
fun provideSuperAppApiService(
percentDeserializer: Gson,
@DataDeserializers percentDeserializer: Gson,
@SuperAppRetroFit naviHttpClient: NaviHttpClient,
priorityRequestManagerFacade: PriorityRequestManagerFacade
): RetrofitService {
@@ -151,7 +189,7 @@ object NetworkModule {
@Provides
@FeedsRetroFit
fun provideFeedsApiService(
percentDeserializer: Gson,
@DataDeserializers percentDeserializer: Gson,
@FeedsRetroFit naviHttpClient: NaviHttpClient,
priorityRequestManagerFacade: PriorityRequestManagerFacade
): RetrofitService {

View File

@@ -14,3 +14,7 @@ import javax.inject.Qualifier
@Qualifier @Retention(AnnotationRetention.BINARY) annotation class FeedsRetroFit
@Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class CoroutineScopeIO
@Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class DataDeserializers
@Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class DataSerializers

View File

@@ -7,7 +7,6 @@
package com.naviapp.network.util
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.navi.ap.utils.registerApUiTronDeSerializers
import com.navi.base.utils.BaseUtils
@@ -22,20 +21,12 @@ import com.navi.naviwidgets.validations.BaseInputValidation
import com.navi.naviwidgets.validations.ValidationJsonDeserializer
import com.navi.naviwidgets.widgets.NaviWidgetJsonDeserializer
import com.navi.naviwidgets.widgets.ParameterValueJsonDeserializer
import com.navi.pay.common.utils.DateTimeConverterAdapter
import com.navi.uitron.deserializer.animationsDeserializers.AnimationSpecDeserializer
import com.navi.uitron.deserializer.animationsDeserializers.PropertyAnimatorDeserializer
import com.navi.uitron.model.animations.AnimationSpec
import com.navi.uitron.model.animations.PropertyAnimator
import com.navi.uitron.model.ui.BaseProperty
import com.naviapp.BuildConfig
import com.naviapp.home.compose.uiTron.model.deserializer.HomeUitronPropertyDeserializer
import com.naviapp.models.response.WidgetConfig
import com.naviapp.network.ApiConstants
import com.naviapp.utils.WidgetConfigDeserializer
import com.naviapp.utils.getVersionCode
import okhttp3.OkHttpClient
import org.joda.time.DateTime
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.converter.scalars.ScalarsConverterFactory
@@ -59,21 +50,6 @@ fun createRetrofitClient(okttpClientBuilder: OkHttpClient.Builder): Retrofit {
.build()
}
fun getGsonBuilderForWidgetizedResponse(): Gson {
return GsonBuilder()
.registerTypeAdapter(GenericWidgetDataInfo::class.java, WidgetDataDeserializer())
.registerTypeAdapter(WidgetConfig::class.java, WidgetConfigDeserializer())
.registerTypeAdapter(NaviWidget::class.java, NaviWidgetJsonDeserializer())
.registerTypeAdapter(BaseInputValidation::class.java, ValidationJsonDeserializer())
.registerTypeAdapter(ParameterValue::class.java, ParameterValueJsonDeserializer())
.registerTypeAdapter(DateTime::class.java, DateTimeConverterAdapter())
.registerTypeAdapter(AnimationSpec::class.java, AnimationSpecDeserializer())
.registerTypeAdapter(PropertyAnimator::class.java, PropertyAnimatorDeserializer())
.registerApUiTronDeSerializers()
.registerTypeAdapter(BaseProperty::class.java, HomeUitronPropertyDeserializer())
.create()
}
fun getNetworkInfo(timeOutInSeconds: Long = ApiConstants.API_CONNECT_TIMEOUT_VALUE): NetworkInfo {
return NetworkInfo(
baseUrl = BaseUtils.getUpdatedBaseUrl() ?: BuildConfig.BASE_URL,

View File

@@ -37,20 +37,22 @@ import com.naviapp.BuildConfig
import com.naviapp.common.navigator.NaviDeepLinkNavigator.HOME
import com.naviapp.common.navigator.NaviDeepLinkNavigator.ON_BOARDING
import com.naviapp.common.navigator.NaviDeepLinkNavigator.REGISTRATION
import com.naviapp.network.util.getGsonBuilderForWidgetizedResponse
import com.naviapp.network.di.DataDeserializers
import com.naviapp.network.di.DataSerializers
import com.naviapp.nux.model.NuxDisplayUserInfo
import com.naviapp.nux.model.NuxEligibilityFirebaseConfig
import com.naviapp.nux.repository.NuxRepository
import com.naviapp.utils.Constants.DEEPLINK
import com.naviapp.utils.Constants.SOURCE
import com.naviapp.utils.naviAppSerializerGsonBuilder
import javax.inject.Inject
class NewUserExperienceHandler
@Inject
constructor(
private val naviCacheRepository: NaviCacheRepositoryImpl,
private val nuxRepository: NuxRepository
private val nuxRepository: NuxRepository,
@DataDeserializers private val dataDeserializers: Gson,
@DataSerializers private val dataSerializers: Gson
) {
private var canRedirectUserToNux = false
@@ -91,8 +93,8 @@ constructor(
version = BuildConfig.VERSION_CODE.toLong(),
getDataFromAltSource = { getNaviCacheAltSourceEntity(screenId) }
)
deserializeWidgetResponseString(cachedResponse)?.let { data ->
dataDeserializers.fromJson(cachedResponse?.value, ForgeScreenDefinition::class.java)?.let {
data ->
onSuccess(data)
if (queryMap[SOURCE].orEmpty() in listOf(HOME, REGISTRATION, ON_BOARDING)) {
updateNuxDisplayUserInfo(screenId)
@@ -115,7 +117,7 @@ constructor(
systemBackAction = response.data?.screenStructure?.systemBackCta
if (response.data?.screenStructure?.content?.widgets?.isNotEmpty().orFalse()) {
return NaviCacheAltSourceEntity(
value = naviAppSerializerGsonBuilder().toJson(response.data),
value = dataSerializers.toJson(response.data),
version = BuildConfig.VERSION_CODE,
isSuccess = true
)
@@ -124,12 +126,6 @@ constructor(
return NaviCacheAltSourceEntity(isSuccess = false)
}
private fun deserializeWidgetResponseString(
response: NaviCacheEntity?
): ForgeScreenDefinition? =
getGsonBuilderForWidgetizedResponse()
.fromJson(response?.value, ForgeScreenDefinition::class.java)
fun isUserEligibleForNux(screenId: String): Boolean {
val nuxDisplayUserInfo =
PreferenceManager.getObjectPrefrences(

View File

@@ -513,6 +513,14 @@ object Constants {
const val SCROLL_FADE = "scroll_fade"
}
// Home Custom Widget Constants
object HomeCustomWidgetConstants {
const val PROFILE_HEADER_WIDGET = "PROFILE_HEADER_WIDGET"
const val UPI_SETTINGS_WIDGET = "UPI_SETTINGS_WIDGET"
const val ROTATING_VIEW = "RotatingView"
const val SCROLL_FADING_WIDGET = "ScrollFadingWidget"
}
object HomeCustomUitronWidgetConstants {
const val ROTATING_VIEW_ANIMATION = "rotating view animation"
}

View File

@@ -29,7 +29,7 @@ import com.navi.uitron.model.data.UiTronData
import com.navi.uitron.model.ui.BaseProperty
import com.naviapp.R
import com.naviapp.app.NaviApplication
import com.naviapp.common.deserializer.CustomHomeWidgetDataDeSerializer
import com.naviapp.common.deserializer.HomeCustomWidgetDataDeSerializer
import com.naviapp.home.compose.uiTron.model.deserializer.HomeUitronPropertyDeserializer
import com.naviapp.models.response.WidgetConfig
import java.lang.reflect.Type
@@ -51,7 +51,7 @@ fun <T> mockApiResponse(
.registerTypeAdapter(BaseInputValidation::class.java, ValidationJsonDeserializer())
.registerTypeAdapter(ParameterValue::class.java, ParameterValueJsonDeserializer())
.registerApUiTronDeSerializers()
.registerTypeAdapter(UiTronData::class.java, CustomHomeWidgetDataDeSerializer())
.registerTypeAdapter(UiTronData::class.java, HomeCustomWidgetDataDeSerializer())
.registerTypeAdapter(BaseProperty::class.java, HomeUitronPropertyDeserializer())
.registerTypeAdapter(AnimationSpec::class.java, AnimationSpecDeserializer())
.registerTypeAdapter(PropertyAnimator::class.java, PropertyAnimatorDeserializer())

View File

@@ -52,10 +52,8 @@ import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import com.google.android.material.card.MaterialCardView
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.navi.amc.common.taskProcessor.AmcTaskManager
import com.navi.amc.navigator.NaviAmcDeeplinkNavigator
import com.navi.ap.utils.registerApUiTronDeSerializers
import com.navi.base.model.ClickableTextType
import com.navi.base.model.CtaData
import com.navi.base.model.EmailSubjectBodyResponse
@@ -70,10 +68,6 @@ import com.navi.base.utils.orTrue
import com.navi.base.utils.orZero
import com.navi.common.model.ModuleNameV2
import com.navi.common.network.models.GenericErrorResponse
import com.navi.common.uitron.model.action.UploadDataConfig
import com.navi.common.uitron.serializer.UiTronActionSerializer
import com.navi.common.uitron.serializer.UiTronTriggerApiActionSerializer
import com.navi.common.uitron.serializer.UiTronUploadDataSerializer
import com.navi.common.utils.CommonNaviAnalytics
import com.navi.common.utils.Constants.LOGIN_SOURCE
import com.navi.common.utils.EmiCalculator
@@ -82,44 +76,20 @@ import com.navi.common.utils.log
import com.navi.design.utils.isValidHexColor
import com.navi.insurance.navigator.NaviInsuranceDeeplinkNavigator
import com.navi.insurance.sharedpref.NaviPreferenceManager
import com.navi.naviwidgets.WidgetDataDeserializer
import com.navi.naviwidgets.models.GenericWidgetDataInfo
import com.navi.naviwidgets.models.NaviWidget
import com.navi.naviwidgets.models.ParameterValue
import com.navi.naviwidgets.models.response.CardProperties
import com.navi.naviwidgets.utils.setCardProperties
import com.navi.naviwidgets.validations.BaseInputValidation
import com.navi.naviwidgets.validations.ValidationJsonDeserializer
import com.navi.naviwidgets.widgets.NaviWidgetJsonDeserializer
import com.navi.naviwidgets.widgets.NaviWidgetJsonSerializer
import com.navi.naviwidgets.widgets.ParameterValueJsonDeserializer
import com.navi.pay.common.utils.getExcludeSecureSharedPrefKeys
import com.navi.pay.common.utils.getExcludeSharedPrefKeys
import com.navi.payment.juspay.HyperServicesHolder
import com.navi.uitron.model.action.TriggerApiAction
import com.navi.uitron.model.animations.AnimationSpec
import com.navi.uitron.model.animations.PropertyAnimator
import com.navi.uitron.model.data.UiTronAction
import com.navi.uitron.model.data.UiTronData
import com.navi.uitron.model.ui.BaseProperty
import com.navi.uitron.model.visualtransformation.VisualTransformationData
import com.navi.uitron.serializer.UiTronValidationSerializer
import com.navi.uitron.serializer.VisualTransformationDataSerializer
import com.navi.uitron.serializer.animationsSerializers.AnimationSpecSerializer
import com.navi.uitron.serializer.animationsSerializers.PropertyAnimatorSerializer
import com.naviapp.BuildConfig
import com.naviapp.R
import com.naviapp.analytics.utils.NaviAnalytics
import com.naviapp.analytics.utils.NaviSDKHelper
import com.naviapp.app.NaviApplication
import com.naviapp.common.deserializer.CustomHomeWidgetDataDeSerializer
import com.naviapp.common.navigator.NaviDeepLinkNavigator
import com.naviapp.common.navigator.NaviDeepLinkNavigator.ERROR_V2
import com.naviapp.common.navigator.NaviDeepLinkNavigator.getPersonalLoanDynamicModuleIntent
import com.naviapp.common.serializer.CustomHomeWidgetDataSerializer
import com.naviapp.home.activity.OnBoardingActivity
import com.naviapp.home.compose.uiTron.model.deserializer.HomeUitronPropertyDeserializer
import com.naviapp.home.compose.uiTron.model.serializer.HomeUitronPropertySerializer
import com.naviapp.home.dashboard.models.response.DashboardContentResponse
import com.naviapp.manager.usecase.UserDataUploadWorkerUseCase
import com.naviapp.models.ColorData
@@ -984,36 +954,6 @@ fun navigateToCrmHelpScreen(screenName: String, activity: Activity) {
)
}
val naviAppDeserializerGsonBuilder: Gson
get() =
GsonBuilder()
.registerTypeAdapter(GenericWidgetDataInfo::class.java, WidgetDataDeserializer())
.registerTypeAdapter(WidgetConfig::class.java, WidgetConfigDeserializer())
.registerTypeAdapter(NaviWidget::class.java, NaviWidgetJsonDeserializer())
.registerTypeAdapter(BaseInputValidation::class.java, ValidationJsonDeserializer())
.registerTypeAdapter(ParameterValue::class.java, ParameterValueJsonDeserializer())
.registerApUiTronDeSerializers()
.registerTypeAdapter(UiTronData::class.java, CustomHomeWidgetDataDeSerializer())
.registerTypeAdapter(BaseProperty::class.java, HomeUitronPropertyDeserializer())
.create()
fun naviAppSerializerGsonBuilder(): Gson =
GsonBuilder()
.registerTypeAdapter(NaviWidget::class.java, NaviWidgetJsonSerializer())
.registerTypeAdapter(BaseProperty::class.java, HomeUitronPropertySerializer())
.registerTypeAdapter(UiTronData::class.java, CustomHomeWidgetDataSerializer())
.registerTypeAdapter(UiTronAction::class.java, UiTronActionSerializer())
.registerTypeAdapter(UploadDataConfig::class.java, UiTronUploadDataSerializer())
.registerTypeAdapter(BaseInputValidation::class.java, UiTronValidationSerializer())
.registerTypeAdapter(TriggerApiAction::class.java, UiTronTriggerApiActionSerializer())
.registerTypeAdapter(AnimationSpec::class.java, AnimationSpecSerializer())
.registerTypeAdapter(PropertyAnimator::class.java, PropertyAnimatorSerializer())
.registerTypeAdapter(
VisualTransformationData::class.java,
VisualTransformationDataSerializer()
)
.create()
fun buildUrlWithParameters(
baseUrl: String,
params: Map<String, String>,