NTP-74411 || Shrihari | Gold amount adjustment bottomsheet added (#16811)

This commit is contained in:
A Shrihari Raju
2025-07-02 14:55:00 +05:30
committed by GitHub
parent e3d4cfce27
commit ea07719116
10 changed files with 147 additions and 9 deletions

View File

@@ -52,6 +52,7 @@ import com.navi.naviwidgets.actions.ImplicitShareClickAction
import com.navi.naviwidgets.actions.NaviWidgetClick
import com.navi.naviwidgets.adapters.NaviAdapter
import com.navi.naviwidgets.callbacks.WidgetCallback
import com.navi.naviwidgets.models.ActionButtonWidget
import com.navi.naviwidgets.models.ButtonLoaderState
import com.navi.naviwidgets.models.ContainerWidget
import com.navi.naviwidgets.models.NaviWidget
@@ -61,7 +62,9 @@ import com.navi.naviwidgets.models.ShareData
import com.navi.naviwidgets.models.TextWithTimerWidget
import com.navi.naviwidgets.models.TitleWithRadioWidget
import com.navi.naviwidgets.models.WidgetChangedData
import com.navi.naviwidgets.utils.AMOUNT_ADJUSTMENT_BOTTOM_SHEET
import com.navi.naviwidgets.utils.APP_SHARE
import com.navi.naviwidgets.utils.BOTTOM_SHEET_TAG
import com.navi.naviwidgets.utils.STORE_BANK_UPI_ID
import com.navi.naviwidgets.utils.STORE_SIP_INSTALLMENT_DATE
import com.navi.naviwidgets.utils.STORE_UPI_ICON_URL
@@ -135,7 +138,10 @@ class WidgetsSupportedBottomSheet() : BaseBottomSheet(), WidgetCallback {
setBackground(COLOR_TRANSPARENT)
}
getRv().setBackgroundColor(arguments?.getInt(BG_COLOR, Color.WHITE).orElse(Color.WHITE))
val bgColor = arguments?.getInt(BG_COLOR, Color.WHITE).orElse(Color.WHITE)
if (bgColor != Color.WHITE) {
getRv().setBackgroundColor(bgColor)
}
}
private fun getRv(): RecyclerView {
@@ -249,6 +255,61 @@ class WidgetsSupportedBottomSheet() : BaseBottomSheet(), WidgetCallback {
}
}
}
is NaviWidgetClick -> {
widgetNaviAnalyticsEventTracker.onWidgetClickEvent(naviClickAction.actionData)
var amountAdjustmentDialogDismissListener: DialogInterface.OnDismissListener? = null
if (
naviClickAction.actionData
?.parameters
?.firstOrNull { it.key == BOTTOM_SHEET_TAG }
?.value
.equals(AMOUNT_ADJUSTMENT_BOTTOM_SHEET)
) {
val capturedActivity = activity
amountAdjustmentDialogDismissListener =
DialogInterface.OnDismissListener {
val widgetList = naviClickAction.widgetBottomSheetData?.data
val primaryAction =
widgetList
?.filterIsInstance<ContainerWidget>()
?.firstOrNull {
it.widgetNameForBaseAdapter == ContainerWidget.WIDGET_NAME
}
?.widgetData
?.items
?.filterIsInstance<ActionButtonWidget>()
?.firstOrNull {
it.widgetNameForBaseAdapter ==
ActionButtonWidget.WIDGET_NAME
}
?.widgetData
?.actionData
val primaryClickAction =
NaviWidgetClickWithActionData(actionData = primaryAction)
if (capturedActivity is WidgetCallback) {
capturedActivity.onClick(primaryClickAction, widgetId)
} else {
primaryAction?.let {
DeepLinkManager.getDeepLinkListener()
?.navigateTo(
activity = activity,
ctaData = it.toCtaData(),
finish = naviClickAction.isFinish,
)
}
}
}
}
val clickAction =
naviClickAction.copy(
dialogDismissListener = amountAdjustmentDialogDismissListener
)
safelyDismissDialog()
val hostActivity = activity
if (hostActivity is WidgetCallback) {
hostActivity.onClick(clickAction, widgetId)
}
}
else -> {
val hostFragment = parentFragment
if (hostFragment.isNotNull()) {

View File

@@ -12,7 +12,7 @@
android:id="@+id/headerContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:background="@android:color/transparent"
android:clipToPadding="false"
android:paddingStart="@dimen/dp_16"
android:paddingEnd="@dimen/dp_16"
@@ -40,14 +40,14 @@
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white">
android:background="@android:color/transparent">
<!-- Original RecyclerView -->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvItems"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:background="@android:color/transparent"
android:clipToPadding="false"
android:nestedScrollingEnabled="false"
android:paddingStart="@dimen/dp_16"
@@ -59,7 +59,7 @@
android:id="@+id/rvWithScrollBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:background="@android:color/transparent"
android:clipToPadding="false"
android:paddingStart="@dimen/dp_16"
android:paddingEnd="@dimen/dp_16"
@@ -77,7 +77,7 @@
android:id="@+id/footerContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:background="@android:color/transparent"
android:clipToPadding="false"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toBottomOf="parent"

View File

@@ -193,6 +193,7 @@ import com.navi.naviwidgets.models.SipCardWidget
import com.navi.naviwidgets.models.TextCardWithShimmerWidget
import com.navi.naviwidgets.models.WidgetChangedData
import com.navi.naviwidgets.models.response.HomeProductWidget
import com.navi.naviwidgets.utils.BOTTOM_SHEET_TAG
import com.navi.naviwidgets.utils.BUTTON_LOADER
import com.navi.naviwidgets.utils.DIGITAL_GOLD_USER_ENTERED_AMOUNT
import com.navi.naviwidgets.utils.PAYMENT_PAGE
@@ -1100,6 +1101,14 @@ class DigitalGoldHomeActivity :
dialogDismissListener: DialogInterface.OnDismissListener? = null,
widgetBottomSheetTag: String = WidgetsSupportedBottomSheet.TAG,
) {
// TODO: check this block in regression
if (widgetBottomSheet.isNotNull()) {
widgetBottomSheet?.safelyDismissDialog()
}
if (::commonBottomSheet.isInitialized && commonBottomSheet.isNotNull()) {
commonBottomSheet.safelyDismissDialog()
}
bottomSheetSharedVM.setBottomSheetData(NaviWidgetClick(listOfWidget = widgetList))
widgetBottomSheet =
WidgetsSupportedBottomSheet.getInstance(
@@ -1739,6 +1748,12 @@ class DigitalGoldHomeActivity :
naviClickAction.widgetBottomSheetData
?.allowTransparentRootBg
.orFalse(),
widgetBottomSheetTag =
naviClickAction.actionData
?.parameters
?.find { it.key == BOTTOM_SHEET_TAG }
?.value ?: WidgetsSupportedBottomSheet.TAG,
dialogDismissListener = naviClickAction.dialogDismissListener,
)
}
return

View File

@@ -7,6 +7,7 @@
package com.navi.naviwidgets.actions
import android.content.DialogInterface
import android.view.View
import com.navi.base.model.ActionData
import com.navi.base.model.AnalyticsEvent
@@ -96,6 +97,7 @@ data class NaviWidgetClick(
val contactBottomSheetData: ContactBottomSheetData? = null,
val widgetId: String? = null,
val isAutoClick: Boolean? = null,
val dialogDismissListener: DialogInterface.OnDismissListener? = null,
) : NaviClickAction()
data class GoldMinOfferSectionClickAction(

View File

@@ -7,8 +7,11 @@
package com.navi.naviwidgets.interfaces
import com.navi.base.model.ActionData
import com.navi.naviwidgets.models.ImageWidgetData
import com.navi.naviwidgets.models.NaviTextComponent
import com.navi.naviwidgets.models.Radius
import com.navi.naviwidgets.models.WidgetBottomSheetData
import com.navi.naviwidgets.models.WidgetLayoutParams
import com.navi.naviwidgets.models.response.Gradient
import com.navi.naviwidgets.models.response.TagData
@@ -28,6 +31,8 @@ interface KeyValueWidgetInfo {
fun middleIcon(): String?
fun middleIconCta(): ActionData?
fun leftTextLineSpacing(): Int?
fun widgetLayoutParams(): WidgetLayoutParams?
@@ -81,4 +86,8 @@ interface KeyValueWidgetInfo {
fun radius(): Radius?
fun isShimmerRequired(): Boolean?
fun widgetBottomSheetData(): WidgetBottomSheetData?
fun middleIconWidgetData(): ImageWidgetData?
}

View File

@@ -34,7 +34,7 @@ data class ImageWidgetData(
@SerializedName("iconCode") val iconCode: String? = null,
@SerializedName("scaleType") val scaleType: String? = null,
@SerializedName("margin") var margin: Margin? = null,
@SerializedName("actionData") val actionData: ActionData? = null,
@SerializedName("actionData", alternate = ["cta"]) val actionData: ActionData? = null,
@SerializedName("needPlaceHolder") val placeHolderNeed: Boolean? = null,
@SerializedName("enableDebounceClick") val enableDebounceClick: Boolean? = null,
@SerializedName("metaData") val metaData: GenericAnalytics? = null,

View File

@@ -8,6 +8,7 @@
package com.navi.naviwidgets.models
import com.google.gson.annotations.SerializedName
import com.navi.base.model.ActionData
import com.navi.naviwidgets.interfaces.KeyValueWidgetInfo
import com.navi.naviwidgets.models.response.Gradient
import com.navi.naviwidgets.models.response.TagData
@@ -43,6 +44,8 @@ data class KeyValueWidget(
override fun middleIcon(): String? = widgetData?.middleIcon
override fun middleIconCta(): ActionData? = widgetData?.middleIconCta
override fun leftTextLineSpacing(): Int? = widgetData?.leftTextLineSpacing
override fun widgetLayoutParams(): WidgetLayoutParams? = widgetLayoutParams
@@ -96,6 +99,10 @@ data class KeyValueWidget(
override fun radius(): Radius? = widgetData?.radius
override fun isShimmerRequired(): Boolean? = widgetData?.isShimmerRequired
override fun widgetBottomSheetData(): WidgetBottomSheetData? = widgetData?.widgetBottomSheetData
override fun middleIconWidgetData(): ImageWidgetData? = widgetData?.middleIconWidgetData
}
data class KeyValueWidgetData(
@@ -116,6 +123,10 @@ data class KeyValueWidgetData(
@SerializedName("rightTextPadding") val rightTextPadding: Padding? = null,
@SerializedName("leftIcon") val leftIcon: String? = null,
@SerializedName("middleIcon") val middleIcon: String? = null,
@SerializedName("middleIconCta") val middleIconCta: ActionData? = null,
@SerializedName("middleIconWidgetData") val middleIconWidgetData: ImageWidgetData? = null,
@SerializedName("widgetBottomSheetData")
val widgetBottomSheetData: WidgetBottomSheetData? = null,
@SerializedName("leftTextLineSpacing") val leftTextLineSpacing: Int? = null,
@SerializedName("enableParentClick") val enableParentClick: Boolean? = null,
@SerializedName("middleIconMargin") val middleIconMargin: Margin? = null,

View File

@@ -240,3 +240,6 @@ const val FOOTER_DEFAULT_SECONDARY_LOTTIE_URL =
const val WIDGET_DETACHED = "dev_widget_detached"
const val PAYLOAD = "payload"
const val IS_WIDGET_DETACHED = "isWidgetDetached"
const val SHOW_WIDGET_BOTTOM_SHEET = "showWidgetBottomSheet"
const val AMOUNT_ADJUSTMENT_BOTTOM_SHEET = "AMOUNT_ADJUSTMENT_BOTTOM_SHEET"
const val BOTTOM_SHEET_TAG = "bottomSheetTag"

View File

@@ -8,6 +8,7 @@
package com.navi.naviwidgets.widgets
import android.content.Context
import android.text.method.LinkMovementMethod
import android.util.AttributeSet
import android.view.Gravity
import android.view.ViewGroup
@@ -17,6 +18,8 @@ import androidx.core.view.marginEnd
import androidx.core.view.marginStart
import androidx.core.view.updateLayoutParams
import com.facebook.shimmer.Shimmer
import com.navi.base.model.ActionData
import com.navi.base.model.NaviWidgetClickWithActionData
import com.navi.base.utils.isNotNull
import com.navi.design.R as DesignR
import com.navi.design.utils.CornerRadius
@@ -27,12 +30,14 @@ import com.navi.design.utils.getNaviDrawable
import com.navi.design.utils.getNaviDrawableFromBackend
import com.navi.design.utils.parseColorSafe
import com.navi.design.utils.spannedText
import com.navi.naviwidgets.actions.NaviWidgetClick
import com.navi.naviwidgets.callbacks.WidgetCallback
import com.navi.naviwidgets.databinding.LayoutKeyValueBinding
import com.navi.naviwidgets.extensions.setVisibilityState
import com.navi.naviwidgets.extensions.showWhenDataIsAvailable
import com.navi.naviwidgets.interfaces.KeyValueWidgetInfo
import com.navi.naviwidgets.models.TextGravity
import com.navi.naviwidgets.utils.SHOW_WIDGET_BOTTOM_SHEET
import com.navi.naviwidgets.utils.setMargin
import com.navi.naviwidgets.utils.setWidgetLayoutParams
@@ -93,8 +98,11 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
)
tvLeft.isVisible = info.leftText()?.isNotNull() == true
tvLeft.movementMethod = LinkMovementMethod.getInstance()
leftIcon.showWhenDataIsAvailable(info.leftIcon())
middleIcon.showWhenDataIsAvailable(info.middleIcon())
middleIcon.showWhenDataIsAvailable(
info.middleIcon() ?: info.middleIconWidgetData()?.iconCode
)
middleLottie.showWhenDataIsAvailable(info.middleLottieFileName())
info.rightTagData()?.let {
binding.rightTag.setMargin(it.margin)
@@ -231,7 +239,16 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
tvLeft.setLineSpacing(dpToPx(it), LINE_SPACING_FACTOR)
}
tvLeft.text =
info.leftText()?.text?.spannedText(context = context, span = info.leftText()?.span)
info
.leftText()
?.text
?.spannedText(
context = context,
span = info.leftText()?.span,
urlClickCallback = ::onSpanClick,
)
tvLeft.movementMethod = LinkMovementMethod.getInstance()
middleTv.isVisible = info.middleText()?.isNotNull() == true
middleTv.text =
info
@@ -297,6 +314,13 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
if (info.enableParentClick() == true) {
binding.root.setOnClickListener { widgetCallback.parentClicked() }
}
info.middleIconCta()?.let { actionData ->
middleIcon.setOnClickListener { onSpanClick(actionData) }
}
info.middleIconWidgetData()?.actionData?.let { action ->
middleIcon.setOnClickListener { onSpanClick(action) }
}
}
}
@@ -329,6 +353,19 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
binding.tvRight.visibility = VISIBLE
}
private fun onSpanClick(actionData: ActionData?) {
if (actionData?.url == SHOW_WIDGET_BOTTOM_SHEET) {
widgetCallback.onClick(
NaviWidgetClick(
actionData = actionData,
widgetBottomSheetData = info.widgetBottomSheetData(),
)
)
} else {
widgetCallback.onClick(NaviWidgetClickWithActionData(actionData = actionData))
}
}
companion object {
private const val LINE_SPACING_FACTOR = 1.0f
}