NTP-37380 | PROD-CUGS-BUGS-ONBOARDING (#14995)
Co-authored-by: Sayed Owais Ali <sayed.owais@navi.com> Co-authored-by: sharmapoojabalrambhai <sharma.balrambhai@navi.com> Co-authored-by: saksham <saksham>
This commit is contained in:
@@ -121,17 +121,7 @@ abstract class SdkHandlingActivity :
|
||||
ResponseState.Idle,
|
||||
ResponseState.Loading -> Unit
|
||||
|
||||
is ResponseState.Success -> {
|
||||
documentCollectionSdkListenerStrategy
|
||||
?.getDocumentCollectionSdkListenerStrategy()
|
||||
?.onDocumentCollectionSdkSuccess(
|
||||
DocumentCollectorSdkExitData(
|
||||
status = state.value.status,
|
||||
code = state.value.code,
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
is ResponseState.Success,
|
||||
is ResponseState.Exit -> Unit
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,9 @@
|
||||
package com.navi.ap.common.vertical.investment.renderer
|
||||
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.Canvas
|
||||
import android.graphics.Paint
|
||||
import android.graphics.Rect
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
@@ -212,22 +215,26 @@ class SignaturePadWidget {
|
||||
if (isManualMode) {
|
||||
signaturePad.signatureBitmap
|
||||
} else {
|
||||
Bitmap.createBitmap(
|
||||
signaturePad.width,
|
||||
signaturePad.height,
|
||||
Bitmap.Config.ARGB_8888,
|
||||
)
|
||||
.apply {
|
||||
val canvas = android.graphics.Canvas(this)
|
||||
val paint =
|
||||
android.graphics.Paint().apply {
|
||||
color = Color.Black.toArgb()
|
||||
textSize = 40f
|
||||
}
|
||||
canvas.drawText(defaultText, 0f, 40f, paint)
|
||||
val paint =
|
||||
Paint().apply {
|
||||
color = Color.Black.toArgb()
|
||||
textSize = 40f
|
||||
textAlign = Paint.Align.LEFT
|
||||
}
|
||||
val textBounds = Rect()
|
||||
paint.getTextBounds(defaultText, 0, defaultText.length, textBounds)
|
||||
val padding = 20
|
||||
val width = textBounds.width() + 2 * padding
|
||||
val height = textBounds.height() + 2 * padding
|
||||
|
||||
Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888).apply {
|
||||
val canvas = Canvas(this)
|
||||
canvas.drawColor(Color.White.toArgb())
|
||||
canvas.drawText(defaultText, padding.toFloat(), (height / 2).toFloat(), paint)
|
||||
}
|
||||
}
|
||||
bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, outputStream)
|
||||
|
||||
bitmapImage.compress(Bitmap.CompressFormat.PNG, 70, outputStream)
|
||||
return outputStream.toByteArray()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ mockk = "1.13.16"
|
||||
mvel2 = "2.4.15.Final"
|
||||
navi-adverse = "1.16.0"
|
||||
navi-alfred = "2.1.0"
|
||||
navi-customerDocumentCollector = "1.0.0"
|
||||
navi-customerDocumentCollector = "1.0.1"
|
||||
navi-elex = "1.11.1"
|
||||
navi-guarddog = "3.14.0"
|
||||
navi-pulse = "1.14.0"
|
||||
|
||||
@@ -51,7 +51,6 @@ class NfoDetailsFragment : AmcBaseFragment(), WidgetCallback, NewBottomSheetList
|
||||
private lateinit var binding: NfoDetailsLayoutBinding
|
||||
private val viewModel by lazy { ViewModelProvider(this).get(NfoDetailsViewModel::class.java) }
|
||||
private val naviAdapter = NaviAdapter(widgetCallback = this, factory = ViewHolderFactoryImpl())
|
||||
private var isDataNeedToRefresh = false
|
||||
|
||||
override val screenName: String
|
||||
get() = AmcAnalytics.NFO_SCREEN
|
||||
@@ -168,19 +167,6 @@ class NfoDetailsFragment : AmcBaseFragment(), WidgetCallback, NewBottomSheetList
|
||||
)
|
||||
}
|
||||
|
||||
override fun onStart() {
|
||||
super.onStart()
|
||||
if (isDataNeedToRefresh) {
|
||||
isDataNeedToRefresh = false
|
||||
fetchData()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onStop() {
|
||||
super.onStop()
|
||||
isDataNeedToRefresh = true
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun newInstance(bundle: Bundle?): NfoDetailsFragment {
|
||||
return NfoDetailsFragment().apply { arguments = bundle }
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* * Copyright © 2024-2025 by Navi Technologies Limited
|
||||
* * All rights reserved. Strictly confidential
|
||||
*
|
||||
*/
|
||||
|
||||
package com.navi.amc.fundbuy.models
|
||||
|
||||
import com.google.gson.annotations.SerializedName
|
||||
import com.navi.design.textview.model.TextWithStyle
|
||||
|
||||
data class FundDetailData(
|
||||
@SerializedName("title") val title: TextWithStyle? = null,
|
||||
@SerializedName("items") val items: List<FundItemData>? = null,
|
||||
)
|
||||
|
||||
data class FundItemData(
|
||||
@SerializedName("leftTitle") val leftTitle: TextWithStyle? = null,
|
||||
@SerializedName("actionIcon") val actionIcon: ActionIcon? = null,
|
||||
@SerializedName("rightTitle") val rightTitle: TextWithStyle? = null,
|
||||
@SerializedName("leftSubTitle") val leftSubTitle: TextWithStyle? = null,
|
||||
@SerializedName("rightSubTitle") val rightSubTitle: TextWithStyle? = null,
|
||||
)
|
||||
@@ -13,6 +13,7 @@ import com.navi.amc.common.model.FundInvestmentDetailData
|
||||
import com.navi.amc.common.model.InformationCardData
|
||||
import com.navi.common.model.Header
|
||||
import com.navi.design.textview.model.TextWithStyle
|
||||
import com.navi.naviwidgets.models.FundDetailData
|
||||
import com.navi.naviwidgets.models.response.amc.TagData
|
||||
|
||||
data class FundDetails(
|
||||
|
||||
@@ -18,11 +18,11 @@ import com.navi.amc.R
|
||||
import com.navi.amc.common.model.InformationCardData
|
||||
import com.navi.amc.databinding.FundDetailItemLayoutBinding
|
||||
import com.navi.amc.databinding.FundDetailViewLayoutBinding
|
||||
import com.navi.amc.fundbuy.models.FundDetailData
|
||||
import com.navi.base.model.ActionData
|
||||
import com.navi.base.utils.orZero
|
||||
import com.navi.design.utils.setSpannableString
|
||||
import com.navi.naviwidgets.extensions.showWhenDataIsAvailable
|
||||
import com.navi.naviwidgets.models.FundDetailData
|
||||
|
||||
class FundDetailView(context: Context, attributeSet: AttributeSet? = null) :
|
||||
LinearLayout(context, attributeSet) {
|
||||
@@ -57,7 +57,7 @@ class FundDetailView(context: Context, attributeSet: AttributeSet? = null) :
|
||||
leftTitle.visibility = View.INVISIBLE
|
||||
iconTitleCl.isVisible = true
|
||||
title.setSpannableString(itemData.leftTitle)
|
||||
actionIv.showWhenDataIsAvailable(actionIcon.iconCode)
|
||||
actionIv.showWhenDataIsAvailable(actionIcon.url)
|
||||
iconTitleCl.setOnClickListener {
|
||||
actionIcon.actionData?.let { iconClickAction?.invoke(it) }
|
||||
}
|
||||
@@ -67,7 +67,7 @@ class FundDetailView(context: Context, attributeSet: AttributeSet? = null) :
|
||||
rightSubtitle.setSpannableString(itemData.rightSubTitle)
|
||||
}
|
||||
childBinding.note.isVisible =
|
||||
if (data.items.size.orZero() - 1 == index && note != null) {
|
||||
if (data.items?.size.orZero() - 1 == index && note != null) {
|
||||
childBinding.note.setProperties(note, action)
|
||||
childBinding.note.updateLeftIconSize(16, 16)
|
||||
childBinding.note.updateTitleStartMargin(8)
|
||||
|
||||
@@ -9,7 +9,6 @@ package com.navi.common.customer.doc.collector.sdk
|
||||
|
||||
import android.app.Activity
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import com.facebook.shimmer.BuildConfig
|
||||
import com.navi.base.AppServiceManager
|
||||
import com.navi.base.sharedpref.CommonPrefConstants.USER_EXTERNAL_ID
|
||||
import com.navi.base.sharedpref.PreferenceManager
|
||||
@@ -50,7 +49,7 @@ class DocumentCollectorSdkHandler @Inject constructor() {
|
||||
listener = activity as DocumentCollectorSDKListener,
|
||||
sdkHeaderParams =
|
||||
SdkHeaderParams(
|
||||
flavor = BuildConfig.FLAVOR,
|
||||
flavor = com.navi.common.BuildConfig.FLAVOR,
|
||||
appVersionCode = AppServiceManager.appVersionCode,
|
||||
appVersionName = AppServiceManager.appVersionName,
|
||||
deviceId = BaseUtils.getDeviceId(activity.applicationContext),
|
||||
@@ -83,7 +82,7 @@ class DocumentCollectorSdkHandler @Inject constructor() {
|
||||
listener = activity as DocumentCollectorSDKListener,
|
||||
sdkHeaderParams =
|
||||
SdkHeaderParams(
|
||||
flavor = BuildConfig.FLAVOR,
|
||||
flavor = com.navi.common.BuildConfig.FLAVOR,
|
||||
appVersionCode = AppServiceManager.appVersionCode,
|
||||
appVersionName = AppServiceManager.appVersionName,
|
||||
deviceId = BaseUtils.getDeviceId(activity.applicationContext),
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
*
|
||||
* * Copyright © 2025 by Navi Technologies Limited
|
||||
* * All rights reserved. Strictly confidential
|
||||
*
|
||||
*/
|
||||
|
||||
package com.navi.naviwidgets.models
|
||||
|
||||
import com.google.gson.annotations.SerializedName
|
||||
import com.navi.design.textview.model.TextWithStyle
|
||||
import com.navi.naviwidgets.models.response.ActionIcon
|
||||
import com.navi.naviwidgets.models.response.WidgetError
|
||||
|
||||
data class FundDetailsWidget(
|
||||
@SerializedName("widgetId") override val widgetId: String?,
|
||||
@SerializedName("widgetName")
|
||||
override var widgetNameForBaseAdapter: String? = FundDetailsWidget.WIDGET_NAME,
|
||||
@SerializedName("widgetData") val widgetData: FundDetailData? = null,
|
||||
override val isDependentWidget: Boolean? = false,
|
||||
override val dependencyWidgetId: String? = null,
|
||||
override var isDependencyWidgetShowing: Boolean? = false,
|
||||
override var widgetError: WidgetError? = null,
|
||||
) : NaviWidget() {
|
||||
companion object {
|
||||
const val WIDGET_NAME = "FUND_OVERVIEW_WIDGET"
|
||||
}
|
||||
}
|
||||
|
||||
data class FundDetailData(
|
||||
@SerializedName("title") val title: TextWithStyle? = null,
|
||||
@SerializedName("items") val items: List<FundItemData>? = null,
|
||||
)
|
||||
|
||||
data class FundItemData(
|
||||
@SerializedName("leftTitle") val leftTitle: TextWithStyle? = null,
|
||||
@SerializedName("actionIcon") val actionIcon: ActionIcon? = null,
|
||||
@SerializedName("rightTitle") val rightTitle: TextWithStyle? = null,
|
||||
@SerializedName("leftSubTitle") val leftSubTitle: TextWithStyle? = null,
|
||||
@SerializedName("rightSubTitle") val rightSubTitle: TextWithStyle? = null,
|
||||
)
|
||||
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
*
|
||||
* * Copyright © 2025 by Navi Technologies Limited
|
||||
* * All rights reserved. Strictly confidential
|
||||
*
|
||||
*/
|
||||
|
||||
package com.navi.naviwidgets.models
|
||||
|
||||
import com.google.gson.annotations.SerializedName
|
||||
import com.navi.base.model.ActionData
|
||||
import com.navi.design.textview.model.TextWithStyle
|
||||
import com.navi.naviwidgets.models.response.WidgetError
|
||||
|
||||
data class NoteWidget(
|
||||
@SerializedName("widgetId") override val widgetId: String?,
|
||||
@SerializedName("widgetName")
|
||||
override var widgetNameForBaseAdapter: String? = FundDetailsWidget.WIDGET_NAME,
|
||||
@SerializedName("widgetData") val widgetData: NoteWidgetData? = null,
|
||||
override val isDependentWidget: Boolean? = false,
|
||||
override val dependencyWidgetId: String? = null,
|
||||
override var isDependencyWidgetShowing: Boolean? = false,
|
||||
override var widgetError: WidgetError? = null,
|
||||
) : NaviWidget() {
|
||||
companion object {
|
||||
const val WIDGET_NAME = "NOTE_WIDGET"
|
||||
}
|
||||
}
|
||||
|
||||
data class NoteWidgetData(
|
||||
@SerializedName("leftIcon", alternate = ["leftIconCode"]) val leftIcon: String? = null,
|
||||
@SerializedName("bgColor") val bgColor: String? = null,
|
||||
@SerializedName("title") val title: TextWithStyle? = null,
|
||||
@SerializedName("rightIcon") val rightIcon: String? = null,
|
||||
@SerializedName("actionData") val actionData: ActionData? = null,
|
||||
@SerializedName("radius") val radius: String? = null,
|
||||
)
|
||||
@@ -68,6 +68,7 @@ data class PaymentContentData(
|
||||
|
||||
data class ActionIcon(
|
||||
@SerializedName("imageUrl") val imageUrl: String? = null,
|
||||
@SerializedName("url") val url: String? = null,
|
||||
@SerializedName("url", alternate = ["iconCode"]) val url: String? = null,
|
||||
@SerializedName("additionalData") val additionalData: GenericBottomSheetData? = null,
|
||||
@SerializedName("actionData") val actionData: ActionData? = null,
|
||||
) : NaviClickAction()
|
||||
|
||||
@@ -45,6 +45,7 @@ import com.navi.naviwidgets.models.ExpandableCardWidget
|
||||
import com.navi.naviwidgets.models.FaqWidget
|
||||
import com.navi.naviwidgets.models.ForeclosureOfferWidget
|
||||
import com.navi.naviwidgets.models.FriendsListWidget
|
||||
import com.navi.naviwidgets.models.FundDetailsWidget
|
||||
import com.navi.naviwidgets.models.FundDocumentDownloadWidget
|
||||
import com.navi.naviwidgets.models.FundManagerWidget
|
||||
import com.navi.naviwidgets.models.GenericWidgetDataInfo
|
||||
@@ -80,6 +81,7 @@ import com.navi.naviwidgets.models.LeaderboardEntryWidget
|
||||
import com.navi.naviwidgets.models.LottieTextCardWidget
|
||||
import com.navi.naviwidgets.models.LottieWidget
|
||||
import com.navi.naviwidgets.models.NaviBaseAdapterModel
|
||||
import com.navi.naviwidgets.models.NoteWidget
|
||||
import com.navi.naviwidgets.models.OfferBannerWidget
|
||||
import com.navi.naviwidgets.models.OfferCardWidget
|
||||
import com.navi.naviwidgets.models.OptionsWithIconWidget
|
||||
@@ -296,10 +298,12 @@ import com.navi.naviwidgets.models.response.hospitalcard.CheckBoxWithRadioButton
|
||||
import com.navi.naviwidgets.viewholder.amc.AmcOrderStatusWidgetVH
|
||||
import com.navi.naviwidgets.viewholder.amc.AmcPortfolioInformationWidgetVH
|
||||
import com.navi.naviwidgets.viewholder.amc.FundCardWidgetVH
|
||||
import com.navi.naviwidgets.viewholder.amc.FundDetailsWidgetVH
|
||||
import com.navi.naviwidgets.viewholder.amc.FundDocumentDownloadWidgetVH
|
||||
import com.navi.naviwidgets.viewholder.amc.FundManagerWidgetVH
|
||||
import com.navi.naviwidgets.viewholder.amc.FundOptionsHorizontalListVH
|
||||
import com.navi.naviwidgets.viewholder.amc.ListOverlappingHeaderVH
|
||||
import com.navi.naviwidgets.viewholder.amc.NoteWidgetVH
|
||||
import com.navi.naviwidgets.viewholder.amc.RewardsDetailWidgetVH
|
||||
import com.navi.naviwidgets.viewholder.amc.TopProductHorizontalListVH
|
||||
import com.navi.naviwidgets.viewholder.amc.UpcomingPaymentsWidgetVH
|
||||
@@ -643,6 +647,8 @@ class ViewHolderFactoryImpl<T : NaviBaseAdapterModel> : ViewHolderTypeFactory<T>
|
||||
private val OFFER_CARD_WIDGET = R.layout.offer_card_widget_layout
|
||||
private val GOLD_PORTFOLIO_WIDGET = R.layout.gold_portfolio_widget_layout
|
||||
private val SIP_CARD_WIDGET = R.layout.sip_card_widget_layout
|
||||
private val FUND_DETAILS_WIDGET = R.layout.fund_details_widget_layout
|
||||
private val NOTE_WIDGET = R.layout.note_widget_layout
|
||||
}
|
||||
|
||||
override fun type(item: NaviBaseAdapterModel?): Int =
|
||||
@@ -931,6 +937,8 @@ class ViewHolderFactoryImpl<T : NaviBaseAdapterModel> : ViewHolderTypeFactory<T>
|
||||
is OfferCardWidget -> OFFER_CARD_WIDGET
|
||||
is GoldPortfolioWidget -> GOLD_PORTFOLIO_WIDGET
|
||||
is SipCardWidget -> SIP_CARD_WIDGET
|
||||
is FundDetailsWidget -> FUND_DETAILS_WIDGET
|
||||
is NoteWidget -> NOTE_WIDGET
|
||||
// Default case, add all widgets above this
|
||||
is GenericWidgetDataInfo -> GENERIC_WIDGET
|
||||
else -> {
|
||||
@@ -1236,6 +1244,8 @@ class ViewHolderFactoryImpl<T : NaviBaseAdapterModel> : ViewHolderTypeFactory<T>
|
||||
OFFER_CARD_WIDGET -> OfferCardWidgetVH(parent)
|
||||
GOLD_PORTFOLIO_WIDGET -> GoldPortfolioWidgetVH(parent)
|
||||
SIP_CARD_WIDGET -> SipCardWidgetVH(parent)
|
||||
FUND_DETAILS_WIDGET -> FundDetailsWidgetVH(parent)
|
||||
NOTE_WIDGET -> NoteWidgetVH(parent)
|
||||
else -> UnknownWidgetVH(parent)
|
||||
}
|
||||
as BaseViewHolder<T>
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
*
|
||||
* * Copyright © 2025 by Navi Technologies Limited
|
||||
* * All rights reserved. Strictly confidential
|
||||
*
|
||||
*/
|
||||
|
||||
package com.navi.naviwidgets.viewholder.amc
|
||||
|
||||
import androidx.databinding.ViewDataBinding
|
||||
import com.navi.naviwidgets.callbacks.WidgetCallback
|
||||
import com.navi.naviwidgets.databinding.FundDetailsWidgetLayoutBinding
|
||||
import com.navi.naviwidgets.models.FundDetailsWidget
|
||||
import com.navi.naviwidgets.viewholder.BaseViewHolder
|
||||
import com.navi.naviwidgets.widgets.amc.FundDetailsWidgetLayout
|
||||
|
||||
data class FundDetailsWidgetVH(private val viewDataBinding: ViewDataBinding) :
|
||||
BaseViewHolder<FundDetailsWidget>(viewDataBinding.root) {
|
||||
|
||||
override fun bind(
|
||||
model: FundDetailsWidget,
|
||||
widgetCallback: WidgetCallback,
|
||||
position: Int,
|
||||
totalItems: Int,
|
||||
) {
|
||||
if (itemView is FundDetailsWidgetLayout) {
|
||||
(itemView as FundDetailsWidgetLayout).update(
|
||||
widgetData = model,
|
||||
binding = viewDataBinding as FundDetailsWidgetLayoutBinding,
|
||||
widgetCallback = widgetCallback,
|
||||
position = position,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
override fun bindError(errorData: Any?) {
|
||||
/*No-op*/
|
||||
}
|
||||
|
||||
override fun bindWidgetStateChanged(payload: Any?) {
|
||||
/*No-op*/
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
*
|
||||
* * Copyright © 2025 by Navi Technologies Limited
|
||||
* * All rights reserved. Strictly confidential
|
||||
*
|
||||
*/
|
||||
|
||||
package com.navi.naviwidgets.viewholder.amc
|
||||
|
||||
import androidx.databinding.ViewDataBinding
|
||||
import com.navi.naviwidgets.callbacks.WidgetCallback
|
||||
import com.navi.naviwidgets.databinding.NoteWidgetLayoutBinding
|
||||
import com.navi.naviwidgets.models.NoteWidget
|
||||
import com.navi.naviwidgets.viewholder.BaseViewHolder
|
||||
import com.navi.naviwidgets.widgets.amc.NoteWidgetLayout
|
||||
|
||||
data class NoteWidgetVH(private val viewDataBinding: ViewDataBinding) :
|
||||
BaseViewHolder<NoteWidget>(viewDataBinding.root) {
|
||||
|
||||
override fun bind(
|
||||
model: NoteWidget,
|
||||
widgetCallback: WidgetCallback,
|
||||
position: Int,
|
||||
totalItems: Int,
|
||||
) {
|
||||
if (itemView is NoteWidgetLayout) {
|
||||
(itemView as NoteWidgetLayout).update(
|
||||
widgetData = model,
|
||||
binding = viewDataBinding as NoteWidgetLayoutBinding,
|
||||
widgetCallback = widgetCallback,
|
||||
position = position,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
override fun bindError(errorData: Any?) {
|
||||
/*No-op*/
|
||||
}
|
||||
|
||||
override fun bindWidgetStateChanged(payload: Any?) {
|
||||
/*No-op*/
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,7 @@ import com.google.gson.JsonDeserializer
|
||||
import com.google.gson.JsonElement
|
||||
import com.navi.naviwidgets.models.*
|
||||
import com.navi.naviwidgets.models.ActionButtonWidget
|
||||
import com.navi.naviwidgets.models.NoteWidget
|
||||
import com.navi.naviwidgets.models.response.*
|
||||
import com.navi.naviwidgets.models.response.amc.*
|
||||
import com.navi.naviwidgets.models.response.dashboard.*
|
||||
@@ -352,6 +353,8 @@ class NaviWidgetJsonDeserializer : JsonDeserializer<NaviWidget> {
|
||||
GoldPortfolioWidget.WIDGET_NAME -> GoldPortfolioWidget::class.java
|
||||
OfferCardWidget.WIDGET_NAME -> OfferCardWidget::class.java
|
||||
SipCardWidget.WIDGET_NAME -> SipCardWidget::class.java
|
||||
FundDetailsWidget.WIDGET_NAME -> FundDetailsWidget::class.java
|
||||
NoteWidget.WIDGET_NAME -> NoteWidget::class.java
|
||||
else -> null
|
||||
}
|
||||
return if (className != null) {
|
||||
|
||||
@@ -28,6 +28,7 @@ import com.navi.naviwidgets.models.FaqWidget
|
||||
import com.navi.naviwidgets.models.FooterWidget
|
||||
import com.navi.naviwidgets.models.ForeclosureOfferWidget
|
||||
import com.navi.naviwidgets.models.FriendsListWidget
|
||||
import com.navi.naviwidgets.models.FundDetailsWidget
|
||||
import com.navi.naviwidgets.models.FundDocumentDownloadWidget
|
||||
import com.navi.naviwidgets.models.FundManagerWidget
|
||||
import com.navi.naviwidgets.models.GoldConversionWidget
|
||||
@@ -60,6 +61,7 @@ import com.navi.naviwidgets.models.LeaderboardEntryWidget
|
||||
import com.navi.naviwidgets.models.LottieTextCardWidget
|
||||
import com.navi.naviwidgets.models.LottieWidget
|
||||
import com.navi.naviwidgets.models.NaviWidget
|
||||
import com.navi.naviwidgets.models.NoteWidget
|
||||
import com.navi.naviwidgets.models.OfferBannerWidget
|
||||
import com.navi.naviwidgets.models.OfferCardWidget
|
||||
import com.navi.naviwidgets.models.OptionsWithIconWidget
|
||||
@@ -262,6 +264,7 @@ class NaviWidgetJsonSerializer : JsonSerializer<NaviWidget> {
|
||||
typeOfSrc: Type?,
|
||||
context: JsonSerializationContext?,
|
||||
): JsonElement? {
|
||||
|
||||
val className =
|
||||
when (src?.widgetNameForBaseAdapter) {
|
||||
VideoPlayerWidget.WIDGET_NAME -> VideoPlayerWidget::class.java
|
||||
@@ -551,6 +554,8 @@ class NaviWidgetJsonSerializer : JsonSerializer<NaviWidget> {
|
||||
GoldPortfolioWidget.WIDGET_NAME -> GoldPortfolioWidget::class.java
|
||||
OfferCardWidget.WIDGET_NAME -> OfferCardWidget::class.java
|
||||
SipCardWidget.WIDGET_NAME -> SipCardWidget::class.java
|
||||
FundDetailsWidget.WIDGET_NAME -> FundDetailsWidget::class.java
|
||||
NoteWidget.WIDGET_NAME -> NoteWidget::class.java
|
||||
else -> null
|
||||
}
|
||||
return if (className != null) {
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
*
|
||||
* * Copyright © 2025 by Navi Technologies Limited
|
||||
* * All rights reserved. Strictly confidential
|
||||
*
|
||||
*/
|
||||
|
||||
package com.navi.naviwidgets.widgets.amc
|
||||
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.widget.LinearLayout
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.databinding.DataBindingUtil
|
||||
import com.navi.design.utils.setSpannableString
|
||||
import com.navi.naviwidgets.R
|
||||
import com.navi.naviwidgets.callbacks.WidgetCallback
|
||||
import com.navi.naviwidgets.databinding.FundDetailItemBinding
|
||||
import com.navi.naviwidgets.databinding.FundDetailsWidgetLayoutBinding
|
||||
import com.navi.naviwidgets.extensions.showWhenDataIsAvailable
|
||||
import com.navi.naviwidgets.models.FundDetailsWidget
|
||||
|
||||
class FundDetailsWidgetLayout(context: Context, attributeSet: AttributeSet? = null) :
|
||||
LinearLayout(context, attributeSet) {
|
||||
|
||||
private lateinit var binding: FundDetailsWidgetLayoutBinding
|
||||
private lateinit var widgetCallback: WidgetCallback
|
||||
private var widgetPosition: Int = Int.MAX_VALUE
|
||||
private lateinit var widgetData: FundDetailsWidget
|
||||
|
||||
fun update(
|
||||
widgetData: FundDetailsWidget,
|
||||
binding: FundDetailsWidgetLayoutBinding,
|
||||
widgetCallback: WidgetCallback,
|
||||
position: Int,
|
||||
) {
|
||||
this.widgetData = widgetData
|
||||
this.binding = binding
|
||||
this.widgetCallback = widgetCallback
|
||||
this.widgetPosition = position
|
||||
setProperties()
|
||||
}
|
||||
|
||||
private fun setProperties() {
|
||||
widgetData.widgetData?.let { data ->
|
||||
binding.title.setSpannableString(data.title)
|
||||
binding.itemContainer.apply {
|
||||
data.items?.forEachIndexed { index, itemData ->
|
||||
val inflater = LayoutInflater.from(context)
|
||||
val childBinding: FundDetailItemBinding =
|
||||
DataBindingUtil.inflate(
|
||||
inflater,
|
||||
R.layout.fund_detail_item,
|
||||
binding.itemContainer,
|
||||
false,
|
||||
)
|
||||
childBinding.apply {
|
||||
leftTitle.setSpannableString(itemData.leftTitle)
|
||||
itemData.actionIcon?.let { actionIcon ->
|
||||
leftTitle.visibility = View.INVISIBLE
|
||||
iconTitleCl.isVisible = true
|
||||
title.setSpannableString(itemData.leftTitle)
|
||||
actionIv.showWhenDataIsAvailable(actionIcon.url)
|
||||
iconTitleCl.setOnClickListener {
|
||||
actionIcon.actionData?.let {
|
||||
widgetCallback.onClick(it, widgetData.widgetId)
|
||||
}
|
||||
}
|
||||
}
|
||||
leftSubtitle.setSpannableString(itemData.leftSubTitle)
|
||||
rightTitle.setSpannableString(itemData.rightTitle)
|
||||
rightSubtitle.setSpannableString(itemData.rightSubTitle)
|
||||
}
|
||||
addView(childBinding.root)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
*
|
||||
* * Copyright © 2025 by Navi Technologies Limited
|
||||
* * All rights reserved. Strictly confidential
|
||||
*
|
||||
*/
|
||||
|
||||
package com.navi.naviwidgets.widgets.amc
|
||||
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import androidx.constraintlayout.widget.ConstraintLayout
|
||||
import com.navi.base.utils.isNotNull
|
||||
import com.navi.design.utils.dpToPx
|
||||
import com.navi.design.utils.getNaviDrawable
|
||||
import com.navi.design.utils.parseColorSafe
|
||||
import com.navi.design.utils.setSpannableString
|
||||
import com.navi.naviwidgets.callbacks.WidgetCallback
|
||||
import com.navi.naviwidgets.databinding.NoteWidgetLayoutBinding
|
||||
import com.navi.naviwidgets.extensions.showWhenDataIsAvailable
|
||||
import com.navi.naviwidgets.models.NoteWidget
|
||||
import com.navi.naviwidgets.widgets.InfoWithTimerWidgetLayout.Companion.COLOR_WHITE
|
||||
|
||||
class NoteWidgetLayout(context: Context, attributeSet: AttributeSet? = null) :
|
||||
ConstraintLayout(context, attributeSet) {
|
||||
|
||||
private lateinit var binding: NoteWidgetLayoutBinding
|
||||
private lateinit var widgetCallback: WidgetCallback
|
||||
private var widgetPosition: Int = Int.MAX_VALUE
|
||||
private lateinit var widgetData: NoteWidget
|
||||
|
||||
fun update(
|
||||
widgetData: NoteWidget,
|
||||
binding: NoteWidgetLayoutBinding,
|
||||
widgetCallback: WidgetCallback,
|
||||
position: Int,
|
||||
) {
|
||||
this.widgetData = widgetData
|
||||
this.binding = binding
|
||||
this.widgetCallback = widgetCallback
|
||||
this.widgetPosition = position
|
||||
setProperties()
|
||||
}
|
||||
|
||||
private fun setProperties() {
|
||||
widgetData.widgetData?.let { data ->
|
||||
binding.apply {
|
||||
leftIcon.showWhenDataIsAvailable(data.leftIcon)
|
||||
rightIcon.showWhenDataIsAvailable(data.rightIcon)
|
||||
title.setSpannableString(data.title)
|
||||
root.setOnClickListener {
|
||||
if (data.actionData.isNotNull()) {
|
||||
widgetCallback.onClick(data.actionData!!, widgetData.widgetId)
|
||||
}
|
||||
}
|
||||
|
||||
root.background =
|
||||
getNaviDrawable(
|
||||
cornerRadius = dpToPx(data.radius?.toIntOrNull() ?: 4).toInt(),
|
||||
backgroundColor = data.bgColor.parseColorSafe(COLOR_WHITE),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/icon_title_cl"
|
||||
android:layout_width="@dimen/dp_0"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/right_title"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<com.navi.design.textview.NaviTextView
|
||||
android:id="@+id/title"
|
||||
android:layout_width="@dimen/dp_0"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="NAV: 11th Jul 2022" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/action_iv"
|
||||
android:layout_width="@dimen/dp_16"
|
||||
android:layout_height="@dimen/dp_16"
|
||||
android:layout_marginStart="@dimen/dp_4"
|
||||
app:layout_constraintStart_toEndOf="@id/title"
|
||||
app:layout_constraintTop_toTopOf="@id/title"
|
||||
app:layout_constraintBottom_toBottomOf="@id/title"
|
||||
tools:src="@drawable/ic_new_info" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<com.navi.design.textview.NaviTextView
|
||||
android:id="@+id/left_title"
|
||||
android:layout_width="@dimen/dp_0"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintEnd_toStartOf="@id/right_title"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="NAV: 11th Jul 2022" />
|
||||
|
||||
<com.navi.design.textview.NaviTextView
|
||||
android:id="@+id/left_subtitle"
|
||||
android:layout_width="@dimen/dp_0"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/dp_8"
|
||||
app:layout_constraintEnd_toStartOf="@id/right_subtitle"
|
||||
app:layout_constraintStart_toStartOf="@id/left_title"
|
||||
app:layout_constraintTop_toBottomOf="@id/left_title"
|
||||
tools:text="₹1500" />
|
||||
|
||||
<com.navi.design.textview.NaviTextView
|
||||
android:id="@+id/right_title"
|
||||
android:layout_width="@dimen/dp_0"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/dp_16"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@id/left_title"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="NAV: 11th Jul 2022" />
|
||||
|
||||
<com.navi.design.textview.NaviTextView
|
||||
android:id="@+id/right_subtitle"
|
||||
android:layout_width="@dimen/dp_0"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/dp_8"
|
||||
android:layout_marginStart="@dimen/dp_16"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@id/left_subtitle"
|
||||
app:layout_constraintTop_toBottomOf="@id/right_title"
|
||||
tools:text="₹1500" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</layout>
|
||||
@@ -0,0 +1,29 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
|
||||
<com.navi.naviwidgets.widgets.amc.FundDetailsWidgetLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:paddingHorizontal="@dimen/dp_16">
|
||||
|
||||
<com.navi.design.textview.NaviTextView
|
||||
android:id="@+id/title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:lineSpacingExtra="@dimen/dp_4"
|
||||
tools:text="Fund Overview" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/item_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:layout_marginTop="@dimen/dp_16"
|
||||
android:divider="@drawable/divider_32"
|
||||
android:showDividers="middle" />
|
||||
|
||||
</com.navi.naviwidgets.widgets.amc.FundDetailsWidgetLayout>
|
||||
</layout>
|
||||
@@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
|
||||
<com.navi.naviwidgets.widgets.amc.NoteWidgetLayout
|
||||
android:id="@+id/parent_cl"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="@dimen/dp_16"
|
||||
android:layout_marginTop="@dimen/dp_16"
|
||||
android:paddingTop="@dimen/dp_16"
|
||||
android:paddingBottom="@dimen/dp_16">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/left_icon"
|
||||
android:layout_width="@dimen/dp_16"
|
||||
android:layout_height="@dimen/dp_16"
|
||||
android:layout_marginStart="@dimen/dp_16"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:src="@drawable/refund_image" />
|
||||
|
||||
<com.navi.design.textview.NaviTextView
|
||||
android:id="@+id/title"
|
||||
android:layout_width="@dimen/dp_0"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/dp_8"
|
||||
android:layout_marginEnd="@dimen/dp_16"
|
||||
android:lineSpacingExtra="@dimen/dp_4"
|
||||
app:layout_constraintBottom_toTopOf="@id/sub_title"
|
||||
app:layout_constraintEnd_toStartOf="@id/barrier"
|
||||
app:layout_constraintStart_toEndOf="@id/left_icon"
|
||||
tools:text="Orders will be processed as per cut-off time. as per cutoff" />
|
||||
|
||||
|
||||
<com.navi.design.textview.NaviTextView
|
||||
android:id="@+id/action_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="@dimen/dp_16"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="Details" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/right_icon"
|
||||
android:layout_width="@dimen/dp_16"
|
||||
android:layout_height="@dimen/dp_16"
|
||||
android:layout_marginEnd="@dimen/dp_16"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@id/title"
|
||||
app:layout_constraintBottom_toBottomOf="@id/title"
|
||||
tools:src="@drawable/ic_info_gray" />
|
||||
|
||||
<androidx.constraintlayout.widget.Barrier
|
||||
android:id="@+id/barrier"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:barrierDirection="left"
|
||||
app:constraint_referenced_ids="right_icon,action_text" />
|
||||
|
||||
<com.navi.design.customview.ParallelogramView
|
||||
android:id="@+id/pgvShimmer"
|
||||
android:layout_width="@dimen/dp_20"
|
||||
android:layout_height="@dimen/dp_40"
|
||||
android:layout_gravity="start"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:tilt_direction="forward" />
|
||||
|
||||
</com.navi.naviwidgets.widgets.amc.NoteWidgetLayout>
|
||||
</layout>
|
||||
Reference in New Issue
Block a user