From e311d992c37c2ed08fdc4a05a8f1a33736b2a645 Mon Sep 17 00:00:00 2001 From: 0 Date: Fri, 22 Mar 2024 16:13:19 -0700 Subject: [flexiglass] Re-implement ShadeHeader disable in flexiglass Bug: 330943604 Test: manual Flag: ACONFIG com.android.systemui.scene_container DEVELOPMENT Change-Id: I81e18c5cee3be12fc7835f4ea3e9ab9d9db9dff0 --- .../systemui/shade/ui/composable/ShadeHeader.kt | 10 ++++++++++ .../viewmodel/QuickSettingsSceneViewModelTest.kt | 2 ++ .../scene/SceneFrameworkIntegrationTest.kt | 1 + .../shade/ui/viewmodel/ShadeHeaderViewModelTest.kt | 2 ++ .../shade/ui/viewmodel/ShadeSceneViewModelTest.kt | 23 +++++++++++----------- .../shade/NotificationPanelViewController.java | 6 ++++++ .../shade/domain/interactor/ShadeInteractor.kt | 3 +++ .../domain/interactor/ShadeInteractorEmptyImpl.kt | 1 + .../shade/domain/interactor/ShadeInteractorImpl.kt | 5 +++++ .../shade/domain/startable/ShadeStartable.kt | 12 ----------- .../shade/ui/viewmodel/ShadeHeaderViewModel.kt | 8 ++++++++ .../CentralSurfacesCommandQueueCallbacks.java | 5 ++++- .../NotificationPanelViewControllerBaseTest.java | 1 + .../shade/domain/startable/ShadeStartableKosmos.kt | 4 ---- 14 files changed, 55 insertions(+), 28 deletions(-) diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt index c5c48e6d4b6b..fcd77609768e 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt @@ -114,6 +114,11 @@ fun SceneScope.CollapsedShadeHeader( statusBarIconController: StatusBarIconController, modifier: Modifier = Modifier, ) { + val isDisabled by viewModel.isDisabled.collectAsState() + if (isDisabled) { + return + } + val formatProgress = animateSceneFloatAsState(0f, ShadeHeader.Keys.transitionProgress) .unsafeCompositionState(initialValue = 0f) @@ -251,6 +256,11 @@ fun SceneScope.ExpandedShadeHeader( statusBarIconController: StatusBarIconController, modifier: Modifier = Modifier, ) { + val isDisabled by viewModel.isDisabled.collectAsState() + if (isDisabled) { + return + } + val formatProgress = animateSceneFloatAsState(1f, ShadeHeader.Keys.transitionProgress) .unsafeCompositionState(initialValue = 1f) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt index 61089049bf89..ef385673c950 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt @@ -34,6 +34,7 @@ import com.android.systemui.res.R import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.shade.domain.interactor.privacyChipInteractor import com.android.systemui.shade.domain.interactor.shadeHeaderClockInteractor +import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel import com.android.systemui.statusbar.notification.stack.ui.viewmodel.notificationsPlaceholderViewModel import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository @@ -97,6 +98,7 @@ class QuickSettingsSceneViewModelTest : SysuiTestCase() { ShadeHeaderViewModel( applicationScope = testScope.backgroundScope, context = context, + shadeInteractor = kosmos.shadeInteractor, mobileIconsInteractor = mobileIconsInteractor, mobileIconsViewModel = mobileIconsViewModel, privacyChipInteractor = kosmos.privacyChipInteractor, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt index af9abcda73fe..d2f517ecb26a 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt @@ -242,6 +242,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { ShadeHeaderViewModel( applicationScope = testScope.backgroundScope, context = context, + shadeInteractor = kosmos.shadeInteractor, mobileIconsInteractor = mobileIconsInteractor, mobileIconsViewModel = mobileIconsViewModel, privacyChipInteractor = kosmos.privacyChipInteractor, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt index 062741df01cf..4c573d3b83ea 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt @@ -13,6 +13,7 @@ import com.android.systemui.kosmos.testScope import com.android.systemui.plugins.activityStarter import com.android.systemui.shade.domain.interactor.privacyChipInteractor import com.android.systemui.shade.domain.interactor.shadeHeaderClockInteractor +import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor import com.android.systemui.statusbar.pipeline.mobile.data.model.SubscriptionModel @@ -69,6 +70,7 @@ class ShadeHeaderViewModelTest : SysuiTestCase() { ShadeHeaderViewModel( applicationScope = testScope.backgroundScope, context = context, + shadeInteractor = kosmos.shadeInteractor, mobileIconsInteractor = mobileIconsInteractor, mobileIconsViewModel = mobileIconsViewModel, privacyChipInteractor = kosmos.privacyChipInteractor, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt index d1c4ec3ddacf..f90a3b14f968 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt @@ -110,6 +110,7 @@ class ShadeSceneViewModelTest : SysuiTestCase() { ShadeHeaderViewModel( applicationScope = testScope.backgroundScope, context = context, + shadeInteractor = kosmos.shadeInteractor, mobileIconsInteractor = mobileIconsInteractor, mobileIconsViewModel = mobileIconsViewModel, privacyChipInteractor = kosmos.privacyChipInteractor, @@ -280,17 +281,17 @@ class ShadeSceneViewModelTest : SysuiTestCase() { @Test fun upTransitionSceneKey_customizing_noTransition() = - testScope.runTest { - val destinationScenes by collectLastValue(underTest.destinationScenes) - - qsSceneAdapter.setCustomizing(true) - assertThat( - destinationScenes!! - .keys - .filterIsInstance() - .filter { it.direction == SwipeDirection.Up } - ).isEmpty() - } + testScope.runTest { + val destinationScenes by collectLastValue(underTest.destinationScenes) + + qsSceneAdapter.setCustomizing(true) + assertThat( + destinationScenes!!.keys.filterIsInstance().filter { + it.direction == SwipeDirection.Up + } + ) + .isEmpty() + } @Test fun shadeMode() = diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index c93ef65ae7c6..8d66fa77a7c3 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -334,6 +334,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump private final ScrimController mScrimController; private final LockscreenShadeTransitionController mLockscreenShadeTransitionController; private final TapAgainViewController mTapAgainViewController; + private final ShadeHeaderController mShadeHeaderController; private final boolean mVibrateOnOpening; private final VelocityTracker mVelocityTracker = VelocityTracker.obtain(); private final FlingAnimationUtils mFlingAnimationUtilsClosing; @@ -730,6 +731,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump FragmentService fragmentService, IStatusBarService statusBarService, ContentResolver contentResolver, + ShadeHeaderController shadeHeaderController, ScreenOffAnimationController screenOffAnimationController, LockscreenGestureLogger lockscreenGestureLogger, ShadeExpansionStateManager shadeExpansionStateManager, @@ -874,6 +876,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mSplitShadeEnabled = mSplitShadeStateController.shouldUseSplitNotificationShade(mResources); mView.setWillNotDraw(!DEBUG_DRAWABLE); + mShadeHeaderController = shadeHeaderController; mLayoutInflater = layoutInflater; mFeatureFlags = featureFlags; mAnimateBack = predictiveBackAnimateShade(); @@ -1107,6 +1110,9 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } mTapAgainViewController.init(); + mShadeHeaderController.init(); + mShadeHeaderController.setShadeCollapseAction( + () -> collapse(/* delayed= */ false , /* speedUpFactor= */ 1.0f)); mKeyguardUnfoldTransition.ifPresent(u -> u.setup(mView)); mNotificationPanelUnfoldAnimationController.ifPresent(controller -> controller.setup(mNotificationContainerParent)); diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt index cde45f2060e5..0de3c10329e3 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt @@ -29,6 +29,9 @@ interface ShadeInteractor : BaseShadeInteractor { /** Emits true if the shade is currently allowed and false otherwise. */ val isShadeEnabled: StateFlow + /** Emits true if QS is currently allowed and false otherwise. */ + val isQsEnabled: StateFlow + /** Whether either the shade or QS is fully expanded. */ val isAnyFullyExpanded: StateFlow diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorEmptyImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorEmptyImpl.kt index 5fbd2cfaec79..883ef97a6aad 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorEmptyImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorEmptyImpl.kt @@ -29,6 +29,7 @@ class ShadeInteractorEmptyImpl @Inject constructor() : ShadeInteractor { private val inactiveFlowBoolean = MutableStateFlow(false) private val inactiveFlowFloat = MutableStateFlow(0f) override val isShadeEnabled: StateFlow = inactiveFlowBoolean + override val isQsEnabled: StateFlow = inactiveFlowBoolean override val shadeExpansion: StateFlow = inactiveFlowFloat override val qsExpansion: StateFlow = inactiveFlowFloat override val isQsExpanded: StateFlow = inactiveFlowBoolean diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt index e619806abc34..8aa45e30239c 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt @@ -65,6 +65,11 @@ constructor( .distinctUntilChanged() .stateIn(scope, SharingStarted.Eagerly, initialValue = false) + override val isQsEnabled: StateFlow = + disableFlagsRepository.disableFlags + .map { it.isQuickSettingsEnabled() } + .stateIn(scope, SharingStarted.Eagerly, initialValue = false) + override val isAnyFullyExpanded: StateFlow = anyExpansion .map { it >= 1f } diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/startable/ShadeStartable.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/startable/ShadeStartable.kt index 60810a06249f..d8216dcfdec6 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/startable/ShadeStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/startable/ShadeStartable.kt @@ -23,8 +23,6 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.log.LogBuffer import com.android.systemui.log.dagger.ShadeTouchLog -import com.android.systemui.shade.ShadeController -import com.android.systemui.shade.ShadeHeaderController import com.android.systemui.shade.TouchLogger.Companion.logTouchesTo import com.android.systemui.shade.data.repository.ShadeRepository import com.android.systemui.shade.shared.model.ShadeMode @@ -46,25 +44,15 @@ constructor( private val configurationRepository: ConfigurationRepository, private val shadeRepository: ShadeRepository, private val controller: SplitShadeStateController, - private val shadeController: ShadeController, - private val shadeHeaderController: ShadeHeaderController, private val scrimShadeTransitionController: ScrimShadeTransitionController, ) : CoreStartable { override fun start() { hydrateShadeMode() logTouchesTo(touchLog) - initHeaderController() scrimShadeTransitionController.init() } - private fun initHeaderController() { - shadeHeaderController.init() - shadeHeaderController.shadeCollapseAction = Runnable { - shadeController.animateCollapseShade() - } - } - private fun hydrateShadeMode() { applicationScope.launch { configurationRepository.onAnyConfigurationChange diff --git a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt index 1191c0f247f9..72a9c8d01554 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt @@ -30,6 +30,7 @@ import com.android.systemui.privacy.PrivacyItem import com.android.systemui.res.R import com.android.systemui.shade.domain.interactor.PrivacyChipInteractor import com.android.systemui.shade.domain.interactor.ShadeHeaderClockInteractor +import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel import java.util.Date @@ -53,6 +54,7 @@ class ShadeHeaderViewModel constructor( @Application private val applicationScope: CoroutineScope, context: Context, + shadeInteractor: ShadeInteractor, mobileIconsInteractor: MobileIconsInteractor, val mobileIconsViewModel: MobileIconsViewModel, private val privacyChipInteractor: PrivacyChipInteractor, @@ -85,6 +87,12 @@ constructor( /** Whether or not the privacy chip is enabled in the device privacy config. */ val isPrivacyChipEnabled: StateFlow = privacyChipInteractor.isChipEnabled + /** Whether or not the Shade Header should be disabled based on disableFlags. */ + val isDisabled: StateFlow = + shadeInteractor.isQsEnabled + .map { !it } + .stateIn(applicationScope, SharingStarted.WhileSubscribed(), false) + private val longerPattern = context.getString(R.string.abbrev_wday_month_day_no_year_alarm) private val shorterPattern = context.getString(R.string.abbrev_month_day_no_year) private val longerDateFormat = MutableStateFlow(getFormatFromPattern(longerPattern)) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java index ad3012e54d75..e93c0f6a5559 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java @@ -52,6 +52,7 @@ import com.android.systemui.qs.QSHost; import com.android.systemui.qs.QSPanelController; import com.android.systemui.recents.ScreenPinningRequest; import com.android.systemui.res.R; +import com.android.systemui.scene.shared.flag.SceneContainerFlag; import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.CameraLauncher; import com.android.systemui.shade.QuickSettingsController; @@ -279,7 +280,9 @@ public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callba } } - mShadeHeaderController.disable(state1, state2, animate); + if (!SceneContainerFlag.isEnabled()) { + mShadeHeaderController.disable(state1, state2, animate); + } } /** diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java index 56e61e4c6442..5b6da0eeb40b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java @@ -711,6 +711,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { mFragmentService, mStatusBarService, mContentResolver, + mShadeHeaderController, mScreenOffAnimationController, mLockscreenGestureLogger, mShadeExpansionStateManager, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/startable/ShadeStartableKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/startable/ShadeStartableKosmos.kt index 65e04f4e476d..7dfa68605ef3 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/startable/ShadeStartableKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/startable/ShadeStartableKosmos.kt @@ -22,9 +22,7 @@ import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.log.LogBuffer -import com.android.systemui.shade.ShadeHeaderController import com.android.systemui.shade.data.repository.shadeRepository -import com.android.systemui.shade.shadeController import com.android.systemui.shade.transition.ScrimShadeTransitionController import com.android.systemui.statusbar.policy.splitShadeStateController import com.android.systemui.util.mockito.mock @@ -37,8 +35,6 @@ val Kosmos.shadeStartable by Fixture { configurationRepository = configurationRepository, shadeRepository = shadeRepository, controller = splitShadeStateController, - shadeHeaderController = mock(), scrimShadeTransitionController = mock(), - shadeController = shadeController ) } -- cgit v1.2.3-59-g8ed1b