diff options
13 files changed, 208 insertions, 89 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/core/StatusBarInitializerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/core/StatusBarInitializerTest.kt index e312d00f3dc2..20a19a9b1399 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/core/StatusBarInitializerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/core/StatusBarInitializerTest.kt @@ -98,9 +98,9 @@ class StatusBarInitializerTest : SysuiTestCase() { @Test @DisableFlags(Flags.FLAG_STATUS_BAR_SIMPLE_FRAGMENT) - fun flagOff_doesNotInitializeViaCoreStartable() { + fun flagOff_startCalled_stillInitializes() { underTest.start() - assertThat(underTest.initialized).isFalse() + assertThat(underTest.initialized).isTrue() } @Test diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/core/StatusBarOrchestratorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/core/StatusBarOrchestratorTest.kt index ab8e878ab309..79230977b68e 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/core/StatusBarOrchestratorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/core/StatusBarOrchestratorTest.kt @@ -52,7 +52,7 @@ import org.mockito.kotlin.never import org.mockito.kotlin.times import org.mockito.kotlin.verify -@EnableFlags(StatusBarSimpleFragment.FLAG_NAME) +@EnableFlags(StatusBarConnectedDisplays.FLAG_NAME) @SmallTest @RunWith(AndroidJUnit4::class) class StatusBarOrchestratorTest : SysuiTestCase() { diff --git a/packages/SystemUI/src/com/android/systemui/flags/FlagDependencies.kt b/packages/SystemUI/src/com/android/systemui/flags/FlagDependencies.kt index 47f0ecfb237a..3cc184d7ddf4 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/FlagDependencies.kt +++ b/packages/SystemUI/src/com/android/systemui/flags/FlagDependencies.kt @@ -34,8 +34,6 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.MigrateClocksToBlueprint import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.shade.shared.flag.DualShade -import com.android.systemui.statusbar.core.StatusBarConnectedDisplays -import com.android.systemui.statusbar.core.StatusBarSimpleFragment import com.android.systemui.statusbar.notification.collection.SortBySectionTimeFlag import com.android.systemui.statusbar.notification.emptyshade.shared.ModesEmptyShadeFix import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor @@ -75,8 +73,6 @@ class FlagDependencies @Inject constructor(featureFlags: FeatureFlagsClassic, ha // Status bar chip dependencies statusBarCallChipNotificationIconToken dependsOn statusBarUseReposForCallChipToken statusBarCallChipNotificationIconToken dependsOn statusBarScreenSharingChipsToken - - StatusBarConnectedDisplays.token dependsOn StatusBarSimpleFragment.token } private inline val politeNotifications diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializer.kt b/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializer.kt index 6201ca553398..3abbc6e0d1cb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializer.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializer.kt @@ -103,9 +103,7 @@ constructor( } override fun start() { - if (StatusBarSimpleFragment.isEnabled) { - doStart() - } + doStart() } override fun initializeStatusBar() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarOrchestrator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarOrchestrator.kt index 9619607e5926..f33b76b17f96 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarOrchestrator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarOrchestrator.kt @@ -139,7 +139,7 @@ constructor( } override fun start() { - StatusBarSimpleFragment.assertInNewMode() + StatusBarConnectedDisplays.assertInNewMode() coroutineScope .launch { dumpManager.registerCriticalDumpable(dumpableName, this@StatusBarOrchestrator) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/data/StatusBarDataLayerModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/data/StatusBarDataLayerModule.kt index c416bf7b4f92..8a850b0fb199 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/data/StatusBarDataLayerModule.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/data/StatusBarDataLayerModule.kt @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.data import com.android.systemui.statusbar.data.repository.KeyguardStatusBarRepositoryModule +import com.android.systemui.statusbar.data.repository.PrivacyDotViewControllerStoreModule import com.android.systemui.statusbar.data.repository.RemoteInputRepositoryModule import com.android.systemui.statusbar.data.repository.StatusBarConfigurationControllerModule import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStoreModule @@ -27,6 +28,7 @@ import dagger.Module includes = [ KeyguardStatusBarRepositoryModule::class, + PrivacyDotViewControllerStoreModule::class, RemoteInputRepositoryModule::class, StatusBarConfigurationControllerModule::class, StatusBarContentInsetsProviderStoreModule::class, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/PrivacyDotViewControllerStore.kt b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/PrivacyDotViewControllerStore.kt new file mode 100644 index 000000000000..bd61c44e3d9b --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/PrivacyDotViewControllerStore.kt @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2024 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.statusbar.data.repository + +import com.android.systemui.CoreStartable +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.display.data.repository.DisplayRepository +import com.android.systemui.display.data.repository.DisplayScopeRepository +import com.android.systemui.display.data.repository.PerDisplayStore +import com.android.systemui.display.data.repository.PerDisplayStoreImpl +import com.android.systemui.display.data.repository.SingleDisplayStore +import com.android.systemui.statusbar.core.StatusBarConnectedDisplays +import com.android.systemui.statusbar.events.PrivacyDotViewController +import com.android.systemui.statusbar.events.PrivacyDotViewControllerImpl +import dagger.Lazy +import dagger.Module +import dagger.Provides +import dagger.multibindings.ClassKey +import dagger.multibindings.IntoMap +import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope + +/** Provides per display instances of [PrivacyDotViewController]. */ +interface PrivacyDotViewControllerStore : PerDisplayStore<PrivacyDotViewController> + +@SysUISingleton +class MultiDisplayPrivacyDotViewControllerStore +@Inject +constructor( + @Background backgroundApplicationScope: CoroutineScope, + displayRepository: DisplayRepository, + private val factory: PrivacyDotViewControllerImpl.Factory, + private val displayScopeRepository: DisplayScopeRepository, + private val statusBarConfigurationControllerStore: StatusBarConfigurationControllerStore, + private val contentInsetsProviderStore: StatusBarContentInsetsProviderStore, +) : + PrivacyDotViewControllerStore, + PerDisplayStoreImpl<PrivacyDotViewController>(backgroundApplicationScope, displayRepository) { + + override fun createInstanceForDisplay(displayId: Int): PrivacyDotViewController { + return factory.create( + displayScopeRepository.scopeForDisplay(displayId), + statusBarConfigurationControllerStore.forDisplay(displayId), + contentInsetsProviderStore.forDisplay(displayId), + ) + } + + override suspend fun onDisplayRemovalAction(instance: PrivacyDotViewController) { + instance.stop() + } + + override val instanceClass = PrivacyDotViewController::class.java +} + +@SysUISingleton +class SingleDisplayPrivacyDotViewControllerStore +@Inject +constructor(defaultController: PrivacyDotViewController) : + PrivacyDotViewControllerStore, + PerDisplayStore<PrivacyDotViewController> by SingleDisplayStore( + defaultInstance = defaultController + ) + +@Module +object PrivacyDotViewControllerStoreModule { + + @Provides + @SysUISingleton + fun store( + singleDisplayLazy: Lazy<SingleDisplayPrivacyDotViewControllerStore>, + multiDisplayLazy: Lazy<MultiDisplayPrivacyDotViewControllerStore>, + ): PrivacyDotViewControllerStore { + return if (StatusBarConnectedDisplays.isEnabled) { + multiDisplayLazy.get() + } else { + singleDisplayLazy.get() + } + } + + @Provides + @SysUISingleton + @IntoMap + @ClassKey(PrivacyDotViewControllerStore::class) + fun storeAsCoreStartable( + multiDisplayLazy: Lazy<MultiDisplayPrivacyDotViewControllerStore> + ): CoreStartable { + return if (StatusBarConnectedDisplays.isEnabled) { + multiDisplayLazy.get() + } else { + CoreStartable.NOP + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt index 8a2e9392f274..914cc50a4a3a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt @@ -34,6 +34,7 @@ import com.android.systemui.res.R import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.StatusBarState.SHADE import com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED +import com.android.systemui.statusbar.core.StatusBarConnectedDisplays import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore import com.android.systemui.statusbar.phone.StatusBarContentInsetsChangedListener import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider @@ -70,6 +71,11 @@ import com.android.app.tracing.coroutines.launchTraced as launch */ interface PrivacyDotViewController { + /** + * Called when the [PrivacyDotViewController] should stop doing any work and clean up if needed. + */ + fun stop() + // Only can be modified on @UiThread var currentViewState: ViewState @@ -138,45 +144,45 @@ constructor( override var showingListener: PrivacyDotViewController.ShowingListener? = null - init { - contentInsetsProvider.addCallback( - object : StatusBarContentInsetsChangedListener { - override fun onStatusBarContentInsetsChanged() { - dlog("onStatusBarContentInsetsChanged: ") - setNewLayoutRects() - } + private val insetsChangedListener = + object : StatusBarContentInsetsChangedListener { + override fun onStatusBarContentInsetsChanged() { + dlog("onStatusBarContentInsetsChanged: ") + setNewLayoutRects() } - ) + } - configurationController.addCallback( - object : ConfigurationController.ConfigurationListener { - override fun onLayoutDirectionChanged(isRtl: Boolean) { - uiExecutor?.execute { - // If rtl changed, hide all dotes until the next state resolves - setCornerVisibilities(View.INVISIBLE) - - synchronized(this) { - val corner = selectDesignatedCorner(nextViewState.rotation, isRtl) - nextViewState = - nextViewState.copy(layoutRtl = isRtl, designatedCorner = corner) - } + private val configurationListener = + object : ConfigurationController.ConfigurationListener { + override fun onLayoutDirectionChanged(isRtl: Boolean) { + uiExecutor?.execute { + // If rtl changed, hide all dots until the next state resolves + setCornerVisibilities(View.INVISIBLE) + + synchronized(this) { + val corner = selectDesignatedCorner(nextViewState.rotation, isRtl) + nextViewState = + nextViewState.copy(layoutRtl = isRtl, designatedCorner = corner) } } } - ) + } - stateController.addCallback( - object : StatusBarStateController.StateListener { - override fun onExpandedChanged(isExpanded: Boolean) { - updateStatusBarState() - } + private val statusBarStateListener = + object : StatusBarStateController.StateListener { + override fun onExpandedChanged(isExpanded: Boolean) { + updateStatusBarState() + } - override fun onStateChanged(newState: Int) { - updateStatusBarState() - } + override fun onStateChanged(newState: Int) { + updateStatusBarState() } - ) + } + init { + contentInsetsProvider.addCallback(insetsChangedListener) + configurationController.addCallback(configurationListener) + stateController.addCallback(statusBarStateListener) scope.launch { shadeInteractor?.isQsExpanded?.collect { isQsExpanded -> dlog("setQsExpanded $isQsExpanded") @@ -185,6 +191,13 @@ constructor( } } + override fun stop() { + StatusBarConnectedDisplays.assertInNewMode() + contentInsetsProvider.removeCallback(insetsChangedListener) + configurationController.removeCallback(configurationListener) + stateController.removeCallback(statusBarStateListener) + } + override fun setUiExecutor(e: DelayableExecutor) { uiExecutor = e } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index afa5a7802559..b469e3db41e5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -199,6 +199,7 @@ import com.android.systemui.statusbar.PowerButtonReveal; import com.android.systemui.statusbar.PulseExpansionHandler; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.SysuiStatusBarStateController; +import com.android.systemui.statusbar.core.StatusBarConnectedDisplays; import com.android.systemui.statusbar.core.StatusBarInitializer; import com.android.systemui.statusbar.core.StatusBarSimpleFragment; import com.android.systemui.statusbar.data.model.StatusBarMode; @@ -808,7 +809,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mStartingSurfaceOptional = startingSurfaceOptional; mDreamManager = dreamManager; lockscreenShadeTransitionController.setCentralSurfaces(this); - if (!StatusBarSimpleFragment.isEnabled()) { + if (!StatusBarConnectedDisplays.isEnabled()) { statusBarWindowStateController.addListener(this::onStatusBarWindowStateChanged); } mScreenOffAnimationController = screenOffAnimationController; @@ -896,7 +897,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mWallpaperSupported = mWallpaperManager.isWallpaperSupported(); RegisterStatusBarResult result = null; - if (!StatusBarSimpleFragment.isEnabled()) { + if (!StatusBarConnectedDisplays.isEnabled()) { try { result = mBarService.registerStatusBar(mCommandQueue); } catch (RemoteException ex) { @@ -909,9 +910,9 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { // Set up the initial notification state. This needs to happen before CommandQueue.disable() setUpPresenter(); - // When the StatusBarSimpleFragment flag is enabled, this logic will be done in + // When the StatusBarConnectedDisplays flag is enabled, this logic will be done in // StatusBarOrchestrator - if (!StatusBarSimpleFragment.isEnabled()) { + if (!StatusBarConnectedDisplays.isEnabled()) { if ((result.mTransientBarTypes & WindowInsets.Type.statusBars()) != 0) { mStatusBarModeRepository.getDefaultDisplay().showTransient(); } @@ -1010,9 +1011,9 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mAccessibilityFloatingMenuController.init(); - // When the StatusBarSimpleFragment flag is enabled, this logic will be done in + // When the StatusBarConnectedDisplays flag is enabled, this logic will be done in // StatusBarOrchestrator - if (!StatusBarSimpleFragment.isEnabled()) { + if (!StatusBarConnectedDisplays.isEnabled()) { // set the initial view visibility int disabledFlags1 = result.mDisabledFlags1; int disabledFlags2 = result.mDisabledFlags2; @@ -1179,9 +1180,9 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mWallpaperController.setRootView(getNotificationShadeWindowView()); mDemoModeController.addCallback(mDemoModeCallback); - // When the StatusBarSimpleFragment flag is enabled, this logic will be done in + // When the StatusBarConnectedDisplays flag is enabled, this logic will be done in // StatusBarOrchestrator. - if (!StatusBarSimpleFragment.isEnabled()) { + if (!StatusBarConnectedDisplays.isEnabled()) { mJavaAdapter.alwaysCollectFlow( mStatusBarModeRepository.getDefaultDisplay().isTransientShown(), this::onTransientShownChanged); @@ -1198,9 +1199,9 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mShadeExpansionStateManager.addExpansionListener(mWakeUpCoordinator); mWakeUpCoordinator.onPanelExpansionChanged(currentState); - // When the StatusBarSimpleFragment flag is enabled, all this logic will be done in + // When the StatusBarConnectedDisplays flag is enabled, all this logic will be done in // StatusBarOrchestrator. - if (!StatusBarSimpleFragment.isEnabled()) { + if (!StatusBarConnectedDisplays.isEnabled()) { // Allow plugins to reference DarkIconDispatcher and StatusBarStateController mPluginDependencyProvider.allowPluginDependency(DarkIconDispatcher.class); mPluginDependencyProvider.allowPluginDependency(StatusBarStateController.class); @@ -1222,6 +1223,8 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { setBouncerShowingForStatusBarComponents(mBouncerShowing); checkBarModes(); }); + } + if (!StatusBarSimpleFragment.isEnabled() && !StatusBarConnectedDisplays.isEnabled()) { // When the flag is on, we register the fragment as a core startable and this is not // needed mStatusBarInitializer.initializeStatusBar(); @@ -1229,16 +1232,16 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mStatusBarTouchableRegionManager.setup(getNotificationShadeWindowView()); - if (!StatusBarSimpleFragment.isEnabled()) { + if (!StatusBarConnectedDisplays.isEnabled()) { createNavigationBar(result); } mAmbientIndicationContainer = getNotificationShadeWindowView().findViewById( R.id.ambient_indication_container); - // When the StatusBarSimpleFragment flag is enabled, all this logic will be done in + // When the StatusBarConnectedDisplays flag is enabled, all this logic will be done in // StatusBarOrchestrator. - if (!StatusBarSimpleFragment.isEnabled()) { + if (!StatusBarConnectedDisplays.isEnabled()) { mAutoHideController.setStatusBar( new AutoHideUiElement() { @Override @@ -1498,14 +1501,14 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { * @param state2 disable2 flags */ protected void setUpDisableFlags(int state1, int state2) { - StatusBarSimpleFragment.assertInLegacyMode(); + StatusBarConnectedDisplays.assertInLegacyMode(); mCommandQueue.disable(mDisplayId, state1, state2, false /* animate */); } // TODO(b/117478341): This was left such that CarStatusBar can override this method. // Try to remove this. protected void createNavigationBar(@Nullable RegisterStatusBarResult result) { - StatusBarSimpleFragment.assertInLegacyMode(); + StatusBarConnectedDisplays.assertInLegacyMode(); mNavigationBarController.createNavigationBars(true /* includeDefaultDisplay */, result); } @@ -1718,9 +1721,9 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { @Override public void checkBarModes() { if (mDemoModeController.isInDemoMode()) return; - // When the StatusBarSimpleFragment flag is enabled, this logic will be done in + // When the StatusBarConnectedDisplays flag is enabled, this logic will be done in // StatusBarOrchestrator. - if (!StatusBarSimpleFragment.isEnabled() && mStatusBarTransitions != null) { + if (!StatusBarConnectedDisplays.isEnabled() && mStatusBarTransitions != null) { checkBarMode( mStatusBarModeRepository.getDefaultDisplay().getStatusBarMode().getValue(), mStatusBarWindowState, @@ -1751,9 +1754,9 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { } private void finishBarAnimations() { - // When the StatusBarSimpleFragment flag is enabled, this logic will be done in + // When the StatusBarConnectedDisplays flag is enabled, this logic will be done in // StatusBarOrchestrator. - if (!StatusBarSimpleFragment.isEnabled() && mStatusBarTransitions != null) { + if (!StatusBarConnectedDisplays.isEnabled() && mStatusBarTransitions != null) { mStatusBarTransitions.finishAnimations(); } mNavigationBarController.finishBarAnimations(mDisplayId); @@ -1795,14 +1798,14 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { } pw.print(" mInteractingWindows="); pw.println(mInteractingWindows); - if (!StatusBarSimpleFragment.isEnabled()) { + if (!StatusBarConnectedDisplays.isEnabled()) { pw.print(" mStatusBarWindowState="); pw.println(windowStateToString(mStatusBarWindowState)); } pw.print(" mDozing="); pw.println(mDozing); pw.print(" mWallpaperSupported= "); pw.println(mWallpaperSupported); - if (!StatusBarSimpleFragment.isEnabled()) { + if (!StatusBarConnectedDisplays.isEnabled()) { CentralSurfaces.dumpBarTransitions( pw, "PhoneStatusBarTransitions", mStatusBarTransitions); } @@ -1878,9 +1881,9 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { private void createAndAddWindows(@Nullable RegisterStatusBarResult result) { makeStatusBarView(result); mNotificationShadeWindowController.attach(); - // When the StatusBarSimpleFragment flag is enabled, this logic will be done in + // When the StatusBarConnectedDisplays flag is enabled, this logic will be done in // StatusBarOrchestrator - if (!StatusBarSimpleFragment.isEnabled()) { + if (!StatusBarConnectedDisplays.isEnabled()) { mStatusBarWindowControllerStore.getDefaultDisplay().attach(); } } @@ -2507,7 +2510,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { int importance = bouncerShowing ? IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS : IMPORTANT_FOR_ACCESSIBILITY_AUTO; - if (!StatusBarSimpleFragment.isEnabled() && mPhoneStatusBarViewController != null) { + if (!StatusBarConnectedDisplays.isEnabled() && mPhoneStatusBarViewController != null) { mPhoneStatusBarViewController.setImportantForAccessibility(importance); } mShadeSurface.setImportantForAccessibility(importance); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt index 92d0ebecf8d8..99f25bd00839 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt @@ -78,8 +78,11 @@ interface StatusBarPhoneModule { return if (StatusBarConnectedDisplays.isEnabled) { // Will be started through MultiDisplayStatusBarStarter CoreStartable.NOP - } else { + } else if (StatusBarSimpleFragment.isEnabled) { defaultInitializerLazy.get() + } else { + // Will be started through CentralSurfaces + CoreStartable.NOP } } @@ -119,24 +122,6 @@ interface StatusBarPhoneModule { @Provides @SysUISingleton @IntoMap - @ClassKey(StatusBarOrchestrator::class) - fun orchestratorCoreStartable( - @Default orchestratorLazy: Lazy<StatusBarOrchestrator> - ): CoreStartable { - return if (StatusBarConnectedDisplays.isEnabled) { - // Will be started through MultiDisplayStatusBarStarter - CoreStartable.NOP - } else if (StatusBarSimpleFragment.isEnabled) { - orchestratorLazy.get() - } else { - // Will be started through CentralSurfacesImpl - CoreStartable.NOP - } - } - - @Provides - @SysUISingleton - @IntoMap @ClassKey(MultiDisplayStatusBarStarter::class) fun multiDisplayStarter( multiDisplayStatusBarStarterLazy: Lazy<MultiDisplayStatusBarStarter> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java index 37c8c637c804..013141b5e142 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java @@ -57,6 +57,7 @@ import com.android.systemui.statusbar.OperatorNameView; import com.android.systemui.statusbar.OperatorNameViewController; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips; +import com.android.systemui.statusbar.core.StatusBarConnectedDisplays; import com.android.systemui.statusbar.core.StatusBarSimpleFragment; import com.android.systemui.statusbar.disableflags.DisableFlagsLogger; import com.android.systemui.statusbar.events.SystemStatusAnimationCallback; @@ -711,8 +712,14 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue private boolean shouldHideStatusBar() { StatusBarSimpleFragment.assertInLegacyMode(); + boolean isDefaultDisplay = getContext().getDisplayId() == Display.DEFAULT_DISPLAY; + boolean shouldHideForCurrentDisplay = + !StatusBarConnectedDisplays.isEnabled() || isDefaultDisplay; if (!mShadeExpansionStateManager.isClosed() - && mPanelExpansionInteractor.shouldHideStatusBarIconsWhenExpanded()) { + && mPanelExpansionInteractor.shouldHideStatusBarIconsWhenExpanded() + //TODO(b/373310629): for now the shade only shows on the main display. + // Remove this once there is a display aware API for the shade. + && shouldHideForCurrentDisplay) { return true; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt index 4684f61e13a2..a472318a1e86 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.pipeline.shared.ui.composable +import android.view.Display import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -152,8 +153,14 @@ fun StatusBarRoot( phoneStatusBarView.requireViewById<NotificationIconContainer>( R.id.notificationIcons ) - scope.launch { - notificationIconsBinder.bindWhileAttached(notificationIconContainer) + + // TODO(b/369337701): implement notification icons for all displays. + // Currently if we try to bind for all displays, there is a crash, because the + // same notification icon view can't have multiple parents. + if (context.displayId == Display.DEFAULT_DISPLAY) { + scope.launch { + notificationIconsBinder.bindWhileAttached(notificationIconContainer) + } } // This binder handles everything else diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java index 1e88215bf339..f472fd1019eb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java @@ -172,9 +172,9 @@ import com.android.systemui.statusbar.OperatorNameViewController; import com.android.systemui.statusbar.PulseExpansionHandler; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.StatusBarStateControllerImpl; +import com.android.systemui.statusbar.core.StatusBarConnectedDisplays; import com.android.systemui.statusbar.core.StatusBarInitializerImpl; import com.android.systemui.statusbar.core.StatusBarOrchestrator; -import com.android.systemui.statusbar.core.StatusBarSimpleFragment; import com.android.systemui.statusbar.data.repository.FakeStatusBarModeRepository; import com.android.systemui.statusbar.notification.NotifPipelineFlags; import com.android.systemui.statusbar.notification.NotificationActivityStarter; @@ -1135,7 +1135,7 @@ public class CentralSurfacesImplTest extends SysuiTestCase { } @Test - @DisableFlags(StatusBarSimpleFragment.FLAG_NAME) + @DisableFlags(StatusBarConnectedDisplays.FLAG_NAME) public void bubbleBarVisibility() { createCentralSurfaces(); mCentralSurfaces.onStatusBarWindowStateChanged(WINDOW_STATE_HIDDEN); |