OSDN Git Service

Fix wrong transition when dock minimized and docked app launched
authorJorim Jaggi <jjaggi@google.com>
Fri, 15 Apr 2016 05:02:39 +0000 (22:02 -0700)
committerJorim Jaggi <jjaggi@google.com>
Fri, 15 Apr 2016 19:23:05 +0000 (19:23 +0000)
When having an app docked and then going home, and then launching
the app from the homescreen, we had a wrong transition because
getTopMost task was already set to the launched app, because
getRunningTasks doesn't exclude the docked stack. Instead of adding
flags for getRunningTasks, which sounds risky, we just pass a "force"
value when we launch recents in this state.

Bug: 27154882
Change-Id: Iee4512fed13115dbbe8b74413ff1fa9b87afa0ef

15 files changed:
core/java/android/view/WindowManagerPolicy.java
core/java/com/android/internal/statusbar/IStatusBar.aidl
core/java/com/android/internal/statusbar/IStatusBarService.aidl
packages/SystemUI/src/com/android/systemui/RecentsComponent.java
packages/SystemUI/src/com/android/systemui/recents/IRecentsNonSystemUserCallbacks.aidl
packages/SystemUI/src/com/android/systemui/recents/Recents.java
packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
packages/SystemUI/src/com/android/systemui/recents/RecentsImplProxy.java
packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
services/core/java/com/android/server/am/ActivityStackSupervisor.java
services/core/java/com/android/server/am/ActivityStarter.java
services/core/java/com/android/server/policy/PhoneWindowManager.java
services/core/java/com/android/server/statusbar/StatusBarManagerService.java
services/core/java/com/android/server/wm/WindowManagerService.java

index 96f179b..187c8af 100644 (file)
@@ -1304,7 +1304,7 @@ public interface WindowManagerPolicy {
      * Show the recents task list app.
      * @hide
      */
-    public void showRecentApps();
+    public void showRecentApps(boolean fromHome);
 
     /**
      * Show the global actions dialog.
index 36e21b9..fcf65f2 100644 (file)
@@ -57,7 +57,7 @@ oneway interface IStatusBar
     void notificationLightOff();
     void notificationLightPulse(int argb, int millisOn, int millisOff);
 
-    void showRecentApps(boolean triggeredFromAltTab);
+    void showRecentApps(boolean triggeredFromAltTab, boolean fromHome);
     void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey);
     void toggleRecentApps();
     void toggleSplitScreen();
index ee3f937..994bdeb 100644 (file)
@@ -65,7 +65,7 @@ interface IStatusBarService
     void setSystemUiVisibility(int vis, int mask, String cause);
     void setWindowState(int window, int state);
 
-    void showRecentApps(boolean triggeredFromAltTab);
+    void showRecentApps(boolean triggeredFromAltTab, boolean fromHome);
     void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey);
     void toggleRecentApps();
     void preloadRecentApps();
index 73b9d02..eaafafa 100644 (file)
@@ -21,7 +21,7 @@ import android.view.Display;
 import android.view.View;
 
 public interface RecentsComponent {
-    void showRecents(boolean triggeredFromAltTab, View statusBarView);
+    void showRecents(boolean triggeredFromAltTab, boolean fromHome, View statusBarView);
     void hideRecents(boolean triggeredFromAltTab, boolean triggeredFromHomeKey);
     void toggleRecents(Display display, int layoutDirection, View statusBarView);
     void preloadRecents();
index 37085c7..7ce9384 100644 (file)
@@ -27,7 +27,7 @@ oneway interface IRecentsNonSystemUserCallbacks {
     void preloadRecents();
     void cancelPreloadingRecents();
     void showRecents(boolean triggeredFromAltTab, boolean draggingInRecents, boolean animate,
-            boolean reloadTasks);
+            boolean reloadTasks, boolean fromHome);
     void hideRecents(boolean triggeredFromAltTab, boolean triggeredFromHomeKey);
     void toggleRecents();
     void onConfigurationChanged();
index a227e1d..bb709c5 100644 (file)
@@ -238,7 +238,7 @@ public class Recents extends SystemUI
      * Shows the Recents.
      */
     @Override
-    public void showRecents(boolean triggeredFromAltTab, View statusBarView) {
+    public void showRecents(boolean triggeredFromAltTab, boolean fromHome, View statusBarView) {
         // Ensure the device has been provisioned before allowing the user to interact with
         // recents
         if (!isUserSetup()) {
@@ -252,7 +252,7 @@ public class Recents extends SystemUI
         int currentUser = sSystemServicesProxy.getCurrentUser();
         if (sSystemServicesProxy.isSystemUser(currentUser)) {
             mImpl.showRecents(triggeredFromAltTab, false /* draggingInRecents */,
-                    true /* animate */, false /* reloadTasks */);
+                    true /* animate */, false /* reloadTasks */, fromHome);
         } else {
             if (mSystemToUserCallbacks != null) {
                 IRecentsNonSystemUserCallbacks callbacks =
@@ -260,7 +260,7 @@ public class Recents extends SystemUI
                 if (callbacks != null) {
                     try {
                         callbacks.showRecents(triggeredFromAltTab, false /* draggingInRecents */,
-                                true /* animate */, false /* reloadTasks */);
+                                true /* animate */, false /* reloadTasks */, fromHome);
                     } catch (RemoteException e) {
                         Log.e(TAG, "Callback failed", e);
                     }
index 618a2e2..0413bc9 100644 (file)
@@ -156,7 +156,7 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
             // When this fires, then the user has not released alt-tab for at least
             // FAST_ALT_TAB_DELAY_MS milliseconds
             showRecents(mTriggeredFromAltTab, false /* draggingInRecents */, true /* animate */,
-                    false /* reloadTasks */);
+                    false /* reloadTasks */, false /* fromHome */);
         }
     });
 
@@ -230,7 +230,7 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
     }
 
     public void showRecents(boolean triggeredFromAltTab, boolean draggingInRecents,
-            boolean animate, boolean launchedWhileDockingTask) {
+            boolean animate, boolean launchedWhileDockingTask, boolean fromHome) {
         mTriggeredFromAltTab = triggeredFromAltTab;
         mDraggingInRecents = draggingInRecents;
         mLaunchedWhileDocking = launchedWhileDockingTask;
@@ -260,7 +260,7 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
             ActivityManager.RunningTaskInfo topTask = ssp.getTopMostTask();
             MutableBoolean isTopTaskHome = new MutableBoolean(true);
             if (topTask == null || !ssp.isRecentsTopMost(topTask, isTopTaskHome)) {
-                startRecentsActivity(topTask, isTopTaskHome.value, animate);
+                startRecentsActivity(topTask, isTopTaskHome.value || fromHome, animate);
             }
         } catch (ActivityNotFoundException e) {
             Log.e(TAG, "Failed to launch RecentsActivity", e);
@@ -534,7 +534,8 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
                     false /* triggeredFromAltTab */,
                     dragMode == NavigationBarGestureHelper.DRAG_MODE_RECENTS,
                     false /* animate */,
-                    true /* launchedWhileDockingTask*/);
+                    true /* launchedWhileDockingTask*/,
+                    false /* fromHome */);
         }
     }
 
index 86ec98a..257bda2 100644 (file)
@@ -57,12 +57,13 @@ public class RecentsImplProxy extends IRecentsNonSystemUserCallbacks.Stub {
 
     @Override
     public void showRecents(boolean triggeredFromAltTab, boolean draggingInRecents, boolean animate,
-            boolean reloadTasks) throws RemoteException {
+            boolean reloadTasks, boolean fromHome) throws RemoteException {
         SomeArgs args = SomeArgs.obtain();
         args.argi1 = triggeredFromAltTab ? 1 : 0;
         args.argi2 = draggingInRecents ? 1 : 0;
         args.argi3 = animate ? 1 : 0;
         args.argi4 = reloadTasks ? 1 : 0;
+        args.argi5 = fromHome ? 1 : 0;
         mHandler.sendMessage(mHandler.obtainMessage(MSG_SHOW_RECENTS, args));
     }
 
@@ -118,7 +119,7 @@ public class RecentsImplProxy extends IRecentsNonSystemUserCallbacks.Stub {
                 case MSG_SHOW_RECENTS:
                     SomeArgs args = (SomeArgs) msg.obj;
                     mImpl.showRecents(args.argi1 != 0, args.argi2 != 0, args.argi3 != 0,
-                            args.argi4 != 0);
+                            args.argi4 != 0, args.argi5 != 0);
                     break;
                 case MSG_HIDE_RECENTS:
                     mImpl.hideRecents(msg.arg1 != 0, msg.arg2 != 0);
index 237ca5e..7c6c641 100644 (file)
@@ -1209,10 +1209,10 @@ public abstract class BaseStatusBar extends SystemUI implements
     }
 
     @Override
-    public void showRecentApps(boolean triggeredFromAltTab) {
+    public void showRecentApps(boolean triggeredFromAltTab, boolean fromHome) {
         int msg = MSG_SHOW_RECENT_APPS;
         mHandler.removeMessages(msg);
-        mHandler.obtainMessage(msg, triggeredFromAltTab ? 1 : 0, 0).sendToTarget();
+        mHandler.obtainMessage(msg, triggeredFromAltTab ? 1 : 0, fromHome ? 1 : 0).sendToTarget();
     }
 
     @Override
@@ -1315,10 +1315,10 @@ public abstract class BaseStatusBar extends SystemUI implements
 
     /** Proxy for RecentsComponent */
 
-    protected void showRecents(boolean triggeredFromAltTab) {
+    protected void showRecents(boolean triggeredFromAltTab, boolean fromHome) {
         if (mRecents != null) {
             sendCloseSystemWindows(SYSTEM_DIALOG_REASON_RECENT_APPS);
-            mRecents.showRecents(triggeredFromAltTab, getStatusBarView());
+            mRecents.showRecents(triggeredFromAltTab, fromHome, getStatusBarView());
         }
     }
 
@@ -1495,7 +1495,7 @@ public abstract class BaseStatusBar extends SystemUI implements
         public void handleMessage(Message m) {
             switch (m.what) {
              case MSG_SHOW_RECENT_APPS:
-                 showRecents(m.arg1 > 0);
+                 showRecents(m.arg1 > 0, m.arg2 != 0);
                  break;
              case MSG_HIDE_RECENT_APPS:
                  hideRecents(m.arg1 > 0, m.arg2 > 0);
index cc8e3bd..f7d13ee 100644 (file)
@@ -103,7 +103,7 @@ public class CommandQueue extends IStatusBar.Stub {
         void topAppWindowChanged(boolean visible);
         void setImeWindowStatus(IBinder token, int vis, int backDisposition,
                 boolean showImeSwitcher);
-        void showRecentApps(boolean triggeredFromAltTab);
+        void showRecentApps(boolean triggeredFromAltTab, boolean fromHome);
         void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey);
         void toggleRecentApps();
         void toggleSplitScreen();
@@ -210,11 +210,11 @@ public class CommandQueue extends IStatusBar.Stub {
         }
     }
 
-    public void showRecentApps(boolean triggeredFromAltTab) {
+    public void showRecentApps(boolean triggeredFromAltTab, boolean fromHome) {
         synchronized (mLock) {
             mHandler.removeMessages(MSG_SHOW_RECENT_APPS);
             mHandler.obtainMessage(MSG_SHOW_RECENT_APPS,
-                    triggeredFromAltTab ? 1 : 0, 0, null).sendToTarget();
+                    triggeredFromAltTab ? 1 : 0, fromHome ? 1 : 0, null).sendToTarget();
         }
     }
 
@@ -421,7 +421,7 @@ public class CommandQueue extends IStatusBar.Stub {
                             msg.getData().getBoolean(SHOW_IME_SWITCHER_KEY, false));
                     break;
                 case MSG_SHOW_RECENT_APPS:
-                    mCallbacks.showRecentApps(msg.arg1 != 0);
+                    mCallbacks.showRecentApps(msg.arg1 != 0, msg.arg2 != 0);
                     break;
                 case MSG_HIDE_RECENT_APPS:
                     mCallbacks.hideRecentApps(msg.arg1 != 0, msg.arg2 != 0);
index ab3a0b3..49f799e 100644 (file)
@@ -615,7 +615,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
     /** Returns true if the focus activity was adjusted to the home stack top activity. */
     boolean moveHomeStackTaskToTop(int homeStackTaskType, String reason) {
         if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) {
-            mWindowManager.showRecentApps();
+            mWindowManager.showRecentApps(false /* fromHome */);
             return false;
         }
 
@@ -636,7 +636,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
         }
 
         if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) {
-            mWindowManager.showRecentApps();
+            mWindowManager.showRecentApps(false /* fromHome */);
             return false;
         }
 
index a96f23a..4075230 100644 (file)
@@ -557,7 +557,7 @@ class ActivityStarter {
                 // recents into docked stack. We don't want the launched activity to be alone in a
                 // docked stack, so we want to immediately launch recents too.
                 if (DEBUG_RECENTS) Slog.d(TAG, "Scheduling recents launch.");
-                mWindowManager.showRecentApps();
+                mWindowManager.showRecentApps(true /* fromHome */);
                 return;
             }
         }
index 8f259db..a70486f 100644 (file)
@@ -733,7 +733,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                     dispatchMediaKeyRepeatWithWakeLock((KeyEvent)msg.obj);
                     break;
                 case MSG_DISPATCH_SHOW_RECENTS:
-                    showRecentApps(false);
+                    showRecentApps(false, msg.arg1 != 0);
                     break;
                 case MSG_DISPATCH_SHOW_GLOBAL_ACTIONS:
                     showGlobalActionsInternal();
@@ -3623,17 +3623,17 @@ public class PhoneWindowManager implements WindowManagerPolicy {
     }
 
     @Override
-    public void showRecentApps() {
+    public void showRecentApps(boolean fromHome) {
         mHandler.removeMessages(MSG_DISPATCH_SHOW_RECENTS);
-        mHandler.sendEmptyMessage(MSG_DISPATCH_SHOW_RECENTS);
+        mHandler.obtainMessage(MSG_DISPATCH_SHOW_RECENTS, fromHome ? 1 : 0, 0).sendToTarget();
     }
 
-    private void showRecentApps(boolean triggeredFromAltTab) {
+    private void showRecentApps(boolean triggeredFromAltTab, boolean fromHome) {
         mPreloadedRecentApps = false; // preloading no longer needs to be canceled
         try {
             IStatusBarService statusbar = getStatusBarService();
             if (statusbar != null) {
-                statusbar.showRecentApps(triggeredFromAltTab);
+                statusbar.showRecentApps(triggeredFromAltTab, fromHome);
             }
         } catch (RemoteException e) {
             Slog.e(TAG, "RemoteException when showing recent apps", e);
index e71bdb8..8356a4e 100644 (file)
@@ -555,10 +555,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub {
     }
 
     @Override
-    public void showRecentApps(boolean triggeredFromAltTab) {
+    public void showRecentApps(boolean triggeredFromAltTab, boolean fromHome) {
         if (mBar != null) {
             try {
-                mBar.showRecentApps(triggeredFromAltTab);
+                mBar.showRecentApps(triggeredFromAltTab, fromHome);
             } catch (RemoteException ex) {}
         }
     }
index a4238c1..2e0c187 100644 (file)
@@ -9819,8 +9819,8 @@ public class WindowManagerService extends IWindowManager.Stub
         mPolicy.lockNow(options);
     }
 
-    public void showRecentApps() {
-        mPolicy.showRecentApps();
+    public void showRecentApps(boolean fromHome) {
+        mPolicy.showRecentApps(fromHome);
     }
 
     @Override