<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