Call close for AbstractFloatingViews that were removed while still open.

I'm not sure how/when this case occurs (perhaps during some transition/state
change), but manually removing the floating view matches the symptoms in the
bug.

Bug: 72996404
Change-Id: I1e7c1a338fcd16c8e07b3c49fb9c9b2097eb2708
This commit is contained in:
Jon Miranda
2018-04-24 12:21:28 -07:00
parent 6aef85c417
commit 83337f9e8e
8 changed files with 33 additions and 22 deletions

View File

@@ -15,6 +15,7 @@
*/
package com.android.launcher3;
import static com.android.launcher3.Utilities.SINGLE_FRAME_MS;
import static com.android.launcher3.Utilities.postAsyncCallback;
import android.animation.Animator;
@@ -32,8 +33,6 @@ import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
@TargetApi(Build.VERSION_CODES.P)
public abstract class LauncherAnimationRunner implements RemoteAnimationRunnerCompat {
private static final int REFRESH_RATE_MS = 16;
private final Handler mHandler;
private AnimationResult mAnimationResult;
@@ -120,7 +119,7 @@ public abstract class LauncherAnimationRunner implements RemoteAnimationRunnerCo
// Because t=0 has the app icon in its original spot, we can skip the
// first frame and have the same movement one frame earlier.
mAnimator.setCurrentPlayTime(REFRESH_RATE_MS);
mAnimator.setCurrentPlayTime(SINGLE_FRAME_MS);
}
}
}

View File

@@ -15,6 +15,7 @@
*/
package com.android.launcher3.uioverrides;
import static com.android.launcher3.Utilities.SINGLE_FRAME_MS;
import static com.android.launcher3.anim.Interpolators.scrollInterpolatorForVelocity;
import android.animation.Animator;
@@ -46,7 +47,6 @@ public abstract class TaskViewTouchController<T extends BaseDraggingActivity>
private static final String TAG = "OverviewSwipeController";
private static final float ALLOWED_FLING_DIRECTION_CHANGE_PROGRESS = 0.1f;
private static final int SINGLE_FRAME_MS = 16;
// Progress after which the transition is assumed to be a success in case user does not fling
private static final float SUCCESS_TRANSITION_PROGRESS = 0.5f;

View File

@@ -97,6 +97,7 @@ public abstract class AbstractFloatingView extends LinearLayout implements Touch
handleClose(animate);
BaseActivity.fromContext(getContext()).getUserEventDispatcher()
.resetElapsedContainerMillis("container closed");
mIsOpen = false;
}
protected abstract void handleClose(boolean animate);

View File

@@ -24,7 +24,8 @@ import android.view.View;
import android.view.ViewPropertyAnimator;
import android.view.ViewTreeObserver;
import com.android.launcher3.util.Thunk;
import com.android.launcher3.util.TraceHelper;
import static com.android.launcher3.Utilities.SINGLE_FRAME_MS;
/*
* This is a helper class that listens to updates from the corresponding animation.
@@ -36,7 +37,6 @@ public class FirstFrameAnimatorHelper extends AnimatorListenerAdapter
private static final String TAG = "FirstFrameAnimatorHlpr";
private static final boolean DEBUG = false;
private static final int MAX_DELAY = 1000;
private static final int IDEAL_FRAME_DURATION = 16;
private final View mTarget;
private long mStartFrame;
private long mStartTime = -1;
@@ -109,9 +109,9 @@ public class FirstFrameAnimatorHelper extends AnimatorListenerAdapter
// prevents a large jump in the animation due to an expensive first frame
} else if (frameNum == 1 && currentTime < mStartTime + MAX_DELAY &&
!mAdjustedSecondFrameTime &&
currentTime > mStartTime + IDEAL_FRAME_DURATION &&
currentPlayTime > IDEAL_FRAME_DURATION) {
animation.setCurrentPlayTime(IDEAL_FRAME_DURATION);
currentTime > mStartTime + SINGLE_FRAME_MS &&
currentPlayTime > SINGLE_FRAME_MS) {
animation.setCurrentPlayTime(SINGLE_FRAME_MS);
mAdjustedSecondFrameTime = true;
} else {
if (frameNum > 1) {

View File

@@ -103,6 +103,8 @@ public final class Utilities {
public static final boolean ATLEAST_LOLLIPOP_MR1 =
Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1;
public static final int SINGLE_FRAME_MS = 16;
/**
* Indicates if the device has a debug build. Should only be used to store additional info or
* add extra logging and not for changing the app behavior.

View File

@@ -39,6 +39,7 @@ import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewDebug;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.view.animation.AnimationUtils;
import android.view.inputmethod.EditorInfo;
@@ -507,16 +508,9 @@ public class Folder extends AbstractFloatingView implements DragSource,
// dropping. One resulting issue is that replaceFolderWithFinalItem() can be called twice.
mDeleteFolderOnDropCompleted = false;
final Runnable onCompleteRunnable;
centerAboutIcon();
AnimatorSet anim = new FolderAnimationManager(this, true /* isOpening */).getAnimator();
onCompleteRunnable = new Runnable() {
@Override
public void run() {
mLauncher.getUserEventDispatcher().resetElapsedContainerMillis("folder opened");
}
};
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
@@ -532,7 +526,7 @@ public class Folder extends AbstractFloatingView implements DragSource,
public void onAnimationEnd(Animator animation) {
mState = STATE_OPEN;
onCompleteRunnable.run();
mLauncher.getUserEventDispatcher().resetElapsedContainerMillis("folder opened");
mContent.setFocusOnFirstChild();
}
});
@@ -614,9 +608,6 @@ public class Folder extends AbstractFloatingView implements DragSource,
mFolderIcon.clearLeaveBehindIfExists();
}
if (!(getParent() instanceof DragLayer)) return;
DragLayer parent = (DragLayer) getParent();
if (animate) {
animateClosed();
} else {
@@ -625,7 +616,8 @@ public class Folder extends AbstractFloatingView implements DragSource,
// Notify the accessibility manager that this folder "window" has disappeared and no
// longer occludes the workspace items
parent.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
mLauncher.getDragLayer().sendAccessibilityEvent(
AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
}
private void animateClosed() {

View File

@@ -15,6 +15,7 @@
*/
package com.android.launcher3.touch;
import static com.android.launcher3.Utilities.SINGLE_FRAME_MS;
import static com.android.launcher3.anim.Interpolators.scrollInterpolatorForVelocity;
import android.animation.Animator;
@@ -40,7 +41,6 @@ public abstract class AbstractStateChangeTouchController extends AnimatorListene
private static final String TAG = "ASCTouchController";
public static final float RECATCH_REJECTION_FRACTION = .0875f;
public static final int SINGLE_FRAME_MS = 16;
// Progress after which the transition is assumed to be a success in case user does not fling
public static final float SUCCESS_TRANSITION_PROGRESS = 0.5f;

View File

@@ -34,6 +34,8 @@ import com.android.launcher3.util.TouchController;
import java.util.ArrayList;
import static com.android.launcher3.Utilities.SINGLE_FRAME_MS;
/**
* A viewgroup with utility methods for drag-n-drop and touch interception
*/
@@ -118,6 +120,21 @@ public abstract class BaseDragLayer<T extends BaseDraggingActivity> extends Inse
}
}
@Override
public void onViewRemoved(View child) {
super.onViewRemoved(child);
if (child instanceof AbstractFloatingView) {
// Handles the case where the view is removed without being properly closed.
// This can happen if something goes wrong during a state change/transition.
postDelayed(() -> {
AbstractFloatingView floatingView = (AbstractFloatingView) child;
if (floatingView.isOpen()) {
floatingView.close(false);
}
}, SINGLE_FRAME_MS);
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
int action = ev.getAction();