Merge "Made the dismissal of notifications snappier" into nyc-dev

am: 910f69e0bb

* commit '910f69e0bb7fc9a6ef880f27fe99ad3a7abbdf15':
  Made the dismissal of notifications snappier

Change-Id: I1aeede63075c360101e5fb4d327b4945d064a846
This commit is contained in:
Selim Cinek
2016-05-04 23:34:11 +00:00
committed by android-build-merger
5 changed files with 69 additions and 15 deletions

View File

@@ -669,6 +669,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
mRemoved = removed; mRemoved = removed;
} }
public NotificationChildrenContainer getChildrenContainer() {
return mChildrenContainer;
}
public interface ExpansionLogger { public interface ExpansionLogger {
public void logNotificationExpansion(String key, boolean userAction, boolean expanded); public void logNotificationExpansion(String key, boolean userAction, boolean expanded);
} }

View File

@@ -44,6 +44,7 @@ public abstract class ExpandableView extends FrameLayout {
private int mMinClipTopAmount = 0; private int mMinClipTopAmount = 0;
private boolean mClipToActualHeight = true; private boolean mClipToActualHeight = true;
private boolean mChangingPosition = false; private boolean mChangingPosition = false;
private ViewGroup mTransientContainer;
public ExpandableView(Context context, AttributeSet attrs) { public ExpandableView(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
@@ -416,6 +417,14 @@ public abstract class ExpandableView extends FrameLayout {
return mChangingPosition; return mChangingPosition;
} }
public void setTransientContainer(ViewGroup transientContainer) {
mTransientContainer = transientContainer;
}
public ViewGroup getTransientContainer() {
return mTransientContainer;
}
/** /**
* A listener notifying when {@link #getActualHeight} changes. * A listener notifying when {@link #getActualHeight} changes.
*/ */

View File

@@ -1747,7 +1747,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
if (mNotificationData.get(remove.getStatusBarNotification().getKey()) == null) { if (mNotificationData.get(remove.getStatusBarNotification().getKey()) == null) {
// We only want to add an animation if the view is completely removed // We only want to add an animation if the view is completely removed
// otherwise it's just a transfer // otherwise it's just a transfer
mStackScroller.notifyGroupChildRemoved(remove); mStackScroller.notifyGroupChildRemoved(remove,
parent.getChildrenContainer());
} }
} }
} }

View File

@@ -687,6 +687,17 @@ public class NotificationStackScrollLayout extends ViewGroup
} }
public void onChildDismissed(View v) { public void onChildDismissed(View v) {
ExpandableNotificationRow row = (ExpandableNotificationRow) v;
if (!row.isDismissed()) {
handleChildDismissed(v);
}
ViewGroup transientContainer = row.getTransientContainer();
if (transientContainer != null) {
transientContainer.removeTransientView(v);
}
}
private void handleChildDismissed(View v) {
if (mDismissAllInProgress) { if (mDismissAllInProgress) {
return; return;
} }
@@ -2071,7 +2082,7 @@ public class NotificationStackScrollLayout extends ViewGroup
// we only call our internal methods if this is actually a removal and not just a // we only call our internal methods if this is actually a removal and not just a
// notification which becomes a child notification // notification which becomes a child notification
if (!mChildTransferInProgress) { if (!mChildTransferInProgress) {
onViewRemovedInternal(child); onViewRemovedInternal(child, this);
} }
} }
@@ -2083,24 +2094,30 @@ public class NotificationStackScrollLayout extends ViewGroup
} }
} }
private void onViewRemovedInternal(View child) { private void onViewRemovedInternal(View child, ViewGroup transientContainer) {
if (mChangePositionInProgress) { if (mChangePositionInProgress) {
// This is only a position change, don't do anything special // This is only a position change, don't do anything special
return; return;
} }
((ExpandableView) child).setOnHeightChangedListener(null); ExpandableView expandableView = (ExpandableView) child;
expandableView.setOnHeightChangedListener(null);
mCurrentStackScrollState.removeViewStateForView(child); mCurrentStackScrollState.removeViewStateForView(child);
updateScrollStateForRemovedChild((ExpandableView) child); updateScrollStateForRemovedChild(expandableView);
boolean animationGenerated = generateRemoveAnimation(child); boolean animationGenerated = generateRemoveAnimation(child);
if (animationGenerated && !mSwipedOutViews.contains(child)) { if (animationGenerated) {
// Add this view to an overlay in order to ensure that it will still be temporary if (!mSwipedOutViews.contains(child)) {
// drawn when removed getOverlay().add(child);
getOverlay().add(child); } else if (Math.abs(expandableView.getTranslation()) != expandableView.getWidth()) {
transientContainer.addTransientView(child, 0);
expandableView.setTransientContainer(transientContainer);
}
} else {
mSwipedOutViews.remove(child);
} }
updateAnimationState(false, child); updateAnimationState(false, child);
// Make sure the clipRect we might have set is removed // Make sure the clipRect we might have set is removed
((ExpandableView) child).setClipTopOptimization(0); expandableView.setClipTopOptimization(0);
} }
private boolean isChildInGroup(View child) { private boolean isChildInGroup(View child) {
@@ -2277,8 +2294,8 @@ public class NotificationStackScrollLayout extends ViewGroup
} }
} }
public void notifyGroupChildRemoved(View row) { public void notifyGroupChildRemoved(View row, ViewGroup childrenContainer) {
onViewRemovedInternal(row); onViewRemovedInternal(row, childrenContainer);
} }
public void notifyGroupChildAdded(View row) { public void notifyGroupChildAdded(View row) {
@@ -2485,8 +2502,8 @@ public class NotificationStackScrollLayout extends ViewGroup
// we need to know the view after this one // we need to know the view after this one
event.viewAfterChangingView = getFirstChildBelowTranlsationY(child.getTranslationY()); event.viewAfterChangingView = getFirstChildBelowTranlsationY(child.getTranslationY());
mAnimationEvents.add(event); mAnimationEvents.add(event);
mSwipedOutViews.remove(child);
} }
mSwipedOutViews.clear();
mChildrenToRemoveAnimated.clear(); mChildrenToRemoveAnimated.clear();
} }
@@ -2764,11 +2781,25 @@ public class NotificationStackScrollLayout extends ViewGroup
mOwnScrollY = 0; mOwnScrollY = 0;
mPhoneStatusBar.resetUserExpandedStates(); mPhoneStatusBar.resetUserExpandedStates();
// lets make sure nothing is in the overlay anymore // lets make sure nothing is in the overlay / transient anymore
clearTransientViews(this);
for (int i = 0; i < getChildCount(); i++) {
ExpandableView child = (ExpandableView) getChildAt(i);
if (child instanceof ExpandableNotificationRow) {
ExpandableNotificationRow row = (ExpandableNotificationRow) child;
clearTransientViews(row.getChildrenContainer());
}
}
getOverlay().clear(); getOverlay().clear();
} }
} }
private void clearTransientViews(ViewGroup viewGroup) {
while (viewGroup != null && viewGroup.getTransientViewCount() != 0) {
viewGroup.removeTransientView(getTransientView(0));
}
}
public void onPanelTrackingStarted() { public void onPanelTrackingStarted() {
mPanelTracking = true; mPanelTracking = true;
} }
@@ -3591,6 +3622,11 @@ public class NotificationStackScrollLayout extends ViewGroup
public void dismissChild(final View view, float velocity, public void dismissChild(final View view, float velocity,
boolean useAccelerateInterpolator) { boolean useAccelerateInterpolator) {
super.dismissChild(view, velocity, useAccelerateInterpolator); super.dismissChild(view, velocity, useAccelerateInterpolator);
if (mIsExpanded) {
// We don't want to quick-dismiss when it's a heads up as this might lead to closing
// of the panel early.
handleChildDismissed(view);
}
handleGearCoveredOrDismissed(); handleGearCoveredOrDismissed();
} }

View File

@@ -865,8 +865,12 @@ public class StackStateAnimator {
} else if (event.animationType == } else if (event.animationType ==
NotificationStackScrollLayout.AnimationEvent.ANIMATION_TYPE_REMOVE_SWIPED_OUT) { NotificationStackScrollLayout.AnimationEvent.ANIMATION_TYPE_REMOVE_SWIPED_OUT) {
// A race condition can trigger the view to be added to the overlay even though // A race condition can trigger the view to be added to the overlay even though
// it is swiped out. So let's remove it // it was fully swiped out. So let's remove it
mHostLayout.getOverlay().remove(changingView); mHostLayout.getOverlay().remove(changingView);
if (Math.abs(changingView.getTranslation()) == changingView.getWidth()
&& changingView.getTransientContainer() != null) {
changingView.getTransientContainer().removeTransientView(changingView);
}
} else if (event.animationType == NotificationStackScrollLayout } else if (event.animationType == NotificationStackScrollLayout
.AnimationEvent.ANIMATION_TYPE_GROUP_EXPANSION_CHANGED) { .AnimationEvent.ANIMATION_TYPE_GROUP_EXPANSION_CHANGED) {
ExpandableNotificationRow row = (ExpandableNotificationRow) event.changingView; ExpandableNotificationRow row = (ExpandableNotificationRow) event.changingView;