Merge changes Ic30e4de6,I34496c73,I096d3823 into nyc-dev am: 11619f4782
am: 845996e356
* commit '845996e356ccd0c635c269340e015f6c5aac6185':
Fixed a bug where the content height was wrong
Fixed the fade in animation when coming from dark
Fixed the animation when flinging over the bottom stack
Change-Id: I2e0f53f7ddb30f9cdb91dec89a0998951a587b4c
This commit is contained in:
@@ -44,6 +44,7 @@ public class ExpandHelper implements Gefingerpoken {
|
||||
void setUserExpandedChild(View v, boolean userExpanded);
|
||||
void setUserLockedChild(View v, boolean userLocked);
|
||||
void expansionStateChanged(boolean isExpanding);
|
||||
int getMaxExpandHeight(ExpandableView view);
|
||||
}
|
||||
|
||||
private static final String TAG = "ExpandHelper";
|
||||
@@ -144,7 +145,7 @@ public class ExpandHelper implements Gefingerpoken {
|
||||
return mView.getActualHeight();
|
||||
}
|
||||
public int getNaturalHeight() {
|
||||
return mView.getMaxContentHeight();
|
||||
return mCallback.getMaxExpandHeight(mView);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -156,6 +156,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
|
||||
}
|
||||
}
|
||||
};
|
||||
private boolean mForceUnlocked;
|
||||
private boolean mDismissed;
|
||||
private boolean mKeepInParent;
|
||||
private boolean mRemoved;
|
||||
@@ -454,7 +455,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
|
||||
* @param pinned whether it is pinned
|
||||
*/
|
||||
public void setPinned(boolean pinned) {
|
||||
int intrinsicHeight = getIntrinsicHeight();
|
||||
mIsPinned = pinned;
|
||||
if (intrinsicHeight != getIntrinsicHeight()) {
|
||||
notifyHeightChanged(false);
|
||||
}
|
||||
if (pinned) {
|
||||
setIconAnimationRunning(true);
|
||||
mExpandedWhenPinned = false;
|
||||
@@ -645,6 +650,16 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
|
||||
onChildrenCountChanged();
|
||||
}
|
||||
|
||||
public void setForceUnlocked(boolean forceUnlocked) {
|
||||
mForceUnlocked = forceUnlocked;
|
||||
if (mIsSummaryWithChildren) {
|
||||
List<ExpandableNotificationRow> notificationChildren = getNotificationChildren();
|
||||
for (ExpandableNotificationRow child : notificationChildren) {
|
||||
child.setForceUnlocked(forceUnlocked);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setDismissed(boolean dismissed) {
|
||||
mDismissed = dismissed;
|
||||
}
|
||||
@@ -1017,7 +1032,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
|
||||
}
|
||||
|
||||
public boolean isUserLocked() {
|
||||
return mUserLocked;
|
||||
return mUserLocked && !mForceUnlocked;
|
||||
}
|
||||
|
||||
public void setUserLocked(boolean userLocked) {
|
||||
|
||||
@@ -103,10 +103,12 @@ public class HeadsUpTouchHelper implements Gefingerpoken {
|
||||
mInitialTouchX = x;
|
||||
mInitialTouchY = y;
|
||||
int expandedHeight = mPickedChild.getActualHeight();
|
||||
mHeadsUpManager.unpinAll();
|
||||
mPanel.setPanelScrimMinFraction((float) expandedHeight
|
||||
/ mPanel.getMaxPanelHeight());
|
||||
mPanel.startExpandMotion(x, y, true /* startTracking */, expandedHeight);
|
||||
// This call needs to be after the expansion start otherwise we will get a
|
||||
// flicker of one frame as it's not expanded yet.
|
||||
mHeadsUpManager.unpinAll();
|
||||
mPanel.clearNotificationEffects();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -362,6 +362,7 @@ public abstract class PanelView extends FrameLayout {
|
||||
mInitialTouchX = newX;
|
||||
if (startTracking) {
|
||||
mTouchSlopExceeded = true;
|
||||
setExpandedHeight(mInitialOffsetOnTouch);
|
||||
onTrackingStarted();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,8 +36,10 @@ import android.graphics.PorterDuffXfermode;
|
||||
import android.graphics.Rect;
|
||||
import android.os.Handler;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.FloatProperty;
|
||||
import android.util.Log;
|
||||
import android.util.Pair;
|
||||
import android.util.Property;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.VelocityTracker;
|
||||
import android.view.View;
|
||||
@@ -331,6 +333,20 @@ public class NotificationStackScrollLayout extends ViewGroup
|
||||
private boolean mPulsing;
|
||||
private boolean mDrawBackgroundAsSrc;
|
||||
private boolean mFadedOut;
|
||||
private boolean mGroupExpandedForMeasure;
|
||||
private float mBackgroundFadeAmount = 1.0f;
|
||||
private static final Property<NotificationStackScrollLayout, Float> BACKGROUND_FADE =
|
||||
new FloatProperty<NotificationStackScrollLayout>("backgroundFade") {
|
||||
@Override
|
||||
public void setValue(NotificationStackScrollLayout object, float value) {
|
||||
object.setBackgroundFadeAmount(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Float get(NotificationStackScrollLayout object) {
|
||||
return object.getBackgroundFadeAmount();
|
||||
}
|
||||
};
|
||||
|
||||
public NotificationStackScrollLayout(Context context) {
|
||||
this(context, null);
|
||||
@@ -406,14 +422,18 @@ public class NotificationStackScrollLayout extends ViewGroup
|
||||
|
||||
private void updateBackgroundDimming() {
|
||||
float alpha = BACKGROUND_ALPHA_DIMMED + (1 - BACKGROUND_ALPHA_DIMMED) * (1.0f - mDimAmount);
|
||||
alpha *= mBackgroundFadeAmount;
|
||||
// We need to manually blend in the background color
|
||||
int scrimColor = mScrimController.getScrimBehindColor();
|
||||
// SRC_OVER blending Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc
|
||||
float alphaInv = 1 - alpha;
|
||||
int color = Color.argb((int) (alpha * 255 + alphaInv * Color.alpha(scrimColor)),
|
||||
(int) (Color.red(mBgColor) + alphaInv * Color.red(scrimColor)),
|
||||
(int) (Color.green(mBgColor) + alphaInv * Color.green(scrimColor)),
|
||||
(int) (Color.blue(mBgColor) + alphaInv * Color.blue(scrimColor)));
|
||||
(int) (mBackgroundFadeAmount * Color.red(mBgColor)
|
||||
+ alphaInv * Color.red(scrimColor)),
|
||||
(int) (mBackgroundFadeAmount * Color.green(mBgColor)
|
||||
+ alphaInv * Color.green(scrimColor)),
|
||||
(int) (mBackgroundFadeAmount * Color.blue(mBgColor)
|
||||
+ alphaInv * Color.blue(scrimColor)));
|
||||
mBackgroundPaint.setColor(color);
|
||||
invalidate();
|
||||
}
|
||||
@@ -930,6 +950,30 @@ public class NotificationStackScrollLayout extends ViewGroup
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxExpandHeight(ExpandableView view) {
|
||||
int maxContentHeight = view.getMaxContentHeight();
|
||||
if (view.isSummaryWithChildren()) {
|
||||
// Faking a measure with the group expanded to simulate how the group would look if
|
||||
// it was. Doing a calculation here would be highly non-trivial because of the
|
||||
// algorithm
|
||||
mGroupExpandedForMeasure = true;
|
||||
ExpandableNotificationRow row = (ExpandableNotificationRow) view;
|
||||
mGroupManager.toggleGroupExpansion(row.getStatusBarNotification());
|
||||
row.setForceUnlocked(true);
|
||||
mAmbientState.setLayoutHeight(mMaxLayoutHeight);
|
||||
mStackScrollAlgorithm.getStackScrollState(mAmbientState, mCurrentStackScrollState);
|
||||
mAmbientState.setLayoutHeight(getLayoutHeight());
|
||||
mGroupManager.toggleGroupExpansion(
|
||||
row.getStatusBarNotification());
|
||||
mGroupExpandedForMeasure = false;
|
||||
row.setForceUnlocked(false);
|
||||
int height = mCurrentStackScrollState.getViewStateForView(view).height;
|
||||
return Math.min(height, maxContentHeight);
|
||||
}
|
||||
return maxContentHeight;
|
||||
}
|
||||
|
||||
public void setScrollingEnabled(boolean enable) {
|
||||
mScrollingEnabled = enable;
|
||||
}
|
||||
@@ -1558,6 +1602,24 @@ public class NotificationStackScrollLayout extends ViewGroup
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the child before the given view which has visibility unequal to GONE
|
||||
*/
|
||||
public ExpandableView getViewBeforeView(ExpandableView view) {
|
||||
ExpandableView previousView = null;
|
||||
int childCount = getChildCount();
|
||||
for (int i = 0; i < childCount; i++) {
|
||||
View child = getChildAt(i);
|
||||
if (child == view) {
|
||||
return previousView;
|
||||
}
|
||||
if (child.getVisibility() != View.GONE) {
|
||||
previousView = (ExpandableView) child;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The first child which has visibility unequal to GONE which is currently below the
|
||||
* given translationY or equal to it.
|
||||
@@ -1602,14 +1664,6 @@ public class NotificationStackScrollLayout extends ViewGroup
|
||||
return count;
|
||||
}
|
||||
|
||||
private int getMaxExpandHeight(View view) {
|
||||
if (view instanceof ExpandableNotificationRow) {
|
||||
ExpandableNotificationRow row = (ExpandableNotificationRow) view;
|
||||
return row.getIntrinsicHeight();
|
||||
}
|
||||
return view.getHeight();
|
||||
}
|
||||
|
||||
public int getContentHeight() {
|
||||
return mContentHeight;
|
||||
}
|
||||
@@ -2580,6 +2634,7 @@ public class NotificationStackScrollLayout extends ViewGroup
|
||||
AnimationEvent ev = new AnimationEvent(null, AnimationEvent.ANIMATION_TYPE_DARK);
|
||||
ev.darkAnimationOriginIndex = mDarkAnimationOriginIndex;
|
||||
mAnimationEvents.add(ev);
|
||||
startBackgroundFadeIn();
|
||||
}
|
||||
mDarkNeedsAnimation = false;
|
||||
}
|
||||
@@ -2885,8 +2940,7 @@ public class NotificationStackScrollLayout extends ViewGroup
|
||||
if (row.isChildInGroup()) {
|
||||
endPosition += row.getNotificationParent().getTranslationY();
|
||||
}
|
||||
int stackEnd = mMaxLayoutHeight - mBottomStackPeekSize -
|
||||
mBottomStackSlowDownHeight + (int) mStackTranslation;
|
||||
int stackEnd = getStackEndPosition();
|
||||
if (endPosition > stackEnd) {
|
||||
mOwnScrollY += endPosition - stackEnd;
|
||||
mDisallowScrollingInThisMotion = true;
|
||||
@@ -2895,6 +2949,11 @@ public class NotificationStackScrollLayout extends ViewGroup
|
||||
}
|
||||
}
|
||||
|
||||
private int getStackEndPosition() {
|
||||
return mMaxLayoutHeight - mBottomStackPeekSize - mBottomStackSlowDownHeight
|
||||
+ mPaddingBetweenElements + (int) mStackTranslation;
|
||||
}
|
||||
|
||||
public void setOnHeightChangedListener(
|
||||
ExpandableView.OnHeightChangedListener mOnHeightChangedListener) {
|
||||
this.mOnHeightChangedListener = mOnHeightChangedListener;
|
||||
@@ -3080,6 +3139,9 @@ public class NotificationStackScrollLayout extends ViewGroup
|
||||
mDarkNeedsAnimation = true;
|
||||
mDarkAnimationOriginIndex = findDarkAnimationOriginIndex(touchWakeUpScreenLocation);
|
||||
mNeedsAnimation = true;
|
||||
setBackgroundFadeAmount(0.0f);
|
||||
} else if (!dark) {
|
||||
setBackgroundFadeAmount(1.0f);
|
||||
}
|
||||
requestChildrenUpdate();
|
||||
if (dark) {
|
||||
@@ -3088,10 +3150,35 @@ public class NotificationStackScrollLayout extends ViewGroup
|
||||
} else {
|
||||
updateBackground();
|
||||
setWillNotDraw(false);
|
||||
// TODO: fade in background
|
||||
}
|
||||
}
|
||||
|
||||
private void setBackgroundFadeAmount(float fadeAmount) {
|
||||
mBackgroundFadeAmount = fadeAmount;
|
||||
updateBackgroundDimming();
|
||||
}
|
||||
|
||||
public float getBackgroundFadeAmount() {
|
||||
return mBackgroundFadeAmount;
|
||||
}
|
||||
|
||||
private void startBackgroundFadeIn() {
|
||||
ObjectAnimator fadeAnimator = ObjectAnimator.ofFloat(this, BACKGROUND_FADE, 0f, 1f);
|
||||
int maxLength;
|
||||
if (mDarkAnimationOriginIndex == AnimationEvent.DARK_ANIMATION_ORIGIN_INDEX_ABOVE
|
||||
|| mDarkAnimationOriginIndex == AnimationEvent.DARK_ANIMATION_ORIGIN_INDEX_BELOW) {
|
||||
maxLength = getNotGoneChildCount() - 1;
|
||||
} else {
|
||||
maxLength = Math.max(mDarkAnimationOriginIndex,
|
||||
getNotGoneChildCount() - mDarkAnimationOriginIndex - 1);
|
||||
}
|
||||
long delay = maxLength * StackStateAnimator.ANIMATION_DELAY_PER_ELEMENT_DARK;
|
||||
fadeAnimator.setStartDelay(delay);
|
||||
fadeAnimator.setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD);
|
||||
fadeAnimator.setInterpolator(Interpolators.ALPHA_IN);
|
||||
fadeAnimator.start();
|
||||
}
|
||||
|
||||
private int findDarkAnimationOriginIndex(@Nullable PointF screenLocation) {
|
||||
if (screenLocation == null || screenLocation.y < mTopPadding + mTopPaddingOverflow) {
|
||||
return AnimationEvent.DARK_ANIMATION_ORIGIN_INDEX_ABOVE;
|
||||
@@ -3375,13 +3462,16 @@ public class NotificationStackScrollLayout extends ViewGroup
|
||||
|
||||
@Override
|
||||
public void onGroupExpansionChanged(ExpandableNotificationRow changedRow, boolean expanded) {
|
||||
boolean animated = mAnimationsEnabled && (mIsExpanded || changedRow.isPinned());
|
||||
boolean animated = !mGroupExpandedForMeasure && mAnimationsEnabled
|
||||
&& (mIsExpanded || changedRow.isPinned());
|
||||
if (animated) {
|
||||
mExpandedGroupView = changedRow;
|
||||
mNeedsAnimation = true;
|
||||
}
|
||||
changedRow.setChildrenExpanded(expanded, animated);
|
||||
onHeightChanged(changedRow, false /* needsAnimation */);
|
||||
if (!mGroupExpandedForMeasure) {
|
||||
onHeightChanged(changedRow, false /* needsAnimation */);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user