diff --git a/android/app/src/main/java/com/naviapp/common/deserializer/CustomHomeWidgetDataDeSerializer.kt b/android/app/src/main/java/com/naviapp/common/deserializer/HomeCustomWidgetDataDeSerializer.kt similarity index 71% rename from android/app/src/main/java/com/naviapp/common/deserializer/CustomHomeWidgetDataDeSerializer.kt rename to android/app/src/main/java/com/naviapp/common/deserializer/HomeCustomWidgetDataDeSerializer.kt index 4b49fc6754..66f901dae7 100644 --- a/android/app/src/main/java/com/naviapp/common/deserializer/CustomHomeWidgetDataDeSerializer.kt +++ b/android/app/src/main/java/com/naviapp/common/deserializer/HomeCustomWidgetDataDeSerializer.kt @@ -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) } } diff --git a/android/app/src/main/java/com/naviapp/common/serializer/CustomHomeWidgetDataSerializer.kt b/android/app/src/main/java/com/naviapp/common/serializer/HomeCustomWidgetDataSerializer.kt similarity index 68% rename from android/app/src/main/java/com/naviapp/common/serializer/CustomHomeWidgetDataSerializer.kt rename to android/app/src/main/java/com/naviapp/common/serializer/HomeCustomWidgetDataSerializer.kt index 1b9ce15180..c4c4b73ee0 100644 --- a/android/app/src/main/java/com/naviapp/common/serializer/CustomHomeWidgetDataSerializer.kt +++ b/android/app/src/main/java/com/naviapp/common/serializer/HomeCustomWidgetDataSerializer.kt @@ -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) } } diff --git a/android/app/src/main/java/com/naviapp/home/compose/profile/ProfileScreenWidgetRenderer.kt b/android/app/src/main/java/com/naviapp/home/compose/profile/ProfileScreenWidgetRenderer.kt index b486eb4e3d..88884fbb32 100644 --- a/android/app/src/main/java/com/naviapp/home/compose/profile/ProfileScreenWidgetRenderer.kt +++ b/android/app/src/main/java/com/naviapp/home/compose/profile/ProfileScreenWidgetRenderer.kt @@ -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 } } diff --git a/android/app/src/main/java/com/naviapp/home/compose/uiTron/model/deserializer/HomeUitronPropertyDeserializer.kt b/android/app/src/main/java/com/naviapp/home/compose/uiTron/model/deserializer/HomeUitronPropertyDeserializer.kt index 52189eac0f..d8cf35b8f9 100644 --- a/android/app/src/main/java/com/naviapp/home/compose/uiTron/model/deserializer/HomeUitronPropertyDeserializer.kt +++ b/android/app/src/main/java/com/naviapp/home/compose/uiTron/model/deserializer/HomeUitronPropertyDeserializer.kt @@ -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) diff --git a/android/app/src/main/java/com/naviapp/home/compose/uiTron/model/serializer/HomeUitronPropertySerializer.kt b/android/app/src/main/java/com/naviapp/home/compose/uiTron/model/serializer/HomeUitronPropertySerializer.kt index 3ad6aa5fe6..99b50691d5 100644 --- a/android/app/src/main/java/com/naviapp/home/compose/uiTron/model/serializer/HomeUitronPropertySerializer.kt +++ b/android/app/src/main/java/com/naviapp/home/compose/uiTron/model/serializer/HomeUitronPropertySerializer.kt @@ -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 diff --git a/android/app/src/main/java/com/naviapp/home/compose/uiTron/renderer/HomeCustomUiTronRenderer.kt b/android/app/src/main/java/com/naviapp/home/compose/uiTron/renderer/HomeCustomUiTronRenderer.kt index d326ac9467..639b8f83bc 100644 --- a/android/app/src/main/java/com/naviapp/home/compose/uiTron/renderer/HomeCustomUiTronRenderer.kt +++ b/android/app/src/main/java/com/naviapp/home/compose/uiTron/renderer/HomeCustomUiTronRenderer.kt @@ -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(), diff --git a/android/app/src/main/java/com/naviapp/home/model/HomeCustomWidgetType.kt b/android/app/src/main/java/com/naviapp/home/model/HomeCustomWidgetType.kt new file mode 100644 index 0000000000..efd8246cd9 --- /dev/null +++ b/android/app/src/main/java/com/naviapp/home/model/HomeCustomWidgetType.kt @@ -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) +} diff --git a/android/app/src/main/java/com/naviapp/home/model/HomeScreenCustomWidgetType.kt b/android/app/src/main/java/com/naviapp/home/model/HomeScreenCustomWidgetType.kt deleted file mode 100644 index 6e0bc2149b..0000000000 --- a/android/app/src/main/java/com/naviapp/home/model/HomeScreenCustomWidgetType.kt +++ /dev/null @@ -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 -} diff --git a/android/app/src/main/java/com/naviapp/home/viewmodel/HomeVM.kt b/android/app/src/main/java/com/naviapp/home/viewmodel/HomeVM.kt index f00fe21c02..eca601c913 100644 --- a/android/app/src/main/java/com/naviapp/home/viewmodel/HomeVM.kt +++ b/android/app/src/main/java/com/naviapp/home/viewmodel/HomeVM.kt @@ -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 ) diff --git a/android/app/src/main/java/com/naviapp/home/viewmodel/ProfileVM.kt b/android/app/src/main/java/com/naviapp/home/viewmodel/ProfileVM.kt index f0b7d683ee..ecfb0be096 100644 --- a/android/app/src/main/java/com/naviapp/home/viewmodel/ProfileVM.kt +++ b/android/app/src/main/java/com/naviapp/home/viewmodel/ProfileVM.kt @@ -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 ) ) diff --git a/android/app/src/main/java/com/naviapp/network/di/NetworkModule.kt b/android/app/src/main/java/com/naviapp/network/di/NetworkModule.kt index 780cac536b..690aba9df6 100644 --- a/android/app/src/main/java/com/naviapp/network/di/NetworkModule.kt +++ b/android/app/src/main/java/com/naviapp/network/di/NetworkModule.kt @@ -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 { diff --git a/android/app/src/main/java/com/naviapp/network/di/NetworkQualifiers.kt b/android/app/src/main/java/com/naviapp/network/di/NetworkQualifiers.kt index 0ead0b1d1b..3605d0e138 100644 --- a/android/app/src/main/java/com/naviapp/network/di/NetworkQualifiers.kt +++ b/android/app/src/main/java/com/naviapp/network/di/NetworkQualifiers.kt @@ -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 diff --git a/android/app/src/main/java/com/naviapp/network/util/Utils.kt b/android/app/src/main/java/com/naviapp/network/util/Utils.kt index 3b1a1df4b7..aba1de3b23 100644 --- a/android/app/src/main/java/com/naviapp/network/util/Utils.kt +++ b/android/app/src/main/java/com/naviapp/network/util/Utils.kt @@ -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, diff --git a/android/app/src/main/java/com/naviapp/nux/handler/NewUserExperienceHandler.kt b/android/app/src/main/java/com/naviapp/nux/handler/NewUserExperienceHandler.kt index e93fa63f33..df64a05113 100644 --- a/android/app/src/main/java/com/naviapp/nux/handler/NewUserExperienceHandler.kt +++ b/android/app/src/main/java/com/naviapp/nux/handler/NewUserExperienceHandler.kt @@ -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( diff --git a/android/app/src/main/java/com/naviapp/utils/Constants.kt b/android/app/src/main/java/com/naviapp/utils/Constants.kt index e66c286582..d1c098b7c3 100644 --- a/android/app/src/main/java/com/naviapp/utils/Constants.kt +++ b/android/app/src/main/java/com/naviapp/utils/Constants.kt @@ -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" } diff --git a/android/app/src/main/java/com/naviapp/utils/MockUtil.kt b/android/app/src/main/java/com/naviapp/utils/MockUtil.kt index d32dd24480..dd51178866 100644 --- a/android/app/src/main/java/com/naviapp/utils/MockUtil.kt +++ b/android/app/src/main/java/com/naviapp/utils/MockUtil.kt @@ -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 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()) diff --git a/android/app/src/main/java/com/naviapp/utils/Utility.kt b/android/app/src/main/java/com/naviapp/utils/Utility.kt index d4225fac5c..c6ad8bb6cc 100644 --- a/android/app/src/main/java/com/naviapp/utils/Utility.kt +++ b/android/app/src/main/java/com/naviapp/utils/Utility.kt @@ -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,