Handle go to full shade motion for redacted case
Bug: 16291973
Change-Id: Idc5ea93548e17ef9cd2d7c36416b293950554703
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index 4f9d4a3..c9c7703 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -19,6 +19,7 @@
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.Configuration;
@@ -115,6 +116,7 @@
private Interpolator mFastOutSlowInInterpolator;
private Interpolator mFastOutLinearInterpolator;
+ private Interpolator mLinearOutSlowInInterpolator;
private ObjectAnimator mClockAnimator;
private int mClockAnimationTarget = -1;
private int mTopPaddingAdjustment;
@@ -140,6 +142,8 @@
private Runnable mLaunchAnimationEndRunnable;
private boolean mOnlyAffordanceInThisMotion;
private boolean mKeyguardStatusViewAnimating;
+ private boolean mHeaderAnimatingIn;
+ private ObjectAnimator mQsContainerAnimator;
public NotificationPanelView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -172,6 +176,8 @@
android.R.interpolator.fast_out_slow_in);
mFastOutLinearInterpolator = AnimationUtils.loadInterpolator(getContext(),
android.R.interpolator.fast_out_linear_in);
+ mLinearOutSlowInInterpolator = AnimationUtils.loadInterpolator(getContext(),
+ android.R.interpolator.linear_out_slow_in);
mKeyguardBottomArea = (KeyguardBottomAreaView) findViewById(R.id.keyguard_bottom_area);
mAfforanceHelper = new KeyguardAffordanceHelper(this, getContext());
}
@@ -292,9 +298,9 @@
mKeyguardStatusView.setScaleY(scale);
}
- public void animateToFullShade() {
+ public void animateToFullShade(long delay) {
mAnimateNextTopPaddingChange = true;
- mNotificationStackScroller.goToFullShade();
+ mNotificationStackScroller.goToFullShade(delay);
requestLayout();
}
@@ -673,19 +679,28 @@
}
}
- public void setBarState(int statusBarState, boolean keyguardFadingAway) {
+ public void setBarState(int statusBarState, boolean keyguardFadingAway,
+ boolean goingToFullShade) {
boolean keyguardShowing = statusBarState == StatusBarState.KEYGUARD
|| statusBarState == StatusBarState.SHADE_LOCKED;
- mKeyguardStatusBar.setAlpha(1f);
- mKeyguardStatusBar.setVisibility(keyguardShowing ? View.VISIBLE : View.INVISIBLE);
if (!mKeyguardShowing && keyguardShowing) {
setQsTranslation(mQsExpansionHeight);
mHeader.setTranslationY(0f);
}
- setKeyguardStatusViewVisibility(statusBarState, keyguardFadingAway);
+ setKeyguardStatusViewVisibility(statusBarState, keyguardFadingAway, goingToFullShade);
+ setKeyguardBottomAreaVisibility(statusBarState, goingToFullShade);
+ if (goingToFullShade) {
+ animateKeyguardStatusBarOut();
+ } else {
+ mKeyguardStatusBar.setAlpha(1f);
+ mKeyguardStatusBar.setVisibility(keyguardShowing ? View.VISIBLE : View.INVISIBLE);
+ }
mStatusBarState = statusBarState;
mKeyguardShowing = keyguardShowing;
updateQsState();
+ if (goingToFullShade) {
+ animateHeaderSlidingIn();
+ }
}
private final Runnable mAnimateKeyguardStatusViewInvisibleEndRunnable = new Runnable() {
@@ -703,16 +718,131 @@
}
};
- private void setKeyguardStatusViewVisibility(int statusBarState, boolean keyguardFadingAway) {
- if (!keyguardFadingAway && mStatusBarState == StatusBarState.KEYGUARD
- && statusBarState != StatusBarState.KEYGUARD) {
+ private final Animator.AnimatorListener mAnimateHeaderSlidingInListener
+ = new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mHeaderAnimatingIn = false;
+ mQsContainerAnimator = null;
+ mQsContainer.removeOnLayoutChangeListener(mQsContainerAnimatorUpdater);
+ }
+ };
+
+ private final OnLayoutChangeListener mQsContainerAnimatorUpdater
+ = new OnLayoutChangeListener() {
+ @Override
+ public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft,
+ int oldTop, int oldRight, int oldBottom) {
+ int oldHeight = oldBottom - oldTop;
+ int height = bottom - top;
+ if (height != oldHeight && mQsContainerAnimator != null) {
+ PropertyValuesHolder[] values = mQsContainerAnimator.getValues();
+ float newEndValue = mHeader.getCollapsedHeight() + mQsPeekHeight - height - top;
+ float newStartValue = -height - top;
+ values[0].setFloatValues(newStartValue, newEndValue);
+ mQsContainerAnimator.setCurrentPlayTime(mQsContainerAnimator.getCurrentPlayTime());
+ }
+ }
+ };
+
+ private final ViewTreeObserver.OnPreDrawListener mStartHeaderSlidingIn
+ = new ViewTreeObserver.OnPreDrawListener() {
+ @Override
+ public boolean onPreDraw() {
+ getViewTreeObserver().removeOnPreDrawListener(this);
+ mHeader.setTranslationY(-mHeader.getCollapsedHeight() - mQsPeekHeight);
+ mHeader.animate()
+ .translationY(0f)
+ .setStartDelay(mStatusBar.calculateGoingToFullShadeDelay())
+ .setDuration(StackStateAnimator.ANIMATION_DURATION_GO_TO_FULL_SHADE)
+ .setInterpolator(mFastOutSlowInInterpolator)
+ .start();
+ mQsContainer.setY(-mQsContainer.getHeight());
+ mQsContainerAnimator = ObjectAnimator.ofFloat(mQsContainer, View.TRANSLATION_Y,
+ mQsContainer.getTranslationY(),
+ mHeader.getCollapsedHeight() + mQsPeekHeight - mQsContainer.getHeight()
+ - mQsContainer.getTop());
+ mQsContainerAnimator.setStartDelay(mStatusBar.calculateGoingToFullShadeDelay());
+ mQsContainerAnimator.setDuration(StackStateAnimator.ANIMATION_DURATION_GO_TO_FULL_SHADE);
+ mQsContainerAnimator.setInterpolator(mFastOutSlowInInterpolator);
+ mQsContainerAnimator.addListener(mAnimateHeaderSlidingInListener);
+ mQsContainerAnimator.start();
+ mQsContainer.addOnLayoutChangeListener(mQsContainerAnimatorUpdater);
+ return true;
+ }
+ };
+
+ private void animateHeaderSlidingIn() {
+ mHeaderAnimatingIn = true;
+ getViewTreeObserver().addOnPreDrawListener(mStartHeaderSlidingIn);
+
+ }
+
+ private final Runnable mAnimateKeyguardStatusBarInvisibleEndRunnable = new Runnable() {
+ @Override
+ public void run() {
+ mKeyguardStatusBar.setVisibility(View.INVISIBLE);
+ }
+ };
+
+ private void animateKeyguardStatusBarOut() {
+ mKeyguardStatusBar.animate()
+ .alpha(0f)
+ .setStartDelay(mStatusBar.getKeyguardFadingAwayDelay())
+ .setDuration(mStatusBar.getKeyguardFadingAwayDuration()/2)
+ .setInterpolator(PhoneStatusBar.ALPHA_OUT)
+ .withEndAction(mAnimateKeyguardStatusBarInvisibleEndRunnable)
+ .start();
+ }
+
+ private final Runnable mAnimateKeyguardBottomAreaInvisibleEndRunnable = new Runnable() {
+ @Override
+ public void run() {
+ mKeyguardBottomArea.setVisibility(View.GONE);
+ }
+ };
+
+ private void setKeyguardBottomAreaVisibility(int statusBarState,
+ boolean goingToFullShade) {
+ if (goingToFullShade) {
+ mKeyguardBottomArea.animate().cancel();
+ mKeyguardBottomArea.animate()
+ .alpha(0f)
+ .setStartDelay(mStatusBar.getKeyguardFadingAwayDelay())
+ .setDuration(mStatusBar.getKeyguardFadingAwayDuration()/2)
+ .setInterpolator(PhoneStatusBar.ALPHA_OUT)
+ .withEndAction(mAnimateKeyguardBottomAreaInvisibleEndRunnable)
+ .start();
+ } else if (statusBarState == StatusBarState.KEYGUARD
+ || statusBarState == StatusBarState.SHADE_LOCKED) {
+ mKeyguardBottomArea.animate().cancel();
+ mKeyguardBottomArea.setVisibility(View.VISIBLE);
+ mKeyguardBottomArea.setAlpha(1f);
+ } else {
+ mKeyguardBottomArea.animate().cancel();
+ mKeyguardBottomArea.setVisibility(View.GONE);
+ mKeyguardBottomArea.setAlpha(1f);
+ }
+ }
+
+ private void setKeyguardStatusViewVisibility(int statusBarState, boolean keyguardFadingAway,
+ boolean goingToFullShade) {
+ if ((!keyguardFadingAway && mStatusBarState == StatusBarState.KEYGUARD
+ && statusBarState != StatusBarState.KEYGUARD) || goingToFullShade) {
mKeyguardStatusView.animate().cancel();
mKeyguardStatusViewAnimating = true;
mKeyguardStatusView.animate()
.alpha(0f)
+ .setStartDelay(0)
.setDuration(160)
.setInterpolator(PhoneStatusBar.ALPHA_OUT)
.withEndAction(mAnimateKeyguardStatusViewInvisibleEndRunnable);
+ if (keyguardFadingAway) {
+ mKeyguardStatusView.animate()
+ .setStartDelay(mStatusBar.getKeyguardFadingAwayDelay())
+ .setDuration(mStatusBar.getKeyguardFadingAwayDuration()/2)
+ .start();
+ }
} else if (mStatusBarState == StatusBarState.SHADE_LOCKED
&& statusBarState == StatusBarState.KEYGUARD) {
mKeyguardStatusView.animate().cancel();
@@ -721,6 +851,7 @@
mKeyguardStatusView.setAlpha(0f);
mKeyguardStatusView.animate()
.alpha(1f)
+ .setStartDelay(0)
.setDuration(320)
.setInterpolator(PhoneStatusBar.ALPHA_IN)
.withEndAction(mAnimateKeyguardStatusViewVisibleEndRunnable);
@@ -791,7 +922,9 @@
}
private void setQsTranslation(float height) {
- mQsContainer.setY(height - mQsContainer.getHeight() + getHeaderTranslation());
+ if (!mHeaderAnimatingIn) {
+ mQsContainer.setY(height - mQsContainer.getHeight() + getHeaderTranslation());
+ }
if (mKeyguardShowing) {
mHeader.setY(interpolate(getQsExpansionFraction(), -mHeader.getHeight(), 0));
}
@@ -1089,7 +1222,9 @@
}
private void updateHeaderShade() {
- mHeader.setTranslationY(getHeaderTranslation());
+ if (!mHeaderAnimatingIn) {
+ mHeader.setTranslationY(getHeaderTranslation());
+ }
setQsTranslation(mQsExpansionHeight);
}