diff --git a/android/benchmark/src/main/java/com/naviapp/benchmark/baselineprofile/HomePageScrollBaselineProfile.kt b/android/benchmark/src/main/java/com/naviapp/benchmark/baselineprofile/HomePageScrollBaselineProfile.kt index 0e821a5ad4..c076782f3d 100644 --- a/android/benchmark/src/main/java/com/naviapp/benchmark/baselineprofile/HomePageScrollBaselineProfile.kt +++ b/android/benchmark/src/main/java/com/naviapp/benchmark/baselineprofile/HomePageScrollBaselineProfile.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.naviapp.benchmark.baselineprofile import android.os.Build @@ -11,16 +18,12 @@ import org.junit.Rule import org.junit.Test class HomePageScrollBaselineProfile { - @RequiresApi(Build.VERSION_CODES.P) - @get:Rule - val baselineProfileRule = BaselineProfileRule() + @RequiresApi(Build.VERSION_CODES.P) @get:Rule val baselineProfileRule = BaselineProfileRule() @RequiresApi(Build.VERSION_CODES.P) @Test fun generate() = - baselineProfileRule.collect( - PACKAGE_NAME - ) { + baselineProfileRule.collect(PACKAGE_NAME) { startActivityAndAllowNotifications() waitForHomePage() scrollHomePage() diff --git a/android/benchmark/src/main/java/com/naviapp/benchmark/home/HomePageScrollBenchmark.kt b/android/benchmark/src/main/java/com/naviapp/benchmark/home/HomePageScrollBenchmark.kt index e8d82608e3..366dbc65dd 100644 --- a/android/benchmark/src/main/java/com/naviapp/benchmark/home/HomePageScrollBenchmark.kt +++ b/android/benchmark/src/main/java/com/naviapp/benchmark/home/HomePageScrollBenchmark.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.naviapp.benchmark.home import androidx.benchmark.macro.CompilationMode @@ -13,33 +20,29 @@ import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith - @RunWith(AndroidJUnit4::class) class HomePageScrollBenchmark { - @get:Rule - val benchmarkRule = MacrobenchmarkRule() + @get:Rule val benchmarkRule = MacrobenchmarkRule() - @Test - fun scrollHomeCompilationNone() = scrollHomePage(CompilationMode.None()) + @Test fun scrollHomeCompilationNone() = scrollHomePage(CompilationMode.None()) - @Test - fun scrollHomeCompilationBaselineProfile() = scrollHomePage(CompilationMode.Partial()) + @Test fun scrollHomeCompilationBaselineProfile() = scrollHomePage(CompilationMode.Partial()) - @Test - fun scrollHomeCompilationFull() = scrollHomePage(CompilationMode.Full()) + @Test fun scrollHomeCompilationFull() = scrollHomePage(CompilationMode.Full()) - private fun scrollHomePage(compilationMode: CompilationMode) = benchmarkRule.measureRepeated( - packageName = PACKAGE_NAME, - metrics = listOf(FrameTimingMetric()), - iterations = 10, - startupMode = StartupMode.WARM, - compilationMode = compilationMode, - setupBlock = { - pressHome() - startActivityAndAllowNotifications() + private fun scrollHomePage(compilationMode: CompilationMode) = + benchmarkRule.measureRepeated( + packageName = PACKAGE_NAME, + metrics = listOf(FrameTimingMetric()), + iterations = 10, + startupMode = StartupMode.WARM, + compilationMode = compilationMode, + setupBlock = { + pressHome() + startActivityAndAllowNotifications() + } + ) { + waitForHomePage() + scrollHomePage() } - ) { - waitForHomePage() - scrollHomePage() - } -} \ No newline at end of file +} diff --git a/android/benchmark/src/main/java/com/naviapp/benchmark/startup/StartupBenchmark.kt b/android/benchmark/src/main/java/com/naviapp/benchmark/startup/StartupBenchmark.kt index 828a8027f0..3a9c9e2423 100644 --- a/android/benchmark/src/main/java/com/naviapp/benchmark/startup/StartupBenchmark.kt +++ b/android/benchmark/src/main/java/com/naviapp/benchmark/startup/StartupBenchmark.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.naviapp.benchmark.startup import androidx.benchmark.macro.BaselineProfileMode.Disable @@ -17,36 +24,35 @@ import org.junit.runner.RunWith @RunWith(AndroidJUnit4ClassRunner::class) class StartupBenchmark { - @get:Rule - val benchmarkRule = MacrobenchmarkRule() + @get:Rule val benchmarkRule = MacrobenchmarkRule() + + @Test fun startupWithoutPreCompilation() = startup(CompilationMode.None()) @Test - fun startupWithoutPreCompilation() = startup(CompilationMode.None()) - - @Test - fun startupWithPartialCompilationAndDisabledBaselineProfile() = startup( - CompilationMode.Partial(baselineProfileMode = Disable, warmupIterations = 1), - ) + fun startupWithPartialCompilationAndDisabledBaselineProfile() = + startup( + CompilationMode.Partial(baselineProfileMode = Disable, warmupIterations = 1), + ) @Test fun startupPrecompiledWithBaselineProfile() = startup(CompilationMode.Partial(baselineProfileMode = Require)) - @Test - fun startupFullyPrecompiled() = startup(CompilationMode.Full()) + @Test fun startupFullyPrecompiled() = startup(CompilationMode.Full()) - private fun startup(compilationMode: CompilationMode) = benchmarkRule.measureRepeated( - packageName = PACKAGE_NAME, - metrics = listOf(StartupTimingMetric()), - compilationMode = compilationMode, - iterations = 5, - startupMode = COLD, - setupBlock = { - pressHome() - allowNotifications() - }, - ) { - startActivityAndAllowNotifications() - waitForHomePageLoad() - } + private fun startup(compilationMode: CompilationMode) = + benchmarkRule.measureRepeated( + packageName = PACKAGE_NAME, + metrics = listOf(StartupTimingMetric()), + compilationMode = compilationMode, + iterations = 5, + startupMode = COLD, + setupBlock = { + pressHome() + allowNotifications() + }, + ) { + startActivityAndAllowNotifications() + waitForHomePageLoad() + } } diff --git a/android/benchmark/src/main/java/com/naviapp/benchmark/utils/GeneralActions.kt b/android/benchmark/src/main/java/com/naviapp/benchmark/utils/GeneralActions.kt index 893fde03f1..e7da4a45c8 100644 --- a/android/benchmark/src/main/java/com/naviapp/benchmark/utils/GeneralActions.kt +++ b/android/benchmark/src/main/java/com/naviapp/benchmark/utils/GeneralActions.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.naviapp.benchmark.utils import android.Manifest.permission @@ -15,4 +22,4 @@ fun MacrobenchmarkScope.allowNotifications() { fun MacrobenchmarkScope.startActivityAndAllowNotifications() { startActivityAndWait() allowNotifications() -} \ No newline at end of file +} diff --git a/android/benchmark/src/main/java/com/naviapp/benchmark/utils/HomePageActions.kt b/android/benchmark/src/main/java/com/naviapp/benchmark/utils/HomePageActions.kt index ecac1fd963..0f1ae63636 100644 --- a/android/benchmark/src/main/java/com/naviapp/benchmark/utils/HomePageActions.kt +++ b/android/benchmark/src/main/java/com/naviapp/benchmark/utils/HomePageActions.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.naviapp.benchmark.utils import androidx.benchmark.macro.MacrobenchmarkScope @@ -8,35 +15,34 @@ import androidx.test.uiautomator.Until import java.util.concurrent.TimeUnit fun MacrobenchmarkScope.waitForHomePage() { - device.wait( - Until.hasObject(By.clazz(HOME_PAGE_CLASS_NAME)), TimeUnit.SECONDS.toMillis(50) - ) + device.wait(Until.hasObject(By.clazz(HOME_PAGE_CLASS_NAME)), TimeUnit.SECONDS.toMillis(50)) } + fun MacrobenchmarkScope.scrollHomePage() { - val list = device.waitAndFindObject(By.res("homeScreenWidgetsList"), TimeUnit.SECONDS.toMillis(10)) + val list = + device.waitAndFindObject(By.res("homeScreenWidgetsList"), TimeUnit.SECONDS.toMillis(10)) device.flingElementDownUp(list) } fun MacrobenchmarkScope.waitForHomePageLoad() { - device.wait( - Until.hasObject(By.clazz(HOME_PAGE_CLASS_NAME)), TimeUnit.SECONDS.toMillis(50) - ) - val list = device.waitAndFindObject( - By.res("homeScreenWidgetsList"), TimeUnit.SECONDS.toMillis(10) - ) + device.wait(Until.hasObject(By.clazz(HOME_PAGE_CLASS_NAME)), TimeUnit.SECONDS.toMillis(50)) + val list = + device.waitAndFindObject(By.res("homeScreenWidgetsList"), TimeUnit.SECONDS.toMillis(10)) list.wait(untilHasChildren(), 60_000) } fun untilHasChildren( childCount: Int = 1, op: HasChildrenOp = HasChildrenOp.AT_LEAST, -): UiObject2Condition = object : UiObject2Condition() { - override fun apply(element: UiObject2): Boolean = when (op) { - HasChildrenOp.AT_LEAST -> element.childCount >= childCount - HasChildrenOp.EXACTLY -> element.childCount == childCount - HasChildrenOp.AT_MOST -> element.childCount <= childCount +): UiObject2Condition = + object : UiObject2Condition() { + override fun apply(element: UiObject2): Boolean = + when (op) { + HasChildrenOp.AT_LEAST -> element.childCount >= childCount + HasChildrenOp.EXACTLY -> element.childCount == childCount + HasChildrenOp.AT_MOST -> element.childCount <= childCount + } } -} enum class HasChildrenOp { AT_LEAST, diff --git a/android/benchmark/src/main/java/com/naviapp/benchmark/utils/Utils.kt b/android/benchmark/src/main/java/com/naviapp/benchmark/utils/Utils.kt index 4ca8af9628..80d5328d8b 100644 --- a/android/benchmark/src/main/java/com/naviapp/benchmark/utils/Utils.kt +++ b/android/benchmark/src/main/java/com/naviapp/benchmark/utils/Utils.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.naviapp.benchmark.utils import androidx.test.uiautomator.BySelector @@ -6,9 +13,7 @@ import androidx.test.uiautomator.UiDevice import androidx.test.uiautomator.UiObject2 import androidx.test.uiautomator.Until -val PACKAGE_NAME = buildString { - append("com.naviapp.dev") -} +val PACKAGE_NAME = buildString { append("com.naviapp.dev") } val HOME_PAGE_CLASS_NAME = buildString { append("com.naviapp.home.compose.activity.HomePageActivity") diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/base/HLBaseFragment.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/base/HLBaseFragment.kt index 606d3285c4..60d32152dc 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/base/HLBaseFragment.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/base/HLBaseFragment.kt @@ -14,7 +14,6 @@ import com.navi.base.deeplink.DeepLinkManager import com.navi.base.deeplink.util.DeeplinkConstants import com.navi.base.model.CtaData import com.navi.base.model.LineItem -import com.navi.naviwidgets.models.response.Action import com.navi.common.network.models.AssetDetails import com.navi.common.network.models.GenericErrorResponse import com.navi.common.ui.activity.BaseActivity @@ -26,24 +25,24 @@ import com.navi.common.utils.replaceLayout import com.navi.homeloan.R import com.navi.naviwidgets.callbacks.WidgetCallback import com.navi.naviwidgets.models.NaviWidget +import com.navi.naviwidgets.models.response.Action import com.navi.naviwidgets.widgets.BaseNaviWidgetLayout import com.navi.naviwidgets.widgets.WidgetIdProvider import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.launch import javax.inject.Inject +import kotlinx.coroutines.launch @AndroidEntryPoint abstract class HLBaseFragment : BaseFragment() { - @Inject - lateinit var widgetIdProvider: WidgetIdProvider + @Inject lateinit var widgetIdProvider: WidgetIdProvider protected fun updateContainerLayout( naviWidget: NaviWidget, container: ViewGroup, widgetCallback: WidgetCallback? ) { - if(isSafeFragment()) { + if (isSafeFragment()) { viewLifecycleOwner.lifecycleScope.launch { val layoutBinding = container.replaceLayout(widgetIdProvider.getNaviWidgetLayoutId(naviWidget)) @@ -57,37 +56,37 @@ abstract class HLBaseFragment : BaseFragment() { } open fun isSafeFragment(): Boolean { - return !(this.isRemoving || this.activity == null || this.isDetached || !this.isAdded || this.view == null) + return !(this.isRemoving || + this.activity == null || + this.isDetached || + !this.isAdded || + this.view == null) } - fun showErrorFragment( - callback: ((view: View) -> Unit)? = null - ) { + fun showErrorFragment(callback: ((view: View) -> Unit)? = null) { try { val ft = parentFragmentManager.beginTransaction() val prev = parentFragmentManager.findFragmentByTag(FullScreenErrorDialog.TAG) if ( prev != null && - !parentFragmentManager.isStateSaved && - !parentFragmentManager.isDestroyed + !parentFragmentManager.isStateSaved && + !parentFragmentManager.isDestroyed ) { ft.remove(prev).commit() } val errorFragment = FullScreenErrorDialog.getInstance( error = - GenericErrorResponse( - title = getString(R.string.page_load_fail_title), - message = getString(R.string.page_load_fail_message), - actions = - listOf(Action(title = getString(R.string.page_load_try_again))), - assetDetails = AssetDetails(ActionErrorFragment.PAGE_LOAD_FAILED) - ), + GenericErrorResponse( + title = getString(R.string.page_load_fail_title), + message = getString(R.string.page_load_fail_message), + actions = + listOf(Action(title = getString(R.string.page_load_try_again))), + assetDetails = AssetDetails(ActionErrorFragment.PAGE_LOAD_FAILED) + ), sourceScreenName = this.screenName, moduleName = (activity as? BaseActivity)?.getCurrentModuleName(), - dialogDismissClicked = { - callback?.invoke(it) - } + dialogDismissClicked = { callback?.invoke(it) } ) ft.add(R.id.fragment_container, errorFragment, FullScreenErrorDialog.TAG) ft.commitAllowingStateLoss() @@ -97,17 +96,18 @@ abstract class HLBaseFragment : BaseFragment() { } fun openHelpScreen(screenName: String) { - val helpCtaData = CtaData( - url = DeeplinkConstants.PRODUCT_HELP_PAGE, - parameters = listOf( - LineItem( - key = DeeplinkConstants.PRODUCT_HELP_SCREEN_NAME, - value = screenName - ) + val helpCtaData = + CtaData( + url = DeeplinkConstants.PRODUCT_HELP_PAGE, + parameters = + listOf( + LineItem( + key = DeeplinkConstants.PRODUCT_HELP_SCREEN_NAME, + value = screenName + ) + ) ) - ) DeepLinkManager.getDeepLinkListener() ?.navigateTo(activity = activity, ctaData = helpCtaData, finish = false) } - } diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/AccountAggregatorLinkingScreenView.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/AccountAggregatorLinkingScreenView.kt index b40497a7e3..34530866d6 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/AccountAggregatorLinkingScreenView.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/AccountAggregatorLinkingScreenView.kt @@ -50,8 +50,7 @@ class AccountAggregatorLinkingScreenView(context: Context, attrs: AttributeSet) accountAggregatorScreenResponse.bankName?.let { binding?.bankInfoItemView?.root?.visibility = View.VISIBLE binding?.bankInfoItemView?.bankNameTv?.text = it - } - ?: run { binding?.bankInfoItemView?.root?.visibility = View.GONE } + } ?: run { binding?.bankInfoItemView?.root?.visibility = View.GONE } this.selectionType = accountAggregatorScreenResponse.selectionType binding?.bankInfoItemView?.showBankNameTv?.setOnClickListener { action?.invoke() } } diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/AggregatorBankAccountOptionView.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/AggregatorBankAccountOptionView.kt index 56694c3733..0deb995fc2 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/AggregatorBankAccountOptionView.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/AggregatorBankAccountOptionView.kt @@ -42,8 +42,7 @@ class AggregatorBankAccountOptionView(context: Context, attrs: AttributeSet?) : loadUrlIntoImageView(it, logoUrl, binding.bankLogoIv, false) } } - } - ?: run { binding.bankLogoIv.visibility = View.GONE } + } ?: run { binding.bankLogoIv.visibility = View.GONE } if (aggregatorBankAccountResponse.isAccountLinked.orFalse()) { isViewLinked = true binding.tagView.visibility = View.VISIBLE diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/ConsentDetailView.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/ConsentDetailView.kt index be680383e1..66d558fe8b 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/ConsentDetailView.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/ConsentDetailView.kt @@ -7,17 +7,17 @@ package com.navi.homeloan.common.customview -import com.navi.common.R as CommonR -import com.navi.naviwidgets.R as WidgetsR -import com.navi.design.R as DesignR import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.databinding.DataBindingUtil +import com.navi.common.R as CommonR +import com.navi.design.R as DesignR import com.navi.homeloan.R import com.navi.homeloan.databinding.HlViewConsentDetailBinding +import com.navi.naviwidgets.R as WidgetsR import com.navi.naviwidgets.extensions.setCornerRadius import com.onemoney.custom.models.output.ConsentDetail import java.text.SimpleDateFormat @@ -31,7 +31,9 @@ class ConsentDetailView(context: Context, attrs: AttributeSet?) : ConstraintLayo init { val inflater = LayoutInflater.from(context) binding = DataBindingUtil.inflate(inflater, R.layout.hl_view_consent_detail, this, true) - binding.detailsWrapper.setCornerRadius(resources.getDimensionPixelSize(CommonR.dimen.layout_dp_4)) + binding.detailsWrapper.setCornerRadius( + resources.getDimensionPixelSize(CommonR.dimen.layout_dp_4) + ) setExpanded(false) binding.clickerView.setOnClickListener { setExpanded(!isExpanded) } } diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/HLCommonBottomSheet.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/HLCommonBottomSheet.kt index d508d636a2..e1029ef8ff 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/HLCommonBottomSheet.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/HLCommonBottomSheet.kt @@ -61,10 +61,7 @@ class HLCommonBottomSheet : BaseBottomSheet(), HLFooterListener, WidgetCallback override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setStyle( - DialogFragment.STYLE_NORMAL, - R.style.DialogStyleAdjustResizeInput - ) + setStyle(DialogFragment.STYLE_NORMAL, R.style.DialogStyleAdjustResizeInput) } override fun setContainerView(viewStub: ViewStub) { @@ -76,7 +73,9 @@ class HLCommonBottomSheet : BaseBottomSheet(), HLFooterListener, WidgetCallback override fun onDismiss(dialog: DialogInterface) { super.onDismiss(dialog) if (bottomSheetType == FRAUD_CHECK_BOTTOM_SHEET) { - analyticsEventTracker.onBSFraudInfoBottomSheet((System.currentTimeMillis() - bsInfoScreenStartTime) / 1000) + analyticsEventTracker.onBSFraudInfoBottomSheet( + (System.currentTimeMillis() - bsInfoScreenStartTime) / 1000 + ) } } @@ -111,9 +110,7 @@ class HLCommonBottomSheet : BaseBottomSheet(), HLFooterListener, WidgetCallback Spacer(modifier = Modifier.height(16.dp)) Row(verticalAlignment = Alignment.Top, modifier = Modifier.fillMaxWidth()) { Canvas( - modifier = Modifier - .size(size = 12.dp) - .padding(top = 6.dp), + modifier = Modifier.size(size = 12.dp).padding(top = 6.dp), ) { drawCircle(color = Color.Black, radius = 3.dp.toPx()) } @@ -151,8 +148,7 @@ class HLCommonBottomSheet : BaseBottomSheet(), HLFooterListener, WidgetCallback start: Int, count: Int, after: Int - ) { - } + ) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} } diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/HLFooterView.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/HLFooterView.kt index 39ffef9843..56bab33a6d 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/HLFooterView.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/HLFooterView.kt @@ -16,12 +16,12 @@ import androidx.databinding.DataBindingUtil import com.navi.design.textview.NaviTextView import com.navi.design.utils.parseColorSafe import com.navi.homeloan.R -import com.navi.homeloan.common.listeners.HLFooterListener -import com.navi.homeloan.common.models.HLFooter -import com.navi.homeloan.common.models.LoanDetailsBottomSheetData import com.navi.homeloan.common.Constants.DISABLE import com.navi.homeloan.common.Constants.ENABLE import com.navi.homeloan.common.Constants.HIDE +import com.navi.homeloan.common.listeners.HLFooterListener +import com.navi.homeloan.common.models.HLFooter +import com.navi.homeloan.common.models.LoanDetailsBottomSheetData import com.navi.homeloan.databinding.ViewHlFooterBinding class HLFooterView @JvmOverloads constructor(context: Context, attr: AttributeSet? = null) : diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/HLUniversalBottomSheet.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/HLUniversalBottomSheet.kt index 81fec6f8a9..d0a49562b1 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/HLUniversalBottomSheet.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/HLUniversalBottomSheet.kt @@ -37,22 +37,25 @@ class HLUniversalBottomSheet : BaseBottomSheet() { private fun makeBottomSheetNonDraggable() { val behaviour = (dialog as BottomSheetDialog).behavior - behaviour.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() { - override fun onStateChanged(bottomSheet: View, newState: Int) { - if (newState == BottomSheetBehavior.STATE_DRAGGING) { - behaviour.state = BottomSheetBehavior.STATE_EXPANDED + behaviour.addBottomSheetCallback( + object : BottomSheetBehavior.BottomSheetCallback() { + override fun onStateChanged(bottomSheet: View, newState: Int) { + if (newState == BottomSheetBehavior.STATE_DRAGGING) { + behaviour.state = BottomSheetBehavior.STATE_EXPANDED + } + } + + override fun onSlide(bottomSheet: View, slideOffset: Float) { + /*NO OP*/ } } - - override fun onSlide(bottomSheet: View, slideOffset: Float) { - /*NO OP*/ - } - }) + ) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val isBottomSheetDraggable: Boolean = arguments?.getBoolean(IS_BOTTOM_SHEET_DRAGGABLE, true) ?: true + val isBottomSheetDraggable: Boolean = + arguments?.getBoolean(IS_BOTTOM_SHEET_DRAGGABLE, true) ?: true if (dialog is BottomSheetDialog && !isBottomSheetDraggable) { makeBottomSheetNonDraggable() } @@ -98,12 +101,17 @@ class HLUniversalBottomSheet : BaseBottomSheet() { private const val IS_BOTTOM_SHEET_DRAGGABLE = "IS_BOTTOM_SHEET_DRAGGABLE" val bottomSheetData = "bottomSheetData" val TAG = HL_UNIVERSAL_BOTTOMSHEET - fun getInstance(data: GenericBottomSheetData, isBottomSheetDraggable: Boolean = true): HLUniversalBottomSheet { + + fun getInstance( + data: GenericBottomSheetData, + isBottomSheetDraggable: Boolean = true + ): HLUniversalBottomSheet { return HLUniversalBottomSheet().apply { - val bundle = Bundle().apply { - putParcelable(bottomSheetData, data) - putBoolean(IS_BOTTOM_SHEET_DRAGGABLE, isBottomSheetDraggable) - } + val bundle = + Bundle().apply { + putParcelable(bottomSheetData, data) + putBoolean(IS_BOTTOM_SHEET_DRAGGABLE, isBottomSheetDraggable) + } arguments = bundle } } diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/OtpInputView.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/OtpInputView.kt index 473a70f4fc..0319006b5b 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/OtpInputView.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/customview/OtpInputView.kt @@ -7,7 +7,6 @@ package com.navi.homeloan.common.customview -import com.navi.design.R as DesignR import android.content.Context import android.os.CountDownTimer import android.text.Editable @@ -22,6 +21,7 @@ import androidx.lifecycle.MutableLiveData import com.navi.base.utils.EMPTY import com.navi.base.utils.MILLISECONDS_PER_SECOND import com.navi.common.utils.hideKeyboard +import com.navi.design.R as DesignR import com.navi.homeloan.R import com.navi.homeloan.databinding.HlViewOtpInputBinding import org.joda.time.DateTimeConstants.SECONDS_PER_MINUTE @@ -53,14 +53,12 @@ class OtpInputView(context: Context, attributeSet: AttributeSet) : title?.let { binding.title.visibility = View.VISIBLE binding.title.text = title - } - ?: run { binding.title.visibility = View.GONE } + } ?: run { binding.title.visibility = View.GONE } number?.let { binding.subtitle.visibility = View.VISIBLE binding.subtitle.text = context.getString(R.string.hl_sent_to_your_mobile_number, number) - } - ?: run { binding.subtitle.visibility = View.GONE } + } ?: run { binding.subtitle.visibility = View.GONE } initListeners(resendOtp) startTimer(30) clearOTP() diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/BankDataResponse.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/BankDataResponse.kt index 224d55ef7f..019ba77fef 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/BankDataResponse.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/BankDataResponse.kt @@ -65,7 +65,8 @@ data class BankDataResponse( ), iconDetail = ImageDetail( - iconCode = it.iconUrl + iconCode = + it.iconUrl ?: NaviWidgetIconUtils.ICON_HL_ROUNDED_PLACE_HOLDER_BANK ) ) diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/CommunicationAddressScreenResponse.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/CommunicationAddressScreenResponse.kt index f2591578de..1895d4fdab 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/CommunicationAddressScreenResponse.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/CommunicationAddressScreenResponse.kt @@ -18,5 +18,6 @@ data class CommunicationAddressScreenResponse( data class CommunicationAddressScreenContent( @SerializedName("widgets") val widgets: List? = null, - @SerializedName("enterEmailBottomSheet") val enterEmailBottomSheet: HomeLoanGenericBottomSheetData? = null + @SerializedName("enterEmailBottomSheet") + val enterEmailBottomSheet: HomeLoanGenericBottomSheetData? = null ) diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HLDashboardTabsResponse.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HLDashboardTabsResponse.kt index e9d7b36c64..3870efe37e 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HLDashboardTabsResponse.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HLDashboardTabsResponse.kt @@ -16,7 +16,4 @@ data class HLDashboardTabsResponse( @SerializedName("tabs") val tabs: List? = null, ) : Parcelable -@Parcelize -data class HLDashboardTab( - @SerializedName("name") val name: String -) : Parcelable +@Parcelize data class HLDashboardTab(@SerializedName("name") val name: String) : Parcelable diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HLFooter.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HLFooter.kt index 5911228ee2..881c9ddf32 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HLFooter.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HLFooter.kt @@ -24,7 +24,8 @@ data class HLFooter( @SerializedName("progress") val progress: Int? = null, @SerializedName("loanCardData") val loanCardData: LoanFooterCardInfo? = null, @SerializedName("infoNote") val footerBottomInfoData: FooterBottomInfoData? = null, - @SerializedName("rectangularInfoCardData") val rectangularInfoCardData: FooterRectangularInfoCardData? = null, + @SerializedName("rectangularInfoCardData") + val rectangularInfoCardData: FooterRectangularInfoCardData? = null, @SerializedName("nextWidgetizedBottomSheetData") val reviewPropertyDetailsBottomSheetData: ReviewPropertyDetailsBottomSheetData? = null, @SerializedName("propertyDetailsBottomSheet") diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HLPanVerificationStatusFromAP.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HLPanVerificationStatusFromAP.kt index 74c85617f4..fa14834d5c 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HLPanVerificationStatusFromAP.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HLPanVerificationStatusFromAP.kt @@ -1,5 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.homeloan.common.models -data class HLPanVerificationStatusFromAP ( - val panVerificationResultReceived: Boolean -) +data class HLPanVerificationStatusFromAP(val panVerificationResultReceived: Boolean) diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanCloseLoansResponse.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanCloseLoansResponse.kt index 8ba2f684b2..bffdc764d6 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanCloseLoansResponse.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanCloseLoansResponse.kt @@ -53,20 +53,13 @@ data class GraphData( ) data class ToastWidgetData( - @SerializedName("iconUrl") - val iconUrl: String? = null, - @SerializedName("bgColor") - val bgColor: String? = null, - @SerializedName("text") - val text: String? = null, - @SerializedName("textColor") - val textColor: String? = null, - @SerializedName("textSize") - val textSize: Int? = null, - @SerializedName("padding") - val padding: Padding? = null, - @SerializedName("subTitle") - val subTitle: TextFieldData? = null + @SerializedName("iconUrl") val iconUrl: String? = null, + @SerializedName("bgColor") val bgColor: String? = null, + @SerializedName("text") val text: String? = null, + @SerializedName("textColor") val textColor: String? = null, + @SerializedName("textSize") val textSize: Int? = null, + @SerializedName("padding") val padding: Padding? = null, + @SerializedName("subTitle") val subTitle: TextFieldData? = null ) data class LoanInfoHeader( @@ -116,7 +109,7 @@ data class DocumentUploadOption( @SerializedName("font") val font: String? = null, @SerializedName("textColor") val textColor: String? = null, @SerializedName("cta") val cta: CtaData? = null, - @SerializedName("editText") val editData: EditData? = null, + @SerializedName("editText") val editData: EditData? = null, @SerializedName("supportText") val supportText: SupportText? = null, ) @@ -133,6 +126,7 @@ data class SupportText( @SerializedName("size") val size: Long? = null, @SerializedName("textColor") val textColor: String? = null, ) + data class KeyValueTextFieldData( @SerializedName("key") val key: String? = null, @SerializedName("value") val value: String? = null, @@ -145,4 +139,4 @@ data class ObligationsObject( data class SelectedObligations( @SerializedName("obligationId") val obligationId: String? = null, @SerializedName("selectedCustomerId") val applicantReferenceId: String? = null, -) \ No newline at end of file +) diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanComposeInfoScreenResponse.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanComposeInfoScreenResponse.kt index 33bf01967d..34a406121a 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanComposeInfoScreenResponse.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanComposeInfoScreenResponse.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.homeloan.common.models import com.google.gson.annotations.SerializedName @@ -23,4 +30,4 @@ data class InfoItem( @SerializedName("title") val title: TextFieldData? = null, @SerializedName("subTitle") val subTitle: TextFieldData? = null, @SerializedName("icon") val icon: ImageFieldData? = null, -) \ No newline at end of file +) diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanFormPatchResponse.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanFormPatchResponse.kt index 7849c2cbbb..b179a10c18 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanFormPatchResponse.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanFormPatchResponse.kt @@ -19,5 +19,6 @@ data class HomeLoanFormPatchResponse( @SerializedName("isApCta") val isApCta: Boolean? = null, @SerializedName("cta") val cta: CtaData? = null, @SerializedName("additionalParameters") val additionalParameters: Map? = null, - @SerializedName("panVerificationPendingBottomSheet") val panVerificationPendingBottomSheet: HomeLoanGenericBottomSheetData? = null, + @SerializedName("panVerificationPendingBottomSheet") + val panVerificationPendingBottomSheet: HomeLoanGenericBottomSheetData? = null, ) diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanFormScreenResponse.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanFormScreenResponse.kt index 1aad4d57c2..ee2b42894e 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanFormScreenResponse.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanFormScreenResponse.kt @@ -20,8 +20,10 @@ data class HomeLoanFormScreenResponse( data class HomeLoanFormScreenContent( @SerializedName("widgets") val widgets: List? = null, - @SerializedName("relationshipMap") val relationshipMap: Map>? = null, - @SerializedName("infoIconBottomSheetData") val infoIconBottomSheetData: HomeLoanGenericBottomSheetData? = null, + @SerializedName("relationshipMap") + val relationshipMap: Map>? = null, + @SerializedName("infoIconBottomSheetData") + val infoIconBottomSheetData: HomeLoanGenericBottomSheetData? = null, @SerializedName("apiErrorBottomSheetData") val apiErrorBottomSheetData: HomeLoanGenericBottomSheetData? = null, @SerializedName("panRequiredBottomSheet") @@ -30,5 +32,6 @@ data class HomeLoanFormScreenContent( @SerializedName("interestRate") val interestRate: Double? = null, @SerializedName("keyValueTextField") val keyValueTextField: KeyValueTextFieldData? = null, @SerializedName("isPanVerified") val isPanVerified: Boolean? = false, - @SerializedName("panVerificationPendingBottomSheet") val panVerificationPendingBottomSheet: HomeLoanGenericBottomSheetData? = null, + @SerializedName("panVerificationPendingBottomSheet") + val panVerificationPendingBottomSheet: HomeLoanGenericBottomSheetData? = null, ) diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanGenericBottomSheetData.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanGenericBottomSheetData.kt index 6b9495d913..525931e34b 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanGenericBottomSheetData.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanGenericBottomSheetData.kt @@ -12,7 +12,6 @@ import com.google.gson.annotations.SerializedName import com.navi.base.model.AnalyticsEvent import com.navi.naviwidgets.models.response.TextFieldData import com.navi.naviwidgets.widgets.labledtextinput.LabeledTextInputWidgetModelV2 -import com.navi.naviwidgets.widgets.labledtextinput.TextInputWidgetData import kotlinx.parcelize.Parcelize @Parcelize @@ -23,6 +22,7 @@ data class HomeLoanGenericBottomSheetData( @SerializedName("footer") val footer: HLFooter? = null, @SerializedName("infoList") val infoList: ArrayList? = null, @SerializedName("listItemMargin") val listItemMargin: Int? = null, - @SerializedName("analyticsEventProperties") val analyticsEventProperties: AnalyticsEvent? = null, + @SerializedName("analyticsEventProperties") + val analyticsEventProperties: AnalyticsEvent? = null, @SerializedName("inputTextWidget") val inputTextWidget: LabeledTextInputWidgetModelV2? = null ) : Parcelable diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanTopUpIntroScreenResponse.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanTopUpIntroScreenResponse.kt index 1e54dcdb78..49ccfe188c 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanTopUpIntroScreenResponse.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/HomeLoanTopUpIntroScreenResponse.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.homeloan.common.models import com.google.gson.annotations.SerializedName @@ -13,11 +20,11 @@ data class HomeLoanTopUpIntroScreenResponse( data class HomeLoanTopUpIntroScreenContent( @SerializedName("screenTitle") var screenTitle: TextFieldData? = null, @SerializedName("screenSubTitle") var screenSubTitle: TextFieldData? = null, - @SerializedName("loanAmountProgressBar") val loanAmountProgressBar: LoanAmountProgressBarData? = null, + @SerializedName("loanAmountProgressBar") + val loanAmountProgressBar: LoanAmountProgressBarData? = null, @SerializedName("outstandingAmount") val outstandingAmount: AmountData? = null, @SerializedName("topUpAmount") val topUpAmount: AmountData? = null, - @SerializedName("infoBottomSheet") - val infoBottomSheet: HomeLoanGenericBottomSheetData? = null, + @SerializedName("infoBottomSheet") val infoBottomSheet: HomeLoanGenericBottomSheetData? = null, ) data class AmountData( diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/IncomeVerificationPollingResponse.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/IncomeVerificationPollingResponse.kt index 1d5e9d6e76..d84fefd595 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/IncomeVerificationPollingResponse.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/IncomeVerificationPollingResponse.kt @@ -13,5 +13,6 @@ import com.navi.common.model.UploadDataAsyncResponse data class IncomeVerificationPollingResponse( @SerializedName("cta") val cta: CtaData? = null, - @SerializedName("uploadDataAsyncResponse") val uploadDataAsyncResponse: UploadDataAsyncResponse? = null + @SerializedName("uploadDataAsyncResponse") + val uploadDataAsyncResponse: UploadDataAsyncResponse? = null ) diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/incomeverification/HlBankStatementServiceProviderResponse.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/incomeverification/HlBankStatementServiceProviderResponse.kt index a42ac3445d..c09a082439 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/models/incomeverification/HlBankStatementServiceProviderResponse.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/models/incomeverification/HlBankStatementServiceProviderResponse.kt @@ -15,7 +15,8 @@ import com.navi.naviwidgets.models.response.TextFieldData data class HlBankStatementServiceProviderResponse( @SerializedName("ctx") val content: HomeLoanServiceProviderContent? = null, - @SerializedName("statementUploadInstructionsData") val statementUploadInstructionsData: StatementUploadInstructionsData? = null + @SerializedName("statementUploadInstructionsData") + val statementUploadInstructionsData: StatementUploadInstructionsData? = null ) data class HomeLoanServiceProviderContent( diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/states/GenericWidgetState.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/states/GenericWidgetState.kt index bec5b30a03..83a4371d9d 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/states/GenericWidgetState.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/states/GenericWidgetState.kt @@ -11,7 +11,10 @@ import com.navi.naviwidgets.models.response.GenericWidgetResponse sealed class GenericWidgetState { object Init : GenericWidgetState() + object Loading : GenericWidgetState() + object Failure : GenericWidgetState() + class Update(val data: GenericWidgetResponse?) : GenericWidgetState() } diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/theme/color/HLColor.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/theme/color/HLColor.kt index d29994ea0b..8252a0c87b 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/theme/color/HLColor.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/theme/color/HLColor.kt @@ -17,4 +17,4 @@ import androidx.compose.ui.graphics.Color object HLColor { val whiteFFFFFF = Color(0xFFFFFFFF) val colorTransparentFDF1EA = Color(0xFFFDF1EA) -} \ No newline at end of file +} diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/utils/HLBindingAdapterUtil.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/utils/HLBindingAdapterUtil.kt index 697a5bf462..fa7bacd082 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/utils/HLBindingAdapterUtil.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/utils/HLBindingAdapterUtil.kt @@ -22,8 +22,7 @@ object HLBindingAdapterUtil { iconCode?.let { imageView.visibility = View.VISIBLE HLIconUtils.updateIcon(it, imageView) - } - ?: run { imageView.visibility = View.GONE } + } ?: run { imageView.visibility = View.GONE } } @BindingAdapter("setViewNavigator", "setCtaData") diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/utils/HLExt.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/utils/HLExt.kt index bbf33fa3ad..7a781f451c 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/utils/HLExt.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/utils/HLExt.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.homeloan.common.utils import android.content.Context @@ -27,4 +34,4 @@ fun Double.formatAmount(): String { fun Double.formatDoubleAmount(): String { val numberFormat = DecimalFormat("#,##,###.##") return numberFormat.format(this) -} \ No newline at end of file +} diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/utils/HLIconUtils.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/utils/HLIconUtils.kt index 1ece6c70ce..bd53a8316f 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/utils/HLIconUtils.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/utils/HLIconUtils.kt @@ -25,7 +25,8 @@ object HLIconUtils { private const val ICON_BLUE_BORDER_ALERT = "ICON_BLUE_BORDER_ALERT" private const val ICON_SMALL_YELLOW_BULB = "ICON_SMALL_YELLOW_BULB" private const val ICON_INFO_SIMPLE = "ICON_INFO_SIMPLE" - private const val ICON_HL_SMALL_RED_WHITE_BG_RIGHT_ARROW = "ICON_HL_SMALL_RED_WHITE_BG_RIGHT_ARROW" + private const val ICON_HL_SMALL_RED_WHITE_BG_RIGHT_ARROW = + "ICON_HL_SMALL_RED_WHITE_BG_RIGHT_ARROW" private const val OUTLINED_INFO_ICON_BLACK = "OUTLINED_INFO_ICON_BLACK" private const val INVALID_CITY_ICON = "INVALID_CITY_ICON" const val ICON_LARGE_PURPLE_ALERT_WITH_DOG = "ICON_LARGE_PURPLE_ALERT_WITH_DOG" diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/common/utils/Utility.kt b/android/navi-hl/src/main/java/com/navi/homeloan/common/utils/Utility.kt index c3e0ecd830..50ce3e6c3b 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/common/utils/Utility.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/common/utils/Utility.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.homeloan.common.utils import android.text.format.DateFormat @@ -17,7 +24,9 @@ fun stringToDouble(data: String?): Double { try { if (data == null) return 0.0 return data.toDouble() - } catch (e: Exception) { e.log()} + } catch (e: Exception) { + e.log() + } return 0.0 } @@ -37,9 +46,7 @@ fun getNetworkInfo(timeOutInSeconds: Long = API_CONNECT_TIMEOUT_VALUE): NetworkI ) } -fun getNetworkInfoSuperApp( - timeOutInSeconds: Long = API_CONNECT_TIMEOUT_VALUE -): NetworkInfo { +fun getNetworkInfoSuperApp(timeOutInSeconds: Long = API_CONNECT_TIMEOUT_VALUE): NetworkInfo { return NetworkInfo( CommonLibManager.buildConfigDetails.baseUrl, appVersionName = CommonLibManager.buildConfigDetails.appVersionName, @@ -50,7 +57,9 @@ fun getNetworkInfoSuperApp( } fun getAmountWithComma(amount: String): String { - return amount.trim().replace(Regex("[^\\d.,]"), "") + return amount + .trim() + .replace(Regex("[^\\d.,]"), "") .replace(Regex("(\\d*\\.\\d{0,2})[.\\d]*"), "$1") .replace(Regex("\\.{2,}"), ".") } @@ -60,7 +69,7 @@ fun getAmount(amount: String): Double { } fun getAmountAsString(amount: String): String { - return String.format("%.2f",stringToDouble(amount.trim().replace(",", EMPTY))) + return String.format("%.2f", stringToDouble(amount.trim().replace(",", EMPTY))) } fun isSameDashboardResponse( @@ -72,5 +81,5 @@ fun isSameDashboardResponse( return gson .toJson(newResponse?.listOfWidgets) .equals(gson.toJson(oldResponse?.listOfWidgets)) && - gson.toJson(newResponse?.metaData).equals(gson.toJson(oldResponse?.metaData)) -} \ No newline at end of file + gson.toJson(newResponse?.metaData).equals(gson.toJson(oldResponse?.metaData)) +} diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/dashboard/activity/NewHLDashboardActivity.kt b/android/navi-hl/src/main/java/com/navi/homeloan/dashboard/activity/NewHLDashboardActivity.kt index 7583df8ad9..e7279c6904 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/dashboard/activity/NewHLDashboardActivity.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/dashboard/activity/NewHLDashboardActivity.kt @@ -27,16 +27,12 @@ class NewHLDashboardActivity : BaseActivity(), FragmentInterchangeListener { private lateinit var binding: ActivityNewHlDashboardBinding - @Inject - lateinit var fragmentMapper: HLFragmentMapper + @Inject lateinit var fragmentMapper: HLFragmentMapper override fun onCreate(savedInstanceState: Bundle?) { binding = DataBindingUtil.setContentView(this, R.layout.activity_new_hl_dashboard) super.onCreate(savedInstanceState) - navigateToNextScreen( - "home_loan_dashboard_fragment", - intent?.extras ?: Bundle() - ) + navigateToNextScreen("home_loan_dashboard_fragment", intent?.extras ?: Bundle()) } override val screenName: String diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/dashboard/fragments/HLDashboardFragment.kt b/android/navi-hl/src/main/java/com/navi/homeloan/dashboard/fragments/HLDashboardFragment.kt index 7070ead16b..0fde48e269 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/dashboard/fragments/HLDashboardFragment.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/dashboard/fragments/HLDashboardFragment.kt @@ -64,9 +64,7 @@ class HLDashboardFragment : HLBaseFragment(), WidgetCallback { private var dashboardTab: HLDashboardTab? = null - private val viewModel by lazy { - ViewModelProvider(this)[HLDashboardFragmentVM::class.java] - } + private val viewModel by lazy { ViewModelProvider(this)[HLDashboardFragmentVM::class.java] } override val screenName: String get() = TAG @@ -77,12 +75,7 @@ class HLDashboardFragment : HLBaseFragment(), WidgetCallback { savedInstanceState: Bundle? ): View { binding = - DataBindingUtil.inflate( - inflater, - R.layout.fragment_hl_dashboard, - container, - false - ) + DataBindingUtil.inflate(inflater, R.layout.fragment_hl_dashboard, container, false) initError( viewModel, listOf(Pair(getBranchesRetryListener, HL_GET_DASHBOARD_RESPONSE_ERROR)), @@ -93,20 +86,16 @@ class HLDashboardFragment : HLBaseFragment(), WidgetCallback { } private val getBranchesRetryListener: View.OnClickListener = - View.OnClickListener { _ -> - loadScreen(true) - } + View.OnClickListener { _ -> loadScreen(true) } private val onErrorScreenBackPressed: View.OnClickListener = - View.OnClickListener { _ -> - activity?.onBackPressed() - } + View.OnClickListener { _ -> activity?.onBackPressed() } override fun onResume() { super.onResume() - if (viewModel.dashboardContentResponse.value.isNull() || TemporaryStorageHelper.isDataModified( - dashboardTab?.name.orEmpty() - ) + if ( + viewModel.dashboardContentResponse.value.isNull() || + TemporaryStorageHelper.isDataModified(dashboardTab?.name.orEmpty()) ) { loadScreen(true) } else { @@ -116,7 +105,7 @@ class HLDashboardFragment : HLBaseFragment(), WidgetCallback { override fun onHiddenChanged(hidden: Boolean) { super.onHiddenChanged(hidden) - if(hidden.not()) { + if (hidden.not()) { refreshData() } } @@ -133,12 +122,22 @@ class HLDashboardFragment : HLBaseFragment(), WidgetCallback { if (viewModel.dashboardContentResponse.value.isNull()) { binding.rvProducts.isVisible = false showShimmer() - viewModel.fetchHLDashboardContent(true, dashboardTab?.name.orEmpty(), forceRefresh, queryMap) + viewModel.fetchHLDashboardContent( + true, + dashboardTab?.name.orEmpty(), + forceRefresh, + queryMap + ) } else { if (showLoader) { showLoader() } - viewModel.fetchHLDashboardContent(showLoader, dashboardTab?.name.orEmpty(), forceRefresh, queryMap) + viewModel.fetchHLDashboardContent( + showLoader, + dashboardTab?.name.orEmpty(), + forceRefresh, + queryMap + ) } } @@ -166,10 +165,13 @@ class HLDashboardFragment : HLBaseFragment(), WidgetCallback { } private fun initObserver() { - viewModel.dashboardContentResponse.observeNonNull(viewLifecycleOwner) { dashboardContentResponse -> + viewModel.dashboardContentResponse.observeNonNull(viewLifecycleOwner) { + dashboardContentResponse -> hideLoader() TemporaryStorageHelper.updateApiTs(dashboardTab?.name.orEmpty()) - dashboardContentResponse?.header?.getOrNull(0)?.let { updateContainer(it, binding.headerContainer) } + dashboardContentResponse?.header?.getOrNull(0)?.let { + updateContainer(it, binding.headerContainer) + } binding.rvProducts.isVisible = true getFilteredNaviWidgets(dashboardContentResponse?.listOfWidgets)?.let { listOfWidgets -> hideShimmer() @@ -211,10 +213,7 @@ class HLDashboardFragment : HLBaseFragment(), WidgetCallback { } } - private fun updateContainer( - naviWidget: NaviWidget, - container: ViewGroup - ) { + private fun updateContainer(naviWidget: NaviWidget, container: ViewGroup) { viewLifecycleOwner.lifecycleScope.launch { val layoutBinding = container.replaceLayout(widgetIdProvider.getNaviWidgetLayoutId(naviWidget)) @@ -237,7 +236,10 @@ class HLDashboardFragment : HLBaseFragment(), WidgetCallback { } is ShowBottomSheetClicked -> { val bottomSheet = - HLUniversalBottomSheet.getInstance(naviClickAction.genericBottomSheetData, isBottomSheetDraggable = false) + HLUniversalBottomSheet.getInstance( + naviClickAction.genericBottomSheetData, + isBottomSheetDraggable = false + ) safelyShowBottomSheet(bottomSheet, HLUniversalBottomSheet.TAG) } is CtaData -> { @@ -263,10 +265,11 @@ class HLDashboardFragment : HLBaseFragment(), WidgetCallback { is NavigateClickAction -> { NaviTrackEvent.setStartTs(screenName) DeepLinkManager.getDeepLinkListener() - ?.navigateTo(activity, CtaData( - url = naviClickAction.url, - parameters = naviClickAction.parameters - ), false) + ?.navigateTo( + activity, + CtaData(url = naviClickAction.url, parameters = naviClickAction.parameters), + false + ) } } } diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/dashboard/repository/HLDashboardFragmentRepository.kt b/android/navi-hl/src/main/java/com/navi/homeloan/dashboard/repository/HLDashboardFragmentRepository.kt index 34d7e18fe2..67f736cbd4 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/dashboard/repository/HLDashboardFragmentRepository.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/dashboard/repository/HLDashboardFragmentRepository.kt @@ -13,8 +13,9 @@ import com.navi.homeloan.common.network.retrofit.RetrofitService import com.navi.naviwidgets.models.response.HideCardData import javax.inject.Inject -class HLDashboardFragmentRepository @Inject constructor(private val retrofitService: RetrofitService) : - ResponseCallback() { +class HLDashboardFragmentRepository +@Inject +constructor(private val retrofitService: RetrofitService) : ResponseCallback() { suspend fun fetchHLDashboardContent(queryMap: HashMap) = apiResponseCallback(retrofitService.fetchHLDashboardContent(queryMap)) @@ -25,5 +26,4 @@ class HLDashboardFragmentRepository @Inject constructor(private val retrofitServ hideCardData.moduleName ?: ModuleName.HL.name ) ) - } diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/dashboard/viewmodels/HLDashboardFragmentVM.kt b/android/navi-hl/src/main/java/com/navi/homeloan/dashboard/viewmodels/HLDashboardFragmentVM.kt index 5d94ab38ab..a8fbab7c20 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/dashboard/viewmodels/HLDashboardFragmentVM.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/dashboard/viewmodels/HLDashboardFragmentVM.kt @@ -19,9 +19,9 @@ import com.navi.homeloan.common.utils.isSameDashboardResponse import com.navi.homeloan.dashboard.repository.HLDashboardFragmentRepository import com.navi.naviwidgets.models.response.HideCardData import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import javax.inject.Inject @HiltViewModel class HLDashboardFragmentVM @@ -39,28 +39,38 @@ constructor( get() = _hidePaymentStatus /** - * We are making same api call on HomeVM too, If you want to modify this api please do same on HomeVM too + * We are making same api call on HomeVM too, If you want to modify this api please do same on + * HomeVM too */ - fun fetchHLDashboardContent(showLoader: Boolean, product: String, forceRefresh: Boolean = false, queryMap: HashMap) { + fun fetchHLDashboardContent( + showLoader: Boolean, + product: String, + forceRefresh: Boolean = false, + queryMap: HashMap + ) { coroutineScope.launch(Dispatchers.IO) { - - if(forceRefresh) { + if (forceRefresh) { TemporaryStorageHelper.clearResponse(product) } val isDataModified = TemporaryStorageHelper.isDataModified(product) - if (TemporaryStorageHelper.getApiResponse(product) + if ( + TemporaryStorageHelper.getApiResponse(product) .isNotNull() ) { _dashboardContentResponse.postValue( TemporaryStorageHelper.getApiResponse(product) ) TemporaryStorageHelper.clearResponse(product) - if (isDataModified.not()) - return@launch + if (isDataModified.not()) return@launch } val response = dashboardContentRepository.fetchHLDashboardContent(queryMap) - if (response.error == null && response.errors.isNullOrEmpty() && response.data != null) { - if (showLoader.not() && isSameDashboardResponse(response.data, _dashboardContentResponse.value)) { + if ( + response.error == null && response.errors.isNullOrEmpty() && response.data != null + ) { + if ( + showLoader.not() && + isSameDashboardResponse(response.data, _dashboardContentResponse.value) + ) { updateCachedResponse(true) } else { _dashboardContentResponse.postValue(response.data) @@ -82,7 +92,9 @@ constructor( fun hideStatusCard2(hideCardData: HideCardData) { coroutineScope.launch { val response = dashboardContentRepository.hideStatusCard2(hideCardData) - if (response.error == null && response.errors.isNullOrEmpty() && response.data != null) { + if ( + response.error == null && response.errors.isNullOrEmpty() && response.data != null + ) { _hidePaymentStatus.value = response.data } else { setErrorData(response.errors, response.error) diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/interest_reset/activity/InterestResetActivity.kt b/android/navi-hl/src/main/java/com/navi/homeloan/interest_reset/activity/InterestResetActivity.kt index 5dd2dc676b..e5d977c221 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/interest_reset/activity/InterestResetActivity.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/interest_reset/activity/InterestResetActivity.kt @@ -87,7 +87,6 @@ class InterestResetActivity : BaseActivity(), FragmentInterchangeListener { } else { finish() } - } - ?: run { finish() } + } ?: run { finish() } } } diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/activity/TrancheDisbursalActivity.kt b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/activity/TrancheDisbursalActivity.kt index 031d956f08..c9d5112ebb 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/activity/TrancheDisbursalActivity.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/activity/TrancheDisbursalActivity.kt @@ -17,11 +17,11 @@ import com.navi.common.model.ModuleNameV2 import com.navi.common.ui.activity.BaseActivity import com.navi.common.utils.Constants import com.navi.homeloan.R -import com.navi.homeloan.tranche.fragments.InstallmentDetailsFragment -import com.navi.homeloan.tranche.fragments.OwnContributionProofFragment import com.navi.homeloan.common.utils.HLFragmentMapper import com.navi.homeloan.common.utils.NaviHLAnalytics import com.navi.homeloan.databinding.ActivityTrancheDisbursalBinding +import com.navi.homeloan.tranche.fragments.InstallmentDetailsFragment +import com.navi.homeloan.tranche.fragments.OwnContributionProofFragment import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @@ -56,7 +56,8 @@ class TrancheDisbursalActivity : BaseActivity(), FragmentInterchangeListener { replaceFragment(tag, fragment) } } else { - DeepLinkManager.getDeepLinkListener()?.navigateTo(this, CtaData(url = currentScreenTag), true) + DeepLinkManager.getDeepLinkListener() + ?.navigateTo(this, CtaData(url = currentScreenTag), true) } } @@ -78,8 +79,6 @@ class TrancheDisbursalActivity : BaseActivity(), FragmentInterchangeListener { } } - - @Deprecated("Deprecated in Java") override fun onBackPressed() { supportFragmentManager.fragments @@ -101,7 +100,6 @@ class TrancheDisbursalActivity : BaseActivity(), FragmentInterchangeListener { } else { finish() } - } - ?: run { finish() } + } ?: run { finish() } } } diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/adapter/UploadedDocsAdapter.kt b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/adapter/UploadedDocsAdapter.kt index 5c6ad193c5..cb9f5b3bba 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/adapter/UploadedDocsAdapter.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/adapter/UploadedDocsAdapter.kt @@ -7,7 +7,6 @@ package com.navi.homeloan.tranche.adapter -import com.navi.common.R as CommonR import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater @@ -16,13 +15,14 @@ import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.navi.base.utils.orFalse +import com.navi.common.R as CommonR import com.navi.common.awsupload.AWSFileType import com.navi.homeloan.R +import com.navi.homeloan.databinding.ItemDocumentUploadBinding +import com.navi.homeloan.databinding.ViewHlAddDocumentToUploadBinding import com.navi.homeloan.tranche.models.SelectedFileData import com.navi.homeloan.tranche.models.TrancheDocData import com.navi.homeloan.tranche.models.UploadStatus -import com.navi.homeloan.databinding.ItemDocumentUploadBinding -import com.navi.homeloan.databinding.ViewHlAddDocumentToUploadBinding @SuppressLint("NotifyDataSetChanged") class UploadedDocsAdapter( @@ -45,7 +45,6 @@ class UploadedDocsAdapter( ViewHlAddDocumentToUploadBinding.inflate(LayoutInflater.from(parent.context)) AddDocumentVH(binding) } - else -> { val binding = ItemDocumentUploadBinding.inflate(LayoutInflater.from(parent.context)) UploadedDocumentVH(binding) @@ -88,8 +87,8 @@ class UploadedDocsAdapter( ) showAddIcon = (maxUploads - - (trancheDocDataList.filter { it.uploadStatus != UploadStatus.FILE_TOO_LARGE }) - .size > 0) + (trancheDocDataList.filter { it.uploadStatus != UploadStatus.FILE_TOO_LARGE }) + .size > 0) notifyDataSetChanged() } @@ -102,7 +101,7 @@ class UploadedDocsAdapter( trancheDocDataList.forEach { trancheDocData -> if ( trancheDocData.hlSelectedFileData?.documentReferenceId == - hlsSelectedFileData?.documentReferenceId + hlsSelectedFileData?.documentReferenceId ) { trancheDocData.uploadStatus = uploadStatus trancheDocData.awsKey = awsKey @@ -118,15 +117,15 @@ class UploadedDocsAdapter( trancheDocDataList.forEach { trancheDocData -> if ( trancheDocData.hlSelectedFileData?.documentReferenceId == - hlsSelectedFileData?.documentReferenceId + hlsSelectedFileData?.documentReferenceId ) { trancheDocDataList.remove(trancheDocData) showAddIcon = (maxUploads - - (trancheDocDataList.filter { + (trancheDocDataList.filter { it.uploadStatus != UploadStatus.FILE_TOO_LARGE }) - .size > 0) + .size > 0) return@loop } } @@ -160,7 +159,6 @@ class UploadedDocsAdapter( binding.warningIcon.isVisible = false binding.warningText.isVisible = false } - UploadStatus.UPLOADED -> { binding.progressBar.isVisible = false binding.dummyForeground.isVisible = false @@ -171,7 +169,6 @@ class UploadedDocsAdapter( removeDocumentCallback.invoke(trancheDocData) } } - UploadStatus.FILE_TOO_LARGE -> { binding.progressBar.isVisible = false binding.dummyForeground.isVisible = true diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/bottomsheets/DocumentDeleteBottomSheet.kt b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/bottomsheets/DocumentDeleteBottomSheet.kt index 75207b5684..5a44f7d869 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/bottomsheets/DocumentDeleteBottomSheet.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/bottomsheets/DocumentDeleteBottomSheet.kt @@ -38,6 +38,7 @@ class DocumentDeleteBottomSheet : BaseBottomSheet() { interface Callback { fun onPrimaryButtonClick() + fun onSecondaryButtonClick() } diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/bottomsheets/DocumentPickerBottomSheet.kt b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/bottomsheets/DocumentPickerBottomSheet.kt index 97ffa7d6af..6cefbd53cf 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/bottomsheets/DocumentPickerBottomSheet.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/bottomsheets/DocumentPickerBottomSheet.kt @@ -19,16 +19,16 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.FileProvider import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider +import com.navi.base.utils.orElse import com.navi.common.managers.PermissionsManager import com.navi.common.ui.fragment.BaseBottomSheet import com.navi.common.utils.FileHelper import com.navi.design.utils.isValidHexColor -import com.navi.base.utils.orElse import com.navi.homeloan.R -import com.navi.homeloan.tranche.viewmodels.DocumentPickerVM import com.navi.homeloan.common.Constants.ARG_ID import com.navi.homeloan.common.utils.NaviHLAnalytics import com.navi.homeloan.databinding.DocumentPickerBottomSheetBinding +import com.navi.homeloan.tranche.viewmodels.DocumentPickerVM import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject import kotlin.math.min @@ -60,10 +60,7 @@ class HlDocumentPickerBottomSheet : BaseBottomSheet() { } private val openDocumentLauncher = registerForActivityResult(ActivityResultContracts.OpenDocument()) { - documentPickerVM.setPdfPickerData( - it, - arguments?.getString(ARG_ID, null) - ) + documentPickerVM.setPdfPickerData(it, arguments?.getString(ARG_ID, null)) safelyDismissDialogAfterDelay() } private val takePicture = @@ -231,10 +228,7 @@ class HlDocumentPickerBottomSheet : BaseBottomSheet() { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (requestCode == filePickerRequestCode && resultCode == Activity.RESULT_OK) { - documentPickerVM.setPdfPickerData( - data?.data, - arguments?.getString(ARG_ID, null) - ) + documentPickerVM.setPdfPickerData(data?.data, arguments?.getString(ARG_ID, null)) safelyDismissDialogAfterDelay() } } diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/customview/UploadCardView.kt b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/customview/UploadCardView.kt index 32a9f2e914..6093ecb5bc 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/customview/UploadCardView.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/customview/UploadCardView.kt @@ -14,17 +14,17 @@ import androidx.core.view.isVisible import androidx.databinding.DataBindingUtil import androidx.recyclerview.widget.GridLayoutManager import com.google.android.material.card.MaterialCardView +import com.navi.base.utils.orElse import com.navi.base.utils.orZero import com.navi.design.utils.dpToPx -import com.navi.naviwidgets.extensions.setTextFieldData -import com.navi.base.utils.orElse import com.navi.homeloan.R +import com.navi.homeloan.databinding.UploadCardViewBinding import com.navi.homeloan.tranche.adapter.UploadedDocsAdapter import com.navi.homeloan.tranche.models.SelectedFileData import com.navi.homeloan.tranche.models.TrancheDocData import com.navi.homeloan.tranche.models.UploadCard import com.navi.homeloan.tranche.models.UploadStatus -import com.navi.homeloan.databinding.UploadCardViewBinding +import com.navi.naviwidgets.extensions.setTextFieldData import kotlin.collections.MutableMap as MutableMap class UploadCardView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : @@ -113,8 +113,7 @@ class UploadCardView @JvmOverloads constructor(context: Context, attrs: Attribut return adapter ?.trancheDocDataList ?.filter { it.uploadStatus == UploadStatus.UPLOADED } - ?.mapNotNull { it.awsKey } - ?: listOf() + ?.mapNotNull { it.awsKey } ?: listOf() } fun getUploadedDocs(): MutableMap { diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/fragments/InstallmentDetailsFragment.kt b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/fragments/InstallmentDetailsFragment.kt index 94a69bef29..9a7a03d7c5 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/fragments/InstallmentDetailsFragment.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/fragments/InstallmentDetailsFragment.kt @@ -220,7 +220,7 @@ class InstallmentDetailsFragment : HLBaseFragment(), WidgetCallback { activity?.onBackPressed() } CtaType.HELP_BOTTOM_SHEET.name -> { - openHelpScreen(screenName) + openHelpScreen(screenName) } else -> { nextScreenCta = naviClickAction diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/fragments/OwnContributionProofFragment.kt b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/fragments/OwnContributionProofFragment.kt index 6ebca1205e..e79f02e67c 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/fragments/OwnContributionProofFragment.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/fragments/OwnContributionProofFragment.kt @@ -7,7 +7,6 @@ package com.navi.homeloan.tranche.fragments -import com.navi.design.R as DesignR import android.content.Context import android.os.Bundle import android.view.KeyEvent @@ -35,11 +34,24 @@ import com.navi.common.awsupload.model.UploadTask import com.navi.common.listeners.FragmentInterchangeListener import com.navi.common.utils.* import com.navi.common.utils.Constants +import com.navi.design.R as DesignR import com.navi.design.font.FontWeightEnum import com.navi.design.utils.dpToPxInInt import com.navi.design.utils.getFontStyle import com.navi.homeloan.R +import com.navi.homeloan.common.Constants.ARG_ACCOUNT_NUMBER +import com.navi.homeloan.common.Constants.LOAN_TYPE +import com.navi.homeloan.common.Constants.OCR_DOCUMENT_UPLOAD +import com.navi.homeloan.common.Constants.REQUEST_INSTALLMENT_DETAILS_V2 +import com.navi.homeloan.common.Constants.TYPE_HOME_LOAN import com.navi.homeloan.common.base.HLBaseFragment +import com.navi.homeloan.common.utils.NaviHLAnalytics +import com.navi.homeloan.common.utils.formatDoubleAmount +import com.navi.homeloan.common.utils.getAmount +import com.navi.homeloan.common.utils.getAmountAsString +import com.navi.homeloan.common.utils.getAmountWithComma +import com.navi.homeloan.common.utils.toast +import com.navi.homeloan.databinding.LayoutOwnContributionProofBinding import com.navi.homeloan.tranche.bottomsheets.DocumentDeleteBottomSheet import com.navi.homeloan.tranche.bottomsheets.HlDocumentPickerBottomSheet import com.navi.homeloan.tranche.models.AmountInputData @@ -50,18 +62,6 @@ import com.navi.homeloan.tranche.models.UploadStatus import com.navi.homeloan.tranche.viewmodels.DocumentPickerVM import com.navi.homeloan.tranche.viewmodels.RequestInstallmentFragmentVM import com.navi.homeloan.tranche.viewmodels.RequestInstallmentViewStateV2 -import com.navi.homeloan.common.Constants.ARG_ACCOUNT_NUMBER -import com.navi.homeloan.common.Constants.LOAN_TYPE -import com.navi.homeloan.common.Constants.OCR_DOCUMENT_UPLOAD -import com.navi.homeloan.common.Constants.REQUEST_INSTALLMENT_DETAILS_V2 -import com.navi.homeloan.common.Constants.TYPE_HOME_LOAN -import com.navi.homeloan.common.utils.NaviHLAnalytics -import com.navi.homeloan.common.utils.formatDoubleAmount -import com.navi.homeloan.common.utils.getAmount -import com.navi.homeloan.common.utils.getAmountAsString -import com.navi.homeloan.common.utils.getAmountWithComma -import com.navi.homeloan.common.utils.toast -import com.navi.homeloan.databinding.LayoutOwnContributionProofBinding import com.navi.naviwidgets.callbacks.WidgetCallback import com.navi.naviwidgets.extensions.setTextFieldData import com.navi.naviwidgets.models.NaviWidget @@ -188,8 +188,8 @@ class OwnContributionProofFragment : NaviHLAnalytics.naviHLAnalytics.sendAnalyticsEvent(it) } openDocumentPicker( - (viewState.response?.content?.uploadCard?.maxUploads - ?: 1) - binding.uploadCard.getUploadedDocsSize(), + (viewState.response?.content?.uploadCard?.maxUploads ?: 1) - + binding.uploadCard.getUploadedDocsSize(), maxUploadSizeInMB = viewState.response ?.content @@ -210,7 +210,9 @@ class OwnContributionProofFragment : val ocrProofPageLandEvent = viewState.response?.metadata?.get(NaviHLAnalytics.OCR_PAGE_LAND)?.data as? AnalyticsEvent - ocrProofPageLandEvent?.let { NaviHLAnalytics.naviHLAnalytics.sendAnalyticsEvent(it) } + ocrProofPageLandEvent?.let { + NaviHLAnalytics.naviHLAnalytics.sendAnalyticsEvent(it) + } } } } @@ -284,8 +286,7 @@ class OwnContributionProofFragment : } else { binding.amountValue.post { val amountWithComma = getAmountWithComma(binding.amountValue.text.toString()) - val amount = - amountWithComma.trim().replace(Regex("[^\\d.]"), "") + val amount = amountWithComma.trim().replace(Regex("[^\\d.]"), "") if (amount.isNotEmpty()) { amount.last().let { if (it == '.' || (it == '0' && amount.contains('.'))) { @@ -297,15 +298,16 @@ class OwnContributionProofFragment : } } } else { - binding.amountValue.setText( - amount.toDoubleOrNull()?.formatDoubleAmount() - ) + binding.amountValue.setText(amount.toDoubleOrNull()?.formatDoubleAmount()) } binding.amountValue.setSelection(binding.amountValue.text?.length.orZero()) binding.amountStatusText.isVisible = if (binding.amountValue.text?.length.orZero() > 0) { binding.amountStatusText.setTextColor( - ContextCompat.getColor(requireContext(), DesignR.color.naviSuccessGreen) + ContextCompat.getColor( + requireContext(), + DesignR.color.naviSuccessGreen + ) ) binding.amountStatusText.text = numberToWords(amount, false) binding.amountStatusText.typeface = @@ -341,16 +343,22 @@ class OwnContributionProofFragment : } CtaType.NEXT_PAGE_API.name -> { if (validate()) { - requestInstallmentDetails?.ocrAmount = getAmountAsString(binding.amountValue.text.toString()) + requestInstallmentDetails?.ocrAmount = + getAmountAsString(binding.amountValue.text.toString()) requestInstallmentDetails?.ocrDocs = binding.uploadCard.getUploadedDocs() val bundle = Bundle() bundle.putString( ARG_ACCOUNT_NUMBER, arguments?.getString(ARG_ACCOUNT_NUMBER) ) - bundle.putParcelable(REQUEST_INSTALLMENT_DETAILS_V2, requestInstallmentDetails) + bundle.putParcelable( + REQUEST_INSTALLMENT_DETAILS_V2, + requestInstallmentDetails + ) bundle.putString(LOAN_TYPE, TYPE_HOME_LOAN) - NaviHLAnalytics.naviHLAnalytics.sendAnalyticsEvent(naviClickAction.analyticsEventProperties) + NaviHLAnalytics.naviHLAnalytics.sendAnalyticsEvent( + naviClickAction.analyticsEventProperties + ) naviClickAction.parameters ?.firstOrNull { it.key == Constants.URL } ?.value @@ -407,7 +415,9 @@ class OwnContributionProofFragment : binding.amountStatusText.setCompoundDrawablesWithIntrinsicBounds( ContextCompat.getDrawable( it, - NaviWidgetIconUtils.getImageFromIconCode(NaviWidgetIconUtils.ICON_HL_SMALL_SOLID_RED_ALERT) + NaviWidgetIconUtils.getImageFromIconCode( + NaviWidgetIconUtils.ICON_HL_SMALL_SOLID_RED_ALERT + ) ), null, null, diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/fragments/RequestInstallmentFragmentV2.kt b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/fragments/RequestInstallmentFragmentV2.kt index bd5861b1b0..b2fa926cc6 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/fragments/RequestInstallmentFragmentV2.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/fragments/RequestInstallmentFragmentV2.kt @@ -7,7 +7,6 @@ package com.navi.homeloan.tranche.fragments -import com.navi.design.R as DesignR import android.app.DatePickerDialog import android.content.Context import android.os.Bundle @@ -39,11 +38,24 @@ import com.navi.common.listeners.FragmentInterchangeListener import com.navi.common.ui.activity.BaseActivity import com.navi.common.utils.* import com.navi.common.utils.Constants +import com.navi.design.R as DesignR import com.navi.design.font.FontWeightEnum import com.navi.design.utils.dpToPxInInt import com.navi.design.utils.getFontStyle import com.navi.homeloan.R +import com.navi.homeloan.common.Constants.ARG_ACCOUNT_NUMBER +import com.navi.homeloan.common.Constants.DOCUMENT_UPLOAD +import com.navi.homeloan.common.Constants.REQUEST_INSTALLMENT_DETAILS_V2 import com.navi.homeloan.common.base.HLBaseFragment +import com.navi.homeloan.common.utils.NaviHLAnalytics +import com.navi.homeloan.common.utils.NaviHLAnalytics.Companion.REQUEST_INSTALLMENT_PAGE_LAND +import com.navi.homeloan.common.utils.formatDoubleAmount +import com.navi.homeloan.common.utils.getAmount +import com.navi.homeloan.common.utils.getAmountAsString +import com.navi.homeloan.common.utils.getAmountWithComma +import com.navi.homeloan.common.utils.timestampToddMMMMYYYY +import com.navi.homeloan.common.utils.toast +import com.navi.homeloan.databinding.FragmentRequestInstallmentV2Binding import com.navi.homeloan.tranche.bottomsheets.DocumentDeleteBottomSheet import com.navi.homeloan.tranche.bottomsheets.HlDocumentPickerBottomSheet import com.navi.homeloan.tranche.models.AmountInputData @@ -54,19 +66,6 @@ import com.navi.homeloan.tranche.models.UploadStatus import com.navi.homeloan.tranche.viewmodels.DocumentPickerVM import com.navi.homeloan.tranche.viewmodels.RequestInstallmentFragmentVM import com.navi.homeloan.tranche.viewmodels.RequestInstallmentViewStateV2 -import com.navi.homeloan.common.Constants.ARG_ACCOUNT_NUMBER -import com.navi.homeloan.common.Constants.DOCUMENT_UPLOAD -import com.navi.homeloan.common.Constants.REQUEST_INSTALLMENT_DETAILS_V2 -import com.navi.homeloan.common.Constants.TYPE_HOME_LOAN -import com.navi.homeloan.common.utils.NaviHLAnalytics -import com.navi.homeloan.common.utils.NaviHLAnalytics.Companion.REQUEST_INSTALLMENT_PAGE_LAND -import com.navi.homeloan.common.utils.formatDoubleAmount -import com.navi.homeloan.common.utils.getAmount -import com.navi.homeloan.common.utils.getAmountAsString -import com.navi.homeloan.common.utils.getAmountWithComma -import com.navi.homeloan.common.utils.timestampToddMMMMYYYY -import com.navi.homeloan.common.utils.toast -import com.navi.homeloan.databinding.FragmentRequestInstallmentV2Binding import com.navi.naviwidgets.callbacks.WidgetCallback import com.navi.naviwidgets.extensions.setImageFieldData import com.navi.naviwidgets.extensions.setTextFieldData @@ -158,10 +157,7 @@ open class RequestInstallmentFragmentV2 : launch { viewModel.requestInstallmentStateFlowV2.collect { setViewState(it) } } launch { fileUploadManager.uploadUpdateSharedFlow.collect { - val hlsSelectedFileData = - it.uploadTask.data - as? - SelectedFileData + val hlsSelectedFileData = it.uploadTask.data as? SelectedFileData if (it is UploadState.Success) { binding.uploadCard.updateStatus( hlsSelectedFileData, @@ -231,8 +227,8 @@ open class RequestInstallmentFragmentV2 : NaviHLAnalytics.naviHLAnalytics.sendAnalyticsEvent(documentUploadEvent) } openDocumentPicker( - (viewState.response?.content?.uploadCard?.maxUploads - ?: 1) - binding.uploadCard.getUploadedDocsSize(), + (viewState.response?.content?.uploadCard?.maxUploads ?: 1) - + binding.uploadCard.getUploadedDocsSize(), maxUploadSizeInMB = viewState.response ?.content @@ -354,8 +350,7 @@ open class RequestInstallmentFragmentV2 : } else { binding.amountValue.post { val amountWithComma = getAmountWithComma(binding.amountValue.text.toString()) - val amount = - amountWithComma.trim().replace(Regex("[^\\d.]"), "") + val amount = amountWithComma.trim().replace(Regex("[^\\d.]"), "") if (amount.isNotEmpty()) { amount.last().let { if (it == '.' || (it == '0' && amount.contains('.'))) { @@ -367,15 +362,16 @@ open class RequestInstallmentFragmentV2 : } } } else { - binding.amountValue.setText( - amount.toDoubleOrNull()?.formatDoubleAmount() - ) + binding.amountValue.setText(amount.toDoubleOrNull()?.formatDoubleAmount()) } binding.amountValue.setSelection(binding.amountValue.text?.length.orZero()) binding.amountStatusText.isVisible = if (binding.amountValue.text?.length.orZero() > 0) { binding.amountStatusText.setTextColor( - ContextCompat.getColor(requireContext(), DesignR.color.naviSuccessGreen) + ContextCompat.getColor( + requireContext(), + DesignR.color.naviSuccessGreen + ) ) binding.amountStatusText.text = numberToWords(amount, false) binding.amountStatusText.typeface = @@ -529,7 +525,9 @@ open class RequestInstallmentFragmentV2 : binding.amountStatusText.setCompoundDrawablesWithIntrinsicBounds( ContextCompat.getDrawable( it, - NaviWidgetIconUtils.getImageFromIconCode(NaviWidgetIconUtils.ICON_HL_SMALL_SOLID_RED_ALERT) + NaviWidgetIconUtils.getImageFromIconCode( + NaviWidgetIconUtils.ICON_HL_SMALL_SOLID_RED_ALERT + ) ), null, null, @@ -551,7 +549,9 @@ open class RequestInstallmentFragmentV2 : binding.installmentStatusText.setCompoundDrawablesWithIntrinsicBounds( ContextCompat.getDrawable( it, - NaviWidgetIconUtils.getImageFromIconCode(NaviWidgetIconUtils.ICON_HL_SMALL_SOLID_RED_ALERT) + NaviWidgetIconUtils.getImageFromIconCode( + NaviWidgetIconUtils.ICON_HL_SMALL_SOLID_RED_ALERT + ) ), null, null, diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/fragments/TrancheStatusTrackerFragment.kt b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/fragments/TrancheStatusTrackerFragment.kt index 33379ec22b..6344b35059 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/fragments/TrancheStatusTrackerFragment.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/fragments/TrancheStatusTrackerFragment.kt @@ -25,13 +25,13 @@ import com.navi.common.listeners.FragmentInterchangeListener import com.navi.common.ui.activity.BaseActivity import com.navi.common.utils.replaceLayout import com.navi.homeloan.R -import com.navi.homeloan.common.base.HLBaseFragment import com.navi.homeloan.common.Constants.LOAN_ACCOUNT_NUMBER +import com.navi.homeloan.common.base.HLBaseFragment import com.navi.homeloan.common.states.GenericWidgetState -import com.navi.homeloan.tranche.viewmodels.TrancheStatusTrackerFragmentVM import com.navi.homeloan.common.utils.NaviHLAnalytics import com.navi.homeloan.common.utils.NaviHLAnalytics.Companion.TRANCHE_STATUS_TRACKER_PAGE_LAND import com.navi.homeloan.databinding.FragmentTrancheStatusTrackerBinding +import com.navi.homeloan.tranche.viewmodels.TrancheStatusTrackerFragmentVM import com.navi.naviwidgets.adapters.NaviInputWidgetAdapter import com.navi.naviwidgets.callbacks.WidgetCallback import com.navi.naviwidgets.models.NaviWidget diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/models/HLCustomPaymentRequest.kt b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/models/HLCustomPaymentRequest.kt index 570c8bf691..1e31a00171 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/models/HLCustomPaymentRequest.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/models/HLCustomPaymentRequest.kt @@ -15,4 +15,4 @@ data class HLCustomPaymentRequest( @SerializedName("paymentType") val paymentType: String? = null, @SerializedName("paymentAmount") val paymentAmount: HLAmount? = null, @SerializedName("rescheduleType") val rescheduleType: String? = null -) \ No newline at end of file +) diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/models/TrancheDisbursalResponse.kt b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/models/TrancheDisbursalResponse.kt index c10702798d..5e1149f9f8 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/models/TrancheDisbursalResponse.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/models/TrancheDisbursalResponse.kt @@ -24,7 +24,8 @@ data class Content( @SerializedName("amount") val amount: AmountInputData? = null, @SerializedName("installmentDate") val installmentDate: InstallmentInputData? = null, @SerializedName("uploadCard") val uploadCard: UploadCard? = null, - @SerializedName("builderSelectionOption") val builderSelectionOption: BuilderSelectionOption? = null + @SerializedName("builderSelectionOption") + val builderSelectionOption: BuilderSelectionOption? = null ) data class UploadCard( diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/models/TrancheDocData.kt b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/models/TrancheDocData.kt index 4054cd8d0c..abec46acec 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/models/TrancheDocData.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/models/TrancheDocData.kt @@ -7,7 +7,6 @@ package com.navi.homeloan.tranche.models - data class TrancheDocData( var uploadStatus: UploadStatus = UploadStatus.UPLOADING, val hlSelectedFileData: SelectedFileData? = null, diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/repository/TrancheDisbursalRepository.kt b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/repository/TrancheDisbursalRepository.kt index 32a2d4f8b1..bfb73620da 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/repository/TrancheDisbursalRepository.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/repository/TrancheDisbursalRepository.kt @@ -17,9 +17,8 @@ import com.navi.homeloan.tranche.models.TrancheDisbursalResponseV2 import com.navi.naviwidgets.models.response.GenericWidgetResponse import javax.inject.Inject -class TrancheDisbursalRepository @Inject constructor( - private val retrofitService: RetrofitService -) : ResponseCallback() { +class TrancheDisbursalRepository @Inject constructor(private val retrofitService: RetrofitService) : + ResponseCallback() { suspend fun fetchTrancheDisbursalWidgets( accountNumber: String ): RepoResult { @@ -31,12 +30,11 @@ class TrancheDisbursalRepository @Inject constructor( path: String ): RepoResult { return apiResponseCallback( - retrofitService - .fetchTrancheDisbursalWidgetsV2( - loanAccountNumber, - path, - RequestInstallmentDetails() - ) + retrofitService.fetchTrancheDisbursalWidgetsV2( + loanAccountNumber, + path, + RequestInstallmentDetails() + ) ) } @@ -55,8 +53,11 @@ class TrancheDisbursalRepository @Inject constructor( requestInstallmentDetails: RequestInstallmentDetails? ): RepoResult { return apiResponseCallback( - retrofitService - .fetchTrancheDisbursalWidgetsV2(loanAccountNumber, path, requestInstallmentDetails) + retrofitService.fetchTrancheDisbursalWidgetsV2( + loanAccountNumber, + path, + requestInstallmentDetails + ) ) } @@ -65,8 +66,10 @@ class TrancheDisbursalRepository @Inject constructor( requestInstallmentDetails: RequestInstallmentDetails ): RepoResult { return apiResponseCallback( - retrofitService - .fetchInstallmentDetailsWidgets(loanAccountNumber, requestInstallmentDetails) + retrofitService.fetchInstallmentDetailsWidgets( + loanAccountNumber, + requestInstallmentDetails + ) ) } @@ -75,10 +78,7 @@ class TrancheDisbursalRepository @Inject constructor( requestInstallmentDetails: RequestInstallmentDetails ): RepoResult { return apiResponseCallback( - retrofitService.postTrancheRequestDetails( - accountNumber, - requestInstallmentDetails - ) + retrofitService.postTrancheRequestDetails(accountNumber, requestInstallmentDetails) ) } @@ -87,22 +87,16 @@ class TrancheDisbursalRepository @Inject constructor( requestInstallmentDetails: RequestInstallmentDetails ): RepoResult { return apiResponseCallback( - retrofitService.postTrancheRequestDetailsV2( - accountNumber, - requestInstallmentDetails - ) + retrofitService.postTrancheRequestDetailsV2(accountNumber, requestInstallmentDetails) ) } suspend fun fetchDisbursementRequestWidgets( - loanAccountNumber: String, - trancheId: String? + loanAccountNumber: String, + trancheId: String? ): RepoResult { return apiResponseCallback( - retrofitService.fetchDisbursementRequestWidgets( - loanAccountNumber, - trancheId - ) + retrofitService.fetchDisbursementRequestWidgets(loanAccountNumber, trancheId) ) } } diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/states/GenericWidgetState.kt b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/states/GenericWidgetState.kt index 0b4dc73dad..15ed9ad41d 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/states/GenericWidgetState.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/states/GenericWidgetState.kt @@ -11,7 +11,10 @@ import com.navi.naviwidgets.models.response.GenericWidgetResponse sealed class GenericWidgetState { object Init : GenericWidgetState() + object Loading : GenericWidgetState() + object Failure : GenericWidgetState() + class Update(val data: GenericWidgetResponse?) : GenericWidgetState() } diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/viewmodels/DisbursementRequestFragmentVM.kt b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/viewmodels/DisbursementRequestFragmentVM.kt index 01a25d49fd..e5834a4051 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/viewmodels/DisbursementRequestFragmentVM.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/viewmodels/DisbursementRequestFragmentVM.kt @@ -11,9 +11,9 @@ import android.os.Bundle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.navi.homeloan.common.Constants.LOAN_ACCOUNT_NUMBER +import com.navi.homeloan.common.states.GenericWidgetState import com.navi.homeloan.tranche.fragments.TrancheStatusTrackerFragment.Companion.TRANCHE_ID import com.navi.homeloan.tranche.repository.TrancheDisbursalRepository -import com.navi.homeloan.common.states.GenericWidgetState import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/viewmodels/RequestInstallmentFragmentVM.kt b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/viewmodels/RequestInstallmentFragmentVM.kt index b01e0857ce..96b8f8efb0 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/viewmodels/RequestInstallmentFragmentVM.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/viewmodels/RequestInstallmentFragmentVM.kt @@ -13,15 +13,15 @@ import androidx.lifecycle.viewModelScope import com.navi.analytics.utils.NaviTrackEvent import com.navi.common.network.models.ErrorMessage import com.navi.common.network.models.GenericErrorResponse -import com.navi.homeloan.tranche.models.RequestInstallmentDetails -import com.navi.homeloan.tranche.models.RequestInstallmentResponse -import com.navi.homeloan.tranche.models.TrancheDisbursalResponseV2 -import com.navi.homeloan.tranche.repository.TrancheDisbursalRepository import com.navi.homeloan.common.Constants.ARG_ACCOUNT_NUMBER import com.navi.homeloan.common.Constants.INSTALLMENT_DETAILS import com.navi.homeloan.common.Constants.OWN_CONTRIBUTION_PROOF import com.navi.homeloan.common.Constants.POST_INSTALLMENT_DETAILS import com.navi.homeloan.common.Constants.REQUEST_INSTALLMENT_DETAILS_V2 +import com.navi.homeloan.tranche.models.RequestInstallmentDetails +import com.navi.homeloan.tranche.models.RequestInstallmentResponse +import com.navi.homeloan.tranche.models.TrancheDisbursalResponseV2 +import com.navi.homeloan.tranche.repository.TrancheDisbursalRepository import com.navi.naviwidgets.models.response.GenericWidgetResponse import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @@ -86,9 +86,7 @@ constructor(private val repository: TrancheDisbursalRepository) : ViewModel() { } fun fetchTrancheDisbursalWidgetsV2(arguments: Bundle?, page: String) { - viewModelScope.launch( - coroutineExceptionHandler(REQUEST_INSTALLMENT_DETAILS_V2) - ) { + viewModelScope.launch(coroutineExceptionHandler(REQUEST_INSTALLMENT_DETAILS_V2)) { _requestInstallmentStateFlowV2.emit(RequestInstallmentViewStateV2.Loading) val response = arguments?.getString(ARG_ACCOUNT_NUMBER)?.let { @@ -101,11 +99,7 @@ constructor(private val repository: TrancheDisbursalRepository) : ViewModel() { RequestInstallmentViewStateV2.Success(response.data) ) } else { - sendErrorEvent( - REQUEST_INSTALLMENT_DETAILS_V2, - response?.error, - response?.errors - ) + sendErrorEvent(REQUEST_INSTALLMENT_DETAILS_V2, response?.error, response?.errors) _requestInstallmentStateFlowV2.emit(RequestInstallmentViewStateV2.Failure) } } @@ -127,11 +121,7 @@ constructor(private val repository: TrancheDisbursalRepository) : ViewModel() { ) { _ownContributionStateFlow.emit(RequestInstallmentViewStateV2.Success(response.data)) } else { - sendErrorEvent( - OWN_CONTRIBUTION_PROOF, - response?.error, - response?.errors - ) + sendErrorEvent(OWN_CONTRIBUTION_PROOF, response?.error, response?.errors) _ownContributionStateFlow.emit(RequestInstallmentViewStateV2.Failure) } } @@ -152,11 +142,7 @@ constructor(private val repository: TrancheDisbursalRepository) : ViewModel() { ) { _installmentDetailsStateFlow.emit(InstallmentDetailsState.Success(response.data)) } else { - sendErrorEvent( - INSTALLMENT_DETAILS, - response?.error, - response?.errors - ) + sendErrorEvent(INSTALLMENT_DETAILS, response?.error, response?.errors) _installmentDetailsStateFlow.emit(InstallmentDetailsState.Failure) } } @@ -177,11 +163,7 @@ constructor(private val repository: TrancheDisbursalRepository) : ViewModel() { ) { _postDetailsStateFlow.emit(PostDetailsState.Success(response.data)) } else { - sendErrorEvent( - POST_INSTALLMENT_DETAILS, - response?.error, - response?.errors - ) + sendErrorEvent(POST_INSTALLMENT_DETAILS, response?.error, response?.errors) _postDetailsStateFlow.emit(PostDetailsState.Failure) } } @@ -202,17 +184,12 @@ constructor(private val repository: TrancheDisbursalRepository) : ViewModel() { ) { _postDetailsStateFlow.emit(PostDetailsState.Success(response.data)) } else { - sendErrorEvent( - POST_INSTALLMENT_DETAILS, - response?.error, - response?.errors - ) + sendErrorEvent(POST_INSTALLMENT_DETAILS, response?.error, response?.errors) _postDetailsStateFlow.emit(PostDetailsState.Failure) } } } - fun sendErrorEvent( errorTag: String, error: ErrorMessage?, @@ -241,20 +218,26 @@ constructor(private val repository: TrancheDisbursalRepository) : ViewModel() { sealed class RequestInstallmentViewStateV2 { class Success(val response: TrancheDisbursalResponseV2?) : RequestInstallmentViewStateV2() + object Failure : RequestInstallmentViewStateV2() + object Loading : RequestInstallmentViewStateV2() } - sealed class PostDetailsState { class Success(val response: RequestInstallmentResponse?) : PostDetailsState() + object Failure : PostDetailsState() + object Loading : PostDetailsState() + object Init : PostDetailsState() } sealed class InstallmentDetailsState { class Success(val response: GenericWidgetResponse?) : InstallmentDetailsState() + object Failure : InstallmentDetailsState() + object Loading : InstallmentDetailsState() } diff --git a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/viewmodels/TrancheStatusTrackerFragmentVM.kt b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/viewmodels/TrancheStatusTrackerFragmentVM.kt index dd37eeddb4..deeb334a4d 100644 --- a/android/navi-hl/src/main/java/com/navi/homeloan/tranche/viewmodels/TrancheStatusTrackerFragmentVM.kt +++ b/android/navi-hl/src/main/java/com/navi/homeloan/tranche/viewmodels/TrancheStatusTrackerFragmentVM.kt @@ -9,8 +9,8 @@ package com.navi.homeloan.tranche.viewmodels import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.navi.homeloan.tranche.repository.TrancheDisbursalRepository import com.navi.homeloan.common.states.GenericWidgetState +import com.navi.homeloan.tranche.repository.TrancheDisbursalRepository import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow @@ -28,8 +28,7 @@ constructor(private val repository: TrancheDisbursalRepository) : ViewModel() { fun fetchStatusTrackerWidgets(loanAccountNumber: String?, trancheId: String?) { viewModelScope.launch { _widgetDataResponse.emit(GenericWidgetState.Loading) - val response = - repository.fetchStatusScreenWidgets(loanAccountNumber, trancheId) + val response = repository.fetchStatusScreenWidgets(loanAccountNumber, trancheId) if ( response.data != null && response.error == null && response.errors.isNullOrEmpty() ) { diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/accountagreegator/HLAccountAggregatorActivity.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/accountagreegator/HLAccountAggregatorActivity.kt index 40cbcb3b47..2328de4752 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/accountagreegator/HLAccountAggregatorActivity.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/accountagreegator/HLAccountAggregatorActivity.kt @@ -104,7 +104,9 @@ class HLAccountAggregatorActivity : HomeLoanBaseActivity(), HLCommonBottomSheetL private val redirectionWaitingTime: Long = 500L private val finarkeinViewModel by lazy { ViewModelProvider(this)[HLFinarkeinVM::class.java] } - private val sharedLoaderVM by lazy { ViewModelProvider(this)[HomeLoanLoaderSharedVM::class.java] } + private val sharedLoaderVM by lazy { + ViewModelProvider(this)[HomeLoanLoaderSharedVM::class.java] + } private val measureExecutionTimeUtil = MeasureExecutionTimeUtil() private lateinit var binding: AccountAggregatorActivityBinding private val analyticsEventTracker by lazy { NaviAnalytics.naviAnalytics.ThirdPartyError() } @@ -197,15 +199,9 @@ class HLAccountAggregatorActivity : HomeLoanBaseActivity(), HLCommonBottomSheetL } } } - sharedLoaderVM.loaderDetails.observeNullable(this) { - it?.let { - getLoaderPollingData() - } - } + sharedLoaderVM.loaderDetails.observeNullable(this) { it?.let { getLoaderPollingData() } } sharedLoaderVM.loaderPollingDetails.observeNullable(this) { - it?.let { data -> - apiPollInit(data, data.requestType.orEmpty(), LOADER_POLLING) - } + it?.let { data -> apiPollInit(data, data.requestType.orEmpty(), LOADER_POLLING) } } sharedLoaderVM.apiPollStatus.observeNullable(this) { it?.let { handlePollingResponse(it.first, it.second) } @@ -214,8 +210,7 @@ class HLAccountAggregatorActivity : HomeLoanBaseActivity(), HLCommonBottomSheetL apiPollScheduler?.stopApiPoll() errorResponse?.actions?.getOrNull(0)?.let { navigateTo(CtaData(url = it.url, parameters = it.parameters)) - } - ?: run { handlePollingTimeout() } + } ?: run { handlePollingTimeout() } } } @@ -328,8 +323,12 @@ class HLAccountAggregatorActivity : HomeLoanBaseActivity(), HLCommonBottomSheetL redirectUsingFailureCta() } is FinancialDataStatusAsyncResponseState.Success -> { - viewState.data?.let { apiPollInit(uploadDataAsyncResponse = it, pollingType = FINARKEIN_POLLING) } - ?: kotlin.run { redirectUsingFailureCta() } + viewState.data?.let { + apiPollInit( + uploadDataAsyncResponse = it, + pollingType = FINARKEIN_POLLING + ) + } ?: kotlin.run { redirectUsingFailureCta() } } } } @@ -341,7 +340,8 @@ class HLAccountAggregatorActivity : HomeLoanBaseActivity(), HLCommonBottomSheetL releasePollingListeners() binding.progressLayout.visibility = View.GONE showFullScreenError( - errorData = timeoutErrorMessage + errorData = + timeoutErrorMessage ?: finarkeinViewModel.getTimeOutErrorData( getString(R.string.retry), getString(R.string.bank_detail_fetch_failed_try_again), @@ -369,11 +369,7 @@ class HLAccountAggregatorActivity : HomeLoanBaseActivity(), HLCommonBottomSheetL ) } ?: kotlin.run { - finarkeinEvent.missingCta( - FAILURE, - screenName, - ModuleNameV2.HL.name - ) + finarkeinEvent.missingCta(FAILURE, screenName, ModuleNameV2.HL.name) launchHome() } } @@ -397,24 +393,29 @@ class HLAccountAggregatorActivity : HomeLoanBaseActivity(), HLCommonBottomSheetL } } - private fun apiPollInit(uploadDataAsyncResponse: UploadDataAsyncResponse, type: String? = null, pollingType: String) { - if(pollingType == FINARKEIN_POLLING) { + private fun apiPollInit( + uploadDataAsyncResponse: UploadDataAsyncResponse, + type: String? = null, + pollingType: String + ) { + if (pollingType == FINARKEIN_POLLING) { measureExecutionTimeUtil.startMeasure(screenName) } apiPollScheduler = ApiPollScheduler( initialDelay = - uploadDataAsyncResponse.requestConfig - ?.initialDelay - ?.toLong() - .orElse(ApiPollScheduler.INITIAL_DELAY_FOR_API_POLL_SECONDS), + uploadDataAsyncResponse.requestConfig + ?.initialDelay + ?.toLong() + .orElse(ApiPollScheduler.INITIAL_DELAY_FOR_API_POLL_SECONDS), pollInterval = - uploadDataAsyncResponse.requestConfig - ?.interval - .orElse(ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS.toInt()) - .toLong(), - numberOfRetry = uploadDataAsyncResponse.requestConfig?.numOfRetries - ?: ApiPollScheduler.API_POLL_RETRY_COUNT, + uploadDataAsyncResponse.requestConfig + ?.interval + .orElse(ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS.toInt()) + .toLong(), + numberOfRetry = + uploadDataAsyncResponse.requestConfig?.numOfRetries + ?: ApiPollScheduler.API_POLL_RETRY_COUNT, doOnTimeout = { runOnUiThread { handlePollingTimeout() @@ -422,10 +423,17 @@ class HLAccountAggregatorActivity : HomeLoanBaseActivity(), HLCommonBottomSheetL } } ) { - if(pollingType == LOADER_POLLING) { - type?.let { sharedLoaderVM.checkApiPollStatus(uploadDataAsyncResponse.requestId.orEmpty(), type) } + if (pollingType == LOADER_POLLING) { + type?.let { + sharedLoaderVM.checkApiPollStatus( + uploadDataAsyncResponse.requestId.orEmpty(), + type + ) + } } else { - finarkeinViewModel.fetchFinarkeinPollingStatus(uploadDataAsyncResponse.requestId.orEmpty()) + finarkeinViewModel.fetchFinarkeinPollingStatus( + uploadDataAsyncResponse.requestId.orEmpty() + ) } } apiPollScheduler?.scheduleApiPoll() @@ -598,10 +606,7 @@ class HLAccountAggregatorActivity : HomeLoanBaseActivity(), HLCommonBottomSheetL } private fun statusHandling(status: String) { - if ( - TextUtils.equals(status, SUCCESS) || - TextUtils.equals(status, FAILURE) - ) { + if (TextUtils.equals(status, SUCCESS) || TextUtils.equals(status, FAILURE)) { apiPollScheduler?.stopApiPoll() sharedLoaderVM.deInit() } @@ -649,8 +654,7 @@ class HLAccountAggregatorActivity : HomeLoanBaseActivity(), HLCommonBottomSheetL } else { redirectUsingFailureCta() } - } - ?: run { redirectUsingFailureCta() } + } ?: run { redirectUsingFailureCta() } } override fun updateTrackerContent() {} diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/accountagreegator/repository/HLFinarkeinRepository.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/accountagreegator/repository/HLFinarkeinRepository.kt index 2afa746a4c..3210628a66 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/accountagreegator/repository/HLFinarkeinRepository.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/accountagreegator/repository/HLFinarkeinRepository.kt @@ -19,26 +19,16 @@ class HLFinarkeinRepository : ResponseCallback() { apiResponseCallback(retrofitService().fetchFinarkeinAuthToken()) suspend fun postFinarkeinEventUpdates(finarkeinEventRequest: FinarkeinEventRequest) = - apiResponseCallback( - retrofitService() - .postFinarkeinEventUpdates(finarkeinEventRequest) - ) + apiResponseCallback(retrofitService().postFinarkeinEventUpdates(finarkeinEventRequest)) suspend fun fetchFinarkeinConsentData(finarkeinConsentRequest: FinarkeinConsentRequest) = - apiResponseCallback( - retrofitService() - .fetchFinarkeinConsentData(finarkeinConsentRequest) - ) + apiResponseCallback(retrofitService().fetchFinarkeinConsentData(finarkeinConsentRequest)) suspend fun fetchFinarkeinPollingStatus(requestId: String) = - apiResponseCallback( - retrofitService().fetchFinarkeinPollingStatus(requestId) - ) + apiResponseCallback(retrofitService().fetchFinarkeinPollingStatus(requestId)) suspend fun fetchAccountAggregatorResponse(queryMap: HashMap) = - apiResponseCallback( - retrofitService().fetchAccountAggregatorResponse(queryMap) - ) + apiResponseCallback(retrofitService().fetchAccountAggregatorResponse(queryMap)) suspend fun verifyFinancialDataStatusResponse( queryMap: HashMap, @@ -46,9 +36,6 @@ class HLFinarkeinRepository : ResponseCallback() { ) = apiResponseCallback( retrofitService() - .verifyFinancialDataStatusResponse( - queryMap, - financialDataStatusRequest - ) + .verifyFinancialDataStatusResponse(queryMap, financialDataStatusRequest) ) } diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/common/adapter/HLFormScreenWidgetViewMapping.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/common/adapter/HLFormScreenWidgetViewMapping.kt index fb4e253227..87538a50c2 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/common/adapter/HLFormScreenWidgetViewMapping.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/common/adapter/HLFormScreenWidgetViewMapping.kt @@ -10,9 +10,9 @@ package com.navi.hl.common.adapter import android.view.LayoutInflater import android.view.ViewGroup import androidx.databinding.DataBindingUtil +import com.navi.naviwidgets.R as WidgetsR import com.navi.naviwidgets.R import com.navi.naviwidgets.databinding.LayoutElevatedTextWithIconsWidgetBinding -import com.navi.naviwidgets.R as WidgetsR import com.navi.naviwidgets.databinding.LayoutInformationBinding import com.navi.naviwidgets.databinding.LayoutLabelWithInputSearchBinding import com.navi.naviwidgets.databinding.LayoutLabeledDateInputBinding @@ -114,10 +114,8 @@ object HLFormScreenWidgetViewMapping { TitleDescImageWidget::class.java to WidgetType.TITLE_DESC_IMAGE_WIDGET.ordinal, ProductBenefitsGridWidget::class.java to WidgetType.PRODUCT_BENEFITS_GRID_WIDGET.ordinal, - CheckboxWithTitleWidget::class.java to - WidgetType.CHECKBOX_WITH_TITLE_WIDGET.ordinal, - ElevatedTextWithIconsWidget::class.java to - WidgetType.ELEVATED_TEXT_WITH_ICONS.ordinal, + CheckboxWithTitleWidget::class.java to WidgetType.CHECKBOX_WITH_TITLE_WIDGET.ordinal, + ElevatedTextWithIconsWidget::class.java to WidgetType.ELEVATED_TEXT_WITH_ICONS.ordinal, RadioGroupWithFooterCardWidget::class.java to WidgetType.RADIO_GROUP_WITH_FOOTER_CARD.ordinal ) diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/common/ui/activity/HomeLoanBaseActivity.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/common/ui/activity/HomeLoanBaseActivity.kt index f4e6c6256d..5cf49cb9c3 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/common/ui/activity/HomeLoanBaseActivity.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/common/ui/activity/HomeLoanBaseActivity.kt @@ -99,9 +99,7 @@ abstract class HomeLoanBaseActivity : BaseActivity(), Navigator { queryMap.clear() try { intent?.extras?.let { extras -> - extras.keySet()?.forEach { key -> - queryMap[key] = "${extras.get(key)}" - } + extras.keySet()?.forEach { key -> queryMap[key] = "${extras.get(key)}" } } } catch (e: Exception) { e.log() @@ -130,8 +128,7 @@ abstract class HomeLoanBaseActivity : BaseActivity(), Navigator { supportFragmentManager.beginTransaction().run { fragment.arguments?.getString(ACTION)?.let { replace(containerId, fragment, destination) - } - ?: run { replace(containerId, fragment, destination) } + } ?: run { replace(containerId, fragment, destination) } commit() } } @@ -186,9 +183,11 @@ abstract class HomeLoanBaseActivity : BaseActivity(), Navigator { SubScreen.HL_INSUFFICIENT_BANK_DETAILS_SCREEN -> HomeLoanInsufficientBankDetailsFragment.newInstance(arguments) SubScreen.HL_LOADER_SCREEN -> HomeLoanLoaderFragment.newInstance(arguments) - SubScreen.HL_TOP_UP_INTRO_SCREEN -> HomeLoanTopUpIntroScreenFragment.newInstance(arguments) + SubScreen.HL_TOP_UP_INTRO_SCREEN -> + HomeLoanTopUpIntroScreenFragment.newInstance(arguments) SubScreen.HL_COMPOSE_INFO_SCREEN -> HomeLoanComposeInfoFragment.newInstance(arguments) - SubScreen.HL_FULL_SCREEN_STATUS_PAGE -> HomeLoanFullScreenStatusFragment.newInstance(arguments) + SubScreen.HL_FULL_SCREEN_STATUS_PAGE -> + HomeLoanFullScreenStatusFragment.newInstance(arguments) else -> null } } diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/common/ui/activity/HomeLoanLoaderActivity.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/common/ui/activity/HomeLoanLoaderActivity.kt index db75f67da6..482e475ad1 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/common/ui/activity/HomeLoanLoaderActivity.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/common/ui/activity/HomeLoanLoaderActivity.kt @@ -131,8 +131,7 @@ class HomeLoanLoaderActivity : apiPollScheduler?.stopApiPoll() errorResponse?.actions?.getOrNull(0)?.let { navigateTo(CtaData(url = it.url, parameters = it.parameters)) - } - ?: run { handleScreenStatus(viewModel.loaderDetails.value?.loaderPageTimeOutData) } + } ?: run { handleScreenStatus(viewModel.loaderDetails.value?.loaderPageTimeOutData) } } } @@ -265,20 +264,17 @@ class HomeLoanLoaderActivity : state?.title?.let { binding.titleTv.visibility = View.VISIBLE binding.titleTv.setTextFieldData(it) - } - ?: run { binding.titleTv.visibility = View.GONE } + } ?: run { binding.titleTv.visibility = View.GONE } state?.subTitle?.let { binding.subTitleTv.visibility = View.VISIBLE binding.subTitleTv.setTextFieldData(it) - } - ?: run { binding.subTitleTv.visibility = View.GONE } + } ?: run { binding.subTitleTv.visibility = View.GONE } state?.footer?.let { binding.footerView.visibility = View.VISIBLE binding.footerView.setData(it) - } - ?: run { binding.footerView.visibility = View.GONE } + } ?: run { binding.footerView.visibility = View.GONE } } private fun navigateToOfferAnimation() { diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/common/ui/compose/ComposeAnimation.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/common/ui/compose/ComposeAnimation.kt index 2949100798..1f2ba20785 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/common/ui/compose/ComposeAnimation.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/common/ui/compose/ComposeAnimation.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.FastOutSlowInEasing import androidx.compose.animation.core.TweenSpec @@ -35,8 +42,8 @@ import com.navi.hl.steps.fragment.HomeLoanTopUpIntroScreenFragment import com.navi.naviwidgets.extensions.NaviTextWidgetized import com.navi.naviwidgets.models.response.TextFieldData import com.navi.uitron.utils.transformations.moneyFormat -import kotlinx.coroutines.delay import java.util.Objects.toString +import kotlinx.coroutines.delay @Composable fun AnimatedArc(outstandingAmount: Float?, topUpAmount: Float?) { @@ -47,7 +54,7 @@ fun AnimatedArc(outstandingAmount: Float?, topUpAmount: Float?) { outstandingAmount?.let { osA -> topUpAmount?.let { tuA -> - sweepAngle1Target = 170f * (osA/(osA+tuA)) + sweepAngle1Target = 170f * (osA / (osA + tuA)) sweepAngle2Target = 170f - sweepAngle1Target } } @@ -72,20 +79,11 @@ fun AnimatedArc(outstandingAmount: Float?, topUpAmount: Float?) { addRect(Rect(-30f, -30f, 1000f, 5500f)) } - Canvas( - modifier = Modifier - .size(244.dp) - .clip(shape = cropShape) - ) { + Canvas(modifier = Modifier.size(244.dp).clip(shape = cropShape)) { val canvasWidth = size.width val canvasHeight = size.height - val arcRect = Rect( - left = 0f, - top = 0f, - right = canvasWidth, - bottom = canvasHeight - ) + val arcRect = Rect(left = 0f, top = 0f, right = canvasWidth, bottom = canvasHeight) drawArc( color = HLColor.orangeFF6E00, @@ -112,7 +110,7 @@ fun AnimatedArc(outstandingAmount: Float?, topUpAmount: Float?) { fun getAmountList(start: Int, end: Int): MutableList { val amountList = mutableListOf() for (i in start..end) { - val formattedAmount = moneyFormat(toString(i*1000000)) + val formattedAmount = moneyFormat(toString(i * 1000000)) amountList.add("${HomeLoanTopUpIntroScreenFragment.RUPEE_SYMBOL}${formattedAmount}") } return amountList @@ -125,72 +123,56 @@ fun RollingNumberAnimation(textFieldData: TextFieldData?, numbers: MutableList 6){ + if (currentIndex < numbers.size - 1 && currentIndex > 6) { offsetY.animateTo( targetValue = -20f, - animationSpec = tween( - durationMillis = 400, - easing = FastOutSlowInEasing - ) + animationSpec = tween(durationMillis = 400, easing = FastOutSlowInEasing) ) currentIndex = (currentIndex + 1) offsetY.snapTo(20f) } - if(currentIndex == numbers.size - 1){ + if (currentIndex == numbers.size - 1) { offsetY.animateTo( targetValue = 0f, - animationSpec = tween( - durationMillis = 400, - easing = FastOutSlowInEasing - ) + animationSpec = tween(durationMillis = 400, easing = FastOutSlowInEasing) ) } } Box( - modifier = Modifier - .offset(y = offsetY.value.dp) - .align(Alignment.TopCenter) - .fillMaxWidth(), + modifier = + Modifier.offset(y = offsetY.value.dp).align(Alignment.TopCenter).fillMaxWidth(), contentAlignment = Alignment.Center ) { NaviTextWidgetized( @@ -207,9 +189,7 @@ fun RollingNumberAnimation(textFieldData: TextFieldData?, numbers: MutableList() diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/landingpage/fragment/HomeLoanLandingPageFragment.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/landingpage/fragment/HomeLoanLandingPageFragment.kt index 83a7b27bf4..17663b54a6 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/landingpage/fragment/HomeLoanLandingPageFragment.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/landingpage/fragment/HomeLoanLandingPageFragment.kt @@ -233,8 +233,7 @@ class HomeLoanLandingPageFragment : if (!isBottomSheetVisible(TitleWithStartAndEndIconBottomSheet.TAG)) { safelyShowBottomSheet(bottomSheet, TitleWithStartAndEndIconBottomSheet.TAG) } - } - ?: run { navigateTo(ctaData, false) } + } ?: run { navigateTo(ctaData, false) } } private fun navigateTo(cta: CtaData?, finish: Boolean = true) { diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/landingpage/viewmodel/HomeLoanLandingPageFragmentVM.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/landingpage/viewmodel/HomeLoanLandingPageFragmentVM.kt index 8cb6959ebe..1286d9b63c 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/landingpage/viewmodel/HomeLoanLandingPageFragmentVM.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/landingpage/viewmodel/HomeLoanLandingPageFragmentVM.kt @@ -32,11 +32,11 @@ import kotlinx.coroutines.launch class HomeLoanLandingPageFragmentVM( private val repository: HomeLoanLandingPageRepository = HomeLoanLandingPageRepository(), - private val naviCacheRepository: NaviCacheRepository = NaviCacheRepositoryImpl( - NaviSharedDatabase.getInstance( - NaviApplication.instance.applicationContext - ).naviCacheDao() - ) + private val naviCacheRepository: NaviCacheRepository = + NaviCacheRepositoryImpl( + NaviSharedDatabase.getInstance(NaviApplication.instance.applicationContext) + .naviCacheDao() + ) ) : BaseVM() { private val _landingPageResponse = MutableLiveData() @@ -49,14 +49,13 @@ class HomeLoanLandingPageFragmentVM( naviCacheRepository.getDataOrFetchFromAltSource( key = NAVI_HL_LANDING_PAGE_CACHE_KEY, version = version, - getDataFromAltSource = { getLandingPageResponseFromAPI() }) + getDataFromAltSource = { getLandingPageResponseFromAPI() } + ) landingPageResponse?.let { try { _landingPageResponse.postValue( - getGsonBuilderForWidgetizedResponse().fromJson( - it.value, - HLLandingPageResponse::class.java - ) + getGsonBuilderForWidgetizedResponse() + .fromJson(it.value, HLLandingPageResponse::class.java) ) } catch (e: Exception) { e.log() @@ -74,9 +73,7 @@ class HomeLoanLandingPageFragmentVM( tag = ApiErrorTagType.HL_GET_LANDING_PAGE_ERROR, showFullScreenError = true ) - return NaviCacheAltSourceEntity( - isSuccess = false - ) + return NaviCacheAltSourceEntity(isSuccess = false) } return NaviCacheAltSourceEntity( value = Gson().toJson(landingPageAPIResponse.data), @@ -107,7 +104,8 @@ class HomeLoanLandingPageFragmentVM( naviCacheRepository.getDataOrFetchFromAltSource( key = NAVI_HL_INTRO_SCREEN_CACHE_KEY, version = introPageVersion.toLong(), - getDataFromAltSource = { getHomeLoanIntroResponse(queryMap, introPageVersion) }) + getDataFromAltSource = { getHomeLoanIntroResponse(queryMap, introPageVersion) } + ) } } @@ -118,9 +116,7 @@ class HomeLoanLandingPageFragmentVM( val homeLoanIntroResponse = repository.fetchHomeLoanIntroResponse(queryMap) if (!homeLoanIntroResponse.isSuccessWithData()) { setErrorData(homeLoanIntroResponse.errors, homeLoanIntroResponse.error) - return NaviCacheAltSourceEntity( - isSuccess = false - ) + return NaviCacheAltSourceEntity(isSuccess = false) } return NaviCacheAltSourceEntity( value = Gson().toJson(homeLoanIntroResponse.data), @@ -128,5 +124,4 @@ class HomeLoanLandingPageFragmentVM( isSuccess = true ) } - } diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/network/retrofit/HLRetrofitProvider.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/network/retrofit/HLRetrofitProvider.kt index d97a6f7ef8..5ef483fa15 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/network/retrofit/HLRetrofitProvider.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/network/retrofit/HLRetrofitProvider.kt @@ -24,21 +24,21 @@ class HLRetrofitProvider private constructor() { val INSTANCE = HLRetrofitProvider() } - companion object { val instance: HLRetrofitProvider by lazy { Holder.INSTANCE } val defaultRetrofitClient: Retrofit = createRetrofitClient( NaviHttpClient( - networkInfo = NetworkInfo( - baseUrl = getBaseUrl(), - appVersionName = BuildConfig.VERSION_NAME, - appVersionCode = BuildConfig.VERSION_CODE.toString(), - moduleName = ModuleName.HL, - timeoutInSec = ApiConstants.API_CONNECT_TIMEOUT_VALUE - ), - context = NaviApplication.instance.applicationContext - ) + networkInfo = + NetworkInfo( + baseUrl = getBaseUrl(), + appVersionName = BuildConfig.VERSION_NAME, + appVersionCode = BuildConfig.VERSION_CODE.toString(), + moduleName = ModuleName.HL, + timeoutInSec = ApiConstants.API_CONNECT_TIMEOUT_VALUE + ), + context = NaviApplication.instance.applicationContext + ) .httpClientBuilder ) } diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/network/retrofit/RetrofitService.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/network/retrofit/RetrofitService.kt index ee70e71294..c2fd75e9a2 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/network/retrofit/RetrofitService.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/network/retrofit/RetrofitService.kt @@ -21,6 +21,7 @@ import com.navi.homeloan.common.models.* import com.navi.homeloan.common.models.accountaggregator.* import com.navi.homeloan.common.models.incomeverification.* import com.navi.naviwidgets.models.response.esign.DigioStatusUpdateRequestModel +import java.util.concurrent.ConcurrentHashMap import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.Response @@ -35,7 +36,6 @@ import retrofit2.http.Path import retrofit2.http.Query import retrofit2.http.QueryMap import retrofit2.http.Url -import java.util.concurrent.ConcurrentHashMap interface RetrofitService { @@ -367,8 +367,7 @@ interface RetrofitService { // Finarkein Apis @GET("/financial-profile/account-aggregator/finarkein/session") - suspend fun fetchFinarkeinAuthToken( - ): Response> + suspend fun fetchFinarkeinAuthToken(): Response> @POST("/financial-profile/account-aggregator/finarkein/inline-events") suspend fun postFinarkeinEventUpdates( diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/network/util/ApiErrorTagType.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/network/util/ApiErrorTagType.kt index 3fff0a4f88..f69b4203e7 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/network/util/ApiErrorTagType.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/network/util/ApiErrorTagType.kt @@ -72,10 +72,11 @@ object ApiErrorTagType { const val HL_GET_INTRO_RESPONSE_ERROR = "HL_GET_INTRO_RESPONSE_ERROR" const val HL_INTRO_PATCH_API_ERROR = "HL_INTRO_PATCH_API_ERROR" const val HL_PAN_VERIFICATION_RESPONSE_ERROR = "HL_PAN_VERIFICATION_RESPONSE_ERROR" - const val HL_GET_TOP_UP_INTRO_SCREEN_RESPONSE_ERROR = "HL_GET_TOP_UP_INTRO_SCREEN_RESPONSE_ERROR" - const val HL_GET_COMPOSE_INFO_SCREEN_RESPONSE_ERROR = "HL_GET_COMPOSE_INFO_SCREEN_RESPONSE_ERROR" - const val HL_GET_FULL_SCREEN_STATUS_RESPONSE_ERROR = - "HL_GET_FULL_SCREEN_STATUS_RESPONSE_ERROR" + const val HL_GET_TOP_UP_INTRO_SCREEN_RESPONSE_ERROR = + "HL_GET_TOP_UP_INTRO_SCREEN_RESPONSE_ERROR" + const val HL_GET_COMPOSE_INFO_SCREEN_RESPONSE_ERROR = + "HL_GET_COMPOSE_INFO_SCREEN_RESPONSE_ERROR" + const val HL_GET_FULL_SCREEN_STATUS_RESPONSE_ERROR = "HL_GET_FULL_SCREEN_STATUS_RESPONSE_ERROR" @StringDef(NO_INTERNET_ERROR) @Retention(AnnotationRetention.SOURCE) diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/activity/HomeLoanStepsActivity.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/activity/HomeLoanStepsActivity.kt index 136780c22a..944d5ddb27 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/activity/HomeLoanStepsActivity.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/activity/HomeLoanStepsActivity.kt @@ -142,7 +142,9 @@ class HomeLoanStepsActivity : private var digioResponseListener: DigioResponseListener? = null private var scrollListener: RecyclerView.OnScrollListener? = null private var isHamburgerVisible = false - private val sharedFormSearchVM by lazy { ViewModelProvider(this)[SharedFormSearchVM::class.java] } + private val sharedFormSearchVM by lazy { + ViewModelProvider(this)[SharedFormSearchVM::class.java] + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -461,8 +463,7 @@ class HomeLoanStepsActivity : override fun getCurrentFragmentScreenName(): String { return try { (supportFragmentManager.findFragmentById(homeLoanR.id.container) as? BaseFragment) - ?.screenName - ?: screenName + ?.screenName ?: screenName } catch (e: Exception) { screenName } @@ -501,8 +502,7 @@ class HomeLoanStepsActivity : val bottomSheet = HLCommonBottomSheet.getInstance(it) bottomSheet.setCommonBottomSheetListener(this) safelyShowBottomSheet(bottomSheet, HLCommonBottomSheet.TAG) - } - ?: run { super.onBackPressed() } + } ?: run { super.onBackPressed() } } } diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanAadhaarVerificationFragment.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanAadhaarVerificationFragment.kt index 1631ad8ea8..8352dbb263 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanAadhaarVerificationFragment.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanAadhaarVerificationFragment.kt @@ -302,20 +302,17 @@ class HomeLoanAadhaarVerificationFragment : HomeLoanBaseFragment(), HLFooterList state?.title?.let { binding.titleTv.visibility = View.VISIBLE binding.titleTv.setTextFieldData(it) - } - ?: run { binding.titleTv.visibility = View.GONE } + } ?: run { binding.titleTv.visibility = View.GONE } state?.subTitle?.let { binding.subTitleTv.visibility = View.VISIBLE binding.subTitleTv.setTextFieldData(it) - } - ?: run { binding.subTitleTv.visibility = View.GONE } + } ?: run { binding.subTitleTv.visibility = View.GONE } state?.footer?.let { binding.footerView.visibility = View.VISIBLE binding.footerView.setData(it) - } - ?: run { binding.footerView.visibility = View.GONE } + } ?: run { binding.footerView.visibility = View.GONE } } companion object { diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanCloseLoansFragment.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanCloseLoansFragment.kt index 21b9a1b695..579928d131 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanCloseLoansFragment.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanCloseLoansFragment.kt @@ -73,16 +73,16 @@ import com.navi.design.theme.getFontWeight import com.navi.design.theme.ttComposeFontFamily import com.navi.design.utils.dpToPxInInt import com.navi.hl.common.theme.color.HLColor.black191919 +import com.navi.hl.common.theme.color.HLColor.colorCream +import com.navi.hl.common.theme.color.HLColor.colorDarkGrey +import com.navi.hl.common.theme.color.HLColor.colorF5F5F5 +import com.navi.hl.common.theme.color.HLColor.colorGolden import com.navi.hl.common.theme.color.HLColor.colorGreen import com.navi.hl.common.theme.color.HLColor.colorGreenish -import com.navi.hl.common.theme.color.HLColor.colorTransparentRed -import com.navi.hl.common.theme.color.HLColor.colorDarkGrey -import com.navi.hl.common.theme.color.HLColor.colorMediumGrey -import com.navi.hl.common.theme.color.HLColor.colorGolden import com.navi.hl.common.theme.color.HLColor.colorLightGrey -import com.navi.hl.common.theme.color.HLColor.colorF5F5F5 -import com.navi.hl.common.theme.color.HLColor.colorCream +import com.navi.hl.common.theme.color.HLColor.colorMediumGrey import com.navi.hl.common.theme.color.HLColor.colorRed +import com.navi.hl.common.theme.color.HLColor.colorTransparentRed import com.navi.hl.common.ui.fragment.HomeLoanBaseFragment import com.navi.hl.network.util.ApiErrorTagType import com.navi.hl.steps.viewmodel.HomeLoanCloseLoansFragmentVM @@ -109,6 +109,8 @@ import com.navi.homeloan.common.models.LoanInfoHeader import com.navi.homeloan.common.models.Obligation import com.navi.homeloan.common.models.SelectedObligations import com.navi.homeloan.databinding.FragmentHomeLoanCloseLoansScreenBinding +import com.navi.homeloan.databinding.HlSnackbarLayoutBinding +import com.navi.naviwidgets.R as naviWidgetsR import com.navi.naviwidgets.adapters.NaviAdapter import com.navi.naviwidgets.callbacks.WidgetCallback import com.navi.naviwidgets.extensions.NaviImage @@ -117,9 +119,6 @@ import com.navi.naviwidgets.viewholder.ViewHolderFactoryImpl import java.lang.Integer.min import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import com.navi.naviwidgets.R as naviWidgetsR -import com.navi.homeloan.databinding.HlSnackbarLayoutBinding - class HomeLoanCloseLoansFragment : HomeLoanBaseFragment(), @@ -250,105 +249,114 @@ class HomeLoanCloseLoansFragment : } private fun initContent() { - binding.composeContainer.setContent { - OpenLoansContentView() - } + binding.composeContainer.setContent { OpenLoansContentView() } } @SuppressLint("SuspiciousIndentation") @Composable fun OpenLoansContentView() { val applicantList = this.viewModel.applicantList.collectAsState() - val mutableApplicantList = - remember { SnapshotStateList().apply { addAll(applicantList.value) } } + val mutableApplicantList = remember { + SnapshotStateList().apply { addAll(applicantList.value) } + } val scrollState = rememberLazyListState() val selectedLoansCount by this.viewModel.selectedLoansCount.collectAsState() Card( - modifier = Modifier - .fillMaxWidth() - .zIndex(2000f) - .border( - width = 1.dp, - color = colorLightGrey, - shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp), - ), + modifier = + Modifier.fillMaxWidth() + .zIndex(2000f) + .border( + width = 1.dp, + color = colorLightGrey, + shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp), + ), shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp), ) { - LazyColumn( - state = scrollState, - modifier = Modifier - .padding(top = 24.dp) - ) { + LazyColumn(state = scrollState, modifier = Modifier.padding(top = 24.dp)) { item { val loanInfoHeaderData = - this@HomeLoanCloseLoansFragment.viewModel.hlCloseLoansScreenResponse.value?.content?.loanInfoHeader + this@HomeLoanCloseLoansFragment.viewModel.hlCloseLoansScreenResponse.value + ?.content + ?.loanInfoHeader LoanInfoHeader(loanInfoHeaderData, selectedLoansCount) } - itemsIndexed(mutableApplicantList, key = { index, item -> - mutableApplicantList[index].applicantReferenceId.orEmpty() - }) { index, applicant -> - ApplicantCard(onExpandedUpdate = { - mutableApplicantList[index] = applicant.copy(expanded = it) - }, applicant, onApplicantUpdate = { isChecked, obligationIndex -> - val currentObligation = - mutableApplicantList[index].obligations?.get(obligationIndex) - val currentApplicant = mutableApplicantList[index] - val applicantListCopy = SnapshotStateList().apply { - addAll(mutableApplicantList) - } - applicantListCopy.forEachIndexed { index, applicant -> - val obligationList = applicant.obligations?.toMutableList() - applicant.obligations?.forEachIndexed { subIndex, loan -> - var updatedObligation = loan - if (loan.obligationId == currentObligation?.obligationId) { - if (applicant.applicantReferenceId == currentApplicant.applicantReferenceId) { - if (isChecked && updatedOffer <= maximumOffer) { - viewModel.selectedLoansObligationIds.add( - SelectedObligations( - loan.obligationId, - currentApplicant.applicantReferenceId + itemsIndexed( + mutableApplicantList, + key = { index, item -> + mutableApplicantList[index].applicantReferenceId.orEmpty() + } + ) { index, applicant -> + ApplicantCard( + onExpandedUpdate = { + mutableApplicantList[index] = applicant.copy(expanded = it) + }, + applicant, + onApplicantUpdate = { isChecked, obligationIndex -> + val currentObligation = + mutableApplicantList[index].obligations?.get(obligationIndex) + val currentApplicant = mutableApplicantList[index] + val applicantListCopy = + SnapshotStateList().apply { + addAll(mutableApplicantList) + } + applicantListCopy.forEachIndexed { index, applicant -> + val obligationList = applicant.obligations?.toMutableList() + applicant.obligations?.forEachIndexed { subIndex, loan -> + var updatedObligation = loan + if (loan.obligationId == currentObligation?.obligationId) { + if ( + applicant.applicantReferenceId == + currentApplicant.applicantReferenceId + ) { + if (isChecked && updatedOffer <= maximumOffer) { + viewModel.selectedLoansObligationIds.add( + SelectedObligations( + loan.obligationId, + currentApplicant.applicantReferenceId + ) ) - ) - viewModel.selectedLoansCount.value++ - viewModel.incrementAmount += loan.incrementAmount - ?: 0 - viewModel.emiAmount += loan.emiAmount ?: 0 - updatedSelectedLoanDetail() - } else if (!isChecked) { - viewModel.selectedLoansCount.value-- - viewModel.selectedLoansObligationIds.remove( - SelectedObligations( - loan.obligationId, - currentApplicant.applicantReferenceId + viewModel.selectedLoansCount.value++ + viewModel.incrementAmount += + loan.incrementAmount ?: 0 + viewModel.emiAmount += loan.emiAmount ?: 0 + updatedSelectedLoanDetail() + } else if (!isChecked) { + viewModel.selectedLoansCount.value-- + viewModel.selectedLoansObligationIds.remove( + SelectedObligations( + loan.obligationId, + currentApplicant.applicantReferenceId + ) + ) + viewModel.incrementAmount -= + loan.incrementAmount ?: 0 + viewModel.emiAmount -= loan.emiAmount ?: 0 + updatedSelectedLoanDetail() + } + } else { + updatedObligation = + updatedObligation.copy( + disableCheckbox = isChecked, + isSelected = isChecked ) - ) - viewModel.incrementAmount -= loan.incrementAmount - ?: 0 - viewModel.emiAmount -= loan.emiAmount ?: 0 - updatedSelectedLoanDetail() } - } else { - updatedObligation = updatedObligation.copy( - disableCheckbox = isChecked, - isSelected = isChecked - ) - } - if (updatedOffer <= maximumOffer) { - updatedObligation = - updatedObligation.copy(isSelected = isChecked) - obligationList?.set(subIndex, updatedObligation) - updateCurrentOffer() - } else if (isChecked) { - maxLoanOfferAvailedBottomSheet() + if (updatedOffer <= maximumOffer) { + updatedObligation = + updatedObligation.copy(isSelected = isChecked) + obligationList?.set(subIndex, updatedObligation) + updateCurrentOffer() + } else if (isChecked) { + maxLoanOfferAvailedBottomSheet() + } } } + mutableApplicantList[index] = + applicant.copy(obligations = obligationList) } - mutableApplicantList[index] = - applicant.copy(obligations = obligationList) + viewModel.updateApplicantList(mutableApplicantList) } - viewModel.updateApplicantList(mutableApplicantList) - }) + ) } } } @@ -356,33 +364,26 @@ class HomeLoanCloseLoansFragment : @Composable fun LoanInfoHeader(loanInfoHeaderData: LoanInfoHeader?, selectedLoansCount: Int) { - Column( - modifier = Modifier - .fillMaxWidth() - ) { + Column(modifier = Modifier.fillMaxWidth()) { Row( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp, 8.dp), + modifier = Modifier.fillMaxWidth().padding(16.dp, 8.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { Row( - modifier = Modifier - .wrapContentHeight(), + modifier = Modifier.wrapContentHeight(), verticalAlignment = Alignment.CenterVertically ) { NaviTextWidgetized(textFieldData = loanInfoHeaderData?.headerTitle) - NaviImage(imageFieldData = loanInfoHeaderData?.headerIcon, - modifier = Modifier - .padding(start = 7.dp) - .size( - width = loanInfoHeaderData?.headerIcon?.iconWidth?.dp ?: 12.dp, - height = loanInfoHeaderData?.headerIcon?.iconHeight?.dp ?: 12.dp - ) - .clickable { - showOpenLoansInfoBottomSheet() - } + NaviImage( + imageFieldData = loanInfoHeaderData?.headerIcon, + modifier = + Modifier.padding(start = 7.dp) + .size( + width = loanInfoHeaderData?.headerIcon?.iconWidth?.dp ?: 12.dp, + height = loanInfoHeaderData?.headerIcon?.iconHeight?.dp ?: 12.dp + ) + .clickable { showOpenLoansInfoBottomSheet() } ) } Text( @@ -403,8 +404,7 @@ class HomeLoanCloseLoansFragment : @Composable fun JointLoanTextCard() { Card( - modifier = Modifier - .padding(8.dp), + modifier = Modifier.padding(8.dp), shape = RoundedCornerShape(100.dp), backgroundColor = colorCream ) { @@ -422,23 +422,29 @@ class HomeLoanCloseLoansFragment : @Composable fun JointLoanInfoCard() { Card( - modifier = Modifier - .fillMaxWidth(), + modifier = Modifier.fillMaxWidth(), shape = RoundedCornerShape(4.dp), backgroundColor = colorF5F5F5 ) { Row( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 4.dp), + modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 4.dp), verticalAlignment = Alignment.CenterVertically ) { NaviImage( - imageFieldData = viewModel.hlCloseLoansScreenResponse.value?.content?.jointLoanInfoCard?.icon, - modifier = Modifier - .padding(end = 8.dp) + imageFieldData = + viewModel.hlCloseLoansScreenResponse.value + ?.content + ?.jointLoanInfoCard + ?.icon, + modifier = Modifier.padding(end = 8.dp) + ) + NaviTextWidgetized( + textFieldData = + viewModel.hlCloseLoansScreenResponse.value + ?.content + ?.jointLoanInfoCard + ?.infoText ) - NaviTextWidgetized(textFieldData = viewModel.hlCloseLoansScreenResponse.value?.content?.jointLoanInfoCard?.infoText) } } } @@ -450,20 +456,16 @@ class HomeLoanCloseLoansFragment : onApplicantUpdate: (isChecked: Boolean, updatedObligationIndex: Int) -> Unit ) { Card( - modifier = Modifier - .padding(16.dp), + modifier = Modifier.padding(16.dp), elevation = 2.dp, shape = RoundedCornerShape(10.dp) ) { Column( - modifier = Modifier - .fillMaxWidth(), + modifier = Modifier.fillMaxWidth(), ) { Row( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp) - .clickable( + modifier = + Modifier.fillMaxWidth().padding(16.dp).clickable( indication = null, interactionSource = remember { MutableInteractionSource() } ) { @@ -491,12 +493,10 @@ class HomeLoanCloseLoansFragment : } Icon( imageVector = - if (applicant.expanded) Icons.Default.KeyboardArrowUp - else Icons.Default.KeyboardArrowDown, + if (applicant.expanded) Icons.Default.KeyboardArrowUp + else Icons.Default.KeyboardArrowDown, contentDescription = null, - modifier = Modifier - .size(24.dp) - .rotate(0f) + modifier = Modifier.size(24.dp).rotate(0f) ) } AnimatedVisibility(visible = applicant.expanded) { @@ -508,7 +508,8 @@ class HomeLoanCloseLoansFragment : index == obligationsList.lastIndex, onCheckedChange = { isChecked -> onApplicantUpdate(isChecked, index) - }) + } + ) } } } @@ -516,7 +517,6 @@ class HomeLoanCloseLoansFragment : } } } - } @Composable @@ -526,26 +526,23 @@ class HomeLoanCloseLoansFragment : onCheckedChange: (isChecked: Boolean) -> Unit ) { Column( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp), + modifier = Modifier.fillMaxWidth().padding(16.dp), verticalArrangement = Arrangement.SpaceBetween ) { Row( - modifier = Modifier - .fillMaxWidth(), + modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Start, verticalAlignment = Alignment.CenterVertically ) { obligation.isSelected?.let { Checkbox( - modifier = Modifier - .size(16.dp), + modifier = Modifier.size(16.dp), checked = it, - colors = androidx.compose.material.CheckboxDefaults.colors( - checkedColor = colorRed, - disabledColor = colorTransparentRed - ), + colors = + androidx.compose.material.CheckboxDefaults.colors( + checkedColor = colorRed, + disabledColor = colorTransparentRed + ), onCheckedChange = { isChecked -> onCheckedChange(isChecked) if (isChecked && obligation.jointLoan == true) { @@ -578,9 +575,7 @@ class HomeLoanCloseLoansFragment : Spacer(modifier = Modifier.height(16.dp)) obligation.keyValueFields?.forEach { Row( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 4.dp), + modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { @@ -605,9 +600,7 @@ class HomeLoanCloseLoansFragment : if (it && obligation.disableCheckbox == false) { obligation.documentUploadOption?.editData?.let { EditDocumentCard(obligation.documentUploadOption) - } ?: run { - AddDocumentCard(obligation.documentUploadOption) - } + } ?: run { AddDocumentCard(obligation.documentUploadOption) } Spacer(modifier = Modifier.height(16.dp)) } } @@ -622,11 +615,7 @@ class HomeLoanCloseLoansFragment : @Composable fun DashedDivider() { val pathEffect = PathEffect.dashPathEffect(floatArrayOf(15f, 10f), 0f) - Canvas( - Modifier - .fillMaxWidth() - .height(1.dp) - ) { + Canvas(Modifier.fillMaxWidth().height(1.dp)) { drawLine( color = Color.Black, start = Offset(0f, 0f), @@ -639,15 +628,16 @@ class HomeLoanCloseLoansFragment : @Composable fun ImpactOfClosingLoanCard(impactOfClosingLoan: ImpactOfClosingLoan?) { Column( - modifier = Modifier - .fillMaxWidth() - .clip(RoundedCornerShape(8.dp)) - .background(Color(android.graphics.Color.parseColor(impactOfClosingLoan?.bgColor))) - .padding(8.dp) + modifier = + Modifier.fillMaxWidth() + .clip(RoundedCornerShape(8.dp)) + .background( + Color(android.graphics.Color.parseColor(impactOfClosingLoan?.bgColor)) + ) + .padding(8.dp) ) { Row( - modifier = Modifier - .fillMaxWidth(), + modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { @@ -660,23 +650,20 @@ class HomeLoanCloseLoansFragment : @Composable fun AddDocumentCard(documentUploadOption: DocumentUploadOption?) { Row( - modifier = Modifier - .fillMaxWidth(), + modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { - Row( - verticalAlignment = Alignment.CenterVertically - ) { + Row(verticalAlignment = Alignment.CenterVertically) { Image( - painter = painterResource(id = naviWidgetsR.drawable.ic_extra_small_orange_plus_svg), + painter = + painterResource(id = naviWidgetsR.drawable.ic_extra_small_orange_plus_svg), contentDescription = null ) Text( text = documentUploadOption?.text.orEmpty(), - modifier = Modifier - .padding(horizontal = 4.dp) - .clickable { + modifier = + Modifier.padding(horizontal = 4.dp).clickable { stepsActivityVM.setObligationsList(viewModel.selectedLoansObligationIds) moveToNextScreen(documentUploadOption?.cta) }, @@ -699,17 +686,14 @@ class HomeLoanCloseLoansFragment : @Composable fun EditDocumentCard(documentUploadOption: DocumentUploadOption?) { Row( - modifier = Modifier - .fillMaxWidth() - .padding(8.dp), + modifier = Modifier.fillMaxWidth().padding(8.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { - Row( - verticalAlignment = Alignment.CenterVertically - ) { + Row(verticalAlignment = Alignment.CenterVertically) { Image( - painter = painterResource(id = naviWidgetsR.drawable.ic_circular_filled_check_green), + painter = + painterResource(id = naviWidgetsR.drawable.ic_circular_filled_check_green), contentDescription = null ) Text( @@ -723,10 +707,11 @@ class HomeLoanCloseLoansFragment : } Text( text = documentUploadOption?.editData?.text.orEmpty(), - modifier = Modifier.clickable { - stepsActivityVM.setObligationsList(viewModel.selectedLoansObligationIds) - moveToNextScreen(documentUploadOption?.cta) - }, + modifier = + Modifier.clickable { + stepsActivityVM.setObligationsList(viewModel.selectedLoansObligationIds) + moveToNextScreen(documentUploadOption?.cta) + }, fontFamily = ttComposeFontFamily, fontWeight = getFontWeight(FontWeightEnum.TT_SEMI_BOLD), fontSize = 14.sp, @@ -761,8 +746,8 @@ class HomeLoanCloseLoansFragment : val weightedWidth = maxWidth - minWidth val widthToAdd = weightedWidth * - (((updatedOffer - (currentOffer - viewModel.defaultLoanSelectedSum)).toDouble()) / - (maximumOffer - (currentOffer - viewModel.defaultLoanSelectedSum))) + (((updatedOffer - (currentOffer - viewModel.defaultLoanSelectedSum)).toDouble()) / + (maximumOffer - (currentOffer - viewModel.defaultLoanSelectedSum))) val updatedWidth = minWidth + widthToAdd binding.offerGraphTopView.closeLoanCurrentOfferLayout.layoutParams = binding.offerGraphTopView.closeLoanCurrentOfferLayout.layoutParams.apply { @@ -772,8 +757,7 @@ class HomeLoanCloseLoansFragment : binding.offerGraphTopView.currentOffer.text = currentOfferText.replace(AMOUNT_PLACEHOLDER, getAmountString(offer)) if (binding.offerGraphTopView.closeLoanCurrentOfferLayout.layoutParams.width == maxWidth) { - binding.offerGraphTopView.maxOfferText.text = - getString(R.string.hl_max_offer_availed) + binding.offerGraphTopView.maxOfferText.text = getString(R.string.hl_max_offer_availed) } else { binding.offerGraphTopView.maxOfferText.text = binding.response?.content?.graphData?.currentOfferLabel?.text @@ -781,7 +765,6 @@ class HomeLoanCloseLoansFragment : lockLoanOffer() } - /** Get loan count, selected items, updated offers and obligation Ids */ private fun updatedSelectedLoanDetail() { selectedLoansEmiAmount = viewModel.emiAmount @@ -793,8 +776,7 @@ class HomeLoanCloseLoansFragment : } else { analyticsEventTracker.onObligationsLoansSelected() } - } - ?: run { analyticsEventTracker.onObligationsLoansSelected() } + } ?: run { analyticsEventTracker.onObligationsLoansSelected() } } override fun onClick(naviClickAction: NaviClickAction, widgetId: String?) { @@ -802,7 +784,6 @@ class HomeLoanCloseLoansFragment : is CtaData -> { moveToNextScreen(naviClickAction) } - is NaviWidgetInfoClick -> { // Info icon click showOpenLoansInfoBottomSheet() @@ -831,8 +812,7 @@ class HomeLoanCloseLoansFragment : binding.response?.content?.insufficientLoansBottomSheet?.let { val bottomSheet = HLCommonBottomSheet.getInstance(it) safelyShowBottomSheet(bottomSheet, HLCommonBottomSheet.TAG) - } - ?: run { addDocumentBottomSheet() } + } ?: run { addDocumentBottomSheet() } } private fun addDocumentBottomSheet() { @@ -841,8 +821,7 @@ class HomeLoanCloseLoansFragment : val bottomSheet = HLCommonBottomSheet.getInstance(it) safelyShowBottomSheet(bottomSheet, ADD_DOCUMENT_BOTTOM_SHEET_TAG) bottomSheet.setCommonBottomSheetListener(this) - } - ?: run { moveToNextScreen(binding.response?.footer?.cta) } + } ?: run { moveToNextScreen(binding.response?.footer?.cta) } } else { onBsBackCtaClick( binding.response?.content?.addDocumentBottomSheet?.footer?.backCta, @@ -858,8 +837,7 @@ class HomeLoanCloseLoansFragment : val bottomSheet = HLCommonBottomSheet.getInstance(it) safelyShowBottomSheet(bottomSheet, HLCommonBottomSheet.TAG) bottomSheet.setCommonBottomSheetListener(this) - } - ?: run { moveToNextScreen(binding.response?.footer?.cta) } + } ?: run { moveToNextScreen(binding.response?.footer?.cta) } } else { onBsBackCtaClick( binding.response?.content?.jointLoanClosureBottomSheet?.footer?.nextCta, @@ -891,7 +869,7 @@ class HomeLoanCloseLoansFragment : applicant.obligations?.forEach { openLoan -> if ( selectedLoansObligationIds.any { it?.obligationId == openLoan.obligationId } && - openLoan.jointLoan == true + openLoan.jointLoan == true ) { showBottomSheet = true } @@ -902,11 +880,13 @@ class HomeLoanCloseLoansFragment : private fun shouldShowDocumentBottomSheet(): Boolean { var showBottomSheet = selectedLoansObligationIds.size != 0 - viewModel.hlCloseLoansScreenResponse.value?.content?.applicantsObligations?.forEach { applicant -> + viewModel.hlCloseLoansScreenResponse.value?.content?.applicantsObligations?.forEach { + applicant -> applicant.obligations?.forEach { obligation -> if ( - selectedLoansObligationIds.find { it?.obligationId == obligation.obligationId } != null && - obligation.documentUploadOption?.editData?.text != null + selectedLoansObligationIds.find { + it?.obligationId == obligation.obligationId + } != null && obligation.documentUploadOption?.editData?.text != null ) { showBottomSheet = false } @@ -983,7 +963,7 @@ class HomeLoanCloseLoansFragment : binding.response?.content?.graphData?.minEmiThresholdForApproval if ( minEmiThresholdForApproval != null && - (selectedLoansEmiAmount < minEmiThresholdForApproval) + (selectedLoansEmiAmount < minEmiThresholdForApproval) ) { insufficientLoansBottomSheet() } else if (shouldShowDocumentBottomSheet()) { diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanCommunicationAddressFragment.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanCommunicationAddressFragment.kt index 48e25a720e..3c2ee4821d 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanCommunicationAddressFragment.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanCommunicationAddressFragment.kt @@ -45,7 +45,10 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch class HomeLoanCommunicationAddressFragment : - HomeLoanBaseFragment(), WidgetCallback, BackListener, HLFooterListener, + HomeLoanBaseFragment(), + WidgetCallback, + BackListener, + HLFooterListener, HLCommonBottomSheetListener { private lateinit var binding: FragmentHomeLoanCommunicationAddressBinding @@ -160,7 +163,6 @@ class HomeLoanCommunicationAddressFragment : is CtaData -> { moveToNextScreen(naviClickAction) } - is NaviWidgetInfoClick -> { viewModel.selectedReferenceId = naviClickAction.widgetId ?: "" } @@ -198,25 +200,18 @@ class HomeLoanCommunicationAddressFragment : safelyShowBottomSheet(bottomSheet, HLCommonBottomSheet.TAG) bottomSheet.setCommonBottomSheetListener(this) } - } ?: run { - callScreenPatchApi(ctaData) - } + } ?: run { callScreenPatchApi(ctaData) } } private fun callScreenPatchApi(ctaData: CtaData?, emailId: String? = null) { viewModel.selectedReferenceId?.let { - val bodyMap = hashMapOf( - ADDRESS_REFERENCE_ID to it, - REFERENCE_ID to queryMap[REFERENCE_ID].orEmpty() - ) - emailId?.let { email -> - bodyMap[PERSONAL_EMAIL] = email - } - viewModel.patchKycAddressDetails( - queryMap, - bodyMap, - ctaData - ) + val bodyMap = + hashMapOf( + ADDRESS_REFERENCE_ID to it, + REFERENCE_ID to queryMap[REFERENCE_ID].orEmpty() + ) + emailId?.let { email -> bodyMap[PERSONAL_EMAIL] = email } + viewModel.patchKycAddressDetails(queryMap, bodyMap, ctaData) } } diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanComposeInfoFragment.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanComposeInfoFragment.kt index b3a0e7f9ce..e1a9bc84b8 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanComposeInfoFragment.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanComposeInfoFragment.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.hl.steps.fragment import android.content.Context @@ -53,7 +60,10 @@ import com.navi.naviwidgets.extensions.NaviImage import com.navi.naviwidgets.extensions.NaviTextWidgetized class HomeLoanComposeInfoFragment : - HomeLoanBaseFragment(), WidgetCallback, HLFooterListener, BackListener, + HomeLoanBaseFragment(), + WidgetCallback, + HLFooterListener, + BackListener, HLCommonBottomSheetListener { private lateinit var binding: FragmentHomeLoanComposeInfoBinding @@ -95,8 +105,7 @@ class HomeLoanComposeInfoFragment : } private fun initObservers() { - viewModel.hlComposeInfoScreenResponse.observeNullable(viewLifecycleOwner) { - response -> + viewModel.hlComposeInfoScreenResponse.observeNullable(viewLifecycleOwner) { response -> response?.let { binding.response = response response.header?.let { @@ -122,32 +131,25 @@ class HomeLoanComposeInfoFragment : } private fun initComposeView(content: HomeLoanComposeInfoScreenContent?) { - content.let { - binding.composeView.setContent { HomeLoanComposeInfoScreenContent(it) } - } + content.let { binding.composeView.setContent { HomeLoanComposeInfoScreenContent(it) } } } @Composable private fun HomeLoanComposeInfoScreenContent(content: HomeLoanComposeInfoScreenContent?) { Box( - modifier = Modifier - .fillMaxSize() - .background( - brush = Brush.linearGradient( - colors = listOf( - HLColor.colorFFF0EB, - HLColor.colorTransparentFFCDB4 - ), - start = Offset(0f, 0f), - end = Offset(0f, 300f), + modifier = + Modifier.fillMaxSize() + .background( + brush = + Brush.linearGradient( + colors = + listOf(HLColor.colorFFF0EB, HLColor.colorTransparentFFCDB4), + start = Offset(0f, 0f), + end = Offset(0f, 300f), + ) ) - ) ) { - Column( - modifier = Modifier - .fillMaxSize() - .padding(16.dp) - ) { + Column(modifier = Modifier.fillMaxSize().padding(16.dp)) { MessageView(content) Spacer(modifier = Modifier.height(32.dp)) InfoCard(content?.infoList) @@ -157,19 +159,13 @@ class HomeLoanComposeInfoFragment : @Composable private fun MessageView(content: HomeLoanComposeInfoScreenContent?) { - Column( - modifier = - Modifier.fillMaxWidth() - ) { + Column(modifier = Modifier.fillMaxWidth()) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, ) { Column( - modifier = Modifier - .fillMaxWidth() - .weight(1f) - .padding(end = 24.dp), + modifier = Modifier.fillMaxWidth().weight(1f).padding(end = 24.dp), ) { NaviTextWidgetized(textFieldData = content?.screenTitle) Spacer(modifier = Modifier.height(8.dp)) @@ -177,9 +173,8 @@ class HomeLoanComposeInfoFragment : } NaviImage( modifier = - Modifier - .height(content?.topIcon?.iconHeight?.dp ?: 60.dp) - .width(content?.topIcon?.iconWidth?.dp ?: 60.dp), + Modifier.height(content?.topIcon?.iconHeight?.dp ?: 60.dp) + .width(content?.topIcon?.iconWidth?.dp ?: 60.dp), imageFieldData = content?.topIcon ) } @@ -189,24 +184,21 @@ class HomeLoanComposeInfoFragment : @Composable private fun InfoCard(infoList: List?) { Box( - modifier = Modifier - .fillMaxWidth() - .shadow(elevation = 30.dp, spotColor = HLColor.greyShadow, ambientColor = HLColor.greyShadow) - .background( - color = HLColor.whiteFFFFFF, - shape = RoundedCornerShape(4.dp) - ) + modifier = + Modifier.fillMaxWidth() + .shadow( + elevation = 30.dp, + spotColor = HLColor.greyShadow, + ambientColor = HLColor.greyShadow + ) + .background(color = HLColor.whiteFFFFFF, shape = RoundedCornerShape(4.dp)) ) { - Column( - modifier = Modifier.padding(16.dp, 32.dp, 16.dp, 32.dp) - ) { + Column(modifier = Modifier.padding(16.dp, 32.dp, 16.dp, 32.dp)) { for (infoItem in infoList ?: emptyList()) { InfoItem(infoItem = infoItem) - if(infoList?.indexOf(infoItem) != infoList?.size?.minus(1)) { + if (infoList?.indexOf(infoItem) != infoList?.size?.minus(1)) { VerticalDottedLineSpacer( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 20.dp) + modifier = Modifier.fillMaxWidth().padding(horizontal = 20.dp) ) } } @@ -217,16 +209,13 @@ class HomeLoanComposeInfoFragment : @Composable private fun InfoItem(infoItem: InfoItem?) { Row( - modifier = Modifier - .fillMaxWidth() - .wrapContentHeight(), + modifier = Modifier.fillMaxWidth().wrapContentHeight(), verticalAlignment = Alignment.CenterVertically ) { NaviImage( modifier = - Modifier - .height(infoItem?.icon?.iconHeight?.dp ?: 40.dp) - .width(infoItem?.icon?.iconWidth?.dp ?: 40.dp), + Modifier.height(infoItem?.icon?.iconHeight?.dp ?: 40.dp) + .width(infoItem?.icon?.iconWidth?.dp ?: 40.dp), imageFieldData = infoItem?.icon ) Spacer(modifier = Modifier.width(8.dp)) @@ -238,10 +227,11 @@ class HomeLoanComposeInfoFragment : } @Composable - fun VerticalDottedLineSpacer(modifier: Modifier = Modifier, color: Color = HLColor.borderEBEBEB) { - Canvas(modifier = modifier - .width(1.dp) - .height(32.dp)) { + fun VerticalDottedLineSpacer( + modifier: Modifier = Modifier, + color: Color = HLColor.borderEBEBEB + ) { + Canvas(modifier = modifier.width(1.dp).height(32.dp)) { val pathEffect = PathEffect.dashPathEffect(floatArrayOf(10f, 10f), 0f) drawLine( color = color, @@ -253,9 +243,6 @@ class HomeLoanComposeInfoFragment : } } - - - private fun setHeaderAndStatusBarColor() { activity?.setStatusBarColor(R.color.color_FFEFE8) listener?.setBackgroundColor(HEADER_COLOR) @@ -305,5 +292,6 @@ class HomeLoanComposeInfoFragment : viewModel.hlComposeInfoScreenResponse.value?.header?.navigationHeader?.backCta ) } + override fun getLifeCycle(): Lifecycle = lifecycle } diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanDocumentUploadFragment.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanDocumentUploadFragment.kt index 12b59697c5..e28a69336c 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanDocumentUploadFragment.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanDocumentUploadFragment.kt @@ -7,7 +7,6 @@ package com.navi.hl.steps.fragment -import com.navi.naviwidgets.R as WidgetsR import android.content.Context import android.net.Uri import android.os.Bundle @@ -72,6 +71,7 @@ import com.navi.homeloan.common.models.HomeLoanUploadItemType import com.navi.homeloan.common.models.HomeLoanUploadedDocData import com.navi.homeloan.common.models.LoanDetailsBottomSheetData import com.navi.homeloan.databinding.FragmentHomeLoanDocumentUploadBinding +import com.navi.naviwidgets.R as WidgetsR import com.navi.naviwidgets.base.InputWidgetModel import com.navi.naviwidgets.callbacks.WidgetCallback import com.navi.naviwidgets.models.NaviBaseAdapterModel @@ -401,11 +401,7 @@ class HomeLoanDocumentUploadFragment : private fun showDocUploadErrorView() { binding.docUploadErrorView.visibility = View.VISIBLE binding.documentUploadSection.background = - ResourcesCompat.getDrawable( - resources, - WidgetsR.drawable.bg_border_red_rounded_8, - null - ) + ResourcesCompat.getDrawable(resources, WidgetsR.drawable.bg_border_red_rounded_8, null) binding.nestedScrollView.post { binding.nestedScrollView.fullScroll(View.FOCUS_UP) binding.nestedScrollView.smoothScrollTo(0, 0) @@ -588,8 +584,7 @@ class HomeLoanDocumentUploadFragment : return docAdapter?.let { it.itemCount == 1 && it.dataListLiveData.value?.get(0)?.type == HomeLoanUploadItemType.UPLOADED_DOCUMENT - } - ?: false + } ?: false } private fun getInputWidgetValues(): HashMap { diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFormScreenFragment.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFormScreenFragment.kt index 376ce3c126..4730786cd8 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFormScreenFragment.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFormScreenFragment.kt @@ -7,8 +7,6 @@ package com.navi.hl.steps.fragment -import com.navi.naviwidgets.R as WidgetsR -import com.navi.design.R as DesignR import android.Manifest import android.content.Context import android.os.Bundle @@ -54,6 +52,7 @@ import com.navi.common.utils.CommonNaviAnalytics import com.navi.common.utils.getDeviceDetails import com.navi.common.utils.getNetworkType import com.navi.common.utils.getScreenRefreshRate +import com.navi.design.R as DesignR import com.navi.hl.common.adapter.HLFormScreenAdapter import com.navi.hl.common.ui.activity.HomeLoanBaseActivity import com.navi.hl.common.ui.fragment.HomeLoanBaseFragment @@ -101,6 +100,7 @@ import com.navi.homeloan.common.models.HomeLoanGenericBottomSheetData import com.navi.homeloan.common.models.PermissionRequestData import com.navi.homeloan.databinding.FragmentHomeLoanFormScreenBinding import com.navi.homeloan.databinding.HlCustomToastBinding +import com.navi.naviwidgets.R as WidgetsR import com.navi.naviwidgets.base.BaseInputWidget import com.navi.naviwidgets.base.InputWidgetModel import com.navi.naviwidgets.base.WidgetHint @@ -179,8 +179,14 @@ class HomeLoanFormScreenFragment : viewModel, listOf( Pair(screenGetApiRetryListener, ApiErrorTagType.HL_FORM_SCREEN_GET_RESPONSE_ERROR), - Pair(screenPatchApiRetryListener, ApiErrorTagType.HL_FORM_SCREEN_PATCH_RESPONSE_ERROR), - Pair(panVerificationStatusApiRetryListener, ApiErrorTagType.HL_PAN_VERIFICATION_RESPONSE_ERROR) + Pair( + screenPatchApiRetryListener, + ApiErrorTagType.HL_FORM_SCREEN_PATCH_RESPONSE_ERROR + ), + Pair( + panVerificationStatusApiRetryListener, + ApiErrorTagType.HL_PAN_VERIFICATION_RESPONSE_ERROR + ) ), dialogOnBackPressed = { activity?.onBackPressed() } ) @@ -260,7 +266,6 @@ class HomeLoanFormScreenFragment : if (it.panVerificationResultReceived) { viewModel.fetchPanVerificationStatus(queryMap) } - } viewModel.panVerificationResponse.observeNullable(viewLifecycleOwner) { it?.let { panVerificationResponse -> @@ -298,9 +303,7 @@ class HomeLoanFormScreenFragment : } viewModel.formPatchResponse.observeNullable(viewLifecycleOwner) { response -> - response?.additionalParameters?.let { - queryMap.putAll(it) - } + response?.additionalParameters?.let { queryMap.putAll(it) } response?.toastMessage?.let { context?.let { context -> val toastView = getToastView(it, context) @@ -373,7 +376,8 @@ class HomeLoanFormScreenFragment : } } - sharedFormSearchVM.towerAdditionalData.observeNonNull(viewLifecycleOwner) { towerAdditionalData -> + sharedFormSearchVM.towerAdditionalData.observeNonNull(viewLifecycleOwner) { + towerAdditionalData -> viewModel.updateScreenWidgetsData(screenWidgets, towerAdditionalData.towerList) additionalDataForPatch = towerAdditionalData.additionalDataMap resetScreenFormAdapter() @@ -450,11 +454,22 @@ class HomeLoanFormScreenFragment : } private fun checkPermissionAndStartUserDataUpload() { - val readSmsPermissionAllowed = permissionsManager.hasPermission(Manifest.permission.READ_SMS) - val readContactsPermissionAllowed = permissionsManager.hasPermission(Manifest.permission.READ_CONTACTS) - val coarseLocationPermissionAllowed = permissionsManager.hasPermission(Manifest.permission.ACCESS_COARSE_LOCATION) - if (readSmsPermissionAllowed || readContactsPermissionAllowed || coarseLocationPermissionAllowed) { - sendUserData(readSmsPermissionAllowed, readContactsPermissionAllowed, coarseLocationPermissionAllowed) + val readSmsPermissionAllowed = + permissionsManager.hasPermission(Manifest.permission.READ_SMS) + val readContactsPermissionAllowed = + permissionsManager.hasPermission(Manifest.permission.READ_CONTACTS) + val coarseLocationPermissionAllowed = + permissionsManager.hasPermission(Manifest.permission.ACCESS_COARSE_LOCATION) + if ( + readSmsPermissionAllowed || + readContactsPermissionAllowed || + coarseLocationPermissionAllowed + ) { + sendUserData( + readSmsPermissionAllowed, + readContactsPermissionAllowed, + coarseLocationPermissionAllowed + ) context?.let { context -> sendDeviceData(getScreenRefreshRate(context, this.activity?.windowManager)) } @@ -578,7 +593,8 @@ class HomeLoanFormScreenFragment : coOwner = widget.widgetData?.checkboxData?.savedValue?.toBoolean().orFalse() } if (widget.widgetId == FINANCIAL_CO_APPLICANT_CHECKBOX) { - financialCoApplicant = widget.widgetData?.checkboxData?.savedValue?.toBoolean().orFalse() + financialCoApplicant = + widget.widgetData?.checkboxData?.savedValue?.toBoolean().orFalse() } } if (widget is RadioGroupWithFooterCardWidget) { @@ -594,18 +610,19 @@ class HomeLoanFormScreenFragment : return queryMap[ACTION] == CO_APPLICANT_EMPLOYMENT_DETAILS } - private fun processDependantWidgets(dependantWidgetList: List, isPurchaseType: Boolean = false) { + private fun processDependantWidgets( + dependantWidgetList: List, + isPurchaseType: Boolean = false + ) { val widgetListInAdapter: List? = formAdapter?.getDataSet() as? List val widgetsToBeAddedHashmap: HashMap = hashMapOf() - var widgetPos = 0 + var widgetPos = 0 if (isPurchaseType) { - viewModel.formGetResponse.value - ?.content - ?.widgets?.forEachIndexed { index, widget -> - if (widget.widgetId == PURCHASE_TYPE) { - widgetPos = index - } + viewModel.formGetResponse.value?.content?.widgets?.forEachIndexed { index, widget -> + if (widget.widgetId == PURCHASE_TYPE) { + widgetPos = index } + } } dependantWidgetList.forEach { widgetAction -> val dependantWidget = @@ -709,8 +726,8 @@ class HomeLoanFormScreenFragment : ?.interval .orElse(ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS.toInt()) .toLong(), - numberOfRetry = requestConfig?.numOfRetries - ?: ApiPollScheduler.API_POLL_RETRY_COUNT, + numberOfRetry = + requestConfig?.numOfRetries ?: ApiPollScheduler.API_POLL_RETRY_COUNT, doOnTimeout = onPollingEnd ) { viewModel.fetchAsyncRequestData(requestId) @@ -794,16 +811,16 @@ class HomeLoanFormScreenFragment : } private fun isTopUpSelectPropertyScreen() = - queryMap[ACTION].orEmpty() == Constants.TOP_UP_PROPERTY_DETAILS + queryMap[ACTION].orEmpty() == Constants.TOP_UP_PROPERTY_DETAILS private fun isTopUpSelectLoanPurposeScreen() = queryMap[ACTION].orEmpty() == Constants.TOP_UP_SELECT_LOAN_PURPOSE private fun isAddCoApplicantScreen() = - (queryMap[ACTION].orEmpty() == Constants.CO_APPLICANT_SEND_OTP) || (queryMap[ACTION].orEmpty() == Constants.ACTION_CO_APPLICANT_BASIC_DETAILS) + (queryMap[ACTION].orEmpty() == Constants.CO_APPLICANT_SEND_OTP) || + (queryMap[ACTION].orEmpty() == Constants.ACTION_CO_APPLICANT_BASIC_DETAILS) - private fun isPropertyCityScreen() = - queryMap[ACTION].orEmpty() == HlAction.PROPERTY_CITY.name + private fun isPropertyCityScreen() = queryMap[ACTION].orEmpty() == HlAction.PROPERTY_CITY.name private fun isPropertyDetailScreen() = queryMap[ACTION].orEmpty() == HlAction.PROPERTY_DETAILS.name @@ -851,15 +868,16 @@ class HomeLoanFormScreenFragment : } } } - if (widgetIndex != -1) Handler(Looper.getMainLooper()).post { formAdapter?.notifyItemChanged(widgetIndex) } + if (widgetIndex != -1) + Handler(Looper.getMainLooper()).post { formAdapter?.notifyItemChanged(widgetIndex) } } companion object { const val TAG = "HOME_LOAN_FORM_SCREEN" const val CO_OWNER = "coOwner" const val FINANCIAL_CO_APPLICANT = "financialCoApplicant" - const val CO_OWNER_CHECKBOX= "CoOwnerCheckbox" - const val FINANCIAL_CO_APPLICANT_CHECKBOX= "FinancialCoApplicantCheckbox" + const val CO_OWNER_CHECKBOX = "CoOwnerCheckbox" + const val FINANCIAL_CO_APPLICANT_CHECKBOX = "FinancialCoApplicantCheckbox" const val APPLICANT_RELATION = "applicantRelation" const val CO_APPLICANT_RELATION = "relation" const val PURCHASE_TYPE = "purchaseType" @@ -869,7 +887,8 @@ class HomeLoanFormScreenFragment : const val FROM_BUILDER = "From builder" const val NEW_OPTION_LIST_BOTTOM_SHEET_CLICKED = "NEW_OPTION_LIST_BOTTOM_SHEET_CLICKED" const val PROPERTY_ID = "propertyId" - const val NO_RESULT_NOTE = "Please enter the name of the property for which you intend to apply for a Home Loan" + const val NO_RESULT_NOTE = + "Please enter the name of the property for which you intend to apply for a Home Loan" const val ADD_PROPERTY = "+ Add Property" const val TOP_UP_AMOUNT = "topUpAmount" const val LOAN_PURPOSE = "loanPurpose" @@ -908,13 +927,23 @@ class HomeLoanFormScreenFragment : viewModel.formGetResponse.value?.content?.widgets?.forEach { val widget = it if (widget is RadioGroupWithFooterCardWidget) { - widget.widgetData()?.radioItems?.forEach { radioItem -> + widget.widgetData()?.radioItems?.forEach { radioItem -> if (radioItem.widgetId == viewModel.selectedWidgetId) { - sharedFormSearchVM.setAdditionalParameters(radioItem.radioButtonWithDashedLineWidgetData?.additionalParameters.orEmpty()) - ctaData?.analyticsEventProperties?.properties?.put( - PROPERTY_NAME, - radioItem.radioButtonWithDashedLineWidgetData?.title?.text.orEmpty() + sharedFormSearchVM.setAdditionalParameters( + radioItem.radioButtonWithDashedLineWidgetData + ?.additionalParameters + .orEmpty() ) + ctaData + ?.analyticsEventProperties + ?.properties + ?.put( + PROPERTY_NAME, + radioItem.radioButtonWithDashedLineWidgetData + ?.title + ?.text + .orEmpty() + ) } } } @@ -925,11 +954,16 @@ class HomeLoanFormScreenFragment : viewModel.formGetResponse.value?.content?.widgets?.forEach { val widget = it if (widget is RadioGroupWithFooterCardWidget) { - widget.widgetData()?.radioItems?.forEach { radioItem -> + widget.widgetData()?.radioItems?.forEach { radioItem -> if (radioItem.widgetId == viewModel.selectedWidgetId) { - queryMap[LOAN_PURPOSE] = radioItem.radioButtonWithDashedLineWidgetData?.title?.text.orEmpty() + queryMap[LOAN_PURPOSE] = + radioItem.radioButtonWithDashedLineWidgetData?.title?.text.orEmpty() queryMap.putAll(sharedFormSearchVM.additionalParameters.value.orEmpty()) - queryMap.putAll(radioItem.radioButtonWithDashedLineWidgetData?.additionalParameters.orEmpty()) + queryMap.putAll( + radioItem.radioButtonWithDashedLineWidgetData + ?.additionalParameters + .orEmpty() + ) } } } @@ -1087,7 +1121,11 @@ class HomeLoanFormScreenFragment : if (it.widgetId == CO_APPLICANT_RELATION) { val widget = it if (widget is LabeledOptionSelectorListWidgetModel) { - val items = viewModel.formGetResponse.value?.content?.relationshipMap?.get(naviClickAction.selectedOption) + val items = + viewModel.formGetResponse.value + ?.content + ?.relationshipMap + ?.get(naviClickAction.selectedOption) widget.widgetData?.listSelectorData?.items = items relationWidget?.setError(null) } @@ -1096,7 +1134,10 @@ class HomeLoanFormScreenFragment : formAdapter?.notifyDataSetChanged() } - if (naviClickAction.widgetId == PURCHASE_TYPE && naviClickAction.type == NEW_OPTION_LIST_BOTTOM_SHEET_CLICKED) { + if ( + naviClickAction.widgetId == PURCHASE_TYPE && + naviClickAction.type == NEW_OPTION_LIST_BOTTOM_SHEET_CLICKED + ) { val selectedPurchaseType = naviClickAction.selectedOption var isTowerVisible = false viewModel.formGetResponse.value?.content?.widgets?.forEach { @@ -1106,7 +1147,10 @@ class HomeLoanFormScreenFragment : widget.widgetData?.tileSelectorData?.items?.forEach { item -> if (item.id == FLAT) { item.dependantWidgetIdList?.forEach { listItem -> - if (listItem.widgetId == PROPERTY_ID && listItem.action == SHOW) { + if ( + listItem.widgetId == PROPERTY_ID && + listItem.action == SHOW + ) { isTowerVisible = true } } @@ -1118,10 +1162,18 @@ class HomeLoanFormScreenFragment : viewModel.formGetResponse.value?.content?.widgets?.forEach { if (it.widgetId == PROPERTY_NAME) { val widget = it - if (selectedPurchaseType == RESALE && widget is LabeledTextInputSearchWidgetModel) { - widget.widgetData?.inputTextSearchItemData?.noResultNote = NO_RESULT_NOTE - widget.widgetData?.inputTextSearchItemData?.addInputText = ADD_PROPERTY - } else if (selectedPurchaseType == FROM_BUILDER && widget is LabeledTextInputSearchWidgetModel) { + if ( + selectedPurchaseType == RESALE && + widget is LabeledTextInputSearchWidgetModel + ) { + widget.widgetData?.inputTextSearchItemData?.noResultNote = + NO_RESULT_NOTE + widget.widgetData?.inputTextSearchItemData?.addInputText = + ADD_PROPERTY + } else if ( + selectedPurchaseType == FROM_BUILDER && + widget is LabeledTextInputSearchWidgetModel + ) { widget.widgetData?.inputTextSearchItemData?.noResultNote = null widget.widgetData?.inputTextSearchItemData?.addInputText = null if (!isTowerVisible) { @@ -1132,7 +1184,6 @@ class HomeLoanFormScreenFragment : formAdapter?.notifyDataSetChanged() } } - } analyticsEventTracker.onFormWidgetItemSelected( queryMap[ACTION], @@ -1212,7 +1263,9 @@ class HomeLoanFormScreenFragment : } if (widgetId == TOP_UP_AMOUNT) { formAdapter?.widgetIdValueMap = getInputWidgetValues() - val topUpAmount = RUPEE_SYMBOL + moneyFormat(formAdapter?.widgetIdValueMap?.get(TOP_UP_AMOUNT).orEmpty()) + val topUpAmount = + RUPEE_SYMBOL + + moneyFormat(formAdapter?.widgetIdValueMap?.get(TOP_UP_AMOUNT).orEmpty()) if (topUpAmount.isNotEmpty()) { binding.footerView.setTopUpRightText(topUpAmount) } @@ -1246,9 +1299,6 @@ class HomeLoanFormScreenFragment : as? HomeLoanBankIfscScreenFragment homeLoanBankIfscBottomSheet?.dismiss() ifscInputWidget?.updateTextInputData(ifscCode) - ifscInputWidget?.setSuccessText( - branchName, - WidgetsR.drawable.ic_green_success_small_svg - ) + ifscInputWidget?.setSuccessText(branchName, WidgetsR.drawable.ic_green_success_small_svg) } } diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFormScreenFragmentV2.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFormScreenFragmentV2.kt index ec83a1c7d4..3cb725d9ed 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFormScreenFragmentV2.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFormScreenFragmentV2.kt @@ -234,8 +234,7 @@ class HomeLoanFormScreenFragmentV2 : .multiply(BigDecimal.ONE) .toDouble() binding.valueTv.text = emiAmount.formatToIndianCurrency() - } - ?: run { binding.valueTv.text = RUPEE_SYMBOL_WITH_TWO_UNDERSCORE } + } ?: run { binding.valueTv.text = RUPEE_SYMBOL_WITH_TWO_UNDERSCORE } } else { binding.valueTv.text = RUPEE_SYMBOL_WITH_TWO_UNDERSCORE } diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFullScreenErrorFragment.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFullScreenErrorFragment.kt index fec5c1ead4..770b8ad91a 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFullScreenErrorFragment.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFullScreenErrorFragment.kt @@ -129,9 +129,9 @@ class HomeLoanFullScreenErrorFragment : NaviTextWidgetized(textFieldData = content.errorTitle) Spacer(modifier = Modifier.height(8.dp)) NaviTextWidgetized( - modifier = - Modifier.padding(horizontal = 32.dp), - textFieldData = content.errorSubTitle) + modifier = Modifier.padding(horizontal = 32.dp), + textFieldData = content.errorSubTitle + ) Spacer(modifier = Modifier.height(180.dp)) } } diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFullScreenStatusFragment.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFullScreenStatusFragment.kt index 7de5d3c8ec..456d07fbab 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFullScreenStatusFragment.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFullScreenStatusFragment.kt @@ -129,9 +129,9 @@ class HomeLoanFullScreenStatusFragment : NaviTextWidgetized(textFieldData = content.screenTitle) Spacer(modifier = Modifier.height(8.dp)) NaviTextWidgetized( - modifier = - Modifier.padding(horizontal = 32.dp), - textFieldData = content.screenSubTitle) + modifier = Modifier.padding(horizontal = 32.dp), + textFieldData = content.screenSubTitle + ) Spacer(modifier = Modifier.height(180.dp)) } } @@ -162,7 +162,9 @@ class HomeLoanFullScreenStatusFragment : } override fun onBackPressed() { - moveToNextScreen(viewModel.fullScreenStatusResponse.value?.header?.navigationHeader?.backCta) + moveToNextScreen( + viewModel.fullScreenStatusResponse.value?.header?.navigationHeader?.backCta + ) } override fun getLifeCycle(): Lifecycle = lifecycle diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanIncomeVerificationFragment.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanIncomeVerificationFragment.kt index 9b3a3a1dd9..c52ec0c474 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanIncomeVerificationFragment.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanIncomeVerificationFragment.kt @@ -102,6 +102,7 @@ import com.navi.hl.utils.NaviHLAnalytics import com.navi.hl.utils.observeNonNull import com.navi.hl.utils.observeNullable import com.navi.hl.utils.setStatusBarColor +import com.navi.homeloan.R as hlR import com.navi.homeloan.R import com.navi.homeloan.common.Constants.LOAN_OFFER_SCREEN_URL import com.navi.homeloan.common.customview.HLCommonBottomSheet @@ -123,20 +124,24 @@ import com.navi.naviwidgets.extensions.NaviTextWidgetized import com.navi.naviwidgets.viewholder.ViewHolderFactoryImpl import com.navi.naviwidgets.widgets.labeledinputsearch.ui.FilterAction import com.naviapp.common.navigator.NaviHLDeeplinkNavigator +import java.util.concurrent.ConcurrentHashMap import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import java.util.concurrent.ConcurrentHashMap -import com.navi.homeloan.R as hlR class HomeLoanIncomeVerificationFragment : - HomeLoanBaseFragment(), WidgetCallback, BackListener, HLCommonBottomSheetListener, + HomeLoanBaseFragment(), + WidgetCallback, + BackListener, + HLCommonBottomSheetListener, HLFooterListener { private lateinit var binding: FragmentHomeLoanIncomeVerificationBinding private val analyticsEventTracker = NaviHLAnalytics.naviHLAnalytics.HomeLoanIncomeVerificationScreen() private val viewModel by viewModels() - private val sharedLoaderVM by lazy { ViewModelProvider(this)[HomeLoanLoaderSharedVM::class.java] } + private val sharedLoaderVM by lazy { + ViewModelProvider(this)[HomeLoanLoaderSharedVM::class.java] + } private var listener: HLTopNavigationHeaderInterface? = null private val contentAdapter = NaviAdapter(widgetCallback = this, factory = ViewHolderFactoryImpl()) @@ -220,7 +225,8 @@ class HomeLoanIncomeVerificationFragment : private fun makeQueryMapForLoaderApi(): HashMap { val loaderQueryMap = HashMap() loaderQueryMap[ACTION] = GENERATE_SL - loaderQueryMap[com.navi.hl.utils.Constants.REFERENCE_ID] = queryMap[com.navi.hl.utils.Constants.REFERENCE_ID].orEmpty() + loaderQueryMap[com.navi.hl.utils.Constants.REFERENCE_ID] = + queryMap[com.navi.hl.utils.Constants.REFERENCE_ID].orEmpty() loaderQueryMap[LOAN_APPLICATION_ID] = queryMap[LOAN_APPLICATION_ID].orEmpty() loaderQueryMap[Constants.FIRST_IDENTIFIER] = com.navi.hl.utils.Constants.HOME_LOAN_LOADER loaderQueryMap[LOAN_ACTION_TYPE] = com.navi.hl.utils.Constants.HL_NEW @@ -236,7 +242,9 @@ class HomeLoanIncomeVerificationFragment : binding.composeView.isVisible = true binding.footerView.isVisible = true } else { - analyticsEventTracker.onBSInfoScreenLanded((System.currentTimeMillis() - bsInfoScreenStartTime) / 1000) + analyticsEventTracker.onBSInfoScreenLanded( + (System.currentTimeMillis() - bsInfoScreenStartTime) / 1000 + ) activity?.setStatusBarColor(R.color.white) listener?.showTrackerHeader() binding.searchContentRv.isVisible = true @@ -254,7 +262,9 @@ class HomeLoanIncomeVerificationFragment : it.footer?.let { footer -> binding.footerView.setData(footer) binding.footerView.elevation = FOOTER_ELEVATION - binding.footerView.setBackgroundResource(com.navi.amc.R.drawable.bg_white_8_top_rounded) + binding.footerView.setBackgroundResource( + com.navi.amc.R.drawable.bg_white_8_top_rounded + ) } } } @@ -262,51 +272,43 @@ class HomeLoanIncomeVerificationFragment : @Composable private fun LoadBankStatementInfoScreen(infoData: StatementUploadInstructionsData) { - Column( - modifier = Modifier - .fillMaxWidth() - .background(color = HLColor.whiteFFFFFF) - ) { + Column(modifier = Modifier.fillMaxWidth().background(color = HLColor.whiteFFFFFF)) { Column( - modifier = Modifier - .fillMaxWidth() - .height(68.dp) - .background(color = HLColor.colorFFEFE8), + modifier = + Modifier.fillMaxWidth().height(68.dp).background(color = HLColor.colorFFEFE8), ) { Spacer(modifier = Modifier.height(12.dp)) Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier - .fillMaxWidth() - .height(56.dp) - .background(color = HLColor.colorFFF0EB), + modifier = + Modifier.fillMaxWidth() + .height(56.dp) + .background(color = HLColor.colorFFF0EB), ) { Spacer(modifier = Modifier.width(16.dp)) Image( painter = painterResource(id = hlR.drawable.ic_hl_arrow_left_blue_svg), - modifier = Modifier - .size(24.dp) - .clickable { setComposeViewVisibility(false) }, + modifier = + Modifier.size(24.dp).clickable { setComposeViewVisibility(false) }, contentDescription = "back", ) } } Row( - modifier = Modifier - .fillMaxWidth() - .wrapContentHeight() - .background( - brush = Brush.linearGradient( - colors = listOf( - HLColor.colorFFF0EB, - HLColor.colorTransparentFFCDB4 - ), - start = Offset(0f, 0f), - end = Offset(0f, Float.POSITIVE_INFINITY), - tileMode = TileMode.Mirror + modifier = + Modifier.fillMaxWidth() + .wrapContentHeight() + .background( + brush = + Brush.linearGradient( + colors = + listOf(HLColor.colorFFF0EB, HLColor.colorTransparentFFCDB4), + start = Offset(0f, 0f), + end = Offset(0f, Float.POSITIVE_INFINITY), + tileMode = TileMode.Mirror + ) ) - ) ) { Spacer(modifier = Modifier.width(16.dp)) Column { @@ -331,21 +333,21 @@ class HomeLoanIncomeVerificationFragment : Column(modifier = Modifier.padding(start = 16.dp, end = 16.dp)) { Column( modifier = - Modifier - .fillMaxWidth() - .border( - width = 1.dp, - color = HLColor.borderEBEBEB, - shape = RoundedCornerShape(4.dp) - ) + Modifier.fillMaxWidth() + .border( + width = 1.dp, + color = HLColor.borderEBEBEB, + shape = RoundedCornerShape(4.dp) + ) ) { Column(modifier = Modifier.padding(16.dp)) { Row(verticalAlignment = Alignment.CenterVertically) { NaviImage( modifier = - Modifier - .height(infoData.doInfoData?.icon?.iconHeight?.dp ?: 20.dp) - .width(infoData.doInfoData?.icon?.iconWidth?.dp ?: 20.dp), + Modifier.height( + infoData.doInfoData?.icon?.iconHeight?.dp ?: 20.dp + ) + .width(infoData.doInfoData?.icon?.iconWidth?.dp ?: 20.dp), imageFieldData = infoData.doInfoData?.icon ) Spacer(modifier = Modifier.width(8.dp)) @@ -359,21 +361,21 @@ class HomeLoanIncomeVerificationFragment : Spacer(modifier = Modifier.height(16.dp)) Column( modifier = - Modifier - .fillMaxWidth() - .border( - width = 1.dp, - color = HLColor.borderEBEBEB, - shape = RoundedCornerShape(4.dp) - ) + Modifier.fillMaxWidth() + .border( + width = 1.dp, + color = HLColor.borderEBEBEB, + shape = RoundedCornerShape(4.dp) + ) ) { Column(modifier = Modifier.padding(16.dp)) { Row(verticalAlignment = Alignment.CenterVertically) { NaviImage( modifier = - Modifier - .height(infoData.doInfoData?.icon?.iconHeight?.dp ?: 20.dp) - .width(infoData.doInfoData?.icon?.iconWidth?.dp ?: 20.dp), + Modifier.height( + infoData.doInfoData?.icon?.iconHeight?.dp ?: 20.dp + ) + .width(infoData.doInfoData?.icon?.iconWidth?.dp ?: 20.dp), imageFieldData = infoData.doNotInfoData?.icon ) Spacer(modifier = Modifier.width(8.dp)) @@ -395,9 +397,7 @@ class HomeLoanIncomeVerificationFragment : Spacer(modifier = Modifier.width(2.dp)) Image( painter = painterResource(id = com.navi.design.R.drawable.ic_dark_grey_dot), - modifier = Modifier - .size(12.dp) - .padding(top = 6.dp), + modifier = Modifier.size(12.dp).padding(top = 6.dp), contentDescription = "", ) Spacer(modifier = Modifier.width(8.dp)) @@ -475,15 +475,9 @@ class HomeLoanIncomeVerificationFragment : viewLifecycleOwner.lifecycleScope.launchWhenCreated { launch { viewModel.accountAggregatorResponseState.collect { setViewState(it) } } } - sharedLoaderVM.loaderDetails.observeNullable(this) { - it?.let { - getLoaderPollingData() - } - } + sharedLoaderVM.loaderDetails.observeNullable(this) { it?.let { getLoaderPollingData() } } sharedLoaderVM.loaderPollingDetails.observeNullable(this) { - it?.let { data -> - apiPollInit(data, data.requestType.orEmpty(), LOADER_POLLING) - } + it?.let { data -> apiPollInit(data, data.requestType.orEmpty(), LOADER_POLLING) } } sharedLoaderVM.apiPollStatus.observeNullable(this) { it?.let { handlePollingResponse(it.first, it.second) } @@ -492,9 +486,12 @@ class HomeLoanIncomeVerificationFragment : apiPollScheduler?.stopApiPoll() errorResponse?.actions?.getOrNull(0)?.let { DeepLinkManager.getDeepLinkListener() - ?.navigateTo(activity = activity, ctaData = CtaData(url = it.url, parameters = it.parameters), finish = true) - } - ?: run { handlePollingTimeout() } + ?.navigateTo( + activity = activity, + ctaData = CtaData(url = it.url, parameters = it.parameters), + finish = true + ) + } ?: run { handlePollingTimeout() } } } @@ -512,10 +509,11 @@ class HomeLoanIncomeVerificationFragment : hideLottieLoader() val failureCta = sharedLoaderVM.loaderDetails.value?.failureCta showFullScreenError( - errorData = GenericErrorResponse( - title = getString(CommonR.string.could_not_fetch_bank_details), - message = getString(CommonR.string.bank_detail_fetch_failed_try_again) - ), + errorData = + GenericErrorResponse( + title = getString(CommonR.string.could_not_fetch_bank_details), + message = getString(CommonR.string.bank_detail_fetch_failed_try_again) + ), screenName = screenName, dialogDismissClicked = { redirectUsingFailureCta(failureCta) }, dialogOnBackPressed = { redirectUsingFailureCta(failureCta) }, @@ -526,15 +524,8 @@ class HomeLoanIncomeVerificationFragment : private fun redirectUsingFailureCta(failureRedirectionCta: CtaData?) { failureRedirectionCta?.let { DeepLinkManager.getDeepLinkListener() - ?.navigateTo( - activity = activity, - ctaData = it, - finish = true - ) - } - ?: kotlin.run { - launchHome() - } + ?.navigateTo(activity = activity, ctaData = it, finish = true) + } ?: kotlin.run { launchHome() } } private fun releasePollingListeners() { @@ -566,9 +557,7 @@ class HomeLoanIncomeVerificationFragment : CO_APPLICANT_FINANCIAL_DATA_STATUS } val tempQueryMap = HashMap() - queryMap.forEach { (key, value) -> - tempQueryMap[key] = value - } + queryMap.forEach { (key, value) -> tempQueryMap[key] = value } viewModel.fetchRequestId( action, tempQueryMap.apply { remove(ACTION) }, @@ -616,16 +605,13 @@ class HomeLoanIncomeVerificationFragment : is FilterAction -> { contentAdapter.setData(viewModel.filterBankData(naviClickAction.text)) } - is BankSelectionWidgetClickAction -> { viewModel.setSelectedBank(naviClickAction.bankName) analyticsEventTracker.onBankSelected(naviClickAction.bankName) } - is ValueWidgetClickAction -> { viewModel.setSelectedBank(naviClickAction.value) } - is NaviWidgetClickWithActionData -> { analyticsEventTracker.onIncomeVerificationChangeBankClicked() binding.searchWidget.clearData() @@ -652,21 +638,27 @@ class HomeLoanIncomeVerificationFragment : } } - private fun apiPollInit(uploadDataAsyncResponse: UploadDataAsyncResponse?, type: String? = null, pollingType: String) { + private fun apiPollInit( + uploadDataAsyncResponse: UploadDataAsyncResponse?, + type: String? = null, + pollingType: String + ) { apiPollScheduler = ApiPollScheduler( initialDelay = - uploadDataAsyncResponse?.requestConfig - ?.initialDelay - ?.toLong() - .orElse(ApiPollScheduler.INITIAL_DELAY_FOR_API_POLL_SECONDS), + uploadDataAsyncResponse + ?.requestConfig + ?.initialDelay + ?.toLong() + .orElse(ApiPollScheduler.INITIAL_DELAY_FOR_API_POLL_SECONDS), pollInterval = - uploadDataAsyncResponse?.requestConfig - ?.interval - .orElse(ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS.toInt()) - .toLong(), + uploadDataAsyncResponse + ?.requestConfig + ?.interval + .orElse(ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS.toInt()) + .toLong(), numberOfRetry = - uploadDataAsyncResponse?.requestConfig?.numOfRetries.orElse(NUMBER_OF_RETRY), + uploadDataAsyncResponse?.requestConfig?.numOfRetries.orElse(NUMBER_OF_RETRY), doOnTimeout = { activity?.runOnUiThread { handlePollingTimeout() @@ -674,9 +666,12 @@ class HomeLoanIncomeVerificationFragment : } } ) { - if(pollingType == LOADER_POLLING) { + if (pollingType == LOADER_POLLING) { type?.let { - sharedLoaderVM.checkApiPollStatus(uploadDataAsyncResponse?.requestId.orEmpty(), type) + sharedLoaderVM.checkApiPollStatus( + uploadDataAsyncResponse?.requestId.orEmpty(), + type + ) } } else { viewModel.checkApiPollStatus(uploadDataAsyncResponse?.requestId.orEmpty()) @@ -764,7 +759,6 @@ class HomeLoanIncomeVerificationFragment : } } } - else -> {} } } @@ -821,10 +815,7 @@ class HomeLoanIncomeVerificationFragment : } private fun statusHandling(status: String) { - if ( - TextUtils.equals(status, SUCCESS) || - TextUtils.equals(status, FAILURE) - ) { + if (TextUtils.equals(status, SUCCESS) || TextUtils.equals(status, FAILURE)) { apiPollScheduler?.stopApiPoll() sharedLoaderVM.deInit() } @@ -838,8 +829,14 @@ class HomeLoanIncomeVerificationFragment : private fun navigateToOfferAnimation() { val bundle = Bundle() bundle.apply { - putString(com.navi.hl.utils.Constants.OFFER_AMOUNT_TEXT, sharedLoaderVM.loaderAsyncDetails.value?.loanAmountOffered) - putParcelable(com.navi.hl.utils.Constants.OFFER_SUCCESS_CTA, sharedLoaderVM.loaderDetails.value?.successCta) + putString( + com.navi.hl.utils.Constants.OFFER_AMOUNT_TEXT, + sharedLoaderVM.loaderAsyncDetails.value?.loanAmountOffered + ) + putParcelable( + com.navi.hl.utils.Constants.OFFER_SUCCESS_CTA, + sharedLoaderVM.loaderDetails.value?.successCta + ) } NaviHLDeeplinkNavigator.navigate( activity = activity, @@ -931,5 +928,6 @@ class HomeLoanIncomeVerificationFragment : return HomeLoanIncomeVerificationFragment().apply { arguments = bundle } } } + override fun getLifeCycle(): Lifecycle = lifecycle } diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanInsufficientBankDetailsFragment.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanInsufficientBankDetailsFragment.kt index 70dc2c63cf..5825edf222 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanInsufficientBankDetailsFragment.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanInsufficientBankDetailsFragment.kt @@ -82,7 +82,10 @@ import com.navi.naviwidgets.models.response.TextFieldData import com.navi.naviwidgets.utils.NaviWidgetIconUtils.ICON_HL_ROUNDED_PLACE_HOLDER_BANK class HomeLoanInsufficientBankDetailsFragment : - HomeLoanBaseFragment(), WidgetCallback, HLFooterListener, BackListener, + HomeLoanBaseFragment(), + WidgetCallback, + HLFooterListener, + BackListener, HLCommonBottomSheetListener { private lateinit var binding: FragmentHomeLoanInsufficientBankDetailsBinding @@ -197,9 +200,7 @@ class HomeLoanInsufficientBankDetailsFragment : verticalAlignment = Alignment.CenterVertically ) { Column( - modifier = Modifier.fillMaxHeight() - .weight(1f) - .padding(end = 24.dp), + modifier = Modifier.fillMaxHeight().weight(1f).padding(end = 24.dp), verticalArrangement = Arrangement.Center ) { NaviTextWidgetized(textFieldData = content.screenTitle) @@ -326,7 +327,10 @@ class HomeLoanInsufficientBankDetailsFragment : private fun showErrorBottomSheet(bottomSheetData: HomeLoanGenericBottomSheetData) { val bottomSheet = HLCommonBottomSheet.getInstance(bottomSheetData) - if (!bottomSheetData.infoList.isNullOrEmpty() && bottomSheetData.footer?.rectangularInfoCardData != null) { + if ( + !bottomSheetData.infoList.isNullOrEmpty() && + bottomSheetData.footer?.rectangularInfoCardData != null + ) { bottomSheet.setBottomSheetType(FRAUD_CHECK_BOTTOM_SHEET) } safelyShowBottomSheet(bottomSheet, HLCommonBottomSheet.TAG) diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanLoaderFragment.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanLoaderFragment.kt index eb940c59dd..fd180478ea 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanLoaderFragment.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanLoaderFragment.kt @@ -148,19 +148,18 @@ class HomeLoanLoaderFragment : @Composable fun TimeoutScreen() { - Column( - modifier = Modifier.fillMaxSize() - ) {} + Column(modifier = Modifier.fillMaxSize()) {} } private fun handlePollingTimeout() { binding.composeView.setContent { TimeoutScreen() } releasePollingListeners() showFullScreenError( - errorData = GenericErrorResponse( - title = getString(R.string.could_not_fetch_bank_details), - message = getString(R.string.bank_detail_fetch_failed_try_again) - ), + errorData = + GenericErrorResponse( + title = getString(R.string.could_not_fetch_bank_details), + message = getString(R.string.bank_detail_fetch_failed_try_again) + ), screenName = screenName, dialogDismissClicked = { launchHome() }, dialogOnBackPressed = { launchHome() }, diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanSearchFragment.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanSearchFragment.kt index 738cbc0998..bb1315c90d 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanSearchFragment.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanSearchFragment.kt @@ -166,14 +166,12 @@ class HomeLoanSearchFragment : HomeLoanBaseFragment(), WidgetCallback, BackListe ?.widgetData ?.inputTextSearchItemData ?.searchApiDetails - ?.minCharactersRequiredToSearch - ?: 0 + ?.minCharactersRequiredToSearch ?: 0 val savedText = sharedFormSearchVM.inputSearchWidgetModel ?.widgetData ?.inputTextSearchItemData - ?.savedText - ?: "" + ?.savedText ?: "" if (minThreshold > 0 && savedText.isEmpty()) { isFirstApiCallDone = true showAllRequiredViews() @@ -341,7 +339,8 @@ class HomeLoanSearchFragment : HomeLoanBaseFragment(), WidgetCallback, BackListe val bottomSheet = NewOptionListBottomSheet.getInstance( itemList = itemList, - title = sharedFormSearchVM.additionalTextForSearchScreen + title = + sharedFormSearchVM.additionalTextForSearchScreen ?: getString(com.navi.homeloan.R.string.hl_select_tower) ) bottomSheet.onItemSelectAction = { selectedItem -> diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanSelfieVerificationFragment.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanSelfieVerificationFragment.kt index 3777a1c189..29aada1771 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanSelfieVerificationFragment.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanSelfieVerificationFragment.kt @@ -274,7 +274,7 @@ class HomeLoanSelfieVerificationFragment : HomeLoanBaseFragment(), HLFooterListe private fun handleFirebaseResult(status: String, isPolling: Boolean = true) { if ( TextUtils.equals(status, FirebaseStatusType.SUCCESS) || - TextUtils.equals(status, FirebaseStatusType.FAILURE) + TextUtils.equals(status, FirebaseStatusType.FAILURE) ) { deInitializeFirebaseListener() apiPollScheduler?.stopApiPoll() @@ -457,7 +457,6 @@ class HomeLoanSelfieVerificationFragment : HomeLoanBaseFragment(), HLFooterListe checkHypervergeInitStatus(selfieSetting) } } - PROVIDER_MOCK -> { if (buildConfigDetails.flavor == PROD) return val dummyData = @@ -515,8 +514,7 @@ class HomeLoanSelfieVerificationFragment : HomeLoanBaseFragment(), HLFooterListe showLoader() it.referenceId = queryMap[Constants.REFERENCE_ID] viewModel.postHomeLoanSelfieRequest(queryMap, it) - } - ?: run { context?.toast(homeLoanR.string.hl_please_retake_selfie, Toast.LENGTH_LONG) } + } ?: run { context?.toast(homeLoanR.string.hl_please_retake_selfie, Toast.LENGTH_LONG) } } private fun handleSelfieImage( @@ -534,7 +532,6 @@ class HomeLoanSelfieVerificationFragment : HomeLoanBaseFragment(), HLFooterListe bitmapImage = BitmapFactory.decodeFile(imgFile.absolutePath, bmOptions) } } - else -> { val inputStream: FileInputStream? = activity?.openFileInput(url) bitmapImage = BitmapFactory.decodeStream(inputStream) diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanTopUpIntroScreenFragment.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanTopUpIntroScreenFragment.kt index e9535f4dcd..12728f99ad 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanTopUpIntroScreenFragment.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanTopUpIntroScreenFragment.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.hl.steps.fragment import AnimatedArc @@ -76,6 +83,7 @@ import com.navi.homeloan.common.models.HomeLoanGenericBottomSheetData import com.navi.homeloan.common.models.HomeLoanTopUpIntroScreenContent import com.navi.homeloan.common.models.HomeLoanTopUpIntroScreenResponse import com.navi.homeloan.databinding.FragmentHomeLoanTopUpIntroScreenBinding +import com.navi.naviwidgets.R as WidgetR import com.navi.naviwidgets.callbacks.WidgetCallback import com.navi.naviwidgets.extensions.NaviImage import com.navi.naviwidgets.extensions.NaviTextWidgetized @@ -83,10 +91,12 @@ import com.navi.naviwidgets.models.response.TextFieldData import com.naviapp.analytics.utils.NaviAnalytics import getAmountList import kotlinx.coroutines.delay -import com.navi.naviwidgets.R as WidgetR class HomeLoanTopUpIntroScreenFragment : - HomeLoanBaseFragment(), WidgetCallback, HLFooterListener, BackListener, + HomeLoanBaseFragment(), + WidgetCallback, + HLFooterListener, + BackListener, HLCommonBottomSheetListener { private lateinit var binding: FragmentHomeLoanTopUpIntroScreenBinding @@ -128,8 +138,7 @@ class HomeLoanTopUpIntroScreenFragment : } private fun initObservers() { - viewModel.topUpIntroScreenResponse.observeNullable(viewLifecycleOwner) { - response -> + viewModel.topUpIntroScreenResponse.observeNullable(viewLifecycleOwner) { response -> response?.let { binding.response = response response.header?.let { @@ -153,9 +162,7 @@ class HomeLoanTopUpIntroScreenFragment : } private fun initComposeView(content: HomeLoanTopUpIntroScreenResponse) { - content.let { - binding.composeView.setContent { HomeLoanTopUpIntroScreenContent(it) } - } + content.let { binding.composeView.setContent { HomeLoanTopUpIntroScreenContent(it) } } } @Composable @@ -163,25 +170,21 @@ class HomeLoanTopUpIntroScreenFragment : val density = LocalDensity.current val screenHeight = with(density) { 300.dp.toPx() } Box( - modifier = Modifier - .fillMaxSize() - .background( - brush = Brush.linearGradient( - colors = listOf( - HLColor.colorFFF0EB, - HLColor.colorTransparentFFCDB4 - ), - start = Offset(0f, 0f), - end = Offset(0f, 1000f), + modifier = + Modifier.fillMaxSize() + .background( + brush = + Brush.linearGradient( + colors = + listOf(HLColor.colorFFF0EB, HLColor.colorTransparentFFCDB4), + start = Offset(0f, 0f), + end = Offset(0f, 1000f), + ) ) - ) ) { val scrollState = rememberScrollState() Column( - modifier = Modifier - .fillMaxWidth() - .verticalScroll(scrollState) - .wrapContentHeight() + modifier = Modifier.fillMaxWidth().verticalScroll(scrollState).wrapContentHeight() ) { val initialTopSpacing = remember { Animatable(32F) } LaunchedEffect(key1 = true) { @@ -191,12 +194,7 @@ class HomeLoanTopUpIntroScreenFragment : animationSpec = tween(durationMillis = 1000) ) } - Column ( - modifier = Modifier - .fillMaxWidth() - .wrapContentHeight() - .padding(16.dp) - ) { + Column(modifier = Modifier.fillMaxWidth().wrapContentHeight().padding(16.dp)) { Spacer(modifier = Modifier.height(initialTopSpacing.value.dp)) Spacer(modifier = Modifier.height(initialTopSpacing.value.dp)) Spacer(modifier = Modifier.height(8.dp)) @@ -212,8 +210,14 @@ class HomeLoanTopUpIntroScreenFragment : ) Spacer(modifier = Modifier.height(30.dp)) LoanAmountProgressBar( - getAmountWithoutSymbolAndComma(response.content?.outstandingAmount?.subTitle?.text).toFloat(), - getAmountWithoutSymbolAndComma(response.content?.topUpAmount?.subTitle?.text).toFloat() + getAmountWithoutSymbolAndComma( + response.content?.outstandingAmount?.subTitle?.text + ) + .toFloat(), + getAmountWithoutSymbolAndComma( + response.content?.topUpAmount?.subTitle?.text + ) + .toFloat() ) LoanAmountProgressBarContent(response.content) } @@ -223,16 +227,16 @@ class HomeLoanTopUpIntroScreenFragment : delay(3000) infoBsOffsetY.animateTo( targetValue = -600F, - animationSpec = spring( - dampingRatio = Spring.DampingRatioLowBouncy, - stiffness = Spring.StiffnessVeryLow - ) + animationSpec = + spring( + dampingRatio = Spring.DampingRatioLowBouncy, + stiffness = Spring.StiffnessVeryLow + ) ) } response.content?.infoBottomSheet?.let { Column( - modifier = Modifier - .graphicsLayer { translationY = infoBsOffsetY.value } + modifier = Modifier.graphicsLayer { translationY = infoBsOffsetY.value } ) { InfoBottomSheet(it) } @@ -244,17 +248,19 @@ class HomeLoanTopUpIntroScreenFragment : delay(3100) footerOffsetY.animateTo( targetValue = 0f, - animationSpec = spring( - dampingRatio = Spring.DampingRatioLowBouncy, - stiffness = Spring.StiffnessVeryLow - ) + animationSpec = + spring( + dampingRatio = Spring.DampingRatioLowBouncy, + stiffness = Spring.StiffnessVeryLow + ) ) } response.footer?.let { Box( - modifier = Modifier - .align(Alignment.BottomCenter) - .graphicsLayer { translationY = footerOffsetY.value } + modifier = + Modifier.align(Alignment.BottomCenter).graphicsLayer { + translationY = footerOffsetY.value + } ) { Footer(it) } @@ -265,9 +271,7 @@ class HomeLoanTopUpIntroScreenFragment : @Composable fun LoanAmountProgressBar(outstandingAmount: Float?, topUpAmount: Float?) { Column( - modifier = Modifier - .fillMaxWidth() - .wrapContentHeight(), + modifier = Modifier.fillMaxWidth().wrapContentHeight(), horizontalAlignment = Alignment.CenterHorizontally, ) { AnimatedArc(outstandingAmount, topUpAmount) @@ -276,32 +280,29 @@ class HomeLoanTopUpIntroScreenFragment : @Composable fun LoanAmountProgressBarContent(content: HomeLoanTopUpIntroScreenContent?) { - Column( - modifier = Modifier - .graphicsLayer { translationY = (-196).dp.toPx() } - ) - { + Column(modifier = Modifier.graphicsLayer { translationY = (-196).dp.toPx() }) { ProgressBarTitle( initialText = content?.loanAmountProgressBar?.progressBarInitialText, finalText = content?.loanAmountProgressBar?.progressBarFinalText ) Spacer(modifier = Modifier.height(8.dp)) - RollingNumberAnimation(content?.loanAmountProgressBar?.progressBarAmount, getAmountList(1, 10)) + RollingNumberAnimation( + content?.loanAmountProgressBar?.progressBarAmount, + getAmountList(1, 10) + ) Spacer(modifier = Modifier.height(8.dp)) Image( painter = painterResource(id = WidgetR.drawable.ic_ellipse_shadow_orange), contentDescription = null, - modifier = Modifier - .height(48.dp) - .width(500.dp) - .align(Alignment.CenterHorizontally) - .blur(radius = 10.dp) + modifier = + Modifier.height(48.dp) + .width(500.dp) + .align(Alignment.CenterHorizontally) + .blur(radius = 10.dp) ) Spacer(modifier = Modifier.height(16.dp)) Row( - modifier = Modifier - .fillMaxWidth() - .wrapContentHeight(), + modifier = Modifier.fillMaxWidth().wrapContentHeight(), horizontalArrangement = Arrangement.SpaceBetween ) { LoanAmountDataCard(content?.outstandingAmount) @@ -329,9 +330,7 @@ class HomeLoanTopUpIntroScreenFragment : @Composable private fun ProgressBarTitleStyle(textFieldData: TextFieldData?) { Column( - modifier = Modifier - .fillMaxWidth() - .wrapContentHeight(), + modifier = Modifier.fillMaxWidth().wrapContentHeight(), horizontalAlignment = Alignment.CenterHorizontally ) { NaviTextWidgetized(textFieldData) @@ -340,15 +339,13 @@ class HomeLoanTopUpIntroScreenFragment : @Composable fun LoanAmountDataCard(loanAmountData: AmountData?) { - Row( - modifier = Modifier.padding(16.dp) - ) { + Row(modifier = Modifier.padding(16.dp)) { NaviImage( imageFieldData = loanAmountData?.icon, - modifier = Modifier - .height(loanAmountData?.icon?.iconHeight?.dp ?: 16.dp) - .width(loanAmountData?.icon?.iconWidth?.dp ?: 16.dp) - .align(Alignment.CenterVertically) + modifier = + Modifier.height(loanAmountData?.icon?.iconHeight?.dp ?: 16.dp) + .width(loanAmountData?.icon?.iconWidth?.dp ?: 16.dp) + .align(Alignment.CenterVertically) ) Spacer(modifier = Modifier.width(8.dp)) Column { @@ -361,42 +358,35 @@ class HomeLoanTopUpIntroScreenFragment : @Composable fun InfoBottomSheet(infoBottomSheetData: HomeLoanGenericBottomSheetData) { Box( - modifier = Modifier - .fillMaxWidth() - .height(16.dp) - .background( - brush = Brush.verticalGradient( - colors = listOf( - Color.Transparent, - HLColor.colorFFEFE8.copy(alpha = 0.7f) - ) + modifier = + Modifier.fillMaxWidth() + .height(16.dp) + .background( + brush = + Brush.verticalGradient( + colors = + listOf( + Color.Transparent, + HLColor.colorFFEFE8.copy(alpha = 0.7f) + ) + ) ) - ) ) Column( - modifier = Modifier - .fillMaxWidth() - .wrapContentHeight() - .background(color = HLColor.whiteFFFFFF) + modifier = + Modifier.fillMaxWidth().wrapContentHeight().background(color = HLColor.whiteFFFFFF) ) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp) - ) { + Column(modifier = Modifier.fillMaxWidth().padding(16.dp)) { NaviTextWidgetized(textFieldData = infoBottomSheetData.title) Spacer(modifier = Modifier.height(24.dp)) infoBottomSheetData.infoList?.let { it.forEach { infoListItem -> - InfoListItem( - infoListItem = infoListItem, - index = it.indexOf(infoListItem) - ) + InfoListItem(infoListItem = infoListItem, index = it.indexOf(infoListItem)) it.indexOf(infoListItem).let { index -> if (index != it.size - 1) { - VerticalDottedLineSpacer(modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 20.dp)) + VerticalDottedLineSpacer( + modifier = Modifier.fillMaxWidth().padding(horizontal = 20.dp) + ) } } } @@ -410,19 +400,20 @@ class HomeLoanTopUpIntroScreenFragment : Row( verticalAlignment = Alignment.CenterVertically, ) { - Canvas(modifier = Modifier.size(40.dp), onDraw = { - drawCircle( - color = HLColor.borderEBEBEB, - radius = size.minDimension / 2, - style = Stroke(width = 1.dp.toPx()) - ) - }) + Canvas( + modifier = Modifier.size(40.dp), + onDraw = { + drawCircle( + color = HLColor.borderEBEBEB, + radius = size.minDimension / 2, + style = Stroke(width = 1.dp.toPx()) + ) + } + ) Box( contentAlignment = Alignment.Center, - modifier = Modifier - .size(40.dp) - .offset((-40).dp, 0.dp) + modifier = Modifier.size(40.dp).offset((-40).dp, 0.dp) ) { Text(text = "${index + 1}", fontSize = 12.sp, color = Color.Black) } @@ -434,45 +425,42 @@ class HomeLoanTopUpIntroScreenFragment : } } - @Composable fun Footer(footerData: HLFooter) { Column { Box( - modifier = Modifier - .fillMaxWidth() - .height(10.dp) - .background( - brush = Brush.verticalGradient( - colors = listOf( - Color.Transparent, - Color.Black.copy(alpha = 0.05f) - ) + modifier = + Modifier.fillMaxWidth() + .height(10.dp) + .background( + brush = + Brush.verticalGradient( + colors = + listOf(Color.Transparent, Color.Black.copy(alpha = 0.05f)) + ) ) - ) ) Box( - modifier = Modifier - .fillMaxWidth() - .wrapContentHeight() - .background(color = HLColor.whiteFFFFFF) + modifier = + Modifier.fillMaxWidth() + .wrapContentHeight() + .background(color = HLColor.whiteFFFFFF) ) { Button( onClick = { moveToNextScreen(footerData.cta) }, shape = RoundedCornerShape(4.dp), colors = ButtonDefaults.buttonColors(containerColor = HLColor.newThemePurple), - modifier = Modifier - .fillMaxWidth() - .padding(17.dp) - ){ + modifier = Modifier.fillMaxWidth().padding(17.dp) + ) { footerData.cta?.title?.let { NaviTextWidgetized( - textFieldData = TextFieldData( - text = it, - font = TT_SEMI_BOLD, - size = 14, - textColor = WHITE, - ), + textFieldData = + TextFieldData( + text = it, + font = TT_SEMI_BOLD, + size = 14, + textColor = WHITE, + ), ) } } @@ -482,9 +470,7 @@ class HomeLoanTopUpIntroScreenFragment : private fun getAmountWithoutSymbolAndComma(amount: String?): String { var newAmount = "" - amount?.let { - newAmount = amount.replace(RUPEE_SYMBOL, "").replace(",", "") - } + amount?.let { newAmount = amount.replace(RUPEE_SYMBOL, "").replace(",", "") } return newAmount } diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanWidgetizedInfoFragment.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanWidgetizedInfoFragment.kt index 93e741ef7a..71fc48450b 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanWidgetizedInfoFragment.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanWidgetizedInfoFragment.kt @@ -7,7 +7,6 @@ package com.navi.hl.steps.fragment -import com.navi.design.R as DesignR import android.content.Context import android.net.Uri import android.os.Bundle @@ -28,6 +27,7 @@ import com.navi.base.utils.orElse import com.navi.base.utils.orZero import com.navi.common.utils.DownloadUtil import com.navi.common.utils.cacheDirUri +import com.navi.design.R as DesignR import com.navi.design.utils.dpToPx import com.navi.design.utils.getNaviDrawable import com.navi.design.utils.parseColorSafe diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/helper/HomeLoanSelfieCaptureHelper.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/helper/HomeLoanSelfieCaptureHelper.kt index 646e9cc315..725e1e798d 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/helper/HomeLoanSelfieCaptureHelper.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/helper/HomeLoanSelfieCaptureHelper.kt @@ -64,8 +64,7 @@ class HomeLoanSelfieCaptureHelper { hvFaceConfig.setLivenessAPIHeaders(hParams) } } - } - ?: run { hvFaceConfig.setLivenessMode(HVFaceConfig.LivenessMode.TEXTURELIVENESS) } + } ?: run { hvFaceConfig.setLivenessMode(HVFaceConfig.LivenessMode.TEXTURELIVENESS) } HyperSnapSDK.setShouldReturnRawResponse(true) diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanCloseLoansRepository.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanCloseLoansRepository.kt index aef06b7a10..99d8bd825a 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanCloseLoansRepository.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanCloseLoansRepository.kt @@ -7,18 +7,13 @@ package com.navi.hl.steps.repository -import com.google.common.reflect.TypeToken -import com.navi.common.network.models.RepoResult import com.navi.common.network.retrofit.ResponseCallback -import com.navi.hl.utils.mockApiResponse import com.navi.hl.utils.retrofitService -import com.navi.homeloan.common.models.HomeLoanCloseLoansResponse import com.navi.homeloan.common.models.ObligationsObject -import com.navi.homeloan.common.models.SelectedObligations class HomeLoanCloseLoansRepository : ResponseCallback() { - suspend fun fetchCloseLoansResponse(queryMap: HashMap) = + suspend fun fetchCloseLoansResponse(queryMap: HashMap) = apiResponseCallback(retrofitService().fetchCloseLoansResponse(queryMap)) suspend fun postHomeLoanObligationIds( diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanComposeInfoRepository.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanComposeInfoRepository.kt index 07f0f86dab..3a6a31b294 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanComposeInfoRepository.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanComposeInfoRepository.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.hl.steps.repository import com.navi.common.network.retrofit.ResponseCallback diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanFormScreenRepository.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanFormScreenRepository.kt index 2bd84e583c..02ed97d291 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanFormScreenRepository.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanFormScreenRepository.kt @@ -7,12 +7,8 @@ package com.navi.hl.steps.repository -import com.google.common.reflect.TypeToken -import com.navi.common.network.models.RepoResult import com.navi.common.network.retrofit.ResponseCallback -import com.navi.hl.utils.mockApiResponse import com.navi.hl.utils.retrofitService -import com.navi.homeloan.common.models.HomeLoanFormScreenResponse class HomeLoanFormScreenRepository : ResponseCallback() { diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanFullScreenStatusRepository.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanFullScreenStatusRepository.kt index 67246878eb..c878a9d74b 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanFullScreenStatusRepository.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanFullScreenStatusRepository.kt @@ -14,5 +14,4 @@ class HomeLoanFullScreenStatusRepository : ResponseCallback() { suspend fun fetchFullScreenStatusPageResponse(queryMap: HashMap) = apiResponseCallback(retrofitService().fetchFullScreenStatusPageResponse(queryMap)) - } diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanTopUpIntroScreenRepository.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanTopUpIntroScreenRepository.kt index b6728c02b9..beb18c9d10 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanTopUpIntroScreenRepository.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanTopUpIntroScreenRepository.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.hl.steps.repository import com.navi.common.network.retrofit.ResponseCallback @@ -7,5 +14,4 @@ class HomeLoanTopUpIntroScreenRepository : ResponseCallback() { suspend fun fetchTopUpIntroScreenResponse(queryMap: HashMap) = apiResponseCallback(retrofitService().fetchTopUpIntroScreenResponse(queryMap)) - } diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanAccountAggregatorFragmentVM.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanAccountAggregatorFragmentVM.kt index a7115bafd9..6a561c3631 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanAccountAggregatorFragmentVM.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanAccountAggregatorFragmentVM.kt @@ -365,8 +365,7 @@ class HomeLoanAccountAggregatorFragmentVM( CommonPrefConstants.CURRENT_USER, UserDetail::class.java ) - ?.name - ?: EMPTY, + ?.name ?: EMPTY, mobileNo = _phoneNumber.value.orEmpty(), termsAndConditions = true, vua = _userVua.value.orEmpty(), diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanCloseLoansFragmentVM.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanCloseLoansFragmentVM.kt index d4fc500b10..16ddb3f836 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanCloseLoansFragmentVM.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanCloseLoansFragmentVM.kt @@ -14,18 +14,19 @@ import com.navi.base.model.CtaData import com.navi.common.viewmodel.BaseVM import com.navi.hl.network.util.ApiErrorTagType import com.navi.hl.steps.repository.HomeLoanCloseLoansRepository +import com.navi.hl.utils.HLCoroutineDispatcherProvider import com.navi.homeloan.common.models.Applicant import com.navi.homeloan.common.models.HomeLoanCloseLoansResponse -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.launch -import com.navi.hl.utils.HLCoroutineDispatcherProvider import com.navi.homeloan.common.models.ObligationsObject import com.navi.homeloan.common.models.SelectedObligations +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch class HomeLoanCloseLoansFragmentVM( private val repository: HomeLoanCloseLoansRepository = HomeLoanCloseLoansRepository(), - private val coroutineDispatcherProvider: HLCoroutineDispatcherProvider = HLCoroutineDispatcherProvider() + private val coroutineDispatcherProvider: HLCoroutineDispatcherProvider = + HLCoroutineDispatcherProvider() ) : BaseVM() { private val _hlCloseLoansScreenResponse = MutableLiveData() @@ -45,7 +46,6 @@ class HomeLoanCloseLoansFragmentVM( private var _applicantList = MutableStateFlow>(emptyList()) val applicantList = _applicantList.asStateFlow() - fun fetchCloseLoansResponse( queryMap: HashMap, obligationsList: MutableList @@ -53,7 +53,8 @@ class HomeLoanCloseLoansFragmentVM( viewModelScope.launch() { val response = repository.fetchCloseLoansResponse(queryMap) if (response.error == null && response.errors.isNullOrEmpty()) { - _hlCloseLoansScreenResponse.value = updateSelectedItem(response.data, obligationsList) + _hlCloseLoansScreenResponse.value = + updateSelectedItem(response.data, obligationsList) _applicantList.value = emptyList() _hlCloseLoansScreenResponse.value?.content?.applicantsObligations?.let { _applicantList.value = it @@ -84,7 +85,6 @@ class HomeLoanCloseLoansFragmentVM( loan.isSelected = true loan.disableCheckbox = true } - } } } @@ -100,15 +100,12 @@ class HomeLoanCloseLoansFragmentVM( _hlCloseLoansScreenResponse.value?.content?.applicantsObligations?.forEach { applicant -> applicant.obligations?.forEach { loan -> if (loan.isSelected == true && loan.disableCheckbox == false) { - selectedLoansCount.value++ - selectedLoansObligationIds.add( - SelectedObligations( - loan.obligationId, - applicant.applicantReferenceId - ) - ) - incrementAmount += loan.incrementAmount ?: 0 - emiAmount += loan.emiAmount ?: 0 + selectedLoansCount.value++ + selectedLoansObligationIds.add( + SelectedObligations(loan.obligationId, applicant.applicantReferenceId) + ) + incrementAmount += loan.incrementAmount ?: 0 + emiAmount += loan.emiAmount ?: 0 } } } diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanComposeInfoFragmentVM.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanComposeInfoFragmentVM.kt index 5e58f08434..11847b2db7 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanComposeInfoFragmentVM.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanComposeInfoFragmentVM.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.hl.steps.viewmodel import androidx.lifecycle.LiveData @@ -11,20 +18,18 @@ import com.navi.homeloan.common.models.HomeLoanComposeInfoScreenResponse import kotlinx.coroutines.launch class HomeLoanComposeInfoFragmentVM( - private val repository: HomeLoanComposeInfoRepository = - HomeLoanComposeInfoRepository(), - private val coroutineDispatcherProvider: HLCoroutineDispatcherProvider = HLCoroutineDispatcherProvider() + private val repository: HomeLoanComposeInfoRepository = HomeLoanComposeInfoRepository(), + private val coroutineDispatcherProvider: HLCoroutineDispatcherProvider = + HLCoroutineDispatcherProvider() ) : BaseVM() { - private val _hlComposeInfoScreenResponse = - MutableLiveData() + private val _hlComposeInfoScreenResponse = MutableLiveData() val hlComposeInfoScreenResponse: LiveData get() = _hlComposeInfoScreenResponse fun fetchComposeInfoScreenResponse(queryMap: HashMap) = viewModelScope.launch(coroutineDispatcherProvider.io) { - val response = - repository.fetchComposeInfoScreenResponse(queryMap) + val response = repository.fetchComposeInfoScreenResponse(queryMap) if (response.error == null && response.errors.isNullOrEmpty()) { _hlComposeInfoScreenResponse.postValue(response.data) } else { diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanDocumentUploadFragmentVM.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanDocumentUploadFragmentVM.kt index e324d243b8..b31cf41766 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanDocumentUploadFragmentVM.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanDocumentUploadFragmentVM.kt @@ -17,6 +17,7 @@ import com.navi.hl.common.adapter.HomeLoanUploadDocumentsAdapter import com.navi.hl.network.util.ApiErrorTagType import com.navi.hl.steps.fragment.HomeLoanDocumentUploadFragment import com.navi.hl.steps.repository.HomeLoanDocumentUploadRepository +import com.navi.hl.utils.HLCoroutineDispatcherProvider import com.navi.homeloan.common.models.DocUploadInputWidgetsRequestData import com.navi.homeloan.common.models.HomeLoanDocumentKeyRequest import com.navi.homeloan.common.models.HomeLoanDocumentUploadPostResponse @@ -24,12 +25,11 @@ import com.navi.homeloan.common.models.HomeLoanDocumentUploadScreenResponse import com.navi.homeloan.common.models.HomeLoanUploadItemType import com.navi.homeloan.common.models.HomeLoanUploadedDocData import kotlinx.coroutines.launch -import com.navi.hl.utils.HLCoroutineDispatcherProvider - class HomeLoanDocumentUploadFragmentVM( private val repository: HomeLoanDocumentUploadRepository = HomeLoanDocumentUploadRepository(), - private val coroutineDispatcherProvider: HLCoroutineDispatcherProvider = HLCoroutineDispatcherProvider() + private val coroutineDispatcherProvider: HLCoroutineDispatcherProvider = + HLCoroutineDispatcherProvider() ) : BaseVM() { private val _homeLoanDocumentUploadResponse = @@ -174,8 +174,7 @@ class HomeLoanDocumentUploadFragmentVM( fun getRejectedDocs(): List { return homeLoanDocumentUploadResponse.value?.content?.uploadDetails?.rejectedDocs?.map { it?.apply { type = HomeLoanUploadItemType.REJECTED_DOCUMENT } - } - ?: emptyList() + } ?: emptyList() } fun checkDeleteVisibility(docAdapter: HomeLoanUploadDocumentsAdapter?): Boolean { diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanFormScreenFragmentVM.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanFormScreenFragmentVM.kt index be579c7932..9f8d737a4e 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanFormScreenFragmentVM.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanFormScreenFragmentVM.kt @@ -120,7 +120,10 @@ class HomeLoanFormScreenFragmentVM( _formPatchResponse.value = response.data } } else { - if (response.errors?.firstOrNull()?.actions?.firstOrNull()?.subPage == "ADD_CO_APPLICANT") { + if ( + response.errors?.firstOrNull()?.actions?.firstOrNull()?.subPage == + "ADD_CO_APPLICANT" + ) { setErrorData( errors = response.errors, error = response.error, @@ -186,7 +189,7 @@ class HomeLoanFormScreenFragmentVM( } if ( widget.widgetId == ID_PROPERTY_TYPE && - widget is LabeledOptionSelectorTileWidgetModel + widget is LabeledOptionSelectorTileWidgetModel ) { widget.widgetData?.tileSelectorData?.items?.let { tileSelectorItems -> for (item in tileSelectorItems) { @@ -210,7 +213,7 @@ class HomeLoanFormScreenFragmentVM( } if ( widget.widgetId == ID_PURCHASE_TYPE && - widget is LabeledOptionSelectorListWidgetModel + widget is LabeledOptionSelectorListWidgetModel ) { widget.widgetData?.listSelectorData?.items?.let { listSelectorItems -> for (item in listSelectorItems) { @@ -241,7 +244,7 @@ class HomeLoanFormScreenFragmentVM( for (widget in it) { if ( widget.widgetId == ID_PROPERTY_ID && - widget is LabeledOptionSelectorListWidgetModel + widget is LabeledOptionSelectorListWidgetModel ) { return widget.widgetData?.listSelectorData?.listTitle } @@ -249,5 +252,4 @@ class HomeLoanFormScreenFragmentVM( } return null } - } diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanFullScreenStatusFragmentVM.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanFullScreenStatusFragmentVM.kt index b5485061f5..0038718430 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanFullScreenStatusFragmentVM.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanFullScreenStatusFragmentVM.kt @@ -18,7 +18,8 @@ import com.navi.homeloan.common.models.HLFullScreenStatusResponse import kotlinx.coroutines.launch class HomeLoanFullScreenStatusFragmentVM( - private val repository: HomeLoanFullScreenStatusRepository = HomeLoanFullScreenStatusRepository(), + private val repository: HomeLoanFullScreenStatusRepository = + HomeLoanFullScreenStatusRepository(), private val coroutineDispatcherProvider: HLCoroutineDispatcherProvider = HLCoroutineDispatcherProvider() ) : BaseVM() { diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanIncomeVerificationFragmentVM.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanIncomeVerificationFragmentVM.kt index ebbb9837be..afcccde092 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanIncomeVerificationFragmentVM.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanIncomeVerificationFragmentVM.kt @@ -37,10 +37,10 @@ import com.navi.homeloan.common.models.incomeverification.HomeLoanIncomeVerifica import com.navi.homeloan.common.models.incomeverification.StatementUploadWebViewUrlRequest import com.navi.naviwidgets.models.NaviWidget import com.navi.naviwidgets.models.response.IconWithTitleWidget +import java.util.concurrent.ConcurrentHashMap import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -import java.util.concurrent.ConcurrentHashMap class HomeLoanIncomeVerificationFragmentVM( private val repository: IncomeVerificationRepository = IncomeVerificationRepository(), @@ -99,9 +99,7 @@ class HomeLoanIncomeVerificationFragmentVM( private suspend fun fetchSupportedBanks(queryMap: HashMap) { val tempQueryMap = HashMap() - queryMap.forEach { (key, value) -> - tempQueryMap[key] = value - } + queryMap.forEach { (key, value) -> tempQueryMap[key] = value } tempQueryMap[LOAN_TYPE] = HOME_LOAN val response = repository.fetchSupportedBanks(tempQueryMap) if (response.error == null) { diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanInsufficientBankDetailsFragmentVM.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanInsufficientBankDetailsFragmentVM.kt index a2e1547191..f4771ea595 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanInsufficientBankDetailsFragmentVM.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanInsufficientBankDetailsFragmentVM.kt @@ -20,7 +20,8 @@ import kotlinx.coroutines.launch class HomeLoanInsufficientBankDetailsFragmentVM( private val repository: HomeLoanInsufficientBankDetailsRepository = HomeLoanInsufficientBankDetailsRepository(), - private val coroutineDispatcherProvider: HLCoroutineDispatcherProvider = HLCoroutineDispatcherProvider() + private val coroutineDispatcherProvider: HLCoroutineDispatcherProvider = + HLCoroutineDispatcherProvider() ) : BaseVM() { private val _insufficientBankDetailsScreenResponse = @@ -30,8 +31,7 @@ class HomeLoanInsufficientBankDetailsFragmentVM( fun fetchInsufficientBankDetailsScreenResponse(queryMap: HashMap) = viewModelScope.launch(coroutineDispatcherProvider.io) { - val response = - repository.fetchInsufficientBankDetailsScreenResponse(queryMap) + val response = repository.fetchInsufficientBankDetailsScreenResponse(queryMap) if (response.error == null && response.errors.isNullOrEmpty()) { _insufficientBankDetailsScreenResponse.postValue(response.data) } else { diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanLoaderSharedVM.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanLoaderSharedVM.kt index 8f256d16fe..271c457bac 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanLoaderSharedVM.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanLoaderSharedVM.kt @@ -22,7 +22,8 @@ import kotlinx.coroutines.launch class HomeLoanLoaderSharedVM( private val repository: HomeLoanLoaderSharedRepository = HomeLoanLoaderSharedRepository(), - private val coroutineDispatcherProvider: HLCoroutineDispatcherProvider = HLCoroutineDispatcherProvider() + private val coroutineDispatcherProvider: HLCoroutineDispatcherProvider = + HLCoroutineDispatcherProvider() ) : BaseVM() { private val _loaderDetails = MutableLiveData() diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanTopUpIntroScreenFragmentVM.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanTopUpIntroScreenFragmentVM.kt index 6531416dc2..a2c9600dd1 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanTopUpIntroScreenFragmentVM.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanTopUpIntroScreenFragmentVM.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.hl.steps.viewmodel import androidx.lifecycle.LiveData @@ -13,18 +20,17 @@ import kotlinx.coroutines.launch class HomeLoanTopUpIntroScreenFragmentVM( private val repository: HomeLoanTopUpIntroScreenRepository = HomeLoanTopUpIntroScreenRepository(), - private val coroutineDispatcherProvider: HLCoroutineDispatcherProvider = HLCoroutineDispatcherProvider() + private val coroutineDispatcherProvider: HLCoroutineDispatcherProvider = + HLCoroutineDispatcherProvider() ) : BaseVM() { - private val _topUpIntroScreenResponse = - MutableLiveData() + private val _topUpIntroScreenResponse = MutableLiveData() val topUpIntroScreenResponse: LiveData get() = _topUpIntroScreenResponse fun fetchTopUpIntroScreenResponse(queryMap: HashMap) = viewModelScope.launch(coroutineDispatcherProvider.io) { - val response = - repository.fetchTopUpIntroScreenResponse(queryMap) + val response = repository.fetchTopUpIntroScreenResponse(queryMap) if (response.error == null && response.errors.isNullOrEmpty()) { _topUpIntroScreenResponse.postValue(response.data) } else { diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/tracker/activity/HomeLoanIntroActivity.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/tracker/activity/HomeLoanIntroActivity.kt index 86d53df9c4..fabfcce612 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/tracker/activity/HomeLoanIntroActivity.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/tracker/activity/HomeLoanIntroActivity.kt @@ -48,8 +48,8 @@ import com.navi.hl.tracker.viewmodel.HomeLoanIntroActivityVM import com.navi.hl.utils.NaviHLAnalytics import com.navi.hl.utils.observeNullable import com.navi.hl.utils.setStatusBarColor -import com.navi.homeloan.common.Constants.PRE_APPROVED import com.navi.homeloan.R as homeLoanR +import com.navi.homeloan.common.Constants.PRE_APPROVED import com.navi.homeloan.common.listeners.HLCommonBottomSheetListener import com.navi.homeloan.common.listeners.HLFooterListener import com.navi.homeloan.common.models.HomeLoanIntroResponse @@ -163,11 +163,11 @@ class HomeLoanIntroActivity : ) { Row { NaviImage( - modifier = Modifier - .padding(16.dp, 16.dp, 0.dp, 0.dp) - .height(24.dp) - .width(24.dp) - .clickable{ onBackPressed() }, + modifier = + Modifier.padding(16.dp, 16.dp, 0.dp, 0.dp) + .height(24.dp) + .width(24.dp) + .clickable { onBackPressed() }, imageFieldData = ImageFieldData(iconCode = ICON_BACK_ARROW_BLACK) ) } @@ -209,11 +209,11 @@ class HomeLoanIntroActivity : ) { Row { NaviImage( - modifier = Modifier - .padding(16.dp, 16.dp, 0.dp, 0.dp) - .height(24.dp) - .width(24.dp) - .clickable{ onBackPressed() }, + modifier = + Modifier.padding(16.dp, 16.dp, 0.dp, 0.dp) + .height(24.dp) + .width(24.dp) + .clickable { onBackPressed() }, imageFieldData = ImageFieldData(iconCode = CROSS_PURPLE) ) } @@ -223,7 +223,10 @@ class HomeLoanIntroActivity : imageFieldData = ImageFieldData(iconCode = INTRO_PAGE_HOME_ICON) ) Spacer(modifier = Modifier.height(8.dp)) - NaviTextWidgetized(modifier = Modifier.align(Alignment.CenterHorizontally), textFieldData = title) + NaviTextWidgetized( + modifier = Modifier.align(Alignment.CenterHorizontally), + textFieldData = title + ) Spacer(modifier = Modifier.height(4.dp)) NaviTextWidgetized( modifier = Modifier.align(Alignment.CenterHorizontally), @@ -252,8 +255,7 @@ class HomeLoanIntroActivity : disclaimer?.let { textWithStyle -> binding.footerView.enableContinueCta(false) binding.checkboxTv.setSpannableString(textWithStyle) { openLegalDocsOnBrowser(it) } - } - ?: run { binding.checkboxLl.isVisible = false } + } ?: run { binding.checkboxLl.isVisible = false } } private fun openLegalDocsOnBrowser(actionData: ActionData) { diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/tracker/viewmodel/HomeLoanIntroActivityVM.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/tracker/viewmodel/HomeLoanIntroActivityVM.kt index 354b2aba24..2b24634488 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/tracker/viewmodel/HomeLoanIntroActivityVM.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/tracker/viewmodel/HomeLoanIntroActivityVM.kt @@ -27,17 +27,17 @@ import com.navi.homeloan.common.models.GenericMenuItem import com.navi.homeloan.common.models.HomeLoanIntroResponse import com.naviapp.app.NaviApplication import com.naviapp.network.util.getGsonBuilderForWidgetizedResponse -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch class HomeLoanIntroActivityVM( private val repository: HomeLoanIntroRepository = HomeLoanIntroRepository(), - private val naviCacheRepository: NaviCacheRepository = NaviCacheRepositoryImpl( - NaviSharedDatabase.getInstance( - NaviApplication.instance.applicationContext - ).naviCacheDao() - ), - private val coroutineDispatcherProvider: HLCoroutineDispatcherProvider = HLCoroutineDispatcherProvider() + private val naviCacheRepository: NaviCacheRepository = + NaviCacheRepositoryImpl( + NaviSharedDatabase.getInstance(NaviApplication.instance.applicationContext) + .naviCacheDao() + ), + private val coroutineDispatcherProvider: HLCoroutineDispatcherProvider = + HLCoroutineDispatcherProvider() ) : BaseVM() { private val _homeLoanIntroResponse = MutableLiveData() @@ -51,24 +51,24 @@ class HomeLoanIntroActivityVM( fun getHomeLoanIntroResponseFromCache(queryMap: HashMap) { viewModelScope.launch(coroutineDispatcherProvider.io) { val version = queryMap[Constants.KEY_HL_INTRO_API_VERSION] - val introPageVersion: Long = try { - version?.toLong() ?: 1 - } catch (e: Exception) { - 1 - } + val introPageVersion: Long = + try { + version?.toLong() ?: 1 + } catch (e: Exception) { + 1 + } val response = naviCacheRepository.getDataOrFetchFromAltSource( key = DBCacheConstants.NAVI_HL_INTRO_SCREEN_CACHE_KEY, version = introPageVersion, - getDataFromAltSource = { fetchHomeLoanIntroResponse(queryMap) }) + getDataFromAltSource = { fetchHomeLoanIntroResponse(queryMap) } + ) response?.let { try { _homeLoanIntroResponse.postValue( - getGsonBuilderForWidgetizedResponse().fromJson( - it.value, - HomeLoanIntroResponse::class.java - ) + getGsonBuilderForWidgetizedResponse() + .fromJson(it.value, HomeLoanIntroResponse::class.java) ) } catch (e: Exception) { e.log() @@ -77,7 +77,9 @@ class HomeLoanIntroActivityVM( } } - private suspend fun fetchHomeLoanIntroResponse(queryMap: HashMap): NaviCacheAltSourceEntity { + private suspend fun fetchHomeLoanIntroResponse( + queryMap: HashMap + ): NaviCacheAltSourceEntity { val response = repository.fetchHomeLoanIntroResponse(queryMap) if (!response.isSuccessWithData()) { setErrorData( @@ -86,9 +88,7 @@ class HomeLoanIntroActivityVM( tag = ApiErrorTagType.HL_GET_INTRO_RESPONSE_ERROR, showFullScreenError = true ) - return NaviCacheAltSourceEntity( - isSuccess = false - ) + return NaviCacheAltSourceEntity(isSuccess = false) } return NaviCacheAltSourceEntity( value = Gson().toJson(response.data), diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/HLCoroutineDispatcherProvider.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/HLCoroutineDispatcherProvider.kt index 5a5b44f7ed..4243ad0b6d 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/HLCoroutineDispatcherProvider.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/HLCoroutineDispatcherProvider.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.hl.utils import kotlinx.coroutines.CoroutineDispatcher @@ -10,5 +17,4 @@ data class HLCoroutineDispatcherProvider( ) { constructor() : this(Dispatchers.Main, Dispatchers.Default, Dispatchers.IO) - } diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/HLEnumConstants.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/HLEnumConstants.kt index c867595503..eb5e8fdc8c 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/HLEnumConstants.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/HLEnumConstants.kt @@ -12,4 +12,4 @@ enum class HlAction { EMPLOYMENT_DETAILS, PROPERTY_CITY, PROPERTY_DETAILS -} \ No newline at end of file +} diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/HLSnackbar.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/HLSnackbar.kt index 6757d56d86..e08522d4dd 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/HLSnackbar.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/HLSnackbar.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.hl.utils import android.graphics.Color @@ -19,43 +26,39 @@ object HLSnackbar { layoutView: View?, data: ToastWidgetData?, binding: HlSnackbarLayoutBinding, - margin: Margin = Margin( - startDp = 16.0f, topDp = 0.0f, endDp = 16.0f, bottomDp = 135.0f - ), + margin: Margin = Margin(startDp = 16.0f, topDp = 0.0f, endDp = 16.0f, bottomDp = 135.0f), duration: Int = 3000 ) { layoutView?.let { - Snackbar.make( - it, - Constants.EMPTY, - Snackbar.LENGTH_SHORT - ).apply { - view.apply { - setBackgroundColor(Color.TRANSPARENT) - (this as? Snackbar.SnackbarLayout)?.apply { - setPadding( - dpToPxInInt(margin.startDp.toInt()), - dpToPxInInt(margin.topDp.toInt()), - dpToPxInInt(margin.endDp.toInt()), - dpToPxInInt(margin.bottomDp.toInt()) - ) - data?.let { - binding.snackbarTitle.setText(data?.text) - binding.snackbarTitle.setTextColor(Color.parseColor(data?.textColor)) - binding.snackBarIcon.showWhenDataIsAvailable(data?.iconUrl) - binding.snackbarContainer.background = getNaviDrawable( - cornerRadius = dpToPx(4).toInt(), - backgroundColor = Color.parseColor(data?.bgColor), + Snackbar.make(it, Constants.EMPTY, Snackbar.LENGTH_SHORT) + .apply { + view.apply { + setBackgroundColor(Color.TRANSPARENT) + (this as? Snackbar.SnackbarLayout)?.apply { + setPadding( + dpToPxInInt(margin.startDp.toInt()), + dpToPxInInt(margin.topDp.toInt()), + dpToPxInInt(margin.endDp.toInt()), + dpToPxInInt(margin.bottomDp.toInt()) ) + data?.let { + binding.snackbarTitle.setText(data?.text) + binding.snackbarTitle.setTextColor( + Color.parseColor(data?.textColor) + ) + binding.snackBarIcon.showWhenDataIsAvailable(data?.iconUrl) + binding.snackbarContainer.background = + getNaviDrawable( + cornerRadius = dpToPx(4).toInt(), + backgroundColor = Color.parseColor(data?.bgColor), + ) + } + addView(binding.root, resources.getInteger(R.integer.zero)) } - addView( - binding.root, - resources.getInteger(R.integer.zero) - ) } + setDuration(duration) } - setDuration(duration) - }.show() + .show() } } -} \ No newline at end of file +} diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/HLUtils.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/HLUtils.kt index 42b2afca92..ce28aaa1a9 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/HLUtils.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/HLUtils.kt @@ -7,18 +7,10 @@ package com.navi.hl.utils -import android.Manifest -import android.content.Context -import android.content.pm.PackageManager -import android.os.Build -import android.view.View -import android.view.animation.AnimationUtils -import androidx.core.content.ContextCompat import com.navi.hl.utils.Constants.CRORE_FULL_FORM import com.navi.hl.utils.Constants.CRORE_SHORT_FORM import com.navi.hl.utils.Constants.LAKH_FULL_FORM import com.navi.hl.utils.Constants.LAKH_SHORT_FORM -import com.navi.homeloan.R fun getAmountString(amount: Long, suffixShortForm: Boolean = true): String { val amountText: String = amount.toString() diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/MockUtil.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/MockUtil.kt index f56c195b40..746fe5e78e 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/MockUtil.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/MockUtil.kt @@ -54,4 +54,4 @@ fun mockResponseForUnitTest(type: Type, jsonKey: String): RepoResult { .registerTypeAdapter(ParameterValue::class.java, ParameterValueJsonDeserializer()) .create() return RepoResult(statusCode = 200, data = customGson.fromJson(jsonElement, type)) -} \ No newline at end of file +} diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/NaviHLAnalytics.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/NaviHLAnalytics.kt index 5b307a0a9a..fd96aa2972 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/NaviHLAnalytics.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/NaviHLAnalytics.kt @@ -166,6 +166,7 @@ class NaviHLAnalytics private constructor() { mapOf(Pair("screenTime", screenTime.toString())) ) } + fun onBankNameSearch(input: String?) { NaviTrackEvent.trackEventOnClickStream( "New_HL_Bank_Name_Entered", diff --git a/android/navi_hl_dynamic/src/test/java/com/navi/hl/HLUtilsTest.kt b/android/navi_hl_dynamic/src/test/java/com/navi/hl/HLUtilsTest.kt index 0406244202..1d58b41df5 100644 --- a/android/navi_hl_dynamic/src/test/java/com/navi/hl/HLUtilsTest.kt +++ b/android/navi_hl_dynamic/src/test/java/com/navi/hl/HLUtilsTest.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.hl import com.navi.hl.utils.getAmountString @@ -19,5 +26,4 @@ class HLUtilsTest { assertEquals("54.56 Crores", getAmountString(545675634, false)) assertEquals("54 Crores", getAmountString(540000000, false)) } - -} \ No newline at end of file +} diff --git a/android/navi_hl_dynamic/src/test/java/com/navi/hl/common/utils/HLExtTest.kt b/android/navi_hl_dynamic/src/test/java/com/navi/hl/common/utils/HLExtTest.kt index c82357426e..5d5aafbc9b 100644 --- a/android/navi_hl_dynamic/src/test/java/com/navi/hl/common/utils/HLExtTest.kt +++ b/android/navi_hl_dynamic/src/test/java/com/navi/hl/common/utils/HLExtTest.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.hl.common.utils import com.navi.homeloan.common.utils.formatDoubleAmount @@ -20,4 +27,4 @@ class HLExtTest { val formattedAmount = amount.formatDoubleAmount() assertEquals("123,456.79", formattedAmount) } -} \ No newline at end of file +} diff --git a/android/navi_hl_dynamic/src/test/java/com/navi/hl/common/utils/UtilityTest.kt b/android/navi_hl_dynamic/src/test/java/com/navi/hl/common/utils/UtilityTest.kt index 4e36154646..dc6b772b14 100644 --- a/android/navi_hl_dynamic/src/test/java/com/navi/hl/common/utils/UtilityTest.kt +++ b/android/navi_hl_dynamic/src/test/java/com/navi/hl/common/utils/UtilityTest.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.hl.common.utils import com.navi.homeloan.common.utils.getAmount @@ -76,5 +83,4 @@ class UtilityTest { val result = getAmountAsString(inputAmount) Assert.assertEquals("1234.30", result) } - -} \ No newline at end of file +} diff --git a/android/navi_hl_dynamic/src/test/java/com/navi/hl/intermediate/viewmodel/HomeLoanRejectionScreenFragmentVMTest.kt b/android/navi_hl_dynamic/src/test/java/com/navi/hl/intermediate/viewmodel/HomeLoanRejectionScreenFragmentVMTest.kt index 1b0bf3be20..b9ba30f39e 100644 --- a/android/navi_hl_dynamic/src/test/java/com/navi/hl/intermediate/viewmodel/HomeLoanRejectionScreenFragmentVMTest.kt +++ b/android/navi_hl_dynamic/src/test/java/com/navi/hl/intermediate/viewmodel/HomeLoanRejectionScreenFragmentVMTest.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.hl.intermediate.viewmodel import androidx.arch.core.executor.testing.InstantTaskExecutorRule @@ -24,8 +31,7 @@ import org.junit.runners.JUnit4 @RunWith(JUnit4::class) class HomeLoanRejectionScreenFragmentVMTest { - @RelaxedMockK - private lateinit var repository: HomeLoanRejectionScreenRepository + @RelaxedMockK private lateinit var repository: HomeLoanRejectionScreenRepository @OptIn(InternalCoroutinesApi::class) @RelaxedMockK @@ -35,8 +41,7 @@ class HomeLoanRejectionScreenFragmentVMTest { private val coroutineDispatcher = UnconfinedTestDispatcher() // To Test LiveData - @get:Rule - var rule: TestRule = InstantTaskExecutorRule() + @get:Rule var rule: TestRule = InstantTaskExecutorRule() @InternalCoroutinesApi @Before @@ -44,20 +49,29 @@ class HomeLoanRejectionScreenFragmentVMTest { MockKAnnotations.init(this, relaxUnitFun = true) testDispatcher = TestDispatcher() } + private fun getMockData(): RepoResult { val type = object : TypeToken() {}.type return mockResponseForUnitTest(type, "rejectionScreenResponse") } + @InternalCoroutinesApi @Test fun fetchRejectionScreenResponseTest() = runBlocking(testDispatcher) { - val viewModel = HomeLoanRejectionScreenFragmentVM(repository, mockCoroutinesDispatcherProvider(coroutineDispatcher)) + val viewModel = + HomeLoanRejectionScreenFragmentVM( + repository, + mockCoroutinesDispatcherProvider(coroutineDispatcher) + ) viewModel.updateCoroutineScope(this) val response = getMockData() val queryMap = HashMap() coEvery { repository.fetchRejectionScreenResponse(queryMap) } returns response viewModel.fetchRejectionScreenResponse(queryMap) - assertEquals("Home Loan", viewModel.rejectionScreenResponse?.value?.header?.navigationHeader?.centerText) + assertEquals( + "Home Loan", + viewModel.rejectionScreenResponse?.value?.header?.navigationHeader?.centerText + ) } -} \ No newline at end of file +} diff --git a/android/navi_hl_dynamic/src/test/java/com/navi/hl/mockUtils/HLMockHelper.kt b/android/navi_hl_dynamic/src/test/java/com/navi/hl/mockUtils/HLMockHelper.kt index 6a50330272..930b8f0bd0 100644 --- a/android/navi_hl_dynamic/src/test/java/com/navi/hl/mockUtils/HLMockHelper.kt +++ b/android/navi_hl_dynamic/src/test/java/com/navi/hl/mockUtils/HLMockHelper.kt @@ -1,21 +1,24 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.hl.mockUtils import com.navi.hl.utils.HLCoroutineDispatcherProvider import kotlinx.coroutines.test.TestDispatcher import kotlinx.coroutines.test.UnconfinedTestDispatcher - /** * Provides dispatcher provider for the unit tests with the TestDispatcher passed in the argument. - * @param dispatcher Dispatcher provider will be initialized with this if passed. Default value is [UnconfinedTestDispatcher]. + * + * @param dispatcher Dispatcher provider will be initialized with this if passed. Default value is + * [UnconfinedTestDispatcher]. */ - fun mockCoroutinesDispatcherProvider( dispatcher: TestDispatcher = UnconfinedTestDispatcher() ): HLCoroutineDispatcherProvider { - return HLCoroutineDispatcherProvider( - dispatcher, - dispatcher, - dispatcher - ) -} \ No newline at end of file + return HLCoroutineDispatcherProvider(dispatcher, dispatcher, dispatcher) +} diff --git a/android/navi_hl_dynamic/src/test/java/com/navi/hl/steps/viewmodel/HomeLoanCloseLoansFragmentVMTest.kt b/android/navi_hl_dynamic/src/test/java/com/navi/hl/steps/viewmodel/HomeLoanCloseLoansFragmentVMTest.kt index 59b0ef309b..09a548efaa 100644 --- a/android/navi_hl_dynamic/src/test/java/com/navi/hl/steps/viewmodel/HomeLoanCloseLoansFragmentVMTest.kt +++ b/android/navi_hl_dynamic/src/test/java/com/navi/hl/steps/viewmodel/HomeLoanCloseLoansFragmentVMTest.kt @@ -1,6 +1,13 @@ /* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.hl.steps.viewmodel +/* import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.google.common.reflect.TypeToken import com.navi.base.model.CtaData diff --git a/android/navi_hl_dynamic/src/test/java/com/navi/hl/steps/viewmodel/HomeLoanDocumentUploadFragmentVMTest.kt b/android/navi_hl_dynamic/src/test/java/com/navi/hl/steps/viewmodel/HomeLoanDocumentUploadFragmentVMTest.kt index 3ec5f87f27..2519a1be96 100644 --- a/android/navi_hl_dynamic/src/test/java/com/navi/hl/steps/viewmodel/HomeLoanDocumentUploadFragmentVMTest.kt +++ b/android/navi_hl_dynamic/src/test/java/com/navi/hl/steps/viewmodel/HomeLoanDocumentUploadFragmentVMTest.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.hl.steps.viewmodel import androidx.arch.core.executor.testing.InstantTaskExecutorRule @@ -34,11 +41,9 @@ import org.junit.runners.JUnit4 @RunWith(JUnit4::class) class HomeLoanDocumentUploadFragmentVMTest { - @RelaxedMockK - private lateinit var repository: HomeLoanDocumentUploadRepository + @RelaxedMockK private lateinit var repository: HomeLoanDocumentUploadRepository - @RelaxedMockK - private lateinit var docAdapter: HomeLoanUploadDocumentsAdapter + @RelaxedMockK private lateinit var docAdapter: HomeLoanUploadDocumentsAdapter @OptIn(InternalCoroutinesApi::class) @RelaxedMockK @@ -49,8 +54,7 @@ class HomeLoanDocumentUploadFragmentVMTest { private val coroutineDispatcher = UnconfinedTestDispatcher() // To Test LiveData - @get:Rule - var rule: TestRule = InstantTaskExecutorRule() + @get:Rule var rule: TestRule = InstantTaskExecutorRule() private lateinit var viewModel: HomeLoanDocumentUploadFragmentVM @@ -59,12 +63,18 @@ class HomeLoanDocumentUploadFragmentVMTest { fun setUp() { MockKAnnotations.init(this, relaxUnitFun = true) testDispatcher = TestDispatcher() - viewModel = HomeLoanDocumentUploadFragmentVM(repository, mockCoroutinesDispatcherProvider(coroutineDispatcher)) + viewModel = + HomeLoanDocumentUploadFragmentVM( + repository, + mockCoroutinesDispatcherProvider(coroutineDispatcher) + ) } + private fun getMockData(): RepoResult { val type = object : TypeToken() {}.type return mockResponseForUnitTest(type, "documentUploadResponse3") } + @InternalCoroutinesApi @Test fun fetchDocumentUploadDetailsTest() = @@ -73,43 +83,176 @@ class HomeLoanDocumentUploadFragmentVMTest { val response = getMockData() val queryMap = HashMap() val documentType = "documentType" - coEvery { repository.fetchDocumentUploadDetails(documentType, queryMap) } returns response + coEvery { repository.fetchDocumentUploadDetails(documentType, queryMap) } returns + response viewModel.fetchDocumentUploadDetails(documentType, queryMap) - //screen header test asserts - assertEquals("ICON_ARROW_LEFT_BLUE", viewModel.homeLoanDocumentUploadResponse.value?.header?.navigationHeader?.iconCode) - assertEquals("Home Loan", viewModel.homeLoanDocumentUploadResponse.value?.header?.navigationHeader?.centerText) - assertEquals("Need Help?", viewModel.homeLoanDocumentUploadResponse.value?.header?.navigationHeader?.helpBottomSheet?.title?.text) - assertEquals(false, viewModel.homeLoanDocumentUploadResponse.value?.header?.navigationHeader?.helpBottomSheet?.title?.maskForAlfred) - assertEquals(3, viewModel.homeLoanDocumentUploadResponse.value?.header?.navigationHeader?.helpBottomSheet?.helpItems?.size) - assertEquals("FAQs", viewModel.homeLoanDocumentUploadResponse.value?.header?.navigationHeader?.helpBottomSheet?.helpItems?.get(0)?.title?.text) - assertEquals("ICON_HL_HELP_FAQ", viewModel.homeLoanDocumentUploadResponse.value?.header?.navigationHeader?.helpBottomSheet?.helpItems?.get(0)?.startIcon?.iconCode) - assertNotNull(viewModel.homeLoanDocumentUploadResponse.value?.header?.navigationHeader?.helpBottomSheet?.helpItems?.get(0)?.ctaData?.url) + // screen header test asserts + assertEquals( + "ICON_ARROW_LEFT_BLUE", + viewModel.homeLoanDocumentUploadResponse.value?.header?.navigationHeader?.iconCode + ) + assertEquals( + "Home Loan", + viewModel.homeLoanDocumentUploadResponse.value?.header?.navigationHeader?.centerText + ) + assertEquals( + "Need Help?", + viewModel.homeLoanDocumentUploadResponse.value + ?.header + ?.navigationHeader + ?.helpBottomSheet + ?.title + ?.text + ) + assertEquals( + false, + viewModel.homeLoanDocumentUploadResponse.value + ?.header + ?.navigationHeader + ?.helpBottomSheet + ?.title + ?.maskForAlfred + ) + assertEquals( + 3, + viewModel.homeLoanDocumentUploadResponse.value + ?.header + ?.navigationHeader + ?.helpBottomSheet + ?.helpItems + ?.size + ) + assertEquals( + "FAQs", + viewModel.homeLoanDocumentUploadResponse.value + ?.header + ?.navigationHeader + ?.helpBottomSheet + ?.helpItems + ?.get(0) + ?.title + ?.text + ) + assertEquals( + "ICON_HL_HELP_FAQ", + viewModel.homeLoanDocumentUploadResponse.value + ?.header + ?.navigationHeader + ?.helpBottomSheet + ?.helpItems + ?.get(0) + ?.startIcon + ?.iconCode + ) + assertNotNull( + viewModel.homeLoanDocumentUploadResponse.value + ?.header + ?.navigationHeader + ?.helpBottomSheet + ?.helpItems + ?.get(0) + ?.ctaData + ?.url + ) - //screen footer test asserts - assertEquals("hl/homeLoanSteps/HL_CLOSE_LOANS_SCREEN", viewModel.homeLoanDocumentUploadResponse.value?.footer?.cta?.url) + // screen footer test asserts + assertEquals( + "hl/homeLoanSteps/HL_CLOSE_LOANS_SCREEN", + viewModel.homeLoanDocumentUploadResponse.value?.footer?.cta?.url + ) assertEquals("DONE", viewModel.homeLoanDocumentUploadResponse.value?.footer?.cta?.title) assertEquals(50, viewModel.homeLoanDocumentUploadResponse.value?.footer?.progress) - //screen content test asserts - assertEquals("Add Documents", viewModel.homeLoanDocumentUploadResponse.value?.content?.title) - assertEquals("We need these documents as proof that you have closed the selected loan.", viewModel.homeLoanDocumentUploadResponse.value?.content?.subTitle) - assertEquals("Proof of loan closure", viewModel.homeLoanDocumentUploadResponse.value?.content?.uploadDetails?.title) - assertEquals(10, viewModel.homeLoanDocumentUploadResponse.value?.content?.uploadDetails?.maxSizeInMB) - assertEquals(5, viewModel.homeLoanDocumentUploadResponse.value?.content?.uploadDetails?.maxDocuments) - assertEquals(4, viewModel.homeLoanDocumentUploadResponse.value?.content?.uploadDetails?.validDocTypes?.size) - assertEquals(2, viewModel.homeLoanDocumentUploadResponse.value?.content?.notesList?.size) - assertEquals("Your document file size should be smaller than 10MB", viewModel.homeLoanDocumentUploadResponse.value?.content?.notesList?.get(0)?.text) - assertEquals(false, viewModel.homeLoanDocumentUploadResponse.value?.content?.notesList?.get(0)?.maskForAlfred) - assertEquals("Supported file formats: pdf, jpg, jpeg, png", viewModel.homeLoanDocumentUploadResponse.value?.content?.notesList?.get(1)?.text) - assertEquals(false, viewModel.homeLoanDocumentUploadResponse.value?.content?.notesList?.get(1)?.maskForAlfred) - assertEquals("Note:", viewModel.homeLoanDocumentUploadResponse.value?.content?.notePrompt?.title?.text) - assertEquals(false, viewModel.homeLoanDocumentUploadResponse.value?.content?.notePrompt?.title?.maskForAlfred) - assertEquals(4, viewModel.homeLoanDocumentUploadResponse.value?.content?.infoNotes?.size) - assertEquals("For closed loans :", viewModel.homeLoanDocumentUploadResponse.value?.content?.infoNotes?.get(0)?.text) - assertEquals("Please submit NOC recieved from your bank/ lender.", viewModel.homeLoanDocumentUploadResponse.value?.content?.infoNotes?.get(1)?.text) - assertEquals("For loans closing within 12 months :", viewModel.homeLoanDocumentUploadResponse.value?.content?.infoNotes?.get(2)?.text) - assertEquals("Please submit loan account statement/ repayment schedule recieved from your bank/ lender.", viewModel.homeLoanDocumentUploadResponse.value?.content?.infoNotes?.get(3)?.text) + // screen content test asserts + assertEquals( + "Add Documents", + viewModel.homeLoanDocumentUploadResponse.value?.content?.title + ) + assertEquals( + "We need these documents as proof that you have closed the selected loan.", + viewModel.homeLoanDocumentUploadResponse.value?.content?.subTitle + ) + assertEquals( + "Proof of loan closure", + viewModel.homeLoanDocumentUploadResponse.value?.content?.uploadDetails?.title + ) + assertEquals( + 10, + viewModel.homeLoanDocumentUploadResponse.value?.content?.uploadDetails?.maxSizeInMB + ) + assertEquals( + 5, + viewModel.homeLoanDocumentUploadResponse.value?.content?.uploadDetails?.maxDocuments + ) + assertEquals( + 4, + viewModel.homeLoanDocumentUploadResponse.value + ?.content + ?.uploadDetails + ?.validDocTypes + ?.size + ) + assertEquals( + 2, + viewModel.homeLoanDocumentUploadResponse.value?.content?.notesList?.size + ) + assertEquals( + "Your document file size should be smaller than 10MB", + viewModel.homeLoanDocumentUploadResponse.value?.content?.notesList?.get(0)?.text + ) + assertEquals( + false, + viewModel.homeLoanDocumentUploadResponse.value + ?.content + ?.notesList + ?.get(0) + ?.maskForAlfred + ) + assertEquals( + "Supported file formats: pdf, jpg, jpeg, png", + viewModel.homeLoanDocumentUploadResponse.value?.content?.notesList?.get(1)?.text + ) + assertEquals( + false, + viewModel.homeLoanDocumentUploadResponse.value + ?.content + ?.notesList + ?.get(1) + ?.maskForAlfred + ) + assertEquals( + "Note:", + viewModel.homeLoanDocumentUploadResponse.value?.content?.notePrompt?.title?.text + ) + assertEquals( + false, + viewModel.homeLoanDocumentUploadResponse.value + ?.content + ?.notePrompt + ?.title + ?.maskForAlfred + ) + assertEquals( + 4, + viewModel.homeLoanDocumentUploadResponse.value?.content?.infoNotes?.size + ) + assertEquals( + "For closed loans :", + viewModel.homeLoanDocumentUploadResponse.value?.content?.infoNotes?.get(0)?.text + ) + assertEquals( + "Please submit NOC recieved from your bank/ lender.", + viewModel.homeLoanDocumentUploadResponse.value?.content?.infoNotes?.get(1)?.text + ) + assertEquals( + "For loans closing within 12 months :", + viewModel.homeLoanDocumentUploadResponse.value?.content?.infoNotes?.get(2)?.text + ) + assertEquals( + "Please submit loan account statement/ repayment schedule recieved from your bank/ lender.", + viewModel.homeLoanDocumentUploadResponse.value?.content?.infoNotes?.get(3)?.text + ) } @InternalCoroutinesApi @@ -121,17 +264,28 @@ class HomeLoanDocumentUploadFragmentVMTest { val body = HomeLoanDocumentKeyRequest("1", "123", "pdf", true) val documentReferenceId = "saReferenceId" val contextKey = "contextKey" - val response = RepoResult( - HomeLoanDocumentUploadPostResponse( - referenceId = "referenceId", - saReferenceId = "saReferenceId", - uri = "uri" + val response = + RepoResult( + HomeLoanDocumentUploadPostResponse( + referenceId = "referenceId", + saReferenceId = "saReferenceId", + uri = "uri" + ) ) + coEvery { + repository.sendHomeLoanDocumentUploadDetails(loanApplicationId, body, contextKey) + } returns response + viewModel.sendDocumentUploadDetails( + loanApplicationId, + body, + documentReferenceId, + contextKey ) - coEvery { repository.sendHomeLoanDocumentUploadDetails(loanApplicationId, body, contextKey) } returns response - viewModel.sendDocumentUploadDetails(loanApplicationId, body, documentReferenceId, contextKey) assertEquals("referenceId", viewModel.homeLoanSendDocumentResponse.value?.referenceId) - assertEquals("saReferenceId", viewModel.homeLoanSendDocumentResponse.value?.saReferenceId) + assertEquals( + "saReferenceId", + viewModel.homeLoanSendDocumentResponse.value?.saReferenceId + ) assertEquals("uri", viewModel.homeLoanSendDocumentResponse.value?.uri) } @@ -144,10 +298,13 @@ class HomeLoanDocumentUploadFragmentVMTest { val documentIdList = listOf("1", "2") val position = 1 val contextKey = "contextKey" - val response: RepoResult = RepoResult( - statusCode = 200, - ) - coEvery { repository.deleteDocuments(loanApplicationId, documentIdList, contextKey) } returns response + val response: RepoResult = + RepoResult( + statusCode = 200, + ) + coEvery { + repository.deleteDocuments(loanApplicationId, documentIdList, contextKey) + } returns response viewModel.deleteDocument(loanApplicationId, documentIdList, position, contextKey) assertEquals(1, viewModel.homeLoanDocumentDeleteResponse.value) } @@ -158,23 +315,25 @@ class HomeLoanDocumentUploadFragmentVMTest { runBlocking(testDispatcher) { viewModel.updateCoroutineScope(this) val loanApplicationId = "123" - val documentList = listOf( - HomeLoanUploadedDocData( - uri = "uri", - referenceId = "referenceId", - fileType = "pdf", - type = HomeLoanUploadItemType.UPLOADED_DOCUMENT, - documentStatus = "Delete all" + val documentList = + listOf( + HomeLoanUploadedDocData( + uri = "uri", + referenceId = "referenceId", + fileType = "pdf", + type = HomeLoanUploadItemType.UPLOADED_DOCUMENT, + documentStatus = "Delete all" + ) ) - ) val contextKey = "contextKey" - val documentDeleteIds = mutableListOf( - "referenceId" - ) - val response: RepoResult = RepoResult( - statusCode = 200, - ) - coEvery { repository.deleteDocuments(loanApplicationId, documentDeleteIds, contextKey) } returns response + val documentDeleteIds = mutableListOf("referenceId") + val response: RepoResult = + RepoResult( + statusCode = 200, + ) + coEvery { + repository.deleteDocuments(loanApplicationId, documentDeleteIds, contextKey) + } returns response viewModel.deleteAllDocument(loanApplicationId, documentList, contextKey) assertEquals(1, viewModel.homeLoanDocumentDeleteAllLiveData.value?.size) assertEquals("referenceId", viewModel.homeLoanDocumentDeleteAllLiveData.value?.get(0)) @@ -187,50 +346,50 @@ class HomeLoanDocumentUploadFragmentVMTest { viewModel.updateCoroutineScope(this) val loanApplicationId = "123" val contextKey = "contextKey" - val ctaData = CtaData( - url = "https://www.navi.com/" - ) + val ctaData = CtaData(url = "https://www.navi.com/") val input: HashMap = hashMapOf("1" to "2") - val requestBody = DocUploadInputWidgetsRequestData( - inputWidgetValues = input - ) - val response: RepoResult = RepoResult( - statusCode = 200, - ) - coEvery { repository.submitHomeLoanDocuments(loanApplicationId, contextKey, requestBody) } returns response + val requestBody = DocUploadInputWidgetsRequestData(inputWidgetValues = input) + val response: RepoResult = + RepoResult( + statusCode = 200, + ) + coEvery { + repository.submitHomeLoanDocuments(loanApplicationId, contextKey, requestBody) + } returns response viewModel.submitHomeLoanDocuments(loanApplicationId, contextKey, ctaData, requestBody) - assertEquals("https://www.navi.com/", viewModel.homeLoanSubmitDocumentsResponse.value?.url) + assertEquals( + "https://www.navi.com/", + viewModel.homeLoanSubmitDocumentsResponse.value?.url + ) } @Test fun checkDeleteVisibilityTest() { // case 1 - val list = MutableList( - 1 - ) { - HomeLoanUploadedDocData( - uri = "uri", - referenceId = "referenceId", - fileType = "pdf", - type = HomeLoanUploadItemType.UPLOADED_DOCUMENT, - documentStatus = "Delete all" - ) - } + val list = + MutableList(1) { + HomeLoanUploadedDocData( + uri = "uri", + referenceId = "referenceId", + fileType = "pdf", + type = HomeLoanUploadItemType.UPLOADED_DOCUMENT, + documentStatus = "Delete all" + ) + } every { docAdapter.dataListLiveData.value } returns list assertEquals(true, viewModel.checkDeleteVisibility(docAdapter)) // case 2 - val list2 = MutableList( - 1 - ) { - HomeLoanUploadedDocData( - uri = "uri", - referenceId = "referenceId", - fileType = "pdf", - type = HomeLoanUploadItemType.UPLOADED_DOCUMENT, - documentStatus = "Delete all" - ) - } + val list2 = + MutableList(1) { + HomeLoanUploadedDocData( + uri = "uri", + referenceId = "referenceId", + fileType = "pdf", + type = HomeLoanUploadItemType.UPLOADED_DOCUMENT, + documentStatus = "Delete all" + ) + } list2.add( HomeLoanUploadedDocData( uri = "uri", @@ -248,4 +407,4 @@ class HomeLoanDocumentUploadFragmentVMTest { every { docAdapter.dataListLiveData.value } returns list3 assertEquals(false, viewModel.checkDeleteVisibility(docAdapter)) } -} \ No newline at end of file +} diff --git a/android/navi_hl_dynamic/src/test/java/com/navi/hl/steps/viewmodel/HomeLoanInsufficientBankDetailsFragmentVMTest.kt b/android/navi_hl_dynamic/src/test/java/com/navi/hl/steps/viewmodel/HomeLoanInsufficientBankDetailsFragmentVMTest.kt index b673c3d705..f533d88657 100644 --- a/android/navi_hl_dynamic/src/test/java/com/navi/hl/steps/viewmodel/HomeLoanInsufficientBankDetailsFragmentVMTest.kt +++ b/android/navi_hl_dynamic/src/test/java/com/navi/hl/steps/viewmodel/HomeLoanInsufficientBankDetailsFragmentVMTest.kt @@ -64,7 +64,7 @@ class HomeLoanInsufficientBankDetailsFragmentVMTest { RepoResult { val type = object : TypeToken() {}.type return mockResponseForUnitTest(type, "insufficientBankDetailsScreenResponseError") - } + } @InternalCoroutinesApi @Test @@ -79,7 +79,7 @@ class HomeLoanInsufficientBankDetailsFragmentVMTest { val response = getInsufficientBankDetailsResponseSuccess() val queryMap = HashMap() coEvery { repository.fetchInsufficientBankDetailsScreenResponse(queryMap) } returns - response + response viewModel.fetchInsufficientBankDetailsScreenResponse(queryMap) assertNotNull(viewModel.insufficientBankDetailsScreenResponse.value) assertNotNull(viewModel.insufficientBankDetailsScreenResponse.value?.header) @@ -125,7 +125,7 @@ class HomeLoanInsufficientBankDetailsFragmentVMTest { val response = getInsufficientBankDetailsResponseError() val queryMap = HashMap() coEvery { repository.fetchInsufficientBankDetailsScreenResponse(queryMap) } returns - response + response viewModel.fetchInsufficientBankDetailsScreenResponse(queryMap) assertNotNull(viewModel.insufficientBankDetailsScreenResponse.value) assertNotNull(viewModel.insufficientBankDetailsScreenResponse.value?.header) @@ -158,7 +158,10 @@ class HomeLoanInsufficientBankDetailsFragmentVMTest { ) assertEquals( "RED_TICK_MARK_24", - viewModel.insufficientBankDetailsScreenResponse.value?.content?.errorBottomSheetData?.iconCode + viewModel.insufficientBankDetailsScreenResponse.value + ?.content + ?.errorBottomSheetData + ?.iconCode ) } } diff --git a/android/navi_hl_dynamic/src/test/java/com/navi/hl/steps/viewmodel/HomeLoanLoaderFragmentVMTest.kt b/android/navi_hl_dynamic/src/test/java/com/navi/hl/steps/viewmodel/HomeLoanLoaderFragmentVMTest.kt index 63612d7d18..34611df5f1 100644 --- a/android/navi_hl_dynamic/src/test/java/com/navi/hl/steps/viewmodel/HomeLoanLoaderFragmentVMTest.kt +++ b/android/navi_hl_dynamic/src/test/java/com/navi/hl/steps/viewmodel/HomeLoanLoaderFragmentVMTest.kt @@ -14,7 +14,6 @@ import com.navi.common.network.models.RepoResult import com.navi.hl.common.mockUtils.TestDispatcher import com.navi.hl.mockUtils.mockCoroutinesDispatcherProvider import com.navi.hl.steps.repository.HomeLoanLoaderSharedRepository -import com.navi.hl.steps.viewmodel.HomeLoanLoaderSharedVM import com.navi.hl.utils.mockResponseForUnitTest import com.navi.homeloan.common.models.HomeLoanLoaderResponse import io.mockk.MockKAnnotations diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/ErrorScreenV2Activity.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/ErrorScreenV2Activity.kt index f54bd5c7a7..51412655fe 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/ErrorScreenV2Activity.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/ErrorScreenV2Activity.kt @@ -417,15 +417,12 @@ class ErrorScreenV2Activity : override fun onHelpButtonPressed() { helpEventTracker.onHelpButtonClick(currentScreen) NaviDeepLinkNavigator.navigate( - activity = this, ctaData = CtaData( - url = PRODUCT_HELP_PAGE, - parameters = listOf( - LineItem( - key = CRM_HELP_SCREEN_NAME, - value = screenName - ) + activity = this, + ctaData = + CtaData( + url = PRODUCT_HELP_PAGE, + parameters = listOf(LineItem(key = CRM_HELP_SCREEN_NAME, value = screenName)) ) - ) ) } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/GetLoanV2Activity.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/GetLoanV2Activity.kt index 96258d1ab7..2e3776a97a 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/GetLoanV2Activity.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/GetLoanV2Activity.kt @@ -141,7 +141,9 @@ class GetLoanV2Activity : private val enachHelper = EnachHelper() private val digioKycVerificationHelper by lazy { DigioKycVerificationHelper() } private var headerLeftIconCode: String? = null - private val naviAnalyticsEventTracker by lazy { NaviAnalytics.naviAnalytics.BankDetails(screenName) } + private val naviAnalyticsEventTracker by lazy { + NaviAnalytics.naviAnalytics.BankDetails(screenName) + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -253,17 +255,15 @@ class GetLoanV2Activity : sharedVM.helpButtonClickstreamName?.let { NaviTrackEvent.trackEventOnClickStream(it) } helpEventTracker.onHelpButtonClick(currentScreen) NaviDeepLinkNavigator.navigate( - activity = this, ctaData = CtaData( - url = PRODUCT_HELP_PAGE, - parameters = listOf( - LineItem( - key = CRM_HELP_SCREEN_NAME, - value = currentScreen - ) + activity = this, + ctaData = + CtaData( + url = PRODUCT_HELP_PAGE, + parameters = listOf(LineItem(key = CRM_HELP_SCREEN_NAME, value = currentScreen)) ) - ) ) } + override fun onBackButtonPressed() { triggerEventForHeaderLeftIcon() performBackButtonOperation() @@ -335,27 +335,29 @@ class GetLoanV2Activity : override fun changeHeaderBackgroundColor(color: Int) {} private fun startAnimationGreenBackground() { - val job =lifecycleScope.launch { - delay(Constants.SUCCESS_ANIMATION_WHITE_BG_TIME) - if (isActive) { - binding.autopaySuccessAnimationHolderFl.setBackgroundColor( - ContextCompat.getColor(this@GetLoanV2Activity, appR.color.green) - ) - startAnimationWhiteBackground() + val job = + lifecycleScope.launch { + delay(Constants.SUCCESS_ANIMATION_WHITE_BG_TIME) + if (isActive) { + binding.autopaySuccessAnimationHolderFl.setBackgroundColor( + ContextCompat.getColor(this@GetLoanV2Activity, appR.color.green) + ) + startAnimationWhiteBackground() + } } - } job.handleCancellation() } private fun startAnimationWhiteBackground() { - val job = lifecycleScope.launch { - delay(Constants.SUCCESS_ANIMATION_GREEN_BG_TIME) - if (isActive) { - binding.autopaySuccessAnimationHolderFl.setBackgroundColor( - ContextCompat.getColor(this@GetLoanV2Activity, appR.color.white) - ) + val job = + lifecycleScope.launch { + delay(Constants.SUCCESS_ANIMATION_GREEN_BG_TIME) + if (isActive) { + binding.autopaySuccessAnimationHolderFl.setBackgroundColor( + ContextCompat.getColor(this@GetLoanV2Activity, appR.color.white) + ) + } } - } job.handleCancellation() } @@ -381,12 +383,13 @@ class GetLoanV2Activity : } private fun startSuccessAnimationEndListener(animationEnd: () -> Unit) { - val job = lifecycleScope.launch { - if (isActive) { - delay(Constants.GREEN_SUCCESS_ANIMATION_TIME) - animationEnd.invoke() + val job = + lifecycleScope.launch { + if (isActive) { + delay(Constants.GREEN_SUCCESS_ANIMATION_TIME) + animationEnd.invoke() + } } - } job.handleCancellation() } @@ -558,15 +561,16 @@ class GetLoanV2Activity : } private fun startKycAnimationGreenBackground() { - val job = lifecycleScope.launch { - delay(Constants.SUCCESS_ANIMATION_WHITE_BG_TIME) - if (isActive) { - binding.kycSuccessAnimationHolderFl.setBackgroundColor( - ContextCompat.getColor(this@GetLoanV2Activity, appR.color.green) - ) - startKycAnimationWhiteBackground() + val job = + lifecycleScope.launch { + delay(Constants.SUCCESS_ANIMATION_WHITE_BG_TIME) + if (isActive) { + binding.kycSuccessAnimationHolderFl.setBackgroundColor( + ContextCompat.getColor(this@GetLoanV2Activity, appR.color.green) + ) + startKycAnimationWhiteBackground() + } } - } job.handleCancellation() } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/IntermediateV2Activity.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/IntermediateV2Activity.kt index b84bcea1e7..748bea4d26 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/IntermediateV2Activity.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/IntermediateV2Activity.kt @@ -161,15 +161,12 @@ class IntermediateV2Activity : override fun onHelpButtonPressed() { helpEventTracker.onHelpButtonClick(currentScreen ?: screenName) NaviDeepLinkNavigator.navigate( - activity = this, ctaData = CtaData( - url = Constants.PRODUCT_HELP_PAGE, - parameters = listOf( - LineItem( - key = CRM_HELP_SCREEN_NAME, - value = screenName - ) + activity = this, + ctaData = + CtaData( + url = Constants.PRODUCT_HELP_PAGE, + parameters = listOf(LineItem(key = CRM_HELP_SCREEN_NAME, value = screenName)) ) - ) ) } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/LoanAgreementV2Activity.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/LoanAgreementV2Activity.kt index c338727cf6..16f2e0bc75 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/LoanAgreementV2Activity.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/LoanAgreementV2Activity.kt @@ -235,15 +235,12 @@ class LoanAgreementV2Activity : BaseActivity(), NaviHeaderView.InteractionListen private fun openCustomerSupportFragment() { NaviDeepLinkNavigator.navigate( - activity = this, ctaData = CtaData( - url = Constants.PRODUCT_HELP_PAGE, - parameters = listOf( - LineItem( - key = CRM_HELP_SCREEN_NAME, - value = screenName - ) + activity = this, + ctaData = + CtaData( + url = Constants.PRODUCT_HELP_PAGE, + parameters = listOf(LineItem(key = CRM_HELP_SCREEN_NAME, value = screenName)) ) - ) ) } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/LoanDisbursementLoaderV2Activity.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/LoanDisbursementLoaderV2Activity.kt index b57e3a5d78..91fb0a2449 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/LoanDisbursementLoaderV2Activity.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/LoanDisbursementLoaderV2Activity.kt @@ -188,8 +188,7 @@ class LoanDisbursementLoaderV2Activity : BaseActivity() { data.details?.message ?: getString(R.string.sending_amount) initFirebase(it, data.notificationPath.orEmpty()) apiPollInit(it, data.requestConfig) - } - ?: run { handleTimeOutError() } + } ?: run { handleTimeOutError() } } } @@ -407,9 +406,7 @@ class LoanDisbursementLoaderV2Activity : BaseActivity() { private fun startSuccessAnimationEndListener(showSuccessAnimation: Boolean? = true) { Handler(Looper.getMainLooper()) .postDelayed( - { - navigateToNextScreen() - }, + { navigateToNextScreen() }, if (showSuccessAnimation == false) LONG_ZERO else Constants.GREEN_SUCCESS_ANIMATION_TIME ) diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/LoanEligibilityLoaderV2Activity.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/LoanEligibilityLoaderV2Activity.kt index 4cc7a31237..c36d9a9bf2 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/LoanEligibilityLoaderV2Activity.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/LoanEligibilityLoaderV2Activity.kt @@ -58,6 +58,7 @@ import com.navi.pl.dynamic.fragment.PanVerificationBottomSheet import com.navi.pl.dynamic.helper.GetLoanV2Helper import com.navi.uitron.model.data.TextData import com.navi.uitron.render.UiTronRenderer +import com.navi.uitron.utils.getDataId import com.naviapp.R import com.naviapp.analytics.utils.LoadTimeEventTracker import com.naviapp.analytics.utils.NaviAnalytics @@ -106,7 +107,6 @@ import com.naviapp.utils.Constants.START_TIME import com.naviapp.utils.Constants.USER_EXIT import com.naviapp.utils.IntentConstants import com.naviapp.utils.OFFER_ID -import com.navi.uitron.utils.getDataId import kotlinx.coroutines.launch class LoanEligibilityLoaderV2Activity : WifiTrackerBaseActivity() { @@ -366,8 +366,7 @@ class LoanEligibilityLoaderV2Activity : WifiTrackerBaseActivity() { locationPollingData?.requestId?.let { firebaseInitForLocation(it, locationPollingData.notificationPath.orEmpty()) apiPollInitForLocation(it, locationPollingData.requestConfig) - } - ?: run { sendLocation() } + } ?: run { sendLocation() } } permissionViewModel.locationDataAsyncResponse.observeNonNull(this) { diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/PersonalLoanTrackerActivity.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/PersonalLoanTrackerActivity.kt index 25151be063..ee60ff9737 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/PersonalLoanTrackerActivity.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/PersonalLoanTrackerActivity.kt @@ -88,8 +88,7 @@ class PersonalLoanTrackerActivity : BaseActivity(), View.OnClickListener, Widget } catch (ex: Exception) { null } - } - ?: run { null } + } ?: run { null } rewardsAnnouncementData?.let { val rewardsAnnouncementFragment = RewardsAnnouncementFragment.getInstance( @@ -229,15 +228,12 @@ class PersonalLoanTrackerActivity : BaseActivity(), View.OnClickListener, Widget private fun openSupportScreen() { helpEventTracker.onHelpButtonClick(screenName) NaviDeepLinkNavigator.navigate( - activity = this, ctaData = CtaData( - url = PRODUCT_HELP_PAGE, - parameters = listOf( - LineItem( - key = CRM_HELP_SCREEN_NAME, - value = screenName - ) + activity = this, + ctaData = + CtaData( + url = PRODUCT_HELP_PAGE, + parameters = listOf(LineItem(key = CRM_HELP_SCREEN_NAME, value = screenName)) ) - ) ) } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/UserIdentificationV2Activity.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/UserIdentificationV2Activity.kt index b3bdbe79a6..839db77dca 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/UserIdentificationV2Activity.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/UserIdentificationV2Activity.kt @@ -253,8 +253,7 @@ class UserIdentificationV2Activity : override fun getCurrentFragmentScreenName(): String { return try { (supportFragmentManager.findFragmentById(R.id.container_fl) as? BaseFragment) - ?.screenName - ?: screenName + ?.screenName ?: screenName } catch (e: Exception) { screenName } @@ -287,15 +286,12 @@ class UserIdentificationV2Activity : override fun onHelpButtonPressed() { helpEventTracker.onHelpButtonClick(currentScreen) NaviDeepLinkNavigator.navigate( - activity = this, ctaData = CtaData( - url = PRODUCT_HELP_PAGE, - parameters = listOf( - LineItem( - key = CRM_HELP_SCREEN_NAME, - value = currentScreen - ) + activity = this, + ctaData = + CtaData( + url = PRODUCT_HELP_PAGE, + parameters = listOf(LineItem(key = CRM_HELP_SCREEN_NAME, value = currentScreen)) ) - ) ) } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/CurrentAddressItemsV2Adapter.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/CurrentAddressItemsV2Adapter.kt index 0dcd0e18b9..3a5d614d9d 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/CurrentAddressItemsV2Adapter.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/CurrentAddressItemsV2Adapter.kt @@ -24,7 +24,11 @@ class CurrentAddressItemsV2Adapter( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CurrentAddressItemsV2Holder { val binding = - PlLayoutAddressRadioButtonV2Binding.inflate(LayoutInflater.from(parent.context), parent, false) + PlLayoutAddressRadioButtonV2Binding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) return CurrentAddressItemsV2Holder(binding) } @@ -67,9 +71,7 @@ class CurrentAddressItemsV2Adapter( } fun updateDocumentUploaded(documentType: String, position: Int) { - val address = this.addresses.get(position).copy( - documentType = documentType - ) + val address = this.addresses.get(position).copy(documentType = documentType) this.addresses[position] = address notifyItemChanged(position) } @@ -81,5 +83,4 @@ class CurrentAddressItemsV2Adapter( class CurrentAddressItemsV2Holder(val binding: PlLayoutAddressRadioButtonV2Binding) : RecyclerView.ViewHolder(binding.root) - } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/KycItemsV2Adapter.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/KycItemsV2Adapter.kt index 091f8a9377..2b84302242 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/KycItemsV2Adapter.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/KycItemsV2Adapter.kt @@ -14,12 +14,7 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.navi.base.model.CtaData -import com.navi.common.model.vkyc.ItemFooter -import com.navi.design.font.FontWeightEnum -import com.navi.naviwidgets.models.response.StyleString -import com.navi.naviwidgets.models.response.TextFieldData import com.navi.pl.dynamic.listener.MultipleKycItemListeners -import com.naviapp.R import com.naviapp.databinding.ItemKycMultipleLayoutBinding import com.naviapp.databinding.ItemKycV2Binding import com.naviapp.databinding.ItemNextStepsKycBinding @@ -35,26 +30,30 @@ class KycItemsV2Adapter( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): KycOptionsBaseViewHolderV2 { return when (viewType) { - ItemViewType.SINGLE_SELECTION_ITEM.ordinal -> SingleKycItemViewHolder( - ItemKycV2Binding.inflate( - LayoutInflater.from(parent.context), parent, false + ItemViewType.SINGLE_SELECTION_ITEM.ordinal -> + SingleKycItemViewHolder( + ItemKycV2Binding.inflate(LayoutInflater.from(parent.context), parent, false) ) - ) - ItemViewType.MULTIPLE_SELECTION_ITEM.ordinal -> MultipleKycItemViewHolder( - ItemKycMultipleLayoutBinding.inflate( - LayoutInflater.from(parent.context), parent, false + ItemViewType.MULTIPLE_SELECTION_ITEM.ordinal -> + MultipleKycItemViewHolder( + ItemKycMultipleLayoutBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) ) - ) - ItemViewType.NEXT_STEPS_TITLE.ordinal -> NextStepsTitleItemViewHolder( - ItemNextStepsKycBinding.inflate( - LayoutInflater.from(parent.context), parent, false + ItemViewType.NEXT_STEPS_TITLE.ordinal -> + NextStepsTitleItemViewHolder( + ItemNextStepsKycBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) ) - ) - else -> SingleKycItemViewHolder( - ItemKycV2Binding.inflate( - LayoutInflater.from(parent.context), parent, false + else -> + SingleKycItemViewHolder( + ItemKycV2Binding.inflate(LayoutInflater.from(parent.context), parent, false) ) - ) } } @@ -73,7 +72,8 @@ class KycItemsV2Adapter( override fun getItemViewType(position: Int): Int { return when (kycItemList[position].widgetType) { ItemViewType.SINGLE_SELECTION_ITEM.name -> ItemViewType.SINGLE_SELECTION_ITEM.ordinal - ItemViewType.MULTIPLE_SELECTION_ITEM.name -> ItemViewType.MULTIPLE_SELECTION_ITEM.ordinal + ItemViewType.MULTIPLE_SELECTION_ITEM.name -> + ItemViewType.MULTIPLE_SELECTION_ITEM.ordinal ItemViewType.NEXT_STEPS_TITLE.name -> ItemViewType.NEXT_STEPS_TITLE.ordinal else -> super.getItemViewType(position) } @@ -105,17 +105,19 @@ class KycItemsV2Adapter( kycItem.description?.iconCode?.let { binding.tvDescription.setCompoundDrawablesWithIntrinsicBounds( - IconUtils.getIconResourceId(it), 0, 0, 0 + IconUtils.getIconResourceId(it), + 0, + 0, + 0 ) - } ?: run { - binding.tvDescription.setCompoundDrawablesWithIntrinsicBounds( - 0, 0, 0, 0 - ) - } + } ?: run { binding.tvDescription.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0) } if (kycItem.selfieImageBitmap != null) { binding.ivIcon.background = null - Glide.with(binding.root).asBitmap().load(kycItem.selfieImageBitmap).circleCrop() + Glide.with(binding.root) + .asBitmap() + .load(kycItem.selfieImageBitmap) + .circleCrop() .into(binding.ivIcon) } @@ -126,9 +128,7 @@ class KycItemsV2Adapter( kycItemsListener.onSelfieItemTap() } KycItemType.VIDEO_KYC.name -> { - kycItemsListener.onVideoKycItemTap( - kycItem.cta - ) + kycItemsListener.onVideoKycItemTap(kycItem.cta) } KycItemType.AADHAR.name -> { kycItemsListener.onAadhaarOtpOptionTap() @@ -137,7 +137,10 @@ class KycItemsV2Adapter( kycItemsListener.onAddressClicked() } KycItemType.PAN.name -> { - kycItemsListener.onPanItemTap(kycItem.showReviewScreen, kycItem.shouldAutoCapture) + kycItemsListener.onPanItemTap( + kycItem.showReviewScreen, + kycItem.shouldAutoCapture + ) } else -> { kycItemsListener.onAddressClicked() @@ -147,7 +150,6 @@ class KycItemsV2Adapter( } } - private fun setupNextStepItem(binding: ItemNextStepsKycBinding, position: Int) { binding.kycItem = kycItemList[position] } @@ -162,13 +164,12 @@ class KycItemsV2Adapter( } override fun onAadhaarOtpOptionTap() { - kycItemsListener.onRadioItemClicked(KycMultipleActionType.AADHAAR , null) + kycItemsListener.onRadioItemClicked(KycMultipleActionType.AADHAAR, null) } override fun onVideoKycItemTap(ctaData: CtaData?) { - kycItemsListener.onRadioItemClicked(KycMultipleActionType.VIDEO_KYC , ctaData) + kycItemsListener.onRadioItemClicked(KycMultipleActionType.VIDEO_KYC, ctaData) } - } abstract class KycOptionsBaseViewHolderV2(view: View) : RecyclerView.ViewHolder(view) @@ -183,9 +184,17 @@ class NextStepsTitleItemViewHolder(val binding: ItemNextStepsKycBinding) : KycOptionsBaseViewHolderV2(binding.root) enum class ItemViewType { - SINGLE_SELECTION_ITEM, MULTIPLE_SELECTION_ITEM, NEXT_STEPS_TITLE + SINGLE_SELECTION_ITEM, + MULTIPLE_SELECTION_ITEM, + NEXT_STEPS_TITLE } enum class KycItemType { - SELFIE, AADHAR, CURRENT_ADDRESS, PAN, VIDEO_KYC, TEXTFIELD, VIDEO_KYC_WITHOUT_PAN + SELFIE, + AADHAR, + CURRENT_ADDRESS, + PAN, + VIDEO_KYC, + TEXTFIELD, + VIDEO_KYC_WITHOUT_PAN } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/PersonalLoanTrackerAdapter.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/PersonalLoanTrackerAdapter.kt index db2fd3b8a1..800c001090 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/PersonalLoanTrackerAdapter.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/PersonalLoanTrackerAdapter.kt @@ -42,18 +42,17 @@ class PersonalLoanTrackerAdapter(private val trackerScreen: List(DATA)?.let { infoData -> binding.data = infoData addSubItems(infoData.recommendedData?.subtitles) - infoData.iconCode?.let { - IconUtils.updateIcon(it, binding.headerIcon) - } + infoData.iconCode?.let { IconUtils.updateIcon(it, binding.headerIcon) } binding.ctaBtn.setOnClickListener { infoData.cta?.let { - NaviDeepLinkNavigator.navigate( - activity = activity, - ctaData = it - ) + NaviDeepLinkNavigator.navigate(activity = activity, ctaData = it) } safelyDismissDialog() } @@ -66,9 +64,8 @@ class BankStatementInfoBottomSheet() : BaseBottomSheet() { private fun addSubItems(subtitles: List?) { subtitles?.forEach { - val childBinding = IconWithImageLayoutBinding.inflate( - LayoutInflater.from(context), null, true - ) + val childBinding = + IconWithImageLayoutBinding.inflate(LayoutInflater.from(context), null, true) childBinding.titleTv.text = it binding.itemContainer.addView(childBinding.root, binding.itemContainer.childCount) } @@ -77,7 +74,6 @@ class BankStatementInfoBottomSheet() : BaseBottomSheet() { override val screenName: String get() = NaviAnalytics.INFO_BOTTOM_SHEET_V2 - companion object { const val TAG = "BankStatementInfoBottomSheet" const val DATA = "DATA" @@ -86,11 +82,8 @@ class BankStatementInfoBottomSheet() : BaseBottomSheet() { infoData: InfoCtaData? = null, ): BankStatementInfoBottomSheet { return BankStatementInfoBottomSheet().apply { - arguments = Bundle().apply { - putParcelable(DATA, infoData) - } + arguments = Bundle().apply { putParcelable(DATA, infoData) } } } } - } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/BankStatementV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/BankStatementV2Fragment.kt index 658c6f765a..b1441d43de 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/BankStatementV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/BankStatementV2Fragment.kt @@ -7,7 +7,6 @@ package com.navi.pl.dynamic.fragment -import com.navi.design.R as DesignR import android.app.Activity import android.content.Context import android.content.Intent @@ -51,6 +50,7 @@ import com.navi.common.utils.Constants.SERVICE_PROVIDER import com.navi.common.utils.getNetworkType import com.navi.common.utils.observeNonNull import com.navi.common.utils.observeNullable +import com.navi.design.R as DesignR import com.navi.design.font.FontWeightEnum import com.navi.design.utils.getFontStyle import com.navi.design.utils.getNaviDrawable @@ -380,8 +380,7 @@ class BankStatementV2Fragment : finish = true ) activity?.finishAffinity() - } - ?: run { hideLoader() } + } ?: run { hideLoader() } } OFFER_GENERATION_FLOW -> { hideLoader() @@ -574,8 +573,7 @@ class BankStatementV2Fragment : bundle.putParcelable(SELECTED_BANK, it) } fragmentInterchangeListener?.navigateToNextScreen(SelectBankV3Fragment.TAG, bundle) - } - ?: run { openSelectBank(isAccountAggregatorEnabled = isAccountAggregatorEnabled) } + } ?: run { openSelectBank(isAccountAggregatorEnabled = isAccountAggregatorEnabled) } } private fun openSelectBank(isAccountAggregatorEnabled: Boolean) { @@ -598,7 +596,9 @@ class BankStatementV2Fragment : binding.bankNameContainer.isFocusable = true binding.bankNameTv.apply { typeface = ResourcesCompat.getFont(context, getFontStyle(FontWeightEnum.TT_REGULAR)) - setTextColor(ResourcesCompat.getColor(resources, DesignR.color.titleTertiaryColor, null)) + setTextColor( + ResourcesCompat.getColor(resources, DesignR.color.titleTertiaryColor, null) + ) } } @@ -625,8 +625,7 @@ class BankStatementV2Fragment : bank.iconUrl?.let { binding.bankIconImv.isVisible = true IconUtils.updateIcon(it, binding.bankIconImv) - } - ?: run { binding.bankIconImv.isVisible = false } + } ?: run { binding.bankIconImv.isVisible = false } if ( !(bank.accountAggregatorEnabled.orFalse() || @@ -805,8 +804,7 @@ class BankStatementV2Fragment : ctaData = backCta, finish = true ) - } - ?: run { launchHome() } + } ?: run { launchHome() } } else -> { launchHome() diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/DelayedDisbursementV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/DelayedDisbursementV2Fragment.kt index ca71a35e5c..01270a0079 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/DelayedDisbursementV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/DelayedDisbursementV2Fragment.kt @@ -35,7 +35,8 @@ class DelayedDisbursementV2Fragment : BaseFragment() { private val viewModel by lazy { ViewModelProvider(this).get(DelayedDisbursementViewModel::class.java) } - private val analyticsEventTracker = NaviAnalytics.naviAnalytics.FullPageProcessingDetail(screenName) + private val analyticsEventTracker = + NaviAnalytics.naviAnalytics.FullPageProcessingDetail(screenName) private val commonAnalyticsEventTracker = CommonNaviAnalytics.naviAnalytics.Errors() override fun onCreateView( @@ -63,18 +64,10 @@ class DelayedDisbursementV2Fragment : BaseFragment() { binding.actionBtn.setOnClickListener { var ctaData: CtaData? = null viewModel.delayedDisbursementDetails.value?.content?.let { - it.firstOrNull()?.ctaData?.let { cta -> - ctaData = cta - } - } ?: kotlin.run { - ctaData = CtaData(url = NaviDeepLinkNavigator.HOME) - } + it.firstOrNull()?.ctaData?.let { cta -> ctaData = cta } + } ?: kotlin.run { ctaData = CtaData(url = NaviDeepLinkNavigator.HOME) } ctaData?.let { - NaviDeepLinkNavigator.navigate( - activity = activity, - ctaData = it, - finish = true - ) + NaviDeepLinkNavigator.navigate(activity = activity, ctaData = it, finish = true) } } setEventNameToLatencyMapper(PL_SCREEN_ACTIVITY, queryMap[ACTION]) @@ -98,12 +91,8 @@ class DelayedDisbursementV2Fragment : BaseFragment() { networkType = getNetworkType(requireActivity()), flowName = FLOW_DELAYED_DISBURSEMENT, methodName = ::initObservers.name, - extras = mutableMapOf( - Pair( - PROP_FILE_NAME, - ::DelayedDisbursementV2Fragment.name - ) - ) + extras = + mutableMapOf(Pair(PROP_FILE_NAME, ::DelayedDisbursementV2Fragment.name)) ) data?.iconCode?.let { IconUtils.updateIcon(it, binding.ivPending) } } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EffectiveInterestCostV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EffectiveInterestCostV2Fragment.kt index d3f7e610c5..72b14da03d 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EffectiveInterestCostV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EffectiveInterestCostV2Fragment.kt @@ -39,7 +39,9 @@ class EffectiveInterestCostV2Fragment : BaseFragment(), BackListener { private val viewModel by lazy { ViewModelProvider(this).get(EffectiveInterestCostVM::class.java) } - private val analyticsEventTracker by lazy { NaviAnalytics.naviAnalytics.EffectiveInterestCost(screenName) } + private val analyticsEventTracker by lazy { + NaviAnalytics.naviAnalytics.EffectiveInterestCost(screenName) + } private var headerListener: NaviHeaderView.InteractionListener? = null private var listener: FragmentInteractionListener? = null diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EmiSelectorV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EmiSelectorV2Fragment.kt index 6560895635..bb204d4693 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EmiSelectorV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EmiSelectorV2Fragment.kt @@ -7,7 +7,6 @@ package com.navi.pl.dynamic.fragment -import com.navi.common.R as CommonR import android.app.Activity import android.content.Context import android.content.Intent @@ -20,7 +19,9 @@ import androidx.core.view.isVisible import androidx.lifecycle.ViewModelProvider import com.navi.base.sharedpref.PreferenceManager import com.navi.base.utils.orZero +import com.navi.common.R as CommonR import com.navi.common.model.Money +import com.navi.common.model.common.Header import com.navi.common.ui.fragment.BaseFragment import com.navi.common.utils.formatDateInto import com.navi.common.utils.formatDateIntoPrefixMonthNames @@ -48,7 +49,6 @@ import com.naviapp.models.EmiStartDate import com.naviapp.models.request.LoanFeeDetailsRequest import com.naviapp.models.response.EmiCalendarData import com.naviapp.models.response.EmiCalendarDataResponse -import com.navi.common.model.common.Header import com.naviapp.personalloan.getloan.loandetails.viewmodels.EmiSelectorVM import com.naviapp.personalloan.getloan.loandetails.viewmodels.LoanDetailsAndEmiSharedVM import com.naviapp.utils.Constants @@ -67,7 +67,9 @@ class EmiSelectorV2Fragment : BaseFragment(), BackListener { private val viewModel by lazy { ViewModelProvider(this).get(EmiSelectorVM::class.java) } private var loanDetailsAndEmiSharedVM: LoanDetailsAndEmiSharedVM? = null private var selectedDate: Date? = null - private val analyticsEventTracker by lazy { NaviAnalytics.naviAnalytics.EmiSelector(screenName) } + private val analyticsEventTracker by lazy { + NaviAnalytics.naviAnalytics.EmiSelector(screenName) + } private var headerListener: NaviHeaderView.InteractionListener? = null private var listener: FragmentInteractionListener? = null private var selectableDates: List? = null @@ -97,9 +99,7 @@ class EmiSelectorV2Fragment : BaseFragment(), BackListener { loanDetailsAndEmiSharedVM = activity?.let { ViewModelProvider(it).get(LoanDetailsAndEmiSharedVM::class.java) } - arguments?.let { - selectableDates = it.getStringArrayList(Constants.SELECTABLE_DATES) - } + arguments?.let { selectableDates = it.getStringArrayList(Constants.SELECTABLE_DATES) } fetchOptionalEmiDates() } @@ -117,8 +117,12 @@ class EmiSelectorV2Fragment : BaseFragment(), BackListener { val rateOfInterest = arguments?.getDouble(RATE_OF_INTEREST) val tenure = arguments?.getInt(TENURE) val productCode = PreferenceManager.getStringPreference(PRODUCT_CODE) - val roundOffEmi = arguments?.getBoolean(ROUND_OFF_EMI) - ?: arguments?.getStringArrayList(Constants.SELECTABLE_DATES).isNullOrEmpty().not() + val roundOffEmi = + arguments?.getBoolean(ROUND_OFF_EMI) + ?: arguments + ?.getStringArrayList(Constants.SELECTABLE_DATES) + .isNullOrEmpty() + .not() val minTenureInMonths = arguments?.getInt(MIN_TENURE_IN_MONTHS) val maxTenureInMonths = arguments?.getInt(MAN_TENURE_IN_MONTHS) @@ -126,9 +130,9 @@ class EmiSelectorV2Fragment : BaseFragment(), BackListener { LoanFeeDetailsRequest( amount = loanAmount, firstEmiDueDate = - selectedDate?.let { date -> - formatDateInto(date, Constants.DATE_FORMAT_YYYY_MM_DD) - }, + selectedDate?.let { date -> + formatDateInto(date, Constants.DATE_FORMAT_YYYY_MM_DD) + }, rateOfInterest = rateOfInterest, tenureInMonths = tenure, productCode = productCode, @@ -186,10 +190,11 @@ class EmiSelectorV2Fragment : BaseFragment(), BackListener { ) if (startDate == null && selectableDates.isNullOrEmpty().not()) { - startDate = parseDateFromOneToAnother( - selectableDates?.get(Constants.INT_ZERO), - Constants.NEXT_EMI_DATE - ) + startDate = + parseDateFromOneToAnother( + selectableDates?.get(Constants.INT_ZERO), + Constants.NEXT_EMI_DATE + ) } arguments?.getString(SELECTED_EMI_DATE)?.let { @@ -203,10 +208,11 @@ class EmiSelectorV2Fragment : BaseFragment(), BackListener { ) if (endDate == null && selectableDates.isNullOrEmpty().not()) { - endDate = parseDateFromOneToAnother( - selectableDates?.get((selectableDates?.size ?: 1) - 1), - Constants.NEXT_EMI_DATE - ) + endDate = + parseDateFromOneToAnother( + selectableDates?.get((selectableDates?.size ?: 1) - 1), + Constants.NEXT_EMI_DATE + ) } val defaultDate = @@ -226,7 +232,8 @@ class EmiSelectorV2Fragment : BaseFragment(), BackListener { ) changeDescriptionText(it) selectedDate = it - }) + } + ) } } @@ -302,10 +309,10 @@ class EmiSelectorV2Fragment : BaseFragment(), BackListener { NaviCalendarViewAdapter( list = list, dateStyle = - DateStyleModel( - getFontStyle(FontWeightEnum.TT_REGULAR), - R.drawable.round_outrageous_orange_16 - ) + DateStyleModel( + getFontStyle(FontWeightEnum.TT_REGULAR), + R.drawable.round_outrageous_orange_16 + ) ) } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EmploymentOtpVerificationFragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EmploymentOtpVerificationFragment.kt index 3e08cc2404..f4cd010807 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EmploymentOtpVerificationFragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EmploymentOtpVerificationFragment.kt @@ -7,7 +7,6 @@ package com.navi.pl.dynamic.fragment -import com.navi.design.R as DesignR import android.content.Context import android.content.IntentFilter import android.os.Bundle @@ -35,6 +34,7 @@ import com.navi.common.receiver.SmsAutoReadReceiver import com.navi.common.ui.fragment.BaseFragment import com.navi.common.utils.ApiPollScheduler import com.navi.common.utils.observeNonNull +import com.navi.design.R as DesignR import com.navi.design.font.FontWeightEnum import com.navi.design.utils.getFontStyle import com.navi.pl.dynamic.helper.IntermediateV2Helper.EPFO_V2 @@ -61,9 +61,7 @@ open class EmploymentOtpVerificationFragment : BaseFragment(), View.OnClickListener, BackListener, FooterViewV2.FooterInteractionListener { private lateinit var binding: PlFragmentEmploymentOtpVerificationBinding - private val viewModel by lazy { - ViewModelProvider(this)[EmploymentVerificationVM::class.java] - } + private val viewModel by lazy { ViewModelProvider(this)[EmploymentVerificationVM::class.java] } private val otpReceiver by lazy { SmsAutoReadReceiver() } private var timer: CountDownTimer? = null private var headerListener: NaviHeaderView.InteractionListener? = null @@ -264,12 +262,11 @@ open class EmploymentOtpVerificationFragment : } private fun apiPollInit(requestId: String, requestConfig: RequestConfig?) { - val initialDelay = requestConfig?.initialDelay?.toLong() - ?: PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS - val interval = requestConfig?.interval?.toLong() - ?: ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS - val numberOfRetries = requestConfig?.numOfRetries - ?: ApiPollScheduler.API_POLL_RETRY_COUNT + val initialDelay = + requestConfig?.initialDelay?.toLong() ?: PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS + val interval = + requestConfig?.interval?.toLong() ?: ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS + val numberOfRetries = requestConfig?.numOfRetries ?: ApiPollScheduler.API_POLL_RETRY_COUNT baseApiPollScheduler = ApiPollScheduler( numberOfRetry = numberOfRetries, @@ -288,7 +285,7 @@ open class EmploymentOtpVerificationFragment : ) { if ( TextUtils.equals(otpVerifyResponse?.status, FirebaseStatusType.SUCCESS) || - TextUtils.equals(otpVerifyResponse?.status, FirebaseStatusType.FAILURE) + TextUtils.equals(otpVerifyResponse?.status, FirebaseStatusType.FAILURE) ) { binding.errorMsgOtpTv.isVisible = true binding.otpBoxLayout.setErrorState() @@ -311,7 +308,10 @@ open class EmploymentOtpVerificationFragment : } open fun onOtpVerificationSuccess(otpVerifyResponse: OTPVerifyResponse?) { - if (otpVerifyResponse?.details?.data?.karzaStatus == PASSBOOK_GENERATED && pageType == OFFER_IN_REVIEW) { + if ( + otpVerifyResponse?.details?.data?.karzaStatus == PASSBOOK_GENERATED && + pageType == OFFER_IN_REVIEW + ) { otpVerifyResponse.details?.data?.nextCTA?.let { ctaData -> NaviDeepLinkNavigator.navigate( activity = activity, @@ -321,10 +321,7 @@ open class EmploymentOtpVerificationFragment : ) } } else { - fragmentInterchangeListener?.navigateToNextScreen( - EPFO_V2, - arguments ?: Bundle() - ) + fragmentInterchangeListener?.navigateToNextScreen(EPFO_V2, arguments ?: Bundle()) } } @@ -396,6 +393,7 @@ open class EmploymentOtpVerificationFragment : companion object { const val TAG = "EmploymentOtpVerificationFragment" const val PASSBOOK_GENERATED = "PASSBOOK_GENERATED" + fun getInstance(bundle: Bundle?): EmploymentOtpVerificationFragment { return EmploymentOtpVerificationFragment().apply { arguments = bundle } } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EmploymentVerificationV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EmploymentVerificationV2Fragment.kt index 9a1cd37f7d..a14def4f45 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EmploymentVerificationV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EmploymentVerificationV2Fragment.kt @@ -7,7 +7,6 @@ package com.navi.pl.dynamic.fragment -import com.navi.design.R as DesignR import android.content.Context import android.os.Bundle import android.view.Gravity @@ -30,6 +29,7 @@ import com.navi.common.ui.fragment.BaseFragment import com.navi.common.utils.Constants.OFFER_IMPROVEMENT_CHANNEL_TYPE import com.navi.common.utils.observeNonNull import com.navi.common.utils.observeNullable +import com.navi.design.R as DesignR import com.navi.design.utils.getNaviDrawable import com.navi.pl.dynamic.helper.IntermediateV2Helper.EPFO_OTP_VERIFICATION_V2 import com.naviapp.R diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/ErrorV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/ErrorV2Fragment.kt index a5b52f7012..7b62f438dd 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/ErrorV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/ErrorV2Fragment.kt @@ -99,16 +99,14 @@ class ErrorV2Fragment : BaseFragment() { binding.daysLayout.tvTryAgainAfter.text = it.title binding.daysLayout.tvDays.text = it.description binding.daysLayout.tvNoOfDays.text = error.humanReadableContent?.numberOfDays - } - ?: run { binding.daysLayout.rootLayout.visibility = View.GONE } + } ?: run { binding.daysLayout.rootLayout.visibility = View.GONE } error?.humanReadableContent?.numberOfDays?.let { binding.daysLayout.rootLayout.visibility = View.VISIBLE binding.daysLayout.tvTryAgainAfter.text = resources.getString(R.string.try_again_after) binding.daysLayout.tvDays.text = resources.getString(R.string.days) binding.daysLayout.tvNoOfDays.text = it - } - ?: run { binding.daysLayout.rootLayout.visibility = View.GONE } + } ?: run { binding.daysLayout.rootLayout.visibility = View.GONE } binding.actionBtn.text = error?.nextCta?.title ?: getString(R.string.re_submit_application) diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/FreshLoanDetailsV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/FreshLoanDetailsV2Fragment.kt index 81e3fc0750..30ed47e73d 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/FreshLoanDetailsV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/FreshLoanDetailsV2Fragment.kt @@ -89,6 +89,7 @@ import com.navi.pl.dynamic.fragment.EmiSelectorV2Fragment.Companion.TENURE import com.navi.pl.dynamic.helper.GetLoanV2Helper import com.navi.uitron.model.data.TextData import com.navi.uitron.render.UiTronRenderer +import com.navi.uitron.utils.getDataId import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.LoanTooltipSliderView @@ -165,7 +166,6 @@ import com.naviapp.utils.isBottomSheetEnabled import com.naviapp.utils.navigateToClickableText import com.naviapp.utils.pxToDp import com.naviapp.utils.setMargin -import com.navi.uitron.utils.getDataId import kotlinx.coroutines.launch class FreshLoanDetailsV2Fragment : diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/GstVerificationPasswordV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/GstVerificationPasswordV2Fragment.kt index 1f65cbc8f1..ed13a513c4 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/GstVerificationPasswordV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/GstVerificationPasswordV2Fragment.kt @@ -7,8 +7,6 @@ package com.navi.pl.dynamic.fragment -import com.navi.insurance.R as InsuranceR -import com.navi.design.R as DesignR import android.content.Context import android.os.Build import android.os.Bundle @@ -30,9 +28,11 @@ import com.navi.common.model.UploadDataAsyncResponse import com.navi.common.ui.fragment.BaseFragment import com.navi.common.utils.ApiPollScheduler import com.navi.common.utils.Constants.OFFER_IMPROVEMENT_CHANNEL_TYPE +import com.navi.design.R as DesignR import com.navi.design.font.FontWeightEnum import com.navi.design.utils.getFontStyle import com.navi.design.utils.getNaviDrawable +import com.navi.insurance.R as InsuranceR import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.FooterViewV2 @@ -331,8 +331,7 @@ class GstVerificationPasswordV2Fragment : BaseFragment(), FooterViewV2.FooterInt viewModel.fetchGstLoginWithCredentialStatus(it) } } - } - ?: run { hideLoader() } + } ?: run { hideLoader() } } baseApiPollScheduler?.scheduleApiPoll() } @@ -473,7 +472,8 @@ class GstVerificationPasswordV2Fragment : BaseFragment(), FooterViewV2.FooterInt binding.textField.background = getNaviDrawable( strokeWidth = resources.getDimension(R.dimen.layout_dp_1).toInt(), - strokeColor = ResourcesCompat.getColor(resources, InsuranceR.color.zircon_grey, null), + strokeColor = + ResourcesCompat.getColor(resources, InsuranceR.color.zircon_grey, null), cornerRadius = resources.getDimension(R.dimen.layout_dp_8).toInt() ) } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/GstVerificationV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/GstVerificationV2Fragment.kt index 5ae2c5c890..02cc2357c1 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/GstVerificationV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/GstVerificationV2Fragment.kt @@ -7,7 +7,6 @@ package com.navi.pl.dynamic.fragment -import com.navi.design.R as DesignR import android.content.Context import android.os.Bundle import android.view.LayoutInflater @@ -27,6 +26,7 @@ import com.navi.common.listeners.FragmentInterchangeListener import com.navi.common.model.UploadDataAsyncResponse import com.navi.common.ui.fragment.BaseFragment import com.navi.common.utils.ApiPollScheduler +import com.navi.design.R as DesignR import com.navi.design.font.FontWeightEnum import com.navi.design.utils.getFontStyle import com.navi.design.utils.getNaviDrawable @@ -166,17 +166,17 @@ class GstVerificationV2Fragment : baseApiPollScheduler = ApiPollScheduler( numberOfRetry = - requestConfig?.numOfRetries.orElse(ApiPollScheduler.API_POLL_RETRY_COUNT), + requestConfig?.numOfRetries.orElse(ApiPollScheduler.API_POLL_RETRY_COUNT), pollInterval = - requestConfig - ?.interval - .orElse(ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS.toInt()) - .toLong(), + requestConfig + ?.interval + .orElse(ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS.toInt()) + .toLong(), initialDelay = - requestConfig - ?.interval - .orElse(Constants.INITIAL_DELAY_FOR_API_POLL_SECONDS.toInt()) - .toLong(), + requestConfig + ?.interval + .orElse(Constants.INITIAL_DELAY_FOR_API_POLL_SECONDS.toInt()) + .toLong(), doOnTimeout = ::pollingTimeoutClickListener ) { uploadDataAsyncResponse.requestId?.let { @@ -185,8 +185,7 @@ class GstVerificationV2Fragment : viewModel.fetchSendOTPForGstVerificationStatus(it) } } - } - ?: run { hideLoader() } + } ?: run { hideLoader() } } baseApiPollScheduler?.scheduleApiPoll() } @@ -198,19 +197,20 @@ class GstVerificationV2Fragment : val footer = viewModel.gstDetailsResponse.value?.footer val url = footer?.nextCta?.url ?: footer?.cta?.url url?.let { - val bundle = Bundle().apply { - putString(GSTIN_NUMBER, binding.gstinList.selectedItem) - putString(PORTAL_USER_NAME, binding.inputUserName.inputText) - putString( - OTP_REQUEST_ID, - gstOtpGenerationState.gstOtpGenerationResponse?.requestId - ) - putInt( - OTP_SIZE, - gstOtpGenerationState.gstOtpGenerationResponse?.otpSize.orZero() - ) - putString(GST_SCREEN_TYPE, ctaQueryMap[GST_SCREEN_TYPE]) - } + val bundle = + Bundle().apply { + putString(GSTIN_NUMBER, binding.gstinList.selectedItem) + putString(PORTAL_USER_NAME, binding.inputUserName.inputText) + putString( + OTP_REQUEST_ID, + gstOtpGenerationState.gstOtpGenerationResponse?.requestId + ) + putInt( + OTP_SIZE, + gstOtpGenerationState.gstOtpGenerationResponse?.otpSize.orZero() + ) + putString(GST_SCREEN_TYPE, ctaQueryMap[GST_SCREEN_TYPE]) + } fragmentInterchangeListener?.navigateToNextScreen(it, bundle) } } @@ -220,6 +220,7 @@ class GstVerificationV2Fragment : } } } + private fun populateUI(gstDetailsResponse: GstDetailsResponse) { binding.inputUserName.apply { @@ -300,7 +301,11 @@ class GstVerificationV2Fragment : override fun onFooterBackPressed(backCta: CtaData?) { backCta?.let { - if (ctaQueryMap[GST_SCREEN_TYPE]?.equals(UserIdentificationV2Helper.OFFER_IN_REVIEW).orFalse()) { + if ( + ctaQueryMap[GST_SCREEN_TYPE] + ?.equals(UserIdentificationV2Helper.OFFER_IN_REVIEW) + .orFalse() + ) { NaviDeepLinkNavigator.navigate(activity, ctaData = backCta, finish = true) } else { if (isAdded && activity is IntermediateV2Activity) { @@ -317,31 +322,33 @@ class GstVerificationV2Fragment : } override fun onBackPressed() { - if (ctaQueryMap[GST_SCREEN_TYPE]?.equals(UserIdentificationV2Helper.OFFER_IN_REVIEW).orFalse()) { + if ( + ctaQueryMap[GST_SCREEN_TYPE] + ?.equals(UserIdentificationV2Helper.OFFER_IN_REVIEW) + .orFalse() + ) { onBackPressedNavigation( - ctaData = CtaData( - url = NaviDeepLinkNavigator.ELIGIBILITY_V2.plus(Constants.DIVIDER) - .plus(UserIdentificationV2Helper.OFFER_IN_REVIEW) - ) + ctaData = + CtaData( + url = + NaviDeepLinkNavigator.ELIGIBILITY_V2.plus(Constants.DIVIDER) + .plus(UserIdentificationV2Helper.OFFER_IN_REVIEW) + ) ) } else { onBackPressedNavigation( ctaData = - CtaData( - url = - NaviDeepLinkNavigator.LOAN_APPLICATION_V2.plus(FORWARD_SLASH.toString()) - .plus(GetLoanV2Helper.FRESH_LOAN_DETAILS_V2) - ) + CtaData( + url = + NaviDeepLinkNavigator.LOAN_APPLICATION_V2.plus(FORWARD_SLASH.toString()) + .plus(GetLoanV2Helper.FRESH_LOAN_DETAILS_V2) + ) ) } } private fun onBackPressedNavigation(ctaData: CtaData) { - NaviDeepLinkNavigator.navigate( - activity = activity, - ctaData = ctaData, - finish = true - ) + NaviDeepLinkNavigator.navigate(activity = activity, ctaData = ctaData, finish = true) } override fun onFooterContinuePressed(cta: CtaData?) { diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/InReviewV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/InReviewV2Fragment.kt index 81cbd6d6e9..f7ddbe7365 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/InReviewV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/InReviewV2Fragment.kt @@ -42,6 +42,7 @@ class InReviewV2Fragment : BaseFragment() { private val inReviewScreenEvent by lazy { NaviAnalytics.naviAnalytics.InReviewScreenEvent() } private var headerListener: NaviHeaderView.InteractionListener? = null private var flowType: String? = null + override fun onAttach(context: Context) { super.onAttach(context) listener = context as? FragmentInteractionListener @@ -69,13 +70,10 @@ class InReviewV2Fragment : BaseFragment() { private fun initError() { initError( - viewModel, actionErrorV2Enabled = true, - actions = listOf( - Pair( - handleOfferInProgressFailure, - ApiErrorTagType.OFFER_IN_PROGRESS_FAILED - ) - ) + viewModel, + actionErrorV2Enabled = true, + actions = + listOf(Pair(handleOfferInProgressFailure, ApiErrorTagType.OFFER_IN_PROGRESS_FAILED)) ) } @@ -84,9 +82,9 @@ class InReviewV2Fragment : BaseFragment() { } /** - * By default this page is used for kyc in review that's why setting headers for kyc. - * If this fragment is reused ,then the flowtype has to be sent and api call will - * be made against the flowtype. + * By default this page is used for kyc in review that's why setting headers for kyc. If this + * fragment is reused ,then the flowtype has to be sent and api call will be made against the + * flowtype. */ private fun initUi() { flowType?.let { flowType -> @@ -96,21 +94,22 @@ class InReviewV2Fragment : BaseFragment() { ) showLoader() viewModel.getOfferInProgressResponse(flowType) - } ?: run { - eventTracker.onKycAddressBlockerPageLands() - setImageProperties(arguments?.getString(IMAGE_ICON_CODE)) - binding.tvPending.text = - arguments?.getString(TITLE) ?: run { getString(R.string.kyc_verification_pending) } - binding.tvDescription.text = arguments?.getString(DESCRIPTION) - ?: run { getString(R.string.kyc_pending_description) } - setFooterButtonProperties(title = arguments?.getString(FOOTER_ACTION_BUTTON_TITLE)) } + ?: run { + eventTracker.onKycAddressBlockerPageLands() + setImageProperties(arguments?.getString(IMAGE_ICON_CODE)) + binding.tvPending.text = + arguments?.getString(TITLE) + ?: run { getString(R.string.kyc_verification_pending) } + binding.tvDescription.text = + arguments?.getString(DESCRIPTION) + ?: run { getString(R.string.kyc_pending_description) } + setFooterButtonProperties(title = arguments?.getString(FOOTER_ACTION_BUTTON_TITLE)) + } } private fun initListeners() { - binding.actionButton.setOnClickListener { - onFooterActionButtonClick() - } + binding.actionButton.setOnClickListener { onFooterActionButtonClick() } setEventNameToLatencyMapper(PL_SCREEN_ACTIVITY, queryMap[ACTION]) } @@ -148,12 +147,14 @@ class InReviewV2Fragment : BaseFragment() { private fun onFooterActionButtonClick() { NaviDeepLinkNavigator.navigate( activity = activity, - ctaData = CtaData( - url = viewModel.offerInProgress.value?.footer?.url ?: NaviDeepLinkNavigator.HOME - ), + ctaData = + CtaData( + url = viewModel.offerInProgress.value?.footer?.url ?: NaviDeepLinkNavigator.HOME + ), finish = true ) } + override fun onDetach() { super.onDetach() listener = null @@ -166,21 +167,18 @@ class InReviewV2Fragment : BaseFragment() { viewModel.getOfferInProgressResponse(flowType) } - override val screenName: String get() = arguments?.getString(SCREEN_NAME) ?: NaviAnalytics.PERSONAL_LOAN_KYC_IN_PROGRESS_V2 - companion object { const val TAG = "IN_REVIEW_V2_SCREEN" const val TITLE = "TITLE" const val DESCRIPTION = "DESCRIPTION" const val IMAGE_ICON_CODE = "IMAGE_ICON_CODE" const val FOOTER_ACTION_BUTTON_TITLE = "FOOTER_ACTION_BUTTON_TITLE" + fun getInstance(bundle: Bundle?): InReviewV2Fragment { - return InReviewV2Fragment().apply { - arguments = bundle - } + return InReviewV2Fragment().apply { arguments = bundle } } fun getScreenName(bundle: Bundle?) = diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycAddressProofV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycAddressProofV2Fragment.kt index 5e6ba2c879..ca402fbac2 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycAddressProofV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycAddressProofV2Fragment.kt @@ -94,21 +94,23 @@ class KycAddressProofV2Fragment : private fun initError() { initError( viewModel, - actions = listOf( - Pair( - fetchAddressProofInfoErrorClock, - ApiErrorTagType.FETCH_CURRENT_ADDRESS_GET_API_ERROR + actions = + listOf( + Pair( + fetchAddressProofInfoErrorClock, + ApiErrorTagType.FETCH_CURRENT_ADDRESS_GET_API_ERROR + ), ), - - ), actionErrorV2Enabled = true, + actionErrorV2Enabled = true, owner = this ) } - private val fetchAddressProofInfoErrorClock = View.OnClickListener { - showLoader() - viewModel.fetchAddressProofInfo() - } + private val fetchAddressProofInfoErrorClock = + View.OnClickListener { + showLoader() + viewModel.fetchAddressProofInfo() + } private fun fetchAddressProofInfo() { showLoader() @@ -252,9 +254,7 @@ class KycAddressProofV2Fragment : } binding.addressList.currentEnteredAddress.tvUploadNow.setOnClickListener { - this.currentAddress?.let { - onUploadNowClicked(it, 0) - } + this.currentAddress?.let { onUploadNowClicked(it, 0) } } } } @@ -280,16 +280,16 @@ class KycAddressProofV2Fragment : listener?.navigateTo( GetLoanV2Helper.KYC_IN_REVIEW, bundle = - Bundle().apply { - putString( - InReviewV2Fragment.TITLE, - resources.getString(R.string.kyc_verification_pending) - ) - putString( - InReviewV2Fragment.DESCRIPTION, - resources.getString(R.string.kyc_pending_description) - ) - } + Bundle().apply { + putString( + InReviewV2Fragment.TITLE, + resources.getString(R.string.kyc_verification_pending) + ) + putString( + InReviewV2Fragment.DESCRIPTION, + resources.getString(R.string.kyc_pending_description) + ) + } ) } @@ -360,9 +360,7 @@ class KycAddressProofV2Fragment : NaviTrackEvent.setStartTs(screenName) if (currentAddressIndex == -2 && viewModel.uploadedDocumentTypeAndUrl.value == null) { - currentAddress?.let { - onUploadNowClicked(it, 0) - } + currentAddress?.let { onUploadNowClicked(it, 0) } } else { val showLoader = viewModel.confirmAddress(currentAddressIndex) if (showLoader) { @@ -430,12 +428,18 @@ class KycAddressProofV2Fragment : errorTag = ApiErrorTagType.KYC_DETAIL_UPLOAD baseApiPollScheduler = ApiPollScheduler( - initialDelay = requestConfig?.initialDelay?.toLong() - .orElse(PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS), - numberOfRetry = requestConfig?.numOfRetries - .orElse(ApiPollScheduler.API_POLL_RETRY_COUNT), - pollInterval = requestConfig?.interval?.toLong() - .orElse(ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS), + initialDelay = + requestConfig + ?.initialDelay + ?.toLong() + .orElse(PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS), + numberOfRetry = + requestConfig?.numOfRetries.orElse(ApiPollScheduler.API_POLL_RETRY_COUNT), + pollInterval = + requestConfig + ?.interval + ?.toLong() + .orElse(ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS), doOnTimeout = onPollingEnd ) { viewModel.checkApiPollStatus(requestId, type) @@ -469,7 +473,7 @@ class KycAddressProofV2Fragment : if ( TextUtils.equals(status, FirebaseStatusType.SUCCESS) || - TextUtils.equals(status, FirebaseStatusType.FAILURE) + TextUtils.equals(status, FirebaseStatusType.FAILURE) ) { deInitializeFirebaseListener() baseApiPollScheduler?.stopApiPoll() @@ -521,5 +525,6 @@ class KycAddressProofV2Fragment : interface CurrentAddressChangeListener { fun onCurrentAddressChanged(address: CurrentAddress, position: Int) + fun onUploadNowClicked(address: CurrentAddress, position: Int) } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycAddressV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycAddressV2Fragment.kt index 14ce94cd89..f37e42c146 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycAddressV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycAddressV2Fragment.kt @@ -20,7 +20,6 @@ import androidx.lifecycle.ViewModelProvider import com.navi.analytics.utils.NaviTrackEvent import com.navi.base.model.CtaData import com.navi.base.utils.isNotNull -import com.navi.base.utils.isNull import com.navi.base.utils.orElse import com.navi.base.utils.orFalse import com.navi.common.firebasedb.FirebaseDataHelper @@ -104,17 +103,13 @@ class KycAddressV2Fragment : private fun initError() { initError( viewModel, - listOf( - Pair(submitAddressErrorClick, ApiErrorTagType.SUBMIT_KYC_API_ERROR) - ), + listOf(Pair(submitAddressErrorClick, ApiErrorTagType.SUBMIT_KYC_API_ERROR)), actionErrorV2Enabled = true, owner = this ) } - private val submitAddressErrorClick = View.OnClickListener { - confirmAddress() - } + private val submitAddressErrorClick = View.OnClickListener { confirmAddress() } private fun initUi() { val pincodeEt = binding.addressLayout.pincodeLt @@ -128,8 +123,7 @@ class KycAddressV2Fragment : start: Int, count: Int, after: Int - ) { - } + ) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { if (s?.length == Constants.PINCODE_SIZE) { @@ -243,21 +237,17 @@ class KycAddressV2Fragment : KycUiStatusValue.COMPLETE.name -> { navigateToNextScreen() } - KycUiStatusValue.SOFT_REJECT.name -> { gotoSoftReject() } - KycUiStatusValue.IN_REVIEW.name, KycUiStatusValue.OSV_VERIFICATION_IN_PROGRESS.name, KycUiStatusValue.OSV_OPS_VERIFICATION_PENDING.name -> { navigateToKycInReviewScreen() } - KycUiStatusValue.OSV_VERIFICATION.name -> { navigateToKycPhysicalVerificationScreen() } - else -> { context?.toast(R.string.something_went_wrong) } @@ -285,7 +275,8 @@ class KycAddressV2Fragment : View.OnClickListener { when (errorTag) { ApiErrorTagType.KYC_DETAIL_UPLOAD -> { - viewModel.addressDetailsLiveData.value?.content?.currentAddress?.let { currentAddress -> + viewModel.addressDetailsLiveData.value?.content?.currentAddress?.let { + currentAddress -> submitKycDetails(currentAddress) } } @@ -296,12 +287,14 @@ class KycAddressV2Fragment : errorTag = ApiErrorTagType.KYC_DETAIL_UPLOAD baseApiPollScheduler = ApiPollScheduler( - initialDelay = requestConfig?.initialDelay?.toLong() - ?: PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS, - pollInterval = requestConfig?.interval?.toLong() - ?: ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS, - numberOfRetry = requestConfig?.numOfRetries - ?: ApiPollScheduler.API_POLL_RETRY_COUNT, + initialDelay = + requestConfig?.initialDelay?.toLong() + ?: PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS, + pollInterval = + requestConfig?.interval?.toLong() + ?: ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS, + numberOfRetry = + requestConfig?.numOfRetries ?: ApiPollScheduler.API_POLL_RETRY_COUNT, doOnTimeout = onPollingEnd ) { viewModel.checkApiPollStatus(requestId, type) @@ -342,11 +335,9 @@ class KycAddressV2Fragment : binding.addressLayout.areaLt.widgetBinding.plainTextInput.onFocusChangeListener = this binding.addressLayout.pincodeLt.widgetBinding.plainTextInput.onFocusChangeListener = this - addressVerificationDetailsResponse?.content?.fatherNameObj?.let{ + addressVerificationDetailsResponse?.content?.fatherNameObj?.let { binding.addressLayout.fatherNameLt.visibility = View.VISIBLE - } ?: run { - binding.addressLayout.fatherNameLt.visibility = View.GONE - } + } ?: run { binding.addressLayout.fatherNameLt.visibility = View.GONE } } } @@ -384,7 +375,7 @@ class KycAddressV2Fragment : private fun handleFirebaseResult(status: String, type: String, isPolling: Boolean = true) { if ( TextUtils.equals(status, FirebaseStatusType.SUCCESS) || - TextUtils.equals(status, FirebaseStatusType.FAILURE) + TextUtils.equals(status, FirebaseStatusType.FAILURE) ) { deInitializeFirebaseListener() baseApiPollScheduler?.stopApiPoll() @@ -512,7 +503,7 @@ class KycAddressV2Fragment : val currentAddress = CurrentAddress( houseNumber = - binding.addressLayout.flatNumberLt.getUserInput().toString().trim(), + binding.addressLayout.flatNumberLt.getUserInput().toString().trim(), street = binding.addressLayout.streetLt.getUserInput().toString().trim(), locality = binding.addressLayout.areaLt.getUserInput().toString().trim(), status = KycV2Fragment.COMPLETED, @@ -527,8 +518,7 @@ class KycAddressV2Fragment : isAddressProofOptional = data?.isAddressProofOptional, completeAddress = data?.completeAddress, addressQualityStatus = data?.addressQualityStatus, - fatherName = - binding.addressLayout.fatherNameLt.getUserInput().toString().trim() + fatherName = binding.addressLayout.fatherNameLt.getUserInput().toString().trim() ) submitKycDetails(currentAddress) } @@ -598,7 +588,7 @@ class KycAddressV2Fragment : binding.addressLayout.areaLt.binding.errorIcon.setPadding(1, 1, 1, 1) } - if(viewModel.addressDetailsLiveData.value?.content?.fatherNameObj.isNotNull()){ + if (viewModel.addressDetailsLiveData.value?.content?.fatherNameObj.isNotNull()) { val fatherNameString = binding.addressLayout.fatherNameLt.getUserInput().orEmpty() if (fatherNameString.trim().length < fatherNameMinChars) { enable = false @@ -611,7 +601,7 @@ class KycAddressV2Fragment : ) binding.addressLayout.fatherNameLt.binding.errorIcon.setPadding(1, 1, 1, 1) } - if(!fatherNameString.isValidName()){ + if (!fatherNameString.isValidName()) { enable = false binding.addressLayout.fatherNameLt.setError( getString(R.string.enter_valid_name), @@ -623,7 +613,7 @@ class KycAddressV2Fragment : if ( binding.addressLayout.pincodeLt.getUserInput().orEmpty().length != - Constants.PINCODE_SIZE + Constants.PINCODE_SIZE ) { enable = false binding.addressLayout.pincodeLt.setError( @@ -677,15 +667,12 @@ class KycAddressV2Fragment : binding.addressLayout.flatNumberLt.widgetBinding.plainTextInput -> { if (hasFocus) analyticsEventTracker.onCurrentAddressHouseSelect() } - binding.addressLayout.streetLt.widgetBinding.plainTextInput -> { if (hasFocus) analyticsEventTracker.onCurrentAddressStreetSelect() } - binding.addressLayout.areaLt.widgetBinding.plainTextInput -> { if (hasFocus) analyticsEventTracker.onCurrentAddressLocalitySelect() } - binding.addressLayout.pincodeLt.widgetBinding.plainTextInput -> { if (hasFocus) analyticsEventTracker.onCurrentAddressPincodeSelect() } @@ -704,7 +691,6 @@ class KycAddressV2Fragment : analyticsEventTracker.onCurrentAddressCitySelect() activity?.toast(getString(R.string.address_city_message)) } - binding.addressLayout.stateLt.widgetBinding.plainTextInput -> { activity?.toast(getString(R.string.address_state_message)) } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycDocumentListFragmentV2.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycDocumentListFragmentV2.kt index ca0a865763..2645dbb490 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycDocumentListFragmentV2.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycDocumentListFragmentV2.kt @@ -61,14 +61,12 @@ class KycDocumentListFragmentV2 : BaseBottomSheet(), KycDocumentItemListener { private fun initUi() { binding.documentListRv.layoutManager = LinearLayoutManager(context) - binding.documentListRv.adapter = KycDocumentListAdapter().apply { - setKycDocumentListener(this@KycDocumentListFragmentV2) - } + binding.documentListRv.adapter = + KycDocumentListAdapter().apply { + setKycDocumentListener(this@KycDocumentListFragmentV2) + } binding.documentListRv.addItemDecoration( - DividerItemDecoration( - context, - DividerItemDecoration.VERTICAL - ) + DividerItemDecoration(context, DividerItemDecoration.VERTICAL) ) } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycPanOptionsFragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycPanOptionsFragment.kt index 37b0545bc3..43921815ba 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycPanOptionsFragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycPanOptionsFragment.kt @@ -7,7 +7,6 @@ package com.navi.pl.dynamic.fragment -import com.navi.naviwidgets.R as WidgetsR import android.annotation.SuppressLint import android.content.Context import android.os.Bundle @@ -66,6 +65,7 @@ import com.navi.common.utils.getNetworkType import com.navi.common.utils.observeNonNull import com.navi.common.utils.toBundle import com.navi.common.viewmodel.NetworkVM +import com.navi.naviwidgets.R as WidgetsR import com.navi.pl.dynamic.adapter.KycItemType import com.navi.pl.dynamic.helper.DigioStub import com.navi.pl.dynamic.helper.VKycHelper @@ -564,7 +564,6 @@ class KycPanOptionsFragment : when (panVerificationVendor) { PanVerificationVendor.CUSTOMER -> openManualBottomSheet(MANUAL_VERIFICATION_BOTTOM_SHEET) - PanVerificationVendor.DIGILOCKER -> if (isDigiBottomSheetVisible(ctaData)) { openManualBottomSheet(DIGILOCKER_VERIFICATION_BOTTOM_SHEET) @@ -582,11 +581,14 @@ class KycPanOptionsFragment : } private fun isDigiBottomSheetVisible(ctaData: CtaData?): Boolean { - return ctaData?.parameters?.forEach { - if (it.key == SHOULD_SHOW_DIGILOCKER_BOTTOM_SHEET) { - return it.value.toBoolean() + return ctaData + ?.parameters + ?.forEach { + if (it.key == SHOULD_SHOW_DIGILOCKER_BOTTOM_SHEET) { + return it.value.toBoolean() + } } - }.let { false } + .let { false } } private fun initialiseDigilocker() { @@ -607,15 +609,12 @@ class KycPanOptionsFragment : } private fun openManualBottomSheet(screenName: String?) { - val screenDataList = - viewModel.panOptionsScreenData.value - .getSuccess() - ?.content - ?.screensData + val screenDataList = viewModel.panOptionsScreenData.value.getSuccess()?.content?.screensData val indexOfScreen = screenDataList?.indexOfFirst { it.screenName == screenName } if (indexOfScreen != null && indexOfScreen >= 0) { - val fragment = PlUitronKycBottomSheetFragment.getInstance(screenDataList[indexOfScreen].body) + val fragment = + PlUitronKycBottomSheetFragment.getInstance(screenDataList[indexOfScreen].body) fragment.setBottomSheetClickListener(this) safelyShowBottomSheet(fragment, UiTronBottomSheetFragment.TAG) } @@ -648,14 +647,15 @@ class KycPanOptionsFragment : }, ) { LazyColumn( - modifier = Modifier - .fillMaxSize() - .padding( - bottom = it.calculateBottomPadding(), - start = Dp(state?.content?.additionalData?.pagePadding?.startDp.orZero()), - end = Dp(state?.content?.additionalData?.pagePadding?.endDp.orZero()), - top = Dp(state?.content?.additionalData?.pagePadding?.topDp.orZero()), - ) + modifier = + Modifier.fillMaxSize() + .padding( + bottom = it.calculateBottomPadding(), + start = + Dp(state?.content?.additionalData?.pagePadding?.startDp.orZero()), + end = Dp(state?.content?.additionalData?.pagePadding?.endDp.orZero()), + top = Dp(state?.content?.additionalData?.pagePadding?.topDp.orZero()), + ) ) { items(state?.content?.widgets?.size.orZero()) { item -> UiTronRenderer(state?.content?.widgets?.get(item)?.data, viewModel) @@ -859,11 +859,13 @@ class KycPanOptionsFragment : baseApiPollScheduler = ApiPollScheduler( doOnTimeout = onPollingEnd, - numberOfRetry = requestConfig?.numOfRetries - ?: ApiPollScheduler.API_POLL_RETRY_COUNT, - initialDelay = requestConfig?.initialDelay?.toLong() + numberOfRetry = + requestConfig?.numOfRetries ?: ApiPollScheduler.API_POLL_RETRY_COUNT, + initialDelay = + requestConfig?.initialDelay?.toLong() ?: ApiPollScheduler.INITIAL_DELAY_FOR_API_POLL_SECONDS, - pollInterval = requestConfig?.interval?.toLong() + pollInterval = + requestConfig?.interval?.toLong() ?: ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS ) { when (type) { @@ -899,12 +901,18 @@ class KycPanOptionsFragment : get() = NaviAnalytics.KYC_PAN_VERIFICATION override fun onClick(ctaData: CtaData) { - when (ctaData.type){ + when (ctaData.type) { PanVerificationVendor.CUSTOMER.name -> { shouldAutoCapture = - ctaData.parameters?.firstOrNull { it.key == SHOULD_AUTO_CAPTURE }?.value.toBoolean() + ctaData.parameters + ?.firstOrNull { it.key == SHOULD_AUTO_CAPTURE } + ?.value + .toBoolean() showReviewScreen = - ctaData.parameters?.firstOrNull { it.key == SHOW_REVIEW_SCREEN }?.value.toBoolean() + ctaData.parameters + ?.firstOrNull { it.key == SHOW_REVIEW_SCREEN } + ?.value + .toBoolean() onManualUploadClicked() } PanVerificationVendor.DIGILOCKER.name -> { @@ -948,8 +956,7 @@ class KycPanOptionsFragment : ?.additionalData ?.backCta ?.url - ?.let { listener?.navigateTo(it) } - ?: run { activity?.finish() } + ?.let { listener?.navigateTo(it) } ?: run { activity?.finish() } } } } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycV2Fragment.kt index e41d78d006..55ffd3b228 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycV2Fragment.kt @@ -7,7 +7,6 @@ package com.navi.pl.dynamic.fragment - import android.content.Context import android.graphics.Bitmap import android.graphics.BitmapFactory @@ -110,16 +109,17 @@ import com.naviapp.utils.IconUtils import com.naviapp.utils.LOAN_APPLICATION_ID import com.naviapp.utils.PROD import com.naviapp.utils.toast -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import java.io.ByteArrayOutputStream import java.io.File import java.io.FileInputStream import java.util.Locale +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext -class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInteractionListener,BackListener { +class KycV2Fragment : + BaseFragment(), KycItemsListener, FooterViewV2.FooterInteractionListener, BackListener { private lateinit var binding: PlFragmentKycV2Binding private val viewModel by lazy { ViewModelProvider(this)[KycVM::class.java] } @@ -219,9 +219,9 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter private fun observeLitmusABExperimentResponse() { viewModel.abSettings.observeNonNull(viewLifecycleOwner) { abSettings -> - if(abSettings.result == true) { - fetchKycReferenceId() - } else { + if (abSettings.result == true) { + fetchKycReferenceId() + } else { viewModel.fetchKycDetailsV2() } } @@ -374,17 +374,14 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter KycUiStatusValue.COMPLETE.name -> { navigateToNextScreen() } - KycUiStatusValue.SOFT_REJECT.name -> { kycListener?.onKycFailure() } - KycUiStatusValue.IN_REVIEW.name, KycUiStatusValue.OSV_VERIFICATION_IN_PROGRESS.name, KycUiStatusValue.OSV_OPS_VERIFICATION_PENDING.name -> { navigateToKycInReviewScreen() } - else -> { context?.toast(R.string.something_went_wrong) } @@ -407,16 +404,16 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter listener?.navigateTo( GetLoanV2Helper.KYC_IN_REVIEW, bundle = - Bundle().apply { - putString( - InReviewV2Fragment.TITLE, - resources.getString(R.string.kyc_verification_pending) - ) - putString( - InReviewV2Fragment.DESCRIPTION, - resources.getString(R.string.kyc_pending_description) - ) - } + Bundle().apply { + putString( + InReviewV2Fragment.TITLE, + resources.getString(R.string.kyc_verification_pending) + ) + putString( + InReviewV2Fragment.DESCRIPTION, + resources.getString(R.string.kyc_pending_description) + ) + } ) } @@ -464,10 +461,11 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter fetchKycReferenceId() } - private val initKycApiErrorClickListener = View.OnClickListener { - showLoader() - viewModel.initKyc(getLoanApplicationKYCInitRequestData()) - } + private val initKycApiErrorClickListener = + View.OnClickListener { + showLoader() + viewModel.initKyc(getLoanApplicationKYCInitRequestData()) + } private val onOvdUploadErrorListener = View.OnClickListener { @@ -501,9 +499,7 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter ?: PreferenceManager.getStringPreference(LOAN_APPLICATION_ID) loanApplicationId?.let { loanApplicationId -> viewModel.fetchKycReferenceId(loanApplicationId) - } ?: run { - viewModel.fetchLoanApplicationId() - } + } ?: run { viewModel.fetchLoanApplicationId() } } private fun fetchKycDetails() { @@ -513,11 +509,8 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter private fun observeKycReferenceId() { viewModel.kycReferenceId.observeNullable(this) { response -> - response?.kycClientReferenceId?.let { - apiPollInitKycStatus(response) - } ?: run { - viewModel.initKyc(getLoanApplicationKYCInitRequestData()) - } + response?.kycClientReferenceId?.let { apiPollInitKycStatus(response) } + ?: run { viewModel.initKyc(getLoanApplicationKYCInitRequestData()) } } } @@ -526,28 +519,36 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter private fun observeKycStatusV2() { viewModel.kycStatusV2.observeNullable(this) { response -> - response?.let { reKycStatusResponse -> - handleReKycStatus(reKycStatusResponse) - } ?: run { - fetchKycDetails() - } + response?.let { reKycStatusResponse -> handleReKycStatus(reKycStatusResponse) } + ?: run { fetchKycDetails() } } } private fun apiPollInitKycStatus(kycReferenceIdResponse: KycReferenceIdResponse) { errorTag = ApiErrorTagType.KYC_STATUS_V2_API_ERROR - baseApiPollScheduler = ApiPollScheduler( - initialDelay = kycReferenceIdResponse.requestConfig?.initialDelay?.toLong() - .orElse(KYC_STATUS_POLLING_INITIAL_DELAY), - numberOfRetry = kycReferenceIdResponse.requestConfig?.numOfRetries.orElse( - KYC_STATUS_POLLING_RETRY_COUNT - ), - pollInterval = kycReferenceIdResponse.requestConfig?.interval?.toLong() - .orElse(KYC_STATUS_POLLING_INTERVAL), - doOnTimeout = onPollingEnd, - apiCallback = { - viewModel.fetchKycStatusV2(kycReferenceIdResponse.kycClientReferenceId.orEmpty()) - }) + baseApiPollScheduler = + ApiPollScheduler( + initialDelay = + kycReferenceIdResponse.requestConfig + ?.initialDelay + ?.toLong() + .orElse(KYC_STATUS_POLLING_INITIAL_DELAY), + numberOfRetry = + kycReferenceIdResponse.requestConfig + ?.numOfRetries + .orElse(KYC_STATUS_POLLING_RETRY_COUNT), + pollInterval = + kycReferenceIdResponse.requestConfig + ?.interval + ?.toLong() + .orElse(KYC_STATUS_POLLING_INTERVAL), + doOnTimeout = onPollingEnd, + apiCallback = { + viewModel.fetchKycStatusV2( + kycReferenceIdResponse.kycClientReferenceId.orEmpty() + ) + } + ) baseApiPollScheduler?.scheduleApiPoll() } @@ -556,22 +557,19 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter baseApiPollScheduler?.stopApiPoll() } when (reKycStatus.status) { - ReKycStatus.NOT_STARTED.name, ReKycStatus.EXPIRED.name -> { + ReKycStatus.NOT_STARTED.name, + ReKycStatus.EXPIRED.name -> { viewModel.initKyc(getLoanApplicationKYCInitRequestData()) } - ReKycStatus.PENDING.name -> { viewModel.fetchKycDetailsV2() } - ReKycStatus.SOFT_REJECTED.name -> { handleReKycSoftRejectedStatus(reKycStatus) } - ReKycStatus.COMPLETE.name -> { handleReKycCompletedStatus(reKycStatus) } - ReKycStatus.INITIATED.name -> {} else -> { viewModel.fetchKycDetailsV2() @@ -582,31 +580,27 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter private fun handleReKycSoftRejectedStatus(reKycStatus: ReKycStatusResponse) { reKycStatus.ctaData?.let { ctatData -> NaviDeepLinkNavigator.navigate(activity = activity, ctaData = ctatData) - } ?: run { - goToSoftRejectPage(activity) - } + } ?: run { goToSoftRejectPage(activity) } } + private fun handleReKycCompletedStatus(reKycStatus: ReKycStatusResponse) { when (reKycStatus.loanType) { - PLLoanType.REPEAT.name, PLLoanType.TOP_UP.name -> { signLoanAgreement() } - + PLLoanType.REPEAT.name, + PLLoanType.TOP_UP.name -> { + signLoanAgreement() + } PLLoanType.FRESH.name -> { reKycStatus.ctaData?.let { ctaData -> NaviDeepLinkNavigator.navigate(activity = activity, ctaData = ctaData) - } ?: run { - listener?.navigateTo(screen = GetLoanV2Helper.SUMMARY_SCREEN_V2) - } + } ?: run { listener?.navigateTo(screen = GetLoanV2Helper.SUMMARY_SCREEN_V2) } } } } private fun observeInitKyc() { viewModel.initKycResponse.observeNullable(this) { response -> - response?.kycClientReferenceId?.let { - apiPollInitKycStatus(response) - } ?: run { - viewModel.fetchKycDetailsV2() - } + response?.kycClientReferenceId?.let { apiPollInitKycStatus(response) } + ?: run { viewModel.fetchKycDetailsV2() } } } @@ -631,10 +625,10 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter kycDetailsResponse.footer, this, customClickConfig = - CustomClickConfig( - type = CustomClickType.RAGE_TAP.name, - eventName = NaviAnalytics.PL_SELFIE_NEXT_CLICK - ) + CustomClickConfig( + type = CustomClickType.RAGE_TAP.name, + eventName = NaviAnalytics.PL_SELFIE_NEXT_CLICK + ) ) if (binding.footerView.binding.footer?.sticky.isNotNull()) { enableLoanOfferStickiness() @@ -667,7 +661,7 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter ) loanOfferBottomSheet.nextCta.observeNonNull(viewLifecycleOwner) { cta -> cta.url?.let { url -> - listener?.navigateTo(screen = url , bundle = cta.parameters?.toBundle()) + listener?.navigateTo(screen = url, bundle = cta.parameters?.toBundle()) } } } @@ -680,7 +674,7 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter itemList .firstOrNull { it.kycType == KycItemType.AADHAR.name && - it.status != KycItemsV2Adapter.COMPLETED + it.status != KycItemsV2Adapter.COMPLETED } ?.description = StyledTextWithIconCode( @@ -694,7 +688,7 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter val item = itemList.firstOrNull { it.kycType == KycItemType.SELFIE.name && - it.status != KycItemsV2Adapter.COMPLETED + it.status != KycItemsV2Adapter.COMPLETED } item?.description = @@ -713,11 +707,7 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter private fun observeAadhaarVerificationStatus(sharedVM: KycSharedVM) { viewModel.aadharVerificationStatusResponse.observeNullable(this) { data -> data?.requestId?.let { - aadhaarStatusVerification( - it, - data.notificationPath.orEmpty(), - data.requestConfig - ) + aadhaarStatusVerification(it, data.notificationPath.orEmpty(), data.requestConfig) } } @@ -798,7 +788,6 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter initialiseHypervergeSDK(selfieSetting) } } - PROVIDER_MOCK -> { if (TextUtils.equals(BuildConfig.FLAVOR, PROD)) return val dummyData = @@ -825,11 +814,9 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter bitmapImage = BitmapFactory.decodeFile(imgFile.absolutePath, bmOptions) } } - PROVIDER_MOCK -> { bitmapImage = BitmapFactory.decodeResource(resources, R.drawable.bank) } - else -> { val inputStream: FileInputStream? = activity?.openFileInput(url) bitmapImage = BitmapFactory.decodeStream(inputStream) @@ -877,25 +864,23 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter private fun handleVideoKycDeeplink(kycItemList: List?) { if ( arguments?.getString(Constants.SUB_REDIRECT) == KycAaadharActionType.VIDEO_KYC.name && - viewModel.isKycItemV2NotCompleted(KycAaadharActionType.VIDEO_KYC.name, kycItemList) + viewModel.isKycItemV2NotCompleted(KycAaadharActionType.VIDEO_KYC.name, kycItemList) ) { arguments?.remove(Constants.SUB_REDIRECT) val vkycItem = kycItemList?.firstOrNull { it.widgetType == KycItemType.VIDEO_KYC.name } - videoKycInit( - vkycItem?.cta - ) + videoKycInit(vkycItem?.cta) } } - private fun videoKycInit( - cta: CtaData? = null - ) { - cta?.url?.let { - listener?.navigateTo(it , cta.parameters?.toBundle()) - } ?: run { - listener?.navigateTo(GetLoanV2Helper.VIDEO_KYC_V2_SCREEN , cta?.parameters?.toBundle()) - } + private fun videoKycInit(cta: CtaData? = null) { + cta?.url?.let { listener?.navigateTo(it, cta.parameters?.toBundle()) } + ?: run { + listener?.navigateTo( + GetLoanV2Helper.VIDEO_KYC_V2_SCREEN, + cta?.parameters?.toBundle() + ) + } } private fun onDocumentCaptureSuccess(supportedOvd: SupportedOvd) { @@ -1071,8 +1056,8 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter backSide?.let { loadTimeEventTracker.onLoadingCompleted( eventName = - if (it) NaviAnalytics.PL_AADHAR_BACK_UPLOAD_TIME - else NaviAnalytics.PL_AADHAR_FRONT_UPLOAD_TIME + if (it) NaviAnalytics.PL_AADHAR_BACK_UPLOAD_TIME + else NaviAnalytics.PL_AADHAR_FRONT_UPLOAD_TIME ) } hideLoader() @@ -1107,7 +1092,7 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter private fun handleFirebaseResult(status: String, type: String, isPolling: Boolean = true) { if ( TextUtils.equals(status, FirebaseStatusType.SUCCESS) || - TextUtils.equals(status, FirebaseStatusType.FAILURE) + TextUtils.equals(status, FirebaseStatusType.FAILURE) ) { deInitializeFirebaseListener() baseApiPollScheduler?.stopApiPoll() @@ -1128,7 +1113,6 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter ) } } - UPDATE_KYC_DETAILS -> { if (TextUtils.equals(status, FirebaseStatusType.SUCCESS)) { viewModel.setFathersNameSubmitSuccess(true) @@ -1136,7 +1120,6 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter observeFathersNameSubmitSuccess() } } - AADHAR_VERIFICATION -> { if (TextUtils.equals(status, FirebaseStatusType.SUCCESS)) { fetchKycDetails() @@ -1152,7 +1135,6 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter ) } } - LOAN_AGREEMENT_SIGN -> { handleSignLoanAgreementApiResponse(status) } @@ -1212,8 +1194,10 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter ApiErrorTagType.SELFIE_UPLOAD -> openSelfieScreen() ApiErrorTagType.AADHAAR_VERIFICATION -> handleAadharClick() ApiErrorTagType.OVD_UPLOAD_ERROR -> onDocumentCaptureSuccess(supportedOvd) - ApiErrorTagType.KYC_STATUS_V2_API_ERROR -> handleKycStatusV2PollingTimeoutClickListener() - ApiErrorTagType.SIGN_LOAN_AGREEMENT_ERROR -> handleSignLoanAgreementPollingTimeoutClickListener() + ApiErrorTagType.KYC_STATUS_V2_API_ERROR -> + handleKycStatusV2PollingTimeoutClickListener() + ApiErrorTagType.SIGN_LOAN_AGREEMENT_ERROR -> + handleSignLoanAgreementPollingTimeoutClickListener() } } @@ -1247,12 +1231,14 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter baseApiPollScheduler = ApiPollScheduler( doOnTimeout = onPollingEnd, - initialDelay = requestConfig?.initialDelay?.toLong() - ?: ApiPollScheduler.INITIAL_DELAY_FOR_API_POLL_SECONDS, - numberOfRetry = requestConfig?.numOfRetries - ?: ApiPollScheduler.API_POLL_RETRY_COUNT, - pollInterval = requestConfig?.interval?.toLong() - ?: ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS + initialDelay = + requestConfig?.initialDelay?.toLong() + ?: ApiPollScheduler.INITIAL_DELAY_FOR_API_POLL_SECONDS, + numberOfRetry = + requestConfig?.numOfRetries ?: ApiPollScheduler.API_POLL_RETRY_COUNT, + pollInterval = + requestConfig?.interval?.toLong() + ?: ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS ) { viewModel.checkApiPollStatus(requestId, type, true) } @@ -1283,15 +1269,9 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter selectedCtaData = ctaData } - override fun onPanItemTap( - showReviewScreen: Boolean?, - shouldAutoCapture: Boolean? - ) { - } + override fun onPanItemTap(showReviewScreen: Boolean?, shouldAutoCapture: Boolean?) {} - override fun onVideoKycItemTap( - ctaData: CtaData? - ) { + override fun onVideoKycItemTap(ctaData: CtaData?) { videoKycInit(ctaData) } @@ -1313,9 +1293,7 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter override fun onFooterBackPressed(backCta: CtaData?) { analyticsEventTracker.onBackButtonClicked(screenName) - backCta?.url?.let { - listener?.navigateTo(it, backCta.parameters?.toBundle()) - } + backCta?.url?.let { listener?.navigateTo(it, backCta.parameters?.toBundle()) } } override fun onKnowMoreClicked(cta: CtaData?) { @@ -1332,10 +1310,9 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter NaviTrackEvent.setStartTs(screenName) val item = - viewModel.kycDetailsLiveDataV2.value - ?.kycDetails - ?.kycItemList - ?.firstOrNull { it.selected } + viewModel.kycDetailsLiveDataV2.value?.kycDetails?.kycItemList?.firstOrNull { + it.selected + } val type = item?.kycType @@ -1346,10 +1323,7 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter KycItemType.PAN.name -> onPanItemTap() KycItemType.CURRENT_ADDRESS.name -> onAddressClicked() KycItemType.VIDEO_KYC.name -> onVideoKycItemTap(ctaData = item.cta) - KycItemType.VIDEO_KYC_WITHOUT_PAN.name -> onVideoKycItemTap( - ctaData = item.cta - ) - + KycItemType.VIDEO_KYC_WITHOUT_PAN.name -> onVideoKycItemTap(ctaData = item.cta) else -> onAddressClicked() } return @@ -1426,16 +1400,10 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter const val KYC_STATUS_POLLING_RETRY_COUNT = 5 const val KYC_STATUS_POLLING_INTERVAL = 3L - fun getInstance(bundle: Bundle?) = - KycV2Fragment().apply { arguments = bundle } + fun getInstance(bundle: Bundle?) = KycV2Fragment().apply { arguments = bundle } } override fun onBackPressed() { - NaviDeepLinkNavigator.navigate( - activity, - CtaData(url = HOME), - null, - clearTask = false - ) + NaviDeepLinkNavigator.navigate(activity, CtaData(url = HOME), null, clearTask = false) } -} \ No newline at end of file +} diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycVideoVerificationFragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycVideoVerificationFragment.kt index 4254d5fe47..bab6bc549f 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycVideoVerificationFragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycVideoVerificationFragment.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.pl.dynamic.fragment import android.annotation.SuppressLint @@ -83,12 +90,15 @@ class KycVideoVerificationFragment : VkycBaseFragment(), BackListener { kycListener = null } - private val errorScreenRetryListener: View.OnClickListener = View.OnClickListener { - /*no-op*/ - } + private val errorScreenRetryListener: View.OnClickListener = + View.OnClickListener { + /*no-op*/ + } override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? ): View { return ComposeView(requireContext()).apply { setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) @@ -100,10 +110,7 @@ class KycVideoVerificationFragment : VkycBaseFragment(), BackListener { networkVM.fetchNetworkSpeedInMBps(screenName) } RenderState(uiTronVm = viewModel) - LaunchedEffect(Unit) { - initObservers() - } - + LaunchedEffect(Unit) { initObservers() } } } } @@ -111,9 +118,7 @@ class KycVideoVerificationFragment : VkycBaseFragment(), BackListener { private fun initObservers() { viewModel.videoKycData.observeNullable(viewLifecycleOwner) { videoKycResponse -> hideLoader() - videoKycResponse?.url?.let { url -> - loadHyperVergeInWebView(url) - } + videoKycResponse?.url?.let { url -> loadHyperVergeInWebView(url) } } viewModel.videoKycStatusResponse.observeNonNull(this) { videoKycStatusResponse -> @@ -122,16 +127,13 @@ class KycVideoVerificationFragment : VkycBaseFragment(), BackListener { VideoKycStatusEnum.INCOMPLETE.name -> { analyticsEventTracker.onVideoKycCallbackInComplete() } - VideoKycStatusEnum.COMPLETE.name -> { analyticsEventTracker.onVideoKycCallbackComplete() checkVideoKycStatus() } - VideoKycStatusEnum.SCHEDULED.name -> { analyticsEventTracker.onVideoKycCallbackScheduled() } - else -> {} } } @@ -161,13 +163,11 @@ class KycVideoVerificationFragment : VkycBaseFragment(), BackListener { KycUiStatusValue.SOFT_REJECT.name -> { kycListener?.onKycFailure() } - KycUiStatusValue.IN_REVIEW.name, KycUiStatusValue.OSV_VERIFICATION_IN_PROGRESS.name, KycUiStatusValue.OSV_OPS_VERIFICATION_PENDING.name -> { navigateToKycInReviewScreen() } - KycUiStatusValue.COMPLETE.name -> { onBackPressed() } @@ -179,20 +179,19 @@ class KycVideoVerificationFragment : VkycBaseFragment(), BackListener { listener?.navigateTo( GetLoanV2Helper.KYC_IN_REVIEW, bundle = - Bundle().apply { - putString( - InReviewV2Fragment.TITLE, - resources.getString(R.string.kyc_verification_pending) - ) - putString( - InReviewV2Fragment.DESCRIPTION, - resources.getString(R.string.kyc_pending_description) - ) - } + Bundle().apply { + putString( + InReviewV2Fragment.TITLE, + resources.getString(R.string.kyc_verification_pending) + ) + putString( + InReviewV2Fragment.DESCRIPTION, + resources.getString(R.string.kyc_pending_description) + ) + } ) } - private fun checkVideoKycStatus() { showLoader() viewModel.videoKycData.value?.requestId?.let { @@ -202,7 +201,6 @@ class KycVideoVerificationFragment : VkycBaseFragment(), BackListener { } } - private fun firebaseInit(requestId: String, notificationPath: String) { baseFirebaseDataReceiveListener = object : FirebaseDataReceiveListener { @@ -228,12 +226,14 @@ class KycVideoVerificationFragment : VkycBaseFragment(), BackListener { baseApiPollScheduler = ApiPollScheduler( doOnTimeout = onPollingEnd, - numberOfRetry = requestConfig?.numOfRetries - ?: ApiPollScheduler.API_POLL_RETRY_COUNT, - initialDelay = requestConfig?.initialDelay?.toLong() - ?: ApiPollScheduler.INITIAL_DELAY_FOR_API_POLL_SECONDS, - pollInterval = requestConfig?.interval?.toLong() - ?: ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS + numberOfRetry = + requestConfig?.numOfRetries ?: ApiPollScheduler.API_POLL_RETRY_COUNT, + initialDelay = + requestConfig?.initialDelay?.toLong() + ?: ApiPollScheduler.INITIAL_DELAY_FOR_API_POLL_SECONDS, + pollInterval = + requestConfig?.interval?.toLong() + ?: ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS ) { viewModel.checkApiPollStatus(requestId, VIDEO_KYC) } @@ -253,12 +253,11 @@ class KycVideoVerificationFragment : VkycBaseFragment(), BackListener { baseFirebaseDataReceiveListener = null } - private fun handleFirebaseResult(status: String, type: String, isPolling: Boolean = true) { if ( TextUtils.equals(status, FirebaseStatusType.SUCCESS) || - TextUtils.equals(status, FirebaseStatusType.FAILURE) + TextUtils.equals(status, FirebaseStatusType.FAILURE) ) { deInitializeFirebaseListener() baseApiPollScheduler?.stopApiPoll() @@ -303,22 +302,24 @@ class KycVideoVerificationFragment : VkycBaseFragment(), BackListener { LaunchedEffect(Unit) { initError( viewModel, - actions = listOf( - Pair( - onVideoVerificationRetryClicked, - ApiErrorTagType.FETCH_VIDEO_VERIFICATION_RESPONSE + actions = + listOf( + Pair( + onVideoVerificationRetryClicked, + ApiErrorTagType.FETCH_VIDEO_VERIFICATION_RESPONSE + ), ), - ), actionErrorV2Enabled = true, dialogOnBackPressed = { activity?.finish() } ) } } - private val onVideoVerificationRetryClicked = View.OnClickListener { - showLoader() - viewModel.fetchVideoVerificationResponse() - } + private val onVideoVerificationRetryClicked = + View.OnClickListener { + showLoader() + viewModel.fetchVideoVerificationResponse() + } @Composable fun RenderState(uiTronVm: VideoKycVM) { @@ -341,11 +342,11 @@ class KycVideoVerificationFragment : VkycBaseFragment(), BackListener { is CtaAction -> { onCtaClick(ctaData = it.ctaData) } - is AnalyticsAction -> { it.eventName?.let { eventName -> NaviTrackEvent.trackEventOnClickStream( - eventName, it.eventProperties + eventName, + it.eventProperties ) } } @@ -377,18 +378,15 @@ class KycVideoVerificationFragment : VkycBaseFragment(), BackListener { INHOUSE_VENDOR_NAME -> { inHouseVKYCInit(vendorName) } - HYPERVERGE_VENDOR_NAME -> { videoKycInit(vendorName) } - else -> { analyticsEventTracker.onInvalidVendorReceived(vendorName) } } } - @SuppressLint("UnusedMaterialScaffoldPaddingParameter") @Composable fun RenderUiTronDataSecondary(state: ResponseState.Success) { @@ -411,34 +409,34 @@ class KycVideoVerificationFragment : VkycBaseFragment(), BackListener { Scaffold( bottomBar = { Column( - modifier = Modifier.padding( - horizontal = state.value.content?.additionalData?.pagePadding.orZero().dp, - vertical = state.value.content?.additionalData?.pagePadding.orZero().dp - ) + modifier = + Modifier.padding( + horizontal = + state.value.content?.additionalData?.pagePadding.orZero().dp, + vertical = state.value.content?.additionalData?.pagePadding.orZero().dp + ) ) { state.value.footer?.widgets?.forEach { uiTronResponse -> - UiTronRenderer( - uiTronResponse.data, viewModel - ).Render(composeViews = uiTronResponse.parentComposeView.orEmpty()) + UiTronRenderer(uiTronResponse.data, viewModel) + .Render(composeViews = uiTronResponse.parentComposeView.orEmpty()) } } }, ) { LazyColumn( - modifier = Modifier - .fillMaxHeight() - .padding( - start = state.value.content?.additionalData?.pagePadding.orZero().dp, - end = state.value.content?.additionalData?.pagePadding.orZero().dp, - top = it.calculateTopPadding(), - bottom = it.calculateBottomPadding(), - ) + modifier = + Modifier.fillMaxHeight() + .padding( + start = state.value.content?.additionalData?.pagePadding.orZero().dp, + end = state.value.content?.additionalData?.pagePadding.orZero().dp, + top = it.calculateTopPadding(), + bottom = it.calculateBottomPadding(), + ) ) { state.value.content?.widgets?.let { contentList -> items(contentList) { content -> - UiTronRenderer( - content.data, viewModel - ).Render(composeViews = content.parentComposeView.orEmpty()) + UiTronRenderer(content.data, viewModel) + .Render(composeViews = content.parentComposeView.orEmpty()) } } } @@ -457,8 +455,9 @@ class KycVideoVerificationFragment : VkycBaseFragment(), BackListener { const val TAG = NaviAnalytics.KYC_VIDEO_VERIFICATION const val FOOTER_NEXT_CLICK = "FOOTER_NEXT_CLICK" const val KEY_VKYC_VENDOR_NAME = "VKYC_VENDOR_NAME" + fun getInstance(bundle: Bundle? = null): KycVideoVerificationFragment { return KycVideoVerificationFragment().apply { this.arguments = bundle } } } -} \ No newline at end of file +} diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanDetailsEditorFragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanDetailsEditorFragment.kt index 4fd6ef1242..01ddcf54ef 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanDetailsEditorFragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanDetailsEditorFragment.kt @@ -120,7 +120,8 @@ class LoanDetailsEditorFragment : private fun initUI() { binding.footerListener = this binding.footerView.visibility = View.VISIBLE - binding.footer = Footer(nextCta = CtaData(title = resources.getString(com.navi.pay.R.string.confirm))) + binding.footer = + Footer(nextCta = CtaData(title = resources.getString(com.navi.pay.R.string.confirm))) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -278,8 +279,7 @@ class LoanDetailsEditorFragment : loanDetailsV2Response.footer?.uiTronFooter?.parentComposeView.orEmpty() ) } - } - ?: initUI() + } ?: initUI() } private fun openEmiCalendar(loanFeeDetailsRequest: LoanFeeDetailsRequest? = null) { @@ -417,12 +417,14 @@ class LoanDetailsEditorFragment : private fun apiPollInit(requestId: String?, type: String, requestConfig: RequestConfig?) { baseApiPollScheduler = ApiPollScheduler( - initialDelay = requestConfig?.initialDelay?.toLong() + initialDelay = + requestConfig?.initialDelay?.toLong() ?: PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS, - pollInterval = requestConfig?.interval?.toLong() + pollInterval = + requestConfig?.interval?.toLong() ?: ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS, - numberOfRetry = requestConfig?.numOfRetries - ?: ApiPollScheduler.API_POLL_RETRY_COUNT, + numberOfRetry = + requestConfig?.numOfRetries ?: ApiPollScheduler.API_POLL_RETRY_COUNT, doOnTimeout = ::onPollingEnd ) { viewModel.checkApiPollStatus(requestId.orEmpty(), type) diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanDetailsV2BaseFragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanDetailsV2BaseFragment.kt index 7e0adf170b..00c7eaf68b 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanDetailsV2BaseFragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanDetailsV2BaseFragment.kt @@ -7,7 +7,6 @@ package com.navi.pl.dynamic.fragment -import com.navi.common.R as CommonR import android.annotation.SuppressLint import android.view.View import android.webkit.WebChromeClient @@ -22,6 +21,7 @@ import com.navi.base.model.CtaData import com.navi.base.model.LineItem import com.navi.base.sharedpref.PreferenceManager import com.navi.base.utils.orZero +import com.navi.common.R as CommonR import com.navi.common.model.Money import com.navi.common.repo.NaviWebViewBridgeRepository import com.navi.common.ui.fragment.BaseFragment @@ -128,15 +128,12 @@ abstract class LoanDetailsV2BaseFragment : protected fun onHelpBottomSheet() { NaviDeepLinkNavigator.navigate( - activity = requireActivity(), ctaData = CtaData( - url = PRODUCT_HELP_PAGE, - parameters = listOf( - LineItem( - key = CRM_HELP_SCREEN_NAME, - value = screenName - ) + activity = requireActivity(), + ctaData = + CtaData( + url = PRODUCT_HELP_PAGE, + parameters = listOf(LineItem(key = CRM_HELP_SCREEN_NAME, value = screenName)) ) - ) ) } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanDetailsV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanDetailsV2Fragment.kt index 74320815e4..73631d98d9 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanDetailsV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanDetailsV2Fragment.kt @@ -79,6 +79,7 @@ import com.navi.pl.dynamic.helper.VKycHelper import com.navi.uitron.model.action.AnalyticsAction import com.navi.uitron.model.data.TextData import com.navi.uitron.render.UiTronRenderer +import com.navi.uitron.utils.getDataId import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.LoanTooltipSliderView @@ -159,10 +160,9 @@ import com.naviapp.utils.isValidEmail import com.naviapp.utils.pxToDp import com.naviapp.utils.rawToCtaData import com.naviapp.utils.setMargin -import com.navi.uitron.utils.getDataId +import java.lang.ref.WeakReference import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import java.lang.ref.WeakReference class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), @@ -297,8 +297,7 @@ class LoanDetailsV2Fragment : arguments?.getString(OFFER_ID)?.let { viewModel.setOfferId(it) fetchLoanDetailsResponse(it) - } - ?: run { fetchGenerateOffer() } + } ?: run { fetchGenerateOffer() } arguments?.getString(LOAN_APPLICATION_ID)?.let { viewModel.setLoanApplicationId(it) } @@ -348,8 +347,7 @@ class LoanDetailsV2Fragment : text = getAdditionalData()?.loanAmtSuffix?.text?.let { loanAmtSuffix -> if (!text.contains(loanAmtSuffix).orFalse()) "$text$loanAmtSuffix" else text - } - ?: text + } ?: text val snappedHeaderProps = viewModel.loanDetailsV2Response.value?.content?.additionalData?.snappedHeaderProps if (snappedHeaderProps != null) { @@ -470,10 +468,7 @@ class LoanDetailsV2Fragment : viewModel.selectedLoanAmount.value?.let { loanAmount -> sliderType?.let { sliderType -> reloadPage(loanAmount, firstEmiDate, sliderType, offerType) - } - ?: run { - reloadPage(loanAmount, firstEmiDate, SliderType.AMOUNT.name, offerType) - } + } ?: run { reloadPage(loanAmount, firstEmiDate, SliderType.AMOUNT.name, offerType) } } } } @@ -513,13 +508,11 @@ class LoanDetailsV2Fragment : } else { "${description.text}" } - } - ?: run { "${description.text}" } + } ?: run { "${description.text}" } } else { additionData?.loanAmtPrefix?.text?.let { "${additionData.loanAmtPrefix?.text} $sliderAmount" - } - ?: run { "$sliderAmount" } + } ?: run { "$sliderAmount" } } additionData?.loanAmtSuffix?.text?.let { @@ -595,7 +588,9 @@ class LoanDetailsV2Fragment : viewModel.loanDetailsV2Response.observeNonNull(viewLifecycleOwner) { loanDetailURL = it.content?.additionalData?.webViewUrl ?: "" offerType = it.content?.additionalData?.loanOfferType - viewModel.setIsUserConsentRequired(it.content?.additionalData?.isNfsPrivacyAndTermsConsentRequired) + viewModel.setIsUserConsentRequired( + it.content?.additionalData?.isNfsPrivacyAndTermsConsentRequired + ) it.content?.additionalData?.widthComputation = widgetWithType if (isWebView()) { loanDetailsEventTracker.onLoanFeeDetailReceived( @@ -694,8 +689,7 @@ class LoanDetailsV2Fragment : } else -> handleNextCta(ctaData) } - } - ?: run { hideLoader() } + } ?: run { hideLoader() } viewModel.setApplyLoanCtaType(null) viewModel.setReloadPageStatus(false) } @@ -718,11 +712,10 @@ class LoanDetailsV2Fragment : observeKycStatus() } - private fun handleFooterClickResponse(viewState: GenericResponseState) { when (viewState) { is GenericResponseState.Init -> {} - is GenericResponseState.Error-> { + is GenericResponseState.Error -> { hideLoader() } is GenericResponseState.Loading -> { @@ -928,8 +921,7 @@ class LoanDetailsV2Fragment : loanDetailsV2Response.footer?.uiTronFooter?.parentComposeView.orEmpty() ) } - } - ?: enableTitleDescriptionFooter(loanDetailsV2Response) + } ?: enableTitleDescriptionFooter(loanDetailsV2Response) } private fun enableTitleDescriptionFooter(loanDetailsV2Response: LoanDetailsV2Response) { @@ -992,7 +984,8 @@ class LoanDetailsV2Fragment : ): LoanRequest { return LoanRequest( offerId = id, - loanAmount = additionalData?.emiCalculationLoanAmount + loanAmount = + additionalData?.emiCalculationLoanAmount ?: if (viewModel.selectedLoanAmount.value == 0.0) additionalData?.loanAmount else toMoney(viewModel.selectedLoanAmount.value), emiAmount = @@ -1082,12 +1075,14 @@ class LoanDetailsV2Fragment : } baseApiPollScheduler = ApiPollScheduler( - initialDelay = requestConfig?.initialDelay?.toLong() + initialDelay = + requestConfig?.initialDelay?.toLong() ?: PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS, - pollInterval = requestConfig?.interval?.toLong() + pollInterval = + requestConfig?.interval?.toLong() ?: ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS, - numberOfRetry = requestConfig?.numOfRetries - ?: ApiPollScheduler.API_POLL_RETRY_COUNT, + numberOfRetry = + requestConfig?.numOfRetries ?: ApiPollScheduler.API_POLL_RETRY_COUNT, doOnTimeout = onPollingEnd ) { viewModel.checkApiPollStatus(requestId.orEmpty(), type) @@ -1194,7 +1189,11 @@ class LoanDetailsV2Fragment : } } - private fun statusHandling(status: String, requestId: String?, isErrorBottomSheetRequired: Boolean = true) { + private fun statusHandling( + status: String, + requestId: String?, + isErrorBottomSheetRequired: Boolean = true + ) { if ( TextUtils.equals(status, FirebaseStatusType.SUCCESS) || TextUtils.equals(status, FirebaseStatusType.FAILURE) @@ -1202,7 +1201,7 @@ class LoanDetailsV2Fragment : deInitializeAsyncListeners() if (TextUtils.equals(status, FirebaseStatusType.FAILURE) || requestId == null) { hideLoader() - if(isErrorBottomSheetRequired){ + if (isErrorBottomSheetRequired) { handleTimeOutError(errorTag.orEmpty()) } } @@ -1463,7 +1462,7 @@ class LoanDetailsV2Fragment : ?.isEmailWidgetVisible if ( isEmailWidgetVisible.orFalse() && - (viewModel.getCustomerEmailId().isNullOrEmpty() || + (viewModel.getCustomerEmailId().isNullOrEmpty() || !viewModel.getCustomerEmailId()?.trim().isValidEmail()) ) { binding.loanDetailsRv.addOnScrollListener(onScrollListener) @@ -1493,6 +1492,7 @@ class LoanDetailsV2Fragment : } } } + private fun applyLoanForLoanAgreement() { showLoader() applyLoan( @@ -1800,7 +1800,7 @@ class LoanDetailsV2Fragment : onFooterNextPress(ctaData) } CtaType.DOWNLOAD_FILE.value -> { - downloadFile(ctaData,screenName) + downloadFile(ctaData, screenName) } LoanAmountSummaryView.FOOTER_BOTTOM_SHEET_CLICK -> { openFooterBottomSheetCta(ctaData.parameters) diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanOfferUpgradeV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanOfferUpgradeV2Fragment.kt index 8eed66cc24..6e5201984c 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanOfferUpgradeV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanOfferUpgradeV2Fragment.kt @@ -53,7 +53,9 @@ class LoanOfferUpgradeV2Fragment : BaseFragment(), View.OnClickListener, FooterViewV2.FooterInteractionListener, BackListener { private lateinit var binding: FragmentLoanOfferUpgradeV2Binding private val viewModel by lazy { ViewModelProvider(this).get(LoanOfferUpgradeVM::class.java) } - private val analyticsEventTracker by lazy { NaviAnalytics.naviAnalytics.LoanOfferUpgrade(screenName) } + private val analyticsEventTracker by lazy { + NaviAnalytics.naviAnalytics.LoanOfferUpgrade(screenName) + } private var listener: FragmentInteractionListener? = null private val ctaQueryMap = HashMap() private var headerListener: NaviHeaderView.InteractionListener? = null @@ -94,7 +96,7 @@ class LoanOfferUpgradeV2Fragment : ctaQueryMap[Constants.KEY_CURRENT_SCREEN] = GetLoanActivity.BANK_DETAILS_SCREEN } } - if(arguments?.getBoolean(ONE_STEP_JOURNEY,false)== true){ + if (arguments?.getBoolean(ONE_STEP_JOURNEY, false) == true) { ctaQueryMap[FLOW_TYPE] = PL_ONE_STEP_JOURNEY } } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanOfferUpgradeV3Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanOfferUpgradeV3Fragment.kt index 0bbb5ed425..79fdc554c5 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanOfferUpgradeV3Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanOfferUpgradeV3Fragment.kt @@ -28,6 +28,7 @@ import com.navi.common.utils.ctaParamsToBundle import com.navi.naviwidgets.extensions.showWhenDataIsAvailable import com.navi.pl.dynamic.helper.GetLoanV2Helper import com.navi.uitron.model.data.TextData +import com.navi.uitron.utils.getDataId import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.NaviHeaderView @@ -51,20 +52,20 @@ import com.naviapp.personalloanrevamp.states.OfferUpgradeResponseState import com.naviapp.utils.Constants import com.naviapp.utils.Constants.ACTION import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY -import com.navi.uitron.utils.getDataId import kotlinx.coroutines.launch class LoanOfferUpgradeV3Fragment : - BaseFragment(), View.OnClickListener, BackListener, - FooterWithDescriptionListener { + BaseFragment(), View.OnClickListener, BackListener, FooterWithDescriptionListener { private lateinit var binding: PlFragmentLoanOfferUpgradeV3Binding - private val viewModel by lazy { ViewModelProvider(this).get(LoanOfferUpgradeV3FragmentVM::class.java) } + private val viewModel by lazy { + ViewModelProvider(this).get(LoanOfferUpgradeV3FragmentVM::class.java) + } private val analyticsEventTracker by lazy { NaviAnalytics.naviAnalytics.LoanOfferUpgrade() } private var listener: FragmentInteractionListener? = null private val ctaQueryMap = HashMap() private var headerListener: NaviHeaderView.InteractionListener? = null private var loanOfferType: String? = null - private var offerUpgradeTimerCount:Int = 0 + private var offerUpgradeTimerCount: Int = 0 override fun onCreateView( inflater: LayoutInflater, @@ -74,14 +75,11 @@ class LoanOfferUpgradeV3Fragment : binding = PlFragmentLoanOfferUpgradeV3Binding.inflate(inflater, container, false) initQueryMapFromCtaParameters() readBundle() - initError(viewModel, actionErrorV2Enabled = true, - actions = - listOf( - Pair( - handleOfferUpgradeFailure, - ApiErrorTagType.OFFER_UPGRADE_FAILURE - ) - )) + initError( + viewModel, + actionErrorV2Enabled = true, + actions = listOf(Pair(handleOfferUpgradeFailure, ApiErrorTagType.OFFER_UPGRADE_FAILURE)) + ) initObservers() fetchOfferUpgradeDetails() return binding.root @@ -90,12 +88,9 @@ class LoanOfferUpgradeV3Fragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { viewLifecycleOwner.lifecycleScope.launch { viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.getActionCallback().collect { - uiTronAction-> + viewModel.getActionCallback().collect { uiTronAction -> if (uiTronAction is CtaAction) { - uiTronAction.ctaData?.let { - onCtaClick(ctaData = it) - } + uiTronAction.ctaData?.let { onCtaClick(ctaData = it) } } } } @@ -103,9 +98,8 @@ class LoanOfferUpgradeV3Fragment : } private val handleOfferUpgradeFailure: View.OnClickListener = - View.OnClickListener { - fetchOfferUpgradeDetails() - } + View.OnClickListener { fetchOfferUpgradeDetails() } + private fun fetchOfferUpgradeDetails() { showLoader() viewModel.fetchOfferUpgradeV3Details(ctaQueryMap) @@ -132,11 +126,15 @@ class LoanOfferUpgradeV3Fragment : private fun initObservers() { viewLifecycleOwner.lifecycleScope.launchWhenCreated { launch { - viewModel.offerUpgradeV3ResponseState.collect { viewState-> + viewModel.offerUpgradeV3ResponseState.collect { viewState -> when (viewState) { is OfferUpgradeResponseState.Init -> {} - is OfferUpgradeResponseState.Loading -> {showLoader()} - is OfferUpgradeResponseState.Failure -> {hideLoader()} + is OfferUpgradeResponseState.Loading -> { + showLoader() + } + is OfferUpgradeResponseState.Failure -> { + hideLoader() + } is OfferUpgradeResponseState.Success -> { hideLoader() @@ -148,14 +146,13 @@ class LoanOfferUpgradeV3Fragment : initFooter(offerUpgradeResponse) sendOfferImprovementCardEvents(offerUpgradeResponse) offerUpgradeResponse.content?.popUpInfo?.let { - displayOfferDialog( - it - ) + displayOfferDialog(it) } offerUpgradeResponse.content?.centerDialog?.let { centerDialog -> displayOfferDialog(centerDialog) } - val uiTronTimerConfig = offerUpgradeResponse.content?.uiTronTimerConfig?.firstOrNull() + val uiTronTimerConfig = + offerUpgradeResponse.content?.uiTronTimerConfig?.firstOrNull() uiTronTimerConfig?.let { startUpgradedLoanAmountAnimation(uiTronTimerConfig) } @@ -175,36 +172,35 @@ class LoanOfferUpgradeV3Fragment : val layoutId = uiTronTimerConfig.layoutId if (totalTime > 0 && remainingTime > 0) { offerUpgradeTimerCount = 0 - val countDownTimer = object : CountDownTimer( - totalTime, - remainingTime - ) { - override fun onTick(millisUntilFinished: Long) { - if (values.isNullOrEmpty() - .not() && offerUpgradeTimerCount < values?.size.orZero() - ) { - val value = values?.get(offerUpgradeTimerCount) - value?.let { - layoutId?.let { - viewModel.handle[layoutId.getDataId()] = TextData(value) + val countDownTimer = + object : CountDownTimer(totalTime, remainingTime) { + override fun onTick(millisUntilFinished: Long) { + if ( + values.isNullOrEmpty().not() && + offerUpgradeTimerCount < values?.size.orZero() + ) { + val value = values?.get(offerUpgradeTimerCount) + value?.let { + layoutId?.let { + viewModel.handle[layoutId.getDataId()] = TextData(value) + } } + offerUpgradeTimerCount++ } - offerUpgradeTimerCount++ } - } - override fun onFinish() { - if (values.isNullOrEmpty().not()) { - val value = values?.last() - value?.let { - layoutId?.let { - viewModel.handle[layoutId.getDataId()] = TextData(value) + override fun onFinish() { + if (values.isNullOrEmpty().not()) { + val value = values?.last() + value?.let { + layoutId?.let { + viewModel.handle[layoutId.getDataId()] = TextData(value) + } } } + offerUpgradeTimerCount = 0 } - offerUpgradeTimerCount = 0 } - } countDownTimer.start() } } @@ -214,41 +210,43 @@ class LoanOfferUpgradeV3Fragment : widgets?.let { binding.offerUpgradeRv.adapter?.let { (binding.offerUpgradeRv.adapter as? LoanDetailsV2WidgetAdapter)?.updateData( - widgetConfigList = widgets, null + widgetConfigList = widgets, + null ) - } ?: run { - binding.offerUpgradeRv.adapter = - LoanDetailsV2WidgetAdapter( - widgetConfigList = widgets, - viewHolderFactory = LoanDetailsV2VHFactoryImpl(viewModel) - ) } + ?: run { + binding.offerUpgradeRv.adapter = + LoanDetailsV2WidgetAdapter( + widgetConfigList = widgets, + viewHolderFactory = LoanDetailsV2VHFactoryImpl(viewModel) + ) + } } } private fun initFooter(offerUpgradeResponse: LoanOfferUpgradeV3Response) { - offerUpgradeResponse.footer?.let { - footer-> + offerUpgradeResponse.footer?.let { footer -> binding.btnFooterWithShimmer.setProperties( footer = footer, footerWithDescriptionListener = this, - customClickConfig = CustomClickConfig( - type = CustomClickType.RAGE_TAP.name, - eventName = NaviAnalytics.PL_LOAN_OFFER_NEXT_CLICK - ) + customClickConfig = + CustomClickConfig( + type = CustomClickType.RAGE_TAP.name, + eventName = NaviAnalytics.PL_LOAN_OFFER_NEXT_CLICK + ) ) binding.btnFooterWithShimmer.visibility = View.VISIBLE - }?: run { - binding.btnFooterWithShimmer.visibility = View.GONE - offerUpgradeResponse.content?.logo?.let { imageFieldData -> - binding.finservLogoIv.apply { - this.visibility = View.VISIBLE - this.showWhenDataIsAvailable(imageFieldData.url) - } - - } } + ?: run { + binding.btnFooterWithShimmer.visibility = View.GONE + offerUpgradeResponse.content?.logo?.let { imageFieldData -> + binding.finservLogoIv.apply { + this.visibility = View.VISIBLE + this.showWhenDataIsAvailable(imageFieldData.url) + } + } + } } private fun initHeader(offerUpgradeResponse: LoanOfferUpgradeV3Response) { @@ -268,14 +266,11 @@ class LoanOfferUpgradeV3Fragment : private fun sendOfferImprovementCardEvents(offerUpgradeResponse: LoanOfferUpgradeV3Response) { val offerUpgradeCardList = mutableListOf() offerUpgradeResponse.content?.let { offerUpgradeDetails -> - offerUpgradeDetails.offerImprovementCardsList?.forEachIndexed { index, element - -> + offerUpgradeDetails.offerImprovementCardsList?.forEachIndexed { index, element -> if (element.verified.orFalse()) { analyticsEventTracker.onOfferImprovementVerified(element.title) } - element.title?.let { - offerUpgradeCardList.add(it) - } + element.title?.let { offerUpgradeCardList.add(it) } } analyticsEventTracker.sendOfferTypeCards(offerUpgradeCardList.toList()) } @@ -287,11 +282,11 @@ class LoanOfferUpgradeV3Fragment : requireActivity(), ctaData = ctaData, bundle = - Bundle().apply { - putBoolean(Constants.IS_COMING_FROM_OFFER_UPGRADE_PAGE, true) - putString(Constants.EPFO_PAGE_TYPE, Constants.OFFER_UPGRADE) - putString(Constants.FLOW_TYPE, Constants.OFFER_UPGRADE_FLOW) - } + Bundle().apply { + putBoolean(Constants.IS_COMING_FROM_OFFER_UPGRADE_PAGE, true) + putString(Constants.EPFO_PAGE_TYPE, Constants.OFFER_UPGRADE) + putString(Constants.FLOW_TYPE, Constants.OFFER_UPGRADE_FLOW) + } ) } @@ -394,9 +389,7 @@ class LoanOfferUpgradeV3Fragment : } } - override fun onFooterDescriptionPress(type: String?, data: Any?, subType: String?) { - - } + override fun onFooterDescriptionPress(type: String?, data: Any?, subType: String?) {} override fun onFooterNextPress(ctaData: CtaData?) { onFooterNextPressed(ctaData) diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanSummaryV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanSummaryV2Fragment.kt index fa6cc611e0..46a0f8d6a9 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanSummaryV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanSummaryV2Fragment.kt @@ -7,7 +7,6 @@ package com.navi.pl.dynamic.fragment -import com.navi.naviwidgets.R as WidgetsR import android.content.Context import android.os.Bundle import android.view.LayoutInflater @@ -42,6 +41,7 @@ import com.navi.common.utils.log import com.navi.common.utils.observeNonNull import com.navi.common.utils.observeNullable import com.navi.common.utils.toBundle +import com.navi.naviwidgets.R as WidgetsR import com.navi.naviwidgets.base.BaseInputWidget import com.navi.naviwidgets.callbacks.WidgetCallback import com.navi.naviwidgets.databinding.LayoutRewardsInfoBinding diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/MFIConsentV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/MFIConsentV2Fragment.kt index d913744172..c4aa7a9599 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/MFIConsentV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/MFIConsentV2Fragment.kt @@ -38,7 +38,9 @@ class MFIConsentV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListe private val viewModel by lazy { ViewModelProvider(requireActivity()).get(MfiConsentVM::class.java) } - private val naviAnalyticsEventTracker by lazy { NaviAnalytics.naviAnalytics.MFIConsent(screenName) } + private val naviAnalyticsEventTracker by lazy { + NaviAnalytics.naviAnalytics.MFIConsent(screenName) + } private var fragmentListener: FragmentInteractionListener? = null private var headerListener: NaviHeaderView.InteractionListener? = null diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/MFIErrorFragmentV2.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/MFIErrorFragmentV2.kt index c8777456bf..789dd7d9be 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/MFIErrorFragmentV2.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/MFIErrorFragmentV2.kt @@ -118,8 +118,7 @@ class MFIErrorFragmentV2 : BaseFragment(), WidgetCallback { if (it == ZERO) { errorScreenEvent.onRejectionExpiryInZeroDays(screenName) } - } - ?: run { binding.layoutTryAgainAfter.rootLayout.visibility = View.GONE } + } ?: run { binding.layoutTryAgainAfter.rootLayout.visibility = View.GONE } setIcon(error?.humanReadableContent?.iconCode) error?.humanReadableContent?.reasons?.let { @@ -198,9 +197,7 @@ class MFIErrorFragmentV2 : BaseFragment(), WidgetCallback { imageBannerData.cta?.let { ctaData -> ctaData.metaData?.clickedData?.let { NaviTrackEvent.trackEvent(it.eventName.orEmpty()) - } ?: kotlin.run { - creditAssignmentAnalytics.creditAssignmentBannerClicked() - } + } ?: kotlin.run { creditAssignmentAnalytics.creditAssignmentBannerClicked() } NaviDeepLinkNavigator.navigate(activity, ctaData) } } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/MFIInfoV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/MFIInfoV2Fragment.kt index e69731d365..6f8e79a679 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/MFIInfoV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/MFIInfoV2Fragment.kt @@ -14,6 +14,7 @@ import android.view.View import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider import com.navi.base.utils.underLineText +import com.navi.common.model.common.Header import com.navi.common.ui.fragment.BaseFragment import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics @@ -21,7 +22,6 @@ import com.naviapp.common.customview.NaviHeaderView import com.naviapp.dashboard.listeners.FragmentInteractionListener import com.naviapp.databinding.IconTextLineItemBinding import com.naviapp.databinding.MfiInfoV2FragmentBinding -import com.navi.common.model.common.Header import com.naviapp.models.response.HouseHoldIncomeContent import com.naviapp.models.response.IncomeItem import com.naviapp.personalloan.intermediate.mfiinfo.viewmodel.MfiInfoVM @@ -123,6 +123,7 @@ class MFIInfoV2Fragment : BaseFragment() { companion object { const val TAG = "INCOME_INFO_V2" + fun newInstance() = MFIInfoV2Fragment() } } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/NaviWebViewClient.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/NaviWebViewClient.kt index 27d15c3de5..3d4173f456 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/NaviWebViewClient.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/NaviWebViewClient.kt @@ -39,9 +39,7 @@ class NaviWebViewClient( val url = request?.url?.toString() ?: "" if (url.isNotEmpty() && (url.endsWith(".js") || url.endsWith(".css"))) { return runBlocking(Dispatchers.IO) { - val result = lifecycleScope.async { - repository.fetchWebViewData(url) - } + val result = lifecycleScope.async { repository.fetchWebViewData(url) } val response = result.await()?.body() if (response != null && response.isNotEmpty()) { val encoding = "UTF-8" @@ -65,8 +63,10 @@ class NaviWebViewClient( super.onPageFinished(view, url) (context as? Callback)?.onWebViewPageFinished() } + interface Callback { fun onWebViewPageFinished() + fun onWebViewError(failingUrl: String?) } } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/OfferInReviewFragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/OfferInReviewFragment.kt index fe718b72aa..f37becdabe 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/OfferInReviewFragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/OfferInReviewFragment.kt @@ -55,9 +55,12 @@ import com.naviapp.utils.setVisibilityState import kotlinx.coroutines.delay import kotlinx.coroutines.launch - -class OfferInReviewFragment : BaseFragment(), FooterViewV2.FooterInteractionListener, - WidgetCallback, LoanDetailsV2WidgetAdapterListener, BackListener { +class OfferInReviewFragment : + BaseFragment(), + FooterViewV2.FooterInteractionListener, + WidgetCallback, + LoanDetailsV2WidgetAdapterListener, + BackListener { private lateinit var binding: FragmentOfferInReviewBinding @@ -68,13 +71,12 @@ class OfferInReviewFragment : BaseFragment(), FooterViewV2.FooterInteractionList private var sharedViewModel: EligibilityShareVM? = null private val analyticsEventTracker by lazy { - NaviAnalytics.naviAnalytics.PLOfferInReviewScreen( - screenName - ) + NaviAnalytics.naviAnalytics.PLOfferInReviewScreen(screenName) } override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, + inflater: LayoutInflater, + container: ViewGroup?, savedInstanceState: Bundle? ): View { binding = FragmentOfferInReviewBinding.inflate(inflater, container, false) @@ -94,9 +96,7 @@ class OfferInReviewFragment : BaseFragment(), FooterViewV2.FooterInteractionList } private fun initSharedViewModel() { - activity?.let { - sharedViewModel = ViewModelProvider(it)[EligibilityShareVM::class.java] - } + activity?.let { sharedViewModel = ViewModelProvider(it)[EligibilityShareVM::class.java] } } private fun handleUiTronWidgetActionCallback() { @@ -134,7 +134,9 @@ class OfferInReviewFragment : BaseFragment(), FooterViewV2.FooterInteractionList binding.response = offerInReviewData setWidgetData(offerInReviewData.inReviewData?.widgets) setSuccessTimerCardProperties(offerInReviewData.inReviewData?.additionalData?.toastCard) - setFooterProperties(offerInReviewData.inReviewData?.additionalData?.dataSafetyBottomSheet) + setFooterProperties( + offerInReviewData.inReviewData?.additionalData?.dataSafetyBottomSheet + ) } } @@ -163,10 +165,7 @@ class OfferInReviewFragment : BaseFragment(), FooterViewV2.FooterInteractionList hideLoader() if (sharedViewModel?.finoramicData?.value?.status.orFalse()) { postFinoramic.ctaData?.let { ctaData -> - NaviDeepLinkNavigator.navigate( - activity, - ctaData = ctaData - ) + NaviDeepLinkNavigator.navigate(activity, ctaData = ctaData) } } } @@ -182,22 +181,26 @@ class OfferInReviewFragment : BaseFragment(), FooterViewV2.FooterInteractionList private fun setWidgetData(widgets: List?) { widgets?.let { widgetList -> - binding.offerInReviewWidgetsRv.adapter = LoanDetailsV2WidgetAdapter( - widgetConfigList = widgetList, - listener = this, - viewHolderFactory = LoanDetailsV2VHFactoryImpl(viewModel), - widgetCallback = this - ) + binding.offerInReviewWidgetsRv.adapter = + LoanDetailsV2WidgetAdapter( + widgetConfigList = widgetList, + listener = this, + viewHolderFactory = LoanDetailsV2VHFactoryImpl(viewModel), + widgetCallback = this + ) } } private fun setSuccessTimerCardProperties(textFieldIconTimerData: TextFieldIconTimerData?) { textFieldIconTimerData?.let { data -> binding.apply { - successTimerLl.background = getNaviDrawable( - cornerRadius = dpToPxInInt(data.backgroundDrawableData?.cornerRadius.orElse(16)), - backgroundColor = data.backgroundDrawableData?.backgroundColor.parseColorSafe() - ) + successTimerLl.background = + getNaviDrawable( + cornerRadius = + dpToPxInInt(data.backgroundDrawableData?.cornerRadius.orElse(16)), + backgroundColor = + data.backgroundDrawableData?.backgroundColor.parseColorSafe() + ) iconIv.setOnClickListener { if (binding.successTimerLl.isVisible) { binding.successTimerLl.setVisibilityState(View.GONE) @@ -214,17 +217,12 @@ class OfferInReviewFragment : BaseFragment(), FooterViewV2.FooterInteractionList private fun setFooterProperties(dataSafetyBottomSheet: InfoBottomSheetConfig?) { binding.footerListener = this - dataSafetyBottomSheet?.let { - binding.footerView.showDataSafetyHeader() - } + dataSafetyBottomSheet?.let { binding.footerView.showDataSafetyHeader() } } override fun onFooterContinuePressed(cta: CtaData?) { cta?.let { ctaData -> - NaviDeepLinkNavigator.navigate( - activity = activity, - ctaData = ctaData - ) + NaviDeepLinkNavigator.navigate(activity = activity, ctaData = ctaData) } } @@ -237,29 +235,26 @@ class OfferInReviewFragment : BaseFragment(), FooterViewV2.FooterInteractionList GMAIL_CARD -> handleGmailCardClickAction() else -> { ctaData?.let { cta -> - NaviDeepLinkNavigator.navigate( - activity = activity, - ctaData = cta - ) + NaviDeepLinkNavigator.navigate(activity = activity, ctaData = cta) } } } } private fun handleGmailCardClickAction() { - viewModel.offerInReviewData.value?.inReviewData?.additionalData?.finoramicData?.let { finoramicData -> + viewModel.offerInReviewData.value?.inReviewData?.additionalData?.finoramicData?.let { + finoramicData -> context?.let { context -> val finoramicHelper = FinoramicHelper() finoramicHelper.init(finoramicData, context) analyticsEventTracker.onFinoramicInitialized() - val intent = finoramicHelper.getGoogleSignIn( - context, - FinoramicHelper.FINORAMIC_REDIRECT_PATH_V2, - finoramicData.fetchStatement.orEmpty() - ) - intent?.let { - startActivityForResult(it, FinoramicHelper.FINORAMIC_REQ_CODE) - } + val intent = + finoramicHelper.getGoogleSignIn( + context, + FinoramicHelper.FINORAMIC_REDIRECT_PATH_V2, + finoramicData.fetchStatement.orEmpty() + ) + intent?.let { startActivityForResult(it, FinoramicHelper.FINORAMIC_REQ_CODE) } } } } @@ -276,10 +271,14 @@ class OfferInReviewFragment : BaseFragment(), FooterViewV2.FooterInteractionList } override fun onKnowMoreClicked(cta: CtaData?) { - viewModel.offerInReviewData.value?.inReviewData?.additionalData?.dataSafetyBottomSheet?.let { infoBottomSheetConfig -> - val infoBottomSheet = InformationBottomSheet.getInstance(infoBottomSheetConfig) - safelyShowBottomSheet(infoBottomSheet, InformationBottomSheet.TAG) - } + viewModel.offerInReviewData.value + ?.inReviewData + ?.additionalData + ?.dataSafetyBottomSheet + ?.let { infoBottomSheetConfig -> + val infoBottomSheet = InformationBottomSheet.getInstance(infoBottomSheetConfig) + safelyShowBottomSheet(infoBottomSheet, InformationBottomSheet.TAG) + } } override fun onFooterBackPressed(backCta: CtaData?) {} @@ -297,12 +296,10 @@ class OfferInReviewFragment : BaseFragment(), FooterViewV2.FooterInteractionList private fun initError() { initError( - viewModel = viewModel, actionErrorV2Enabled = true, actions = listOf( - Pair( - handleOfferInReviewFailure, - ApiErrorTagType.OFFER_IN_REVIEW_FAILED - ) - ) + viewModel = viewModel, + actionErrorV2Enabled = true, + actions = + listOf(Pair(handleOfferInReviewFailure, ApiErrorTagType.OFFER_IN_REVIEW_FAILED)) ) } @@ -335,8 +332,7 @@ class OfferInReviewFragment : BaseFragment(), FooterViewV2.FooterInteractionList private const val SHOW_TOAST_CARD = "showToastCard" private const val DISMISS_TOAST_CARD_AFTER_DELAY = 3000L - fun getInstance(bundle: Bundle?): OfferInReviewFragment = OfferInReviewFragment().apply { - arguments = bundle - } + fun getInstance(bundle: Bundle?): OfferInReviewFragment = + OfferInReviewFragment().apply { arguments = bundle } } } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/OfferUpgradeInfoBottomSheet.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/OfferUpgradeInfoBottomSheet.kt index 440151c013..079f2c57c6 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/OfferUpgradeInfoBottomSheet.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/OfferUpgradeInfoBottomSheet.kt @@ -48,8 +48,6 @@ class OfferUpgradeInfoBottomSheet : BaseBottomSheet() { safelyDismissDialog() _cta.value = binding.binder?.footerCta?.cta } - - } private fun initData() { @@ -60,13 +58,14 @@ class OfferUpgradeInfoBottomSheet : BaseBottomSheet() { } private fun setCtaView(bottomSheetContent: BottomSheetContent) { - setCtaBackground(binding.nextCta,bottomSheetContent.nextCta) - setCtaBackground(binding.footerCta,bottomSheetContent.footerCta) + setCtaBackground(binding.nextCta, bottomSheetContent.nextCta) + setCtaBackground(binding.footerCta, bottomSheetContent.footerCta) } - private fun setCtaBackground(naviTextView: NaviTextView,ctaHeaderConfig: CtaHeaderConfig?) { + private fun setCtaBackground(naviTextView: NaviTextView, ctaHeaderConfig: CtaHeaderConfig?) { ctaHeaderConfig?.let { - var backgroundColor = ResourcesCompat.getColor(resources, R.color.outrageous_orange, null) + var backgroundColor = + ResourcesCompat.getColor(resources, R.color.outrageous_orange, null) if (it.backgroundColor.isNullOrEmpty().not() && isValidHexColor(it.backgroundColor)) { backgroundColor = android.graphics.Color.parseColor(it.backgroundColor) } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/PanVerificationBottomSheet.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/PanVerificationBottomSheet.kt index 7d40961b12..2021fdccea 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/PanVerificationBottomSheet.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/PanVerificationBottomSheet.kt @@ -46,18 +46,24 @@ class PanVerificationBottomSheet : BaseBottomSheet() { private fun LinearLayout.setItemData(items: List?) { removeAllViews() items?.forEach { itemData -> - val view = LayoutInflater.from(context) - .inflate(R.layout.pl_layout_title_with_description_view, binding.container, false) + val view = + LayoutInflater.from(context) + .inflate( + R.layout.pl_layout_title_with_description_view, + binding.container, + false + ) val itemBinding: PlLayoutTitleWithDescriptionViewBinding? = DataBindingUtil.bind(view) - itemBinding?.title?.let { setStyledText(it,itemData.title,null) } - itemBinding?.leftText?.let { setStyledText(it,itemData.leftText,null) } - itemBinding?.rightText?.let { setStyledText(it,itemData.rightText,null) } - itemBinding?.descriptionCl?.background = getNaviDrawable( - strokeColor = itemData.borderColor.parseColorSafe(), - backgroundColor = itemData.bgColor.parseColorSafe(), - strokeWidth = itemData.borderWidth, - cornerRadius = dpToPxInInt(itemData.radius.orZero()) - ) + itemBinding?.title?.let { setStyledText(it, itemData.title, null) } + itemBinding?.leftText?.let { setStyledText(it, itemData.leftText, null) } + itemBinding?.rightText?.let { setStyledText(it, itemData.rightText, null) } + itemBinding?.descriptionCl?.background = + getNaviDrawable( + strokeColor = itemData.borderColor.parseColorSafe(), + backgroundColor = itemData.bgColor.parseColorSafe(), + strokeWidth = itemData.borderWidth, + cornerRadius = dpToPxInInt(itemData.radius.orZero()) + ) itemBinding?.descriptionCl?.setOnClickListener { itemData.cta?.let { ctaData -> NaviDeepLinkNavigator.navigate(activity, ctaData) } } @@ -71,11 +77,13 @@ class PanVerificationBottomSheet : BaseBottomSheet() { companion object { const val TAG = "PAN_VERIFICATION_BOTTOMSHEET" const val KEY_DATA = "KEY_DATA" - fun getInstance(panVerificationBottomSheetData: PanVerificationBottomSheetData): PanVerificationBottomSheet { + + fun getInstance( + panVerificationBottomSheetData: PanVerificationBottomSheetData + ): PanVerificationBottomSheet { return PanVerificationBottomSheet().apply { - arguments = Bundle().apply { - putParcelable(KEY_DATA, panVerificationBottomSheetData) - } + arguments = + Bundle().apply { putParcelable(KEY_DATA, panVerificationBottomSheetData) } } } } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/PlUitronKycBottomSheetFragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/PlUitronKycBottomSheetFragment.kt index cbf495c296..887b65df52 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/PlUitronKycBottomSheetFragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/PlUitronKycBottomSheetFragment.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.pl.dynamic.fragment import android.annotation.SuppressLint @@ -30,28 +37,25 @@ class PlUitronKycBottomSheetFragment : BaseBottomSheet() { private lateinit var binding: UitronBottomsheetLayoutBinding private var bottomSheetClickListener: BottomSheetClickListener? = null - private val uiTronBottomSheetVM by lazy { ViewModelProvider(requireActivity())[VideoKycVM::class.java] } + private val uiTronBottomSheetVM by lazy { + ViewModelProvider(requireActivity())[VideoKycVM::class.java] + } fun setBottomSheetClickListener(bottomSheetClickListener: BottomSheetClickListener) { this.bottomSheetClickListener = bottomSheetClickListener } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val dialogData = arguments?.getParcelable(KEY_DIALOG_DATA) - dialogData?.let { - uiTronBottomSheetVM.init(it) - } + dialogData?.let { uiTronBottomSheetVM.init(it) } } override fun setContainerView(viewStub: ViewStub) { viewStub.layoutResource = appR.layout.uitron_bottomsheet_layout setEventNameToLatencyMapper(Constants.PL_SCREEN_ACTIVITY, queryMap[Constants.ACTION]) binding = DataBindingUtil.getBinding(viewStub.inflate())!! - binding.composeView.setContent { - RenderState(uiTronVm = uiTronBottomSheetVM) - } + binding.composeView.setContent { RenderState(uiTronVm = uiTronBottomSheetVM) } viewLifecycleOwner.lifecycleScope.launch { uiTronBottomSheetVM.getActionCallback().collect { @@ -72,7 +76,6 @@ class PlUitronKycBottomSheetFragment : BaseBottomSheet() { ) } } - else -> { if (bottomSheetClickListener != null) { it.ctaData?.let { ctaData -> @@ -103,7 +106,8 @@ class PlUitronKycBottomSheetFragment : BaseBottomSheet() { fun RenderState(uiTronVm: VideoKycVM) { when (val state = uiTronVm.dialogStateFlow.collectAsState().value) { is DialogState.DialogResponseAvailableState -> RenderUiTronDataSecondary(state = state) - else -> { /* Do nothing */ + else -> { + /* Do nothing */ } } } @@ -138,4 +142,4 @@ class PlUitronKycBottomSheetFragment : BaseBottomSheet() { } } } -} \ No newline at end of file +} diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/ProfileV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/ProfileV2Fragment.kt index 87fd2d42d3..e3b480aaeb 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/ProfileV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/ProfileV2Fragment.kt @@ -7,8 +7,6 @@ package com.navi.pl.dynamic.fragment -import com.navi.common.R as CommonR -import com.navi.naviwidgets.R as WidgetsR import android.app.Activity import android.content.Context import android.os.Bundle @@ -43,6 +41,7 @@ import com.navi.base.sharedpref.PreferenceManager import com.navi.base.utils.isNotNullAndNotEmpty import com.navi.base.utils.orFalse import com.navi.base.utils.orTrue +import com.navi.common.R as CommonR import com.navi.common.listeners.FragmentInterchangeListener import com.navi.common.model.UserDetail import com.navi.common.ui.fragment.BaseFragment @@ -53,6 +52,7 @@ import com.navi.common.utils.observeNullable import com.navi.design.editview.NaviEditText import com.navi.design.utils.doAnimate import com.navi.design.utils.ifMeasured +import com.navi.naviwidgets.R as WidgetsR import com.navi.naviwidgets.base.BaseInputWidget import com.navi.naviwidgets.extensions.textChanges import com.navi.naviwidgets.widgets.labledtextinput.ui.LabeledTextInputWidgetV2 @@ -92,10 +92,10 @@ import com.naviapp.utils.EMPTY_DATE_STRING import com.naviapp.utils.convertDpToPx import com.naviapp.utils.customToast import com.naviapp.utils.getLocationOnScreen +import java.util.Locale import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import java.util.Locale class ProfileV2Fragment : BaseFragment(), @@ -109,7 +109,9 @@ class ProfileV2Fragment : private lateinit var binding: PlFragmentProfileV2Binding private val viewModel by lazy { ViewModelProvider(this)[ProfileVM::class.java] } private var listener: FragmentInterchangeListener? = null - private val naviAnalyticsEventTracker by lazy { NaviAnalytics.naviAnalytics.Profile(screenName) } + private val naviAnalyticsEventTracker by lazy { + NaviAnalytics.naviAnalytics.Profile(screenName) + } private var finoramicHelper: FinoramicHelper? = null private var prevPage: String = EMPTY private var sharedViewModel: EligibilityShareVM? = null @@ -151,13 +153,9 @@ class ProfileV2Fragment : } } - private val handleFetchProfileError = OnClickListener { - fetchProfileData() - } + private val handleFetchProfileError = OnClickListener { fetchProfileData() } - private val handleSendProfileDataError = OnClickListener { - submitProfileDetails() - } + private val handleSendProfileDataError = OnClickListener { submitProfileDetails() } private fun fetchProfileData() { showLoader() @@ -205,10 +203,10 @@ class ProfileV2Fragment : binding.footerView.setInteractionListener( this, customClickConfig = - CustomClickConfig( - type = CustomClickType.RAGE_TAP.name, - eventName = NaviAnalytics.PL_BASIC_DETAILS_NEXT_CLICK - ) + CustomClickConfig( + type = CustomClickType.RAGE_TAP.name, + eventName = NaviAnalytics.PL_BASIC_DETAILS_NEXT_CLICK + ) ) } data.content?.finoramicStatus?.let { finoramicStatus -> @@ -221,11 +219,7 @@ class ProfileV2Fragment : description = getString(R.string.gmail_account_synced) } binding.googleLay.apply { - setData( - description, - uploadStatus, - finoramicStatus.iconCode - ) + setData(description, uploadStatus, finoramicStatus.iconCode) setListener(this@ProfileV2Fragment) } } ?: run { binding.googleLay.visibility = GONE } @@ -238,11 +232,8 @@ class ProfileV2Fragment : } } } - it?.content?.dateOfBirth?.let { - viewModel.updateDob(false) - } ?: run { - viewModel.updateDob(true) - } + it?.content?.dateOfBirth?.let { viewModel.updateDob(false) } + ?: run { viewModel.updateDob(true) } enableDataSafetyHeader() } } @@ -291,11 +282,11 @@ class ProfileV2Fragment : private fun observeDobNumberValidity() { viewModel.dobValidationState.observeNonNull(viewLifecycleOwner) { when (it) { - ValidationState.IS_EMPTY -> setErrorProperties( - binding.dobLt, - getString(R.string.please_enter_date_of_birth) - ) - + ValidationState.IS_EMPTY -> + setErrorProperties( + binding.dobLt, + getString(R.string.please_enter_date_of_birth) + ) ValidationState.IS_INVALID -> { val minAge = viewModel.profileDataResponse.value?.content?.minAge ?: PL_MIN_AGE val maxAge = viewModel.profileDataResponse.value?.content?.maxAge ?: PL_MAX_AGE @@ -305,7 +296,6 @@ class ProfileV2Fragment : resources.getString(R.string.wrong_dob_age_range, minAge, maxAge) ) } - else -> {} // Do Nothing } } @@ -314,18 +304,15 @@ class ProfileV2Fragment : private fun observeFirstNameValidity() { viewModel.firstNameValidationState.observeNonNull(viewLifecycleOwner) { when (it) { - ValidationState.IS_EMPTY -> setErrorProperties( - binding.fullNameLt, - getString(R.string.please_enter_full_name) - ) - ValidationState.IS_INVALID -> setErrorProperties( - binding.fullNameLt, - getString(R.string.enter_valid_name) - ) - ValidationState.IS_SMALLER_THAN_MIN_LENGTH -> setErrorProperties( - binding.fullNameLt, - getString(R.string.enter_valid_name) - ) + ValidationState.IS_EMPTY -> + setErrorProperties( + binding.fullNameLt, + getString(R.string.please_enter_full_name) + ) + ValidationState.IS_INVALID -> + setErrorProperties(binding.fullNameLt, getString(R.string.enter_valid_name)) + ValidationState.IS_SMALLER_THAN_MIN_LENGTH -> + setErrorProperties(binding.fullNameLt, getString(R.string.enter_valid_name)) else -> {} // Do Nothing } } @@ -334,16 +321,16 @@ class ProfileV2Fragment : private fun observePanNumberValidity() { viewModel.panNumberValidationState.observeNonNull(viewLifecycleOwner) { when (it) { - ValidationState.IS_EMPTY -> setErrorProperties( - binding.panNumberLt, - getString(R.string.please_enter_your_PAN_number) - ) - - ValidationState.IS_INVALID -> setErrorProperties( - binding.panNumberLt, - resources.getString(R.string.enter_a_valid_pan_number) - ) - + ValidationState.IS_EMPTY -> + setErrorProperties( + binding.panNumberLt, + getString(R.string.please_enter_your_PAN_number) + ) + ValidationState.IS_INVALID -> + setErrorProperties( + binding.panNumberLt, + resources.getString(R.string.enter_a_valid_pan_number) + ) else -> {} // Do Nothing } } @@ -363,12 +350,7 @@ class ProfileV2Fragment : } if (uploadStatus) { description = getString(R.string.gmail_account_synced) - binding.googleLay.apply { - setData( - description, - uploadStatus - ) - } + binding.googleLay.apply { setData(description, uploadStatus) } } } @@ -399,9 +381,7 @@ class ProfileV2Fragment : setEventNameToLatencyMapper(PL_SCREEN_ACTIVITY, queryMap[ACTION]) } - private fun onProfileSubmissionResponse( - nextCta: String? = null - ) { + private fun onProfileSubmissionResponse(nextCta: String? = null) { saveUser() val bundle = Bundle() nextCta?.let { @@ -411,9 +391,10 @@ class ProfileV2Fragment : bundle.putString(Constants.EPFO_PAGE_TYPE, Constants.SEGMENT) fragmentInterchangeListener?.navigateToNextScreenWithCaching(it, bundle) } - } ?: viewModel.profileDataResponse.value?.footer?.nextCta?.url?.let { - fragmentInterchangeListener?.navigateToNextScreenWithCaching(it, bundle) } + ?: viewModel.profileDataResponse.value?.footer?.nextCta?.url?.let { + fragmentInterchangeListener?.navigateToNextScreenWithCaching(it, bundle) + } } private fun saveUser() { @@ -461,8 +442,7 @@ class ProfileV2Fragment : start: Int, count: Int, after: Int - ) { - } + ) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { debounceTextChanged(binding.dobLt.widgetBinding.dateInput) @@ -484,8 +464,7 @@ class ProfileV2Fragment : start: Int, count: Int, after: Int - ) { - } + ) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { debounceTextChanged(binding.dobLt.widgetBinding.monthInput) @@ -507,8 +486,7 @@ class ProfileV2Fragment : start: Int, count: Int, after: Int - ) { - } + ) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { debounceTextChanged(binding.dobLt.widgetBinding.yearInput) @@ -523,14 +501,16 @@ class ProfileV2Fragment : } private fun debounceTextChanged(editText: NaviEditText) { - editText.textChanges().debounce(200).onEach { - onDobChange() - }.launchIn(lifecycleScope) + editText.textChanges().debounce(200).onEach { onDobChange() }.launchIn(lifecycleScope) } private fun onDobChange() { val name = binding.fullNameLt.widgetBinding.plainTextInput.text.toString() - if (viewModel.isDobEmpty.value == true && viewModel.profileDataResponse.value?.content?.panPrefilled == true && name.isNotNullAndNotEmpty()) { + if ( + viewModel.isDobEmpty.value == true && + viewModel.profileDataResponse.value?.content?.panPrefilled == true && + name.isNotNullAndNotEmpty() + ) { submitPanRequestData(name) } viewModel.updateDob(false) @@ -717,8 +697,8 @@ class ProfileV2Fragment : binding.panTooltipView.ifMeasured { val x = binding.panNumberLt.binding.info.getLocationOnScreen().x - - binding.panTooltipView.width / 2.0f + - binding.panNumberLt.binding.info.width / 2.0f + binding.panTooltipView.width / 2.0f + + binding.panNumberLt.binding.info.width / 2.0f binding.panTooltipView.doAnimate(x = x) } } @@ -761,14 +741,12 @@ class ProfileV2Fragment : private fun validateProfileDetails(): Boolean { var validated = true viewModel.validateFirstName(binding.fullNameLt.getUserInput().toString().trim()) - if (viewModel.firstNameValidationState.value != ValidationState.IS_VALID) - validated = false + if (viewModel.firstNameValidationState.value != ValidationState.IS_VALID) validated = false val isDobEnabled = viewModel.profileDataResponse.value?.content?.showDOB.orFalse() if (isDobEnabled || viewModel.profileDataResponse.value?.content?.panPrefilled == true) { viewModel.validateDob(binding.dobLt.getUserInput().toString().trim()) - if (viewModel.dobValidationState.value != ValidationState.IS_VALID) - validated = false + if (viewModel.dobValidationState.value != ValidationState.IS_VALID) validated = false } val isPanNumberEnabled = @@ -851,12 +829,14 @@ class ProfileV2Fragment : private fun finoramicSignIn() { context?.let { ctx -> try { - viewModel.profileDataResponse.value?.content?.finoramicStatus?.finoramicData?.let { finoramicData -> - val intent = finoramicHelper?.getGoogleSignIn( - ctx, - FINORAMIC_REDIRECT_PATH_V2, - finoramicData.fetchStatement.orEmpty() - ) + viewModel.profileDataResponse.value?.content?.finoramicStatus?.finoramicData?.let { + finoramicData -> + val intent = + finoramicHelper?.getGoogleSignIn( + ctx, + FINORAMIC_REDIRECT_PATH_V2, + finoramicData.fetchStatement.orEmpty() + ) resultLauncher.launch(intent) naviAnalyticsEventTracker.onFinoramicSignStart(screenName) } @@ -901,9 +881,7 @@ class ProfileV2Fragment : override fun onBackPressed() { naviAnalyticsEventTracker.onBackButtonClicked( - arguments?.getString( - UserIdentificationV2Activity.CURRENT_SCREEN_NAME - ) ?: screenName + arguments?.getString(UserIdentificationV2Activity.CURRENT_SCREEN_NAME) ?: screenName ) NaviDeepLinkNavigator.navigate( activity = activity, diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/StyledTitleDescriptionBottomSheet.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/StyledTitleDescriptionBottomSheet.kt index 165748380c..28904d2423 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/StyledTitleDescriptionBottomSheet.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/StyledTitleDescriptionBottomSheet.kt @@ -57,9 +57,14 @@ class StyledTitleDescriptionBottomSheet : BaseBottomSheet() { private const val KEY_DATA = "KEY_DATA" const val TAG = "STYLED_TITLE_DESCRIPTION_BOTTOM_SHEET" - fun getInstance(styledTitleDescriptionBottomSheetConfig: StyledTitleDescriptionBottomSheetConfig): StyledTitleDescriptionBottomSheet { + fun getInstance( + styledTitleDescriptionBottomSheetConfig: StyledTitleDescriptionBottomSheetConfig + ): StyledTitleDescriptionBottomSheet { return StyledTitleDescriptionBottomSheet().apply { - arguments = Bundle().apply { putParcelable(KEY_DATA, styledTitleDescriptionBottomSheetConfig) } + arguments = + Bundle().apply { + putParcelable(KEY_DATA, styledTitleDescriptionBottomSheetConfig) + } } } } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/TelcoOtpV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/TelcoOtpV2Fragment.kt index dd7b7e32b5..9dc290610b 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/TelcoOtpV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/TelcoOtpV2Fragment.kt @@ -7,7 +7,6 @@ package com.navi.pl.dynamic.fragment -import com.navi.design.R as DesignR import android.content.Context import android.content.IntentFilter import android.os.Bundle @@ -29,6 +28,7 @@ import com.navi.common.ui.fragment.BaseFragment import com.navi.common.utils.deviceId import com.navi.common.utils.observeNonNull import com.navi.common.utils.observeNullable +import com.navi.design.R as DesignR import com.navi.design.font.FontWeightEnum import com.navi.design.utils.getFontStyle import com.navi.design.utils.getNaviDrawable @@ -230,7 +230,12 @@ class TelcoOtpV2Fragment : hideLoader() if (response?.success.orFalse()) { viewModel.telcoDetails.value?.footer?.nextCta?.let { - NaviDeepLinkNavigator.navigate(activity, it, true, bundle = arguments ?: Bundle()) + NaviDeepLinkNavigator.navigate( + activity, + it, + true, + bundle = arguments ?: Bundle() + ) } } else { binding.errorMsgOtpTv.text = resources.getString(R.string.enter_correct_otp) @@ -286,7 +291,9 @@ class TelcoOtpV2Fragment : override fun onFooterBackPressed(backCta: CtaData?) { naviAnalyticsEventTracker.onBackButtonClicked(screenName) naviAnalyticsEventTracker.onSkipStepClick() - backCta?.let { NaviDeepLinkNavigator.navigate(activity, it, true, bundle = arguments ?: Bundle()) } + backCta?.let { + NaviDeepLinkNavigator.navigate(activity, it, true, bundle = arguments ?: Bundle()) + } } override fun onFooterNextPressed(nextCta: CtaData?) { @@ -298,6 +305,7 @@ class TelcoOtpV2Fragment : companion object { const val TAG = "TelcoOtpV2Fragment" + fun getInstance(bundle: Bundle?): TelcoOtpV2Fragment { return TelcoOtpV2Fragment().apply { arguments = bundle } } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/TopupLoanIntroV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/TopupLoanIntroV2Fragment.kt index b782230279..443eb8abe4 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/TopupLoanIntroV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/TopupLoanIntroV2Fragment.kt @@ -18,15 +18,15 @@ import androidx.lifecycle.lifecycleScope import com.moengage.pushbase.internal.ACTION import com.navi.base.model.CtaData import com.navi.base.utils.isNotNull +import com.navi.common.model.common.Header import com.navi.common.ui.fragment.BaseFragment import com.navi.naviwidgets.models.response.Footer import com.navi.naviwidgets.utils.NaviWidgetIconUtils import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.NaviHeaderView +import com.naviapp.common.listeners.BackListener import com.naviapp.common.navigator.NaviDeepLinkNavigator import com.naviapp.databinding.PlFragmentTopupLoanIntroV2Binding -import com.navi.common.model.common.Header -import com.naviapp.common.listeners.BackListener import com.naviapp.models.response.TopupInfoViewAdditionalData import com.naviapp.personalloan.factory.LoanDetailsV2VHFactoryImpl import com.naviapp.personalloanrevamp.getloanRevamp.adapters.LoanDetailsV2WidgetAdapter @@ -43,7 +43,7 @@ import com.naviapp.utils.IntentConstants.ON_DEMAND_TOP_UP_OFFER_TYPE import com.naviapp.utils.IntentConstants.TOP_UP_INTRO import kotlinx.coroutines.launch -class TopupLoanIntroV2Fragment : BaseFragment(), LoanDetailsV2WidgetAdapterListener,BackListener { +class TopupLoanIntroV2Fragment : BaseFragment(), LoanDetailsV2WidgetAdapterListener, BackListener { private lateinit var binding: PlFragmentTopupLoanIntroV2Binding private var headerListener: NaviHeaderView.InteractionListener? = null @@ -52,7 +52,8 @@ class TopupLoanIntroV2Fragment : BaseFragment(), LoanDetailsV2WidgetAdapterListe private var offerType: String? = null override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, + inflater: LayoutInflater, + container: ViewGroup?, savedInstanceState: Bundle? ): View? { binding = PlFragmentTopupLoanIntroV2Binding.inflate(inflater) @@ -82,11 +83,7 @@ class TopupLoanIntroV2Fragment : BaseFragment(), LoanDetailsV2WidgetAdapterListe onDemandTopUpOfferBalance ) } - launch { - viewModel.topupLoanResponseStateFlow.collect { - setViewState(it) - } - } + launch { viewModel.topupLoanResponseStateFlow.collect { setViewState(it) } } } setEventNameToLatencyMapper(PL_SCREEN_ACTIVITY, queryMap[ACTION]) } @@ -96,25 +93,19 @@ class TopupLoanIntroV2Fragment : BaseFragment(), LoanDetailsV2WidgetAdapterListe is TopupLoanDetailState.Loading -> { showLoader() } - is TopupLoanDetailState.Success -> { hideLoader() processHeader(viewState.data?.header) processContent(viewState.data?.content) processFooter(viewState.data?.footer) } - is TopupLoanDetailState.Error -> {} } } private fun processHeader(headerData: Header?) { headerData?.let { - headerListener?.setProperties( - it.title.orEmpty(), - it.leftIconCode, - it.infoCta - ) + headerListener?.setProperties(it.title.orEmpty(), it.leftIconCode, it.infoCta) } } @@ -131,19 +122,19 @@ class TopupLoanIntroV2Fragment : BaseFragment(), LoanDetailsV2WidgetAdapterListe ) } else { (binding.topupRv.adapter as? LoanDetailsV2WidgetAdapter)?.updateData( - widgetConfigList = it, topupInfoViewAdditionalData + widgetConfigList = it, + topupInfoViewAdditionalData ) } } if (contentData?.footerTimedBanner.isNotNull()) { binding.bannerCl.visibility = View.VISIBLE binding.styledTextTimeCardData = contentData?.footerTimedBanner - binding.bannerCl.setBackgroundColor(Color.parseColor(contentData?.footerTimedBanner?.bgColor)) + binding.bannerCl.setBackgroundColor( + Color.parseColor(contentData?.footerTimedBanner?.bgColor) + ) contentData?.footerTimedBanner?.iconCode?.let { - NaviWidgetIconUtils.updateIcon( - it, - binding.bannerIcon - ) + NaviWidgetIconUtils.updateIcon(it, binding.bannerIcon) } } else { binding.bannerCl.visibility = View.GONE @@ -166,6 +157,7 @@ class TopupLoanIntroV2Fragment : BaseFragment(), LoanDetailsV2WidgetAdapterListe companion object { const val TAG = "TopupLoanIntroV2Fragment" const val INTRO = "_INTRO" + fun getInstance(bundle: Bundle?): TopupLoanIntroV2Fragment { return TopupLoanIntroV2Fragment().apply { arguments = bundle } } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/TrueCallerAuthenticatorFragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/TrueCallerAuthenticatorFragment.kt index a475b49127..c3611af156 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/TrueCallerAuthenticatorFragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/TrueCallerAuthenticatorFragment.kt @@ -7,7 +7,6 @@ package com.navi.pl.dynamic.fragment -import com.navi.design.R as DesignR import android.content.Context import android.content.IntentFilter import android.os.Bundle @@ -26,6 +25,7 @@ import com.navi.common.receiver.OtpReceiveListener import com.navi.common.receiver.SmsAutoReadReceiver import com.navi.common.ui.fragment.BaseFragment import com.navi.common.utils.observeNullable +import com.navi.design.R as DesignR import com.navi.design.font.FontWeightEnum import com.navi.design.utils.getFontStyle import com.navi.design.utils.getNaviDrawable @@ -266,6 +266,7 @@ class TrueCallerAuthenticatorFragment : BaseFragment(), View.OnClickListener, Ba companion object { const val TAG = "TrueCallerAuthenticatorScreen" + fun getInstance(bundle: Bundle?): TrueCallerAuthenticatorFragment { return TrueCallerAuthenticatorFragment().apply { arguments = bundle } } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/UPIProgressBlockerFragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/UPIProgressBlockerFragment.kt index 78bfa0ac73..f51be92535 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/UPIProgressBlockerFragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/UPIProgressBlockerFragment.kt @@ -49,9 +49,7 @@ import com.naviapp.utils.LOAN_APPLICATION_ID class UPIProgressBlockerFragment : BaseFragment() { private var binding: PlFragmentUpiProgressBlockerBinding? = null - private val viewModel by lazy { - ViewModelProvider(this)[BankDetailsAutoDebitVM::class.java] - } + private val viewModel by lazy { ViewModelProvider(this)[BankDetailsAutoDebitVM::class.java] } private var listener: FragmentInteractionListener? = null private var headerListener: NaviHeaderView.InteractionListener? = null @@ -117,13 +115,14 @@ class UPIProgressBlockerFragment : BaseFragment() { StatusCheckRegistrationData( mandateRefId = enachSharedVM.mandateRefId.value, provider = ProviderType.DIGIO, - digioPayload = DigioPayload( - mandateId = it.mandateId, - status = it.status, - mandateType = it.mandateType, - successPayload = it.successPayload, - failurePayload = it.failurePayload - ) + digioPayload = + DigioPayload( + mandateId = it.mandateId, + status = it.status, + mandateType = it.mandateType, + successPayload = it.successPayload, + failurePayload = it.failurePayload + ) ) ) enachSharedVM.setEnachStatusCompleteData(null) @@ -179,23 +178,25 @@ class UPIProgressBlockerFragment : BaseFragment() { Gson().fromJson(details, AutoDebitMandateDetails::class.java) if ( autoDebitMandateDetails?.autoDebitRegistrationStatus == - AutoPayStatus.AADHAR_PENDING.name || - firebaseStatus?.autoDebitRegistrationStatus == - AutoPayStatus.AADHAR_PENDING.name + AutoPayStatus.AADHAR_PENDING.name || + firebaseStatus?.autoDebitRegistrationStatus == + AutoPayStatus.AADHAR_PENDING.name ) { setAutoDebitState(AutoPayStatus.AADHAR_PENDING.name) return } else showAutoPaySuccessAnimation() - } ?: run { - if (autoDebitMandateDetails?.autoDebitRegistrationStatus == - AutoPayStatus.AADHAR_PENDING.name - ) { - setAutoDebitState(AutoPayStatus.AADHAR_PENDING.name) - return - } else { - showAutoPaySuccessAnimation() - } } + ?: run { + if ( + autoDebitMandateDetails?.autoDebitRegistrationStatus == + AutoPayStatus.AADHAR_PENDING.name + ) { + setAutoDebitState(AutoPayStatus.AADHAR_PENDING.name) + return + } else { + showAutoPaySuccessAnimation() + } + } } FirebaseStatusType.FAILURE -> { baseFirebaseDataHelper?.clear() @@ -207,14 +208,10 @@ class UPIProgressBlockerFragment : BaseFragment() { private fun setAutoDebitState(autoDebitStatus: String) { when (autoDebitStatus) { - FirebaseStatusType.SUCCESS -> naviAnalyticsEventTracker.onMandateSetupEvent( - PL_UPI_MANDATE_SUCCESS - ) - - FirebaseStatusType.FAILURE -> naviAnalyticsEventTracker.onMandateSetupEvent( - PL_UPI_MANDATE_FAILURE - ) - + FirebaseStatusType.SUCCESS -> + naviAnalyticsEventTracker.onMandateSetupEvent(PL_UPI_MANDATE_SUCCESS) + FirebaseStatusType.FAILURE -> + naviAnalyticsEventTracker.onMandateSetupEvent(PL_UPI_MANDATE_FAILURE) AutoPayStatus.AADHAR_PENDING.name -> naviAnalyticsEventTracker.onAutoDebitAadharMandatePending() } @@ -230,9 +227,7 @@ class UPIProgressBlockerFragment : BaseFragment() { private fun observeEnachStatus() { activity?.let { activity -> - enachSharedVM.autoPayAnimationListener.observe(viewLifecycleOwner) { - gotoGetLoan() - } + enachSharedVM.autoPayAnimationListener.observe(viewLifecycleOwner) { gotoGetLoan() } enachSharedVM.enachStatus.observeNonNull(this) { enachStatusData -> when (enachStatusData.status) { FirebaseStatusType.SUCCESS -> { @@ -242,18 +237,21 @@ class UPIProgressBlockerFragment : BaseFragment() { MANDATE_COMPLETE, viewModel.notificationPath.value.orEmpty() ) - apiPollInit(it, MANDATE_COMPLETE , enachStatusData.requestConfig) + apiPollInit(it, MANDATE_COMPLETE, enachStatusData.requestConfig) } } FirebaseStatusType.FAILURE -> { naviAnalyticsEventTracker.onAutoDebitApiFailure() setAutoDebitState(FirebaseStatusType.FAILURE) - if (enachSharedVM.enachStatusData.value?.code != BankDetailsAutoDebitV2Fragment.EMANDATE_CANCEL_CODE_FOR_UPI - && enachSharedVM.enachStatusData.value?.code != BankDetailsAutoDebitV2Fragment.EMANDATE_CANCEL_CODE_ENACH + if ( + enachSharedVM.enachStatusData.value?.code != + BankDetailsAutoDebitV2Fragment.EMANDATE_CANCEL_CODE_FOR_UPI && + enachSharedVM.enachStatusData.value?.code != + BankDetailsAutoDebitV2Fragment.EMANDATE_CANCEL_CODE_ENACH ) { enachStatusData.requestId?.let { showLoader() - apiPollInit(it, MANDATE_FAILURE , enachStatusData.requestConfig) + apiPollInit(it, MANDATE_FAILURE, enachStatusData.requestConfig) } } else { navigateToBankDetailsAutoDebit() @@ -261,7 +259,7 @@ class UPIProgressBlockerFragment : BaseFragment() { // sending status details to server if ( loanApplicationId.isNullOrBlank().not() && - enachSharedVM.enachStatusData.value != null + enachSharedVM.enachStatusData.value != null ) viewModel.updateEnachStatusDetail( loanApplicationId.orEmpty(), @@ -303,15 +301,19 @@ class UPIProgressBlockerFragment : BaseFragment() { ) } - - private fun apiPollInit(requestId: String, type: String , requestConfig: RequestConfig? = null) { + private fun apiPollInit(requestId: String, type: String, requestConfig: RequestConfig? = null) { when (type) { MANDATE_FAILURE -> { baseApiPollScheduler = ApiPollScheduler( initialDelay = requestConfig?.initialDelay?.toLong() ?: ZERO.toLong(), - numberOfRetry = requestConfig?.numOfRetries ?: BankDetailsAutoDebitV2Fragment.NUMBER_OF_RETRY_MANDATE_FAILURE_STATUS, - pollInterval = requestConfig?.interval?.toLong() ?: ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS, + numberOfRetry = + requestConfig?.numOfRetries + ?: BankDetailsAutoDebitV2Fragment + .NUMBER_OF_RETRY_MANDATE_FAILURE_STATUS, + pollInterval = + requestConfig?.interval?.toLong() + ?: ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS, doOnTimeout = { activity?.runOnUiThread { hideLoader() @@ -326,9 +328,15 @@ class UPIProgressBlockerFragment : BaseFragment() { else -> { baseApiPollScheduler = ApiPollScheduler( - initialDelay = requestConfig?.initialDelay?.toLong() ?: Constants.PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS, - numberOfRetry = requestConfig?.numOfRetries ?: BankDetailsAutoDebitV2Fragment.NUMBER_OF_RETRY_MANDATE_STATUS, - pollInterval = requestConfig?.interval?.toLong() ?: ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS, + initialDelay = + requestConfig?.initialDelay?.toLong() + ?: Constants.PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS, + numberOfRetry = + requestConfig?.numOfRetries + ?: BankDetailsAutoDebitV2Fragment.NUMBER_OF_RETRY_MANDATE_STATUS, + pollInterval = + requestConfig?.interval?.toLong() + ?: ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS, doOnTimeout = { activity?.runOnUiThread { hideLoader() @@ -346,12 +354,8 @@ class UPIProgressBlockerFragment : BaseFragment() { private fun navigateToBankDetailsAutoDebit() { if (isAdded) { val bundle = arguments - bundle?.putString(Constants.PERSONAL_LOAN_APPLICATION_ID, - loanApplicationId) - listener?.navigateTo( - GetLoanV2Helper.BANK_DETAILS_AUTO_DEBIT_V2, - bundle - ) + bundle?.putString(Constants.PERSONAL_LOAN_APPLICATION_ID, loanApplicationId) + listener?.navigateTo(GetLoanV2Helper.BANK_DETAILS_AUTO_DEBIT_V2, bundle) } } @@ -367,7 +371,6 @@ class UPIProgressBlockerFragment : BaseFragment() { listener = null } - companion object { const val TAG = NaviAnalytics.UPI_PROGRESS_BLOCKER_FRAGMENT } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/UiTronCommonErrorFragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/UiTronCommonErrorFragment.kt index 2c559c7a6b..e2ea5a63cc 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/UiTronCommonErrorFragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/UiTronCommonErrorFragment.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.pl.dynamic.fragment import android.annotation.SuppressLint @@ -50,7 +57,9 @@ class UiTronCommonErrorFragment : BaseFragment(), BackListener { private var headerListener: NaviHeaderView.InteractionListener? = null override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? ): View { kycRejectionReason = arguments?.getString(REJECTION_CODE) return ComposeView(requireContext()).apply { @@ -98,11 +107,11 @@ class UiTronCommonErrorFragment : BaseFragment(), BackListener { is CtaAction -> { onCtaClick(ctaData = it.ctaData) } - is AnalyticsAction -> { it.eventName?.let { eventName -> NaviTrackEvent.trackEventOnClickStream( - eventName, it.eventProperties + eventName, + it.eventProperties ) } } @@ -111,16 +120,11 @@ class UiTronCommonErrorFragment : BaseFragment(), BackListener { } } } - } private fun onCtaClick(ctaData: CtaData? = null) { ctaData?.let { - NaviDeepLinkNavigator.navigate( - activity = activity, - ctaData = ctaData, - finish = true - ) + NaviDeepLinkNavigator.navigate(activity = activity, ctaData = ctaData, finish = true) } } @@ -143,33 +147,27 @@ class UiTronCommonErrorFragment : BaseFragment(), BackListener { Scaffold( bottomBar = { - Column( - modifier = Modifier.padding( - horizontal = 16.dp, vertical = 16.dp - ) - ) { + Column(modifier = Modifier.padding(horizontal = 16.dp, vertical = 16.dp)) { state.value.footer?.widgets?.forEach { uiTronResponse -> - UiTronRenderer( - uiTronResponse.data, viewModel - ).Render(composeViews = uiTronResponse.parentComposeView.orEmpty()) + UiTronRenderer(uiTronResponse.data, viewModel) + .Render(composeViews = uiTronResponse.parentComposeView.orEmpty()) } } }, ) { Column( - modifier = Modifier - .padding( - start = 16.dp, - end = 16.dp, - top = it.calculateTopPadding(), - bottom = it.calculateBottomPadding(), - ) - .fillMaxHeight() + modifier = + Modifier.padding( + start = 16.dp, + end = 16.dp, + top = it.calculateTopPadding(), + bottom = it.calculateBottomPadding(), + ) + .fillMaxHeight() ) { state.value.content?.widgets?.forEach { uiTronResponse -> - UiTronRenderer( - uiTronResponse.data, viewModel - ).Render(composeViews = uiTronResponse.parentComposeView.orEmpty()) + UiTronRenderer(uiTronResponse.data, viewModel) + .Render(composeViews = uiTronResponse.parentComposeView.orEmpty()) } } } @@ -180,7 +178,6 @@ class UiTronCommonErrorFragment : BaseFragment(), BackListener { headerListener = context as? NaviHeaderView.InteractionListener } - override val screenName: String get() = NaviAnalytics.UI_TRON_COMMON_ERROR @@ -190,8 +187,9 @@ class UiTronCommonErrorFragment : BaseFragment(), BackListener { companion object { const val TAG = NaviAnalytics.UI_TRON_COMMON_ERROR + fun getInstance(bundle: Bundle? = null): UiTronCommonErrorFragment { return UiTronCommonErrorFragment().apply { this.arguments = bundle } } } -} \ No newline at end of file +} diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/UpcomingEmiDetailsV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/UpcomingEmiDetailsV2Fragment.kt index 50a838d3bb..7b69e9ef66 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/UpcomingEmiDetailsV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/UpcomingEmiDetailsV2Fragment.kt @@ -17,6 +17,7 @@ import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider import com.navi.base.utils.orZero import com.navi.common.model.Money +import com.navi.common.model.common.Header import com.navi.common.ui.fragment.BaseFragment import com.navi.common.utils.setCornerRadius import com.navi.naviwidgets.models.response.Footer @@ -29,7 +30,6 @@ import com.naviapp.dashboard.listeners.FragmentInteractionListener import com.naviapp.databinding.PlFragmentUpcomingEmiDetailsV2Binding import com.naviapp.models.request.LoanFeeDetailsRequest import com.naviapp.models.response.EmiDatesData -import com.navi.common.model.common.Header import com.naviapp.personalloan.getloan.loandetails.viewmodels.EmiSelectorVM import com.naviapp.utils.Constants import com.naviapp.utils.Constants.ACTION @@ -39,7 +39,9 @@ class UpcomingEmiDetailsV2Fragment : BaseFragment(), BackListener { private lateinit var binding: PlFragmentUpcomingEmiDetailsV2Binding private val viewModel by lazy { ViewModelProvider(this).get(EmiSelectorVM::class.java) } - private val analyticsEventTracker by lazy { NaviAnalytics.naviAnalytics.EmiSelector(screenName) } + private val analyticsEventTracker by lazy { + NaviAnalytics.naviAnalytics.EmiSelector(screenName) + } private var headerListener: NaviHeaderView.InteractionListener? = null private var listener: FragmentInteractionListener? = null private var flowType: String? = null @@ -70,12 +72,10 @@ class UpcomingEmiDetailsV2Fragment : BaseFragment(), BackListener { } private fun initUI() { - arguments - ?.getParcelable(Constants.LOAN_FEE_DETAILS_REQUEST) - ?.let { - showLoader() - viewModel.fetchUpcomingEmiDates(it) - } + arguments?.getParcelable(Constants.LOAN_FEE_DETAILS_REQUEST)?.let { + showLoader() + viewModel.fetchUpcomingEmiDates(it) + } } private fun initObserver() { @@ -159,10 +159,7 @@ class UpcomingEmiDetailsV2Fragment : BaseFragment(), BackListener { activity?.finish() return@setOnClickListener } - listener?.navigateTo( - GetLoanV2Helper.EMI_SELECTOR_FRAGMENT_V2, - getFormattedBundle() - ) + listener?.navigateTo(GetLoanV2Helper.EMI_SELECTOR_FRAGMENT_V2, getFormattedBundle()) } } } @@ -175,18 +172,12 @@ class UpcomingEmiDetailsV2Fragment : BaseFragment(), BackListener { activity?.setResult(Activity.RESULT_OK, Intent()) activity?.finish() } else { - listener?.navigateTo( - GetLoanV2Helper.EMI_SELECTOR_FRAGMENT_V2, - getFormattedBundle() - ) + listener?.navigateTo(GetLoanV2Helper.EMI_SELECTOR_FRAGMENT_V2, getFormattedBundle()) } } private fun moveToLoanSummaryScreen() { - listener?.navigateTo( - GetLoanV2Helper.SUMMARY_SCREEN_V2, - Bundle() - ) + listener?.navigateTo(GetLoanV2Helper.SUMMARY_SCREEN_V2, Bundle()) } override val screenName: String diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/VideoKycV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/VideoKycV2Fragment.kt index 6c3bb23d8e..6af9376584 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/VideoKycV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/VideoKycV2Fragment.kt @@ -112,8 +112,7 @@ class VideoKycV2Fragment : viewModel.videoKycData.value ?.videoKycStatusDelay ?.times(Constants.MILLISECONDS_PER_SECOND) - ?.toLong() - ?: Constants.VIDEO_KYC_STATUS_DELAY + ?.toLong() ?: Constants.VIDEO_KYC_STATUS_DELAY ) viewModel.fetchVideoKycStatus() } @@ -430,8 +429,7 @@ class VideoKycV2Fragment : activity?.let { allPermissionsGranted = PermissionsManager(it).hasLocationPermissionAny() - } - ?: run { allPermissionsGranted = false } + } ?: run { allPermissionsGranted = false } analyticsEventTracker.onLocationPermissionResult(NaviAnalytics.NO) toast(getString(R.string.location_permission_required_for_video_kyc)) } @@ -443,8 +441,7 @@ class VideoKycV2Fragment : activity?.let { allPermissionsGranted = PermissionsManager(it).hasLocationPermissionAny() - } - ?: run { allPermissionsGranted = false } + } ?: run { allPermissionsGranted = false } analyticsEventTracker.onCoarseLocationPermissionResult(NaviAnalytics.NO) toast(getString(R.string.location_permission_required_for_video_kyc)) } @@ -543,11 +540,13 @@ class VideoKycV2Fragment : baseApiPollScheduler = ApiPollScheduler( doOnTimeout = onPollingEnd, - numberOfRetry = requestConfig?.numOfRetries - ?: ApiPollScheduler.API_POLL_RETRY_COUNT, - initialDelay = requestConfig?.initialDelay?.toLong() + numberOfRetry = + requestConfig?.numOfRetries ?: ApiPollScheduler.API_POLL_RETRY_COUNT, + initialDelay = + requestConfig?.initialDelay?.toLong() ?: ApiPollScheduler.INITIAL_DELAY_FOR_API_POLL_SECONDS, - pollInterval = requestConfig?.interval?.toLong() + pollInterval = + requestConfig?.interval?.toLong() ?: ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS ) { viewModel.checkApiPollStatus(requestId, type) @@ -710,8 +709,7 @@ class VideoKycV2Fragment : item.key?.let { key -> queryMap[key] = "${item.value}" } } } - } - ?: run { arguments?.getString(REDIRECT_URL)?.let { queryMap[REDIRECT_URL] = it } } + } ?: run { arguments?.getString(REDIRECT_URL)?.let { queryMap[REDIRECT_URL] = it } } return queryMap[REDIRECT_URL] } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/VkycBaseFragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/VkycBaseFragment.kt index abf787293b..3bed8bd65d 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/VkycBaseFragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/VkycBaseFragment.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.pl.dynamic.fragment import android.Manifest @@ -52,14 +59,13 @@ abstract class VkycBaseFragment : BaseFragment() { viewModel.videoKycData.value ?.videoKycStatusDelay ?.times(Constants.MILLISECONDS_PER_SECOND) - ?.toLong() - ?: Constants.VIDEO_KYC_STATUS_DELAY + ?.toLong() ?: Constants.VIDEO_KYC_STATUS_DELAY ) viewModel.fetchVideoKycStatus() } } - protected fun videoKycInit(vendorName: String?) { //TODO: Rename + protected fun videoKycInit(vendorName: String?) { // TODO: Rename analyticsEventTracker.redirectToVkycVendorScreen(vendorName) if (checkPermission()) { startVideoKyc() @@ -71,7 +77,8 @@ abstract class VkycBaseFragment : BaseFragment() { Manifest.permission.RECORD_AUDIO, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION - ), KycV2Fragment.VIDEO_KYC_REQUEST_CODE + ), + KycV2Fragment.VIDEO_KYC_REQUEST_CODE ) } } @@ -90,23 +97,21 @@ abstract class VkycBaseFragment : BaseFragment() { activity?.run { analyticsEventTracker.redirectToVkycVendorScreen(vendorName) - NaviDeepLinkNavigator.navigate(activity, CtaData( - url = NaviDeepLinkNavigator.VIDEO_KYC - ), - bundle = Bundle().apply { - putString( - com.navi.vkyc.constants.Constants.APPLICATION_ID, - BuildConfig.APPLICATION_ID - ) - putString( - VideoKycV2Fragment.REDIRECT_URL, - arguments?.getString(VideoKycV2Fragment.REDIRECT_URL) - ) - putString( - com.navi.vkyc.constants.Constants.MODULE_NAME, - ModuleName.LE.name - ) - } + NaviDeepLinkNavigator.navigate( + activity, + CtaData(url = NaviDeepLinkNavigator.VIDEO_KYC), + bundle = + Bundle().apply { + putString( + com.navi.vkyc.constants.Constants.APPLICATION_ID, + BuildConfig.APPLICATION_ID + ) + putString( + VideoKycV2Fragment.REDIRECT_URL, + arguments?.getString(VideoKycV2Fragment.REDIRECT_URL) + ) + putString(com.navi.vkyc.constants.Constants.MODULE_NAME, ModuleName.LE.name) + } ) } } @@ -170,7 +175,6 @@ abstract class VkycBaseFragment : BaseFragment() { else toast(getString(R.string.camera_permission_required_for_video_kyc)) } } - Manifest.permission.RECORD_AUDIO -> { if (permissionResult.second[index] == PermissionChecker.PERMISSION_GRANTED) { analyticsEventTracker.onMicPermissionResult(NaviAnalytics.YES) @@ -180,7 +184,6 @@ abstract class VkycBaseFragment : BaseFragment() { toast(getString(R.string.mic_permission_required_for_video_kyc)) } } - Manifest.permission.ACCESS_FINE_LOCATION -> { if (permissionResult.second[index] == PermissionChecker.PERMISSION_GRANTED) { analyticsEventTracker.onLocationPermissionResult(NaviAnalytics.YES) @@ -188,13 +191,11 @@ abstract class VkycBaseFragment : BaseFragment() { activity?.let { allPermissionsGranted = PermissionsManager(it).hasLocationPermissionAny() - } - ?: run { allPermissionsGranted = false } + } ?: run { allPermissionsGranted = false } analyticsEventTracker.onLocationPermissionResult(NaviAnalytics.NO) toast(getString(R.string.location_permission_required_for_video_kyc)) } } - Manifest.permission.ACCESS_COARSE_LOCATION -> { if (permissionResult.second[index] == PermissionChecker.PERMISSION_GRANTED) { analyticsEventTracker.onCoarseLocationPermissionResult(NaviAnalytics.YES) @@ -202,8 +203,7 @@ abstract class VkycBaseFragment : BaseFragment() { activity?.let { allPermissionsGranted = PermissionsManager(it).hasLocationPermissionAny() - } - ?: run { allPermissionsGranted = false } + } ?: run { allPermissionsGranted = false } analyticsEventTracker.onCoarseLocationPermissionResult(NaviAnalytics.NO) toast(getString(R.string.location_permission_required_for_video_kyc)) } @@ -216,10 +216,7 @@ abstract class VkycBaseFragment : BaseFragment() { private fun handleDoNotAskAgain() { getPermissionDeniedData(PermissionsManager.CAMERA_PERMISSION)?.let { data -> if (!isAdded || activity?.isFinishing.orTrue()) return - PermissionDeniedFragment.getInstance( - data, - getPermissionScreenName() - ).let { + PermissionDeniedFragment.getInstance(data, getPermissionScreenName()).let { permissionDeniedFragment = it if (!childFragmentManager.isDestroyed && !childFragmentManager.isStateSaved) it.show(childFragmentManager, PermissionDeniedFragment.TAG) @@ -236,12 +233,11 @@ abstract class VkycBaseFragment : BaseFragment() { override fun onPause() { super.onPause() permissionDeniedFragment?.dismiss() - //stopVideoKycStatusJob() + // stopVideoKycStatusJob() } override fun onDestroy() { super.onDestroy() stopVideoKycStatusJob() } - -} \ No newline at end of file +} diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/WorkV2Fragment.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/WorkV2Fragment.kt index f4806b979a..579ef5368a 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/WorkV2Fragment.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/WorkV2Fragment.kt @@ -7,7 +7,6 @@ package com.navi.pl.dynamic.fragment -import com.navi.naviwidgets.R as WidgetsR import android.content.Context import android.os.Build import android.os.Bundle @@ -51,6 +50,7 @@ import com.navi.common.utils.ApiPollScheduler import com.navi.common.utils.observeNonNull import com.navi.design.utils.doAnimate import com.navi.design.utils.ifMeasured +import com.navi.naviwidgets.R as WidgetsR import com.navi.naviwidgets.base.BaseInputWidget import com.navi.naviwidgets.utils.NaviWidgetIconUtils import com.navi.naviwidgets.widgets.labledtextinput.ui.LabeledTextInputWidgetV2 @@ -110,16 +110,13 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { private fun initError() { initError( viewModel, - actions = listOf( - Pair(handleFetchWorkDetailsData, ApiErrorTagType.FETCH_WORK_DETAILS_DATA) - ), + actions = + listOf(Pair(handleFetchWorkDetailsData, ApiErrorTagType.FETCH_WORK_DETAILS_DATA)), actionErrorV2Enabled = true ) } - private val handleFetchWorkDetailsData = OnClickListener { - fetchWorkDetailsData() - } + private val handleFetchWorkDetailsData = OnClickListener { fetchWorkDetailsData() } private fun initUI() { binding.incomeTooltipView.setProperties( @@ -191,8 +188,7 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { start: Int, count: Int, after: Int - ) { - } + ) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} @@ -215,7 +211,6 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { binding.thirdBox.setOnClickListener { onBoxClicked(binding.thirdBox, 2) } setEventNameToLatencyMapper(PL_SCREEN_ACTIVITY, queryMap[ACTION]) - } private fun onBoxClicked(view: BoxWithIconView, itemIndex: Int) { @@ -271,16 +266,16 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { viewModel.monthlyIncomeValidationState.observeNonNull(viewLifecycleOwner) { when (it) { ValidationState.IS_EMPTY, - ValidationState.IS_INVALID -> setErrorProperties( - binding.monthlyIncomeLt, - getString(R.string.please_enter_a_valid_income) - ) - - ValidationState.IS_SMALLER_THAN_MIN_LENGTH -> setErrorProperties( - binding.monthlyIncomeLt, - getString(R.string.minimum_monthly_income) - ) - + ValidationState.IS_INVALID -> + setErrorProperties( + binding.monthlyIncomeLt, + getString(R.string.please_enter_a_valid_income) + ) + ValidationState.IS_SMALLER_THAN_MIN_LENGTH -> + setErrorProperties( + binding.monthlyIncomeLt, + getString(R.string.minimum_monthly_income) + ) else -> {} } } @@ -289,16 +284,16 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { private fun observePanNumberValidity() { viewModel.panNumberValidationState.observeNonNull(viewLifecycleOwner) { when (it) { - ValidationState.IS_EMPTY -> setErrorProperties( - binding.panNumberLt, - getString(R.string.please_enter_your_PAN_number) - ) - - ValidationState.IS_INVALID -> setErrorProperties( - binding.panNumberLt, - resources.getString(R.string.enter_a_valid_pan_number) - ) - + ValidationState.IS_EMPTY -> + setErrorProperties( + binding.panNumberLt, + getString(R.string.please_enter_your_PAN_number) + ) + ValidationState.IS_INVALID -> + setErrorProperties( + binding.panNumberLt, + resources.getString(R.string.enter_a_valid_pan_number) + ) else -> {} // Do Nothing } } @@ -384,8 +379,8 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { binding.incomeTooltipView.ifMeasured { val x = binding.monthlyIncomeLt.binding.info.getLocationOnScreen().x - - binding.incomeTooltipView.width / 2.0f + - binding.monthlyIncomeLt.binding.info.width / 2.0f + binding.incomeTooltipView.width / 2.0f + + binding.monthlyIncomeLt.binding.info.width / 2.0f binding.incomeTooltipView.doAnimate(x = x) } } @@ -394,8 +389,8 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { binding.panTooltipView.ifMeasured { val position = binding.panNumberLt.binding.info.getLocationOnScreen().x - - binding.panTooltipView.width / 2.0f + - binding.panNumberLt.binding.info.width / 2.0f + binding.panTooltipView.width / 2.0f + + binding.panNumberLt.binding.info.width / 2.0f binding.panTooltipView.doAnimate(x = position) } } @@ -413,7 +408,8 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { binding.panNumberLt.updateData( WorkV2FragmentHelper.getPanNumberWidget( data.content?.panDetails?.panNumber.orEmpty(), - data.content?.panTitle, data.content?.panHint + data.content?.panTitle, + data.content?.panHint ) ) data.content?.panDetails?.panNumber?.let { @@ -447,7 +443,9 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { naviAnalyticsEventTracker.onPanEdit() binding.panNumberLt.binding.errorText.visibility = GONE binding.panNumberLt.binding.errorIcon.visibility = GONE - binding.panNumberLt.setBaseBorderBackground(R.drawable.bg_view_bg_color_17_bordered_round_8) + binding.panNumberLt.setBaseBorderBackground( + R.drawable.bg_view_bg_color_17_bordered_round_8 + ) } } @@ -499,7 +497,6 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { ) navigateToNextScreen() } - TextUtils.equals(status, FirebaseStatusType.FAILURE) -> { baseApiPollScheduler?.stopApiPoll() baseFirebaseDataHelper?.clear() @@ -508,7 +505,6 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { baseApiPollScheduler?.invoke() return } - else -> { viewModel.workAsyncResponse.value?.requestId?.let { requestId -> viewModel.fetchAsyncRequestDataWithError(requestId) @@ -528,11 +524,14 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { nextCta?.url?.let { fragmentInterchangeListener?.navigateToNextScreenWithCaching( it, - constructBundleWithCtaData(nextCta, Bundle().apply { - putBoolean(Constants.IS_COMING_FROM_WORK_DETAILS, true) - putString(EPFO_PAGE_TYPE, WORK) - putString(Constants.PROFESSION_TYPE, selectedEmploymentType?.description) - }) + constructBundleWithCtaData( + nextCta, + Bundle().apply { + putBoolean(Constants.IS_COMING_FROM_WORK_DETAILS, true) + putString(EPFO_PAGE_TYPE, WORK) + putString(Constants.PROFESSION_TYPE, selectedEmploymentType?.description) + } + ) ) } } @@ -576,12 +575,18 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { baseApiPollScheduler = ApiPollScheduler( doOnTimeout = onPollingEnd, - initialDelay = requestConfig?.initialDelay?.toLong() - .orElse(PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS), - pollInterval = requestConfig?.interval?.toLong() - .orElse(ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS), - numberOfRetry = requestConfig?.numOfRetries - .orElse(ApiPollScheduler.API_POLL_RETRY_COUNT) + initialDelay = + requestConfig + ?.initialDelay + ?.toLong() + .orElse(PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS), + pollInterval = + requestConfig + ?.interval + ?.toLong() + .orElse(ApiPollScheduler.API_POLL_REPEAT_PERIOD_SECONDS), + numberOfRetry = + requestConfig?.numOfRetries.orElse(ApiPollScheduler.API_POLL_RETRY_COUNT) ) { viewModel.fetchAsyncRequestDataWithError(requestId) } @@ -627,16 +632,16 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { } private fun getValidPanNumber(): String? { - return binding.panNumberLt.widgetBinding.plainTextInput.text.toString() - .ifEmpty { null } + return binding.panNumberLt.widgetBinding.plainTextInput.text.toString().ifEmpty { null } } private fun initUserDetailsForAnalytics(monthlyIncome: String, employmentType: String) { - val userDetail = PreferenceManager.getObjectPrefrences( - CommonPrefConstants.CURRENT_USER, - UserDetail::class.java - ) ?: UserDetail() + val userDetail = + PreferenceManager.getObjectPrefrences( + CommonPrefConstants.CURRENT_USER, + UserDetail::class.java + ) ?: UserDetail() userDetail.employmentType = employmentType userDetail.monthlyIncome = stringToDouble(monthlyIncome).getMoney() @@ -646,14 +651,14 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { private fun verifyWorkDetails(): Boolean { - if ((viewModel.verifyPan( - binding.panNumberLt.getUserInput().toString().trim() - ) != ValidationState.IS_VALID) - || verifySelectedEmploymentType().not() - || (viewModel.verifyMonthlyIncome( - binding.monthlyIncomeLt.getFormattedText(), - getFormattedIncome() - ) != ValidationState.IS_VALID) + if ( + (viewModel.verifyPan(binding.panNumberLt.getUserInput().toString().trim()) != + ValidationState.IS_VALID) || + verifySelectedEmploymentType().not() || + (viewModel.verifyMonthlyIncome( + binding.monthlyIncomeLt.getFormattedText(), + getFormattedIncome() + ) != ValidationState.IS_VALID) ) return false @@ -701,10 +706,7 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { override fun onFooterBackPressed(backCta: CtaData?) { naviAnalyticsEventTracker.onBackButtonClicked(screenName) backCta?.url?.let { - fragmentInterchangeListener?.navigateToNextScreenWithCaching( - it, - Bundle() - ) + fragmentInterchangeListener?.navigateToNextScreenWithCaching(it, Bundle()) } } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/AddressHelper.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/AddressHelper.kt index 7de870a074..dc2e11cd29 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/AddressHelper.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/AddressHelper.kt @@ -38,5 +38,4 @@ object AddressHelper { KycV2Fragment.VIDEO_KYC_REQUEST_CODE, KycV2Fragment.AADHAR_OTP_REQUEST_CODE ) - } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/DigioStub.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/DigioStub.kt index c7308a7727..c93c6b815d 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/DigioStub.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/DigioStub.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.pl.dynamic.helper import android.annotation.SuppressLint @@ -7,11 +14,7 @@ import android.webkit.WebView import android.webkit.WebViewClient import com.naviapp.utils.Constants -class DigioStub( - activity: Activity, - stubEndpoint: String, - updateDigioStatus: ((String) -> Unit) -) { +class DigioStub(activity: Activity, stubEndpoint: String, updateDigioStatus: ((String) -> Unit)) { private val builder = AlertDialog.Builder(activity) private val webView = WebView(activity) private val naviAppWebInterface = DigioWebInterface(updateDigioStatus) @@ -20,21 +23,20 @@ class DigioStub( @SuppressLint("SetJavaScriptEnabled") webView.settings.javaScriptEnabled = true webView.loadUrl(stubEndpoint) - webView.webViewClient = object : WebViewClient() { - @Deprecated("Deprecated in Java") - override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean { - view.loadUrl(url) - return true + webView.webViewClient = + object : WebViewClient() { + @Deprecated("Deprecated in Java") + override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean { + view.loadUrl(url) + return true + } } - } builder.setView(webView) - builder.setNegativeButton(Constants.CANCEL) { dialog, _ -> - dialog.dismiss() - } + builder.setNegativeButton(Constants.CANCEL) { dialog, _ -> dialog.dismiss() } webView.addJavascriptInterface(naviAppWebInterface, "NaviApp") } fun launch() { naviAppWebInterface.dialog = builder.show() } -} \ No newline at end of file +} diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/DigioWebInterface.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/DigioWebInterface.kt index 403b1c076f..f31749dc71 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/DigioWebInterface.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/DigioWebInterface.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.pl.dynamic.helper import android.app.AlertDialog @@ -17,4 +24,4 @@ class DigioWebInterface(private val updateDigioStatus: ((String) -> Unit)) { updateDigioStatus.invoke(data) dialog?.dismiss() } -} \ No newline at end of file +} diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/ErrorScreenV2Helper.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/ErrorScreenV2Helper.kt index 1fa06f8631..baf7af561a 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/ErrorScreenV2Helper.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/ErrorScreenV2Helper.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.pl.dynamic.helper import android.os.Bundle @@ -12,7 +19,6 @@ object ErrorScreenV2Helper { fun getTag(screen: String): String { return when (screen) { - UI_TRON_COMMON_ERROR_FRAGMENT -> UiTronCommonErrorFragment.TAG else -> Constants.EMPTY } @@ -31,4 +37,4 @@ object ErrorScreenV2Helper { else -> screen } } -} \ No newline at end of file +} diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/KycAddressV2Helper.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/KycAddressV2Helper.kt index 7253e0d23d..af7ab10cd8 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/KycAddressV2Helper.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/KycAddressV2Helper.kt @@ -18,100 +18,106 @@ object KycAddressV2Helper { fun getFlatNoWidget(context: Context, name: String?): LabeledTextInputWidgetModelV2 { return LabeledTextInputWidgetModelV2( - widgetData = TextInputWidgetData( - inputTextData = InputTextWidgetMeta( - hint = context.getString(R.string.address_line_1_hint), - inputType = TextInputUtil.INPUT_TYPE_TEXT, - savedText = name - ) - ).apply { - title = context.getString(R.string.flat_house_no_lt_titlle) - } + widgetData = + TextInputWidgetData( + inputTextData = + InputTextWidgetMeta( + hint = context.getString(R.string.address_line_1_hint), + inputType = TextInputUtil.INPUT_TYPE_TEXT, + savedText = name + ) + ) + .apply { title = context.getString(R.string.flat_house_no_lt_titlle) } ) } fun getStreetWidget(context: Context, name: String?): LabeledTextInputWidgetModelV2 { return LabeledTextInputWidgetModelV2( - widgetData = TextInputWidgetData( - inputTextData = InputTextWidgetMeta( - hint = context.getString(R.string.address_line_2_hint), - inputType = TextInputUtil.INPUT_TYPE_TEXT, - savedText = name - ) - ).apply { - title = context.getString(R.string.street) - } + widgetData = + TextInputWidgetData( + inputTextData = + InputTextWidgetMeta( + hint = context.getString(R.string.address_line_2_hint), + inputType = TextInputUtil.INPUT_TYPE_TEXT, + savedText = name + ) + ) + .apply { title = context.getString(R.string.street) } ) } fun getLocalityWidget(context: Context, name: String?): LabeledTextInputWidgetModelV2 { return LabeledTextInputWidgetModelV2( - widgetData = TextInputWidgetData( - inputTextData = InputTextWidgetMeta( - hint = context.getString(R.string.address_line_3_hint), - inputType = TextInputUtil.INPUT_TYPE_TEXT, - savedText = name - ) - ).apply { - title = context.getString(R.string.local_area) - } + widgetData = + TextInputWidgetData( + inputTextData = + InputTextWidgetMeta( + hint = context.getString(R.string.address_line_3_hint), + inputType = TextInputUtil.INPUT_TYPE_TEXT, + savedText = name + ) + ) + .apply { title = context.getString(R.string.local_area) } ) } fun getPinCodeWidget(context: Context, name: String?): LabeledTextInputWidgetModelV2 { return LabeledTextInputWidgetModelV2( - widgetData = TextInputWidgetData( - inputTextData = InputTextWidgetMeta( - hint = context.getString(com.navi.amc.R.string.ex_650087), - inputType = TextInputUtil.INPUT_TYPE_NUMBER, - savedText = name - ) - ).apply { - title = context.getString(R.string.postal_code) - } + widgetData = + TextInputWidgetData( + inputTextData = + InputTextWidgetMeta( + hint = context.getString(com.navi.amc.R.string.ex_650087), + inputType = TextInputUtil.INPUT_TYPE_NUMBER, + savedText = name + ) + ) + .apply { title = context.getString(R.string.postal_code) } ) } fun getCityWidget(context: Context, name: String?): LabeledTextInputWidgetModelV2 { return LabeledTextInputWidgetModelV2( - widgetData = TextInputWidgetData( - inputTextData = InputTextWidgetMeta( - hint = context.getString(R.string.ex_bengaluru), - inputType = TextInputUtil.INPUT_TYPE_TEXT, - savedText = name - ) - ).apply { - title = context.getString(R.string.city) - } + widgetData = + TextInputWidgetData( + inputTextData = + InputTextWidgetMeta( + hint = context.getString(R.string.ex_bengaluru), + inputType = TextInputUtil.INPUT_TYPE_TEXT, + savedText = name + ) + ) + .apply { title = context.getString(R.string.city) } ) } fun getStateWidget(context: Context, name: String?): LabeledTextInputWidgetModelV2 { return LabeledTextInputWidgetModelV2( - widgetData = TextInputWidgetData( - inputTextData = InputTextWidgetMeta( - hint = context.getString(R.string.ex_karnataka), - inputType = TextInputUtil.INPUT_TYPE_TEXT, - savedText = name - ) - ).apply { - title = context.getString(R.string.state) - } + widgetData = + TextInputWidgetData( + inputTextData = + InputTextWidgetMeta( + hint = context.getString(R.string.ex_karnataka), + inputType = TextInputUtil.INPUT_TYPE_TEXT, + savedText = name + ) + ) + .apply { title = context.getString(R.string.state) } ) } - fun getFatherNameWidget(context: Context, name: String?): LabeledTextInputWidgetModelV2{ + fun getFatherNameWidget(context: Context, name: String?): LabeledTextInputWidgetModelV2 { return LabeledTextInputWidgetModelV2( - widgetData = TextInputWidgetData( - inputTextData = InputTextWidgetMeta( - hint = context.getString(R.string.father_name_hint), - inputType = TextInputUtil.INPUT_TYPE_TEXT, - savedText = name - ) - ).apply { - title = context.getString(R.string.father_name) - } + widgetData = + TextInputWidgetData( + inputTextData = + InputTextWidgetMeta( + hint = context.getString(R.string.father_name_hint), + inputType = TextInputUtil.INPUT_TYPE_TEXT, + savedText = name + ) + ) + .apply { title = context.getString(R.string.father_name) } ) } - } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/ProfileV2FragmentHelper.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/ProfileV2FragmentHelper.kt index 53617faa43..036bfd7932 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/ProfileV2FragmentHelper.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/ProfileV2FragmentHelper.kt @@ -34,48 +34,56 @@ object ProfileV2FragmentHelper { fun getFullNameWidget(context: Context, name: String): LabeledTextInputWidgetModelV2 { return LabeledTextInputWidgetModelV2( - widgetData = TextInputWidgetData( - inputTextData = InputTextWidgetMeta( - hint = context.getString(R.string.enter_your_full_name), - maxCharLength = Constants.VALID_FULL_NAME_LENGTH, - inputType = TextInputUtil.INPUT_TYPE_TEXT_CAP_WORDS, - savedText = name - ) - ).apply { - title = "Full name" - titleInfo = "(As per PAN card)" - } + widgetData = + TextInputWidgetData( + inputTextData = + InputTextWidgetMeta( + hint = context.getString(R.string.enter_your_full_name), + maxCharLength = Constants.VALID_FULL_NAME_LENGTH, + inputType = TextInputUtil.INPUT_TYPE_TEXT_CAP_WORDS, + savedText = name + ) + ) + .apply { + title = "Full name" + titleInfo = "(As per PAN card)" + } ) } fun getDOBWidget(context: Context, dobText: String): LabeledDateInputWidgetModel { return LabeledDateInputWidgetModel( - widgetData = DateInputWidgetData().apply { - title = "Date of birth" - inputDateData = InputDateWidgetMeta().apply { - hint = "DD-MM-YYYY" - minDate = "1967-07-14" - maxDate = "2004-07-14" - savedDate = dobText - newDesign = true + widgetData = + DateInputWidgetData().apply { + title = "Date of birth" + inputDateData = + InputDateWidgetMeta().apply { + hint = "DD-MM-YYYY" + minDate = "1967-07-14" + maxDate = "2004-07-14" + savedDate = dobText + newDesign = true + } } - } ) } fun getPanNumberWidget(context: Context, panNumber: String): LabeledTextInputWidgetModelV2 { return LabeledTextInputWidgetModelV2( - widgetData = TextInputWidgetData( - inputTextData = InputTextWidgetMeta( - hint = "Enter PAN", - maxCharLength = Constants.VALID_PHONE_NUMBER_LENGTH, - inputType = TextInputUtil.INPUT_TYPE_TEXT_CAP_CHARACTERS, - savedText = panNumber - ) - ).apply { - title = "PAN number" - disableTextCopy = true - } + widgetData = + TextInputWidgetData( + inputTextData = + InputTextWidgetMeta( + hint = "Enter PAN", + maxCharLength = Constants.VALID_PHONE_NUMBER_LENGTH, + inputType = TextInputUtil.INPUT_TYPE_TEXT_CAP_CHARACTERS, + savedText = panNumber + ) + ) + .apply { + title = "PAN number" + disableTextCopy = true + } ) } @@ -88,10 +96,7 @@ object ProfileV2FragmentHelper { viewBinding.toastLayoutRoot.setBackgroundResource(R.drawable.bg_light_green_rounded_12) viewBinding.toastTv.text = text viewBinding.toastTv.setTextColor(ContextCompat.getColor(context, R.color.green)) - TextViewCompat.setTextAppearance( - viewBinding.toastTv, - R.style.NaviSansBoldExtraSmall - ) + TextViewCompat.setTextAppearance(viewBinding.toastTv, R.style.NaviSansBoldExtraSmall) return viewBinding.root } @@ -104,34 +109,45 @@ object ProfileV2FragmentHelper { maxAge: Int ): Pair { try { - var date = if (isViewFilled(dateText, DobEditText.DAY_LENGTH)) - dateText else DobEditText.SAMPLE_DATE - var month = if (isViewFilled(monthText, DobEditText.MONTH_LENGTH)) - monthText else DobEditText.SAMPLE_MONTH - var year = if (isViewFilled(yearText, DobEditText.YEAR_LENGTH)) - yearText else DobEditText.SAMPLE_YEAR + var date = + if (isViewFilled(dateText, DobEditText.DAY_LENGTH)) dateText + else DobEditText.SAMPLE_DATE + var month = + if (isViewFilled(monthText, DobEditText.MONTH_LENGTH)) monthText + else DobEditText.SAMPLE_MONTH + var year = + if (isViewFilled(yearText, DobEditText.YEAR_LENGTH)) yearText + else DobEditText.SAMPLE_YEAR val dateTime = DateTime.parse( "${date}/$month/$year", DateTimeFormat.forPattern(Constants.DATE_FORMAT) ) - date = if (isViewFilled(dateText, DobEditText.DAY_LENGTH)) - dateTime.toString(Constants.DAY_OF_MONTH_FORMAT).getOrdinal() else Constants.EMPTY - month = if (isViewFilled(monthText, DobEditText.MONTH_LENGTH)) - dateTime.toString(Constants.MONTH_OF_YEAR_FORMAT) else Constants.EMPTY - year = if (isViewFilled(yearText, DobEditText.YEAR_LENGTH)) - dateTime.toString(Constants.YEAR_FORMAT) else Constants.EMPTY - if (date.isNotEmpty() && month.isNotEmpty() && year.isNotEmpty() && dateTime.toLocalDate() - ?.isValidAgeForPersonalLoan(minAge, maxAge) - ?.not() - .orTrue() + date = + if (isViewFilled(dateText, DobEditText.DAY_LENGTH)) + dateTime.toString(Constants.DAY_OF_MONTH_FORMAT).getOrdinal() + else Constants.EMPTY + month = + if (isViewFilled(monthText, DobEditText.MONTH_LENGTH)) + dateTime.toString(Constants.MONTH_OF_YEAR_FORMAT) + else Constants.EMPTY + year = + if (isViewFilled(yearText, DobEditText.YEAR_LENGTH)) + dateTime.toString(Constants.YEAR_FORMAT) + else Constants.EMPTY + if ( + date.isNotEmpty() && + month.isNotEmpty() && + year.isNotEmpty() && + dateTime + .toLocalDate() + ?.isValidAgeForPersonalLoan(minAge, maxAge) + ?.not() + .orTrue() ) { return Pair( - context.resources.getString( - R.string.wrong_dob_age_range, - minAge, - maxAge - ), false + context.resources.getString(R.string.wrong_dob_age_range, minAge, maxAge), + false ) } return Pair(context.getString(R.string.date_format, date, month, year), true) @@ -140,6 +156,5 @@ object ProfileV2FragmentHelper { } } - private fun isViewFilled(string: String, length: Int) = - string.length == length + private fun isViewFilled(string: String, length: Int) = string.length == length } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/VKycHelper.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/VKycHelper.kt index 85743ca122..fc101b7847 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/VKycHelper.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/VKycHelper.kt @@ -18,8 +18,16 @@ import com.naviapp.R class VKycHelper { - fun hvDocPANConfig(panCapture: String, showReviewScreen: Boolean?, shouldAutoCapture: Boolean?, context: Context?): HVDocConfig { - val uiConfigJsonText = context?.resources?.openRawResource(R.raw.hyperverge_ui_config)?.bufferedReader().use { it?.readText() } + fun hvDocPANConfig( + panCapture: String, + showReviewScreen: Boolean?, + shouldAutoCapture: Boolean?, + context: Context? + ): HVDocConfig { + val uiConfigJsonText = + context?.resources?.openRawResource(R.raw.hyperverge_ui_config)?.bufferedReader().use { + it?.readText() + } val uiConfig: UIConfig = Gson().fromJson(uiConfigJsonText, UIConfig::class.java) HyperSnapSDK.getInstance().setUiConfig(context, uiConfig) return HVDocConfig().apply { @@ -32,5 +40,4 @@ class VKycHelper { setDescTypeFace(getFontStyle(FontWeightEnum.TT_REGULAR)) } } - } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/WorkV2FragmentHelper.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/WorkV2FragmentHelper.kt index 8028d4aae7..52f67451dc 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/WorkV2FragmentHelper.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/WorkV2FragmentHelper.kt @@ -25,19 +25,20 @@ object WorkV2FragmentHelper { formatAmount: String ): LabeledTextInputFixedHintWidgetModel { return LabeledTextInputFixedHintWidgetModel( - widgetData = TextInputFixedHintWidgetData( - inputTextFixedHintItemData = InputTextFixedHintItemMeta( - hint = hint ?: "Enter amount", - maxCharLength = Constants.VALID_MONTHLY_INCOME_LENGTH, - inputType = TextInputUtil.INPUT_TYPE_NUMBER, - format = TextFormat.MONEY, - fixedHint = "₹", - savedText = formatAmount, - newDesign = true - ) - ).apply { - title = titleText ?: "Monthly income" - } + widgetData = + TextInputFixedHintWidgetData( + inputTextFixedHintItemData = + InputTextFixedHintItemMeta( + hint = hint ?: "Enter amount", + maxCharLength = Constants.VALID_MONTHLY_INCOME_LENGTH, + inputType = TextInputUtil.INPUT_TYPE_NUMBER, + format = TextFormat.MONEY, + fixedHint = "₹", + savedText = formatAmount, + newDesign = true + ) + ) + .apply { title = titleText ?: "Monthly income" } ) } @@ -47,17 +48,20 @@ object WorkV2FragmentHelper { panHint: String? ): LabeledTextInputWidgetModelV2 { return LabeledTextInputWidgetModelV2( - widgetData = TextInputWidgetData( - inputTextData = InputTextWidgetMeta( - hint = panHint, - maxCharLength = Constants.VALID_PHONE_NUMBER_LENGTH, - inputType = TextInputUtil.INPUT_TYPE_TEXT_CAP_CHARACTERS, - savedText = panNumber - ) - ).apply { - title = panTitle - disableTextCopy = true - } + widgetData = + TextInputWidgetData( + inputTextData = + InputTextWidgetMeta( + hint = panHint, + maxCharLength = Constants.VALID_PHONE_NUMBER_LENGTH, + inputType = TextInputUtil.INPUT_TYPE_TEXT_CAP_CHARACTERS, + savedText = panNumber + ) + ) + .apply { + title = panTitle + disableTextCopy = true + } ) } } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/listener/DigioKycVerificationListener.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/listener/DigioKycVerificationListener.kt index fa81b4d12f..514a6fc01a 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/listener/DigioKycVerificationListener.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/listener/DigioKycVerificationListener.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.pl.dynamic.listener import com.naviapp.models.response.DigioKycResponse @@ -5,4 +12,4 @@ import com.naviapp.models.response.DigioKycResponse interface DigioKycVerificationListener { fun onKycStartVerification(data: DigioKycResponse) -} \ No newline at end of file +} diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/listener/MultipleKycItemListeners.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/listener/MultipleKycItemListeners.kt index b96907163c..9f51ba8795 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/listener/MultipleKycItemListeners.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/listener/MultipleKycItemListeners.kt @@ -12,7 +12,6 @@ import com.navi.base.model.CtaData interface MultipleKycItemListeners { fun onAadhaarOtpOptionTap() - fun onVideoKycItemTap( - ctaData: CtaData? = null - ) + + fun onVideoKycItemTap(ctaData: CtaData? = null) } diff --git a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/listener/UpdateKycStateListener.kt b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/listener/UpdateKycStateListener.kt index e5ebdd6efe..5c9d6b7a66 100644 --- a/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/listener/UpdateKycStateListener.kt +++ b/android/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/listener/UpdateKycStateListener.kt @@ -12,5 +12,6 @@ import com.naviapp.models.RedirectPageStatus interface UpdateKycStateListener { fun onKycSuccess(onAnimationEnd: () -> Unit) + fun onKycFailure(data: Pair? = null) } diff --git a/android/spotless.gradle b/android/spotless.gradle index 755a05ed56..1c5edd6d99 100644 --- a/android/spotless.gradle +++ b/android/spotless.gradle @@ -8,7 +8,8 @@ spotless { } kotlin { - target '**/navi-base/**/*.kt', '**/navi-design/**/*.kt', '**/navi-analytics/**/*.kt', '**/navi-pay/**/*.kt', '**/navi-bbps/**/*.kt', '**/navi-chat/**/*.kt', '**/application-platform/**/*.kt', '**/navi-vkyc/**/*.kt', '**/navi-common/**/*.kt', '**/navi-widgets/**/*.kt', '**/navi-mqtt/**/*.kt' + target '**/*.kt' + targetExclude '**/app/**/*.kt', '**/navi-amc/**/*.kt', '**/navi-coin/**/*.kt', '**/navi-gold/**/*.kt', '**/navi-insurance/**/*.kt', '**/navi-payment/**/*.kt', '**/navi-rr/**/*.kt' licenseHeaderFile rootProject.file('spotless.license') trimTrailingWhitespace()