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:
@@ -669,6 +669,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
|
||||
mRemoved = removed;
|
||||
}
|
||||
|
||||
public NotificationChildrenContainer getChildrenContainer() {
|
||||
return mChildrenContainer;
|
||||
}
|
||||
|
||||
public interface ExpansionLogger {
|
||||
public void logNotificationExpansion(String key, boolean userAction, boolean expanded);
|
||||
}
|
||||
|
||||
@@ -44,6 +44,7 @@ public abstract class ExpandableView extends FrameLayout {
|
||||
private int mMinClipTopAmount = 0;
|
||||
private boolean mClipToActualHeight = true;
|
||||
private boolean mChangingPosition = false;
|
||||
private ViewGroup mTransientContainer;
|
||||
|
||||
public ExpandableView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
@@ -416,6 +417,14 @@ public abstract class ExpandableView extends FrameLayout {
|
||||
return mChangingPosition;
|
||||
}
|
||||
|
||||
public void setTransientContainer(ViewGroup transientContainer) {
|
||||
mTransientContainer = transientContainer;
|
||||
}
|
||||
|
||||
public ViewGroup getTransientContainer() {
|
||||
return mTransientContainer;
|
||||
}
|
||||
|
||||
/**
|
||||
* A listener notifying when {@link #getActualHeight} changes.
|
||||
*/
|
||||
|
||||
@@ -1747,7 +1747,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
|
||||
if (mNotificationData.get(remove.getStatusBarNotification().getKey()) == null) {
|
||||
// We only want to add an animation if the view is completely removed
|
||||
// otherwise it's just a transfer
|
||||
mStackScroller.notifyGroupChildRemoved(remove);
|
||||
mStackScroller.notifyGroupChildRemoved(remove,
|
||||
parent.getChildrenContainer());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -687,6 +687,17 @@ public class NotificationStackScrollLayout extends ViewGroup
|
||||
}
|
||||
|
||||
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) {
|
||||
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
|
||||
// notification which becomes a child notification
|
||||
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) {
|
||||
// This is only a position change, don't do anything special
|
||||
return;
|
||||
}
|
||||
((ExpandableView) child).setOnHeightChangedListener(null);
|
||||
ExpandableView expandableView = (ExpandableView) child;
|
||||
expandableView.setOnHeightChangedListener(null);
|
||||
mCurrentStackScrollState.removeViewStateForView(child);
|
||||
updateScrollStateForRemovedChild((ExpandableView) child);
|
||||
updateScrollStateForRemovedChild(expandableView);
|
||||
boolean animationGenerated = generateRemoveAnimation(child);
|
||||
if (animationGenerated && !mSwipedOutViews.contains(child)) {
|
||||
// Add this view to an overlay in order to ensure that it will still be temporary
|
||||
// drawn when removed
|
||||
getOverlay().add(child);
|
||||
if (animationGenerated) {
|
||||
if (!mSwipedOutViews.contains(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);
|
||||
|
||||
// Make sure the clipRect we might have set is removed
|
||||
((ExpandableView) child).setClipTopOptimization(0);
|
||||
expandableView.setClipTopOptimization(0);
|
||||
}
|
||||
|
||||
private boolean isChildInGroup(View child) {
|
||||
@@ -2277,8 +2294,8 @@ public class NotificationStackScrollLayout extends ViewGroup
|
||||
}
|
||||
}
|
||||
|
||||
public void notifyGroupChildRemoved(View row) {
|
||||
onViewRemovedInternal(row);
|
||||
public void notifyGroupChildRemoved(View row, ViewGroup childrenContainer) {
|
||||
onViewRemovedInternal(row, childrenContainer);
|
||||
}
|
||||
|
||||
public void notifyGroupChildAdded(View row) {
|
||||
@@ -2485,8 +2502,8 @@ public class NotificationStackScrollLayout extends ViewGroup
|
||||
// we need to know the view after this one
|
||||
event.viewAfterChangingView = getFirstChildBelowTranlsationY(child.getTranslationY());
|
||||
mAnimationEvents.add(event);
|
||||
mSwipedOutViews.remove(child);
|
||||
}
|
||||
mSwipedOutViews.clear();
|
||||
mChildrenToRemoveAnimated.clear();
|
||||
}
|
||||
|
||||
@@ -2764,11 +2781,25 @@ public class NotificationStackScrollLayout extends ViewGroup
|
||||
mOwnScrollY = 0;
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
private void clearTransientViews(ViewGroup viewGroup) {
|
||||
while (viewGroup != null && viewGroup.getTransientViewCount() != 0) {
|
||||
viewGroup.removeTransientView(getTransientView(0));
|
||||
}
|
||||
}
|
||||
|
||||
public void onPanelTrackingStarted() {
|
||||
mPanelTracking = true;
|
||||
}
|
||||
@@ -3591,6 +3622,11 @@ public class NotificationStackScrollLayout extends ViewGroup
|
||||
public void dismissChild(final View view, float velocity,
|
||||
boolean 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();
|
||||
}
|
||||
|
||||
|
||||
@@ -865,8 +865,12 @@ public class StackStateAnimator {
|
||||
} else if (event.animationType ==
|
||||
NotificationStackScrollLayout.AnimationEvent.ANIMATION_TYPE_REMOVE_SWIPED_OUT) {
|
||||
// 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);
|
||||
if (Math.abs(changingView.getTranslation()) == changingView.getWidth()
|
||||
&& changingView.getTransientContainer() != null) {
|
||||
changingView.getTransientContainer().removeTransientView(changingView);
|
||||
}
|
||||
} else if (event.animationType == NotificationStackScrollLayout
|
||||
.AnimationEvent.ANIMATION_TYPE_GROUP_EXPANSION_CHANGED) {
|
||||
ExpandableNotificationRow row = (ExpandableNotificationRow) event.changingView;
|
||||
|
||||
Reference in New Issue
Block a user