diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/claim/bank/ui/BankDetailsFormFragment.kt b/android/navi-insurance/src/main/java/com/navi/insurance/claim/bank/ui/BankDetailsFormFragment.kt index e528dec5bd..eb6c24b5cf 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/claim/bank/ui/BankDetailsFormFragment.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/claim/bank/ui/BankDetailsFormFragment.kt @@ -25,6 +25,7 @@ import com.navi.base.utils.orFalse import com.navi.common.network.models.ErrorMessage import com.navi.design.R as DesignR import com.navi.design.utils.hideCutCopyMenuPopUp +import com.navi.design.utils.underlinedText import com.navi.insurance.R import com.navi.insurance.analytics.InsuranceAnalyticsConstants import com.navi.insurance.analytics.InsuranceAnalyticsHandler @@ -213,11 +214,13 @@ class BankDetailsFormFragment : GiBaseFragment(), TextWatcher { private fun setViewState(viewState: BankDetailsFormViewState) { when (viewState) { BankDetailsFormViewState.Loading -> { - binding.progressBar.isVisible = true + binding.shimmerViewContainer.isVisible = true + binding.shimmerViewContainer.startShimmer() binding.content.isVisible = false } is BankDetailsFormViewState.Success -> { - binding.progressBar.isVisible = false + binding.shimmerViewContainer.isVisible = false + binding.shimmerViewContainer.stopShimmer() binding.content.isVisible = true handleSuccessState(viewState.response) } @@ -268,6 +271,9 @@ class BankDetailsFormFragment : GiBaseFragment(), TextWatcher { binding.topHeaderTitle.setData( (genericWidgetResponse.content?.getOrNull(0)?.widgetData as TextHeaderViewData).title ) + binding.topHeaderSubTitle.setData( + (genericWidgetResponse.content.getOrNull(0)?.widgetData as TextHeaderViewData).subTitle + ) isBankVerified = isAccountVerified(genericWidgetResponse.metadata) if (isBankVerified) { handleVerifiedState(genericWidgetResponse.metadata) @@ -469,6 +475,7 @@ class BankDetailsFormFragment : GiBaseFragment(), TextWatcher { if (!bankInfo.bankCode.isNullOrEmpty()) { binding.bankField.tag = bankInfo.bankCode binding.searchButton.isVisible = true + binding.searchButton.underlinedText() } else { binding.searchButton.isVisible = false } diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/claim/document/ui/DocumentReviewFragment.kt b/android/navi-insurance/src/main/java/com/navi/insurance/claim/document/ui/DocumentReviewFragment.kt index c848b7017d..83315196e6 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/claim/document/ui/DocumentReviewFragment.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/claim/document/ui/DocumentReviewFragment.kt @@ -147,8 +147,8 @@ class DocumentReviewFragment : GiBaseFragment() { private fun setViewState(documentViewState: DocumentReviewState) { when (documentViewState) { is DocumentReviewState.Success -> { - - binding.progressBar.isVisible = false + binding.shimmerViewContainer.isVisible = false + binding.shimmerViewContainer.stopShimmer() binding.documentReviewLayout.isVisible = true documentViewState.data?.header?.getOrNull(0)?.widgetData?.run { @@ -170,7 +170,8 @@ class DocumentReviewFragment : GiBaseFragment() { } } is DocumentReviewState.Loading -> { - binding.progressBar.isVisible = true + binding.shimmerViewContainer.isVisible = true + binding.shimmerViewContainer.startShimmer() binding.documentReviewLayout.isVisible = false } } diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/claim/document/ui/DocumentUploadByCategoryFragment.kt b/android/navi-insurance/src/main/java/com/navi/insurance/claim/document/ui/DocumentUploadByCategoryFragment.kt index e182453aac..7a62a6e7b0 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/claim/document/ui/DocumentUploadByCategoryFragment.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/claim/document/ui/DocumentUploadByCategoryFragment.kt @@ -298,11 +298,13 @@ class DocumentUploadByCategoryFragment : when (state) { is SubmitCtaState.Idle -> {} is SubmitCtaState.Loading -> { - binding.progressBar.isVisible = true + binding.shimmerViewContainer.isVisible = true + binding.shimmerViewContainer.startShimmer() binding.uploadCardsContainer.isVisible = false } is SubmitCtaState.Success -> { - binding.progressBar.isVisible = false + binding.shimmerViewContainer.isVisible = false + binding.shimmerViewContainer.stopShimmer() binding.uploadCardsContainer.isVisible = true state.data?.let { ctaData -> NaviInsuranceDeeplinkNavigator.navigate( @@ -327,6 +329,7 @@ class DocumentUploadByCategoryFragment : documentUploadStatus.selectedFileData?.documentReferenceId, when (documentUploadStatus) { is DocumentUploadStatus.Success -> { + setViewState(documentUploadVM.documentUploadByCategoryStateFlow.value) documentUploadStatus.uploadedDocData } is DocumentUploadStatus.Failure -> { @@ -424,12 +427,14 @@ class DocumentUploadByCategoryFragment : ) } } + setViewState(documentUploadVM.documentUploadByCategoryStateFlow.value) } private fun setViewState(documentViewState: DocumentUploadByCategoryState) { when (documentViewState) { is DocumentUploadByCategoryState.Success -> { - binding.progressBar.isVisible = false + binding.shimmerViewContainer.isVisible = false + binding.shimmerViewContainer.stopShimmer() binding.uploadCardsContainer.isVisible = true documentViewState.data?.header?.getOrNull(0)?.widgetData?.run { @@ -439,6 +444,8 @@ class DocumentUploadByCategoryFragment : } documentViewState.data?.footer?.getOrNull(0)?.widgetData?.run { + val viewData = this as? FooterWithTitleAndActionViewData + viewData?.buttonState = binding.uploadCardsContainer.areWidgetsValid() updateContainer(this, binding.footerContainer) { action -> if ( shouldShowUploadInProgressBottomSheet().not() && @@ -455,7 +462,8 @@ class DocumentUploadByCategoryFragment : } } DocumentUploadByCategoryState.Loading -> { - binding.progressBar.isVisible = true + binding.shimmerViewContainer.isVisible = true + binding.shimmerViewContainer.startShimmer() binding.uploadCardsContainer.isVisible = false } } diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/claim/document/ui/DocumentUploadSummaryFragment.kt b/android/navi-insurance/src/main/java/com/navi/insurance/claim/document/ui/DocumentUploadSummaryFragment.kt index 0185bddff2..cdae6d9758 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/claim/document/ui/DocumentUploadSummaryFragment.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/claim/document/ui/DocumentUploadSummaryFragment.kt @@ -31,8 +31,11 @@ import com.navi.insurance.common.GiBaseVM import com.navi.insurance.common.factory.InsuranceViewHolderRegistry import com.navi.insurance.common.models.Action import com.navi.insurance.common.models.ActionOwnerType +import com.navi.insurance.common.models.FooterWithTitleAndActionViewData import com.navi.insurance.common.models.NaviWidget import com.navi.insurance.common.models.NaviWidgetData +import com.navi.insurance.common.models.NaviWidgetType +import com.navi.insurance.common.models.UploadSummaryListWidgetData import com.navi.insurance.common.util.ActionHandler import com.navi.insurance.common.util.IdProvider import com.navi.insurance.common.widgets.BaseNaviWidgetView @@ -142,13 +145,15 @@ class DocumentUploadSummaryFragment : GiBaseFragment(), ActionHandler.ActionOwne private fun setViewState(documentViewState: DocumentSummaryState) { when (documentViewState) { DocumentSummaryState.Loading -> { - binding.progressBar.isVisible = true + binding.shimmerViewContainer.isVisible = true + binding.shimmerViewContainer.startShimmer() binding.documentSummaryLayout.isVisible = false binding.headerContainer.isVisible = false binding.footerContainer.isVisible = false } is DocumentSummaryState.Success -> { - binding.progressBar.isVisible = false + binding.shimmerViewContainer.isVisible = false + binding.shimmerViewContainer.stopShimmer() binding.documentSummaryLayout.isVisible = true binding.headerContainer.isVisible = true binding.footerContainer.isVisible = true @@ -164,10 +169,10 @@ class DocumentUploadSummaryFragment : GiBaseFragment(), ActionHandler.ActionOwne } documentViewState.data?.footer?.getOrNull(0)?.widgetData?.run { + val viewData = this as? FooterWithTitleAndActionViewData + viewData?.buttonState = isValidationSuccess() updateContainer(this, binding.footerContainer) { action -> - if (isValidationSuccess()) { - documentUploadVM.performAction(action, getActionOwner(action)) - } + documentUploadVM.performAction(action, getActionOwner(action)) } } } @@ -175,7 +180,18 @@ class DocumentUploadSummaryFragment : GiBaseFragment(), ActionHandler.ActionOwne } private fun isValidationSuccess(): Boolean { - return documentAdapter?.isValidWidget().orTrue() + var isValid = true + documentAdapter?.list?.forEach { widget -> + if (widget.widgetName == NaviWidgetType.SUMMARY_LIST_WIDGET.value) { + val uploadSummaryListWidgetData = widget.widgetData as? UploadSummaryListWidgetData + uploadSummaryListWidgetData?.summaryItems?.forEachIndexed { + _, + uploadSummaryItemWidget -> + isValid = isValid && uploadSummaryItemWidget.widgetData?.validated.orTrue() + } + } + } + return isValid } private fun updateWidgetData(widgets: List) { diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/claim/document/ui/GridImageCardWidgetView.kt b/android/navi-insurance/src/main/java/com/navi/insurance/claim/document/ui/GridImageCardWidgetView.kt index aee4baa77c..cc675686cd 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/claim/document/ui/GridImageCardWidgetView.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/claim/document/ui/GridImageCardWidgetView.kt @@ -134,8 +134,7 @@ constructor(context: Context, attrs: AttributeSet? = null) : LinearLayout(contex } private fun hideLoaders() { - binding?.loaderText?.isVisible = false - binding?.loaderIcon?.isVisible = false + binding?.progressLottie?.isVisible = false binding?.showMoreButtonLayout?.isVisible = !currentPageNumber.isNull() && !totalPages.isNull() && @@ -146,8 +145,7 @@ constructor(context: Context, attrs: AttributeSet? = null) : LinearLayout(contex if (binding?.showMoreButtonLayout?.isVisible == true) { binding?.showMoreButtonLayout?.isVisible = false } - binding?.loaderText?.isVisible = true - binding?.loaderIcon?.isVisible = true + binding?.progressLottie?.isVisible = true } override fun onDetachedFromWindow() { diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/claim/document/ui/TabbedMediatorNestedScrollView.kt b/android/navi-insurance/src/main/java/com/navi/insurance/claim/document/ui/TabbedMediatorNestedScrollView.kt index 9f9e05f5f6..bfadf33981 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/claim/document/ui/TabbedMediatorNestedScrollView.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/claim/document/ui/TabbedMediatorNestedScrollView.kt @@ -130,7 +130,9 @@ class TabbedMediatorNestedScrollView( ) (tab.customView as? TextView)?.apply { - setTextColor(ContextCompat.getColor(context, DesignR.color.blueberry)) + setTextColor( + ContextCompat.getColor(context, DesignR.color.title_text_purple_color) + ) this.typeface = typeFace } insuranceAnalyticsHandler.sendEvent(tabDataList[position].analyticsEvent) diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/common/models/FooterWithTitleAndActionViewData.kt b/android/navi-insurance/src/main/java/com/navi/insurance/common/models/FooterWithTitleAndActionViewData.kt index 35a51632d8..b00df98968 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/common/models/FooterWithTitleAndActionViewData.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/common/models/FooterWithTitleAndActionViewData.kt @@ -15,6 +15,7 @@ data class FooterWithTitleAndActionViewData( @SerializedName("button") val button: ButtonViewData? = null, @SerializedName("showDivider") val showDivider: Boolean? = true, @SerializedName("validation") val validation: List? = null, + @SerializedName("buttonState") var buttonState: Boolean? = null, override var widgetNameForBaseAdapter: String? = NaviWidgetType.FOOTER_WITH_TITLE_AND_BUTTON.value, ) : NaviWidgetData() diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/common/models/TextHeaderViewData.kt b/android/navi-insurance/src/main/java/com/navi/insurance/common/models/TextHeaderViewData.kt index b72acba67a..d49632d269 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/common/models/TextHeaderViewData.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/common/models/TextHeaderViewData.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2024 by Navi Technologies Limited + * * Copyright © 2024-2025 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -11,5 +11,6 @@ import com.google.gson.annotations.SerializedName data class TextHeaderViewData( @SerializedName("title") val title: TextViewData? = null, + @SerializedName("subTitle") val subTitle: TextViewData? = null, override var widgetNameForBaseAdapter: String? = NaviWidgetType.TEXT_HEADER.value, ) : NaviWidgetData() diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/common/models/UploadCardWidgetData.kt b/android/navi-insurance/src/main/java/com/navi/insurance/common/models/UploadCardWidgetData.kt index 528eedfeb8..b318188d00 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/common/models/UploadCardWidgetData.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/common/models/UploadCardWidgetData.kt @@ -24,6 +24,8 @@ class UploadCardWidgetData( @SerializedName("intimationReferenceId") val intimationReferenceId: String? = null, @SerializedName("validations") val validations: List? = null, @SerializedName("spanCount") val spanCount: Int? = null, + @SerializedName("infoTitle") val infoTitle: TextViewData? = null, + @SerializedName("bottomTagTitle") val bottomTagTitle: TextViewData? = null, override var widgetNameForBaseAdapter: String? = NaviWidgetType.UPLOAD_CARD_WIDGET.value, ) : NaviWidgetData() { diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/FooterWithTitleAndActionView.kt b/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/FooterWithTitleAndActionView.kt index f9db2e01c2..1c4295af53 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/FooterWithTitleAndActionView.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/FooterWithTitleAndActionView.kt @@ -46,6 +46,7 @@ constructor(context: Context, attrs: AttributeSet? = null) : BaseNaviWidgetView( insuranceAnalyticsHandler.interceptActionAndSendEvent(callback), ) this.binding?.actionButton?.setButtonData(viewData?.button) + this.binding?.actionButton?.isEnabled = viewData?.buttonState.orTrue() this.binding?.divider?.isVisible = viewData?.showDivider.orTrue() diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/NaviWidgetViewDataExt.kt b/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/NaviWidgetViewDataExt.kt index 18e0fb584e..49bcc3d8a0 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/NaviWidgetViewDataExt.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/NaviWidgetViewDataExt.kt @@ -93,6 +93,7 @@ fun Button.setButtonData( buttonViewData?.let { setData(buttonViewData.title) buttonViewData.action?.let { action -> setOnClickListener { callback?.invoke(action) } } + buttonViewData.cta?.let { ctaDataInfo -> setOnClickListener { ctaDataCallback?.invoke(ctaDataInfo) } } @@ -132,6 +133,7 @@ fun TextView.setData( textSize = it.toFloat() } } + textViewData.styledText textViewData.font?.let { typeface = ResourcesCompat.getFont(context, getFontStyle(it)) } View.VISIBLE @@ -159,7 +161,6 @@ private fun TextView.setColorPalette(colorPalette: ColorPalette) { ?.takeIf { isValidHexColor(it) } ?.let { backgroundColor -> setBackgroundColor(Color.parseColor(backgroundColor)) } colorPalette.text?.let { textColor -> setTextColor(Color.parseColor(textColor)) } - colorPalette.gradient?.let { gradient -> if ( isValidHexColor(gradient.startGradientColor) && @@ -298,7 +299,7 @@ fun TabLayout.addTextTab(text: String?, isSelected: Boolean) { if (isSelected) { typeface = ResourcesCompat.getFont(context, getFontStyle(FontWeightEnum.NAVI_HEADLINE_REGULAR)) - setTextColor(ContextCompat.getColor(context, DesignR.color.blueberry)) + setTextColor(ContextCompat.getColor(context, DesignR.color.title_text_purple_color)) } else { typeface = ResourcesCompat.getFont(context, getFontStyle(FontWeightEnum.NAVI_BODY_REGULAR)) diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/TitleWithSummaryLayout.kt b/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/TitleWithSummaryLayout.kt index 73cac0fce8..bb7e9e5cb6 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/TitleWithSummaryLayout.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/TitleWithSummaryLayout.kt @@ -11,15 +11,12 @@ import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import android.view.View -import android.view.animation.AnimationUtils -import android.widget.TextView -import androidx.core.content.res.ResourcesCompat import androidx.core.view.isVisible import androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding import com.navi.base.model.CtaData +import com.navi.base.utils.orFalse import com.navi.base.utils.orTrue -import com.navi.design.R as DesignR import com.navi.insurance.R import com.navi.insurance.common.models.Action import com.navi.insurance.common.models.NaviWidgetData @@ -70,6 +67,7 @@ constructor(context: Context, attrs: AttributeSet? = null) : BaseNaviWidgetView( itemViewBinding.title.setData(itemData?.title) itemViewBinding.subtitle.setData(itemData?.subTitle) + itemViewBinding.titleIcon.isVisible = itemData?.validated.orFalse() itemData?.rightIcon?.let { itemViewBinding.itemHeader.setImageFieldData(it) } itemViewBinding.divider.isVisible = index != 0 @@ -90,31 +88,6 @@ constructor(context: Context, attrs: AttributeSet? = null) : BaseNaviWidgetView( -> val isItemValid = uploadSummaryItemWidget.widgetData?.validated isValid = isValid && isItemValid.orTrue() - if (!isItemValid.orTrue()) { - val itemView = binding?.listHolderLayout?.getChildAt(index) - itemView - ?.findViewById(R.id.title) - ?.setTextColor( - ResourcesCompat.getColor( - context.resources, - DesignR.color.color_EF0000, - null, - ) - ) - itemView - ?.findViewById(R.id.subtitle) - ?.setTextColor( - ResourcesCompat.getColor( - context.resources, - DesignR.color.color_EF0000, - null, - ) - ) - - itemView?.startAnimation( - AnimationUtils.loadAnimation(context, R.anim.horizontal_shake) - ) - } } return isValid } diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/UploadCardWidgetView.kt b/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/UploadCardWidgetView.kt index 9ae621f23c..46fd2f4b95 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/UploadCardWidgetView.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/UploadCardWidgetView.kt @@ -20,6 +20,7 @@ import androidx.core.view.isVisible import androidx.databinding.DataBindingUtil import androidx.recyclerview.widget.GridLayoutManager import com.navi.base.model.AnalyticsEvent +import com.navi.base.utils.isNotNullAndNotEmpty import com.navi.base.utils.orFalse import com.navi.base.utils.orTrue import com.navi.base.utils.orZero @@ -71,14 +72,12 @@ constructor(context: Context, attrs: AttributeSet? = null) : LinearLayout(contex documentsLoadingState: UploadCardsListViewState.DocumentsLoadingState? ) { if (documentsLoadingState?.loaded.orTrue()) { - binding.loaderText.isVisible = false - binding.loaderIcon.isVisible = false + binding.progressLottie.isVisible = false } } fun updateDocuments(documentsList: List?, arePagesLoaded: Boolean?) { adapter?.updateData(documentsList, arePagesLoaded) - updateToolTipAndSuggestionView() val uploadedDocCount = getUploadedDocsCount() toggleErrorState(false, getUploadedDocumentsText(uploadedDocCount), uploadedDocCount > 0) } @@ -128,8 +127,6 @@ constructor(context: Context, attrs: AttributeSet? = null) : LinearLayout(contex val uploadedDocCount = getUploadedDocsCount() toggleErrorState(false, getUploadedDocumentsText(uploadedDocCount), uploadedDocCount > 0) - updateToolTipAndSuggestionView() - binding.uploadDocumentGrid.layoutManager = GridLayoutManager(context, spanCount) binding.uploadDocumentGrid.adapter = adapter binding.uploadDocumentGrid.isNestedScrollingEnabled = false @@ -159,12 +156,18 @@ constructor(context: Context, attrs: AttributeSet? = null) : LinearLayout(contex widgetData?.header?.rightText, insuranceAnalyticsHandler.interceptActionAndSendEvent(actionCallback), ) + binding.rightTextIcon.setData( + widgetData?.header?.rightText?.rightIcon, + insuranceAnalyticsHandler.interceptActionAndSendEvent(actionCallback), + ) updateUploadedDocuments(widgetData, actionCallback, callback, filePath) toggleErrorState(false, widgetData?.description?.text) - updateToolTipAndSuggestionView() + updateInfoLayoutView(widgetData?.infoTitle) + + updateBottomTagView(widgetData?.bottomTagTitle) // set checkbox data widgetData?.checkBox?.let { setCheckboxData(it) } @@ -183,11 +186,30 @@ constructor(context: Context, attrs: AttributeSet? = null) : LinearLayout(contex return super.dispatchTouchEvent(ev) } + private fun updateInfoLayoutView(infoTitle: TextViewData?) { + if (infoTitle?.text.isNotNullAndNotEmpty()) { + binding.infoLayout.visibility = View.VISIBLE + binding.infoText.setData(infoTitle) + binding.infoIcon.setData(infoTitle?.leftIcon) + } else { + binding.infoLayout.visibility = View.GONE + } + } + + private fun updateBottomTagView(bottomTagTitle: TextViewData?) { + if (bottomTagTitle?.text.isNotNullAndNotEmpty()) { + binding.bottomTagLayout.visibility = View.VISIBLE + binding.bottomTagText.setData(bottomTagTitle) + } else { + binding.bottomTagLayout.visibility = View.GONE + } + } + private fun updateToolTipAndSuggestionView() { if (adapter?.getData()?.size.orZero() > 0) { binding.suggestionLayout.isVisible = false - binding.divider.isVisible = true - binding.tooltipButton.isVisible = true + binding.divider.isVisible = false + binding.tooltipButton.isVisible = false widgetData?.toolTip?.let { setTooltipData(it) } } else { binding.tooltipButton.isVisible = false @@ -206,9 +228,6 @@ constructor(context: Context, attrs: AttributeSet? = null) : LinearLayout(contex ) { val minUploadCheckValid = getUploadedDocsCount() >= widgetData?.minUpload.orZero() isWidgetValid = isWidgetValid && minUploadCheckValid - if (!minUploadCheckValid) { - toggleErrorState(true, validationData?.errorText) - } } return isWidgetValid @@ -239,7 +258,7 @@ constructor(context: Context, attrs: AttributeSet? = null) : LinearLayout(contex ), ) ) - binding.documentUploadCountTv.isVisible = showCountText + binding.documentUploadCountTv.isVisible = false if (showError) { startAnimation(AnimationUtils.loadAnimation(context, R.anim.horizontal_shake)) postDelayed({ binding.listCardView.strokeColor = -1 }, 3000) @@ -272,8 +291,8 @@ constructor(context: Context, attrs: AttributeSet? = null) : LinearLayout(contex } private fun setSuggestionsData(tips: List) { - binding.suggestionLayout.isVisible = tips.isNotEmpty() - binding.divider.isVisible = tips.isEmpty() + binding.suggestionLayout.isVisible = false + binding.divider.isVisible = false if (tips.isNotEmpty()) { binding.suggestionLayout.removeAllViews() diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/UploadCardsContainer.kt b/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/UploadCardsContainer.kt index 4f1c2b6cf2..7a0caea2ae 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/UploadCardsContainer.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/UploadCardsContainer.kt @@ -96,7 +96,9 @@ constructor(context: Context, attrs: AttributeSet? = null) : LinearLayout(contex fun areWidgetsValid(): Boolean { var result = true - for (i in 0 until childCount) { + val count = childCount + if (count == 0) return false + for (i in 0 until count) { val child = getChildAt(i) as? UploadCardWidgetView result = result && child?.validateWidget().orTrue() } diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/chat/ButtonListFooterView.kt b/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/chat/ButtonListFooterView.kt index 88f2530401..8656a92bef 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/chat/ButtonListFooterView.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/common/widgets/chat/ButtonListFooterView.kt @@ -9,18 +9,14 @@ package com.navi.insurance.chat.view import android.content.Context import android.util.AttributeSet -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup +import android.widget.Button import androidx.databinding.ViewDataBinding -import androidx.recyclerview.widget.RecyclerView import com.navi.insurance.common.models.Action import com.navi.insurance.common.models.ButtonListData import com.navi.insurance.common.models.ButtonViewData import com.navi.insurance.common.models.ChatFooterInput import com.navi.insurance.common.widgets.setData import com.navi.insurance.databinding.FooterViewButtonListBinding -import com.navi.insurance.databinding.ItemButtonBinding class ButtonListFooterView @JvmOverloads @@ -36,60 +32,49 @@ constructor(context: Context, attrs: AttributeSet? = null) : BaseChatFooterView( this.binding = binding as? FooterViewButtonListBinding val viewData = inputData.widgetData as? ButtonListData - this.binding?.header?.setData(viewData?.header?.title) + val buttons = viewData?.buttonList.orEmpty() - viewData - ?.buttonList - ?.takeIf { it.isNotEmpty() } - ?.let { it -> - this.binding?.buttonList?.visibility = View.VISIBLE - this.binding?.buttonList?.adapter = - ButtonListAdapter(it) { action, buttonViewData -> - callback.invoke( - actionInterceptor.updateChatAction( - action, - chatAnswerConverter.convertStringAnswerToNextApiActionData( - buttonViewData?.id, - buttonViewData?.title?.text, - ), - ) + val primary = this.binding?.primaryButton + val secondary = this.binding?.secondaryButton + + when (buttons.size) { + 1 -> { + setButtonData(primary, buttons[0], callback) + } + + 2 -> { + setButtonData(primary, buttons[0], callback) + setButtonData(secondary, buttons[1], callback) + } + else -> {} + } + } + + private fun setButtonData( + button: Button?, + buttonData: ButtonViewData, + callback: (action: Action) -> Unit, + ) { + button?.apply { + setData(buttonData) + setOnClickListener { + buttonData.action?.let { action -> + callback.invoke( + actionInterceptor.updateChatAction( + action, + chatAnswerConverter.convertStringAnswerToNextApiActionData( + buttonData.id, + buttonData.title?.text, + ), ) - sendEvent(action) - } - } ?: run { this.binding?.buttonList?.visibility = View.GONE } + ) + sendEvent(action) + } + } + } } private fun sendEvent(action: Action) { action.analyticsEvent?.let { insuranceAnalyticsHandler.sendEvent(it) } } } - -class ButtonListAdapter( - private val buttonViewDataList: List, - private val callback: (action: Action, buttonViewData: ButtonViewData?) -> Unit, -) : RecyclerView.Adapter() { - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ButtonListViewHolder { - val itemButtonBinding = - ItemButtonBinding.inflate(LayoutInflater.from(parent.context), parent, false) - return ButtonListViewHolder(itemButtonBinding, callback) - } - - override fun onBindViewHolder(holder: ButtonListViewHolder, position: Int) { - holder.setData(buttonViewDataList[position]) - } - - override fun getItemCount(): Int { - return buttonViewDataList.size - } -} - -class ButtonListViewHolder( - private val binding: ItemButtonBinding, - private val callback: (action: Action, viewData: ButtonViewData?) -> Unit, -) : RecyclerView.ViewHolder(binding.root) { - - fun setData(buttonViewData: ButtonViewData) { - binding.button.setData(buttonViewData, { action -> callback(action, buttonViewData) }) - } -} diff --git a/android/navi-insurance/src/main/res/drawable/chat_answer_background.xml b/android/navi-insurance/src/main/res/drawable/chat_answer_background.xml index eaac74ea41..c60eea5d7d 100644 --- a/android/navi-insurance/src/main/res/drawable/chat_answer_background.xml +++ b/android/navi-insurance/src/main/res/drawable/chat_answer_background.xml @@ -4,10 +4,14 @@ - + + android:color="@color/card_stroke" /> \ No newline at end of file diff --git a/android/navi-insurance/src/main/res/drawable/chat_question_background.xml b/android/navi-insurance/src/main/res/drawable/chat_question_background.xml index a36f241cf5..bd6277b5b2 100644 --- a/android/navi-insurance/src/main/res/drawable/chat_question_background.xml +++ b/android/navi-insurance/src/main/res/drawable/chat_question_background.xml @@ -4,6 +4,9 @@ - + \ No newline at end of file diff --git a/android/navi-insurance/src/main/res/drawable/circular_progress.xml b/android/navi-insurance/src/main/res/drawable/circular_progress.xml index 35920f51c5..d9e299881a 100644 --- a/android/navi-insurance/src/main/res/drawable/circular_progress.xml +++ b/android/navi-insurance/src/main/res/drawable/circular_progress.xml @@ -16,7 +16,7 @@ android:shape="ring" android:thicknessRatio="16" android:useLevel="true"> - + diff --git a/android/navi-insurance/src/main/res/drawable/picker_camera.xml b/android/navi-insurance/src/main/res/drawable/picker_camera.xml index 78303b7241..8ce45ba65f 100644 --- a/android/navi-insurance/src/main/res/drawable/picker_camera.xml +++ b/android/navi-insurance/src/main/res/drawable/picker_camera.xml @@ -5,5 +5,5 @@ android:viewportHeight="40"> + android:fillColor="@color/ctaPurplePrimaryColor"/> diff --git a/android/navi-insurance/src/main/res/drawable/picker_files.xml b/android/navi-insurance/src/main/res/drawable/picker_files.xml index 013de2dbe3..a77cc7165d 100644 --- a/android/navi-insurance/src/main/res/drawable/picker_files.xml +++ b/android/navi-insurance/src/main/res/drawable/picker_files.xml @@ -5,5 +5,5 @@ android:viewportHeight="40"> + android:fillColor="@color/ctaPurplePrimaryColor"/> diff --git a/android/navi-insurance/src/main/res/drawable/picker_gallery.xml b/android/navi-insurance/src/main/res/drawable/picker_gallery.xml index ca6c935568..60cd7ea528 100644 --- a/android/navi-insurance/src/main/res/drawable/picker_gallery.xml +++ b/android/navi-insurance/src/main/res/drawable/picker_gallery.xml @@ -5,5 +5,5 @@ android:viewportHeight="40"> + android:fillColor="@color/ctaPurplePrimaryColor"/> diff --git a/android/navi-insurance/src/main/res/drawable/rounded_rectangle_grey.xml b/android/navi-insurance/src/main/res/drawable/rounded_rectangle_grey.xml index 173f229829..6ef599eff4 100644 --- a/android/navi-insurance/src/main/res/drawable/rounded_rectangle_grey.xml +++ b/android/navi-insurance/src/main/res/drawable/rounded_rectangle_grey.xml @@ -13,5 +13,5 @@ - + \ No newline at end of file diff --git a/android/navi-insurance/src/main/res/drawable/rounded_rectangle_grey_4_radius.xml b/android/navi-insurance/src/main/res/drawable/rounded_rectangle_grey_4_radius.xml new file mode 100644 index 0000000000..c59d1bae69 --- /dev/null +++ b/android/navi-insurance/src/main/res/drawable/rounded_rectangle_grey_4_radius.xml @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/android/navi-insurance/src/main/res/drawable/rounded_rectangle_grey_bg_radius_8dp_with_border.xml b/android/navi-insurance/src/main/res/drawable/rounded_rectangle_grey_bg_radius_8dp_with_border.xml new file mode 100644 index 0000000000..aab96fac9a --- /dev/null +++ b/android/navi-insurance/src/main/res/drawable/rounded_rectangle_grey_bg_radius_8dp_with_border.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/android/navi-insurance/src/main/res/drawable/rounded_rectangle_light_blue_radius_4.xml b/android/navi-insurance/src/main/res/drawable/rounded_rectangle_light_blue_radius_4.xml new file mode 100644 index 0000000000..3d649356ed --- /dev/null +++ b/android/navi-insurance/src/main/res/drawable/rounded_rectangle_light_blue_radius_4.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/android/navi-insurance/src/main/res/drawable/white_cross_icon_with_purple_background.xml b/android/navi-insurance/src/main/res/drawable/white_cross_icon_with_purple_background.xml new file mode 100644 index 0000000000..59b6093aa5 --- /dev/null +++ b/android/navi-insurance/src/main/res/drawable/white_cross_icon_with_purple_background.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/android/navi-insurance/src/main/res/layout/add_document_item.xml b/android/navi-insurance/src/main/res/layout/add_document_item.xml index 71fe9a4073..0a32e2e196 100644 --- a/android/navi-insurance/src/main/res/layout/add_document_item.xml +++ b/android/navi-insurance/src/main/res/layout/add_document_item.xml @@ -8,16 +8,23 @@ android:padding="@dimen/dp_8" app:layout_constraintTop_toTopOf="parent"> - + app:layout_constraintEnd_toEndOf="parent"> + + \ No newline at end of file diff --git a/android/navi-insurance/src/main/res/layout/circular_progress_bar_with_text.xml b/android/navi-insurance/src/main/res/layout/circular_progress_bar_with_text.xml index 418c9348e1..6c2056479d 100644 --- a/android/navi-insurance/src/main/res/layout/circular_progress_bar_with_text.xml +++ b/android/navi-insurance/src/main/res/layout/circular_progress_bar_with_text.xml @@ -23,7 +23,9 @@ android:id="@+id/text_view_progress" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:fontFamily="@font/navi_body_regular" + android:fontFamily="@font/navi_headline_regular" + android:textColor="@color/dim_grey" + android:textSize="@dimen/sp_20" android:textAppearance="@style/TextAppearance.AppCompat.Large" app:layout_constraintBottom_toBottomOf="@+id/progress_bar" app:layout_constraintEnd_toEndOf="@+id/progress_bar" diff --git a/android/navi-insurance/src/main/res/layout/doc_picker_bottomsheet.xml b/android/navi-insurance/src/main/res/layout/doc_picker_bottomsheet.xml index fa279ca10c..e5fd7b5a51 100644 --- a/android/navi-insurance/src/main/res/layout/doc_picker_bottomsheet.xml +++ b/android/navi-insurance/src/main/res/layout/doc_picker_bottomsheet.xml @@ -57,9 +57,13 @@ android:id="@+id/camera_picker" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/dp_30" + android:layout_marginStart="@dimen/dp_20" android:layout_marginTop="@dimen/dp_32" android:layout_marginBottom="@dimen/dp_32" + android:layout_marginEnd="@dimen/dp_20" + android:background="@drawable/rounded_rectangle_8dp_dark_grey_stroke" + android:paddingHorizontal="@dimen/dp_24" + android:paddingVertical="@dimen/dp_12" android:orientation="vertical" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/gallery_picker" @@ -81,7 +85,7 @@ android:layout_marginTop="@dimen/dp_4" android:fontFamily="@font/navi_headline_regular" android:text="@string/picker_camera" - android:textColor="@color/blueberry" + android:textColor="@color/title_text_purple_color" android:textSize="@dimen/sp_14" /> @@ -92,6 +96,10 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_32" android:layout_marginBottom="@dimen/dp_32" + android:layout_marginEnd="@dimen/dp_20" + android:background="@drawable/rounded_rectangle_8dp_dark_grey_stroke" + android:paddingHorizontal="@dimen/dp_24" + android:paddingVertical="@dimen/dp_12" android:orientation="vertical" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/file_picker" @@ -111,7 +119,7 @@ android:layout_marginTop="@dimen/dp_4" android:fontFamily="@font/navi_headline_regular" android:text="@string/picker_gallery" - android:textColor="@color/blueberry" + android:textColor="@color/title_text_purple_color" android:textSize="@dimen/sp_14" /> @@ -121,8 +129,11 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_32" - android:layout_marginEnd="@dimen/dp_30" + android:layout_marginEnd="@dimen/dp_20" android:layout_marginBottom="@dimen/dp_32" + android:background="@drawable/rounded_rectangle_8dp_dark_grey_stroke" + android:paddingHorizontal="@dimen/dp_24" + android:paddingVertical="@dimen/dp_12" android:orientation="vertical" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -142,7 +153,7 @@ android:layout_marginTop="@dimen/dp_4" android:fontFamily="@font/navi_headline_regular" android:text="@string/picker_file" - android:textColor="@color/blueberry" + android:textColor="@color/title_text_purple_color" android:textSize="@dimen/sp_14" /> diff --git a/android/navi-insurance/src/main/res/layout/document_image_preview_fragment.xml b/android/navi-insurance/src/main/res/layout/document_image_preview_fragment.xml index a7c5a86233..284c9f5937 100644 --- a/android/navi-insurance/src/main/res/layout/document_image_preview_fragment.xml +++ b/android/navi-insurance/src/main/res/layout/document_image_preview_fragment.xml @@ -18,10 +18,8 @@ android:paddingTop="@dimen/dp_16" android:paddingBottom="@dimen/dp_16" android:src="@drawable/cross_black" - app:layout_constraintBottom_toBottomOf="@+id/preview_image_name" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toTopOf="@id/pdfLayout"/> + app:layout_constraintTop_toTopOf="parent" /> + android:background="@color/backgroundPrimaryColor"> - + app:layout_constraintTop_toBottomOf="@+id/header"> +