From b52ff2269ba003abb7d8d26c7d428a33d98f4011 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 14 Feb 2019 13:49:36 -0800 Subject: [PATCH] Fixing alt-tab is properly dispatched to the RecentsView Change-Id: I14a5569877bc0e7fe3aa30d3cd1fa74920b3e9db --- .../LauncherActivityControllerHelper.java | 15 +++--- .../LauncherActivityControllerHelper.java | 16 +++---- .../quickstep/ActivityControlHelper.java | 2 +- .../FallbackActivityControllerHelper.java | 2 +- .../quickstep/OverviewCommandHelper.java | 48 +++++++++++++++++-- .../quickstep/TouchInteractionService.java | 2 +- .../launcher3/LauncherStateManager.java | 9 +++- 7 files changed, 70 insertions(+), 24 deletions(-) diff --git a/go/quickstep/src/com/android/quickstep/LauncherActivityControllerHelper.java b/go/quickstep/src/com/android/quickstep/LauncherActivityControllerHelper.java index 35ea9c7911..ac559ba999 100644 --- a/go/quickstep/src/com/android/quickstep/LauncherActivityControllerHelper.java +++ b/go/quickstep/src/com/android/quickstep/LauncherActivityControllerHelper.java @@ -123,18 +123,17 @@ public final class LauncherActivityControllerHelper implements ActivityControlHe } @Override - public boolean switchToRecentsIfVisible(boolean fromRecentsButton) { + public boolean switchToRecentsIfVisible(Runnable onCompleteCallback) { Launcher launcher = getVisibleLauncher(); if (launcher == null) { return false; } - if (fromRecentsButton) { - launcher.getUserEventDispatcher().logActionCommand( - LauncherLogProto.Action.Command.RECENTS_BUTTON, - getContainerType(), - LauncherLogProto.ContainerType.TASKSWITCHER); - } - launcher.getStateManager().goToState(OVERVIEW); + launcher.getUserEventDispatcher().logActionCommand( + LauncherLogProto.Action.Command.RECENTS_BUTTON, + getContainerType(), + LauncherLogProto.ContainerType.TASKSWITCHER); + launcher.getStateManager().goToState(OVERVIEW, + launcher.getStateManager().shouldAnimateStateChange(), onCompleteCallback); return true; } diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java index fcd9a2b0e8..43ebbe05d3 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java @@ -329,18 +329,18 @@ public final class LauncherActivityControllerHelper implements ActivityControlHe } @Override - public boolean switchToRecentsIfVisible(boolean fromRecentsButton) { + public boolean switchToRecentsIfVisible(Runnable onCompleteCallback) { Launcher launcher = getVisibleLauncher(); if (launcher == null) { return false; } - if (fromRecentsButton) { - launcher.getUserEventDispatcher().logActionCommand( - LauncherLogProto.Action.Command.RECENTS_BUTTON, - getContainerType(), - LauncherLogProto.ContainerType.TASKSWITCHER); - } - launcher.getStateManager().goToState(OVERVIEW); + + launcher.getUserEventDispatcher().logActionCommand( + LauncherLogProto.Action.Command.RECENTS_BUTTON, + getContainerType(), + LauncherLogProto.ContainerType.TASKSWITCHER); + launcher.getStateManager().goToState(OVERVIEW, + launcher.getStateManager().shouldAnimateStateChange(), onCompleteCallback); return true; } diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index 65e71a63ba..0bcc154dfa 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -79,7 +79,7 @@ public interface ActivityControlHelper { T getVisibleRecentsView(); @UiThread - boolean switchToRecentsIfVisible(boolean fromRecentsButton); + boolean switchToRecentsIfVisible(Runnable onCompleteCallback); Rect getOverviewWindowBounds(Rect homeBounds, RemoteAnimationTargetCompat target); diff --git a/quickstep/src/com/android/quickstep/FallbackActivityControllerHelper.java b/quickstep/src/com/android/quickstep/FallbackActivityControllerHelper.java index a914da996a..b655d1d7d4 100644 --- a/quickstep/src/com/android/quickstep/FallbackActivityControllerHelper.java +++ b/quickstep/src/com/android/quickstep/FallbackActivityControllerHelper.java @@ -194,7 +194,7 @@ public final class FallbackActivityControllerHelper implements } @Override - public boolean switchToRecentsIfVisible(boolean fromRecentsButton) { + public boolean switchToRecentsIfVisible(Runnable onCompleteCallback) { return false; } diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java index 6d2008e482..6533c63efa 100644 --- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java +++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java @@ -18,6 +18,8 @@ package com.android.quickstep; import static com.android.systemui.shared.system.ActivityManagerWrapper .CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.annotation.TargetApi; import android.content.Context; @@ -68,8 +70,8 @@ public class OverviewCommandHelper { mMainThreadExecutor.execute(new RecentsActivityCommand<>()); } - public void onOverviewShown() { - mMainThreadExecutor.execute(new ShowRecentsCommand()); + public void onOverviewShown(boolean triggeredFromAltTab) { + mMainThreadExecutor.execute(new ShowRecentsCommand(triggeredFromAltTab)); } public void onOverviewHidden() { @@ -83,11 +85,40 @@ public class OverviewCommandHelper { private class ShowRecentsCommand extends RecentsActivityCommand { + private final boolean mTriggeredFromAltTab; + + ShowRecentsCommand(boolean triggeredFromAltTab) { + mTriggeredFromAltTab = triggeredFromAltTab; + } + @Override protected boolean handleCommand(long elapsedTime) { // TODO: Go to the next page if started from alt-tab. return mHelper.getVisibleRecentsView() != null; } + + @Override + protected void onTransitionComplete() { + if (mTriggeredFromAltTab) { + RecentsView rv = (RecentsView) mHelper.getVisibleRecentsView(); + if (rv == null) { + return; + } + + // Ensure that recents view has focus so that it receives the followup key inputs + TaskView taskView = rv.getNextTaskView(); + if (taskView == null) { + if (rv.getTaskViewCount() > 0) { + taskView = (TaskView) rv.getPageAt(0); + taskView.requestFocus(); + } else { + rv.requestFocus(); + } + } else { + taskView.requestFocus(); + } + } + } } private class HideRecentsCommand extends RecentsActivityCommand { @@ -138,7 +169,7 @@ public class OverviewCommandHelper { return; } - if (mHelper.switchToRecentsIfVisible(true)) { + if (mHelper.switchToRecentsIfVisible(this::onTransitionComplete)) { // If successfully switched, then return return; } @@ -186,7 +217,16 @@ public class OverviewCommandHelper { mListener.unregister(); - return mAnimationProvider.createWindowAnimation(targetCompats); + AnimatorSet animatorSet = mAnimationProvider.createWindowAnimation(targetCompats); + animatorSet.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + onTransitionComplete(); + } + }); + return animatorSet; } + + protected void onTransitionComplete() { } } } diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 9f0ee49103..74ac1c63be 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -86,7 +86,7 @@ public class TouchInteractionService extends Service { @Override public void onOverviewShown(boolean triggeredFromAltTab) { - mOverviewCommandHelper.onOverviewShown(); + mOverviewCommandHelper.onOverviewShown(triggeredFromAltTab); } @Override diff --git a/src/com/android/launcher3/LauncherStateManager.java b/src/com/android/launcher3/LauncherStateManager.java index df8ac992fc..a877141f40 100644 --- a/src/com/android/launcher3/LauncherStateManager.java +++ b/src/com/android/launcher3/LauncherStateManager.java @@ -146,11 +146,18 @@ public class LauncherStateManager { mListeners.remove(listener); } + /** + * Returns true if the state changes should be animated. + */ + public boolean shouldAnimateStateChange() { + return !mLauncher.isForceInvisible() && mLauncher.isStarted(); + } + /** * @see #goToState(LauncherState, boolean, Runnable) */ public void goToState(LauncherState state) { - goToState(state, !mLauncher.isForceInvisible() && mLauncher.isStarted() /* animated */); + goToState(state, shouldAnimateStateChange()); } /**