Merge "Animate QS alpha on split shade pull down" into sc-v2-dev

This commit is contained in:
TreeHugger Robot
2021-10-12 01:06:09 +00:00
committed by Android (Google) Code Review
7 changed files with 56 additions and 45 deletions

View File

@@ -200,10 +200,10 @@ public class Interpolators {
/** /**
* Interpolate alpha for notifications background scrim during shade expansion. * Interpolate alpha for notifications background scrim during shade expansion.
* @param fraction Shade expansion fraction * @param fraction Shade expansion fraction
* @param forNotification If we want the alpha of the notification shade or the scrim. * @param forUiContent If we want the alpha of the scrims, or ui that's on top of them.
*/ */
public static float getNotificationScrimAlpha(float fraction, boolean forNotification) { public static float getNotificationScrimAlpha(float fraction, boolean forUiContent) {
if (forNotification) { if (forUiContent) {
fraction = MathUtils.constrainedMap(0f, 1f, 0.3f, 1f, fraction); fraction = MathUtils.constrainedMap(0f, 1f, 0.3f, 1f, fraction);
} else { } else {
fraction = MathUtils.constrainedMap(0f, 1f, 0f, 0.5f, fraction); fraction = MathUtils.constrainedMap(0f, 1f, 0f, 0.5f, fraction);

View File

@@ -52,7 +52,16 @@ public interface QS extends FragmentBase {
boolean isShowingDetail(); boolean isShowingDetail();
void closeDetail(); void closeDetail();
void animateHeaderSlidingOut(); void animateHeaderSlidingOut();
void setQsExpansion(float qsExpansionFraction, float headerTranslation);
/**
* Asks QS to update its presentation, according to {@code NotificationPanelViewController}.
*
* @param qsExpansionFraction How much each UI element in QS should be expanded (QQS to QS.)
* @param panelExpansionFraction Whats the expansion of the whole shade.
* @param headerTranslation How much we should vertically translate QS.
*/
void setQsExpansion(float qsExpansionFraction, float panelExpansionFraction,
float headerTranslation);
void setHeaderListening(boolean listening); void setHeaderListening(boolean listening);
void notifyCustomizeChanged(); void notifyCustomizeChanged();
void setContainerController(QSContainerController controller); void setContainerController(QSContainerController controller);
@@ -75,13 +84,13 @@ public interface QS extends FragmentBase {
/** /**
* If QS should translate as we pull it down, or if it should be static. * If QS should translate as we pull it down, or if it should be static.
*/ */
void setTranslateWhileExpanding(boolean shouldTranslate); void setInSplitShade(boolean shouldTranslate);
/** /**
* Set the amount of pixels we have currently dragged down if we're transitioning to the full * Set the amount of pixels we have currently dragged down if we're transitioning to the full
* shade. 0.0f means we're not transitioning yet. * shade. 0.0f means we're not transitioning yet.
*/ */
default void setTransitionToFullShadeAmount(float pxAmount, boolean animated) {} default void setTransitionToFullShadeAmount(float pxAmount, float progress) {}
/** /**
* A rounded corner clipping that makes QS feel as if it were behind everything. * A rounded corner clipping that makes QS feel as if it were behind everything.

View File

@@ -35,7 +35,6 @@ import com.android.systemui.qs.TouchAnimator.Builder;
import com.android.systemui.qs.TouchAnimator.Listener; import com.android.systemui.qs.TouchAnimator.Listener;
import com.android.systemui.qs.dagger.QSScope; import com.android.systemui.qs.dagger.QSScope;
import com.android.systemui.qs.tileimpl.HeightOverrideable; import com.android.systemui.qs.tileimpl.HeightOverrideable;
import com.android.systemui.statusbar.CrossFadeHelper;
import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable; import com.android.systemui.tuner.TunerService.Tunable;
import com.android.wm.shell.animation.Interpolators; import com.android.wm.shell.animation.Interpolators;
@@ -170,19 +169,6 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha
} }
} }
void startAlphaAnimation(boolean show) {
if (show == mToShowing) {
return;
}
mToShowing = show;
if (show) {
CrossFadeHelper.fadeIn(mQs.getView(), QQS_FADE_IN_DURATION, 0 /* delay */);
} else {
CrossFadeHelper.fadeOut(mQs.getView(), QQS_FADE_OUT_DURATION, 0 /* delay */,
null /* endRunnable */);
}
}
/** /**
* Sets whether or not the keyguard is currently being shown with a collapsed header. * Sets whether or not the keyguard is currently being shown with a collapsed header.
*/ */

View File

@@ -89,6 +89,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
private int mLayoutDirection; private int mLayoutDirection;
private QSFooter mFooter; private QSFooter mFooter;
private float mLastQSExpansion = -1; private float mLastQSExpansion = -1;
private float mLastPanelFraction;
private boolean mQsDisabled; private boolean mQsDisabled;
private ImageView mQsDragHandler; private ImageView mQsDragHandler;
@@ -120,7 +121,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
* When true, QS will translate from outside the screen. It will be clipped with parallax * When true, QS will translate from outside the screen. It will be clipped with parallax
* otherwise. * otherwise.
*/ */
private boolean mTranslateWhileExpanding; private boolean mInSplitShade;
private boolean mPulseExpanding; private boolean mPulseExpanding;
/** /**
@@ -135,6 +136,12 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
private DumpManager mDumpManager; private DumpManager mDumpManager;
/**
* Progress of pull down from the center of the lock screen.
* @see com.android.systemui.statusbar.LockscreenShadeTransitionController
*/
private float mFullShadeProgress;
@Inject @Inject
public QSFragment(RemoteInputQuickSettingsDisabler remoteInputQsDisabler, public QSFragment(RemoteInputQuickSettingsDisabler remoteInputQsDisabler,
InjectionInflationController injectionInflater, QSTileHost qsTileHost, InjectionInflationController injectionInflater, QSTileHost qsTileHost,
@@ -226,7 +233,8 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
(v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
boolean sizeChanged = (oldTop - oldBottom) != (top - bottom); boolean sizeChanged = (oldTop - oldBottom) != (top - bottom);
if (sizeChanged) { if (sizeChanged) {
setQsExpansion(mLastQSExpansion, mLastHeaderTranslation); setQsExpansion(mLastQSExpansion, mLastPanelFraction,
mLastHeaderTranslation);
} }
}); });
mQSPanelController.setUsingHorizontalLayoutChangeListener( mQSPanelController.setUsingHorizontalLayoutChangeListener(
@@ -408,7 +416,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
mQSAnimator.setShowCollapsedOnKeyguard(showCollapsed); mQSAnimator.setShowCollapsedOnKeyguard(showCollapsed);
} }
if (!showCollapsed && isKeyguardState()) { if (!showCollapsed && isKeyguardState()) {
setQsExpansion(mLastQSExpansion, 0); setQsExpansion(mLastQSExpansion, mLastPanelFraction, 0);
} }
} }
} }
@@ -476,33 +484,30 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
} }
@Override @Override
public void setTranslateWhileExpanding(boolean shouldTranslate) { public void setInSplitShade(boolean inSplitShade) {
mTranslateWhileExpanding = shouldTranslate; mInSplitShade = inSplitShade;
mQSAnimator.setTranslateWhileExpanding(shouldTranslate); mQSAnimator.setTranslateWhileExpanding(inSplitShade);
} }
@Override @Override
public void setTransitionToFullShadeAmount(float pxAmount, boolean animated) { public void setTransitionToFullShadeAmount(float pxAmount, float progress) {
boolean isTransitioningToFullShade = pxAmount > 0; boolean isTransitioningToFullShade = pxAmount > 0;
if (isTransitioningToFullShade != mTransitioningToFullShade) { if (isTransitioningToFullShade != mTransitioningToFullShade) {
mTransitioningToFullShade = isTransitioningToFullShade; mTransitioningToFullShade = isTransitioningToFullShade;
updateShowCollapsedOnKeyguard(); updateShowCollapsedOnKeyguard();
setQsExpansion(mLastQSExpansion, mLastHeaderTranslation);
} }
mFullShadeProgress = progress;
setQsExpansion(mLastQSExpansion, mLastPanelFraction, mLastHeaderTranslation);
} }
@Override @Override
public void setQsExpansion(float expansion, float proposedTranslation) { public void setQsExpansion(float expansion, float panelExpansionFraction,
if (DEBUG) Log.d(TAG, "setQSExpansion " + expansion + " " + proposedTranslation); float proposedTranslation) {
float headerTranslation = mTransitioningToFullShade ? 0 : proposedTranslation; float headerTranslation = mTransitioningToFullShade ? 0 : proposedTranslation;
if (mQSAnimator != null) { float progress = mTransitioningToFullShade ? mFullShadeProgress : panelExpansionFraction;
final boolean showQSOnLockscreen = expansion > 0; setAlphaAnimationProgress(mInSplitShade ? progress : 1);
final boolean showQSUnlocked = headerTranslation == 0 || !mTranslateWhileExpanding;
mQSAnimator.startAlphaAnimation(showQSOnLockscreen || showQSUnlocked
|| mTransitioningToFullShade);
}
mContainer.setExpansion(expansion); mContainer.setExpansion(expansion);
final float translationScaleY = (mTranslateWhileExpanding final float translationScaleY = (mInSplitShade
? 1 : QSAnimator.SHORT_PARALLAX_AMOUNT) * (expansion - 1); ? 1 : QSAnimator.SHORT_PARALLAX_AMOUNT) * (expansion - 1);
boolean onKeyguardAndExpanded = isKeyguardState() && !mShowCollapsedOnKeyguard; boolean onKeyguardAndExpanded = isKeyguardState() && !mShowCollapsedOnKeyguard;
if (!mHeaderAnimating && !headerWillBeAnimating()) { if (!mHeaderAnimating && !headerWillBeAnimating()) {
@@ -519,6 +524,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
return; return;
} }
mLastHeaderTranslation = headerTranslation; mLastHeaderTranslation = headerTranslation;
mLastPanelFraction = panelExpansionFraction;
mLastQSExpansion = expansion; mLastQSExpansion = expansion;
mLastKeyguardAndExpanded = onKeyguardAndExpanded; mLastKeyguardAndExpanded = onKeyguardAndExpanded;
mLastViewHeight = currentHeight; mLastViewHeight = currentHeight;
@@ -560,6 +566,17 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
updateMediaPositions(); updateMediaPositions();
} }
private void setAlphaAnimationProgress(float progress) {
final View view = getView();
if (progress == 0 && view.getVisibility() != View.INVISIBLE) {
view.setVisibility(View.INVISIBLE);
} else if (progress > 0 && view.getVisibility() != View.VISIBLE) {
view.setVisibility((View.VISIBLE));
}
float alpha = Interpolators.getNotificationScrimAlpha(progress, true /* uiContent */);
view.setAlpha(alpha);
}
private void updateQsBounds() { private void updateQsBounds() {
if (mLastQSExpansion == 1.0f) { if (mLastQSExpansion == 1.0f) {
// Fully expanded, let's set the layout bounds as clip bounds. This is necessary because // Fully expanded, let's set the layout bounds as clip bounds. This is necessary because

View File

@@ -298,9 +298,8 @@ class LockscreenShadeTransitionController @Inject constructor(
nsslController.setTransitionToFullShadeAmount(field) nsslController.setTransitionToFullShadeAmount(field)
notificationPanelController.setTransitionToFullShadeAmount(field, notificationPanelController.setTransitionToFullShadeAmount(field,
false /* animate */, 0 /* delay */) false /* animate */, 0 /* delay */)
// TODO: appear qs also in split shade val progress = MathUtils.saturate(dragDownAmount / scrimTransitionDistance)
val qsAmount = if (useSplitShade) 0f else field qS.setTransitionToFullShadeAmount(field, progress)
qS.setTransitionToFullShadeAmount(qsAmount, false /* animate */)
// TODO: appear media also in split shade // TODO: appear media also in split shade
val mediaAmount = if (useSplitShade) 0f else field val mediaAmount = if (useSplitShade) 0f else field
mediaHierarchyManager.setTransitionToFullShadeAmount(mediaAmount) mediaHierarchyManager.setTransitionToFullShadeAmount(mediaAmount)

View File

@@ -984,7 +984,7 @@ public class NotificationPanelViewController extends PanelViewController {
Utils.shouldUseSplitNotificationShade(mResources); Utils.shouldUseSplitNotificationShade(mResources);
mScrimController.setClipsQsScrim(!mShouldUseSplitNotificationShade); mScrimController.setClipsQsScrim(!mShouldUseSplitNotificationShade);
if (mQs != null) { if (mQs != null) {
mQs.setTranslateWhileExpanding(mShouldUseSplitNotificationShade); mQs.setInSplitShade(mShouldUseSplitNotificationShade);
} }
int topMargin = mShouldUseSplitNotificationShade ? mSplitShadeStatusBarHeight : int topMargin = mShouldUseSplitNotificationShade ? mSplitShadeStatusBarHeight :
@@ -2202,7 +2202,7 @@ public class NotificationPanelViewController extends PanelViewController {
private void updateQsExpansion() { private void updateQsExpansion() {
if (mQs == null) return; if (mQs == null) return;
float qsExpansionFraction = computeQsExpansionFraction(); float qsExpansionFraction = computeQsExpansionFraction();
mQs.setQsExpansion(qsExpansionFraction, getHeaderTranslation()); mQs.setQsExpansion(qsExpansionFraction, getExpandedFraction(), getHeaderTranslation());
mMediaHierarchyManager.setQsExpansion(qsExpansionFraction); mMediaHierarchyManager.setQsExpansion(qsExpansionFraction);
int qsPanelBottomY = calculateQsBottomPosition(qsExpansionFraction); int qsPanelBottomY = calculateQsBottomPosition(qsExpansionFraction);
mScrimController.setQsPosition(qsExpansionFraction, qsPanelBottomY); mScrimController.setQsPosition(qsExpansionFraction, qsPanelBottomY);
@@ -3456,7 +3456,7 @@ public class NotificationPanelViewController extends PanelViewController {
mQs.setExpandClickListener(mOnClickListener); mQs.setExpandClickListener(mOnClickListener);
mQs.setHeaderClickable(isQsExpansionEnabled()); mQs.setHeaderClickable(isQsExpansionEnabled());
mQs.setOverscrolling(mStackScrollerOverscrolling); mQs.setOverscrolling(mStackScrollerOverscrolling);
mQs.setTranslateWhileExpanding(mShouldUseSplitNotificationShade); mQs.setInSplitShade(mShouldUseSplitNotificationShade);
// recompute internal state when qspanel height changes // recompute internal state when qspanel height changes
mQs.getView().addOnLayoutChangeListener( mQs.getView().addOnLayoutChangeListener(

View File

@@ -209,7 +209,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() {
verify(scrimController, never()).setTransitionToFullShadeProgress(anyFloat()) verify(scrimController, never()).setTransitionToFullShadeProgress(anyFloat())
verify(notificationPanelController, never()).setTransitionToFullShadeAmount(anyFloat(), verify(notificationPanelController, never()).setTransitionToFullShadeAmount(anyFloat(),
anyBoolean(), anyLong()) anyBoolean(), anyLong())
verify(qS, never()).setTransitionToFullShadeAmount(anyFloat(), anyBoolean()) verify(qS, never()).setTransitionToFullShadeAmount(anyFloat(), anyFloat())
} }
@Test @Test
@@ -220,7 +220,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() {
verify(scrimController).setTransitionToFullShadeProgress(anyFloat()) verify(scrimController).setTransitionToFullShadeProgress(anyFloat())
verify(notificationPanelController).setTransitionToFullShadeAmount(anyFloat(), verify(notificationPanelController).setTransitionToFullShadeAmount(anyFloat(),
anyBoolean(), anyLong()) anyBoolean(), anyLong())
verify(qS).setTransitionToFullShadeAmount(anyFloat(), anyBoolean()) verify(qS).setTransitionToFullShadeAmount(anyFloat(), anyFloat())
verify(depthController).transitionToFullShadeProgress = anyFloat() verify(depthController).transitionToFullShadeProgress = anyFloat()
} }
} }