diff --git a/app/src/main/java/com/navi/uitron/demo/playground/Playground.kt b/app/src/main/java/com/navi/uitron/demo/playground/Playground.kt index d566a58..c27360f 100644 --- a/app/src/main/java/com/navi/uitron/demo/playground/Playground.kt +++ b/app/src/main/java/com/navi/uitron/demo/playground/Playground.kt @@ -37,6 +37,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.hilt.navigation.compose.hiltViewModel import com.navi.uitron.demo.stringToUiTronResponse import com.navi.uitron.demo.theme.PinkCC2FD5 import com.navi.uitron.demo.theme.UiTronTheme @@ -46,7 +47,7 @@ import com.navi.uitron.render.UiTronRenderer import com.navi.uitron.viewmodel.UiTronViewModel @Composable -fun PlaygroundScreen() { +fun PlaygroundScreen(viewModel: UiTronViewModel = hiltViewModel()) { val clipboardManager: ClipboardManager = LocalClipboardManager.current val field = remember { mutableStateOf("") } @@ -141,7 +142,7 @@ fun PlaygroundScreen() { null } uiTronResponse?.let { - UiTronRenderer(uiTronResponse.data, uiTronViewModel = UiTronViewModel()) + UiTronRenderer(uiTronResponse.data, uiTronViewModel = viewModel) .Render(composeViews = uiTronResponse.parentComposeView.orEmpty()) } ?: kotlin.run { 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 2159d78..347119f 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 @@ -21,10 +21,12 @@ open class UiTronData : Parcelable { val slideData: SlideData? = null val lifecycleActionData: LifecycleActionData? = null var subscribedEvents: List? = null + var childrenSubscribedEvents: List? = null open fun copyNonNull(data: UiTronData?) { onClick = data?.onClick ?: onClick subscribedEvents = data?.subscribedEvents ?: subscribedEvents + childrenSubscribedEvents = data?.childrenSubscribedEvents ?: childrenSubscribedEvents } } @@ -63,6 +65,12 @@ data class SubscribedEventInfo( val stateKey: String? = null, ) : Parcelable +data class ChildrenSubscribedEventsInfo( + val layoutId: String? = null, + val viewType: String? = null, + val subscribedEvents: List? = null +) + @Parcelize data class SubscriberEventData( val layoutId: String? = null, diff --git a/navi-uitron/src/main/java/com/navi/uitron/model/ui/UiTronView.kt b/navi-uitron/src/main/java/com/navi/uitron/model/ui/UiTronView.kt index acc3458..7395073 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/model/ui/UiTronView.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/model/ui/UiTronView.kt @@ -57,7 +57,8 @@ open class BaseProperty( var isSensitive: Boolean? = null, var animate: Animate? = null, var transformOrigin: TransFormOrigin? = null, - var propertyAnimator: List? = null + var propertyAnimator: List? = null, + val disableClick: Boolean? = false ) : Parcelable { open fun copyNonNullFrom(property: BaseProperty?) { property?.width?.let { width = it } 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 04260b8..e84672b 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 @@ -18,6 +18,7 @@ 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.SubscribedEventInfo import com.navi.uitron.model.data.SubscriberEventData import com.navi.uitron.model.data.UiTronAction import com.navi.uitron.model.data.UiTronData @@ -146,24 +147,42 @@ interface Renderer { uiTronViewModel: UiTronViewModel ) { uiTronData?.subscribedEvents?.filterNotNull()?.forEach { event -> - val eventSubscribers: MutableList = - uiTronViewModel.handle[event.eventName.plus(BaseProperty.EVENT_SUFFIX)] - ?: mutableListOf() - eventSubscribers - .any { subscriberData -> subscriberData.layoutId == property.layoutId } - .let { isLayoutIdExist -> - if (isLayoutIdExist.not()) { - eventSubscribers.add( - SubscriberEventData( - layoutId = property.layoutId, - viewType = property.viewType, - stateKey = event.stateKey - ) - ) - } - } - uiTronViewModel.handle[event.eventName.plus(BaseProperty.EVENT_SUFFIX)] = - eventSubscribers + updateEventSubscribers(uiTronViewModel, event, property.layoutId, property.viewType) + } + uiTronData?.childrenSubscribedEvents?.filterNotNull()?.forEach { eventInfo -> + eventInfo.subscribedEvents?.filterNotNull()?.forEach { event -> + updateEventSubscribers( + uiTronViewModel, + event, + eventInfo.layoutId, + eventInfo.viewType + ) + } } } + + fun updateEventSubscribers( + uiTronViewModel: UiTronViewModel, + event: SubscribedEventInfo, + layoutId: String?, + viewType: String? + ) { + val eventSubscribers: MutableList = + uiTronViewModel.handle[event.eventName.plus(BaseProperty.EVENT_SUFFIX)] + ?: mutableListOf() + eventSubscribers + .any { subscriberData -> subscriberData.layoutId == layoutId } + .let { isLayoutIdExist -> + if (isLayoutIdExist.not()) { + eventSubscribers.add( + SubscriberEventData( + layoutId = layoutId, + viewType = viewType, + stateKey = event.stateKey + ) + ) + } + } + uiTronViewModel.handle[event.eventName.plus(BaseProperty.EVENT_SUFFIX)] = eventSubscribers + } } diff --git a/navi-uitron/src/main/java/com/navi/uitron/utils/Ext.kt b/navi-uitron/src/main/java/com/navi/uitron/utils/Ext.kt index 43cac85..1b41f1c 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/utils/Ext.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/utils/Ext.kt @@ -360,6 +360,8 @@ fun Modifier.customClickable( onClick() } } + } else if (property?.disableClick.orFalse()) { + clickable(enabled = false) {} } else return@composed this }