Merge "Clock padding and motion adjustments" into pi-dev

am: 96b4b4bd4e

Change-Id: I932fab6fe4d87fc55e3275b2ca0903fd6b34a34f
This commit is contained in:
Lucas Dupin
2018-04-19 18:04:51 -07:00
committed by android-build-merger
10 changed files with 146 additions and 131 deletions

View File

@@ -138,7 +138,7 @@
<!-- Vertical translation of the shelf during animation that happens after the
notification panel collapses -->
<dimen name="shelf_appear_translation">9dp</dimen>
<dimen name="shelf_appear_translation">42dp</dimen>
<!-- The amount the content shifts upwards when transforming into the icon -->
<dimen name="notification_icon_transform_content_shift">32dp</dimen>
@@ -497,9 +497,6 @@
device. -->
<dimen name="unlock_move_distance">75dp</dimen>
<!-- Distance after which the scrim starts fading in when dragging down the quick settings -->
<dimen name="notification_scrim_wait_distance">100dp</dimen>
<!-- Move distance for the unlock hint animation on the lockscreen -->
<dimen name="hint_move_distance">75dp</dimen>

View File

@@ -24,6 +24,8 @@
<item type="id" name="scale_y_animator_tag"/>
<item type="id" name="top_inset_animator_tag"/>
<item type="id" name="height_animator_tag"/>
<item type="id" name="x_animator_tag"/>
<item type="id" name="y_animator_tag"/>
<item type="id" name="shadow_alpha_animator_tag"/>
<item type="id" name="translation_x_animator_end_value_tag"/>
<item type="id" name="translation_y_animator_end_value_tag"/>
@@ -34,6 +36,8 @@
<item type="id" name="top_inset_animator_end_value_tag"/>
<item type="id" name="height_animator_end_value_tag"/>
<item type="id" name="shadow_alpha_animator_end_value_tag"/>
<item type="id" name="x_animator_tag_end_value"/>
<item type="id" name="y_animator_tag_end_value"/>
<item type="id" name="translation_x_animator_start_value_tag"/>
<item type="id" name="translation_y_animator_start_value_tag"/>
<item type="id" name="translation_z_animator_start_value_tag"/>
@@ -43,6 +47,8 @@
<item type="id" name="top_inset_animator_start_value_tag"/>
<item type="id" name="height_animator_start_value_tag"/>
<item type="id" name="shadow_alpha_animator_start_value_tag"/>
<item type="id" name="x_animator_tag_start_value"/>
<item type="id" name="y_animator_tag_start_value"/>
<item type="id" name="doze_saved_filter_tag"/>
<item type="id" name="qs_icon_tag"/>
<item type="id" name="qs_slash_tag"/>

View File

@@ -58,7 +58,7 @@ public class NotificationShelf extends ActivatableNotificationView implements
= SystemProperties.getBoolean("debug.icon_scroll_animations", true);
private static final int TAG_CONTINUOUS_CLIPPING = R.id.continuous_clipping_tag;
private static final String TAG = "NotificationShelf";
private static final long SHELF_IN_TRANSLATION_DURATION = 220;
private static final long SHELF_IN_TRANSLATION_DURATION = 200;
private ViewInvertHelper mViewInvertHelper;
private boolean mDark;
@@ -157,14 +157,18 @@ public class NotificationShelf extends ActivatableNotificationView implements
public void fadeInTranslating() {
float translation = mShelfIcons.getTranslationY();
mShelfIcons.setTranslationY(translation + mShelfAppearTranslation);
mShelfIcons.setTranslationY(translation - mShelfAppearTranslation);
mShelfIcons.setAlpha(0);
mShelfIcons.animate()
.alpha(1)
.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN)
.setInterpolator(Interpolators.DECELERATE_QUINT)
.translationY(translation)
.setDuration(SHELF_IN_TRANSLATION_DURATION)
.start();
mShelfIcons.animate()
.alpha(1)
.setInterpolator(Interpolators.LINEAR)
.setDuration(SHELF_IN_TRANSLATION_DURATION)
.start();
}
@Override

View File

@@ -20,25 +20,30 @@ import android.util.FloatProperty;
import android.util.Property;
import android.view.View;
import com.android.systemui.statusbar.stack.AnimationProperties;
import com.android.systemui.R;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
/**
* An animatable property of a view. Used with {@link PropertyAnimator}
*/
public interface AnimatableProperty {
int getAnimationStartTag();
public abstract class AnimatableProperty {
int getAnimationEndTag();
public static final AnimatableProperty X = AnimatableProperty.from(View.X,
R.id.x_animator_tag, R.id.x_animator_tag_start_value, R.id.x_animator_tag_end_value);
public static final AnimatableProperty Y = AnimatableProperty.from(View.Y,
R.id.y_animator_tag, R.id.y_animator_tag_start_value, R.id.y_animator_tag_end_value);
int getAnimatorTag();
public abstract int getAnimationStartTag();
Property getProperty();
public abstract int getAnimationEndTag();
static <T extends View> AnimatableProperty from(String name, BiConsumer<T, Float> setter,
public abstract int getAnimatorTag();
public abstract Property getProperty();
public static <T extends View> AnimatableProperty from(String name, BiConsumer<T, Float> setter,
Function<T, Float> getter, int animatorTag, int startValueTag, int endValueTag) {
Property<T, Float> property = new FloatProperty<T>(name) {
@@ -74,4 +79,29 @@ public interface AnimatableProperty {
}
};
}
public static <T extends View> AnimatableProperty from(Property<T, Float> property,
int animatorTag, int startValueTag, int endValueTag) {
return new AnimatableProperty() {
@Override
public int getAnimationStartTag() {
return startValueTag;
}
@Override
public int getAnimationEndTag() {
return endValueTag;
}
@Override
public int getAnimatorTag() {
return animatorTag;
}
@Override
public Property getProperty() {
return property;
}
};
}
}

View File

@@ -24,6 +24,7 @@ import android.util.Property;
import android.view.View;
import android.view.animation.Interpolator;
import com.android.keyguard.KeyguardStatusView;
import com.android.systemui.Interpolators;
import com.android.systemui.statusbar.stack.AnimationFilter;
import com.android.systemui.statusbar.stack.AnimationProperties;
@@ -115,4 +116,7 @@ public class PropertyAnimator {
view.setTag(animationEndTag, newEndValue);
}
public static <T extends View> boolean isAnimating(T view, AnimatableProperty property) {
return view.getTag(property.getAnimatorTag()) != null;
}
}

View File

@@ -20,8 +20,8 @@ import static com.android.systemui.statusbar.notification.NotificationUtils.inte
import android.content.res.Resources;
import android.util.MathUtils;
import com.android.keyguard.KeyguardStatusView;
import com.android.keyguard.KeyguardStatusView;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
@@ -46,12 +46,6 @@ public class KeyguardClockPositionAlgorithm {
*/
private int mClockNotificationsMargin;
/**
* Current height of {@link NotificationPanelView}, considering how much the
* user collapsed it.
*/
private float mExpandedHeight;
/**
* Height of the parent view - display size in px.
*/
@@ -84,9 +78,9 @@ public class KeyguardClockPositionAlgorithm {
private int mContainerTopPadding;
/**
* @see NotificationPanelView#getMaxPanelHeight()
* @see NotificationPanelView#getExpandedFraction()
*/
private float mMaxPanelHeight;
private float mPanelExpansion;
/**
* Burn-in prevention x translation.
@@ -140,13 +134,13 @@ public class KeyguardClockPositionAlgorithm {
}
public void setup(int minTopMargin, int maxShadeBottom, int notificationStackHeight,
float expandedHeight, float maxPanelHeight, int parentHeight, int keyguardStatusHeight,
float dark, boolean secure, boolean pulsing, int bouncerTop) {
float panelExpansion, int parentHeight,
int keyguardStatusHeight, float dark, boolean secure, boolean pulsing,
int bouncerTop) {
mMinTopMargin = minTopMargin + mContainerTopPadding;
mMaxShadeBottom = maxShadeBottom;
mNotificationStackHeight = notificationStackHeight;
mExpandedHeight = expandedHeight;
mMaxPanelHeight = maxPanelHeight;
mPanelExpansion = panelExpansion;
mHeight = parentHeight;
mKeyguardStatusHeight = keyguardStatusHeight;
mDarkAmount = dark;
@@ -171,16 +165,12 @@ public class KeyguardClockPositionAlgorithm {
return mHeight / 2 - mKeyguardStatusHeight - mClockNotificationsMargin;
}
public int getExpandedClockBottom() {
return getExpandedClockPosition() + mKeyguardStatusHeight;
}
/**
* Vertically align the clock and the shade in the available space considering only
* a percentage of the clock height defined by {@code CLOCK_HEIGHT_WEIGHT}.
* @return Clock Y in pixels.
*/
private int getExpandedClockPosition() {
public int getExpandedClockPosition() {
final int availableHeight = mMaxShadeBottom - mMinTopMargin;
final int containerCenter = mMinTopMargin + availableHeight / 2;
@@ -212,8 +202,7 @@ public class KeyguardClockPositionAlgorithm {
mMinTopMargin : -mKeyguardStatusHeight;
// Move clock up while collapsing the shade
float shadeExpansion = mExpandedHeight / mMaxPanelHeight;
shadeExpansion = Interpolators.FAST_OUT_LINEAR_IN.getInterpolation(shadeExpansion);
float shadeExpansion = Interpolators.FAST_OUT_LINEAR_IN.getInterpolation(mPanelExpansion);
final float clockY = MathUtils.lerp(clockYTarget, clockYRegular, shadeExpansion);
return (int) MathUtils.lerp(clockY, clockYDark, mDarkAmount);

View File

@@ -20,7 +20,6 @@ import static com.android.systemui.statusbar.notification.ActivityLaunchAnimator
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.app.ActivityManager;
@@ -44,7 +43,6 @@ import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.WindowInsets;
import android.view.accessibility.AccessibilityManager;
import android.widget.FrameLayout;
@@ -69,8 +67,11 @@ import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.notification.ActivityLaunchAnimator;
import com.android.systemui.statusbar.notification.AnimatableProperty;
import com.android.systemui.statusbar.notification.PropertyAnimator;
import com.android.systemui.statusbar.policy.KeyguardUserSwitcher;
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import com.android.systemui.statusbar.stack.AnimationProperties;
import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.stack.StackStateAnimator;
@@ -101,6 +102,8 @@ public class NotificationPanelView extends PanelView implements
public static final long DOZE_ANIMATION_DURATION = 700;
private static final AnimationProperties CLOCK_ANIMATION_PROPERTIES = new AnimationProperties()
.setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD);
private static final FloatProperty<NotificationPanelView> SET_DARK_AMOUNT_PROPERTY =
new FloatProperty<NotificationPanelView>("mDarkAmount") {
@Override
@@ -122,11 +125,10 @@ public class NotificationPanelView extends PanelView implements
private QS mQs;
private FrameLayout mQsFrame;
private KeyguardStatusView mKeyguardStatusView;
private View mReserveNotificationSpace;
private View mQsNavbarScrim;
protected NotificationsQuickSettingsContainer mNotificationContainerParent;
protected NotificationStackScrollLayout mNotificationStackScroller;
private boolean mAnimateNextTopPaddingChange;
private boolean mAnimateNextPositionUpdate;
private int mTrackingPointer;
private VelocityTracker mQsVelocityTracker;
@@ -173,9 +175,6 @@ public class NotificationPanelView extends PanelView implements
private int mUnlockMoveDistance;
private float mEmptyDragAmount;
private Animator mClockAnimator;
private int mClockAnimationTargetX = Integer.MIN_VALUE;
private int mClockAnimationTargetY = Integer.MIN_VALUE;
private KeyguardClockPositionAlgorithm mClockPositionAlgorithm =
new KeyguardClockPositionAlgorithm();
private KeyguardClockPositionAlgorithm.Result mClockPositionResult =
@@ -183,7 +182,6 @@ public class NotificationPanelView extends PanelView implements
private boolean mIsExpanding;
private boolean mBlockTouches;
private int mNotificationScrimWaitDistance;
// Used for two finger gesture as well as accessibility shortcut to QS.
private boolean mQsExpandImmediate;
private boolean mTwoFingerQsExpandPossible;
@@ -310,8 +308,6 @@ public class NotificationPanelView extends PanelView implements
getResources().getDimensionPixelSize(R.dimen.header_notifications_collide_distance);
mUnlockMoveDistance = getResources().getDimensionPixelOffset(R.dimen.unlock_move_distance);
mClockPositionAlgorithm.loadDimens(getResources());
mNotificationScrimWaitDistance =
getResources().getDimensionPixelSize(R.dimen.notification_scrim_wait_distance);
mQsFalsingThreshold = getResources().getDimensionPixelSize(
R.dimen.qs_falsing_threshold);
mPositionMinSideMargin = getResources().getDimensionPixelSize(
@@ -461,19 +457,19 @@ public class NotificationPanelView extends PanelView implements
*/
private void positionClockAndNotifications() {
boolean animate = mNotificationStackScroller.isAddOrRemoveAnimationPending();
boolean animateClock = animate || mAnimateNextPositionUpdate;
int stackScrollerPadding;
if (mStatusBarState != StatusBarState.KEYGUARD) {
stackScrollerPadding = (mQs != null ? mQs.getHeader().getHeight() : 0) + mQsPeekHeight
+ mQsNotificationTopPadding;
} else {
final int totalHeight = getHeight();
final int bottomPadding = Math.max(mIndicationBottomPadding, mAmbientIndicationBottomPadding);
int totalHeight = getHeight();
int bottomPadding = Math.max(mIndicationBottomPadding, mAmbientIndicationBottomPadding);
mClockPositionAlgorithm.setup(
mStatusBarMinHeight,
totalHeight - bottomPadding,
calculatePanelHeightShade() - mNotificationStackScroller.getTopPadding(),
getExpandedHeight(),
getMaxPanelHeight(),
mNotificationStackScroller.getIntrinsicContentHeight(),
getExpandedFraction(),
totalHeight,
mKeyguardStatusView.getHeight(),
mDarkAmount,
@@ -481,12 +477,10 @@ public class NotificationPanelView extends PanelView implements
mPulsing,
mBouncerTop);
mClockPositionAlgorithm.run(mClockPositionResult);
if (animate || mClockAnimator != null) {
startClockAnimation(mClockPositionResult.clockX, mClockPositionResult.clockY);
} else {
mKeyguardStatusView.setX(mClockPositionResult.clockX);
mKeyguardStatusView.setY(mClockPositionResult.clockY);
}
PropertyAnimator.setProperty(mKeyguardStatusView, AnimatableProperty.X,
mClockPositionResult.clockX, CLOCK_ANIMATION_PROPERTIES, animateClock);
PropertyAnimator.setProperty(mKeyguardStatusView, AnimatableProperty.Y,
mClockPositionResult.clockY, CLOCK_ANIMATION_PROPERTIES, animateClock);
updateClock();
stackScrollerPadding = mClockPositionResult.stackScrollerPadding;
}
@@ -497,6 +491,7 @@ public class NotificationPanelView extends PanelView implements
mStackScrollerMeasuringPass++;
requestScrollerTopPaddingUpdate(animate);
mStackScrollerMeasuringPass = 0;
mAnimateNextPositionUpdate = false;
}
/**
@@ -558,42 +553,6 @@ public class NotificationPanelView extends PanelView implements
positionClockAndNotifications();
}
private void startClockAnimation(int x, int y) {
if (mClockAnimationTargetX == x && mClockAnimationTargetY == y) {
return;
}
mClockAnimationTargetX = x;
mClockAnimationTargetY = y;
getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
getViewTreeObserver().removeOnPreDrawListener(this);
if (mClockAnimator != null) {
mClockAnimator.removeAllListeners();
mClockAnimator.cancel();
}
AnimatorSet set = new AnimatorSet();
set.play(ObjectAnimator.ofFloat(
mKeyguardStatusView, View.Y, mClockAnimationTargetY))
.with(ObjectAnimator.ofFloat(
mKeyguardStatusView, View.X, mClockAnimationTargetX));
mClockAnimator = set;
mClockAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
mClockAnimator.setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD);
mClockAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mClockAnimator = null;
mClockAnimationTargetX = Integer.MIN_VALUE;
mClockAnimationTargetY = Integer.MIN_VALUE;
}
});
mClockAnimator.start();
return true;
}
});
}
private void updateClock() {
if (!mKeyguardStatusViewAnimating) {
mKeyguardStatusView.setAlpha(mClockPositionResult.clockAlpha);
@@ -601,9 +560,9 @@ public class NotificationPanelView extends PanelView implements
}
public void animateToFullShade(long delay) {
mAnimateNextTopPaddingChange = true;
mNotificationStackScroller.goToFullShade(delay);
requestLayout();
mAnimateNextPositionUpdate = true;
}
public void setQsExpansionEnabled(boolean qsExpansionEnabled) {
@@ -1411,10 +1370,8 @@ public class NotificationPanelView extends PanelView implements
protected void requestScrollerTopPaddingUpdate(boolean animate) {
mNotificationStackScroller.updateTopPadding(calculateQsTopPadding(),
mAnimateNextTopPaddingChange || animate,
mKeyguardShowing
animate, mKeyguardShowing
&& (mQsExpandImmediate || mIsExpanding && mQsExpandedWhenExpandingStarted));
mAnimateNextTopPaddingChange = false;
}
private void trackMovement(MotionEvent event) {
@@ -1535,7 +1492,7 @@ public class NotificationPanelView extends PanelView implements
if (mQsExpandImmediate || mQsExpanded || mIsExpanding && mQsExpandedWhenExpandingStarted) {
maxHeight = calculatePanelHeightQsExpanded();
} else {
maxHeight = Math.max(calculatePanelHeightShade(), calculatePanelHeightShadeExpanded());
maxHeight = calculatePanelHeightShade();
}
maxHeight = Math.max(maxHeight, min);
return maxHeight;
@@ -1606,14 +1563,15 @@ public class NotificationPanelView extends PanelView implements
int emptyBottomMargin = mNotificationStackScroller.getEmptyBottomMargin();
int maxHeight = mNotificationStackScroller.getHeight() - emptyBottomMargin;
maxHeight += mNotificationStackScroller.getTopPaddingOverflow();
return maxHeight;
}
private int calculatePanelHeightShadeExpanded() {
return mNotificationStackScroller.getHeight()
- mNotificationStackScroller.getEmptyBottomMargin()
- mNotificationStackScroller.getTopPadding()
+ mClockPositionAlgorithm.getExpandedClockBottom();
if (mStatusBarState == StatusBarState.KEYGUARD) {
int minKeyguardPanelBottom = mClockPositionAlgorithm.getExpandedClockPosition()
+ mKeyguardStatusView.getHeight()
+ mNotificationStackScroller.getIntrinsicContentHeight();
return Math.max(maxHeight, minKeyguardPanelBottom);
} else {
return maxHeight;
}
}
private int calculatePanelHeightQsExpanded() {
@@ -1652,7 +1610,8 @@ public class NotificationPanelView extends PanelView implements
private void updateNotificationTranslucency() {
float alpha = 1f;
if (mClosingWithAlphaFadeOut && !mExpandingFromHeadsUp && !mHeadsUpManager.hasPinnedHeadsUp()) {
if (mClosingWithAlphaFadeOut && !mExpandingFromHeadsUp &&
!mHeadsUpManager.hasPinnedHeadsUp()) {
alpha = getFadeoutAlpha();
}
mNotificationStackScroller.setAlpha(alpha);
@@ -1907,13 +1866,16 @@ public class NotificationPanelView extends PanelView implements
if (view == null && mQsExpanded) {
return;
}
if (needsAnimation) {
mAnimateNextPositionUpdate = true;
}
ExpandableView firstChildNotGone = mNotificationStackScroller.getFirstChildNotGone();
ExpandableNotificationRow firstRow = firstChildNotGone instanceof ExpandableNotificationRow
? (ExpandableNotificationRow) firstChildNotGone
: null;
if (firstRow != null
&& (view == firstRow || (firstRow.getNotificationParent() == firstRow))) {
requestScrollerTopPaddingUpdate(false);
requestScrollerTopPaddingUpdate(false /* animate */);
}
requestPanelHeightUpdate();
}
@@ -2337,15 +2299,15 @@ public class NotificationPanelView extends PanelView implements
p.setColor(Color.YELLOW);
canvas.drawLine(0, calculatePanelHeightShade(), getWidth(),
calculatePanelHeightShade(), p);
p.setColor(Color.GRAY);
canvas.drawLine(0, calculatePanelHeightShadeExpanded(), getWidth(),
calculatePanelHeightShadeExpanded(), p);
p.setColor(Color.MAGENTA);
canvas.drawLine(0, calculateQsTopPadding(), getWidth(),
calculateQsTopPadding(), p);
p.setColor(Color.CYAN);
canvas.drawLine(0, mNotificationStackScroller.getTopPadding(), getWidth(),
canvas.drawLine(0, mClockPositionResult.stackScrollerPadding, getWidth(),
mNotificationStackScroller.getTopPadding(), p);
p.setColor(Color.GRAY);
canvas.drawLine(0, mClockPositionResult.clockY, getWidth(),
mClockPositionResult.clockY, p);
}
}

View File

@@ -828,7 +828,7 @@ public abstract class PanelView extends FrameLayout {
}
@Override
protected void onLayout (boolean changed, int left, int top, int right, int bottom) {
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
mStatusBar.onPanelLaidOut();
requestPanelHeightUpdate();
@@ -1088,13 +1088,10 @@ public abstract class PanelView extends FrameLayout {
}
cancelPeek();
notifyExpandingStarted();
startUnlockHintAnimationPhase1(new Runnable() {
@Override
public void run() {
notifyExpandingFinished();
onUnlockHintFinished();
mHintAnimationRunning = false;
}
startUnlockHintAnimationPhase1(() -> {
notifyExpandingFinished();
onUnlockHintFinished();
mHintAnimationRunning = false;
});
onUnlockHintStarted();
mHintAnimationRunning = true;

View File

@@ -164,6 +164,7 @@ public class NotificationStackScrollLayout extends ViewGroup
private Paint mDebugPaint;
private int mContentHeight;
private int mIntrinsicContentHeight;
private int mCollapsedSize;
private int mPaddingBetweenElements;
private int mIncreasedPaddingBetweenElements;
@@ -538,15 +539,16 @@ public class NotificationStackScrollLayout extends ViewGroup
canvas.drawRect(darkLeft, darkTop, darkRight, darkBottom, mBackgroundPaint);
}
} else {
float animProgress = Interpolators.FAST_OUT_SLOW_IN
.getInterpolation(1f - mDarkAmount);
float sidePaddingsProgress = Interpolators.FAST_OUT_SLOW_IN
.getInterpolation((1f - mDarkAmount) * 2);
float inverseDark = 1 - mDarkAmount;
float yProgress = Interpolators.FAST_OUT_SLOW_IN.getInterpolation(inverseDark);
float xProgress = Interpolators.FAST_OUT_SLOW_IN
.getInterpolation(inverseDark * 2f);
mBackgroundAnimationRect.set(
(int) MathUtils.lerp(darkLeft, lockScreenLeft, sidePaddingsProgress),
(int) MathUtils.lerp(darkTop, lockScreenTop, animProgress),
(int) MathUtils.lerp(darkRight, lockScreenRight, sidePaddingsProgress),
(int) MathUtils.lerp(darkBottom, lockScreenBottom, animProgress));
(int) MathUtils.lerp(darkLeft, lockScreenLeft, xProgress),
(int) MathUtils.lerp(darkTop, lockScreenTop, yProgress),
(int) MathUtils.lerp(darkRight, lockScreenRight, xProgress),
(int) MathUtils.lerp(darkBottom, lockScreenBottom, yProgress));
if (!mAmbientState.isDark() || mFirstVisibleBackgroundChild != null) {
canvas.drawRoundRect(mBackgroundAnimationRect.left, mBackgroundAnimationRect.top,
mBackgroundAnimationRect.right, mBackgroundAnimationRect.bottom,
@@ -628,8 +630,12 @@ public class NotificationStackScrollLayout extends ViewGroup
}
private void notifyHeightChangeListener(ExpandableView view) {
notifyHeightChangeListener(view, false /* needsAnimation */);
}
private void notifyHeightChangeListener(ExpandableView view, boolean needsAnimation) {
if (mOnHeightChangedListener != null) {
mOnHeightChangedListener.onHeightChanged(view, false /* needsAnimation */);
mOnHeightChangedListener.onHeightChanged(view, needsAnimation);
}
}
@@ -850,7 +856,7 @@ public class NotificationStackScrollLayout extends ViewGroup
mNeedsAnimation = true;
}
requestChildrenUpdate();
notifyHeightChangeListener(null);
notifyHeightChangeListener(null, animate);
}
}
@@ -915,6 +921,13 @@ public class NotificationStackScrollLayout extends ViewGroup
updateClipping();
}
/**
* Return the height of the content ignoring the footer.
*/
public int getIntrinsicContentHeight() {
return mIntrinsicContentHeight;
}
public void updateClipping() {
boolean animatingClipping = mDarkAmount > 0 && mDarkAmount < 1;
boolean clipped = mRequestedClipBounds != null && !mInHeadsUpPinnedMode
@@ -2130,8 +2143,9 @@ public class NotificationStackScrollLayout extends ViewGroup
for (int i = 0; i < getChildCount(); i++) {
ExpandableView expandableView = (ExpandableView) getChildAt(i);
boolean footerViewOnLockScreen = expandableView == mFooterView && onKeyguard();
if (expandableView.getVisibility() != View.GONE
&& !expandableView.hasNoContentHeight()) {
&& !expandableView.hasNoContentHeight() && !footerViewOnLockScreen) {
boolean limitReached = maxDisplayedNotifications != -1
&& numShownItems >= maxDisplayedNotifications;
boolean notificationOnAmbientThatIsNotPulsing = mAmbientState.isFullyDark()
@@ -2179,6 +2193,7 @@ public class NotificationStackScrollLayout extends ViewGroup
}
}
}
mIntrinsicContentHeight = height;
mContentHeight = height + mTopPadding + mBottomMargin;
updateScrollability();
clampScrollPosition();
@@ -3656,7 +3671,7 @@ public class NotificationStackScrollLayout extends ViewGroup
updateContentHeight();
updateScrollPositionOnExpandInBottom(view);
clampScrollPosition();
notifyHeightChangeListener(view);
notifyHeightChangeListener(view, needsAnimation);
ExpandableNotificationRow row = view instanceof ExpandableNotificationRow
? (ExpandableNotificationRow) view
: null;
@@ -3970,6 +3985,7 @@ public class NotificationStackScrollLayout extends ViewGroup
mShelf.fadeInTranslating();
}
}
updateAlgorithmHeightAndPadding();
updateBackgroundDimming();
updateAntiBurnInTranslation();
requestChildrenUpdate();

View File

@@ -39,6 +39,7 @@ import com.android.systemui.statusbar.stack.AnimationFilter;
import com.android.systemui.statusbar.stack.AnimationProperties;
import com.android.systemui.statusbar.stack.ViewState;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -227,4 +228,13 @@ public class PropertyAnimatorTest extends SysuiTestCase {
assertNotNull(animator);
assertTrue(animator.getListeners().contains(mFinishListener));
}
@Test
public void testIsAnimating() {
mAnimationFilter.reset();
mAnimationFilter.animate(mProperty.getProperty());
assertFalse(PropertyAnimator.isAnimating(mView, mProperty));
PropertyAnimator.startAnimation(mView, mProperty, 200f, mAnimationProperties);
assertTrue(PropertyAnimator.isAnimating(mView, mProperty));
}
}