TP-65893 | one profile integration (#10817)

Co-authored-by: nikhilkumar <nikhil.kumar@navi.com>
This commit is contained in:
Ayushman Sharma
2024-05-17 15:38:46 +05:30
committed by GitHub
parent cf35fe7d62
commit 8a2b65502d
8 changed files with 92 additions and 13 deletions

View File

@@ -101,6 +101,4 @@ class CoinComposableRegistry @Inject constructor() : ComposableRegistry {
)
}
}

View File

@@ -1,12 +1,16 @@
package com.navi.coin.ui.activity
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.navigation.NavHostController
import com.navi.coin.ui.compose.navhost.CoinDestinationNavHost
import com.navi.coin.utils.constant.Constants.COINS_SCREEN
import com.navi.coin.utils.constant.Constants.CoinHomeScreen.ONE_PROFILE_VERIFICATION_REQUEST_CODE
import com.navi.coin.utils.constant.Constants.CoinHomeScreen.TRIGGER_REDEMPTION_EVENT
import com.navi.coin.utils.ext.startEnterAnimation
import com.navi.coin.utils.emitEvent
import com.navi.common.model.ModuleNameV2
import com.navi.common.utils.Constants.SECOND_IDENTIFIER
import com.navi.design.theme.NaviMaterialTheme
@@ -58,6 +62,15 @@ class CoinActivity : CoinBaseActivity() {
private fun getComposableUrl(): String = intent.extras?.getString(SECOND_IDENTIFIER).orEmpty()
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when {
requestCode == ONE_PROFILE_VERIFICATION_REQUEST_CODE && resultCode == Activity.RESULT_OK -> {
emitEvent(TRIGGER_REDEMPTION_EVENT, Activity.RESULT_OK)
}
}
}
override val screenName: String = COINS_SCREEN
override val moduleName: ModuleNameV2

View File

@@ -1,5 +1,6 @@
package com.navi.coin.ui.compose.screen
import android.app.Activity
import android.os.Bundle
import androidx.activity.compose.BackHandler
import androidx.compose.animation.AnimatedVisibility
@@ -66,27 +67,36 @@ import com.navi.base.utils.EMPTY
import com.navi.base.utils.orFalse
import com.navi.coin.R
import com.navi.coin.models.states.ApiActionState
import com.navi.coin.models.states.CoinHomeScreenState
import com.navi.coin.ui.activity.CoinBaseActivity
import com.navi.coin.utils.collectEvent
import com.navi.coin.utils.emitEvent
import com.navi.coin.models.states.CoinHomeScreenState
import com.navi.coin.ui.compose.common.Init
import com.navi.coin.ui.compose.common.MainScreenShimmerV2
import com.navi.coin.utils.analytics.NaviCoinsAnalytics
import com.navi.coin.utils.analytics.NaviCoinsAnalytics.Companion.REWARDS_NAVI_COINS_INFO_PAGE_BACK_ARROW_CLICK
import com.navi.coin.utils.constant.Constants
import com.navi.coin.utils.constant.Constants.BACKGROUND_IMAGE_HEIGHT_KEY
import com.navi.coin.utils.constant.Constants.CoinHomeScreen.OPEN_APP_SETTINGS
import com.navi.coin.utils.constant.Constants.CoinHomeScreen.TRIGGER_REDEMPTION_ACTION
import com.navi.coin.utils.constant.Constants.CoinHomeScreen.TRIGGER_REDEMPTION_EVENT
import com.navi.coin.utils.constant.Constants.HERO_PLACEHOLDER_PROPERTY_KEY
import com.navi.coin.utils.constant.Constants.REDEMPTION_STATUS_SCREEN_CTA_URL
import com.navi.coin.utils.constant.Constants.SCREEN_CONTENT
import com.navi.coin.utils.constant.Constants.SHOW_CURVE_KEY
import com.navi.coin.vm.CoinHomeScreenVM
import com.navi.common.managers.NaviLocationManager
import com.navi.common.uitron.model.action.CtaAction
import com.navi.common.uitron.model.action.ExecuteActionsCorrespondingToKey
import com.navi.rr.common.actions.InitActionHandler
import com.navi.rr.common.constants.COIN_HOME_SCREEN
import com.navi.rr.common.ext.toType
import com.navi.rr.utils.Constants.NULL_STRING
import com.navi.rr.utils.InitWidgetActions
import com.navi.rr.utils.NoRippleIndicationSource
import com.navi.rr.utils.brushType
import com.navi.rr.utils.getGsonBuilders
import com.navi.rr.utils.openSettings
import com.navi.rr.utils.toJson
import com.navi.rr.widgetFactory.FooterWithShadow
import com.navi.rr.widgetFactory.WidgetRenderer
@@ -133,6 +143,10 @@ fun CoinHomeScreen(
skipHalfExpanded = true,
)
val locationManager = remember{
NaviLocationManager()
}
fun renderBottomSheet(bottomSheetId: String?) {
scope.launch(Dispatchers.IO) {
bottomSheetId?.let {
@@ -144,6 +158,12 @@ fun CoinHomeScreen(
}
}
fun sendLocationUpdates() {
if (locationManager.isLocationOn(context)) {
locationManager.requestLocationUpdates(context, postLocation = true)
}
}
fun handleCtaAction(action: CtaAction) {
val screenUrl = action.ctaData?.url
val parameters = action.ctaData?.parameters
@@ -159,12 +179,16 @@ fun CoinHomeScreen(
Constants.BottomSheetAction.HIDE.name -> {
scope.launch {
bottomSheetState.hide()
}
}
}
}
OPEN_APP_SETTINGS -> {
openSettings(context)
}
else -> {
val id = UUID.randomUUID().toString()
val mutableListParams = parameters?.toMutableList()
@@ -184,7 +208,9 @@ fun CoinHomeScreen(
DeepLinkManager.getDeepLinkListener()?.navigateTo(
context,
cta.copy(parameters = mutableListParams),
finish = false
finish = false,
needsResult = cta.needsResult,
requestCode = cta.requestCode
)
}
}
@@ -194,6 +220,20 @@ fun CoinHomeScreen(
LaunchedEffect(Unit) {
coinHomeScreenVM.fetchAndSaveCoinHistoryScreen()
naviCoinsAnalytics.sendEvent(NaviCoinsAnalytics.REWARDS_NAVI_COINS_INFO_PAGE_LANDS)
launch {
context.collectEvent<Int?>(TRIGGER_REDEMPTION_EVENT)?.collect { resultCode ->
if (resultCode == Activity.RESULT_OK) {
val redemptionJsonResponse =
coinHomeScreenVM.handle.get<String?>(TRIGGER_REDEMPTION_ACTION)
val redemptionAction = redemptionJsonResponse?.toType<ExecuteActionsCorrespondingToKey>()
redemptionAction?.let {
coinHomeScreenVM.handleAction(redemptionAction)
}
context.emitEvent(TRIGGER_REDEMPTION_EVENT, null)
}
}
}
sendLocationUpdates()
}
DisposableEffect(key1 = lifeCycleOwner) {

View File

@@ -0,0 +1,20 @@
package com.navi.coin.utils
import androidx.lifecycle.asFlow
import com.navi.coin.ui.activity.CoinBaseActivity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.shareIn
fun <T> CoinBaseActivity.emitEvent(key: String, payload: T? = null) {
navController.currentBackStackEntry?.savedStateHandle?.set(key, payload)
}
fun <T> CoinBaseActivity.collectEvent(key: String): SharedFlow<T?>? {
return navController.currentBackStackEntry?.savedStateHandle?.getLiveData<T?>(
key = key,
initialValue = null
)?.asFlow()?.shareIn(CoroutineScope(Dispatchers.IO), SharingStarted.Lazily)
}

View File

@@ -66,6 +66,13 @@ object Constants {
const val COINS_LOADING_SCREEN_SCREEN_NAME = "COINS_HOME_LOADING_SCREEN_M2"
}
object CoinHomeScreen {
const val OPEN_APP_SETTINGS = "OPEN_APP_SETTINGS"
const val TRIGGER_REDEMPTION_EVENT = "trigger_redemption"
const val TRIGGER_REDEMPTION_ACTION = "trigger_redemption_action"
const val ONE_PROFILE_VERIFICATION_REQUEST_CODE = 1001
}
const val CLOSE = "close"
object ApiConstants {

View File

@@ -3,8 +3,10 @@ package com.navi.rr.common.actions
import android.app.Activity
import androidx.compose.runtime.Composable
import com.navi.rr.common.vm.RRBaseVM
import com.navi.uitron.handlers.HandlePermissionAction
@Composable
fun InitActionHandler(activity : Activity, viewModel: RRBaseVM){
ApiActionHandler(viewModel = viewModel)
HandlePermissionAction(context = activity, viewModel = viewModel)
}

View File

@@ -1,5 +1,8 @@
package com.navi.rr.common.ext
import com.navi.rr.utils.getGsonBuilders
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.json.JSONArray
import org.json.JSONObject
import java.util.Stack
@@ -52,4 +55,8 @@ fun JSONObject.findPrimitiveNode(
onPrimitiveFound: JSONObjectTraversalAction?= null
) {
return breadthFirstSearch(onPrimitiveEncountered = onPrimitiveFound)
}
suspend inline fun <reified T>Any.toType(): T = withContext(Dispatchers.IO){
return@withContext getGsonBuilders().fromJson(this@toType.toString(), T::class.java)
}

View File

@@ -86,12 +86,4 @@ class RefereeTrackerVMTests {
assertEquals(RefereeTrackerScreenState.Success::class, successState::class)
assertEquals(pageData, (successState as RefereeTrackerScreenState.Success).data)
}
@Test
fun testErrorState() {
val errorState: RefereeTrackerScreenState = RefereeTrackerScreenState.Error(
)
// Assert that it's an instance of Error
assertEquals(RefereeTrackerScreenState.Error::class, errorState::class)
}
}