From 1ff750ff280a02384f1d5c1be875ec4910c34653 Mon Sep 17 00:00:00 2001 From: A Shrihari Raju Date: Thu, 6 Mar 2025 16:21:10 +0530 Subject: [PATCH] NTP-38165 | Quick filter functionality for fund listing v4 (#15286) --- .../fragments/FundListingFragmentV2.kt | 81 ++++++++++++++++++- .../com/navi/amc/fundbuy/models/ChipData.kt | 1 + .../fundbuy/viewmodel/FundListViewModel.kt | 6 ++ .../fundbuy/views/HorizontalChipGroupView.kt | 4 +- .../java/com/navi/amc/utils/AmcAnalytics.kt | 3 + 5 files changed, 89 insertions(+), 6 deletions(-) diff --git a/android/navi-amc/src/main/java/com/navi/amc/fundbuy/fragments/FundListingFragmentV2.kt b/android/navi-amc/src/main/java/com/navi/amc/fundbuy/fragments/FundListingFragmentV2.kt index f63dc12222..8e95ea90ab 100644 --- a/android/navi-amc/src/main/java/com/navi/amc/fundbuy/fragments/FundListingFragmentV2.kt +++ b/android/navi-amc/src/main/java/com/navi/amc/fundbuy/fragments/FundListingFragmentV2.kt @@ -334,16 +334,26 @@ class FundListingFragmentV2 : AmcBaseFragment(), WidgetCallback { ) } if (selectedItems.isNotNullAndNotEmpty()) { - selectedItems?.let { addFilterDataChips(it, isQuickFilter = false) } - if (viewModel.isEligibleForThemeChange == true) { - binding.filter.filterTitle.visibility = View.GONE + if (viewModel.isQuickFilterEnabled) { + viewModel.quickFilters?.let { + binding.filter.quickFilterTitle.setSpannableString(it.title) + it.suggestedItems?.let { it1 -> + addQuickFilterChips(it1, isQuickFilter = true) + } + } + } else { + selectedItems?.let { addFilterDataChips(it, isQuickFilter = false) } binding.filter.quickFilterTitle.visibility = View.GONE } + if (viewModel.isEligibleForThemeChange == true) { + binding.filter.filterTitle.visibility = View.GONE + } } else { + viewModel.isQuickFilterEnabled = true viewModel.quickFilters?.let { binding.filter.quickFilterTitle.setSpannableString(it.title) it.suggestedItems?.let { quickFilters -> - addFilterDataChips(quickFilters, isQuickFilter = true) + addQuickFilterChips(quickFilters, isQuickFilter = true) } } } @@ -439,6 +449,7 @@ class FundListingFragmentV2 : AmcBaseFragment(), WidgetCallback { ), ), key = it.value, + isSelected = viewModel.isFilterAlreadyApplied(it.value), ) } binding.filter.chips.apply { @@ -455,6 +466,63 @@ class FundListingFragmentV2 : AmcBaseFragment(), WidgetCallback { if (viewModel.isEligibleForThemeChange != true) list.isNotEmpty() else false } + private fun addQuickFilterChips( + quickFilterList: List, + isQuickFilter: Boolean = false, + ) { + val chipUiData = + quickFilterList.map { + ChipData( + borderColor = PURPLE, + title = + TextWithStyle( + text = it.value, + style = + listOf( + NaviSpan( + fontSize = 14.0, + fontName = FontWeightEnum.NAVI_HEADLINE_REGULAR.name, + spanColor = PURPLE, + ) + ), + ), + key = it.value, + isSelected = viewModel.isFilterAlreadyApplied(it.value), + ) + } + binding.filter.chips.apply { + visibility = View.VISIBLE + setProperties( + chipUiData, + { key -> + if (viewModel.isFilterAlreadyApplied(key)) { + sendEvent( + AmcAnalytics.AMC_QUICK_FILTER_TAG_TAGGED, + hashMapOf( + Pair(AmcAnalytics.SCREEN_NAME, screenName), + Pair(AmcAnalytics.TYPE, "remove"), + Pair(FUND_CATEGORY, key), + ), + ) + removeFilterDataKey(key) + } else { + sendEvent( + AmcAnalytics.AMC_QUICK_FILTER_TAG_TAGGED, + hashMapOf( + Pair(AmcAnalytics.SCREEN_NAME, screenName), + Pair(AmcAnalytics.TYPE, "add"), + Pair(FUND_CATEGORY, key), + ), + ) + addFilterDataKey(key) + } + }, + isQuickFilter, + ) + } + quickFilterList.let {} + } + private fun removeFilterDataKey(key: String) { viewModel.removeFilterKey(key) } @@ -537,6 +605,10 @@ class FundListingFragmentV2 : AmcBaseFragment(), WidgetCallback { strokeWidth = dpToPxInInt(1), ) } else { + sendEvent( + AmcAnalytics.AMC_FUND_SEARCH_CLICKED, + hashMapOf(Pair(AmcAnalytics.SCREEN_NAME, screenName)), + ) binding.filter.searchField.background = getNaviDrawable( backgroundColor = WHITE.parseColorSafe(), @@ -648,6 +720,7 @@ class FundListingFragmentV2 : AmcBaseFragment(), WidgetCallback { } private fun setFilterItemList(list: List) { + viewModel.isQuickFilterEnabled = false viewModel.setSelectedFilterItems(list, screenName) } diff --git a/android/navi-amc/src/main/java/com/navi/amc/fundbuy/models/ChipData.kt b/android/navi-amc/src/main/java/com/navi/amc/fundbuy/models/ChipData.kt index dfa0d0052e..b197279afc 100644 --- a/android/navi-amc/src/main/java/com/navi/amc/fundbuy/models/ChipData.kt +++ b/android/navi-amc/src/main/java/com/navi/amc/fundbuy/models/ChipData.kt @@ -14,4 +14,5 @@ data class ChipData( @SerializedName("title") val title: TextWithStyle? = null, @SerializedName("borderColor") val borderColor: String? = null, @SerializedName("key") val key: String? = null, + @SerializedName("isSelected") var isSelected: Boolean = true, ) diff --git a/android/navi-amc/src/main/java/com/navi/amc/fundbuy/viewmodel/FundListViewModel.kt b/android/navi-amc/src/main/java/com/navi/amc/fundbuy/viewmodel/FundListViewModel.kt index 77cc699ca5..08a10d2474 100644 --- a/android/navi-amc/src/main/java/com/navi/amc/fundbuy/viewmodel/FundListViewModel.kt +++ b/android/navi-amc/src/main/java/com/navi/amc/fundbuy/viewmodel/FundListViewModel.kt @@ -93,6 +93,7 @@ class FundListViewModel @Inject constructor(private val repository: FundListRepo private var faqListItems: List? = null var quickFilters: FilterItems? = null + var isQuickFilterEnabled: Boolean = true fun fetchFundsData(fundCategory: String?, screenName: String) { viewModelScope.launch { @@ -441,6 +442,7 @@ class FundListViewModel @Inject constructor(private val repository: FundListRepo response.errors.isNullOrEmpty() && response.data.isNotNull() ) { + fundCategory?.let { isQuickFilterEnabled = false } _fundListDataV3.value = response.data } else { setErrorData(response.errors, response.error) @@ -601,4 +603,8 @@ class FundListViewModel @Inject constructor(private val repository: FundListRepo ) return null } + + fun isFilterAlreadyApplied(key: String?): Boolean { + return selectedFilterItems.value?.any { it.value == key }.orFalse() + } } diff --git a/android/navi-amc/src/main/java/com/navi/amc/fundbuy/views/HorizontalChipGroupView.kt b/android/navi-amc/src/main/java/com/navi/amc/fundbuy/views/HorizontalChipGroupView.kt index 3973fbaa40..7e2090a1c7 100644 --- a/android/navi-amc/src/main/java/com/navi/amc/fundbuy/views/HorizontalChipGroupView.kt +++ b/android/navi-amc/src/main/java/com/navi/amc/fundbuy/views/HorizontalChipGroupView.kt @@ -52,13 +52,13 @@ class HorizontalChipGroupView(context: Context, attributeSet: AttributeSet? = nu DataBindingUtil.inflate(inflater, R.layout.chip_view, binding.group, false) childBinding.apply { title.setSpannableString(data.title) - if (!isQuickFilter) { + if (data.isSelected) { icon.setColorFilter(data.borderColor.parseColorSafe()) } else { icon.visibility = View.GONE } root.background = - if (isQuickFilter) + if (!data.isSelected) getNaviDrawable( cornerRadius = resources.getDimension(DesignR.dimen.dp_4).toInt(), backgroundColor = WHITE.parseColorSafe(), diff --git a/android/navi-amc/src/main/java/com/navi/amc/utils/AmcAnalytics.kt b/android/navi-amc/src/main/java/com/navi/amc/utils/AmcAnalytics.kt index fc8880f4de..a3307aede2 100644 --- a/android/navi-amc/src/main/java/com/navi/amc/utils/AmcAnalytics.kt +++ b/android/navi-amc/src/main/java/com/navi/amc/utils/AmcAnalytics.kt @@ -278,6 +278,9 @@ object AmcAnalytics { const val AMC_TARGET_SETUP_CTA_CLICK = "amc_target_setup_cta_click" const val AMC_TARGET_SETUP_BOTTOMSHEET_CTA_CLICK = "amc_target_setup_bottom_sheet_cta_click" + const val AMC_FUND_SEARCH_CLICKED = "amc_fund_search_clicked" + const val AMC_QUICK_FILTER_TAG_TAGGED = "amc_quick_filter_tag_tagged" + fun sendEvent( eventsData: GenericAnalyticsData?, extraAttributes: HashMap? = null,