Merge "Cleaned up the clipping logic for the dismiss motion." into mnc-dev
This commit is contained in:
@ -44,6 +44,7 @@ public abstract class ExpandableView extends FrameLayout {
|
||||
private int mClipTopOptimization;
|
||||
private static Rect mClipRect = new Rect();
|
||||
private boolean mWillBeGone;
|
||||
private int mMinClipTopAmount = 0;
|
||||
|
||||
public ExpandableView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
@ -400,6 +401,14 @@ public abstract class ExpandableView extends FrameLayout {
|
||||
mWillBeGone = willBeGone;
|
||||
}
|
||||
|
||||
public int getMinClipTopAmount() {
|
||||
return mMinClipTopAmount;
|
||||
}
|
||||
|
||||
public void setMinClipTopAmount(int minClipTopAmount) {
|
||||
mMinClipTopAmount = minClipTopAmount;
|
||||
}
|
||||
|
||||
/**
|
||||
* A listener notifying when {@link #getActualHeight} changes.
|
||||
*/
|
||||
|
@ -941,6 +941,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
|
||||
addPostCollapseAction(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
mStackScroller.setDismissAllInProgress(false);
|
||||
try {
|
||||
mBarService.onClearAllNotifications(mCurrentUserId);
|
||||
} catch (Exception ex) { }
|
||||
@ -955,12 +956,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
|
||||
Runnable animationFinishAction = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
mStackScroller.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
mStackScroller.setDismissAllInProgress(false);
|
||||
}
|
||||
});
|
||||
animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE);
|
||||
}
|
||||
};
|
||||
|
@ -43,6 +43,7 @@ public class AmbientState {
|
||||
private int mTopPadding;
|
||||
private boolean mShadeExpanded;
|
||||
private float mMaxHeadsUpTranslation;
|
||||
private boolean mDismissAllInProgress;
|
||||
|
||||
public int getScrollY() {
|
||||
return mScrollY;
|
||||
@ -183,4 +184,12 @@ public class AmbientState {
|
||||
HeadsUpManager.HeadsUpEntry topEntry = mHeadsUpManager.getTopEntry();
|
||||
return topEntry == null ? null : topEntry.entry.row;
|
||||
}
|
||||
|
||||
public void setDismissAllInProgress(boolean dismissAllInProgress) {
|
||||
mDismissAllInProgress = dismissAllInProgress;
|
||||
}
|
||||
|
||||
public boolean isDismissAllInProgress() {
|
||||
return mDismissAllInProgress;
|
||||
}
|
||||
}
|
||||
|
@ -773,8 +773,7 @@ public class NotificationStackScrollLayout extends ViewGroup
|
||||
}
|
||||
|
||||
public boolean canChildBeDismissed(View v) {
|
||||
final View veto = v.findViewById(R.id.veto);
|
||||
return (veto != null && veto.getVisibility() != View.GONE);
|
||||
return StackScrollAlgorithm.canChildBeDismissed(v);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -2610,9 +2609,28 @@ public class NotificationStackScrollLayout extends ViewGroup
|
||||
public void setDismissAllInProgress(boolean dismissAllInProgress) {
|
||||
mDismissAllInProgress = dismissAllInProgress;
|
||||
mDismissView.setDismissAllInProgress(dismissAllInProgress);
|
||||
mAmbientState.setDismissAllInProgress(dismissAllInProgress);
|
||||
if (dismissAllInProgress) {
|
||||
disableClipOptimization();
|
||||
}
|
||||
handleDismissAllClipping();
|
||||
}
|
||||
|
||||
private void handleDismissAllClipping() {
|
||||
final int count = getChildCount();
|
||||
boolean previousChildWillBeDismissed = false;
|
||||
for (int i = 0; i < count; i++) {
|
||||
ExpandableView child = (ExpandableView) getChildAt(i);
|
||||
if (child.getVisibility() == GONE) {
|
||||
continue;
|
||||
}
|
||||
if (mDismissAllInProgress && previousChildWillBeDismissed) {
|
||||
child.setMinClipTopAmount(child.getClipTopAmount());
|
||||
} else {
|
||||
child.setMinClipTopAmount(0);
|
||||
}
|
||||
previousChildWillBeDismissed = canChildBeDismissed(child);
|
||||
}
|
||||
}
|
||||
|
||||
private void disableClipOptimization() {
|
||||
|
@ -202,6 +202,7 @@ public class StackScrollAlgorithm {
|
||||
|
||||
private void updateClipping(StackScrollState resultState,
|
||||
StackScrollAlgorithmState algorithmState, AmbientState ambientState) {
|
||||
boolean dismissAllInProgress = ambientState.isDismissAllInProgress();
|
||||
float previousNotificationEnd = 0;
|
||||
float previousNotificationStart = 0;
|
||||
boolean previousNotificationIsSwiped = false;
|
||||
@ -237,16 +238,29 @@ public class StackScrollAlgorithm {
|
||||
updateChildClippingAndBackground(state, newHeight, clipHeight,
|
||||
newHeight - (previousNotificationStart - newYTranslation));
|
||||
|
||||
if (dismissAllInProgress) {
|
||||
state.clipTopAmount = Math.max(child.getMinClipTopAmount(), state.clipTopAmount);
|
||||
}
|
||||
|
||||
if (!child.isTransparent()) {
|
||||
// Only update the previous values if we are not transparent,
|
||||
// otherwise we would clip to a transparent view.
|
||||
previousNotificationStart = newYTranslation + state.clipTopAmount * state.scale;
|
||||
previousNotificationEnd = newNotificationEnd;
|
||||
previousNotificationIsSwiped = ambientState.getDraggedViews().contains(child);
|
||||
if ((dismissAllInProgress && canChildBeDismissed(child))) {
|
||||
previousNotificationIsSwiped = true;
|
||||
} else {
|
||||
previousNotificationIsSwiped = ambientState.getDraggedViews().contains(child);
|
||||
previousNotificationEnd = newNotificationEnd;
|
||||
previousNotificationStart = newYTranslation + state.clipTopAmount * state.scale;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean canChildBeDismissed(View v) {
|
||||
final View veto = v.findViewById(R.id.veto);
|
||||
return (veto != null && veto.getVisibility() != View.GONE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the shadow outline and the clipping for a view.
|
||||
*
|
||||
|
Reference in New Issue
Block a user