TP-38527 | HI nav bar redirection (#7566)

This commit is contained in:
Himanshu Tanwar
2023-08-18 15:08:43 +05:30
committed by GitHub
parent 09e2c922e5
commit 24b4f14f93
17 changed files with 200 additions and 99 deletions

View File

@@ -7,20 +7,31 @@
package com.naviapp.common.viewmodel
import android.os.Bundle
import android.view.Menu
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.navi.base.model.CtaData
import com.navi.base.model.GenericAnalyticsData
import com.navi.base.utils.isNotNull
import com.navi.base.utils.isNull
import com.navi.base.utils.orZero
import com.navi.common.lottie.LottieRemoteHelper
import com.navi.common.model.ModuleName
import com.navi.common.utils.CommonNaviAnalytics
import com.navi.common.utils.TemporaryStorageHelper
import com.navi.common.viewmodel.BaseVM
import com.navi.insurance.common.fragment.LandingPageInfoFragment
import com.navi.insurance.common.models.GiErrorMetaData
import com.navi.insurance.network.ApiErrorTagType
import com.navi.insurance.util.getGlobalErrorType
import com.navi.naviwidgets.models.response.CtaDetails
import com.naviapp.R
import com.naviapp.analytics.utils.NaviAnalytics
import com.naviapp.common.repository.BottomNavBarRepository
import com.naviapp.home.activity.NewDashboardActivity
import com.naviapp.home.dashboard.ui.ProductFragment
import com.naviapp.home.model.BottomBarResponse
import com.naviapp.home.model.BottomBarTab
import com.naviapp.home.model.BottomBarTabType
@@ -28,6 +39,8 @@ import com.naviapp.home.respository.GlobalRepo
import com.naviapp.utils.deepCopyCheckForBottomNavData
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import javax.inject.Inject
@@ -50,6 +63,9 @@ class BottomNavBarVM @Inject constructor(
val defaultBottomBarVisible: LiveData<Boolean>
get() = _defaultBottomBarVisible
private val _giNavCtaFlow = MutableStateFlow<CtaDetails?>(null)
val giNavCtaFlow = _giNavCtaFlow.asStateFlow()
private var isOldDashboardEnabled = true
private val naviAnalyticsEventTracker = NaviAnalytics.naviAnalytics.Dashboard()
@@ -198,6 +214,61 @@ class BottomNavBarVM @Inject constructor(
return data
}
fun fetchGiNavCta() {
viewModelScope.launch(Dispatchers.IO) {
val response = globalRepo.fetchGiNavCta()
if (response.error == null && response.errors.isNullOrEmpty() && response.data != null) {
_giNavCtaFlow.emit(response.data)
} else {
CommonNaviAnalytics.naviAnalytics.GiError().onGlobalError(
response.error?.message,
NewDashboardActivity.PAGE_HOME,
(ModuleName.GI.name).lowercase(),
getGlobalErrorType(response.error?.statusCode),
response.error?.statusCode,
null,
GiErrorMetaData.FLOW_NAVBAR_INSURANCE,
ApiErrorTagType.FETCH_GI_NAVBAR_CTA_ERROR.value,
null,
null,
true
)
}
}
}
private fun getGiNavCta(): CtaData? {
return _giNavCtaFlow.value?.cta
}
fun getInsuranceBundle(): Bundle {
val bundle = Bundle()
getGiNavCta()?.parameters?.forEach { lineItem ->
bundle.putString(lineItem.key, lineItem.value)
}
bundle.putString(
LandingPageInfoFragment.LANDING_PAGE_TYPE,
LandingPageInfoFragment.HI_LP_FROM_DASHBOARD
)
LandingPageInfoFragment().apply {
arguments = bundle
}
return bundle
}
fun getInsuranceSubType(): String {
val splitDeepLink = getGiNavCta()?.url?.split("/")
return splitDeepLink?.let {
when(val thirdIdentifier = it.getOrNull(2)) {
ProductFragment.DashboardTypes.Insurance.name -> thirdIdentifier
ProductFragment.DashboardTypes.Insurance_landing_page.name -> thirdIdentifier
else -> ProductFragment.DashboardTypes.Insurance.name
}
} ?: run {
ProductFragment.DashboardTypes.Insurance.name
}
}
companion object {
private const val BOTTOM_BAR_MAX_TABS = 5
}

View File

@@ -54,20 +54,17 @@ import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper
import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.BOTTOM_BAR_COLOR_ENABLED
import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.BOTTOM_SCROLL_ENABLED
import com.navi.common.juspay.HyperServicesHolder
import com.navi.common.listeners.DashboardFragmentListener
import com.navi.common.listeners.DialogCancelListener
import com.navi.common.lottie.LottieRemoteHelper
import com.navi.common.managers.PermissionsManager
import com.navi.common.managers.UserManager
import com.navi.common.model.ModuleNameV2
import com.navi.common.model.UserDetail
import com.navi.common.model.common.AppUpdateData
import com.navi.common.ui.fragment.BaseFragment
import com.navi.common.utils.*
import com.navi.common.utils.Constants.SHOW_INVESTMENT_ON_BOTTOM_NAV
import com.navi.common.utils.Constants.SKIP_PERMISSION_SCREEN
import com.navi.common.utils.Constants.SUB_REDIRECT
import com.navi.design.utils.CornerRadius
import com.navi.design.utils.dpToPxInInt
import com.navi.design.utils.getNaviDrawable
import com.navi.design.utils.moveViewWithDistanceAnimator
@@ -95,9 +92,13 @@ import com.naviapp.dashboard.DashboardBaseActivity
import com.naviapp.dashboard.listeners.DialogBoxPrimaryCtaListener
import com.naviapp.dashboard.listeners.DialogBoxResponseListener
import com.naviapp.databinding.NewDashboardActivityBinding
import com.naviapp.home.dashboard.models.response.DashboardTab
import com.naviapp.home.dashboard.ui.DashboardFragment
import com.naviapp.home.dashboard.ui.InvestmentsFragment
import com.navi.common.listeners.DashboardFragmentListener
import com.navi.common.model.common.AppUpdateData
import com.navi.design.utils.CornerRadius
import com.navi.insurance.common.fragment.LandingPageInfoFragment
import com.naviapp.home.dashboard.models.response.DashboardTab
import com.naviapp.home.dashboard.ui.ProductFragment
import com.naviapp.home.fragment.HomeFragment
import com.naviapp.home.fragment.LoanContainerFragment
@@ -253,6 +254,10 @@ class NewDashboardActivity :
bottomNavBarVM.getBottomBarTabData(bottomNavBarVM.getTabName(binding.bottomNavigationView.selectedItemId))?.actionData?.let {
updateTab(HomeFragment.TAG, intent.extras)
}
if(TemporaryStorageHelper.fetchGiNavCta) {
bottomNavBarVM.fetchGiNavCta()
TemporaryStorageHelper.fetchGiNavCta = false
}
TempStorageHelper.clear()
if (isAllMandatoryPermissionGranted(permissionsManager).not() && PreferenceManager.getBooleanPreference(
SKIP_PERMISSION_SCREEN,
@@ -296,14 +301,14 @@ class NewDashboardActivity :
): Fragment {
return when (screen) {
HomeFragment.TAG -> HomeFragment.newInstance(bundle)
DashboardFragment.TAG -> getDashboardFragment(subType ?: bundle?.getString(SUB_REDIRECT), bundle)
DashboardFragment.TAG -> getDashboardFragment(screen, subType ?: bundle?.getString(SUB_REDIRECT), bundle)
ProfileFragment.TAG -> ProfileFragment.newInstance(bundle)
FundListingFragmentV2.TAG -> InvestmentsFragment.newInstance(bundle)
else -> HomeFragment.newInstance(bundle)
}
}
private fun getDashboardFragment(subType: String?, bundle: Bundle?): Fragment {
private fun getDashboardFragment(screen: String, subType: String?, bundle: Bundle?): Fragment {
if (bottomNavBarVM.isOldDashboardEnabled()) {
return DashboardFragment.getInstance(bundle)
}
@@ -311,8 +316,11 @@ class NewDashboardActivity :
ProductFragment.DashboardTypes.Loans.name ->
LoanContainerFragment.getInstance()
ProductFragment.DashboardTypes.Insurance.name ->
ProductFragment.getInstance(DashboardTab(subType))
ProductFragment.DashboardTypes.Insurance.name -> handleInsuranceDashboardTab(screen, subType)
ProductFragment.DashboardTypes.Insurance_landing_page.name -> LandingPageInfoFragment().apply {
arguments = bundle
}
ProductFragment.DashboardTypes.Investment.name,
FundListingFragmentV2.TAG -> InvestmentsFragment.newInstance(
@@ -323,6 +331,15 @@ class NewDashboardActivity :
}
}
private fun handleInsuranceDashboardTab(screen: String, subType: String): Fragment {
//remove landing page fragment from stack if present
val fragment = supportFragmentManager.findFragmentByTag(screen + ProductFragment.DashboardTypes.Insurance_landing_page.name)
if(fragment != null) {
supportFragmentManager.beginTransaction().remove(fragment).commit()
}
return ProductFragment.getInstance(DashboardTab(subType))
}
private fun initAppUpdate() {
if (FirebaseRemoteConfigHelper.getBoolean(FirebaseRemoteConfigHelper.IN_APP_UPDATE)) {
inAppUpdateVM.init()
@@ -617,6 +634,7 @@ class NewDashboardActivity :
permissionGranted = isAllMandatoryPermissionGranted(this),
installedModules = getInstalledDynamicModulesCommaSeparated()
)
bottomNavBarVM.fetchGiNavCta()
}
private fun fetchOfferDialog() {
@@ -938,14 +956,14 @@ class NewDashboardActivity :
BottomBarTabType.INSURANCE -> {
navigateToNextScreen(
defaultFragment,
null,
ProductFragment.DashboardTypes.Insurance.name
bottomNavBarVM.getInsuranceBundle(),
bottomNavBarVM.getInsuranceSubType()
)
}
else -> {
setStatusBarColor(R.color.white)
navigateToNextScreen(defaultFragment, null)
navigateToNextScreen(defaultFragment, null, null)
}
}
}

View File

@@ -813,7 +813,7 @@ class ProductFragment : PartPrePaymentBaseFragment(), WidgetCallback, DashboardP
}
enum class DashboardTypes {
Loans, Insurance, Investment
Loans, Insurance, Investment, Insurance_landing_page
}
override fun reload() {

View File

@@ -15,6 +15,7 @@ import com.navi.naviwidgets.utils.APP_UPDATE_ENABLE
import com.naviapp.home.dashboard.models.response.InvestmentsResponse
import com.naviapp.home.model.BottomBarResponse
import com.navi.common.model.common.WidgetResponse
import com.navi.naviwidgets.models.response.CtaDetails
import com.naviapp.network.di.SuperAppRetroFit
import com.naviapp.network.retrofit.ResponseCallback
import com.naviapp.network.retrofit.RetrofitService
@@ -138,4 +139,8 @@ class GlobalRepo @Inject constructor(@SuperAppRetroFit private val superAppRetro
TemporaryStorageHelper.isBottomNavApiInProgress = false
}
}
suspend fun fetchGiNavCta(): RepoResult<CtaDetails> {
return apiResponseCallback(superAppRetrofitService.fetchGiNavCta())
}
}

View File

@@ -9,10 +9,14 @@ package com.naviapp.home.viewmodel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.navi.base.model.ActionData
import com.navi.base.model.CtaData
import com.navi.common.viewmodel.BaseVM
import com.navi.common.model.common.LoanTabData
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch
import javax.inject.Inject
@HiltViewModel

View File

@@ -1697,6 +1697,11 @@ interface RetrofitService {
@Header(HEADER_INSTALLED_MODULES) installedModules: String
): Response<GenericResponse<BottomBarResponse>>
@GET("/widgets/sa/gi/nav-bar/cta")
suspend fun fetchGiNavCta(
@Header("X-Target") target: String = ModuleName.GI.name
): Response<GenericResponse<CtaDetails>>
@GET("/requests/{requestId}")
suspend fun fetchAsyncRPDData(
@Path("requestId") requestId: String?

View File

@@ -32,7 +32,6 @@ import com.navi.base.utils.isNotNullAndNotEmpty
import com.navi.base.utils.orFalse
import com.navi.chat.ui.activities.NaviChatActivity
import com.navi.chat.utils.CHAT_PN_RECEIVED
import com.navi.common.model.ModuleName
import com.navi.common.model.PushNotificationData
import com.navi.common.pushnotification.CustomNotificationHandler
import com.navi.common.pushnotification.NotificationCancelBroadcastReceiver
@@ -41,7 +40,6 @@ import com.navi.common.pushnotification.NotificationReceiverActivity
import com.navi.common.repositories.FcmCallbackRepository
import com.navi.common.utils.getSessionId
import com.navi.common.utils.log
import com.navi.insurance.notifications.GiNotificationHandler
import com.naviapp.R
import com.naviapp.common.navigator.NaviDeepLinkNavigator.CHAT_ACTIVITY
import com.naviapp.pushnotification.NotificationHandler
@@ -66,15 +64,7 @@ class NaviFirebaseMessagingService : FirebaseMessagingService() {
super.onMessageReceived(remoteMessage)
sendCallbackToBackend(remoteMessage)
Timber.d("Notification received: $remoteMessage")
when (remoteMessage.data[NotificationConstants.MODULE]) {
ModuleName.GI.name -> {
GiNotificationHandler.handlePushNotification(applicationContext, remoteMessage)
}
else -> {
handleNotificationForSuperApp(remoteMessage)
Timber.d("Notification received: ${remoteMessage.data}")
}
}
handleNotificationForSuperApp(remoteMessage)
}
private fun sendCallbackToBackend(remoteMessage: RemoteMessage) {

View File

@@ -31,6 +31,7 @@ object TemporaryStorageHelper {
var isBottomNavApiInProgress = false
var isInvestmentPageApiInProgress = false
var isPermissionSkipFlow = false
var fetchGiNavCta = false
fun clear() {
apiResponse.clear()

View File

@@ -83,6 +83,7 @@ class LandingPageInfoFragment : GiBaseFragment(), WidgetCallback {
private var shouldShowFooter = false
private var naviPolicyDocumentDownloadManager: NaviPolicyDocumentDownloadManager? = null
private val keyPreQuoteExists = "preQuoteExists"
private var isLandingPageFromDashboard = false
@Inject
lateinit var idProvider: IdProvider
@@ -219,14 +220,14 @@ class LandingPageInfoFragment : GiBaseFragment(), WidgetCallback {
startIndex: Int
): Boolean {
return if (landingPageVersion != LANDING_PAGE_V3_CODE) {
recyclerHolder !is TitleWithBannerInfoWidgetVH
recyclerHolder !is TitleWithBannerInfoWidgetVH && !isLandingPageFromDashboard
} else {
if (shouldShowFooterViaBanner(startIndex.orZero() - 1)) {
shouldShowFooter = true
} else if (shouldShowFooterViaBanner(startIndex)) {
shouldShowFooter = false
}
shouldShowFooter
shouldShowFooter && !isLandingPageFromDashboard
}
}
@@ -234,7 +235,7 @@ class LandingPageInfoFragment : GiBaseFragment(), WidgetCallback {
return (isValidIndex(currIndex.orZero(), contentWidgetList?.size.orZero()) &&
((contentWidgetList?.getOrNull(currIndex.orZero())) as? SingleImageWidget)
?.singleImageWidgetBody
?.actionOnHide == true)
?.actionOnHide == true) && !isLandingPageFromDashboard
}
override fun onAttach(context: Context) {
@@ -242,6 +243,7 @@ class LandingPageInfoFragment : GiBaseFragment(), WidgetCallback {
listener = context as? IntroActivityCallback
source = arguments?.get("source") as? String ?: LANDING_PAGE
tabId = arguments?.get(TAB_ID) as? String
isLandingPageFromDashboard = arguments?.getString(LANDING_PAGE_TYPE) == HI_LP_FROM_DASHBOARD
}
override fun getViewModel(): GiBaseVM = viewModel
@@ -299,7 +301,11 @@ class LandingPageInfoFragment : GiBaseFragment(), WidgetCallback {
landingPageRvAdapter?.setData(landingPageInfoViewState.data.content)
}
landingPageInfoViewState.data?.header?.getOrNull(0)?.widgetData?.run {
updateContainer(this, binding.headerContainer)
if(!isLandingPageFromDashboard) {
updateContainer(this, binding.headerContainer)
} else {
binding.headerContainer.isVisible = false
}
}
landingPageInfoViewState.data?.pageLayoutParams?.let { pageLayoutParams ->
if (isValidHexColor(pageLayoutParams.pageBackgroundColor)) {
@@ -482,6 +488,8 @@ class LandingPageInfoFragment : GiBaseFragment(), WidgetCallback {
const val LANDING_PAGE_V3_CODE = 3
const val LANDING_PAGE_VERSION_KEY = "landingPageVersion"
const val LINE_TEXT_BOTTOM_SHEET = "LINE_TEXT_BOTTOM_SHEET"
const val LANDING_PAGE_TYPE = "LANDING_PAGE_TYPE"
const val HI_LP_FROM_DASHBOARD = "HI_LP_FROM_DASHBOARD"
}
override val screenName: String

View File

@@ -50,6 +50,7 @@ data class GiErrorMetaData(
const val FLOW_RENEWAL = "renewal"
const val FEEDBACK_FORM = "feedback_form"
const val HI_QUIZ = "hi_quiz"
const val FLOW_NAVBAR_INSURANCE = "navbar_insurance"
const val FLOW_FREE_INSURANCE = "free_insurance"
const val FLOW_AVAIL_BENEFIT = "avail_benefit"
const val FLOW_INCENTIVISE_AUTOPAY = "incentivise_autopay"

View File

@@ -90,7 +90,7 @@ class NewQuoteClaimsFragmentV2 : BaseFragment() {
}
binding.title.header.addOnMultipleClicksHandler {
parentFragmentManager.popBackStackImmediate()
activity?.onBackPressed()
}
arguments?.getParcelable<CtaData>(Constants.PARAMS_EXTRA)?.let { ctaData ->

View File

@@ -9,19 +9,18 @@ package com.navi.insurance.health.viewmodel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.navi.analytics.utils.NaviTrackEvent
import com.navi.base.model.CtaData
import com.navi.common.network.models.RepoResult
import com.navi.common.utils.TemporaryStorageHelper
import com.navi.insurance.GILibManager
import com.navi.insurance.R
import com.navi.insurance.analytics.InsuranceAnalyticsConstants
import com.navi.insurance.common.GiBaseVM
import com.navi.insurance.common.fragment.GiSurveyBottomSheet
import com.navi.insurance.common.models.AbExperimentInfoData
import com.navi.insurance.common.models.GiErrorMetaData
import com.navi.insurance.common.util.ActionHandler
import com.navi.insurance.health.repository.QuoteRepository
import com.navi.insurance.models.UserLocation
@@ -31,7 +30,6 @@ import com.navi.insurance.models.request.OfferRequest
import com.navi.insurance.models.request.QuoteOfferUpdateRequest
import com.navi.insurance.models.response.*
import com.navi.insurance.network.ApiErrorTagType
import com.navi.insurance.util.APPLICATION_TYPE_EXTRA
import com.navi.insurance.util.Constants.QUOTE_HIGHLIGHT
import com.navi.insurance.util.GIAbExperimentConstants.BOTTOM_SHEET_WITH_DISCOUNT_VARIANT
import com.navi.insurance.util.GIAbExperimentConstants.KEY_PAYMENT_REVIEW_REMOVAL
@@ -164,6 +162,7 @@ constructor(private val repository: QuoteRepository, actionHandler: ActionHandle
repository.fetchQuoteCta(OfferRequest(preQuoteId = preQuoteId))
if (response.error == null && response.errors.isNullOrEmpty()) {
TemporaryStorageHelper.fetchGiNavCta = true
_quoteLauncherCta.value = response.data
_preQuoteId.value = preQuoteId
} else {

View File

@@ -99,6 +99,7 @@ enum class ApiErrorTagType(val value: String) {
LANDING_INFO_PAGE_LOAD_ERROR("LANDING_INFO_PAGE_LOAD_ERROR"),
FREE_INSURANCE_LANDING_LOAD_ERROR("FREE_INSURANCE_LANDING_LOAD_ERROR"),
FREE_INSURANCE_GENDER_SUBMIT_ERROR("FREE_INSURANCE_GENDER_SUBMIT_ERROR"),
FETCH_GI_NAVBAR_CTA_ERROR("FETCH_GI_NAVBAR_CTA_ERROR"),
HRA_FI_ACTIVATION_SCREEN_LOAD_ERROR("HRA_FI_ACTIVATION_SCREEN_LOAD_ERROR"),
HRA_FI_ACTIVATION_RESULT_ERROR("HRA_FI_ACTIVATION_RESULT_ERROR"),
FETCH_PAYMENT_REVIEW_DATA_ERROR("FETCH_PAYMENT_REVIEW_DATA_ERROR"),

View File

@@ -1,64 +0,0 @@
/*
*
* * Copyright © 2019-2023 by Navi Technologies Limited
* * All rights reserved. Strictly confidential
*
*/
package com.navi.insurance.notifications
import android.app.NotificationManager
import android.content.Context
import com.google.firebase.messaging.RemoteMessage
import com.navi.analytics.moengage.MoengageUtil
import com.navi.base.utils.isNotNullAndNotEmpty
import com.navi.common.pushnotification.CustomNotificationHandler
import com.navi.common.pushnotification.NotificationConstants
import com.navi.insurance.R
import com.navi.insurance.notifications.MessageDataModel.ModelMapper.from
object GiNotificationHandler {
fun handlePushNotification(context: Context, remoteMessage: RemoteMessage) {
val gcmPayLoad: MutableMap<String, String> = remoteMessage.data
val messageDataModel = from(remoteMessage.data)
if(gcmPayLoad[NotificationConstants.TEMPLATE_TYPE].isNotNullAndNotEmpty()) {
gcmPayLoad.apply {
put(NotificationConstants.LARGE_ICON, (R.drawable.notifiaction_icon_large).toString())
put(NotificationConstants.SMALL_ICON, (R.drawable.ic_navi_logo_white).toString())
}
CustomNotificationHandler.handlePushNotification(context, remoteMessage.data)
} else if(gcmPayLoad[NotificationConstants.SILENT_NOTIFICATION_TYPE] == NotificationConstants.CANCEL_PUSH_NOTIFICATION) {
cancelPushNotification(context, gcmPayLoad)
} else if (MoengageUtil.isFromMoEngagePlatform(gcmPayLoad) && !MoengageUtil.isSilentPush(gcmPayLoad)) {
if (messageDataModel.handleViaDeepLink) {
onPushNotificationReceived(messageDataModel, gcmPayLoad)
} else {
MoengageUtil.passPushPayload(context, gcmPayLoad)
}
} else if (!MoengageUtil.isFromMoEngagePlatform(gcmPayLoad)) {
onPushNotificationReceived(messageDataModel, gcmPayLoad)
}
}
private fun onPushNotificationReceived(
messageDataModel: MessageDataModel,
payload: MutableMap<String, String>?
) {
val notification = Notification(
messageDataModel,
payload
)
notification.createNotification()
}
private fun cancelPushNotification(context: Context, data: Map<String, String>) {
val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as? NotificationManager
val notificationId = try {
data[NotificationConstants.NOTIFICATION_ID]?.toInt() ?: -1
} catch (ignore: Exception) {
-1
}
manager?.cancel(notificationId)
}
}

View File

@@ -7,7 +7,8 @@
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
xmlns:tools="http://schemas.android.com/tools"
xmlns:shimmer="http://schemas.android.com/apk/res-auto">
<RelativeLayout
android:id="@+id/landing_page_info_layout"
@@ -18,9 +19,23 @@
android:id="@+id/shimmer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone">
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:visibility="gone"
tools:visibility="visible"
app:layout_constraintTop_toTopOf="parent"
shimmer:duration="@integer/integer_800">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
layout="@layout/landing_page_shimmer_placeholder" />
</LinearLayout>
<include layout="@layout/quote_shimmer_loading_placeholder" />
</com.facebook.shimmer.ShimmerFrameLayout>
<FrameLayout

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ /*
~ *
~ * * Copyright © 2022 by Navi Technologies Private Limited
~ * * All rights reserved. Strictly confidential
~ *
~ */
-->
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<View
android:id="@+id/viewTitle"
android:layout_width="@dimen/layout_dp_150"
android:layout_height="@dimen/layout_dp_20"
android:layout_marginStart="@dimen/layout_dp_16"
android:layout_marginTop="@dimen/layout_dp_42"
android:background="@drawable/bg_grey_8dp_radius"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/viewContent1"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_254"
android:layout_marginStart="@dimen/layout_dp_16"
android:layout_marginTop="@dimen/layout_dp_24"
android:layout_marginEnd="@dimen/layout_dp_16"
android:background="@drawable/bg_grey_8dp_radius"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/viewTitle" />
<View
android:id="@+id/viewContent2"
android:layout_width="match_parent"
android:layout_height="@dimen/layout_dp_136"
android:layout_marginStart="@dimen/layout_dp_16"
android:layout_marginTop="@dimen/layout_dp_4"
android:layout_marginEnd="@dimen/layout_dp_16"
android:background="@drawable/bg_grey_8dp_radius"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/viewContent1" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -10,7 +10,7 @@
<com.google.android.material.card.MaterialCardView
android:id="@+id/root_card"
style="@style/Theme.MaterialComponents.Light"
android:theme="@style/Theme.MaterialComponents.Light"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="@dimen/dp_8"