Merge "Workaround to ensure we cancel the recents animation prior to starting home" into pi-dev

This commit is contained in:
Winson Chung
2018-04-20 01:54:09 +00:00
committed by Android (Google) Code Review
6 changed files with 28 additions and 17 deletions

View File

@@ -376,6 +376,11 @@ public abstract class ActivityManagerInternal {
*/
public abstract boolean isRecentsComponentHomeActivity(int userId);
/**
* Cancels any currently running recents animation.
*/
public abstract void cancelRecentsAnimation(boolean restoreHomeStackPosition);
/**
* Whether an UID is active or idle.
*/

View File

@@ -269,13 +269,6 @@ public class KeyButtonView extends ImageView implements ButtonInterface {
}
if (mCode != 0) {
if (doIt) {
// If there was a pending remote recents animation, then we need to
// cancel the animation now before we handle the button itself. In the case
// where we are going home and the recents animation has already started,
// just cancel the recents animation, leaving the home stack in place
boolean isHomeKey = mCode == KEYCODE_HOME;
ActivityManagerWrapper.getInstance().cancelRecentsAnimation(!isHomeKey);
sendEvent(KeyEvent.ACTION_UP, 0);
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
} else {

View File

@@ -26632,6 +26632,11 @@ public class ActivityManagerService extends IActivityManager.Stub
return getRecentTasks().isRecentsComponentHomeActivity(userId);
}
@Override
public void cancelRecentsAnimation(boolean restoreHomeStackPosition) {
ActivityManagerService.this.cancelRecentsAnimation(restoreHomeStackPosition);
}
@Override
public boolean isUidActive(int uid) {
synchronized (ActivityManagerService.this) {

View File

@@ -6091,6 +6091,14 @@ public class PhoneWindowManager implements WindowManagerPolicy {
&& (!isNavBarVirtKey || mNavBarVirtualKeyHapticFeedbackEnabled)
&& event.getRepeatCount() == 0;
// Cancel any pending remote recents animations before handling the button itself. In the
// case where we are going home and the recents animation has already started, just cancel
// the recents animation, leaving the home stack in place for the pending start activity
if (isNavBarVirtKey && !down) {
boolean isHomeKey = keyCode == KeyEvent.KEYCODE_HOME;
mActivityManagerInternal.cancelRecentsAnimation(!isHomeKey);
}
// Handle special keys.
switch (keyCode) {
case KeyEvent.KEYCODE_BACK: {

View File

@@ -369,7 +369,7 @@ public class RecentsAnimationController implements DeathRecipient {
}
void cancelAnimation(@ReorderMode int reorderMode, String reason) {
if (DEBUG_RECENTS_ANIMATIONS) Slog.d(TAG, "cancelAnimation()");
if (DEBUG_RECENTS_ANIMATIONS) Slog.d(TAG, "cancelAnimation(): reason=" + reason);
synchronized (mService.getWindowManagerLock()) {
if (mCanceled) {
// We've already canceled the animation

View File

@@ -83,7 +83,8 @@ class RemoteAnimationController implements DeathRecipient {
*/
AnimationAdapter createAnimationAdapter(AppWindowToken appWindowToken, Point position,
Rect stackBounds) {
if (DEBUG_REMOTE_ANIMATIONS) Slog.d(TAG, "createAnimationAdapter(): token=" + appWindowToken);
if (DEBUG_REMOTE_ANIMATIONS) Slog.d(TAG, "createAnimationAdapter(): token="
+ appWindowToken);
final RemoteAnimationAdapterWrapper adapter = new RemoteAnimationAdapterWrapper(
appWindowToken, position, stackBounds);
mPendingAnimations.add(adapter);
@@ -96,8 +97,9 @@ class RemoteAnimationController implements DeathRecipient {
void goodToGo() {
if (DEBUG_REMOTE_ANIMATIONS) Slog.d(TAG, "goodToGo()");
if (mPendingAnimations.isEmpty() || mCanceled) {
if (DEBUG_REMOTE_ANIMATIONS) Slog.d(TAG, "goodToGo(): Animation finished before good to go, canceled="
+ mCanceled + " mPendingAnimations=" + mPendingAnimations.size());
if (DEBUG_REMOTE_ANIMATIONS) Slog.d(TAG, "goodToGo(): Animation finished already,"
+ " canceled=" + mCanceled
+ " mPendingAnimations=" + mPendingAnimations.size());
onAnimationFinished();
return;
}
@@ -123,10 +125,6 @@ class RemoteAnimationController implements DeathRecipient {
}
if (DEBUG_REMOTE_ANIMATIONS) {
Slog.d(TAG, "startAnimation(): Notify animation start:");
for (int i = 0; i < mPendingAnimations.size(); i++) {
Slog.d(TAG, "\t" + mPendingAnimations.get(i).mAppWindowToken);
}
} else if (DEBUG_APP_TRANSITIONS) {
writeStartDebugStatement();
}
});
@@ -166,7 +164,8 @@ class RemoteAnimationController implements DeathRecipient {
if (DEBUG_REMOTE_ANIMATIONS) Slog.d(TAG, "\tAdd token=" + wrapper.mAppWindowToken);
targets.add(target);
} else {
if (DEBUG_REMOTE_ANIMATIONS) Slog.d(TAG, "\tRemove token=" + wrapper.mAppWindowToken);
if (DEBUG_REMOTE_ANIMATIONS) Slog.d(TAG, "\tRemove token="
+ wrapper.mAppWindowToken);
// We can't really start an animation but we still need to make sure to finish the
// pending animation that was started by SurfaceAnimator
@@ -188,7 +187,8 @@ class RemoteAnimationController implements DeathRecipient {
releaseFinishedCallback();
mService.openSurfaceTransaction();
try {
if (DEBUG_REMOTE_ANIMATIONS) Slog.d(TAG, "onAnimationFinished(): Notify animation finished:");
if (DEBUG_REMOTE_ANIMATIONS) Slog.d(TAG,
"onAnimationFinished(): Notify animation finished:");
for (int i = mPendingAnimations.size() - 1; i >= 0; i--) {
final RemoteAnimationAdapterWrapper adapter = mPendingAnimations.get(i);
adapter.mCapturedFinishCallback.onAnimationFinished(adapter);