diff --git a/android/navi-hl/src/main/res/layout/fragment_home_loan_form_search.xml b/android/navi-hl/src/main/res/layout/fragment_home_loan_form_search.xml index 310acfc25b..4da975483a 100644 --- a/android/navi-hl/src/main/res/layout/fragment_home_loan_form_search.xml +++ b/android/navi-hl/src/main/res/layout/fragment_home_loan_form_search.xml @@ -18,12 +18,35 @@ android:layout_width="@dimen/dp_0" android:layout_height="wrap_content" android:paddingStart="@dimen/dp_16" - android:paddingTop="@dimen/dp_24" + android:paddingTop="@dimen/dp_16" android:paddingEnd="@dimen/dp_16" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + + + + + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> diff --git a/android/navi-widgets/src/main/java/com/navi/naviwidgets/utils/Utils.kt b/android/navi-widgets/src/main/java/com/navi/naviwidgets/utils/Utils.kt index 60dc1c4b73..079827884a 100644 --- a/android/navi-widgets/src/main/java/com/navi/naviwidgets/utils/Utils.kt +++ b/android/navi-widgets/src/main/java/com/navi/naviwidgets/utils/Utils.kt @@ -8,6 +8,7 @@ package com.navi.naviwidgets.utils import android.animation.Animator +import android.app.Activity import android.content.Context import android.content.res.ColorStateList import android.graphics.Color @@ -15,6 +16,8 @@ import android.graphics.drawable.Drawable import android.graphics.drawable.GradientDrawable import android.os.Build import android.os.CountDownTimer +import android.os.Handler +import android.os.Looper import android.text.InputFilter import android.text.Spanned import android.util.TypedValue @@ -22,6 +25,8 @@ import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.inputmethod.InputMethodManager +import android.widget.EditText import android.widget.FrameLayout import android.widget.ImageView import android.widget.LinearLayout @@ -1199,3 +1204,22 @@ fun LinearLayout.setItemsData(items: List?) { addView(binding?.root) } } + +fun EditText.openKeyboard(context: Context, delay: Long = 100) { + try { + Handler(Looper.getMainLooper()) + .postDelayed( + { + requestFocus() + setSelection(length()) + (context.getSystemService(Activity.INPUT_METHOD_SERVICE) as? InputMethodManager) + ?.apply { + showSoftInput(this@openKeyboard, InputMethodManager.SHOW_IMPLICIT) + } + }, + delay + ) + } catch (e: Exception) { + e.log() + } +} diff --git a/android/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/labeledinputsearch/ui/LabeledTextSearchInputWidget.kt b/android/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/labeledinputsearch/ui/LabeledTextSearchInputWidget.kt index 021203c6dd..af96f1f747 100644 --- a/android/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/labeledinputsearch/ui/LabeledTextSearchInputWidget.kt +++ b/android/navi-widgets/src/main/java/com/navi/naviwidgets/widgets/labeledinputsearch/ui/LabeledTextSearchInputWidget.kt @@ -29,6 +29,7 @@ import com.navi.naviwidgets.databinding.ViewLabeledTextInputBinding import com.navi.naviwidgets.extensions.setMaxCharLength import com.navi.naviwidgets.utils.EMPTY import com.navi.naviwidgets.utils.NaviWidgetIconUtils +import com.navi.naviwidgets.utils.openKeyboard import com.navi.naviwidgets.validations.BaseInputValidation import com.navi.naviwidgets.widgets.TextInputUtil import com.navi.naviwidgets.widgets.labeledinputsearch.InputSearchClickAction @@ -123,6 +124,7 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 widgetModel.inputData = it widgetBinding.plainTextInput.setText(it) } + widgetBinding.crossIv.isVisible = true } ?: run { widgetModel.inputData = null @@ -142,6 +144,11 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 } } + fun enableTyping() { + widgetBinding.plainTextInput.requestFocus() + widgetBinding.plainTextInput.openKeyboard(context) + } + private fun updateSearchIcon(iconCode: String?) { if (iconCode.isNullOrEmpty().not()) { val icon = NaviWidgetIconUtils.getIconResourceId(iconCode.orEmpty()) @@ -212,7 +219,10 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 fun showCrossIcon(show: Boolean) { widgetBinding.crossIv.isVisible = show && shouldShowCrossIcon && widgetModel.inputData.isNotNullAndNotEmpty() - widgetBinding.crossIv.setOnClickListener { setText(EMPTY, false) } + widgetBinding.crossIv.setOnClickListener { + setText(EMPTY, false) + widgetBinding.crossIv.isVisible = false + } widgetBinding.plainTextInput.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0) } } diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/common/ui/activity/HomeLoanBaseActivity.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/common/ui/activity/HomeLoanBaseActivity.kt index d1a6937d35..6db00bbdf9 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/common/ui/activity/HomeLoanBaseActivity.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/common/ui/activity/HomeLoanBaseActivity.kt @@ -218,7 +218,7 @@ abstract class HomeLoanBaseActivity : BaseActivity(), Navigator { override fun navigateTo(ctaData: CtaData?, finish: Boolean) { analyticsEventTracker.onHLCtaClicked(ctaData) - val path = (ctaData?.url ?: "").split("/") + val path = (ctaData?.url)?.split("/") ?: emptyList() if (path.isNotEmpty()) { addCtaParamsToQueryMap(ctaData?.parameters?.toMutableList()) if (screenNameForNavigation == path.getOrNull(1)) { diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFormScreenFragment.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFormScreenFragment.kt index c671349844..7865a0199e 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFormScreenFragment.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFormScreenFragment.kt @@ -72,6 +72,7 @@ import com.navi.hl.utils.Constants.FLAT import com.navi.hl.utils.Constants.HIDE import com.navi.hl.utils.Constants.ID_PROPERTY_ID import com.navi.hl.utils.Constants.NOT_DECIDED +import com.navi.hl.utils.Constants.OTHER import com.navi.hl.utils.Constants.PAN_VERIFICATION_BOTTOM_SHEET import com.navi.hl.utils.Constants.PAN_VERIFICATION_REQUEST_CODE import com.navi.hl.utils.Constants.PIN_CODE_WIDGET_ID @@ -243,7 +244,7 @@ class HomeLoanFormScreenFragment : } private fun enableNextCtaForCitySelection(widgetId: String) { - if (selectedCity.isNotEmpty()) { + if (selectedCity.isNotEmpty() && selectedCity != OTHER) { binding.footerView.enableNextCta(true) citySelectionMap.clear() citySelectionMap[widgetId] = selectedCity @@ -1057,6 +1058,7 @@ class HomeLoanFormScreenFragment : is NaviBenefitsItemClick -> { selectedCity = naviClickAction.itemDescription ?: EMPTY enableNextCtaForCitySelection(widgetId ?: CITY_WIDGET_ID) + moveToNextScreen(naviClickAction.ctaData) } is TileOptionClickAction -> { latestPropertyTypeSelected = naviClickAction.selectedOptionId diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFormSearchFragment.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFormSearchFragment.kt index 5af28e0db6..e626829a25 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFormSearchFragment.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanFormSearchFragment.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2022-2023 by Navi Technologies Limited + * * Copyright © 2022-2024 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -24,6 +24,7 @@ import com.navi.base.model.CtaData import com.navi.base.model.NaviClickAction import com.navi.base.model.ValueWidgetClickAction import com.navi.base.utils.isNotNullAndNotEmpty +import com.navi.hl.common.adapter.HLFormScreenAdapter import com.navi.hl.common.adapter.PagerLoadingAdapter import com.navi.hl.common.ui.activity.HomeLoanBaseActivity import com.navi.hl.common.ui.fragment.HomeLoanBaseFragment @@ -33,9 +34,9 @@ import com.navi.hl.steps.viewmodel.SharedFormSearchVM import com.navi.hl.utils.Constants import com.navi.hl.utils.Constants.ACTION import com.navi.hl.utils.NaviHLAnalytics +import com.navi.hl.utils.NaviHLAnalytics.Companion.PRE_APPROVED_CITY_SELECTION_ACTION import com.navi.hl.utils.observeNonNull import com.navi.hl.utils.observeNullable -import com.navi.homeloan.common.customview.HLCommonBottomSheet import com.navi.homeloan.common.customview.HLTopNavigationHeaderInterface import com.navi.homeloan.common.listeners.BackListener import com.navi.homeloan.common.listeners.HLFooterListener @@ -45,6 +46,7 @@ import com.navi.homeloan.databinding.FragmentHomeLoanFormSearchBinding import com.navi.naviwidgets.adapters.BasePagingRVAdapter import com.navi.naviwidgets.callbacks.WidgetCallback import com.navi.naviwidgets.models.NaviBaseAdapterModel +import com.navi.naviwidgets.models.NaviWidget import com.navi.naviwidgets.viewholder.ViewHolderFactoryImpl import com.navi.naviwidgets.widgets.labeledinputsearch.InputSearchClickAction import com.navi.naviwidgets.widgets.labeledinputsearch.LabeledTextInputSearchWidgetModel @@ -58,6 +60,8 @@ class HomeLoanFormSearchFragment : private val analyticsEventTracker = NaviHLAnalytics.naviHLAnalytics.HomeLoanFormScreen() private val viewModel by viewModels() private var listener: HLTopNavigationHeaderInterface? = null + private var screenWidgets: List = listOf() + private var formAdapter: HLFormScreenAdapter? = null private val sharedFormSearchVM by lazy { ViewModelProvider(requireActivity()).get(SharedFormSearchVM::class.java) } @@ -182,12 +186,12 @@ class HomeLoanFormSearchFragment : viewModel.cityUnServiceableResponse.observeNonNull(viewLifecycleOwner) { hideLoader() it?.let { - analyticsEventTracker.onUnServiceableCityBsShown( - queryMap[ACTION], + analyticsEventTracker.onPreApprovedCitySelection( + PRE_APPROVED_CITY_SELECTION_ACTION, viewModel.selectedItemValue ) - val bottomSheet = HLCommonBottomSheet.getInstance(it) - safelyShowBottomSheet(bottomSheet, HLCommonBottomSheet.TAG) + binding.footerView.enableNextCta(false) + binding.formContentRv.visibility = View.VISIBLE } } @@ -199,10 +203,21 @@ class HomeLoanFormSearchFragment : } private fun processFormContent(formContent: HomeLoanFormScreenContent) { + formContent.widgets + ?.filterNot { it.widgetId == Constants.CITY_INPUT_WIDGET } + .let { screenWidgets = it.orEmpty() } + formAdapter = HLFormScreenAdapter(screenWidgets, this) + binding.formContentRv.layoutManager = LinearLayoutManager(requireContext()) + binding.formContentRv.adapter = formAdapter formContent.widgets?.filterIsInstance()?.first()?.let { it.enableOnlyClick = true binding.searchWidget.updateData(it, 0, this@HomeLoanFormSearchFragment) if (it.widgetData?.inputTextSearchItemData?.savedText.isNotNullAndNotEmpty()) { + binding.searchWidget.shouldShowCrossIcon = true + binding.searchWidget.showCrossIcon(true) + binding.searchContentRv.visibility = View.GONE + } + if (it.widgetData?.inputTextSearchItemData?.savedText.isNullOrEmpty()) { binding.searchContentRv.visibility = View.GONE } lifecycleScope.launch { @@ -236,6 +251,8 @@ class HomeLoanFormSearchFragment : binding.searchContentRv.visibility = View.GONE } is InputSearchClickAction -> { + binding.formContentRv.visibility = View.GONE + binding.footerView.enableNextCta(true) analyticsEventTracker.onFormWidgetClick( queryMap[ACTION], naviClickAction.widgetId, diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanSearchFragment.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanSearchFragment.kt index bb1315c90d..f641ad348c 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanSearchFragment.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/fragment/HomeLoanSearchFragment.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2022-2023 by Navi Technologies Limited + * * Copyright © 2022-2024 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -119,6 +119,7 @@ class HomeLoanSearchFragment : HomeLoanBaseFragment(), WidgetCallback, BackListe val searchApiUrl = searchApiDetails?.url?.trimStart('/') searchType = searchApiDetails?.searchType ?: TYPE_PROPERTY_SEARCH val data = sharedFormSearchVM.inputSearchWidgetModel + data?.enableOnlyClick = false if (data is LabeledTextInputSearchWidgetModel) { NaviTrackEvent.startScreen( screenName.plus(NaviHLAnalytics.POST_FIX_LANDED), @@ -158,6 +159,7 @@ class HomeLoanSearchFragment : HomeLoanBaseFragment(), WidgetCallback, BackListe } } } + binding.searchWidget.enableTyping() } private fun showScreenLoader() { diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanFormScreenRepository.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanFormScreenRepository.kt index 02ed97d291..beae07c303 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanFormScreenRepository.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanFormScreenRepository.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2022-2023 by Navi Technologies Limited + * * Copyright © 2022-2024 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanFormSearchRepository.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanFormSearchRepository.kt index 64a25dcd0f..6cb3a66cf9 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanFormSearchRepository.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/repository/HomeLoanFormSearchRepository.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2022-2023 by Navi Technologies Limited + * * Copyright © 2022-2024 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanFormSearchFragmentVM.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanFormSearchFragmentVM.kt index d4853b5ff1..d5b6e0b575 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanFormSearchFragmentVM.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/steps/viewmodel/HomeLoanFormSearchFragmentVM.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2022-2023 by Navi Technologies Limited + * * Copyright © 2022-2024 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/Constants.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/Constants.kt index bc7e2f6872..c4ac40f3c2 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/Constants.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/Constants.kt @@ -134,4 +134,6 @@ object Constants { const val FS_LOTTIE = "FS_LOTTIE" const val CIRCULAR_LOADER = "CIRCULAR_LOADER" const val CTA_REDIRECTION_ENABLED = "CTA_REDIRECTION_ENABLED" + const val CITY_INPUT_WIDGET = "city" + const val OTHER = "Other" } diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/HLEnumConstants.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/HLEnumConstants.kt index eb5e8fdc8c..9959bc46f4 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/HLEnumConstants.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/HLEnumConstants.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2023 by Navi Technologies Limited + * * Copyright © 2023-2024 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -8,8 +8,7 @@ package com.navi.hl.utils enum class HlAction { - PERSONAL_DETAILS, - EMPLOYMENT_DETAILS, PROPERTY_CITY, - PROPERTY_DETAILS + PROPERTY_DETAILS, + UNSERVICEABLE_PROPERTY_CITY } diff --git a/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/NaviHLAnalytics.kt b/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/NaviHLAnalytics.kt index a0752b7407..1be105aa37 100644 --- a/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/NaviHLAnalytics.kt +++ b/android/navi_hl_dynamic/src/main/java/com/navi/hl/utils/NaviHLAnalytics.kt @@ -150,6 +150,13 @@ class NaviHLAnalytics private constructor() { bodyMap ) } + + fun onPreApprovedCitySelection(action: String?, city: String?) { + NaviTrackEvent.trackEventOnClickStream( + PRE_FIX_NEW_HL.plus(action).plus("_City_Selected"), + mapOf(Pair("city", city.orEmpty())) + ) + } } inner class HomeLoanLoader { @@ -469,6 +476,7 @@ class NaviHLAnalytics private constructor() { const val PRE_FIX_NEW_HL = "New_HL_" const val UNDERSCORE_LOADER_PAGE = "_Loader_Page" const val POST_FIX_APPLICANTS_LANDED = "_Applicants_Landed" + const val PRE_APPROVED_CITY_SELECTION_ACTION = "Pre_Approved" const val YES = "yes" const val NO = "no" val naviHLAnalytics: NaviHLAnalytics by lazy { Holder.INSTANCE }