Merge "Improve action bar transition" into nyc-dev

This commit is contained in:
Adrian Roos
2016-06-14 19:42:40 +00:00
committed by Android (Google) Code Review
5 changed files with 76 additions and 4 deletions

View File

@@ -193,6 +193,13 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
mGroupExpansionChanging = changing;
}
@Override
public void setActualHeightAnimating(boolean animating) {
if (mPrivateLayout != null) {
mPrivateLayout.setContentHeightAnimating(animating);
}
}
public NotificationContentView getPrivateLayout() {
return mPrivateLayout;
}

View File

@@ -432,6 +432,8 @@ public abstract class ExpandableView extends FrameLayout {
return false;
}
public void setActualHeightAnimating(boolean animating) {}
/**
* A listener notifying when {@link #getActualHeight} changes.
*/

View File

@@ -106,13 +106,19 @@ public class NotificationContentView extends FrameLayout {
private boolean mExpandable;
private boolean mClipToActualHeight = true;
private ExpandableNotificationRow mContainingNotification;
/** The visible type at the start of a touch driven transformation */
private int mTransformationStartVisibleType;
/** The visible type at the start of an animation driven transformation */
private int mAnimationStartVisibleType = UNDEFINED;
private boolean mUserExpanding;
private int mSingleLineWidthIndention;
private boolean mForceSelectNextLayout = true;
private PendingIntent mPreviousExpandedRemoteInputIntent;
private PendingIntent mPreviousHeadsUpRemoteInputIntent;
private int mContentHeightAtAnimationStart = UNDEFINED;
public NotificationContentView(Context context, AttributeSet attrs) {
super(context, attrs);
mHybridGroupManager = new HybridGroupManager(getContext(), this);
@@ -258,7 +264,14 @@ public class NotificationContentView extends FrameLayout {
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
int previousHeight = 0;
if (mExpandedChild != null) {
previousHeight = mExpandedChild.getHeight();
}
super.onLayout(changed, left, top, right, bottom);
if (previousHeight != 0 && mExpandedChild.getHeight() != previousHeight) {
mContentHeightAtAnimationStart = previousHeight;
}
updateClipping();
invalidateOutline();
selectLayout(false /* animate */, mForceSelectNextLayout /* force */);
@@ -408,24 +421,54 @@ public class NotificationContentView extends FrameLayout {
* height, the notification is clipped instead of being further shrunk.
*/
private int getMinContentHeightHint() {
if (mIsChildInGroup && (mVisibleType == VISIBLE_TYPE_SINGLELINE
|| mTransformationStartVisibleType == VISIBLE_TYPE_SINGLELINE)) {
if (mIsChildInGroup && isVisibleOrTransitioning(VISIBLE_TYPE_SINGLELINE)) {
return mContext.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.notification_action_list_height);
}
// Transition between heads-up & expanded, or pinned.
if (mHeadsUpChild != null && mExpandedChild != null) {
boolean transitioningBetweenHunAndExpanded =
isTransitioningFromTo(VISIBLE_TYPE_HEADSUP, VISIBLE_TYPE_EXPANDED) ||
isTransitioningFromTo(VISIBLE_TYPE_EXPANDED, VISIBLE_TYPE_HEADSUP);
boolean pinned = !isVisibleOrTransitioning(VISIBLE_TYPE_CONTRACTED) && mIsHeadsUp;
if (transitioningBetweenHunAndExpanded || pinned) {
return Math.min(mHeadsUpChild.getHeight(), mExpandedChild.getHeight());
}
}
// Size change of the expanded version
if ((mVisibleType == VISIBLE_TYPE_EXPANDED) && mContentHeightAtAnimationStart >= 0
&& mExpandedChild != null) {
return Math.min(mContentHeightAtAnimationStart, mExpandedChild.getHeight());
}
int hint;
if (mHeadsUpChild != null) {
if (mHeadsUpChild != null && isVisibleOrTransitioning(VISIBLE_TYPE_HEADSUP)) {
hint = mHeadsUpChild.getHeight();
} else if (mExpandedChild != null) {
hint = mExpandedChild.getHeight();
} else {
hint = mContractedChild.getHeight() + mContext.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.notification_action_list_height);
}
if (mExpandedChild != null) {
if (mExpandedChild != null && isVisibleOrTransitioning(VISIBLE_TYPE_EXPANDED)) {
hint = Math.min(hint, mExpandedChild.getHeight());
}
return hint;
}
private boolean isTransitioningFromTo(int from, int to) {
return (mTransformationStartVisibleType == from || mAnimationStartVisibleType == from)
&& mVisibleType == to;
}
private boolean isVisibleOrTransitioning(int type) {
return mVisibleType == type || mTransformationStartVisibleType == type
|| mAnimationStartVisibleType == type;
}
private void updateContentTransformation() {
int visibleType = calculateVisibleType();
if (visibleType != mVisibleType) {
@@ -656,6 +699,7 @@ public class NotificationContentView extends FrameLayout {
shownView.setVisible(true);
return;
}
mAnimationStartVisibleType = mVisibleType;
shownView.transformFrom(hiddenView);
getViewForVisibleType(visibleType).setVisibility(View.VISIBLE);
hiddenView.transformTo(shownView, new Runnable() {
@@ -664,6 +708,7 @@ public class NotificationContentView extends FrameLayout {
if (hiddenView != getTransformableViewForVisibleType(mVisibleType)) {
hiddenView.setVisible(false);
}
mAnimationStartVisibleType = UNDEFINED;
}
});
}
@@ -1082,4 +1127,10 @@ public class NotificationContentView extends FrameLayout {
mHeadsUpRemoteInput.setRemoved();
}
}
public void setContentHeightAnimating(boolean animating) {
if (!animating) {
mContentHeightAtAnimationStart = UNDEFINED;
}
}
}

View File

@@ -43,6 +43,16 @@ public class ActionListTransformState extends TransformState {
return new ActionListTransformState();
}
@Override
public void transformViewFullyFrom(TransformState otherState, float transformationAmount) {
// Don't do Y transform - let the wrapper handle this based on the content height
}
@Override
public void transformViewFullyTo(TransformState otherState, float transformationAmount) {
// Don't do Y transform - let the wrapper handle this based on the content height
}
@Override
protected void resetTransformedView() {
// We need to keep the Y transformation, because this is used to keep the action list

View File

@@ -485,6 +485,7 @@ public class StackStateAnimator {
child.setTag(TAG_ANIMATOR_HEIGHT, null);
child.setTag(TAG_START_HEIGHT, null);
child.setTag(TAG_END_HEIGHT, null);
child.setActualHeightAnimating(false);
if (!mWasCancelled && child instanceof ExpandableNotificationRow) {
((ExpandableNotificationRow) child).setGroupExpansionChanging(
false /* isExpansionChanging */);
@@ -505,6 +506,7 @@ public class StackStateAnimator {
child.setTag(TAG_ANIMATOR_HEIGHT, animator);
child.setTag(TAG_START_HEIGHT, child.getActualHeight());
child.setTag(TAG_END_HEIGHT, newEndValue);
child.setActualHeightAnimating(true);
}
private void startInsetAnimation(final ExpandableView child,