Merge "Animate QS alpha on split shade pull down" into sc-v2-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
59d7598b52
@@ -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);
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user