From faaf228ad4f176b44bc637e259d83c27ad9b9af5 Mon Sep 17 00:00:00 2001 From: Alejandro Nijamkin Date: Thu, 8 Jun 2023 16:50:20 -0700 Subject: [PATCH] [flexiglass] SceneContainer in System UI. If the Jetpack Compose compile-time flag and the scene container runtime feature flag are both true, when we inflate the root SceneWindowRootView, we also initialize it with its required dependencies and add a ComposeView that hosts the SceneContainer composable function. This effectively adds the placholder scenes developed through the Compose gallery app to actual System UI, allowing us to proceed to the next steps of the project where we being connecting Flexiglass to real business logic and application state. Note that the back navigation integration done requires the enablement of predictive back animation for the shade as described in go/enable-notification-shade-anim. Bug: 283836103 Test: manually verified that the Flexiglass placholder scenes correctly show on top of the shade, correctly hide when the window is gone, can correctly be navigated between using the placholder up/down buttons, and the bouncer scene correctly supports the back gesture to go back to lockscreen. Change-Id: I82c864e922ce77469ae7fbc5f0cef77e6947ef3f --- .../android/systemui/compose/ComposeFacade.kt | 11 +++ .../android/systemui/compose/ComposeFacade.kt | 23 +++++++ .../systemui/compose/BaseComposeFacade.kt | 10 +++ .../dagger/ReferenceSysUIComponent.java | 2 + .../dagger/ReferenceSystemUIModule.java | 2 - .../systemui/dagger/SystemUIModule.java | 4 +- .../scene/SceneContainerFrameworkModule.kt | 2 +- .../repository/SceneContainerRepository.kt | 21 +----- .../model/SceneContainerConfig.kt | 6 +- .../model/SceneContainerConfigModule.kt | 6 +- .../startable/SceneContainerStartable.kt | 60 ++++++++++++++++ .../scene/ui/view/SceneWindowRootView.kt | 69 ++++++++++++++++++- .../systemui/scene/ui/view/WindowRootView.kt | 34 ++++++++- .../shade/NotificationShadeWindowView.java | 13 ---- .../com/android/systemui/shade/ShadeModule.kt | 7 +- .../android/systemui/scene/SceneTestUtils.kt | 4 +- 16 files changed, 224 insertions(+), 50 deletions(-) rename packages/SystemUI/src/com/android/systemui/scene/{data => shared}/model/SceneContainerConfig.kt (90%) rename packages/SystemUI/src/com/android/systemui/scene/{data => shared}/model/SceneContainerConfigModule.kt (89%) create mode 100644 packages/SystemUI/src/com/android/systemui/scene/startable/SceneContainerStartable.kt diff --git a/packages/SystemUI/compose/facade/disabled/src/com/android/systemui/compose/ComposeFacade.kt b/packages/SystemUI/compose/facade/disabled/src/com/android/systemui/compose/ComposeFacade.kt index cc337459a83cb..82fe3f265384d 100644 --- a/packages/SystemUI/compose/facade/disabled/src/com/android/systemui/compose/ComposeFacade.kt +++ b/packages/SystemUI/compose/facade/disabled/src/com/android/systemui/compose/ComposeFacade.kt @@ -24,6 +24,9 @@ import androidx.lifecycle.LifecycleOwner import com.android.systemui.multishade.ui.viewmodel.MultiShadeViewModel import com.android.systemui.people.ui.viewmodel.PeopleViewModel import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel +import com.android.systemui.scene.shared.model.Scene +import com.android.systemui.scene.shared.model.SceneKey +import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel import com.android.systemui.util.time.SystemClock /** The Compose facade, when Compose is *not* available. */ @@ -58,6 +61,14 @@ object ComposeFacade : BaseComposeFacade { throwComposeUnavailableError() } + override fun createSceneContainerView( + context: Context, + viewModel: SceneContainerViewModel, + sceneByKey: Map, + ): View { + throwComposeUnavailableError() + } + private fun throwComposeUnavailableError(): Nothing { error( "Compose is not available. Make sure to check isComposeAvailable() before calling any" + diff --git a/packages/SystemUI/compose/facade/enabled/src/com/android/systemui/compose/ComposeFacade.kt b/packages/SystemUI/compose/facade/enabled/src/com/android/systemui/compose/ComposeFacade.kt index 0e79b18b1c24c..7926f92243471 100644 --- a/packages/SystemUI/compose/facade/enabled/src/com/android/systemui/compose/ComposeFacade.kt +++ b/packages/SystemUI/compose/facade/enabled/src/com/android/systemui/compose/ComposeFacade.kt @@ -29,6 +29,11 @@ import com.android.systemui.people.ui.compose.PeopleScreen import com.android.systemui.people.ui.viewmodel.PeopleViewModel import com.android.systemui.qs.footer.ui.compose.FooterActions import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel +import com.android.systemui.scene.shared.model.Scene +import com.android.systemui.scene.shared.model.SceneKey +import com.android.systemui.scene.ui.composable.ComposableScene +import com.android.systemui.scene.ui.composable.SceneContainer +import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel import com.android.systemui.util.time.SystemClock /** The Compose facade, when Compose is available. */ @@ -71,4 +76,22 @@ object ComposeFacade : BaseComposeFacade { } } } + + override fun createSceneContainerView( + context: Context, + viewModel: SceneContainerViewModel, + sceneByKey: Map, + ): View { + return ComposeView(context).apply { + setContent { + PlatformTheme { + SceneContainer( + viewModel = viewModel, + sceneByKey = + sceneByKey.mapValues { (_, scene) -> scene as ComposableScene }, + ) + } + } + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/compose/BaseComposeFacade.kt b/packages/SystemUI/src/com/android/systemui/compose/BaseComposeFacade.kt index 4173bdc3c2618..b15c60e62eade 100644 --- a/packages/SystemUI/src/com/android/systemui/compose/BaseComposeFacade.kt +++ b/packages/SystemUI/src/com/android/systemui/compose/BaseComposeFacade.kt @@ -24,6 +24,9 @@ import androidx.lifecycle.LifecycleOwner import com.android.systemui.multishade.ui.viewmodel.MultiShadeViewModel import com.android.systemui.people.ui.viewmodel.PeopleViewModel import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel +import com.android.systemui.scene.shared.model.Scene +import com.android.systemui.scene.shared.model.SceneKey +import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel import com.android.systemui.util.time.SystemClock /** @@ -66,4 +69,11 @@ interface BaseComposeFacade { viewModel: MultiShadeViewModel, clock: SystemClock, ): View + + /** Create a [View] to represent [viewModel] on screen. */ + fun createSceneContainerView( + context: Context, + viewModel: SceneContainerViewModel, + sceneByKey: Map, + ): View } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSysUIComponent.java b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSysUIComponent.java index a90980fddfb0e..5493cea8fd02b 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSysUIComponent.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSysUIComponent.java @@ -18,6 +18,7 @@ package com.android.systemui.dagger; import com.android.systemui.globalactions.ShutdownUiModule; import com.android.systemui.keyguard.CustomizationProvider; +import com.android.systemui.scene.startable.SceneContainerStartableModule; import com.android.systemui.statusbar.NotificationInsetsModule; import com.android.systemui.statusbar.QsFrameTranslateModule; @@ -33,6 +34,7 @@ import dagger.Subcomponent; NotificationInsetsModule.class, QsFrameTranslateModule.class, ShutdownUiModule.class, + SceneContainerStartableModule.class, SystemUIBinder.class, SystemUIModule.class, SystemUICoreStartableModule.class, diff --git a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java index 2262d8ab2000d..f68bd49230d9e 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java @@ -40,7 +40,6 @@ import com.android.systemui.qs.tileimpl.QSFactoryImpl; import com.android.systemui.recents.Recents; import com.android.systemui.recents.RecentsImplementation; import com.android.systemui.rotationlock.RotationLockModule; -import com.android.systemui.scene.SceneContainerFrameworkModule; import com.android.systemui.screenshot.ReferenceScreenshotModule; import com.android.systemui.settings.dagger.MultiUserUtilsModule; import com.android.systemui.shade.NotificationShadeWindowControllerImpl; @@ -104,7 +103,6 @@ import javax.inject.Named; QSModule.class, ReferenceScreenshotModule.class, RotationLockModule.class, - SceneContainerFrameworkModule.class, StatusBarEventsModule.class, StartCentralSurfacesModule.class, VolumeModule.class, diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java index 9eb85dfa9905b..a64321b816925 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java @@ -38,6 +38,7 @@ import com.android.systemui.biometrics.FingerprintInteractiveToAuthProvider; import com.android.systemui.biometrics.UdfpsDisplayModeProvider; import com.android.systemui.biometrics.dagger.BiometricsModule; import com.android.systemui.biometrics.dagger.UdfpsModule; +import com.android.systemui.bouncer.ui.BouncerViewModule; import com.android.systemui.classifier.FalsingModule; import com.android.systemui.clipboardoverlay.dagger.ClipboardOverlayModule; import com.android.systemui.common.ui.data.repository.CommonRepositoryModule; @@ -52,7 +53,6 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.FlagsModule; import com.android.systemui.keyboard.KeyboardModule; -import com.android.systemui.bouncer.ui.BouncerViewModule; import com.android.systemui.log.dagger.LogModule; import com.android.systemui.log.dagger.MonitorLog; import com.android.systemui.log.table.TableLogBuffer; @@ -73,6 +73,7 @@ import com.android.systemui.qs.QSFragmentStartableModule; import com.android.systemui.qs.footer.dagger.FooterActionsModule; import com.android.systemui.recents.Recents; import com.android.systemui.retail.dagger.RetailModeModule; +import com.android.systemui.scene.SceneContainerFrameworkModule; import com.android.systemui.screenrecord.ScreenRecordModule; import com.android.systemui.screenshot.dagger.ScreenshotModule; import com.android.systemui.security.data.repository.SecurityRepositoryModule; @@ -185,6 +186,7 @@ import javax.inject.Named; QRCodeScannerModule.class, QSFragmentStartableModule.class, RetailModeModule.class, + SceneContainerFrameworkModule.class, ScreenshotModule.class, SensorModule.class, SecurityRepositoryModule.class, diff --git a/packages/SystemUI/src/com/android/systemui/scene/SceneContainerFrameworkModule.kt b/packages/SystemUI/src/com/android/systemui/scene/SceneContainerFrameworkModule.kt index 752471d837352..0a9839e2f18b6 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/SceneContainerFrameworkModule.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/SceneContainerFrameworkModule.kt @@ -16,7 +16,7 @@ package com.android.systemui.scene -import com.android.systemui.scene.data.model.SceneContainerConfigModule +import com.android.systemui.scene.shared.model.SceneContainerConfigModule import com.android.systemui.scene.ui.composable.SceneModule import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModelModule import dagger.Module diff --git a/packages/SystemUI/src/com/android/systemui/scene/data/repository/SceneContainerRepository.kt b/packages/SystemUI/src/com/android/systemui/scene/data/repository/SceneContainerRepository.kt index 61b162b014d82..1ebeced5fae68 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/data/repository/SceneContainerRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/data/repository/SceneContainerRepository.kt @@ -16,7 +16,7 @@ package com.android.systemui.scene.data.repository -import com.android.systemui.scene.data.model.SceneContainerConfig +import com.android.systemui.scene.shared.model.SceneContainerConfig import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.scene.shared.model.SceneModel import javax.inject.Inject @@ -28,11 +28,9 @@ import kotlinx.coroutines.flow.asStateFlow class SceneContainerRepository @Inject constructor( - containerConfigurations: Set, + private val containerConfigByName: Map, ) { - private val containerConfigByName: Map = - containerConfigurations.associateBy { config -> config.name } private val containerVisibilityByName: Map> = containerConfigByName .map { (containerName, _) -> containerName to MutableStateFlow(true) } @@ -48,21 +46,6 @@ constructor( .map { (containerName, _) -> containerName to MutableStateFlow(1f) } .toMap() - init { - val repeatedContainerNames = - containerConfigurations - .groupingBy { config -> config.name } - .eachCount() - .filter { (_, count) -> count > 1 } - check(repeatedContainerNames.isEmpty()) { - "Container names must be unique. The following container names appear more than once: ${ - repeatedContainerNames - .map { (name, count) -> "\"$name\" appears $count times" } - .joinToString(", ") - }" - } - } - /** * Returns the keys to all scenes in the container with the given name. * diff --git a/packages/SystemUI/src/com/android/systemui/scene/data/model/SceneContainerConfig.kt b/packages/SystemUI/src/com/android/systemui/scene/shared/model/SceneContainerConfig.kt similarity index 90% rename from packages/SystemUI/src/com/android/systemui/scene/data/model/SceneContainerConfig.kt rename to packages/SystemUI/src/com/android/systemui/scene/shared/model/SceneContainerConfig.kt index d0769ebe941ef..0327edbb06b43 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/data/model/SceneContainerConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/shared/model/SceneContainerConfig.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 The Android Open Source Project + * Copyright 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,9 +14,7 @@ * limitations under the License. */ -package com.android.systemui.scene.data.model - -import com.android.systemui.scene.shared.model.SceneKey +package com.android.systemui.scene.shared.model /** Models the configuration of a single scene container. */ data class SceneContainerConfig( diff --git a/packages/SystemUI/src/com/android/systemui/scene/data/model/SceneContainerConfigModule.kt b/packages/SystemUI/src/com/android/systemui/scene/shared/model/SceneContainerConfigModule.kt similarity index 89% rename from packages/SystemUI/src/com/android/systemui/scene/data/model/SceneContainerConfigModule.kt rename to packages/SystemUI/src/com/android/systemui/scene/shared/model/SceneContainerConfigModule.kt index 0af80949f95e0..7562a5a848d8a 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/data/model/SceneContainerConfigModule.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/shared/model/SceneContainerConfigModule.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 The Android Open Source Project + * Copyright 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,11 +14,9 @@ * limitations under the License. */ -package com.android.systemui.scene.data.model +package com.android.systemui.scene.shared.model import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.scene.shared.model.SceneContainerNames -import com.android.systemui.scene.shared.model.SceneKey import dagger.Module import dagger.Provides import javax.inject.Named diff --git a/packages/SystemUI/src/com/android/systemui/scene/startable/SceneContainerStartable.kt b/packages/SystemUI/src/com/android/systemui/scene/startable/SceneContainerStartable.kt new file mode 100644 index 0000000000000..a29e92afc55e6 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/scene/startable/SceneContainerStartable.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.scene.startable + +import com.android.systemui.CoreStartable +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.scene.shared.model.Scene +import com.android.systemui.scene.shared.model.SceneContainerConfig +import com.android.systemui.scene.shared.model.SceneContainerNames +import com.android.systemui.scene.ui.view.SceneWindowRootView +import com.android.systemui.scene.ui.view.WindowRootView +import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel +import dagger.Binds +import dagger.Module +import dagger.multibindings.ClassKey +import dagger.multibindings.IntoMap +import javax.inject.Inject +import javax.inject.Named + +@SysUISingleton +class SceneContainerStartable +@Inject +constructor( + private val view: WindowRootView, + @Named(SceneContainerNames.SYSTEM_UI_DEFAULT) private val viewModel: SceneContainerViewModel, + @Named(SceneContainerNames.SYSTEM_UI_DEFAULT) private val containerConfig: SceneContainerConfig, + @Named(SceneContainerNames.SYSTEM_UI_DEFAULT) + private val scenes: Set<@JvmSuppressWildcards Scene>, +) : CoreStartable { + + override fun start() { + (view as? SceneWindowRootView)?.init( + viewModel = viewModel, + containerConfig = containerConfig, + scenes = scenes, + ) + } +} + +@Module +interface SceneContainerStartableModule { + @Binds + @IntoMap + @ClassKey(SceneContainerStartable::class) + fun bind(impl: SceneContainerStartable): CoreStartable +} diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootView.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootView.kt index 8f001ec6b5e22..2ad5429668d0e 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootView.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootView.kt @@ -2,6 +2,73 @@ package com.android.systemui.scene.ui.view import android.content.Context import android.util.AttributeSet +import androidx.activity.OnBackPressedDispatcher +import androidx.activity.OnBackPressedDispatcherOwner +import androidx.activity.setViewTreeOnBackPressedDispatcherOwner +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import com.android.systemui.compose.ComposeFacade +import com.android.systemui.lifecycle.repeatWhenAttached +import com.android.systemui.scene.shared.model.Scene +import com.android.systemui.scene.shared.model.SceneContainerConfig +import com.android.systemui.scene.shared.model.SceneKey +import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel +import kotlinx.coroutines.launch /** A root view of the main SysUI window that supports scenes. */ -class SceneWindowRootView(context: Context?, attrs: AttributeSet?) : WindowRootView(context, attrs) \ No newline at end of file +class SceneWindowRootView( + context: Context, + attrs: AttributeSet?, +) : + WindowRootView( + context, + attrs, + ) { + fun init( + viewModel: SceneContainerViewModel, + containerConfig: SceneContainerConfig, + scenes: Set, + ) { + val unsortedSceneByKey: Map = scenes.associateBy { scene -> scene.key } + val sortedSceneByKey: Map = buildMap { + containerConfig.sceneKeys.forEach { sceneKey -> + val scene = + checkNotNull(unsortedSceneByKey[sceneKey]) { + "Scene not found for key \"$sceneKey\"!" + } + + put(sceneKey, scene) + } + } + + repeatWhenAttached { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + setViewTreeOnBackPressedDispatcherOwner( + object : OnBackPressedDispatcherOwner { + override val onBackPressedDispatcher = + OnBackPressedDispatcher().apply { + setOnBackInvokedDispatcher(viewRootImpl.onBackInvokedDispatcher) + } + + override val lifecycle: Lifecycle = + this@repeatWhenAttached.lifecycle + } + ) + + addView( + ComposeFacade.createSceneContainerView( + context = context, + viewModel = viewModel, + sceneByKey = sortedSceneByKey, + ) + ) + } + + // Here when destroyed. + removeAllViews() + } + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/view/WindowRootView.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/view/WindowRootView.kt index a0f9667053811..e118f1fa8feae 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/ui/view/WindowRootView.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/ui/view/WindowRootView.kt @@ -2,7 +2,37 @@ package com.android.systemui.scene.ui.view import android.content.Context import android.util.AttributeSet +import android.view.View import android.widget.FrameLayout +import com.android.systemui.compose.ComposeFacade -/** A view that can serve as the root of the main SysUI window. */ -open class WindowRootView(context: Context?, attrs: AttributeSet?) : FrameLayout(context, attrs) \ No newline at end of file +/** A view that can serve as the root of the main SysUI window. */ +open class WindowRootView( + context: Context, + attrs: AttributeSet?, +) : + FrameLayout( + context, + attrs, + ) { + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + + if (ComposeFacade.isComposeAvailable() && isRoot()) { + ComposeFacade.composeInitializer().onAttachedToWindow(this) + } + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + + if (ComposeFacade.isComposeAvailable() && isRoot()) { + ComposeFacade.composeInitializer().onDetachedFromWindow(this) + } + } + + private fun isRoot(): Boolean { + return parent.let { it !is View || it.id == android.R.id.content } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java index c9122c77c1d41..2b62b7d67c2a4 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java @@ -58,7 +58,6 @@ import android.widget.FrameLayout; import com.android.internal.view.FloatingActionMode; import com.android.internal.widget.floatingtoolbar.FloatingToolbar; import com.android.systemui.R; -import com.android.systemui.compose.ComposeFacade; import com.android.systemui.scene.ui.view.WindowRootView; /** @@ -149,18 +148,6 @@ public class NotificationShadeWindowView extends WindowRootView { protected void onAttachedToWindow() { super.onAttachedToWindow(); setWillNotDraw(!DEBUG); - - if (ComposeFacade.INSTANCE.isComposeAvailable()) { - ComposeFacade.INSTANCE.composeInitializer().onAttachedToWindow(this); - } - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - if (ComposeFacade.INSTANCE.isComposeAvailable()) { - ComposeFacade.INSTANCE.composeInitializer().onDetachedFromWindow(this); - } } @Override diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt index 1752ff6d531f5..e2a64708ab661 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt @@ -16,6 +16,7 @@ package com.android.systemui.shade +import android.annotation.SuppressLint import android.content.ContentResolver import android.os.Handler import android.view.LayoutInflater @@ -28,6 +29,7 @@ import com.android.systemui.battery.BatteryMeterView import com.android.systemui.battery.BatteryMeterViewController import com.android.systemui.biometrics.AuthRippleController import com.android.systemui.biometrics.AuthRippleView +import com.android.systemui.compose.ComposeFacade import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.flags.FeatureFlags @@ -62,13 +64,16 @@ abstract class ShadeModule { companion object { const val SHADE_HEADER = "large_screen_shade_header" + @SuppressLint("InflateParams") // Root views don't have parents. @Provides @SysUISingleton fun providesWindowRootView( layoutInflater: LayoutInflater, featureFlags: FeatureFlags, ): WindowRootView { - return if (featureFlags.isEnabled(Flags.SCENE_CONTAINER)) { + return if ( + featureFlags.isEnabled(Flags.SCENE_CONTAINER) && ComposeFacade.isComposeAvailable() + ) { layoutInflater.inflate(R.layout.scene_window_root, null) } else { layoutInflater.inflate(R.layout.super_notification_shade, null) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt index 1b7542b421282..9c4fd9459b571 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt @@ -24,9 +24,9 @@ import com.android.systemui.bouncer.data.repository.BouncerRepository import com.android.systemui.bouncer.domain.interactor.BouncerInteractor import com.android.systemui.bouncer.ui.viewmodel.BouncerViewModel import com.android.systemui.keyguard.domain.interactor.LockscreenSceneInteractor -import com.android.systemui.scene.data.model.SceneContainerConfig import com.android.systemui.scene.data.repository.SceneContainerRepository import com.android.systemui.scene.domain.interactor.SceneInteractor +import com.android.systemui.scene.shared.model.SceneContainerConfig import com.android.systemui.scene.shared.model.SceneKey import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -51,7 +51,7 @@ class SceneTestUtils( fakeSceneContainerConfig(CONTAINER_2), ) ): SceneContainerRepository { - return SceneContainerRepository(containerConfigurations) + return SceneContainerRepository(containerConfigurations.associateBy { it.name }) } fun fakeSceneKeys(): List {