Fixed that views could be stuck transiently at times

Removed all references to overlay from the stackscroller
and always using transient views now. We were using
the overlay in places where we shouldn't have been and
therefore views could become stuck.

Change-Id: I8bf455e2d1c4d065d0b3c441606d51b3b96eab9f
Fixes: 78493499
Test: add hun, click on it, observe no transient view stuck behind
This commit is contained in:
Selim Cinek
2018-05-14 18:12:42 -07:00
parent 150bafd217
commit 9dd0d04e2f
2 changed files with 14 additions and 30 deletions

View File

@@ -113,7 +113,6 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.function.BiConsumer;
/**
@@ -295,7 +294,7 @@ public class NotificationStackScrollLayout extends ViewGroup
private int[] mTempInt2 = new int[2];
private boolean mGenerateChildOrderChangedEvent;
private HashSet<Runnable> mAnimationFinishedRunnables = new HashSet<>();
private HashSet<View> mClearOverlayViewsWhenFinished = new HashSet<>();
private HashSet<ExpandableView> mClearTransientViewsWhenFinished = new HashSet<>();
private HashSet<Pair<ExpandableNotificationRow, Boolean>> mHeadsUpChangeAnimations
= new HashSet<>();
private HeadsUpManagerPhone mHeadsUpManager;
@@ -2830,8 +2829,8 @@ public class NotificationStackScrollLayout extends ViewGroup
return false;
}
if (isClickedHeadsUp(child)) {
// An animation is already running, add it to the Overlay
mClearOverlayViewsWhenFinished.add(child);
// An animation is already running, add it transiently
mClearTransientViewsWhenFinished.add((ExpandableView) child);
return true;
}
if (mIsExpanded && mAnimationsEnabled && !isChildInInvisibleGroup(child)) {
@@ -3613,7 +3612,7 @@ public class NotificationStackScrollLayout extends ViewGroup
}
private void clearTemporaryViews() {
// lets make sure nothing is in the overlay / transient anymore
// lets make sure nothing is transient anymore
clearTemporaryViewsInGroup(this);
for (int i = 0; i < getChildCount(); i++) {
ExpandableView child = (ExpandableView) getChildAt(i);
@@ -3628,9 +3627,6 @@ public class NotificationStackScrollLayout extends ViewGroup
while (viewGroup != null && viewGroup.getTransientViewCount() != 0) {
viewGroup.removeTransientView(viewGroup.getTransientView(0));
}
if (viewGroup != null) {
viewGroup.getOverlay().clear();
}
}
public void onPanelTrackingStarted() {
@@ -3738,7 +3734,7 @@ public class NotificationStackScrollLayout extends ViewGroup
setAnimationRunning(false);
requestChildrenUpdate();
runAnimationFinishedRunnables();
clearViewOverlays();
clearTransient();
clearHeadsUpDisappearRunning();
}
@@ -3757,11 +3753,11 @@ public class NotificationStackScrollLayout extends ViewGroup
}
}
private void clearViewOverlays() {
for (View view : mClearOverlayViewsWhenFinished) {
StackStateAnimator.removeFromOverlay(view);
private void clearTransient() {
for (ExpandableView view : mClearTransientViewsWhenFinished) {
StackStateAnimator.removeTransientView(view);
}
mClearOverlayViewsWhenFinished.clear();
mClearTransientViewsWhenFinished.clear();
}
private void runAnimationFinishedRunnables() {

View File

@@ -419,9 +419,6 @@ public class StackStateAnimator {
}, null);
} 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 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);
@@ -469,8 +466,9 @@ public class StackStateAnimator {
? ANIMATION_DELAY_HEADS_UP_CLICKED
: 0;
if (changingView.getParent() == null) {
// This notification was actually removed, so we need to add it to the overlay
mHostLayout.getOverlay().add(changingView);
// This notification was actually removed, so we need to add it transiently
mHostLayout.addTransientView(changingView, 0);
changingView.setTransientContainer(mHostLayout);
mTmpState.initFrom(changingView);
mTmpState.yTranslation = 0;
// We temporarily enable Y animations, the real filter will be combined
@@ -479,10 +477,7 @@ public class StackStateAnimator {
mAnimationProperties.delay = extraDelay + ANIMATION_DELAY_HEADS_UP;
mAnimationProperties.duration = ANIMATION_DURATION_HEADS_UP_DISAPPEAR;
mTmpState.animateTo(changingView, mAnimationProperties);
endRunnable = () -> {
// remove the temporary overlay
removeFromOverlay(changingView);
};
endRunnable = () -> removeTransientView(changingView);
}
float targetLocation = 0;
boolean needsAnimation = true;
@@ -517,19 +512,12 @@ public class StackStateAnimator {
}
}
private static void removeTransientView(ExpandableView viewToRemove) {
public static void removeTransientView(ExpandableView viewToRemove) {
if (viewToRemove.getTransientContainer() != null) {
viewToRemove.getTransientContainer().removeTransientView(viewToRemove);
}
}
public static void removeFromOverlay(View changingView) {
ViewGroup parent = (ViewGroup) changingView.getParent();
if (parent != null) {
parent.removeView(changingView);
}
}
public void animateOverScrollToAmount(float targetAmount, final boolean onTop,
final boolean isRubberbanded) {
final float startOverScrollAmount = mHostLayout.getCurrentOverScrollAmount(onTop);