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:
Aman S
2025-02-17 20:26:14 +05:30
committed by GitHub
parent dca4810d55
commit e1fce80dad
21 changed files with 544 additions and 71 deletions

View File

@@ -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
}
}

View File

@@ -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()
}
}

View File

@@ -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"

View File

@@ -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 }

View File

@@ -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,
)

View File

@@ -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(

View File

@@ -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)

View File

@@ -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),

View File

@@ -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,
)

View File

@@ -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,
)

View File

@@ -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()

View File

@@ -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>

View File

@@ -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*/
}
}

View File

@@ -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*/
}
}

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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)
}
}
}
}
}

View File

@@ -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),
)
}
}
}
}

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>