TP-69840 | HL top-up phase 2 (#11414)

This commit is contained in:
Aditya Piyush
2024-06-18 11:31:00 +05:30
committed by GitHub
parent b07c01ddd8
commit d3f25e161f
7 changed files with 137 additions and 14 deletions

View File

@@ -176,6 +176,8 @@ import com.naviapp.utils.Constants.HPC
import com.naviapp.utils.Constants.LOAN_ACCOUNT_NUMBER
import com.naviapp.utils.Constants.NAVI_BBPS_REQUEST_CODE
import com.naviapp.utils.Constants.NAVI_PAY_REQUEST_CODE
import com.naviapp.utils.Constants.NO
import com.naviapp.utils.Constants.PERMISSION_REQUIRED
import com.naviapp.utils.Constants.S3URL
import com.naviapp.utils.Constants.URL
import com.naviapp.utils.Constants.VERIFICATION_HASH
@@ -814,10 +816,16 @@ object NaviDeepLinkNavigator : DeepLinkListener {
return
}
HL -> {
var isPermissionRequired = true
ctaData.parameters?.forEach { parameters ->
if (parameters.key == PERMISSION_REQUIRED) {
isPermissionRequired = parameters.value != NO
}
}
if (
activity?.let {
hasPermissions(it, getLendingPermissionList()).not()
} == true
} == true && isPermissionRequired
) {
intent =
Intent(activity, LendingPermissionActivity::class.java).apply {

View File

@@ -463,8 +463,8 @@ object Constants {
const val PROFILE = "profile"
const val DEFAULT_PROFILE_BACKGROUND_COLOR = "#F9F9FA"
const val PROFILE_DEFAULT_ANIMATION_TIME = 300
const val SECTION_CONTENT_SIZE = 3
const val PERMISSION_REQUIRED = "permissionRequired"
const val INVESTMENT_TAB_INIT_LANDING_PAGE = "investment_tab_init_landing_page"
// Constants for Animation label

View File

@@ -1,6 +1,6 @@
/*
*
* * Copyright © 2022-2023 by Navi Technologies Limited
* * Copyright © 2022-2024 by Navi Technologies Limited
* * All rights reserved. Strictly confidential
*
*/
@@ -22,6 +22,9 @@ data class HomeLoanIncomeVerificationResponse(
@SerializedName("searchWidgetData")
val searchWidgetData: LabeledTextInputSearchWidgetModel? = null,
@SerializedName("errorBottomSheetData")
val errorBottomSheetData: HomeLoanGenericBottomSheetData? = null
val errorBottomSheetData: HomeLoanGenericBottomSheetData? = null,
@SerializedName("loaderType") val loaderType: String? = null,
@SerializedName("ctaRedirectionOnIncomeVerificationSuccess")
val ctaRedirectionOnIncomeVerificationSuccess: Boolean? = false
)
}

View File

@@ -53,6 +53,41 @@
app:lottie_loop="true"
app:lottie_speed="1.0" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/circular_loader_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"
android:background="@color/white">
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/circular_lottie"
android:layout_width="@dimen/layout_dp_100"
android:layout_height="@dimen/layout_dp_100"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.4"
app:lottie_autoPlay="true"
app:lottie_fileName="navi_new_loader.json"
app:lottie_loop="true"
app:lottie_speed="1.0" />
<com.navi.design.textview.NaviTextView
android:id="@+id/loader_title"
style="@style/ButtonTextBoldBlack"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_20"
android:gravity="center"
android:paddingHorizontal="@dimen/dp_16"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/circular_lottie" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:id="@+id/fullScreenView"
android:layout_width="match_parent"

View File

@@ -68,11 +68,15 @@ import com.navi.hl.steps.viewmodel.HomeLoanLoaderSharedVM
import com.navi.hl.utils.Constants.ACTION
import com.navi.hl.utils.Constants.ALTERNATIVE_CHOSEN
import com.navi.hl.utils.Constants.APPROVED
import com.navi.hl.utils.Constants.CIRCULAR_LOADER
import com.navi.hl.utils.Constants.CTA_REDIRECTION_ENABLED
import com.navi.hl.utils.Constants.FAILURE
import com.navi.hl.utils.Constants.FS_LOTTIE
import com.navi.hl.utils.Constants.HL_NEW
import com.navi.hl.utils.Constants.HOME_LOAN_LOADER
import com.navi.hl.utils.Constants.LAUNCH_PERFIOS_SDK
import com.navi.hl.utils.Constants.LOADER_POLLING_TIMEOUT
import com.navi.hl.utils.Constants.LOADER_TYPE
import com.navi.hl.utils.Constants.LOAN_ACTION_TYPE
import com.navi.hl.utils.Constants.LOAN_APPLICATION_ID
import com.navi.hl.utils.Constants.POLLING_TIMEOUT
@@ -121,6 +125,8 @@ class HLAccountAggregatorActivity : HomeLoanBaseActivity(), HLCommonBottomSheetL
private var customerReferenceId: String? = null
private val commonAnalyticsTracker = CommonNaviAnalytics.naviAnalytics.Errors()
private var loaderQueryMap = HashMap<String, String>()
private var loaderType: String? = null
private var ctaRedirectionEnabled: Boolean? = null
private val anubhavSDK =
registerForActivityResult(OpenFinarkeinAnubhav()) {
@@ -143,6 +149,8 @@ class HLAccountAggregatorActivity : HomeLoanBaseActivity(), HLCommonBottomSheetL
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.account_aggregator_activity)
loaderType = intent?.extras?.getString(LOADER_TYPE).orElse(FS_LOTTIE)
ctaRedirectionEnabled = (intent?.extras?.getBoolean(CTA_REDIRECTION_ENABLED)).orFalse()
setupQueryMap(intent?.extras)
initError(
finarkeinViewModel,
@@ -307,9 +315,25 @@ class HLAccountAggregatorActivity : HomeLoanBaseActivity(), HLCommonBottomSheetL
when (viewState) {
is FinancialDataStatusAsyncResponseState.Init -> {}
is FinancialDataStatusAsyncResponseState.Loading -> {
binding.title.visibility = View.GONE
binding.loaderView.visibility = View.GONE
binding.verificationLoaderView.visibility = View.VISIBLE
when (loaderType) {
FS_LOTTIE -> {
binding.title.visibility = View.GONE
binding.loaderView.visibility = View.GONE
binding.verificationLoaderView.visibility = View.VISIBLE
}
CIRCULAR_LOADER -> {
binding.title.setTextFieldData(
TextFieldData(
text = getString(R.string.verifying_bank_statement),
size = DEFAULT_TEXT_SIZE,
font = FontWeightEnum.TT_MEDIUM.name,
textColor = getString(R.color.colorBlack)
)
)
binding.loaderView.visibility = View.VISIBLE
binding.verificationLoaderView.visibility = View.GONE
}
}
binding.progressLayout.visibility = View.VISIBLE
}
is FinancialDataStatusAsyncResponseState.Failure -> {
@@ -381,7 +405,20 @@ class HLAccountAggregatorActivity : HomeLoanBaseActivity(), HLCommonBottomSheetL
SUCCESS -> {
releasePollingListeners()
logRedirectionEvent(SUCCESS)
getLoaderDetails()
ctaRedirectionEnabled?.let {
if (it) {
successRedirectionCta?.let {
DeepLinkManager.getDeepLinkListener()
?.navigateTo(
activity = this@HLAccountAggregatorActivity,
ctaData = it,
finish = true
)
}
} else {
getLoaderDetails()
}
}
}
FAILURE -> {
releasePollingListeners()

View File

@@ -30,7 +30,7 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Text
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@@ -87,12 +87,16 @@ import com.navi.hl.utils.Constants.ACCOUNT_AGGREGATOR_EMPTY
import com.navi.hl.utils.Constants.ACTION
import com.navi.hl.utils.Constants.API_CALL_LOADER_DELAY_TIME
import com.navi.hl.utils.Constants.APPROVED
import com.navi.hl.utils.Constants.CIRCULAR_LOADER
import com.navi.hl.utils.Constants.CTA_REDIRECTION_ENABLED
import com.navi.hl.utils.Constants.FAILURE
import com.navi.hl.utils.Constants.FLOW_ACCOUNT_AGGREGATOR
import com.navi.hl.utils.Constants.FS_LOTTIE
import com.navi.hl.utils.Constants.INCOME_VERIFICATION
import com.navi.hl.utils.Constants.INCOME_VERIFICATION_UNSUCCESSFUL
import com.navi.hl.utils.Constants.LAUNCH_PERFIOS
import com.navi.hl.utils.Constants.LAUNCH_PERFIOS_SDK
import com.navi.hl.utils.Constants.LOADER_TYPE
import com.navi.hl.utils.Constants.LOAN_ACTION_TYPE
import com.navi.hl.utils.Constants.LOAN_APPLICATION_ID
import com.navi.hl.utils.Constants.OPERATION_CANCELLED_BY_USER
@@ -113,6 +117,7 @@ import com.navi.homeloan.common.listeners.BackListener
import com.navi.homeloan.common.listeners.HLCommonBottomSheetListener
import com.navi.homeloan.common.listeners.HLFooterListener
import com.navi.homeloan.common.models.BankDataResponse
import com.navi.homeloan.common.models.HLFooter
import com.navi.homeloan.common.models.HomeLoanGenericBottomSheetData
import com.navi.homeloan.common.models.IncomeVerificationPollingResponse
import com.navi.homeloan.common.models.incomeverification.HlBankStatementRequestIdRequest
@@ -123,6 +128,8 @@ import com.navi.naviwidgets.adapters.NaviAdapter
import com.navi.naviwidgets.callbacks.WidgetCallback
import com.navi.naviwidgets.extensions.NaviImage
import com.navi.naviwidgets.extensions.NaviTextWidgetized
import com.navi.naviwidgets.extensions.setTextFieldData
import com.navi.naviwidgets.models.response.TextFieldData
import com.navi.naviwidgets.viewholder.ViewHolderFactoryImpl
import com.navi.naviwidgets.widgets.labeledinputsearch.ui.FilterAction
import com.naviapp.common.navigator.NaviHLDeeplinkNavigator
@@ -582,17 +589,29 @@ class HomeLoanIncomeVerificationFragment :
private fun onBankStatementStatusReceived(pollingResponse: IncomeVerificationPollingResponse) {
when (pollingResponse.uploadDataAsyncResponse?.status) {
SUCCESS -> {
getLoaderDetails()
analyticsEventTracker.onPerfiosSuccess()
if (
viewModel.screenResponse.value
?.content
?.ctaRedirectionOnIncomeVerificationSuccess == true
) {
navigateThroughCta(viewModel.screenResponse.value?.footer)
} else {
getLoaderDetails()
}
}
FAILURE -> {
analyticsEventTracker.onPerfiosFailure()
stopPollingAndCallNextScreen(pollingResponse.cta)
logPollingErrorEvent()
analyticsEventTracker.onPerfiosFailure()
}
}
}
private fun navigateThroughCta(footer: HLFooter?) {
footer?.nextCta?.let { moveToNextScreen(it) }
}
private fun logPollingErrorEvent() {
analyticsEventTracker.onHLThirdPartyErrors(
homeLoanType = queryMap[LOAN_ACTION_TYPE],
@@ -837,7 +856,17 @@ class HomeLoanIncomeVerificationFragment :
binding.searchContentRv.visibility = View.GONE
binding.searchWidget.visibility = View.GONE
listener?.hideTrackerHeader()
binding.verificationLoaderView.visibility = View.VISIBLE
viewModel.screenResponse.value?.content?.loaderType?.let {
when (it) {
FS_LOTTIE -> binding.verificationLoaderView.visibility = View.VISIBLE
CIRCULAR_LOADER -> {
binding.loaderTitle.setTextFieldData(
TextFieldData(text = getString(CommonR.string.verifying_bank_statement))
)
binding.circularLoaderView.visibility = View.VISIBLE
}
}
} ?: run { binding.verificationLoaderView.visibility = View.VISIBLE }
}
private fun hideLottieLoader() {
@@ -845,6 +874,7 @@ class HomeLoanIncomeVerificationFragment :
binding.searchWidget.visibility = View.VISIBLE
listener?.showTrackerHeader()
binding.verificationLoaderView.visibility = View.GONE
binding.circularLoaderView.visibility = View.GONE
}
private fun navigateAsPerProvider(
@@ -862,6 +892,14 @@ class HomeLoanIncomeVerificationFragment :
analyticsEventTracker.onIncomeVerificationOnemoneyFlow()
}
val bundle = Bundle()
bundle.putString(LOADER_TYPE, viewModel.screenResponse.value?.content?.loaderType)
bundle.putBoolean(
CTA_REDIRECTION_ENABLED,
viewModel.screenResponse.value
?.content
?.ctaRedirectionOnIncomeVerificationSuccess
.orFalse()
)
bundle.putString(FIP_ID, fipId)
bundle.putString(Constants.INITIATED_BY, ModuleNameV2.HL.name)
bundle.putString(Constants.SERVICE_PROVIDER, serviceProvider)

View File

@@ -61,8 +61,6 @@ object Constants {
const val SELFIE_UPLOAD_UNSUCCESSFUL = "SELFIE_UPLOAD_UNSUCCESSFUL"
const val INCOME_VERIFICATION_UNSUCCESSFUL = "INCOME_VERIFICATION_UNSUCCESSFUL"
const val OPERATION_CANCELLED_BY_USER = "OPERATION_CANCELLED_BY_USER"
const val OFFER_SUCCESS_CTA = "OFFER_SUCCESS_CTA"
const val OFFER_AMOUNT_TEXT = "OFFER_AMOUNT_TEXT"
const val APPROVED = "APPROVED"
const val REJECTED = "REJECTED"
const val PINCODE_SIZE = 6
@@ -132,4 +130,8 @@ object Constants {
const val PAN_VERIFICATION_BOTTOM_SHEET = "PAN_VERIFICATION_BOTTOM_SHEET"
const val TOP_UP_PROPERTY_DETAILS = "TOP_UP_PROPERTY_DETAILS"
const val TOP_UP_SELECT_LOAN_PURPOSE = "TOP_UP_SELECT_LOAN_PURPOSE"
const val LOADER_TYPE = "LOADER_TYPE"
const val FS_LOTTIE = "FS_LOTTIE"
const val CIRCULAR_LOADER = "CIRCULAR_LOADER"
const val CTA_REDIRECTION_ENABLED = "CTA_REDIRECTION_ENABLED"
}