<lambda>null1 package com.android.systemui.scene.ui.view
2
3 import android.content.Context
4 import android.util.AttributeSet
5 import android.view.MotionEvent
6 import android.view.View
7 import android.view.WindowInsets
8 import com.android.systemui.scene.shared.model.Scene
9 import com.android.systemui.scene.shared.model.SceneContainerConfig
10 import com.android.systemui.scene.shared.model.SceneDataSourceDelegator
11 import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel
12 import com.android.systemui.shade.TouchLogger
13 import com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer
14 import kotlinx.coroutines.flow.MutableStateFlow
15
16 /** A root view of the main SysUI window that supports scenes. */
17 class SceneWindowRootView(
18 context: Context,
19 attrs: AttributeSet?,
20 ) :
21 WindowRootView(
22 context,
23 attrs,
24 ) {
25
26 private lateinit var viewModel: SceneContainerViewModel
27
28 // TODO(b/298525212): remove once Compose exposes window inset bounds.
29 private val windowInsets: MutableStateFlow<WindowInsets?> = MutableStateFlow(null)
30
31 fun init(
32 viewModel: SceneContainerViewModel,
33 containerConfig: SceneContainerConfig,
34 sharedNotificationContainer: SharedNotificationContainer,
35 scenes: Set<Scene>,
36 layoutInsetController: LayoutInsetsController,
37 sceneDataSourceDelegator: SceneDataSourceDelegator,
38 ) {
39 this.viewModel = viewModel
40 setLayoutInsetsController(layoutInsetController)
41 SceneWindowRootViewBinder.bind(
42 view = this@SceneWindowRootView,
43 viewModel = viewModel,
44 windowInsets = windowInsets,
45 containerConfig = containerConfig,
46 sharedNotificationContainer = sharedNotificationContainer,
47 scenes = scenes,
48 onVisibilityChangedInternal = { isVisible ->
49 super.setVisibility(if (isVisible) View.VISIBLE else View.INVISIBLE)
50 },
51 dataSourceDelegator = sceneDataSourceDelegator,
52 )
53 }
54
55 override fun setVisibility(visibility: Int) {
56 // Do nothing. We don't want external callers to invoke this. Instead, we drive our own
57 // visibility from our view-binder.
58 }
59
60 // TODO(b/298525212): remove once Compose exposes window inset bounds.
61 override fun onApplyWindowInsets(windowInsets: WindowInsets): WindowInsets {
62 this.windowInsets.value = windowInsets
63 return windowInsets
64 }
65
66 override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
67 viewModel.onMotionEvent(ev)
68 return super.dispatchTouchEvent(ev).also {
69 TouchLogger.logDispatchTouch(TAG, ev, it)
70 viewModel.onMotionEventComplete()
71 }
72 }
73
74 companion object {
75 private const val TAG = "SceneWindowRootView"
76 }
77 }
78