From d835956f3f183f6f8cecfd469c28a668c88092b5 Mon Sep 17 00:00:00 2001 From: Shivam Goyal Date: Thu, 1 Jun 2023 15:42:57 +0530 Subject: [PATCH] =?UTF-8?q?TP-00000=20|=20Master=20=E2=86=92=20Development?= =?UTF-8?q?=20(Release=203.4.0)=20(#6731)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * TP-25730 | PL as Dynamic Module (#6120) --- .github/workflows/generate_apk.yml | 4 +- app/build.gradle | 9 +- app/src/main/AndroidManifest.xml | 84 +--- .../AccountAggregatorActivity.kt | 6 +- .../repository/FinarkeinRepository.kt | 3 +- .../viewmodel/FinarkeinVM.kt | 8 +- .../analytics/deeplink/DeeplinkManager.kt | 17 + .../naviapp/analytics/utils/NaviAnalytics.kt | 120 ++++- .../java/com/naviapp/app/NaviApplication.kt | 13 +- .../FooterViewWithTitleDescription.kt | 4 +- .../common/customview/NaviHeaderView.kt | 5 + .../customview/SecurityTextWithIconView.kt | 4 +- .../customview/SelectorTileViewGroup.kt | 36 +- .../common/customview/SelectorViewGroup.kt | 36 +- .../common/fragment/ChoiceBottomSheet.kt | 4 +- .../common/fragment/InfoBottomSheetV3.kt | 2 - .../common/fragment/PromotionActivity.kt | 108 +++++ .../common/navigator/NaviDeepLinkNavigator.kt | 304 +++++++++---- .../common/navigator/ScreenNavigator.kt | 54 ++- .../common/repository/ConfigRepository.kt | 29 -- .../common/repository/PromotionRepository.kt | 22 + .../naviapp/common/viewmodel/PromotionVM.kt | 90 ++++ .../fragments/BankChangeDetailsFragment.kt | 2 - .../viewmodels/BankChangeDetailsViewModel.kt | 7 +- .../activity/AppSettingsActivity.kt | 131 ++++++ .../appsettings/model/AppSettingsResponse.kt | 30 ++ .../repository/AppSettingsRepository.kt | 24 + .../appsettings/viewmodel/AppSettingsVM.kt | 36 ++ .../activity/DynamicDeliveryActivity.kt | 384 ++++++++++++++++ .../viewmodel/DynamicDeliveryVM.kt | 137 ++++++ .../home/activity/NewDashboardActivity.kt | 76 ++-- .../com/naviapp/home/fragment/HomeFragment.kt | 44 +- .../com/naviapp/home/model/WidgetResponse.kt | 2 + .../naviapp/home/respository/GlobalRepo.kt | 6 + .../home/respository/HomeRepository.kt | 6 + .../java/com/naviapp/home/viewmodel/HomeVM.kt | 6 +- .../java/com/naviapp/models/LoginSettings.kt | 3 +- .../models/response/BankStatementResponse.kt | 1 - .../response/PermissionDetailsResponse.kt | 1 + .../network/retrofit/ResponseCallback.kt | 4 +- .../network/retrofit/RetrofitService.kt | 26 +- .../activities/MandatePermissionActivity.kt | 89 ++-- .../models/LoginPermissionResponse.kt | 4 +- .../repository/PermissionRepository.kt | 12 +- .../permission/utils/PermissionUtil.kt | 8 +- .../permission/viewmodel/LoginPermissionVM.kt | 14 - .../viewmodel/PermissionViewModel.kt | 17 + .../personalloan/di/PersonalLoanModule.kt | 16 +- .../BankAccountVerificationLoaderActivity.kt | 10 +- .../getloan/activities/GetLoanActivity.kt | 13 +- .../viewmodels/AddressVerificationVM.kt | 25 +- .../AccountAggregatorFragment.kt | 26 +- .../repositories/BankDetailsRepository.kt | 3 +- .../bankdetails/viewmodels/BankDetailsVM.kt | 8 +- .../bankdetails/viewmodels/SelectBankVM.kt | 7 +- .../getloan/kyc/viewmodels/KycVM.kt | 10 +- .../repositories/EmiSelectorRepository.kt | 15 +- .../loandetails/viewmodels/EmiSelectorVM.kt | 7 +- .../loandetails/viewmodels/GstDetailsVM.kt | 7 +- .../repositories/GstDetailsRepository.kt | 23 +- .../repositories/SkipMandateRepository.kt | 20 +- .../personalloan/getloan/utils/FaqsUtil.kt | 429 +++++++++++------- .../getloan/viewmodels/SkipMandateVM.kt | 7 +- .../activity/IntermediateActivity.kt | 23 +- .../BankDetailsLoaderPostKycActivity.kt | 21 +- .../fragment/BankDetailsPostKycFragment.kt | 6 +- .../BankStatementVerificationMethodView.kt | 3 +- .../common/customview/EmiTenureSummaryView.kt | 4 +- .../customview/LoanAmountSummaryV2View.kt | 10 +- .../customview/LoanAmountSummaryView.kt | 8 +- .../common/customview/TopUpLoanSummaryView.kt | 8 +- .../customview/ViewDescriptionCtaView.kt | 9 - .../customview/BoxWithIconTitleView.kt | 27 -- ...BankAccountVerificationLoaderV2Activity.kt | 22 +- .../activities/SkipMandateV2Activity.kt | 2 - .../BankDetailsAutoDebitV2Fragment.kt | 23 +- .../fragments/BankDetailsV2Fragment.kt | 9 +- .../fragments/SelectBankV2Fragment.kt | 2 - .../fragments/SelectBankV3Fragment.kt | 8 +- .../repository/LoanDetailsV2Repository.kt | 5 +- .../repository/LoanEditorRepository.kt | 14 +- .../LoanOfferUpgradeV3Repository.kt | 14 +- .../FreshLoanDetailsV2FragmentVM.kt | 10 +- .../viewmodels/GetLoanV2SharedVM.kt | 15 +- .../viewmodels/LoanDetailsV2FragmentVM.kt | 7 +- .../getloanRevamp/viewmodels/LoanEditorVM.kt | 14 +- .../LoanOfferUpgradeV3FragmentVM.kt | 19 +- .../viewmodels/SkipMandateV2VM.kt | 7 +- .../helper/IntermediateV2Helper.kt | 67 --- .../personalloanrevamp/models/CtaType.kt | 33 ++ .../response/PersonalLoanTrackerResponse.kt | 6 +- .../activities/PermissionV2Activity.kt | 190 ++++---- .../helper/LoanSummaryV2Helper.kt | 24 - .../PersonalLoanTrackerRepository.kt | 13 +- .../viewmodels/PersonalLoanTrackerVM.kt | 22 +- .../receiver/WifiTrackerBaseActivity.kt | 40 -- .../com/naviapp/registration/LoginFragment.kt | 74 ++- .../com/naviapp/registration/OtpFragment.kt | 107 ++++- .../com/naviapp/registration/OtpFragmentV2.kt | 3 +- .../registration/RegistrationActivity.kt | 26 +- .../naviapp/registration/SplashActivity.kt | 32 +- .../registration/WhatsAppLoginFragment.kt | 18 +- .../registration/helper/TrueCallerHelper.kt | 10 +- .../repositories/RegisterRepository.kt | 10 +- .../registration/viewmodel/ConfigVM.kt | 15 +- .../registration/viewmodel/RegistrationVM.kt | 18 +- .../main/java/com/naviapp/utils/Constants.kt | 28 ++ app/src/main/java/com/naviapp/utils/Ext.kt | 13 +- .../main/java/com/naviapp/utils/MockUtil.kt | 25 + .../main/java/com/naviapp/utils/Utility.kt | 34 +- .../res/drawable/bg_lottie_dance_floor.xml | 89 ++++ .../main/res/drawable/finserv_logo_purple.xml | 73 +++ .../main/res/drawable/finserv_logo_white.xml | 73 +++ .../main/res/drawable/ic_purple_checkbox.xml | 13 + .../res/layout/activity_dynamic_delivery.xml | 143 ++++++ .../res/layout/activity_login_permission.xml | 10 +- .../res/layout/activity_permission_v2.xml | 44 +- .../main/res/layout/app_settings_activity.xml | 32 ++ .../main/res/layout/app_settings_items.xml | 62 +++ app/src/main/res/layout/fragment_home_ln.xml | 2 +- app/src/main/res/layout/login_fragment.xml | 19 + app/src/main/res/layout/otp_fragment.xml | 32 +- .../res/layout/whatsapp_login_fragment.xml | 2 +- app/src/main/res/values/strings.xml | 29 +- app/src/main/res/values/styles.xml | 2 +- .../src/main/res/layout/fund_buy_activity.xml | 2 +- .../src/main/res/layout/kyc_activity_amc.xml | 2 +- .../main/res/layout/sip_calendar_layout.xml | 2 +- .../base/deeplink/util/DeeplinkConstants.kt | 2 +- .../com/navi/base/model/NaviClickAction.kt | 6 +- .../navi/base/sharedpref/PreferenceManager.kt | 10 + .../com/navi/common/customview}/HeaderView.kt | 12 +- .../FirebaseRemoteConfigHelper.kt | 2 + .../main/java/com/navi/common/model/Header.kt | 2 +- .../model/vkyc/WaitingPageDetailsResponse.kt | 3 +- .../navi/common/ui/activity/BaseActivity.kt | 4 + .../fragment/HorizontalActionErrorFragment.kt | 13 +- .../java/com/navi/common/utils/Constants.kt | 9 + .../navi/common/utils/DynamicDeliveryUtil.kt | 60 +++ .../main/java/com/navi/common/utils/Keys.kt | 3 +- .../common/utils/TemporaryStorageHelper.kt | 1 + .../src/main/res/layout/header_layout.xml | 0 .../com/navi/design/utils/AnimationUtils.kt | 15 + .../res/drawable/checkbox_green_button.xml | 13 + .../res/drawable/checkbox_green_checked.xml | 19 + .../res/drawable/checkbox_green_unchecked.xml | 21 + navi-design/src/main/res/values/colors.xml | 2 + .../com/navi/payment/base/PaymentManager.kt | 13 +- navi-pl/build.gradle | 41 -- navi-pl/consumer-rules.pro | 0 navi-pl/src/main/AndroidManifest.xml | 11 - .../VKYCWaitingForExecutiveFragment.kt | 77 +--- .../res/layout/vkyc_timer_card_layout.xml | 28 +- .../res/layout/vkyc_waiting_for_executive.xml | 19 +- navi-vkyc/src/main/res/values/strings.xml | 1 + .../navi/naviwidgets/extensions/WidgetExt.kt | 9 + .../naviwidgets/models/ActionButtonWidget.kt | 2 + .../navi/naviwidgets/models/StepsWidget.kt | 9 +- .../models/response/AdvertisementWidget.kt | 1 + .../naviwidgets/models/response/Footer.kt | 3 +- .../models/response/HomeProductWidget.kt | 2 + .../com/navi/naviwidgets/utils/LottieEnums.kt | 6 +- .../naviwidgets/utils/NaviWidgetIconUtils.kt | 22 + .../widgets/ActionButtonWidgetLayout.kt | 9 + .../widgets/AdvertisementWidgetLayout.kt | 7 +- .../widgets/HomeProductWidgetLayout.kt | 2 + .../naviwidgets/widgets/StepsWidgetLayout.kt | 13 +- .../drawable/ic_background_gradient_white.xml | 33 ++ .../main/res/drawable/ic_call_new_theme.xml | 20 + .../drawable/ic_cash_loan_settings_svg.xml | 55 +++ .../main/res/drawable/ic_contacts_denied.xml | 50 ++ .../drawable/ic_contacts_new_purple_theme.xml | 50 ++ .../main/res/drawable/ic_device_denied.xml | 63 +++ .../drawable/ic_device_new_purple_theme.xml | 63 +++ .../drawable/ic_internal_app_settings_svg.xml | 22 + .../main/res/drawable/ic_location_denied.xml | 52 +++ .../drawable/ic_location_new_purple_theme.xml | 52 +++ .../drawable/ic_new_chevron_purple_theme.xml | 19 + .../src/main/res/drawable/ic_no_call.xml | 46 ++ .../res/drawable/ic_purple_selected_state.xml | 21 + .../drawable/ic_purple_unselected_state.xml | 19 + .../main/res/drawable/ic_resend_new_theme.xml | 21 + .../src/main/res/drawable/ic_sms_denied.xml | 50 ++ .../res/drawable/ic_sms_new_purple_theme.xml | 50 ++ .../res/drawable/ic_whatsapp_right_arrow.xml | 24 + .../drawable/rounded_grey_4_radius_f5f5f5.xml | 16 + .../res/layout/advertisment_widget_layout.xml | 34 +- .../res/layout/home_product_widget_layout.xml | 29 +- .../res/raw/dynamic_delivery_downloading.json | 1 + .../res/raw/dynamic_delivery_installed.json | 1 + .../res/raw/dynamic_delivery_installing.json | 1 + {navi-pl => navi_pl_dynamic}/.gitignore | 0 navi_pl_dynamic/build.gradle | 77 ++++ .../proguard-rules.pro | 0 .../pl/dynamic}/ExampleInstrumentedTest.kt | 6 +- navi_pl_dynamic/src/main/AndroidManifest.xml | 96 ++++ .../activity/ErrorScreenV2Activity.kt | 42 +- .../pl/dynamic/activity}/GetLoanV2Activity.kt | 60 ++- .../activity}/IntermediateV2Activity.kt | 30 +- .../activity}/LoanAgreementV2Activity.kt | 24 +- .../LoanDisbursementLoaderV2Activity.kt | 51 ++- .../LoanEligibilityLoaderV2Activity.kt | 60 ++- .../activity}/NewLoanConsentActivity.kt | 74 +-- .../activity/PanVerificationLoaderActivity.kt | 52 ++- .../activity}/PersonalLoanTrackerActivity.kt | 83 +++- .../activity}/UserIdentificationV2Activity.kt | 26 +- .../adapter/CurrentAddressItemsV2Adapter.kt | 17 +- .../pl/dynamic}/adapter/KycItemsV2Adapter.kt | 4 +- .../adapter/MultipleKycItemAdapter.kt | 4 +- .../adapter/PersonalLoanTrackerAdapter.kt | 17 +- .../pl/dynamic}/adapter/ReasonV2Adapter.kt | 4 +- .../adapter/RejectionReasonV2Adapter.kt | 4 +- .../pl/dynamic}/adapter/SolutionAdapter.kt | 10 +- .../fragment}/BankStatementInfoBottomSheet.kt | 11 +- .../fragment}/BankStatementV2Fragment.kt | 67 ++- .../DelayedDisbursementV2Fragment.kt | 28 +- .../EffectiveInterestCostV2Fragment.kt | 10 +- .../fragment}/EmiSelectorV2Fragment.kt | 26 +- .../EmploymentOtpVerificationFragment.kt | 33 +- .../EmploymentVerificationV2Fragment.kt | 64 ++- .../pl/dynamic/fragment}/ErrorV2Fragment.kt | 14 +- .../fragment}/FreshLoanDetailsV2Fragment.kt | 175 ++++--- .../GstVerificationPasswordV2Fragment.kt | 57 +-- .../fragment}/GstVerificationV2Fragment.kt | 42 +- .../dynamic/fragment}/InReviewV2Fragment.kt | 2 +- .../fragment/KycAddressProofV2Fragment.kt | 34 +- .../dynamic}/fragment/KycAddressV2Fragment.kt | 42 +- .../fragment/KycDocumentListFragmentV2.kt | 14 +- .../pl/dynamic}/fragment/KycV2Fragment.kt | 93 ++-- .../fragment}/LoanDetailsEditorFragment.kt | 48 +- .../fragment}/LoanDetailsV2BaseFragment.kt | 2 +- .../fragment}/LoanDetailsV2Fragment.kt | 151 +++--- .../fragment}/LoanOfferUpgradeV2Fragment.kt | 15 +- .../fragment}/LoanOfferUpgradeV3Fragment.kt | 14 +- .../fragment}/LoanSummaryV2Fragment.kt | 47 +- .../dynamic/fragment}/MFIConsentV2Fragment.kt | 11 +- .../dynamic/fragment}/MFIErrorFragmentV2.kt | 16 +- .../pl/dynamic/fragment}/MFIInfoV2Fragment.kt | 4 +- .../pl/dynamic/fragment}/NaviWebViewClient.kt | 5 +- .../fragment}/OfferInReviewFragment.kt | 6 +- .../fragment}/OfferUpgradeInfoBottomSheet.kt | 12 +- .../fragment}/PanVerificationBottomSheet.kt | 26 +- .../pl/dynamic/fragment}/ProfileV2Fragment.kt | 117 ++--- .../StyledTitleDescriptionBottomSheet.kt | 28 +- .../dynamic/fragment}/TelcoOtpV2Fragment.kt | 22 +- .../fragment}/TopupLoanIntroV2Fragment.kt | 10 +- .../TrueCallerAuthenticatorFragment.kt | 12 +- .../fragment}/UPIProgressBlockerFragment.kt | 26 +- .../fragment}/UpcomingEmiDetailsV2Fragment.kt | 17 +- .../dynamic}/fragment/VideoKycV2Fragment.kt | 64 +-- .../pl/dynamic/fragment}/WorkV2Fragment.kt | 95 ++-- .../navi/pl/dynamic}/helper/AddressHelper.kt | 25 +- .../pl/dynamic}/helper/GetLoanV2Helper.kt | 53 ++- .../pl/dynamic/helper/IntermediateV2Helper.kt | 45 ++ .../pl/dynamic}/helper/KycAddressV2Helper.kt | 11 +- .../helper/ProfileV2FragmentHelper.kt | 11 +- .../helper/UserIdentificationV2Helper.kt | 30 +- .../com/navi/pl/dynamic/helper}/VKycHelper.kt | 4 +- .../dynamic}/helper/WorkV2FragmentHelper.kt | 10 +- .../listener/MultipleKycItemListeners.kt | 3 +- .../listener/UpdateKycStateListener.kt | 4 +- .../pl/dynamic/util/BindingAdapterUtil.kt | 206 +++++++++ .../main/res/drawable/bg_border_1_e3e5e5.xml | 11 + .../drawable/bg_border_orange_rounded_8.xml | 15 + .../layout/pl_activity_error_screen_v2.xml | 0 .../res/layout/pl_activity_get_loan_v2.xml | 2 +- .../layout/pl_activity_intermediate_v2.xml | 0 .../layout/pl_activity_loan_agreement_v2.xml | 0 ...l_activity_loan_disbursement_loader_v2.xml | 0 ...pl_activity_loan_eligibility_loader_v2.xml | 0 .../layout/pl_activity_new_loan_consent.xml | 2 +- .../pl_activity_pan_verification_loader.xml | 2 +- .../pl_activity_personal_loan_tracker.xml | 128 ++++-- .../pl_activity_user_identification_v2.xml | 0 .../layout/pl_fragment_bank_statement_v2.xml | 0 .../pl_fragment_delayed_disbursement_v2.xml | 0 ...pl_fragment_effective_interest_cost_v2.xml | 2 +- .../layout/pl_fragment_emi_selector_v2.xml | 2 +- ...l_fragment_employment_otp_verification.xml | 0 ...pl_fragment_employment_verification_v2.xml | 0 .../main/res/layout/pl_fragment_error_v2.xml | 2 +- .../pl_fragment_fresh_loan_details_v2.xml | 6 +- ..._fragment_gst_verification_password_v2.xml | 2 +- .../pl_fragment_gst_verification_v2.xml | 2 +- .../pl_fragment_kyc_address_proof_v2.xml | 2 +- .../res/layout/pl_fragment_kyc_address_v2.xml | 6 +- .../pl_fragment_kyc_document_list_v2.xml | 39 ++ .../main/res/layout/pl_fragment_kyc_v2.xml | 2 +- .../layout/pl_fragment_loan_details_v2.xml | 6 +- .../pl_fragment_loan_offer_upgrade_v3.xml | 0 .../layout/pl_fragment_loan_summary_v2.xml | 2 +- .../res/layout/pl_fragment_mfi_consent_v2.xml | 0 .../res/layout/pl_fragment_mfi_error_v2.xml | 2 +- ..._fragment_pan_verification_bottomsheet.xml | 0 .../res/layout/pl_fragment_profile_v2.xml | 0 ...t_styled_title_description_bottomsheet.xml | 0 .../res/layout/pl_fragment_telco_otp_v2.xml | 0 .../pl_fragment_topup_loan_intro_v2.xml | 0 .../pl_fragment_true_caller_authenticator.xml | 0 .../pl_fragment_upcoming_emi_details_v2.xml | 0 .../pl_fragment_upi_progress_blocker.xml | 4 +- .../main/res/layout/pl_fragment_work_v2.xml | 0 .../pl_layout_address_radio_button_v2.xml | 0 .../layout/pl_layout_address_status_v2.xml | 4 +- .../pl_layout_banner_with_tip_and_title.xml | 0 .../pl_layout_box_with_icon_title_view.xml | 0 ...fective_interest_cost_calculation_card.xml | 160 +++++++ ...ve_interest_cost_calculation_card_item.xml | 60 +++ .../layout/pl_layout_footer_timed_banner.xml | 0 .../layout/pl_layout_header_timed_banner.xml | 0 .../res/layout/pl_layout_important_note.xml | 67 +++ .../layout/pl_layout_item_loan_feature.xml | 0 .../res/layout/pl_layout_kyc_address_v2.xml | 0 .../main/res/layout/pl_layout_kyc_failed.xml | 0 .../res/layout/pl_layout_loan_summary_emi.xml | 6 +- .../layout/pl_layout_notification_header.xml | 50 ++ .../pl_layout_title_with_description_view.xml | 0 .../res/layout/pl_layout_tracker_screen.xml | 0 .../layout/pl_layout_transfer_bottomsheet.xml | 0 .../res/layout/pl_layout_try_again_after.xml | 0 .../src/main/res/values/strings.xml | 12 + .../com/navi/pl/dynamic}/ExampleUnitTest.kt | 6 +- settings.gradle | 2 +- 323 files changed, 6503 insertions(+), 2357 deletions(-) create mode 100644 app/src/main/java/com/naviapp/common/fragment/PromotionActivity.kt create mode 100644 app/src/main/java/com/naviapp/common/repository/PromotionRepository.kt create mode 100644 app/src/main/java/com/naviapp/common/viewmodel/PromotionVM.kt create mode 100644 app/src/main/java/com/naviapp/dashboard/menu/appsettings/activity/AppSettingsActivity.kt create mode 100644 app/src/main/java/com/naviapp/dashboard/menu/appsettings/model/AppSettingsResponse.kt create mode 100644 app/src/main/java/com/naviapp/dashboard/menu/appsettings/repository/AppSettingsRepository.kt create mode 100644 app/src/main/java/com/naviapp/dashboard/menu/appsettings/viewmodel/AppSettingsVM.kt create mode 100644 app/src/main/java/com/naviapp/dynamicdelivery/activity/DynamicDeliveryActivity.kt create mode 100644 app/src/main/java/com/naviapp/dynamicdelivery/viewmodel/DynamicDeliveryVM.kt delete mode 100644 app/src/main/java/com/naviapp/personalloanrevamp/customview/BoxWithIconTitleView.kt delete mode 100644 app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2/helper/IntermediateV2Helper.kt create mode 100644 app/src/main/java/com/naviapp/personalloanrevamp/models/CtaType.kt delete mode 100644 app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/helper/LoanSummaryV2Helper.kt create mode 100644 app/src/main/res/drawable/bg_lottie_dance_floor.xml create mode 100644 app/src/main/res/drawable/finserv_logo_purple.xml create mode 100644 app/src/main/res/drawable/finserv_logo_white.xml create mode 100644 app/src/main/res/drawable/ic_purple_checkbox.xml create mode 100644 app/src/main/res/layout/activity_dynamic_delivery.xml create mode 100644 app/src/main/res/layout/app_settings_activity.xml create mode 100644 app/src/main/res/layout/app_settings_items.xml rename {navi-amc/src/main/java/com/navi/amc/common/view => navi-common/src/main/java/com/navi/common/customview}/HeaderView.kt (88%) create mode 100644 navi-common/src/main/java/com/navi/common/utils/DynamicDeliveryUtil.kt rename {navi-amc => navi-common}/src/main/res/layout/header_layout.xml (100%) create mode 100644 navi-design/src/main/res/drawable/checkbox_green_button.xml create mode 100644 navi-design/src/main/res/drawable/checkbox_green_checked.xml create mode 100644 navi-design/src/main/res/drawable/checkbox_green_unchecked.xml delete mode 100644 navi-pl/build.gradle delete mode 100644 navi-pl/consumer-rules.pro delete mode 100644 navi-pl/src/main/AndroidManifest.xml create mode 100644 navi-widgets/src/main/res/drawable/ic_background_gradient_white.xml create mode 100644 navi-widgets/src/main/res/drawable/ic_call_new_theme.xml create mode 100644 navi-widgets/src/main/res/drawable/ic_cash_loan_settings_svg.xml create mode 100644 navi-widgets/src/main/res/drawable/ic_contacts_denied.xml create mode 100644 navi-widgets/src/main/res/drawable/ic_contacts_new_purple_theme.xml create mode 100644 navi-widgets/src/main/res/drawable/ic_device_denied.xml create mode 100644 navi-widgets/src/main/res/drawable/ic_device_new_purple_theme.xml create mode 100644 navi-widgets/src/main/res/drawable/ic_internal_app_settings_svg.xml create mode 100644 navi-widgets/src/main/res/drawable/ic_location_denied.xml create mode 100644 navi-widgets/src/main/res/drawable/ic_location_new_purple_theme.xml create mode 100644 navi-widgets/src/main/res/drawable/ic_new_chevron_purple_theme.xml create mode 100644 navi-widgets/src/main/res/drawable/ic_no_call.xml create mode 100644 navi-widgets/src/main/res/drawable/ic_purple_selected_state.xml create mode 100644 navi-widgets/src/main/res/drawable/ic_purple_unselected_state.xml create mode 100644 navi-widgets/src/main/res/drawable/ic_resend_new_theme.xml create mode 100644 navi-widgets/src/main/res/drawable/ic_sms_denied.xml create mode 100644 navi-widgets/src/main/res/drawable/ic_sms_new_purple_theme.xml create mode 100644 navi-widgets/src/main/res/drawable/ic_whatsapp_right_arrow.xml create mode 100644 navi-widgets/src/main/res/drawable/rounded_grey_4_radius_f5f5f5.xml create mode 100644 navi-widgets/src/main/res/raw/dynamic_delivery_downloading.json create mode 100644 navi-widgets/src/main/res/raw/dynamic_delivery_installed.json create mode 100644 navi-widgets/src/main/res/raw/dynamic_delivery_installing.json rename {navi-pl => navi_pl_dynamic}/.gitignore (100%) create mode 100644 navi_pl_dynamic/build.gradle rename {navi-pl => navi_pl_dynamic}/proguard-rules.pro (100%) rename {navi-pl/src/androidTest/java/com/navi/pl => navi_pl_dynamic/src/androidTest/java/com/navi/pl/dynamic}/ExampleInstrumentedTest.kt (80%) create mode 100644 navi_pl_dynamic/src/main/AndroidManifest.xml rename {app/src/main/java/com/naviapp/personalloanrevamp/error => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/activity/ErrorScreenV2Activity.kt (91%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/activities => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity}/GetLoanV2Activity.kt (93%) rename {app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2 => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity}/IntermediateV2Activity.kt (89%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/activities => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity}/LoanAgreementV2Activity.kt (93%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/activities => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity}/LoanDisbursementLoaderV2Activity.kt (90%) rename {app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/activities => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity}/LoanEligibilityLoaderV2Activity.kt (95%) rename {app/src/main/java/com/naviapp/dashboard/newloan => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity}/NewLoanConsentActivity.kt (67%) rename {app/src/main/java/com/naviapp/personalloanrevamp/kyc => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/activity/PanVerificationLoaderActivity.kt (91%) rename {app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/activities => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity}/PersonalLoanTrackerActivity.kt (74%) rename {app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/activities => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity}/UserIdentificationV2Activity.kt (94%) rename {app/src/main/java/com/naviapp/personalloanrevamp/addressverificationrevamp => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/adapter/CurrentAddressItemsV2Adapter.kt (83%) rename {app/src/main/java/com/naviapp/personalloanrevamp/kyc => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/adapter/KycItemsV2Adapter.kt (98%) rename {app/src/main/java/com/naviapp/personalloanrevamp/kyc => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/adapter/MultipleKycItemAdapter.kt (96%) rename {app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2 => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/adapter/PersonalLoanTrackerAdapter.kt (83%) rename {app/src/main/java/com/naviapp/personalloanrevamp/error => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/adapter/ReasonV2Adapter.kt (92%) rename {app/src/main/java/com/naviapp/personalloanrevamp/error => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/adapter/RejectionReasonV2Adapter.kt (93%) rename {app/src/main/java/com/naviapp/personalloanrevamp/error => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/adapter/SolutionAdapter.kt (88%) rename {app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/BankStatementInfoBottomSheet.kt (95%) rename {app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/BankStatementV2Fragment.kt (94%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/DelayedDisbursementV2Fragment.kt (83%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/EffectiveInterestCostV2Fragment.kt (95%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/EmiSelectorV2Fragment.kt (94%) rename {app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/EmploymentOtpVerificationFragment.kt (92%) rename {app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/EmploymentVerificationV2Fragment.kt (89%) rename {app/src/main/java/com/naviapp/personalloanrevamp/error/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/ErrorV2Fragment.kt (93%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/FreshLoanDetailsV2Fragment.kt (92%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/GstVerificationPasswordV2Fragment.kt (91%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/GstVerificationV2Fragment.kt (89%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/InReviewV2Fragment.kt (99%) rename {app/src/main/java/com/naviapp/personalloanrevamp/addressverificationrevamp => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/fragment/KycAddressProofV2Fragment.kt (95%) rename {app/src/main/java/com/naviapp/personalloanrevamp/addressverificationrevamp => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/fragment/KycAddressV2Fragment.kt (95%) rename {app/src/main/java/com/naviapp/personalloanrevamp/kyc => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/fragment/KycDocumentListFragmentV2.kt (92%) rename {app/src/main/java/com/naviapp/personalloanrevamp/kyc => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/fragment/KycV2Fragment.kt (94%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/LoanDetailsEditorFragment.kt (94%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/LoanDetailsV2BaseFragment.kt (99%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/LoanDetailsV2Fragment.kt (94%) rename {app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/LoanOfferUpgradeV2Fragment.kt (95%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/LoanOfferUpgradeV3Fragment.kt (96%) rename {app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/LoanSummaryV2Fragment.kt (93%) rename {app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/MFIConsentV2Fragment.kt (93%) rename {app/src/main/java/com/naviapp/personalloanrevamp/error/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/MFIErrorFragmentV2.kt (94%) rename {app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/MFIInfoV2Fragment.kt (97%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/NaviWebViewClient.kt (95%) rename {app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/OfferInReviewFragment.kt (98%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/OfferUpgradeInfoBottomSheet.kt (95%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/PanVerificationBottomSheet.kt (79%) rename {app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/ProfileV2Fragment.kt (89%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/StyledTitleDescriptionBottomSheet.kt (71%) rename {app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/TelcoOtpV2Fragment.kt (94%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/TopupLoanIntroV2Fragment.kt (96%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/TrueCallerAuthenticatorFragment.kt (95%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/UPIProgressBlockerFragment.kt (93%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/UpcomingEmiDetailsV2Fragment.kt (91%) rename {app/src/main/java/com/naviapp/personalloanrevamp/kyc => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/fragment/VideoKycV2Fragment.kt (92%) rename {app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment}/WorkV2Fragment.kt (89%) rename {app/src/main/java/com/naviapp/personalloanrevamp/addressverificationrevamp => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/helper/AddressHelper.kt (55%) rename {app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/helper/GetLoanV2Helper.kt (77%) create mode 100644 navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/IntermediateV2Helper.kt rename {app/src/main/java/com/naviapp/personalloanrevamp/addressverificationrevamp => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/helper/KycAddressV2Helper.kt (95%) rename {app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2 => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/helper/ProfileV2FragmentHelper.kt (97%) rename {app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2 => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/helper/UserIdentificationV2Helper.kt (52%) rename {app/src/main/java/com/naviapp/personalloanrevamp/kyc/utils => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper}/VKycHelper.kt (94%) rename {app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2 => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/helper/WorkV2FragmentHelper.kt (93%) rename {app/src/main/java/com/naviapp/personalloanrevamp/kyc => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/listener/MultipleKycItemListeners.kt (86%) rename {app/src/main/java/com/naviapp/personalloanrevamp/kyc => navi_pl_dynamic/src/main/java/com/navi/pl/dynamic}/listener/UpdateKycStateListener.kt (76%) create mode 100644 navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/util/BindingAdapterUtil.kt create mode 100644 navi_pl_dynamic/src/main/res/drawable/bg_border_1_e3e5e5.xml create mode 100644 navi_pl_dynamic/src/main/res/drawable/bg_border_orange_rounded_8.xml rename app/src/main/res/layout/activity_error_screen_v2.xml => navi_pl_dynamic/src/main/res/layout/pl_activity_error_screen_v2.xml (100%) rename app/src/main/res/layout/activity_get_loan_v2.xml => navi_pl_dynamic/src/main/res/layout/pl_activity_get_loan_v2.xml (98%) rename app/src/main/res/layout/activity_intermediate_v2.xml => navi_pl_dynamic/src/main/res/layout/pl_activity_intermediate_v2.xml (100%) rename app/src/main/res/layout/activity_loan_agreement_v2.xml => navi_pl_dynamic/src/main/res/layout/pl_activity_loan_agreement_v2.xml (100%) rename app/src/main/res/layout/activity_loan_disbursement_loader_v2.xml => navi_pl_dynamic/src/main/res/layout/pl_activity_loan_disbursement_loader_v2.xml (100%) rename app/src/main/res/layout/activity_loan_eligibility_loader_v2.xml => navi_pl_dynamic/src/main/res/layout/pl_activity_loan_eligibility_loader_v2.xml (100%) rename app/src/main/res/layout/activity_new_loan_consent.xml => navi_pl_dynamic/src/main/res/layout/pl_activity_new_loan_consent.xml (98%) rename app/src/main/res/layout/pan_verification_loader_activity.xml => navi_pl_dynamic/src/main/res/layout/pl_activity_pan_verification_loader.xml (98%) rename app/src/main/res/layout/activity_personal_loan_tracker.xml => navi_pl_dynamic/src/main/res/layout/pl_activity_personal_loan_tracker.xml (64%) rename app/src/main/res/layout/activity_user_identification_v2.xml => navi_pl_dynamic/src/main/res/layout/pl_activity_user_identification_v2.xml (100%) rename app/src/main/res/layout/bank_statement_v2_layout.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_bank_statement_v2.xml (100%) rename app/src/main/res/layout/delayed_disbursement_v2_layout.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_delayed_disbursement_v2.xml (100%) rename app/src/main/res/layout/effective_interest_cost_v2_fragment.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_effective_interest_cost_v2.xml (99%) rename app/src/main/res/layout/emi_selector_fragment_v2.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_emi_selector_v2.xml (98%) rename app/src/main/res/layout/employment_otp_verification_fragment.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_employment_otp_verification.xml (100%) rename app/src/main/res/layout/employment_verification_v2_layout.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_employment_verification_v2.xml (100%) rename app/src/main/res/layout/fragment_error_v2.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_error_v2.xml (98%) rename app/src/main/res/layout/fresh_loan_details_v2_fragment.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_fresh_loan_details_v2.xml (97%) rename app/src/main/res/layout/gst_verification_password_fragment_v2.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_gst_verification_password_v2.xml (99%) rename app/src/main/res/layout/gst_verification_fragment_v2.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_gst_verification_v2.xml (99%) rename app/src/main/res/layout/fragment_kyc_address_proof_v2.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_kyc_address_proof_v2.xml (97%) rename app/src/main/res/layout/fragment_kyc_address_v2.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_kyc_address_v2.xml (94%) create mode 100644 navi_pl_dynamic/src/main/res/layout/pl_fragment_kyc_document_list_v2.xml rename app/src/main/res/layout/kyc_fragmentt_v2.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_kyc_v2.xml (98%) rename app/src/main/res/layout/loan_details_v2_fragment.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_loan_details_v2.xml (97%) rename app/src/main/res/layout/fragment_loan_offer_upgrade_v3.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_loan_offer_upgrade_v3.xml (100%) rename app/src/main/res/layout/loan_summary_v2.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_loan_summary_v2.xml (99%) rename app/src/main/res/layout/mfi_consent_v2_fragment.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_mfi_consent_v2.xml (100%) rename app/src/main/res/layout/fragment_mfi_error.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_mfi_error_v2.xml (99%) rename app/src/main/res/layout/pan_verification_bottomsheet.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_pan_verification_bottomsheet.xml (100%) rename app/src/main/res/layout/profile_v2_fragment.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_profile_v2.xml (100%) rename app/src/main/res/layout/styled_title_description_bottom_sheet_layout.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_styled_title_description_bottomsheet.xml (100%) rename app/src/main/res/layout/telco_otp_v2_fragment.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_telco_otp_v2.xml (100%) rename app/src/main/res/layout/fragment_topup_intro_loan_v2.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_topup_loan_intro_v2.xml (100%) rename app/src/main/res/layout/true_caller_authenticator_fragment.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_true_caller_authenticator.xml (100%) rename app/src/main/res/layout/upcoming_emi_details_fragment_v2.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_upcoming_emi_details_v2.xml (100%) rename app/src/main/res/layout/fragment_upi_blocker.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_upi_progress_blocker.xml (96%) rename app/src/main/res/layout/work_details_v2_fragment.xml => navi_pl_dynamic/src/main/res/layout/pl_fragment_work_v2.xml (100%) rename app/src/main/res/layout/address_radio_button_v2.xml => navi_pl_dynamic/src/main/res/layout/pl_layout_address_radio_button_v2.xml (100%) rename app/src/main/res/layout/address_status_layout_v2.xml => navi_pl_dynamic/src/main/res/layout/pl_layout_address_status_v2.xml (96%) rename app/src/main/res/layout/banner_with_tip_and_title.xml => navi_pl_dynamic/src/main/res/layout/pl_layout_banner_with_tip_and_title.xml (100%) rename app/src/main/res/layout/box_with_icon_title_view.xml => navi_pl_dynamic/src/main/res/layout/pl_layout_box_with_icon_title_view.xml (100%) create mode 100644 navi_pl_dynamic/src/main/res/layout/pl_layout_effective_interest_cost_calculation_card.xml create mode 100644 navi_pl_dynamic/src/main/res/layout/pl_layout_effective_interest_cost_calculation_card_item.xml rename app/src/main/res/layout/layout_footer_timed_banner.xml => navi_pl_dynamic/src/main/res/layout/pl_layout_footer_timed_banner.xml (100%) rename app/src/main/res/layout/layout_header_timed_banner.xml => navi_pl_dynamic/src/main/res/layout/pl_layout_header_timed_banner.xml (100%) create mode 100644 navi_pl_dynamic/src/main/res/layout/pl_layout_important_note.xml rename app/src/main/res/layout/item_loan_feature.xml => navi_pl_dynamic/src/main/res/layout/pl_layout_item_loan_feature.xml (100%) rename app/src/main/res/layout/kyc_address_layout_v2.xml => navi_pl_dynamic/src/main/res/layout/pl_layout_kyc_address_v2.xml (100%) rename app/src/main/res/layout/kyc_failed_layout.xml => navi_pl_dynamic/src/main/res/layout/pl_layout_kyc_failed.xml (100%) rename app/src/main/res/layout/loan_summary_emi_layout.xml => navi_pl_dynamic/src/main/res/layout/pl_layout_loan_summary_emi.xml (92%) create mode 100644 navi_pl_dynamic/src/main/res/layout/pl_layout_notification_header.xml rename app/src/main/res/layout/title_with_description_view.xml => navi_pl_dynamic/src/main/res/layout/pl_layout_title_with_description_view.xml (100%) rename app/src/main/res/layout/tracker_screen_layout.xml => navi_pl_dynamic/src/main/res/layout/pl_layout_tracker_screen.xml (100%) rename app/src/main/res/layout/transfer_bottomsheet_view.xml => navi_pl_dynamic/src/main/res/layout/pl_layout_transfer_bottomsheet.xml (100%) rename app/src/main/res/layout/layout_try_again_after.xml => navi_pl_dynamic/src/main/res/layout/pl_layout_try_again_after.xml (100%) create mode 100644 navi_pl_dynamic/src/main/res/values/strings.xml rename {navi-pl/src/test/java/com/navi/pl => navi_pl_dynamic/src/test/java/com/navi/pl/dynamic}/ExampleUnitTest.kt (74%) diff --git a/.github/workflows/generate_apk.yml b/.github/workflows/generate_apk.yml index 7bf359e389..7b0bfe1899 100644 --- a/.github/workflows/generate_apk.yml +++ b/.github/workflows/generate_apk.yml @@ -87,7 +87,7 @@ jobs: run: keytool -genkey -v -keystore app/navi-release-key.jks -storepass $KEYSTORE_PASSWORD -alias $KEYSTORE_ALIAS -keypass $KEYSTORE_ALIAS_PASSWORD -keyalg RSA -keysize 2048 -validity 10000 -dname "cn=Android Build CI, ou=Android Team, o=Navi, l=Bengaluru, st=Karnataka, c=IN" - name: Build - APK - ${{ inputs.environment }}-${{ inputs.type }} if: inputs.output == 'APK' - run: ./gradlew assemble${{ inputs.environment }}${{ inputs.type }} --stacktrace -PRELEASE_STORE_PASSWORD=$KEYSTORE_PASSWORD -PRELEASE_KEY_ALIAS=$KEYSTORE_ALIAS -PRELEASE_KEY_PASSWORD=$KEYSTORE_ALIAS_PASSWORD + run: ./gradlew package${{ inputs.environment }}${{ inputs.type }}UniversalApk --stacktrace -PRELEASE_STORE_PASSWORD=$KEYSTORE_PASSWORD -PRELEASE_KEY_ALIAS=$KEYSTORE_ALIAS -PRELEASE_KEY_PASSWORD=$KEYSTORE_ALIAS_PASSWORD - name: Build - AAB - ${{ inputs.environment }}-${{ inputs.type }} if: inputs.output == 'AAB' run: ./gradlew :app:bundle${{ inputs.environment }}${{ inputs.type }} --stacktrace -PRELEASE_STORE_PASSWORD=$KEYSTORE_PASSWORD -PRELEASE_KEY_ALIAS=$KEYSTORE_ALIAS -PRELEASE_KEY_PASSWORD=$KEYSTORE_ALIAS_PASSWORD @@ -96,6 +96,6 @@ jobs: with: name: app-${{ inputs.environment }}-${{ inputs.type }} path: | - app/build/outputs/apk/ + app/build/outputs/universal_apk/ app/build/outputs/bundle/ retention-days: 15 diff --git a/app/build.gradle b/app/build.gradle index 9299839155..9076ad27e3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ kapt { correctErrorTypes true } -def VERSION_CODE = 320 -def VERSION_NAME = "3.3.28" +def VERSION_CODE = 321 +def VERSION_NAME = "3.4.0" android { namespace 'com.naviapp' @@ -96,7 +96,7 @@ android { release { debuggable false minifyEnabled true - shrinkResources true + shrinkResources false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release manifestPlaceholders = [branchMode: 'false'] @@ -210,6 +210,7 @@ android { dirs 'libs' } } + dynamicFeatures = [':navi_pl_dynamic'] } android.applicationVariants.all { variant -> @@ -360,7 +361,7 @@ dependencies { implementation 'com.digitap.sdk:okyc:1.3.4' // for play store in app review - implementation playCore.implementation + api playCore.implementation // for Trucaller implementation "com.truecaller.android.sdk:truecaller-sdk:2.7.0" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9e24188613..3e7843d5d5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -55,11 +55,6 @@ android:name=".dashboard.loanapplicationdetails.documentlist.activity.DocumentListActivity" android:screenOrientation="portrait" android:exported="false" /> - - - - - - - - - - - - - - - - - - - - + - + + showLoader() + false -> hideLoader() + } + } + } + Column(modifier = Modifier.fillMaxSize().background(color = Color.White)) { + uiTronResponse?.let { RenderUiTronData(viewModel = viewModel, data = it) } + } + } + + @Composable + private fun RenderUiTronData(viewModel: PromotionVM, data: UiTronResponse) { + UiTronRenderer(data.data, viewModel).Render(composeViews = data.parentComposeView.orEmpty()) + } + + private fun reInitData() { + hideLoader() + viewModel.fetchPromotionData(isAllMandatoryPermissionGranted(this@PromotionActivity)) + } + + override val screenName + get() = NaviAnalytics.PROMOTION + override val moduleName: ModuleNameV2 + get() = ModuleNameV2.COMMON +} diff --git a/app/src/main/java/com/naviapp/common/navigator/NaviDeepLinkNavigator.kt b/app/src/main/java/com/naviapp/common/navigator/NaviDeepLinkNavigator.kt index ad74721596..6abfeddec3 100644 --- a/app/src/main/java/com/naviapp/common/navigator/NaviDeepLinkNavigator.kt +++ b/app/src/main/java/com/naviapp/common/navigator/NaviDeepLinkNavigator.kt @@ -8,6 +8,7 @@ package com.naviapp.common.navigator import android.app.Activity +import android.content.Context import android.content.Intent import android.graphics.Bitmap import android.graphics.BitmapFactory @@ -30,24 +31,36 @@ import com.navi.base.utils.orFalse import com.navi.base.utils.orZero import com.navi.chat.models.NaviChatSystemLocalData import com.navi.chat.ui.activities.NaviChatActivity -import com.navi.chat.utils.* +import com.navi.chat.utils.CHAT_TOUCH_POINT_CLICKED +import com.navi.chat.utils.DEFAULT_SOURCE_ID_FOR_PL +import com.navi.chat.utils.NAVI_CHAT_SYSTEM_LOCAL_DATA +import com.navi.chat.utils.SOURCE +import com.navi.chat.utils.TIMESTAMP +import com.navi.chat.utils.TRACKING_UUID import com.navi.common.BuildConfig import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper import com.navi.common.managers.PermissionsManager import com.navi.common.model.UserDetail import com.navi.common.paymenthandler.ui.CommonPaymentHandlerActivity import com.navi.common.ui.activity.NaviWebViewActivity +import com.navi.common.utils.isDynamicModuleInstalled import com.navi.common.utils.log import com.navi.common.utils.toActionData import com.navi.common.video.NaviYoutubeActivity import com.navi.hl.navigator.NaviHLDeeplinkNavigator import com.navi.insurance.navigator.NaviInsuranceDeeplinkNavigator import com.navi.insurance.util.VIDEO_ID_EXTRA -import com.navi.naviwidgets.utils.* +import com.navi.naviwidgets.utils.CHOOSER_TITLE_PARAM +import com.navi.naviwidgets.utils.EMAIL_BODY_PARAM +import com.navi.naviwidgets.utils.EMAIL_ID_PARAM +import com.navi.naviwidgets.utils.EMAIL_SUBJECT_PARAM +import com.navi.naviwidgets.utils.NAVI_CHAT_META_DATA +import com.naviapp.BuildConfig.APPLICATION_ID import com.naviapp.R import com.naviapp.account_aggregator.AccountAggregatorActivity import com.naviapp.analytics.deeplink.DeeplinkManager import com.naviapp.appupdate.activities.UpdateAppActivity +import com.naviapp.common.fragment.PromotionActivity import com.naviapp.crosssell.ui.TaxDocumentsActivity import com.naviapp.crosssell.ui.TaxSavingsActivity import com.naviapp.custom_payments.CustomPaymentActivity @@ -55,6 +68,7 @@ import com.naviapp.dashboard.loanapplicationdetails.activities.LoanApplicationDe import com.naviapp.dashboard.loanapplicationdetails.activities.TrancheDisbursalActivity import com.naviapp.dashboard.loanapplicationdetails.bank_account_change.activities.BankChangeActivity import com.naviapp.dashboard.loanapplicationdetails.documentlist.activity.DocumentListActivity +import com.naviapp.dashboard.menu.appsettings.activity.AppSettingsActivity import com.naviapp.dashboard.menu.customersupport.activities.AboutUsActivity import com.naviapp.dashboard.menu.customersupport.activities.CustomerSupportActivity import com.naviapp.dashboard.menu.loans.activity.AllLoanDetailsActivity @@ -62,15 +76,21 @@ import com.naviapp.dashboard.menu.notificationsettings.NotificationSettingsActiv import com.naviapp.dashboard.menu.utils.INSURANCE import com.naviapp.dashboard.menu.utils.openCallDialScreen import com.naviapp.dashboard.menu.utils.openEmailScreenWithSubjectAndBody -import com.naviapp.dashboard.newloan.NewLoanConsentActivity import com.naviapp.dashboard.rating.RatingActivity -import com.naviapp.digitalgold.ui.* +import com.naviapp.digitalgold.ui.DigitalGoldBuyActivity +import com.naviapp.digitalgold.ui.DigitalGoldHomeActivity +import com.naviapp.digitalgold.ui.DigitalGoldInfoActivity +import com.naviapp.digitalgold.ui.DigitalGoldKycFragment +import com.naviapp.digitalgold.ui.DigitalGoldSellActivity +import com.naviapp.digitalgold.ui.DigitalGoldTransactionActivity +import com.naviapp.digitalgold.ui.IconTitleDescBottomSheet +import com.naviapp.digitalgold.ui.PortfolioExperienceBottomsheet +import com.naviapp.dynamicdelivery.activity.DynamicDeliveryActivity import com.naviapp.email.activity.EmailActivity import com.naviapp.home.activity.NewDashboardActivity import com.naviapp.home.activity.StoryActivity import com.naviapp.home.dashboard.ui.R11PaymentBottomSheet import com.naviapp.interest_reset.InterestResetActivity -import com.naviapp.models.SubPageStatusType import com.naviapp.part_prepayment.PartPrePaymentActivity import com.naviapp.payment.activities.FeedbackActivity import com.naviapp.payment.activities.NaviPaymentActivity @@ -88,11 +108,10 @@ import com.naviapp.personalloan.insurance.activity.InsuranceAddOnActivity import com.naviapp.personalloan.insurance.activity.InsuranceDetailActivity import com.naviapp.personalloan.intermediate.activity.IntermediateActivity import com.naviapp.personalloanrevamp.bankDetailsPostKyc.activity.BankDetailsLoaderPostKycActivity -import com.naviapp.personalloanrevamp.error.activity.ErrorScreenV2Activity -import com.naviapp.personalloanrevamp.getloanRevamp.activities.* -import com.naviapp.personalloanrevamp.intermediatev2.IntermediateV2Activity -import com.naviapp.personalloanrevamp.kyc.activity.PanVerificationLoaderActivity -import com.naviapp.personalloanrevamp.useridentificationv2.activities.* +import com.naviapp.personalloanrevamp.getloanRevamp.activities.EnachTutorialV2Activity +import com.naviapp.personalloanrevamp.getloanRevamp.activities.SkipMandateV2Activity +import com.naviapp.personalloanrevamp.useridentificationv2.activities.PermissionV2Activity +import com.naviapp.personalloanrevamp.useridentificationv2.activities.PermissionV2LocExpActivity import com.naviapp.referral.ui.ReferralHomeActivity import com.naviapp.registration.RegistrationActivity import com.naviapp.registration.SplashActivity @@ -102,16 +121,23 @@ import com.naviapp.rewards.ui.RewardsDashboardActivity import com.naviapp.status_tracker.StatusTrackerActivity import com.naviapp.survey.ui.activities.SurveyActivity import com.naviapp.usernotification.activities.UserNotificationActivity -import com.naviapp.utils.* +import com.naviapp.utils.Constants +import com.naviapp.utils.Constants.ACTIVITY_CLASS_PATH +import com.naviapp.utils.Constants.EMPTY import com.naviapp.utils.Constants.FLOW_TYPE import com.naviapp.utils.Constants.KYC import com.naviapp.utils.Constants.LOAN_ACCOUNT_NUMBER +import com.naviapp.utils.Constants.PL_DYNAMIC_MODULE_NAME import com.naviapp.utils.Constants.S3URL import com.naviapp.utils.Constants.SKIP_PERMISSION import com.naviapp.utils.Constants.URL import com.naviapp.utils.Constants.VERIFICATION_HASH -import timber.log.Timber +import com.naviapp.utils.NaviAppUpdateDownloadManager +import com.naviapp.utils.ShareUtil +import com.naviapp.utils.openPlayStore +import com.naviapp.utils.openWhatsAppChatConversation import java.io.ByteArrayOutputStream +import timber.log.Timber object NaviDeepLinkNavigator : DeepLinkListener { private const val OFFER_GENERATION = "OFFER_GENERATION" @@ -123,6 +149,7 @@ object NaviDeepLinkNavigator : DeepLinkListener { const val ERROR_V2 = "ERRORS_V2" private const val MY_LOANS = "myloans" private const val NOTIFICATION_SETTINGS = "notificationSettings" + private const val APP_SETTINGS = "appSettings" const val FAQ = "faq" private const val CALL = "call" const val PENNY_DROP_DISBURSEMENT_LOADER = "PENNY_DROP_DISBURSEMENT_LOADER" @@ -148,7 +175,7 @@ object NaviDeepLinkNavigator : DeepLinkListener { private const val ENACH_TUTORIAL = "ENACH_TUTORIAL" private const val FAQ_SCREEN = "FAQ_SCREEN" private const val LOAN_AGREEMENT = "LOAN_AGREEMENT" - private const val NEW_LOAN = "NEW_LOAN" + const val NEW_LOAN = "NEW_LOAN" private const val INSURANCE_ADD = "INSURANCE_ADD" private const val AMC = "amc" private const val HL = "hl" @@ -182,6 +209,8 @@ object NaviDeepLinkNavigator : DeepLinkListener { const val OFFER_GENERATION_V2 = "OFFER_GENERATION_V2" const val PERSONAL_LOAN_TRACKER = "PERSONAL_LOAN_TRACKER" const val PERMISSION_V2 = "permission_V2" + const val PERMISSION_V3 = "permission_V3" + const val PERMISSION_V4 = "permission_V4" private const val POST_OFFER_GENERATION_V2 = "POST_OFFER_GENERATION_V2" const val INTERMEDIATE_V2 = "intermediate_V2" const val LOAN_AGREEMENT_V2 = "LOAN_AGREEMENT_V2" @@ -219,7 +248,30 @@ object NaviDeepLinkNavigator : DeepLinkListener { const val TRANCHE_DISBURSAL = "trancheDisbursal" const val ACCOUNT_AGGREGATOR = "ACCOUNT_AGGREGATOR_V2" const val MANDATE_PERMISSION = "MANDATE_PERMISSION" + const val PROMOTION_SCREEN = "promotion" private const val PAYMENT_ACTIVITY = "PAYMENT_ACTIVITY" + private const val DYNAMIC_DELIVERY = "DYNAMIC_DELIVERY" + private const val PERSONAL_LOAN_TRACKER_DYNAMIC_FEATURE_MODULE_ACTIVITY_CLASS_PATH = + "com.navi.pl.dynamic.activity.PersonalLoanTrackerActivity" + private const val ELIGIBILITY_V2_DYNAMIC_FEATURE_MODULE_ACTIVITY_CLASS_PATH = + "com.navi.pl.dynamic.activity.UserIdentificationV2Activity" + private const val OFFER_GENERATION_V2_DYNAMIC_FEATURE_MODULE_ACTIVITY_CLASS_PATH = + "com.navi.pl.dynamic.activity.LoanEligibilityLoaderV2Activity" + private const val LOAN_APPLICATION_V2_DYNAMIC_FEATURE_MODULE_ACTIVITY_CLASS_PATH = + "com.navi.pl.dynamic.activity.GetLoanV2Activity" + private const val PAN_VERIFICATION_LOADER_DYNAMIC_FEATURE_MODULE_ACTIVITY_CLASS_PATH = + "com.navi.pl.dynamic.activity.PanVerificationLoaderActivity" + private const val INTERMEDIATE_V2_DYNAMIC_FEATURE_MODULE_ACTIVITY_CLASS_PATH = + "com.navi.pl.dynamic.activity.IntermediateV2Activity" + private const val ERROR_V2_DYNAMIC_FEATURE_MODULE_ACTIVITY_CLASS_PATH = + "com.navi.pl.dynamic.activity.ErrorScreenV2Activity" + private const val LOAN_AGREEMENT_V2_DYNAMIC_FEATURE_MODULE_ACTIVITY_CLASS_PATH = + "com.navi.pl.dynamic.activity.LoanAgreementV2Activity" + private const val DISBURSEMENT_STATUS_V2_DYNAMIC_FEATURE_MODULE_ACTIVITY_CLASS_PATH = + "com.navi.pl.dynamic.activity.LoanDisbursementLoaderV2Activity" + const val HOME_ACTIVITY_CLASS_PATH = "com.naviapp.home.activity.NewDashboardActivity" + private const val NEW_LOAN_DYNAMIC_FEATURE_MODULE_ACTIVITY_CLASS_PATH = + "com.navi.pl.dynamic.activity.NewLoanConsentActivity" fun navigate( activity: Activity?, @@ -265,29 +317,49 @@ object NaviDeepLinkNavigator : DeepLinkListener { HOME_SMALL -> { intent = Intent(activity, NewDashboardActivity::class.java) } - PERSONAL_LOAN_TRACKER -> - intent = Intent(activity, PersonalLoanTrackerActivity::class.java) - + PERSONAL_LOAN_TRACKER -> { + intent = + getPersonalLoanDynamicModuleIntent( + context = activity, + url = PERSONAL_LOAN_TRACKER + ) + } ELIGIBILITY_V2 -> { intent = if (secondIdentifier == PERSONAL_LOAN_TRACKER) { - Intent(activity, PersonalLoanTrackerActivity::class.java) + getPersonalLoanDynamicModuleIntent( + context = activity, + url = PERSONAL_LOAN_TRACKER + ) } else { - Intent(activity, UserIdentificationV2Activity::class.java) + getPersonalLoanDynamicModuleIntent( + context = activity, + url = ELIGIBILITY_V2 + ) } } LOAN_APPLICATION -> { intent = Intent(activity, GetLoanActivity::class.java) } PAN_VERIFICATION_LOADER -> { - intent = Intent(activity, PanVerificationLoaderActivity::class.java) + intent = + getPersonalLoanDynamicModuleIntent( + context = activity, + url = PAN_VERIFICATION_LOADER + ) } LOAN_APPLICATION_V2 -> { intent = if (secondIdentifier == DISBURSEMENT_STATUS_V2) { - Intent(activity, LoanDisbursementLoaderV2Activity::class.java) + getPersonalLoanDynamicModuleIntent( + context = activity, + url = DISBURSEMENT_STATUS_V2 + ) } else { - Intent(activity, GetLoanV2Activity::class.java) + getPersonalLoanDynamicModuleIntent( + context = activity, + url = LOAN_APPLICATION_V2 + ) } } OPEN_EMAIL -> { @@ -299,14 +371,25 @@ object NaviDeepLinkNavigator : DeepLinkListener { CREDIT_ASSIGNMENT_SCREEN -> { intent = Intent(activity, CreditAssignmentActivity::class.java) } - OFFER_GENERATION_V2 -> - intent = Intent(activity, LoanEligibilityLoaderV2Activity::class.java) + OFFER_GENERATION_V2 -> { + intent = + getPersonalLoanDynamicModuleIntent( + context = activity, + url = OFFER_GENERATION_V2 + ) + } POST_OFFER_GENERATION -> intent = Intent(activity, GetLoanActivity::class.java) - POST_OFFER_GENERATION_V2 -> - intent = Intent(activity, GetLoanV2Activity::class.java) + POST_OFFER_GENERATION_V2 -> { + intent = + getPersonalLoanDynamicModuleIntent( + context = activity, + url = LOAN_APPLICATION_V2 + ) + } SKIP_MANDATE_V2 -> intent = Intent(activity, SkipMandateV2Activity::class.java) ERROR_V2 -> { - intent = Intent(activity, ErrorScreenV2Activity::class.java) + intent = + getPersonalLoanDynamicModuleIntent(context = activity, url = ERROR_V2) } MENU -> { when (secondIdentifier) { @@ -329,6 +412,8 @@ object NaviDeepLinkNavigator : DeepLinkListener { } NOTIFICATION_SETTINGS -> intent = Intent(activity, NotificationSettingsActivity::class.java) + APP_SETTINGS -> + intent = Intent(activity, AppSettingsActivity::class.java) RATE_US -> activity?.let { it1 -> openPlayStore(it1) } SHARE_APP -> { var shareableLink: String? = null @@ -363,13 +448,20 @@ object NaviDeepLinkNavigator : DeepLinkListener { INTERMEDIATE -> { intent = if (secondIdentifier == TOP_UP_INTRO) { - Intent(activity, IntermediateV2Activity::class.java) + getPersonalLoanDynamicModuleIntent( + context = activity, + url = INTERMEDIATE_V2 + ) } else { Intent(activity, IntermediateActivity::class.java) } } INTERMEDIATE_V2 -> { - intent = Intent(activity, IntermediateV2Activity::class.java) + intent = + getPersonalLoanDynamicModuleIntent( + context = activity, + url = INTERMEDIATE_V2 + ) } ACCOUNT_AGGREGATOR -> { intent = Intent(activity, AccountAggregatorActivity::class.java) @@ -378,50 +470,42 @@ object NaviDeepLinkNavigator : DeepLinkListener { intent = Intent(activity, LoanApplicationDetailActivity::class.java) } REGISTRATION -> { - intent = if (BaseUtils.isUserLoggedIn()) Intent( - activity, NewDashboardActivity::class.java - ) else Intent(activity, RegistrationActivity::class.java) + intent = + if (BaseUtils.isUserLoggedIn()) + Intent(activity, NewDashboardActivity::class.java) + else Intent(activity, RegistrationActivity::class.java) } PERMISSION -> { intent = Intent(activity, PermissionActivity::class.java) } PERMISSION_V2 -> { - val secondaryCtaUrl = getSecondaryCtaFromParameters(ctaData.parameters) - if (activity != null && secondaryCtaUrl != null) { - val permissionsManager = PermissionsManager(activity) + var secondaryCta = + FirebaseRemoteConfigHelper.getString( + FirebaseRemoteConfigHelper.SECONDARY_CTA + ) + if (secondaryCta.isEmpty()) { + secondaryCta = OFFER_GENERATION_V2 + } + val cta = CtaData(url = secondaryCta, parameters = ctaData.parameters) + activity?.let { act -> + val permissionsManager = PermissionsManager(act) if (!permissionsManager.hasPermissions()) { - intent = if (FirebaseRemoteConfigHelper.getBoolean( - FirebaseRemoteConfigHelper.LOCATION_EXPERIMENT - ) - ) { - Intent(activity, PermissionV2LocExpActivity::class.java) - } else { - Intent(activity, PermissionV2Activity::class.java) - } - } else { - val cta = CtaData( - url = secondaryCtaUrl, - parameters = ctaData.parameters - ) bundle.putString(FLOW_TYPE, SKIP_PERMISSION) - navigateTo( - activity = activity, - ctaData = cta, - finish = finish, - bundle = bundle - ) - return - } - } else { - intent = if (FirebaseRemoteConfigHelper.getBoolean( - FirebaseRemoteConfigHelper.LOCATION_EXPERIMENT - ) - ) { - Intent(activity, PermissionV2LocExpActivity::class.java) - } else { - Intent(activity, PermissionV2Activity::class.java) } } + navigateTo( + activity = activity, + ctaData = cta, + finish = finish, + bundle = bundle + ) + return + } + PERMISSION_V3 -> { + intent = Intent(activity, PermissionV2Activity::class.java) + } + PERMISSION_V4 -> { + intent = Intent(activity, PermissionV2LocExpActivity::class.java) } BANK_ACCOUNT_VERIFICATION -> { intent = Intent(activity, BankAccountVerificationLoaderActivity::class.java) @@ -435,7 +519,8 @@ object NaviDeepLinkNavigator : DeepLinkListener { APP_UPDATE -> { intent = Intent(activity, UpdateAppActivity::class.java) } - PAYMENT, PAYMENT_ACTIVITY -> { + PAYMENT, + PAYMENT_ACTIVITY -> { intent = Intent(activity, NaviPaymentActivity::class.java) } RATING -> { @@ -451,10 +536,15 @@ object NaviDeepLinkNavigator : DeepLinkListener { intent = Intent(activity, LoanAgreementActivity::class.java) } LOAN_AGREEMENT_V2 -> { - intent = Intent(activity, LoanAgreementV2Activity::class.java) + intent = + getPersonalLoanDynamicModuleIntent( + context = activity, + url = LOAN_AGREEMENT_V2 + ) } NEW_LOAN -> { - intent = Intent(activity, NewLoanConsentActivity::class.java) + intent = + getPersonalLoanDynamicModuleIntent(context = activity, url = NEW_LOAN) } INSURANCE_ADD -> { intent = Intent(activity, InsuranceAddOnActivity::class.java) @@ -489,6 +579,9 @@ object NaviDeepLinkNavigator : DeepLinkListener { MANDATE_PERMISSION -> { intent = Intent(activity, MandatePermissionActivity::class.java) } + PROMOTION_SCREEN -> { + intent = Intent(activity, PromotionActivity::class.java) + } CHAT_ACTIVITY -> { var shareableLink: String? = null var sourceId: String? = DEFAULT_SOURCE_ID_FOR_PL @@ -514,7 +607,6 @@ object NaviDeepLinkNavigator : DeepLinkListener { SHOULD_SHOW_CSAT -> { shouldShowCsat = keyValue.value.toBoolean() } - CSAT_CONVERSATION_ID -> { csatConversationId = keyValue.value.toString() } @@ -528,15 +620,15 @@ object NaviDeepLinkNavigator : DeepLinkListener { source = shareableLink.orEmpty(), sourceId = sourceId.orEmpty(), currentUserName = - PreferenceManager.getObjectPrefrences( - CURRENT_USER, - UserDetail::class.java - ) - ?.name - .orEmpty(), + PreferenceManager.getObjectPrefrences( + CURRENT_USER, + UserDetail::class.java + ) + ?.name + .orEmpty(), externalCustomerId = - PreferenceManager.getStringPreference(USER_EXTERNAL_ID) - .orEmpty(), + PreferenceManager.getStringPreference(USER_EXTERNAL_ID) + .orEmpty(), isFromNotification = isFromNotification, shouldShowCsat = shouldShowCsat, shouldShowChatResolution = shouldShowChatResolution, @@ -755,6 +847,9 @@ object NaviDeepLinkNavigator : DeepLinkListener { TRANCHE_DISBURSAL -> { intent = Intent(activity, TrancheDisbursalActivity::class.java) } + DYNAMIC_DELIVERY -> { + intent = Intent(activity, DynamicDeliveryActivity::class.java) + } } ctaData.parameters?.forEach { keyValue -> bundle.putString(keyValue.key, keyValue.value) @@ -764,11 +859,14 @@ object NaviDeepLinkNavigator : DeepLinkListener { intent.putExtras(bundle) intent.putExtra(Constants.REDIRECT_STATUS, secondIdentifier) intent.putExtra(Constants.SUB_REDIRECT, thirdIdentifier) + intent.putExtra(Constants.NEEDS_RESULT, needsResult) + intent.putExtra(Constants.CLEAR_TASK, clearTask) + intent.putExtra(Constants.REQUEST_CODE, requestCode) if (clearTask.orFalse()) { intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK or - Intent.FLAG_ACTIVITY_CLEAR_TASK or - Intent.FLAG_ACTIVITY_CLEAR_TOP + Intent.FLAG_ACTIVITY_CLEAR_TASK or + Intent.FLAG_ACTIVITY_CLEAR_TOP ) } if (needsResult.orFalse()) { @@ -834,16 +932,60 @@ object NaviDeepLinkNavigator : DeepLinkListener { navigate(activity, ctaData, finish, bundle ?: Bundle(), needsResult, requestCode, clearTask) } - override fun fetchBranchSDKData(activity: Activity, deeplink: String, clearTask: Boolean?, finish: Boolean?, onRedirectListener: () -> Unit) { - DeeplinkManager.fetchBranchSDKData(activity, deeplink, clearTask, finish, onRedirectListener) + override fun fetchBranchSDKData( + activity: Activity, + deeplink: String, + clearTask: Boolean?, + finish: Boolean?, + onRedirectListener: () -> Unit + ) { + DeeplinkManager.fetchBranchSDKData( + activity, + deeplink, + clearTask, + finish, + onRedirectListener + ) } private fun getBottomSheet(url: String?): Pair? { return when (url) { BOTTOM_SHEET_R11_PAYMENT -> Pair(R11PaymentBottomSheet.TAG, R11PaymentBottomSheet()) - BOTTOM_SHEET_PORTFOLIO_EXPERIENCE -> Pair(PortfolioExperienceBottomsheet.TAG, PortfolioExperienceBottomsheet()) - ICON_TITLE_DESC_BOTTOMSHEET -> Pair(IconTitleDescBottomSheet.TAG, IconTitleDescBottomSheet()) + BOTTOM_SHEET_PORTFOLIO_EXPERIENCE -> + Pair(PortfolioExperienceBottomsheet.TAG, PortfolioExperienceBottomsheet()) + ICON_TITLE_DESC_BOTTOMSHEET -> + Pair(IconTitleDescBottomSheet.TAG, IconTitleDescBottomSheet()) else -> null } } + + fun getPersonalLoanDynamicModuleIntent(context: Context?, url: String): Intent { + val activityClassPath = getPersonalLoanDynamicModuleActivityClassPath(url) + return if (isDynamicModuleInstalled(moduleName = PL_DYNAMIC_MODULE_NAME)) { + Intent().apply { setClassName(APPLICATION_ID, activityClassPath) } + } else { + Intent(context, DynamicDeliveryActivity::class.java).apply { + putExtra(ACTIVITY_CLASS_PATH, activityClassPath) + } + } + } + + private fun getPersonalLoanDynamicModuleActivityClassPath(url: String): String { + return when (url) { + PERSONAL_LOAN_TRACKER -> + PERSONAL_LOAN_TRACKER_DYNAMIC_FEATURE_MODULE_ACTIVITY_CLASS_PATH + ELIGIBILITY_V2 -> ELIGIBILITY_V2_DYNAMIC_FEATURE_MODULE_ACTIVITY_CLASS_PATH + OFFER_GENERATION_V2 -> OFFER_GENERATION_V2_DYNAMIC_FEATURE_MODULE_ACTIVITY_CLASS_PATH + LOAN_APPLICATION_V2 -> LOAN_APPLICATION_V2_DYNAMIC_FEATURE_MODULE_ACTIVITY_CLASS_PATH + DISBURSEMENT_STATUS_V2 -> + DISBURSEMENT_STATUS_V2_DYNAMIC_FEATURE_MODULE_ACTIVITY_CLASS_PATH + PAN_VERIFICATION_LOADER -> + PAN_VERIFICATION_LOADER_DYNAMIC_FEATURE_MODULE_ACTIVITY_CLASS_PATH + INTERMEDIATE_V2 -> INTERMEDIATE_V2_DYNAMIC_FEATURE_MODULE_ACTIVITY_CLASS_PATH + LOAN_AGREEMENT_V2 -> LOAN_AGREEMENT_V2_DYNAMIC_FEATURE_MODULE_ACTIVITY_CLASS_PATH + ERROR_V2 -> ERROR_V2_DYNAMIC_FEATURE_MODULE_ACTIVITY_CLASS_PATH + NEW_LOAN -> NEW_LOAN_DYNAMIC_FEATURE_MODULE_ACTIVITY_CLASS_PATH + else -> EMPTY + } + } } diff --git a/app/src/main/java/com/naviapp/common/navigator/ScreenNavigator.kt b/app/src/main/java/com/naviapp/common/navigator/ScreenNavigator.kt index 6dfa45e5b7..45f5730486 100644 --- a/app/src/main/java/com/naviapp/common/navigator/ScreenNavigator.kt +++ b/app/src/main/java/com/naviapp/common/navigator/ScreenNavigator.kt @@ -14,9 +14,15 @@ import android.os.Bundle import com.navi.base.utils.orFalse import com.navi.base.utils.orZero import com.navi.common.ui.activity.NaviWebViewActivity +import com.naviapp.common.fragment.PromotionActivity +import com.naviapp.common.navigator.NaviDeepLinkNavigator.DISBURSEMENT_STATUS_V2 +import com.naviapp.common.navigator.NaviDeepLinkNavigator.ERROR_V2 +import com.naviapp.common.navigator.NaviDeepLinkNavigator.INTERMEDIATE_V2 +import com.naviapp.common.navigator.NaviDeepLinkNavigator.LOAN_APPLICATION_V2 +import com.naviapp.common.navigator.NaviDeepLinkNavigator.NEW_LOAN +import com.naviapp.common.navigator.NaviDeepLinkNavigator.getPersonalLoanDynamicModuleIntent import com.naviapp.crosssell.ui.CrossSellActivity import com.naviapp.dashboard.menu.loans.activity.AllLoanDetailsActivity -import com.naviapp.dashboard.newloan.NewLoanConsentActivity import com.naviapp.dashboard.rating.RatingActivity import com.naviapp.email.activity.EmailActivity import com.naviapp.home.activity.NewDashboardActivity @@ -28,11 +34,6 @@ import com.naviapp.personalloan.getloan.activities.LoanDisbursementProductPlacem import com.naviapp.personalloan.getloan.summary.activities.LoanAgreementActivity import com.naviapp.personalloan.insurance.activity.InsuranceDetailActivity import com.naviapp.personalloan.intermediate.activity.IntermediateActivity -import com.naviapp.personalloanrevamp.error.activity.ErrorScreenV2Activity -import com.naviapp.personalloanrevamp.getloanRevamp.activities.GetLoanV2Activity -import com.naviapp.personalloanrevamp.getloanRevamp.activities.LoanDisbursementLoaderV2Activity -import com.naviapp.personalloanrevamp.intermediatev2.IntermediateV2Activity -import com.naviapp.personalloanrevamp.useridentificationv2.activities.LoanEligibilityLoaderV2Activity import com.naviapp.registration.RegistrationActivity import com.naviapp.rewards.ui.RewardDelightActivity import com.naviapp.utils.Constants @@ -56,16 +57,22 @@ class ScreenNavigator { FAQS_SCREEN -> Intent(activity, FaqsActivity::class.java) LOAN_AGREEMENT_SCREEN -> Intent(activity, LoanAgreementActivity::class.java) PageStatusType.OFFER_GENERATION -> - Intent(activity, NewLoanConsentActivity::class.java) + getPersonalLoanDynamicModuleIntent(context = activity, url = NEW_LOAN) MY_LOAN_SCREEN -> Intent(activity, AllLoanDetailsActivity::class.java) PageStatusType.LOAN_APPLICATION -> { Intent(activity, GetLoanActivity::class.java) } - NaviDeepLinkNavigator.LOAN_APPLICATION_V2 -> { - if (subPage == NaviDeepLinkNavigator.DISBURSEMENT_STATUS_V2) { - Intent(activity, LoanDisbursementLoaderV2Activity::class.java) + LOAN_APPLICATION_V2 -> { + if (subPage == DISBURSEMENT_STATUS_V2) { + getPersonalLoanDynamicModuleIntent( + context = activity, + url = DISBURSEMENT_STATUS_V2 + ) } else { - Intent(activity, GetLoanV2Activity::class.java) + getPersonalLoanDynamicModuleIntent( + context = activity, + url = LOAN_APPLICATION_V2 + ) } } INSURANCE_DETAIL_SCREEN -> Intent(activity, InsuranceDetailActivity::class.java) @@ -77,6 +84,8 @@ class ScreenNavigator { } intent?.let { it.putExtra(Constants.REDIRECT_STATUS, subPage) + it.putExtra(Constants.NEEDS_RESULT, isResultActivity) + it.putExtra(Constants.REQUEST_CODE, requestCode) bundle?.apply { it.putExtras(this) } when { isResultActivity.orFalse() -> { @@ -110,10 +119,14 @@ class ScreenNavigator { intent = Intent(currentActivity, GetLoanActivity::class.java) } ERROR_FULL_PAGE_SCREEN_V2 -> { - intent = Intent(currentActivity, ErrorScreenV2Activity::class.java) + intent = getPersonalLoanDynamicModuleIntent(context = activity, url = ERROR_V2) } LOAN_ELIGIBLE_SCREEN_V2 -> { - intent = Intent(currentActivity, LoanEligibilityLoaderV2Activity::class.java) + intent = + getPersonalLoanDynamicModuleIntent( + context = activity, + url = NaviDeepLinkNavigator.OFFER_GENERATION_V2 + ) } DASHBOARD_SCREEN -> { intent = Intent(activity, NewDashboardActivity::class.java) @@ -134,21 +147,29 @@ class ScreenNavigator { INTERMEDIATE_SCREEN -> intent = Intent(currentActivity, IntermediateActivity::class.java) INTERMEDIATE_SCREEN_V2 -> - intent = Intent(currentActivity, IntermediateV2Activity::class.java) + intent = + getPersonalLoanDynamicModuleIntent( + context = activity, + url = INTERMEDIATE_V2 + ) REWARDS_DELIGHT_SCREEN -> { intent = Intent(currentActivity, RewardDelightActivity::class.java) } PERMISSION_SCREEN -> { intent = Intent(currentActivity, MandatePermissionActivity::class.java) } + PROMOTION_SCREEN -> { + intent = Intent(currentActivity, PromotionActivity::class.java) + } } intent?.let { bundle?.apply { it.putExtras(this) } + it.putExtra(Constants.CLEAR_TASK, clearTask) if (clearTask) { it.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK or - FLAG_ACTIVITY_CLEAR_TASK or - Intent.FLAG_ACTIVITY_CLEAR_TOP + FLAG_ACTIVITY_CLEAR_TASK or + Intent.FLAG_ACTIVITY_CLEAR_TOP ) } currentActivity.startActivity(it) @@ -190,5 +211,6 @@ class ScreenNavigator { val instance: ScreenNavigator by lazy { Holder.INSTANCE } const val REWARDS_DELIGHT_SCREEN = "REWARDS_DELIGHT_SCREEN" const val PERMISSION_SCREEN = "PERMISSION_SCREEN" + const val PROMOTION_SCREEN = "promotion" } } diff --git a/app/src/main/java/com/naviapp/common/repository/ConfigRepository.kt b/app/src/main/java/com/naviapp/common/repository/ConfigRepository.kt index aa812e60fb..688ad80a29 100644 --- a/app/src/main/java/com/naviapp/common/repository/ConfigRepository.kt +++ b/app/src/main/java/com/naviapp/common/repository/ConfigRepository.kt @@ -7,10 +7,6 @@ package com.naviapp.common.repository -import com.navi.base.sharedpref.PreferenceManager -import com.navi.common.network.models.RepoResult -import com.navi.naviwidgets.utils.APP_UPDATE_ENABLE -import com.naviapp.home.model.WidgetResponse import com.naviapp.network.retrofit.ResponseCallback import com.naviapp.utils.retrofitService import com.naviapp.utils.superAppRetrofitService @@ -20,29 +16,4 @@ class ConfigRepository : ResponseCallback() { suspend fun fetchFirebaseRefreshAuthToken() = apiResponseCallback(superAppRetrofitService().refreshFirebaseAuthToken()) - - suspend fun fetchHomeItems( - availableAppVersionCode: Int?, - appVariantAvailable: Boolean - ): RepoResult = - apiResponseCallback( - superAppRetrofitService().fetchHomeItems( - availableAppVersionCode, - appVariantAvailable - ) - ) - - suspend fun fetchDashboardTabs() = - apiResponseCallback(superAppRetrofitService().fetchDashboardTabs()) - - suspend fun fetchDashboardContent(product: String) = - apiResponseCallback(superAppRetrofitService().fetchDashboardContent(product)) - - suspend fun fetchProfileData() = apiResponseCallback( - superAppRetrofitService().fetchProfileItems( - PreferenceManager.getBooleanPreference( - APP_UPDATE_ENABLE - ) - ) - ) } diff --git a/app/src/main/java/com/naviapp/common/repository/PromotionRepository.kt b/app/src/main/java/com/naviapp/common/repository/PromotionRepository.kt new file mode 100644 index 0000000000..6e05d157c4 --- /dev/null +++ b/app/src/main/java/com/naviapp/common/repository/PromotionRepository.kt @@ -0,0 +1,22 @@ +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.naviapp.common.repository + +import com.naviapp.network.di.SuperAppRetroFit +import com.naviapp.network.retrofit.ResponseCallback +import com.naviapp.network.retrofit.RetrofitService +import javax.inject.Inject + +class PromotionRepository +@Inject +constructor(@SuperAppRetroFit private val superAppRetrofitService: RetrofitService) : + ResponseCallback() { + + suspend fun fetchAdvertisementData(isPermissionsAvailable: Boolean) = + apiResponseCallback(superAppRetrofitService.fetchPromotionData(isPermissionsAvailable)) +} diff --git a/app/src/main/java/com/naviapp/common/viewmodel/PromotionVM.kt b/app/src/main/java/com/naviapp/common/viewmodel/PromotionVM.kt new file mode 100644 index 0000000000..2174b3148f --- /dev/null +++ b/app/src/main/java/com/naviapp/common/viewmodel/PromotionVM.kt @@ -0,0 +1,90 @@ +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.naviapp.common.viewmodel + +import androidx.lifecycle.viewModelScope +import com.google.firebase.crashlytics.FirebaseCrashlytics +import com.navi.analytics.utils.NaviTrackEvent +import com.navi.base.model.CtaData +import com.navi.base.utils.EMPTY +import com.navi.common.uitron.model.action.CtaAction +import com.navi.common.utils.isValidResponse +import com.navi.common.viewmodel.BaseVM +import com.navi.uitron.model.UiTronResponse +import com.navi.uitron.model.action.AnalyticsAction +import com.navi.uitron.model.data.UiTronAction +import com.naviapp.common.repository.PromotionRepository +import com.naviapp.home.model.HomeCtaTypes +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.channels.BufferOverflow +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +@HiltViewModel +class PromotionVM @Inject constructor(private val advertisementRepo: PromotionRepository) : + BaseVM() { + + private val _uiTronResponse = MutableStateFlow(value = null) + val uiTronResponse = _uiTronResponse.asStateFlow() + private val _redirectionCta = MutableSharedFlow() + val redirectionCta = _redirectionCta.asSharedFlow() + private val _isLoading = + MutableSharedFlow(replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST) + val isLoading = _isLoading.asSharedFlow() + + init { + viewModelScope.launch { getActionCallback().collect { onActionTriggered(it) } } + } + + fun fetchPromotionData(isPermissionsAvailable: Boolean) { + coroutineScope.launch(Dispatchers.IO) { + _isLoading.emit(true) + val response = advertisementRepo.fetchAdvertisementData(isPermissionsAvailable) + if (response.isValidResponse()) { + _uiTronResponse.value = response.data!! + } else { + setErrorData(response.errors, response.error) + } + _isLoading.emit(false) + } + } + + private fun onActionTriggered(uiTronAction: UiTronAction?) { + when (uiTronAction) { + is CtaAction -> { + handleCtaAction(ctaAction = uiTronAction) + } + is AnalyticsAction -> { + NaviTrackEvent.trackEvent( + uiTronAction.eventName ?: EMPTY, + uiTronAction.eventProperties + ) + } + else -> { + FirebaseCrashlytics.getInstance() + .log("${uiTronAction?.type} Action not handled now") + } + } + } + + private fun handleCtaAction(ctaAction: CtaAction) { + viewModelScope.launch { + when (HomeCtaTypes.find(ctaAction.ctaData?.type)) { + HomeCtaTypes.REDIRECTION_CTA -> ctaAction.ctaData?.let { _redirectionCta.emit(it) } + else -> { + FirebaseCrashlytics.getInstance().log("Unknown cta Type clicked") + } + } + } + } +} diff --git a/app/src/main/java/com/naviapp/dashboard/loanapplicationdetails/bank_account_change/fragments/BankChangeDetailsFragment.kt b/app/src/main/java/com/naviapp/dashboard/loanapplicationdetails/bank_account_change/fragments/BankChangeDetailsFragment.kt index 94d711d4e0..cb7fd9103b 100644 --- a/app/src/main/java/com/naviapp/dashboard/loanapplicationdetails/bank_account_change/fragments/BankChangeDetailsFragment.kt +++ b/app/src/main/java/com/naviapp/dashboard/loanapplicationdetails/bank_account_change/fragments/BankChangeDetailsFragment.kt @@ -36,10 +36,8 @@ import com.naviapp.part_prepayment.states.GenericWidgetState import com.naviapp.personalloan.getloan.common.fragment.CustomerSupportFragment import com.naviapp.utils.Constants import com.naviapp.utils.Constants.TRUE -import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch -@AndroidEntryPoint class BankChangeDetailsFragment : BaseFragment(), WidgetCallback { private val bankChangeDetailsViewModel by lazy { ViewModelProvider(this)[BankChangeDetailsViewModel::class.java] diff --git a/app/src/main/java/com/naviapp/dashboard/loanapplicationdetails/bank_account_change/viewmodels/BankChangeDetailsViewModel.kt b/app/src/main/java/com/naviapp/dashboard/loanapplicationdetails/bank_account_change/viewmodels/BankChangeDetailsViewModel.kt index b6c81cd5f5..b955e72582 100644 --- a/app/src/main/java/com/naviapp/dashboard/loanapplicationdetails/bank_account_change/viewmodels/BankChangeDetailsViewModel.kt +++ b/app/src/main/java/com/naviapp/dashboard/loanapplicationdetails/bank_account_change/viewmodels/BankChangeDetailsViewModel.kt @@ -10,14 +10,13 @@ package com.naviapp.dashboard.loanapplicationdetails.bank_account_change.viewmod import com.navi.common.viewmodel.BaseVM import com.naviapp.part_prepayment.states.GenericWidgetState import com.naviapp.personalloan.getloan.bankdetails.repositories.BankDetailsRepository -import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -import javax.inject.Inject -@HiltViewModel -class BankChangeDetailsViewModel @Inject constructor(private val bankDetailsRepository: BankDetailsRepository) : BaseVM() { +class BankChangeDetailsViewModel( + private val bankDetailsRepository: BankDetailsRepository = BankDetailsRepository() +) : BaseVM() { private val _widgetDataResponse = MutableStateFlow(GenericWidgetState.Init) val widgetDataResponse = _widgetDataResponse.asStateFlow() diff --git a/app/src/main/java/com/naviapp/dashboard/menu/appsettings/activity/AppSettingsActivity.kt b/app/src/main/java/com/naviapp/dashboard/menu/appsettings/activity/AppSettingsActivity.kt new file mode 100644 index 0000000000..3bb0be61f1 --- /dev/null +++ b/app/src/main/java/com/naviapp/dashboard/menu/appsettings/activity/AppSettingsActivity.kt @@ -0,0 +1,131 @@ +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.naviapp.dashboard.menu.appsettings.activity + +import android.os.Bundle +import android.view.LayoutInflater +import androidx.activity.viewModels +import androidx.databinding.DataBindingUtil +import com.navi.base.model.ActionData +import com.navi.common.listeners.HeaderInteractionListener +import com.navi.common.model.ModuleNameV2 +import com.navi.common.network.models.GenericErrorResponse +import com.navi.common.ui.activity.BaseActivity +import com.navi.common.ui.fragment.HorizontalActionErrorFragment +import com.navi.common.utils.getInstalledDynamicModulesCommaSeparated +import com.navi.common.utils.observeNonNull +import com.navi.common.utils.toCtaData +import com.navi.naviwidgets.utils.BOTTOM_SHEET +import com.navi.naviwidgets.utils.NaviWidgetIconUtils +import com.naviapp.R +import com.naviapp.analytics.utils.NaviAnalytics +import com.naviapp.common.navigator.NaviDeepLinkNavigator +import com.naviapp.dashboard.menu.appsettings.model.AppSettingsItem +import com.naviapp.dashboard.menu.appsettings.viewmodel.AppSettingsVM +import com.naviapp.databinding.AppSettingsActivityBinding +import com.naviapp.databinding.AppSettingsItemsBinding +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class AppSettingsActivity : BaseActivity(), HeaderInteractionListener { + private lateinit var binding: AppSettingsActivityBinding + private val viewModel by viewModels() + private var isDataNeedsToRefresh = false + private val dynamicDeliveryEventTracker by lazy { + NaviAnalytics.naviAnalytics.DynamicDelivery(screenName) + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView(this, R.layout.app_settings_activity) + super.setContentView(binding.root) + initError(viewModel, showNewDesignSystemFragment = true) + initObservers() + fetchAppSettings() + } + + private fun fetchAppSettings() { + showLoader() + viewModel.fetchAppSettings(hasPermissions(), getInstalledDynamicModulesCommaSeparated()) + } + + override fun onResume() { + super.onResume() + if (isDataNeedsToRefresh) { + fetchAppSettings() + } + } + + private fun initObservers() { + viewModel.appSettingsResponse.observeNonNull(this) { response -> + hideLoader() + binding.headerView.setProperties(response.header, this) + binding.headerView.hideDivider() + bindItems(response.content?.widgets) + } + } + + private fun bindItems(widgets: List?) { + val inflater = LayoutInflater.from(this) + binding.itemContainer.removeAllViews() + widgets?.forEach { widget -> + val view = inflater.inflate(R.layout.app_settings_items, binding.itemContainer, false) + val itemBinding: AppSettingsItemsBinding? = DataBindingUtil.bind(view) + itemBinding?.data = widget + if (widget.leftIcon != null) { + itemBinding?.leftIconIv?.let { NaviWidgetIconUtils.updateIcon(widget.leftIcon, it) } + } + itemBinding?.rightIv?.setProperties(widget.actionData, null) + binding.itemContainer.addView(view) + itemBinding?.rightIv?.setOnClickListener { + isDataNeedsToRefresh = true + if (widget.actionData?.url == BOTTOM_SHEET) { + dynamicDeliveryEventTracker.subModuleUninstallClick() + openBottomSheet(widget.bottomSheetData) + } else { + dynamicDeliveryEventTracker.subModuleInstallClick() + widget.actionData?.let { + NaviDeepLinkNavigator.navigate(activity = this, ctaData = it.toCtaData()) + } + } + } + } + } + + private fun openBottomSheet(exitBottomSheetData: GenericErrorResponse?) { + dynamicDeliveryEventTracker.subModuleUninstallPopup() + val bottomSheet = + HorizontalActionErrorFragment.getInstance( + error = exitBottomSheetData, + action = null, + cancelable = true, + sourceScreenName = screenName, + moduleName = moduleName.name, + hideIcon = true, + ) + safelyShowBottomSheet(bottomSheet, HorizontalActionErrorFragment.TAG) + } + + override fun onBackPressed() { + super.onBackPressed() + } + + override fun onTopPressed(actionData: ActionData?, exitBottomSheetData: GenericErrorResponse?) { + super.onBackPressed() + } + + override val screenName: String + get() = TAG + + override val moduleName: ModuleNameV2 + get() = ModuleNameV2.COMMON + + companion object { + const val TAG = "APP_SETTINGS_ACTIVITY" + } +} diff --git a/app/src/main/java/com/naviapp/dashboard/menu/appsettings/model/AppSettingsResponse.kt b/app/src/main/java/com/naviapp/dashboard/menu/appsettings/model/AppSettingsResponse.kt new file mode 100644 index 0000000000..86c381f47a --- /dev/null +++ b/app/src/main/java/com/naviapp/dashboard/menu/appsettings/model/AppSettingsResponse.kt @@ -0,0 +1,30 @@ +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.naviapp.dashboard.menu.appsettings.model + +import com.google.gson.annotations.SerializedName +import com.navi.base.model.ActionData +import com.navi.common.model.Header +import com.navi.common.network.models.GenericErrorResponse +import com.navi.design.textview.model.TextWithStyle + +data class AppSettingsResponse( + @SerializedName("header") val header: Header? = null, + @SerializedName("content") val content: AppSettingsContent? = null +) + +data class AppSettingsContent( + @SerializedName("widgets") val widgets: List? = null +) + +data class AppSettingsItem( + @SerializedName("titleAttribute") val title: TextWithStyle? = null, + @SerializedName("leftIcon") val leftIcon: String? = null, + @SerializedName("actionData") val actionData: ActionData? = null, + @SerializedName("bottomSheetData") var bottomSheetData: GenericErrorResponse? = null, +) diff --git a/app/src/main/java/com/naviapp/dashboard/menu/appsettings/repository/AppSettingsRepository.kt b/app/src/main/java/com/naviapp/dashboard/menu/appsettings/repository/AppSettingsRepository.kt new file mode 100644 index 0000000000..2d597c20f8 --- /dev/null +++ b/app/src/main/java/com/naviapp/dashboard/menu/appsettings/repository/AppSettingsRepository.kt @@ -0,0 +1,24 @@ +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.naviapp.dashboard.menu.appsettings.repository + +import com.naviapp.network.di.SuperAppRetroFit +import com.naviapp.network.retrofit.ResponseCallback +import com.naviapp.network.retrofit.RetrofitService +import javax.inject.Inject + +class AppSettingsRepository +@Inject +constructor(@SuperAppRetroFit private val superAppRetroFitService: RetrofitService) : + ResponseCallback() { + + suspend fun fetchAppSettings(isPermissionGranted: Boolean, installedModules: String) = + apiResponseCallback( + superAppRetroFitService.fetchAppSettings(isPermissionGranted, installedModules) + ) +} diff --git a/app/src/main/java/com/naviapp/dashboard/menu/appsettings/viewmodel/AppSettingsVM.kt b/app/src/main/java/com/naviapp/dashboard/menu/appsettings/viewmodel/AppSettingsVM.kt new file mode 100644 index 0000000000..6bd82bdbaa --- /dev/null +++ b/app/src/main/java/com/naviapp/dashboard/menu/appsettings/viewmodel/AppSettingsVM.kt @@ -0,0 +1,36 @@ +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.naviapp.dashboard.menu.appsettings.viewmodel + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import com.navi.common.viewmodel.BaseVM +import com.naviapp.dashboard.menu.appsettings.model.AppSettingsResponse +import com.naviapp.dashboard.menu.appsettings.repository.AppSettingsRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject +import kotlinx.coroutines.launch + +@HiltViewModel +class AppSettingsVM @Inject constructor(private val repository: AppSettingsRepository) : BaseVM() { + + private val _appSettingsResponse = MutableLiveData() + val appSettingsResponse: LiveData + get() = _appSettingsResponse + + fun fetchAppSettings(isPermissionGranted: Boolean, installedModules: String) { + coroutineScope.launch { + val response = repository.fetchAppSettings(isPermissionGranted, installedModules) + if (response.error == null && response.errors.isNullOrEmpty()) { + _appSettingsResponse.value = response.data + } else { + setErrorData(response.errors, response.error) + } + } + } +} diff --git a/app/src/main/java/com/naviapp/dynamicdelivery/activity/DynamicDeliveryActivity.kt b/app/src/main/java/com/naviapp/dynamicdelivery/activity/DynamicDeliveryActivity.kt new file mode 100644 index 0000000000..1ffb947578 --- /dev/null +++ b/app/src/main/java/com/naviapp/dynamicdelivery/activity/DynamicDeliveryActivity.kt @@ -0,0 +1,384 @@ +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.naviapp.dynamicdelivery.activity + +import android.content.Intent +import android.os.Bundle +import android.view.View.GONE +import android.view.View.VISIBLE +import androidx.activity.viewModels +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.lifecycleScope +import com.google.android.play.core.splitinstall.SplitInstallManager +import com.google.android.play.core.splitinstall.SplitInstallManagerFactory +import com.navi.analytics.utils.NaviTrackEvent +import com.navi.base.model.CtaData +import com.navi.base.utils.orFalse +import com.navi.base.utils.orZero +import com.navi.common.lottie.LottieRemoteHelper +import com.navi.common.model.ModuleNameV2 +import com.navi.common.ui.activity.BaseActivity +import com.navi.common.utils.TemporaryStorageHelper +import com.navi.common.utils.isDynamicModuleInstalled +import com.navi.common.utils.setDynamicModuleDownloadSizeInBytes +import com.navi.common.utils.setDynamicModuleInstallationStatus +import com.navi.common.utils.uninstallDynamicModules +import com.navi.design.font.FontWeightEnum +import com.navi.design.textview.model.NaviSpan +import com.navi.design.textview.model.TextWithStyle +import com.navi.design.utils.setSpannableString +import com.navi.naviwidgets.extensions.showWhenDataIsAvailable +import com.navi.naviwidgets.utils.LottieEnums +import com.naviapp.BuildConfig.APPLICATION_ID +import com.naviapp.R +import com.naviapp.analytics.utils.NaviAnalytics +import com.naviapp.common.navigator.NaviDeepLinkNavigator +import com.naviapp.common.navigator.NaviDeepLinkNavigator.HOME +import com.naviapp.common.navigator.NaviDeepLinkNavigator.HOME_ACTIVITY_CLASS_PATH +import com.naviapp.databinding.ActivityDynamicDeliveryBinding +import com.naviapp.dynamicdelivery.viewmodel.DynamicDeliveryVM +import com.naviapp.dynamicdelivery.viewmodel.DynamicDeliveryVMProviderFactory +import com.naviapp.dynamicdelivery.viewmodel.ModuleStatus +import com.naviapp.utils.Constants.ACTION +import com.naviapp.utils.Constants.ACTIVITY_CLASS_PATH +import com.naviapp.utils.Constants.CLEAR_TASK +import com.naviapp.utils.Constants.NEEDS_RESULT +import com.naviapp.utils.Constants.PL_DYNAMIC_MODULE_NAME +import com.naviapp.utils.Constants.REQUEST_CODE +import com.naviapp.utils.Constants.UNINSTALL +import com.naviapp.utils.setVisibilityState +import kotlin.math.min +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch + +class DynamicDeliveryActivity : BaseActivity() { + private lateinit var binding: ActivityDynamicDeliveryBinding + private lateinit var lottieRemoteHelper: LottieRemoteHelper + private lateinit var splitInstallManager: SplitInstallManager + private val dynamicDeliveryVM by + viewModels { DynamicDeliveryVMProviderFactory(splitInstallManager) } + private val dynamicDeliveryEventTracker by lazy { + NaviAnalytics.naviAnalytics.DynamicDelivery(screenName) + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView(this, R.layout.activity_dynamic_delivery) + super.setContentView(binding.root) + splitInstallManager = SplitInstallManagerFactory.create(this) + NaviTrackEvent.sendScreenTransitionEvent(screenName) + lottieRemoteHelper = LottieRemoteHelper(this) + initError() + initObservers() + initUi() + TemporaryStorageHelper.updateSingleItem(TemporaryStorageHelper.HOME) + } + + private fun initError() { + initError(dynamicDeliveryVM, actionErrorV2Enabled = true) + } + + private fun initObservers() { + observeDynamicDeliveryData() + } + + private fun initUi() { + if (intent.getStringExtra(ACTION) == UNINSTALL) { + initUninstallingUi() + } else { + initDownloadingUi() + dynamicDeliveryVM.installModuleAndLaunchActivity( + PL_DYNAMIC_MODULE_NAME, + intent.getStringExtra(ACTIVITY_CLASS_PATH) ?: HOME_ACTIVITY_CLASS_PATH + ) + } + } + + private fun initUninstallingUi() { + dynamicDeliveryEventTracker.loaderShownSubModuleUninstalling() + + binding.apply { + rootItem.setBackgroundColor( + ContextCompat.getColor(this@DynamicDeliveryActivity, R.color.color_3C0050) + ) + + bottomIv.setVisibilityState(VISIBLE) + + lottieView.showWhenDataIsAvailable( + lottieName = LottieEnums.DYNAMIC_DELIVERY_INSTALLING.name, + infiniteRepeat = true + ) + + titleTv.setSpannableString( + TextWithStyle( + text = getString(R.string.please_wait_we_are_uninstalling_cash_loan_app), + style = + listOf( + NaviSpan( + startSpan = 0, + endSpan = 13, + fontSize = 16.0, + spanColor = getString(R.string.color_white), + fontName = FontWeightEnum.TT_MEDIUM.name + ), + NaviSpan( + startSpan = 13, + endSpan = 46, + fontSize = 14.0, + spanColor = getString(R.string.color_white), + fontName = FontWeightEnum.TT_MEDIUM.name + ) + ) + ) + ) + + bottomTv.setSpannableString( + TextWithStyle( + text = getString(R.string.please_dont_close_or_press_back), + style = + listOf( + NaviSpan( + fontSize = 14.0, + spanColor = getString(R.string.color_white), + fontName = FontWeightEnum.TT_REGULAR.name + ) + ) + ) + ) + } + + uninstallDynamicModules(listOf(PL_DYNAMIC_MODULE_NAME)) + + dynamicDeliveryEventTracker.subModuleUninstalled() + + lifecycleScope.launch { + delay(DYNAMIC_DELIVERY_UNINSTALL_DELAY) + NaviDeepLinkNavigator.navigate( + activity = this@DynamicDeliveryActivity, + ctaData = CtaData(url = HOME) + ) + } + } + + private fun initDownloadingUi() { + dynamicDeliveryEventTracker.loaderShownSubModuleDownloading() + + binding.apply { + rootItem.setBackgroundColor( + ContextCompat.getColor(this@DynamicDeliveryActivity, R.color.color_3C0050) + ) + + bottomIv.setVisibilityState(VISIBLE) + + lottieView.showWhenDataIsAvailable( + lottieName = LottieEnums.DYNAMIC_DELIVERY_DOWNLOADING.name, + playAnimation = false, + repeatCount = 0 + ) + + downloadProgressLl.setVisibilityState(VISIBLE) + downloadPercentTv.text = getString(R.string.progress_percentage, 0) + downloadSizeTv.text = getString(R.string.calculating_ellipsis) + + titleTv.setSpannableString( + TextWithStyle( + text = getString(R.string.downloading_cash_loan_app), + style = + listOf( + NaviSpan( + fontSize = 16.0, + spanColor = getString(R.string.color_white), + fontName = FontWeightEnum.TT_MEDIUM.name + ) + ) + ) + ) + + bottomTv.setSpannableString( + TextWithStyle( + text = getString(R.string.please_dont_close_or_press_back), + style = + listOf( + NaviSpan( + fontSize = 14.0, + spanColor = getString(R.string.color_white), + fontName = FontWeightEnum.TT_REGULAR.name + ) + ) + ) + ) + } + } + + private fun initInstallingUi() { + dynamicDeliveryEventTracker.loaderShownSubModuleInstalling() + + binding.apply { + lottieView.showWhenDataIsAvailable( + lottieName = LottieEnums.DYNAMIC_DELIVERY_INSTALLING.name, + infiniteRepeat = true + ) + + downloadProgressLl.setVisibilityState(GONE) + + titleTv.setSpannableString( + TextWithStyle( + text = getString(R.string.please_wait_we_are_installing_cash_loan_app), + style = + listOf( + NaviSpan( + startSpan = 0, + endSpan = 13, + fontSize = 16.0, + spanColor = getString(R.string.color_white), + fontName = FontWeightEnum.TT_MEDIUM.name + ), + NaviSpan( + startSpan = 13, + endSpan = 44, + fontSize = 14.0, + spanColor = getString(R.string.color_white), + fontName = FontWeightEnum.TT_MEDIUM.name + ) + ) + ) + ) + } + } + + private fun initInstalledUi(moduleName: String, activityClassPath: String) { + dynamicDeliveryEventTracker.subModuleInstalled() + + binding.apply { + downloadProgressLl.setVisibilityState(GONE) + + lottieView.showWhenDataIsAvailable( + lottieName = LottieEnums.DYNAMIC_DELIVERY_INSTALLED.name, + repeatCount = 0 + ) + + titleTv.setSpannableString( + TextWithStyle( + text = getString(R.string.app_installed_successfully), + style = + listOf( + NaviSpan( + fontSize = 16.0, + spanColor = getString(R.string.color_white), + fontName = FontWeightEnum.TT_MEDIUM.name + ) + ) + ) + ) + + bottomTv.setVisibilityState(GONE) + } + + lifecycleScope.launch { + delay(DYNAMIC_DELIVERY_INSTALLED_LOTTIE_DURATION) + setDynamicModuleInstallationStatus(isInstalled = true) + launchModule(moduleName = moduleName, activityClassPath = activityClassPath) + } + } + + private fun updateDownloadingProgress(bytesDownloaded: Long, totalBytesToDownload: Long) { + dynamicDeliveryEventTracker.subModuleDownloadProgress( + bytesDownloaded = bytesDownloaded, + totalBytesToDownload = totalBytesToDownload + ) + setDynamicModuleDownloadSizeInBytes(downloadSizeInBytes = totalBytesToDownload) + + val progress = min(bytesDownloaded.toDouble() / totalBytesToDownload.toDouble(), 1.0) + val progressPercentage = (progress * 100).toInt() + val downloadSizeInKb = (totalBytesToDownload / 1024).toInt() + + binding.apply { + lottieView.progress = progress.toFloat() + downloadPercentTv.text = getString(R.string.progress_percentage, progressPercentage) + if (downloadSizeInKb > 0) + downloadSizeTv.text = getString(R.string.download_size_in_kb, downloadSizeInKb) + } + } + + private fun updateDownloadedProgress() { + dynamicDeliveryEventTracker.subModuleDownloaded() + + binding.apply { + lottieView.progress = 1.0f + downloadPercentTv.text = getString(R.string.progress_percentage, 100) + } + } + + private fun observeDynamicDeliveryData() { + dynamicDeliveryVM.dynamicDeliveryLiveData.observe(this) { + when (it) { + is ModuleStatus.Downloading -> + updateDownloadingProgress( + bytesDownloaded = it.bytesDownloaded, + totalBytesToDownload = it.totalBytesToDownload + ) + is ModuleStatus.Downloaded -> updateDownloadedProgress() + is ModuleStatus.Installing -> + lifecycleScope.launch { + delay(DYNAMIC_DELIVERY_INSTALLING_DELAY) + initInstallingUi() + } + is ModuleStatus.Installed -> + lifecycleScope.launch { + delay(DYNAMIC_DELIVERY_INSTALLED_DELAY) + initInstalledUi( + moduleName = it.moduleName, + activityClassPath = it.activityClassPath + ) + } + else -> Unit + } + } + } + + private fun launchModule(moduleName: String, activityClassPath: String) { + if (isDynamicModuleInstalled(moduleName = moduleName)) { + val launchIntent = + Intent().apply { + setClassName(APPLICATION_ID, activityClassPath) + intent.extras?.let { putExtras(it) } + } + val needsResult = intent.getBooleanExtra(NEEDS_RESULT, false) + val clearTask = intent.getBooleanExtra(CLEAR_TASK, false) + val requestCode = intent.getIntExtra(REQUEST_CODE, 0) + if (clearTask.orFalse()) { + launchIntent.addFlags( + Intent.FLAG_ACTIVITY_NEW_TASK or + Intent.FLAG_ACTIVITY_CLEAR_TASK or + Intent.FLAG_ACTIVITY_CLEAR_TOP + ) + } + if (needsResult.orFalse()) { + startActivityForResult(launchIntent, requestCode.orZero()) + } else startActivity(launchIntent) + finish() + } + } + + override fun onBackPressed() {} + + override val screenName: String + get() = "DYNAMIC_DELIVERY" + + override val moduleName: ModuleNameV2 + get() = ModuleNameV2.COMMON + + companion object { + const val TAG = "DYNAMIC_DELIVERY_LOADER" + const val DYNAMIC_DELIVERY_INSTALLING_DELAY = 250L + const val DYNAMIC_DELIVERY_INSTALLED_DELAY = 3000L + const val DYNAMIC_DELIVERY_UNINSTALL_DELAY = 3000L + const val DYNAMIC_DELIVERY_INSTALLED_LOTTIE_DURATION = 1000L + } +} diff --git a/app/src/main/java/com/naviapp/dynamicdelivery/viewmodel/DynamicDeliveryVM.kt b/app/src/main/java/com/naviapp/dynamicdelivery/viewmodel/DynamicDeliveryVM.kt new file mode 100644 index 0000000000..bb46bbdccf --- /dev/null +++ b/app/src/main/java/com/naviapp/dynamicdelivery/viewmodel/DynamicDeliveryVM.kt @@ -0,0 +1,137 @@ +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.naviapp.dynamicdelivery.viewmodel + +import androidx.annotation.Keep +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.viewModelScope +import com.google.android.play.core.splitinstall.SplitInstallManager +import com.google.android.play.core.splitinstall.SplitInstallRequest +import com.google.android.play.core.splitinstall.model.SplitInstallSessionStatus.DOWNLOADED +import com.google.android.play.core.splitinstall.model.SplitInstallSessionStatus.DOWNLOADING +import com.google.android.play.core.splitinstall.model.SplitInstallSessionStatus.FAILED +import com.google.android.play.core.splitinstall.model.SplitInstallSessionStatus.INSTALLED +import com.google.android.play.core.splitinstall.model.SplitInstallSessionStatus.INSTALLING +import com.navi.common.utils.getDynamicModuleDownloadSizeInBytes +import com.navi.common.utils.getInstalledDynamicModules +import com.navi.common.viewmodel.BaseVM +import com.naviapp.dynamicdelivery.viewmodel.ModuleStatus.Downloaded +import com.naviapp.dynamicdelivery.viewmodel.ModuleStatus.Downloading +import com.naviapp.dynamicdelivery.viewmodel.ModuleStatus.Failed +import com.naviapp.dynamicdelivery.viewmodel.ModuleStatus.Installed +import com.naviapp.dynamicdelivery.viewmodel.ModuleStatus.Installing +import com.naviapp.dynamicdelivery.viewmodel.ModuleStatus.Unavailable +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch + +@Keep +class DynamicDeliveryVM(private val manager: SplitInstallManager) : BaseVM() { + + private var _dynamicDeliveryLiveData = MutableLiveData() + val dynamicDeliveryLiveData: LiveData = _dynamicDeliveryLiveData + + fun installModuleAndLaunchActivity(moduleName: String, activityClassPath: String) { + viewModelScope.launch { + if (getInstalledDynamicModules(manager).contains(moduleName)) { + requestModuleReInstallation( + moduleName = moduleName, + activityClassPath = activityClassPath + ) + } else { + requestModuleInstallation( + moduleName = moduleName, + activityClassPath = activityClassPath + ) + } + } + } + + private suspend fun requestModuleReInstallation(moduleName: String, activityClassPath: String) { + val totalBytesToDownload = getDynamicModuleDownloadSizeInBytes() + + delay(DYNAMIC_DELIVERY_REINSTALLING_TWENTY_PERCENT_DELAY) + _dynamicDeliveryLiveData.value = + Downloading( + bytesDownloaded = totalBytesToDownload / 5, + totalBytesToDownload = totalBytesToDownload + ) + + delay(DYNAMIC_DELIVERY_REINSTALLING_SIXTY_PERCENT_DELAY) + _dynamicDeliveryLiveData.value = + Downloading( + bytesDownloaded = totalBytesToDownload / 5 * 3, + totalBytesToDownload = totalBytesToDownload + ) + + delay(DYNAMIC_DELIVERY_REINSTALLING_HUNDRED_PERCENT_DELAY) + _dynamicDeliveryLiveData.value = Downloaded + + _dynamicDeliveryLiveData.value = Installing + + _dynamicDeliveryLiveData.value = + Installed(moduleName = moduleName, activityClassPath = activityClassPath) + } + + private fun requestModuleInstallation(moduleName: String, activityClassPath: String) { + try { + val request = SplitInstallRequest.newBuilder().addModule(moduleName).build() + manager.startInstall(request).addOnFailureListener { + _dynamicDeliveryLiveData.value = Failed + } + getDynamicModuleStatus(moduleName = moduleName, activityClassPath = activityClassPath) + } catch (e: Exception) { + _dynamicDeliveryLiveData.value = Failed + } + } + + private fun getDynamicModuleStatus(moduleName: String, activityClassPath: String) { + manager.registerListener { + _dynamicDeliveryLiveData.value = + when (it.status()) { + DOWNLOADING -> + Downloading( + bytesDownloaded = it.bytesDownloaded(), + totalBytesToDownload = it.totalBytesToDownload() + ) + DOWNLOADED -> Downloaded + INSTALLING -> Installing + INSTALLED -> + Installed(moduleName = moduleName, activityClassPath = activityClassPath) + FAILED -> Failed + else -> Unavailable + } + } + } + + companion object { + const val TAG = "DYNAMIC_DELIVERY_LOADER" + const val DYNAMIC_DELIVERY_REINSTALLING_TWENTY_PERCENT_DELAY = 250L + const val DYNAMIC_DELIVERY_REINSTALLING_SIXTY_PERCENT_DELAY = 1000L + const val DYNAMIC_DELIVERY_REINSTALLING_HUNDRED_PERCENT_DELAY = 1000L + } +} + +class DynamicDeliveryVMProviderFactory(private val manager: SplitInstallManager) : + ViewModelProvider.Factory { + override fun create(modelClass: Class): T { + return modelClass.getConstructor(SplitInstallManager::class.java).newInstance(manager) + } +} + +sealed class ModuleStatus { + data class Downloading(val bytesDownloaded: Long, val totalBytesToDownload: Long) : + ModuleStatus() + object Downloaded : ModuleStatus() + object Installing : ModuleStatus() + data class Installed(val moduleName: String, val activityClassPath: String) : ModuleStatus() + object Failed : ModuleStatus() + object Unavailable : ModuleStatus() +} diff --git a/app/src/main/java/com/naviapp/home/activity/NewDashboardActivity.kt b/app/src/main/java/com/naviapp/home/activity/NewDashboardActivity.kt index de2bbe1f39..77ea200df1 100644 --- a/app/src/main/java/com/naviapp/home/activity/NewDashboardActivity.kt +++ b/app/src/main/java/com/naviapp/home/activity/NewDashboardActivity.kt @@ -53,6 +53,10 @@ import com.navi.common.utils.* import com.navi.common.utils.Constants.APP_VERSION_ON_UPDATE import com.navi.common.utils.Constants.SHOW_INVESTMENT_ON_BOTTOM_NAV import com.navi.common.utils.Constants.SKIP_PERMISSION_SCREEN +import com.navi.common.utils.getLogoutData +import com.navi.common.utils.observeNonNull +import com.navi.common.utils.observeNullable +import com.navi.common.utils.setStatusBarColor import com.navi.design.utils.dpToPxInInt import com.navi.insurance.common.util.ActionHandler import com.navi.insurance.health.activity.JusPayUtil @@ -97,13 +101,11 @@ import com.naviapp.personalloan.getloan.loandetails.fragments.DailyOfferBottomSh import com.naviapp.personalloanrevamp.customview.DailyOfferBottomSheetV2 import com.naviapp.registration.viewmodel.ConfigVM import com.naviapp.registration.viewmodel.RegistrationVM +import com.naviapp.utils.* import com.naviapp.utils.BottomBarUtils.fetchDefaultTabTitle import com.naviapp.utils.BottomBarUtils.getLottieDrawable import com.naviapp.utils.BottomBarUtils.setTabIcon import com.naviapp.utils.Constants -import com.naviapp.utils.IntentConstants -import com.naviapp.utils.deleteCacheAndOpenLoginPage -import com.naviapp.utils.removeBadgeCount import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -169,25 +171,6 @@ class NewDashboardActivity : } } - private fun checkForPermissions() { - if (PreferenceManager.getBooleanPreference(SKIP_PERMISSION_SCREEN, false)) { - return - } - val listOfPermissions = PreferenceManager.getHashSet(com.navi.common.utils.Constants.LIST_OF_PERMISSION) - if (listOfPermissions.isNullOrEmpty().not() && - !permissionsManager.hasPermissions(listOfPermissions?.toTypedArray()!!) - ) { - val bundle = Bundle() - bundle.putBoolean(NORMAL_PERMISSION_FLOW, true) - NaviDeepLinkNavigator.navigate( - activity = this, - ctaData = CtaData(url = NaviDeepLinkNavigator.MANDATE_PERMISSION), - finish = true, - bundle = bundle - ) - } - } - private fun initThirdPartySDKs() { if (FirebaseRemoteConfigHelper.getBoolean(FirebaseRemoteConfigHelper.APP_PERFORMANCE_V2_DISABLE)) { if (!HyperServicesHolder.isSDKInitialized()) { @@ -233,7 +216,14 @@ class NewDashboardActivity : updateTab(HomeFragment.TAG, intent.extras) } TempStorageHelper.clear() - checkForPermissions() + if (isAllMandatoryPermissionGranted(permissionsManager).not() && PreferenceManager.getBooleanPreference(SKIP_PERMISSION_SCREEN, false).not()) { + launchPermissionActivity( + activity = this, + addIntentFlags = false, + finish = true, + normalFlow = true + ) + } } fun navigateToNextScreen(currentScreenTag: String, bundle: Bundle?) { @@ -461,11 +451,20 @@ class NewDashboardActivity : } R.id.dashboard -> { - handleTabClick( - BottomBarTabType.DASHBOARD, - DashboardFragment.TAG, - NaviAnalytics.NEW_DASHBOARD_CLICKED - ) + if (isAllMandatoryPermissionGranted(permissionsManager)) { + handleTabClick( + BottomBarTabType.DASHBOARD, + DashboardFragment.TAG, + NaviAnalytics.NEW_DASHBOARD_CLICKED + ) + } else { + launchPermissionActivity( + activity = this, + addIntentFlags = false, + finish = false, + normalFlow = false + ) + } } R.id.profile -> { @@ -477,12 +476,21 @@ class NewDashboardActivity : ) } R.id.investment -> { - removeBadgeCount(binding.bottomNavigationView.getBadge(R.id.investment)) - handleTabClick( - BottomBarTabType.INVESTMENT, - FundListingFragmentV2.TAG, - NaviAnalytics.NAV_INVESTMENT_CLICKED - ) + if (isAllMandatoryPermissionGranted(permissionsManager)) { + removeBadgeCount(binding.bottomNavigationView.getBadge(R.id.investment)) + handleTabClick( + BottomBarTabType.INVESTMENT, + FundListingFragmentV2.TAG, + NaviAnalytics.NAV_INVESTMENT_CLICKED + ) + } else { + launchPermissionActivity( + activity = this, + addIntentFlags = false, + finish = false, + normalFlow = false + ) + } } R.id.loan -> { handleTabClick( diff --git a/app/src/main/java/com/naviapp/home/fragment/HomeFragment.kt b/app/src/main/java/com/naviapp/home/fragment/HomeFragment.kt index 05a37edf74..194f21577a 100644 --- a/app/src/main/java/com/naviapp/home/fragment/HomeFragment.kt +++ b/app/src/main/java/com/naviapp/home/fragment/HomeFragment.kt @@ -59,6 +59,7 @@ import com.navi.common.model.PreviousScreenNameRequest import com.navi.common.ui.activity.BaseActivity import com.navi.common.ui.fragment.NewCommonBottomSheet import com.navi.common.utils.* +import com.navi.common.utils.Constants.KEY_UPCOMING_LOAN import com.navi.design.utils.* import com.navi.insurance.navigator.NaviInsuranceDeeplinkNavigator import com.navi.naviwidgets.actions.ShowInfoBottomSheetV3Action @@ -91,7 +92,6 @@ import com.naviapp.common.navigator.ScreenNavigator import com.naviapp.common.viewmodel.InAppUpdateVM import com.naviapp.dashboard.listeners.PlayStoreActionListener import com.naviapp.dashboard.listeners.ShareAppListener -import com.naviapp.dashboard.newloan.NewLoanConsentActivity import com.naviapp.dashboard.rating.PlayStoreInAppRatingHelper import com.naviapp.dashboard.viewmodels.DashboardSharedVM import com.naviapp.dashboard.viewmodels.RatingVM @@ -128,6 +128,10 @@ import com.naviapp.utils.Constants.LOAN_TYPE import com.naviapp.utils.Constants.PAYMENT_TYPE import com.naviapp.utils.Constants.RATING_COUNT import com.naviapp.utils.Constants.SHOW_SCROLL_FEEDBACK_IN_HOME_SCREEN +import com.naviapp.utils.getIntentPackageNameForFpsMigration +import com.naviapp.utils.giDeeplink +import com.naviapp.utils.isAllMandatoryPermissionGranted +import com.naviapp.utils.isAppInstalled import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch @@ -181,12 +185,12 @@ class HomeFragment : PaymentBaseFragment(), WidgetCallback, PlayStoreActionListe analyticsStartTs = System.currentTimeMillis() totalRenderTs = System.currentTimeMillis() naviAnalyticsEventTracker.onHomePageCreated() + activity?.run { permissionsManager = PermissionsManager(this) } initUI() initListener() initObservers() fetchHomeItems() fetchHomeFeature() - activity?.run { permissionsManager = PermissionsManager(this) } fetchStories() initializationPaymentDetail(isHomePageNeededToRelaunch = true) return binding.root @@ -234,7 +238,9 @@ class HomeFragment : PaymentBaseFragment(), WidgetCallback, PlayStoreActionListe viewModel.checkForLoanDetailWVPrefetch() TemporaryStorageHelper.clearResponse(TemporaryStorageHelper.HOME) } else if (TemporaryStorageHelper.isHomePageApiInProgress.not()) { - if (PreferenceManager.getSecureString(com.navi.common.utils.Constants.OFFER_VALUE) + if ( + BaseUtils.isUserLoggedIn().not() && + PreferenceManager.getSecureString(com.navi.common.utils.Constants.OFFER_VALUE) .isNullOrEmpty() .not() && PreferenceManager.getBooleanPreference(Constants.OFFER_VIEWED).not() @@ -260,7 +266,11 @@ class HomeFragment : PaymentBaseFragment(), WidgetCallback, PlayStoreActionListe } private fun fetchStories() { - context?.let { viewModel.fetchStories(getDensityName(it).orEmpty()) } + if (isAllMandatoryPermissionGranted(permissionsManager)) { + context?.let { viewModel.fetchStories(getDensityName(it).orEmpty()) } + } else { + binding.header.progressIcon.isVisible = false + } } private fun fetchHomeFeature() { @@ -305,7 +315,9 @@ class HomeFragment : PaymentBaseFragment(), WidgetCallback, PlayStoreActionListe PreferenceManager.getIntPreferenceApp( CURRENT_VERSION_IN_STORE ), - isSecondaryAppAvailable + isSecondaryAppAvailable, + isAllMandatoryPermissionGranted(permissionsManager), + getInstalledDynamicModulesCommaSeparated() ) } @@ -412,18 +424,18 @@ class HomeFragment : PaymentBaseFragment(), WidgetCallback, PlayStoreActionListe } response?.extraData?.rewardsIntroPopup?.let { readRewardsAnnouncementData(it) } response?.extraData?.uitronData?.let { showUiTronDialog(it.uiTronDialog) } - response?.extraData?.appUpdateData?.let { - if (NaviApplication.instance.getEnableAppUpdate()) { - toShowAppUpdate(it) - } - } ?: kotlin.run { - binding.appUpdateLayout.root.isVisible = false + if (response?.extraData?.bottomStickyNudge != null) { + showBottomStickyNudge(response.extraData.bottomStickyNudge) + } else if (response?.extraData?.appUpdateData != null && NaviApplication.instance.getEnableAppUpdate()) { + showBottomStickyNudge(response.extraData.appUpdateData) + } else { + binding.bottomStickyNudgeLayout.root.isVisible = false } if (!paymentVM.isPaymentLoaderShowing()) { hideLoader() } inAppUpdateVM.showAppUpdateStrip.observeNonNull(viewLifecycleOwner) { - binding.appUpdateLayout.root.isVisible = it + binding.bottomStickyNudgeLayout.root.isVisible = it } response?.extraData?.bottomSheetData?.let { val commonBottomSheet = NewCommonBottomSheet.getInstance(it) @@ -633,9 +645,9 @@ class HomeFragment : PaymentBaseFragment(), WidgetCallback, PlayStoreActionListe } } - private fun toShowAppUpdate(appUpdateData: AppUpdateData) { - binding.appUpdateLayout.root.isVisible = true - binding.appUpdateLayout.apply { + private fun showBottomStickyNudge(appUpdateData: AppUpdateData) { + binding.bottomStickyNudgeLayout.root.isVisible = true + binding.bottomStickyNudgeLayout.apply { appUpdateData.bgColor?.let { bgColor -> root.background = getNaviDrawable( radii = CornerRadius( @@ -1067,7 +1079,7 @@ class HomeFragment : PaymentBaseFragment(), WidgetCallback, PlayStoreActionListe ) bundle.putBoolean(GetLoanActivity.IS_FOR_SECOND_LOAN_JOURNEY, true) } else { - bundle.putParcelable(NewLoanConsentActivity.KEY_UPCOMING_LOAN, data) + bundle.putParcelable(KEY_UPCOMING_LOAN, data) } ScreenNavigator.instance.startActivity( activity, diff --git a/app/src/main/java/com/naviapp/home/model/WidgetResponse.kt b/app/src/main/java/com/naviapp/home/model/WidgetResponse.kt index 99211947e9..08b47413d0 100644 --- a/app/src/main/java/com/naviapp/home/model/WidgetResponse.kt +++ b/app/src/main/java/com/naviapp/home/model/WidgetResponse.kt @@ -78,6 +78,8 @@ data class ExtraDataDetails( val redirectionCta: CtaData? = null, @SerializedName("appUpdateData") val appUpdateData: AppUpdateData? = null, + @SerializedName("bottomStickyNudge") + val bottomStickyNudge: AppUpdateData? = null, @SerializedName("rewardNudgeData") val rewardNudgeData: RewardNudgeData? = null, @SerializedName("lottieUrls") diff --git a/app/src/main/java/com/naviapp/home/respository/GlobalRepo.kt b/app/src/main/java/com/naviapp/home/respository/GlobalRepo.kt index 0887a5cdaa..7c7c2212e0 100644 --- a/app/src/main/java/com/naviapp/home/respository/GlobalRepo.kt +++ b/app/src/main/java/com/naviapp/home/respository/GlobalRepo.kt @@ -39,6 +39,8 @@ class GlobalRepo @Inject constructor(@SuperAppRetroFit private val superAppRetro connectivityType: String?, availableAppVersionCode: Int?, appVariantAvailable: Boolean, + isPermissionsGranted: Boolean, + installedModules: String ) { TemporaryStorageHelper.isHomePageApiInProgress = true GlobalScope.launch(Dispatchers.IO) { @@ -46,6 +48,8 @@ class GlobalRepo @Inject constructor(@SuperAppRetroFit private val superAppRetro apiResponseCallback( superAppRetrofitService.fetchHomeItems( availableAppVersionCode, + isPermissionsGranted, + installedModules, appVariantAvailable ) ) @@ -56,6 +60,8 @@ class GlobalRepo @Inject constructor(@SuperAppRetroFit private val superAppRetro density.orEmpty(), connectivityType.orEmpty(), availableAppVersionCode, + isPermissionsGranted, + installedModules, appVariantAvailable ) ) diff --git a/app/src/main/java/com/naviapp/home/respository/HomeRepository.kt b/app/src/main/java/com/naviapp/home/respository/HomeRepository.kt index 1594bd18b7..6082f706f1 100644 --- a/app/src/main/java/com/naviapp/home/respository/HomeRepository.kt +++ b/app/src/main/java/com/naviapp/home/respository/HomeRepository.kt @@ -25,11 +25,15 @@ class HomeRepository @Inject constructor(@SuperAppRetroFit private val superAppR connectivityType: String?, availableAppVersionCode: Int?, appVariantAvailable: Boolean, + isPermissionsGranted: Boolean, + installedModules: String ): RepoResult { return if (queryMap.isNullOrEmpty()) apiResponseCallback( superAppRetrofitService.fetchHomeItems( availableAppVersionCode, + isPermissionsGranted, + installedModules, appVariantAvailable ) ) @@ -40,6 +44,8 @@ class HomeRepository @Inject constructor(@SuperAppRetroFit private val superAppR density.orEmpty(), connectivityType.orEmpty(), availableAppVersionCode, + isPermissionsGranted, + installedModules, appVariantAvailable ) ) diff --git a/app/src/main/java/com/naviapp/home/viewmodel/HomeVM.kt b/app/src/main/java/com/naviapp/home/viewmodel/HomeVM.kt index c04667a77d..206e3abf8f 100644 --- a/app/src/main/java/com/naviapp/home/viewmodel/HomeVM.kt +++ b/app/src/main/java/com/naviapp/home/viewmodel/HomeVM.kt @@ -129,6 +129,8 @@ class HomeVM @Inject constructor( callLoanDetailWVCacheApi: Boolean = false, availableAppVersionCode: Int?, appVariantAvailable: Boolean, + isPermissionGranted: Boolean, + installedModules: String ) { coroutineScope.launch(Dispatchers.IO) { val response = repository.fetchHomeItems( @@ -136,7 +138,9 @@ class HomeVM @Inject constructor( density, connectivityType, availableAppVersionCode, - appVariantAvailable + appVariantAvailable, + isPermissionGranted, + installedModules, ) if (response.error == null && response.errors.isNullOrEmpty()) { isUiTronScreenEnabled = response.data?.extraData?.showUiTronScreen == true diff --git a/app/src/main/java/com/naviapp/models/LoginSettings.kt b/app/src/main/java/com/naviapp/models/LoginSettings.kt index d119a793e8..6bd8fbf5a0 100644 --- a/app/src/main/java/com/naviapp/models/LoginSettings.kt +++ b/app/src/main/java/com/naviapp/models/LoginSettings.kt @@ -21,7 +21,8 @@ data class LoginSettings( @SerializedName("redirectToOtherApp") val redirectToOtherApp: Boolean? = null, @SerializedName("showReferralLottie") val showReferralLottie: Boolean? = null, @SerializedName("mandatoryLoginConfig") val loginExperimentSettings: LoginExperimentSettings? = null, - @SerializedName("whatsappLoginConfig") val whatsappLoginConfig: WhatsappLoginConfig? = null + @SerializedName("whatsappLoginConfig") val whatsappLoginConfig: WhatsappLoginConfig? = null, + @SerializedName("requiredPermissions") val requiredPermissions: List? = null ) data class LoginExperimentSettings( diff --git a/app/src/main/java/com/naviapp/models/response/BankStatementResponse.kt b/app/src/main/java/com/naviapp/models/response/BankStatementResponse.kt index 5e454dbf59..77bcbfd708 100644 --- a/app/src/main/java/com/naviapp/models/response/BankStatementResponse.kt +++ b/app/src/main/java/com/naviapp/models/response/BankStatementResponse.kt @@ -12,7 +12,6 @@ import com.google.gson.annotations.SerializedName import com.navi.base.model.CtaData import com.navi.naviwidgets.models.response.Footer import com.navi.naviwidgets.models.response.TextFieldData -import com.naviapp.personalloanrevamp.intermediatev2.fragments.BankStatementV2Fragment import kotlinx.parcelize.Parcelize data class BankStatementResponse( diff --git a/app/src/main/java/com/naviapp/models/response/PermissionDetailsResponse.kt b/app/src/main/java/com/naviapp/models/response/PermissionDetailsResponse.kt index bb0813cb84..710d98e5f0 100644 --- a/app/src/main/java/com/naviapp/models/response/PermissionDetailsResponse.kt +++ b/app/src/main/java/com/naviapp/models/response/PermissionDetailsResponse.kt @@ -23,5 +23,6 @@ data class PermissionDetailsContent( @SerializedName("dataSafetyBottomSheet") val dataSafetyBottomSheet: InfoBottomSheetConfig? = null, @SerializedName("permissionList") val permissionList: List? = null, + @SerializedName("modulesToInstall") val modulesToInstall: List? = null, @SerializedName("finoramicData") val finoramicData: FinoramicData? = null ) diff --git a/app/src/main/java/com/naviapp/network/retrofit/ResponseCallback.kt b/app/src/main/java/com/naviapp/network/retrofit/ResponseCallback.kt index 1dee190803..5260c70780 100644 --- a/app/src/main/java/com/naviapp/network/retrofit/ResponseCallback.kt +++ b/app/src/main/java/com/naviapp/network/retrofit/ResponseCallback.kt @@ -29,8 +29,8 @@ import com.naviapp.network.ApiConstants.API_SUCCESS_CODE import com.naviapp.network.ApiConstants.API_SUCCESS_CODE_201 import com.naviapp.network.ApiConstants.API_SUCCESS_CODE_204 import com.naviapp.network.ApiConstants.E_OFFER_EXPIRED -import com.naviapp.personalloanrevamp.error.activity.ErrorScreenV2Activity.Companion.LOAN_OFFER_EXPIRED -import com.naviapp.personalloanrevamp.error.activity.ErrorScreenV2Activity.Companion.SYSTEM_UNDER_MAINTENANCE +import com.naviapp.utils.Constants.LOAN_OFFER_EXPIRED +import com.naviapp.utils.Constants.SYSTEM_UNDER_MAINTENANCE import com.naviapp.utils.deleteCacheAndOpenLoginPage import com.naviapp.utils.handleError import com.naviapp.utils.isNetworkAvailable diff --git a/app/src/main/java/com/naviapp/network/retrofit/RetrofitService.kt b/app/src/main/java/com/naviapp/network/retrofit/RetrofitService.kt index 63b559c34e..95e22945fa 100644 --- a/app/src/main/java/com/naviapp/network/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/naviapp/network/retrofit/RetrofitService.kt @@ -24,8 +24,12 @@ import com.navi.common.utils.Constants.AVAILABLE_APP_VERSION_CODE import com.navi.common.utils.Constants.BOTTOM_NAV_BAR_ENDPOINT import com.navi.common.utils.Constants.HEADER_CONNECTIVITY_TYPE import com.navi.common.utils.Constants.HEADER_DEVICE_DENSITY +import com.navi.common.utils.Constants.HEADER_PERMISSION_GRANTED +import com.navi.common.utils.Constants.HEADER_INSTALLED_MODULES +import com.navi.common.utils.Constants.HEADER_PERMISSIONS import com.navi.insurance.models.request.FlagUpdateRequest import com.navi.naviwidgets.models.response.* +import com.navi.uitron.model.UiTronResponse import com.naviapp.account_aggregator.models.* import com.naviapp.crosssell.models.CrossSellResponse import com.naviapp.crosssell.models.TaxDocumentsResponse @@ -34,6 +38,7 @@ import com.naviapp.csat.models.CSATSubmitResponse import com.naviapp.dashboard.loanapplicationdetails.documentlist.models.DocumentData import com.naviapp.dashboard.loanapplicationdetails.emicalendar.models.EmiCalendarResponse import com.naviapp.dashboard.loanapplicationdetails.models.* +import com.naviapp.dashboard.menu.appsettings.model.AppSettingsResponse import com.naviapp.digitalgold.model.* import com.naviapp.home.dashboard.models.response.* import com.naviapp.home.model.BottomBarResponse @@ -81,7 +86,8 @@ interface RetrofitService { suspend fun submitOTP( @Body otpRequest: OtpRequest, @Header(HEADER_DEVICE_DENSITY) deviceDensity: String, - @Header(HEADER_CONNECTIVITY_TYPE) connectivityType: String + @Header(HEADER_CONNECTIVITY_TYPE) connectivityType: String, + @Header(HEADER_PERMISSION_GRANTED) permissionGranted: Boolean ): Response> // User data @@ -130,6 +136,12 @@ interface RetrofitService { @Path("requestId") requestId: String ): Response> + @GET("/v1/dynamic-module-settings") + suspend fun fetchAppSettings( + @Header(HEADER_PERMISSIONS) isPermissionGranted: Boolean, + @Header(HEADER_INSTALLED_MODULES) installedModules: String, + ): Response> + @GET("/requests/{requestId}") suspend fun fetchAsyncRequestDataWithAdditionalData( @Path("requestId") requestId: String @@ -648,12 +660,16 @@ interface RetrofitService { @Header(HEADER_DEVICE_DENSITY) deviceDensity: String, @Header(HEADER_CONNECTIVITY_TYPE) connectivityType: String, @Header(AVAILABLE_APP_VERSION_CODE) availableAppVersionCode: Int?, + @Header(HEADER_PERMISSIONS) isPermissionGranted: Boolean, + @Header(HEADER_INSTALLED_MODULES) installedModules: String, @Query("appVariantAvailable") appVariantAvailable: Boolean ): Response> @GET("/v2/home") suspend fun fetchHomeItems( @Header(AVAILABLE_APP_VERSION_CODE) availableAppVersionCode: Int?, + @Header(HEADER_PERMISSIONS) isPermissionGranted: Boolean, + @Header(HEADER_INSTALLED_MODULES) installedModules: String, @Query("appVariantAvailable") appVariantAvailable: Boolean ): Response> @@ -931,6 +947,9 @@ interface RetrofitService { @GET("/customer-service/customers/me/permission") suspend fun fetchPermissionDetails(): Response> + @GET("/v1/permissions") + suspend fun fetchPermissionDetailsV1(): Response> + @PATCH("/customer-service/customers/me/permission/submit") suspend fun submitPermissionDetails(): Response> @@ -1840,4 +1859,9 @@ interface RetrofitService { suspend fun fetchMandatePermissionData( @Body loginPermissionRequest: LoginPermissionRequest ): Response> + + @GET("/onboarding/promotions") + suspend fun fetchPromotionData( + @Header(HEADER_PERMISSION_GRANTED) permissionGranted: Boolean + ): Response> } diff --git a/app/src/main/java/com/naviapp/permission/activities/MandatePermissionActivity.kt b/app/src/main/java/com/naviapp/permission/activities/MandatePermissionActivity.kt index d54eddf2b9..8d03ffb30e 100644 --- a/app/src/main/java/com/naviapp/permission/activities/MandatePermissionActivity.kt +++ b/app/src/main/java/com/naviapp/permission/activities/MandatePermissionActivity.kt @@ -18,16 +18,19 @@ import android.os.Bundle import android.provider.Settings import android.text.TextUtils import android.view.View.VISIBLE +import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkManager import com.navi.base.model.* import com.navi.base.sharedpref.PreferenceManager +import com.navi.base.utils.BaseUtils import com.navi.base.utils.isNotNull import com.navi.base.utils.isNotNullAndNotEmpty import com.navi.base.utils.orFalse @@ -46,6 +49,8 @@ import com.navi.naviwidgets.extensions.showWhenDataIsAvailable import com.navi.naviwidgets.models.ActionButtonWidget import com.navi.naviwidgets.models.NaviWidget import com.navi.naviwidgets.models.StepsWidget +import com.navi.naviwidgets.models.WidgetChangedData +import com.navi.naviwidgets.utils.WIDGET_STATE_CHANGE import com.navi.naviwidgets.viewholder.ViewHolderFactoryImpl import com.naviapp.BuildConfig import com.naviapp.R @@ -84,6 +89,10 @@ class MandatePermissionActivity : BaseActivity(), WidgetCallback { screenName ) private var isNormalFlow: Boolean = false + private val resultPermissionSettings = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + updateWidgetState() + } override fun onCreate(savedInstanceState: Bundle?) { @@ -100,23 +109,9 @@ class MandatePermissionActivity : BaseActivity(), WidgetCallback { ) initUI() initObserver() - loginPermissionVM.setFirstTimeUser(true) fetchPermissionScreenData() } - override fun onResume() { - super.onResume() - if (loginPermissionVM.getUpdateScreen()) { - updateWidgetState() - loginPermissionVM.setUpdateScreen(false) - } - } - - override fun onPause() { - super.onPause() - loginPermissionVM.setUpdateScreen(true) - } - private fun readArguments() { intent.extras?.keySet()?.forEach { key -> parameters.add(LineItem(key = key, value = intent.extras?.get(key).toString())) @@ -146,12 +141,16 @@ class MandatePermissionActivity : BaseActivity(), WidgetCallback { response.header?.let { setUpHeader(it) } + response.extraData?.modulesToInstall?.let { + if (it.isNotEmpty()) { installDynamicModules(it) } + } hideLoader() response.contentWidget?.let { contentWidgets -> naviContentWidgets.setData(contentWidgets) setPermissionList(contentWidgets) - updateWidgetState() - loginPermissionVM.setFirstTimeUser(false) + if (BaseUtils.isUserLoggedIn() && isNormalFlow) { + updateWidgetState() + } } response.footerWidget?.let { footerWidgets -> naviFooterWidgets.setData(footerWidgets) @@ -291,6 +290,8 @@ class MandatePermissionActivity : BaseActivity(), WidgetCallback { } } + override fun getLifeCycle(): Lifecycle = lifecycle + override fun onRequestPermissionsResult( requestCode: Int, permissions: Array, grantResults: IntArray ) { @@ -307,42 +308,6 @@ class MandatePermissionActivity : BaseActivity(), WidgetCallback { @SuppressLint("NotifyDataSetChanged") private fun updatePermissionsStateAndData() { - - if (loginPermissionVM.getFirstTimeUser()) { - var enabledPermissionCheck = false - loginPermissionVM.permissionScreenLiveData.value?.contentWidget?.forEachIndexed { _, widget -> - if (widget is StepsWidget) { - loginPermissionVM.getListOfPermissionsAndTypes().forEach { - if (widget.widgetData?.extraData?.permissionType == it.key) { - if (it.key == PermissionEnum.LOCATION.name && - loginPermissionVM.permissionScreenLiveData.value?.extraData?.fineLocation == true - ) { - enabledPermissionCheck = enabledPermissionCheck or - (ActivityCompat.checkSelfPermission( - this@MandatePermissionActivity, - it.value - ) == PERMISSION_GRANTED) and - (ActivityCompat.checkSelfPermission( - this@MandatePermissionActivity, - Manifest.permission.ACCESS_FINE_LOCATION - ) == PERMISSION_GRANTED) - } else { - enabledPermissionCheck = enabledPermissionCheck or - (ActivityCompat.checkSelfPermission( - this@MandatePermissionActivity, - it.value - ) == PERMISSION_GRANTED) - } - } - } - } - } - - if (enabledPermissionCheck.not()) { - return - } - } - loginPermissionVM.permissionScreenLiveData.value?.contentWidget?.forEachIndexed { _, widget -> if (widget is StepsWidget) { loginPermissionVM.getListOfPermissionsAndTypes().forEach { @@ -383,9 +348,7 @@ class MandatePermissionActivity : BaseActivity(), WidgetCallback { sendAnalytics() if (permissionsManager.hasPermissions(loginPermissionVM.getListOfPermissionsAndTypes().values.toTypedArray())) { loginPermissionVM.setHardDenyPermissionClicked(false) - if (loginPermissionVM.getFirstTimeUser().not()) { - onGrantPermissions() - } + onGrantPermissions() } } } @@ -419,6 +382,15 @@ class MandatePermissionActivity : BaseActivity(), WidgetCallback { naviContentWidgets.setData(listOfWidgets) } } + response.footerWidget?.forEachIndexed { index, naviWidget -> + if (naviWidget is ActionButtonWidget) { + naviWidget.widgetData?.updateTitle = getString(R.string.go_to_settings_text) + naviFooterWidgets.notifyItemChanged( + index, WidgetChangedData(WIDGET_STATE_CHANGE, naviWidget) + ) + return@forEachIndexed + } + } } } } @@ -583,7 +555,7 @@ class MandatePermissionActivity : BaseActivity(), WidgetCallback { Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse(Constants.PACKAGE.plus(BuildConfig.APPLICATION_ID)) ) - startActivity(intent) + resultPermissionSettings.launch(intent) } @Deprecated("Deprecated in Java") @@ -591,12 +563,13 @@ class MandatePermissionActivity : BaseActivity(), WidgetCallback { when (requestCode) { NaviLocationManager.REQUEST_LOCATION_SETTINGS -> { if (resultCode == RESULT_OK) { - onGrantPermissions() + showLoader() + sendLocation() OK } else { + hideLoader() NO } - hideLoader() } } super.onActivityResult(requestCode, resultCode, data) diff --git a/app/src/main/java/com/naviapp/permission/models/LoginPermissionResponse.kt b/app/src/main/java/com/naviapp/permission/models/LoginPermissionResponse.kt index fa6c78dcee..7d52c41ad5 100644 --- a/app/src/main/java/com/naviapp/permission/models/LoginPermissionResponse.kt +++ b/app/src/main/java/com/naviapp/permission/models/LoginPermissionResponse.kt @@ -32,7 +32,9 @@ data class LoginPermissionExtraData( @SerializedName("fineLocation") val fineLocation: Boolean? = null, @SerializedName("mandatoryPermission") - val mandatoryPermission: Boolean? = null + val mandatoryPermission: Boolean? = null, + @SerializedName("modulesToInstall") + val modulesToInstall: List? = null ) data class LoginPermissionHeader( diff --git a/app/src/main/java/com/naviapp/permission/repository/PermissionRepository.kt b/app/src/main/java/com/naviapp/permission/repository/PermissionRepository.kt index 79178ce8c9..2d1da68d86 100644 --- a/app/src/main/java/com/naviapp/permission/repository/PermissionRepository.kt +++ b/app/src/main/java/com/naviapp/permission/repository/PermissionRepository.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2019 by Navi Technologies Private Limited + * * Copyright © 2019-2023 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -9,6 +9,7 @@ package com.naviapp.permission.repository import com.naviapp.network.retrofit.ResponseCallback import com.naviapp.utils.retrofitService +import com.naviapp.utils.superAppRetrofitService class PermissionRepository : ResponseCallback() { suspend fun fetchPermissionDetails() = @@ -17,15 +18,12 @@ class PermissionRepository : ResponseCallback() { suspend fun submitPermissionDetails() = apiResponseCallback(retrofitService().submitPermissionDetails()) + suspend fun fetchPermissionDetailsV1() = + apiResponseCallback(superAppRetrofitService().fetchPermissionDetailsV1()) suspend fun fetchAsyncRequestData(requestId: String) = apiResponseCallback(retrofitService().fetchAsyncRequestData(requestId)) - /*suspend fun fetchPermissionDetails(): RepoResult { - val type = object : TypeToken() {}.type - return mockApiResponse(type, "permissionDetailsResponse") - }*/ suspend fun fetchPanVerification() = apiResponseCallback(retrofitService().fetchPanVerification()) - -} \ No newline at end of file +} diff --git a/app/src/main/java/com/naviapp/permission/utils/PermissionUtil.kt b/app/src/main/java/com/naviapp/permission/utils/PermissionUtil.kt index b19e58000c..2891406f79 100644 --- a/app/src/main/java/com/naviapp/permission/utils/PermissionUtil.kt +++ b/app/src/main/java/com/naviapp/permission/utils/PermissionUtil.kt @@ -119,7 +119,7 @@ fun getAlternatePermissionTilesV2(): List { null ), application.getString(R.string.sms), - application.getString(R.string.sms_permission), + application.getString(R.string.home_sms_permission), listOf(Manifest.permission.READ_SMS), iconCode = IconUtils.ICON_MESSAGE_PERMISSION ), @@ -130,7 +130,7 @@ fun getAlternatePermissionTilesV2(): List { null ), application.getString(R.string.contacts), - application.getString(R.string.contacts_permission), + application.getString(R.string.home_contacts_permission), listOf(Manifest.permission.READ_CONTACTS), iconCode = IconUtils.ICON_CONTACTS_PERMISSION ), @@ -141,7 +141,7 @@ fun getAlternatePermissionTilesV2(): List { null ), application.getString(R.string.location), - application.getString(R.string.location_permission), + application.getString(R.string.home_location_permission), listOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION @@ -151,7 +151,7 @@ fun getAlternatePermissionTilesV2(): List { PermissionTile( ResourcesCompat.getDrawable(application.resources, R.drawable.ic_phone, null), application.getString(R.string.device), - application.getString(R.string.device_permission), + application.getString(R.string.home_device_permission), iconCode = IconUtils.ICON_DEVICE_PERMISSION ) ) diff --git a/app/src/main/java/com/naviapp/permission/viewmodel/LoginPermissionVM.kt b/app/src/main/java/com/naviapp/permission/viewmodel/LoginPermissionVM.kt index bb7933cce3..9b67fc4da3 100644 --- a/app/src/main/java/com/naviapp/permission/viewmodel/LoginPermissionVM.kt +++ b/app/src/main/java/com/naviapp/permission/viewmodel/LoginPermissionVM.kt @@ -48,8 +48,6 @@ class LoginPermissionVM @Inject constructor( private var hardDenyPermissionClicked = false private var nextCta: ActionData? = null private var isExtraWidgetsShown: Boolean = false - private var updateScreen: Boolean = false - private var firstTimeUser: Boolean = false fun fetchPermissionData(loginPermissionRequest: LoginPermissionRequest) { viewModelScope.launch { @@ -109,16 +107,4 @@ class LoginPermissionVM @Inject constructor( } fun getIsExtraWidgetShown() = isExtraWidgetsShown - - fun setUpdateScreen(value: Boolean) { - this.updateScreen = value - } - - fun getUpdateScreen() = updateScreen - - fun setFirstTimeUser(value: Boolean) { - this.firstTimeUser = value - } - - fun getFirstTimeUser() = firstTimeUser } \ No newline at end of file diff --git a/app/src/main/java/com/naviapp/permission/viewmodel/PermissionViewModel.kt b/app/src/main/java/com/naviapp/permission/viewmodel/PermissionViewModel.kt index a9e8615580..dc43c28939 100644 --- a/app/src/main/java/com/naviapp/permission/viewmodel/PermissionViewModel.kt +++ b/app/src/main/java/com/naviapp/permission/viewmodel/PermissionViewModel.kt @@ -71,6 +71,23 @@ class PermissionViewModel(private val permissionRepository: PermissionRepository } } + fun fetchPermissionDetailsV1() { + viewModelScope.launch { + val response = permissionRepository.fetchPermissionDetailsV1() + if (response.error == null && response.errors?.isEmpty().orTrue()) { + _permissionDetailsResponse.value = response.data + } else { + setErrorData( + response.errors, response.error, + errorMetaData = ErrorMetaData( + flowName = FLOW_PERMISSION, + methodName = ::fetchPermissionDetailsV1.name + ) + ) + } + } + } + fun submitPermissionDetails() { analyticsTracker.postPermissionStartTime() viewModelScope.launch { diff --git a/app/src/main/java/com/naviapp/personalloan/di/PersonalLoanModule.kt b/app/src/main/java/com/naviapp/personalloan/di/PersonalLoanModule.kt index 3815059f9f..6701a2a7f7 100644 --- a/app/src/main/java/com/naviapp/personalloan/di/PersonalLoanModule.kt +++ b/app/src/main/java/com/naviapp/personalloan/di/PersonalLoanModule.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2019 by Navi Technologies Private Limited + * * Copyright © 2019-2023 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -12,8 +12,6 @@ import com.naviapp.email.repo.EmailRepository import com.naviapp.network.di.SuperAppRetroFit import com.naviapp.network.retrofit.RetrofitService import com.naviapp.personalloan.getloan.kyc.repositories.KycPhysicalAddressVerificationRepository -import com.naviapp.personalloanrevamp.getloanRevamp.repository.LoanDetailsV2Repository -import com.naviapp.personalloanrevamp.useridentificationv2.repository.PersonalLoanTrackerRepository import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -38,14 +36,4 @@ class PersonalLoanModule { @Provides fun providesEmailRepository(@SuperAppRetroFit retrofitService: RetrofitService) = EmailRepository(retrofitService) - - @ViewModelScoped - @Provides - fun providesLoanDetailsV2Repository(@SuperAppRetroFit retrofitService: RetrofitService) = - LoanDetailsV2Repository(retrofitService) - - @ViewModelScoped - @Provides - fun providesPersonalLoanTrackerRepository(@SuperAppRetroFit retrofitService: RetrofitService) = - PersonalLoanTrackerRepository(retrofitService) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/naviapp/personalloan/getloan/activities/BankAccountVerificationLoaderActivity.kt b/app/src/main/java/com/naviapp/personalloan/getloan/activities/BankAccountVerificationLoaderActivity.kt index 80c9a0f9ec..f756491ed1 100644 --- a/app/src/main/java/com/naviapp/personalloan/getloan/activities/BankAccountVerificationLoaderActivity.kt +++ b/app/src/main/java/com/naviapp/personalloan/getloan/activities/BankAccountVerificationLoaderActivity.kt @@ -46,8 +46,10 @@ import com.naviapp.models.response.PennyDropBankData import com.naviapp.personalloan.getloan.bankdetails.fragments.BankDetailsFragment.Companion.PENNY_DROP_BANK_DATA import com.naviapp.personalloan.getloan.bankdetails.models.BankLoanStatusType import com.naviapp.personalloan.getloan.bankdetails.viewmodels.BankDetailsVM -import com.naviapp.personalloanrevamp.error.activity.ErrorScreenV2Activity import com.naviapp.utils.Constants +import com.naviapp.utils.Constants.ERROR_DATA +import com.naviapp.utils.Constants.REDIRECT_DATA +import com.naviapp.utils.Constants.REJECTION_DATA import com.naviapp.utils.LOAN_APPLICATION_ID import dagger.hilt.android.AndroidEntryPoint @@ -71,8 +73,8 @@ class BankAccountVerificationLoaderActivity : hideLoader() if ((it.first?.softReject == true)) { val data = Bundle() - data.putParcelable(ErrorScreenV2Activity.REDIRECT_DATA, it.first) - data.putParcelable(ErrorScreenV2Activity.ERROR_DATA, it.second) + data.putParcelable(REDIRECT_DATA, it.first) + data.putParcelable(ERROR_DATA, it.second) data.putString(Constants.WIDGET_ID, Constants.PERSONAL_LOAN) ScreenNavigator.instance.startActivityWithNoActivityStack( this, @@ -85,7 +87,7 @@ class BankAccountVerificationLoaderActivity : hideLoader() if (rejectionDetailsResponse.hasRejection.orFalse()) { val data = Bundle() - data.putParcelable(ErrorScreenV2Activity.REJECTION_DATA, rejectionDetailsResponse) + data.putParcelable(REJECTION_DATA, rejectionDetailsResponse) data.putBoolean( GetLoanActivity.IS_FOR_SECOND_LOAN_JOURNEY, intent.getBooleanExtra(GetLoanActivity.IS_FOR_SECOND_LOAN_JOURNEY, false) diff --git a/app/src/main/java/com/naviapp/personalloan/getloan/activities/GetLoanActivity.kt b/app/src/main/java/com/naviapp/personalloan/getloan/activities/GetLoanActivity.kt index 8f314add2c..ecf2196a3d 100644 --- a/app/src/main/java/com/naviapp/personalloan/getloan/activities/GetLoanActivity.kt +++ b/app/src/main/java/com/naviapp/personalloan/getloan/activities/GetLoanActivity.kt @@ -30,7 +30,6 @@ import com.navi.common.paymenthandler.factories.PaymentProviderFactory import com.navi.common.ui.activity.BaseActivity import com.navi.common.ui.fragment.BaseFragment import com.navi.common.utils.log -import com.navi.common.utils.observeNonNull import com.navi.payment.razorpay.RazorpayHelper import com.navi.payment.utils.ProviderType import com.navi.payment.utils.ProviderType.DIGIO @@ -65,12 +64,6 @@ import com.naviapp.personalloan.getloan.kyc.models.AadhaarVerificationData import com.naviapp.personalloan.getloan.kyc.viewmodels.KycSharedVM import com.naviapp.personalloan.getloan.loandetails.viewmodels.LoanDetailsAndEmiSharedVM import com.naviapp.personalloanrevamp.getloanRevamp.fragments.BankDetailsV2Fragment.Companion.DISBURSEMENT_DETAILS -import com.naviapp.personalloanrevamp.kyc.fragment.KycV2Fragment.Companion.AADHAR_OTP_REQUEST_CODE -import com.naviapp.personalloanrevamp.kyc.fragment.KycV2Fragment.Companion.PAN_CAMERA_REQUEST_CODE -import com.naviapp.personalloanrevamp.kyc.fragment.KycV2Fragment.Companion.SELFIE_REQUEST_CODE -import com.naviapp.personalloanrevamp.kyc.fragment.KycV2Fragment.Companion.UPLOAD_AADHAR_REQUEST_CODE -import com.naviapp.personalloanrevamp.kyc.fragment.KycV2Fragment.Companion.VIDEO_KYC_REQUEST_CODE -import com.naviapp.personalloanrevamp.useridentificationv2.activities.LoanEligibilityLoaderV2Activity.Companion.OFFER import com.naviapp.registration.viewmodel.ConfigVM import com.naviapp.selfiecapture.SelfieErrorData import com.naviapp.selfiecapture.SelfieVerificationHelper @@ -563,6 +556,12 @@ class GetLoanActivity : const val MFI_CONSENT_SCREEN = "MFI_CONSENT" const val EMI_SELECTOR_SCREEN = "EMI_SELECTOR" const val EFFECTIVE_INTEREST_COST_SCREEN = "EFFECTIVE_INTEREST_COST" + const val SELFIE_REQUEST_CODE = 100 + const val PAN_CAMERA_REQUEST_CODE = 101 + const val UPLOAD_AADHAR_REQUEST_CODE = 102 + const val VIDEO_KYC_REQUEST_CODE = 103 + const val AADHAR_OTP_REQUEST_CODE = 104 + const val OFFER = "QUOTE" } override fun updateHeader( diff --git a/app/src/main/java/com/naviapp/personalloan/getloan/addressverification/viewmodels/AddressVerificationVM.kt b/app/src/main/java/com/naviapp/personalloan/getloan/addressverification/viewmodels/AddressVerificationVM.kt index f0a2789ce7..d7a2af0fb0 100644 --- a/app/src/main/java/com/naviapp/personalloan/getloan/addressverification/viewmodels/AddressVerificationVM.kt +++ b/app/src/main/java/com/naviapp/personalloan/getloan/addressverification/viewmodels/AddressVerificationVM.kt @@ -16,20 +16,23 @@ import com.navi.common.network.models.ErrorMetaData import com.navi.common.network.models.GenericErrorResponse import com.navi.common.utils.isValidResponse import com.navi.common.viewmodel.BaseVM +import com.navi.naviwidgets.models.response.Action +import com.naviapp.R +import com.naviapp.app.NaviApplication import com.naviapp.models.RedirectPageStatus import com.naviapp.models.request.Address +import com.naviapp.models.request.AddressType import com.naviapp.models.request.KycRequest import com.naviapp.models.request.SaveCorrespondenceAddressRequest import com.naviapp.models.response.* import com.naviapp.network.ApiErrorTagType import com.naviapp.personalloan.getloan.kyc.models.KycInReviewResponse import com.naviapp.personalloan.getloan.kyc.repositories.KycRepository -import com.naviapp.personalloanrevamp.addressverificationrevamp.fragment.KycAddressProofV2Fragment -import com.naviapp.personalloanrevamp.addressverificationrevamp.helper.AddressHelper.getUploadDocumentErrorData -import com.naviapp.personalloanrevamp.kyc.fragment.KycV2Fragment import com.naviapp.personalloanrevamp.models.DocumentUploadViewData import com.naviapp.personalloanrevamp.models.FLOW_KYC_VERIFICATION import com.naviapp.personalloanrevamp.models.PROP_ERROR_TAG +import com.naviapp.utils.Constants.COMPLETED +import com.naviapp.utils.Constants.NO_ADDRESS_SELECTED_BOTTOM_SHEET import kotlinx.coroutines.launch class AddressVerificationVM(private val repository: KycRepository = KycRepository()) : BaseVM() { @@ -171,7 +174,7 @@ class AddressVerificationVM(private val repository: KycRepository = KycRepositor currentAddressIndex == -2 -> { if (uploadedDocumentTypeAndUrl.value != null) { CurrentAddress( - status = KycV2Fragment.COMPLETED, + status = COMPLETED, documentType = uploadedDocumentTypeAndUrl.value?.first, documentUrl = uploadedDocumentTypeAndUrl.value?.second, city = addressProofLiveData.value?.content?.city, @@ -214,7 +217,7 @@ class AddressVerificationVM(private val repository: KycRepository = KycRepositor pinCode = currentAddress?.pinCode, documentType = currentAddress?.documentType, documentTempUrl = currentAddress?.documentUrl, - type = KycAddressProofV2Fragment.CORRESPONDENCE, + type = AddressType.CORRESPONDENCE.name, current = true ) updateKycDetails(KycRequest(address)) @@ -360,4 +363,16 @@ class AddressVerificationVM(private val repository: KycRepository = KycRepositor } } } + + private fun getUploadDocumentErrorData(): GenericErrorResponse { + val context = NaviApplication.instance + return GenericErrorResponse( + listOf(Action(context.getString(R.string.upload_proof))), + null, + context.getString(R.string.upload_document_error_description), + context.getString(R.string.document_not_uploaded), + null, + NO_ADDRESS_SELECTED_BOTTOM_SHEET + ) + } } diff --git a/app/src/main/java/com/naviapp/personalloan/getloan/bankdetails/fragments/accountaggregator/AccountAggregatorFragment.kt b/app/src/main/java/com/naviapp/personalloan/getloan/bankdetails/fragments/accountaggregator/AccountAggregatorFragment.kt index 6ce7c9720f..469a7502cd 100644 --- a/app/src/main/java/com/naviapp/personalloan/getloan/bankdetails/fragments/accountaggregator/AccountAggregatorFragment.kt +++ b/app/src/main/java/com/naviapp/personalloan/getloan/bankdetails/fragments/accountaggregator/AccountAggregatorFragment.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2019-2022 by Navi Technologies Limited + * * Copyright © 2019-2023 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -58,18 +58,18 @@ import com.naviapp.personalloan.getloan.activities.GetLoanActivity import com.naviapp.personalloan.getloan.bankdetails.adapters.AggregatorCheckBoxAdapter import com.naviapp.personalloan.getloan.bankdetails.adapters.AggregatorFipAdapter import com.naviapp.personalloan.getloan.bankdetails.viewmodels.AggregatorSharedVM -import com.naviapp.personalloanrevamp.error.activity.ErrorScreenV2Activity -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper -import com.naviapp.personalloanrevamp.intermediatev2.fragments.BankStatementV2Fragment -import com.naviapp.personalloanrevamp.intermediatev2.helper.IntermediateV2Helper import com.naviapp.utils.* import com.naviapp.utils.Constants import com.naviapp.utils.Constants.BACK_ACTION import com.naviapp.utils.Constants.BANK_OPTION_FLOW_TYPE +import com.naviapp.utils.Constants.BANK_STATEMENT_V2 +import com.naviapp.utils.Constants.BANK_STATEMENT_VERIFICATION_V2 import com.naviapp.utils.Constants.CONSENT_INITIATOR_PL import com.naviapp.utils.Constants.DIVIDER import com.naviapp.utils.Constants.FLOW_TYPE import com.naviapp.utils.Constants.IS_REVAMP_FLOW +import com.naviapp.utils.Constants.IS_SOFT_REJECT +import com.naviapp.utils.Constants.LOAN_OFFER_UPGRADE_V2 import com.naviapp.utils.EMPTY import com.onemoney.custom.Onemoney import com.onemoney.custom.OnemoneyError @@ -164,7 +164,7 @@ class AccountAggregatorFragment : if (arguments?.getBoolean(IS_REVAMP_FLOW, false) == true) { nextCta = INTERMEDIATE_V2.plus(DIVIDER) - .plus(IntermediateV2Helper.BANK_STATEMENT_VERIFICATION_V2) + .plus(BANK_STATEMENT_VERIFICATION_V2) } val commonBottomSheet = CommonBottomSheet.newInstance( @@ -556,11 +556,11 @@ class AccountAggregatorFragment : GetLoanActivity.LOAN_OFFER_UPGRADE_SCREEN ) if ( - arguments?.getString(FLOW_TYPE) == BankStatementV2Fragment.BANK_STATEMENT_V2 + arguments?.getString(FLOW_TYPE) == BANK_STATEMENT_V2 ) { nextCtaUrl = LOAN_APPLICATION_V2.plus(DIVIDER) - .plus(GetLoanV2ViewHelper.LOAN_OFFER_UPGRADE_V2) + .plus(LOAN_OFFER_UPGRADE_V2) } NaviDeepLinkNavigator.navigate( activity = activity, @@ -572,12 +572,12 @@ class AccountAggregatorFragment : AggregatorSharedVM.ErrorType.BANK_STATEMENT_SOFT_REJECT.name -> { var nextCtaUrl = NaviDeepLinkNavigator.ERROR if ( - arguments?.getString(FLOW_TYPE) == BankStatementV2Fragment.BANK_STATEMENT_V2 + arguments?.getString(FLOW_TYPE) == BANK_STATEMENT_V2 ) { nextCtaUrl = NaviDeepLinkNavigator.ERROR_V2 } val data = Bundle() - data.putString(ErrorScreenV2Activity.IS_SOFT_REJECT, Constants.TRUE) + data.putString(IS_SOFT_REJECT, Constants.TRUE) NaviDeepLinkNavigator.navigate( activity = activity, ctaData = CtaData(url = nextCtaUrl), @@ -956,7 +956,7 @@ class AccountAggregatorFragment : override fun onFooterBackPress(ctaData: CtaData?) { // To do check the back handling - if (arguments?.getString(FLOW_TYPE) == BankStatementV2Fragment.BANK_STATEMENT_V2) { + if (arguments?.getString(FLOW_TYPE) == BANK_STATEMENT_V2) { moveToBankStatementVerification() } else { fragmentInterchangeListener?.navigateToNextScreen(BANK_STATEMENT_VERIFICATION, Bundle()) @@ -968,7 +968,7 @@ class AccountAggregatorFragment : isOnConsentScreen = false showLinkingScreen() } else { - if (arguments?.getString(FLOW_TYPE) == BankStatementV2Fragment.BANK_STATEMENT_V2) { + if (arguments?.getString(FLOW_TYPE) == BANK_STATEMENT_V2) { moveToBankStatementVerification() } else { fragmentInterchangeListener?.navigateToNextScreen( @@ -991,7 +991,7 @@ class AccountAggregatorFragment : url = INTERMEDIATE_V2.appendStrings( FORWARD_SLASH.toString(), - IntermediateV2Helper.BANK_STATEMENT_VERIFICATION_V2 + BANK_STATEMENT_VERIFICATION_V2 ) ), bundle = bundle, diff --git a/app/src/main/java/com/naviapp/personalloan/getloan/bankdetails/repositories/BankDetailsRepository.kt b/app/src/main/java/com/naviapp/personalloan/getloan/bankdetails/repositories/BankDetailsRepository.kt index d324b3a6c4..66f49a4410 100644 --- a/app/src/main/java/com/naviapp/personalloan/getloan/bankdetails/repositories/BankDetailsRepository.kt +++ b/app/src/main/java/com/naviapp/personalloan/getloan/bankdetails/repositories/BankDetailsRepository.kt @@ -13,9 +13,8 @@ import com.naviapp.models.response.BankDetailsPostKyc import com.naviapp.models.response.SelectBankPageResponse import com.naviapp.network.retrofit.ResponseCallback import com.naviapp.utils.retrofitService -import javax.inject.Inject -class BankDetailsRepository @Inject constructor() : ResponseCallback() { +class BankDetailsRepository : ResponseCallback() { suspend fun submitBankDetails( bankDetail: BankDetail, loanApplicationId: String, diff --git a/app/src/main/java/com/naviapp/personalloan/getloan/bankdetails/viewmodels/BankDetailsVM.kt b/app/src/main/java/com/naviapp/personalloan/getloan/bankdetails/viewmodels/BankDetailsVM.kt index 51eecdd261..f3ddc3d66b 100644 --- a/app/src/main/java/com/naviapp/personalloan/getloan/bankdetails/viewmodels/BankDetailsVM.kt +++ b/app/src/main/java/com/naviapp/personalloan/getloan/bankdetails/viewmodels/BankDetailsVM.kt @@ -30,13 +30,11 @@ import com.naviapp.personalloanrevamp.models.FLOW_BANK_VERIFICATION import com.naviapp.personalloanrevamp.models.PROP_REQUEST_ID import com.naviapp.utils.LOAN_APPLICATION_ID import com.naviapp.utils.isNetworkAvailable -import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch -import javax.inject.Inject -@HiltViewModel -class BankDetailsVM @Inject constructor(private val repository: BankDetailsRepository) : - BaseVM() { +class BankDetailsVM( + private val repository: BankDetailsRepository = BankDetailsRepository() +) : BaseVM() { private val _bankDetailAdd = MutableLiveData>() diff --git a/app/src/main/java/com/naviapp/personalloan/getloan/bankdetails/viewmodels/SelectBankVM.kt b/app/src/main/java/com/naviapp/personalloan/getloan/bankdetails/viewmodels/SelectBankVM.kt index 4108325eb0..d0db59fa1d 100644 --- a/app/src/main/java/com/naviapp/personalloan/getloan/bankdetails/viewmodels/SelectBankVM.kt +++ b/app/src/main/java/com/naviapp/personalloan/getloan/bankdetails/viewmodels/SelectBankVM.kt @@ -8,14 +8,13 @@ import com.naviapp.models.response.SelectBankPageResponse import com.naviapp.network.ApiErrorTagType import com.naviapp.personalloan.getloan.bankdetails.repositories.BankDetailsRepository import com.naviapp.personalloanrevamp.models.FLOW_BANK_STATEMENT_VERIFICATION -import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -import javax.inject.Inject -@HiltViewModel -class SelectBankVM @Inject constructor(private val repository: BankDetailsRepository): BaseVM() { +class SelectBankVM( + private val repository: BankDetailsRepository = BankDetailsRepository() +): BaseVM() { private val _selectBankPageResponse = MutableStateFlow>(GenericResponseState.Init()) val selectBankPageResponse = _selectBankPageResponse.asStateFlow() diff --git a/app/src/main/java/com/naviapp/personalloan/getloan/kyc/viewmodels/KycVM.kt b/app/src/main/java/com/naviapp/personalloan/getloan/kyc/viewmodels/KycVM.kt index 7147d2b023..abee1ecf08 100644 --- a/app/src/main/java/com/naviapp/personalloan/getloan/kyc/viewmodels/KycVM.kt +++ b/app/src/main/java/com/naviapp/personalloan/getloan/kyc/viewmodels/KycVM.kt @@ -36,12 +36,12 @@ import com.naviapp.network.ApiConstants import com.naviapp.network.ApiErrorTagType import com.naviapp.personalloan.getloan.common.view.KycPanView import com.naviapp.personalloan.getloan.common.view.StatusIndicatorView +import com.naviapp.personalloan.getloan.kyc.adapter.KycItemType import com.naviapp.personalloan.getloan.kyc.adapter.KycItemsAdapter import com.naviapp.personalloan.getloan.kyc.models.AadhaarDetailsResponse import com.naviapp.personalloan.getloan.kyc.models.AadhaarVerificationData import com.naviapp.personalloan.getloan.kyc.models.KycInReviewResponse import com.naviapp.personalloan.getloan.kyc.repositories.KycRepository -import com.naviapp.personalloanrevamp.kyc.fragment.KycV2Fragment import com.naviapp.personalloanrevamp.models.* import com.naviapp.utils.* import kotlinx.coroutines.launch @@ -574,7 +574,7 @@ class KycVM(private val repository: KycRepository = KycRepository()) : BaseVM() fun getJsonKey(): String { if (isTextFieldPresent()) { _kycDetails.value?.kycDetails?.kycItemList?.forEach { kycItem -> - if (kycItem.type == KycV2Fragment.TEXTFIELD) { + if (kycItem.type == KycItemType.TEXTFIELD.name) { return kycItem.jsonKey.toString() } } @@ -585,12 +585,12 @@ class KycVM(private val repository: KycRepository = KycRepository()) : BaseVM() fun isCurrentAddressFieldPresent(): Boolean { var isCurrentAddressFieldPresent = false _kycDetails.value?.kycDetails?.kycItemList?.forEach { kycItem -> - if (kycItem.type == KycV2Fragment.CURRENT_ADDRESS) { + if (kycItem.type == KycItemType.CURRENT_ADDRESS.name) { isCurrentAddressFieldPresent = true } } _kycDetailsV2.value?.kycDetails?.kycItemList?.forEach { kycItem -> - if (kycItem.kycType == KycV2Fragment.CURRENT_ADDRESS) { + if (kycItem.kycType == KycItemType.CURRENT_ADDRESS.name) { isCurrentAddressFieldPresent = true } } @@ -600,7 +600,7 @@ class KycVM(private val repository: KycRepository = KycRepository()) : BaseVM() fun isTextFieldPresent(): Boolean { var isTextFieldPresent = false _kycDetails.value?.kycDetails?.kycItemList?.forEach { kycItem -> - if (kycItem.type == KycV2Fragment.TEXTFIELD) { + if (kycItem.type == KycItemType.TEXTFIELD.name) { isTextFieldPresent = true } } diff --git a/app/src/main/java/com/naviapp/personalloan/getloan/loandetails/repositories/EmiSelectorRepository.kt b/app/src/main/java/com/naviapp/personalloan/getloan/loandetails/repositories/EmiSelectorRepository.kt index d7b20da5f5..fed81d4f0b 100644 --- a/app/src/main/java/com/naviapp/personalloan/getloan/loandetails/repositories/EmiSelectorRepository.kt +++ b/app/src/main/java/com/naviapp/personalloan/getloan/loandetails/repositories/EmiSelectorRepository.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2022 by Navi Technologies Private Limited + * * Copyright © 2022-2023 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -9,16 +9,13 @@ package com.naviapp.personalloan.getloan.loandetails.repositories import com.naviapp.models.request.LoanFeeDetailsRequest import com.naviapp.network.retrofit.ResponseCallback -import com.naviapp.network.retrofit.RetrofitService -import javax.inject.Inject +import com.naviapp.utils.retrofitService -class EmiSelectorRepository @Inject constructor( - private val retrofitService: RetrofitService -) : ResponseCallback() { +class EmiSelectorRepository : ResponseCallback() { suspend fun fetchOptionalEmiDates() = - apiResponseCallback(retrofitService.fetchOptionalEmiDates()) + apiResponseCallback(retrofitService().fetchOptionalEmiDates()) suspend fun fetchUpcomingEmiDates(loanFeeDetailsRequest: LoanFeeDetailsRequest) = - apiResponseCallback(retrofitService.fetchUpcomingEmiDates(loanFeeDetailsRequest)) -} \ No newline at end of file + apiResponseCallback(retrofitService().fetchUpcomingEmiDates(loanFeeDetailsRequest)) +} diff --git a/app/src/main/java/com/naviapp/personalloan/getloan/loandetails/viewmodels/EmiSelectorVM.kt b/app/src/main/java/com/naviapp/personalloan/getloan/loandetails/viewmodels/EmiSelectorVM.kt index e403fde95e..43ba226429 100644 --- a/app/src/main/java/com/naviapp/personalloan/getloan/loandetails/viewmodels/EmiSelectorVM.kt +++ b/app/src/main/java/com/naviapp/personalloan/getloan/loandetails/viewmodels/EmiSelectorVM.kt @@ -17,13 +17,10 @@ import com.naviapp.models.response.EmiCalendarDataResponse import com.naviapp.models.response.UpcomingEmiDatesResponse import com.naviapp.personalloan.getloan.loandetails.repositories.EmiSelectorRepository import com.naviapp.personalloanrevamp.models.FLOW_EMI_SELECTION -import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch -import javax.inject.Inject -@HiltViewModel -class EmiSelectorVM @Inject constructor( - private val repository: EmiSelectorRepository +class EmiSelectorVM( + private val repository: EmiSelectorRepository = EmiSelectorRepository() ) : BaseVM() { private val _emiOptionalDateInfo = MutableLiveData() diff --git a/app/src/main/java/com/naviapp/personalloan/getloan/loandetails/viewmodels/GstDetailsVM.kt b/app/src/main/java/com/naviapp/personalloan/getloan/loandetails/viewmodels/GstDetailsVM.kt index 1e56076317..410505c600 100644 --- a/app/src/main/java/com/naviapp/personalloan/getloan/loandetails/viewmodels/GstDetailsVM.kt +++ b/app/src/main/java/com/naviapp/personalloan/getloan/loandetails/viewmodels/GstDetailsVM.kt @@ -25,12 +25,11 @@ import com.naviapp.personalloan.getloan.loandetails.states.GstVerificationState import com.naviapp.personalloan.getloan.repositories.GstDetailsRepository import com.naviapp.personalloanrevamp.models.FLOW_GST import com.naviapp.personalloanrevamp.models.PROP_CODE -import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch -import javax.inject.Inject -@HiltViewModel -class GstDetailsVM @Inject constructor(val repository: GstDetailsRepository) : BaseVM() { +class GstDetailsVM( + val repository: GstDetailsRepository = GstDetailsRepository() +) : BaseVM() { private val _gstDetailsResponse = MutableLiveData() val gstDetailsResponse: LiveData diff --git a/app/src/main/java/com/naviapp/personalloan/getloan/repositories/GstDetailsRepository.kt b/app/src/main/java/com/naviapp/personalloan/getloan/repositories/GstDetailsRepository.kt index 39077da922..762ed2dcf9 100644 --- a/app/src/main/java/com/naviapp/personalloan/getloan/repositories/GstDetailsRepository.kt +++ b/app/src/main/java/com/naviapp/personalloan/getloan/repositories/GstDetailsRepository.kt @@ -11,31 +11,28 @@ import com.naviapp.models.request.GstLoginData import com.naviapp.models.request.GstOtpVerificationData import com.naviapp.models.request.GstSendOtpData import com.naviapp.network.retrofit.ResponseCallback -import com.naviapp.network.retrofit.RetrofitService -import javax.inject.Inject +import com.naviapp.utils.retrofitService -class GstDetailsRepository @Inject constructor(val retrofitService: RetrofitService) : - ResponseCallback() { +class GstDetailsRepository : ResponseCallback() { suspend fun fetchGstDetails(queryMap: HashMap?) = - apiResponseCallback(retrofitService.fetchGstDetails(queryMap = queryMap)) + apiResponseCallback(retrofitService().fetchGstDetails(queryMap = queryMap)) suspend fun loginGstWithCredential(gstLoginData: GstLoginData) = - apiResponseCallback(retrofitService.loginGstWithCredential(gstLoginData)) + apiResponseCallback(retrofitService().loginGstWithCredential(gstLoginData)) suspend fun sendOTPForGstVerification(gstSendOtpData: GstSendOtpData) = - apiResponseCallback(retrofitService.sendOTPForGstVerification(gstSendOtpData)) + apiResponseCallback(retrofitService().sendOTPForGstVerification(gstSendOtpData)) suspend fun verifyOTPForGstVerification(gstOtpVerificationData: GstOtpVerificationData) = - apiResponseCallback(retrofitService.verifyOTPForGstVerification(gstOtpVerificationData)) + apiResponseCallback(retrofitService().verifyOTPForGstVerification(gstOtpVerificationData)) suspend fun fetchGstLoginWithCredentialStatus(requestId: String) = - apiResponseCallback(retrofitService.fetchGstLoginWithCredentialStatus(requestId)) + apiResponseCallback(retrofitService().fetchGstLoginWithCredentialStatus(requestId)) suspend fun fetchSendOTPForGstVerificationStatus(requestId: String) = - apiResponseCallback(retrofitService.fetchSendOTPForGstVerificationStatus(requestId)) + apiResponseCallback(retrofitService().fetchSendOTPForGstVerificationStatus(requestId)) suspend fun fetchVerifyOTPForGstVerification(requestId: String) = - apiResponseCallback(retrofitService.fetchVerifyOTPForGstVerification(requestId)) - -} \ No newline at end of file + apiResponseCallback(retrofitService().fetchVerifyOTPForGstVerification(requestId)) +} diff --git a/app/src/main/java/com/naviapp/personalloan/getloan/repositories/SkipMandateRepository.kt b/app/src/main/java/com/naviapp/personalloan/getloan/repositories/SkipMandateRepository.kt index 8c7cc74d0f..59a601f841 100644 --- a/app/src/main/java/com/naviapp/personalloan/getloan/repositories/SkipMandateRepository.kt +++ b/app/src/main/java/com/naviapp/personalloan/getloan/repositories/SkipMandateRepository.kt @@ -1,25 +1,23 @@ /* - * * - * * Copyright (c) 2022 . All rights reserved @Navi + * + * * Copyright © 2022-2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential * */ package com.naviapp.personalloan.getloan.repositories import com.naviapp.network.retrofit.ResponseCallback -import com.naviapp.network.retrofit.RetrofitService -import javax.inject.Inject +import com.naviapp.utils.retrofitService -class SkipMandateRepository @Inject constructor(private val retrofitService: RetrofitService) : - ResponseCallback() { +class SkipMandateRepository : ResponseCallback() { suspend fun fetchSkipMandateDetails(loanApplicationId: String) = - apiResponseCallback(retrofitService.fetchSkipMandateDetails(loanApplicationId)) + apiResponseCallback(retrofitService().fetchSkipMandateDetails(loanApplicationId)) suspend fun fetchLoanBasicDetails() = - apiResponseCallback(retrofitService.fetchLoanBasicDetails()) + apiResponseCallback(retrofitService().fetchLoanBasicDetails()) suspend fun fetchSkipMandateV2Details(loanApplicationId: String) = - apiResponseCallback(retrofitService.fetchSkipMandateV2Details(loanApplicationId)) - -} \ No newline at end of file + apiResponseCallback(retrofitService().fetchSkipMandateV2Details(loanApplicationId)) +} diff --git a/app/src/main/java/com/naviapp/personalloan/getloan/utils/FaqsUtil.kt b/app/src/main/java/com/naviapp/personalloan/getloan/utils/FaqsUtil.kt index b9a02be6b6..87d31cc531 100644 --- a/app/src/main/java/com/naviapp/personalloan/getloan/utils/FaqsUtil.kt +++ b/app/src/main/java/com/naviapp/personalloan/getloan/utils/FaqsUtil.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2019 by Navi Technologies Private Limited + * * Copyright © 2019-2023 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -12,188 +12,273 @@ import com.naviapp.R import com.naviapp.models.response.Faq import com.naviapp.models.response.FaqContent -fun loanDetailsFaqs(context: Context) = Faq( - context.getString(R.string.loan_details), - listOf( - FaqContent( - context.getString(R.string.what_is_moratorium), - context.getString(R.string.moratorium_is_the_period_of_time) - ), - FaqContent( - context.getString(R.string.is_the_moratorium_available), - context.getString(R.string.navi_will_not_be_able_to_extend_moratorium) - ), - FaqContent( - context.getString(R.string.can_i_change_loan_amount), - context.getString(R.string.you_can_select_loan_amount) - ), - FaqContent( - context.getString(R.string.can_i_change_emi), - context.getString(R.string.you_can_select_emi) - ), - FaqContent( - context.getString(R.string.can_i_change_tenure), - context.getString(R.string.you_can_change_emi) - ), - FaqContent( - context.getString(R.string.can_i_pre_close), - context.getString(R.string.you_can_pre_close) - ), - FaqContent( - context.getString(R.string.time_for_loan_disbursal), - context.getString(R.string.loan_disbursal_is_instant) - ), - FaqContent( - context.getString(R.string.loan_amount_and_interest_rates_determined), - context.getString(R.string.calculated_by_internal_algorithms) - ), - FaqContent( - context.getString(R.string.loan_for_remaining_amount), - context.getString(R.string.repay_the_existing_loan) - ), - FaqContent( - context.getString(R.string.why_is_processing_fee_charged), - context.getString(R.string.variety_of_fixed_costs_associated) - ), - FaqContent( - context.getString(R.string.why_is_gst_charged), - context.getString(R.string.gst_of_18_of_processing_fee) +fun loanDetailsFaqs(context: Context) = + Faq( + context.getString(R.string.loan_details), + listOf( + FaqContent( + context.getString(R.string.what_is_moratorium), + context.getString(R.string.moratorium_is_the_period_of_time) + ), + FaqContent( + context.getString(R.string.is_the_moratorium_available), + context.getString(R.string.navi_will_not_be_able_to_extend_moratorium) + ), + FaqContent( + context.getString(R.string.can_i_change_loan_amount), + context.getString(R.string.you_can_select_loan_amount) + ), + FaqContent( + context.getString(R.string.can_i_change_emi), + context.getString(R.string.you_can_select_emi) + ), + FaqContent( + context.getString(R.string.can_i_change_tenure), + context.getString(R.string.you_can_change_emi) + ), + FaqContent( + context.getString(R.string.can_i_pre_close), + context.getString(R.string.you_can_pre_close) + ), + FaqContent( + context.getString(R.string.time_for_loan_disbursal), + context.getString(R.string.loan_disbursal_is_instant) + ), + FaqContent( + context.getString(R.string.loan_amount_and_interest_rates_determined), + context.getString(R.string.calculated_by_internal_algorithms) + ), + FaqContent( + context.getString(R.string.loan_for_remaining_amount), + context.getString(R.string.repay_the_existing_loan) + ), + FaqContent( + context.getString(R.string.why_is_processing_fee_charged), + context.getString(R.string.variety_of_fixed_costs_associated) + ), + FaqContent( + context.getString(R.string.why_is_gst_charged), + context.getString(R.string.gst_of_18_of_processing_fee) + ), + FaqContent( + context.getString(R.string.how_can_i_reach_out_to_gro), + context.getString(R.string.how_can_i_reach_out_to_gro_answer) + ), + FaqContent( + context.getString(R.string.what_are_the_cash_loan_features), + context.getString(R.string.what_are_the_cash_loan_features_answer) + ), + FaqContent( + context.getString(R.string.is_navi_an_nbfc), + context.getString(R.string.is_navi_an_nbfc_answer) + ), + FaqContent( + context.getString(R.string.how_can_i_lodge_a_complaint), + context.getString(R.string.how_can_i_lodge_a_complaint_answer) + ) ) ) -) -fun kycFaqs(context: Context) = Faq( - context.getString(R.string.kyc), - listOf( - FaqContent( - context.getString(R.string.reason_for_kyc_rejection), - context.getString(R.string.name_or_selfie_mismatch) - ), - FaqContent( - context.getString(R.string.aadhaar_not_linked_to_mobile), - context.getString(R.string.upload_image_of_aadhaar) - ), - FaqContent( - context.getString(R.string.do_not_have_an_aadhaar), - context.getString(R.string.completing_kyc_offline) - ), - FaqContent( - context.getString(R.string.how_to_complete_kyc_offline), - context.getString(R.string.complete_kyc_offline_detail) - ), - FaqContent( - context.getString(R.string.do_not_have_current_address_proof), - context.getString(R.string.proceed_without_attaching_proof) - ), - FaqContent( - context.getString(R.string.reason_am_not_getting_aadhaar_otp), - context.getString(R.string.make_sure_aadhaar_is_linked) - ), - FaqContent( - context.getString(R.string.aadhaar_details_safe), - context.getString(R.string.do_not_store_aadhaar) +fun kycFaqs(context: Context) = + Faq( + context.getString(R.string.kyc), + listOf( + FaqContent( + context.getString(R.string.reason_for_kyc_rejection), + context.getString(R.string.name_or_selfie_mismatch) + ), + FaqContent( + context.getString(R.string.aadhaar_not_linked_to_mobile), + context.getString(R.string.upload_image_of_aadhaar) + ), + FaqContent( + context.getString(R.string.do_not_have_an_aadhaar), + context.getString(R.string.completing_kyc_offline) + ), + FaqContent( + context.getString(R.string.how_to_complete_kyc_offline), + context.getString(R.string.complete_kyc_offline_detail) + ), + FaqContent( + context.getString(R.string.do_not_have_current_address_proof), + context.getString(R.string.proceed_without_attaching_proof) + ), + FaqContent( + context.getString(R.string.reason_am_not_getting_aadhaar_otp), + context.getString(R.string.make_sure_aadhaar_is_linked) + ), + FaqContent( + context.getString(R.string.aadhaar_details_safe), + context.getString(R.string.do_not_store_aadhaar) + ), + FaqContent( + context.getString(R.string.how_can_i_reach_out_to_gro), + context.getString(R.string.how_can_i_reach_out_to_gro_answer) + ), + FaqContent( + context.getString(R.string.what_are_the_cash_loan_features), + context.getString(R.string.what_are_the_cash_loan_features_answer) + ), + FaqContent( + context.getString(R.string.is_navi_an_nbfc), + context.getString(R.string.is_navi_an_nbfc_answer) + ), + FaqContent( + context.getString(R.string.how_can_i_lodge_a_complaint), + context.getString(R.string.how_can_i_lodge_a_complaint_answer) + ) ) ) -) -fun bankDetailsFaqs(context: Context) = Faq( - context.getString(R.string.bank_verification), - listOf( - FaqContent( - context.getString(R.string.bank_not_supported), - context.getString(R.string.emandate_governed_by_npci_are_supported) - ), - FaqContent( - context.getString(R.string.find_ifsc_code), - context.getString(R.string.address_of_bank_accounts_branch) - ), - FaqContent( - context.getString(R.string.bank_verification_required), - context.getString(R.string.ensure_loan_amount_goes_to_right_account) - ), - FaqContent( - context.getString(R.string.use_someone_else_bank_account), - context.getString(R.string.disbursed_only_to_your_account) - ), - FaqContent( - context.getString(R.string.bank_verification_fail), - context.getString(R.string.details_do_not_match_with_registered_account) +fun bankDetailsFaqs(context: Context) = + Faq( + context.getString(R.string.bank_verification), + listOf( + FaqContent( + context.getString(R.string.bank_not_supported), + context.getString(R.string.emandate_governed_by_npci_are_supported) + ), + FaqContent( + context.getString(R.string.find_ifsc_code), + context.getString(R.string.address_of_bank_accounts_branch) + ), + FaqContent( + context.getString(R.string.bank_verification_required), + context.getString(R.string.ensure_loan_amount_goes_to_right_account) + ), + FaqContent( + context.getString(R.string.use_someone_else_bank_account), + context.getString(R.string.disbursed_only_to_your_account) + ), + FaqContent( + context.getString(R.string.bank_verification_fail), + context.getString(R.string.details_do_not_match_with_registered_account) + ), + FaqContent( + context.getString(R.string.how_can_i_reach_out_to_gro), + context.getString(R.string.how_can_i_reach_out_to_gro_answer) + ), + FaqContent( + context.getString(R.string.what_are_the_cash_loan_features), + context.getString(R.string.what_are_the_cash_loan_features_answer) + ), + FaqContent( + context.getString(R.string.is_navi_an_nbfc), + context.getString(R.string.is_navi_an_nbfc_answer) + ), + FaqContent( + context.getString(R.string.how_can_i_lodge_a_complaint), + context.getString(R.string.how_can_i_lodge_a_complaint_answer) + ) ) ) -) -fun bankDetailsAutoDebitFaqs(context: Context) = Faq( - context.getString(R.string.setup_auto_debit), - listOf( - FaqContent( - context.getString(R.string.what_is_auto_debit), - context.getString(R.string.emis_paid_directly_from_bank_account) - ), - FaqContent( - context.getString(R.string.what_is_emandate), - context.getString(R.string.ways_to_register_for_auto_debit) - ), - FaqContent( - context.getString(R.string.why_setup_auto_debit), - context.getString(R.string.pay_emis_on_time_directly_from_bank_account) - ), - FaqContent( - context.getString(R.string.how_to_setup_auto_debit), - context.getString(R.string.verify_emandate_with_bank) - ), - FaqContent( - context.getString(R.string.why_netbanking_debit_card_details), - context.getString(R.string.to_verify_emandate) - ), - FaqContent( - context.getString(R.string.are_netbanking_card_details_safe), - context.getString(R.string.we_do_not_store_netbanking_card_details) - ), - FaqContent( - context.getString(R.string.why_debit_card_option_not_available), - context.getString(R.string.options_decided_by_your_bank) - ), - FaqContent( - context.getString(R.string.dont_remember_password), - context.getString(R.string.can_use_debit_card_option) - ), - FaqContent( - context.getString(R.string.why_auto_debit_setup_failed), - context.getString(R.string.decided_by_bank) - ), - FaqContent( - context.getString(R.string.charges_for_auto_debit), - context.getString(R.string.we_do_not_charge_you) - ), - FaqContent( - context.getString(R.string.can_i_change_bank_account), - context.getString(R.string.you_can_use_change_bank_option) - ), - FaqContent( - context.getString(R.string.change_bank_after_auto_debit_success), - context.getString(R.string.no_period) - ), - FaqContent( - context.getString(R.string.use_separate_bank_accounts), - context.getString(R.string.same_bank_account_has_to_be_used) +fun bankDetailsAutoDebitFaqs(context: Context) = + Faq( + context.getString(R.string.setup_auto_debit), + listOf( + FaqContent( + context.getString(R.string.what_is_auto_debit), + context.getString(R.string.emis_paid_directly_from_bank_account) + ), + FaqContent( + context.getString(R.string.what_is_emandate), + context.getString(R.string.ways_to_register_for_auto_debit) + ), + FaqContent( + context.getString(R.string.why_setup_auto_debit), + context.getString(R.string.pay_emis_on_time_directly_from_bank_account) + ), + FaqContent( + context.getString(R.string.how_to_setup_auto_debit), + context.getString(R.string.verify_emandate_with_bank) + ), + FaqContent( + context.getString(R.string.why_netbanking_debit_card_details), + context.getString(R.string.to_verify_emandate) + ), + FaqContent( + context.getString(R.string.are_netbanking_card_details_safe), + context.getString(R.string.we_do_not_store_netbanking_card_details) + ), + FaqContent( + context.getString(R.string.why_debit_card_option_not_available), + context.getString(R.string.options_decided_by_your_bank) + ), + FaqContent( + context.getString(R.string.dont_remember_password), + context.getString(R.string.can_use_debit_card_option) + ), + FaqContent( + context.getString(R.string.why_auto_debit_setup_failed), + context.getString(R.string.decided_by_bank) + ), + FaqContent( + context.getString(R.string.charges_for_auto_debit), + context.getString(R.string.we_do_not_charge_you) + ), + FaqContent( + context.getString(R.string.can_i_change_bank_account), + context.getString(R.string.you_can_use_change_bank_option) + ), + FaqContent( + context.getString(R.string.change_bank_after_auto_debit_success), + context.getString(R.string.no_period) + ), + FaqContent( + context.getString(R.string.use_separate_bank_accounts), + context.getString(R.string.same_bank_account_has_to_be_used) + ), + FaqContent( + context.getString(R.string.how_can_i_reach_out_to_gro), + context.getString(R.string.how_can_i_reach_out_to_gro_answer) + ), + FaqContent( + context.getString(R.string.what_are_the_cash_loan_features), + context.getString(R.string.what_are_the_cash_loan_features_answer) + ), + FaqContent( + context.getString(R.string.is_navi_an_nbfc), + context.getString(R.string.is_navi_an_nbfc_answer) + ), + FaqContent( + context.getString(R.string.how_can_i_lodge_a_complaint), + context.getString(R.string.how_can_i_lodge_a_complaint_answer) + ) ) ) -) -fun getLoanFaqs(context: Context) = Faq( - context.getString(R.string.get_loan), - listOf( - FaqContent( - context.getString(R.string.check_my_loan_details), - context.getString(R.string.available_in_loan_details_section) - ), - FaqContent( - context.getString(R.string.agreement_be_sent_to_me), - context.getString(R.string.sending_loan_agreement_on_whatsapp) - ), - FaqContent( - context.getString(R.string.reminders_for_emi), - context.getString(R.string.timely_reminders_for_payments) +fun getLoanFaqs(context: Context) = + Faq( + context.getString(R.string.get_loan), + listOf( + FaqContent( + context.getString(R.string.check_my_loan_details), + context.getString(R.string.available_in_loan_details_section) + ), + FaqContent( + context.getString(R.string.agreement_be_sent_to_me), + context.getString(R.string.sending_loan_agreement_on_whatsapp) + ), + FaqContent( + context.getString(R.string.reminders_for_emi), + context.getString(R.string.timely_reminders_for_payments) + ), + FaqContent( + context.getString(R.string.how_can_i_reach_out_to_gro), + context.getString(R.string.how_can_i_reach_out_to_gro_answer) + ), + FaqContent( + context.getString(R.string.what_are_the_cash_loan_features), + context.getString(R.string.what_are_the_cash_loan_features_answer) + ), + FaqContent( + context.getString(R.string.is_navi_an_nbfc), + context.getString(R.string.is_navi_an_nbfc_answer) + ), + FaqContent( + context.getString(R.string.how_can_i_lodge_a_complaint), + context.getString(R.string.how_can_i_lodge_a_complaint_answer) + ) ) ) -) diff --git a/app/src/main/java/com/naviapp/personalloan/getloan/viewmodels/SkipMandateVM.kt b/app/src/main/java/com/naviapp/personalloan/getloan/viewmodels/SkipMandateVM.kt index 0bc9f8b873..c2a6d46da9 100644 --- a/app/src/main/java/com/naviapp/personalloan/getloan/viewmodels/SkipMandateVM.kt +++ b/app/src/main/java/com/naviapp/personalloan/getloan/viewmodels/SkipMandateVM.kt @@ -17,12 +17,11 @@ import com.naviapp.models.response.LoanBasicDetailsResponse import com.naviapp.models.response.SkipMandateResponse import com.naviapp.personalloan.getloan.repositories.SkipMandateRepository import com.naviapp.personalloanrevamp.models.FLOW_SKIP_MANDATE -import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch -import javax.inject.Inject -@HiltViewModel -class SkipMandateVM @Inject constructor(private val repository: SkipMandateRepository) : BaseVM() { +class SkipMandateVM( + private val repository: SkipMandateRepository = SkipMandateRepository() +) : BaseVM() { private val _skipMandateResponse = MutableLiveData() val skipMandateResponse: LiveData diff --git a/app/src/main/java/com/naviapp/personalloan/intermediate/activity/IntermediateActivity.kt b/app/src/main/java/com/naviapp/personalloan/intermediate/activity/IntermediateActivity.kt index 158eebc2ed..36dbea387b 100644 --- a/app/src/main/java/com/naviapp/personalloan/intermediate/activity/IntermediateActivity.kt +++ b/app/src/main/java/com/naviapp/personalloan/intermediate/activity/IntermediateActivity.kt @@ -36,7 +36,6 @@ import com.naviapp.personalloan.intermediate.chatBot.ChatBotFragment import com.naviapp.personalloan.intermediate.cibilfailure.fragment.CibilFailureFragment import com.naviapp.personalloan.intermediate.coupon.fragment.CouponFragment import com.naviapp.personalloan.intermediate.topup.fragment.TopUpLoanIntroFragment -import com.naviapp.personalloanrevamp.intermediatev2.fragments.BankStatementV2Fragment import com.naviapp.utils.Constants import dagger.hilt.android.AndroidEntryPoint @@ -67,14 +66,16 @@ class IntermediateActivity : val fragment = supportFragmentManager.findFragmentByTag(currentScreenTag) ?: getFragment(currentScreenTag, bundle) - val fragmentTransaction = supportFragmentManager.beginTransaction() - if (!supportFragmentManager.isStateSaved && !supportFragmentManager.isDestroyed) { - fragmentTransaction.replace( - getViewContainer(bundle.getBoolean(Constants.IS_FULL_SCREEN_VIEW)), - fragment, - currentScreenTag - ) - fragmentTransaction.commit() + fragment?.let { + val fragmentTransaction = supportFragmentManager.beginTransaction() + if (!supportFragmentManager.isStateSaved && !supportFragmentManager.isDestroyed) { + fragmentTransaction.replace( + getViewContainer(bundle.getBoolean(Constants.IS_FULL_SCREEN_VIEW)), + fragment, + currentScreenTag + ) + fragmentTransaction.commit() + } } } @@ -83,7 +84,7 @@ class IntermediateActivity : finish() } - private fun getFragment(screen: String, bundle: Bundle): Fragment { + private fun getFragment(screen: String, bundle: Bundle): Fragment? { return when (screen) { SubPageStatusType.MONEY_DISBURSEMENT_STATUS -> DelayedDisbursementFragment.newInstance(bundle) @@ -94,7 +95,7 @@ class IntermediateActivity : SubPageStatusType.TOP_UP_INTRO -> TopUpLoanIntroFragment.newInstance(bundle) SubPageStatusType.CHAT_SCREEN -> ChatBotFragment() SubPageStatusType.CIBIL_FAILURE -> CibilFailureFragment.newInstance(bundle) - else -> BankStatementV2Fragment.getInstance(bundle) + else -> null } } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/bankDetailsPostKyc/activity/BankDetailsLoaderPostKycActivity.kt b/app/src/main/java/com/naviapp/personalloanrevamp/bankDetailsPostKyc/activity/BankDetailsLoaderPostKycActivity.kt index ddf7c24906..564167e919 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/bankDetailsPostKyc/activity/BankDetailsLoaderPostKycActivity.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/bankDetailsPostKyc/activity/BankDetailsLoaderPostKycActivity.kt @@ -59,18 +59,15 @@ import com.naviapp.personalloan.getloan.bankdetails.fragments.BankDetailsFragmen import com.naviapp.personalloan.getloan.bankdetails.models.BankLoanStatusType import com.naviapp.personalloan.getloan.bankdetails.viewmodels.BankDetailsVM import com.naviapp.personalloan.getloan.viewmodels.LoanDisbursementVM - -import com.naviapp.personalloanrevamp.getloanRevamp.activities.BankAccountVerificationLoaderV2Activity -import com.naviapp.personalloanrevamp.error.activity.ErrorScreenV2Activity -import com.naviapp.personalloanrevamp.getloanRevamp.activities.LoanDisbursementLoaderV2Activity -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper import com.naviapp.rewards.ui.RewardDelightActivity import com.naviapp.utils.Constants +import com.naviapp.utils.Constants.IS_SOFT_REJECT +import com.naviapp.utils.Constants.LOAN_ACCOUNT_NUMBER +import com.naviapp.utils.Constants.MONEY_DISBURSEMENT_STATUS_V2 +import com.naviapp.utils.Constants.REJECTION_DATA import com.naviapp.utils.LOAN_APPLICATION_ID import com.naviapp.utils.appendStrings -import dagger.hilt.android.AndroidEntryPoint -@AndroidEntryPoint class BankDetailsLoaderPostKycActivity : BaseActivity() { lateinit var binding: PennyDropDisbursalLoaderBinding @@ -248,7 +245,7 @@ class BankDetailsLoaderPostKycActivity : BaseActivity() { hideLoader() if ((it.first?.softReject == true)) { val data = Bundle() - data.putString(ErrorScreenV2Activity.IS_SOFT_REJECT, Constants.TRUE) + data.putString(IS_SOFT_REJECT, Constants.TRUE) ScreenNavigator.instance.startActivityWithNoActivityStack( this, ScreenNavigator.ERROR_FULL_PAGE_SCREEN_V2, @@ -261,7 +258,7 @@ class BankDetailsLoaderPostKycActivity : BaseActivity() { hideLoader() if (rejectionDetailsResponse.hasRejection.orFalse()) { val data = Bundle() - data.putParcelable(ErrorScreenV2Activity.REJECTION_DATA, rejectionDetailsResponse) + data.putParcelable(REJECTION_DATA, rejectionDetailsResponse) data.putBoolean( GetLoanActivity.IS_FOR_SECOND_LOAN_JOURNEY, intent.extras?.getBoolean(GetLoanActivity.IS_FOR_SECOND_LOAN_JOURNEY, false) @@ -377,7 +374,7 @@ class BankDetailsLoaderPostKycActivity : BaseActivity() { ), bundle = Bundle().apply { putString( - LoanDisbursementLoaderV2Activity.LOAN_ACCOUNT_NUMBER, + LOAN_ACCOUNT_NUMBER, viewModel.loanAccountNumber.value ) putParcelable( @@ -385,7 +382,7 @@ class BankDetailsLoaderPostKycActivity : BaseActivity() { PreviousScreenNameRequest(Constants.DISBURSED) ) putString( - LoanDisbursementLoaderV2Activity.LOAN_ACCOUNT_NUMBER, + LOAN_ACCOUNT_NUMBER, viewModel.loanAccountNumber.value ) putBoolean(Constants.POST_DISBURSEMENT, true) @@ -472,7 +469,7 @@ class BankDetailsLoaderPostKycActivity : BaseActivity() { redirectUser( NaviDeepLinkNavigator.LOAN_APPLICATION_V2.appendStrings( FORWARD_SLASH.toString(), - GetLoanV2ViewHelper.MONEY_DISBURSEMENT_STATUS_V2 + MONEY_DISBURSEMENT_STATUS_V2 ) ) } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/bankDetailsPostKyc/fragment/BankDetailsPostKycFragment.kt b/app/src/main/java/com/naviapp/personalloanrevamp/bankDetailsPostKyc/fragment/BankDetailsPostKycFragment.kt index 68c46272a5..8e3a393232 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/bankDetailsPostKyc/fragment/BankDetailsPostKycFragment.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/bankDetailsPostKyc/fragment/BankDetailsPostKycFragment.kt @@ -66,17 +66,15 @@ import com.naviapp.personalloanrevamp.getloanRevamp.fragments.IfscV2Fragment import com.naviapp.personalloanrevamp.getloanRevamp.fragments.PennyDropFailureV2BottomSheet import com.naviapp.personalloanrevamp.getloanRevamp.fragments.SelectBankV2Fragment import com.naviapp.personalloanrevamp.getloanRevamp.helper.BankDetailsV2Helper -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper import com.naviapp.personalloanrevamp.getloanRevamp.listeners.LoanDetailsV2WidgetAdapterListener import com.naviapp.personalloanrevamp.models.StyledTextConfig import com.naviapp.personalloanrevamp.useridentificationv2.fragments.InformationBottomSheet import com.naviapp.utils.* import com.naviapp.utils.Constants.ACTION import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY +import com.naviapp.utils.Constants.BANK_DETAILS_AUTO_DEBIT_V2 import com.naviapp.utils.IconUtils.ICON_IFSC_SUCCESS -import dagger.hilt.android.AndroidEntryPoint -@AndroidEntryPoint class BankDetailsPostKycFragment : BaseFragment(), View.OnClickListener, FindIfscListener, View.OnKeyListener, @@ -632,7 +630,7 @@ class BankDetailsPostKycFragment : BaseFragment(), View.OnClickListener, private fun onPennyDropSuccess() { listener?.navigateTo( viewModel.disbursementDetails.value?.footer?.nextCta?.url - ?: GetLoanV2ViewHelper.BANK_DETAILS_AUTO_DEBIT_V2, + ?: BANK_DETAILS_AUTO_DEBIT_V2, Bundle().apply { putString(Constants.PERSONAL_LOAN_APPLICATION_ID, loanApplicationId) } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/BankStatementVerificationMethodView.kt b/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/BankStatementVerificationMethodView.kt index 5135ccfd25..4a0e2e9cca 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/BankStatementVerificationMethodView.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/BankStatementVerificationMethodView.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2022 by Navi Technologies Limited + * * Copyright © 2022-2023 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -23,7 +23,6 @@ import com.naviapp.databinding.BankStatementVerificationMethodLayoutBinding import com.naviapp.models.response.InfoCtaData import com.naviapp.models.response.SelectedOption import com.naviapp.models.response.SelectorMethodData -import com.naviapp.personalloanrevamp.intermediatev2.fragments.BankStatementV2Fragment import com.naviapp.utils.IconUtils class BankStatementVerificationMethodView(context: Context, attrs: AttributeSet?) : diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/EmiTenureSummaryView.kt b/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/EmiTenureSummaryView.kt index 0f1e16b198..a2ea092a8e 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/EmiTenureSummaryView.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/EmiTenureSummaryView.kt @@ -15,9 +15,9 @@ import com.google.gson.Gson import com.navi.base.model.CtaData import com.navi.base.model.LineItem import com.naviapp.analytics.utils.NaviAnalytics +import com.naviapp.common.fragment.RadioButtonBottomSheet.Companion.EVENT_NAME import com.naviapp.databinding.EmiTenureSummaryViewBinding import com.naviapp.models.response.LoanDetailsV2AdditionData -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.FreshLoanDetailsV2Fragment import com.naviapp.personalloanrevamp.getloanRevamp.listeners.LoanDetailsV2WidgetAdapterListener import com.naviapp.personalloanrevamp.models.EmiTenureSummaryWidgetConfig import com.naviapp.personalloanrevamp.models.LoanAmountSummaryWidgetBody @@ -65,7 +65,7 @@ class EmiTenureSummaryView(context: Context, attrs: AttributeSet? = null) : eventName?.let { params.add( LineItem( - key = FreshLoanDetailsV2Fragment.EVENT_NAME, + key = EVENT_NAME, value = eventName ) ) diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/LoanAmountSummaryV2View.kt b/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/LoanAmountSummaryV2View.kt index 8659f15961..36b32c31b9 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/LoanAmountSummaryV2View.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/LoanAmountSummaryV2View.kt @@ -24,9 +24,8 @@ import com.navi.naviwidgets.models.response.CardProperties import com.navi.naviwidgets.utils.setCardProperties import com.naviapp.databinding.LoanAmountSummaryV2ViewBinding import com.naviapp.models.response.LoanDetailsV2AdditionData -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.FreshLoanDetailsV2Fragment -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.LoanDetailsEditorFragment import com.naviapp.personalloanrevamp.getloanRevamp.listeners.LoanDetailsV2WidgetAdapterListener +import com.naviapp.personalloanrevamp.models.CtaType import com.naviapp.personalloanrevamp.models.LoanAmountSummaryWidgetConfig import com.naviapp.personalloanrevamp.models.StyledTitleDescriptionBottomSheetConfig import com.naviapp.utils.setMargin @@ -74,8 +73,8 @@ class LoanAmountSummaryV2View(context: Context, attrs: AttributeSet? = null) : binding.footerLl.setOnClickListener { val subtitleEventCta = getEventCta( - widgetConfig?.widgetBody?.footerTag?.cta, - type = LoanDetailsEditorFragment.CtaType.INFO_ICON_CLICK.value + widgetConfig.widgetBody.footerTag?.cta, + type = CtaType.INFO_ICON_CLICK.value ) widgetCallback?.onCtaClick(subtitleEventCta) } @@ -100,7 +99,7 @@ class LoanAmountSummaryV2View(context: Context, attrs: AttributeSet? = null) : eventName?.let { params.add( LineItem( - key = FreshLoanDetailsV2Fragment.EVENT_NAME, + key = EVENT_NAME, value = eventName ) ) @@ -208,5 +207,6 @@ class LoanAmountSummaryV2View(context: Context, attrs: AttributeSet? = null) : companion object { const val FOOTER_BOTTOM_SHEET_CLICK = "FOOTER_BOTTOM_SHEET_CLICK" const val FOOTER_BOTTOM_SHEET_DATA = "FOOTER_BOTTOM_SHEET_DATA" + const val EVENT_NAME = "EVENT_NAME" } } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/LoanAmountSummaryView.kt b/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/LoanAmountSummaryView.kt index 2c08e0f1c0..37c8ff5174 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/LoanAmountSummaryView.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/LoanAmountSummaryView.kt @@ -20,9 +20,9 @@ import com.navi.base.utils.orFalse import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.databinding.LoanAmountSummaryViewBinding import com.naviapp.models.response.LoanDetailsV2AdditionData -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.FreshLoanDetailsV2Fragment -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.LoanDetailsEditorFragment +import com.naviapp.personalloanrevamp.common.customview.LoanAmountSummaryV2View.Companion.EVENT_NAME import com.naviapp.personalloanrevamp.getloanRevamp.listeners.LoanDetailsV2WidgetAdapterListener +import com.naviapp.personalloanrevamp.models.CtaType import com.naviapp.personalloanrevamp.models.LoanAmountSummaryWidgetConfig import com.naviapp.personalloanrevamp.models.StyledTitleDescriptionBottomSheetConfig import com.naviapp.utils.setMargin @@ -55,7 +55,7 @@ class LoanAmountSummaryView(context: Context, attrs: AttributeSet? = null) : val subtitleEventCta = getEventCta( widgetBody.subtitle?.cta, - type = LoanDetailsEditorFragment.CtaType.INFO_ICON_CLICK.value + type = CtaType.INFO_ICON_CLICK.value ) widgetCallback?.onCtaClick(subtitleEventCta) } @@ -78,7 +78,7 @@ class LoanAmountSummaryView(context: Context, attrs: AttributeSet? = null) : eventName?.let { params.add( LineItem( - key = FreshLoanDetailsV2Fragment.EVENT_NAME, + key = EVENT_NAME, value = eventName ) ) diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/TopUpLoanSummaryView.kt b/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/TopUpLoanSummaryView.kt index 88c6be681a..287d9ae3f6 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/TopUpLoanSummaryView.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/TopUpLoanSummaryView.kt @@ -20,12 +20,12 @@ import com.navi.base.utils.orZero import com.navi.insurance.util.log import com.naviapp.databinding.TopupLoanSummaryViewBinding import com.naviapp.models.response.LoanDetailsV2AdditionData -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.FreshLoanDetailsV2Fragment -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.LoanDetailsEditorFragment import com.naviapp.personalloanrevamp.getloanRevamp.listeners.LoanDetailsV2WidgetAdapterListener import com.naviapp.personalloanrevamp.models.TopUpSummaryWidgetConfig import com.naviapp.personalloanrevamp.models.ValueAdditionWidgetBody import com.naviapp.personalloanrevamp.models.ValueAdditionWidgetKeyValue +import com.naviapp.personalloanrevamp.models.* +import com.naviapp.utils.Constants.EVENT_NAME import com.naviapp.utils.formatDoubleAmount import com.naviapp.utils.setMargin @@ -55,7 +55,7 @@ class TopUpLoanSummaryView(context: Context, attrs: AttributeSet? = null) : val subtitleEventCta = getEventCta( widgetBody.subtitle?.cta, - type = LoanDetailsEditorFragment.CtaType.INFO_ICON_CLICK.value + type = CtaType.INFO_ICON_CLICK.value ) widgetCallback?.onCtaClick(subtitleEventCta) } @@ -115,7 +115,7 @@ class TopUpLoanSummaryView(context: Context, attrs: AttributeSet? = null) : eventName?.let { params.add( LineItem( - key = FreshLoanDetailsV2Fragment.EVENT_NAME, + key = EVENT_NAME, value = eventName ) ) diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/ViewDescriptionCtaView.kt b/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/ViewDescriptionCtaView.kt index a8e8bf569f..d05d41a1c5 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/ViewDescriptionCtaView.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/common/customview/ViewDescriptionCtaView.kt @@ -11,18 +11,9 @@ import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import androidx.constraintlayout.widget.ConstraintLayout -import com.google.gson.Gson -import com.navi.base.model.CtaData -import com.navi.base.model.LineItem -import com.naviapp.analytics.utils.NaviAnalytics -import com.naviapp.databinding.EmiTenureSummaryViewBinding import com.naviapp.databinding.ViewDescriptionCtaViewBinding import com.naviapp.models.response.LoanDetailsV2AdditionData -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.FreshLoanDetailsV2Fragment import com.naviapp.personalloanrevamp.getloanRevamp.listeners.LoanDetailsV2WidgetAdapterListener -import com.naviapp.personalloanrevamp.models.EmiTenureSummaryWidgetConfig -import com.naviapp.personalloanrevamp.models.LoanAmountSummaryWidgetBody -import com.naviapp.personalloanrevamp.models.StyledTitleDescriptionBottomSheetConfig import com.naviapp.personalloanrevamp.models.ViewDescriptionCtaWidgetConfig import com.naviapp.utils.setMargin diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/customview/BoxWithIconTitleView.kt b/app/src/main/java/com/naviapp/personalloanrevamp/customview/BoxWithIconTitleView.kt deleted file mode 100644 index 17064c6e39..0000000000 --- a/app/src/main/java/com/naviapp/personalloanrevamp/customview/BoxWithIconTitleView.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.naviapp.personalloanrevamp.customview - -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import androidx.constraintlayout.widget.ConstraintLayout -import com.naviapp.databinding.BoxWithIconTitleViewBinding -import com.naviapp.personalloanrevamp.models.response.EmiDetail - -class BoxWithIconTitleView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null -) : ConstraintLayout(context, attrs) { - - private val binding = BoxWithIconTitleViewBinding.inflate( - LayoutInflater.from(context), this, true - ) - - init { - layoutParams = LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT) - } - - fun setProperties(emiDetail : EmiDetail) { - binding.binder = emiDetail - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/activities/BankAccountVerificationLoaderV2Activity.kt b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/activities/BankAccountVerificationLoaderV2Activity.kt index 92b4a3f130..0bd7574dbf 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/activities/BankAccountVerificationLoaderV2Activity.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/activities/BankAccountVerificationLoaderV2Activity.kt @@ -70,8 +70,6 @@ import com.naviapp.personalloan.getloan.helpers.EnachHelper import com.naviapp.personalloan.getloan.helpers.EnachStub import com.naviapp.personalloanrevamp.getloanRevamp.fragments.BankDetailsAutoDebitV2Fragment import com.naviapp.personalloanrevamp.getloanRevamp.fragments.BankDetailsV2Fragment -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.LoanDetailsV2Fragment -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper import com.naviapp.personalloanrevamp.models.FLOW_KYC_VERIFICATION import com.naviapp.personalloanrevamp.models.FLOW_MANDATE_POLLING import com.naviapp.personalloanrevamp.models.FLOW_MANDATE_SETUP @@ -83,23 +81,22 @@ import com.naviapp.utils.Constants.PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS import com.naviapp.utils.Constants.URL import com.razorpay.PaymentData import com.razorpay.PaymentResultWithDataListener -import dagger.hilt.android.AndroidEntryPoint import `in`.digio.sdk.esign.DigioResponse import `in`.digio.sdk.esign.DigioResponseListener import com.navi.payment.razorpay.RazorpayHelper import com.navi.payment.utils.PaymentAnalytics -import com.naviapp.personalloanrevamp.error.activity.ErrorScreenV2Activity +import com.naviapp.utils.Constants.BANK_DETAILS_AUTO_DEBIT_V2 import com.naviapp.personalloanrevamp.models.EMPTY_ERROR_CODE_BY_3rd_PARTY import com.naviapp.personalloanrevamp.models.EMPTY_REASON_BY_3rd_PARTY +import com.naviapp.utils.Constants.IS_SOFT_REJECT +import com.naviapp.utils.Constants.REJECTION_DATA import com.naviapp.utils.Constants.SUCCESS_ANIMATION_GREEN_BG_TIME import com.naviapp.utils.Constants.UPI import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import javax.inject.Inject -@AndroidEntryPoint class BankAccountVerificationLoaderV2Activity : BaseActivity(), EnachListener, - DigioResponseListener, PaymentResultWithDataListener, LoanDetailsV2Fragment.UpdateUiListener { + DigioResponseListener, PaymentResultWithDataListener, BankDetailsAutoDebitV2Fragment.UpdateUiListener { private lateinit var binding: ActivityBankAccountVerificationLoaderV2Binding @@ -132,15 +129,14 @@ class BankAccountVerificationLoaderV2Activity : BaseActivity(), EnachListener, private val enachHelper = EnachHelper() private var unifyPennyDropMandateLottie: LottieFieldData? = null private var isUnifyPdMandateLottieFileCached = false - - @Inject - lateinit var lottieRemoteHelper: LottieRemoteHelper + private lateinit var lottieRemoteHelper: LottieRemoteHelper override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = getBindingObject() super.setContentView(binding.root) NaviTrackEvent.sendScreenTransitionEvent(screenName) + lottieRemoteHelper = LottieRemoteHelper(this) initQueryMapFromCtaParameters() initError() readBundle() @@ -264,7 +260,7 @@ class BankAccountVerificationLoaderV2Activity : BaseActivity(), EnachListener, } if ((it.first?.softReject == true)) { val data = Bundle() - data.putString(ErrorScreenV2Activity.IS_SOFT_REJECT, Constants.TRUE) + data.putString(IS_SOFT_REJECT, Constants.TRUE) ScreenNavigator.instance.startActivityWithNoActivityStack( this, ScreenNavigator.ERROR_FULL_PAGE_SCREEN_V2, @@ -281,7 +277,7 @@ class BankAccountVerificationLoaderV2Activity : BaseActivity(), EnachListener, } if (rejectionDetailsResponse.hasRejection.orFalse()) { val data = Bundle() - data.putParcelable(ErrorScreenV2Activity.REJECTION_DATA, rejectionDetailsResponse) + data.putParcelable(REJECTION_DATA, rejectionDetailsResponse) data.putBoolean( GetLoanActivity.IS_FOR_SECOND_LOAN_JOURNEY, intent.getBooleanExtra(GetLoanActivity.IS_FOR_SECOND_LOAN_JOURNEY, false) @@ -1080,7 +1076,7 @@ class BankAccountVerificationLoaderV2Activity : BaseActivity(), EnachListener, NaviDeepLinkNavigator.navigate( activity = this, ctaData = CtaData( url = NaviDeepLinkNavigator.LOAN_APPLICATION_V2.plus(DIVIDER) - .plus(GetLoanV2ViewHelper.BANK_DETAILS_AUTO_DEBIT_V2), + .plus(BANK_DETAILS_AUTO_DEBIT_V2), bundle = bundle ), finish = true diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/activities/SkipMandateV2Activity.kt b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/activities/SkipMandateV2Activity.kt index 746acfe5d8..57c6345251 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/activities/SkipMandateV2Activity.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/activities/SkipMandateV2Activity.kt @@ -33,9 +33,7 @@ import com.naviapp.personalloanrevamp.models.response.SkipMandateV2Response import com.naviapp.personalloanrevamp.useridentificationv2.fragments.InformationBottomSheet import com.naviapp.utils.LOAN_APPLICATION_ID import com.naviapp.utils.setMargin -import dagger.hilt.android.AndroidEntryPoint -@AndroidEntryPoint class SkipMandateV2Activity : BaseActivity(), FooterViewV2.FooterInteractionListener, NaviHeaderView.InteractionListener { diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/BankDetailsAutoDebitV2Fragment.kt b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/BankDetailsAutoDebitV2Fragment.kt index bd074999ac..c17d8c28e8 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/BankDetailsAutoDebitV2Fragment.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/BankDetailsAutoDebitV2Fragment.kt @@ -17,6 +17,7 @@ import android.view.View import android.view.ViewGroup import android.widget.ImageView import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.ColorRes import androidx.core.content.res.ResourcesCompat import androidx.core.view.isVisible import androidx.databinding.ViewDataBinding @@ -84,9 +85,6 @@ import com.naviapp.personalloanrevamp.customview.LoanOfferStickinessBottomSheetV import com.naviapp.personalloanrevamp.getloanRevamp.activities.BankAccountVerificationLoaderV2Activity import com.naviapp.personalloanrevamp.getloanRevamp.activities.EnachTutorialV2Activity import com.naviapp.personalloanrevamp.getloanRevamp.adapters.LoanDetailsV2WidgetAdapter -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.FreshLoanDetailsV2Fragment.Companion.ALPHA_INVISIBLE -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.FreshLoanDetailsV2Fragment.Companion.ALPHA_VISIBLE -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper import com.naviapp.personalloanrevamp.getloanRevamp.listeners.LoanDetailsV2WidgetAdapterListener import com.naviapp.personalloanrevamp.models.FLOW_MANDATE_POLLING import com.naviapp.personalloanrevamp.models.FLOW_MANDATE_SETUP @@ -98,11 +96,13 @@ import com.naviapp.utils.Constants.FLOW_TYPE import com.naviapp.utils.Constants.FLOW_TYPE_SMALL import com.naviapp.utils.Constants.LOAN_ACCOUNT_NUMBER import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY +import com.naviapp.utils.Constants.BANK_DETAILS_V2 import com.naviapp.utils.Constants.POST_DISBURSEMENT import com.naviapp.utils.Constants.REDIRECTED_FROM_HOME_SCREEN import com.naviapp.utils.Constants.REFILL_TOP_UP import com.naviapp.utils.Constants.SLASH import com.naviapp.utils.Constants.TRUE +import com.naviapp.utils.Constants.UPI_STATUS_V2 import com.naviapp.utils.Constants.UPI import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -127,7 +127,7 @@ class BankDetailsAutoDebitV2Fragment : private var loanType: String? = null private val ctaQueryMap = HashMap() private var headerListener: NaviHeaderView.InteractionListener? = null - private var updateUIListener: LoanDetailsV2Fragment.UpdateUiListener? = null + private var updateUIListener: UpdateUiListener? = null private var skipMandateSelectedOption: String? = null private var widgetIdProvider: WidgetIdProvider = WidgetIdProvider() private var forPostDisbursal: Boolean = false @@ -508,7 +508,7 @@ class BankDetailsAutoDebitV2Fragment : loanApplicationId ) listener?.navigateTo( - GetLoanV2ViewHelper.UPI_STATUS_V2, + UPI_STATUS_V2, bundle ) } @@ -1170,7 +1170,7 @@ class BankDetailsAutoDebitV2Fragment : private fun navigateToBankDetailsScreen(isPostDisbursal: String? = null) { listener?.navigateTo( - GetLoanV2ViewHelper.BANK_DETAILS_V2, + BANK_DETAILS_V2, Bundle().apply { putString(Constants.PERSONAL_LOAN_APPLICATION_ID, loanApplicationId) putString(Constants.SUB_REDIRECT, arguments?.getString(Constants.SUB_REDIRECT)) @@ -1217,7 +1217,7 @@ class BankDetailsAutoDebitV2Fragment : listener = context as? FragmentInteractionListener enachListener = context as? EnachListener headerListener = context as? NaviHeaderView.InteractionListener - updateUIListener = context as? LoanDetailsV2Fragment.UpdateUiListener + updateUIListener = context as? UpdateUiListener } override fun onDetach() { @@ -1361,6 +1361,8 @@ class BankDetailsAutoDebitV2Fragment : const val CHANGE_BANK = "CHANGE_BANK" const val FOOTER_NEXT_CLICK = "FOOTER_NEXT_CLICK" const val PL_RE_ENACH = "plReEnach" + const val ALPHA_VISIBLE = 1F + const val ALPHA_INVISIBLE = 0F fun newInstance(bundle: Bundle?): BankDetailsAutoDebitV2Fragment { return BankDetailsAutoDebitV2Fragment().apply { arguments = bundle } @@ -1411,4 +1413,11 @@ class BankDetailsAutoDebitV2Fragment : override fun onLoanAmountChange(loanAmount: Double, progressPercentage: Double) {} override fun onEmailChange(email: String?) {} + + interface UpdateUiListener { + fun changeHeaderBackGround(blackOut: Boolean) + fun changeHeaderBackgroundColor(@ColorRes color: Int) + fun showAutoPayAnimation() + fun setHeaderBackgroundColor(colorString: String) + } } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/BankDetailsV2Fragment.kt b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/BankDetailsV2Fragment.kt index a71b6a197c..8a3375dadb 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/BankDetailsV2Fragment.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/BankDetailsV2Fragment.kt @@ -69,12 +69,12 @@ import com.naviapp.personalloanrevamp.customview.LoanOfferStickinessBottomSheetV import com.naviapp.personalloanrevamp.getloanRevamp.activities.BankAccountVerificationLoaderV2Activity import com.naviapp.personalloanrevamp.getloanRevamp.customview.SearchV2Field import com.naviapp.personalloanrevamp.getloanRevamp.helper.BankDetailsV2Helper -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper.BANK_DETAILS_AUTO_DEBIT_V2 import com.naviapp.personalloanrevamp.useridentificationv2.fragments.InformationBottomSheet import com.naviapp.utils.* import com.naviapp.utils.Constants import com.naviapp.utils.Constants.ACTION import com.naviapp.utils.Constants.BANK_ACCOUNT_NUMBER +import com.naviapp.utils.Constants.BANK_DETAILS_AUTO_DEBIT_V2 import com.naviapp.utils.Constants.BANK_IFSC import com.naviapp.utils.Constants.BANK_NAME_SELECTED import com.naviapp.utils.Constants.IFSC_CODE_LENGTH @@ -93,10 +93,7 @@ import com.naviapp.utils.Constants.SLASH import com.naviapp.utils.Constants.SUB_REDIRECT import com.naviapp.utils.Constants.TRUE import com.naviapp.utils.Constants.ZERO -import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject -@AndroidEntryPoint class BankDetailsV2Fragment : BaseFragment(), View.OnClickListener, @@ -107,8 +104,7 @@ class BankDetailsV2Fragment : FooterViewV2.FooterInteractionListener, BackListener { - @Inject - lateinit var lottieRemoteHelper: LottieRemoteHelper + private lateinit var lottieRemoteHelper: LottieRemoteHelper private lateinit var binding: BankDetailsV2FragmentBinding private val viewModel by lazy { ViewModelProvider(this)[BankDetailsVM::class.java] } @@ -142,6 +138,7 @@ class BankDetailsV2Fragment : savedInstanceState: Bundle? ): View { binding = BankDetailsV2FragmentBinding.inflate(inflater, container, false) + lottieRemoteHelper = LottieRemoteHelper(requireContext()) initQueryMapFromCtaParameters() initError() initUi() diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/SelectBankV2Fragment.kt b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/SelectBankV2Fragment.kt index 2b45c8c165..9aa6c8dbaf 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/SelectBankV2Fragment.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/SelectBankV2Fragment.kt @@ -27,9 +27,7 @@ import com.naviapp.personalloanrevamp.getloanRevamp.customview.SearchV2Field import com.naviapp.personalloanrevamp.getloanRevamp.helper.BankDetailsV2Helper import com.naviapp.utils.Constants.FLOW_TYPE import com.naviapp.utils.IconUtils -import dagger.hilt.android.AndroidEntryPoint -@AndroidEntryPoint class SelectBankV2Fragment : BaseBottomSheet(), SearchV2Field.SearchFieldListener, OnSelectBankListener { private lateinit var binding: SelectBankV2LayoutBinding diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/SelectBankV3Fragment.kt b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/SelectBankV3Fragment.kt index edfce34314..d1c3573296 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/SelectBankV3Fragment.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/SelectBankV3Fragment.kt @@ -46,16 +46,14 @@ import com.naviapp.personalloanrevamp.getloanRevamp.fragments.SelectBankV2Fragme import com.naviapp.personalloanrevamp.getloanRevamp.fragments.SelectBankV2Fragment.Companion.BANK_TYPE import com.naviapp.personalloanrevamp.getloanRevamp.fragments.SelectBankV2Fragment.Companion.SELECTED_BANK import com.naviapp.personalloanrevamp.getloanRevamp.helper.BankDetailsV2Helper -import com.naviapp.personalloanrevamp.intermediatev2.helper.IntermediateV2Helper import com.naviapp.utils.Constants import com.naviapp.utils.Constants.ACTION +import com.naviapp.utils.Constants.BANK_STATEMENT_VERIFICATION_V2 import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY import com.naviapp.utils.EMPTY import com.naviapp.utils.IconUtils -import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch -@AndroidEntryPoint class SelectBankV3Fragment: BaseFragment(), SearchV2Field.SearchFieldListener, OnSelectBankListener, BackListener, WidgetCallback, InfoBottomSheetListener { @@ -230,7 +228,7 @@ class SelectBankV3Fragment: } } setDefaultHeaderProperties() - fragmentInterchangeListener?.navigateToNextScreen(IntermediateV2Helper.BANK_STATEMENT_VERIFICATION_V2, arguments ?: Bundle()) + fragmentInterchangeListener?.navigateToNextScreen(BANK_STATEMENT_VERIFICATION_V2, arguments ?: Bundle()) } override fun onClickUnserviceableBank() { @@ -264,7 +262,7 @@ class SelectBankV3Fragment: override fun onBackPressed() { setDefaultHeaderProperties() - fragmentInterchangeListener?.navigateToNextScreen(IntermediateV2Helper.BANK_STATEMENT_VERIFICATION_V2, arguments ?: Bundle()) + fragmentInterchangeListener?.navigateToNextScreen(BANK_STATEMENT_VERIFICATION_V2, arguments ?: Bundle()) } override fun onPrimaryActionClick(ctaData: CtaData) { diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/repository/LoanDetailsV2Repository.kt b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/repository/LoanDetailsV2Repository.kt index 7c3f0ca458..3f4f045a21 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/repository/LoanDetailsV2Repository.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/repository/LoanDetailsV2Repository.kt @@ -14,16 +14,13 @@ import com.naviapp.models.request.LoanFeeDetailsRequest import com.naviapp.models.request.LoanRequest import com.naviapp.models.response.OfferId import com.naviapp.network.retrofit.ResponseCallback -import com.naviapp.network.retrofit.RetrofitService import com.naviapp.personalloanrevamp.models.response.FeeDetailsV2Response import com.naviapp.personalloanrevamp.models.response.LoanDetailsV2Response import com.naviapp.utils.cdnRetrofitService import com.naviapp.utils.retrofitService import retrofit2.Response -import javax.inject.Inject -class LoanDetailsV2Repository @Inject constructor(private val retrofitService: RetrofitService) : - ResponseCallback() { +class LoanDetailsV2Repository : ResponseCallback() { suspend fun fetchLoanDetails(offerId: String): RepoResult { return apiResponseCallback(retrofitService().fetchLoanDetailsV2Response(offerId)) diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/repository/LoanEditorRepository.kt b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/repository/LoanEditorRepository.kt index 71d3b84e31..a2e5d575ab 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/repository/LoanEditorRepository.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/repository/LoanEditorRepository.kt @@ -1,25 +1,23 @@ -package com.naviapp.personalloanrevamp.getloanRevamp.repository /* * - * * Copyright © 2022 by Navi Technologies Private Limited + * * Copyright © 2023 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ +package com.naviapp.personalloanrevamp.getloanRevamp.repository + import com.navi.common.network.models.RepoResult import com.naviapp.models.request.LoanFeeDetailsRequest import com.naviapp.models.request.LoanRequest import com.naviapp.network.retrofit.ResponseCallback -import com.naviapp.network.retrofit.RetrofitService import com.naviapp.personalloanrevamp.models.response.LoanDetailsV2Response import com.naviapp.utils.retrofitService -import javax.inject.Inject -class LoanEditorRepository @Inject constructor(private val retrofitService: RetrofitService) : - ResponseCallback() { +class LoanEditorRepository : ResponseCallback() { suspend fun fetchLoanEditorDetails( - data : LoanFeeDetailsRequest + data: LoanFeeDetailsRequest ): RepoResult { return apiResponseCallback(retrofitService().fetchLoanEditorResponse(data)) } @@ -29,4 +27,4 @@ class LoanEditorRepository @Inject constructor(private val retrofitService: Retr suspend fun checkApiPollStatus(requestId: String) = apiResponseCallback(retrofitService().fetchAsyncRequestData(requestId)) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/repository/LoanOfferUpgradeV3Repository.kt b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/repository/LoanOfferUpgradeV3Repository.kt index 4a1049d03f..879144dbce 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/repository/LoanOfferUpgradeV3Repository.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/repository/LoanOfferUpgradeV3Repository.kt @@ -1,13 +1,17 @@ +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.naviapp.personalloanrevamp.getloanRevamp.repository import com.naviapp.network.retrofit.ResponseCallback -import com.naviapp.network.retrofit.RetrofitService import com.naviapp.utils.retrofitService -import javax.inject.Inject -class LoanOfferUpgradeV3Repository @Inject constructor(private val retrofitService: RetrofitService) : - ResponseCallback() { +class LoanOfferUpgradeV3Repository : ResponseCallback() { suspend fun fetchOfferUpgradeV3Details(queryMap: HashMap) = apiResponseCallback(retrofitService().fetchOfferUpgradeV3Details(queryMap)) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/FreshLoanDetailsV2FragmentVM.kt b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/FreshLoanDetailsV2FragmentVM.kt index 51ae91515b..43abbb80f0 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/FreshLoanDetailsV2FragmentVM.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/FreshLoanDetailsV2FragmentVM.kt @@ -13,7 +13,6 @@ import androidx.lifecycle.viewModelScope import com.navi.base.sharedpref.PreferenceManager import com.navi.common.firebasedb.LOAN_APPLY import com.navi.common.firebasedb.OFFER_GENERATE -import com.navi.common.model.ModuleName import com.navi.common.model.UploadDataAsyncResponse import com.navi.common.network.models.ErrorMetaData import com.navi.common.network.models.GenericResponseState @@ -35,16 +34,13 @@ import com.naviapp.personalloanrevamp.models.response.FeeDetailsV2Response import com.naviapp.personalloanrevamp.models.response.RPDDetailsResponse import com.naviapp.personalloanrevamp.models.response.RPDNextCta import com.naviapp.utils.LOAN_APPLICATION_ID -import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -import javax.inject.Inject -@HiltViewModel -class FreshLoanDetailsV2FragmentVM -@Inject -constructor(private val repository: LoanDetailsV2Repository) : BaseVM() { +class FreshLoanDetailsV2FragmentVM( + private val repository: LoanDetailsV2Repository = LoanDetailsV2Repository() +) : BaseVM() { private val _feeDetailsV2Response = MutableLiveData() val feeDetailsV2Response: LiveData diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/GetLoanV2SharedVM.kt b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/GetLoanV2SharedVM.kt index 84e5b33aea..00ada9b665 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/GetLoanV2SharedVM.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/GetLoanV2SharedVM.kt @@ -1,26 +1,17 @@ + /* * - * * Copyright © 2023 by Navi Technologies Limited + * * Copyright © 2022-2023 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ package com.naviapp.personalloanrevamp.getloanRevamp.viewmodels -/* - * - * * Copyright © 2022 by Navi Technologies Private Limited - * * All rights reserved. Strictly confidential - * - */ import androidx.lifecycle.MutableLiveData import com.navi.common.viewmodel.BaseVM -import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject - -@HiltViewModel -class GetLoanV2SharedVM @Inject constructor() : BaseVM() { +class GetLoanV2SharedVM : BaseVM() { val selectedEmiDateInYYYYMMDD = MutableLiveData() var helpButtonClickstreamName: String? = null diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/LoanDetailsV2FragmentVM.kt b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/LoanDetailsV2FragmentVM.kt index 38d3f554ad..faef366ca0 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/LoanDetailsV2FragmentVM.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/LoanDetailsV2FragmentVM.kt @@ -36,14 +36,13 @@ import com.naviapp.personalloanrevamp.getloanRevamp.repository.LoanDetailsV2Repo import com.naviapp.personalloanrevamp.models.* import com.naviapp.personalloanrevamp.models.response.LoanDetailsV2Response import com.naviapp.utils.LOAN_APPLICATION_ID -import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -import javax.inject.Inject -@HiltViewModel -class LoanDetailsV2FragmentVM @Inject constructor(private val repository: LoanDetailsV2Repository) : BaseVM() { +class LoanDetailsV2FragmentVM( + private val repository: LoanDetailsV2Repository = LoanDetailsV2Repository() +) : BaseVM() { private val _loanDetailsV2Response = MutableLiveData() val loanDetailsV2Response: LiveData diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/LoanEditorVM.kt b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/LoanEditorVM.kt index 2903fafca4..911fe2d5da 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/LoanEditorVM.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/LoanEditorVM.kt @@ -6,12 +6,6 @@ */ package com.naviapp.personalloanrevamp.getloanRevamp.viewmodels -/* - * - * * Copyright © 2022 by Navi Technologies Private Limited - * * All rights reserved. Strictly confidential - * - */ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData @@ -26,13 +20,11 @@ import com.naviapp.models.response.UploadDataWithCtaAsyncResponse import com.naviapp.personalloanrevamp.getloanRevamp.repository.LoanEditorRepository import com.naviapp.personalloanrevamp.models.FLOW_LOAN_EDITOR import com.naviapp.personalloanrevamp.models.response.LoanDetailsV2Response -import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch -import javax.inject.Inject -@HiltViewModel -class LoanEditorVM @Inject constructor(private val repository: LoanEditorRepository) : - BaseVM() { +class LoanEditorVM( + private val repository: LoanEditorRepository = LoanEditorRepository() +) : BaseVM() { val isAutoDebitSetUp = MutableLiveData(false) diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/LoanOfferUpgradeV3FragmentVM.kt b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/LoanOfferUpgradeV3FragmentVM.kt index a26828c04c..c3dca981d7 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/LoanOfferUpgradeV3FragmentVM.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/LoanOfferUpgradeV3FragmentVM.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.naviapp.personalloanrevamp.getloanRevamp.viewmodels import androidx.lifecycle.viewModelScope @@ -6,19 +13,15 @@ import com.navi.common.utils.isValidResponse import com.navi.common.viewmodel.BaseVM import com.naviapp.network.ApiErrorTagType import com.naviapp.personalloanrevamp.getloanRevamp.repository.LoanOfferUpgradeV3Repository -import com.naviapp.personalloanrevamp.models.FLOW_FRESH_LOAN_DETAILS import com.naviapp.personalloanrevamp.models.FLOW_OFFER_UPGRADE import com.naviapp.personalloanrevamp.states.OfferUpgradeResponseState -import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -import javax.inject.Inject -@HiltViewModel -class LoanOfferUpgradeV3FragmentVM -@Inject -constructor(private val repository: LoanOfferUpgradeV3Repository) : BaseVM() { +class LoanOfferUpgradeV3FragmentVM( + private val repository: LoanOfferUpgradeV3Repository = LoanOfferUpgradeV3Repository() +) : BaseVM() { private val _offerUpgradeV3ResponseState = MutableStateFlow( OfferUpgradeResponseState.Init) @@ -42,4 +45,4 @@ constructor(private val repository: LoanOfferUpgradeV3Repository) : BaseVM() { } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/SkipMandateV2VM.kt b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/SkipMandateV2VM.kt index 06111745af..322cfa69b5 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/SkipMandateV2VM.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/viewmodels/SkipMandateV2VM.kt @@ -17,12 +17,11 @@ import com.naviapp.models.response.LoanBasicDetailsResponse import com.naviapp.personalloan.getloan.repositories.SkipMandateRepository import com.naviapp.personalloanrevamp.models.FLOW_SKIP_MANDATE import com.naviapp.personalloanrevamp.models.response.SkipMandateV2Response -import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch -import javax.inject.Inject -@HiltViewModel -class SkipMandateV2VM @Inject constructor(private val repository: SkipMandateRepository) : BaseVM() { +class SkipMandateV2VM( + private val repository: SkipMandateRepository = SkipMandateRepository() +) : BaseVM() { private val _skipMandateResponse = MutableLiveData() val skipMandateResponse: LiveData diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2/helper/IntermediateV2Helper.kt b/app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2/helper/IntermediateV2Helper.kt deleted file mode 100644 index 1db86cd4bd..0000000000 --- a/app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2/helper/IntermediateV2Helper.kt +++ /dev/null @@ -1,67 +0,0 @@ -/* - * - * * Copyright © 2022-2023 by Navi Technologies Limited - * * All rights reserved. Strictly confidential - * - */ - -package com.naviapp.personalloanrevamp.intermediatev2.helper - -import android.os.Bundle -import androidx.fragment.app.Fragment -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.GstVerificationPasswordV2Fragment -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.GstVerificationV2Fragment -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.SelectBankV3Fragment -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.TopupLoanIntroV2Fragment -import com.naviapp.personalloanrevamp.intermediatev2.fragments.BankStatementV2Fragment -import com.naviapp.personalloanrevamp.intermediatev2.fragments.TelcoOtpV2Fragment -import com.naviapp.personalloanrevamp.useridentificationv2.fragments.EmploymentOtpVerificationFragment -import com.naviapp.personalloanrevamp.useridentificationv2.fragments.EmploymentVerificationV2Fragment - -object IntermediateV2Helper { - - private const val GST_VERIFICATION_V2 = "GST_VERIFICATION_V2" - private const val GST_VERIFICATION_PASSWORD_V2 = "GST_VERIFICATION_PASSWORD_V2" - private const val TELCO_OTP_VERIFICATION_V2 = "TELCO_OTP_VERIFICATION_V2" - private const val SELECT_BANK_V3 = "SELECT_BANK_V3_SCREEN" - const val BANK_STATEMENT_VERIFICATION_V2 = "BANK_STATEMENT_VERIFICATION_V2" - const val EPFO_V2 = "EPFO_V2" - const val EPFO_OTP_VERIFICATION_V2 = "EPFO_OTP_VERIFICATION_V2" - const val TOP_UP_INTRO_V2 = "TOP_UP_INTRO" - - fun getTag(screen: String): String { - return when (screen) { - GST_VERIFICATION_V2 -> GstVerificationV2Fragment.TAG - GST_VERIFICATION_PASSWORD_V2 -> GstVerificationPasswordV2Fragment.TAG - TELCO_OTP_VERIFICATION_V2 -> TelcoOtpV2Fragment.TAG - BANK_STATEMENT_VERIFICATION_V2 -> BankStatementV2Fragment.TAG - EPFO_V2 -> EmploymentVerificationV2Fragment.TAG - EPFO_OTP_VERIFICATION_V2 -> EmploymentOtpVerificationFragment.TAG - TOP_UP_INTRO_V2 -> TopupLoanIntroV2Fragment.TAG - SELECT_BANK_V3 -> SelectBankV3Fragment.TAG - else -> BankStatementV2Fragment.TAG - } - } - - fun getFragment(screen: String, bundle: Bundle? = null): Fragment { - return when (screen) { - GST_VERIFICATION_V2 -> GstVerificationV2Fragment.getInstance(bundle) - GST_VERIFICATION_PASSWORD_V2 -> GstVerificationPasswordV2Fragment.getInstance(bundle) - TELCO_OTP_VERIFICATION_V2 -> TelcoOtpV2Fragment.getInstance(bundle) - BANK_STATEMENT_VERIFICATION_V2 -> BankStatementV2Fragment.getInstance(bundle) - EPFO_V2 -> EmploymentVerificationV2Fragment.getInstance(bundle) - EPFO_OTP_VERIFICATION_V2 -> EmploymentOtpVerificationFragment.getInstance(bundle) - TOP_UP_INTRO_V2 -> TopupLoanIntroV2Fragment.getInstance(bundle) - SELECT_BANK_V3 -> SelectBankV3Fragment.getInstance(bundle) - else -> BankStatementV2Fragment.getInstance(bundle) - } - } - - fun getBackButtonEventName(currentScreen: String): String { - return when (currentScreen) { - GST_VERIFICATION_V2 -> "PL_Gst_Verification_Back_Clicked" - GST_VERIFICATION_PASSWORD_V2 -> "PL_Gst_Verification_Password_Back_Clicked" - else -> "" - } - } -} diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/models/CtaType.kt b/app/src/main/java/com/naviapp/personalloanrevamp/models/CtaType.kt new file mode 100644 index 0000000000..2fadbb353e --- /dev/null +++ b/app/src/main/java/com/naviapp/personalloanrevamp/models/CtaType.kt @@ -0,0 +1,33 @@ +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.naviapp.personalloanrevamp.models + +enum class CtaType(val value: String) { + CHANGE_EMI_DATE("CHANGE_EMI_DATE"), + TENURE_SELECTED_TYPE("TENURE_SELECTED_TYPE"), + SLIDER_SELECTED_TYPE("SLIDER_SELECTED_TYPE"), + TENURE_SELECTED_VALUE("TENURE_SELECTED_VALUE"), + MONTHLY_EMI_VALUE("MONTHLY_EMI_VALUE"), + CUSTOMISE_TENURE("CUSTOMISE_TENURE"), + TENURE_SLIDER_CHANGE("TENURE_SLIDER_CHANGE"), + VIEW_EMI_CALENDAR("VIEW_EMI_CALENDAR"), + KNOW_MORE("KNOW_MORE"), + SLIDER_END_TYPE("SLIDER_END_TYPE"), + TENURE_CLICKED_TYPE("TENURE_CLICKED_TYPE"), + TENURE_DEFAULT_SELECTED("TENURE_DEFAULT_SELECTED"), + INFO_ICON_CLICK("INFO_ICON_CLICK"), + FOOTER_NEXT_PRESS("FOOTER_NEXT_PRESS"), + FOOTER_DESCRIPTION_PRESS("FOOTER_DESCRIPTION_PRESS"), + API_CALL_UPI_TOKEN("API_CALL_UPI_TOKEN"), + LAUNCH_UPI_BOTTOM_SHEET("LAUNCH_UPI_BOTTOM_SHEET"), + FAILURE_BOTTOM_SHEET("FAILURE_BOTTOM_SHEET"), + BANK_DETAILS_AUTO_DEBIT_V2("BANK_DETAILS_AUTO_DEBIT_V2"), + APR_CLICK("APR_BOTTOM_SHEET"), + CLOSE_SNAPPED_HEADER("CLOSE_SNAPPED_HEADER"), + LOAN_AMOUNT_SLIDER("LOAN_AMOUNT_SLIDER") +} diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/models/response/PersonalLoanTrackerResponse.kt b/app/src/main/java/com/naviapp/personalloanrevamp/models/response/PersonalLoanTrackerResponse.kt index cfbda98326..341e1d5756 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/models/response/PersonalLoanTrackerResponse.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/models/response/PersonalLoanTrackerResponse.kt @@ -9,8 +9,9 @@ package com.naviapp.personalloanrevamp.models.response import android.os.Parcelable import com.google.gson.annotations.SerializedName -import com.navi.naviwidgets.models.response.RewardsInfoWidget +import com.navi.design.textview.model.TextWithStyle import com.navi.naviwidgets.models.response.Footer +import com.navi.naviwidgets.models.response.RewardsInfoWidget import com.naviapp.models.response.Header import kotlinx.parcelize.Parcelize @@ -23,7 +24,8 @@ data class PersonalLoanTrackerResponse( data class PersonalLoanTrackerContent( @SerializedName("stepTitle") val stepTitle: String? = null, @SerializedName("steps") val steps: List? = null, - @SerializedName("rewardInfo") val rewardsInfo: RewardsInfoWidget? = null + @SerializedName("rewardInfo") val rewardsInfo: RewardsInfoWidget? = null, + @SerializedName("disclaimer") val disclaimer: TextWithStyle? = null ) data class PersonalLoanTrackerStep( diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/activities/PermissionV2Activity.kt b/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/activities/PermissionV2Activity.kt index 315cc8d1d6..5fdefd3294 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/activities/PermissionV2Activity.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/activities/PermissionV2Activity.kt @@ -6,12 +6,6 @@ */ package com.naviapp.personalloanrevamp.useridentificationv2.activities -/* - * - * * Copyright © 2022 by Navi Technologies Private Limited - * * All rights reserved. Strictly confidential - * - */ import android.Manifest import android.content.Intent @@ -22,9 +16,13 @@ import android.provider.Settings import android.text.TextUtils import android.view.View import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager +import androidx.work.OneTimeWorkRequestBuilder +import androidx.work.WorkManager +import com.moengage.core.internal.utils.isNullOrEmpty import com.navi.analytics.utils.NaviTrackEvent import com.navi.base.model.CtaData import com.navi.base.model.LineItem @@ -39,15 +37,16 @@ import com.navi.common.managers.PermissionsManager import com.navi.common.model.ModuleNameV2 import com.navi.common.model.RequestConfig import com.navi.common.utils.* +import com.navi.naviwidgets.extensions.setTextFieldData +import com.navi.naviwidgets.models.response.Footer import com.naviapp.BuildConfig import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics -import com.naviapp.common.customview.FooterViewV2 import com.naviapp.common.customview.NaviHeaderView import com.naviapp.common.navigator.NaviDeepLinkNavigator -import com.naviapp.common.navigator.ScreenNavigator import com.naviapp.databinding.ActivityPermissionV2Binding import com.naviapp.devicedata.finoramic.FinoramicHelper +import com.naviapp.manager.UserDataUploadManager import com.naviapp.models.FeedbackPageType import com.naviapp.models.RedirectPageStatus import com.naviapp.network.ApiErrorTagType @@ -55,9 +54,7 @@ import com.naviapp.permission.utils.getAlternatePermissionTilesV2 import com.naviapp.permission.utils.hasPermissions import com.naviapp.permission.viewmodel.PermissionViewModel import com.naviapp.personalloan.getloan.common.fragment.CustomerSupportFragment -import com.naviapp.personalloanrevamp.models.ImportantNote import com.naviapp.personalloanrevamp.useridentificationv2.adapter.PermissionV2Adapter -import com.naviapp.personalloanrevamp.useridentificationv2.fragments.InformationBottomSheet import com.naviapp.receiver.WifiTrackerBaseActivity import com.naviapp.utils.Constants import com.naviapp.utils.Constants.PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS @@ -66,7 +63,6 @@ import com.naviapp.utils.IntentConstants class PermissionV2Activity : WifiTrackerBaseActivity(), - FooterViewV2.FooterInteractionListener, View.OnClickListener, NaviHeaderView.InteractionListener { private lateinit var binding: ActivityPermissionV2Binding @@ -83,11 +79,15 @@ class PermissionV2Activity : screenName ) } + private val dynamicDeliveryEventTracker by lazy { + NaviAnalytics.naviAnalytics.DynamicDelivery(screenName) + } private val naviLocationManager = NaviLocationManager() private var finoramicHelper: FinoramicHelper? = null private val onPollingEnd = { handleTimeOutError(ApiErrorTagType.LOCATION_UPLOAD) } private val helpEventTracker by lazy { NaviAnalytics.naviAnalytics.Faq() } private var panVerificationType: String? = null + private var isFirstTime = true override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -123,7 +123,7 @@ class PermissionV2Activity : private fun fetchPermissionDetails() { showLoader() - permissionViewModel.fetchPermissionDetails() + permissionViewModel.fetchPermissionDetailsV1() } private fun initObservers() { @@ -131,15 +131,23 @@ class PermissionV2Activity : hideLoader() naviAnalyticsEventTracker.onPageLands() response?.let { permissionDetailsResponse -> + permissionDetailsResponse.content?.modulesToInstall?.let { modulesToInstall -> + checkForModulesInstall(modulesToInstall) + } setProperties( - permissionDetailsResponse.header?.title.orEmpty(), - permissionDetailsResponse.header?.leftIconCode, - permissionDetailsResponse.header?.infoCta, - null, - true + title = permissionDetailsResponse.header?.title.orEmpty(), + leftIconCode = permissionDetailsResponse.header?.leftIconCode, + infoCta = permissionDetailsResponse.header?.infoCta, + hideHelp = !(permissionDetailsResponse.header?.enableHelp ?: false), + hideLeftIcon = isNullOrEmpty(permissionDetailsResponse.header?.leftIconCode), + colorInt = null, + hideDivider = true ) + setLeftIconVisibility(!isNullOrEmpty(permissionDetailsResponse.header?.leftIconCode)) binding.headerDescriptionView.setProperties(permissionDetailsResponse.header) - binding.footerView.setProperties(permissionDetailsResponse.footer, listener = this) + permissionDetailsResponse.footer?.let { footerData -> + setFooterData(footerData) + } response.content?.permissionList?.forEachIndexed { index, permissionTile -> permissionTiles.getOrNull(index)?.icon = permissionTile.icon ?: permissionTiles.getOrNull(index)?.icon @@ -149,7 +157,6 @@ class PermissionV2Activity : description = permissionTile.description } } - permissionAdapter.updatePermissionTiles(permissionTiles) permissionDetailsResponse.content?.finoramicData?.let { finoramicData -> if (finoramicData.enabled.orFalse()) { finoramicHelper = FinoramicHelper() @@ -157,16 +164,14 @@ class PermissionV2Activity : } } } + if (permissionsManager.hasPermissions()) { - permissionTiles.forEach { permissionTile -> - permissionTile.qualifier?.let { - permissionTile.permissionState = PackageManager.PERMISSION_GRANTED - } - } permissionAdapter.updatePermissionTiles(permissionTiles) onGrantPermissions() + } else { + binding.permissionDeniedLayoutV2.visibility = View.GONE } - enableDataSafetyHeader() + permissionAdapter.updatePermissionTiles(permissionTiles) panVerificationType = getPanVerificationType(response?.footer?.nextCta?.parameters) } @@ -190,6 +195,18 @@ class PermissionV2Activity : } } + private fun checkForModulesInstall(modulesToInstall: List) { + if (modulesToInstall.isNotEmpty()) { + dynamicDeliveryEventTracker.subModuleAutomaticDownload() + installDynamicModules(modulesToInstall) + } + } + + private fun setFooterData(footerData: Footer) { + binding.footerView.title.setTextFieldData(footerData.topInfoTitle) + binding.footerView.footerButton.text = footerData.nextCta?.title ?: EMPTY + } + private fun getPanVerificationType(parameters: List?): String? { parameters?.forEach { if (it.key == PAN_VERIFICATION_TYPE) { @@ -259,12 +276,10 @@ class PermissionV2Activity : when { TextUtils.equals(status, FirebaseStatusType.SUCCESS) -> { deInitializeAsyncListeners(baseFirebaseDataHelper, baseApiPollScheduler) - if (panVerificationType != null && panVerificationType.equals(NEW_PAN_VERIFICATION)) { - hideLoader() - navigateToNextScreen() - } else { - fetchPanVerification() - } + hideLoader() + baseApiPollScheduler?.stopApiPoll() + baseFirebaseDataHelper?.clear() + navigateToNextScreen() } TextUtils.equals(status, FirebaseStatusType.FAILURE) -> { hideLoader() @@ -278,6 +293,7 @@ class PermissionV2Activity : } private fun initUi() { + setLeftIconVisibility(false) binding.permissionTileRvv.layoutManager = LinearLayoutManager(this) binding.permissionTileRvv.adapter = permissionAdapter binding.permissionTileRvv.addItemDecoration( @@ -291,12 +307,21 @@ class PermissionV2Activity : naviAnalyticsEventTracker.onAllPermissionMandatoryClicked() openNativePermissionPage() } - binding.importantNoteBinder = ImportantNote(IMPORTANT_NOTE_TITLE, IMPORTANT_NOTE_DETAILS) binding.headerView.setOnInteractionListener(this) + binding.footerView.footerButton.setOnClickListener { + onFooterNextCtaClick() + } } - private fun enableDataSafetyHeader() { - binding.footerView.showDataSafetyHeader() + private fun onFooterNextCtaClick() { + naviAnalyticsEventTracker.onAllowClicked() + NaviTrackEvent.setStartTs(screenName) + if (binding.permissionDeniedLayoutV2.visibility == View.VISIBLE) { + openNativePermissionPage() + } else { + permissionRequested = true + permissionsManager.requestPermissions() + } } private fun openNativePermissionPage() { @@ -325,6 +350,22 @@ class PermissionV2Activity : } } + private fun updatePermissionState() { + permissionTiles.forEach { permissionTile -> + permissionTile.qualifier?.let { + if (permissionsManager.hasPermissionsAny(it.toTypedArray())) { + permissionTile.permissionState = PackageManager.PERMISSION_GRANTED + } else { + permissionTile.permissionState = PackageManager.PERMISSION_DENIED + } + } + } + if (permissionsManager.hasPermissions()) { + binding.permissionDeniedLayoutV2.visibility = View.GONE + } + permissionAdapter.updatePermissionTiles(permissionTiles) + } + override fun onRequestPermissionsResult( requestCode: Int, permissions: Array, @@ -398,11 +439,19 @@ class PermissionV2Activity : if (isDontAskAgainClicked(permissions[index], grantResults[index])) { binding.permissionDeniedLayoutV2.visibility = View.VISIBLE } - } else permissionTile.permissionState = PackageManager.PERMISSION_GRANTED + } } } } + override fun onResume() { + super.onResume() + if (!isFirstTime) { + updatePermissionState() + } + isFirstTime = false + } + private fun sendAnalyticsEventFroPermission( permissions: Array, grantResults: IntArray @@ -441,10 +490,26 @@ class PermissionV2Activity : private fun onGrantPermissions() { showLoader() + uploadUserData() sendSMSDataToFinoramic() sendLocation() } + private fun uploadUserData() { + val uploadSms = + ContextCompat.checkSelfPermission(applicationContext, Manifest.permission.READ_SMS) == + PackageManager.PERMISSION_GRANTED + val uploadContacts = + ContextCompat.checkSelfPermission( + applicationContext, + Manifest.permission.READ_CONTACTS + ) == PackageManager.PERMISSION_GRANTED + if (uploadSms && uploadContacts) { + val manager = OneTimeWorkRequestBuilder().build() + WorkManager.getInstance(applicationContext).enqueue(manager) + } + } + private fun sendSMSDataToFinoramic() { try { finoramicHelper?.sendSms(applicationContext) @@ -477,7 +542,7 @@ class PermissionV2Activity : override fun onBackPressed() { naviAnalyticsEventTracker.onBackButtonClicked(screenName, isSystemBackPressed = true) - launchHome() + finish() } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { @@ -499,11 +564,15 @@ class PermissionV2Activity : override fun onClick(v: View?) { when (v?.id) { R.id.back_iv -> { - launchHome() + finish() } } } + override fun setLeftIconVisibility(visible: Boolean) { + binding.headerView.setLeftIconVisibility(visible) + } + override fun setProperties( title: String, leftIconCode: String?, @@ -535,47 +604,10 @@ class PermissionV2Activity : } override fun onBackButtonPressed() { - naviAnalyticsEventTracker.onCrossButtonClicked(screenName) - launchHome() - } - - private fun launchHome() { - if (isTaskRoot) { - ScreenNavigator.instance.startActivityWithNoActivityStack( - this, - ScreenNavigator.DASHBOARD_SCREEN - ) - } else { - finish() - } - } - - override fun onFooterBackPressed(backCta: CtaData?) { - naviAnalyticsEventTracker.onBackButtonClicked(screenName) - permissionViewModel.permissionDetailsResponse.value?.footer?.backCta?.let { - NaviDeepLinkNavigator.navigate(this, it, true) - } - } - - override fun onKnowMoreClicked(cta: CtaData?) { - naviAnalyticsEventTracker.onKnowMoreClicked() - permissionViewModel.permissionDetailsResponse.value - ?.content - ?.dataSafetyBottomSheet - ?.let { - val infoBottomSheet = InformationBottomSheet.getInstance(it) - safelyShowBottomSheet(infoBottomSheet, InformationBottomSheet.TAG) - } - } - - override fun onFooterNextPressed(nextCta: CtaData?) { - naviAnalyticsEventTracker.onAllowClicked() - NaviTrackEvent.setStartTs(screenName) - if (binding.permissionDeniedLayoutV2.visibility == View.VISIBLE) { - openNativePermissionPage() - } else { - permissionRequested = true - permissionsManager.requestPermissions() + permissionViewModel.permissionDetailsResponse.value?.header?.actionData?.url?.let { + naviAnalyticsEventTracker.onCrossButtonClicked(screenName) + TemporaryStorageHelper.isPermissionSkipFlow = true + NaviDeepLinkNavigator.navigate(this, CtaData(url = it), true) } } @@ -588,8 +620,6 @@ class PermissionV2Activity : companion object { private const val OK = "Ok" private const val NO = "No" - const val IMPORTANT_NOTE_TITLE = "Important Note:" - const val IMPORTANT_NOTE_DETAILS = "All permissions are mandatory to complete the process" const val TAG = "PERMISSION_ACTIVITY_V2" const val PAN_VERIFICATION_TYPE = "PAN_VERIFICATION_TYPE" const val NEW_PAN_VERIFICATION = "NEW_PAN_VERIFICATION" diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/helper/LoanSummaryV2Helper.kt b/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/helper/LoanSummaryV2Helper.kt deleted file mode 100644 index a6e236d4e3..0000000000 --- a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/helper/LoanSummaryV2Helper.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.naviapp.personalloanrevamp.useridentificationv2.helper - -import android.content.Context -import com.navi.naviwidgets.widgets.labledtextinput.InputTextWidgetMeta -import com.navi.naviwidgets.widgets.labledtextinput.LabeledTextInputWidgetModelV2 -import com.navi.naviwidgets.widgets.labledtextinput.TextInputWidgetData -import com.naviapp.R - -object LoanSummaryV2Helper { - - fun getEmailWidget(context: Context): LabeledTextInputWidgetModelV2 { - return LabeledTextInputWidgetModelV2( - widgetData = TextInputWidgetData( - inputTextData = InputTextWidgetMeta( - hint = context.getString(R.string.enter_your_email_id), - ) - ).apply { - title = context.getString(R.string.email_id) - titleInfo = context.getString(R.string.for_loan_agreement) - } - ) - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/repository/PersonalLoanTrackerRepository.kt b/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/repository/PersonalLoanTrackerRepository.kt index 3d9862039f..d37260b562 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/repository/PersonalLoanTrackerRepository.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/repository/PersonalLoanTrackerRepository.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2022 by Navi Technologies Limited + * * Copyright © 2022-2023 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -9,20 +9,11 @@ package com.naviapp.personalloanrevamp.useridentificationv2.repository import com.navi.common.network.models.RepoResult import com.naviapp.network.retrofit.ResponseCallback -import com.naviapp.network.retrofit.RetrofitService import com.naviapp.personalloanrevamp.models.response.PersonalLoanTrackerResponse import com.naviapp.utils.retrofitService -import javax.inject.Inject -class PersonalLoanTrackerRepository -@Inject -constructor(private val retrofitService: RetrofitService) : ResponseCallback() { +class PersonalLoanTrackerRepository : ResponseCallback() { suspend fun fetchPersonalLoanStatusTracker(): RepoResult = apiResponseCallback(retrofitService().fetchPersonalLoanTrackerResponse()) - - /*suspend fun fetchPersonalLoanStatusTracker(): RepoResult { - val type = object : TypeToken() {}.type - return mockApiResponse(type, "personalLoanTrackerResponse") - }*/ } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/viewmodels/PersonalLoanTrackerVM.kt b/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/viewmodels/PersonalLoanTrackerVM.kt index 53280bf4ae..7ce0fac2ee 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/viewmodels/PersonalLoanTrackerVM.kt +++ b/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/viewmodels/PersonalLoanTrackerVM.kt @@ -16,14 +16,11 @@ import com.navi.common.viewmodel.BaseVM import com.naviapp.personalloanrevamp.models.FLOW_LOAN_JOURNEY_TRACKER import com.naviapp.personalloanrevamp.models.response.PersonalLoanTrackerResponse import com.naviapp.personalloanrevamp.useridentificationv2.repository.PersonalLoanTrackerRepository -import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch -import javax.inject.Inject - - -@HiltViewModel -class PersonalLoanTrackerVM @Inject constructor(private val repository: PersonalLoanTrackerRepository) : BaseVM() { +class PersonalLoanTrackerVM( + private val repository: PersonalLoanTrackerRepository = PersonalLoanTrackerRepository() +) : BaseVM() { private val _statusTrackerResponse = MutableLiveData() val statusTrackerResponse: LiveData get() = _statusTrackerResponse @@ -35,14 +32,15 @@ class PersonalLoanTrackerVM @Inject constructor(private val repository: Personal _statusTrackerResponse.value = response.data } else { setErrorData( - response.errors, response.error, - errorMetaData = ErrorMetaData( - flowName = FLOW_LOAN_JOURNEY_TRACKER, - methodName = ::fetchLoanTrackerResponse.name - ) + response.errors, + response.error, + errorMetaData = + ErrorMetaData( + flowName = FLOW_LOAN_JOURNEY_TRACKER, + methodName = ::fetchLoanTrackerResponse.name + ) ) } } } - } diff --git a/app/src/main/java/com/naviapp/receiver/WifiTrackerBaseActivity.kt b/app/src/main/java/com/naviapp/receiver/WifiTrackerBaseActivity.kt index 9f544e220e..a2aab1515a 100644 --- a/app/src/main/java/com/naviapp/receiver/WifiTrackerBaseActivity.kt +++ b/app/src/main/java/com/naviapp/receiver/WifiTrackerBaseActivity.kt @@ -72,12 +72,6 @@ abstract class WifiTrackerBaseActivity : BaseActivity() { ) ) { wifiManager?.startScan() - } else { - permissionsManager.requestPermissions( - arrayOf( - Manifest.permission.ACCESS_COARSE_LOCATION - ) - ) } } else { wifiManager?.startScan() @@ -93,24 +87,6 @@ abstract class WifiTrackerBaseActivity : BaseActivity() { ) ) { wifiManager?.startScan() - } else { - if (FirebaseRemoteConfigHelper.getBoolean( - FirebaseRemoteConfigHelper.LOCATION_EXPERIMENT - ) - ) { - permissionsManager.requestPermissions( - arrayOf( - Manifest.permission.ACCESS_COARSE_LOCATION - ) - ) - } else { - permissionsManager.requestPermissions( - arrayOf( - Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.ACCESS_COARSE_LOCATION - ) - ) - } } } else { wifiManager?.startScan() @@ -118,22 +94,6 @@ abstract class WifiTrackerBaseActivity : BaseActivity() { } } - override fun onRequestPermissionsResult( - requestCode: Int, - permissions: Array, - grantResults: IntArray - ) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults) - if (requestCode == PermissionsManager.REQUEST_CODE) { - if ( - grantResults.isNotEmpty() && - grantResults.first() == PackageManager.PERMISSION_GRANTED - ) { - wifiManager?.startScan() - } - } - } - override fun onStop() { super.onStop() unregisterReceiver(receiverWifi) diff --git a/app/src/main/java/com/naviapp/registration/LoginFragment.kt b/app/src/main/java/com/naviapp/registration/LoginFragment.kt index 6270dffe6b..36b70f1187 100644 --- a/app/src/main/java/com/naviapp/registration/LoginFragment.kt +++ b/app/src/main/java/com/naviapp/registration/LoginFragment.kt @@ -14,6 +14,7 @@ import android.os.Bundle import android.view.Gravity import android.view.LayoutInflater import android.view.View +import android.view.View.GONE import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.core.view.isVisible @@ -53,8 +54,6 @@ import com.naviapp.utils.Constants.DEFAULT import com.naviapp.utils.Constants.LEGAL_DOC_TYPE_PRIVACY_POLICY import com.naviapp.utils.Constants.LEGAL_DOC_TYPE_TNC import com.naviapp.utils.Constants.VALID_PHONE_NUMBER_LENGTH -import com.naviapp.utils.EMPTY -import com.naviapp.utils.openKeyboard class LoginFragment : BaseFragment(), View.OnClickListener { @@ -66,6 +65,7 @@ class LoginFragment : BaseFragment(), View.OnClickListener { private var source: String? = null private var isCheckBoxNeedToShow = true private var isNoCallDisclaimerEnabled = false + private var isOldHomePageEnabled: Boolean = false override fun onCreateView( inflater: LayoutInflater, @@ -78,6 +78,7 @@ class LoginFragment : BaseFragment(), View.OnClickListener { if (source.isNullOrEmpty()) { source = DEFAULT } + readArguments() initUi() initObservers() initData() @@ -151,7 +152,8 @@ class LoginFragment : BaseFragment(), View.OnClickListener { null ) } - } catch (e: Exception) {} + } catch (e: Exception) { + } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { @@ -194,6 +196,11 @@ class LoginFragment : BaseFragment(), View.OnClickListener { return validated } + private fun readArguments() { + isOldHomePageEnabled = + FirebaseRemoteConfigHelper.getBoolean(FirebaseRemoteConfigHelper.OLD_HOME_PAGE_THEME) + } + private fun initUi() { var tncTxt: String? = null source?.let { loginSource -> @@ -236,7 +243,40 @@ class LoginFragment : BaseFragment(), View.OnClickListener { ), makeBold = true ) - binding.noCallDisclaimer.headerLayout.isVisible = isNoCallDisclaimerEnabled + + if (isOldHomePageEnabled.not()) { + binding.rightIcon.visibility = GONE + context?.let { + binding.conditionsCb.buttonDrawable = + ContextCompat.getDrawable(it, R.drawable.ic_purple_checkbox) + } + binding.tvNewNoCalls.isVisible = isNoCallDisclaimerEnabled + context?.let { + binding.verifyNumberTv.setTextColor(ContextCompat.getColor(it, R.color.dark_gray)) + binding.countryCodeText.setTextColor(ContextCompat.getColor(it, R.color.dark_gray)) + binding.phoneEdit.setTextColor(ContextCompat.getColor(it, R.color.dark_gray)) + binding.termsConditionsTv.setTextColor( + ContextCompat.getColor( + it, + R.color.color_6B6B6B + ) + ) + binding.termsConditionsTv.setTextColor( + ContextCompat.getColor( + it, + R.color.description_color_seven + ) + ) + binding.termsConditionsTv.setLinkTextColor( + ContextCompat.getColor( + it, + R.color.description_color_seven + ) + ) + } + } else { + binding.noCallDisclaimer.headerLayout.isVisible = isNoCallDisclaimerEnabled + } } private fun openLegalDocsOnBrowser(type: String) { @@ -254,15 +294,23 @@ class LoginFragment : BaseFragment(), View.OnClickListener { private fun navigateToOtpScreenOrEnableOtpButton() { if ( binding.phoneEdit.text.toString().length == VALID_PHONE_NUMBER_LENGTH && - (isCheckBoxNeedToShow.not() || binding.conditionsCb.isChecked) + (isCheckBoxNeedToShow.not() || binding.conditionsCb.isChecked) ) { binding.getOtpBtn.isEnabled = true context?.let { binding.getOtpBtn.background = getNaviDrawable( - cornerRadius = resources.getDimension(R.dimen.layout_dp_32).toInt(), + cornerRadius = if (isOldHomePageEnabled.not()) { + resources.getDimension(R.dimen.layout_dp_4).toInt() + } else { + resources.getDimension(R.dimen.layout_dp_32).toInt() + }, backgroundColor = ContextCompat.getColor( it, - R.color.outrageous_orange + if (isOldHomePageEnabled.not()) { + R.color.color_1F002A + } else { + R.color.outrageous_orange + } ) ) } @@ -270,10 +318,18 @@ class LoginFragment : BaseFragment(), View.OnClickListener { binding.getOtpBtn.isEnabled = false context?.let { binding.getOtpBtn.background = getNaviDrawable( - cornerRadius = resources.getDimension(R.dimen.layout_dp_32).toInt(), + cornerRadius = if (isOldHomePageEnabled.not()) { + resources.getDimension(R.dimen.layout_dp_4).toInt() + } else { + resources.getDimension(R.dimen.layout_dp_32).toInt() + }, backgroundColor = ContextCompat.getColor( it, - R.color.outrageous_orange_opacity_56 + if (isOldHomePageEnabled.not()) { + R.color.color_1F002A_opacity_56 + } else { + R.color.outrageous_orange_opacity_56 + } ) ) } diff --git a/app/src/main/java/com/naviapp/registration/OtpFragment.kt b/app/src/main/java/com/naviapp/registration/OtpFragment.kt index 542f82d570..89ac83a1b6 100644 --- a/app/src/main/java/com/naviapp/registration/OtpFragment.kt +++ b/app/src/main/java/com/naviapp/registration/OtpFragment.kt @@ -12,6 +12,8 @@ import android.os.Bundle import android.os.CountDownTimer import android.view.LayoutInflater import android.view.View +import android.view.View.GONE +import android.view.View.VISIBLE import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.core.view.isVisible @@ -64,6 +66,7 @@ class OtpFragment : BaseFragment(), View.OnClickListener { private var grootReferenceId: String? = null private var channel: String? = null private var isCallOptionEnabled = false + private var isOldHomePageEnabled: Boolean = false override fun onAttach(context: Context) { super.onAttach(context) @@ -79,6 +82,7 @@ class OtpFragment : BaseFragment(), View.OnClickListener { savedInstanceState: Bundle? ): View? { binding = DataBindingUtil.inflate(inflater, R.layout.otp_fragment, container, false) + readArguments() initError() initUi() initListeners() @@ -93,6 +97,11 @@ class OtpFragment : BaseFragment(), View.OnClickListener { } } + private fun readArguments() { + isOldHomePageEnabled = + FirebaseRemoteConfigHelper.getBoolean(FirebaseRemoteConfigHelper.OLD_HOME_PAGE_THEME) + } + private fun initError() { initError( registrationVM, @@ -105,7 +114,11 @@ class OtpFragment : BaseFragment(), View.OnClickListener { private fun initListeners() { binding.resendOtpTv.setOnClickListener(this) - binding.editNumberTv.setOnClickListener(this) + if (isOldHomePageEnabled.not()) { + binding.tvEditNumberTitle.setOnClickListener(this) + } else { + binding.editNumberTv.setOnClickListener(this) + } binding.verifyOtpBtn.setOnClickListener(this) binding.otpOncallTv.setOnClickListener(this) initObservers() @@ -136,6 +149,7 @@ class OtpFragment : BaseFragment(), View.OnClickListener { hideLoader() binding.otpLayout.clear() binding.enterCorrectOtpTv.visibility = View.VISIBLE + binding.otpLayout.setErrorState() } } @@ -159,9 +173,15 @@ class OtpFragment : BaseFragment(), View.OnClickListener { arguments?.getString(OTP_TOKEN)?.let { latestOtpToken = it } context?.let { binding.verifyOtpBtn.background = getNaviDrawable( - cornerRadius = resources.getDimension(R.dimen.layout_dp_32).toInt(), + cornerRadius = if (isOldHomePageEnabled.not()) + resources.getDimension(R.dimen.layout_dp_4).toInt() + else + resources.getDimension(R.dimen.layout_dp_32).toInt(), backgroundColor = ContextCompat.getColor( it, + if (isOldHomePageEnabled.not()) + R.color.color_1F002A_opacity_56 + else R.color.outrageous_orange_opacity_56 ) ) @@ -182,10 +202,16 @@ class OtpFragment : BaseFragment(), View.OnClickListener { binding.verifyOtpBtn.isEnabled = true context?.let { binding.verifyOtpBtn.background = getNaviDrawable( - cornerRadius = resources.getDimension(R.dimen.layout_dp_32).toInt(), + cornerRadius = if (isOldHomePageEnabled.not()) + resources.getDimension(R.dimen.layout_dp_4).toInt() + else + resources.getDimension(R.dimen.layout_dp_32).toInt(), backgroundColor = ContextCompat.getColor( it, - R.color.outrageous_orange + if (isOldHomePageEnabled.not()) + R.color.color_1F002A + else + R.color.outrageous_orange ) ) } @@ -193,16 +219,23 @@ class OtpFragment : BaseFragment(), View.OnClickListener { binding.verifyOtpBtn.isEnabled = false context?.let { binding.verifyOtpBtn.background = getNaviDrawable( - cornerRadius = resources.getDimension(R.dimen.layout_dp_32).toInt(), + cornerRadius = if (isOldHomePageEnabled.not()) + resources.getDimension(R.dimen.layout_dp_4).toInt() + else + resources.getDimension(R.dimen.layout_dp_32).toInt(), backgroundColor = ContextCompat.getColor( it, - R.color.outrageous_orange_opacity_56 + if (isOldHomePageEnabled.not()) + R.color.color_1F002A_opacity_56 + else + R.color.outrageous_orange_opacity_56 ) ) } } if (binding.otpLayout.getText().length == 1) { binding.enterCorrectOtpTv.visibility = View.GONE + binding.otpLayout.setNormalState() } } arguments?.getString(LOGIN_SOURCE)?.let { @@ -210,6 +243,65 @@ class OtpFragment : BaseFragment(), View.OnClickListener { FirebaseRemoteConfigHelper.getBoolean(it.plus("_NO_CALL_DISCLAIMER")) } startCountDownTimer() + + changeComponentsToNewHomeTheme() + } + + private fun changeComponentsToNewHomeTheme() { + if (isOldHomePageEnabled.not()) { + binding.rightIcon.visibility = GONE + binding.tvEditNumberTitle.visibility = VISIBLE + context?.let { + binding.enterOtpHeadingTv.setTextColor( + ContextCompat.getColor( + it, + R.color.dark_gray + ) + ) + binding.enterOtpTv.setTextColor( + ContextCompat.getColor( + it, + R.color.color_6B6B6B + ) + ) + binding.editNumberTv.setTextColor( + ContextCompat.getColor( + it, + R.color.dark_gray + ) + ) + binding.resendOtpTv.setTextColor( + ContextCompat.getColor( + it, + R.color.dark_gray + ) + ) + binding.otpOncallTv.setTextColor( + ContextCompat.getColor( + it, + R.color.dark_gray + ) + ) + binding.resendOtpTv.setCompoundDrawablesWithIntrinsicBounds( + R.drawable.ic_resend_new_theme, + 0, + 0, + 0, + ) + binding.otpOncallTv.setCompoundDrawablesWithIntrinsicBounds( + R.drawable.ic_call_new_theme, + 0, + 0, + 0, + ) + binding.editNumberTv.setCompoundDrawablesWithIntrinsicBounds( + 0, + 0, + 0, + 0, + ) + } + } } private fun startCountDownTimer() { @@ -252,7 +344,7 @@ class OtpFragment : BaseFragment(), View.OnClickListener { override fun onClick(view: View?) { when (view?.id) { R.id.resend_otp_tv -> resendOtp() - R.id.edit_number_tv -> editNumber() + R.id.edit_number_tv, R.id.tvEditNumberTitle -> editNumber() R.id.verify_otp_btn -> verifyOtp() binding.otpOncallTv.id -> callOtpOnCall() } @@ -340,6 +432,7 @@ class OtpFragment : BaseFragment(), View.OnClickListener { otpRequest, density = getDensityName(context = requireContext()).orEmpty(), connectivityType = getNetworkType(context = requireContext()), + permissionGranted = isAllMandatoryPermissionGranted(activity = requireActivity()) ) } } diff --git a/app/src/main/java/com/naviapp/registration/OtpFragmentV2.kt b/app/src/main/java/com/naviapp/registration/OtpFragmentV2.kt index c6fdd2a04d..e19ff24c10 100644 --- a/app/src/main/java/com/naviapp/registration/OtpFragmentV2.kt +++ b/app/src/main/java/com/naviapp/registration/OtpFragmentV2.kt @@ -369,7 +369,8 @@ class OtpFragmentV2 : BaseFragment(), View.OnClickListener { otpRequest, density = getDensityName(context = requireContext()).orEmpty(), connectivityType = getNetworkType(context = requireContext()), - showMessageOnFragment = true + showMessageOnFragment = true, + permissionGranted = isAllMandatoryPermissionGranted(requireActivity()) ) } } diff --git a/app/src/main/java/com/naviapp/registration/RegistrationActivity.kt b/app/src/main/java/com/naviapp/registration/RegistrationActivity.kt index 5565670eed..63d7e9d60b 100644 --- a/app/src/main/java/com/naviapp/registration/RegistrationActivity.kt +++ b/app/src/main/java/com/naviapp/registration/RegistrationActivity.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2019-2022 by Navi Technologies Limited + * * Copyright © 2019-2023 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -34,6 +34,8 @@ import com.navi.base.utils.BaseUtils import com.navi.base.utils.orFalse import com.navi.base.utils.orZero import com.navi.common.firebasedb.FirebaseStatusType.SUCCESS +import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper +import com.navi.common.managers.PermissionsManager import com.navi.common.model.DeviceDetail import com.navi.common.model.ModuleNameV2 import com.navi.common.model.WifiDetails @@ -90,6 +92,7 @@ class RegistrationActivity : private lateinit var binding: RegistrationActivityBinding private val registrationVM by lazy { ViewModelProvider(this).get(RegistrationVM::class.java) } private val otpReceiver by lazy { SmsAutoReadReceiver() } + private val permissionsManager by lazy { PermissionsManager(this) } private val registrationSharedVM by lazy { ViewModelProvider(this).get(RegistrationSharedVM::class.java) } @@ -100,6 +103,7 @@ class RegistrationActivity : private var grootReferenceId: String? = null private var channel: String? = null private lateinit var redirectStatus: String + private var isOldHomePageEnabled: Boolean = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -108,6 +112,8 @@ class RegistrationActivity : channel = intent.getStringExtra(Constants.CHANNEL) grootReferenceId = intent.getStringExtra(Constants.IDENTIFIER) super.setContentView(binding.root) + isOldHomePageEnabled = + FirebaseRemoteConfigHelper.getBoolean(FirebaseRemoteConfigHelper.OLD_HOME_PAGE_THEME) redirectStatus = intent.getStringExtra(REDIRECT_STATUS) ?: LOGIN_SCREEN isTrueCallerEnabled = PreferenceManager.getBooleanPreference(TRUECALLER_ENABLED).orFalse() if (redirectStatus != AUTH_VIA_LINK) { @@ -136,7 +142,7 @@ class RegistrationActivity : ) { randomRequestId = getUniqueRandomNumber() FcmAnalyticsUtil.analytics.setCrashlyticRandomRequestId(randomRequestId) - TrueCallerHelper.init(this, this, randomRequestId) + TrueCallerHelper.init(this, this, randomRequestId, isOldHomePageThemeEnabled = isOldHomePageEnabled) } initListener() initError(registrationVM, showNewDesignSystemFragment = true) @@ -181,6 +187,7 @@ class RegistrationActivity : otpRequest, density = getDensityName(context = this).orEmpty(), connectivityType = getNetworkType(context = this), + permissionGranted = isAllMandatoryPermissionGranted(this) ) } @@ -406,7 +413,8 @@ class RegistrationActivity : registrationVM.loginViaTrueCaller( otpRequest = otpRequest, density = getDensityName(context = this).orEmpty(), - connectivityType = getNetworkType(context = this) + connectivityType = getNetworkType(context = this), + permissionGranted = isAllMandatoryPermissionGranted(this) ) } @@ -429,7 +437,7 @@ class RegistrationActivity : override fun onFragmentOpen(type: String?) { if (!TrueCallerHelper.isInit()) { - TrueCallerHelper.init(this, this) + TrueCallerHelper.init(this, this, isOldHomePageThemeEnabled = isOldHomePageEnabled) } if (TruecallerSDK.getInstance().isUsable) { TruecallerSDK.getInstance().getUserProfile(this) @@ -556,7 +564,7 @@ class RegistrationActivity : private fun goToNextScreen(nextCta: CtaData?) { updateFCMToken() - nextCta?.let { cta -> NaviDeepLinkNavigator.navigate(this, cta, true, clearTask = true, bundle = intent.extras ?: Bundle()) } + nextCta?.let { cta -> navigate(cta) } ?: run { callingActivity?.let { setResult(Activity.RESULT_OK, intent) @@ -571,6 +579,14 @@ class RegistrationActivity : } } + private fun navigate(cta: CtaData) { + if (cta.url == NaviDeepLinkNavigator.MANDATE_PERMISSION && isAllMandatoryPermissionGranted(permissionsManager)) { + NaviDeepLinkNavigator.navigate(this, CtaData(url = NaviDeepLinkNavigator.HOME), true, clearTask = true, bundle = intent.extras ?: Bundle()) + } else { + NaviDeepLinkNavigator.navigate(this, cta, true, clearTask = true, bundle = intent.extras ?: Bundle()) + } + } + private fun updateCommunicationMediums() { val whatsappEnabled = PreferenceManager.getBooleanPreference(WHATSAPP_COMMUNICATION_ENABLED) val eventTracker = NaviAnalytics.naviAnalytics.Whatsapp() diff --git a/app/src/main/java/com/naviapp/registration/SplashActivity.kt b/app/src/main/java/com/naviapp/registration/SplashActivity.kt index 370ea254d1..d87da2a8b5 100644 --- a/app/src/main/java/com/naviapp/registration/SplashActivity.kt +++ b/app/src/main/java/com/naviapp/registration/SplashActivity.kt @@ -52,13 +52,12 @@ import com.navi.common.managers.PermissionsManager import com.navi.common.model.ModuleNameV2 import com.navi.common.model.PushNotificationData import com.navi.common.ui.activity.BaseActivity +import com.navi.common.utils.* import com.navi.common.utils.Constants.LIST_OF_PERMISSION import com.navi.common.utils.Constants.LOGIN_SOURCE +import com.navi.common.utils.Constants.PERMISSION_PREFIX import com.navi.common.utils.Constants.SHOW_INVESTMENT_ON_BOTTOM_NAV -import com.navi.common.utils.getScreenRefreshRate -import com.navi.common.utils.getSessionId -import com.navi.common.utils.getWifiAddress -import com.navi.common.utils.observeNullable +import com.navi.common.utils.Constants.SKIP_PERMISSION_SCREEN import com.navi.naviwidgets.utils.CURRENT_VERSION_IN_STORE import com.naviapp.BuildConfig import com.naviapp.R @@ -75,6 +74,7 @@ import com.naviapp.common.navigator.NaviDeepLinkNavigator.CHAT_ACTIVITY import com.naviapp.common.navigator.NaviDeepLinkNavigator.HOME import com.naviapp.common.navigator.ScreenNavigator import com.naviapp.common.navigator.ScreenNavigator.Companion.PERMISSION_SCREEN +import com.naviapp.common.navigator.ScreenNavigator.Companion.PROMOTION_SCREEN import com.naviapp.common.transformer.AppLoadTimerMapper import com.naviapp.databinding.ActivitySplashScreenBinding import com.naviapp.manager.UserDataUploadManager @@ -87,6 +87,7 @@ import com.naviapp.registration.viewmodel.ConfigVM import com.naviapp.registration.viewmodel.RegistrationVM import com.naviapp.services.KillAppInBackgroundService import com.naviapp.utils.* +import com.naviapp.utils.Constants import com.naviapp.utils.Constants.CLICKED_BRANCH_LINK import com.naviapp.utils.Constants.DEEPLINK import com.naviapp.utils.Constants.DEEPLINK_JSON_OBJECT @@ -149,6 +150,7 @@ class SplashActivity : BaseActivity(), DeepLinkListener { } binding = DataBindingUtil.setContentView(this, R.layout.activity_splash_screen) super.setContentView(binding.root) + PreferenceManager.setBooleanPreference(SKIP_PERMISSION_SCREEN, false) initAnimation() sendDeeplinkEvent() startAppKillInBackgroundService() @@ -315,12 +317,14 @@ class SplashActivity : BaseActivity(), DeepLinkListener { private fun fetchConfigData() { configVM.getGaId() configVM.fetchFireBaseInstanceId() - if (BaseUtils.isUserLoggedIn()) { + if (BaseUtils.isUserLoggedIn() && isAllMandatoryPermissionGranted(permissionsManager)) { configVM.fetchHomeScreens( PreferenceManager.getIntPreferenceApp( CURRENT_VERSION_IN_STORE ), - isSecondaryAppAvailable + isSecondaryAppAvailable, + true, + getInstalledDynamicModulesCommaSeparated() ) } } @@ -346,6 +350,16 @@ class SplashActivity : BaseActivity(), DeepLinkListener { private fun loginSettingsObserver() { configVM.loginSettings.observeNullable(this) { + it?.requiredPermissions?.let {permissions -> + val listOfPermissions = ArrayList() + permissions.forEach { permission -> + listOfPermissions.add(PERMISSION_PREFIX + permission) + } + PreferenceManager.setHashSet( + LIST_OF_PERMISSION, + listOfPermissions.toHashSet() + ) + } it?.migration?.let { migrationResponse -> canNavigateNextScreen = migrationResponse.migrate?.not() ?: true redirectToFpsApp = it.redirectToOtherApp ?: false @@ -582,6 +596,12 @@ class SplashActivity : BaseActivity(), DeepLinkListener { ScreenNavigator.REGISTRATION_SCREEN, bundle ) + } else if (isUserNotExitedPromotionScreen()) { + ScreenNavigator.instance.startActivityWithNoActivityStack( + this, + PROMOTION_SCREEN, + clearTask = isTaskRoot.not() + ) } else if (listOfPermissions.isNullOrEmpty().not() && !permissionsManager.hasPermissions(listOfPermissions?.toTypedArray()!!) ) { diff --git a/app/src/main/java/com/naviapp/registration/WhatsAppLoginFragment.kt b/app/src/main/java/com/naviapp/registration/WhatsAppLoginFragment.kt index e89a2a8512..e7a6cde8da 100644 --- a/app/src/main/java/com/naviapp/registration/WhatsAppLoginFragment.kt +++ b/app/src/main/java/com/naviapp/registration/WhatsAppLoginFragment.kt @@ -54,6 +54,7 @@ class WhatsAppLoginFragment : BaseFragment(), View.OnClickListener { private var isCheckBoxNeedToShow = true private var isNoCallDisclaimerEnabled = false private var whatsAppLoginConfig: WhatsappLoginConfig? = null + private var isOldHomePageEnabled: Boolean = false override fun onCreateView( inflater: LayoutInflater, @@ -81,9 +82,15 @@ class WhatsAppLoginFragment : BaseFragment(), View.OnClickListener { WHATS_APP_LOGIN_CONFIG, WhatsappLoginConfig::class.java ) + readArguments() initUi() } + private fun readArguments() { + isOldHomePageEnabled = + FirebaseRemoteConfigHelper.getBoolean(FirebaseRemoteConfigHelper.OLD_HOME_PAGE_THEME) + } + private fun initUi() { var tncTxt: String? = null source?.let { loginSource -> @@ -181,13 +188,20 @@ class WhatsAppLoginFragment : BaseFragment(), View.OnClickListener { binding.loginBtn.isVisible = FirebaseRemoteConfigHelper.getBoolean( ENABLE_OTP_LOGIN_ON_WHATSAPP_PAGE ).orTrue() - binding.otpLessBtn.isVisible = whatsAppLoginConfig?.otpLess == true - binding.whatsappLayout.isVisible = (whatsAppLoginConfig?.otpLess == true).not() + binding.otpLessBtn.isVisible = (whatsAppLoginConfig?.otpLess == true).not() + binding.whatsappLayout.isVisible = (whatsAppLoginConfig?.otpLess == true) binding.otpLessBtn.setResultCallback { otpLessResponse -> otpLessResponse?.let { registrationVM.saveWaIdOtpLess( otpLessResponse.waId.orEmpty()) } } + if (isOldHomePageEnabled.not()) { + context?.let { + binding.nextIcon.setImageDrawable(ContextCompat.getDrawable(it, R.drawable.ic_whatsapp_right_arrow)) + binding.termsConditionsTv.setTextColor(ContextCompat.getColor(it, R.color.description_color_seven)) + binding.termsConditionsTv.setLinkTextColor(ContextCompat.getColor(it, R.color.description_color_seven)) + } + } } private fun openWhatsApp() { diff --git a/app/src/main/java/com/naviapp/registration/helper/TrueCallerHelper.kt b/app/src/main/java/com/naviapp/registration/helper/TrueCallerHelper.kt index 329111a841..16fe8ba791 100644 --- a/app/src/main/java/com/naviapp/registration/helper/TrueCallerHelper.kt +++ b/app/src/main/java/com/naviapp/registration/helper/TrueCallerHelper.kt @@ -20,19 +20,19 @@ object TrueCallerHelper { private var isInit: Boolean? = null - fun init(context: Context, tcCallBack: ITrueCallback, requestId: String? = null) { - initImpl(context, tcCallBack, requestId) + fun init(context: Context, tcCallBack: ITrueCallback, requestId: String? = null, isOldHomePageThemeEnabled: Boolean) { + initImpl(context, tcCallBack, requestId, isOldHomePageThemeEnabled) } - private fun initImpl(context: Context, tcCallBack: ITrueCallback, requestId: String? = null) { + private fun initImpl(context: Context, tcCallBack: ITrueCallback, requestId: String? = null, isOldHomePageThemeEnabled: Boolean) { try { val trueScope = TruecallerSdkScope.Builder(context, tcCallBack) .consentMode(TruecallerSdkScope.CONSENT_MODE_BOTTOMSHEET) - .buttonColor(context.resources.getColor(R.color.outrageous_orange)) + .buttonColor(context.resources.getColor(if (isOldHomePageThemeEnabled.not()) R.color.color_1F002A else R.color.outrageous_orange)) .buttonTextColor(context.resources.getColor(R.color.white)) // .privacyPolicyUrl("https://navi-tnc-privacy-policy-resources.s3.ap-south-1.amazonaws.com/privacy_policy/index.html") //.termsOfServiceUrl("https://navi-tnc-privacy-policy-resources.s3.ap-south-1.amazonaws.com/privacy_policy/index.html") - .buttonShapeOptions(TruecallerSdkScope.BUTTON_SHAPE_ROUNDED) + .buttonShapeOptions(if (isOldHomePageThemeEnabled.not()) TruecallerSdkScope.BUTTON_SHAPE_RECTANGLE else TruecallerSdkScope.BUTTON_SHAPE_ROUNDED) .footerType(TruecallerSdkScope.FOOTER_TYPE_CONTINUE) .consentTitleOption(TruecallerSdkScope.SDK_CONSENT_TITLE_LOG_IN) .sdkOptions(TruecallerSdkScope.SDK_OPTION_WITHOUT_OTP) // isUsable can be true/false with SDK_OPTION_WITHOUT_OTP but only true for SDK_OPTION_WITH_OTP diff --git a/app/src/main/java/com/naviapp/registration/repositories/RegisterRepository.kt b/app/src/main/java/com/naviapp/registration/repositories/RegisterRepository.kt index ba105b8b0d..cb3fdfaf8d 100644 --- a/app/src/main/java/com/naviapp/registration/repositories/RegisterRepository.kt +++ b/app/src/main/java/com/naviapp/registration/repositories/RegisterRepository.kt @@ -23,13 +23,19 @@ class RegisterRepository : ResponseCallback() { suspend fun submitPhoneNumber(loginRequest: LoginRequest) = apiResponseCallback(superAppRetrofitService().submitPhoneNumber(loginRequest)) - suspend fun verifyOtp(otpRequest: OtpRequest, density: String, connectivityType: String) = + suspend fun verifyOtp( + otpRequest: OtpRequest, + density: String, + connectivityType: String, + permissionGranted: Boolean + ) = apiResponseCallback( superAppRetrofitService() .submitOTP( otpRequest = otpRequest, deviceDensity = density, - connectivityType = connectivityType + connectivityType = connectivityType, + permissionGranted = permissionGranted ) ) diff --git a/app/src/main/java/com/naviapp/registration/viewmodel/ConfigVM.kt b/app/src/main/java/com/naviapp/registration/viewmodel/ConfigVM.kt index 96b874e6ff..8b9079c85b 100644 --- a/app/src/main/java/com/naviapp/registration/viewmodel/ConfigVM.kt +++ b/app/src/main/java/com/naviapp/registration/viewmodel/ConfigVM.kt @@ -146,11 +146,22 @@ class ConfigVM @Inject constructor( } } - fun fetchHomeScreens(availableAppVersionCode: Int?, isSecondaryAppAvailable: Boolean) { + fun fetchHomeScreens( + availableAppVersionCode: Int?, + isSecondaryAppAvailable: Boolean, + isPermissionGranted: Boolean, + installedModules: String + ) { viewModelScope.launch(Dispatchers.IO) { homeRepoHelper.fetchBottomNavData() homeRepoHelper.fetchHome( - null, null, null, availableAppVersionCode, isSecondaryAppAvailable + null, + null, + null, + availableAppVersionCode, + isSecondaryAppAvailable, + isPermissionGranted, + installedModules ) homeRepoHelper.fetchDashboard() homeRepoHelper.fetchInvestmentTab() diff --git a/app/src/main/java/com/naviapp/registration/viewmodel/RegistrationVM.kt b/app/src/main/java/com/naviapp/registration/viewmodel/RegistrationVM.kt index aff3154a2b..fec96df874 100644 --- a/app/src/main/java/com/naviapp/registration/viewmodel/RegistrationVM.kt +++ b/app/src/main/java/com/naviapp/registration/viewmodel/RegistrationVM.kt @@ -175,14 +175,16 @@ class RegistrationVM(private val registerRepository: RegisterRepository = Regist otpRequest: OtpRequest, density: String, connectivityType: String, - showMessageOnFragment: Boolean? = null + showMessageOnFragment: Boolean? = null, + permissionGranted: Boolean ) { coroutineScope.launch { val response = registerRepository.verifyOtp( otpRequest = otpRequest, density = density, - connectivityType = connectivityType + connectivityType = connectivityType, + permissionGranted = permissionGranted ) Timber.i("otp data $response") when { @@ -210,14 +212,16 @@ class RegistrationVM(private val registerRepository: RegisterRepository = Regist fun verifyDeepLinkAuth( otpRequest: OtpRequest, density: String, - connectivityType: String + connectivityType: String, + permissionGranted: Boolean ) { coroutineScope.launch { val response = registerRepository.verifyOtp( otpRequest = otpRequest, density = density, - connectivityType = connectivityType + connectivityType = connectivityType, + permissionGranted = permissionGranted ) if (response.error == null && !response.data?.authToken.isNullOrEmpty()) { BaseUtils.saveSessionToken(response.data?.sessionToken.orEmpty()) @@ -242,14 +246,16 @@ class RegistrationVM(private val registerRepository: RegisterRepository = Regist fun loginViaTrueCaller( otpRequest: OtpRequest, density: String, - connectivityType: String + connectivityType: String, + permissionGranted: Boolean ) { coroutineScope.launch { val response = registerRepository.verifyOtp( otpRequest = otpRequest, density = density, - connectivityType = connectivityType + connectivityType = connectivityType, + permissionGranted = permissionGranted ) when { response.error == null && !response.data?.authToken.isNullOrEmpty() -> { diff --git a/app/src/main/java/com/naviapp/utils/Constants.kt b/app/src/main/java/com/naviapp/utils/Constants.kt index 8ca819cce1..fab6c9a13d 100644 --- a/app/src/main/java/com/naviapp/utils/Constants.kt +++ b/app/src/main/java/com/naviapp/utils/Constants.kt @@ -105,6 +105,7 @@ object Constants { const val FAQ_HOME_LOAN = "Home Loan" const val FAQ_PERSONAL_LOAN = "Personal Loan" const val WIDGET_ID = "WIDGET_ID" + const val IS_SOFT_REJECT = "softReject" const val DATE_FORMAT = "dd/MM/yyyy" const val DATE_FORMAT_YYYY_MM_DD = "yyyy-MM-dd" const val DAY_OF_MONTH_FORMAT = "d" @@ -188,6 +189,7 @@ object Constants { const val LOAN_ACCOUNT_NUMBER_DATA = "LOAN_ACCOUNT_NUMBER_DATA" const val PROFESSION_TYPE = "PROFESSION_TYPE" const val ACTION = "action" + const val UNINSTALL = "uninstall" const val STAGE_KEY = "stage" const val RETURN_URL = "returnUrl" const val SERVICE_PROVIDER = "serviceProvider" @@ -309,6 +311,8 @@ object Constants { const val FRESH_LOAN_DETAILS_FLOW = "FRESH_LOAN_DETAILS_FLOW" const val OFFER_GENERATION_FLOW = "OFFER_GENERATION" const val OFFER_UPGRADE_FLOW = "OFFER_UPGRADE" + const val OFFER_IN_REVIEW = "OFFER_IN_REVIEW" + const val BASIC_DETAILS_V2 = "BASIC_DETAILS_V2" const val EXPIRY_TIME_IN_MIN = "expiryTimeInMinutes" const val NOTIFICATION_SENT_TIME = "notificationSentTimeInUTC" const val SOURCE = "source" @@ -455,6 +459,30 @@ object Constants { const val APP_ACTION_OBJECTIVE_REWARDS_CAMPAIGN_ONBOARD = "REWARDS_CAMPAIGN_ONBOARD" + const val LOAN_OFFER_UPGRADE_V2 = "LOAN_OFFER_UPGRADE_V2" + const val BANK_DETAILS_V2 = "BANK_DETAILS_V2" + const val UPI_STATUS_V2 = "UPI_STATUS_V2" + const val BANK_DETAILS_AUTO_DEBIT_V2 = "BANK_DETAILS_AUTO_DEBIT_V2" + const val SUMMARY_SCREEN_V2 = "SUMMARY_SCREEN_V2" + const val KYC_V2 = "KYC_V2" + const val LOAN_AGREEMENT_V2 = "LOAN_AGREEMENT_V2" + const val MONEY_DISBURSEMENT_STATUS_V2 = "MONEY_DISBURSEMENT_STATUS_V2" + const val BANK_STATEMENT_V2 = "BANK_STATEMENT_V2" + const val BANK_STATEMENT_VERIFICATION_V2 = "BANK_STATEMENT_VERIFICATION_V2" + const val NO_ADDRESS_SELECTED_BOTTOM_SHEET = "NO_ADDRESS_SELECTED_BOTTOM_SHEET" + const val SCROLL_TO_WIDGET_POSITION = "SCROLL_TO_WIDGET_POSITION" + const val EVENT_NAME = "EVENT_NAME" + const val ACTIVITY_CLASS_PATH = "ACTIVITY_CLASS_PATH" + const val NEEDS_RESULT = "NEEDS_RESULT" + const val CLEAR_TASK = "CLEAR_TASK" + const val REQUEST_CODE = "REQUEST_CODE" + const val PL_DYNAMIC_MODULE_NAME = "navi_pl_dynamic" + const val LOAN_OFFER_EXPIRED = "LOAN_OFFER_EXPIRED" + const val SYSTEM_UNDER_MAINTENANCE = "SYSTEM_UNDER_MAINTENANCE" + const val REDIRECT_DATA = "REDIRECT_DATA" + const val ERROR_DATA = "ERROR_DATA" + const val REJECTION_DATA = "REJECTION_DATA" + enum class JourneyType(val type: String) { POST_PURCHASE("post_purchase") } diff --git a/app/src/main/java/com/naviapp/utils/Ext.kt b/app/src/main/java/com/naviapp/utils/Ext.kt index 004e224705..372209683c 100644 --- a/app/src/main/java/com/naviapp/utils/Ext.kt +++ b/app/src/main/java/com/naviapp/utils/Ext.kt @@ -43,6 +43,7 @@ import com.navi.base.model.CtaData import com.navi.base.sharedpref.CommonPrefConstants import com.navi.base.sharedpref.PreferenceManager import com.navi.base.utils.BaseUtils +import com.navi.base.utils.orTrue import com.navi.common.managers.PermissionsManager import com.navi.common.model.Money import com.navi.common.utils.Constants @@ -574,13 +575,21 @@ fun getBaseUrl(): String { return BuildConfig.BASE_URL } fun isAllMandatoryPermissionGranted(activity: Activity): Boolean { + return isAllMandatoryPermissionGranted(PermissionsManager(activity)) +} + +fun isAllMandatoryPermissionGranted(permissionsManager: PermissionsManager?): Boolean { val listOfPermissions = PreferenceManager.getHashSet(Constants.LIST_OF_PERMISSION) - val permissionsManager = PermissionsManager(activity) return listOfPermissions?.let { - permissionsManager.hasPermissions(it.toTypedArray()) + permissionsManager?.hasPermissions(it.toTypedArray()).orTrue() } ?: run { true } } +fun isUserNotExitedPromotionScreen() = + PreferenceManager.getBooleanPreference(Constants.PROMOTION_SCREEN_VISITED, false) && + PreferenceManager.getBooleanPreference(Constants.PROMOTION_SCREEN_CTA_CLICKED, false) + .not() + fun isSecondaryCtaAvailable(metadata: JSONObject?): Boolean { return metadata?.optString(Constants.SECONDARY_URL).isNullOrEmpty().not() } diff --git a/app/src/main/java/com/naviapp/utils/MockUtil.kt b/app/src/main/java/com/naviapp/utils/MockUtil.kt index 6b20357a6b..09eb83c35b 100644 --- a/app/src/main/java/com/naviapp/utils/MockUtil.kt +++ b/app/src/main/java/com/naviapp/utils/MockUtil.kt @@ -22,9 +22,12 @@ import com.navi.naviwidgets.validations.BaseInputValidation import com.navi.naviwidgets.validations.ValidationJsonDeserializer import com.navi.naviwidgets.widgets.NaviWidgetJsonDeserializer import com.navi.naviwidgets.widgets.ParameterValueJsonDeserializer +import com.navi.uitron.deserializer.BaseUiTronTriggerApiActionDeserializer import com.navi.uitron.deserializer.ComposePropertyDeserializer import com.navi.uitron.deserializer.UiTronDataDeserializer import com.navi.uitron.deserializer.UiTronValidationDeserializer +import com.navi.uitron.model.UiTronResponse +import com.navi.uitron.model.action.TriggerApiAction import com.navi.uitron.model.data.UiTronAction import com.navi.uitron.model.data.UiTronData import com.navi.uitron.model.ui.BaseProperty @@ -54,3 +57,25 @@ fun mockApiResponse( .create() return RepoResult(customGson.fromJson(jsonElement, type)) } + +fun mockApiResponse2( + type: Type, + jsonKey: String, + source: Int = R.raw.mock +): RepoResult { + val inputStream = NaviApplication.instance.resources.openRawResource(source) + val dataString = String(inputStream.readBytes(), StandardCharsets.UTF_8) + val jsonElement = (JsonParser.parseString(dataString) as? JsonObject)?.get(jsonKey) + val customGson = + GsonBuilder() + .registerTypeAdapter(UiTronData::class.java, UiTronDataDeserializer()) + .registerTypeAdapter(UiTronBaseValidation::class.java, UiTronValidationDeserializer()) + .registerTypeAdapter(BaseProperty::class.java, ComposePropertyDeserializer()) + .registerTypeAdapter(UiTronAction::class.java, UiTronActionDeserializer()) + .registerTypeAdapter( + TriggerApiAction::class.java, + BaseUiTronTriggerApiActionDeserializer() + ) + .create() + return RepoResult(customGson.fromJson(jsonElement, type)) +} diff --git a/app/src/main/java/com/naviapp/utils/Utility.kt b/app/src/main/java/com/naviapp/utils/Utility.kt index 40a5be1df4..e179795efd 100644 --- a/app/src/main/java/com/naviapp/utils/Utility.kt +++ b/app/src/main/java/com/naviapp/utils/Utility.kt @@ -62,12 +62,13 @@ import com.naviapp.models.ColorData import com.naviapp.models.RedirectPageStatus import com.naviapp.models.response.WidgetConfig import com.naviapp.models.response.WidgetConfigLayoutParams -import com.naviapp.personalloanrevamp.error.activity.ErrorScreenV2Activity -import com.naviapp.personalloanrevamp.error.activity.ErrorScreenV2Activity.Companion.ERROR_DATA -import com.naviapp.personalloanrevamp.error.activity.ErrorScreenV2Activity.Companion.REDIRECT_DATA +import com.naviapp.common.navigator.NaviDeepLinkNavigator.ERROR_V2 +import com.naviapp.common.navigator.NaviDeepLinkNavigator.getPersonalLoanDynamicModuleIntent +import com.naviapp.permission.activities.MandatePermissionActivity import com.naviapp.personalloanrevamp.models.response.BottomSheetConfig import com.naviapp.registration.SplashActivity import com.naviapp.utils.Constants.ATLEAST_ONE_ALPHANUMERIC +import com.naviapp.utils.Constants.ERROR_DATA import com.naviapp.utils.Constants.HYPERVERGE_FILES_PATH import com.naviapp.utils.Constants.INDIAN_COUNTRY_CODE import com.naviapp.utils.Constants.MINIMUM_NUMBER_OF_CHARACTERS_IN_NAME @@ -77,6 +78,7 @@ import com.naviapp.utils.Constants.NAVI_PACKAGE_FPS import com.naviapp.utils.Constants.NAVI_PACKAGE_FPS_NON_PROD import com.naviapp.utils.Constants.NAVI_PACKAGE_NON_PROD import com.naviapp.utils.Constants.PLAY_STORE_REQUEST_CODE +import com.naviapp.utils.Constants.REDIRECT_DATA import com.naviapp.utils.Constants.UTF_8 import com.naviapp.utils.Constants.VALID_COMPANY_NAME_REGEX import com.naviapp.utils.Constants.VALID_NAME_REGEX @@ -137,7 +139,7 @@ fun deleteCacheAndOpenLoginPage(context: Context = NaviApplication.instance) { } } -fun clearHypervergeData(){ +fun clearHypervergeData() { try { val file = File(ContextWrapper(NaviApplication.instance).applicationInfo.dataDir + HYPERVERGE_FILES_PATH) @@ -152,10 +154,10 @@ fun clearHypervergeData(){ fun handleError(errors: List?, redirectPageStatus: RedirectPageStatus?) { val context = NaviApplication.instance.applicationContext val intent = - /*if (errors?.firstOrNull()?.isNewJourneyCustomer.orFalse()) - Intent(context, ErrorScreenV2Activity::class.java) - else Intent(context, ErrorActivity::class.java)*/ - Intent(context, ErrorScreenV2Activity::class.java) + getPersonalLoanDynamicModuleIntent( + context = context, + url = ERROR_V2 + ) intent.putExtra(ERROR_DATA, errors?.firstOrNull()) intent.putExtra(REDIRECT_DATA, redirectPageStatus) intent.addFlags( @@ -942,3 +944,19 @@ fun toOpenBottomSheet(url: String?): Boolean { return false } } + +fun launchPermissionActivity(activity: Activity, addIntentFlags: Boolean = false, finish: Boolean = true, normalFlow: Boolean = false) { + val intent = Intent(activity, MandatePermissionActivity::class.java) + intent.putExtra(MandatePermissionActivity.NORMAL_PERMISSION_FLOW, normalFlow) + if (addIntentFlags) { + intent.addFlags( + Intent.FLAG_ACTIVITY_NEW_TASK or + Intent.FLAG_ACTIVITY_CLEAR_TASK or + Intent.FLAG_ACTIVITY_CLEAR_TOP + ) + } + activity.startActivity(intent) + if (finish) { + activity.finish() + } +} diff --git a/app/src/main/res/drawable/bg_lottie_dance_floor.xml b/app/src/main/res/drawable/bg_lottie_dance_floor.xml new file mode 100644 index 0000000000..0023769c8e --- /dev/null +++ b/app/src/main/res/drawable/bg_lottie_dance_floor.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/finserv_logo_purple.xml b/app/src/main/res/drawable/finserv_logo_purple.xml new file mode 100644 index 0000000000..0d99a4b467 --- /dev/null +++ b/app/src/main/res/drawable/finserv_logo_purple.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/finserv_logo_white.xml b/app/src/main/res/drawable/finserv_logo_white.xml new file mode 100644 index 0000000000..8471792c09 --- /dev/null +++ b/app/src/main/res/drawable/finserv_logo_white.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_purple_checkbox.xml b/app/src/main/res/drawable/ic_purple_checkbox.xml new file mode 100644 index 0000000000..a5851421f5 --- /dev/null +++ b/app/src/main/res/drawable/ic_purple_checkbox.xml @@ -0,0 +1,13 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_dynamic_delivery.xml b/app/src/main/res/layout/activity_dynamic_delivery.xml new file mode 100644 index 0000000000..cb2c19f35f --- /dev/null +++ b/app/src/main/res/layout/activity_dynamic_delivery.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_login_permission.xml b/app/src/main/res/layout/activity_login_permission.xml index be6d430501..da22b479a0 100644 --- a/app/src/main/res/layout/activity_login_permission.xml +++ b/app/src/main/res/layout/activity_login_permission.xml @@ -13,14 +13,14 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/white" tools:context=".permission.activities.MandatePermissionActivity"> @@ -43,6 +42,9 @@ android:id="@+id/rvContent" android:layout_width="match_parent" android:layout_height="@dimen/dp_0" + android:background="@color/white" + android:clipChildren="false" + android:clipToPadding="false" android:paddingStart="@dimen/dp_16" android:paddingEnd="@dimen/dp_16" app:layout_constraintBottom_toTopOf="@id/rvFooter" @@ -54,6 +56,8 @@ android:id="@+id/rvFooter" android:layout_width="match_parent" android:layout_height="wrap_content" + android:background="@drawable/ic_background_gradient_white" + android:paddingTop="@dimen/dp_16" android:paddingStart="@dimen/dp_16" android:paddingEnd="@dimen/dp_16" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/layout/activity_permission_v2.xml b/app/src/main/res/layout/activity_permission_v2.xml index 3fb2f612c3..e6c640e977 100644 --- a/app/src/main/res/layout/activity_permission_v2.xml +++ b/app/src/main/res/layout/activity_permission_v2.xml @@ -11,10 +11,6 @@ - - @@ -53,42 +49,20 @@ android:visibility="gone" app:layout_constraintTop_toBottomOf="@id/header_description_view" /> - + app:layout_constraintTop_toBottomOf="@id/permission_denied_layout_v2" /> - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/app_settings_items.xml b/app/src/main/res/layout/app_settings_items.xml new file mode 100644 index 0000000000..2402a2e11d --- /dev/null +++ b/app/src/main/res/layout/app_settings_items.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_home_ln.xml b/app/src/main/res/layout/fragment_home_ln.xml index e8a837c2c7..5bb30deba0 100644 --- a/app/src/main/res/layout/fragment_home_ln.xml +++ b/app/src/main/res/layout/fragment_home_ln.xml @@ -83,7 +83,7 @@ app:layout_constraintStart_toStartOf="parent" app:srcCompat="@drawable/ic_scroll_nudge" /> + + diff --git a/app/src/main/res/layout/otp_fragment.xml b/app/src/main/res/layout/otp_fragment.xml index 2dadd79d5f..e988f38bee 100644 --- a/app/src/main/res/layout/otp_fragment.xml +++ b/app/src/main/res/layout/otp_fragment.xml @@ -49,6 +49,20 @@ app:layout_constraintTop_toBottomOf="@+id/enter_otp_tv" app:layout_constraintTop_toTopOf="@+id/enter_otp_tv" /> + + - + app:layout_constraintTop_toBottomOf="@id/otp_layout" + tools:visibility="visible" /> - + app:layout_constraintTop_toBottomOf="@id/countdown_timer_tv" + tools:visibility="visible" /> EMI Amount We collect and monitor only your non personal messages related to bank transactions, names of the transacting parties, a description of transaction and amount of transaction for the purpose of performing credit risk assessment. No personal SMS data is collected, read or stored. Helps understand your financial profile + Customised product recommendations based on your financial behaviour. Installed Apps We collect each installed applications’ metadata information which includes the application name, package name, installed time, updated time, version name and version code of each installed application on your device to assess your credit worthiness by analyzing the type of apps you use and provide you with pre-approved customized loan offers. Location We collect and monitor the information about the location of your device to provide serviceability of your loan application, to reduce the risk associated with your loan application and to provide pre-approved customized loan offers. This also helps us to verify the address, make a better credit risk decision and expedite your KYC process. To check loan serviceability in your area + To complete your KYC details. Contacts As part of the loan journey, we collect all of your phonebook contacts which includes their contact names, phone numbers, account types, favorites (starred) and contact labels to enrich your financial profile. We use this data to determine your social network from your phonebook contacts and identify fraudulent contacts in your network. This helps us in detecting fraud loan applications and reducing credit risk. To identify fraud within network of contacts + Products tailored to what\'s trending around your network. Camera We need your camera access to capture your selfie for identity verification and collection of scanned documents for KYC process. Storage @@ -115,6 +118,7 @@ Phone Device To collect your primary and social account information to verify your identity + To register this device as your trusted device. Our app collects and monitors specific information about your device including your hardware model, RAM, storage; unique device identifiers like IMEI, serial number, SSAID; SIM information that includes network operator, roaming state, MNC and MCC codes, WIFI information that includes MAC address and mobile network information to uniquely identify the devices and ensure that no unauthorized device acts on your behalf to prevent fraud. This also helps us in enriching your credit profile and assess your creditworthiness. Signup @@ -429,7 +433,7 @@ Rate Us Kindly rate your experience Please select rating - Get OTP via call + Get OTP on call Get OTP via call Change You will receive otp via call @@ -558,6 +562,14 @@ Yes. We will be sending the loan agreement to you on WhatsApp. You can also download the agreement from the \'Loan Details\' section on the app. Will I get reminders for EMI payment? Yes. We will send you timely reminders for payments. + How can I reach out to GRO? + Name: Sadiya Naz\nDesignation – Customer Grievance Redressal Officer\nAddress – Navi Finserv Limited, 2nd Floor, Vaishnavi Tech Square, Iballur Village, Taluk, Bagalur, Begur, Bengaluru, Karnataka 560102\nEmail – grievance@navi.com\n\nName: Abhijeet Paul\nDesignation – Customer Grievance Redressal Officer (DLA)\nAddress – Navi Technologies Limited, 9th Floor, Vaishnavi Tech Square, Iballur Village, Taluk, Bagalur, Begur, Bengaluru, Karnataka 560102\nEmail – grievance.ntl@navi.com + What are the Cash Loan features? + 1. Loan amount: Up to Rs. 20 Lakh\n2. Interest Rate: Starting from 9.9% - 45% p.a\n3. Loan Tenure: 3 to 72 months\n4. 100% digital process\n5. Instant money transfer in your bank account\n6. Minimum household income*: Rs. 3,00,000\n7. Processing Fees: Rs. 0 to Rs. 7499\n8. APR (9.9% to 90%) + Is Navi an NBFC? + The Navi App is a digital platform owned by Navi Technologies Private Limited. On the Navi App, loans are provided by Navi Finserv Private Limited (https://navi.com/finserv) which is the registered NBFC. + How can I lodge a complaint? + You can lodge complaint by emailing your request to Navi at help@navi.com What is Auto-debit? Auto-debit is a convenient way by which your EMIs are paid directly from your bank account without the need for you to pay them manually. This eliminates the hassles of reminders and late penalty charges. What is eMandate? What is the difference between Auto-debit and eMandate? @@ -833,6 +845,7 @@ ₹%.2f Payment Cancelled Ok, got it Powered By + powered by Linked Accounts discovered for %s Link these accounts with Onemoney to fetch bank statements @@ -1206,10 +1219,11 @@ Please wait, we are verifying your PAN card Redirecting to\nAccount Aggregator… Verifying bank statement… - Investments \u2022 Loans \u2022 Insurance + Investments \u2022 Loans \u2022 Insurance Invite your friends Sorry, no matching contacts found! please check the name and try again. Contacts + EDIT Keep Original PAN card handy with you Original PAN card Tap to focus @@ -1217,4 +1231,15 @@ Move PAN card closer to the camera Move PAN card away from the camera Please make sure the PAN card is properly visible + Navi PL Dynamic Module + Downloading Cash loan app + Please don\'t close or press back + Please wait…\nWe are installing Cash Loan app + Please wait…\nWe are uninstalling Cash Loan app + App installed successfully! + %1$d%% + of %1$d Kb + #FFFFFF + calculating… + Go to settings diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index bfc2595aae..a489bb3025 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -296,7 +296,7 @@ diff --git a/navi-amc/src/main/res/layout/fund_buy_activity.xml b/navi-amc/src/main/res/layout/fund_buy_activity.xml index 510f946fd3..1718c3ebef 100644 --- a/navi-amc/src/main/res/layout/fund_buy_activity.xml +++ b/navi-amc/src/main/res/layout/fund_buy_activity.xml @@ -7,7 +7,7 @@ android:layout_height="match_parent" android:background="@color/white"> - - diff --git a/navi-amc/src/main/res/layout/sip_calendar_layout.xml b/navi-amc/src/main/res/layout/sip_calendar_layout.xml index 01019860c1..0ed5066635 100644 --- a/navi-amc/src/main/res/layout/sip_calendar_layout.xml +++ b/navi-amc/src/main/res/layout/sip_calendar_layout.xml @@ -10,7 +10,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - ? = null, @SerializedName("divider") var divider: StraightLineWidget? = null, - @SerializedName("requestConfig") val requestConfig: RequestConfig? = null + @SerializedName("requestConfig") val requestConfig: RequestConfig? = null, + @SerializedName("footerText") var footerText: TextFieldData? = null ) : Parcelable @Parcelize diff --git a/navi-common/src/main/java/com/navi/common/ui/activity/BaseActivity.kt b/navi-common/src/main/java/com/navi/common/ui/activity/BaseActivity.kt index 4e68dbe515..e1a2407f30 100644 --- a/navi-common/src/main/java/com/navi/common/ui/activity/BaseActivity.kt +++ b/navi-common/src/main/java/com/navi/common/ui/activity/BaseActivity.kt @@ -203,6 +203,10 @@ abstract class BaseActivity : } } + fun hasPermissions(): Boolean { + return permissionsManager?.hasPermissions().orFalse() + } + private fun initObservers() { feedbackObserver() } diff --git a/navi-common/src/main/java/com/navi/common/ui/fragment/HorizontalActionErrorFragment.kt b/navi-common/src/main/java/com/navi/common/ui/fragment/HorizontalActionErrorFragment.kt index 189546c2c8..8faf0144aa 100644 --- a/navi-common/src/main/java/com/navi/common/ui/fragment/HorizontalActionErrorFragment.kt +++ b/navi-common/src/main/java/com/navi/common/ui/fragment/HorizontalActionErrorFragment.kt @@ -15,6 +15,7 @@ import com.google.gson.Gson import com.navi.base.deeplink.DeepLinkManager import com.navi.base.model.ActionData import com.navi.base.model.CtaData +import com.navi.base.utils.orFalse import com.navi.base.utils.orZero import com.navi.common.R import com.navi.common.databinding.HorizontalActionErrorFragmentBinding @@ -27,6 +28,7 @@ import com.navi.common.utils.GENERAL_ERROR import com.navi.common.utils.NO_INTERNET import com.navi.common.utils.SOCKET_TIMEOUT import com.navi.common.utils.getNetworkType +import com.navi.common.utils.* import com.navi.design.utils.dpToPx class HorizontalActionErrorFragment : BaseBottomSheet() { @@ -67,6 +69,12 @@ class HorizontalActionErrorFragment : BaseBottomSheet() { binding.iconIv.setImageResource(getErrorIcon()) setTitleAndMessage() setAbvText() + setIconVisibility() + } + + private fun setIconVisibility() { + binding.iconIv.visibility = + if (arguments?.getBoolean(HIDE_ICON).orFalse()) View.GONE else View.VISIBLE } private fun trackScreenLaunch() { @@ -199,6 +207,7 @@ class HorizontalActionErrorFragment : BaseBottomSheet() { private const val DIALOG_CANCELABLE = "DIALOG_CANCELABLE" private const val SOURCE_SCREEN = "SOURCE_SCREEN" private const val MODULE_NAME = "MODULE_NAME" + private const val HIDE_ICON = "HIDE_ICON" @JvmStatic fun getInstance( @@ -207,7 +216,8 @@ class HorizontalActionErrorFragment : BaseBottomSheet() { cancelable: Boolean = true, sourceScreenName: String?, secondaryAction: View.OnClickListener? = null, - moduleName: String? = null + moduleName: String? = null, + hideIcon: Boolean = false ) = HorizontalActionErrorFragment().apply { this.action = action @@ -218,6 +228,7 @@ class HorizontalActionErrorFragment : BaseBottomSheet() { putBoolean(DIALOG_CANCELABLE, cancelable) putString(SOURCE_SCREEN, sourceScreenName) putString(MODULE_NAME, moduleName) + putBoolean(HIDE_ICON, hideIcon) } } diff --git a/navi-common/src/main/java/com/navi/common/utils/Constants.kt b/navi-common/src/main/java/com/navi/common/utils/Constants.kt index 5d001ab31a..74272d22e7 100644 --- a/navi-common/src/main/java/com/navi/common/utils/Constants.kt +++ b/navi-common/src/main/java/com/navi/common/utils/Constants.kt @@ -135,4 +135,13 @@ object Constants { const val TERMS_AND_CONDITIONS_URL = "https://navi.com/terms-and-conditions" const val LIST_OF_PERMISSION = "LIST_OF_PERMISSION" const val SKIP_PERMISSION_SCREEN = "SKIP_PERMISSION_SCREEN" + const val HEADER_PERMISSION_GRANTED = "X-Permissions-Granted" + const val PERMISSION_PREFIX = "android.permission." + const val PROMOTION_SCREEN_CTA_CLICKED = "PROMOTION_SCREEN_CTA_CLICKED" + const val PROMOTION_SCREEN_VISITED = "PROMOTION_SCREEN_VISITED" + const val HEADER_INSTALLED_MODULES = "X-Installed-Modules" + const val HEADER_PERMISSIONS = "X-Permissions-Granted" + const val IS_DYNAMIC_MODULE_INSTALLED = "IS_DYNAMIC_MODULE_INSTALLED" + const val DYNAMIC_MODULE_DOWNLOAD_SIZE_IN_BYTES = "DYNAMIC_MODULE_DOWNLOAD_SIZE_IN_BYTES" + const val KEY_UPCOMING_LOAN = "KEY_UPCOMING_LOAN" } diff --git a/navi-common/src/main/java/com/navi/common/utils/DynamicDeliveryUtil.kt b/navi-common/src/main/java/com/navi/common/utils/DynamicDeliveryUtil.kt new file mode 100644 index 0000000000..d177a91a99 --- /dev/null +++ b/navi-common/src/main/java/com/navi/common/utils/DynamicDeliveryUtil.kt @@ -0,0 +1,60 @@ +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.navi.common.utils + +import com.google.android.play.core.splitinstall.SplitInstallManager +import com.google.android.play.core.splitinstall.SplitInstallManagerFactory +import com.google.android.play.core.splitinstall.SplitInstallRequest +import com.navi.base.sharedpref.PreferenceManager.getBooleanPreferenceApp +import com.navi.base.sharedpref.PreferenceManager.getLongPreferenceApp +import com.navi.base.sharedpref.PreferenceManager.setBooleanPreferenceApp +import com.navi.base.sharedpref.PreferenceManager.setLongPreferenceApp +import com.navi.common.CommonLibManager +import com.navi.common.utils.Constants.DYNAMIC_MODULE_DOWNLOAD_SIZE_IN_BYTES +import com.navi.common.utils.Constants.IS_DYNAMIC_MODULE_INSTALLED + +fun getSplitInstallManager() = SplitInstallManagerFactory.create(CommonLibManager.application) + +fun getInstalledDynamicModules(splitInstallManager: SplitInstallManager): Set = + splitInstallManager.installedModules + +fun isDynamicModuleInstalled(moduleName: String) = + getInstalledDynamicModulesCommaSeparated().contains(moduleName) + +fun getInstalledDynamicModulesCommaSeparated( + splitInstallManager: SplitInstallManager = getSplitInstallManager() +) = + if (getDynamicModuleInstallationStatus()) + getInstalledDynamicModules(splitInstallManager).joinToString(separator = COMMA) + else EMPTY + +fun installDynamicModules(moduleNames: List) { + getSplitInstallManager() + .startInstall( + SplitInstallRequest.newBuilder().apply { moduleNames.forEach { addModule(it) } }.build() + ) + + setDynamicModuleInstallationStatus(isInstalled = true) +} + +fun uninstallDynamicModules(moduleNames: List) { + getSplitInstallManager().deferredUninstall(moduleNames) + + setDynamicModuleInstallationStatus(isInstalled = false) +} + +fun setDynamicModuleInstallationStatus(isInstalled: Boolean) = + setBooleanPreferenceApp(IS_DYNAMIC_MODULE_INSTALLED, isInstalled) + +fun getDynamicModuleInstallationStatus() = getBooleanPreferenceApp(IS_DYNAMIC_MODULE_INSTALLED) + +fun setDynamicModuleDownloadSizeInBytes(downloadSizeInBytes: Long) = + setLongPreferenceApp(DYNAMIC_MODULE_DOWNLOAD_SIZE_IN_BYTES, downloadSizeInBytes) + +fun getDynamicModuleDownloadSizeInBytes(fallbackDownloadSize: Long = 500000) = + getLongPreferenceApp(DYNAMIC_MODULE_DOWNLOAD_SIZE_IN_BYTES, fallbackDownloadSize) diff --git a/navi-common/src/main/java/com/navi/common/utils/Keys.kt b/navi-common/src/main/java/com/navi/common/utils/Keys.kt index 7adba36399..6140c4ea6e 100644 --- a/navi-common/src/main/java/com/navi/common/utils/Keys.kt +++ b/navi-common/src/main/java/com/navi/common/utils/Keys.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2019-2022 by Navi Technologies Limited + * * Copyright © 2019-2023 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -15,3 +15,4 @@ const val BACKSLASH = "\"" const val RETRY = "retry" const val ERROR = "error" const val SEPARATOR = "__" +const val PERCENT = "%" diff --git a/navi-common/src/main/java/com/navi/common/utils/TemporaryStorageHelper.kt b/navi-common/src/main/java/com/navi/common/utils/TemporaryStorageHelper.kt index 5cd817171c..b2d91dbd89 100644 --- a/navi-common/src/main/java/com/navi/common/utils/TemporaryStorageHelper.kt +++ b/navi-common/src/main/java/com/navi/common/utils/TemporaryStorageHelper.kt @@ -28,6 +28,7 @@ object TemporaryStorageHelper { var isHomePageApiInProgress = false var isBottomNavApiInProgress = false var isInvestmentPageApiInProgress = false + var isPermissionSkipFlow = false fun clear() { apiResponse.clear() diff --git a/navi-amc/src/main/res/layout/header_layout.xml b/navi-common/src/main/res/layout/header_layout.xml similarity index 100% rename from navi-amc/src/main/res/layout/header_layout.xml rename to navi-common/src/main/res/layout/header_layout.xml diff --git a/navi-design/src/main/java/com/navi/design/utils/AnimationUtils.kt b/navi-design/src/main/java/com/navi/design/utils/AnimationUtils.kt index efac8b4ea6..84a894d6c3 100644 --- a/navi-design/src/main/java/com/navi/design/utils/AnimationUtils.kt +++ b/navi-design/src/main/java/com/navi/design/utils/AnimationUtils.kt @@ -9,6 +9,8 @@ package com.navi.design.utils import android.animation.ObjectAnimator import android.view.View +import android.view.animation.Animation +import android.view.animation.TranslateAnimation import androidx.core.animation.doOnEnd import androidx.core.animation.doOnStart import androidx.core.view.isVisible @@ -63,3 +65,16 @@ fun moveViewWithDistanceAnimator( start() } } + +fun setShakeAnimation(vararg views: View) { + try { + val animation = + TranslateAnimation(0F, 30F, 0F, 0F).apply { + duration = 100L + repeatCount = 5 + repeatMode = Animation.REVERSE + } + views.forEach { it.animation = animation } + animation.start() + } catch (_: Exception) { } +} diff --git a/navi-design/src/main/res/drawable/checkbox_green_button.xml b/navi-design/src/main/res/drawable/checkbox_green_button.xml new file mode 100644 index 0000000000..a0b968c53d --- /dev/null +++ b/navi-design/src/main/res/drawable/checkbox_green_button.xml @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/navi-design/src/main/res/drawable/checkbox_green_checked.xml b/navi-design/src/main/res/drawable/checkbox_green_checked.xml new file mode 100644 index 0000000000..10a02fcdb8 --- /dev/null +++ b/navi-design/src/main/res/drawable/checkbox_green_checked.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/navi-design/src/main/res/drawable/checkbox_green_unchecked.xml b/navi-design/src/main/res/drawable/checkbox_green_unchecked.xml new file mode 100644 index 0000000000..467c8ffc7e --- /dev/null +++ b/navi-design/src/main/res/drawable/checkbox_green_unchecked.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/navi-design/src/main/res/values/colors.xml b/navi-design/src/main/res/values/colors.xml index 7a8e4556a5..79f311529c 100644 --- a/navi-design/src/main/res/values/colors.xml +++ b/navi-design/src/main/res/values/colors.xml @@ -251,4 +251,6 @@ #4DB0C0D9 #80B0C0D9 #7853D3 + #1F002A + #8F1F002A diff --git a/navi-payment/src/main/java/com/navi/payment/base/PaymentManager.kt b/navi-payment/src/main/java/com/navi/payment/base/PaymentManager.kt index c6834c677d..84c4d99f68 100644 --- a/navi-payment/src/main/java/com/navi/payment/base/PaymentManager.kt +++ b/navi-payment/src/main/java/com/navi/payment/base/PaymentManager.kt @@ -1,3 +1,10 @@ +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + package com.navi.payment.base import android.app.Activity @@ -37,7 +44,9 @@ import com.navi.payment.utils.toSignalActionType import kotlinx.coroutines.* import java.lang.ref.WeakReference -class PaymentManager constructor(private val repository: PaymentRepository = PaymentRepository()) : ViewModel() { +class PaymentManager( + private val repository: PaymentRepository = PaymentRepository() +) : ViewModel() { private var activityRef: WeakReference? = null private var paymentListener: PaymentListener? = null @@ -313,4 +322,4 @@ class PaymentManager constructor(private val repository: PaymentRepository = Pay paymentListener = null rpdListener = null } -} \ No newline at end of file +} diff --git a/navi-pl/build.gradle b/navi-pl/build.gradle deleted file mode 100644 index 2c4aec943a..0000000000 --- a/navi-pl/build.gradle +++ /dev/null @@ -1,41 +0,0 @@ -plugins { - id 'com.android.library' - id 'org.jetbrains.kotlin.android' -} - -android { - namespace 'com.navi.pl' - compileSdk 32 - - defaultConfig { - minSdk 21 - targetSdk 32 - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles "consumer-rules.pro" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - kotlinOptions { - jvmTarget = '1.8' - } -} - -dependencies { - - implementation "androidx.core:core-ktx:$core_version" - implementation "androidx.appcompat:appcompat:$appcompat_version" - implementation "com.google.android.material:material:$material_version" - testImplementation "junit:junit:$junit_version" - androidTestImplementation "androidx.test.ext:junit:$android_junit_version" - androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_version" -} diff --git a/navi-pl/consumer-rules.pro b/navi-pl/consumer-rules.pro deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/navi-pl/src/main/AndroidManifest.xml b/navi-pl/src/main/AndroidManifest.xml deleted file mode 100644 index 8c89ca082b..0000000000 --- a/navi-pl/src/main/AndroidManifest.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/navi-vkyc/src/main/java/com/navi/vkyc/presentation/fragments/VKYCWaitingForExecutiveFragment.kt b/navi-vkyc/src/main/java/com/navi/vkyc/presentation/fragments/VKYCWaitingForExecutiveFragment.kt index 77c72bd145..ebc359ab8b 100644 --- a/navi-vkyc/src/main/java/com/navi/vkyc/presentation/fragments/VKYCWaitingForExecutiveFragment.kt +++ b/navi-vkyc/src/main/java/com/navi/vkyc/presentation/fragments/VKYCWaitingForExecutiveFragment.kt @@ -11,17 +11,11 @@ import android.app.Activity import android.media.AudioManager import android.os.Bundle import android.os.CountDownTimer -import android.os.Handler -import android.os.Looper -import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.View.GONE -import android.view.View.INVISIBLE import android.view.View.VISIBLE import android.view.ViewGroup -import android.widget.TextView -import androidx.compose.material.Divider import androidx.core.content.res.ResourcesCompat import androidx.core.view.isVisible import androidx.lifecycle.ViewModelProvider @@ -56,8 +50,6 @@ import com.navi.naviwidgets.models.response.StraightLineWidget import com.navi.naviwidgets.models.response.StraightLineWidgetData import com.navi.naviwidgets.models.response.StyleString import com.navi.naviwidgets.models.response.TextFieldData -import com.navi.naviwidgets.utils.ZERO -import com.navi.uitron.utils.IconUtils import com.navi.vkyc.R import com.navi.vkyc.common.VkycScreens import com.navi.vkyc.constants.ApiConstants @@ -73,7 +65,6 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.joda.time.DateTimeConstants.MINUTES_PER_HOUR import org.joda.time.DateTimeConstants.SECONDS_PER_MINUTE -import java.util.* @AndroidEntryPoint class VKYCWaitingForExecutiveFragment : BaseFragment(), NaviHeaderView.InteractionListener, @@ -184,7 +175,7 @@ class VKYCWaitingForExecutiveFragment : BaseFragment(), NaviHeaderView.Interacti val footer = ItemFooter( styledText = TextFieldData( text = getString(R.string.keep_original_pan_card_handy_with_you), - textColor = "#444444", + textColor = Colors.TEXT_COLOR_INSTRUCTIONS, size = 12, font = FontWeightEnum.TT_REGULAR.name, substringStyles = listOf( @@ -194,7 +185,7 @@ class VKYCWaitingForExecutiveFragment : BaseFragment(), NaviHeaderView.Interacti ) ) ), - hexColor = "#EBEBEB" + hexColor = Colors.COLOR_BG_GREY ) waitingPageDetailsResponse.content?.itemFooter = footer @@ -203,10 +194,10 @@ class VKYCWaitingForExecutiveFragment : BaseFragment(), NaviHeaderView.Interacti icon = ImageFieldData(iconCode = Constants.ICON_INFO_RED_VKYC), title = TextFieldData( text = getString(R.string.important_note), - textColor = "#FF5732", + textColor = Colors.COLOR_ORANGE_TITLE_TEXT, font = FontWeightEnum.TT_MEDIUM.name ), - bgColor = "#FFF3F0", + bgColor = Colors.COLOR_ORANGE_TITLE, padding = Padding( startDp = 12f, endDp = 0f, @@ -220,7 +211,7 @@ class VKYCWaitingForExecutiveFragment : BaseFragment(), NaviHeaderView.Interacti icon = ImageFieldData(iconCode = Constants.ICON_CLOTHS), title = TextFieldData( text = getString(R.string.be_suitably_dressed), - textColor = "#444444", + textColor = Colors.TEXT_COLOR_INSTRUCTIONS, font = FontWeightEnum.TT_REGULAR.name, size = 10 ) @@ -230,7 +221,7 @@ class VKYCWaitingForExecutiveFragment : BaseFragment(), NaviHeaderView.Interacti icon = ImageFieldData(iconCode = Constants.ICON_LIGHTING), title = TextFieldData( text = getString(R.string.ensure_proper_lighting), - textColor = "#444444", + textColor = Colors.TEXT_COLOR_INSTRUCTIONS, font = FontWeightEnum.TT_REGULAR.name, size = 10 ) @@ -240,7 +231,7 @@ class VKYCWaitingForExecutiveFragment : BaseFragment(), NaviHeaderView.Interacti icon = ImageFieldData(iconCode = Constants.ICON_CLOTHS), title = TextFieldData( text = getString(R.string.have_good_internet), - textColor = "#444444", + textColor = Colors.TEXT_COLOR_INSTRUCTIONS, font = FontWeightEnum.TT_REGULAR.name, size = 10 ) @@ -259,6 +250,15 @@ class VKYCWaitingForExecutiveFragment : BaseFragment(), NaviHeaderView.Interacti waitingPageDetailsResponse.content?.divider = divider + val footerText = TextFieldData( + text = getString(R.string.please_dont_close_app_text), + textColor = Colors.COLOR_TEXT_GREY, + size = 10, + font = FontWeightEnum.TT_SEMI_BOLD.name + ) + + waitingPageDetailsResponse.content?.footerText = footerText + binder = waitingPageDetailsResponse.content importantNote.divider1.rootView.update( @@ -285,14 +285,6 @@ class VKYCWaitingForExecutiveFragment : BaseFragment(), NaviHeaderView.Interacti showLowVolumeToast() } - /*importantNote.importantNoteCl.background = getNaviDrawable( - shape = DrawableShape.RECTANGLE, - cornerRadius = resources.getDimension(R.dimen.dp_8).toInt(), - backgroundColor = ContextCompat.getColor(requireContext(), R.color.white), - strokeWidth = response.content?.importantNote?.border?.widthDp?.toInt(), - strokeColor = response.content?.importantNote?.border?.color?.parseColorSafe() - )*/ - timerCard.divider.setVisibilityState(VISIBLE) waitingPageDetailsResponse.content?.timerDurationInSeconds?.let { @@ -332,18 +324,6 @@ class VKYCWaitingForExecutiveFragment : BaseFragment(), NaviHeaderView.Interacti } } - timerCard.timerDescriptionTs.apply { - removeAllViews() - setFactory { TextView(context).apply { gravity = Gravity.CENTER } } - showWhenDataIsAvailable( - waitingPageDetailsResponse.content?.timerDescriptionList, - Timer(), - period = DEFAULT_SLIDE_PERIOD_TIME - ) { - Handler(Looper.getMainLooper()).post { setText(it) } - } - } - setStyledText( timerCard.timerDescriptionTv, waitingPageDetailsResponse.content?.postTimerDescription, @@ -362,22 +342,6 @@ class VKYCWaitingForExecutiveFragment : BaseFragment(), NaviHeaderView.Interacti ResourcesCompat.getColor(resources, R.color.white, null), cornerRadius = resources.getDimension(R.dimen.dp_8).toInt() ) - - waitingPageDetailsResponse.content - ?.importantNote - ?.footerTag - ?.backgroundColor - ?.let { - /*importantNote.footerLl.background = - getNaviDrawable( - backgroundColor = it.parseColorSafe(), - radii = - CornerRadius( - rightBottom = resources.getDimension(R.dimen.dp_8), - leftBottom = resources.getDimension(R.dimen.dp_8) - ) - )*/ - } } startTime = System.currentTimeMillis() onPageResponseReceived(waitingPageDetailsResponse.content?.requestConfig) @@ -516,6 +480,15 @@ class VKYCWaitingForExecutiveFragment : BaseFragment(), NaviHeaderView.Interacti private const val FOUR_SECONDS = 4L private const val ONE_SECOND = 1L private const val FORTY = 40 + + object Colors { + const val TEXT_COLOR_INSTRUCTIONS = "#444444" + const val COLOR_BG_GREY = "#EBEBEB" + const val COLOR_TEXT_GREY = "#191919" + const val COLOR_ORANGE_TITLE_TEXT = "#FF5732" + const val COLOR_ORANGE_TITLE = "#FFF3F0" + } + fun getInstance(bundle: Bundle?): VKYCWaitingForExecutiveFragment { return VKYCWaitingForExecutiveFragment().apply { arguments = bundle } } diff --git a/navi-vkyc/src/main/res/layout/vkyc_timer_card_layout.xml b/navi-vkyc/src/main/res/layout/vkyc_timer_card_layout.xml index 42162e7d56..1ab08b0e1f 100644 --- a/navi-vkyc/src/main/res/layout/vkyc_timer_card_layout.xml +++ b/navi-vkyc/src/main/res/layout/vkyc_timer_card_layout.xml @@ -73,11 +73,11 @@ android:layout_marginHorizontal="@dimen/layout_dp_16" android:layout_marginTop="@dimen/layout_dp_24" android:textAlignment="center" + android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/divider" app:setStyledText="@{binder.timerTitle}" - app:visibility="@{binder.timerTitle != null}" tools:text="Your VKYC will start in" /> + tools:text="You are one step away from getting your loan" + tools:visibility="visible" /> + + + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/barrier" + app:layout_constraintVertical_bias="1" /> diff --git a/navi-vkyc/src/main/res/layout/vkyc_waiting_for_executive.xml b/navi-vkyc/src/main/res/layout/vkyc_waiting_for_executive.xml index e5c01011d5..d9735bfd0d 100644 --- a/navi-vkyc/src/main/res/layout/vkyc_waiting_for_executive.xml +++ b/navi-vkyc/src/main/res/layout/vkyc_waiting_for_executive.xml @@ -8,7 +8,8 @@ --> + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> @@ -33,13 +34,14 @@ + android:orientation="vertical" + android:paddingBottom="@dimen/layout_dp_48"> + + diff --git a/navi-vkyc/src/main/res/values/strings.xml b/navi-vkyc/src/main/res/values/strings.xml index 74df9163ec..5faa9e595f 100644 --- a/navi-vkyc/src/main/res/values/strings.xml +++ b/navi-vkyc/src/main/res/values/strings.xml @@ -49,4 +49,5 @@ Be suitably dressed Ensure proper lighting Have good internet + Please don\'t close the application or press back button. diff --git a/navi-widgets/src/main/java/com/navi/naviwidgets/extensions/WidgetExt.kt b/navi-widgets/src/main/java/com/navi/naviwidgets/extensions/WidgetExt.kt index e1a91a1369..9228d5ea28 100644 --- a/navi-widgets/src/main/java/com/navi/naviwidgets/extensions/WidgetExt.kt +++ b/navi-widgets/src/main/java/com/navi/naviwidgets/extensions/WidgetExt.kt @@ -1187,6 +1187,15 @@ fun LottieAnimationView.showWhenDataIsAvailable( LottieEnums.REWARD_COIN.name -> { setAnimation(R.raw.reward_coin) } + LottieEnums.DYNAMIC_DELIVERY_DOWNLOADING.name -> { + setAnimation(R.raw.dynamic_delivery_downloading) + } + LottieEnums.DYNAMIC_DELIVERY_INSTALLING.name -> { + setAnimation(R.raw.dynamic_delivery_installing) + } + LottieEnums.DYNAMIC_DELIVERY_INSTALLED.name -> { + setAnimation(R.raw.dynamic_delivery_installed) + } else -> { isInAppLottie = false CoroutineScope(Dispatchers.Main).launch { diff --git a/navi-widgets/src/main/java/com/navi/naviwidgets/models/ActionButtonWidget.kt b/navi-widgets/src/main/java/com/navi/naviwidgets/models/ActionButtonWidget.kt index 71b6186a34..b7da79edba 100644 --- a/navi-widgets/src/main/java/com/navi/naviwidgets/models/ActionButtonWidget.kt +++ b/navi-widgets/src/main/java/com/navi/naviwidgets/models/ActionButtonWidget.kt @@ -42,6 +42,8 @@ data class ActionButtonWidgetData( val timerInfo: TimerInfo? = null, @SerializedName("backgroundShapeData") val backgroundShapeData: BackgroundShapeData? = null, + @SerializedName("updateTitle") + var updateTitle: String? = null, @SerializedName("timerExpiryBottomSheetData") val timerExpiryBottomSheetData: List? = null ) : Serializable diff --git a/navi-widgets/src/main/java/com/navi/naviwidgets/models/StepsWidget.kt b/navi-widgets/src/main/java/com/navi/naviwidgets/models/StepsWidget.kt index 4cc4c7363c..706e4e12b6 100644 --- a/navi-widgets/src/main/java/com/navi/naviwidgets/models/StepsWidget.kt +++ b/navi-widgets/src/main/java/com/navi/naviwidgets/models/StepsWidget.kt @@ -1,6 +1,7 @@ package com.navi.naviwidgets.models import com.google.gson.annotations.SerializedName +import com.navi.design.textview.model.NaviSpan import com.navi.naviwidgets.models.response.WidgetError import com.navi.naviwidgets.widgets.textdisplay.Padding import java.io.Serializable @@ -48,7 +49,11 @@ data class StepsWidgetExtraData( data class StepsWidgetErrorData( @SerializedName("titleColor") - val titleColor: String? = null, + val titleColor: List? = null, @SerializedName("icon") - val icon: String? = null + val icon: String? = null, + @SerializedName("permissionIcon") + val permissionIcon: String? = null, + @SerializedName("shakeAnimation") + val shakeAnimation: Boolean? = null ) diff --git a/navi-widgets/src/main/java/com/navi/naviwidgets/models/response/AdvertisementWidget.kt b/navi-widgets/src/main/java/com/navi/naviwidgets/models/response/AdvertisementWidget.kt index 250c4107cf..5381d3de94 100644 --- a/navi-widgets/src/main/java/com/navi/naviwidgets/models/response/AdvertisementWidget.kt +++ b/navi-widgets/src/main/java/com/navi/naviwidgets/models/response/AdvertisementWidget.kt @@ -63,6 +63,7 @@ data class ContentData( @SerializedName("descriptionTextSwitcherConfig") val descriptionTextSwitcherConfig: AdvertisementWidgetTextSwitcherConfig? = null, @SerializedName("offerData") val offerData: TextWithStyle? = null, @SerializedName("actionData") val actionData: ActionData? = null, + @SerializedName("disclaimer") val disclaimer: TextWithStyle? = null, @SerializedName("gradient") val gradient: Gradient? = null, @SerializedName("subsequentLoanLandingPage") val subsequentLoanLandingPage: UpcomingLoanDetail? = null, diff --git a/navi-widgets/src/main/java/com/navi/naviwidgets/models/response/Footer.kt b/navi-widgets/src/main/java/com/navi/naviwidgets/models/response/Footer.kt index 90c2f55c26..ac79eb01a4 100644 --- a/navi-widgets/src/main/java/com/navi/naviwidgets/models/response/Footer.kt +++ b/navi-widgets/src/main/java/com/navi/naviwidgets/models/response/Footer.kt @@ -30,7 +30,8 @@ data class Footer( @SerializedName("nextCtaStyledTitle") val nextCtaStyledTitle: StyledTextWithIconCode? = null, @SerializedName("backCtaStyledTitle") val backCtaStyledTitle: StyledTextWithIconCode? = null, @SerializedName("backgroundDrawableData") val backgroundDrawableData: BackgroundDrawableData? = null, - @SerializedName("radius") val radius: Int? = null + @SerializedName("radius") val radius: Int? = null, + @SerializedName("topInfoTitle") val topInfoTitle: TextFieldData? = null, ) : Parcelable @Parcelize diff --git a/navi-widgets/src/main/java/com/navi/naviwidgets/models/response/HomeProductWidget.kt b/navi-widgets/src/main/java/com/navi/naviwidgets/models/response/HomeProductWidget.kt index be01e7b633..e1840ee29f 100644 --- a/navi-widgets/src/main/java/com/navi/naviwidgets/models/response/HomeProductWidget.kt +++ b/navi-widgets/src/main/java/com/navi/naviwidgets/models/response/HomeProductWidget.kt @@ -64,6 +64,8 @@ data class ProductDetailsData( @SerializedName("gradient") val gradient: Gradient? = null, @SerializedName("bgColor") val bgColor: String? = null, @SerializedName("label") val label: Label? = null, + @SerializedName("disclaimer") val disclaimer: TextWithStyle? = null, + @SerializedName("optionalDisclaimer") val optionalDisclaimer: TextWithStyle? = null, @SerializedName("showOnlySubProducts") val showOnlySubProducts: Boolean? = false ) : Serializable diff --git a/navi-widgets/src/main/java/com/navi/naviwidgets/utils/LottieEnums.kt b/navi-widgets/src/main/java/com/navi/naviwidgets/utils/LottieEnums.kt index 4ee19b3aef..3e8d9f8342 100644 --- a/navi-widgets/src/main/java/com/navi/naviwidgets/utils/LottieEnums.kt +++ b/navi-widgets/src/main/java/com/navi/naviwidgets/utils/LottieEnums.kt @@ -73,6 +73,8 @@ enum class LottieEnums { GETTING_THERE_QUIZ_ANIM, CONTACT_BOOK_LOTTIE, GROWTH_LOTTIE, - REWARD_COIN - + REWARD_COIN, + DYNAMIC_DELIVERY_DOWNLOADING, + DYNAMIC_DELIVERY_INSTALLING, + DYNAMIC_DELIVERY_INSTALLED } diff --git a/navi-widgets/src/main/java/com/navi/naviwidgets/utils/NaviWidgetIconUtils.kt b/navi-widgets/src/main/java/com/navi/naviwidgets/utils/NaviWidgetIconUtils.kt index f052ef57d9..28d7436b33 100644 --- a/navi-widgets/src/main/java/com/navi/naviwidgets/utils/NaviWidgetIconUtils.kt +++ b/navi-widgets/src/main/java/com/navi/naviwidgets/utils/NaviWidgetIconUtils.kt @@ -107,6 +107,7 @@ object NaviWidgetIconUtils { private const val CALL_ICON = "CALL_ICON" private const val CALL_NEW_ICON = "CALL_NEW_ICON" private const val RATE_ICON = "RATE_ICON" + private const val INTERNAL_APP_SETTINGS_ICON = "INTERNAL_APP_SETTINGS_ICON" private const val SHARE_APP_ICON = "SHARE_APP_ICON" private const val NOTIFICATION_ICON = "NOTIFICATION_ICON" private const val PRIVACY_POLICY_ICON = "PRIVACY_POLICY_ICON" @@ -601,6 +602,7 @@ object NaviWidgetIconUtils { private const val DOCUMENT_LOAN_DETAILS = "DOCUMENT_LOAN_DETAILS" private const val RUPPE_COIN_IN_HAND = "RUPPE_COIN_IN_HAND" private const val RUPPE_COIN_WITH_TICK = "RUPPE_COIN_WITH_TICK" + private const val ICON_CASH_LOAN_SETTINGS = "ICON_CASH_LOAN_SETTINGS" private const val WAIT_CLOCK_ICON = "WAIT_CLOCK_ICON" private const val PERMISSION_LOCATION = "PERMISSION_LOCATION" private const val PERMISSION_CONTACT = "PERMISSION_CONTACT" @@ -621,6 +623,15 @@ object NaviWidgetIconUtils { private const val PURPLE_CHEVRON = "PURPLE_CHEVRON" private const val GREEN_TICK_MARK = "GREEN_TICK_MARK" private const val RED_TICK_MARK = "RED_TICK_MARK" + private const val SMS_ALLOWED_PURPLE_THEME = "SMS_ALLOWED_PURPLE_THEME" + private const val CONTACTS_ALLOWED_PURPLE_THEME = "CONTACTS_ALLOWED_PURPLE_THEME" + private const val DEVICE_ALLOWED_PURPLE_THEME = "DEVICE_ALLOWED_PURPLE_THEME" + private const val LOCATION_ALLOWED_PURPLE_THEME = "LOCATION_ALLOWED_PURPLE_THEME" + private const val NEW_PURPLE_CHEVRON = "NEW_PURPLE_CHEVRON" + private const val SMS_DENIED_ICON = "SMS_DENIED_ICON" + private const val DEVICE_DENIED_ICON = "DEVICE_DENIED_ICON" + private const val CONTACTS_DENIED_ICON = "CONTACTS_DENIED_ICON" + private const val LOCATION_DENIED_ICON = "LOCATION_DENIED_ICON" private const val ICON_CLOCK_LIGHT_ORANGE = "ICON_CLOCK_LIGHT_ORANGE" private const val ICON_INFO_RED_VKYC = "ICON_INFO_RED_VKYC" private const val ICON_CLOTHS = "ICON_CLOTHS" @@ -714,6 +725,7 @@ object NaviWidgetIconUtils { EMAIL_ICON -> R.drawable.ic_email_red_svg CALL_ICON -> R.drawable.ic_call_svg RATE_ICON -> R.drawable.ic_rate_us_red_svg + INTERNAL_APP_SETTINGS_ICON -> R.drawable.ic_internal_app_settings_svg SHARE_APP_ICON -> R.drawable.ic_share_svg NOTIFICATION_ICON -> R.drawable.ic_notifications_svg PRIVACY_POLICY_ICON -> R.drawable.ic_privacy_poilcy_svg @@ -1290,6 +1302,15 @@ object NaviWidgetIconUtils { PURPLE_CHEVRON -> R.drawable.ic_new_purple_chevron GREEN_TICK_MARK -> R.drawable.ic_green_success_new RED_TICK_MARK -> R.drawable.ic_red_alert_error_new + SMS_ALLOWED_PURPLE_THEME -> R.drawable.ic_sms_new_purple_theme + CONTACTS_ALLOWED_PURPLE_THEME -> R.drawable.ic_contacts_new_purple_theme + DEVICE_ALLOWED_PURPLE_THEME -> R.drawable.ic_device_new_purple_theme + LOCATION_ALLOWED_PURPLE_THEME -> R.drawable.ic_location_new_purple_theme + NEW_PURPLE_CHEVRON -> R.drawable.ic_new_chevron_purple_theme + SMS_DENIED_ICON -> R.drawable.ic_sms_denied + DEVICE_DENIED_ICON -> R.drawable.ic_device_denied + CONTACTS_DENIED_ICON -> R.drawable.ic_contacts_denied + LOCATION_DENIED_ICON -> R.drawable.ic_location_denied ICON_INFO_RED_VKYC -> R.drawable.ic_important ICON_CLOTHS -> R.drawable.ic_suitable_clothing ICON_LIGHTING -> R.drawable.ic_proper_lighting @@ -1297,6 +1318,7 @@ object NaviWidgetIconUtils { ICON_CLOCK_LIGHT_ORANGE -> R.drawable.ic_clock_light_orange ATTENTION_ICON -> R.drawable.ic_attention CIRCULAR_GREY_TICK_SMALL -> R.drawable.ic_round_grey_tick + ICON_CASH_LOAN_SETTINGS -> R.drawable.ic_cash_loan_settings_svg else -> -1 } } diff --git a/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/ActionButtonWidgetLayout.kt b/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/ActionButtonWidgetLayout.kt index 02e6c75ab8..1f5ad06ee5 100644 --- a/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/ActionButtonWidgetLayout.kt +++ b/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/ActionButtonWidgetLayout.kt @@ -141,7 +141,16 @@ class ActionButtonWidgetLayout @JvmOverloads constructor( } } + private fun updateTitle() { + binding.apply { + info.widgetData?.updateTitle?.let { titleText -> + tvAction.text = titleText + } + } + } + fun updateActionButton() { setActionButtonState() + updateTitle() } } diff --git a/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/AdvertisementWidgetLayout.kt b/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/AdvertisementWidgetLayout.kt index a9d7432b24..7bc7d2a2cd 100644 --- a/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/AdvertisementWidgetLayout.kt +++ b/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/AdvertisementWidgetLayout.kt @@ -115,6 +115,7 @@ class AdvertisementWidgetLayout(context: Context, attributeSet: AttributeSet) : setDescriptionTextSwitcherProperties() setDescriptionExtraProperties() offerText.setSpannableString(widgetData.advertisementWidgetData?.content?.offerData) + disclaimerTv.setSpannableString(widgetData.advertisementWidgetData?.content?.disclaimer) widgetData.advertisementWidgetData?.content?.subsequentLoanLandingPage?.let { data -> actionBtn.setProperties(widgetData.advertisementWidgetData?.content?.actionData) root.setOnClickListener { setClickListenerData(data) } @@ -131,8 +132,12 @@ class AdvertisementWidgetLayout(context: Context, attributeSet: AttributeSet) : } } } + widgetData.advertisementWidgetData?.content?.disclaimer?.let { + (actionBtn.layoutParams as MarginLayoutParams).bottomMargin = dpToPxInInt(16) + } ?: kotlin.run { + (actionBtn.layoutParams as MarginLayoutParams).bottomMargin = dpToPxInInt(32) + } widgetData.advertisementWidgetData?.content?.steps?.let { - (actionBtn.layoutParams as MarginLayoutParams).bottomMargin = dpToPxInInt(64) stepsView.setVisibilityState(VISIBLE) stepsView.background = getNaviDrawable( diff --git a/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/HomeProductWidgetLayout.kt b/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/HomeProductWidgetLayout.kt index c193d984a6..cb0a5f1fa7 100644 --- a/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/HomeProductWidgetLayout.kt +++ b/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/HomeProductWidgetLayout.kt @@ -90,6 +90,8 @@ class HomeProductWidgetLayout(context: Context, attributeSet: AttributeSet) : productTitle.setSpannableString(widgetData.homeProductWidgetData?.productDetails?.title) productLottie.showWhenDataIsAvailable(widgetData.homeProductWidgetData?.productDetails?.lottieFile) productSubtitle.setSpannableString(widgetData.homeProductWidgetData?.productDetails?.subtitle) + disclaimerTv.setSpannableString(widgetData.homeProductWidgetData?.productDetails?.disclaimer) + optionalDisclaimerTv.setSpannableString(widgetData.homeProductWidgetData?.productDetails?.optionalDisclaimer) widgetData.homeProductWidgetData?.productDetails?.bgColor?.let { productCard.setBackgroundColor(it.parseColorSafe()) } diff --git a/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/StepsWidgetLayout.kt b/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/StepsWidgetLayout.kt index ba029295c1..0b63b68fe9 100644 --- a/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/StepsWidgetLayout.kt +++ b/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/StepsWidgetLayout.kt @@ -6,6 +6,7 @@ import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import androidx.core.view.isVisible +import com.navi.base.model.ImageDetail import com.navi.base.utils.isNotNull import com.navi.design.utils.dpToPxInInt import com.navi.design.utils.spannedText @@ -17,8 +18,8 @@ import com.navi.naviwidgets.models.StepsWidget import com.navi.naviwidgets.utils.CIRCULAR import com.navi.naviwidgets.utils.DOTTED import com.navi.naviwidgets.utils.ICON -import com.navi.naviwidgets.utils.SELECTED_CIRCULAR import com.navi.naviwidgets.utils.NaviWidgetIconUtils +import com.navi.naviwidgets.utils.SELECTED_CIRCULAR class StepsWidgetLayout @JvmOverloads constructor( context: Context, @@ -139,8 +140,18 @@ class StepsWidgetLayout @JvmOverloads constructor( stepsWidget?.widgetData?.extraData?.enabled?.let { state -> val leftIcon = NaviWidgetIconUtils.getIconResourceId( if (state) { + binding.titleTv.text = stepsWidget?.widgetData?.title?.text.spannedText( + context = context, + span = stepsWidget?.widgetData?.title?.span + ) + binding.icon.showWhenDataIsAvailable(imageDetail = ImageDetail(url = stepsWidget?.widgetData?.iconCode)) stepsWidget?.widgetData?.extraData?.successIcon.orEmpty() } else { + binding.titleTv.text = stepsWidget?.widgetData?.title?.text.spannedText( + context = context, + span = stepsWidget?.widgetData?.errorData?.titleColor + ) + binding.icon.showWhenDataIsAvailable(imageDetail = ImageDetail(url = stepsWidget?.widgetData?.errorData?.permissionIcon)) stepsWidget?.widgetData?.errorData?.icon.orEmpty() } ) diff --git a/navi-widgets/src/main/res/drawable/ic_background_gradient_white.xml b/navi-widgets/src/main/res/drawable/ic_background_gradient_white.xml new file mode 100644 index 0000000000..4da276a25d --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_background_gradient_white.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + diff --git a/navi-widgets/src/main/res/drawable/ic_call_new_theme.xml b/navi-widgets/src/main/res/drawable/ic_call_new_theme.xml new file mode 100644 index 0000000000..7f27c910a9 --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_call_new_theme.xml @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navi-widgets/src/main/res/drawable/ic_cash_loan_settings_svg.xml b/navi-widgets/src/main/res/drawable/ic_cash_loan_settings_svg.xml new file mode 100644 index 0000000000..6ffe211876 --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_cash_loan_settings_svg.xml @@ -0,0 +1,55 @@ + + + + + + + + + + diff --git a/navi-widgets/src/main/res/drawable/ic_contacts_denied.xml b/navi-widgets/src/main/res/drawable/ic_contacts_denied.xml new file mode 100644 index 0000000000..b2a315fa7e --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_contacts_denied.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + diff --git a/navi-widgets/src/main/res/drawable/ic_contacts_new_purple_theme.xml b/navi-widgets/src/main/res/drawable/ic_contacts_new_purple_theme.xml new file mode 100644 index 0000000000..d7fc4e80a4 --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_contacts_new_purple_theme.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + diff --git a/navi-widgets/src/main/res/drawable/ic_device_denied.xml b/navi-widgets/src/main/res/drawable/ic_device_denied.xml new file mode 100644 index 0000000000..94e438fbeb --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_device_denied.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + diff --git a/navi-widgets/src/main/res/drawable/ic_device_new_purple_theme.xml b/navi-widgets/src/main/res/drawable/ic_device_new_purple_theme.xml new file mode 100644 index 0000000000..674c54fe51 --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_device_new_purple_theme.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + diff --git a/navi-widgets/src/main/res/drawable/ic_internal_app_settings_svg.xml b/navi-widgets/src/main/res/drawable/ic_internal_app_settings_svg.xml new file mode 100644 index 0000000000..45d4af2f9f --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_internal_app_settings_svg.xml @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/navi-widgets/src/main/res/drawable/ic_location_denied.xml b/navi-widgets/src/main/res/drawable/ic_location_denied.xml new file mode 100644 index 0000000000..e5fb2eb729 --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_location_denied.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + diff --git a/navi-widgets/src/main/res/drawable/ic_location_new_purple_theme.xml b/navi-widgets/src/main/res/drawable/ic_location_new_purple_theme.xml new file mode 100644 index 0000000000..d32e2dc945 --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_location_new_purple_theme.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + diff --git a/navi-widgets/src/main/res/drawable/ic_new_chevron_purple_theme.xml b/navi-widgets/src/main/res/drawable/ic_new_chevron_purple_theme.xml new file mode 100644 index 0000000000..a972b8029b --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_new_chevron_purple_theme.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/navi-widgets/src/main/res/drawable/ic_no_call.xml b/navi-widgets/src/main/res/drawable/ic_no_call.xml new file mode 100644 index 0000000000..5f053bfb51 --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_no_call.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + diff --git a/navi-widgets/src/main/res/drawable/ic_purple_selected_state.xml b/navi-widgets/src/main/res/drawable/ic_purple_selected_state.xml new file mode 100644 index 0000000000..5f2f3f9270 --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_purple_selected_state.xml @@ -0,0 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/navi-widgets/src/main/res/drawable/ic_purple_unselected_state.xml b/navi-widgets/src/main/res/drawable/ic_purple_unselected_state.xml new file mode 100644 index 0000000000..e291780737 --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_purple_unselected_state.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/navi-widgets/src/main/res/drawable/ic_resend_new_theme.xml b/navi-widgets/src/main/res/drawable/ic_resend_new_theme.xml new file mode 100644 index 0000000000..18473342fd --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_resend_new_theme.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/navi-widgets/src/main/res/drawable/ic_sms_denied.xml b/navi-widgets/src/main/res/drawable/ic_sms_denied.xml new file mode 100644 index 0000000000..e61a90549d --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_sms_denied.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + diff --git a/navi-widgets/src/main/res/drawable/ic_sms_new_purple_theme.xml b/navi-widgets/src/main/res/drawable/ic_sms_new_purple_theme.xml new file mode 100644 index 0000000000..5c0b147ae7 --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_sms_new_purple_theme.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + diff --git a/navi-widgets/src/main/res/drawable/ic_whatsapp_right_arrow.xml b/navi-widgets/src/main/res/drawable/ic_whatsapp_right_arrow.xml new file mode 100644 index 0000000000..be344f95d7 --- /dev/null +++ b/navi-widgets/src/main/res/drawable/ic_whatsapp_right_arrow.xml @@ -0,0 +1,24 @@ + + + + + + + diff --git a/navi-widgets/src/main/res/drawable/rounded_grey_4_radius_f5f5f5.xml b/navi-widgets/src/main/res/drawable/rounded_grey_4_radius_f5f5f5.xml new file mode 100644 index 0000000000..efef0644a9 --- /dev/null +++ b/navi-widgets/src/main/res/drawable/rounded_grey_4_radius_f5f5f5.xml @@ -0,0 +1,16 @@ + + + + + + + + + + \ No newline at end of file diff --git a/navi-widgets/src/main/res/layout/advertisment_widget_layout.xml b/navi-widgets/src/main/res/layout/advertisment_widget_layout.xml index 0d8014d8b5..da718c0ccc 100644 --- a/navi-widgets/src/main/res/layout/advertisment_widget_layout.xml +++ b/navi-widgets/src/main/res/layout/advertisment_widget_layout.xml @@ -147,24 +147,28 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="@dimen/dp_24" - android:layout_marginBottom="@dimen/dp_24" /> + android:layout_marginBottom="@dimen/dp_32" /> + + + + - - diff --git a/navi-widgets/src/main/res/layout/home_product_widget_layout.xml b/navi-widgets/src/main/res/layout/home_product_widget_layout.xml index 5f2597fd6a..69b9375081 100644 --- a/navi-widgets/src/main/res/layout/home_product_widget_layout.xml +++ b/navi-widgets/src/main/res/layout/home_product_widget_layout.xml @@ -115,11 +115,36 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/dp_16" android:layout_marginTop="@dimen/dp_24" - android:layout_marginBottom="@dimen/dp_16" - app:layout_constraintBottom_toTopOf="@id/product_strategy" + android:layout_marginBottom="@dimen/dp_6" + app:layout_goneMarginBottom="@dimen/dp_16" + app:layout_constraintBottom_toTopOf="@id/disclaimer_tv" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/product_subtitle" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/error/activity/ErrorScreenV2Activity.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/ErrorScreenV2Activity.kt similarity index 91% rename from app/src/main/java/com/naviapp/personalloanrevamp/error/activity/ErrorScreenV2Activity.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/ErrorScreenV2Activity.kt index 5c0e204886..4a72019919 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/error/activity/ErrorScreenV2Activity.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/ErrorScreenV2Activity.kt @@ -5,8 +5,9 @@ * */ -package com.naviapp.personalloanrevamp.error.activity +package com.navi.pl.dynamic.activity +import android.content.Context import android.content.Intent import android.os.Bundle import android.view.View @@ -15,6 +16,7 @@ import androidx.core.view.isVisible import androidx.databinding.DataBindingUtil import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider +import com.google.android.play.core.splitcompat.SplitCompat import com.navi.analytics.utils.NaviTrackEvent import com.navi.base.model.CtaData import com.navi.base.model.StyledTextWithIconCode @@ -27,7 +29,11 @@ import com.navi.common.network.models.GenericErrorResponse import com.navi.common.ui.activity.BaseActivity import com.navi.common.utils.log import com.navi.common.utils.observeNonNull -import com.naviapp.R +import com.navi.pl.dynamic.R +import com.navi.pl.dynamic.activity.LoanEligibilityLoaderV2Activity.Companion.IS_UW_REJECTION +import com.navi.pl.dynamic.databinding.PlActivityErrorScreenV2Binding +import com.navi.pl.dynamic.fragment.ErrorV2Fragment +import com.navi.pl.dynamic.fragment.MFIErrorFragmentV2 import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.NaviHeaderView import com.naviapp.common.navigator.NaviDeepLinkNavigator @@ -35,20 +41,21 @@ import com.naviapp.common.navigator.ScreenNavigator import com.naviapp.common.viewmodel.ActiveLoanDetailsVM import com.naviapp.dashboard.rating.RatingActivity import com.naviapp.dashboard.rating.RatingChangeListener -import com.naviapp.databinding.ActivityErrorScreenV2Binding import com.naviapp.errors.viewmodels.ErrorVM import com.naviapp.models.RedirectPageStatus import com.naviapp.personalloan.getloan.activities.GetLoanActivity import com.naviapp.personalloan.getloan.common.fragment.CustomerSupportFragment -import com.naviapp.personalloanrevamp.error.fragments.ErrorV2Fragment -import com.naviapp.personalloanrevamp.error.fragments.MFIErrorFragmentV2 import com.naviapp.personalloanrevamp.models.FLOW_REJECTION import com.naviapp.personalloanrevamp.models.RejectionDetailsResponseV2 -import com.naviapp.personalloanrevamp.useridentificationv2.activities.LoanEligibilityLoaderV2Activity.Companion.IS_UW_REJECTION -import com.naviapp.utils.* +import com.naviapp.utils.Constants +import com.naviapp.utils.EMPTY +import com.naviapp.utils.getLendingModuleNameFromWidgetId +import com.naviapp.utils.hideRatingWidget +import com.naviapp.utils.showRatingWidget +import com.naviapp.R as appR class ErrorScreenV2Activity : BaseActivity(), NaviHeaderView.InteractionListener { - private lateinit var binding: ActivityErrorScreenV2Binding + private lateinit var binding: PlActivityErrorScreenV2Binding private var errorData: GenericErrorResponse? = null private var redirectStatusData: RedirectPageStatus? = null @@ -69,7 +76,7 @@ class ErrorScreenV2Activity : BaseActivity(), NaviHeaderView.InteractionListener override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) initializeData(savedInstanceState) - binding = DataBindingUtil.setContentView(this, R.layout.activity_error_screen_v2) + binding = DataBindingUtil.setContentView(this, R.layout.pl_activity_error_screen_v2) super.setContentView(binding.root) initError(viewModel, actionErrorV2Enabled = true) initObservers() @@ -134,12 +141,12 @@ class ErrorScreenV2Activity : BaseActivity(), NaviHeaderView.InteractionListener error.content?.nextCta?.let { binding.primaryAction.visibility = View.VISIBLE binding.primaryAction.setProperties( - error.content.nextCta.title ?: resources.getString(R.string.go_home) + it.title ?: resources.getString(appR.string.go_home) ) binding.primaryAction.setOnClickListener { NaviDeepLinkNavigator.navigate( this, - CtaData(url = error.content.nextCta.url), + CtaData(url = error.content?.nextCta?.url), null ) } @@ -257,9 +264,9 @@ class ErrorScreenV2Activity : BaseActivity(), NaviHeaderView.InteractionListener } } binding.ratingViewLay.isVisible = true - binding.ratingViewLay.setBackgroundResource(R.drawable.bg_rounded_rect_with_shadow) + binding.ratingViewLay.setBackgroundResource(appR.drawable.bg_rounded_rect_with_shadow) binding.ratingViewLay.setListener(ratingListener) - binding.ratingViewLay.setData(getString(R.string.rate_us)) + binding.ratingViewLay.setData(getString(appR.string.rate_us)) showRatingWidget(binding.ratingViewLay, this) analyticsEventTracker.onRatingWidgetShown() } @@ -375,7 +382,12 @@ class ErrorScreenV2Activity : BaseActivity(), NaviHeaderView.InteractionListener const val PROFILE_NOT_ELIGIBLE_DUE_TO_MFI = "PROFILE_NOT_ELIGIBLE_DUE_TO_MFI" const val APPLICATION_ON_HOLD = "APPLICATION_ON_HOLD" const val ERROR_TYPE = "ERROR_TYPE" - const val LOAN_OFFER_EXPIRED = "LOAN_OFFER_EXPIRED" - const val SYSTEM_UNDER_MAINTENANCE = "SYSTEM_UNDER_MAINTENANCE" + } + + override fun attachBaseContext(newBase: Context?) { + super.attachBaseContext(newBase) + if (newBase != null) { + SplitCompat.installActivity(newBase) + } } } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/activities/GetLoanV2Activity.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/GetLoanV2Activity.kt similarity index 93% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/activities/GetLoanV2Activity.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/GetLoanV2Activity.kt index cb45e9e485..20d0028e9b 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/activities/GetLoanV2Activity.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/GetLoanV2Activity.kt @@ -5,9 +5,10 @@ * */ -package com.naviapp.personalloanrevamp.getloanRevamp.activities +package com.navi.pl.dynamic.activity import android.app.Activity +import android.content.Context import android.content.Intent import android.os.Bundle import android.os.Handler @@ -22,6 +23,7 @@ import co.hyperverge.hypersnapsdk.objects.HVError import co.hyperverge.hypersnapsdk.objects.HVResponse import com.digitap.dtokyc.exception.DTException import com.digitap.dtokyc.handler.OKYCListener +import com.google.android.play.core.splitcompat.SplitCompat import com.navi.analytics.utils.NaviTrackEvent import com.navi.base.model.CtaData import com.navi.base.model.LineItem @@ -41,7 +43,16 @@ import com.navi.common.utils.log import com.navi.payment.razorpay.RazorpayHelper import com.navi.payment.utils.PaymentAnalytics import com.navi.payment.utils.ProviderType -import com.naviapp.R +import com.navi.pl.dynamic.R +import com.navi.pl.dynamic.activity.ErrorScreenV2Activity.Companion.IS_KYC_REJECTION +import com.navi.pl.dynamic.activity.LoanEligibilityLoaderV2Activity.Companion.OFFER +import com.navi.pl.dynamic.databinding.PlActivityGetLoanV2Binding +import com.navi.pl.dynamic.fragment.KycV2Fragment +import com.navi.pl.dynamic.fragment.LoanDetailsEditorFragment +import com.navi.pl.dynamic.fragment.VideoKycV2Fragment +import com.navi.pl.dynamic.helper.AddressHelper.isValidRequestCode +import com.navi.pl.dynamic.helper.GetLoanV2Helper +import com.navi.pl.dynamic.listener.UpdateKycStateListener import com.naviapp.analytics.utils.LoadTimeEventTracker import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.NaviHeaderView @@ -49,10 +60,13 @@ import com.naviapp.common.listeners.BackListener import com.naviapp.common.navigator.NaviDeepLinkNavigator import com.naviapp.common.navigator.ScreenNavigator import com.naviapp.dashboard.listeners.FragmentInteractionListener -import com.naviapp.databinding.ActivityGetLoanV2Binding import com.naviapp.models.EnachData import com.naviapp.models.RedirectPageStatus -import com.naviapp.models.request.* +import com.naviapp.models.request.EnachRequest +import com.naviapp.models.request.FailurePayload +import com.naviapp.models.request.SelfieSetting +import com.naviapp.models.request.SelfieUploadRequestData +import com.naviapp.models.request.SuccessPayload import com.naviapp.models.response.EnachMandateDetailsResponse import com.naviapp.network.ApiConstants import com.naviapp.personalloan.getloan.bankdetailsautodebit.viewmodels.EnachSharedVM @@ -69,15 +83,8 @@ import com.naviapp.personalloan.getloan.kyc.models.AadhaarVerificationData import com.naviapp.personalloan.getloan.kyc.models.SupportedOvd import com.naviapp.personalloan.getloan.kyc.utils.DocumentType import com.naviapp.personalloan.getloan.kyc.viewmodels.KycSharedVM -import com.naviapp.personalloanrevamp.addressverificationrevamp.helper.AddressHelper.isValidRequestCode -import com.naviapp.personalloanrevamp.error.activity.ErrorScreenV2Activity.Companion.IS_KYC_REJECTION -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.LoanDetailsV2Fragment -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper +import com.naviapp.personalloanrevamp.getloanRevamp.fragments.BankDetailsAutoDebitV2Fragment import com.naviapp.personalloanrevamp.getloanRevamp.viewmodels.GetLoanV2SharedVM -import com.naviapp.personalloanrevamp.kyc.fragment.KycV2Fragment -import com.naviapp.personalloanrevamp.kyc.fragment.VideoKycV2Fragment -import com.naviapp.personalloanrevamp.kyc.listener.UpdateKycStateListener -import com.naviapp.personalloanrevamp.useridentificationv2.activities.LoanEligibilityLoaderV2Activity.Companion.OFFER import com.naviapp.personalloanrevamp.models.EMPTY_ERROR_CODE_BY_3rd_PARTY import com.naviapp.personalloanrevamp.models.EMPTY_REASON_BY_3rd_PARTY import com.naviapp.selfiecapture.SelfieErrorData @@ -90,21 +97,20 @@ import com.naviapp.utils.EMPTY import com.naviapp.utils.IconUtils import com.razorpay.PaymentData import com.razorpay.PaymentResultWithDataListener -import dagger.hilt.android.AndroidEntryPoint import `in`.digio.sdk.esign.DigioResponse import `in`.digio.sdk.esign.DigioResponseListener import org.json.JSONObject +import com.naviapp.R as appR -@AndroidEntryPoint class GetLoanV2Activity : BaseActivity(), FragmentInteractionListener, - NaviHeaderView.InteractionListener, LoanDetailsV2Fragment.UpdateUiListener, + NaviHeaderView.InteractionListener, BankDetailsAutoDebitV2Fragment.UpdateUiListener, UpdateKycStateListener, SelfieCaptureListener, AadhaarVerificationListener, OKYCListener, PaymentResultWithDataListener, DigioResponseListener, EnachProvider, DocCaptureCompletionHandler, EnachListener { private val kycSharedVM by lazy { ViewModelProvider(this)[KycSharedVM::class.java] } private var currentScreen: String = EMPTY - private lateinit var binding: ActivityGetLoanV2Binding + private lateinit var binding: PlActivityGetLoanV2Binding private val sharedVM by lazy { ViewModelProvider(this)[GetLoanV2SharedVM::class.java] } private val loadTimeEventTracker = LoadTimeEventTracker() private val selfieVerificationHelper: SelfieVerificationHelper? by lazy { @@ -122,7 +128,7 @@ class GetLoanV2Activity : BaseActivity(), FragmentInteractionListener, override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding = DataBindingUtil.setContentView(this, R.layout.activity_get_loan_v2) + binding = DataBindingUtil.setContentView(this, R.layout.pl_activity_get_loan_v2) super.setContentView(binding.root) initListeners() handleIntentData() @@ -149,9 +155,9 @@ class GetLoanV2Activity : BaseActivity(), FragmentInteractionListener, override fun navigateTo(screen: String, bundle: Bundle?) { deInitSharedObservers() if (isDead()) return - val fragmentTag = GetLoanV2ViewHelper.getTag(screen) + val fragmentTag = GetLoanV2Helper.getTag(screen) val fragment = supportFragmentManager.findFragmentByTag(fragmentTag) - ?: GetLoanV2ViewHelper.getFragment(screen, bundle) + ?: GetLoanV2Helper.getFragment(screen, bundle) fragment?.let { frag -> frag.arguments = bundle ?: Bundle() @@ -182,7 +188,7 @@ class GetLoanV2Activity : BaseActivity(), FragmentInteractionListener, override fun onActivityCompleted(screen: String?, bundle: Bundle?) {} private fun updateCurrentScreen(screen: String, bundle: Bundle? = null) { - currentScreen = GetLoanV2ViewHelper.getScreenName(screen, bundle) + currentScreen = GetLoanV2Helper.getScreenName(screen, bundle) } override fun getCurrentFragmentScreenName(): String { @@ -318,7 +324,7 @@ class GetLoanV2Activity : BaseActivity(), FragmentInteractionListener, Handler(Looper.getMainLooper()).postDelayed( { binding.autopaySuccessAnimationHolderFl.setBackgroundColor( - ContextCompat.getColor(this, R.color.green) + ContextCompat.getColor(this, appR.color.green) ) startAnimationWhiteBackground() }, Constants.SUCCESS_ANIMATION_WHITE_BG_TIME @@ -329,7 +335,7 @@ class GetLoanV2Activity : BaseActivity(), FragmentInteractionListener, Handler(Looper.getMainLooper()).postDelayed( { binding.autopaySuccessAnimationHolderFl.setBackgroundColor( - ContextCompat.getColor(this, R.color.white) + ContextCompat.getColor(this, appR.color.white) ) }, Constants.SUCCESS_ANIMATION_GREEN_BG_TIME ) @@ -523,7 +529,7 @@ class GetLoanV2Activity : BaseActivity(), FragmentInteractionListener, Handler(Looper.getMainLooper()).postDelayed( { binding.kycSuccessAnimationHolderFl.setBackgroundColor( - ContextCompat.getColor(this, R.color.green) + ContextCompat.getColor(this, appR.color.green) ) startKycAnimationWhiteBackground() }, Constants.SUCCESS_ANIMATION_WHITE_BG_TIME @@ -534,7 +540,7 @@ class GetLoanV2Activity : BaseActivity(), FragmentInteractionListener, Handler(Looper.getMainLooper()).postDelayed( { binding.kycSuccessAnimationHolderFl.setBackgroundColor( - ContextCompat.getColor(this, R.color.white) + ContextCompat.getColor(this, appR.color.white) ) }, Constants.SUCCESS_ANIMATION_GREEN_BG_TIME ) @@ -679,4 +685,10 @@ class GetLoanV2Activity : BaseActivity(), FragmentInteractionListener, } } + override fun attachBaseContext(newBase: Context?) { + super.attachBaseContext(newBase) + if (newBase != null) { + SplitCompat.installActivity(newBase) + } + } } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2/IntermediateV2Activity.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/IntermediateV2Activity.kt similarity index 89% rename from app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2/IntermediateV2Activity.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/IntermediateV2Activity.kt index e70ab0dd0b..4a599eae63 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2/IntermediateV2Activity.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/IntermediateV2Activity.kt @@ -5,14 +5,16 @@ * */ -package com.naviapp.personalloanrevamp.intermediatev2 +package com.navi.pl.dynamic.activity import android.app.Activity +import android.content.Context import android.os.Bundle import android.view.View import androidx.databinding.DataBindingUtil import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider +import com.google.android.play.core.splitcompat.SplitCompat import com.navi.base.model.CtaData import com.navi.base.model.StyledTextWithIconCode import com.navi.base.utils.orFalse @@ -20,30 +22,29 @@ import com.navi.common.listeners.FragmentInterchangeListener import com.navi.common.model.ModuleNameV2 import com.navi.common.ui.activity.BaseActivity import com.navi.common.ui.fragment.BaseFragment -import com.naviapp.R +import com.navi.pl.dynamic.R +import com.navi.pl.dynamic.databinding.PlActivityIntermediateV2Binding +import com.navi.pl.dynamic.helper.IntermediateV2Helper import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.NaviHeaderView import com.naviapp.common.listeners.BackListener import com.naviapp.common.navigator.ScreenNavigator -import com.naviapp.databinding.ActivityIntermediateV2Binding import com.naviapp.models.SubPageStatusType import com.naviapp.personalloan.getloan.bankdetails.viewmodels.AggregatorSharedVM import com.naviapp.personalloan.getloan.common.fragment.CustomerSupportFragment -import com.naviapp.personalloanrevamp.intermediatev2.helper.IntermediateV2Helper import com.naviapp.utils.Constants import com.naviapp.utils.Constants.REDIRECTED_FROM_POSITIVE_REINFORCEMENT import com.naviapp.utils.EMPTY import com.naviapp.utils.IconUtils -import dagger.hilt.android.AndroidEntryPoint +import com.naviapp.R as appR -@AndroidEntryPoint class IntermediateV2Activity : BaseActivity(), View.OnClickListener, FragmentInterchangeListener, NaviHeaderView.InteractionListener { - private lateinit var binding: ActivityIntermediateV2Binding + private lateinit var binding: PlActivityIntermediateV2Binding private var currentScreen: String? = null private val helpEventTracker by lazy { NaviAnalytics.naviAnalytics.Faq() } private var headerLeftIconCode: String? = null @@ -56,7 +57,7 @@ class IntermediateV2Activity : override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding = DataBindingUtil.setContentView(this, R.layout.activity_intermediate_v2) + binding = DataBindingUtil.setContentView(this, R.layout.pl_activity_intermediate_v2) super.setContentView(binding.root) redirectedFromPositiveReinforcement = intent?.getStringExtra(REDIRECTED_FROM_POSITIVE_REINFORCEMENT).toBoolean() val screenTag = intent?.extras?.getString(Constants.REDIRECT_STATUS) @@ -73,7 +74,7 @@ class IntermediateV2Activity : setProperties( EMPTY, IconUtils.ICON_CROSS_BLACK, - CtaData(title = resources.getString(R.string.help)) + CtaData(title = resources.getString(appR.string.help)) ) } @@ -96,10 +97,10 @@ class IntermediateV2Activity : override fun onClick(v: View?) { when (v?.id) { - R.id.back_iv -> { + appR.id.back_iv -> { onBackPressed() } - R.id.help_iv -> openHelpInfo() + appR.id.help_iv -> openHelpInfo() } } @@ -204,4 +205,11 @@ class IntermediateV2Activity : companion object { const val KEY_NEEDS_RESULT = "KEY_NEEDS_RESULT" } + + override fun attachBaseContext(newBase: Context?) { + super.attachBaseContext(newBase) + if (newBase != null) { + SplitCompat.installActivity(newBase) + } + } } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/activities/LoanAgreementV2Activity.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/LoanAgreementV2Activity.kt similarity index 93% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/activities/LoanAgreementV2Activity.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/LoanAgreementV2Activity.kt index 2c76052281..305eed62be 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/activities/LoanAgreementV2Activity.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/LoanAgreementV2Activity.kt @@ -5,16 +5,19 @@ * */ -package com.naviapp.personalloanrevamp.getloanRevamp.activities +package com.navi.pl.dynamic.activity import android.app.Activity +import android.content.Context import android.os.Bundle import android.text.TextUtils import android.view.View import androidx.core.view.isVisible import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider +import com.google.android.play.core.splitcompat.SplitCompat import com.navi.base.sharedpref.PreferenceManager +import com.navi.base.utils.orElse import com.navi.common.firebasedb.FirebaseStatusType import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper import com.navi.common.model.ModuleNameV2 @@ -22,23 +25,21 @@ import com.navi.common.model.RequestConfig import com.navi.common.ui.activity.BaseActivity import com.navi.common.utils.ApiPollScheduler import com.navi.common.utils.observeNonNull -import com.navi.insurance.util.FirebaseRemoteConfigUtils -import com.naviapp.R +import com.navi.pl.dynamic.R +import com.navi.pl.dynamic.databinding.PlActivityLoanAgreementV2Binding import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.NaviHeaderView -import com.naviapp.databinding.ActivityLoanAgreementV2Binding import com.naviapp.personalloan.getloan.common.fragment.CustomerSupportFragment import com.naviapp.personalloanrevamp.getloanRevamp.viewmodels.LoanAgreementV2VM import com.naviapp.personalloanrevamp.models.response.FetchLoanAgreementV2Response import com.naviapp.utils.Constants import com.naviapp.utils.LOAN_APPLICATION_ID import com.naviapp.utils.NaviDownloadManager -import com.navi.base.utils.orElse import java.lang.ref.WeakReference class LoanAgreementV2Activity : BaseActivity(), NaviHeaderView.InteractionListener { - private lateinit var binding: ActivityLoanAgreementV2Binding + private lateinit var binding: PlActivityLoanAgreementV2Binding private val viewModel by lazy { ViewModelProvider(this)[LoanAgreementV2VM::class.java] } private var downloadManager: NaviDownloadManager? = null private var loanAgreementV2Data: FetchLoanAgreementV2Response? = null @@ -46,7 +47,7 @@ class LoanAgreementV2Activity : BaseActivity(), NaviHeaderView.InteractionListen private val loanAgreementEventTracker by lazy { NaviAnalytics.naviAnalytics.LoanAgreement(screenName) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding = DataBindingUtil.setContentView(this, R.layout.activity_loan_agreement_v2) + binding = DataBindingUtil.setContentView(this, R.layout.pl_activity_loan_agreement_v2) super.setContentView(binding.root) initError(viewModel, actionErrorV2Enabled = true) initListeners() @@ -185,7 +186,7 @@ class LoanAgreementV2Activity : BaseActivity(), NaviHeaderView.InteractionListen } private fun fetchLoanAgreementPollingDetails() { - val isDataPollingEnabled = FirebaseRemoteConfigUtils.getBoolean(FirebaseRemoteConfigHelper.ENABLE_DATA_POLLING_ON_LOAN_AGREEMENT) + val isDataPollingEnabled = FirebaseRemoteConfigHelper.getBoolean(FirebaseRemoteConfigHelper.ENABLE_DATA_POLLING_ON_LOAN_AGREEMENT) if(isDataPollingEnabled){ PreferenceManager.getStringPreference(LOAN_APPLICATION_ID)?.let { startShimmer() @@ -242,4 +243,11 @@ class LoanAgreementV2Activity : BaseActivity(), NaviHeaderView.InteractionListen const val SANCTION_LETTER_FILE_NAME = "Navi_Personal_loan_Sanction_letter" const val BALANCE_TRANSFER_FILE_NAME = "Balance_Transfer_Request_letter" } + + override fun attachBaseContext(newBase: Context?) { + super.attachBaseContext(newBase) + if (newBase != null) { + SplitCompat.installActivity(newBase) + } + } } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/activities/LoanDisbursementLoaderV2Activity.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/LoanDisbursementLoaderV2Activity.kt similarity index 90% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/activities/LoanDisbursementLoaderV2Activity.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/LoanDisbursementLoaderV2Activity.kt index a7a400f708..b64f7b6c13 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/activities/LoanDisbursementLoaderV2Activity.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/LoanDisbursementLoaderV2Activity.kt @@ -5,8 +5,9 @@ * */ -package com.naviapp.personalloanrevamp.getloanRevamp.activities +package com.navi.pl.dynamic.activity +import android.content.Context import android.os.Bundle import android.os.CountDownTimer import android.os.Handler @@ -16,6 +17,7 @@ import android.view.View import androidx.core.content.ContextCompat import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider +import com.google.android.play.core.splitcompat.SplitCompat import com.navi.analytics.utils.NaviTrackEvent import com.navi.base.model.CtaData import com.navi.base.sharedpref.PreferenceManager @@ -23,32 +25,40 @@ import com.navi.base.utils.orElse import com.navi.base.utils.orFalse import com.navi.base.utils.orZero import com.navi.common.constants.MESSAGE_TEXT -import com.navi.common.firebasedb.* +import com.navi.common.firebasedb.DISBURSEMENT +import com.navi.common.firebasedb.FirebaseDataHelper +import com.navi.common.firebasedb.FirebaseDataReceiveListener +import com.navi.common.firebasedb.FirebaseResponse +import com.navi.common.firebasedb.FirebaseStatusType import com.navi.common.model.ModuleNameV2 import com.navi.common.model.PreviousScreenNameRequest import com.navi.common.model.RequestConfig import com.navi.common.ui.activity.BaseActivity -import com.navi.common.utils.* +import com.navi.common.utils.ApiPollScheduler +import com.navi.common.utils.observeNonNull +import com.navi.common.utils.observeNullable import com.navi.naviwidgets.models.response.RewardWidget import com.navi.naviwidgets.models.response.RewardWidgetData import com.navi.naviwidgets.utils.FORWARD_SLASH -import com.naviapp.R +import com.navi.pl.dynamic.R +import com.navi.pl.dynamic.databinding.PlActivityLoanDisbursementLoaderV2Binding +import com.navi.pl.dynamic.helper.GetLoanV2Helper import com.naviapp.analytics.utils.LoadTimeEventTracker import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.navigator.NaviDeepLinkNavigator import com.naviapp.common.navigator.ScreenNavigator -import com.naviapp.databinding.ActivityLoanDisbursementLoaderV2Binding import com.naviapp.network.ApiErrorTagType import com.naviapp.personalloan.getloan.viewmodels.LoanDisbursementVM -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper import com.naviapp.rewards.ui.RewardDelightActivity -import com.naviapp.utils.* import com.naviapp.utils.Constants import com.naviapp.utils.Constants.LONG_ZERO import com.naviapp.utils.Constants.PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS +import com.naviapp.utils.LOAN_APPLICATION_ID +import com.naviapp.utils.appendStrings +import com.naviapp.R as appR class LoanDisbursementLoaderV2Activity : BaseActivity() { - private lateinit var binding: ActivityLoanDisbursementLoaderV2Binding + private lateinit var binding: PlActivityLoanDisbursementLoaderV2Binding private val viewModel by lazy { ViewModelProvider(this).get(LoanDisbursementVM::class.java) } private var timer: CountDownTimer? = null private val analyticsEventTracker = NaviAnalytics.naviAnalytics.FullPageProcessingDetail(screenName) @@ -57,7 +67,7 @@ class LoanDisbursementLoaderV2Activity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = - DataBindingUtil.setContentView(this, R.layout.activity_loan_disbursement_loader_v2) + DataBindingUtil.setContentView(this, R.layout.pl_activity_loan_disbursement_loader_v2) super.setContentView(binding.root) NaviTrackEvent.sendScreenTransitionEvent(screenName) initError() @@ -194,7 +204,7 @@ class LoanDisbursementLoaderV2Activity : BaseActivity() { url = NaviDeepLinkNavigator.LOAN_APPLICATION_V2.appendStrings( FORWARD_SLASH.toString(), - GetLoanV2ViewHelper.MONEY_DISBURSEMENT_STATUS_V2 + GetLoanV2Helper.MONEY_DISBURSEMENT_STATUS_V2 ) ), bundle = @@ -215,7 +225,7 @@ class LoanDisbursementLoaderV2Activity : BaseActivity() { ) data?.requestId?.let { binding.statusDetailsTv.text = - data.details?.message ?: getString(R.string.sending_amount) + data.details?.message ?: getString(appR.string.sending_amount) initFirebase(it, data.notificationPath.orEmpty()) apiPollInit(it, data.requestConfig) } @@ -268,7 +278,7 @@ class LoanDisbursementLoaderV2Activity : BaseActivity() { } private fun handleTimeOutError() { - binding.statusTv.text = resources.getString(R.string.longer_than_usual) + binding.statusTv.text = resources.getString(appR.string.longer_than_usual) binding.statusDetailsTv.text = viewModel.loanDisbursementResponse.value?.details?.message binding.knowMoreTv.text = null binding.knowMoreTv.visibility = View.VISIBLE @@ -311,8 +321,8 @@ class LoanDisbursementLoaderV2Activity : BaseActivity() { } private fun initUi() { - binding.statusTv.text = getString(R.string.please_wait) - binding.statusDetailsTv.text = getString(R.string.empty_string) + binding.statusTv.text = getString(appR.string.please_wait) + binding.statusDetailsTv.text = getString(appR.string.empty_string) loadTimeEventTracker.onLoadingStarted(NaviAnalytics.PL_LOAN_DISBURSEMENT_LOAD_TIME) fetchDisbursementStatus() analyticsEventTracker.onPLLoanDisbursementPageLand() @@ -388,7 +398,7 @@ class LoanDisbursementLoaderV2Activity : BaseActivity() { .postDelayed( { binding.successAnimationHolderFl.setBackgroundColor( - ContextCompat.getColor(this, R.color.green) + ContextCompat.getColor(this, appR.color.green) ) startAnimationWhiteBackground() }, @@ -401,7 +411,7 @@ class LoanDisbursementLoaderV2Activity : BaseActivity() { .postDelayed( { binding.successAnimationHolderFl.setBackgroundColor( - ContextCompat.getColor(this, R.color.white) + ContextCompat.getColor(this, appR.color.white) ) }, Constants.SUCCESS_ANIMATION_GREEN_BG_TIME @@ -412,7 +422,7 @@ class LoanDisbursementLoaderV2Activity : BaseActivity() { analyticsEventTracker.onLoanDisbursalSuccessMessageShown() loadTimeEventTracker.onLoadingCompleted(NaviAnalytics.PL_LOAN_DISBURSEMENT_LOAD_TIME) if(showSuccessAnimation.orFalse()) { - binding.statusTv.text = getString(R.string.success) + binding.statusTv.text = getString(appR.string.success) binding.statusDetailsTv.text = message binding.loaderG.visibility = View.GONE binding.successAnimationHolderFl.visibility = View.VISIBLE @@ -442,4 +452,11 @@ class LoanDisbursementLoaderV2Activity : BaseActivity() { private const val NEXT_SCREEN_TRANSITION_DELAY = 1000L private const val NUMBER_OF_RETRY = 12 } + + override fun attachBaseContext(newBase: Context?) { + super.attachBaseContext(newBase) + if (newBase != null) { + SplitCompat.installActivity(newBase) + } + } } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/activities/LoanEligibilityLoaderV2Activity.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/LoanEligibilityLoaderV2Activity.kt similarity index 95% rename from app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/activities/LoanEligibilityLoaderV2Activity.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/LoanEligibilityLoaderV2Activity.kt index b9e87732cf..96a4cbe456 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/activities/LoanEligibilityLoaderV2Activity.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/LoanEligibilityLoaderV2Activity.kt @@ -1,12 +1,13 @@ /* * - * * Copyright © 2022-2023 by Navi Technologies Limited + * * Copyright © 2023 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ -package com.naviapp.personalloanrevamp.useridentificationv2.activities +package com.navi.pl.dynamic.activity +import android.content.Context import android.content.Intent import android.os.Bundle import android.os.CountDownTimer @@ -18,33 +19,51 @@ import androidx.core.content.ContextCompat import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope +import com.google.android.play.core.splitcompat.SplitCompat import com.navi.analytics.utils.NaviTrackEvent import com.navi.base.model.CtaData import com.navi.base.sharedpref.PreferenceManager import com.navi.base.utils.isNotNull +import com.navi.base.utils.orElse import com.navi.base.utils.orFalse import com.navi.base.utils.orTrue import com.navi.base.utils.orZero -import com.navi.common.firebasedb.* +import com.navi.common.firebasedb.FirebaseDataHelper +import com.navi.common.firebasedb.FirebaseDataReceiveListener +import com.navi.common.firebasedb.FirebaseResponse +import com.navi.common.firebasedb.FirebaseStatusType +import com.navi.common.firebasedb.OFFER_GENERATE +import com.navi.common.firebasedb.PERMISSION +import com.navi.common.firebasedb.PRE_ELIGIBILITY +import com.navi.common.firebasedb.UPDATE_LOCATION import com.navi.common.lottie.LottieRemoteHelper import com.navi.common.managers.NaviLocationManager import com.navi.common.managers.PermissionsManager import com.navi.common.model.ModuleNameV2 import com.navi.common.model.RequestConfig import com.navi.common.model.UploadDataAsyncResponse -import com.navi.common.utils.* +import com.navi.common.utils.ApiPollScheduler +import com.navi.common.utils.CommonNaviAnalytics +import com.navi.common.utils.getNetworkType +import com.navi.common.utils.getScreenRefreshRate +import com.navi.common.utils.observeNonNull +import com.navi.common.utils.observeNullable +import com.navi.common.utils.setEaseInAnimation import com.navi.naviwidgets.extensions.setLottieAnimationData import com.navi.naviwidgets.extensions.showWhenDataIsAvailable import com.navi.naviwidgets.utils.LottieEnums +import com.navi.pl.dynamic.R +import com.navi.pl.dynamic.databinding.PlActivityLoanEligibilityLoaderV2Binding +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.naviapp.R import com.naviapp.analytics.utils.LoadTimeEventTracker import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.analytics.utils.NaviAnalytics.Companion.NO import com.naviapp.analytics.utils.NaviAnalytics.Companion.PERMISSION_POLLING_START_TIME import com.naviapp.common.navigator.NaviDeepLinkNavigator import com.naviapp.common.navigator.ScreenNavigator -import com.naviapp.databinding.ActivityLoanEligibilityLoaderV2Binding import com.naviapp.manager.viewmodel.UserDataViewModel import com.naviapp.models.OfferUpgradeConfig import com.naviapp.models.TextTimerConfig @@ -56,9 +75,6 @@ import com.naviapp.permission.viewmodel.PermissionViewModel import com.naviapp.personalloan.getloan.activities.GetLoanActivity import com.naviapp.personalloan.getloan.loandetails.viewmodels.LoanDetailsVM import com.naviapp.personalloan.intermediate.activity.IntermediateActivity -import com.naviapp.personalloanrevamp.error.activity.ErrorScreenV2Activity -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.PanVerificationBottomSheet -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper import com.naviapp.personalloanrevamp.models.FLOW_OFFER_GENERATION import com.naviapp.receiver.WifiTrackerBaseActivity import com.naviapp.utils.Constants @@ -90,17 +106,13 @@ import com.naviapp.utils.Constants.SUCCESS_ANIMATION_WHITE_BG_TIME import com.naviapp.utils.Constants.USER_EXIT import com.naviapp.utils.IntentConstants import com.naviapp.utils.OFFER_ID -import com.navi.base.utils.orElse -import com.navi.uitron.model.data.TextData -import dagger.hilt.android.AndroidEntryPoint import getDataId import kotlinx.coroutines.launch -import javax.inject.Inject +import com.naviapp.R as appR -@AndroidEntryPoint class LoanEligibilityLoaderV2Activity : WifiTrackerBaseActivity() { - private lateinit var binding: ActivityLoanEligibilityLoaderV2Binding + private lateinit var binding: PlActivityLoanEligibilityLoaderV2Binding private val loanDetailsVM by lazy { ViewModelProvider(this).get(LoanDetailsVM::class.java) } private val userDataViewModel by lazy { ViewModelProvider(this)[UserDataViewModel::class.java] @@ -118,15 +130,16 @@ class LoanEligibilityLoaderV2Activity : WifiTrackerBaseActivity() { private var panVerificationType: String? = null private var lottieUrl: String? = null private val naviLocationManager = NaviLocationManager() - @Inject lateinit var lottieRemoteHelper: LottieRemoteHelper + private lateinit var lottieRemoteHelper: LottieRemoteHelper private var offerUpgradeTimerCount:Int = 0 private var bankNotAvailableFlag: Boolean? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding = DataBindingUtil.setContentView(this, R.layout.activity_loan_eligibility_loader_v2) + binding = DataBindingUtil.setContentView(this, R.layout.pl_activity_loan_eligibility_loader_v2) super.setContentView(binding.root) NaviTrackEvent.sendScreenTransitionEvent(screenName) + lottieRemoteHelper = LottieRemoteHelper(this) initData() initError() submitPermission() @@ -447,7 +460,7 @@ class LoanEligibilityLoaderV2Activity : WifiTrackerBaseActivity() { ctaData = CtaData( url = NaviDeepLinkNavigator.LOAN_APPLICATION_V2.plus(Constants.DIVIDER) - .plus(GetLoanV2ViewHelper.KYC_IN_REVIEW) + .plus(GetLoanV2Helper.KYC_IN_REVIEW) ), bundle = Bundle().apply { putString(FLOW_TYPE, CRIF) @@ -928,7 +941,7 @@ class LoanEligibilityLoaderV2Activity : WifiTrackerBaseActivity() { .postDelayed( { binding.successAnimationHolderFl.setBackgroundColor( - ContextCompat.getColor(this, R.color.green) + ContextCompat.getColor(this, appR.color.green) ) startAnimationWhiteBackground() }, @@ -941,7 +954,7 @@ class LoanEligibilityLoaderV2Activity : WifiTrackerBaseActivity() { .postDelayed( { binding.successAnimationHolderFl.setBackgroundColor( - ContextCompat.getColor(this, R.color.white) + ContextCompat.getColor(this, appR.color.white) ) }, SUCCESS_ANIMATION_GREEN_BG_TIME @@ -1085,4 +1098,11 @@ class LoanEligibilityLoaderV2Activity : WifiTrackerBaseActivity() { private const val UW_LOTTIE_URL = "UW_LOTTIE_URL" private const val BANK_NOT_AVAILABLE_FLAG = "bankNotAvailableFlag" } + + override fun attachBaseContext(newBase: Context?) { + super.attachBaseContext(newBase) + if (newBase != null) { + SplitCompat.installActivity(newBase) + } + } } diff --git a/app/src/main/java/com/naviapp/dashboard/newloan/NewLoanConsentActivity.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/NewLoanConsentActivity.kt similarity index 67% rename from app/src/main/java/com/naviapp/dashboard/newloan/NewLoanConsentActivity.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/NewLoanConsentActivity.kt index a5c8b7edd7..16b649b29f 100644 --- a/app/src/main/java/com/naviapp/dashboard/newloan/NewLoanConsentActivity.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/NewLoanConsentActivity.kt @@ -1,14 +1,14 @@ /* * - * * Copyright © 2019 by Navi Technologies Private Limited + * * Copyright © 2019-2023 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ -package com.naviapp.dashboard.newloan +package com.navi.pl.dynamic.activity import android.Manifest -import android.content.pm.PackageManager +import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -16,24 +16,24 @@ import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.databinding.DataBindingUtil import androidx.work.PeriodicWorkRequestBuilder -import com.navi.common.managers.PermissionsManager +import com.google.android.play.core.splitcompat.SplitCompat import com.navi.base.model.CtaData import com.navi.base.utils.orFalse +import com.navi.common.managers.PermissionsManager import com.navi.common.model.ModuleNameV2 import com.navi.common.ui.activity.BaseActivity import com.navi.common.utils.Constants -import com.naviapp.R +import com.navi.pl.dynamic.R +import com.navi.pl.dynamic.databinding.PlActivityNewLoanConsentBinding import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.navigator.NaviDeepLinkNavigator -import com.naviapp.databinding.ActivityNewLoanConsentBinding import com.naviapp.manager.WorkManager import com.naviapp.manager.workers.UserSmsWorker import com.naviapp.payment.models.UpcomingLoanDetail -import com.naviapp.permission.fragments.PermissionDeniedFragment -import com.naviapp.permission.utils.getPermissionDeniedData import com.naviapp.personalloan.getloan.activities.GetLoanActivity import com.naviapp.utils.dpToPx import java.util.concurrent.TimeUnit +import com.naviapp.R as appR class NewLoanConsentActivity : BaseActivity(), View.OnClickListener { companion object { @@ -51,14 +51,12 @@ class NewLoanConsentActivity : BaseActivity(), View.OnClickListener { super.onCreate(savedInstanceState) permissionsManager = PermissionsManager(this) readSmsData() - val binding: ActivityNewLoanConsentBinding = - DataBindingUtil.setContentView(this, R.layout.activity_new_loan_consent) + val binding: PlActivityNewLoanConsentBinding = + DataBindingUtil.setContentView(this, R.layout.pl_activity_new_loan_consent) super.setContentView(binding.root) upcomingLoanDetail = intent.getParcelableExtra(KEY_UPCOMING_LOAN_DETAIL) ?: getUpcomingLoanDetails( - intent.getParcelableExtra( - KEY_UPCOMING_LOAN - ) + intent.getParcelableExtra(KEY_UPCOMING_LOAN) ) upcomingLoanDetail?.let { initUI(binding, it) } naviAnalyticsEventTracker.onDemandRepeatPageLand() @@ -75,43 +73,10 @@ class NewLoanConsentActivity : BaseActivity(), View.OnClickListener { when (v?.id) { R.id.cta_button -> { naviAnalyticsEventTracker.onDemandRepeatCheckOfferClicked() - if (permissionsManager?.hasPermissions(arrayOf(Manifest.permission.READ_SMS)) - .orFalse() - ) { - readSmsData() - goToNextScreen() - } else { - permissionsManager?.requestPermissions(arrayOf(Manifest.permission.READ_SMS)) - } - } - R.id.back_iv -> activityExit() - } - } - - override fun onRequestPermissionsResult( - requestCode: Int, - permissions: Array, - grantResults: IntArray - ) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults) - if (requestCode == PermissionsManager.REQUEST_CODE) { - if (grantResults.first() == PackageManager.PERMISSION_GRANTED) { readSmsData() goToNextScreen() - } else if (!permissionsManager?.shouldShowRequestPermissionRationale( - this, - Manifest.permission.READ_SMS - ).orFalse() - ) { - getPermissionDeniedData(Manifest.permission.READ_SMS)?.let { data -> - if (isFinishing) return - PermissionDeniedFragment.getInstance( - data, - NaviAnalytics.READ_SMS_PERMISSION_BOTTOM_SHEET - ).show(supportFragmentManager, PermissionDeniedFragment.TAG) - } } - + appR.id.back_iv -> activityExit() } } @@ -151,14 +116,14 @@ class NewLoanConsentActivity : BaseActivity(), View.OnClickListener { } private fun initUI( - binding: ActivityNewLoanConsentBinding, + binding: PlActivityNewLoanConsentBinding, upcomingLoanDetail: UpcomingLoanDetail ) { binding.greetingTv.text = upcomingLoanDetail.banner binding.titleTv.text = upcomingLoanDetail.title upcomingLoanDetail.features?.forEach { feature -> val itemView: TextView = LayoutInflater.from(this) - .inflate(R.layout.item_loan_feature, binding.parentView, false) as TextView + .inflate(R.layout.pl_layout_item_loan_feature, binding.parentView, false) as TextView itemView.text = feature val layoutParams: ConstraintLayout.LayoutParams = itemView.layoutParams as ConstraintLayout.LayoutParams @@ -166,10 +131,10 @@ class NewLoanConsentActivity : BaseActivity(), View.OnClickListener { binding.featuresView.addView(itemView, layoutParams) } var title = upcomingLoanDetail.cta?.title - if (title.isNullOrEmpty()) title = resources.getString(R.string.loan_consent_cta) + if (title.isNullOrEmpty()) title = resources.getString(appR.string.loan_consent_cta) binding.ctaButton.setProperties( title, - iconId = R.drawable.ic_arrow_right_white + iconId = appR.drawable.ic_arrow_right_white ) binding.noteTv.text = upcomingLoanDetail.note binding.ctaButton.setOnClickListener(this) @@ -184,4 +149,11 @@ class NewLoanConsentActivity : BaseActivity(), View.OnClickListener { note = temp?.note ) } + + override fun attachBaseContext(newBase: Context?) { + super.attachBaseContext(newBase) + if (newBase != null) { + SplitCompat.installActivity(newBase) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/kyc/activity/PanVerificationLoaderActivity.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/PanVerificationLoaderActivity.kt similarity index 91% rename from app/src/main/java/com/naviapp/personalloanrevamp/kyc/activity/PanVerificationLoaderActivity.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/PanVerificationLoaderActivity.kt index 2043efa52d..fa6d03a9ed 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/kyc/activity/PanVerificationLoaderActivity.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/PanVerificationLoaderActivity.kt @@ -5,9 +5,10 @@ * */ -package com.naviapp.personalloanrevamp.kyc.activity +package com.navi.pl.dynamic.activity import android.Manifest +import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.net.Uri @@ -21,10 +22,15 @@ import androidx.browser.customtabs.CustomTabsIntent import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope +import com.google.android.play.core.splitcompat.SplitCompat import com.navi.analytics.utils.NaviTrackEvent import com.navi.base.model.CtaData import com.navi.base.utils.orFalse -import com.navi.common.firebasedb.* +import com.navi.common.firebasedb.FirebaseDataHelper +import com.navi.common.firebasedb.FirebaseDataReceiveListener +import com.navi.common.firebasedb.FirebaseResponse +import com.navi.common.firebasedb.FirebaseStatusType +import com.navi.common.firebasedb.VIDEO_KYC import com.navi.common.managers.PermissionsManager import com.navi.common.model.ModuleName import com.navi.common.model.ModuleNameV2 @@ -34,31 +40,30 @@ import com.navi.common.utils.CommonUtils.getByteArray import com.navi.common.utils.observeNonNull import com.navi.common.utils.observeNullable import com.navi.naviwidgets.utils.FORWARD_SLASH +import com.navi.pl.dynamic.R +import com.navi.pl.dynamic.adapter.KycItemType +import com.navi.pl.dynamic.adapter.KycItemsV2Adapter +import com.navi.pl.dynamic.databinding.PlActivityPanVerificationLoaderBinding +import com.navi.pl.dynamic.fragment.KycV2Fragment +import com.navi.pl.dynamic.fragment.VideoKycV2Fragment +import com.navi.pl.dynamic.helper.GetLoanV2Helper import com.navi.vkyc.presentation.activity.VKYCActivity import com.naviapp.BuildConfig -import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.navigator.NaviDeepLinkNavigator import com.naviapp.common.navigator.ScreenNavigator -import com.naviapp.databinding.PanVerificationLoaderActivityBinding import com.naviapp.models.KycUiStatusValue import com.naviapp.models.VideoKycStatusEnum import com.naviapp.personalloan.getloan.kyc.models.SupportedOvd import com.naviapp.personalloan.getloan.kyc.utils.DocumentType import com.naviapp.personalloan.getloan.kyc.viewmodels.VideoKycVM -import com.naviapp.personalloanrevamp.error.activity.ErrorScreenV2Activity -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper -import com.naviapp.personalloanrevamp.kyc.adapter.KycItemType -import com.naviapp.personalloanrevamp.kyc.adapter.KycItemsV2Adapter -import com.naviapp.personalloanrevamp.kyc.fragment.KycV2Fragment -import com.naviapp.personalloanrevamp.kyc.fragment.VideoKycV2Fragment import com.naviapp.utils.Constants import kotlinx.coroutines.launch - +import com.naviapp.R as appR class PanVerificationLoaderActivity : BaseActivity() { - private lateinit var binding: PanVerificationLoaderActivityBinding + private lateinit var binding: PlActivityPanVerificationLoaderBinding private val analyticsEventTracker by lazy { NaviAnalytics.naviAnalytics.Kyc() } @@ -74,7 +79,7 @@ class PanVerificationLoaderActivity : BaseActivity() { private val startCustomTabsForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - binding.statusTv.text = resources.getString(R.string.video_kyc_status) + binding.statusTv.text = resources.getString(appR.string.video_kyc_status) analyticsEventTracker.onVideoKycCallbackToApp() viewModel.startVideoKycStatusCheck() } @@ -105,7 +110,7 @@ class PanVerificationLoaderActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding = DataBindingUtil.setContentView(this, R.layout.pan_verification_loader_activity) + binding = DataBindingUtil.setContentView(this, R.layout.pl_activity_pan_verification_loader) getData() initObserver() initError(viewModel , actionErrorV2Enabled = true) @@ -115,7 +120,7 @@ class PanVerificationLoaderActivity : BaseActivity() { redirectionUrl = intent.getStringExtra(VideoKycV2Fragment.REDIRECT_URL) ?: intent.extras?.getString(VideoKycV2Fragment.REDIRECT_URL) intent.extras?.getParcelable(Constants.PAN_SUPPORTED_OVD)?.let { binding.statusTv.text = - resources.getString(R.string.please_wait_we_are_verifying_your_document) + resources.getString(appR.string.please_wait_we_are_verifying_your_document) onPANDocumentCaptureSuccess(it) viewModel.setCurrentSelectedType(KycItemType.PAN.name) analyticsEventTracker.onVKYCPANCaptured() @@ -130,7 +135,7 @@ class PanVerificationLoaderActivity : BaseActivity() { videoKycInit() } binding.statusTv.text = - resources.getString(R.string.video_kyc_status) + resources.getString(appR.string.video_kyc_status) } } } @@ -152,7 +157,7 @@ class PanVerificationLoaderActivity : BaseActivity() { if (videoKycItem?.status == KycItemsV2Adapter.COMPLETED) { NaviDeepLinkNavigator.navigate( this, - CtaData(url = getRedirectionUrl() ?: GetLoanV2ViewHelper.KYC_V2), + CtaData(url = getRedirectionUrl() ?: GetLoanV2Helper.KYC_V2), finish = true ) } else { @@ -213,7 +218,7 @@ class PanVerificationLoaderActivity : BaseActivity() { NaviDeepLinkNavigator.navigate( this, CtaData(url = getRedirectionUrl() - ?: (NaviDeepLinkNavigator.LOAN_APPLICATION_V2 + FORWARD_SLASH + GetLoanV2ViewHelper.KYC_V2) + ?: (NaviDeepLinkNavigator.LOAN_APPLICATION_V2 + FORWARD_SLASH + GetLoanV2Helper.KYC_V2) ), finish = true ) @@ -328,7 +333,7 @@ class PanVerificationLoaderActivity : BaseActivity() { private fun startSuccessAnimations() { binding.vkycSuccessAnimation.visibility = View.VISIBLE - binding.vkycSuccessAnimation.setAnimation(com.navi.naviwidgets.R.raw.video_kyc_success) + binding.vkycSuccessAnimation.setAnimation(appR.raw.video_kyc_success) binding.vkycSuccessAnimation.playAnimation() startSuccessAnimationEndListener() } @@ -345,7 +350,7 @@ class PanVerificationLoaderActivity : BaseActivity() { this, viewModel.videoKycData.value?.ctaData ?: CtaData( url = getRedirectionUrl() - ?: GetLoanV2ViewHelper.KYC_ADDRESS_VERIFICATION + ?: GetLoanV2Helper.KYC_ADDRESS_VERIFICATION ), finish = true ) @@ -454,4 +459,11 @@ class PanVerificationLoaderActivity : BaseActivity() { baseFirebaseDataReceiveListener = null hideErrorScreen() } + + override fun attachBaseContext(newBase: Context?) { + super.attachBaseContext(newBase) + if (newBase != null) { + SplitCompat.installActivity(newBase) + } + } } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/activities/PersonalLoanTrackerActivity.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/PersonalLoanTrackerActivity.kt similarity index 74% rename from app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/activities/PersonalLoanTrackerActivity.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/PersonalLoanTrackerActivity.kt index 9ba4ea90f1..446a88a63a 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/activities/PersonalLoanTrackerActivity.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/PersonalLoanTrackerActivity.kt @@ -1,19 +1,13 @@ /* * - * * Copyright © 2022-2023 by Navi Technologies Limited + * * Copyright © 2023 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ -package com.naviapp.personalloanrevamp.useridentificationv2.activities - -/* - * - * * Copyright © 2022 by Navi Technologies Private Limited - * * All rights reserved. Strictly confidential - * - */ +package com.navi.pl.dynamic.activity +import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -21,8 +15,10 @@ import androidx.core.content.res.ResourcesCompat import androidx.core.view.isVisible import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider +import com.google.android.play.core.splitcompat.SplitCompat import com.google.gson.Gson import com.navi.analytics.utils.NaviTrackEvent +import com.navi.base.model.ActionData import com.navi.base.model.GenericAnalyticsData import com.navi.base.model.NaviClickAction import com.navi.base.model.NaviWidgetClickWithActionData @@ -30,26 +26,27 @@ import com.navi.common.model.ModuleNameV2 import com.navi.common.ui.activity.BaseActivity import com.navi.common.utils.observeNonNull import com.navi.common.utils.toCtaData +import com.navi.design.textview.model.TextWithStyle import com.navi.design.utils.getNaviDrawable +import com.navi.design.utils.setSpannableString import com.navi.naviwidgets.callbacks.WidgetCallback import com.navi.naviwidgets.databinding.LayoutRewardsInfoBinding -import com.naviapp.R +import com.navi.pl.dynamic.R +import com.navi.pl.dynamic.adapter.PersonalLoanTrackerAdapter +import com.navi.pl.dynamic.databinding.PlActivityPersonalLoanTrackerBinding import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.navigator.NaviDeepLinkNavigator import com.naviapp.common.navigator.ScreenNavigator -import com.naviapp.databinding.ActivityPersonalLoanTrackerBinding import com.naviapp.personalloan.getloan.common.fragment.CustomerSupportFragment import com.naviapp.personalloanrevamp.models.response.PersonalLoanTrackerResponse -import com.naviapp.personalloanrevamp.useridentificationv2.adapter.PersonalLoanTrackerAdapter import com.naviapp.personalloanrevamp.useridentificationv2.viewmodels.PersonalLoanTrackerVM import com.naviapp.rewards.models.RewardsAnnouncementData import com.naviapp.rewards.ui.RewardsAnnouncementFragment -import dagger.hilt.android.AndroidEntryPoint +import com.naviapp.R as appR -@AndroidEntryPoint class PersonalLoanTrackerActivity : BaseActivity(), View.OnClickListener, WidgetCallback { - private lateinit var binding: ActivityPersonalLoanTrackerBinding + private lateinit var binding: PlActivityPersonalLoanTrackerBinding private val viewModel by lazy { ViewModelProvider(this).get(PersonalLoanTrackerVM::class.java) } private val widgetNaviAnalyticsEventTracker = NaviAnalytics.naviAnalytics.Widget() private val naviAnalyticsEventTracker by lazy { NaviAnalytics.naviAnalytics.PersonalLoanTracker(screenName) } @@ -57,7 +54,7 @@ class PersonalLoanTrackerActivity : BaseActivity(), View.OnClickListener, Widget override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding = DataBindingUtil.setContentView(this, R.layout.activity_personal_loan_tracker) + binding = DataBindingUtil.setContentView(this, R.layout.pl_activity_personal_loan_tracker) super.setContentView(binding.root) readRewardsAnnouncementData() initError( @@ -105,9 +102,10 @@ class PersonalLoanTrackerActivity : BaseActivity(), View.OnClickListener, Widget binding.nextBtn.background = getNaviDrawable( backgroundColor = - ResourcesCompat.getColor(resources, R.color.outrageous_orange, null), - cornerRadius = resources.getDimension(R.dimen.layout_dp_24).toInt() + ResourcesCompat.getColor(resources, appR.color.outrageous_orange, null), + cornerRadius = resources.getDimension(appR.dimen.layout_dp_8).toInt() ) + setNextCtaEnable(enabled = false) } private fun fetchPersonalLoanTrackerResponse() { @@ -127,6 +125,7 @@ class PersonalLoanTrackerActivity : BaseActivity(), View.OnClickListener, Widget binding.trackerBinder = response binding.rootItem.isVisible = true initTrackerAdapter(response) + initDisclaimer(response.content?.disclaimer) response.content?.rewardsInfo?.let { binding.rewardsLayout.update( LayoutRewardsInfoBinding.inflate( @@ -136,13 +135,23 @@ class PersonalLoanTrackerActivity : BaseActivity(), View.OnClickListener, Widget ), it, this, - marginHorizontal = resources.getDimension(R.dimen.layout_dp_16), - marginTop = resources.getDimension(R.dimen.layout_dp_25) + marginHorizontal = resources.getDimension(appR.dimen.layout_dp_16), + marginTop = resources.getDimension(appR.dimen.layout_dp_25) ) binding.rewardsLayout.visibility = View.VISIBLE } } + private fun initDisclaimer(disclaimer: TextWithStyle?) { + binding.checkboxTv.setSpannableString(disclaimer) { + openLegalDocsOnBrowser(it) + } + } + + private fun openLegalDocsOnBrowser(actionData: ActionData) { + NaviDeepLinkNavigator.navigate(this, actionData.toCtaData()) + } + override fun onClick(naviClickAction: NaviClickAction, widgetId: String?) { when (naviClickAction) { is NaviWidgetClickWithActionData -> { @@ -174,6 +183,8 @@ class PersonalLoanTrackerActivity : BaseActivity(), View.OnClickListener, Widget binding.closeIv.setOnClickListener(this) binding.nextBtn.setOnClickListener(this) binding.rightIcon.setOnClickListener(this) + binding.checkboxLl.setOnClickListener(this) + binding.checkboxCb.setOnClickListener(this) } override fun onBackPressed() { @@ -204,6 +215,8 @@ class PersonalLoanTrackerActivity : BaseActivity(), View.OnClickListener, Widget R.id.close_iv -> onCrossButtonClicked() R.id.next_btn -> onNextCtaClick() R.id.right_icon -> openSupportScreen() + R.id.checkbox_ll -> onDisclaimerClicked() + R.id.checkbox_cb -> onCheckboxClicked() } } @@ -213,12 +226,33 @@ class PersonalLoanTrackerActivity : BaseActivity(), View.OnClickListener, Widget } private fun onNextCtaClick() { - naviAnalyticsEventTracker.onNextClicked() + naviAnalyticsEventTracker.onNextClicked(consentGiven = binding.checkboxCb.isChecked) binding.trackerBinder?.footer?.nextCta?.let { NaviDeepLinkNavigator.navigate(activity = this, ctaData = it, finish = true) } } + private fun onDisclaimerClicked() { + binding.checkboxCb.isChecked = !binding.checkboxCb.isChecked + processCheckboxClickAction() + } + + private fun onCheckboxClicked() { + processCheckboxClickAction() + } + + private fun processCheckboxClickAction() { + naviAnalyticsEventTracker.onCheckboxClicked(isChecked = binding.checkboxCb.isChecked) + setNextCtaEnable(enabled = binding.checkboxCb.isChecked) + } + + private fun setNextCtaEnable(enabled: Boolean) { + binding.nextBtn.apply { + isEnabled = enabled + alpha = if (enabled) 1f else 0.56f + } + } + override val screenName: String get() = NaviAnalytics.PERSONAL_LOAN_TRACKER @@ -229,4 +263,11 @@ class PersonalLoanTrackerActivity : BaseActivity(), View.OnClickListener, Widget const val TAG = "PERSONAL_LOAN_TRACKER_ACTIVITY" private const val KEY_REWARDS_ANNOUNCEMENT = "rewardAnnouncement" } + + override fun attachBaseContext(newBase: Context?) { + super.attachBaseContext(newBase) + if (newBase != null) { + SplitCompat.installActivity(newBase) + } + } } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/activities/UserIdentificationV2Activity.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/UserIdentificationV2Activity.kt similarity index 94% rename from app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/activities/UserIdentificationV2Activity.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/UserIdentificationV2Activity.kt index 869a416ca5..5bfaa9e214 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/activities/UserIdentificationV2Activity.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/activity/UserIdentificationV2Activity.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.useridentificationv2.activities +package com.navi.pl.dynamic.activity /* * @@ -14,6 +14,7 @@ package com.naviapp.personalloanrevamp.useridentificationv2.activities * */ +import android.content.Context import android.content.Intent import android.os.Bundle import android.view.View @@ -21,6 +22,7 @@ import androidx.databinding.DataBindingUtil import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentTransaction import androidx.lifecycle.ViewModelProvider +import com.google.android.play.core.splitcompat.SplitCompat import com.navi.base.model.CtaData import com.navi.base.model.StyledTextWithIconCode import com.navi.base.utils.orFalse @@ -29,31 +31,30 @@ import com.navi.common.managers.NaviLocationManager import com.navi.common.managers.PermissionsManager import com.navi.common.model.ModuleNameV2 import com.navi.common.ui.fragment.BaseFragment -import com.naviapp.R +import com.navi.pl.dynamic.R +import com.navi.pl.dynamic.databinding.PlActivityUserIdentificationV2Binding +import com.navi.pl.dynamic.helper.UserIdentificationV2Helper 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.common.navigator.ScreenNavigator -import com.naviapp.databinding.ActivityUserIdentificationV2Binding import com.naviapp.models.FinoramicPostData import com.naviapp.personalloan.getloan.common.fragment.CustomerSupportFragment import com.naviapp.personalloan.useridentification.viewmodels.EligibilityShareVM -import com.naviapp.personalloanrevamp.useridentificationv2.helper.UserIdentificationV2Helper import com.naviapp.receiver.WifiTrackerBaseActivity import com.naviapp.utils.Constants import com.naviapp.utils.Constants.KEY_CTA import com.naviapp.utils.IconUtils -import dagger.hilt.android.AndroidEntryPoint +import com.naviapp.R as appR -@AndroidEntryPoint class UserIdentificationV2Activity : WifiTrackerBaseActivity(), FragmentInterchangeListener, View.OnClickListener, NaviHeaderView.InteractionListener { - private lateinit var binding: ActivityUserIdentificationV2Binding + private lateinit var binding: PlActivityUserIdentificationV2Binding private var permissionsManager: PermissionsManager? = null private val locationManager = NaviLocationManager() private val naviAnalytics by lazy { NaviAnalytics.naviAnalytics.PlEligibility(screenName) } @@ -65,7 +66,7 @@ class UserIdentificationV2Activity : override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding = DataBindingUtil.setContentView(this, R.layout.activity_user_identification_v2) + binding = DataBindingUtil.setContentView(this, R.layout.pl_activity_user_identification_v2) super.setContentView(binding.root) setHeaderProperties() val screenTag = intent?.extras?.getString(Constants.REDIRECT_STATUS) @@ -232,7 +233,7 @@ class UserIdentificationV2Activity : override fun onClick(v: View?) { when (v?.id) { - R.id.back_iv -> { + appR.id.back_iv -> { naviAnalytics.onBackButtonClicked(currentScreen) naviAnalytics.onBackButtonEventClick( UserIdentificationV2Helper.getBackButtonEventName(currentScreen) @@ -312,4 +313,11 @@ class UserIdentificationV2Activity : companion object { const val CURRENT_SCREEN_NAME = "current_screen_name" } + + override fun attachBaseContext(newBase: Context?) { + super.attachBaseContext(newBase) + if (newBase != null) { + SplitCompat.installActivity(newBase) + } + } } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/addressverificationrevamp/adapter/CurrentAddressItemsV2Adapter.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/CurrentAddressItemsV2Adapter.kt similarity index 83% rename from app/src/main/java/com/naviapp/personalloanrevamp/addressverificationrevamp/adapter/CurrentAddressItemsV2Adapter.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/CurrentAddressItemsV2Adapter.kt index 2f9e344ade..0dd64872ff 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/addressverificationrevamp/adapter/CurrentAddressItemsV2Adapter.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/CurrentAddressItemsV2Adapter.kt @@ -1,12 +1,19 @@ -package com.naviapp.personalloanrevamp.addressverificationrevamp.adapter +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.navi.pl.dynamic.adapter import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import com.naviapp.databinding.AddressRadioButtonV2Binding +import com.navi.pl.dynamic.databinding.PlLayoutAddressRadioButtonV2Binding +import com.navi.pl.dynamic.fragment.CurrentAddressChangeListener import com.naviapp.models.response.CurrentAddress -import com.naviapp.personalloanrevamp.addressverificationrevamp.fragment.CurrentAddressChangeListener class CurrentAddressItemsV2Adapter( private val currentAddressChangeListener: CurrentAddressChangeListener, @@ -17,7 +24,7 @@ class CurrentAddressItemsV2Adapter( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CurrentAddressItemsV2Holder { val binding = - AddressRadioButtonV2Binding.inflate(LayoutInflater.from(parent.context), parent, false) + PlLayoutAddressRadioButtonV2Binding.inflate(LayoutInflater.from(parent.context), parent, false) return CurrentAddressItemsV2Holder(binding) } @@ -72,7 +79,7 @@ class CurrentAddressItemsV2Adapter( notifyDataSetChanged() } - class CurrentAddressItemsV2Holder(val binding: AddressRadioButtonV2Binding) : + class CurrentAddressItemsV2Holder(val binding: PlLayoutAddressRadioButtonV2Binding) : RecyclerView.ViewHolder(binding.root) } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/kyc/adapter/KycItemsV2Adapter.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/KycItemsV2Adapter.kt similarity index 98% rename from app/src/main/java/com/naviapp/personalloanrevamp/kyc/adapter/KycItemsV2Adapter.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/KycItemsV2Adapter.kt index 7e29734ef0..c1f2cfd33a 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/kyc/adapter/KycItemsV2Adapter.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/KycItemsV2Adapter.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.kyc.adapter +package com.navi.pl.dynamic.adapter import android.graphics.Bitmap import android.view.LayoutInflater @@ -18,11 +18,11 @@ import com.navi.design.font.FontWeightEnum import com.navi.naviwidgets.models.response.StyleString import com.navi.naviwidgets.models.response.TextFieldData import com.naviapp.R +import com.navi.pl.dynamic.listener.MultipleKycItemListeners import com.naviapp.databinding.ItemKycMultipleLayoutBinding import com.naviapp.databinding.ItemKycV2Binding import com.naviapp.databinding.ItemNextStepsKycBinding import com.naviapp.personalloan.getloan.kyc.listeners.KycItemsListener -import com.naviapp.personalloanrevamp.kyc.listener.MultipleKycItemListeners import com.naviapp.personalloanrevamp.models.KycItemV2 import com.naviapp.personalloanrevamp.models.KycMultipleActionType import com.naviapp.utils.IconUtils diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/kyc/adapter/MultipleKycItemAdapter.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/MultipleKycItemAdapter.kt similarity index 96% rename from app/src/main/java/com/naviapp/personalloanrevamp/kyc/adapter/MultipleKycItemAdapter.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/MultipleKycItemAdapter.kt index acca91e95b..3a4ba65389 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/kyc/adapter/MultipleKycItemAdapter.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/MultipleKycItemAdapter.kt @@ -5,14 +5,14 @@ * */ -package com.naviapp.personalloanrevamp.kyc.adapter +package com.navi.pl.dynamic.adapter import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView +import com.navi.pl.dynamic.listener.MultipleKycItemListeners import com.naviapp.databinding.ItemRadioButtonForMultipleKycItemBinding -import com.naviapp.personalloanrevamp.kyc.listener.MultipleKycItemListeners import com.naviapp.personalloanrevamp.models.KycItemV2 import com.naviapp.utils.IconUtils diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/adapter/PersonalLoanTrackerAdapter.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/PersonalLoanTrackerAdapter.kt similarity index 83% rename from app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/adapter/PersonalLoanTrackerAdapter.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/PersonalLoanTrackerAdapter.kt index e8b51503e2..eee587a73b 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/adapter/PersonalLoanTrackerAdapter.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/adapter/PersonalLoanTrackerAdapter.kt @@ -1,22 +1,29 @@ -package com.naviapp.personalloanrevamp.useridentificationv2.adapter +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.navi.pl.dynamic.adapter import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import com.naviapp.databinding.TrackerScreenLayoutBinding +import com.navi.pl.dynamic.databinding.PlLayoutTrackerScreenBinding import com.naviapp.personalloanrevamp.models.response.PersonalLoanTrackerStep import com.naviapp.utils.setBackgroundColorFromString import com.naviapp.utils.setTextColorFromString class PersonalLoanTrackerAdapter(private val trackerScreen: List) : RecyclerView.Adapter() { - class PersonalLoanTrackerView(val binding: TrackerScreenLayoutBinding) : + class PersonalLoanTrackerView(val binding: PlLayoutTrackerScreenBinding) : RecyclerView.ViewHolder(binding.root) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PersonalLoanTrackerView { val inflater = LayoutInflater.from(parent.context) - val binding = TrackerScreenLayoutBinding.inflate(inflater, parent, false) + val binding = PlLayoutTrackerScreenBinding.inflate(inflater, parent, false) return PersonalLoanTrackerView(binding) } @@ -53,4 +60,4 @@ class PersonalLoanTrackerAdapter(private val trackerScreen: List IconUtils.updateIcon(iconCode, binding.noteImv) binding.noteImv.setColorFilter( - ResourcesCompat.getColor(resources, R.color.black, null) + ResourcesCompat.getColor(resources, appR.color.black, null) ) } } @@ -712,7 +729,7 @@ class BankStatementV2Fragment : override fun onClickUnserviceableBank() { optionSelected = null context?.toast( - getString(R.string.this_bank_is_not_supported), + getString(appR.string.this_bank_is_not_supported), offsetY = 200, length = Toast.LENGTH_SHORT ) @@ -768,7 +785,7 @@ class BankStatementV2Fragment : override fun onBackPressed() { when (arguments?.getString(FLOW_TYPE)) { - OFFER_UPGRADE_FLOW, UserIdentificationV2Helper.OFFER_IN_REVIEW -> { + OFFER_UPGRADE_FLOW, OFFER_IN_REVIEW -> { val backCta = viewModel.bankStatementData.value?.footer?.backCta backCta?.let { NaviDeepLinkNavigator.navigate( diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/DelayedDisbursementV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/DelayedDisbursementV2Fragment.kt similarity index 83% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/DelayedDisbursementV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/DelayedDisbursementV2Fragment.kt index ee3d1ae6bd..015c7c33e6 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/DelayedDisbursementV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/DelayedDisbursementV2Fragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.getloanRevamp.fragments +package com.navi.pl.dynamic.fragment import android.os.Bundle import android.view.LayoutInflater @@ -18,12 +18,12 @@ import com.navi.common.ui.fragment.BaseFragment import com.navi.common.utils.CommonNaviAnalytics import com.navi.common.utils.getNetworkType import com.navi.common.utils.observeNonNull +import com.navi.pl.dynamic.activity.LoanDisbursementLoaderV2Activity.Companion.LOAN_ACCOUNT_NUMBER +import com.navi.pl.dynamic.databinding.PlFragmentDelayedDisbursementV2Binding import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.navigator.NaviDeepLinkNavigator -import com.naviapp.databinding.DelayedDisbursementV2LayoutBinding import com.naviapp.personalloan.getloan.delayedDisbursement.viewmodels.DelayedDisbursementViewModel -import com.naviapp.personalloanrevamp.getloanRevamp.activities.LoanDisbursementLoaderV2Activity.Companion.LOAN_ACCOUNT_NUMBER import com.naviapp.personalloanrevamp.models.FLOW_DELAYED_DISBURSEMENT import com.naviapp.personalloanrevamp.models.PROP_FILE_NAME import com.naviapp.utils.Constants.ACTION @@ -31,7 +31,7 @@ import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY import com.naviapp.utils.IconUtils class DelayedDisbursementV2Fragment : BaseFragment() { - private lateinit var binding: DelayedDisbursementV2LayoutBinding + private lateinit var binding: PlFragmentDelayedDisbursementV2Binding private val viewModel by lazy { ViewModelProvider(this).get(DelayedDisbursementViewModel::class.java) } @@ -43,7 +43,7 @@ class DelayedDisbursementV2Fragment : BaseFragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = DelayedDisbursementV2LayoutBinding.inflate(inflater, container, false) + binding = PlFragmentDelayedDisbursementV2Binding.inflate(inflater, container, false) analyticsEventTracker.onPLDelayedDisbursementPageLand() initError(viewModel, actionErrorV2Enabled = true) initListener() @@ -61,15 +61,21 @@ class DelayedDisbursementV2Fragment : BaseFragment() { private fun initListener() { binding.actionBtn.setOnClickListener { + var ctaData: CtaData? = null viewModel.delayedDisbursementDetails.value?.content?.let { - it.firstOrNull()?.ctaData?.let { - NaviDeepLinkNavigator.navigate(activity = activity, ctaData = it, finish = true) - activity?.finishAffinity() + it.firstOrNull()?.ctaData?.let { cta -> + ctaData = cta } + } ?: kotlin.run { + ctaData = CtaData(url = NaviDeepLinkNavigator.HOME) + } + ctaData?.let { + NaviDeepLinkNavigator.navigate( + activity = activity, + ctaData = it, + finish = true + ) } - ?: kotlin.run { - NaviDeepLinkNavigator.navigate(activity = activity, ctaData = CtaData(url = NaviDeepLinkNavigator.HOME), finish = true) - } } setEventNameToLatencyMapper(PL_SCREEN_ACTIVITY, queryMap[ACTION]) } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/EffectiveInterestCostV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EffectiveInterestCostV2Fragment.kt similarity index 95% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/EffectiveInterestCostV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EffectiveInterestCostV2Fragment.kt index c71b6d18c2..6e0ddc6273 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/EffectiveInterestCostV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EffectiveInterestCostV2Fragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.getloanRevamp.fragments +package com.navi.pl.dynamic.fragment import android.app.Activity import android.content.Context @@ -19,15 +19,15 @@ import androidx.lifecycle.ViewModelProvider import com.navi.common.ui.fragment.BaseFragment import com.navi.design.font.FontWeightEnum import com.navi.design.utils.setFontStyle +import com.navi.naviwidgets.models.response.Footer +import com.navi.pl.dynamic.databinding.PlFragmentEffectiveInterestCostV2Binding import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.NaviHeaderView import com.naviapp.common.listeners.BackListener import com.naviapp.dashboard.listeners.FragmentInteractionListener -import com.naviapp.databinding.EffectiveInterestCostV2FragmentBinding import com.naviapp.models.response.EffectiveInterestInfoContent import com.naviapp.models.response.EffectiveInterestInfoResponse -import com.navi.naviwidgets.models.response.Footer import com.naviapp.personalloan.getloan.loandetails.viewmodels.EffectiveInterestCostVM import com.naviapp.utils.Constants.ACTION import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY @@ -37,7 +37,7 @@ import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class EffectiveInterestCostV2Fragment : BaseFragment(), BackListener { - private lateinit var binding: EffectiveInterestCostV2FragmentBinding + private lateinit var binding: PlFragmentEffectiveInterestCostV2Binding private val viewModel by lazy { ViewModelProvider(this).get(EffectiveInterestCostVM::class.java) } @@ -50,7 +50,7 @@ class EffectiveInterestCostV2Fragment : BaseFragment(), BackListener { container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = EffectiveInterestCostV2FragmentBinding.inflate(layoutInflater, container, false) + binding = PlFragmentEffectiveInterestCostV2Binding.inflate(layoutInflater, container, false) initError(viewModel, actionErrorV2Enabled = true) initObserver() initUI() diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/EmiSelectorV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EmiSelectorV2Fragment.kt similarity index 94% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/EmiSelectorV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EmiSelectorV2Fragment.kt index f4c0b12e1e..72e6d1d15e 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/EmiSelectorV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EmiSelectorV2Fragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.getloanRevamp.fragments +package com.navi.pl.dynamic.fragment import android.app.Activity import android.content.Context @@ -21,7 +21,11 @@ import com.navi.base.sharedpref.PreferenceManager import com.navi.base.utils.orZero import com.navi.common.model.Money import com.navi.common.ui.fragment.BaseFragment -import com.navi.common.utils.* +import com.navi.common.utils.formatDateInto +import com.navi.common.utils.formatDateIntoPrefixMonthNames +import com.navi.common.utils.getDateWithSuffix +import com.navi.common.utils.getWeekDaysFirstLetters +import com.navi.common.utils.parseYYYYMMDDStringToDate import com.navi.common.utils.setCornerRadius import com.navi.design.calendar.adapter.NaviCalendarViewAdapter import com.navi.design.calendar.model.DateStyleModel @@ -32,12 +36,13 @@ import com.navi.design.utils.getTotalNumberOfDayInMonth import com.navi.design.utils.parseDateFromOneToAnother import com.navi.naviwidgets.models.response.Footer import com.navi.naviwidgets.widgets.textdisplay.Margin +import com.navi.pl.dynamic.databinding.PlFragmentEmiSelectorV2Binding +import com.navi.pl.dynamic.helper.GetLoanV2Helper import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.NaviHeaderView import com.naviapp.common.listeners.BackListener import com.naviapp.dashboard.listeners.FragmentInteractionListener -import com.naviapp.databinding.EmiSelectorFragmentV2Binding import com.naviapp.models.EmiStartDate import com.naviapp.models.request.LoanFeeDetailsRequest import com.naviapp.models.response.EmiCalendarData @@ -45,18 +50,21 @@ import com.naviapp.models.response.EmiCalendarDataResponse import com.naviapp.models.response.Header import com.naviapp.personalloan.getloan.loandetails.viewmodels.EmiSelectorVM import com.naviapp.personalloan.getloan.loandetails.viewmodels.LoanDetailsAndEmiSharedVM -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper -import com.naviapp.utils.* import com.naviapp.utils.Constants import com.naviapp.utils.Constants.ACTION import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY +import com.naviapp.utils.IconUtils +import com.naviapp.utils.PRODUCT_CODE +import com.naviapp.utils.makeUnderlined +import com.naviapp.utils.setMargin import dagger.hilt.android.AndroidEntryPoint -import java.util.* +import java.util.Calendar +import java.util.Date @AndroidEntryPoint class EmiSelectorV2Fragment : BaseFragment(), BackListener { - private lateinit var binding: EmiSelectorFragmentV2Binding + private lateinit var binding: PlFragmentEmiSelectorV2Binding private val viewModel by lazy { ViewModelProvider(this).get(EmiSelectorVM::class.java) } private var loanDetailsAndEmiSharedVM: LoanDetailsAndEmiSharedVM? = null private var selectedDate: Date? = null @@ -70,7 +78,7 @@ class EmiSelectorV2Fragment : BaseFragment(), BackListener { container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = EmiSelectorFragmentV2Binding.inflate(layoutInflater, container, false) + binding = PlFragmentEmiSelectorV2Binding.inflate(layoutInflater, container, false) initError(viewModel, actionErrorV2Enabled = true) initObserver() initListeners() @@ -149,7 +157,7 @@ class EmiSelectorV2Fragment : BaseFragment(), BackListener { ) } } - listener?.navigateTo(GetLoanV2ViewHelper.UPCOMING_EMI_DETAIL_V2, bundle) + listener?.navigateTo(GetLoanV2Helper.UPCOMING_EMI_DETAIL_V2, bundle) } } setEventNameToLatencyMapper(PL_SCREEN_ACTIVITY, queryMap[ACTION]) diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments/EmploymentOtpVerificationFragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EmploymentOtpVerificationFragment.kt similarity index 92% rename from app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments/EmploymentOtpVerificationFragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EmploymentOtpVerificationFragment.kt index 91a45f091e..a3e0b117ea 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments/EmploymentOtpVerificationFragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EmploymentOtpVerificationFragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.useridentificationv2.fragments +package com.navi.pl.dynamic.fragment import android.content.Context import android.content.IntentFilter @@ -22,7 +22,11 @@ import com.moengage.pushbase.internal.ACTION import com.navi.analytics.utils.NaviTrackEvent import com.navi.base.model.CtaData import com.navi.base.utils.orZero -import com.navi.common.firebasedb.* +import com.navi.common.firebasedb.EPFO_VERIFICATION +import com.navi.common.firebasedb.FirebaseDataHelper +import com.navi.common.firebasedb.FirebaseDataReceiveListener +import com.navi.common.firebasedb.FirebaseResponse +import com.navi.common.firebasedb.FirebaseStatusType import com.navi.common.listeners.FragmentInterchangeListener import com.navi.common.model.RequestConfig import com.navi.common.receiver.OtpReceiveListener @@ -32,7 +36,8 @@ import com.navi.common.utils.ApiPollScheduler import com.navi.common.utils.observeNonNull import com.navi.design.font.FontWeightEnum import com.navi.design.utils.getFontStyle -import com.naviapp.R +import com.navi.pl.dynamic.databinding.PlFragmentEmploymentOtpVerificationBinding +import com.navi.pl.dynamic.helper.IntermediateV2Helper.EPFO_V2 import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.FooterViewV2 import com.naviapp.common.customview.NaviHeaderView @@ -40,21 +45,21 @@ import com.naviapp.common.fragment.OtpBottomSheet import com.naviapp.common.listeners.BackListener import com.naviapp.common.navigator.NaviDeepLinkNavigator import com.naviapp.common.navigator.ScreenNavigator -import com.naviapp.databinding.EmploymentOtpVerificationFragmentBinding import com.naviapp.models.request.OtpRequest import com.naviapp.models.response.OTPVerifyResponse import com.naviapp.personalloan.useridentification.employmentverification.viewmodel.EmploymentVerificationVM -import com.naviapp.personalloanrevamp.useridentificationv2.helper.UserIdentificationV2Helper import com.naviapp.utils.Constants import com.naviapp.utils.Constants.FLOW_TYPE +import com.naviapp.utils.Constants.OFFER_IN_REVIEW import com.naviapp.utils.Constants.PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY import com.naviapp.utils.shakeView +import com.naviapp.R as appR open class EmploymentOtpVerificationFragment : BaseFragment(), View.OnClickListener, BackListener, FooterViewV2.FooterInteractionListener { - private lateinit var binding: EmploymentOtpVerificationFragmentBinding + private lateinit var binding: PlFragmentEmploymentOtpVerificationBinding private val viewModel by lazy { ViewModelProvider(this).get(EmploymentVerificationVM::class.java) } @@ -75,7 +80,7 @@ open class EmploymentOtpVerificationFragment : container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = EmploymentOtpVerificationFragmentBinding.inflate(inflater, container, false) + binding = PlFragmentEmploymentOtpVerificationBinding.inflate(inflater, container, false) initError(viewModel, actionErrorV2Enabled = true) initWarning(viewModel) pageType = arguments?.getString(Constants.EPFO_PAGE_TYPE).orEmpty() @@ -106,7 +111,7 @@ open class EmploymentOtpVerificationFragment : override fun onClick(v: View?) { when (v?.id) { - R.id.resend_otp_tv -> reSendOtp() + appR.id.resend_otp_tv -> reSendOtp() } } @@ -172,7 +177,7 @@ open class EmploymentOtpVerificationFragment : } binding.otpBoxLayout.setFontStyle( textSize = 16F, - colorId = R.color.black, + colorId = appR.color.black, fontId = getFontStyle(FontWeightEnum.TT_MEDIUM) ) } @@ -197,7 +202,7 @@ open class EmploymentOtpVerificationFragment : Constants.SECONDS_PER_MINUTE if (isAdded) binding.countdownTimerTv.text = - " ${String.format(getString(R.string.time_format), minutes, seconds)}" + " ${String.format(getString(appR.string.time_format), minutes, seconds)}" } override fun onFinish() { @@ -305,8 +310,8 @@ open class EmploymentOtpVerificationFragment : } open fun onOtpVerificationSuccess(otpVerifyResponse: OTPVerifyResponse?) { - if (otpVerifyResponse?.details?.data?.karzaStatus == PASSBOOK_GENERATED && pageType == UserIdentificationV2Helper.OFFER_IN_REVIEW) { - otpVerifyResponse.details.data.nextCTA?.let { ctaData -> + if (otpVerifyResponse?.details?.data?.karzaStatus == PASSBOOK_GENERATED && pageType == OFFER_IN_REVIEW) { + otpVerifyResponse.details?.data?.nextCTA?.let { ctaData -> NaviDeepLinkNavigator.navigate( activity = activity, ctaData = ctaData, @@ -316,7 +321,7 @@ open class EmploymentOtpVerificationFragment : } } else { fragmentInterchangeListener?.navigateToNextScreen( - UserIdentificationV2Helper.EPFO_V2, + EPFO_V2, arguments ?: Bundle() ) } @@ -362,7 +367,7 @@ open class EmploymentOtpVerificationFragment : override fun onFooterBackPressed(backCta: CtaData?) { naviAnalyticsEventTracker.onBackButtonClicked(screenName) - if (backCta?.title.orEmpty() == getString(R.string.skip)) { + if (backCta?.title.orEmpty() == getString(appR.string.skip)) { naviAnalyticsEventTracker.onSkipButtonClick(arguments?.getString(FLOW_TYPE).orEmpty()) } backCta?.let { NaviDeepLinkNavigator.navigate(activity, it, true) } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments/EmploymentVerificationV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EmploymentVerificationV2Fragment.kt similarity index 89% rename from app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments/EmploymentVerificationV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EmploymentVerificationV2Fragment.kt index 47b0c01927..6daee06de3 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments/EmploymentVerificationV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/EmploymentVerificationV2Fragment.kt @@ -5,14 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.useridentificationv2.fragments - -/* - * - * * Copyright © 2022 by Navi Technologies Private Limited - * * All rights reserved. Strictly confidential - * - */ +package com.navi.pl.dynamic.fragment import android.content.Context import android.os.Bundle @@ -36,7 +29,9 @@ import com.navi.common.ui.fragment.BaseFragment import com.navi.common.utils.observeNonNull import com.navi.common.utils.observeNullable import com.navi.design.utils.getNaviDrawable -import com.naviapp.R +import com.navi.pl.dynamic.R +import com.navi.pl.dynamic.databinding.PlFragmentEmploymentVerificationV2Binding +import com.navi.pl.dynamic.helper.IntermediateV2Helper.EPFO_OTP_VERIFICATION_V2 import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.BoxInputGroup.Companion.OTP_LENGTH_6 import com.naviapp.common.customview.FooterViewV2 @@ -49,15 +44,11 @@ import com.naviapp.common.navigator.ScreenNavigator import com.naviapp.common.viewmodel.OtpSharedViewModel import com.naviapp.common.viewmodel.SearchViewModel import com.naviapp.databinding.CustomToastBinding -import com.naviapp.databinding.EmploymentVerificationV2LayoutBinding import com.naviapp.models.response.EPFODetails import com.naviapp.models.response.SendDisbursementOtpResponse import com.naviapp.network.ApiErrorTagType import com.naviapp.personalloan.useridentification.employmentverification.viewmodel.EmploymentVerificationVM import com.naviapp.personalloanrevamp.common.customview.InfoBottomSheetV2 -import com.naviapp.personalloanrevamp.intermediatev2.helper.IntermediateV2Helper.EPFO_OTP_VERIFICATION_V2 -import com.naviapp.personalloanrevamp.useridentificationv2.helper.UserIdentificationV2Helper -import com.naviapp.utils.* import com.naviapp.utils.Constants.ACTION import com.naviapp.utils.Constants.EPFO_PAGE_TYPE import com.naviapp.utils.Constants.FLOW_TYPE @@ -65,13 +56,20 @@ import com.naviapp.utils.Constants.IS_COMING_FROM_OFFER_UPGRADE_PAGE import com.naviapp.utils.Constants.IS_COMING_FROM_QUESTIONNAIRE_PAGE import com.naviapp.utils.Constants.IS_COMING_FROM_WORK_DETAILS import com.naviapp.utils.Constants.OFFER +import com.naviapp.utils.Constants.OFFER_IN_REVIEW import com.naviapp.utils.Constants.OFFER_UPGRADE import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY +import com.naviapp.utils.EMPTY +import com.naviapp.utils.IntentConstants +import com.naviapp.utils.constructBundleWithCtaData +import com.naviapp.utils.customToast +import com.naviapp.utils.toast +import com.naviapp.R as appR open class EmploymentVerificationV2Fragment : BaseFragment(), View.OnClickListener, FooterViewV2.FooterInteractionListener, BackListener { - private lateinit var binding: EmploymentVerificationV2LayoutBinding + private lateinit var binding: PlFragmentEmploymentVerificationV2Binding protected var sharedSearchViewModel: SearchViewModel? = null protected var otpSharedViewModel: OtpSharedViewModel? = null protected var pageType: String? = null @@ -94,7 +92,7 @@ open class EmploymentVerificationV2Fragment : container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = EmploymentVerificationV2LayoutBinding.inflate(inflater, container, false) + binding = PlFragmentEmploymentVerificationV2Binding.inflate(inflater, container, false) initError() initWarning() pageType = arguments?.getString(EPFO_PAGE_TYPE).orEmpty() @@ -154,16 +152,16 @@ open class EmploymentVerificationV2Fragment : fetchEPFODetails() binding.companySelectorContainer.background = getNaviDrawable( - cornerRadius = resources.getDimension(R.dimen.layout_dp_8).toInt(), - strokeWidth = resources.getDimension(R.dimen.layout_dp_1).toInt(), + cornerRadius = resources.getDimension(appR.dimen.layout_dp_8).toInt(), + strokeWidth = resources.getDimension(appR.dimen.layout_dp_1).toInt(), strokeColor = - ResourcesCompat.getColor(resources, R.color.border_dark_grey_color, null) + ResourcesCompat.getColor(resources, appR.color.border_dark_grey_color, null) ) binding.generateOtpContainer.background = getNaviDrawable( backgroundColor = - ResourcesCompat.getColor(resources, R.color.red_light_three, null), - cornerRadius = resources.getDimension(R.dimen.layout_dp_8).toInt() + ResourcesCompat.getColor(resources, appR.color.red_light_three, null), + cornerRadius = resources.getDimension(appR.dimen.layout_dp_8).toInt() ) } @@ -279,7 +277,7 @@ open class EmploymentVerificationV2Fragment : bundle.putString(FLOW_TYPE, flowType) bundle.putString(EPFO_PAGE_TYPE, pageType) fragmentInterchangeListener?.navigateToNextScreen( - UserIdentificationV2Helper.EPFO_OTP_VERIFICATION_V2, + EPFO_OTP_VERIFICATION_V2, bundle ) } @@ -294,8 +292,8 @@ open class EmploymentVerificationV2Fragment : binding.footerView.setContinueButtonEnable(true) context?.customToast( customView = - getFilledToastView(resources.getString(R.string.verification_successful)), - offsetY = resources.getDimension(R.dimen.layout_dp_120).toInt(), + getFilledToastView(resources.getString(appR.string.verification_successful)), + offsetY = resources.getDimension(appR.dimen.layout_dp_120).toInt(), gravity = Gravity.BOTTOM or Gravity.FILL_HORIZONTAL ) } else { @@ -307,11 +305,11 @@ open class EmploymentVerificationV2Fragment : private fun getFilledToastView(text: String?): View { return CustomToastBinding.inflate(layoutInflater, null, false) .apply { - toastIv.setImageResource(R.drawable.ic_green_tick_small) - toastLayoutRoot.setBackgroundResource(R.drawable.bg_light_green_rounded_12) + toastIv.setImageResource(appR.drawable.ic_green_tick_small) + toastLayoutRoot.setBackgroundResource(appR.drawable.bg_light_green_rounded_12) toastTv.text = text - context?.let { toastTv.setTextColor(ContextCompat.getColor(it, R.color.green)) } - TextViewCompat.setTextAppearance(toastTv, R.style.NaviSansBoldExtraSmall) + context?.let { toastTv.setTextColor(ContextCompat.getColor(it, appR.color.green)) } + TextViewCompat.setTextAppearance(toastTv, appR.style.NaviSansBoldExtraSmall) } .root } @@ -329,7 +327,7 @@ open class EmploymentVerificationV2Fragment : .orFalse() || otpSharedViewModel?.otpVerified?.value.orFalse() ) { activity?.toast( - getString(R.string.company_can_not_be_change), + getString(appR.string.company_can_not_be_change), offsetY = 700, length = Toast.LENGTH_SHORT ) @@ -339,7 +337,7 @@ open class EmploymentVerificationV2Fragment : bundle.putString(FLOW_TYPE, flowType) val searchFragment = SearchFragment.newInstance( - resources.getString(R.string.select_company), + resources.getString(appR.string.select_company), SearchFragment.SearchType.COMPANY_INDUSTRY, null, bundle @@ -353,7 +351,7 @@ open class EmploymentVerificationV2Fragment : override fun onClick(v: View?) { when (v?.id) { R.id.company_selector_container -> openBankSelector() - R.id.info_icon -> openBottomSheet() + appR.id.info_icon -> openBottomSheet() R.id.generate_otp_container -> sendOtp() } } @@ -407,7 +405,7 @@ open class EmploymentVerificationV2Fragment : naviAnalyticsEventTracker.onOtpVerified() fetchEPFODetails() activity?.toast( - getString(R.string.verification_successful), + getString(appR.string.verification_successful), offsetY = 600, length = Toast.LENGTH_LONG ) @@ -427,7 +425,7 @@ open class EmploymentVerificationV2Fragment : naviAnalyticsEventTracker.onBackButtonClicked(screenName) backCta?.url?.let { naviAnalyticsEventTracker.onEPFOBackButtonTap() - if (pageType?.equals(UserIdentificationV2Helper.OFFER_IN_REVIEW).orFalse()) { + if (pageType?.equals(OFFER_IN_REVIEW).orFalse()) { NaviDeepLinkNavigator.navigate(activity, ctaData = backCta, finish = true) } else { fragmentInterchangeListener?.navigateToNextScreenWithCaching(it, Bundle()) @@ -442,7 +440,7 @@ open class EmploymentVerificationV2Fragment : val channelList = ArrayList() channelList.add(IntentConstants.EPFO) NaviTrackEvent.setStartTs(screenName) - if (nextCta.title.orEmpty() == getString(R.string.next)) { + if (nextCta.title.orEmpty() == getString(appR.string.next)) { naviAnalyticsEventTracker.onNextButtonClick(flowType) } else { naviAnalyticsEventTracker.onSkipButtonClick(flowType) diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/error/fragments/ErrorV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/ErrorV2Fragment.kt similarity index 93% rename from app/src/main/java/com/naviapp/personalloanrevamp/error/fragments/ErrorV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/ErrorV2Fragment.kt index 296d1c6c79..2fc7eeff4e 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/error/fragments/ErrorV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/ErrorV2Fragment.kt @@ -1,11 +1,11 @@ /* * - * * Copyright © 2022 by Navi Technologies Limited + * * Copyright © 2022-2023 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ -package com.naviapp.personalloanrevamp.error.fragments +package com.navi.pl.dynamic.fragment import android.content.Context import android.os.Bundle @@ -18,19 +18,19 @@ import com.navi.common.network.models.GenericErrorResponse import com.navi.common.ui.fragment.BaseFragment import com.navi.design.utils.GradientOrientation import com.navi.design.utils.getNaviDrawable +import com.navi.pl.dynamic.activity.ErrorScreenV2Activity +import com.navi.pl.dynamic.databinding.PlFragmentErrorV2Binding import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.NaviHeaderView import com.naviapp.common.navigator.NaviDeepLinkNavigator -import com.naviapp.databinding.FragmentErrorV2Binding -import com.naviapp.personalloanrevamp.error.activity.ErrorScreenV2Activity import com.naviapp.personalloanrevamp.models.RejectionDetailsV2 import com.naviapp.utils.EMPTY import com.naviapp.utils.IconUtils class ErrorV2Fragment : BaseFragment() { - private lateinit var binding: FragmentErrorV2Binding + private lateinit var binding: PlFragmentErrorV2Binding private var headerListener: NaviHeaderView.InteractionListener? = null override fun onCreateView( @@ -38,7 +38,7 @@ class ErrorV2Fragment : BaseFragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = FragmentErrorV2Binding.inflate(inflater, container, false) + binding = PlFragmentErrorV2Binding.inflate(inflater, container, false) initUi() return binding.root } @@ -98,7 +98,7 @@ class ErrorV2Fragment : BaseFragment() { binding.daysLayout.rootLayout.visibility = View.VISIBLE binding.daysLayout.tvTryAgainAfter.text = it.title binding.daysLayout.tvDays.text = it.description - binding.daysLayout.tvNoOfDays.text = error.humanReadableContent.numberOfDays + binding.daysLayout.tvNoOfDays.text = error.humanReadableContent?.numberOfDays } ?: run { binding.daysLayout.rootLayout.visibility = View.GONE } error?.humanReadableContent?.numberOfDays?.let { diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/FreshLoanDetailsV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/FreshLoanDetailsV2Fragment.kt similarity index 92% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/FreshLoanDetailsV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/FreshLoanDetailsV2Fragment.kt index 7490749ae8..eae3feddfe 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/FreshLoanDetailsV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/FreshLoanDetailsV2Fragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.getloanRevamp.fragments +package com.navi.pl.dynamic.fragment import android.content.Context import android.graphics.Color @@ -28,12 +28,28 @@ import androidx.recyclerview.widget.SimpleItemAnimator import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.gson.Gson import com.navi.analytics.utils.NaviTrackEvent -import com.navi.base.model.* +import com.navi.base.model.ClickableTextType +import com.navi.base.model.CtaData +import com.navi.base.model.GenericAnalyticsData +import com.navi.base.model.LineItem +import com.navi.base.model.NaviClickAction +import com.navi.base.model.NaviWidgetClickWithActionData import com.navi.base.sharedpref.PreferenceManager -import com.navi.base.utils.* import com.navi.base.utils.BaseUtils.isUpiAppAvailable +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.base.utils.orTrue +import com.navi.base.utils.orZero import com.navi.chat.utils.ChatPLScreens -import com.navi.common.firebasedb.* +import com.navi.common.firebasedb.ADD_BANK_ACCOUNT_V2 +import com.navi.common.firebasedb.FirebaseDataHelper +import com.navi.common.firebasedb.FirebaseDataReceiveListener +import com.navi.common.firebasedb.FirebaseResponse +import com.navi.common.firebasedb.FirebaseStatusType +import com.navi.common.firebasedb.LOAN_APPLY +import com.navi.common.firebasedb.OFFER_GENERATE import com.navi.common.model.ModuleNameV2 import com.navi.common.model.Money import com.navi.common.model.RequestConfig @@ -41,8 +57,17 @@ import com.navi.common.model.UploadDataAsyncResponse import com.navi.common.network.getGlobalErrorType import com.navi.common.network.models.GenericResponseState import com.navi.common.uitron.model.action.CtaAction -import com.navi.common.utils.* +import com.navi.common.utils.ApiPollScheduler +import com.navi.common.utils.CommonNaviAnalytics import com.navi.common.utils.Constants.UNDERSCORE +import com.navi.common.utils.findFirstCompletelyVisibleItemPosition +import com.navi.common.utils.findFirstVisibleItemPosition +import com.navi.common.utils.findLastCompletelyVisibleItemPosition +import com.navi.common.utils.getNetworkType +import com.navi.common.utils.log +import com.navi.common.utils.observeNonNull +import com.navi.common.utils.observeNullable +import com.navi.common.utils.toCtaData import com.navi.design.utils.getNaviDrawable import com.navi.design.utils.parseColorSafe import com.navi.naviwidgets.callbacks.WidgetCallback @@ -57,6 +82,11 @@ import com.navi.payment.base.PaymentManager import com.navi.payment.listener.RPDListener import com.navi.payment.model.GenericErrorResponse import com.navi.payment.model.RpdPaymentDetails +import com.navi.pl.dynamic.databinding.PlFragmentFreshLoanDetailsV2Binding +import com.navi.pl.dynamic.fragment.EmiSelectorV2Fragment.Companion.LOAN_FEE_DETAILS_REQUEST +import com.navi.pl.dynamic.fragment.EmiSelectorV2Fragment.Companion.RATE_OF_INTEREST +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.naviapp.R @@ -74,24 +104,43 @@ import com.naviapp.common.listeners.FooterWithDescriptionListener import com.naviapp.common.navigator.NaviDeepLinkNavigator import com.naviapp.common.navigator.ScreenNavigator import com.naviapp.dashboard.listeners.FragmentInteractionListener -import com.naviapp.databinding.FreshLoanDetailsV2FragmentBinding -import com.naviapp.models.* +import com.naviapp.models.CustomClickConfig +import com.naviapp.models.CustomClickType +import com.naviapp.models.FooterType +import com.naviapp.models.Offer +import com.naviapp.models.SubPageStatusType +import com.naviapp.models.Tenure import com.naviapp.models.request.LoanFeeDetailsRequest import com.naviapp.models.request.LoanRequest -import com.naviapp.models.response.* +import com.naviapp.models.response.GeneralGreetingResponse +import com.naviapp.models.response.LoanDetailsV2AdditionData +import com.naviapp.models.response.OfferDetailsResponse +import com.naviapp.models.response.OfferDialogType +import com.naviapp.models.response.SnappedHeaderProps +import com.naviapp.models.response.WidgetConfig import com.naviapp.network.ApiErrorTagType import com.naviapp.personalloan.factory.LoanDetailsV2VHFactoryImpl import com.naviapp.personalloanrevamp.common.customview.LoanAmountSummaryView import com.naviapp.personalloanrevamp.customview.DailyOfferBottomSheetV2 import com.naviapp.personalloanrevamp.getloanRevamp.adapters.LoanDetailsV2WidgetAdapter -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper +import com.naviapp.personalloanrevamp.getloanRevamp.fragments.BankDetailsAutoDebitV2Fragment import com.naviapp.personalloanrevamp.getloanRevamp.repository.LoanDetailsV2Repository import com.naviapp.personalloanrevamp.getloanRevamp.viewmodels.FreshLoanDetailsV2FragmentVM import com.naviapp.personalloanrevamp.getloanRevamp.viewmodels.GetLoanV2SharedVM -import com.naviapp.personalloanrevamp.models.* -import com.naviapp.personalloanrevamp.models.response.* +import com.naviapp.personalloanrevamp.models.CtaType +import com.naviapp.personalloanrevamp.models.FLOW_UPI_REVERSE_PENNY_DROP +import com.naviapp.personalloanrevamp.models.LoanDetailsV2WidgetType +import com.naviapp.personalloanrevamp.models.StyledTextTimedCardData +import com.naviapp.personalloanrevamp.models.StyledTitleDescriptionBottomSheetConfig +import com.naviapp.personalloanrevamp.models.TransactionFailedBottomSheetInfo_Is_Null +import com.naviapp.personalloanrevamp.models.response.BottomSheetContent +import com.naviapp.personalloanrevamp.models.response.FeeDetailResponseWithFirstEmiDate +import com.naviapp.personalloanrevamp.models.response.FeeDetailsV2Response +import com.naviapp.personalloanrevamp.models.response.LoanDetailsV2Content +import com.naviapp.personalloanrevamp.models.response.RPDDetailsResponse +import com.naviapp.personalloanrevamp.models.response.RPDNextCta +import com.naviapp.personalloanrevamp.models.response.TransferBottomSheetContent import com.naviapp.personalloanrevamp.useridentificationv2.fragments.InformationBottomSheet -import com.naviapp.utils.* import com.naviapp.utils.Constants import com.naviapp.utils.Constants.FETCH_FIRST_SELECTED_EMI_DATE_CODE import com.naviapp.utils.Constants.ACTION @@ -103,12 +152,22 @@ import com.naviapp.utils.Constants.PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY import com.naviapp.utils.Constants.TRANSFER_BOTTOMSHEET import com.naviapp.utils.Constants.UITRON_WIDGET_TYPE -import dagger.hilt.android.AndroidEntryPoint +import com.naviapp.utils.LOAN_AMOUNT +import com.naviapp.utils.LOAN_APPLICATION_ID +import com.naviapp.utils.LOAN_DETAIL_WEB_VIEW_URL +import com.naviapp.utils.OFFER_ID +import com.naviapp.utils.PRODUCT_CODE +import com.naviapp.utils.SELECTED_EMI_DATE +import com.naviapp.utils.appendStrings +import com.naviapp.utils.dpToPx +import com.naviapp.utils.formatAmount +import com.naviapp.utils.isBottomSheetEnabled +import com.naviapp.utils.navigateToClickableText +import com.naviapp.utils.pxToDp +import com.naviapp.utils.setMargin import getDataId import kotlinx.coroutines.launch -import javax.inject.Inject -@AndroidEntryPoint class FreshLoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescriptionListener, @@ -116,9 +175,8 @@ class FreshLoanDetailsV2Fragment : WidgetCallback, InfoBottomSheetListener { - @Inject - lateinit var repository: LoanDetailsV2Repository - private lateinit var binding: FreshLoanDetailsV2FragmentBinding + private lateinit var repository: LoanDetailsV2Repository + private lateinit var binding: PlFragmentFreshLoanDetailsV2Binding private val viewModel by lazy { ViewModelProvider(this).get(FreshLoanDetailsV2FragmentVM::class.java) } @@ -133,7 +191,7 @@ class FreshLoanDetailsV2Fragment : private var sharedVM: GetLoanV2SharedVM? = null private val widgetNaviAnalyticsEventTracker = NaviAnalytics.naviAnalytics.Widget() private lateinit var bottomSheetBehavior: BottomSheetBehavior - private var updateUIListener: LoanDetailsV2Fragment.UpdateUiListener? = null + private var updateUIListener: BankDetailsAutoDebitV2Fragment.UpdateUiListener? = null private var shortAnimationDuration: Int = 0 private var loanAmountSummaryWidgetPosition: Int? = null private var pageLandEventEnabled = false @@ -151,7 +209,8 @@ class FreshLoanDetailsV2Fragment : savedInstanceState: Bundle? ): View { super.onCreateView(inflater, container, savedInstanceState) - binding = FreshLoanDetailsV2FragmentBinding.inflate(inflater, container, false) + binding = PlFragmentFreshLoanDetailsV2Binding.inflate(inflater, container, false) + repository = LoanDetailsV2Repository() setWebViewScreenName(screenName) checkWebViewArguments() initUi() @@ -440,11 +499,11 @@ class FreshLoanDetailsV2Fragment : viewState.data?.run { when(nextCta?.type){ CtaType.BANK_DETAILS_AUTO_DEBIT_V2.name -> { - redirectToSetupAutoPay(nextCta) + redirectToSetupAutoPay(nextCta as CtaData) } CtaType.FAILURE_BOTTOM_SHEET.name -> { val lineItem = - nextCta.parameters?.firstOrNull { it.key == BOTTOM_SHEET_KEY } + nextCta?.parameters?.firstOrNull { it.key == BOTTOM_SHEET_KEY } val bottomSheetInfoV2 = this.metadata?.get(lineItem?.value)?.data as? BottomSheetInfoV2 @@ -548,8 +607,8 @@ class FreshLoanDetailsV2Fragment : } else { showLoader() paymentVM.initRPD( - it.token, - it.methodId, + it.token as String, + it.methodId as String, requireActivity(), object : RPDListener { override fun onRpdPaymentMethodSuccess(rpdPaymentDetails: RpdPaymentDetails?) { @@ -754,9 +813,9 @@ class FreshLoanDetailsV2Fragment : binding.uitronFooter.visibility = View.VISIBLE binding.uitronFooter.setContent { UiTronRenderer( - feeDetailsV2Response.footer.uiTronFooter.data, + feeDetailsV2Response.footer?.uiTronFooter?.data, viewModel - ).Render(composeViews = feeDetailsV2Response.footer.uiTronFooter.parentComposeView.orEmpty()) + ).Render(composeViews = feeDetailsV2Response.footer?.uiTronFooter?.parentComposeView.orEmpty()) } } ?: enableTitleDescriptionFooter(feeDetailsV2Response) } @@ -1157,7 +1216,7 @@ class FreshLoanDetailsV2Fragment : } } else { feeDetailsV2Response.content?.widgets?.let { widgetConfigList -> - feeDetailsV2Response.content.additionalData?.let { data -> + feeDetailsV2Response.content?.additionalData?.let { data -> (binding.loanDetailsRv.adapter as? LoanDetailsV2WidgetAdapter)?.updateData( widgetConfigList = widgetConfigList, additionalData = data @@ -1281,7 +1340,7 @@ class FreshLoanDetailsV2Fragment : super.onAttach(context) listener = context as? FragmentInteractionListener headerListener = context as? NaviHeaderView.InteractionListener - updateUIListener = context as? LoanDetailsV2Fragment.UpdateUiListener + updateUIListener = context as? BankDetailsAutoDebitV2Fragment.UpdateUiListener activity?.let { sharedVM = ViewModelProvider(it).get(GetLoanV2SharedVM::class.java) } } @@ -1405,7 +1464,7 @@ class FreshLoanDetailsV2Fragment : override fun onCtaClick(ctaData: CtaData?) { when (ctaData?.type) { - LoanDetailsEditorFragment.CtaType.CHANGE_EMI_DATE.value -> { + CtaType.CHANGE_EMI_DATE.value -> { if (isWebView()) { val loanFeeDetailsRequest = constructEmiBundleFromCtaParams(ctaData.parameters) openEmiCalendar(loanFeeDetailsRequest) @@ -1414,16 +1473,16 @@ class FreshLoanDetailsV2Fragment : openEmiCalendar() } } - LoanDetailsEditorFragment.CtaType.TENURE_DEFAULT_SELECTED.value -> { + CtaType.TENURE_DEFAULT_SELECTED.value -> { onTenureDefaultSelected(ctaData.parameters) } - LoanDetailsEditorFragment.CtaType.TENURE_CLICKED_TYPE.value -> { + CtaType.TENURE_CLICKED_TYPE.value -> { onTenureChanged(ctaData.parameters) } - LoanDetailsEditorFragment.CtaType.SLIDER_END_TYPE.value -> { + CtaType.SLIDER_END_TYPE.value -> { onTenureSliderSelected(ctaData.parameters) } - LoanDetailsEditorFragment.CtaType.VIEW_EMI_CALENDAR.value -> { + CtaType.VIEW_EMI_CALENDAR.value -> { if (isWebView()) { val loanFeeDetailsRequest = constructEmiBundleFromCtaParams(ctaData.parameters) launchEmiCalendar(loanFeeDetailsRequest) @@ -1432,13 +1491,13 @@ class FreshLoanDetailsV2Fragment : launchEmiCalendar() } } - LoanDetailsEditorFragment.CtaType.KNOW_MORE.value -> { + CtaType.KNOW_MORE.value -> { openKnowMoreBottomSheet() } - LoanDetailsEditorFragment.CtaType.INFO_ICON_CLICK.value -> { + CtaType.INFO_ICON_CLICK.value -> { openEffectiveInterestCostScreen(ctaData) } - LoanDetailsEditorFragment.CtaType.FOOTER_NEXT_PRESS.value -> { + CtaType.FOOTER_NEXT_PRESS.value -> { onFooterNextPress(ctaData) } SCROLL_TO_WIDGET_POSITION -> { @@ -1506,7 +1565,7 @@ class FreshLoanDetailsV2Fragment : } sendEventFromCta(ctaData) - if (LoanDetailsEditorFragment.CtaType.TENURE_SELECTED_TYPE.value == ctaData?.type) { + if (CtaType.TENURE_SELECTED_TYPE.value == ctaData?.type) { loanDetailsEventTracker.onTenureSliderChanged( viewModel.getOfferId(), viewModel.isAutoDebitSetUp.value, @@ -1515,7 +1574,7 @@ class FreshLoanDetailsV2Fragment : ) } - if (LoanDetailsEditorFragment.CtaType.SLIDER_END_TYPE.value == ctaData?.type) { + if (CtaType.SLIDER_END_TYPE.value == ctaData?.type) { loanDetailsEventTracker.onEmiPlanClick( viewModel.getOfferId(), viewModel.isAutoDebitSetUp.value, @@ -1611,13 +1670,13 @@ class FreshLoanDetailsV2Fragment : var isCustomizeTenureSelected: Boolean? = false parameters?.forEach { when (it.key) { - LoanDetailsEditorFragment.CtaType.TENURE_SELECTED_VALUE.value -> { + CtaType.TENURE_SELECTED_VALUE.value -> { viewModel.setSelectedTenure(it.value?.toInt().orZero()) } - LoanDetailsEditorFragment.CtaType.MONTHLY_EMI_VALUE.value -> { + CtaType.MONTHLY_EMI_VALUE.value -> { viewModel.setSelectedMonthlyEmi(it.value?.toDouble().orZero()) } - LoanDetailsEditorFragment.CtaType.CUSTOMISE_TENURE.value -> { + CtaType.CUSTOMISE_TENURE.value -> { isCustomizeTenureSelected = it.value?.toBoolean()?.orFalse() if (isCustomizeTenureSelected.orFalse()) { loanDetailsEventTracker.onCustomizeTenureCardClicked( @@ -1640,10 +1699,10 @@ class FreshLoanDetailsV2Fragment : private fun onTenureDefaultSelected(parameters: List?) { parameters?.forEach { when (it.key) { - LoanDetailsEditorFragment.CtaType.TENURE_SELECTED_VALUE.value -> { + CtaType.TENURE_SELECTED_VALUE.value -> { viewModel.setSelectedTenure(it.value?.toInt().orZero()) } - LoanDetailsEditorFragment.CtaType.MONTHLY_EMI_VALUE.value -> { + CtaType.MONTHLY_EMI_VALUE.value -> { viewModel.setSelectedMonthlyEmi(it.value?.toDouble().orZero()) } } @@ -1653,13 +1712,13 @@ class FreshLoanDetailsV2Fragment : private fun onTenureSliderSelected(parameters: List?) { parameters?.forEach { when (it.key) { - LoanDetailsEditorFragment.CtaType.TENURE_SELECTED_VALUE.value -> { + CtaType.TENURE_SELECTED_VALUE.value -> { viewModel.setSelectedTenure(it.value?.toInt().orZero()) } - LoanDetailsEditorFragment.CtaType.MONTHLY_EMI_VALUE.value -> { + CtaType.MONTHLY_EMI_VALUE.value -> { viewModel.setSelectedMonthlyEmi(it.value?.toDouble().orZero()) } - LoanDetailsEditorFragment.CtaType.CUSTOMISE_TENURE.value -> { + CtaType.CUSTOMISE_TENURE.value -> { val isCustomizeTenureSelected = it.value?.toBoolean()?.orFalse() if (isCustomizeTenureSelected.orFalse()) { loanDetailsEventTracker.onCustomizeTenureCardClicked( @@ -1695,21 +1754,21 @@ class FreshLoanDetailsV2Fragment : val bundle = Bundle() loanFeeDetailsRequest?.let { bundle.putParcelable( - EmiSelectorV2Fragment.LOAN_AMOUNT, + LOAN_AMOUNT, it.amount ) - bundle.putInt(EmiSelectorV2Fragment.TENURE, it.tenureInMonths.orZero()) - bundle.putString(EmiSelectorV2Fragment.SELECTED_EMI_DATE, it.firstEmiDueDate) - bundle.putDouble(EmiSelectorV2Fragment.RATE_OF_INTEREST, it.rateOfInterest.orZero()) + bundle.putInt(TENURE, it.tenureInMonths.orZero()) + bundle.putString(SELECTED_EMI_DATE, it.firstEmiDueDate) + bundle.putDouble(RATE_OF_INTEREST, it.rateOfInterest.orZero()) } ?: kotlin.run { bundle.putParcelable( - EmiSelectorV2Fragment.LOAN_AMOUNT, + LOAN_AMOUNT, toMoney(viewModel.selectedLoanAmount.value) ) - bundle.putInt(EmiSelectorV2Fragment.TENURE, viewModel.selectedTenure.value.orZero()) - bundle.putString(EmiSelectorV2Fragment.SELECTED_EMI_DATE, response?.firstEmiDueDate) + bundle.putInt(TENURE, viewModel.selectedTenure.value.orZero()) + bundle.putString(SELECTED_EMI_DATE, response?.firstEmiDueDate) response?.rateOfInterest?.let { - bundle.putDouble(EmiSelectorV2Fragment.RATE_OF_INTEREST, it) + bundle.putDouble(RATE_OF_INTEREST, it) } } @@ -1723,7 +1782,7 @@ class FreshLoanDetailsV2Fragment : url = NaviDeepLinkNavigator.LOAN_APPLICATION_V2.appendStrings( FORWARD_SLASH.toString(), - GetLoanV2ViewHelper.EMI_SELECTOR_FRAGMENT_V2 + GetLoanV2Helper.EMI_SELECTOR_FRAGMENT_V2 ) ), finish = false @@ -1746,7 +1805,7 @@ class FreshLoanDetailsV2Fragment : } val bundle = Bundle().apply { - putParcelable(EmiSelectorV2Fragment.LOAN_FEE_DETAILS_REQUEST, loanFeeDetailsRequest) + putParcelable(LOAN_FEE_DETAILS_REQUEST, loanFeeDetailsRequest) } NaviDeepLinkNavigator.navigateTo( @@ -1756,7 +1815,7 @@ class FreshLoanDetailsV2Fragment : url = NaviDeepLinkNavigator.LOAN_APPLICATION_V2.appendStrings( FORWARD_SLASH.toString(), - GetLoanV2ViewHelper.UPCOMING_EMI_DETAIL_V2 + GetLoanV2Helper.UPCOMING_EMI_DETAIL_V2 ) ), bundle = bundle, @@ -1827,7 +1886,7 @@ class FreshLoanDetailsV2Fragment : .plus(SubPageStatusType.BANK_DETAILS_AUTO_DEBIT) private const val OFFER_UPGRADE_V2 = NaviDeepLinkNavigator.LOAN_APPLICATION_V2.plus("/") - .plus(GetLoanV2ViewHelper.LOAN_OFFER_UPGRADE_V2) + .plus(GetLoanV2Helper.LOAN_OFFER_UPGRADE_V2) private const val WIDGET_POSITION = "WIDGET_POSITION" const val EVENT_NAME = "EVENT_NAME" const val LOAN_AMOUNT_UITRON_LAYOUT_ID = "loanAmountSlider" diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/GstVerificationPasswordV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/GstVerificationPasswordV2Fragment.kt similarity index 91% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/GstVerificationPasswordV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/GstVerificationPasswordV2Fragment.kt index 3f8c77390c..2dbb387ed4 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/GstVerificationPasswordV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/GstVerificationPasswordV2Fragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.getloanRevamp.fragments +package com.navi.pl.dynamic.fragment import android.content.Context import android.os.Build @@ -30,12 +30,11 @@ import com.navi.common.utils.ApiPollScheduler import com.navi.design.font.FontWeightEnum import com.navi.design.utils.getFontStyle import com.navi.design.utils.getNaviDrawable -import com.naviapp.R +import com.navi.pl.dynamic.databinding.PlFragmentGstVerificationPasswordV2Binding import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.FooterViewV2 import com.naviapp.common.customview.NaviHeaderView import com.naviapp.common.navigator.NaviDeepLinkNavigator -import com.naviapp.databinding.GstVerificationPasswordFragmentV2Binding import com.naviapp.models.request.GstLoginData import com.naviapp.models.request.GstOtpVerificationData import com.naviapp.models.request.GstSendOtpData @@ -45,15 +44,17 @@ import com.naviapp.personalloan.getloan.loandetails.states.GstOtpGenerationState import com.naviapp.personalloan.getloan.loandetails.states.GstVerificationLoginState import com.naviapp.personalloan.getloan.loandetails.states.GstVerificationState import com.naviapp.personalloan.getloan.loandetails.viewmodels.GstDetailsVM -import com.naviapp.utils.* +import com.naviapp.utils.Constants import com.naviapp.utils.Constants.ACTION import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY -import dagger.hilt.android.AndroidEntryPoint +import com.naviapp.utils.EMPTY +import com.naviapp.utils.IntentConstants +import com.naviapp.utils.getTimer +import com.naviapp.R as appR -@AndroidEntryPoint class GstVerificationPasswordV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { - private lateinit var binding: GstVerificationPasswordFragmentV2Binding + private lateinit var binding: PlFragmentGstVerificationPasswordV2Binding private val viewModel by lazy { ViewModelProvider(this).get(GstDetailsVM::class.java) } private var headerListener: NaviHeaderView.InteractionListener? = null private var isVerificationMethodOTP: Boolean = true @@ -70,7 +71,7 @@ class GstVerificationPasswordV2Fragment : BaseFragment(), FooterViewV2.FooterInt container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = GstVerificationPasswordFragmentV2Binding.inflate(inflater, container, false) + binding = PlFragmentGstVerificationPasswordV2Binding.inflate(inflater, container, false) initError(viewModel, actionErrorV2Enabled = true) initQueryMap() initObserver() @@ -119,7 +120,7 @@ class GstVerificationPasswordV2Fragment : BaseFragment(), FooterViewV2.FooterInt } private fun initUI() { - timeInSecond = resources.getInteger(R.integer.value_60).toLong() + timeInSecond = resources.getInteger(appR.integer.value_60).toLong() showLoader() setPasswordHintStyle() viewModel.fetchGstDetails(ctaQueryMap) @@ -206,20 +207,20 @@ class GstVerificationPasswordV2Fragment : BaseFragment(), FooterViewV2.FooterInt binding.gstDetailContainer.background = getNaviDrawable( strokeColor = - ResourcesCompat.getColor(resources, R.color.naviBorderLightGrey, null), - strokeWidth = resources.getDimension(R.dimen.layout_dp_1).toInt(), - cornerRadius = resources.getDimension(R.dimen.layout_dp_8).toInt(), - backgroundColor = ResourcesCompat.getColor(resources, R.color.white, null) + ResourcesCompat.getColor(resources, appR.color.naviBorderLightGrey, null), + strokeWidth = resources.getDimension(appR.dimen.layout_dp_1).toInt(), + cornerRadius = resources.getDimension(appR.dimen.layout_dp_8).toInt(), + backgroundColor = ResourcesCompat.getColor(resources, appR.color.white, null) ) setBannerBackground(gstDetailsResponse) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { binding.gstDetailContainer.outlineSpotShadowColor = - ResourcesCompat.getColor(resources, R.color.shadow_color, null) + ResourcesCompat.getColor(resources, appR.color.shadow_color, null) binding.gstDetailContainer.outlineAmbientShadowColor = - ResourcesCompat.getColor(resources, R.color.shadow_color, null) + ResourcesCompat.getColor(resources, appR.color.shadow_color, null) } - binding.gstDetailContainer.elevation = resources.getDimension(R.dimen.layout_dp_3) + binding.gstDetailContainer.elevation = resources.getDimension(appR.dimen.layout_dp_3) binding.footerListener = this @@ -248,8 +249,8 @@ class GstVerificationPasswordV2Fragment : BaseFragment(), FooterViewV2.FooterInt rootItem.background = getNaviDrawable( backgroundColor = - ResourcesCompat.getColor(resources, R.color.container_bg_color, null), - cornerRadius = resources.getDimension(R.dimen.layout_dp_8).toInt() + ResourcesCompat.getColor(resources, appR.color.container_bg_color, null), + cornerRadius = resources.getDimension(appR.dimen.layout_dp_8).toInt() ) rootItem.isVisible = true } @@ -288,7 +289,7 @@ class GstVerificationPasswordV2Fragment : BaseFragment(), FooterViewV2.FooterInt private fun onVerifyOtpClicked() { val enteredOtp = binding.otpBoxLayout.getText() otpRequestId?.let { - showLoader(resources.getString(R.string.please_wait)) + showLoader(resources.getString(appR.string.please_wait)) viewModel.verifyOTPForGstVerification( GstOtpVerificationData(otp = enteredOtp, requestId = it) ) @@ -448,7 +449,7 @@ class GstVerificationPasswordV2Fragment : BaseFragment(), FooterViewV2.FooterInt binding.textInputField.apply { typeface = ResourcesCompat.getFont(context, getFontStyle(FontWeightEnum.TT_REGULAR)) setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f) - setHintTextColor(ResourcesCompat.getColor(resources, R.color.gray_56, null)) + setHintTextColor(ResourcesCompat.getColor(resources, appR.color.gray_56, null)) } } @@ -456,25 +457,25 @@ class GstVerificationPasswordV2Fragment : BaseFragment(), FooterViewV2.FooterInt binding.textInputField.apply { typeface = ResourcesCompat.getFont(context, getFontStyle(FontWeightEnum.TT_REGULAR)) setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f) - setHintTextColor(ResourcesCompat.getColor(resources, R.color.title_color_four, null)) + setHintTextColor(ResourcesCompat.getColor(resources, appR.color.title_color_four, null)) } } private fun setErrorStateInPasswordInput() { binding.textField.background = getNaviDrawable( - strokeWidth = resources.getDimension(R.dimen.layout_dp_1).toInt(), - strokeColor = ResourcesCompat.getColor(resources, R.color.error_red, null), - cornerRadius = resources.getDimension(R.dimen.layout_dp_8).toInt() + strokeWidth = resources.getDimension(appR.dimen.layout_dp_1).toInt(), + strokeColor = ResourcesCompat.getColor(resources, appR.color.error_red, null), + cornerRadius = resources.getDimension(appR.dimen.layout_dp_8).toInt() ) } private fun setNormalStateInPasswordInput() { binding.textField.background = getNaviDrawable( - strokeWidth = resources.getDimension(R.dimen.layout_dp_1).toInt(), - strokeColor = ResourcesCompat.getColor(resources, R.color.zircon_grey, null), - cornerRadius = resources.getDimension(R.dimen.layout_dp_8).toInt() + strokeWidth = resources.getDimension(appR.dimen.layout_dp_1).toInt(), + strokeColor = ResourcesCompat.getColor(resources, appR.color.zircon_grey, null), + cornerRadius = resources.getDimension(appR.dimen.layout_dp_8).toInt() ) } @@ -507,7 +508,7 @@ class GstVerificationPasswordV2Fragment : BaseFragment(), FooterViewV2.FooterInt val userName = arguments?.getString(GstVerificationV2Fragment.PORTAL_USER_NAME) val password = binding.textInputField.text.toString() if (userName != null && gstIn != null) { - showLoader(getString(R.string.please_wait)) + showLoader(getString(appR.string.please_wait)) val gstLoginData = GstLoginData(userName, password, gstIn) viewModel.loginGstWithCredential(gstLoginData) } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/GstVerificationV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/GstVerificationV2Fragment.kt similarity index 89% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/GstVerificationV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/GstVerificationV2Fragment.kt index 292f765222..70b44bf1a8 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/GstVerificationV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/GstVerificationV2Fragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.getloanRevamp.fragments +package com.navi.pl.dynamic.fragment import android.content.Context import android.os.Bundle @@ -30,13 +30,15 @@ import com.navi.design.font.FontWeightEnum import com.navi.design.utils.getFontStyle import com.navi.design.utils.getNaviDrawable import com.navi.naviwidgets.utils.FORWARD_SLASH -import com.naviapp.R +import com.navi.pl.dynamic.activity.IntermediateV2Activity +import com.navi.pl.dynamic.databinding.PlFragmentGstVerificationV2Binding +import com.navi.pl.dynamic.helper.GetLoanV2Helper +import com.navi.pl.dynamic.helper.UserIdentificationV2Helper import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.FooterViewV2 import com.naviapp.common.customview.NaviHeaderView import com.naviapp.common.listeners.BackListener import com.naviapp.common.navigator.NaviDeepLinkNavigator -import com.naviapp.databinding.GstVerificationFragmentV2Binding import com.naviapp.models.request.GstSendOtpData import com.naviapp.models.response.GstBanner import com.naviapp.models.response.GstDetailsResponse @@ -45,21 +47,17 @@ import com.naviapp.personalloan.getloan.loandetails.fragments.InfoBottomSheetWit import com.naviapp.personalloan.getloan.loandetails.states.GstOtpGenerationState import com.naviapp.personalloan.getloan.loandetails.viewmodels.GstDetailsVM import com.naviapp.personalloanrevamp.common.customview.InfoBottomSheetV2 -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper -import com.naviapp.personalloanrevamp.intermediatev2.IntermediateV2Activity -import com.naviapp.personalloanrevamp.useridentificationv2.helper.UserIdentificationV2Helper.OFFER_IN_REVIEW import com.naviapp.utils.Constants import com.naviapp.utils.Constants.ACTION import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY import com.naviapp.utils.IconUtils import com.naviapp.utils.shakeView -import dagger.hilt.android.AndroidEntryPoint +import com.naviapp.R as appR -@AndroidEntryPoint class GstVerificationV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener, BackListener { - private lateinit var binding: GstVerificationFragmentV2Binding + private lateinit var binding: PlFragmentGstVerificationV2Binding private val viewModel by lazy { ViewModelProvider(this).get(GstDetailsVM::class.java) } private var headerListener: NaviHeaderView.InteractionListener? = null private val plCommonActionEvents by lazy { object : NaviAnalytics.PLCommonActionEvents {} } @@ -71,7 +69,7 @@ class GstVerificationV2Fragment : container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = GstVerificationFragmentV2Binding.inflate(inflater, container, false) + binding = PlFragmentGstVerificationV2Binding.inflate(inflater, container, false) initError(viewModel, actionErrorV2Enabled = true) initQueryMap() initObserver() @@ -226,20 +224,20 @@ class GstVerificationV2Fragment : binding.inputUserName.apply { label = gstDetailsResponse.content?.userNameFieldTitle hintText = gstDetailsResponse.content?.userNameFieldPlaceHolder - infoIcon = ResourcesCompat.getDrawable(resources, R.drawable.ic_user_name_info, null) + infoIcon = ResourcesCompat.getDrawable(resources, appR.drawable.ic_user_name_info, null) inputImeOptions = EditorInfo.IME_ACTION_DONE - setIconAndUsernameMargin(resources.getDimension(R.dimen.layout_dp_8).toInt()) - iconSize = resources.getDimension(R.dimen.layout_dp_14).toInt() + setIconAndUsernameMargin(resources.getDimension(appR.dimen.layout_dp_8).toInt()) + iconSize = resources.getDimension(appR.dimen.layout_dp_14).toInt() maxCharacterAllowed = USER_NAME_MAX_CHARACTER_ALLOWED maxNumberOfLineAllowed = 1 setInputTextStyle( textSizeInSp = 14f, - textColor = R.color.title_color_one, + textColor = appR.color.title_color_one, fontId = getFontStyle(FontWeightEnum.TT_REGULAR) ) setHintStyle( textSizeInSp = 14f, - hintTextColor = R.color.titleTertiaryColor, + hintTextColor = appR.color.titleTertiaryColor, fontId = getFontStyle(FontWeightEnum.TT_REGULAR) ) } @@ -255,8 +253,8 @@ class GstVerificationV2Fragment : rootItem.background = getNaviDrawable( backgroundColor = - ResourcesCompat.getColor(resources, R.color.container_bg_color, null), - cornerRadius = resources.getDimension(R.dimen.layout_dp_8).toInt() + ResourcesCompat.getColor(resources, appR.color.container_bg_color, null), + cornerRadius = resources.getDimension(appR.dimen.layout_dp_8).toInt() ) rootItem.isVisible = true } @@ -277,7 +275,7 @@ class GstVerificationV2Fragment : val bottomSheet = InfoBottomSheetV2.getInstance( iconCode = it.iconCode ?: IconUtils.ICON_ALERT_BLACK, - iconTint = R.color.black, + iconTint = resources.getColor(appR.color.black), header = it.title, subHeader = it.subheader, description = it.description, @@ -301,7 +299,7 @@ class GstVerificationV2Fragment : override fun onFooterBackPressed(backCta: CtaData?) { backCta?.let { - if (ctaQueryMap[GST_SCREEN_TYPE]?.equals(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) { @@ -318,11 +316,11 @@ class GstVerificationV2Fragment : } override fun onBackPressed() { - if (ctaQueryMap[GST_SCREEN_TYPE]?.equals(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(OFFER_IN_REVIEW) + .plus(UserIdentificationV2Helper.OFFER_IN_REVIEW) ) ) } else { @@ -331,7 +329,7 @@ class GstVerificationV2Fragment : CtaData( url = NaviDeepLinkNavigator.LOAN_APPLICATION_V2.plus(FORWARD_SLASH.toString()) - .plus(GetLoanV2ViewHelper.FRESH_LOAN_DETAILS_V2) + .plus(GetLoanV2Helper.FRESH_LOAN_DETAILS_V2) ) ) } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/InReviewV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/InReviewV2Fragment.kt similarity index 99% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/InReviewV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/InReviewV2Fragment.kt index e78ee46508..81cbd6d6e9 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/InReviewV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/InReviewV2Fragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.getloanRevamp.fragments +package com.navi.pl.dynamic.fragment import android.content.Context import android.os.Bundle diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/addressverificationrevamp/fragment/KycAddressProofV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycAddressProofV2Fragment.kt similarity index 95% rename from app/src/main/java/com/naviapp/personalloanrevamp/addressverificationrevamp/fragment/KycAddressProofV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycAddressProofV2Fragment.kt index 01a417a3b0..3555391fac 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/addressverificationrevamp/fragment/KycAddressProofV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycAddressProofV2Fragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.addressverificationrevamp.fragment +package com.navi.pl.dynamic.fragment import android.content.Context import android.os.Bundle @@ -17,21 +17,29 @@ import androidx.lifecycle.ViewModelProvider import com.navi.analytics.utils.NaviTrackEvent import com.navi.base.model.CtaData import com.navi.base.utils.isNotNullAndNotEmpty +import com.navi.base.utils.orElse import com.navi.base.utils.orFalse import com.navi.base.utils.orTrue -import com.navi.common.firebasedb.* +import com.navi.common.firebasedb.FirebaseDataHelper +import com.navi.common.firebasedb.FirebaseDataReceiveListener +import com.navi.common.firebasedb.FirebaseResponse +import com.navi.common.firebasedb.FirebaseStatusType +import com.navi.common.firebasedb.UPDATE_KYC_DETAILS import com.navi.common.listeners.LocationUpdateListener import com.navi.common.model.RequestConfig import com.navi.common.ui.fragment.BaseFragment import com.navi.common.utils.ApiPollScheduler import com.navi.common.utils.observeNonNull -import com.navi.insurance.util.observeNullable +import com.navi.common.utils.observeNullable +import com.navi.pl.dynamic.adapter.CurrentAddressItemsV2Adapter +import com.navi.pl.dynamic.databinding.PlFragmentKycAddressProofV2Binding +import com.navi.pl.dynamic.helper.GetLoanV2Helper +import com.navi.pl.dynamic.listener.UpdateKycStateListener import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.FooterViewV2 import com.naviapp.common.customview.NaviHeaderView import com.naviapp.dashboard.listeners.FragmentInteractionListener -import com.naviapp.databinding.FragmentKycAddressProofV2Binding import com.naviapp.models.FeedbackPageType import com.naviapp.models.KycUiStatusValue import com.naviapp.models.response.CurrentAddress @@ -39,15 +47,9 @@ import com.naviapp.network.ApiErrorTagType import com.naviapp.personalloan.getloan.activities.GetLoanActivity import com.naviapp.personalloan.getloan.addressverification.viewmodels.AddressVerificationVM import com.naviapp.personalloan.getloan.kyc.listeners.DocumentUploadListener -import com.naviapp.personalloanrevamp.addressverificationrevamp.adapter.CurrentAddressItemsV2Adapter -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.InReviewV2Fragment -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper -import com.naviapp.personalloanrevamp.kyc.fragment.KycDocumentListFragmentV2 -import com.naviapp.personalloanrevamp.kyc.listener.UpdateKycStateListener import com.naviapp.utils.Constants -import com.naviapp.utils.Constants.PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS -import com.navi.base.utils.orElse import com.naviapp.utils.Constants.ACTION +import com.naviapp.utils.Constants.PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY import com.naviapp.utils.toast @@ -58,7 +60,7 @@ class KycAddressProofV2Fragment : FooterViewV2.FooterInteractionListener, CurrentAddressChangeListener { - private lateinit var binding: FragmentKycAddressProofV2Binding + private lateinit var binding: PlFragmentKycAddressProofV2Binding private val viewModel by lazy { ViewModelProvider(this)[AddressVerificationVM::class.java] } private var currentAddressIndex = 0 private var firebaseRequestId: String? = null @@ -80,7 +82,7 @@ class KycAddressProofV2Fragment : savedInstanceState: Bundle? ): View { super.onCreate(savedInstanceState) - binding = FragmentKycAddressProofV2Binding.inflate(inflater, container, false) + binding = PlFragmentKycAddressProofV2Binding.inflate(inflater, container, false) initError() initListeners() initObservers() @@ -222,8 +224,8 @@ class KycAddressProofV2Fragment : addressProofResponse?.header?.title?.let { headerListener?.setProperties( it, - infoCta = addressProofResponse.header.infoCta, - leftIconCode = addressProofResponse.header.leftIconCode + infoCta = addressProofResponse.header?.infoCta, + leftIconCode = addressProofResponse.header?.leftIconCode ) } @@ -276,7 +278,7 @@ class KycAddressProofV2Fragment : private fun navigateToKycInReviewScreen() { listener?.navigateTo( - GetLoanV2ViewHelper.KYC_IN_REVIEW, + GetLoanV2Helper.KYC_IN_REVIEW, bundle = Bundle().apply { putString( diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/addressverificationrevamp/fragment/KycAddressV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycAddressV2Fragment.kt similarity index 95% rename from app/src/main/java/com/naviapp/personalloanrevamp/addressverificationrevamp/fragment/KycAddressV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycAddressV2Fragment.kt index 981b14c487..388ebcc9b6 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/addressverificationrevamp/fragment/KycAddressV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycAddressV2Fragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.addressverificationrevamp.fragment +package com.navi.pl.dynamic.fragment import android.content.Context import android.os.Bundle @@ -19,22 +19,34 @@ import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider import com.navi.analytics.utils.NaviTrackEvent import com.navi.base.model.CtaData +import com.navi.base.utils.orElse import com.navi.base.utils.orFalse -import com.navi.common.firebasedb.* +import com.navi.common.firebasedb.FirebaseDataHelper +import com.navi.common.firebasedb.FirebaseDataReceiveListener +import com.navi.common.firebasedb.FirebaseResponse +import com.navi.common.firebasedb.FirebaseStatusType +import com.navi.common.firebasedb.UPDATE_KYC_DETAILS import com.navi.common.listeners.LocationUpdateListener import com.navi.common.model.RequestConfig import com.navi.common.network.models.GenericErrorResponse import com.navi.common.ui.fragment.BaseFragment -import com.navi.common.utils.* +import com.navi.common.utils.ApiPollScheduler +import com.navi.common.utils.hideKeyboard +import com.navi.common.utils.observeNonNull +import com.navi.common.utils.observeNullable import com.navi.design.font.FontWeightEnum import com.navi.design.utils.getFontStyle +import com.navi.pl.dynamic.activity.ErrorScreenV2Activity +import com.navi.pl.dynamic.databinding.PlFragmentKycAddressV2Binding +import com.navi.pl.dynamic.helper.AddressHelper.getAddressFromCurrentAddress +import com.navi.pl.dynamic.helper.GetLoanV2Helper +import com.navi.pl.dynamic.helper.KycAddressV2Helper import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.FooterViewV2 import com.naviapp.common.customview.NaviHeaderView import com.naviapp.common.navigator.ScreenNavigator import com.naviapp.dashboard.listeners.FragmentInteractionListener -import com.naviapp.databinding.FragmentKycAddressV2Binding import com.naviapp.models.FeedbackPageType import com.naviapp.models.KycUiStatusValue import com.naviapp.models.RedirectPageStatus @@ -44,16 +56,10 @@ import com.naviapp.models.response.CurrentAddress import com.naviapp.network.ApiErrorTagType import com.naviapp.personalloan.getloan.activities.GetLoanActivity import com.naviapp.personalloan.getloan.addressverification.viewmodels.AddressVerificationVM -import com.naviapp.personalloanrevamp.addressverificationrevamp.helper.AddressHelper.getAddressFromCurrentAddress -import com.naviapp.personalloanrevamp.addressverificationrevamp.helper.KycAddressV2Helper -import com.naviapp.personalloanrevamp.error.activity.ErrorScreenV2Activity -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper import com.naviapp.personalloanrevamp.models.ImportantNote import com.naviapp.utils.Constants -import com.naviapp.utils.Constants.PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS -import com.navi.base.utils.orElse -import com.naviapp.personalloanrevamp.kyc.fragment.KycV2Fragment import com.naviapp.utils.Constants.ACTION +import com.naviapp.utils.Constants.PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY import com.naviapp.utils.toast @@ -64,7 +70,7 @@ class KycAddressV2Fragment : View.OnFocusChangeListener, View.OnClickListener { - private lateinit var binding: FragmentKycAddressV2Binding + private lateinit var binding: PlFragmentKycAddressV2Binding private val viewModel by lazy { ViewModelProvider(this)[AddressVerificationVM::class.java] } private var data: CurrentAddress? = null private var uploadedDocumentTypeAndUrl: Pair? = null @@ -82,7 +88,7 @@ class KycAddressV2Fragment : container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = FragmentKycAddressV2Binding.inflate(inflater, container, false) + binding = PlFragmentKycAddressV2Binding.inflate(inflater, container, false) initUi() initListeners() initObservers() @@ -181,7 +187,7 @@ class KycAddressV2Fragment : viewModel.updateKycDetails(KycRequest(address)) } else { saveCorrespondenceAddressResponse?.footer?.nextCta?.url?.let { - listener?.navigateTo(GetLoanV2ViewHelper.KYC_ADDRESS_PROOF_VERIFICATION) + listener?.navigateTo(GetLoanV2Helper.KYC_ADDRESS_PROOF_VERIFICATION) } } } @@ -309,8 +315,8 @@ class KycAddressV2Fragment : addressVerificationDetailsResponse?.header?.title?.let { headerListener?.setProperties( it, - addressVerificationDetailsResponse.header.leftIconCode, - addressVerificationDetailsResponse.header.infoCta + addressVerificationDetailsResponse.header?.leftIconCode, + addressVerificationDetailsResponse.header?.infoCta ) } @@ -442,7 +448,7 @@ class KycAddressV2Fragment : } private fun navigateToKycInReviewScreen() { - listener?.navigateTo(GetLoanV2ViewHelper.KYC_IN_REVIEW) + listener?.navigateTo(GetLoanV2Helper.KYC_IN_REVIEW) } private fun navigateToNextScreen() { @@ -455,7 +461,7 @@ class KycAddressV2Fragment : ?.firstOrNull { item -> item.key == Constants.PERSONAL_LOAN_APPLICATION_ID } ?.value listener?.navigateTo( - GetLoanV2ViewHelper.KYC_ADDRESS_PROOF_VERIFICATION, + GetLoanV2Helper.KYC_ADDRESS_PROOF_VERIFICATION, Bundle().apply { putString(Constants.PERSONAL_LOAN_APPLICATION_ID, loanApplicationId) } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/kyc/fragment/KycDocumentListFragmentV2.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycDocumentListFragmentV2.kt similarity index 92% rename from app/src/main/java/com/naviapp/personalloanrevamp/kyc/fragment/KycDocumentListFragmentV2.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycDocumentListFragmentV2.kt index a8a505a8ec..652a8f0bdd 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/kyc/fragment/KycDocumentListFragmentV2.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycDocumentListFragmentV2.kt @@ -1,11 +1,11 @@ /* * - * * Copyright © 2019 by Navi Technologies Private Limited + * * Copyright © 2019-2023 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ -package com.naviapp.personalloanrevamp.kyc.fragment +package com.navi.pl.dynamic.fragment import android.app.Activity import android.content.Intent @@ -19,9 +19,9 @@ import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import com.navi.common.ui.fragment.BaseBottomSheet import com.navi.common.utils.observeNonNull -import com.naviapp.R +import com.navi.pl.dynamic.R +import com.navi.pl.dynamic.databinding.PlFragmentKycDocumentListV2Binding import com.naviapp.analytics.utils.NaviAnalytics -import com.naviapp.databinding.KycDocumentListFragmentBinding import com.naviapp.personalloan.getloan.kyc.adapter.KycDocumentListAdapter import com.naviapp.personalloan.getloan.kyc.listeners.DocumentUploadListener import com.naviapp.personalloan.getloan.kyc.listeners.KycDocumentItemListener @@ -35,14 +35,14 @@ import java.io.ByteArrayOutputStream import java.io.FileInputStream class KycDocumentListFragmentV2 : BaseBottomSheet(), KycDocumentItemListener { - private lateinit var binding: KycDocumentListFragmentBinding + private lateinit var binding: PlFragmentKycDocumentListV2Binding private val viewModel by lazy { ViewModelProvider(this).get(KycVM::class.java) } private var listener: DocumentUploadListener? = null private var documentSelectedType: String? = null override fun setContainerView(viewStub: ViewStub) { - viewStub.layoutResource = R.layout.kyc_document_list_fragment + viewStub.layoutResource = R.layout.pl_fragment_kyc_document_list_v2 binding = DataBindingUtil.getBinding(viewStub.inflate())!! initUi() initListeners() @@ -121,4 +121,4 @@ class KycDocumentListFragmentV2 : BaseBottomSheet(), KycDocumentItemListener { const val TAG = "KYC_DOCUMENT_LIST_FRAGMENT" private const val REQUEST_KYC_DOCUMENT_CAPTURE = 111 } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/kyc/fragment/KycV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycV2Fragment.kt similarity index 94% rename from app/src/main/java/com/naviapp/personalloanrevamp/kyc/fragment/KycV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycV2Fragment.kt index 209bed4439..a10318b588 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/kyc/fragment/KycV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/KycV2Fragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.kyc.fragment +package com.navi.pl.dynamic.fragment import android.Manifest import android.app.Activity @@ -33,30 +33,50 @@ import com.navi.base.model.StyledTextWithIconCode import com.navi.base.utils.isNotNull import com.navi.base.utils.orFalse import com.navi.base.utils.orTrue -import com.navi.common.firebasedb.* +import com.navi.common.firebasedb.AADHAR_VERIFICATION +import com.navi.common.firebasedb.FirebaseDataHelper +import com.navi.common.firebasedb.FirebaseDataReceiveListener +import com.navi.common.firebasedb.FirebaseResponse +import com.navi.common.firebasedb.FirebaseStatusType +import com.navi.common.firebasedb.OVD_UPLOAD +import com.navi.common.firebasedb.PAN_UPLOAD +import com.navi.common.firebasedb.SELFIE +import com.navi.common.firebasedb.UPDATE_KYC_DETAILS +import com.navi.common.firebasedb.VIDEO_KYC import com.navi.common.listeners.LocationUpdateListener import com.navi.common.managers.PermissionsManager import com.navi.common.model.RequestConfig import com.navi.common.model.UpdateAppDetails import com.navi.common.ui.fragment.BaseFragment -import com.navi.common.utils.* +import com.navi.common.utils.ApiPollScheduler +import com.navi.common.utils.log +import com.navi.common.utils.observeNonNull +import com.navi.common.utils.observeNullable +import com.navi.payment.utils.ProviderType +import com.navi.pl.dynamic.adapter.KycItemType +import com.navi.pl.dynamic.adapter.KycItemsV2Adapter +import com.navi.pl.dynamic.databinding.PlFragmentKycV2Binding +import com.navi.pl.dynamic.helper.GetLoanV2Helper +import com.navi.pl.dynamic.helper.VKycHelper +import com.navi.pl.dynamic.listener.UpdateKycStateListener import com.naviapp.BuildConfig -import com.naviapp.R import com.naviapp.analytics.utils.LoadTimeEventTracker import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.FooterViewV2 import com.naviapp.common.customview.NaviHeaderView import com.naviapp.common.fragment.UpdateInAppDialog import com.naviapp.dashboard.listeners.FragmentInteractionListener -import com.naviapp.databinding.KycFragmenttV2Binding -import com.naviapp.models.* +import com.naviapp.models.CustomClickConfig +import com.naviapp.models.CustomClickType +import com.naviapp.models.FeedbackPageType +import com.naviapp.models.KycUiStatusValue +import com.naviapp.models.VideoKycStatusEnum import com.naviapp.models.request.KycRequest import com.naviapp.models.request.SelfieSetting import com.naviapp.models.request.SelfieUploadRequestData import com.naviapp.models.response.KycAaadharActionType import com.naviapp.network.ApiConstants import com.naviapp.network.ApiErrorTagType -import com.navi.payment.utils.ProviderType import com.naviapp.permission.fragments.PermissionDeniedFragment import com.naviapp.permission.utils.getPermissionDeniedData import com.naviapp.personalloan.getloan.activities.GetLoanActivity @@ -72,12 +92,6 @@ import com.naviapp.personalloan.getloan.kyc.utils.DocumentType import com.naviapp.personalloan.getloan.kyc.viewmodels.KycSharedVM import com.naviapp.personalloan.getloan.kyc.viewmodels.KycVM import com.naviapp.personalloanrevamp.customview.LoanOfferStickinessBottomSheetV2 -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.InReviewV2Fragment -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper -import com.naviapp.personalloanrevamp.kyc.adapter.KycItemType -import com.naviapp.personalloanrevamp.kyc.adapter.KycItemsV2Adapter -import com.naviapp.personalloanrevamp.kyc.listener.UpdateKycStateListener -import com.naviapp.personalloanrevamp.kyc.utils.VKycHelper import com.naviapp.personalloanrevamp.models.KycItemV2 import com.naviapp.personalloanrevamp.models.KycMultipleActionType import com.naviapp.personalloanrevamp.useridentificationv2.fragments.InformationBottomSheet @@ -89,15 +103,20 @@ import com.naviapp.utils.IconUtils import com.naviapp.utils.PROD import com.naviapp.utils.isDead import com.naviapp.utils.toast -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import java.io.ByteArrayOutputStream import java.io.File import java.io.FileInputStream -import java.util.* +import java.util.Locale +import com.naviapp.R as appR class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInteractionListener { - private lateinit var binding: KycFragmenttV2Binding + private lateinit var binding: PlFragmentKycV2Binding private val viewModel by lazy { ViewModelProvider(this)[KycVM::class.java] } private val sharedViewModel by lazy { ViewModelProvider(requireActivity())[KycSharedVM::class.java] } private var firebaseRequestId: String? = null @@ -152,7 +171,7 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = KycFragmenttV2Binding.inflate(inflater, container, false) + binding = PlFragmentKycV2Binding.inflate(inflater, container, false) return binding.root } @@ -413,7 +432,7 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter navigateToKycInReviewScreen() } else -> { - context?.toast(R.string.something_went_wrong) + context?.toast(appR.string.something_went_wrong) } } } @@ -432,16 +451,16 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter private fun navigateToKycInReviewScreen() { listener?.navigateTo( - GetLoanV2ViewHelper.KYC_IN_REVIEW, + GetLoanV2Helper.KYC_IN_REVIEW, bundle = Bundle().apply { putString( InReviewV2Fragment.TITLE, - resources.getString(R.string.kyc_verification_pending) + resources.getString(appR.string.kyc_verification_pending) ) putString( InReviewV2Fragment.DESCRIPTION, - resources.getString(R.string.kyc_pending_description) + resources.getString(appR.string.kyc_pending_description) ) } ) @@ -520,10 +539,10 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter kycDetailsResponse.header?.title?.let { headerListener?.setProperties( - kycDetailsResponse.header.title, - kycDetailsResponse.header.leftIconCode, - kycDetailsResponse.header.infoCta, - colorInt = R.color.white, + it, + kycDetailsResponse.header?.leftIconCode, + kycDetailsResponse.header?.infoCta, + colorInt = appR.color.white, hideDivider = true ) } @@ -585,7 +604,7 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter } ?.description = StyledTextWithIconCode( - text = getString(R.string.verification_incomplete), + text = getString(appR.string.verification_incomplete), iconCode = IconUtils.WARNING_SMALL_ICON, hexColorCode = "#f7b500" ) @@ -600,7 +619,7 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter item?.description = StyledTextWithIconCode( - text = getString(R.string.selfie_capture_incomplete), + text = getString(appR.string.selfie_capture_incomplete), iconCode = IconUtils.WARNING_SMALL_ICON, hexColorCode = "#f7b500" ) @@ -653,7 +672,7 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter if (it.errorCode != 11) { it.errorMessage?.let { errorText -> activity?.toast(errorText, Toast.LENGTH_LONG) } } else { - activity?.toast(R.string.something_went_wrong_please_retry, Toast.LENGTH_LONG) + activity?.toast(appR.string.something_went_wrong_please_retry, Toast.LENGTH_LONG) } } } @@ -720,7 +739,7 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter } PROVIDER_MOCK -> { - bitmapImage = BitmapFactory.decodeResource(resources, R.drawable.bank) + bitmapImage = BitmapFactory.decodeResource(resources, appR.drawable.bank) } else -> { @@ -805,7 +824,7 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter } } } else { - listener?.navigateTo(GetLoanV2ViewHelper.VIDEO_KYC_V2_SCREEN) + listener?.navigateTo(GetLoanV2Helper.VIDEO_KYC_V2_SCREEN) } } @@ -851,7 +870,7 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter private fun onClickPanPhoto(showReviewScreen: Boolean?, shouldAutoCapture: Boolean?) { loadTimeEventTracker.onLoadingStarted(NaviAnalytics.PL_PAN_UPLOAD_TIME) - val hvDocConfig = vKycHelper.hvDocPANConfig(getString(R.string.pan_capture), showReviewScreen, shouldAutoCapture, context) + val hvDocConfig = vKycHelper.hvDocPANConfig(getString(appR.string.pan_capture), showReviewScreen, shouldAutoCapture, context) HVDocsActivity.start(requireContext(), hvDocConfig, activity as DocCaptureCompletionHandler) } @@ -934,7 +953,7 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter initVkyc(permissionsManager) } else { analyticsEventTracker.onStoragePermissionResult(NaviAnalytics.NO) - toast(getString(R.string.permissions_required_for_video_kyc)) + toast(getString(appR.string.permissions_required_for_video_kyc)) } } @@ -949,7 +968,7 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter analyticsEventTracker.onCameraPermissionResult(NaviAnalytics.NO) if (!shouldShowRequestPermissionRationale(PermissionsManager.CAMERA_PERMISSION)) handleDoNotAskAgain(PermissionsManager.CAMERA_PERMISSION) - else toast(getString(R.string.camera_permission_required_for_selfie)) + else toast(getString(appR.string.camera_permission_required_for_selfie)) } } @@ -961,7 +980,7 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter analyticsEventTracker.onCameraPermissionResult(NaviAnalytics.NO) if (!shouldShowRequestPermissionRationale(PermissionsManager.CAMERA_PERMISSION)) handleDoNotAskAgain(PermissionsManager.CAMERA_PERMISSION) - else toast(getString(R.string.camera_permission_required_for_pan)) + else toast(getString(appR.string.camera_permission_required_for_pan)) } } @@ -979,7 +998,7 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter analyticsEventTracker.onStoragePermissionResult(NaviAnalytics.NO) if (!shouldShowRequestPermissionRationale(PermissionsManager.STORAGE_PERMISSION)) handleDoNotAskAgain(PermissionsManager.STORAGE_PERMISSION) - else toast(getString(R.string.storage_permission_required_for_aadhaar)) + else toast(getString(appR.string.storage_permission_required_for_aadhaar)) } } @@ -1280,7 +1299,7 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter } override fun onAddressClicked() { - listener?.navigateTo(GetLoanV2ViewHelper.KYC_ADDRESS_VERIFICATION) + listener?.navigateTo(GetLoanV2Helper.KYC_ADDRESS_VERIFICATION) } override fun onPause() { @@ -1318,8 +1337,6 @@ class KycV2Fragment : BaseFragment(), KycItemsListener, FooterViewV2.FooterInter const val VIDEO_KYC_REQUEST_CODE = 103 const val AADHAR_OTP_REQUEST_CODE = 104 const val COMPLETED = "COMPLETED" - const val CURRENT_ADDRESS = "CURRENT_ADDRESS" - const val TEXTFIELD = "TEXTFIELD" } override fun onFooterBackPressed(backCta: CtaData?) { diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/LoanDetailsEditorFragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanDetailsEditorFragment.kt similarity index 94% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/LoanDetailsEditorFragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanDetailsEditorFragment.kt index 2fec350521..bb5137995d 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/LoanDetailsEditorFragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanDetailsEditorFragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.getloanRevamp.fragments +package com.navi.pl.dynamic.fragment import android.content.Context import android.os.Bundle @@ -37,6 +37,7 @@ import com.navi.naviwidgets.callbacks.WidgetCallback import com.navi.naviwidgets.models.response.Footer import com.navi.naviwidgets.utils.FORWARD_SLASH import com.navi.naviwidgets.widgets.textdisplay.Margin +import com.navi.pl.dynamic.helper.GetLoanV2Helper import com.navi.uitron.render.UiTronRenderer import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics @@ -55,22 +56,25 @@ import com.naviapp.models.response.LoanDetailsV2AdditionData import com.naviapp.network.ApiErrorTagType import com.naviapp.personalloan.factory.LoanDetailsV2VHFactoryImpl import com.naviapp.personalloanrevamp.getloanRevamp.adapters.LoanDetailsV2WidgetAdapter -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper import com.naviapp.personalloanrevamp.getloanRevamp.listeners.LoanDetailsV2WidgetAdapterListener import com.naviapp.personalloanrevamp.getloanRevamp.viewmodels.GetLoanV2SharedVM import com.naviapp.personalloanrevamp.getloanRevamp.viewmodels.LoanEditorVM +import com.naviapp.personalloanrevamp.models.CtaType import com.naviapp.personalloanrevamp.models.response.LoanDetailsV2Response -import com.naviapp.utils.* +import com.naviapp.utils.Constants import com.naviapp.utils.Constants.ACTION import com.naviapp.utils.Constants.AUTO_DEBIT_SHOWN import com.naviapp.utils.Constants.FETCH_FIRST_SELECTED_EMI_DATE_CODE import com.naviapp.utils.Constants.FLOW_TYPE import com.naviapp.utils.Constants.PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY -import dagger.hilt.android.AndroidEntryPoint +import com.naviapp.utils.LOAN_APPLICATION_ID +import com.naviapp.utils.OFFER_ID +import com.naviapp.utils.PRODUCT_CODE +import com.naviapp.utils.appendStrings +import com.naviapp.utils.setMargin import kotlinx.coroutines.launch -@AndroidEntryPoint class LoanDetailsEditorFragment : BaseFragment(), LoanDetailsV2WidgetAdapterListener, FooterViewV2.FooterInteractionListener, BackListener, @@ -251,9 +255,9 @@ class LoanDetailsEditorFragment : binding.uitronFooter.visibility = View.VISIBLE binding.uitronFooter.setContent { UiTronRenderer( - loanDetailsV2Response.footer.uiTronFooter.data, + loanDetailsV2Response.footer?.uiTronFooter?.data, viewModel - ).Render(composeViews = loanDetailsV2Response.footer.uiTronFooter.parentComposeView.orEmpty()) + ).Render(composeViews = loanDetailsV2Response.footer?.uiTronFooter?.parentComposeView.orEmpty()) } } ?: initUI() } @@ -284,7 +288,7 @@ class LoanDetailsEditorFragment : requestCode = FETCH_FIRST_SELECTED_EMI_DATE_CODE, ctaData = CtaData( url = NaviDeepLinkNavigator.LOAN_APPLICATION_V2.appendStrings( - FORWARD_SLASH.toString(), GetLoanV2ViewHelper.EMI_SELECTOR_FRAGMENT_V2 + FORWARD_SLASH.toString(), GetLoanV2Helper.EMI_SELECTOR_FRAGMENT_V2 ) ), finish = false @@ -361,14 +365,14 @@ class LoanDetailsEditorFragment : LoanDetailsV2WidgetAdapter( widgetConfigList = it, listener = this, - additionalData = loanDetailsV2Response.content.additionalData, + additionalData = loanDetailsV2Response.content?.additionalData, LoanDetailsV2VHFactoryImpl(viewModel), this ) } else { (binding.loanDetailsEditorRv.adapter as? LoanDetailsV2WidgetAdapter)?.updateData( widgetConfigList = it, - additionalData = loanDetailsV2Response.content.additionalData + additionalData = loanDetailsV2Response.content?.additionalData ) } } @@ -494,7 +498,7 @@ class LoanDetailsEditorFragment : NaviDeepLinkNavigator.navigateTo( activity = activity, ctaData = CtaData( url = NaviDeepLinkNavigator.LOAN_APPLICATION_V2.appendStrings( - FORWARD_SLASH.toString(), GetLoanV2ViewHelper.UPCOMING_EMI_DETAIL_V2 + FORWARD_SLASH.toString(), GetLoanV2Helper.UPCOMING_EMI_DETAIL_V2 ) ), bundle = bundle, finish = false ) @@ -680,7 +684,7 @@ class LoanDetailsEditorFragment : putString(FLOW_TYPE, TAG) } fragmentInteractionListener?.navigateTo( - screen = GetLoanV2ViewHelper.LOAN_DETAILS_V2_FRAGMENT, + screen = GetLoanV2Helper.LOAN_DETAILS_V2_FRAGMENT, bundle = bundle ) } @@ -722,26 +726,6 @@ class LoanDetailsEditorFragment : fun getInstance() = LoanDetailsEditorFragment() } - enum class CtaType(val value: String) { - CHANGE_EMI_DATE("CHANGE_EMI_DATE"), - TENURE_SELECTED_TYPE("TENURE_SELECTED_TYPE"), - SLIDER_SELECTED_TYPE("SLIDER_SELECTED_TYPE"), - TENURE_SELECTED_VALUE("TENURE_SELECTED_VALUE"), - MONTHLY_EMI_VALUE("MONTHLY_EMI_VALUE"), - CUSTOMISE_TENURE("CUSTOMISE_TENURE"), - TENURE_SLIDER_CHANGE("TENURE_SLIDER_CHANGE"), - VIEW_EMI_CALENDAR("VIEW_EMI_CALENDAR"), - KNOW_MORE("KNOW_MORE"), - SLIDER_END_TYPE("SLIDER_END_TYPE"), - TENURE_CLICKED_TYPE("TENURE_CLICKED_TYPE"), - TENURE_DEFAULT_SELECTED("TENURE_DEFAULT_SELECTED"), - INFO_ICON_CLICK("INFO_ICON_CLICK"), - FOOTER_NEXT_PRESS("FOOTER_NEXT_PRESS"), - FOOTER_DESCRIPTION_PRESS("FOOTER_DESCRIPTION_PRESS"), - APR_CLICK("APR_BOTTOM_SHEET"), - CLOSE_SNAPPED_HEADER("CLOSE_SNAPPED_HEADER") - } - override fun onBackPressed() { onFooterBackPressed(null) } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/LoanDetailsV2BaseFragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanDetailsV2BaseFragment.kt similarity index 99% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/LoanDetailsV2BaseFragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanDetailsV2BaseFragment.kt index 8bc932b7d6..3ce5c39eec 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/LoanDetailsV2BaseFragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanDetailsV2BaseFragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.getloanRevamp.fragments +package com.navi.pl.dynamic.fragment import android.annotation.SuppressLint import android.view.View diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/LoanDetailsV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanDetailsV2Fragment.kt similarity index 94% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/LoanDetailsV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanDetailsV2Fragment.kt index 41a6505ac3..0e19baf7e8 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/LoanDetailsV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanDetailsV2Fragment.kt @@ -5,13 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.getloanRevamp.fragments -/* - * - * * Copyright © 2022 by Navi Technologies Private Limited - * * All rights reserved. Strictly confidential - * - */ +package com.navi.pl.dynamic.fragment import android.content.Context import android.graphics.Color @@ -22,7 +16,6 @@ import android.text.TextUtils import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.annotation.ColorRes import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.PermissionChecker import androidx.core.view.isVisible @@ -40,27 +33,50 @@ import co.hyperverge.hypersnapsdk.model.UIConfig import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.gson.Gson import com.navi.analytics.utils.NaviTrackEvent -import com.navi.base.model.* +import com.navi.base.model.BoldTypeList +import com.navi.base.model.ClickableTextType +import com.navi.base.model.CtaData +import com.navi.base.model.GenericAnalyticsData +import com.navi.base.model.LineItem +import com.navi.base.model.NaviClickAction +import com.navi.base.model.NaviWidgetClickWithActionData +import com.navi.base.model.StyledTextWithIconCode import com.navi.base.sharedpref.PreferenceManager import com.navi.base.utils.orElse import com.navi.base.utils.orFalse import com.navi.base.utils.orTrue import com.navi.base.utils.orZero import com.navi.chat.utils.ChatPLScreens -import com.navi.common.firebasedb.* +import com.navi.common.firebasedb.FirebaseDataHelper +import com.navi.common.firebasedb.FirebaseDataReceiveListener +import com.navi.common.firebasedb.FirebaseResponse +import com.navi.common.firebasedb.FirebaseStatusType +import com.navi.common.firebasedb.LOAN_AGREEMENT_SIGN +import com.navi.common.firebasedb.LOAN_APPLY +import com.navi.common.firebasedb.OFFER_GENERATE import com.navi.common.listeners.ClickableTextListener import com.navi.common.managers.PermissionsManager import com.navi.common.model.InfoBottomSheetConfig import com.navi.common.model.RequestConfig import com.navi.common.network.models.GenericResponseState import com.navi.common.uitron.model.action.CtaAction -import com.navi.common.utils.* +import com.navi.common.utils.ApiPollScheduler +import com.navi.common.utils.findFirstVisibleItemPosition +import com.navi.common.utils.log +import com.navi.common.utils.observeNonNull +import com.navi.common.utils.observeNullable +import com.navi.common.utils.setStyledText +import com.navi.common.utils.toCtaData import com.navi.design.utils.getNaviDrawable import com.navi.design.utils.parseColorSafe import com.navi.naviwidgets.callbacks.WidgetCallback import com.navi.naviwidgets.utils.FORWARD_SLASH import com.navi.naviwidgets.utils.setBackgroundColor import com.navi.naviwidgets.widgets.textdisplay.Margin +import com.navi.pl.dynamic.databinding.PlFragmentLoanDetailsV2Binding +import com.navi.pl.dynamic.fragment.KycV2Fragment.Companion.PAN_CAMERA_REQUEST_CODE +import com.navi.pl.dynamic.helper.GetLoanV2Helper +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 @@ -75,8 +91,13 @@ import com.naviapp.common.listeners.FooterWithDescriptionListener import com.naviapp.common.navigator.NaviDeepLinkNavigator import com.naviapp.common.navigator.ScreenNavigator import com.naviapp.dashboard.listeners.FragmentInteractionListener -import com.naviapp.databinding.LoanDetailsV2FragmentBinding -import com.naviapp.models.* +import com.naviapp.models.CustomClickConfig +import com.naviapp.models.CustomClickType +import com.naviapp.models.FooterType +import com.naviapp.models.Offer +import com.naviapp.models.SubPageStatusType +import com.naviapp.models.Tenure +import com.naviapp.models.UserProfile import com.naviapp.models.request.LoanFeeDetailsRequest import com.naviapp.models.request.LoanRequest import com.naviapp.models.request.SliderType @@ -90,13 +111,12 @@ import com.naviapp.personalloan.getloan.activities.GetLoanActivity import com.naviapp.personalloan.getloan.kyc.viewmodels.KycSharedVM import com.naviapp.personalloanrevamp.common.customview.LoanAmountSummaryView import com.naviapp.personalloanrevamp.getloanRevamp.adapters.LoanDetailsV2WidgetAdapter -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper +import com.naviapp.personalloanrevamp.getloanRevamp.fragments.BankDetailsAutoDebitV2Fragment import com.naviapp.personalloanrevamp.getloanRevamp.listeners.LoanDetailsV2WidgetAdapterListener import com.naviapp.personalloanrevamp.getloanRevamp.repository.LoanDetailsV2Repository import com.naviapp.personalloanrevamp.getloanRevamp.viewmodels.GetLoanV2SharedVM import com.naviapp.personalloanrevamp.getloanRevamp.viewmodels.LoanDetailsV2FragmentVM -import com.naviapp.personalloanrevamp.kyc.fragment.KycV2Fragment.Companion.PAN_CAMERA_REQUEST_CODE -import com.naviapp.personalloanrevamp.kyc.utils.VKycHelper +import com.naviapp.personalloanrevamp.models.CtaType import com.naviapp.personalloanrevamp.models.LoanDetailsV2WidgetType import com.naviapp.personalloanrevamp.models.SnappedWidget import com.naviapp.personalloanrevamp.models.StyledTextTimedCardData @@ -106,7 +126,6 @@ import com.naviapp.personalloanrevamp.models.response.LoanDetailsV2Content import com.naviapp.personalloanrevamp.models.response.LoanDetailsV2Response import com.naviapp.personalloanrevamp.models.response.TransferBottomSheetContent import com.naviapp.personalloanrevamp.useridentificationv2.fragments.InformationBottomSheet -import com.naviapp.utils.* import com.naviapp.utils.Constants import com.naviapp.utils.Constants.ACTION import com.naviapp.utils.Constants.AUTO_DEBIT_SHOWN @@ -125,17 +144,26 @@ import com.naviapp.utils.Constants.REPEAT_LOAN_DETAILS_FLOW import com.naviapp.utils.Constants.SLASH import com.naviapp.utils.Constants.TRANSFER_BOTTOMSHEET import com.naviapp.utils.Constants.ZERO -import dagger.hilt.android.AndroidEntryPoint +import com.naviapp.utils.DOT +import com.naviapp.utils.LOAN_APPLICATION_ID +import com.naviapp.utils.OFFER_ID +import com.naviapp.utils.PRODUCT_CODE +import com.naviapp.utils.appendStrings +import com.naviapp.utils.dpToPx +import com.naviapp.utils.formatAmount +import com.naviapp.utils.isBottomSheetEnabled +import com.naviapp.utils.isValidEmail +import com.naviapp.utils.pxToDp +import com.naviapp.utils.rawToCtaData +import com.naviapp.utils.setMargin import getDataId import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import javax.inject.Inject -@AndroidEntryPoint class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescriptionListener, ClickableTextListener, LoanDetailsV2WidgetAdapterListener, WidgetCallback, BackListener { - private lateinit var binding: LoanDetailsV2FragmentBinding + private lateinit var binding: PlFragmentLoanDetailsV2Binding private val viewModel by lazy { ViewModelProvider(this)[LoanDetailsV2FragmentVM::class.java] } @@ -145,9 +173,8 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription private var listener: FragmentInteractionListener? = null private var vKycHelper = VKycHelper() - @Inject lateinit var repository: LoanDetailsV2Repository - private var updateUIListener: UpdateUiListener? = null + private var updateUIListener: BankDetailsAutoDebitV2Fragment.UpdateUiListener? = null private val widgetNaviAnalyticsEventTracker = NaviAnalytics.naviAnalytics.Widget() private var sharedVM: GetLoanV2SharedVM? = null private var loanAmountSummaryWidgetPosition: Int? = null @@ -164,7 +191,8 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { super.onCreateView(inflater, container, savedInstanceState) - binding = LoanDetailsV2FragmentBinding.inflate(inflater, container, false) + binding = PlFragmentLoanDetailsV2Binding.inflate(inflater, container, false) + repository = LoanDetailsV2Repository() initUi() initError() initObservers() @@ -443,7 +471,7 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription var text = if (sliderAmount == null) { additionData?.loanAmtPrefix?.text?.let { if (!description.text?.contains(it).orFalse()) { - "${additionData.loanAmtPrefix.text} ${description.text}" + "${additionData.loanAmtPrefix?.text} ${description.text}" } else { "${description.text}" } @@ -452,7 +480,7 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription } } else { additionData?.loanAmtPrefix?.text?.let { - "${additionData.loanAmtPrefix.text} $sliderAmount" + "${additionData.loanAmtPrefix?.text} $sliderAmount" } ?: run { "$sliderAmount" } @@ -538,7 +566,7 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription it.content?.additionalData?.analyticsData?.viewedData?.eventName?.let { eventName -> NaviTrackEvent.trackEventOnClickStream( eventName, - it.content.additionalData.analyticsData.viewedData?.parameters + it.content?.additionalData?.analyticsData?.viewedData?.parameters ) } setLayoutMargin( @@ -642,7 +670,7 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription viewModel.subsequentKycStatus.observeNonNull(viewLifecycleOwner) { subsequentKycStatus -> subsequentKycStatus.status?.let { if (TextUtils.equals(it, FirebaseStatusType.SUCCESS)) { - statusHandling(status = subsequentKycStatus.status, Constants.EMPTY) + statusHandling(status = (subsequentKycStatus.status as String), Constants.EMPTY) if (subsequentKycStatus.shouldSignLoan.orFalse()) { signLoanAgreement() } else { @@ -712,7 +740,7 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription FirebaseStatusType.FAILURE ) ) { - statusHandling(status = subsequentKycStatus.status, Constants.EMPTY) + statusHandling(status = (subsequentKycStatus.status as String), Constants.EMPTY) } } } @@ -814,9 +842,9 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription binding.uitronFooter.visibility = View.VISIBLE binding.uitronFooter.setContent { UiTronRenderer( - loanDetailsV2Response.footer.uiTronFooter.data, + loanDetailsV2Response.footer?.uiTronFooter?.data, viewModel - ).Render(composeViews = loanDetailsV2Response.footer.uiTronFooter.parentComposeView.orEmpty()) + ).Render(composeViews = loanDetailsV2Response.footer?.uiTronFooter?.parentComposeView.orEmpty()) } } ?: enableTitleDescriptionFooter(loanDetailsV2Response) } @@ -1231,7 +1259,7 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription super.onAttach(context) listener = context as? FragmentInteractionListener headerListener = context as? NaviHeaderView.InteractionListener - updateUIListener = context as? UpdateUiListener + updateUIListener = context as? BankDetailsAutoDebitV2Fragment.UpdateUiListener activity?.let { sharedVM = ViewModelProvider(it)[GetLoanV2SharedVM::class.java] } } @@ -1491,7 +1519,7 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription private fun handleCtaType(ctaData: CtaData?) { when (ctaData?.type) { - LoanDetailsEditorFragment.CtaType.CHANGE_EMI_DATE.value -> { + CtaType.CHANGE_EMI_DATE.value -> { if (isWebView()) { val loanFeeDetailsRequest = constructEmiBundleFromCtaParams(ctaData.parameters) openEmiCalendar(loanFeeDetailsRequest) @@ -1500,23 +1528,23 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription } } - LoanDetailsEditorFragment.CtaType.TENURE_DEFAULT_SELECTED.value -> { + CtaType.TENURE_DEFAULT_SELECTED.value -> { onTenureDefaultSelected(ctaData.parameters) } - LoanDetailsEditorFragment.CtaType.TENURE_CLICKED_TYPE.value -> { + CtaType.TENURE_CLICKED_TYPE.value -> { onTenureChanged(ctaData.parameters) } - LoanDetailsEditorFragment.CtaType.INFO_ICON_CLICK.value -> { + CtaType.INFO_ICON_CLICK.value -> { openEffectiveInterestCostScreen(ctaData) } - LoanDetailsEditorFragment.CtaType.SLIDER_END_TYPE.value -> { + CtaType.SLIDER_END_TYPE.value -> { onTenureSliderSelected(ctaData.parameters) } - LoanDetailsEditorFragment.CtaType.VIEW_EMI_CALENDAR.value -> { + CtaType.VIEW_EMI_CALENDAR.value -> { if (isWebView()) { val loanFeeDetailsRequest = constructEmiBundleFromCtaParams(ctaData.parameters) launchEmiCalendar(loanFeeDetailsRequest) @@ -1528,12 +1556,12 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription } } - LoanDetailsEditorFragment.CtaType.CLOSE_SNAPPED_HEADER.value -> { + CtaType.CLOSE_SNAPPED_HEADER.value -> { binding.snappedHeaderLl.visibility = View.GONE binding.snappedHeaderLlNewDesign.visibility = View.GONE } - LoanDetailsEditorFragment.CtaType.FOOTER_DESCRIPTION_PRESS.value -> { + CtaType.FOOTER_DESCRIPTION_PRESS.value -> { // To Support Backward compatible using it both in content as well as additional data onFooterDescriptionPress( viewModel.loanDetailsV2Response.value?.content?.additionalData?.footerClickableText?.type @@ -1545,7 +1573,7 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription ) } - LoanDetailsEditorFragment.CtaType.APR_CLICK.value -> { + CtaType.APR_CLICK.value -> { onFooterDescriptionPress( viewModel.loanDetailsV2Response.value?.content?.additionalData?.aprClickableText?.type, viewModel.loanDetailsV2Response.value?.content?.additionalData?.aprClickableText?.data, @@ -1553,7 +1581,7 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription ) } - LoanDetailsEditorFragment.CtaType.FOOTER_NEXT_PRESS.value -> { + CtaType.FOOTER_NEXT_PRESS.value -> { onFooterNextPress(ctaData) } @@ -1561,7 +1589,7 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription openFooterBottomSheetCta(ctaData.parameters) } - LoanTooltipSliderView.LOAN_AMOUNT_SLIDER -> { + CtaType.LOAN_AMOUNT_SLIDER.value -> { setSelectedLoanAmountSliderValue(ctaData.parameters) } @@ -1593,7 +1621,7 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription } } - if (LoanDetailsEditorFragment.CtaType.TENURE_SELECTED_TYPE.value == ctaData?.type) { + if (CtaType.TENURE_SELECTED_TYPE.value == ctaData?.type) { loanDetailsEventTracker.onTenurePlanClick( viewModel.getOfferId(), isAutoDebitShown(), @@ -1603,7 +1631,7 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription ) } - if (LoanDetailsEditorFragment.CtaType.SLIDER_SELECTED_TYPE.value == ctaData?.type) { + if (CtaType.SLIDER_SELECTED_TYPE.value == ctaData?.type) { loanDetailsEventTracker.onEmiSliderChanged( viewModel.getOfferId(), isAutoDebitShown(), @@ -1677,7 +1705,7 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription private fun handleClickEvent(it: String) { var eventName: String? = null when (it) { - GetLoanV2ViewHelper.LOAN_DETAILS_EDITOR_FRAGMENT -> eventName = + GetLoanV2Helper.LOAN_DETAILS_EDITOR_FRAGMENT -> eventName = NaviAnalytics.PL_REPEAT_PAGE_EDIT_CLICK BANK_DETAILS_AUTO_DEBIT_CTA -> eventName = NaviAnalytics.PL_REPEAT_PAGE_AUTO_DEBIT_CLICK @@ -1757,13 +1785,6 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription super.onDestroy() } - interface UpdateUiListener { - fun changeHeaderBackGround(blackOut: Boolean) - fun changeHeaderBackgroundColor(@ColorRes color: Int) - fun showAutoPayAnimation() - fun setHeaderBackgroundColor(colorString: String) - } - private fun onEmiDateChange(firstEmiDate: String) { if (!isWebView()) { viewModel.selectedLoanAmount.value?.let { @@ -1828,7 +1849,7 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription requestCode = FETCH_FIRST_SELECTED_EMI_DATE_CODE, ctaData = CtaData( url = NaviDeepLinkNavigator.LOAN_APPLICATION_V2.appendStrings( - FORWARD_SLASH.toString(), GetLoanV2ViewHelper.EMI_SELECTOR_FRAGMENT_V2 + FORWARD_SLASH.toString(), GetLoanV2Helper.EMI_SELECTOR_FRAGMENT_V2 ) ), finish = false @@ -1919,7 +1940,7 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription NaviDeepLinkNavigator.navigateTo( activity = activity, ctaData = CtaData( url = NaviDeepLinkNavigator.LOAN_APPLICATION_V2.appendStrings( - FORWARD_SLASH.toString(), GetLoanV2ViewHelper.UPCOMING_EMI_DETAIL_V2 + FORWARD_SLASH.toString(), GetLoanV2Helper.UPCOMING_EMI_DETAIL_V2 ) ), bundle = bundle, finish = false ) @@ -1928,11 +1949,11 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription private fun onTenureDefaultSelected(parameters: List?) { parameters?.forEach { when (it.key) { - LoanDetailsEditorFragment.CtaType.TENURE_SELECTED_VALUE.value -> { + CtaType.TENURE_SELECTED_VALUE.value -> { viewModel.setSelectedTenure(it.value?.toInt().orZero()) } - LoanDetailsEditorFragment.CtaType.MONTHLY_EMI_VALUE.value -> { + CtaType.MONTHLY_EMI_VALUE.value -> { viewModel.setSelectedMonthlyEmi(it.value?.toDouble().orZero()) } } @@ -1942,15 +1963,15 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription private fun onTenureSliderSelected(parameters: List?) { parameters?.forEach { when (it.key) { - LoanDetailsEditorFragment.CtaType.TENURE_SELECTED_VALUE.value -> { + CtaType.TENURE_SELECTED_VALUE.value -> { viewModel.setSelectedTenure(it.value?.toInt().orZero()) } - LoanDetailsEditorFragment.CtaType.MONTHLY_EMI_VALUE.value -> { + CtaType.MONTHLY_EMI_VALUE.value -> { viewModel.setSelectedMonthlyEmi(it.value?.toDouble().orZero()) } - LoanDetailsEditorFragment.CtaType.CUSTOMISE_TENURE.value -> { + CtaType.CUSTOMISE_TENURE.value -> { val isCustomizeTenureSelected = it.value?.toBoolean()?.orFalse() if (isCustomizeTenureSelected.orFalse()) { loanDetailsEventTracker.onCustomizeTenureCardClicked( @@ -1976,15 +1997,15 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription var isCustomizeTenureSelected: Boolean? = false parameters?.forEach { when (it.key) { - LoanDetailsEditorFragment.CtaType.TENURE_SELECTED_VALUE.value -> { + CtaType.TENURE_SELECTED_VALUE.value -> { viewModel.setSelectedTenure(it.value?.toInt().orZero()) } - LoanDetailsEditorFragment.CtaType.MONTHLY_EMI_VALUE.value -> { + CtaType.MONTHLY_EMI_VALUE.value -> { viewModel.setSelectedMonthlyEmi(it.value?.toDouble().orZero()) } - LoanDetailsEditorFragment.CtaType.CUSTOMISE_TENURE.value -> { + CtaType.CUSTOMISE_TENURE.value -> { isCustomizeTenureSelected = it.value?.toBoolean()?.orFalse() if (isCustomizeTenureSelected.orFalse()) { loanDetailsEventTracker.onCustomizeTenureCardClicked( @@ -2027,10 +2048,10 @@ class LoanDetailsV2Fragment : LoanDetailsV2BaseFragment(), FooterWithDescription NaviDeepLinkNavigator.LOAN_APPLICATION_V2.plus(SLASH) .plus(SubPageStatusType.BANK_DETAILS_V2) private const val OFFER_UPGRADE_V2 = NaviDeepLinkNavigator.LOAN_APPLICATION_V2.plus(SLASH) - .plus(GetLoanV2ViewHelper.LOAN_OFFER_UPGRADE_V2) + .plus(GetLoanV2Helper.LOAN_OFFER_UPGRADE_V2) private const val BANK_DETAILS_AUTO_DEBIT_V2_CTA = NaviDeepLinkNavigator.LOAN_APPLICATION_V2.plus(SLASH) - .plus(GetLoanV2ViewHelper.BANK_DETAILS_AUTO_DEBIT_V2) + .plus(GetLoanV2Helper.BANK_DETAILS_AUTO_DEBIT_V2) fun newInstance(arguments: Bundle?) = LoanDetailsV2Fragment().apply { this.arguments = arguments } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2/fragments/LoanOfferUpgradeV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanOfferUpgradeV2Fragment.kt similarity index 95% rename from app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2/fragments/LoanOfferUpgradeV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanOfferUpgradeV2Fragment.kt index 140cb25604..8eed66cc24 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2/fragments/LoanOfferUpgradeV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanOfferUpgradeV2Fragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.intermediatev2.fragments +package com.navi.pl.dynamic.fragment import android.content.Context import android.os.Bundle @@ -19,6 +19,7 @@ import com.navi.base.model.CtaData import com.navi.common.ui.fragment.BaseFragment import com.navi.common.ui.fragment.CommonDialogBox import com.navi.common.utils.observeNonNull +import com.navi.pl.dynamic.helper.GetLoanV2Helper import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.FooterViewV2 @@ -27,11 +28,15 @@ import com.naviapp.common.listeners.BackListener import com.naviapp.common.navigator.NaviDeepLinkNavigator import com.naviapp.dashboard.listeners.FragmentInteractionListener import com.naviapp.databinding.FragmentLoanOfferUpgradeV2Binding -import com.naviapp.models.response.* +import com.naviapp.models.response.HeaderTitleBody +import com.naviapp.models.response.HeaderTitleWidgetConfig +import com.naviapp.models.response.ItemWithTextAndIcon +import com.naviapp.models.response.OfferUpgradeGreetingResponse +import com.naviapp.models.response.PopUpInfo +import com.naviapp.models.response.PopularCards import com.naviapp.personalloan.getloan.activities.GetLoanActivity import com.naviapp.personalloan.getloan.loandetails.viewmodels.LoanOfferUpgradeVM import com.naviapp.personalloanrevamp.getloanRevamp.customview.OfferImprovementCardViewV2 -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper import com.naviapp.utils.Constants import com.naviapp.utils.Constants.ACTION import com.naviapp.utils.Constants.EPFO_PAGE_TYPE @@ -270,10 +275,10 @@ class LoanOfferUpgradeV2Fragment : override fun onBackPressed() { when (arguments?.getString(Constants.FLOW_TYPE).orEmpty()) { REPEAT_LOAN_DETAILS_FLOW -> { - listener?.navigateTo(GetLoanV2ViewHelper.LOAN_DETAILS_V2_FRAGMENT, Bundle()) + listener?.navigateTo(GetLoanV2Helper.LOAN_DETAILS_V2_FRAGMENT, Bundle()) } FRESH_LOAN_DETAILS_FLOW -> { - listener?.navigateTo(GetLoanV2ViewHelper.FRESH_LOAN_DETAILS_V2, Bundle()) + listener?.navigateTo(GetLoanV2Helper.FRESH_LOAN_DETAILS_V2, Bundle()) } else -> { listener?.navigateTo(NaviDeepLinkNavigator.HOME, Bundle()) diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/LoanOfferUpgradeV3Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanOfferUpgradeV3Fragment.kt similarity index 96% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/LoanOfferUpgradeV3Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanOfferUpgradeV3Fragment.kt index 6ff1837aff..e2cc279ee4 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/LoanOfferUpgradeV3Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanOfferUpgradeV3Fragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.getloanRevamp.fragments +package com.navi.pl.dynamic.fragment import android.content.Context import android.os.Bundle @@ -24,6 +24,8 @@ import com.navi.base.utils.orZero import com.navi.common.ui.fragment.BaseFragment import com.navi.common.ui.fragment.CommonDialogBox import com.navi.common.uitron.model.action.CtaAction +import com.navi.pl.dynamic.databinding.PlFragmentLoanOfferUpgradeV3Binding +import com.navi.pl.dynamic.helper.GetLoanV2Helper import com.navi.uitron.model.data.TextData import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics @@ -32,7 +34,6 @@ import com.naviapp.common.listeners.BackListener import com.naviapp.common.listeners.FooterWithDescriptionListener import com.naviapp.common.navigator.NaviDeepLinkNavigator import com.naviapp.dashboard.listeners.FragmentInteractionListener -import com.naviapp.databinding.FragmentLoanOfferUpgradeV3Binding import com.naviapp.models.CustomClickConfig import com.naviapp.models.CustomClickType import com.naviapp.models.TextTimerConfig @@ -42,7 +43,6 @@ import com.naviapp.network.ApiErrorTagType import com.naviapp.personalloan.factory.LoanDetailsV2VHFactoryImpl import com.naviapp.personalloan.getloan.activities.GetLoanActivity import com.naviapp.personalloanrevamp.getloanRevamp.adapters.LoanDetailsV2WidgetAdapter -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper import com.naviapp.personalloanrevamp.getloanRevamp.viewmodels.LoanOfferUpgradeV3FragmentVM import com.naviapp.personalloanrevamp.models.response.LoanOfferUpgradeV3Response import com.naviapp.personalloanrevamp.states.OfferUpgradeResponseState @@ -57,7 +57,7 @@ import kotlinx.coroutines.launch class LoanOfferUpgradeV3Fragment : BaseFragment(), View.OnClickListener, BackListener, FooterWithDescriptionListener { - private lateinit var binding: FragmentLoanOfferUpgradeV3Binding + private lateinit var binding: PlFragmentLoanOfferUpgradeV3Binding private val viewModel by lazy { ViewModelProvider(this).get(LoanOfferUpgradeV3FragmentVM::class.java) } private val analyticsEventTracker by lazy { NaviAnalytics.naviAnalytics.LoanOfferUpgrade() } private var listener: FragmentInteractionListener? = null @@ -71,7 +71,7 @@ class LoanOfferUpgradeV3Fragment : container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = FragmentLoanOfferUpgradeV3Binding.inflate(inflater, container, false) + binding = PlFragmentLoanOfferUpgradeV3Binding.inflate(inflater, container, false) initQueryMapFromCtaParameters() readBundle() initError(viewModel, actionErrorV2Enabled = true, @@ -362,10 +362,10 @@ class LoanOfferUpgradeV3Fragment : override fun onBackPressed() { when (arguments?.getString(Constants.FLOW_TYPE).orEmpty()) { Constants.REPEAT_LOAN_DETAILS_FLOW -> { - listener?.navigateTo(GetLoanV2ViewHelper.LOAN_DETAILS_V2_FRAGMENT, Bundle()) + listener?.navigateTo(GetLoanV2Helper.LOAN_DETAILS_V2_FRAGMENT, Bundle()) } Constants.FRESH_LOAN_DETAILS_FLOW -> { - listener?.navigateTo(GetLoanV2ViewHelper.FRESH_LOAN_DETAILS_V2, Bundle()) + listener?.navigateTo(GetLoanV2Helper.FRESH_LOAN_DETAILS_V2, Bundle()) } else -> { listener?.navigateTo(NaviDeepLinkNavigator.HOME, Bundle()) diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments/LoanSummaryV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanSummaryV2Fragment.kt similarity index 93% rename from app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments/LoanSummaryV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanSummaryV2Fragment.kt index aaacaa6934..862d51dfe4 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments/LoanSummaryV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/LoanSummaryV2Fragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.useridentificationv2.fragments +package com.navi.pl.dynamic.fragment import android.content.Context import android.os.Bundle @@ -25,15 +25,19 @@ import com.navi.base.utils.BaseUtils import com.navi.base.utils.isNull import com.navi.base.utils.orElse import com.navi.base.utils.orFalse -import com.navi.common.firebasedb.* +import com.navi.common.firebasedb.FirebaseDataHelper +import com.navi.common.firebasedb.FirebaseDataReceiveListener +import com.navi.common.firebasedb.FirebaseResponse +import com.navi.common.firebasedb.FirebaseStatusType +import com.navi.common.firebasedb.LOAN_AGREEMENT_SIGN import com.navi.common.listeners.ClickableTextListener import com.navi.common.model.InfoBottomSheetConfig import com.navi.common.model.UploadDataAsyncResponse import com.navi.common.ui.fragment.BaseFragment import com.navi.common.utils.ApiPollScheduler import com.navi.common.utils.log +import com.navi.common.utils.observeNonNull import com.navi.common.utils.observeNullable -import com.navi.insurance.util.observeNonNull import com.navi.naviwidgets.base.BaseInputWidget import com.navi.naviwidgets.callbacks.WidgetCallback import com.navi.naviwidgets.databinding.LayoutRewardsInfoBinding @@ -42,6 +46,8 @@ import com.navi.naviwidgets.widgets.labledtextinput.InputTextWidgetMeta import com.navi.naviwidgets.widgets.labledtextinput.LabeledTextInputWidgetModelV2 import com.navi.naviwidgets.widgets.labledtextinput.TextInputWidgetData import com.navi.naviwidgets.widgets.textdisplay.Padding +import com.navi.pl.dynamic.databinding.PlFragmentLoanSummaryV2Binding +import com.navi.pl.dynamic.helper.GetLoanV2Helper import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.BoxInputGroup @@ -52,32 +58,41 @@ import com.naviapp.common.listeners.BackListener import com.naviapp.common.listeners.FooterWithDescriptionListener import com.naviapp.common.navigator.NaviDeepLinkNavigator import com.naviapp.dashboard.listeners.FragmentInteractionListener -import com.naviapp.databinding.LoanSummaryV2Binding import com.naviapp.models.UserProfile import com.naviapp.models.request.LoanFeeDetailsRequest import com.naviapp.models.request.SendOtpForDisbursementRequest -import com.naviapp.models.response.* +import com.naviapp.models.response.LoanBasicDetailsResponse +import com.naviapp.models.response.LoanDetailsV2AdditionData +import com.naviapp.models.response.Medium +import com.naviapp.models.response.NotificationSettingsResponse +import com.naviapp.models.response.SendDisbursementOtpResponse +import com.naviapp.models.response.WidgetConfig import com.naviapp.personalloan.factory.LoanDetailsV2VHFactoryImpl import com.naviapp.personalloanrevamp.common.customview.StyledDaysCalendarView.Companion.EMI_DATE_SELECTION import com.naviapp.personalloanrevamp.common.customview.StyledDaysCalendarView.Companion.KEY_SELECTED_DATE import com.naviapp.personalloanrevamp.common.customview.StyledDaysCalendarView.Companion.KEY_SELECTED_DATE_HEADER import com.naviapp.personalloanrevamp.common.customview.StyledDaysCalendarView.Companion.NO_DATE_SELECTED import com.naviapp.personalloanrevamp.getloanRevamp.adapters.LoanDetailsV2WidgetAdapter -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.EmiSelectorV2Fragment -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.FreshLoanDetailsV2Fragment -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.LoanDetailsV2Fragment -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper +import com.naviapp.personalloanrevamp.getloanRevamp.fragments.BankDetailsAutoDebitV2Fragment import com.naviapp.personalloanrevamp.getloanRevamp.listeners.LoanDetailsV2WidgetAdapterListener import com.naviapp.personalloanrevamp.models.StyledTitleWithButtonWidgetBody import com.naviapp.personalloanrevamp.models.response.EmailCard import com.naviapp.personalloanrevamp.models.response.LoanSummaryViewResponse +import com.naviapp.personalloanrevamp.useridentificationv2.fragments.InformationBottomSheet import com.naviapp.personalloanrevamp.useridentificationv2.viewmodels.LoanSummaryV2ViewModel -import com.naviapp.utils.* +import com.naviapp.utils.Constants import com.naviapp.utils.Constants.ACTION import com.naviapp.utils.Constants.FLOW_TYPE import com.naviapp.utils.Constants.PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY import com.naviapp.utils.Constants.USER_SELECTED +import com.naviapp.utils.LOAN_APPLICATION_ID +import com.naviapp.utils.SELECTED_EMI_DATE +import com.naviapp.utils.getWidgetPositionFromWidgetId +import com.naviapp.utils.isValidEmail +import com.naviapp.utils.navigateToClickableText +import com.naviapp.utils.setPadding +import com.naviapp.utils.setTextColorFromString class LoanSummaryV2Fragment : BaseFragment(), @@ -87,13 +102,13 @@ class LoanSummaryV2Fragment : ClickableTextListener, LoanDetailsV2WidgetAdapterListener { - private lateinit var binding: LoanSummaryV2Binding + private lateinit var binding: PlFragmentLoanSummaryV2Binding private val viewModel by lazy { ViewModelProvider(this)[LoanSummaryV2ViewModel::class.java] } private var loanApplicationId: String? = null private val eventTracker by lazy { NaviAnalytics.naviAnalytics.GetLoan(screenName) } private var listener: FragmentInteractionListener? = null private var headerListener: NaviHeaderView.InteractionListener? = null - private var updateUIListener: LoanDetailsV2Fragment.UpdateUiListener? = null + private var updateUIListener: BankDetailsAutoDebitV2Fragment.UpdateUiListener? = null override fun onCreateView( inflater: LayoutInflater, @@ -101,7 +116,7 @@ class LoanSummaryV2Fragment : savedInstanceState: Bundle? ): View { super.onCreateView(inflater, container, savedInstanceState) - binding = LoanSummaryV2Binding.inflate(inflater, container, false) + binding = PlFragmentLoanSummaryV2Binding.inflate(inflater, container, false) initError(viewModel, actionErrorV2Enabled = true) initListeners() initObserver() @@ -126,7 +141,7 @@ class LoanSummaryV2Fragment : super.onAttach(context) listener = context as? FragmentInteractionListener headerListener = context as? NaviHeaderView.InteractionListener - updateUIListener = context as? LoanDetailsV2Fragment.UpdateUiListener + updateUIListener = context as? BankDetailsAutoDebitV2Fragment.UpdateUiListener } private fun apiPollInit(asyncResponse: UploadDataAsyncResponse) { @@ -273,7 +288,7 @@ class LoanSummaryV2Fragment : it.otpSize.orElse(BoxInputGroup.OTP_LENGTH_4) ) bundle.putString(OtpBottomSheet.KEY_SCREEN_NAME, NaviAnalytics.OTP_DISBURSEMENT) - listener?.navigateTo(GetLoanV2ViewHelper.TRUE_CALLER_AUTHENTICATOR_V2, bundle) + listener?.navigateTo(GetLoanV2Helper.TRUE_CALLER_AUTHENTICATOR_V2, bundle) } } @@ -538,7 +553,7 @@ class LoanSummaryV2Fragment : } override fun onBackPressed() { - listener?.navigateTo(GetLoanV2ViewHelper.KYC_V2, Bundle()) + listener?.navigateTo(GetLoanV2Helper.KYC_V2, Bundle()) } override fun onClickText(type: String?, data: Any?, subType: String?) { diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments/MFIConsentV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/MFIConsentV2Fragment.kt similarity index 93% rename from app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments/MFIConsentV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/MFIConsentV2Fragment.kt index 5b8e2e0ba7..c7ffaec3fc 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments/MFIConsentV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/MFIConsentV2Fragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.useridentificationv2.fragments +package com.navi.pl.dynamic.fragment import android.content.Context import android.os.Bundle @@ -17,16 +17,17 @@ import com.navi.base.model.CtaData import com.navi.common.ui.fragment.BaseFragment import com.navi.common.utils.observeNonNull import com.navi.common.utils.observeNullable +import com.navi.pl.dynamic.activity.ErrorScreenV2Activity +import com.navi.pl.dynamic.databinding.PlFragmentMfiConsentV2Binding import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.FooterViewV2 import com.naviapp.common.customview.NaviHeaderView import com.naviapp.common.navigator.NaviDeepLinkNavigator import com.naviapp.dashboard.listeners.FragmentInteractionListener -import com.naviapp.databinding.MfiConsentV2FragmentBinding import com.naviapp.models.response.MfiConsentResponse import com.naviapp.personalloan.getloan.mfi.viewmodel.MfiConsentVM -import com.naviapp.personalloanrevamp.error.activity.ErrorScreenV2Activity +import com.naviapp.personalloanrevamp.useridentificationv2.fragments.ErrorV2InfoBottomSheet import com.naviapp.utils.Constants import com.naviapp.utils.Constants.ACTION import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY @@ -35,7 +36,7 @@ import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class MFIConsentV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { - private lateinit var binding: MfiConsentV2FragmentBinding + private lateinit var binding: PlFragmentMfiConsentV2Binding private val viewModel by lazy { ViewModelProvider(requireActivity()).get(MfiConsentVM::class.java) } @@ -48,7 +49,7 @@ class MFIConsentV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListe container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = MfiConsentV2FragmentBinding.inflate(inflater, container, false) + binding = PlFragmentMfiConsentV2Binding.inflate(inflater, container, false) return binding.root } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/error/fragments/MFIErrorFragmentV2.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/MFIErrorFragmentV2.kt similarity index 94% rename from app/src/main/java/com/naviapp/personalloanrevamp/error/fragments/MFIErrorFragmentV2.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/MFIErrorFragmentV2.kt index 5767f54f51..28334728a8 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/error/fragments/MFIErrorFragmentV2.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/MFIErrorFragmentV2.kt @@ -1,11 +1,11 @@ /* * - * * Copyright © 2022 by Navi Technologies Limited + * * Copyright © 2022-2023 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ -package com.naviapp.personalloanrevamp.error.fragments +package com.navi.pl.dynamic.fragment import android.content.Context import android.os.Bundle @@ -30,17 +30,17 @@ import com.navi.design.utils.getNaviDrawable import com.navi.naviwidgets.adapters.NaviAdapter import com.navi.naviwidgets.callbacks.WidgetCallback import com.navi.naviwidgets.viewholder.ViewHolderFactoryImpl +import com.navi.pl.dynamic.activity.ErrorScreenV2Activity +import com.navi.pl.dynamic.adapter.RejectionReasonV2Adapter +import com.navi.pl.dynamic.databinding.PlFragmentMfiErrorV2Binding import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.NaviHeaderView import com.naviapp.common.navigator.NaviDeepLinkNavigator import com.naviapp.common.navigator.ScreenNavigator -import com.naviapp.databinding.FragmentMfiErrorBinding import com.naviapp.errors.adapters.RejectionReasonAdapter import com.naviapp.errors.utils.getProfileRejectionScreenData import com.naviapp.personalloan.getloan.creditAssignment.models.ImageBannerData -import com.naviapp.personalloanrevamp.error.activity.ErrorScreenV2Activity -import com.naviapp.personalloanrevamp.error.adapter.RejectionReasonV2Adapter import com.naviapp.personalloanrevamp.models.RejectionDetailsV2 import com.naviapp.utils.EMPTY import com.naviapp.utils.IconUtils @@ -49,7 +49,7 @@ import kotlin.math.roundToInt class MFIErrorFragmentV2 : BaseFragment(), WidgetCallback { - private lateinit var binding: FragmentMfiErrorBinding + private lateinit var binding: PlFragmentMfiErrorV2Binding private val creditAssignmentAnalytics = NaviAnalytics.naviAnalytics.CreditAssignment() private val widgetNaviAnalyticsEventTracker = NaviAnalytics.naviAnalytics.Widget() private val defaultBannerImageAspectRatio = 2.1918 @@ -62,7 +62,7 @@ class MFIErrorFragmentV2 : BaseFragment(), WidgetCallback { container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = FragmentMfiErrorBinding.inflate(inflater, container, false) + binding = PlFragmentMfiErrorV2Binding.inflate(inflater, container, false) initUi() return binding.root } @@ -176,7 +176,7 @@ class MFIErrorFragmentV2 : BaseFragment(), WidgetCallback { if (imageBannerData.aspectRatio.isNull() || imageBannerData.aspectRatio!! <= 0.0) { (imageWidth.toDouble() / defaultBannerImageAspectRatio).roundToInt() } else { - (imageWidth.toDouble() / imageBannerData.aspectRatio).roundToInt() + (imageWidth.toDouble() / (imageBannerData.aspectRatio as Double)).roundToInt() } binding.requestLoanImageBanner.layoutParams.height = imageHeight context?.let { context -> diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments/MFIInfoV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/MFIInfoV2Fragment.kt similarity index 97% rename from app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments/MFIInfoV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/MFIInfoV2Fragment.kt index 4aa82158e2..96c4c722aa 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments/MFIInfoV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/MFIInfoV2Fragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.useridentificationv2.fragments +package com.navi.pl.dynamic.fragment import android.content.Context import android.os.Bundle @@ -25,7 +25,7 @@ import com.naviapp.models.response.Header import com.naviapp.models.response.HouseHoldIncomeContent import com.naviapp.models.response.IncomeItem import com.naviapp.personalloan.intermediate.mfiinfo.viewmodel.MfiInfoVM -import com.naviapp.utils.Constants +import com.naviapp.personalloanrevamp.useridentificationv2.fragments.InformationBottomSheet import com.naviapp.utils.Constants.ACTION import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY import dagger.hilt.android.AndroidEntryPoint diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/NaviWebViewClient.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/NaviWebViewClient.kt similarity index 95% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/NaviWebViewClient.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/NaviWebViewClient.kt index c9d7c18c61..27d15c3de5 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/NaviWebViewClient.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/NaviWebViewClient.kt @@ -1,10 +1,11 @@ /* * - * * Copyright © 2023-2023 by Navi Technologies Limited + * * Copyright © 2023 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ -package com.naviapp.personalloanrevamp.getloanRevamp.fragments + +package com.navi.pl.dynamic.fragment import android.webkit.WebResourceRequest import android.webkit.WebResourceResponse diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2/fragments/OfferInReviewFragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/OfferInReviewFragment.kt similarity index 98% rename from app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2/fragments/OfferInReviewFragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/OfferInReviewFragment.kt index 0ac1c94464..14953be26a 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2/fragments/OfferInReviewFragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/OfferInReviewFragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.intermediatev2.fragments +package com.navi.pl.dynamic.fragment import android.app.Activity import android.content.Context @@ -20,6 +20,7 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import com.navi.base.model.CtaData +import com.navi.base.utils.orElse import com.navi.base.utils.orFalse import com.navi.common.model.InfoBottomSheetConfig import com.navi.common.ui.fragment.BaseFragment @@ -30,6 +31,7 @@ import com.navi.design.utils.dpToPxInInt import com.navi.design.utils.getNaviDrawable import com.navi.design.utils.parseColorSafe import com.navi.naviwidgets.callbacks.WidgetCallback +import com.navi.pl.dynamic.helper.UserIdentificationV2Helper import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.FooterViewV2 import com.naviapp.common.customview.NaviHeaderView @@ -47,8 +49,6 @@ import com.naviapp.personalloan.useridentification.viewmodels.EligibilityShareVM import com.naviapp.personalloanrevamp.getloanRevamp.adapters.LoanDetailsV2WidgetAdapter import com.naviapp.personalloanrevamp.getloanRevamp.listeners.LoanDetailsV2WidgetAdapterListener import com.naviapp.personalloanrevamp.useridentificationv2.fragments.InformationBottomSheet -import com.naviapp.personalloanrevamp.useridentificationv2.helper.UserIdentificationV2Helper -import com.navi.base.utils.orElse import com.naviapp.utils.Constants.ACTION import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY import com.naviapp.utils.setVisibilityState diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/OfferUpgradeInfoBottomSheet.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/OfferUpgradeInfoBottomSheet.kt similarity index 95% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/OfferUpgradeInfoBottomSheet.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/OfferUpgradeInfoBottomSheet.kt index 67ef204ef5..440151c013 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/OfferUpgradeInfoBottomSheet.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/OfferUpgradeInfoBottomSheet.kt @@ -1,8 +1,14 @@ -package com.naviapp.personalloanrevamp.getloanRevamp.fragments +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.navi.pl.dynamic.fragment import android.os.Bundle import android.view.ViewStub -import androidx.compose.ui.graphics.Color import androidx.core.content.res.ResourcesCompat import androidx.databinding.DataBindingUtil import androidx.lifecycle.LiveData @@ -85,4 +91,4 @@ class OfferUpgradeInfoBottomSheet : BaseBottomSheet() { } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/PanVerificationBottomSheet.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/PanVerificationBottomSheet.kt similarity index 79% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/PanVerificationBottomSheet.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/PanVerificationBottomSheet.kt index 194d99b4bc..7951c890f9 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/PanVerificationBottomSheet.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/PanVerificationBottomSheet.kt @@ -1,4 +1,11 @@ -package com.naviapp.personalloanrevamp.getloanRevamp.fragments +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.navi.pl.dynamic.fragment import android.os.Bundle import android.view.LayoutInflater @@ -12,19 +19,19 @@ import com.navi.design.utils.dpToPxInInt import com.navi.design.utils.getNaviDrawable import com.navi.design.utils.parseColorSafe import com.navi.naviwidgets.widgets.labledtextinput.ui.LabeledTextInputWidgetV2 -import com.naviapp.R +import com.navi.pl.dynamic.R +import com.navi.pl.dynamic.databinding.PlFragmentPanVerificationBottomsheetBinding +import com.navi.pl.dynamic.databinding.PlLayoutTitleWithDescriptionViewBinding import com.naviapp.common.navigator.NaviDeepLinkNavigator -import com.naviapp.databinding.PanVerificationBottomsheetBinding -import com.naviapp.databinding.TitleWithDescriptionViewBinding import com.naviapp.models.response.PanVerificationBottomSheetData import com.naviapp.models.response.SubListItem class PanVerificationBottomSheet : BaseBottomSheet() { - private lateinit var binding: PanVerificationBottomsheetBinding + private lateinit var binding: PlFragmentPanVerificationBottomsheetBinding val labeledTextInputWidgetV2 = context?.let { LabeledTextInputWidgetV2(it) } override fun setContainerView(viewStub: ViewStub) { - viewStub.layoutResource = R.layout.pan_verification_bottomsheet + viewStub.layoutResource = R.layout.pl_fragment_pan_verification_bottomsheet binding = DataBindingUtil.getBinding(viewStub.inflate())!! initData() } @@ -40,8 +47,8 @@ class PanVerificationBottomSheet : BaseBottomSheet() { removeAllViews() items?.forEach { itemData -> val view = LayoutInflater.from(context) - .inflate(R.layout.title_with_description_view, binding.container, false) - val itemBinding: TitleWithDescriptionViewBinding? = DataBindingUtil.bind(view) + .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) } @@ -73,6 +80,3 @@ class PanVerificationBottomSheet : BaseBottomSheet() { } } } - - - diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments/ProfileV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/ProfileV2Fragment.kt similarity index 89% rename from app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments/ProfileV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/ProfileV2Fragment.kt index e194642e42..a91bd3038f 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments/ProfileV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/ProfileV2Fragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.useridentificationv2.fragments +package com.navi.pl.dynamic.fragment import android.app.Activity import android.content.Context @@ -18,7 +18,12 @@ import android.text.TextWatcher import android.view.KeyEvent import android.view.LayoutInflater import android.view.View -import android.view.View.* +import android.view.View.GONE +import android.view.View.OnClickListener +import android.view.View.OnFocusChangeListener +import android.view.View.OnKeyListener +import android.view.View.TEXT_ALIGNMENT_TEXT_START +import android.view.View.VISIBLE import android.view.ViewGroup import android.widget.TextView import androidx.activity.result.contract.ActivityResultContracts @@ -39,15 +44,20 @@ import com.navi.base.utils.orTrue import com.navi.common.listeners.FragmentInterchangeListener import com.navi.common.model.UserDetail import com.navi.common.ui.fragment.BaseFragment -import com.navi.common.utils.* +import com.navi.common.utils.hideKeyboard +import com.navi.common.utils.log +import com.navi.common.utils.observeNonNull +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.insurance.util.observeNonNull import com.navi.naviwidgets.base.BaseInputWidget import com.navi.naviwidgets.extensions.textChanges import com.navi.naviwidgets.widgets.labledtextinput.ui.LabeledTextInputWidgetV2 -import com.naviapp.R +import com.navi.pl.dynamic.activity.ErrorScreenV2Activity +import com.navi.pl.dynamic.activity.UserIdentificationV2Activity +import com.navi.pl.dynamic.databinding.PlFragmentProfileV2Binding +import com.navi.pl.dynamic.helper.ProfileV2FragmentHelper import com.naviapp.analytics.utils.LoadTimeEventTracker import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.DobEditText @@ -57,10 +67,8 @@ import com.naviapp.common.listeners.BackListener import com.naviapp.common.listeners.CtaListener import com.naviapp.common.navigator.NaviDeepLinkNavigator import com.naviapp.common.navigator.ScreenNavigator -import com.naviapp.databinding.ProfileV2FragmentBinding import com.naviapp.devicedata.finoramic.FinoramicHelper import com.naviapp.devicedata.finoramic.FinoramicHelper.Companion.FINORAMIC_REDIRECT_PATH_V2 -import com.naviapp.devicedata.finoramic.FinoramicHelper.Companion.FINORAMIC_REQ_CODE import com.naviapp.models.CustomClickConfig import com.naviapp.models.CustomClickType import com.naviapp.models.response.PanRequestData @@ -70,11 +78,7 @@ import com.naviapp.network.ApiErrorTagType.PROFILE_DETAILS_UPLOAD import com.naviapp.personalloan.useridentification.profile.models.ValidationState import com.naviapp.personalloan.useridentification.profile.viewmodels.ProfileVM import com.naviapp.personalloan.useridentification.viewmodels.EligibilityShareVM - -import com.naviapp.personalloanrevamp.kyc.fragment.KycV2Fragment -import com.naviapp.personalloanrevamp.error.activity.ErrorScreenV2Activity -import com.naviapp.personalloanrevamp.useridentificationv2.activities.UserIdentificationV2Activity -import com.naviapp.personalloanrevamp.useridentificationv2.helper.ProfileV2FragmentHelper +import com.naviapp.personalloanrevamp.useridentificationv2.fragments.InformationBottomSheet import com.naviapp.utils.* import com.naviapp.utils.Constants import com.naviapp.utils.Constants.ACTION @@ -82,10 +86,15 @@ import com.naviapp.utils.Constants.EMPTY import com.naviapp.utils.Constants.PL_MAX_AGE import com.naviapp.utils.Constants.PL_MIN_AGE import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY +import com.naviapp.utils.EMPTY_DATE_STRING +import com.naviapp.utils.convertDpToPx +import com.naviapp.utils.customToast +import com.naviapp.utils.getLocationOnScreen import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import java.util.* +import java.util.Locale +import com.naviapp.R as appR class ProfileV2Fragment : BaseFragment(), @@ -96,7 +105,7 @@ class ProfileV2Fragment : CtaListener, BackListener { - private lateinit var binding: ProfileV2FragmentBinding + 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) } @@ -112,7 +121,7 @@ class ProfileV2Fragment : container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = ProfileV2FragmentBinding.inflate(inflater, container, false) + binding = PlFragmentProfileV2Binding.inflate(inflater, container, false) initError() initWarning() initUi() @@ -208,7 +217,7 @@ class ProfileV2Fragment : uploadStatus = true } if (uploadStatus == true) { - description = getString(R.string.gmail_account_synced) + description = getString(appR.string.gmail_account_synced) } binding.googleLay.apply { setData( @@ -293,7 +302,7 @@ class ProfileV2Fragment : when (it) { ValidationState.IS_EMPTY -> setErrorProperties( binding.dobLt, - getString(R.string.please_enter_date_of_birth) + getString(appR.string.please_enter_date_of_birth) ) ValidationState.IS_INVALID -> { @@ -302,7 +311,7 @@ class ProfileV2Fragment : setErrorProperties( binding.dobLt, - resources.getString(R.string.wrong_dob_age_range, minAge, maxAge) + resources.getString(appR.string.wrong_dob_age_range, minAge, maxAge) ) } @@ -316,15 +325,15 @@ class ProfileV2Fragment : when (it) { ValidationState.IS_EMPTY -> setErrorProperties( binding.fullNameLt, - getString(R.string.please_enter_full_name) + getString(appR.string.please_enter_full_name) ) ValidationState.IS_INVALID -> setErrorProperties( binding.fullNameLt, - getString(R.string.enter_valid_name) + getString(appR.string.enter_valid_name) ) ValidationState.IS_SMALLER_THAN_MIN_LENGTH -> setErrorProperties( binding.fullNameLt, - getString(R.string.enter_valid_name) + getString(appR.string.enter_valid_name) ) else -> {} // Do Nothing } @@ -336,12 +345,12 @@ class ProfileV2Fragment : when (it) { ValidationState.IS_EMPTY -> setErrorProperties( binding.panNumberLt, - getString(R.string.please_enter_your_PAN_number) + getString(appR.string.please_enter_your_PAN_number) ) ValidationState.IS_INVALID -> setErrorProperties( binding.panNumberLt, - resources.getString(R.string.enter_a_valid_pan_number) + resources.getString(appR.string.enter_a_valid_pan_number) ) else -> {} // Do Nothing @@ -362,7 +371,7 @@ class ProfileV2Fragment : uploadStatus = true } if (uploadStatus) { - description = getString(R.string.gmail_account_synced) + description = getString(appR.string.gmail_account_synced) binding.googleLay.apply { setData( description, @@ -440,7 +449,7 @@ class ProfileV2Fragment : binding.fullNameLt.widgetBinding.plainTextInput.setOnKeyListener(this) initWidgets() binding.panTooltipView.setProperties( - R.style.NaviSansSemiBoldExtraSmall, + appR.style.NaviSansSemiBoldExtraSmall, TEXT_ALIGNMENT_TEXT_START, Padding(startDp = 12.0f, endDp = 12.0f, topDp = 6.0f, bottomDp = 6.0f) ) @@ -542,7 +551,7 @@ class ProfileV2Fragment : } private fun updateDateBackground() { - binding.dobLt.setBaseBorderBackground(R.drawable.bg_green_border_rounded_8) + binding.dobLt.setBaseBorderBackground(appR.drawable.bg_green_border_rounded_8) } private fun updateDateSuccessText() { @@ -567,9 +576,9 @@ class ProfileV2Fragment : if (validation.second) { binding.dobLt.setSuccessText( validation.first.trim(), - R.style.NaviSansSemiBoldExtraSmall, - R.drawable.ic_line_success_svg, - R.drawable.bg_green_border_rounded_8 + appR.style.NaviSansSemiBoldExtraSmall, + appR.drawable.ic_line_success_svg, + appR.drawable.bg_green_border_rounded_8 ) } else { setErrorProperties(binding.dobLt, validation.first) @@ -584,27 +593,27 @@ class ProfileV2Fragment : context?.let { context -> updateTitleViewInWidget( binding.fullNameLt.binding.titleTv, - R.style.NaviSansBoldMedium, + appR.style.NaviSansBoldMedium, context, - R.color.title_color_two + appR.color.title_color_two ) updateTitleViewInWidget( binding.fullNameLt.binding.descriptionTv, - R.style.NaviSansSemiBoldSmall, + appR.style.NaviSansSemiBoldSmall, context, - R.color.description_color_seven + appR.color.description_color_seven ) updateTitleViewInWidget( binding.dobLt.binding.titleTv, - R.style.NaviSansBoldMedium, + appR.style.NaviSansBoldMedium, context, - R.color.title_color_two + appR.color.title_color_two ) updateTitleViewInWidget( binding.panNumberLt.binding.titleTv, - R.style.NaviSansBoldMedium, + appR.style.NaviSansBoldMedium, context, - R.color.title_color_two + appR.color.title_color_two ) setWidgetBackground() updateEdittextViewInWidget() @@ -614,38 +623,38 @@ class ProfileV2Fragment : private fun updateEdittextViewInWidget() { TextViewCompat.setTextAppearance( binding.fullNameLt.widgetBinding.plainTextInput, - R.style.NaviSansSemiBoldSmall + appR.style.NaviSansSemiBoldSmall ) TextViewCompat.setTextAppearance( binding.dobLt.widgetBinding.dateInput, - R.style.NaviSansSemiBoldSmall + appR.style.NaviSansSemiBoldSmall ) TextViewCompat.setTextAppearance( binding.dobLt.widgetBinding.dayMonthDivider, - R.style.NaviSansSemiBoldSmall + appR.style.NaviSansSemiBoldSmall ) TextViewCompat.setTextAppearance( binding.dobLt.widgetBinding.monthInput, - R.style.NaviSansSemiBoldSmall + appR.style.NaviSansSemiBoldSmall ) TextViewCompat.setTextAppearance( binding.dobLt.widgetBinding.montYearDivider, - R.style.NaviSansSemiBoldSmall + appR.style.NaviSansSemiBoldSmall ) TextViewCompat.setTextAppearance( binding.dobLt.widgetBinding.yearInput, - R.style.NaviSansSemiBoldSmall + appR.style.NaviSansSemiBoldSmall ) TextViewCompat.setTextAppearance( binding.panNumberLt.widgetBinding.plainTextInput, - R.style.NaviSansSemiBoldSmall + appR.style.NaviSansSemiBoldSmall ) } private fun setWidgetBackground() { - binding.dobLt.setBaseBorderBackground(R.drawable.bg_view_bg_color_17_bordered_round_8) - binding.panNumberLt.setBaseBorderBackground(R.drawable.bg_view_bg_color_17_bordered_round_8) - binding.fullNameLt.setBaseBorderBackground(R.drawable.bg_view_bg_color_17_bordered_round_8) + binding.dobLt.setBaseBorderBackground(appR.drawable.bg_view_bg_color_17_bordered_round_8) + binding.panNumberLt.setBaseBorderBackground(appR.drawable.bg_view_bg_color_17_bordered_round_8) + binding.fullNameLt.setBaseBorderBackground(appR.drawable.bg_view_bg_color_17_bordered_round_8) } private fun updateTitleViewInWidget( @@ -677,7 +686,7 @@ class ProfileV2Fragment : ProfileV2FragmentHelper.getPanNumberWidget(it, userDetail.panNumber.orEmpty()) ) updatePanInfoLayoutParams(it) - binding.panNumberLt.binding.info.setImageResource(R.drawable.ic_alert_solid_black) + binding.panNumberLt.binding.info.setImageResource(appR.drawable.ic_alert_solid_black) binding.panNumberLt.binding.info.visibility = VISIBLE labelWithInputFormatting(binding.panNumberLt) } @@ -709,7 +718,7 @@ class ProfileV2Fragment : val toastView = ProfileV2FragmentHelper.getFilledToastView(test, it) it.customToast( customView = toastView, - offsetY = resources.getDimension(R.dimen.layout_dp_120).toInt() + offsetY = resources.getDimension(appR.dimen.layout_dp_120).toInt() ) } } @@ -747,7 +756,7 @@ class ProfileV2Fragment : null } loadTimeEventTracker.onLoadingStarted(NaviAnalytics.PL_BASIC_DETAILS_LOAD_TIME) - showLoader(context?.resources?.getString(R.string.verifying_your_details)) + showLoader(context?.resources?.getString(appR.string.verifying_your_details)) viewModel.submitProfileDetails( name.capitalize(Locale.ENGLISH), dob, @@ -785,10 +794,10 @@ class ProfileV2Fragment : private fun setErrorProperties(ltView: BaseInputWidget, text: String) { ltView.setError( text, - R.style.NaviSansSemiBoldExtraSmall, - R.color.error_red, - R.drawable.ic_line_error_svg, - R.drawable.bg_error_red_border_rounded_8, + appR.style.NaviSansSemiBoldExtraSmall, + appR.color.error_red, + appR.drawable.ic_line_error_svg, + appR.drawable.bg_error_red_border_rounded_8, ) } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/StyledTitleDescriptionBottomSheet.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/StyledTitleDescriptionBottomSheet.kt similarity index 71% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/StyledTitleDescriptionBottomSheet.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/StyledTitleDescriptionBottomSheet.kt index c632f66bb1..a9ae28b5f1 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/StyledTitleDescriptionBottomSheet.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/StyledTitleDescriptionBottomSheet.kt @@ -1,4 +1,11 @@ -package com.naviapp.personalloanrevamp.getloanRevamp.fragments +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.navi.pl.dynamic.fragment import android.os.Bundle import android.view.ViewStub @@ -7,19 +14,20 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import com.navi.base.model.CtaData import com.navi.common.ui.fragment.BaseBottomSheet -import com.naviapp.R -import com.naviapp.databinding.StyledTitleDescriptionBottomSheetLayoutBinding +import com.navi.pl.dynamic.R +import com.navi.pl.dynamic.databinding.PlFragmentStyledTitleDescriptionBottomsheetBinding import com.naviapp.personalloanrevamp.models.StyledTitleDescriptionBottomSheetConfig +import com.naviapp.R as appR class StyledTitleDescriptionBottomSheet : BaseBottomSheet() { - private lateinit var binding: StyledTitleDescriptionBottomSheetLayoutBinding - private val _cta = MutableLiveData() - val cta: LiveData + private lateinit var binding: PlFragmentStyledTitleDescriptionBottomsheetBinding + private val _cta = MutableLiveData() + val cta: LiveData get() = _cta override fun setContainerView(viewStub: ViewStub) { - viewStub.layoutResource = R.layout.styled_title_description_bottom_sheet_layout + viewStub.layoutResource = R.layout.pl_fragment_styled_title_description_bottomsheet binding = DataBindingUtil.getBinding(viewStub.inflate())!! initData() initUI() @@ -37,8 +45,8 @@ class StyledTitleDescriptionBottomSheet : BaseBottomSheet() { binding.binder = it binding.primaryAbv.setProperties( binding.binder?.cta?.title, - R.color.white, - R.color.outrageous_orange + appR.color.white, + appR.color.outrageous_orange ) } } @@ -56,4 +64,4 @@ class StyledTitleDescriptionBottomSheet : BaseBottomSheet() { } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2/fragments/TelcoOtpV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/TelcoOtpV2Fragment.kt similarity index 94% rename from app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2/fragments/TelcoOtpV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/TelcoOtpV2Fragment.kt index 1f39b65da2..91bbfe8433 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/intermediatev2/fragments/TelcoOtpV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/TelcoOtpV2Fragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.intermediatev2.fragments +package com.navi.pl.dynamic.fragment import android.content.Context import android.content.IntentFilter @@ -31,7 +31,7 @@ import com.navi.common.utils.observeNullable import com.navi.design.font.FontWeightEnum import com.navi.design.utils.getFontStyle import com.navi.design.utils.getNaviDrawable -import com.naviapp.R +import com.navi.pl.dynamic.databinding.PlFragmentTelcoOtpV2Binding import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.BoxInputGroup import com.naviapp.common.customview.FooterViewV2 @@ -39,7 +39,6 @@ import com.naviapp.common.customview.NaviHeaderView import com.naviapp.common.listeners.BackListener import com.naviapp.common.navigator.NaviDeepLinkNavigator import com.naviapp.common.navigator.ScreenNavigator -import com.naviapp.databinding.TelcoOtpV2FragmentBinding import com.naviapp.models.request.LoginRequest import com.naviapp.models.request.OtpRequest import com.naviapp.network.ApiErrorTagType @@ -47,11 +46,12 @@ import com.naviapp.personalloan.intermediate.telco.viewmodel.TelcoOtpViewModel import com.naviapp.utils.Constants import com.naviapp.utils.Constants.ACTION import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY +import com.naviapp.R as appR class TelcoOtpV2Fragment : BaseFragment(), View.OnClickListener, BackListener, FooterViewV2.FooterInteractionListener { - private lateinit var binding: TelcoOtpV2FragmentBinding + private lateinit var binding: PlFragmentTelcoOtpV2Binding private val naviAnalyticsEventTracker by lazy { NaviAnalytics.naviAnalytics.Telco(screenName) } private val viewModel by lazy { ViewModelProvider(this).get(TelcoOtpViewModel::class.java) } private val otpReceiver by lazy { SmsAutoReadReceiver() } @@ -68,7 +68,7 @@ class TelcoOtpV2Fragment : container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = TelcoOtpV2FragmentBinding.inflate(inflater, container, false) + binding = PlFragmentTelcoOtpV2Binding.inflate(inflater, container, false) initError(viewModel, actionErrorV2Enabled = true) initWarning(viewModel) initUi() @@ -98,7 +98,7 @@ class TelcoOtpV2Fragment : override fun onClick(v: View?) { when (v?.id) { - R.id.resend_otp_tv -> reSendOtp() + appR.id.resend_otp_tv -> reSendOtp() } } @@ -160,9 +160,9 @@ class TelcoOtpV2Fragment : binding.noteContainer.background = getNaviDrawable( - cornerRadius = resources.getDimension(R.dimen.layout_dp_8).toInt(), + cornerRadius = resources.getDimension(appR.dimen.layout_dp_8).toInt(), backgroundColor = - ResourcesCompat.getColor(resources, R.color.container_bg_color, null) + ResourcesCompat.getColor(resources, appR.color.container_bg_color, null) ) } @@ -186,7 +186,7 @@ class TelcoOtpV2Fragment : Constants.SECONDS_PER_MINUTE if (isAdded) binding.countdownTimerTv.text = - " ${String.format(getString(R.string.time_format), minutes, seconds)}" + " ${String.format(getString(appR.string.time_format), minutes, seconds)}" } override fun onFinish() { @@ -212,7 +212,7 @@ class TelcoOtpV2Fragment : ) binding.otpBoxLayout.setFontStyle( textSize = 16f, - colorId = R.color.black, + colorId = appR.color.black, fontId = getFontStyle(FontWeightEnum.TT_MEDIUM) ) @@ -232,7 +232,7 @@ class TelcoOtpV2Fragment : NaviDeepLinkNavigator.navigate(activity, it, true) } } else { - binding.errorMsgOtpTv.text = resources.getString(R.string.enter_correct_otp) + binding.errorMsgOtpTv.text = resources.getString(appR.string.enter_correct_otp) binding.errorMsgOtpTv.visibility = View.VISIBLE } } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/TopupLoanIntroV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/TopupLoanIntroV2Fragment.kt similarity index 96% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/TopupLoanIntroV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/TopupLoanIntroV2Fragment.kt index 7f4e688a77..a958afc5ef 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/TopupLoanIntroV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/TopupLoanIntroV2Fragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.getloanRevamp.fragments +package com.navi.pl.dynamic.fragment import android.content.Context import android.graphics.Color @@ -19,12 +19,12 @@ import com.moengage.pushbase.internal.ACTION import com.navi.base.model.CtaData import com.navi.base.utils.isNotNull import com.navi.common.ui.fragment.BaseFragment +import com.navi.naviwidgets.models.response.Footer import com.navi.naviwidgets.utils.NaviWidgetIconUtils +import com.navi.pl.dynamic.databinding.PlFragmentTopupLoanIntroV2Binding import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.NaviHeaderView import com.naviapp.common.navigator.NaviDeepLinkNavigator -import com.naviapp.databinding.FragmentTopupIntroLoanV2Binding -import com.navi.naviwidgets.models.response.Footer import com.naviapp.models.response.Header import com.naviapp.personalloan.factory.LoanDetailsV2VHFactoryImpl import com.naviapp.personalloanrevamp.getloanRevamp.adapters.LoanDetailsV2WidgetAdapter @@ -43,7 +43,7 @@ import kotlinx.coroutines.launch class TopupLoanIntroV2Fragment : BaseFragment(), LoanDetailsV2WidgetAdapterListener { - private lateinit var binding: FragmentTopupIntroLoanV2Binding + private lateinit var binding: PlFragmentTopupLoanIntroV2Binding private var headerListener: NaviHeaderView.InteractionListener? = null private val viewModel by lazy { ViewModelProvider(this).get(TopupLoanV2VM::class.java) } private val naviAnalyticsEventTracker = NaviAnalytics.naviAnalytics.TopUpLoanIntro(screenName) @@ -54,7 +54,7 @@ class TopupLoanIntroV2Fragment : BaseFragment(), LoanDetailsV2WidgetAdapterListe savedInstanceState: Bundle? ): View? { - binding = FragmentTopupIntroLoanV2Binding.inflate(inflater) + binding = PlFragmentTopupLoanIntroV2Binding.inflate(inflater) initObserver() return binding.root } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/TrueCallerAuthenticatorFragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/TrueCallerAuthenticatorFragment.kt similarity index 95% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/TrueCallerAuthenticatorFragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/TrueCallerAuthenticatorFragment.kt index 4af8306471..9a14dc9b3e 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/TrueCallerAuthenticatorFragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/TrueCallerAuthenticatorFragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.getloanRevamp.fragments +package com.navi.pl.dynamic.fragment import android.content.Context import android.content.IntentFilter @@ -28,6 +28,8 @@ import com.navi.common.utils.observeNullable import com.navi.design.font.FontWeightEnum import com.navi.design.utils.getFontStyle import com.navi.design.utils.getNaviDrawable +import com.navi.pl.dynamic.databinding.PlFragmentTrueCallerAuthenticatorBinding +import com.navi.pl.dynamic.helper.GetLoanV2Helper import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.BoxInputGroup @@ -36,10 +38,8 @@ import com.naviapp.common.fragment.OtpBottomSheet import com.naviapp.common.listeners.BackListener import com.naviapp.common.navigator.ScreenNavigator import com.naviapp.dashboard.listeners.FragmentInteractionListener -import com.naviapp.databinding.TrueCallerAuthenticatorFragmentBinding import com.naviapp.models.request.OtpRequest import com.naviapp.models.request.SendOtpForDisbursementRequest -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper import com.naviapp.personalloanrevamp.getloanRevamp.viewmodels.TrueCallerAuthenticatorVM import com.naviapp.utils.Constants import com.naviapp.utils.Constants.ACTION @@ -47,7 +47,7 @@ import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY class TrueCallerAuthenticatorFragment : BaseFragment(), View.OnClickListener, BackListener { - private lateinit var binding: TrueCallerAuthenticatorFragmentBinding + private lateinit var binding: PlFragmentTrueCallerAuthenticatorBinding private val viewModel by lazy { ViewModelProvider(this).get(TrueCallerAuthenticatorVM::class.java) } @@ -68,7 +68,7 @@ class TrueCallerAuthenticatorFragment : BaseFragment(), View.OnClickListener, Ba container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = TrueCallerAuthenticatorFragmentBinding.inflate(inflater, container, false) + binding = PlFragmentTrueCallerAuthenticatorBinding.inflate(inflater, container, false) initError(viewModel, actionErrorV2Enabled = true) initWarning(viewModel) initUi() @@ -237,7 +237,7 @@ class TrueCallerAuthenticatorFragment : BaseFragment(), View.OnClickListener, Ba hideLoader() if (response?.success.orFalse()) { eventTracker.onOtpVerified() - listener?.navigateTo(GetLoanV2ViewHelper.SUMMARY_SCREEN_V2) + listener?.navigateTo(GetLoanV2Helper.SUMMARY_SCREEN_V2) } else { binding.errorMsgOtpTv.text = viewModel.pageDetails.value?.content?.errorMessage diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/UPIProgressBlockerFragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/UPIProgressBlockerFragment.kt similarity index 93% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/UPIProgressBlockerFragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/UPIProgressBlockerFragment.kt index 2417b919f4..2ded71807d 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/UPIProgressBlockerFragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/UPIProgressBlockerFragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.getloanRevamp.fragments +package com.navi.pl.dynamic.fragment import android.content.Context import android.os.Bundle @@ -15,22 +15,28 @@ import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider import com.google.gson.Gson import com.navi.base.sharedpref.PreferenceManager -import com.navi.common.firebasedb.* +import com.navi.common.firebasedb.FirebaseDataHelper +import com.navi.common.firebasedb.FirebaseDataReceiveListener +import com.navi.common.firebasedb.FirebaseResponse +import com.navi.common.firebasedb.FirebaseStatusType +import com.navi.common.firebasedb.MANDATE_COMPLETE +import com.navi.common.firebasedb.MANDATE_FAILURE import com.navi.common.ui.fragment.BaseFragment import com.navi.common.utils.ApiPollScheduler import com.navi.common.utils.observeNonNull +import com.navi.payment.utils.ProviderType +import com.navi.pl.dynamic.databinding.PlFragmentUpiProgressBlockerBinding +import com.navi.pl.dynamic.helper.GetLoanV2Helper import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.NaviHeaderView import com.naviapp.dashboard.listeners.FragmentInteractionListener -import com.naviapp.databinding.FragmentUpiBlockerBinding import com.naviapp.models.request.DigioPayload import com.naviapp.models.request.StatusCheckRegistrationData import com.naviapp.models.response.AutoDebitMandateDetails import com.naviapp.models.response.AutoPayStatus -import com.navi.payment.utils.ProviderType import com.naviapp.personalloan.getloan.bankdetailsautodebit.viewmodels.BankDetailsAutoDebitVM import com.naviapp.personalloan.getloan.bankdetailsautodebit.viewmodels.EnachSharedVM -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper +import com.naviapp.personalloanrevamp.getloanRevamp.fragments.BankDetailsAutoDebitV2Fragment import com.naviapp.utils.Constants import com.naviapp.utils.Constants.ACTION import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY @@ -38,14 +44,14 @@ import com.naviapp.utils.LOAN_APPLICATION_ID class UPIProgressBlockerFragment : BaseFragment() { - private var binding: FragmentUpiBlockerBinding? = null + private var binding: PlFragmentUpiProgressBlockerBinding? = null private val viewModel by lazy { ViewModelProvider(this)[BankDetailsAutoDebitVM::class.java] } private var listener: FragmentInteractionListener? = null private var headerListener: NaviHeaderView.InteractionListener? = null - private var updateUIListener: LoanDetailsV2Fragment.UpdateUiListener? = null + private var updateUIListener: BankDetailsAutoDebitV2Fragment.UpdateUiListener? = null private var loanApplicationId: String? = null private val naviAnalyticsEventTracker = NaviAnalytics.naviAnalytics.BankDetails() @@ -64,7 +70,7 @@ class UPIProgressBlockerFragment : BaseFragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View? { - binding = FragmentUpiBlockerBinding.inflate(inflater, container, false) + binding = PlFragmentUpiProgressBlockerBinding.inflate(inflater, container, false) return binding?.root } @@ -330,7 +336,7 @@ class UPIProgressBlockerFragment : BaseFragment() { bundle?.putString(Constants.PERSONAL_LOAN_APPLICATION_ID, loanApplicationId) listener?.navigateTo( - GetLoanV2ViewHelper.BANK_DETAILS_AUTO_DEBIT_V2, + GetLoanV2Helper.BANK_DETAILS_AUTO_DEBIT_V2, bundle ) } @@ -340,7 +346,7 @@ class UPIProgressBlockerFragment : BaseFragment() { super.onAttach(context) listener = context as? FragmentInteractionListener headerListener = context as? NaviHeaderView.InteractionListener - updateUIListener = context as? LoanDetailsV2Fragment.UpdateUiListener + updateUIListener = context as? BankDetailsAutoDebitV2Fragment.UpdateUiListener } override fun onDetach() { diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/UpcomingEmiDetailsV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/UpcomingEmiDetailsV2Fragment.kt similarity index 91% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/UpcomingEmiDetailsV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/UpcomingEmiDetailsV2Fragment.kt index 894ecb28c3..b2cb78b1a7 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/fragments/UpcomingEmiDetailsV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/UpcomingEmiDetailsV2Fragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.getloanRevamp.fragments +package com.navi.pl.dynamic.fragment import android.app.Activity import android.content.Context @@ -20,18 +20,17 @@ import com.navi.common.model.Money import com.navi.common.ui.fragment.BaseFragment import com.navi.common.utils.setCornerRadius import com.navi.naviwidgets.models.response.Footer +import com.navi.pl.dynamic.databinding.PlFragmentUpcomingEmiDetailsV2Binding +import com.navi.pl.dynamic.helper.GetLoanV2Helper import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.NaviHeaderView import com.naviapp.common.listeners.BackListener import com.naviapp.dashboard.listeners.FragmentInteractionListener -import com.naviapp.databinding.UpcomingEmiDetailsFragmentV2Binding import com.naviapp.models.request.LoanFeeDetailsRequest import com.naviapp.models.response.EmiDatesData import com.naviapp.models.response.Header import com.naviapp.personalloan.getloan.loandetails.viewmodels.EmiSelectorVM -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper -import com.naviapp.personalloanrevamp.useridentificationv2.fragments.LoanSummaryV2Fragment import com.naviapp.utils.Constants import com.naviapp.utils.Constants.ACTION import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY @@ -40,7 +39,7 @@ import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class UpcomingEmiDetailsV2Fragment : BaseFragment(), BackListener { - private lateinit var binding: UpcomingEmiDetailsFragmentV2Binding + 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 var headerListener: NaviHeaderView.InteractionListener? = null @@ -52,7 +51,7 @@ class UpcomingEmiDetailsV2Fragment : BaseFragment(), BackListener { container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = UpcomingEmiDetailsFragmentV2Binding.inflate(layoutInflater, container, false) + binding = PlFragmentUpcomingEmiDetailsV2Binding.inflate(layoutInflater, container, false) initError(viewModel, actionErrorV2Enabled = true) initArguments() initObserver() @@ -163,7 +162,7 @@ class UpcomingEmiDetailsV2Fragment : BaseFragment(), BackListener { return@setOnClickListener } listener?.navigateTo( - GetLoanV2ViewHelper.EMI_SELECTOR_FRAGMENT_V2, + GetLoanV2Helper.EMI_SELECTOR_FRAGMENT_V2, getFormattedBundle() ) } @@ -179,7 +178,7 @@ class UpcomingEmiDetailsV2Fragment : BaseFragment(), BackListener { activity?.finish() } else { listener?.navigateTo( - GetLoanV2ViewHelper.EMI_SELECTOR_FRAGMENT_V2, + GetLoanV2Helper.EMI_SELECTOR_FRAGMENT_V2, getFormattedBundle() ) } @@ -187,7 +186,7 @@ class UpcomingEmiDetailsV2Fragment : BaseFragment(), BackListener { private fun moveToLoanSummaryScreen() { listener?.navigateTo( - GetLoanV2ViewHelper.SUMMARY_SCREEN_V2, + GetLoanV2Helper.SUMMARY_SCREEN_V2, Bundle() ) } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/kyc/fragment/VideoKycV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/VideoKycV2Fragment.kt similarity index 92% rename from app/src/main/java/com/naviapp/personalloanrevamp/kyc/fragment/VideoKycV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/VideoKycV2Fragment.kt index 5b5c01241d..5d4292f0ee 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/kyc/fragment/VideoKycV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/VideoKycV2Fragment.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.kyc.fragment +package com.navi.pl.dynamic.fragment import android.Manifest import android.content.Context @@ -30,22 +30,32 @@ import com.navi.analytics.utils.NaviTrackEvent import com.navi.base.model.CtaData import com.navi.base.utils.orFalse import com.navi.base.utils.orTrue -import com.navi.common.firebasedb.* +import com.navi.common.firebasedb.FirebaseDataHelper +import com.navi.common.firebasedb.FirebaseDataReceiveListener +import com.navi.common.firebasedb.FirebaseResponse +import com.navi.common.firebasedb.FirebaseStatusType +import com.navi.common.firebasedb.VIDEO_KYC import com.navi.common.managers.PermissionsManager import com.navi.common.model.ModuleName import com.navi.common.ui.fragment.BaseFragment -import com.navi.common.utils.* +import com.navi.common.utils.ApiPollScheduler +import com.navi.common.utils.observeNonNull +import com.navi.common.utils.observeNullable import com.navi.payment.utils.ProviderType +import com.navi.pl.dynamic.adapter.KycItemType +import com.navi.pl.dynamic.adapter.KycItemsV2Adapter +import com.navi.pl.dynamic.databinding.PlFragmentKycV2Binding +import com.navi.pl.dynamic.helper.GetLoanV2Helper +import com.navi.pl.dynamic.helper.VKycHelper +import com.navi.pl.dynamic.listener.UpdateKycStateListener import com.navi.vkyc.presentation.activity.VKYCActivity import com.naviapp.BuildConfig -import com.naviapp.R import com.naviapp.analytics.utils.LoadTimeEventTracker import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.FooterViewV2 import com.naviapp.common.customview.NaviHeaderView import com.naviapp.common.listeners.BackListener import com.naviapp.dashboard.listeners.FragmentInteractionListener -import com.naviapp.databinding.KycFragmenttV2Binding import com.naviapp.models.KycUiStatusValue import com.naviapp.models.VideoKycStatusEnum import com.naviapp.permission.fragments.PermissionDeniedFragment @@ -55,13 +65,6 @@ import com.naviapp.personalloan.getloan.kyc.models.SupportedOvd import com.naviapp.personalloan.getloan.kyc.utils.DocumentType.PAN_CARD import com.naviapp.personalloan.getloan.kyc.viewmodels.KycSharedVM import com.naviapp.personalloan.getloan.kyc.viewmodels.VideoKycVM -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.InReviewV2Fragment -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper -import com.naviapp.personalloanrevamp.getloanRevamp.helper.GetLoanV2ViewHelper.KYC_V2 -import com.naviapp.personalloanrevamp.kyc.adapter.KycItemType -import com.naviapp.personalloanrevamp.kyc.adapter.KycItemsV2Adapter -import com.naviapp.personalloanrevamp.kyc.listener.UpdateKycStateListener -import com.naviapp.personalloanrevamp.kyc.utils.VKycHelper import com.naviapp.personalloanrevamp.models.EMPTY_ERROR_CODE_BY_3rd_PARTY import com.naviapp.personalloanrevamp.models.EMPTY_REASON_BY_3rd_PARTY import com.naviapp.utils.Constants @@ -69,14 +72,19 @@ import com.naviapp.utils.Constants.ACTION import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY import com.naviapp.utils.EMPTY import com.naviapp.utils.toast -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import java.io.ByteArrayOutputStream import java.io.File +import com.naviapp.R as appR class VideoKycV2Fragment : BaseFragment(), BackListener, KycItemsListener, FooterViewV2.FooterInteractionListener { - private lateinit var binding: KycFragmenttV2Binding + private lateinit var binding: PlFragmentKycV2Binding private val viewModel by lazy { ViewModelProvider(this)[VideoKycVM::class.java] } private var listener: FragmentInteractionListener? = null private val analyticsEventTracker by lazy { NaviAnalytics.naviAnalytics.Kyc(screenName) } @@ -111,7 +119,7 @@ class VideoKycV2Fragment : container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = KycFragmenttV2Binding.inflate(inflater, container, false) + binding = PlFragmentKycV2Binding.inflate(inflater, container, false) return binding.root } @@ -138,15 +146,15 @@ class VideoKycV2Fragment : kycDetailsResponse.header?.title?.let { headerListener?.setProperties( title = it, - infoCta = kycDetailsResponse.header.infoCta, - leftIconCode = kycDetailsResponse.header.leftIconCode + infoCta = kycDetailsResponse.header?.infoCta, + leftIconCode = kycDetailsResponse.header?.leftIconCode ) } if (kycDetailsResponse.videoKycDetails?.isFooterEnabled?.orFalse() == true) { binding.footerView.visibility = View.GONE binding.actionConnectNow.visibility = View.VISIBLE - kycDetailsResponse.videoKycDetails.kycItemList?.get(0)?.selected = false + kycDetailsResponse.videoKycDetails?.kycItemList?.get(0)?.selected = false binding.actionConnectNow.setProperties( title = kycDetailsResponse.footer?.nextCta?.title ) @@ -241,16 +249,16 @@ class VideoKycV2Fragment : private fun navigateToKycInReviewScreen() { listener?.navigateTo( - GetLoanV2ViewHelper.KYC_IN_REVIEW, + GetLoanV2Helper.KYC_IN_REVIEW, bundle = Bundle().apply { putString( InReviewV2Fragment.TITLE, - resources.getString(R.string.kyc_verification_pending) + resources.getString(appR.string.kyc_verification_pending) ) putString( InReviewV2Fragment.DESCRIPTION, - resources.getString(R.string.kyc_pending_description) + resources.getString(appR.string.kyc_pending_description) ) } ) @@ -369,7 +377,7 @@ class VideoKycV2Fragment : analyticsEventTracker.onCameraPermissionResult(NaviAnalytics.NO) if (!shouldShowRequestPermissionRationale(PermissionsManager.CAMERA_PERMISSION)) handleDoNotAskAgain() - else toast(getString(R.string.camera_permission_required_for_, KycItemType.PAN.name)) + else toast(getString(appR.string.camera_permission_required_for_, KycItemType.PAN.name)) } } @@ -391,7 +399,7 @@ class VideoKycV2Fragment : ) ) handleDoNotAskAgain() - else toast(getString(R.string.camera_permission_required_for_video_kyc)) + else toast(getString(appR.string.camera_permission_required_for_video_kyc)) } } Manifest.permission.RECORD_AUDIO -> { @@ -400,7 +408,7 @@ class VideoKycV2Fragment : } else { allPermissionsGranted = false analyticsEventTracker.onMicPermissionResult(NaviAnalytics.NO) - toast(getString(R.string.mic_permission_required_for_video_kyc)) + toast(getString(appR.string.mic_permission_required_for_video_kyc)) } } Manifest.permission.ACCESS_FINE_LOCATION -> { @@ -413,7 +421,7 @@ class VideoKycV2Fragment : } ?: run { allPermissionsGranted = false } analyticsEventTracker.onLocationPermissionResult(NaviAnalytics.NO) - toast(getString(R.string.location_permission_required_for_video_kyc)) + toast(getString(appR.string.location_permission_required_for_video_kyc)) } } Manifest.permission.ACCESS_COARSE_LOCATION -> { @@ -426,7 +434,7 @@ class VideoKycV2Fragment : } ?: run { allPermissionsGranted = false } analyticsEventTracker.onCoarseLocationPermissionResult(NaviAnalytics.NO) - toast(getString(R.string.location_permission_required_for_video_kyc)) + toast(getString(appR.string.location_permission_required_for_video_kyc)) } } } @@ -593,7 +601,7 @@ class VideoKycV2Fragment : private fun onClickUploadIdPhoto(showReviewScreen: Boolean?, shouldAutoCapture: Boolean?) { loadTimeEventTracker.onLoadingStarted(NaviAnalytics.PL_PAN_UPLOAD_TIME) - val hvDocConfig = vKycHelper.hvDocPANConfig(getString(R.string.pan_capture), showReviewScreen, shouldAutoCapture, context) + val hvDocConfig = vKycHelper.hvDocPANConfig(getString(appR.string.pan_capture), showReviewScreen, shouldAutoCapture, context) HVDocsActivity.start(requireContext(), hvDocConfig, docCaptureHandlerForPAN()) } @@ -657,7 +665,7 @@ class VideoKycV2Fragment : override fun onBackPressed() { queryMap.clear() - listener?.navigateTo(getRedirectionUrl() ?: KYC_V2) + listener?.navigateTo(getRedirectionUrl() ?: GetLoanV2Helper.KYC_V2) } private fun getRedirectionUrl(): String? { diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments/WorkV2Fragment.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/WorkV2Fragment.kt similarity index 89% rename from app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments/WorkV2Fragment.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/WorkV2Fragment.kt index 47c3a2bbaf..1d69c71c53 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/fragments/WorkV2Fragment.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/fragment/WorkV2Fragment.kt @@ -5,14 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.useridentificationv2.fragments - -/* - * - * * Copyright © 2022 by Navi Technologies Private Limited - * * All rights reserved. Strictly confidential - * - */ +package com.navi.pl.dynamic.fragment import android.content.Context import android.os.Build @@ -23,7 +16,10 @@ import android.text.TextUtils import android.text.TextWatcher import android.view.LayoutInflater import android.view.View -import android.view.View.* +import android.view.View.GONE +import android.view.View.OnClickListener +import android.view.View.TEXT_ALIGNMENT_TEXT_START +import android.view.View.VISIBLE import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView @@ -41,7 +37,11 @@ import com.navi.base.sharedpref.PreferenceManager import com.navi.base.utils.orElse import com.navi.base.utils.orFalse import com.navi.base.utils.orTrue -import com.navi.common.firebasedb.* +import com.navi.common.firebasedb.FirebaseDataHelper +import com.navi.common.firebasedb.FirebaseDataReceiveListener +import com.navi.common.firebasedb.FirebaseResponse +import com.navi.common.firebasedb.FirebaseStatusType +import com.navi.common.firebasedb.WORK_DETAILS import com.navi.common.listeners.FragmentInterchangeListener import com.navi.common.model.RequestConfig import com.navi.common.model.UserDetail @@ -53,32 +53,39 @@ import com.navi.design.utils.ifMeasured import com.navi.naviwidgets.base.BaseInputWidget import com.navi.naviwidgets.utils.NaviWidgetIconUtils import com.navi.naviwidgets.widgets.labledtextinput.ui.LabeledTextInputWidgetV2 -import com.naviapp.R +import com.navi.pl.dynamic.activity.ErrorScreenV2Activity +import com.navi.pl.dynamic.databinding.PlFragmentWorkV2Binding +import com.navi.pl.dynamic.helper.WorkV2FragmentHelper import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.customview.BoxWithIconView import com.naviapp.common.customview.FooterViewV2 import com.naviapp.common.customview.NaviHeaderView import com.naviapp.common.navigator.ScreenNavigator -import com.naviapp.databinding.WorkDetailsV2FragmentBinding import com.naviapp.models.response.EmploymentTypeResponse import com.naviapp.models.response.WorkDetailsResponse import com.naviapp.network.ApiErrorTagType import com.naviapp.network.ApiErrorTagType.WORK_DETAILS_UPLOAD import com.naviapp.personalloan.useridentification.profile.models.ValidationState import com.naviapp.personalloan.useridentification.work.viewmodels.WorkVM -import com.naviapp.personalloanrevamp.error.activity.ErrorScreenV2Activity -import com.naviapp.personalloanrevamp.useridentificationv2.helper.WorkV2FragmentHelper -import com.naviapp.utils.* +import com.naviapp.personalloanrevamp.useridentificationv2.fragments.InformationBottomSheet +import com.naviapp.utils.COMMA +import com.naviapp.utils.Constants import com.naviapp.utils.Constants.ACTION import com.naviapp.utils.Constants.EPFO_PAGE_TYPE import com.naviapp.utils.Constants.PL_JOURNEY_POLLING_INITIAL_DELAY_IN_SECONDS import com.naviapp.utils.Constants.PL_SCREEN_ACTIVITY import com.naviapp.utils.Constants.WORK import com.naviapp.utils.Constants.ZERO +import com.naviapp.utils.constructBundleWithCtaData +import com.naviapp.utils.convertDpToPx +import com.naviapp.utils.getLocationOnScreen +import com.naviapp.utils.getMoney +import com.naviapp.utils.stringToDouble +import com.naviapp.R as appR class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { - private lateinit var binding: WorkDetailsV2FragmentBinding + private lateinit var binding: PlFragmentWorkV2Binding private val viewModel by lazy { ViewModelProvider(this)[WorkVM::class.java] } private var userDetailForAnalytics: UserDetail? = null private val naviAnalyticsEventTracker by lazy { NaviAnalytics.naviAnalytics.Work(screenName) } @@ -89,7 +96,7 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = WorkDetailsV2FragmentBinding.inflate(inflater, container, false) + binding = PlFragmentWorkV2Binding.inflate(inflater, container, false) initError() initUI() initWarning() @@ -115,31 +122,31 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { private fun initUI() { binding.incomeTooltipView.setProperties( - R.style.NaviSansSemiBoldExtraSmall, + appR.style.NaviSansSemiBoldExtraSmall, TEXT_ALIGNMENT_TEXT_START, Padding(startDp = 12.0f, endDp = 12.0f, topDp = 6.0f, bottomDp = 6.0f) ) context?.let { binding.monthlyIncomeLt.widgetBinding.fixedHint.setTextColor( - ContextCompat.getColor(it, R.color.title_color_four) + ContextCompat.getColor(it, appR.color.title_color_four) ) binding.panNumberLt.binding.titleTv.setTextColor( - ContextCompat.getColor(it, R.color.title_color_two) + ContextCompat.getColor(it, appR.color.title_color_two) ) } TextViewCompat.setTextAppearance( binding.monthlyIncomeLt.widgetBinding.fixedHint, - R.style.NaviSansSemiBoldSmall + appR.style.NaviSansSemiBoldSmall ) TextViewCompat.setTextAppearance( binding.monthlyIncomeLt.widgetBinding.plainTextInput, - R.style.NaviSansSemiBoldSmall + appR.style.NaviSansSemiBoldSmall ) TextViewCompat.setTextAppearance( binding.panNumberLt.widgetBinding.plainTextInput, - R.style.NaviSansSemiBoldSmall + appR.style.NaviSansSemiBoldSmall ) - binding.panNumberLt.setBaseBorderBackground(R.drawable.bg_view_bg_color_17_bordered_round_8) + binding.panNumberLt.setBaseBorderBackground(appR.drawable.bg_view_bg_color_17_bordered_round_8) } private fun onEmploymentTypeIvClicked() { @@ -194,7 +201,7 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { if (value == null || value == 0.0) { setErrorProperties( binding.monthlyIncomeLt, - getString(R.string.please_enter_a_valid_income) + getString(appR.string.please_enter_a_valid_income) ) } } @@ -211,7 +218,7 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { } private fun onBoxClicked(view: BoxWithIconView, itemIndex: Int) { - view.elevation = resources.getDimension(R.dimen.layout_dp_3) + view.elevation = resources.getDimension(appR.dimen.layout_dp_3) resetEmploymentSelection() (view as? BoxWithIconView)?.setSelected() viewModel.workDetailsResponse.value?.content?.employmentTypes?.getOrNull(itemIndex)?.let { @@ -265,12 +272,12 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { ValidationState.IS_EMPTY, ValidationState.IS_INVALID -> setErrorProperties( binding.monthlyIncomeLt, - getString(R.string.please_enter_a_valid_income) + getString(appR.string.please_enter_a_valid_income) ) ValidationState.IS_SMALLER_THAN_MIN_LENGTH -> setErrorProperties( binding.monthlyIncomeLt, - getString(R.string.minimum_monthly_income) + getString(appR.string.minimum_monthly_income) ) else -> {} @@ -283,12 +290,12 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { when (it) { ValidationState.IS_EMPTY -> setErrorProperties( binding.panNumberLt, - getString(R.string.please_enter_your_PAN_number) + getString(appR.string.please_enter_your_PAN_number) ) ValidationState.IS_INVALID -> setErrorProperties( binding.panNumberLt, - resources.getString(R.string.enter_a_valid_pan_number) + resources.getString(appR.string.enter_a_valid_pan_number) ) else -> {} // Do Nothing @@ -301,10 +308,10 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { } private fun BoxWithIconView.setDefaultStyling() { - elevation = resources.getDimension(R.dimen.layout_dp_0) + elevation = resources.getDimension(appR.dimen.layout_dp_0) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - outlineSpotShadowColor = ContextCompat.getColor(context, R.color.shadow_color) - outlineAmbientShadowColor = ContextCompat.getColor(context, R.color.shadow_color) + outlineSpotShadowColor = ContextCompat.getColor(context, appR.color.shadow_color) + outlineAmbientShadowColor = ContextCompat.getColor(context, appR.color.shadow_color) } } @@ -410,8 +417,8 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { ) data.content?.panDetails?.panNumber?.let { binding.panNumberLt.setSuccessText( - data.content.panDetails.successText, - NaviWidgetIconUtils.getImageFromIconCode(data.content.panDetails.successIcon) + data.content?.panDetails?.successText, + NaviWidgetIconUtils.getImageFromIconCode(data.content?.panDetails?.successIcon) ) } data.content?.panToolTip.let { binding.panTooltipView.setTooltipTitle(it.toString()) } @@ -420,9 +427,9 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { updateInfoLayoutParams(it, binding.panNumberLt.binding.info) updateTitleViewInWidget(binding.monthlyIncomeLt.binding.titleTv, it) } - binding.monthlyIncomeLt.binding.info.setImageResource(R.drawable.ic_alert_solid_black) + binding.monthlyIncomeLt.binding.info.setImageResource(appR.drawable.ic_alert_solid_black) binding.monthlyIncomeLt.binding.info.visibility = VISIBLE - binding.panNumberLt.binding.info.setImageResource(R.drawable.ic_alert_solid_black) + binding.panNumberLt.binding.info.setImageResource(appR.drawable.ic_alert_solid_black) binding.panNumberLt.binding.info.visibility = VISIBLE labelWithInputFormatting(binding.panNumberLt) data.content?.employmentTypes?.forEachIndexed { index, employmentTypeResponse -> @@ -439,7 +446,7 @@ 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(appR.drawable.bg_view_bg_color_17_bordered_round_8) } } @@ -666,10 +673,10 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { private fun setErrorProperties(ltView: BaseInputWidget, text: String) { ltView.setError( text, - R.style.NaviSansSemiBoldExtraSmall, - R.color.error_red, - R.drawable.ic_line_error_svg, - R.drawable.bg_error_red_border_rounded_8, + appR.style.NaviSansSemiBoldExtraSmall, + appR.color.error_red, + appR.drawable.ic_line_error_svg, + appR.drawable.bg_error_red_border_rounded_8, ) } @@ -686,8 +693,8 @@ class WorkV2Fragment : BaseFragment(), FooterViewV2.FooterInteractionListener { } private fun updateTitleViewInWidget(titleTv: TextView, it: Context) { - TextViewCompat.setTextAppearance(titleTv, R.style.NaviSansBoldMedium) - titleTv.setTextColor(ContextCompat.getColor(it, R.color.title_color_two)) + TextViewCompat.setTextAppearance(titleTv, appR.style.NaviSansBoldMedium) + titleTv.setTextColor(ContextCompat.getColor(it, appR.color.title_color_two)) } override fun onFooterBackPressed(backCta: CtaData?) { diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/addressverificationrevamp/helper/AddressHelper.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/AddressHelper.kt similarity index 55% rename from app/src/main/java/com/naviapp/personalloanrevamp/addressverificationrevamp/helper/AddressHelper.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/AddressHelper.kt index f25a93bac3..3c003f1d76 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/addressverificationrevamp/helper/AddressHelper.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/AddressHelper.kt @@ -5,15 +5,12 @@ * */ -package com.naviapp.personalloanrevamp.addressverificationrevamp.helper +package com.navi.pl.dynamic.helper -import com.navi.naviwidgets.models.response.Action -import com.navi.common.network.models.GenericErrorResponse -import com.naviapp.R -import com.naviapp.app.NaviApplication +import com.navi.pl.dynamic.fragment.KycV2Fragment import com.naviapp.models.request.Address +import com.naviapp.models.request.AddressType import com.naviapp.models.response.CurrentAddress -import com.naviapp.personalloanrevamp.kyc.fragment.KycV2Fragment object AddressHelper { fun getAddressFromCurrentAddress(currentAddress: CurrentAddress, current: Boolean): Address { @@ -26,7 +23,7 @@ object AddressHelper { pinCode = currentAddress.pinCode, documentType = currentAddress.documentType, documentTempUrl = currentAddress.documentUrl, - type = CORRESPONDENCE, + type = AddressType.CORRESPONDENCE.name, current = current ) } @@ -41,18 +38,4 @@ object AddressHelper { KycV2Fragment.AADHAR_OTP_REQUEST_CODE ) - fun getUploadDocumentErrorData(): GenericErrorResponse { - val context = NaviApplication.instance - return GenericErrorResponse( - listOf(Action(context.getString(R.string.upload_proof))), - null, - context.getString(R.string.upload_document_error_description), - context.getString(R.string.document_not_uploaded), - null, - NO_ADDRESS_SELECTED_BOTTOM_SHEET - ) - } - - const val CORRESPONDENCE = "CORRESPONDENCE" - const val NO_ADDRESS_SELECTED_BOTTOM_SHEET = "NO_ADDRESS_SELECTED_BOTTOM_SHEET" } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/helper/GetLoanV2Helper.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/GetLoanV2Helper.kt similarity index 77% rename from app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/helper/GetLoanV2Helper.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/GetLoanV2Helper.kt index 48f7fdbe4b..9cfd828c59 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/getloanRevamp/helper/GetLoanV2Helper.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/GetLoanV2Helper.kt @@ -5,50 +5,63 @@ * */ -package com.naviapp.personalloanrevamp.getloanRevamp.helper +package com.navi.pl.dynamic.helper import android.os.Bundle import androidx.fragment.app.Fragment +import com.navi.pl.dynamic.fragment.DelayedDisbursementV2Fragment +import com.navi.pl.dynamic.fragment.EffectiveInterestCostV2Fragment +import com.navi.pl.dynamic.fragment.EmiSelectorV2Fragment +import com.navi.pl.dynamic.fragment.FreshLoanDetailsV2Fragment +import com.navi.pl.dynamic.fragment.GstVerificationV2Fragment +import com.navi.pl.dynamic.fragment.InReviewV2Fragment +import com.navi.pl.dynamic.fragment.KycAddressProofV2Fragment +import com.navi.pl.dynamic.fragment.KycAddressV2Fragment +import com.navi.pl.dynamic.fragment.KycV2Fragment +import com.navi.pl.dynamic.fragment.LoanDetailsEditorFragment +import com.navi.pl.dynamic.fragment.LoanDetailsV2Fragment +import com.navi.pl.dynamic.fragment.LoanOfferUpgradeV2Fragment +import com.navi.pl.dynamic.fragment.LoanOfferUpgradeV3Fragment +import com.navi.pl.dynamic.fragment.LoanSummaryV2Fragment +import com.navi.pl.dynamic.fragment.MFIConsentV2Fragment +import com.navi.pl.dynamic.fragment.MFIInfoV2Fragment +import com.navi.pl.dynamic.fragment.TrueCallerAuthenticatorFragment +import com.navi.pl.dynamic.fragment.UPIProgressBlockerFragment +import com.navi.pl.dynamic.fragment.UpcomingEmiDetailsV2Fragment +import com.navi.pl.dynamic.fragment.VideoKycV2Fragment import com.naviapp.analytics.utils.NaviAnalytics -import com.naviapp.personalloanrevamp.addressverificationrevamp.fragment.KycAddressProofV2Fragment -import com.naviapp.personalloanrevamp.addressverificationrevamp.fragment.KycAddressV2Fragment import com.naviapp.personalloanrevamp.bankDetailsPostKyc.fragment.BankDetailsPostKycFragment -import com.naviapp.personalloanrevamp.getloanRevamp.fragments.* -import com.naviapp.personalloanrevamp.intermediatev2.fragments.LoanOfferUpgradeV2Fragment -import com.naviapp.personalloanrevamp.kyc.fragment.KycV2Fragment -import com.naviapp.personalloanrevamp.kyc.fragment.VideoKycV2Fragment -import com.naviapp.personalloanrevamp.useridentificationv2.fragments.LoanSummaryV2Fragment -import com.naviapp.personalloanrevamp.useridentificationv2.fragments.MFIConsentV2Fragment -import com.naviapp.personalloanrevamp.useridentificationv2.fragments.MFIInfoV2Fragment +import com.naviapp.personalloanrevamp.getloanRevamp.fragments.BankDetailsAutoDebitV2Fragment +import com.naviapp.personalloanrevamp.getloanRevamp.fragments.BankDetailsV2Fragment import com.naviapp.utils.EMPTY -object GetLoanV2ViewHelper { +object GetLoanV2Helper { - const val KYC_IN_REVIEW: String = "KYC_IN_REVIEW_V2" + const val KYC_IN_REVIEW = "KYC_IN_REVIEW_V2" const val LOAN_DETAILS_EDITOR_FRAGMENT = "LOAN_DETAILS_EDITOR" const val LOAN_OFFER_UPGRADE_V2 = "LOAN_OFFER_UPGRADE_V2" const val VIDEO_KYC_V2_SCREEN = "VIDEO_KYC_V2" const val KYC_ADDRESS_VERIFICATION = "KYC_ADDRESS_VERIFICATION_V2" const val KYC_ADDRESS_PROOF_VERIFICATION = "KYC_ADDRESS_PROOF_VERIFICATION_V2" const val LOAN_DETAILS_V2_FRAGMENT = "LOAN_DETAILS_REPEAT_V2" - const val BANK_DETAILS_V2 = "BANK_DETAILS_V2" - const val BANK_DETAILS_POST_KYC = "BANK_DETAILS_POST_KYC" - const val UPI_STATUS_V2 = "UPI_STATUS_V2" + private const val BANK_DETAILS_V2 = "BANK_DETAILS_V2" + private const val BANK_DETAILS_POST_KYC = "BANK_DETAILS_POST_KYC" + private const val UPI_STATUS_V2 = "UPI_STATUS_V2" const val BANK_DETAILS_AUTO_DEBIT_V2 = "BANK_DETAILS_AUTO_DEBIT_V2" - const val MFI_CONSENT_V2 = "MFI_CONSENT_V2" - const val INCOME_INFO_V2 = "INCOME_INFO_V2" + private const val MFI_CONSENT_V2 = "MFI_CONSENT_V2" + private const val INCOME_INFO_V2 = "INCOME_INFO_V2" const val EMI_SELECTOR_FRAGMENT_V2 = "EMI_SELECTOR_FRAGMENT_V2" const val UPCOMING_EMI_DETAIL_V2 = "UPCOMING_EMI_DETAIL_V2" - const val GST_VERIFICATION_V2 = "GST_VERIFICATION_V2" + private const val GST_VERIFICATION_V2 = "GST_VERIFICATION_V2" const val SUMMARY_SCREEN_V2 = "SUMMARY_SCREEN_V2" const val KYC_V2 = "KYC_V2" - const val LOAN_AGREEMENT_V2 = "LOAN_AGREEMENT_V2" + private const val LOAN_AGREEMENT_V2 = "LOAN_AGREEMENT_V2" const val FRESH_LOAN_DETAILS_V2 = "LOAN_DETAILS_V2" const val TRUE_CALLER_AUTHENTICATOR_V2 = "TRUE_CALLER_AUTHENTICATOR_V2" const val MONEY_DISBURSEMENT_STATUS_V2 = "MONEY_DISBURSEMENT_STATUS_V2" private const val EFFECTIVE_INTEREST_COST_V2 = "EFFECTIVE_INTEREST_COST_V2" private const val FRESH_LOAN_DETAIL_WEB_VIEW = "FRESH_LOAN_DETAIL_WEB_VIEW" - const val LOAN_OFFER_UPGRADE_V3 = "LOAN_OFFER_UPGRADE_V3" + private const val LOAN_OFFER_UPGRADE_V3 = "LOAN_OFFER_UPGRADE_V3" fun getTag(screen: String): String { return when (screen) { diff --git a/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/IntermediateV2Helper.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/IntermediateV2Helper.kt new file mode 100644 index 0000000000..ef583b606b --- /dev/null +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/IntermediateV2Helper.kt @@ -0,0 +1,45 @@ +/* + * + * * Copyright © 2022-2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.navi.pl.dynamic.helper + +import android.os.Bundle +import androidx.fragment.app.Fragment +import com.navi.pl.dynamic.fragment.BankStatementV2Fragment +import com.navi.pl.dynamic.fragment.EmploymentOtpVerificationFragment +import com.navi.pl.dynamic.fragment.EmploymentVerificationV2Fragment +import com.navi.pl.dynamic.fragment.GstVerificationPasswordV2Fragment +import com.navi.pl.dynamic.fragment.GstVerificationV2Fragment +import com.navi.pl.dynamic.fragment.TelcoOtpV2Fragment +import com.navi.pl.dynamic.fragment.TopupLoanIntroV2Fragment +import com.naviapp.personalloanrevamp.getloanRevamp.fragments.SelectBankV3Fragment + +object IntermediateV2Helper { + + private const val GST_VERIFICATION_V2 = "GST_VERIFICATION_V2" + private const val GST_VERIFICATION_PASSWORD_V2 = "GST_VERIFICATION_PASSWORD_V2" + private const val TELCO_OTP_VERIFICATION_V2 = "TELCO_OTP_VERIFICATION_V2" + private const val SELECT_BANK_V3 = "SELECT_BANK_V3_SCREEN" + private const val BANK_STATEMENT_VERIFICATION_V2 = "BANK_STATEMENT_VERIFICATION_V2" + const val EPFO_V2 = "EPFO_V2" + const val EPFO_OTP_VERIFICATION_V2 = "EPFO_OTP_VERIFICATION_V2" + private const val TOP_UP_INTRO_V2 = "TOP_UP_INTRO" + + fun getFragment(screen: String, bundle: Bundle? = null): Fragment { + return when (screen) { + GST_VERIFICATION_V2 -> GstVerificationV2Fragment.getInstance(bundle) + GST_VERIFICATION_PASSWORD_V2 -> GstVerificationPasswordV2Fragment.getInstance(bundle) + TELCO_OTP_VERIFICATION_V2 -> TelcoOtpV2Fragment.getInstance(bundle) + BANK_STATEMENT_VERIFICATION_V2 -> BankStatementV2Fragment.getInstance(bundle) + EPFO_V2 -> EmploymentVerificationV2Fragment.getInstance(bundle) + EPFO_OTP_VERIFICATION_V2 -> EmploymentOtpVerificationFragment.getInstance(bundle) + TOP_UP_INTRO_V2 -> TopupLoanIntroV2Fragment.getInstance(bundle) + SELECT_BANK_V3 -> SelectBankV3Fragment.getInstance(bundle) + else -> BankStatementV2Fragment.getInstance(bundle) + } + } +} diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/addressverificationrevamp/helper/KycAddressV2Helper.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/KycAddressV2Helper.kt similarity index 95% rename from app/src/main/java/com/naviapp/personalloanrevamp/addressverificationrevamp/helper/KycAddressV2Helper.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/KycAddressV2Helper.kt index f28f872ff2..c4eff5a563 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/addressverificationrevamp/helper/KycAddressV2Helper.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/KycAddressV2Helper.kt @@ -1,4 +1,11 @@ -package com.naviapp.personalloanrevamp.addressverificationrevamp.helper +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.navi.pl.dynamic.helper import android.content.Context import com.navi.naviwidgets.widgets.TextInputUtil @@ -93,4 +100,4 @@ object KycAddressV2Helper { ) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/helper/ProfileV2FragmentHelper.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/ProfileV2FragmentHelper.kt similarity index 97% rename from app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/helper/ProfileV2FragmentHelper.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/ProfileV2FragmentHelper.kt index 42346bdc09..53617faa43 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/helper/ProfileV2FragmentHelper.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/ProfileV2FragmentHelper.kt @@ -1,4 +1,11 @@ -package com.naviapp.personalloanrevamp.useridentificationv2.helper +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.navi.pl.dynamic.helper import android.content.Context import android.view.LayoutInflater @@ -135,4 +142,4 @@ object ProfileV2FragmentHelper { private fun isViewFilled(string: String, length: Int) = string.length == length -} \ No newline at end of file +} diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/helper/UserIdentificationV2Helper.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/UserIdentificationV2Helper.kt similarity index 52% rename from app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/helper/UserIdentificationV2Helper.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/UserIdentificationV2Helper.kt index eee618c2f1..6411a1a735 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/helper/UserIdentificationV2Helper.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/UserIdentificationV2Helper.kt @@ -5,36 +5,24 @@ * */ -package com.naviapp.personalloanrevamp.useridentificationv2.helper +package com.navi.pl.dynamic.helper import android.os.Bundle import androidx.fragment.app.Fragment -import com.naviapp.personalloanrevamp.intermediatev2.fragments.OfferInReviewFragment -import com.naviapp.personalloanrevamp.useridentificationv2.fragments.EmploymentOtpVerificationFragment -import com.naviapp.personalloanrevamp.useridentificationv2.fragments.EmploymentVerificationV2Fragment -import com.naviapp.personalloanrevamp.useridentificationv2.fragments.ProfileV2Fragment -import com.naviapp.personalloanrevamp.useridentificationv2.fragments.WorkV2Fragment +import com.navi.pl.dynamic.fragment.EmploymentOtpVerificationFragment +import com.navi.pl.dynamic.fragment.EmploymentVerificationV2Fragment +import com.navi.pl.dynamic.fragment.OfferInReviewFragment +import com.navi.pl.dynamic.fragment.ProfileV2Fragment +import com.navi.pl.dynamic.fragment.WorkV2Fragment object UserIdentificationV2Helper { const val BASIC_DETAILS_V2 = "BASIC_DETAILS_V2" private const val WORK_DETAILS_V2 = "WORK_DETAILS_V2" - const val EPFO_V2 = "EPFO_V2" - const val EPFO_OTP_VERIFICATION_V2 = "EPFO_OTP_VERIFICATION_V2" - private const val PERSONAL_LOAN_TRACKER = "PERSONAL_LOAN_TRACKER" + private const val EPFO_V2 = "EPFO_V2" + private const val EPFO_OTP_VERIFICATION_V2 = "EPFO_OTP_VERIFICATION_V2" const val OFFER_IN_REVIEW = "OFFER_IN_REVIEW" - fun getTag(screen: String): String { - return when (screen) { - BASIC_DETAILS_V2 -> ProfileV2Fragment.TAG - WORK_DETAILS_V2 -> WorkV2Fragment.TAG - EPFO_V2 -> EmploymentVerificationV2Fragment.TAG - EPFO_OTP_VERIFICATION_V2 -> EmploymentOtpVerificationFragment.TAG - OFFER_IN_REVIEW -> OfferInReviewFragment.TAG - else -> "" - } - } - fun getFragment(screen: String, bundle: Bundle? = null): Fragment? { return when (screen) { BASIC_DETAILS_V2 -> ProfileV2Fragment.getInstance(bundle) @@ -54,4 +42,4 @@ object UserIdentificationV2Helper { else -> "" } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/kyc/utils/VKycHelper.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/VKycHelper.kt similarity index 94% rename from app/src/main/java/com/naviapp/personalloanrevamp/kyc/utils/VKycHelper.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/VKycHelper.kt index f921ab864e..29f61f6f21 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/kyc/utils/VKycHelper.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/VKycHelper.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.kyc.utils +package com.navi.pl.dynamic.helper import android.app.Activity import android.content.Context @@ -17,9 +17,9 @@ import com.google.gson.Gson import com.navi.common.model.ModuleName import com.navi.design.font.FontWeightEnum import com.navi.design.utils.getFontStyle +import com.navi.pl.dynamic.fragment.VideoKycV2Fragment import com.navi.vkyc.presentation.activity.VKYCActivity import com.naviapp.BuildConfig -import com.naviapp.personalloanrevamp.kyc.fragment.VideoKycV2Fragment import com.naviapp.R class VKycHelper { diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/helper/WorkV2FragmentHelper.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/WorkV2FragmentHelper.kt similarity index 93% rename from app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/helper/WorkV2FragmentHelper.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/WorkV2FragmentHelper.kt index d0ea04e615..8028d4aae7 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/useridentificationv2/helper/WorkV2FragmentHelper.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/helper/WorkV2FragmentHelper.kt @@ -1,4 +1,11 @@ -package com.naviapp.personalloanrevamp.useridentificationv2.helper +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.navi.pl.dynamic.helper import com.navi.naviwidgets.widgets.TextInputUtil import com.navi.naviwidgets.widgets.fixedhinttextinput.InputTextFixedHintItemMeta @@ -54,4 +61,3 @@ object WorkV2FragmentHelper { ) } } - diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/kyc/listener/MultipleKycItemListeners.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/listener/MultipleKycItemListeners.kt similarity index 86% rename from app/src/main/java/com/naviapp/personalloanrevamp/kyc/listener/MultipleKycItemListeners.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/listener/MultipleKycItemListeners.kt index b75431dce6..6958dc1e7a 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/kyc/listener/MultipleKycItemListeners.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/listener/MultipleKycItemListeners.kt @@ -5,7 +5,7 @@ * */ -package com.naviapp.personalloanrevamp.kyc.listener +package com.navi.pl.dynamic.listener interface MultipleKycItemListeners { @@ -15,5 +15,4 @@ interface MultipleKycItemListeners { isPanVerified: Boolean? = false, vendor: String? = null ) - } diff --git a/app/src/main/java/com/naviapp/personalloanrevamp/kyc/listener/UpdateKycStateListener.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/listener/UpdateKycStateListener.kt similarity index 76% rename from app/src/main/java/com/naviapp/personalloanrevamp/kyc/listener/UpdateKycStateListener.kt rename to navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/listener/UpdateKycStateListener.kt index db107a7ced..e5ebdd6efe 100644 --- a/app/src/main/java/com/naviapp/personalloanrevamp/kyc/listener/UpdateKycStateListener.kt +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/listener/UpdateKycStateListener.kt @@ -1,11 +1,11 @@ /* * - * * Copyright © 2022 by Navi Technologies Limited + * * Copyright © 2022-2023 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ -package com.naviapp.personalloanrevamp.kyc.listener +package com.navi.pl.dynamic.listener import com.navi.common.network.models.GenericErrorResponse import com.naviapp.models.RedirectPageStatus diff --git a/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/util/BindingAdapterUtil.kt b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/util/BindingAdapterUtil.kt new file mode 100644 index 0000000000..526b588ff2 --- /dev/null +++ b/navi_pl_dynamic/src/main/java/com/navi/pl/dynamic/util/BindingAdapterUtil.kt @@ -0,0 +1,206 @@ +/* + * + * * Copyright © 2023 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.navi.pl.dynamic.util + +import android.view.LayoutInflater +import android.view.View +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.core.widget.TextViewCompat +import androidx.databinding.BindingAdapter +import androidx.databinding.DataBindingUtil +import com.navi.base.utils.orFalse +import com.navi.base.utils.orTrue +import com.navi.design.textview.NaviTextView +import com.navi.design.textview.model.TextWithStyle +import com.navi.design.utils.setSpannableString +import com.navi.naviwidgets.models.response.Footer +import com.navi.naviwidgets.utils.NaviWidgetIconUtils +import com.navi.naviwidgets.utils.setMargin +import com.navi.naviwidgets.widgets.textdisplay.Margin +import com.naviapp.R +import com.naviapp.common.customview.BoxInputGroup +import com.naviapp.common.customview.FooterViewV2 +import com.naviapp.common.customview.FooterViewWithTitleDescription +import com.naviapp.common.listeners.BindingDataListener +import com.naviapp.common.listeners.FooterWithDescriptionListener +import com.naviapp.common.listeners.Navigator +import com.naviapp.databinding.DividerViewBinding +import com.naviapp.databinding.StyledKeyValueViewBinding +import com.naviapp.models.CustomClickConfig +import com.naviapp.models.FooterWithTitleDescription +import com.naviapp.models.response.CurrentAddress +import com.naviapp.models.response.Header +import com.naviapp.personalloanrevamp.common.customview.HeaderDescriptionView +import com.naviapp.personalloanrevamp.models.StyledKeyValue +import com.naviapp.utils.IconUtils + +object BindingAdapterUtil { + @BindingAdapter( + "setFooterViewV2", + "setFooterListener", + "setCustomClickConfig", + requireAll = false + ) + @JvmStatic + fun setFooterViewV2( + footerViewV2: FooterViewV2, + footer: Footer?, + footerListener: FooterViewV2.FooterInteractionListener?, + customClickConfig: CustomClickConfig? + ) { + footerViewV2.setProperties(footer, footerListener, customClickConfig) + } + + @BindingAdapter("setHeaderDescriptionView") + @JvmStatic + fun setHeaderDescriptionView(headerDescriptionView: HeaderDescriptionView, header: Header?) { + headerDescriptionView.setProperties(header) + } + + @BindingAdapter("otpSize", "requestFocus", "onClickListener", requireAll = false) + @JvmStatic + fun otpSizeBoxInputGroup( + boxInputGroup: BoxInputGroup, + otpSize: Int?, + requestFocus: Boolean?, + onClickListener: View.OnClickListener? + ) { + otpSize?.let { boxInputGroup.setProperties(it, requestFocus.orTrue(), onClickListener) } + } + + @BindingAdapter( + "setFooterTitleDescriptionProperties", + "setFooterDescriptionListener", + requireAll = false + ) + @JvmStatic + fun setFooterTitleDescriptionProperties( + footerViewWithTitleDescription: FooterViewWithTitleDescription, + footerWithTitleDescription: FooterWithTitleDescription?, + footerWithDescriptionListener: FooterWithDescriptionListener? + ) { + footerViewWithTitleDescription.setProperties( + footerWithTitleDescription, + footerWithDescriptionListener + ) + } + + @BindingAdapter( + "setStyledKeyValueItems", + "setMargin", + "setDivider", + "setBindingDataListener", + "setTextStyle", + "keyStyle", + "valueStyle", + "setNavigator", + requireAll = false + ) + @JvmStatic + fun setStyledKeyValueItems( + linearLayout: LinearLayout, + styledKeyValues: List?, + margin: Margin?, + divider: Boolean?, + bindingDataListener: BindingDataListener?, + style: Int?, + keyStyle: Int?, + valueStyle: Int?, + navigator: Navigator? + ) { + linearLayout.removeAllViews() + styledKeyValues?.let { + it.forEachIndexed { index, styledKeyValue -> + val styledKeyValueView = + LayoutInflater.from(linearLayout.context) + .inflate(R.layout.styled_key_value_view, linearLayout, false) + styledKeyValueView.setMargin(margin) + val viewLoanDetailItemBinding: StyledKeyValueViewBinding? = + DataBindingUtil.bind(styledKeyValueView) + viewLoanDetailItemBinding?.styledKeyValueBinder = styledKeyValue + style?.let { + viewLoanDetailItemBinding?.let { + TextViewCompat.setTextAppearance( + viewLoanDetailItemBinding.styledKeyTv, + style + ) + TextViewCompat.setTextAppearance( + viewLoanDetailItemBinding.styledValueTv, + style + ) + } + } + keyStyle?.let { + viewLoanDetailItemBinding?.let { + TextViewCompat.setTextAppearance( + viewLoanDetailItemBinding.styledKeyTv, + keyStyle + ) + } + } + valueStyle?.let { + viewLoanDetailItemBinding?.let { + TextViewCompat.setTextAppearance( + viewLoanDetailItemBinding.styledValueTv, + valueStyle + ) + } + } + styledKeyValue.styledKey?.iconCode?.let { iconCode -> + viewLoanDetailItemBinding?.iconIv?.visibility = View.VISIBLE + viewLoanDetailItemBinding + ?.iconIv + ?.setImageResource(NaviWidgetIconUtils.getIconResourceId(iconCode)) + styledKeyValue.styledKey?.iconCta?.let { ctaData -> + viewLoanDetailItemBinding?.iconIv?.setOnClickListener { + navigator?.navigateTo(ctaData) + } + } + } + ?: run { viewLoanDetailItemBinding?.iconIv?.visibility = View.GONE } + linearLayout.addView(viewLoanDetailItemBinding?.root) + if (divider.orFalse()) { + if (index < it.size - 1) { + val dividerView = + LayoutInflater.from(linearLayout.context) + .inflate(R.layout.divider_view, linearLayout, false) + val dividerViewBinding: DividerViewBinding? = + DataBindingUtil.bind(dividerView) + linearLayout.addView(dividerViewBinding?.root) + } + } + } + bindingDataListener?.onDataLoadSuccess() + } + } + + @BindingAdapter("setCurrentAddress") + @JvmStatic + fun concatenateAddress(textView: TextView, currentAddress: CurrentAddress?) { + var address = "" + currentAddress?.houseNumber?.let { houseNumber -> address += houseNumber } + currentAddress?.street?.let { street -> address += ", $street" } + currentAddress?.locality?.let { locality -> address += ", $locality" } + currentAddress?.pinCode?.let { pinCode -> address += ", $pinCode" } + currentAddress?.city?.let { city -> address += ", $city" } + currentAddress?.state?.let { state -> address += ", $state" } + textView.text = address + } + + @BindingAdapter("setImageFromIconCode") + @JvmStatic + fun setImageFromIconCode(imageView: ImageView, iconCode: String?) { + iconCode?.let { + imageView.visibility = View.VISIBLE + IconUtils.updateIcon(it, imageView) + } + ?: run { imageView.visibility = View.GONE } + } +} diff --git a/navi_pl_dynamic/src/main/res/drawable/bg_border_1_e3e5e5.xml b/navi_pl_dynamic/src/main/res/drawable/bg_border_1_e3e5e5.xml new file mode 100644 index 0000000000..c26880eb64 --- /dev/null +++ b/navi_pl_dynamic/src/main/res/drawable/bg_border_1_e3e5e5.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/navi_pl_dynamic/src/main/res/drawable/bg_border_orange_rounded_8.xml b/navi_pl_dynamic/src/main/res/drawable/bg_border_orange_rounded_8.xml new file mode 100644 index 0000000000..6fe04e0e83 --- /dev/null +++ b/navi_pl_dynamic/src/main/res/drawable/bg_border_orange_rounded_8.xml @@ -0,0 +1,15 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_error_screen_v2.xml b/navi_pl_dynamic/src/main/res/layout/pl_activity_error_screen_v2.xml similarity index 100% rename from app/src/main/res/layout/activity_error_screen_v2.xml rename to navi_pl_dynamic/src/main/res/layout/pl_activity_error_screen_v2.xml diff --git a/app/src/main/res/layout/activity_get_loan_v2.xml b/navi_pl_dynamic/src/main/res/layout/pl_activity_get_loan_v2.xml similarity index 98% rename from app/src/main/res/layout/activity_get_loan_v2.xml rename to navi_pl_dynamic/src/main/res/layout/pl_activity_get_loan_v2.xml index 039d66417b..9909aaca18 100644 --- a/app/src/main/res/layout/activity_get_loan_v2.xml +++ b/navi_pl_dynamic/src/main/res/layout/pl_activity_get_loan_v2.xml @@ -91,7 +91,7 @@ + layout="@layout/pl_layout_notification_header" /> + + + @@ -27,7 +35,7 @@ android:layout_height="@dimen/layout_dp_0" android:layout_marginTop="@dimen/layout_dp_8" android:layout_marginBottom="@dimen/layout_dp_16" - app:layout_constraintBottom_toTopOf="@id/next_btn" + app:layout_constraintBottom_toTopOf="@id/checkbox_ll" app:layout_constraintTop_toTopOf="parent"> - + + + + + + + - + - + + + + + + + + - + diff --git a/app/src/main/res/layout/activity_user_identification_v2.xml b/navi_pl_dynamic/src/main/res/layout/pl_activity_user_identification_v2.xml similarity index 100% rename from app/src/main/res/layout/activity_user_identification_v2.xml rename to navi_pl_dynamic/src/main/res/layout/pl_activity_user_identification_v2.xml diff --git a/app/src/main/res/layout/bank_statement_v2_layout.xml b/navi_pl_dynamic/src/main/res/layout/pl_fragment_bank_statement_v2.xml similarity index 100% rename from app/src/main/res/layout/bank_statement_v2_layout.xml rename to navi_pl_dynamic/src/main/res/layout/pl_fragment_bank_statement_v2.xml diff --git a/app/src/main/res/layout/delayed_disbursement_v2_layout.xml b/navi_pl_dynamic/src/main/res/layout/pl_fragment_delayed_disbursement_v2.xml similarity index 100% rename from app/src/main/res/layout/delayed_disbursement_v2_layout.xml rename to navi_pl_dynamic/src/main/res/layout/pl_fragment_delayed_disbursement_v2.xml diff --git a/app/src/main/res/layout/effective_interest_cost_v2_fragment.xml b/navi_pl_dynamic/src/main/res/layout/pl_fragment_effective_interest_cost_v2.xml similarity index 99% rename from app/src/main/res/layout/effective_interest_cost_v2_fragment.xml rename to navi_pl_dynamic/src/main/res/layout/pl_fragment_effective_interest_cost_v2.xml index 670efce651..3612dea0cf 100644 --- a/app/src/main/res/layout/effective_interest_cost_v2_fragment.xml +++ b/navi_pl_dynamic/src/main/res/layout/pl_fragment_effective_interest_cost_v2.xml @@ -240,7 +240,7 @@ + layout="@layout/pl_layout_important_note" /> + layout="@layout/pl_layout_transfer_bottomsheet" /> @@ -148,7 +148,7 @@ + layout="@layout/pl_layout_banner_with_tip_and_title" /> diff --git a/app/src/main/res/layout/fragment_kyc_address_proof_v2.xml b/navi_pl_dynamic/src/main/res/layout/pl_fragment_kyc_address_proof_v2.xml similarity index 97% rename from app/src/main/res/layout/fragment_kyc_address_proof_v2.xml rename to navi_pl_dynamic/src/main/res/layout/pl_fragment_kyc_address_proof_v2.xml index 643195a75b..83e95b2777 100644 --- a/app/src/main/res/layout/fragment_kyc_address_proof_v2.xml +++ b/navi_pl_dynamic/src/main/res/layout/pl_fragment_kyc_address_proof_v2.xml @@ -44,7 +44,7 @@ diff --git a/navi_pl_dynamic/src/main/res/layout/pl_fragment_kyc_document_list_v2.xml b/navi_pl_dynamic/src/main/res/layout/pl_fragment_kyc_document_list_v2.xml new file mode 100644 index 0000000000..fbb66768cd --- /dev/null +++ b/navi_pl_dynamic/src/main/res/layout/pl_fragment_kyc_document_list_v2.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/kyc_fragmentt_v2.xml b/navi_pl_dynamic/src/main/res/layout/pl_fragment_kyc_v2.xml similarity index 98% rename from app/src/main/res/layout/kyc_fragmentt_v2.xml rename to navi_pl_dynamic/src/main/res/layout/pl_fragment_kyc_v2.xml index 44132e4642..38fcd1c80d 100644 --- a/app/src/main/res/layout/kyc_fragmentt_v2.xml +++ b/navi_pl_dynamic/src/main/res/layout/pl_fragment_kyc_v2.xml @@ -82,7 +82,7 @@ diff --git a/app/src/main/res/layout/loan_details_v2_fragment.xml b/navi_pl_dynamic/src/main/res/layout/pl_fragment_loan_details_v2.xml similarity index 97% rename from app/src/main/res/layout/loan_details_v2_fragment.xml rename to navi_pl_dynamic/src/main/res/layout/pl_fragment_loan_details_v2.xml index f07e1c32e6..8edcc42679 100644 --- a/app/src/main/res/layout/loan_details_v2_fragment.xml +++ b/navi_pl_dynamic/src/main/res/layout/pl_fragment_loan_details_v2.xml @@ -36,7 +36,7 @@ + layout="@layout/pl_layout_transfer_bottomsheet" /> @@ -154,7 +154,7 @@ diff --git a/app/src/main/res/layout/work_details_v2_fragment.xml b/navi_pl_dynamic/src/main/res/layout/pl_fragment_work_v2.xml similarity index 100% rename from app/src/main/res/layout/work_details_v2_fragment.xml rename to navi_pl_dynamic/src/main/res/layout/pl_fragment_work_v2.xml diff --git a/app/src/main/res/layout/address_radio_button_v2.xml b/navi_pl_dynamic/src/main/res/layout/pl_layout_address_radio_button_v2.xml similarity index 100% rename from app/src/main/res/layout/address_radio_button_v2.xml rename to navi_pl_dynamic/src/main/res/layout/pl_layout_address_radio_button_v2.xml diff --git a/app/src/main/res/layout/address_status_layout_v2.xml b/navi_pl_dynamic/src/main/res/layout/pl_layout_address_status_v2.xml similarity index 96% rename from app/src/main/res/layout/address_status_layout_v2.xml rename to navi_pl_dynamic/src/main/res/layout/pl_layout_address_status_v2.xml index 71c5f84924..004fe99236 100644 --- a/app/src/main/res/layout/address_status_layout_v2.xml +++ b/navi_pl_dynamic/src/main/res/layout/pl_layout_address_status_v2.xml @@ -34,7 +34,7 @@ tools:itemCount="@integer/integer_2" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:layout_constraintStart_toStartOf="parent" - tools:listitem="@layout/address_radio_button_v2" + tools:listitem="@layout/pl_layout_address_radio_button_v2" app:layout_constraintTop_toBottomOf="@+id/tv_fetched_from_records" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navi_pl_dynamic/src/main/res/layout/pl_layout_effective_interest_cost_calculation_card_item.xml b/navi_pl_dynamic/src/main/res/layout/pl_layout_effective_interest_cost_calculation_card_item.xml new file mode 100644 index 0000000000..03c7a56504 --- /dev/null +++ b/navi_pl_dynamic/src/main/res/layout/pl_layout_effective_interest_cost_calculation_card_item.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/layout_footer_timed_banner.xml b/navi_pl_dynamic/src/main/res/layout/pl_layout_footer_timed_banner.xml similarity index 100% rename from app/src/main/res/layout/layout_footer_timed_banner.xml rename to navi_pl_dynamic/src/main/res/layout/pl_layout_footer_timed_banner.xml diff --git a/app/src/main/res/layout/layout_header_timed_banner.xml b/navi_pl_dynamic/src/main/res/layout/pl_layout_header_timed_banner.xml similarity index 100% rename from app/src/main/res/layout/layout_header_timed_banner.xml rename to navi_pl_dynamic/src/main/res/layout/pl_layout_header_timed_banner.xml diff --git a/navi_pl_dynamic/src/main/res/layout/pl_layout_important_note.xml b/navi_pl_dynamic/src/main/res/layout/pl_layout_important_note.xml new file mode 100644 index 0000000000..3fb7b61754 --- /dev/null +++ b/navi_pl_dynamic/src/main/res/layout/pl_layout_important_note.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_loan_feature.xml b/navi_pl_dynamic/src/main/res/layout/pl_layout_item_loan_feature.xml similarity index 100% rename from app/src/main/res/layout/item_loan_feature.xml rename to navi_pl_dynamic/src/main/res/layout/pl_layout_item_loan_feature.xml diff --git a/app/src/main/res/layout/kyc_address_layout_v2.xml b/navi_pl_dynamic/src/main/res/layout/pl_layout_kyc_address_v2.xml similarity index 100% rename from app/src/main/res/layout/kyc_address_layout_v2.xml rename to navi_pl_dynamic/src/main/res/layout/pl_layout_kyc_address_v2.xml diff --git a/app/src/main/res/layout/kyc_failed_layout.xml b/navi_pl_dynamic/src/main/res/layout/pl_layout_kyc_failed.xml similarity index 100% rename from app/src/main/res/layout/kyc_failed_layout.xml rename to navi_pl_dynamic/src/main/res/layout/pl_layout_kyc_failed.xml diff --git a/app/src/main/res/layout/loan_summary_emi_layout.xml b/navi_pl_dynamic/src/main/res/layout/pl_layout_loan_summary_emi.xml similarity index 92% rename from app/src/main/res/layout/loan_summary_emi_layout.xml rename to navi_pl_dynamic/src/main/res/layout/pl_layout_loan_summary_emi.xml index 98b638b3ac..24c08831ae 100644 --- a/app/src/main/res/layout/loan_summary_emi_layout.xml +++ b/navi_pl_dynamic/src/main/res/layout/pl_layout_loan_summary_emi.xml @@ -25,7 +25,7 @@ @@ -40,7 +40,7 @@ @@ -55,7 +55,7 @@ diff --git a/navi_pl_dynamic/src/main/res/layout/pl_layout_notification_header.xml b/navi_pl_dynamic/src/main/res/layout/pl_layout_notification_header.xml new file mode 100644 index 0000000000..bb682b1534 --- /dev/null +++ b/navi_pl_dynamic/src/main/res/layout/pl_layout_notification_header.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/title_with_description_view.xml b/navi_pl_dynamic/src/main/res/layout/pl_layout_title_with_description_view.xml similarity index 100% rename from app/src/main/res/layout/title_with_description_view.xml rename to navi_pl_dynamic/src/main/res/layout/pl_layout_title_with_description_view.xml diff --git a/app/src/main/res/layout/tracker_screen_layout.xml b/navi_pl_dynamic/src/main/res/layout/pl_layout_tracker_screen.xml similarity index 100% rename from app/src/main/res/layout/tracker_screen_layout.xml rename to navi_pl_dynamic/src/main/res/layout/pl_layout_tracker_screen.xml diff --git a/app/src/main/res/layout/transfer_bottomsheet_view.xml b/navi_pl_dynamic/src/main/res/layout/pl_layout_transfer_bottomsheet.xml similarity index 100% rename from app/src/main/res/layout/transfer_bottomsheet_view.xml rename to navi_pl_dynamic/src/main/res/layout/pl_layout_transfer_bottomsheet.xml diff --git a/app/src/main/res/layout/layout_try_again_after.xml b/navi_pl_dynamic/src/main/res/layout/pl_layout_try_again_after.xml similarity index 100% rename from app/src/main/res/layout/layout_try_again_after.xml rename to navi_pl_dynamic/src/main/res/layout/pl_layout_try_again_after.xml diff --git a/navi_pl_dynamic/src/main/res/values/strings.xml b/navi_pl_dynamic/src/main/res/values/strings.xml new file mode 100644 index 0000000000..8786303648 --- /dev/null +++ b/navi_pl_dynamic/src/main/res/values/strings.xml @@ -0,0 +1,12 @@ + + + + + + +91 %1$s + diff --git a/navi-pl/src/test/java/com/navi/pl/ExampleUnitTest.kt b/navi_pl_dynamic/src/test/java/com/navi/pl/dynamic/ExampleUnitTest.kt similarity index 74% rename from navi-pl/src/test/java/com/navi/pl/ExampleUnitTest.kt rename to navi_pl_dynamic/src/test/java/com/navi/pl/dynamic/ExampleUnitTest.kt index 5d5ba1dd1a..240887d0d5 100644 --- a/navi-pl/src/test/java/com/navi/pl/ExampleUnitTest.kt +++ b/navi_pl_dynamic/src/test/java/com/navi/pl/dynamic/ExampleUnitTest.kt @@ -1,13 +1,13 @@ /* * - * * Copyright © 2019-2023 by Navi Technologies Limited + * * Copyright © 2023 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ -package com.navi.pl +package com.navi.pl.dynamic -import org.junit.Assert.* +import org.junit.Assert.assertEquals import org.junit.Test /** diff --git a/settings.gradle b/settings.gradle index 9340d59704..de901ee888 100644 --- a/settings.gradle +++ b/settings.gradle @@ -27,5 +27,5 @@ buildCache { } include ':navi-base' include ':navi-hl' -include ':navi-pl' include ':navi-payment' +include ':navi_pl_dynamic'