diff --git a/navi-uitron/src/main/java/com/navi/uitron/model/data/UiTronData.kt b/navi-uitron/src/main/java/com/navi/uitron/model/data/UiTronData.kt index a6e18f1..8b519f0 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/model/data/UiTronData.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/model/data/UiTronData.kt @@ -19,8 +19,19 @@ open class UiTronData : Parcelable { val combinedClick: CombinedClick? = null val onView: UiTronActionData? = null val slideData: SlideData? = null + val lifecycleActionData : LifecycleActionData? = null } +@Parcelize +data class LifecycleActionData( + val onCreate: UiTronActionData? = null, + val onStart: UiTronActionData? = null, + val onResume: UiTronActionData? = null, + val onPause: UiTronActionData? = null, + val onStop: UiTronActionData? = null, + val onDestroy: UiTronActionData? = null +) : Parcelable + @Parcelize data class CombinedClick( val onClick: UiTronActionData? = null, diff --git a/navi-uitron/src/main/java/com/navi/uitron/render/Renderer.kt b/navi-uitron/src/main/java/com/navi/uitron/render/Renderer.kt index f5a22f9..bd7c9ee 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/render/Renderer.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/render/Renderer.kt @@ -9,10 +9,15 @@ package com.navi.uitron.render import androidx.annotation.CallSuper import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalLifecycleOwner +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver import com.navi.uitron.UiTronSdkManager import com.navi.uitron.model.action.MvelAction +import com.navi.uitron.model.data.LifecycleActionData import com.navi.uitron.model.data.UiTronAction import com.navi.uitron.model.data.UiTronData import com.navi.uitron.model.ui.BaseProperty @@ -39,6 +44,10 @@ interface Renderer { uiTronViewModel.handleActions(it) } }) + uiTronData?.lifecycleActionData?.let { + HandleLifecycleActions(it, uiTronViewModel) + } + } fun updateMvelValuesInActions(actions: List?, map: Map) { @@ -51,7 +60,11 @@ interface Renderer { } } - fun handleMvelExtra(layoutId: String?, extrasState: Map?, map: Map) { + fun handleMvelExtra( + layoutId: String?, + extrasState: Map?, + map: Map + ) { extrasState?.get(MvelAction.KEY_MVEL)?.takeIf { it is MvelAction && layoutId != null } ?.let { mvelAction -> mvelAction as MvelAction @@ -70,4 +83,48 @@ interface Renderer { } } + @Composable + private fun HandleLifecycleActions( + lifecycleActionData: LifecycleActionData, viewModel: UiTronViewModel + ) { + val lifecycleOwner = LocalLifecycleOwner.current + + DisposableEffect(lifecycleOwner, lifecycleActionData) { + val lifecycle = lifecycleOwner.lifecycle + val observer = LifecycleEventObserver { _, event -> + when (event) { + Lifecycle.Event.ON_CREATE -> { + viewModel.handleActions(lifecycleActionData.onCreate) + } + + Lifecycle.Event.ON_START -> { + viewModel.handleActions(lifecycleActionData.onStart) + } + + Lifecycle.Event.ON_RESUME -> { + viewModel.handleActions(lifecycleActionData.onResume) + } + + Lifecycle.Event.ON_PAUSE -> { + viewModel.handleActions(lifecycleActionData.onPause) + } + + Lifecycle.Event.ON_STOP -> { + viewModel.handleActions(lifecycleActionData.onStop) + } + + Lifecycle.Event.ON_DESTROY -> { + viewModel.handleActions(lifecycleActionData.onDestroy) + } + + else -> {} + } + } + lifecycle.addObserver(observer) + + onDispose { + lifecycle.removeObserver(observer) + } + } + } }