From 5e1544ab33ea7d7f66c5cf3440356df7d9e9f1ec Mon Sep 17 00:00:00 2001 From: Michal Brzezinski Date: Tue, 20 Sep 2022 12:41:33 +0100 Subject: [PATCH] Fixing QS blinking when going from unlocked to AOD in split shade The issue is no longer visible after some recent changes, but the core issue still remains: while transitioning from unlocked to AOD, alpha was following panel expansion while it should follow (newly named) mLockscreenToShadeProgress. This change doesn't modify things visually now but makes alpha as expected so likely to prevent this issue resurfacing in the future. Fixes: 246945311 Test: manual + QSFragmentTest Change-Id: I3762b2969d22dc500f5b63f222e059800117c168 --- .../com/android/systemui/qs/QSFragment.java | 20 +++++++----- .../android/systemui/qs/QSFragmentTest.java | 32 ++++++++++++++++--- 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index 7b27cf45979f1..72abdb61a95a1 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -60,6 +60,7 @@ import com.android.systemui.qs.footer.ui.binder.FooterActionsViewBinder; import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.policy.BrightnessMirrorController; @@ -82,7 +83,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca private static final String EXTRA_VISIBLE = "visible"; private final Rect mQsBounds = new Rect(); - private final StatusBarStateController mStatusBarStateController; + private final SysuiStatusBarStateController mStatusBarStateController; private final FalsingManager mFalsingManager; private final KeyguardBypassController mBypassController; private boolean mQsExpanded; @@ -159,7 +160,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca * Progress of pull down from the center of the lock screen. * @see com.android.systemui.statusbar.LockscreenShadeTransitionController */ - private float mFullShadeProgress; + private float mLockscreenToShadeProgress; private boolean mOverScrolling; @@ -177,7 +178,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca @Inject public QSFragment(RemoteInputQuickSettingsDisabler remoteInputQsDisabler, QSTileHost qsTileHost, - StatusBarStateController statusBarStateController, CommandQueue commandQueue, + SysuiStatusBarStateController statusBarStateController, CommandQueue commandQueue, @Named(QS_PANEL) MediaHost qsMediaHost, @Named(QUICK_QS_PANEL) MediaHost qqsMediaHost, KeyguardBypassController keyguardBypassController, @@ -586,7 +587,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca mTransitioningToFullShade = isTransitioningToFullShade; updateShowCollapsedOnKeyguard(); } - mFullShadeProgress = qsTransitionFraction; + mLockscreenToShadeProgress = qsTransitionFraction; setQsExpansion(mLastQSExpansion, mLastPanelFraction, mLastHeaderTranslation, isTransitioningToFullShade ? qsSquishinessFraction : mSquishinessFraction); } @@ -710,10 +711,13 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca } if (mInSplitShade) { // Large screens in landscape. - if (mTransitioningToFullShade || isKeyguardState()) { + // Need to check upcoming state as for unlocked -> AOD transition current state is + // not updated yet, but we're transitioning and UI should already follow KEYGUARD state + if (mTransitioningToFullShade || mStatusBarStateController.getCurrentOrUpcomingState() + == StatusBarState.KEYGUARD) { // Always use "mFullShadeProgress" on keyguard, because // "panelExpansionFractions" is always 1 on keyguard split shade. - return mFullShadeProgress; + return mLockscreenToShadeProgress; } else { return panelExpansionFraction; } @@ -722,7 +726,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca if (mTransitioningToFullShade) { // Only use this value during the standard lock screen shade expansion. During the // "quick" expansion from top, this value is 0. - return mFullShadeProgress; + return mLockscreenToShadeProgress; } else { return panelExpansionFraction; } @@ -930,7 +934,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca indentingPw.println("mLastHeaderTranslation: " + mLastHeaderTranslation); indentingPw.println("mInSplitShade: " + mInSplitShade); indentingPw.println("mTransitioningToFullShade: " + mTransitioningToFullShade); - indentingPw.println("mFullShadeProgress: " + mFullShadeProgress); + indentingPw.println("mLockscreenToShadeProgress: " + mLockscreenToShadeProgress); indentingPw.println("mOverScrolling: " + mOverScrolling); indentingPw.println("isCustomizing: " + mQSCustomizerController.isCustomizing()); View view = getView(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java index 5d5918de3d9e0..6696543a72f1a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java @@ -14,6 +14,9 @@ package com.android.systemui.qs; +import static com.android.systemui.statusbar.StatusBarState.KEYGUARD; +import static com.android.systemui.statusbar.StatusBarState.SHADE; + import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertTrue; @@ -49,13 +52,13 @@ import com.android.systemui.flags.FakeFeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.media.MediaHost; import com.android.systemui.plugins.FalsingManager; -import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.qs.customize.QSCustomizerController; import com.android.systemui.qs.dagger.QSFragmentComponent; import com.android.systemui.qs.external.TileServiceRequestController; import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler; @@ -93,7 +96,7 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { @Mock private QSPanel.QSTileLayout mQsTileLayout; @Mock private QSPanel.QSTileLayout mQQsTileLayout; @Mock private QSAnimator mQSAnimator; - @Mock private StatusBarStateController mStatusBarStateController; + @Mock private SysuiStatusBarStateController mStatusBarStateController; @Mock private QSSquishinessController mSquishinessController; private View mQsFragmentView; @@ -158,7 +161,7 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { public void transitionToFullShade_onKeyguard_noBouncer_setsAlphaUsingLinearInterpolator() { QSFragment fragment = resumeAndGetFragment(); - setStatusBarState(StatusBarState.KEYGUARD); + setStatusBarState(KEYGUARD); when(mQSPanelController.isBouncerInTransit()).thenReturn(false); boolean isTransitioningToFullShade = true; float transitionProgress = 0.5f; @@ -174,7 +177,7 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { public void transitionToFullShade_onKeyguard_bouncerActive_setsAlphaUsingBouncerInterpolator() { QSFragment fragment = resumeAndGetFragment(); - setStatusBarState(StatusBarState.KEYGUARD); + setStatusBarState(KEYGUARD); when(mQSPanelController.isBouncerInTransit()).thenReturn(true); boolean isTransitioningToFullShade = true; float transitionProgress = 0.5f; @@ -261,6 +264,27 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { verify(mQSFooterActionController).setExpansion(expansion); } + @Test + public void setQsExpansion_inSplitShade_whenTransitioningToKeyguard_setsAlphaBasedOnShadeTransitionProgress() { + QSFragment fragment = resumeAndGetFragment(); + enableSplitShade(); + when(mStatusBarStateController.getState()).thenReturn(SHADE); + when(mStatusBarStateController.getCurrentOrUpcomingState()).thenReturn(KEYGUARD); + boolean isTransitioningToFullShade = false; + float transitionProgress = 0; + float squishinessFraction = 0f; + + fragment.setTransitionToFullShadeProgress(isTransitioningToFullShade, transitionProgress, + squishinessFraction); + + // trigger alpha refresh with non-zero expansion and fraction values + fragment.setQsExpansion(/* expansion= */ 1, /* panelExpansionFraction= */1, + /* proposedTranslation= */ 0, /* squishinessFraction= */ 1); + + // alpha should follow lockscreen to shade progress, not panel expansion fraction + assertThat(mQsFragmentView.getAlpha()).isEqualTo(transitionProgress); + } + @Test public void getQsMinExpansionHeight_notInSplitShade_returnsHeaderHeight() { QSFragment fragment = resumeAndGetFragment();