TP-65893 | one profile integration (#10817)
Co-authored-by: nikhilkumar <nikhil.kumar@navi.com>
This commit is contained in:
@@ -101,6 +101,4 @@ class CoinComposableRegistry @Inject constructor() : ComposableRegistry {
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user