diff --git a/.github/workflows/android_checkstyle.yml b/.github/workflows/android_checkstyle.yml index d7901f9a25..eb1a49d10a 100644 --- a/.github/workflows/android_checkstyle.yml +++ b/.github/workflows/android_checkstyle.yml @@ -2,7 +2,7 @@ name: Android Checkstyle CI on: pull_request: - branches: [ development ] + branches: [ master, release-*, development ] merge_group: concurrency: diff --git a/app/build.gradle b/app/build.gradle index ec031c5fb7..8013c15dcd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ kapt { correctErrorTypes true } -def VERSION_CODE = 373 -def VERSION_NAME = "4.3.1" +def VERSION_CODE = 374 +def VERSION_NAME = "4.4.0" android { namespace 'com.naviapp' diff --git a/app/src/main/java/com/naviapp/dashboard/loanapplicationdetails/activities/LoanApplicationDetailActivity.kt b/app/src/main/java/com/naviapp/dashboard/loanapplicationdetails/activities/LoanApplicationDetailActivity.kt index 2cd4a6499d..dd8b9f3522 100644 --- a/app/src/main/java/com/naviapp/dashboard/loanapplicationdetails/activities/LoanApplicationDetailActivity.kt +++ b/app/src/main/java/com/naviapp/dashboard/loanapplicationdetails/activities/LoanApplicationDetailActivity.kt @@ -30,7 +30,6 @@ import com.navi.common.utils.log import com.navi.common.utils.observeNullable import com.navi.homeloan.common.customview.HLCommonBottomSheet import com.navi.homeloan.common.models.HomeLoanGenericBottomSheetData -import com.navi.naviwidgets.base.ui.TitleDescriptionCtaBottomSheet import com.naviapp.R import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.navigator.NaviDeepLinkNavigator @@ -58,6 +57,8 @@ import com.naviapp.utils.Constants.AUTO_DEBIT_BACK import com.naviapp.utils.Constants.EMPTY import com.naviapp.utils.Constants.INCOME_VERIFICATION import com.naviapp.utils.Constants.JOURNEY_TYPE +import com.naviapp.utils.Constants.TYPE_HOME_LOAN +import com.naviapp.utils.Constants.TYPE_PERSONAL_LOAN import com.naviapp.utils.Constants.WIDGET_ID import com.naviapp.utils.LOAN_ACCOUNT_NUMBER import com.naviapp.utils.getLendingModuleNameFromWidgetId @@ -183,19 +184,51 @@ class LoanApplicationDetailActivity : } private fun addHelpOption(loanType: String?) { - if (loanType == Constants.TYPE_HOME_LOAN) { - binding.topHeaderLay.helpTv.visibility = View.VISIBLE - binding.topHeaderLay.helpTv.setOnClickListener { - openHelpInfo(SCREEN_NAME_HL, loanType) + when (loanType) { + TYPE_HOME_LOAN -> { + showHelpButton(SCREEN_NAME_HL,loanType) } + + TYPE_PERSONAL_LOAN -> { + showHelpButton(LOAN_DETAILS,loanType) + } + + else -> {} } } - private fun openHelpInfo(keyName: String, loanType: String?) { - if (isDead()) return - helpEventTracker.onHelpButtonClick(screenName, loanType) - val bottomSheet = CustomerSupportFragment.newInstance(keyName, null, loanType) - safelyShowBottomSheet(bottomSheet, CustomerSupportFragment.TAG) + private fun showHelpButton(screenName:String,loanType: String){ + binding.topHeaderLay.helpTv.visibility = View.VISIBLE + binding.topHeaderLay.helpTv.setOnClickListener { + openHelpInfo(screenName, loanType) + } + } + + private fun openHelpInfo(screenName: String, loanType: String?) { + when (loanType) { + TYPE_HOME_LOAN -> { + if (isDead()) return + helpEventTracker.onHelpButtonClick(screenName, loanType) + val bottomSheet = CustomerSupportFragment.newInstance(screenName, null, loanType) + safelyShowBottomSheet(bottomSheet, CustomerSupportFragment.TAG) + } + + TYPE_PERSONAL_LOAN -> { + if (isDead()) return + helpEventTracker.onHelpButtonClick(screenName,loanType) + NaviDeepLinkNavigator.navigate( + activity = this, ctaData = CtaData( + url = Constants.PRODUCT_HELP_PAGE, parameters = listOf( + LineItem( + key = Constants.CRM_HELP_SCREEN_NAME, value = screenName + ) + ) + ) + ) + } + + else -> {} + } } private fun initData(data: LoanApplicationDetails) { @@ -263,10 +296,10 @@ class LoanApplicationDetailActivity : if (bundle?.getString(AUTO_DEBIT_BACK).equals(Constants.TRUE)) { val bankAutoDebitFragment = supportFragmentManager.findFragmentByTag(BankDetailsAutoDebitFragment.TAG) - as? BankDetailsAutoDebitFragment? + as? BankDetailsAutoDebitFragment? val bankDetailsFragment = supportFragmentManager.findFragmentByTag(BankDetailsFragment.TAG) - as? BankDetailsFragment? + as? BankDetailsFragment? if (bankAutoDebitFragment != null && bankAutoDebitFragment.isVisible) { showLoader() bundle?.getString(LOAN_ACCOUNT_NUMBER)?.let { @@ -381,10 +414,10 @@ class LoanApplicationDetailActivity : override fun onBackPressed() { val bankAutoDebitFragment = supportFragmentManager.findFragmentByTag(BankDetailsAutoDebitFragment.TAG) - as? BankDetailsAutoDebitFragment? + as? BankDetailsAutoDebitFragment? val bankDetailsFragment = supportFragmentManager.findFragmentByTag(BankDetailsFragment.TAG) - as? BankDetailsFragment? + as? BankDetailsFragment? if (bankAutoDebitFragment != null && bankAutoDebitFragment.isVisible) { supportFragmentManager.beginTransaction().remove(bankAutoDebitFragment).commit() showLoader() diff --git a/app/src/main/java/com/naviapp/home/dashboard/models/response/DashboardContentResponse.kt b/app/src/main/java/com/naviapp/home/dashboard/models/response/DashboardContentResponse.kt index d45fc56b27..831a8f7006 100644 --- a/app/src/main/java/com/naviapp/home/dashboard/models/response/DashboardContentResponse.kt +++ b/app/src/main/java/com/naviapp/home/dashboard/models/response/DashboardContentResponse.kt @@ -10,12 +10,14 @@ package com.naviapp.home.dashboard.models.response import android.os.Parcelable import com.google.gson.annotations.SerializedName import com.navi.base.model.ActionData +import com.navi.common.model.common.Header import com.navi.naviwidgets.models.NaviWidget import java.io.Serializable import kotlinx.parcelize.Parcelize @Parcelize data class DashboardContentResponse( + @SerializedName("header") val header:Header? = null, @SerializedName("contentWidget") val listOfWidgets: List? = null, @SerializedName("metaData") val metaData: DashboardContentMetaData? = null ) : Serializable, Parcelable diff --git a/app/src/main/java/com/naviapp/home/dashboard/ui/ProductFragment.kt b/app/src/main/java/com/naviapp/home/dashboard/ui/ProductFragment.kt index 3b741ad974..7b57ebc10a 100644 --- a/app/src/main/java/com/naviapp/home/dashboard/ui/ProductFragment.kt +++ b/app/src/main/java/com/naviapp/home/dashboard/ui/ProductFragment.kt @@ -36,6 +36,7 @@ import com.navi.base.utils.isNull import com.navi.base.utils.orFalse import com.navi.chat.ui.fragments.NaviChatErrorFragment import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper +import com.navi.common.model.common.Header import com.navi.common.ui.activity.BaseActivity import com.navi.common.ui.fragment.ActionErrorFragment import com.navi.common.ui.fragment.FullScreenErrorDialog @@ -205,6 +206,7 @@ class ProductFragment : PartPrePaymentBaseFragment(), WidgetCallback, DashboardP productVM.dashboardContentResponse.observeNonNull(viewLifecycleOwner) { dashboardContentResponse -> hideLoader() TemporaryStorageHelper.updateApiTs(dashboardTab?.name.orEmpty()) + setHeaderData(dashboardContentResponse.header) binding.flError.isVisible = false binding.rvProducts.isVisible = true getFilteredNaviWidgets(dashboardContentResponse.listOfWidgets)?.let { listOfWidgets -> @@ -244,6 +246,16 @@ class ProductFragment : PartPrePaymentBaseFragment(), WidgetCallback, DashboardP } } + private fun setHeaderData(headerData: Header?) { + headerData?.let {header-> + binding.tvHelp.isVisible = header.enableHelp.orFalse() + binding.tvHelp.setOnClickListener{ + openHelpInfo(screenName) + } + } + + } + private fun handlePolices(value: String?) { val jsonData = Gson().fromJson(value, DashboardPolicyBenefitData::class.java) jsonData?.listOfPolicyBenefits?.let { @@ -513,6 +525,21 @@ class ProductFragment : PartPrePaymentBaseFragment(), WidgetCallback, DashboardP } } + private fun openHelpInfo(screenName: String) { + NaviDeepLinkNavigator.navigate( + activity = this.requireActivity(), ctaData = CtaData( + url = com.naviapp.utils.Constants.PRODUCT_HELP_PAGE, + parameters = listOf( + LineItem( + key = com.naviapp.utils.Constants.CRM_HELP_SCREEN_NAME, + value = screenName + ) + ) + ) + ) + + } + private fun toOpenBottomsheet(url: String?): Boolean { url?.let { return url.contains(SHOW_BOTTOMSHEET, true) diff --git a/app/src/main/java/com/naviapp/manager/usecase/UserDataUploadWorkerUseCase.kt b/app/src/main/java/com/naviapp/manager/usecase/UserDataUploadWorkerUseCase.kt index 52bee12788..ac79580161 100644 --- a/app/src/main/java/com/naviapp/manager/usecase/UserDataUploadWorkerUseCase.kt +++ b/app/src/main/java/com/naviapp/manager/usecase/UserDataUploadWorkerUseCase.kt @@ -11,9 +11,11 @@ import androidx.work.OneTimeWorkRequestBuilder import androidx.work.PeriodicWorkRequestBuilder import androidx.work.WorkManager import com.google.gson.Gson +import com.navi.base.utils.orFalse import com.navi.base.utils.orZero import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper import com.navi.common.utils.log +import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.manager.RetryableUserDataUploadWorker import com.naviapp.manager.RetryableUserDataUploadWorker.Companion.API_FAILURE_RETRY_REQUIRED import com.naviapp.manager.RetryableUserDataUploadWorker.Companion.DEFAULT_WORKER_RETRY_COUNT @@ -30,11 +32,17 @@ import javax.inject.Inject class UserDataUploadWorkerUseCase @Inject constructor(@ApplicationContext val context: Context) { fun initDataUploadWorker(screenName: String) { - val dataUploadConfig = getDataUploadConfig() - if (dataUploadConfig != null && isAllowedAppVersion(dataUploadConfig)) { - startRetryDataUploadWorker(dataUploadConfig, screenName) + if (isOneTimeDataUploadDisabled().not()) { + val dataUploadConfig = getDataUploadConfig() + if (dataUploadConfig != null && isAllowedAppVersion(dataUploadConfig)) { + startRetryDataUploadWorker(dataUploadConfig, screenName) + } else { + startOldDataUploadWorker(screenName) + } } else { - startOldDataUploadWorker(screenName) + NaviAnalytics.naviAnalytics.BaseUserDataUploadWorker( + screenName, APP_LAUNCH_DATA_UPLOAD_WORKER + ).onEvent(ONE_TIME_DATA_UPLOAD_DISABLED, null) } } @@ -102,6 +110,12 @@ class UserDataUploadWorkerUseCase @Inject constructor(@ApplicationContext val co } } + private fun isOneTimeDataUploadDisabled(): Boolean { + return FirebaseRemoteConfigHelper.getBoolean( + FirebaseRemoteConfigHelper.ONE_TIME_DATA_UPLOAD_DISABLED + ).orFalse() + } + private fun getPeriodicDataUploadConfig(): DataUploadFirebaseConfig? { return try { Gson().fromJson( @@ -138,6 +152,8 @@ class UserDataUploadWorkerUseCase @Inject constructor(@ApplicationContext val co val repeatInterval = if (dataUploadConfig.repeatIntervalInSeconds.orZero() > 0) dataUploadConfig.repeatIntervalInSeconds.orZero() else WORKER_INTERVAL_TIME_IN_SECONDS + + val initialDelay = dataUploadConfig.initialDelayInSeconds.orZero() val uploadConstraints = Constraints.Builder() .setRequiresCharging(false) @@ -161,6 +177,7 @@ class UserDataUploadWorkerUseCase @Inject constructor(@ApplicationContext val co .setConstraints(uploadConstraints) .setBackoffCriteria(BackoffPolicy.LINEAR, retrySeconds, TimeUnit.SECONDS) .setConstraints(uploadConstraints) + .setInitialDelay(initialDelay, TimeUnit.SECONDS) .addTag(PERIODIC_USER_UPLOAD_WORKER_TAG) .build() WorkManager.getInstance(context) @@ -200,6 +217,8 @@ class UserDataUploadWorkerUseCase @Inject constructor(@ApplicationContext val co const val on_data_upload_acknowledgement_failure = "on_data_upload_acknowledgement_failure" const val PL_Ingestion_Task_List_Empty = "PL_Ingestion_Task_List_Empty" + + const val ONE_TIME_DATA_UPLOAD_DISABLED = "ONE_TIME_DATA_UPLOAD_DISABLED" } } \ No newline at end of file diff --git a/app/src/main/java/com/naviapp/models/DataUploadFirebaseConfig.kt b/app/src/main/java/com/naviapp/models/DataUploadFirebaseConfig.kt index 1155fd4960..045b440370 100644 --- a/app/src/main/java/com/naviapp/models/DataUploadFirebaseConfig.kt +++ b/app/src/main/java/com/naviapp/models/DataUploadFirebaseConfig.kt @@ -8,4 +8,5 @@ data class DataUploadFirebaseConfig( @SerializedName("retryCount") val retryCount: Int? = null, @SerializedName("retryDelayInSeconds") val retryDelayInSeconds: Long? = null, @SerializedName("repeatIntervalInSeconds") val repeatIntervalInSeconds: Long? = null, + @SerializedName("initialDelayInSeconds") val initialDelayInSeconds: Long? = null ) diff --git a/app/src/main/res/layout/fragment_product.xml b/app/src/main/res/layout/fragment_product.xml index 852bac2c6c..43b9ba82ee 100644 --- a/app/src/main/res/layout/fragment_product.xml +++ b/app/src/main/res/layout/fragment_product.xml @@ -16,13 +16,29 @@ android:background="@color/white" tools:context=".home.dashboard.ui.ProductFragment"> + + + app:layout_constraintTop_toBottomOf="@id/tvHelp">