diff --git a/android/app/src/main/java/com/naviapp/home/compose/activity/HomePageActivity.kt b/android/app/src/main/java/com/naviapp/home/compose/activity/HomePageActivity.kt index e926bf5d58..0778230a30 100644 --- a/android/app/src/main/java/com/naviapp/home/compose/activity/HomePageActivity.kt +++ b/android/app/src/main/java/com/naviapp/home/compose/activity/HomePageActivity.kt @@ -639,7 +639,7 @@ class HomePageActivity : } } - private fun getNudgeDataForInternetDisconnected() = + fun getNudgeDataForInternetDisconnected() = NetworkConnectivityNudgeData( title = NaviTextComponent(text = Constants.NetworkConnectivity.DISCONNECTED_TITLE_TEXT), titleColor = Constants.NetworkConnectivity.DISCONNECTED_TITLE_COLOR, diff --git a/android/app/src/main/java/com/naviapp/home/compose/home/navigation/HomeContentNavHost.kt b/android/app/src/main/java/com/naviapp/home/compose/home/navigation/HomeContentNavHost.kt index ca8a2cdfaa..9e7b1b3b04 100644 --- a/android/app/src/main/java/com/naviapp/home/compose/home/navigation/HomeContentNavHost.kt +++ b/android/app/src/main/java/com/naviapp/home/compose/home/navigation/HomeContentNavHost.kt @@ -17,6 +17,7 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import com.naviapp.analytics.utils.NaviAnalytics +import com.naviapp.common.viewmodel.BottomNavBarVM import com.naviapp.dashboard.viewmodels.DashboardSharedVM import com.naviapp.home.common.hopperProcessor.processHandlerImpl.Hopper import com.naviapp.home.compose.activity.HomePageActivity @@ -39,7 +40,8 @@ fun HomeContentNavHost( investmentListState: () -> LazyListState, screenOverlayVM: ScreenOverlayVM, handleAppUpdate: () -> Unit, - hopper: Hopper + hopper: Hopper, + bottomNavBarVM: BottomNavBarVM ) { NavHost( navController = navController, @@ -62,7 +64,8 @@ fun HomeContentNavHost( screenOverlayVM = screenOverlayVM, hopper = hopper, homeVM = homeViewModel, - handleAppUpdate = handleAppUpdate + handleAppUpdate = handleAppUpdate, + bottomNavBarVM = bottomNavBarVM ) } } diff --git a/android/app/src/main/java/com/naviapp/home/compose/home/navigation/NavGraphNavingationItem.kt b/android/app/src/main/java/com/naviapp/home/compose/home/navigation/NavGraphNavingationItem.kt index 6bbdc7f9f0..98a5b46ad6 100644 --- a/android/app/src/main/java/com/naviapp/home/compose/home/navigation/NavGraphNavingationItem.kt +++ b/android/app/src/main/java/com/naviapp/home/compose/home/navigation/NavGraphNavingationItem.kt @@ -19,6 +19,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import com.naviapp.analytics.utils.NaviAnalytics +import com.naviapp.common.viewmodel.BottomNavBarVM import com.naviapp.dashboard.viewmodels.DashboardSharedVM import com.naviapp.home.common.hopperProcessor.processHandlerImpl.Hopper import com.naviapp.home.compose.activity.HomePageActivity @@ -43,7 +44,8 @@ fun NavGraphNavigationItem( naviHomeAnalytics: NaviAnalytics.Home, investmentListState: () -> LazyListState, screenOverlayVM: ScreenOverlayVM, - hopper: Hopper + hopper: Hopper, + bottomNavBarVM: BottomNavBarVM ) { when (tabId) { NavigationItem.Home.tabId -> @@ -67,7 +69,8 @@ fun NavGraphNavigationItem( .statusBarsPadding() .background(Color.White), sharedVM = sharedVM, - hopper = hopper + hopper = hopper, + bottomNavBarVM = bottomNavBarVM ) NavigationItem.Loan.tabId -> LoansTabScreen( diff --git a/android/app/src/main/java/com/naviapp/home/compose/home/ui/footer/BottomStickyNudgeUI.kt b/android/app/src/main/java/com/naviapp/home/compose/home/ui/footer/BottomStickyNudgeUI.kt index 1688c4bb87..6a3a3cf93e 100644 --- a/android/app/src/main/java/com/naviapp/home/compose/home/ui/footer/BottomStickyNudgeUI.kt +++ b/android/app/src/main/java/com/naviapp/home/compose/home/ui/footer/BottomStickyNudgeUI.kt @@ -12,9 +12,11 @@ import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width @@ -32,10 +34,12 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.navi.base.model.ActionData import com.navi.common.model.common.AppUpdateData +import com.navi.common.model.common.InvestmentTabNudgeData import com.navi.common.model.common.NetworkConnectivityNudgeData import com.navi.design.font.FontWeightEnum import com.navi.design.theme.FF191919 import com.navi.design.theme.FF1F002A +import com.navi.design.theme.FF444444 import com.navi.design.theme.getFontWeight import com.navi.design.theme.ttComposeFontFamily import com.navi.design.utils.parseColorSafe @@ -65,6 +69,9 @@ fun BottomStickyNudgeUI( bottomNudgeOnClick = bottomNudgeOnClick ) } + is BottomStickyNudgeState.InvestmentTabNudgeState -> { + InvestmentTabNudge(data = nudgeState.investmentTabNudgeData) + } null -> {} } } @@ -171,3 +178,49 @@ fun AppUpdateBottomStickyNudge(data: AppUpdateData, bottomNudgeOnClick: (ActionD } } } + +@Composable +fun InvestmentTabNudge(data: InvestmentTabNudgeData? = null) { + data?.let { + Row( + modifier = + Modifier.fillMaxWidth().background(color = Color(data.bgColor.parseColorSafe())), + verticalAlignment = Alignment.CenterVertically + ) { + Row( + modifier = Modifier.padding(vertical = 16.dp, horizontal = 16.dp), + verticalAlignment = Alignment.CenterVertically + ) { + ImageFromIconCodeOrUrl(iconCode = data.iconCode, modifier = Modifier.size(32.dp)) + Spacer(modifier = Modifier.width(8.dp)) + Column { + NaviText( + text = data.title ?: EMPTY, + color = FF191919, + fontWeight = getFontWeight(FontWeightEnum.TT_SEMI_BOLD), + style = + TextStyle( + fontSize = 14.sp, + fontFamily = ttComposeFontFamily, + lineHeight = 22.sp + ), + modifier = Modifier.height(22.dp) + ) + + NaviText( + text = data.subtitle ?: EMPTY, + color = FF444444, + fontWeight = getFontWeight(FontWeightEnum.TT_MEDIUM), + style = + TextStyle( + fontSize = 12.sp, + fontFamily = ttComposeFontFamily, + lineHeight = 18.sp + ), + modifier = Modifier.height(18.dp) + ) + } + } + } + } +} diff --git a/android/app/src/main/java/com/naviapp/home/compose/home/ui/footer/HomeFooter.kt b/android/app/src/main/java/com/naviapp/home/compose/home/ui/footer/HomeFooter.kt index 1969fab641..c74edf95f0 100644 --- a/android/app/src/main/java/com/naviapp/home/compose/home/ui/footer/HomeFooter.kt +++ b/android/app/src/main/java/com/naviapp/home/compose/home/ui/footer/HomeFooter.kt @@ -56,7 +56,6 @@ fun HomeFooterRoot( ) { val bottomStickyNudgeData by bottomNavBarVM.bottomStickyNudgeData.collectAsStateWithLifecycle() val bottomNavBarState by sharedVM.bottomNavBarStateHolder.collectAsStateWithLifecycle() - val isHomeTabSelected = remember(selectedTabId) { selectedTabId == BottomBarTabType.HOME.name } val showAppUpdateStrip = remember { mutableStateOf(false) } LaunchedEffect(Unit) { @@ -70,7 +69,6 @@ fun HomeFooterRoot( }, selectedTabId = selectedTabId, bottomNudgeData = bottomStickyNudgeData, - isHomeTabSelected = isHomeTabSelected, state = HomeFooterStates( showSnackBar = homeScreenSnackBarState, @@ -100,7 +98,6 @@ fun HomeFooter( modifier: Modifier, selectedTabId: String, bottomNudgeData: BottomStickyNudgeData? = null, - isHomeTabSelected: Boolean, state: HomeFooterStates, nudgeState: () -> NudgeState, nudgeUitronRenderer: @Composable (UiTronResponse?) -> Unit, @@ -113,26 +110,43 @@ fun HomeFooter( if (state.showSnackBar) { AppInstallSnackBar { onFooterEvent(HomeFooterEvents.SnackBarOnClick) } } - if (isHomeTabSelected) { - NudgeContainer( - state = nudgeState, - nudgeUitronRenderer = nudgeUitronRenderer, - onNudgeEvent = onNudgeEvent, - onNudgeEffect = onNudgeEffect - ) - bottomNudgeData?.let { - if (it.visible) { - BottomStickyNudgeUI( - showAppUpdateStrip = showAppUpdateStrip, - modifier = Modifier.fillMaxWidth(), - nudgeState = it.bottomStickyNudgeState, - bottomNudgeOnClick = { actionData -> - onFooterEvent(HomeFooterEvents.BottomNudgeOnClick(actionData)) - } - ) + when (selectedTabId) { + BottomBarTabType.HOME.name -> { + NudgeContainer( + state = nudgeState, + nudgeUitronRenderer = nudgeUitronRenderer, + onNudgeEvent = onNudgeEvent, + onNudgeEffect = onNudgeEffect + ) + bottomNudgeData?.let { + if (it.visible) { + BottomStickyNudgeUI( + showAppUpdateStrip = showAppUpdateStrip, + modifier = Modifier.fillMaxWidth(), + nudgeState = it.bottomStickyNudgeState, + bottomNudgeOnClick = { actionData -> + onFooterEvent(HomeFooterEvents.BottomNudgeOnClick(actionData)) + } + ) + } + } + } + BottomBarTabType.INVESTMENT.name -> { + bottomNudgeData?.let { + if (it.visible) { + BottomStickyNudgeUI( + showAppUpdateStrip = showAppUpdateStrip, + modifier = Modifier.fillMaxWidth(), + nudgeState = it.bottomStickyNudgeState, + bottomNudgeOnClick = { actionData -> + onFooterEvent(HomeFooterEvents.BottomNudgeOnClick(actionData)) + } + ) + } } } } + HomeBottomBar( selectedTabId = selectedTabId, bottomNavBarState = { state.bottomNavBarState }, diff --git a/android/app/src/main/java/com/naviapp/home/compose/home/ui/screen/HomeContentFrame.kt b/android/app/src/main/java/com/naviapp/home/compose/home/ui/screen/HomeContentFrame.kt index a36e27ff7e..b5780f8f3a 100644 --- a/android/app/src/main/java/com/naviapp/home/compose/home/ui/screen/HomeContentFrame.kt +++ b/android/app/src/main/java/com/naviapp/home/compose/home/ui/screen/HomeContentFrame.kt @@ -128,7 +128,8 @@ fun HomeContentFrame( inAppUpdateVM = inAppUpdateVM ) ) - } + }, + bottomNavBarVM = bottomNavBarVM, ) }, footer = { diff --git a/android/app/src/main/java/com/naviapp/home/compose/model/BottomStickyNudgeState.kt b/android/app/src/main/java/com/naviapp/home/compose/model/BottomStickyNudgeState.kt index f89b80665e..ac3fbb69f8 100644 --- a/android/app/src/main/java/com/naviapp/home/compose/model/BottomStickyNudgeState.kt +++ b/android/app/src/main/java/com/naviapp/home/compose/model/BottomStickyNudgeState.kt @@ -8,6 +8,7 @@ package com.naviapp.home.compose.model import com.navi.common.model.common.AppUpdateData +import com.navi.common.model.common.InvestmentTabNudgeData import com.navi.common.model.common.NetworkConnectivityNudgeData sealed class BottomStickyNudgeState { @@ -16,4 +17,7 @@ sealed class BottomStickyNudgeState { class NetworkConnectivityNudgeState(val networkConnectivityData: NetworkConnectivityNudgeData) : BottomStickyNudgeState() + + class InvestmentTabNudgeState(val investmentTabNudgeData: InvestmentTabNudgeData?) : + BottomStickyNudgeState() } diff --git a/android/app/src/main/java/com/naviapp/home/dashboard/models/response/InvestmentTabResponse.kt b/android/app/src/main/java/com/naviapp/home/dashboard/models/response/InvestmentTabResponse.kt index 0dacc2a57b..5914ccd018 100644 --- a/android/app/src/main/java/com/naviapp/home/dashboard/models/response/InvestmentTabResponse.kt +++ b/android/app/src/main/java/com/naviapp/home/dashboard/models/response/InvestmentTabResponse.kt @@ -6,6 +6,7 @@ */ import com.google.gson.annotations.SerializedName +import com.navi.common.model.common.InvestmentTabNudgeData import com.navi.naviwidgets.models.response.FloatingButtonData import com.naviapp.forge.model.ScreenStructure import com.naviapp.home.dashboard.models.response.GenericComposableWidgetInfo @@ -15,4 +16,6 @@ data class InvestmentTabResponse( @SerializedName("screenStructure") var screenStructure: ScreenStructure? = null, @SerializedName("content") var content: List? = null, @SerializedName("floatingButtonData") var floatingButtonData: FloatingButtonData? = null, + @SerializedName("bottomStickyNudgeData") + var bottomStickyNudgeData: InvestmentTabNudgeData? = null ) diff --git a/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InitInvestmentsScreenComponents.kt.kt b/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InitInvestmentsScreenComponents.kt.kt index fa435d5139..a433fcf7cc 100644 --- a/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InitInvestmentsScreenComponents.kt.kt +++ b/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InitInvestmentsScreenComponents.kt.kt @@ -7,6 +7,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import com.naviapp.common.viewmodel.BottomNavBarVM import com.naviapp.home.compose.activity.HomePageActivity import com.naviapp.home.dashboard.ui.compose.investmentTab.InitLifeCycleListener import com.naviapp.home.dashboard.ui.compose.investmentTab.InvestmentsScreenHelper @@ -17,12 +18,14 @@ import com.naviapp.home.utils.InvestmentTabEvents fun InitInvestmentsScreenComponents( activity: HomePageActivity, investmentsTabVM: InvestmentsVm, - investmentsScreenHelper: InvestmentsScreenHelper + investmentsScreenHelper: InvestmentsScreenHelper, + bottomNavBarVM: BottomNavBarVM ) { InitLifeCycleListener( investmentsTabVM = investmentsTabVM, - investmentsScreenHelper = investmentsScreenHelper + investmentsScreenHelper = investmentsScreenHelper, + bottomNavBarVM = bottomNavBarVM ) LaunchedEffect(Unit) { diff --git a/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InitLifeCycleListener.kt b/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InitLifeCycleListener.kt index 93a2b1a856..aeba6b43a8 100644 --- a/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InitLifeCycleListener.kt +++ b/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InitLifeCycleListener.kt @@ -12,12 +12,14 @@ import androidx.compose.runtime.DisposableEffect import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver +import com.naviapp.common.viewmodel.BottomNavBarVM import com.naviapp.home.dashboard.viewmodels.InvestmentsVm @Composable fun InitLifeCycleListener( investmentsTabVM: InvestmentsVm, - investmentsScreenHelper: InvestmentsScreenHelper + investmentsScreenHelper: InvestmentsScreenHelper, + bottomNavBarVM: BottomNavBarVM ) { val lifecycleOwner = LocalLifecycleOwner.current DisposableEffect(key1 = lifecycleOwner) { @@ -28,6 +30,7 @@ fun InitLifeCycleListener( } Lifecycle.Event.ON_STOP -> { investmentsTabVM.onCutOffTimerClear() + bottomNavBarVM.setBottomNudge(false, null) } else -> {} } diff --git a/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InvestmentsScreen.kt b/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InvestmentsScreen.kt index c7b1610241..ed4aa6c3b7 100644 --- a/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InvestmentsScreen.kt +++ b/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InvestmentsScreen.kt @@ -15,6 +15,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.navi.common.ui.errorview.FullScreenErrorComposeView import com.navi.common.utils.setStatusBarColorInt import com.navi.design.utils.parseColorSafe +import com.naviapp.common.viewmodel.BottomNavBarVM import com.naviapp.home.common.hopperProcessor.processHandlerImpl.Hopper import com.naviapp.home.compose.activity.HomePageActivity import com.naviapp.home.dashboard.ui.compose.investmentTab.InvestmentsScreenHelper @@ -29,7 +30,8 @@ fun InvestmentsScreen( activity: HomePageActivity, modifier: Modifier = Modifier, sharedVM: SharedVM, - hopper: Hopper + hopper: Hopper, + bottomNavBarVM: BottomNavBarVM ) { val investmentsTabVm by lazy { ViewModelProvider(activity)[InvestmentsVm::class.java] } val investmentsScreenData = @@ -40,7 +42,8 @@ fun InvestmentsScreen( InitInvestmentsScreenComponents( activity = context, investmentsTabVM = investmentsTabVm, - investmentsScreenHelper = investmentsScreenHelper + investmentsScreenHelper = investmentsScreenHelper, + bottomNavBarVM = bottomNavBarVM ) Box(modifier = modifier) { @@ -64,7 +67,8 @@ fun InvestmentsScreen( sharedVM = sharedVM, hopper = hopper, toggleStatusBarColor = { toggleStatusBarColor(activity, it) }, - investmentsScreenHelper = investmentsScreenHelper + investmentsScreenHelper = investmentsScreenHelper, + bottomNavBarVM = bottomNavBarVM ) } } diff --git a/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InvestmentsScreenHelper.kt b/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InvestmentsScreenHelper.kt index 84ff54f132..4142bc1288 100644 --- a/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InvestmentsScreenHelper.kt +++ b/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InvestmentsScreenHelper.kt @@ -19,6 +19,7 @@ import com.navi.base.model.ActionData import com.navi.base.model.CtaData import com.navi.base.model.GenericAnalytics import com.navi.base.utils.orFalse +import com.navi.common.model.common.InvestmentTabNudgeData import com.navi.common.utils.toCtaData import com.naviapp.home.common.hopperProcessor.processHandlerImpl.Hopper import com.naviapp.home.compose.activity.HomePageActivity @@ -30,6 +31,9 @@ import com.naviapp.home.model.HpBottomSheetState import com.naviapp.home.model.InvestmentBottomSheetData import com.naviapp.home.viewmodel.SharedVM import com.naviapp.utils.Constants +import com.naviapp.utils.Constants.INVESTMENT_TAB_BOTTOM_NUDGE_COLOR +import com.naviapp.utils.Constants.INVESTMENT_TAB_BOTTOM_NUDGE_ICON +import com.naviapp.utils.Constants.INVESTMENT_TAB_BOTTOM_NUDGE_TITLE class InvestmentsScreenHelper { fun refreshInvestmentTabScreen(investmentsTabVm: InvestmentsVm) { @@ -132,4 +136,12 @@ class InvestmentsScreenHelper { ) } } + + fun getBottomStickyNudgeData(): InvestmentTabNudgeData { + return InvestmentTabNudgeData( + title = INVESTMENT_TAB_BOTTOM_NUDGE_TITLE, + bgColor = INVESTMENT_TAB_BOTTOM_NUDGE_COLOR, + iconCode = INVESTMENT_TAB_BOTTOM_NUDGE_ICON + ) + } } diff --git a/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InvestmentsTab.kt b/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InvestmentsTab.kt index e666a5e11b..37376c41a3 100644 --- a/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InvestmentsTab.kt +++ b/android/app/src/main/java/com/naviapp/home/dashboard/ui/compose/investmentTab/InvestmentsTab.kt @@ -17,24 +17,29 @@ import androidx.compose.material.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.derivedStateOf -import androidx.compose.runtime.remember import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Modifier import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.navi.base.utils.ConnectivityObserver +import com.navi.base.utils.ConnectivityObserverImpl +import com.navi.base.utils.isNotNull +import com.navi.common.utils.parseColor import com.navi.common.utils.setStatusBarColorInt import com.navi.common.utils.toActionData -import com.navi.design.utils.parseColorSafe import com.navi.naviwidgets.extensions.FloatingButtonOverlay import com.navi.naviwidgets.extensions.isScrollingDown import com.naviapp.R +import com.naviapp.common.viewmodel.BottomNavBarVM import com.naviapp.home.common.hopperProcessor.processHandlerImpl.Hopper import com.naviapp.home.compose.activity.HomePageActivity +import com.naviapp.home.compose.model.BottomStickyNudgeState import com.naviapp.home.dashboard.viewmodels.InvestmentsVm import com.naviapp.home.viewmodel.SharedVM +import com.naviapp.utils.Constants.LAST_UPDATED import com.naviapp.utils.Constants.RANK_OF_SECTION import com.naviapp.utils.Constants.WHITE_COLOR +import com.naviapp.utils.formatTimeStamp import kotlinx.coroutines.flow.distinctUntilChanged @OptIn(ExperimentalFoundationApi::class) @@ -46,13 +51,18 @@ fun InvestmentsTab( investmentsScreenHelper: InvestmentsScreenHelper, hopper: Hopper, toggleStatusBarColor: (String) -> Unit, + bottomNavBarVM: BottomNavBarVM ) { + val connectivityObserver: ConnectivityObserver by lazy { + ConnectivityObserverImpl(context = activity) + } val investmentsTabScreenData = investmentsTabVm.investmentsTabScreenData.collectAsStateWithLifecycle() val scrollState = rememberLazyListState() val statusBarColor = investmentsTabVm.statusBarColor.collectAsStateWithLifecycle() + val bottomStickyNudgeData = investmentsTabVm.bottomStickyNudgeData.collectAsStateWithLifecycle() - LaunchedEffect(remember { derivedStateOf { scrollState.firstVisibleItemIndex } }) { + LaunchedEffect(scrollState.firstVisibleItemIndex) { snapshotFlow { scrollState.firstVisibleItemIndex } .distinctUntilChanged() .collect { firstVisibleItemIndex -> @@ -65,7 +75,31 @@ fun InvestmentsTab( } LaunchedEffect(key1 = statusBarColor.value) { - activity.setStatusBarColorInt(statusBarColor.value.parseColorSafe()) + activity.setStatusBarColorInt(statusBarColor.value.parseColor()) + } + + LaunchedEffect(key1 = investmentsTabScreenData.value) { + if (connectivityObserver.isInternetConnected().not()) { + bottomNavBarVM.setBottomNudge( + visible = true, + bottomStickyNudgeState = + BottomStickyNudgeState.NetworkConnectivityNudgeState( + activity.getNudgeDataForInternetDisconnected() + ) + ) + } else { + bottomNavBarVM.setBottomNudge( + visible = bottomStickyNudgeData.isNotNull(), + bottomStickyNudgeState = + BottomStickyNudgeState.InvestmentTabNudgeState( + bottomStickyNudgeData.value?.copy( + subtitle = + LAST_UPDATED + + investmentsTabVm.getLastUpdatedTime().formatTimeStamp() + ) + ) + ) + } } investmentsTabScreenData.value.let { state -> diff --git a/android/app/src/main/java/com/naviapp/home/dashboard/viewmodels/InvestmentsVm.kt b/android/app/src/main/java/com/naviapp/home/dashboard/viewmodels/InvestmentsVm.kt index b1662ed1d2..10e62a0ac8 100644 --- a/android/app/src/main/java/com/naviapp/home/dashboard/viewmodels/InvestmentsVm.kt +++ b/android/app/src/main/java/com/naviapp/home/dashboard/viewmodels/InvestmentsVm.kt @@ -20,8 +20,10 @@ import com.navi.base.cache.model.NaviCacheEntity import com.navi.base.cache.repository.NaviCacheRepositoryImpl import com.navi.base.cache.util.NaviSharedDbKeys import com.navi.base.model.CtaData +import com.navi.base.utils.isNotNull import com.navi.base.utils.orFalse import com.navi.common.model.ModuleNameV2 +import com.navi.common.model.common.InvestmentTabNudgeData import com.navi.common.network.models.ErrorUnifiedResponse import com.navi.common.network.models.GenericErrorResponse import com.navi.common.utils.isValidResponse @@ -33,6 +35,7 @@ import com.naviapp.home.dashboard.models.investmentTabWidgetData.CutOffSlotData import com.naviapp.home.dashboard.models.investmentTabWidgetData.CutOffTimerWidget import com.naviapp.home.dashboard.models.response.GenericComposableWidgetInfo import com.naviapp.home.dashboard.repo.InvestmentsTabRepository +import com.naviapp.home.dashboard.ui.compose.investmentTab.InvestmentsScreenHelper import com.naviapp.home.utils.InvestmentTabEvents import com.naviapp.home.utils.Timer import com.naviapp.network.di.DataDeserializers @@ -109,6 +112,10 @@ constructor( private val eventFiredMap: HashMap = InvestmentTabEvents.getAllEvents().associateWith { false } as HashMap + private val _bottomStickyNudgeData = MutableStateFlow(null) + val bottomStickyNudgeData: StateFlow + get() = _bottomStickyNudgeData + fun setTimerChangeData(data: String?) { _cutOffTimerDataChange.value = data } @@ -207,20 +214,41 @@ constructor( if (response.isValidResponse()) { response.data?.let { data -> _statusBarColor.emit(data.metaData?.get(STATUS_BAR_COLOR) ?: YELLOW_COLOR) - val investmentsTabResponse = - InvestmentTabResponse().apply { - metaData = data.metaData - screenStructure = data.screenStructure - content = data.content - floatingButtonData = data.floatingButtonData + data.bottomStickyNudgeData?.let { + _bottomStickyNudgeData.update { data.bottomStickyNudgeData } + if (isInvestmentTabPresentInCache()) { + setInvestmentTabResponseFromCache() + } else { + val investmentsTabResponse = + InvestmentTabResponse().apply { + metaData = data.metaData + screenStructure = data.screenStructure + content = data.content + floatingButtonData = data.floatingButtonData + bottomStickyNudgeData = data.bottomStickyNudgeData + } + _investmentsTabScreenData.update { + InvestmentsTabScreenState.Success(data = investmentsTabResponse) + } } - _investmentsTabScreenData.update { - InvestmentsTabScreenState.Success(data = investmentsTabResponse) } - saveInvestmentsTabResponseInCache( - data.content, - NaviSharedDbKeys.INVESTMENT_TAB.keyName - ) + ?: run { + val investmentsTabResponse = + InvestmentTabResponse().apply { + metaData = data.metaData + screenStructure = data.screenStructure + content = data.content + floatingButtonData = data.floatingButtonData + bottomStickyNudgeData = data.bottomStickyNudgeData + } + _investmentsTabScreenData.update { + InvestmentsTabScreenState.Success(data = investmentsTabResponse) + } + saveInvestmentsTabResponseInCache( + data.content, + NaviSharedDbKeys.INVESTMENT_TAB.keyName + ) + } } } else { val errorUnifiedResponse = @@ -230,10 +258,19 @@ constructor( errorUnifiedResponse, ModuleNameV2.AMC.name ) + if (isInvestmentTabPresentInCache()) { + _bottomStickyNudgeData.update { + InvestmentsScreenHelper().getBottomStickyNudgeData() + } + } setInvestmentTabResponseFromCache() } } + private suspend fun isInvestmentTabPresentInCache(): Boolean { + return naviCacheRepository.get(NaviSharedDbKeys.INVESTMENT_TAB.keyName).isNotNull() + } + private suspend fun saveInvestmentsTabResponseInCache( investmentTabResponse: List? = null, cacheKey: String @@ -313,6 +350,10 @@ constructor( eventFiredMap[eventName] = true } + suspend fun getLastUpdatedTime(): Long { + return naviCacheRepository.getLastUpdatedTime(NaviSharedDbKeys.INVESTMENT_TAB.keyName) + } + sealed interface InvestmentsTabScreenState { data object Loading : InvestmentsTabScreenState 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 57dbdb0753..55c2b34b1a 100644 --- a/android/app/src/main/java/com/naviapp/utils/Constants.kt +++ b/android/app/src/main/java/com/naviapp/utils/Constants.kt @@ -489,6 +489,11 @@ object Constants { const val DEV_ANR_LISTENER = "dev_anr_listener" const val NEW_ANR_LISTENER = "newAnrHandler" const val ANR_MONITOR_INTERRUPTED = "anr_monitor_interrupted" + const val LAST_UPDATED = "Last updated " + const val INVESTMENT_TAB_BOTTOM_NUDGE_TITLE = "You might be viewing old data" + const val INVESTMENT_TAB_BOTTOM_NUDGE_COLOR = "#E9E7F0" + const val INVESTMENT_TAB_BOTTOM_NUDGE_ICON = + "https://amc-public-assets.s3.ap-south-1.amazonaws.com/investment-tab/investment_tab_bottom_bar_image.png" // TODO: Remove these constants once delayed onboarding goes 100% const val CHECK_BALANCE_ROW = "checkBalanceRow" diff --git a/android/app/src/main/java/com/naviapp/utils/Ext.kt b/android/app/src/main/java/com/naviapp/utils/Ext.kt index 1cc4feeb91..14b24b6b2d 100644 --- a/android/app/src/main/java/com/naviapp/utils/Ext.kt +++ b/android/app/src/main/java/com/naviapp/utils/Ext.kt @@ -73,6 +73,9 @@ import com.naviapp.utils.Constants.INR import java.net.URLEncoder import java.nio.charset.StandardCharsets import java.text.DecimalFormat +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale import org.joda.time.LocalDate import org.json.JSONObject @@ -570,3 +573,9 @@ fun Map.getEncodedParamsForUrl(): String { } .joinToString(AMPERSAND) } + +fun Long.formatTimeStamp(): String { + val date = Date(this) + val formatter = SimpleDateFormat("dd MMM, h:mm a", Locale.getDefault()) + return formatter.format(date) +} diff --git a/android/navi-base/src/main/java/com/navi/base/cache/repository/NaviCacheRepository.kt b/android/navi-base/src/main/java/com/navi/base/cache/repository/NaviCacheRepository.kt index 9c43cd6f83..73b8f41fe2 100644 --- a/android/navi-base/src/main/java/com/navi/base/cache/repository/NaviCacheRepository.kt +++ b/android/navi-base/src/main/java/com/navi/base/cache/repository/NaviCacheRepository.kt @@ -66,6 +66,8 @@ interface NaviCacheRepository { return currentData.version == altData.version && currentDataValue == altDataValue } ): Flow + + suspend fun getLastUpdatedTime(key: String): Long } class NaviCacheRepositoryImpl @Inject constructor(private val naviCacheDao: NaviCacheDao) : @@ -285,4 +287,8 @@ class NaviCacheRepositoryImpl @Inject constructor(private val naviCacheDao: Navi return true } + + override suspend fun getLastUpdatedTime(key: String): Long { + return naviCacheDao.get(key = key)?.updatedAt ?: -1 + } } diff --git a/android/navi-common/src/main/java/com/navi/common/model/common/InvestmentTabNudgeData.kt b/android/navi-common/src/main/java/com/navi/common/model/common/InvestmentTabNudgeData.kt new file mode 100644 index 0000000000..4a3eb1701f --- /dev/null +++ b/android/navi-common/src/main/java/com/navi/common/model/common/InvestmentTabNudgeData.kt @@ -0,0 +1,18 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.navi.common.model.common + +import com.navi.base.model.GenericAnalytics + +data class InvestmentTabNudgeData( + val title: String? = null, + val subtitle: String? = null, + val bgColor: String? = null, + val metaData: GenericAnalytics? = null, + val iconCode: String? = null +)