Bouncer: Refine qs and notification alpha anim.

There was an issue that qs content was fading in with a delay. This is
because we are applying the bouncer interpolator in this instance. This
CL limits the scope of the bouncer interpolator to only when the bouncer
is in transit.

Bug: 227146048, 17409739
Test: Manual test on device plus unit tests
Change-Id: I398baa6d54f0c3aa51a9046dd822fc0acd33aadd
This commit is contained in:
Christian Göllner
2022-03-30 11:17:40 +02:00
parent a84dc9b870
commit 6ee8ef0ce1
8 changed files with 68 additions and 10 deletions

View File

@@ -600,7 +600,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
} else if (progress > 0 && view.getVisibility() != View.VISIBLE) {
view.setVisibility((View.VISIBLE));
}
float alpha = (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED)
float alpha = mQSPanelController.bouncerInTransit()
? BouncerPanelExpansionCalculator.getBackScrimScaledExpansion(progress)
: ShadeInterpolation.getContentAlpha(progress);
view.setAlpha(alpha);

View File

@@ -43,6 +43,7 @@ import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.settings.brightness.BrightnessController;
import com.android.systemui.settings.brightness.BrightnessMirrorHandler;
import com.android.systemui.settings.brightness.BrightnessSliderController;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.policy.BrightnessMirrorController;
import com.android.systemui.tuner.TunerService;
@@ -65,6 +66,7 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {
private final BrightnessSliderController mBrightnessSliderController;
private final BrightnessMirrorHandler mBrightnessMirrorHandler;
private final FeatureFlags mFeatureFlags;
private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
private boolean mGridContentVisible = true;
@@ -101,7 +103,8 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {
DumpManager dumpManager, MetricsLogger metricsLogger, UiEventLogger uiEventLogger,
QSLogger qsLogger, BrightnessController.Factory brightnessControllerFactory,
BrightnessSliderController.Factory brightnessSliderFactory,
FalsingManager falsingManager, FeatureFlags featureFlags) {
FalsingManager falsingManager, FeatureFlags featureFlags,
StatusBarKeyguardViewManager statusBarKeyguardViewManager) {
super(view, qstileHost, qsCustomizerController, usingMediaPlayer, mediaHost,
metricsLogger, uiEventLogger, qsLogger, dumpManager);
mQSFgsManagerFooter = qsFgsManagerFooter;
@@ -117,6 +120,7 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {
mBrightnessController = brightnessControllerFactory.create(mBrightnessSliderController);
mBrightnessMirrorHandler = new BrightnessMirrorHandler(mBrightnessController);
mFeatureFlags = featureFlags;
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
view.setUseNewFooter(featureFlags.isEnabled(Flags.NEW_FOOTER));
}
@@ -281,5 +285,14 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {
void setPageMargin(int pageMargin) {
mView.setPageMargin(pageMargin);
}
/**
* Determines if bouncer expansion is between 0 and 1 non-inclusive.
*
* @return if bouncer is in transit
*/
public boolean bouncerInTransit() {
return mStatusBarKeyguardViewManager.bouncerIsInTransit();
}
}

View File

@@ -797,10 +797,9 @@ public abstract class PanelViewController {
}
mExpandedFraction = Math.min(1f,
maxPanelHeight == 0 ? 0 : mExpandedHeight / maxPanelHeight);
mAmbientState.setExpansionFraction(mKeyguardStateController.isUnlocked()
? mExpandedFraction
: BouncerPanelExpansionCalculator
.getBackScrimScaledExpansion(mExpandedFraction));
mAmbientState.setExpansionFraction(mStatusBarKeyguardViewManager.bouncerIsInTransit()
? BouncerPanelExpansionCalculator.getBackScrimScaledExpansion(mExpandedFraction)
: mExpandedFraction);
onHeightUpdated(mExpandedHeight);
updatePanelExpansionAndVisibility();
});

View File

@@ -204,6 +204,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
private final Executor mMainExecutor;
private final ScreenOffAnimationController mScreenOffAnimationController;
private final KeyguardUnlockAnimationController mKeyguardUnlockAnimationController;
private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
private GradientColors mColors;
private boolean mNeedsDrawableColorUpdate;
@@ -266,7 +267,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
ConfigurationController configurationController, @Main Executor mainExecutor,
ScreenOffAnimationController screenOffAnimationController,
PanelExpansionStateManager panelExpansionStateManager,
KeyguardUnlockAnimationController keyguardUnlockAnimationController) {
KeyguardUnlockAnimationController keyguardUnlockAnimationController,
StatusBarKeyguardViewManager statusBarKeyguardViewManager) {
mScrimStateListener = lightBarController::setScrimState;
mDefaultScrimAlpha = BUSY_SCRIM_ALPHA;
@@ -292,6 +294,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
keyguardStateController.getKeyguardFadingAwayDuration());
}
});
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
configurationController.addCallback(new ConfigurationController.ConfigurationListener() {
@Override
public void onThemeChanged() {
@@ -1057,7 +1060,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
}
private float getInterpolatedFraction() {
if (mState == ScrimState.KEYGUARD || mState == ScrimState.SHADE_LOCKED) {
if (mStatusBarKeyguardViewManager.bouncerIsInTransit()) {
return BouncerPanelExpansionCalculator
.getBackScrimScaledExpansion(mPanelExpansionFraction);
}

View File

@@ -1367,6 +1367,15 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
}
}
/**
* Returns if bouncer expansion is between 0 and 1 non-inclusive.
*/
public boolean bouncerIsInTransit() {
if (mBouncer == null) return false;
return mBouncer.inTransit();
}
/**
* Delegate used to send show/reset events to an alternate authentication method instead of the
* regular pin/pattern/password bouncer.

View File

@@ -15,7 +15,9 @@ import com.android.systemui.qs.customize.QSCustomizerController
import com.android.systemui.qs.logging.QSLogger
import com.android.systemui.settings.brightness.BrightnessController
import com.android.systemui.settings.brightness.BrightnessSliderController
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager
import com.android.systemui.tuner.TunerService
import com.google.common.truth.Truth.assertThat
import org.junit.After
import org.junit.Before
import org.junit.Test
@@ -52,6 +54,7 @@ class QSPanelControllerTest : SysuiTestCase() {
@Mock private lateinit var mediaHost: MediaHost
@Mock private lateinit var tile: QSTile
@Mock private lateinit var otherTile: QSTile
@Mock private lateinit var statusBarKeyguardViewManager: StatusBarKeyguardViewManager
private lateinit var controller: QSPanelController
@@ -62,6 +65,7 @@ class QSPanelControllerTest : SysuiTestCase() {
whenever(brightnessSliderFactory.create(any(), any())).thenReturn(brightnessSlider)
whenever(brightnessControllerFactory.create(any())).thenReturn(brightnessController)
whenever(qsPanel.resources).thenReturn(mContext.orCreateTestableResources.resources)
whenever(statusBarKeyguardViewManager.bouncerIsInTransit()).thenReturn(false)
controller = QSPanelController(
qsPanel,
@@ -80,7 +84,8 @@ class QSPanelControllerTest : SysuiTestCase() {
brightnessControllerFactory,
brightnessSliderFactory,
falsingManager,
featureFlags
featureFlags,
statusBarKeyguardViewManager
)
}
@@ -109,4 +114,12 @@ class QSPanelControllerTest : SysuiTestCase() {
verify(tile).refreshState()
verify(otherTile, Mockito.never()).refreshState()
}
@Test
fun testBouncerIsInTransit() {
whenever(statusBarKeyguardViewManager.bouncerIsInTransit()).thenReturn(true)
assertThat(controller.bouncerInTransit()).isEqualTo(true)
whenever(statusBarKeyguardViewManager.bouncerIsInTransit()).thenReturn(false)
assertThat(controller.bouncerInTransit()).isEqualTo(false)
}
}

View File

@@ -119,6 +119,8 @@ public class ScrimControllerTest extends SysuiTestCase {
// event-dispatch-on-registration pattern caused some of these unit tests to fail.)
@Mock
private PanelExpansionStateManager mPanelExpansionStateManager;
@Mock
private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
private static class AnimatorListener implements Animator.AnimatorListener {
@@ -233,7 +235,8 @@ public class ScrimControllerTest extends SysuiTestCase {
mDockManager, mConfigurationController, new FakeExecutor(new FakeSystemClock()),
mScreenOffAnimationController,
mPanelExpansionStateManager,
mKeyguardUnlockAnimationController);
mKeyguardUnlockAnimationController,
mStatusBarKeyguardViewManager);
mScrimController.setScrimVisibleListener(visible -> mScrimVisibility = visible);
mScrimController.attachViews(mScrimBehind, mNotificationsScrim, mScrimInFront);
mScrimController.setAnimatorListener(mAnimatorListener);
@@ -1234,6 +1237,8 @@ public class ScrimControllerTest extends SysuiTestCase {
@Test
public void testNotificationTransparency_followsPanelExpansionInShadeLockedState() {
when(mStatusBarKeyguardViewManager.bouncerIsInTransit()).thenReturn(true);
mScrimController.transitionTo(ScrimState.SHADE_LOCKED);
assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0f, /* expansion */ 0.8f);
@@ -1242,6 +1247,8 @@ public class ScrimControllerTest extends SysuiTestCase {
@Test
public void testNotificationTransparency_unnocclusion() {
when(mStatusBarKeyguardViewManager.bouncerIsInTransit()).thenReturn(true);
mScrimController.transitionTo(ScrimState.KEYGUARD);
mScrimController.setUnocclusionAnimationRunning(true);
@@ -1255,6 +1262,8 @@ public class ScrimControllerTest extends SysuiTestCase {
@Test
public void testNotificationTransparency_inKeyguardState() {
when(mStatusBarKeyguardViewManager.bouncerIsInTransit()).thenReturn(true);
mScrimController.transitionTo(ScrimState.KEYGUARD);
assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 1f, /* expansion */ 0.8f);

View File

@@ -55,6 +55,8 @@ import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.unfold.SysUIUnfoldComponent;
import com.google.common.truth.Truth;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -434,4 +436,14 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {
verify(mBouncer).updateKeyguardPosition(1.0f);
}
@Test
public void testBouncerIsInTransit() {
when(mBouncer.inTransit()).thenReturn(true);
Truth.assertThat(mStatusBarKeyguardViewManager.bouncerIsInTransit()).isTrue();
when(mBouncer.inTransit()).thenReturn(false);
Truth.assertThat(mStatusBarKeyguardViewManager.bouncerIsInTransit()).isFalse();
mBouncer = null;
Truth.assertThat(mStatusBarKeyguardViewManager.bouncerIsInTransit()).isFalse();
}
}