TP-65813 | Saksham Mahajan | Removing permission gold (#10900)

Co-authored-by: nikhilkumar <nikhil.kumar@navi.com>
Co-authored-by: saksham <saksham>
This commit is contained in:
Saksham Mahajan
2024-05-20 17:11:29 +05:30
committed by GitHub
parent 1f817ad657
commit 00673a56b6
12 changed files with 495 additions and 30 deletions

View File

@@ -27,7 +27,8 @@ data class BottomSheetData(
@SerializedName("bottomSheetName") var bottomSheetName: String? = null,
@SerializedName("isCancelable") var isCancelable: Boolean? = true,
@SerializedName("heightAspectRatio") var heightAspectRatio: Double? = null,
@SerializedName("metaData") val metaData: GenericAnalytics? = null
@SerializedName("metaData") val metaData: GenericAnalytics? = null,
@SerializedName("bottomSheetContent") val bottomSheetContent: BottomSheetContent? = null
) : Parcelable, NaviClickAction()
@Parcelize
@@ -51,3 +52,12 @@ data class Radius(
@SerializedName("rightTop") val rightTop: Int? = null,
@SerializedName("rightBottom") val rightBottom: Int? = null
) : Parcelable
@Parcelize
data class BottomSheetContent(
@SerializedName("title") val title: StyledTextWithIconCode? = null,
@SerializedName("subtitle") val subtitle: StyledTextWithIconCode? = null,
@SerializedName("icon") val icon: String? = null,
@SerializedName("infoText") val infoText: StyledTextWithIconCode? = null,
var isInfoTextVisible: Boolean = false
) : Parcelable

View File

@@ -31,7 +31,7 @@ data class ActionData(
@SerializedName("finish") val finish: Boolean? = null,
@SerializedName("clearTask") val clearTask: Boolean? = null,
@SerializedName("type") val type: String? = null,
@SerializedName("title") val title: String? = null,
@SerializedName("title") var title: String? = null,
@SerializedName("description") val description: String? = null,
@SerializedName("primaryAction") val primaryAction: ActionData? = null,
@SerializedName("secondaryAction") val secondaryAction: ActionData? = null,
@@ -43,7 +43,7 @@ data class ActionData(
@SerializedName("metaData") val metaData: GenericAnalytics? = null,
@SerializedName("successMessage") val successMessage: String? = null,
@SerializedName("disabled") var disabled: Boolean? = null,
@SerializedName("action") val action: String? = null,
@SerializedName("action") var action: String? = null,
@SerializedName("bottomSheetData") val bottomSheetData: BottomSheetData? = null,
@SerializedName("lottieCode") val lottieCode: String? = null,
@SerializedName("secondaryUrl") val secondaryUrl: String? = null,

View File

@@ -93,7 +93,8 @@ data class ExtraDataDetails(
val buySummaryBottomSheetData: WidgetResponse? = null,
@SerializedName("basicDetailsProgress") val basicDetailsProgress: String? = null,
@SerializedName("sipInfo") val sipInfo: SipInfo? = null,
@SerializedName("loaderScreen") val loaderScreen: ActionCheckResponse? = null
@SerializedName("loaderScreen") val loaderScreen: ActionCheckResponse? = null,
@SerializedName("isUserInvested") val isUserInvested: Boolean? = null,
) : Parcelable
@Parcelize data class CacheConfig(val ttl: Long? = 0, val maxConsumptions: Int? = 0) : Parcelable

View File

@@ -11,6 +11,7 @@ import android.graphics.Color
import android.os.Bundle
import android.view.View
import android.view.ViewStub
import androidx.core.view.isVisible
import androidx.databinding.DataBindingUtil
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.navi.analytics.utils.NaviTrackEvent
@@ -19,6 +20,7 @@ import com.navi.base.utils.orZero
import com.navi.common.R
import com.navi.common.databinding.NewCommonBottomSheetBinding
import com.navi.common.listeners.NewBottomSheetListener
import com.navi.common.utils.setStyledText
import com.navi.design.textview.NaviTextView
import com.navi.design.utils.CornerRadius
import com.navi.design.utils.dpToPx
@@ -113,7 +115,7 @@ class NewCommonBottomSheet : BaseBottomSheet() {
var text = it
setButtonLoaderState(binding.primaryBtn, binding.buttonLoader, true, text)
}
} else {
} else if (arguments?.getBoolean(SHOULD_DISMISS_BOTTOM_SHEET) == true) {
safelyDismissDialog()
}
}
@@ -133,6 +135,18 @@ class NewCommonBottomSheet : BaseBottomSheet() {
dpToPxInInt(it.bottomDp.toInt())
)
}
data?.bottomSheetContent?.let {
binding.bottomSheetContent.root.isVisible = true
setStyledText(bottomSheetContent.title, it.title, null)
setStyledText(bottomSheetContent.subtitle, it.subtitle, null)
binding.bottomSheetContent.leftIcon.showWhenDataIsAvailable(it.icon)
if (it.isInfoTextVisible) {
it?.infoText?.let { infoText ->
binding.bottomSheetContent.info.visibility = View.VISIBLE
setStyledText(binding.bottomSheetContent.info, infoText, null)
}
}
}
}
}
@@ -159,6 +173,11 @@ class NewCommonBottomSheet : BaseBottomSheet() {
}
}
fun updateData(bottomSheetData: BottomSheetData?) {
arguments?.putParcelable(DATA, bottomSheetData)
initUi()
}
override val screenName: String
get() = TAG
@@ -166,13 +185,19 @@ class NewCommonBottomSheet : BaseBottomSheet() {
const val TAG = "NEW_COMMON_BOTTOM_SHEET"
private const val DATA = "DATA"
private const val IS_BUTTON_LOADER_PRESENT = "IS_START_BUTTON_LOADER"
private const val SHOULD_DISMISS_BOTTOM_SHEET = "SHOULD_DISMISS_BOTTOM_SHEET"
fun getInstance(data: BottomSheetData?, isButtonLoaderPresent: Boolean = false) =
fun getInstance(
data: BottomSheetData?,
isButtonLoaderPresent: Boolean = false,
shouldDismissBottomSheet: Boolean = true
) =
NewCommonBottomSheet().apply {
arguments =
Bundle().apply {
this.putParcelable(DATA, data)
putBoolean(IS_BUTTON_LOADER_PRESENT, isButtonLoaderPresent)
putBoolean(SHOULD_DISMISS_BOTTOM_SHEET, shouldDismissBottomSheet)
isCancelable = data?.isCancelable == true
}
}

View File

@@ -0,0 +1,58 @@
<?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.appcompat.widget.AppCompatImageView
android:id="@+id/left_icon"
android:layout_width="@dimen/dp_40"
android:layout_height="@dimen/dp_40"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.navi.design.textview.NaviTextView
android:id="@+id/title"
style="@style/Title8TextStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_8"
app:layout_constraintStart_toEndOf="@id/left_icon"
app:layout_constraintTop_toTopOf="parent"
tools:text="Permission" />
<com.navi.design.textview.NaviTextView
android:id="@+id/subtitle"
style="@style/TextV10Style"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_8"
android:gravity="left"
android:lineHeight="@dimen/dp_18"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/left_icon"
app:layout_constraintTop_toBottomOf="@+id/title"
tools:text="To confirm you are residing in a serviceable location." />
<com.navi.design.textview.NaviTextView
android:id="@+id/info"
style="@style/Subtitle10TextStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_8"
android:layout_marginTop="@dimen/dp_16"
android:gravity="left"
android:lineHeight="@dimen/dp_18"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/left_icon"
app:layout_constraintTop_toBottomOf="@+id/subtitle"
tools:text="Phone settings > Apps > Navi > Permissions" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View File

@@ -42,6 +42,14 @@
android:letterSpacing="0.02"
tools:text="Age is not eligible" />
<include
android:id="@+id/bottom_sheet_content"
layout="@layout/image_title_and_subtitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_24"
android:visibility="gone" />
<com.navi.design.textview.NaviTextView
android:id="@+id/message_tv"
style="@style/Body6TextStyle"

View File

@@ -27,4 +27,12 @@ class DigitalGoldHomeRepo @Inject constructor(private val retrofitService: Retro
suspend fun fetchDigitalGoldHomeDetailsPolling() =
apiResponseCallback(retrofitService.getDigitalGoldHomePolling())
suspend fun fetchStaticBottomSheetData(
type: String
) = apiResponseCallback(
retrofitService.getStaticBottomSheetData(
type
)
)
}

View File

@@ -1,6 +1,7 @@
package com.navi.gold.retrofit
import PennyDropOptionsScreenData
import com.navi.base.model.BottomSheetData
import com.navi.common.model.ActionCheckResponse
import com.navi.common.model.CommonPermissionResponse
import com.navi.common.model.common.AppActionObjective
@@ -223,4 +224,9 @@ interface RetrofitService {
suspend fun getDigitalGoldBuyOrderV2(
@Body goldBuyOrderRequest: GoldBuyOrderRequest
): Response<GenericResponse<GoldSellOrderResponse>>
@GET("/kuber/static/bottom-sheet/permission")
suspend fun getStaticBottomSheetData(
@Query("type") type: String
): Response<GenericResponse<BottomSheetData>>
}

View File

@@ -7,14 +7,18 @@
package com.navi.gold.ui
import android.Manifest
import android.app.Activity
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Color
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import android.text.TextUtils
import android.util.Log
import android.view.View
import android.view.animation.AnimationUtils
import android.view.inputmethod.InputMethodManager
@@ -22,6 +26,7 @@ import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
import androidx.annotation.StyleRes
import androidx.core.app.ActivityCompat
import androidx.core.view.isVisible
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.FragmentManager
@@ -54,6 +59,7 @@ import com.navi.chat.ui.activities.SupportScreenActivity
import com.navi.chat.utils.DIGITAL_GOLD
import com.navi.chat.utils.GenericScreens
import com.navi.chat.utils.NAVI_CHAT_SYSTEM_LOCAL_DATA
import com.navi.common.CommonLibManager
import com.navi.common.constants.COLOR_TRANSPARENT
import com.navi.common.downloader.DownloadUtil
import com.navi.common.enach.ProviderType
@@ -64,6 +70,7 @@ import com.navi.common.firebasedb.FirebaseResponse
import com.navi.common.firebasedb.FirebaseStatusType
import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper
import com.navi.common.listeners.NewBottomSheetListener
import com.navi.common.managers.PermissionsManager
import com.navi.common.model.ModuleNameV2
import com.navi.common.model.UserDetail
import com.navi.common.model.common.InvoiceDownloadData
@@ -120,10 +127,13 @@ import com.navi.gold.util.Constants.GOLD_SETUP_SIP
import com.navi.gold.util.Constants.GOLD_SIP_DETAILS
import com.navi.gold.util.Constants.LOADER
import com.navi.gold.util.Constants.GOLD_VALUE
import com.navi.gold.util.Constants.GO_TO_SETTINGS
import com.navi.gold.util.Constants.IS_TURBO_CHECKOUT_FLOW
import com.navi.gold.util.Constants.LOCATION_PERMISSION
import com.navi.gold.util.Constants.NEXT_CTA
import com.navi.gold.util.Constants.PAN_VERIFY_BOTTOM_SHEET
import com.navi.gold.util.Constants.PD_RPD_SELECTION
import com.navi.gold.util.Constants.SETTINGS
import com.navi.gold.util.Constants.SETUP_SIP_REFRESH
import com.navi.gold.util.Constants.SHOW_WIDGET_BOTTOM_SHEET
import com.navi.gold.util.Constants.SIP_SETUP_FAILED
@@ -139,6 +149,9 @@ import com.navi.gold.util.GoldAnalytics.DIGITAL_GOLD_BUY_SUMMARY_BOTTOM_SHEET_IN
import com.navi.gold.util.GoldAnalytics.DIGITAL_GOLD_FOMO_NUDGE_BOTTOM_SHEET_INIT
import com.navi.gold.util.GoldAnalytics.DIGITAL_GOLD_HOME_SCREEN
import com.navi.gold.util.GoldAnalytics.DIGITAL_GOLD_LANDING_PAGE
import com.navi.gold.util.GoldAnalytics.onLocationPermissionAllowed
import com.navi.gold.util.GoldAnalytics.onLocationPermissionDenied
import com.navi.gold.util.GoldAnalytics.onLocationPermissionDnd
import com.navi.gold.util.GoldAnalytics.sendEventsToClickStream
import com.navi.gold.util.isTrue
import com.navi.gold.util.startExitAnimation
@@ -235,6 +248,7 @@ class DigitalGoldHomeActivity : BasePaymentActivity(), WidgetCallback, NewBottom
private val naviCheckoutViewModel by lazy { ViewModelProvider(this)[NaviCheckoutViewModel::class.java] }
private var widgetBottomSheet: WidgetsSupportedBottomSheet? = null
private val transactionViewModel by lazy { ViewModelProvider(this)[DigitalGoldTransactionVM::class.java] }
private val permissionsManager by lazy { PermissionsManager(this) }
private var homeResponse: WidgetResponse? = null
private var isGoldPriceExpiredReferesh: Boolean? = false
@@ -259,6 +273,8 @@ class DigitalGoldHomeActivity : BasePaymentActivity(), WidgetCallback, NewBottom
private var isPaymentExpired = false
private var paymentCheckFragment: WeakReference<PaymentCheckFragment>? = null
private var paymentSdkInitParams: PaymentSdkInitParams? = null
private var nativePermissionPageRequested = false
private var shouldStopGoldConversionWidgetButtonLoaderOnResume = true
@Inject
lateinit var paymentNavigator: PaymentNavigator
private val onPollingEnd = {
@@ -431,20 +447,8 @@ class DigitalGoldHomeActivity : BasePaymentActivity(), WidgetCallback, NewBottom
naviAdapter.setData(listOfWidgets)
}
startTimer()
widgetResponse.extraData?.redirectionCta?.let { redirectionCta ->
onClick(NaviWidgetClickWithActionData(actionData = redirectionCta.toActionData()))
}
widgetResponse.extraData?.sipInfo?.let { sipInfo ->
sipVM.setSipAmount(sipInfo.amount ?: 0.0)
sipVM.setSipFrequency(sipInfo.frequency ?: "")
sipVM.setSipInstallmentDate(sipInfo.installmentDate ?: 1)
}
handleHomeResponseExtraData(widgetResponse)
sipVM.setSipReferenceId(widgetResponse.extraData?.sipReferenceId)
widgetResponse.extraData?.buySummaryBottomSheetData?.let {
homeVM.setBuyBottomSheetData(it)
}
}
homeVM.pollingData.observeNonNull(this@DigitalGoldHomeActivity) {
handlePagePollingData(it)
@@ -754,6 +758,36 @@ class DigitalGoldHomeActivity : BasePaymentActivity(), WidgetCallback, NewBottom
finish = false
)
}
homeVM.staticBottomSheetData.observeNonNull(this@DigitalGoldHomeActivity) {
setButtonLoaderState(homeResponse, false)
manageUserInteraction(false)
homeVM.setBottomSheetData(it)
showCommonBottomSheet(it, shouldDismissBottomSheet = false)
}
}
private fun handleHomeResponseExtraData(widgetResponse: WidgetResponse) {
widgetResponse.extraData?.redirectionCta?.let { redirectionCta ->
onClick(NaviWidgetClickWithActionData(actionData = redirectionCta.toActionData()))
}
widgetResponse.extraData?.sipInfo?.let { sipInfo ->
sipVM.setSipAmount(sipInfo.amount ?: 0.0)
sipVM.setSipFrequency(sipInfo.frequency ?: "")
sipVM.setSipInstallmentDate(sipInfo.installmentDate ?: 1)
}
widgetResponse.extraData?.isUserInvested?.let {
homeVM.setUserInvested(isInvested = it)
}
widgetResponse.extraData?.buySummaryBottomSheetData?.let {
if (doesNotHaveLocationAccessForFirstTimeUser()) {
manageUserInteraction(true)
setButtonLoaderState(homeResponse, true)
showLocationPermissionDialog()
} else {
homeVM.setBuyBottomSheetData(it)
}
}
}
private fun handleTurboCheckoutRedirection() {
@@ -1097,7 +1131,8 @@ class DigitalGoldHomeActivity : BasePaymentActivity(), WidgetCallback, NewBottom
private fun showCommonBottomSheet(
bottomSheetData: BottomSheetData,
isButtonLoaderPresent: Boolean = false
isButtonLoaderPresent: Boolean = false,
shouldDismissBottomSheet: Boolean = true
) {
try {
if (::commonBottomSheet.isInitialized && commonBottomSheet.isNotNull()) {
@@ -1108,7 +1143,8 @@ class DigitalGoldHomeActivity : BasePaymentActivity(), WidgetCallback, NewBottom
}
commonBottomSheet = NewCommonBottomSheet.getInstance(
bottomSheetData,
isButtonLoaderPresent
isButtonLoaderPresent,
shouldDismissBottomSheet
)
commonBottomSheet.setListener(this@DigitalGoldHomeActivity)
safelyShowBottomSheet(commonBottomSheet, NewCommonBottomSheet.TAG)
@@ -1339,7 +1375,7 @@ class DigitalGoldHomeActivity : BasePaymentActivity(), WidgetCallback, NewBottom
override val moduleName: ModuleNameV2 = ModuleNameV2.COMMON
override fun buttonClick(actionData: ActionData?) {
if (actionData?.action != BUY_GOLD_BOTTOM_SHEET) {
if (actionData?.action != BUY_GOLD_BOTTOM_SHEET && actionData?.action != LOCATION_PERMISSION) {
commonBottomSheet.dismiss()
} else {
isPaymentExpired = true
@@ -1369,11 +1405,158 @@ class DigitalGoldHomeActivity : BasePaymentActivity(), WidgetCallback, NewBottom
manageUserInteraction(true)
fetchGoldBuyBottomSheet()
}
LOCATION_PERMISSION -> {
if (checkForLocationPermission()) {
onLocationPermissionGiven()
} else {
permissionsManager.requestPermissions(
permissions = arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION
)
)
}
}
SETTINGS -> {
openNativePermissionPage()
}
}
}
}
}
private fun openNativePermissionPage() {
nativePermissionPageRequested = true
val intent =
Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.parse(com.navi.common.utils.Constants.PACKAGE.plus(CommonLibManager.applicationId))
)
startActivity(intent)
}
override fun onRequestPermissionsResult(
requestCode: Int, permissions: Array<out String>, grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == PermissionsManager.REQUEST_CODE) {
sendLocationAnalytics()
if (checkForHardDenyPermissions(
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
)
) {
updateBottomSheetDataToOpenNativeSettings()
commonBottomSheet?.updateData(homeVM.getBottomSheetData())
} else if (checkForLocationPermission()) {
onLocationPermissionGiven()
} else {
if (::commonBottomSheet.isInitialized && commonBottomSheet.isNotNull()) {
commonBottomSheet.dismiss()
}
}
}
}
private fun sendLocationAnalytics() {
if (
checkForLocationPermission()
) {
onLocationPermissionAllowed(screenName = screenName)
} else if (
checkForLocationPermission().not() &&
(ActivityCompat.shouldShowRequestPermissionRationale(
this,
Manifest.permission.ACCESS_FINE_LOCATION
) || ActivityCompat.shouldShowRequestPermissionRationale(
this,
Manifest.permission.ACCESS_COARSE_LOCATION
))
) {
onLocationPermissionDenied(screenName = screenName)
} else {
onLocationPermissionDnd(screenName = screenName)
}
}
private fun onLocationPermissionGiven() {
if (::commonBottomSheet.isInitialized && commonBottomSheet.isNotNull()) {
commonBottomSheet.dismiss()
}
shouldStopGoldConversionWidgetButtonLoaderOnResume = false
setButtonLoaderState(
response = homeResponse,
state = true
)
manageUserInteraction(true)
updateLocation(
data = null,
screenName = screenName,
businessVertical = com.navi.common.utils.Constants.BUSINESS_VERTICAL_GOLD
)
onClick(
NaviWidgetClickWithActionData(
actionData = ActionData(
url = NEXT_CTA
)
)
)
}
private fun updateBottomSheetDataToOpenNativeSettings() {
val bottomSheetData = homeVM.getBottomSheetData()
bottomSheetData?.actionData?.let {
it.title = GO_TO_SETTINGS
it.action = SETTINGS
}
bottomSheetData?.bottomSheetContent?.let {
it.isInfoTextVisible = true
}
homeVM.setBottomSheetData(bottomSheetData)
}
private fun checkForHardDenyPermissions(permissions: Array<out String>): Boolean {
var isHardDenyPermissionClicked = false
permissions.forEachIndexed { index, _ ->
if (
ActivityCompat.checkSelfPermission(this, permissions[index]) !=
PackageManager.PERMISSION_GRANTED &&
ActivityCompat.shouldShowRequestPermissionRationale(
this,
permissions[index]
)
.not()
) {
isHardDenyPermissionClicked = true
}
}
permissions.forEachIndexed { index, _ ->
if (
ActivityCompat.checkSelfPermission(this, permissions[index]) ==
PackageManager.PERMISSION_GRANTED
) {
if (isHardDenyPermissionClicked) {
isHardDenyPermissionClicked = false
}
}
}
return isHardDenyPermissionClicked
}
override fun widgetAnalytics(genericAnalyticsData: GenericAnalyticsData?) {
genericAnalyticsData?.let { data ->
val parameters: HashMap<String, String> =
@@ -1448,14 +1631,25 @@ class DigitalGoldHomeActivity : BasePaymentActivity(), WidgetCallback, NewBottom
val bundle = Bundle()
bundle.putString(AMOUNT_DATA, homeVM.getActualSellAmount().toString())
if (naviClickAction.actionData?.url.equals(NEXT_CTA)) {
manageUserInteraction(true)
homeVM.fetchPanVerifyCta(
GoldKycPageRequest(
type = naviClickAction.actionData?.type,
amount = homeVM.getActualSellAmount()
)
setButtonLoaderState(
response = homeResponse,
state = true
)
if (doesNotHaveLocationAccessForFirstTimeUser()) {
showLocationPermissionDialog()
} else {
homeVM.fetchPanVerifyCta(
GoldKycPageRequest(
type = naviClickAction.actionData?.type,
amount = homeVM.getActualSellAmount()
)
)
}
return
} else if (naviClickAction.actionData?.url.equals(BUY_GOLD_BOTTOM_SHEET, true)) {
val amount = naviClickAction.actionData?.parameters?.firstOrNull() {
@@ -1636,6 +1830,19 @@ class DigitalGoldHomeActivity : BasePaymentActivity(), WidgetCallback, NewBottom
}
}
private fun doesNotHaveLocationAccessForFirstTimeUser(): Boolean {
return (
homeVM.isUserInvested().not() &&
checkForLocationPermission().not()
)
}
private fun showLocationPermissionDialog() {
homeVM.fetchStaticBottomSheetData(
type = "LOCATION"
)
}
private fun updateLoaderState(
response: WidgetResponse? = null,
@@ -1791,12 +1998,29 @@ class DigitalGoldHomeActivity : BasePaymentActivity(), WidgetCallback, NewBottom
override fun onResume() {
super.onResume()
setButtonLoaderState(homeResponse, false)
if (shouldStopGoldConversionWidgetButtonLoaderOnResume) {
setButtonLoaderState(homeResponse, false)
manageUserInteraction(false)
}
updateLoaderState(response = homeResponse, state = false)
manageUserInteraction(false)
if (nativePermissionPageRequested) {
nativePermissionPageRequested = false
if (checkForLocationPermission()) {
onLocationPermissionGiven()
}
}
startTimer()
}
private fun checkForLocationPermission(): Boolean {
return (
permissionsManager.hasPermission(Manifest.permission.ACCESS_FINE_LOCATION) ||
permissionsManager.hasPermission(Manifest.permission.ACCESS_COARSE_LOCATION))
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == homeVM.getPanVerifyRequestCode()) {

View File

@@ -76,4 +76,7 @@ object Constants {
const val SIP_DETAILS_SCREEN_URL = "gold/sip/sipDetailsScreen"
const val TRANSACTION_KEY = "transactionKey"
const val VENDOR_KEY = "vendorKey"
const val LOCATION_PERMISSION = "locationPermission"
const val SETTINGS = "settings"
const val GO_TO_SETTINGS = "Go to settings"
}

View File

@@ -2,12 +2,14 @@ package com.navi.gold.util
import androidx.annotation.Keep
import com.navi.analytics.utils.NaviTrackEvent
import com.navi.analytics.utils.SCREEN_NAME
import com.navi.base.model.ActionData
import com.navi.base.model.GenericAnalyticsData
import com.navi.base.model.NaviWidgetClickWithActionData
import com.navi.base.sharedpref.CommonPrefConstants
import com.navi.base.sharedpref.PreferenceManager
import com.navi.base.utils.BaseUtils
import okhttp3.internal.toImmutableMap
import java.util.concurrent.ConcurrentHashMap
@Keep
@@ -172,4 +174,37 @@ object GoldAnalytics {
mapOf(Pair("screenName", screenName))
)
}
fun attributeMapWithScreenName(
screenName: String,
attributeMap: Map<String, String>? = null
): Map<String, String> {
attributeMap?.let {
val map = attributeMap.toMutableMap()
map[SCREEN_NAME] = screenName
return map.toImmutableMap()
}
?: run {
return mapOf(Pair(SCREEN_NAME, screenName))
}
}
fun onLocationPermissionAllowed(screenName: String) =
NaviTrackEvent.trackEventOnClickStream(
"naviapp_btn_permission_location_allow",
attributeMapWithScreenName(screenName.orEmpty())
)
fun onLocationPermissionDenied(screenName: String) =
NaviTrackEvent.trackEventOnClickStream(
"naviapp_btn_permission_location_deny",
attributeMapWithScreenName(screenName.orEmpty())
)
fun onLocationPermissionDnd(screenName: String) =
NaviTrackEvent.trackEventOnClickStream(
"naviapp_btn_permission_location_dnd",
attributeMapWithScreenName(screenName.orEmpty())
)
}

View File

@@ -7,13 +7,21 @@
package com.navi.gold.viewmodels
import android.Manifest
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.androidx.lifecycle.SingleLiveEvent
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.navi.base.cache.model.NaviCacheAltSourceEntity
import com.navi.base.cache.repository.NaviCacheRepositoryImpl
import com.navi.base.model.BottomSheetData
import com.navi.base.utils.isNull
import com.navi.base.utils.orFalse
import com.navi.base.utils.orTrue
import com.navi.common.model.common.WidgetBottomSheetData
import com.navi.common.model.common.WidgetResponse
import com.navi.common.network.models.RepoResult
import com.navi.common.utils.Constants.GOLD
import com.navi.common.utils.TemporaryStorageHelper
import com.navi.common.viewmodel.BaseVM
@@ -25,6 +33,12 @@ import com.navi.gold.repo.DigitalGoldHomeRepo
import com.navi.gold.repo.DigitalGoldKycRepo
import com.navi.gold.repo.DigitalGoldSipRepo
import com.navi.gold.repo.DigitalGoldTransactionRepo
import com.navi.naviwidgets.models.NaviWidget
import com.navi.naviwidgets.models.ParameterValue
import com.navi.naviwidgets.validations.BaseInputValidation
import com.navi.naviwidgets.validations.ValidationJsonDeserializer
import com.navi.naviwidgets.widgets.NaviWidgetJsonDeserializer
import com.navi.naviwidgets.widgets.ParameterValueJsonDeserializer
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import javax.inject.Inject
@@ -35,7 +49,8 @@ class DigitalGoldHomeVM @Inject constructor(
private val goldKycRepo: DigitalGoldKycRepo,
private val goldBuyRepo: DigitalGoldBuyRepo,
private val goldTransactionRepo: DigitalGoldTransactionRepo,
private val goldSipRepo: DigitalGoldSipRepo
private val goldSipRepo: DigitalGoldSipRepo,
private val naviCacheRepository: NaviCacheRepositoryImpl
) :
BaseVM() {
@@ -81,6 +96,14 @@ class DigitalGoldHomeVM @Inject constructor(
private var _panVerifyBottomSheetDataPostAction: WidgetBottomSheetData? = null
private var isTurboCheckoutFlow: Boolean? = false
private var isUserInvested: Boolean? = false
private val _staticBottomSheetData: MutableLiveData<BottomSheetData> = MutableLiveData()
val staticBottomSheetData: LiveData<BottomSheetData>
get() = _staticBottomSheetData
private var bottomSheetData: BottomSheetData? = null
fun setActualSellAmount(actualSellAmount: Double) {
this.actualSellAmount = actualSellAmount
@@ -263,4 +286,68 @@ class DigitalGoldHomeVM @Inject constructor(
fun setIsTurboCheckoutFlow(isTurboCheckout: Boolean) {
isTurboCheckoutFlow = isTurboCheckout
}
fun setBottomSheetData(bottomSheetData: BottomSheetData?) {
this.bottomSheetData = bottomSheetData
}
fun getBottomSheetData(): BottomSheetData? {
return bottomSheetData
}
fun setUserInvested(isInvested: Boolean) {
this.isUserInvested = isInvested
}
fun isUserInvested() = isUserInvested.orTrue()
fun fetchStaticBottomSheetData(type: String) {
coroutineScope.safeLaunch {
val response: RepoResult<BottomSheetData> =
if (type.isNotEmpty()) {
val cachedResponse = naviCacheRepository.getDataOrFetchFromAltSource(
type+"_gold_bottom_sheet_data",
getDataFromAltSource = {
getStaticBottomSheetDataFromRemote(type)
}
)
RepoResult(
statusCode = 200,
data = Gson().fromJson(
cachedResponse?.value,
BottomSheetData::class.java
)
)
} else {
RepoResult(
statusCode = 400,
data = null
)
}
if (response.error == null && response.errors.isNullOrEmpty() && response.data != null) {
_staticBottomSheetData.value = response.data
} else {
setErrorData(response.errors, response.error)
}
}
}
private suspend fun getStaticBottomSheetDataFromRemote(type: String): NaviCacheAltSourceEntity {
val response = goldHomeRepo.fetchStaticBottomSheetData(type)
if (response.error.isNull() && response.errors.isNullOrEmpty()) {
return NaviCacheAltSourceEntity(
value = Gson().toJson(response.data),
isSuccess = true,
version = 1
)
} else {
setErrorData(response.errors, response.error)
return NaviCacheAltSourceEntity(
isSuccess = false
)
}
}
}