From 194434578b92533a0011efba5817bccedc645239 Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Tue, 9 Oct 2018 12:10:21 +0800 Subject: [PATCH] Move #moveFocusableActivityToTop() to ActivityRecord Bug: 111363427 Test: atest ActivityManagerMultiDisplayTests Change-Id: I34431d1d070b1ae13e570cc02dc6ea98b864c022 --- .../android/server/am/ActivityDisplay.java | 2 +- .../com/android/server/am/ActivityRecord.java | 39 +++++++++++++++++ .../com/android/server/am/ActivityStack.java | 11 +++-- .../server/am/ActivityStackSupervisor.java | 42 ++----------------- .../server/am/ActivityTaskManagerService.java | 6 +-- 5 files changed, 53 insertions(+), 47 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityDisplay.java b/services/core/java/com/android/server/am/ActivityDisplay.java index a648b09abda5a..95a8e2a0aade5 100644 --- a/services/core/java/com/android/server/am/ActivityDisplay.java +++ b/services/core/java/com/android/server/am/ActivityDisplay.java @@ -1087,7 +1087,7 @@ class ActivityDisplay extends ConfigurationContainer if (top == null) { return false; } - mSupervisor.moveFocusableActivityToTop(top, reason); + top.moveFocusableActivityToTop(reason); return true; } diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index fe10baf33354b..6bdceb22d8664 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -84,11 +84,13 @@ import static android.os.Process.SYSTEM_UID; import static android.view.WindowManagerPolicyConstants.NAV_BAR_LEFT; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_CONFIGURATION; +import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FOCUS; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_SAVED_STATE; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_STATES; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_SWITCH; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_VISIBILITY; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CONFIGURATION; +import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_FOCUS; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_SAVED_STATE; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_STATES; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_SWITCH; @@ -215,6 +217,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo private static final String TAG_STATES = TAG + POSTFIX_STATES; private static final String TAG_SWITCH = TAG + POSTFIX_SWITCH; private static final String TAG_VISIBILITY = TAG + POSTFIX_VISIBILITY; + private static final String TAG_FOCUS = TAG + POSTFIX_FOCUS; // TODO(b/67864419): Remove once recents component is overridden private static final String LEGACY_RECENTS_PACKAGE_NAME = "com.android.systemui.recents"; @@ -1348,6 +1351,42 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo return (info.flags & FLAG_ALWAYS_FOCUSABLE) != 0; } + /** Move activity with its stack to front and make the stack focused. */ + boolean moveFocusableActivityToTop(String reason) { + if (!isFocusable()) { + if (DEBUG_FOCUS) { + Slog.d(TAG_FOCUS, "moveActivityStackToFront: unfocusable activity=" + this); + } + return false; + } + + final TaskRecord task = getTask(); + final ActivityStack stack = getStack(); + if (stack == null) { + Slog.w(TAG, "moveActivityStackToFront: invalid task or stack: activity=" + + this + " task=" + task); + return false; + } + + if (mStackSupervisor.getTopResumedActivity() == this) { + if (DEBUG_FOCUS) { + Slog.d(TAG_FOCUS, "moveActivityStackToFront: already on top, activity=" + this); + } + return false; + } + + if (DEBUG_FOCUS) { + Slog.d(TAG_FOCUS, "moveActivityStackToFront: activity=" + this); + } + + stack.moveToFront(reason, task); + // Report top activity change to tracking services and WM + if (mStackSupervisor.getTopResumedActivity() == this) { + // TODO(b/111361570): Support multiple focused apps in WM + service.setResumedActivityUncheckLocked(this, reason); + } + return true; + } /** * @return true if the activity contains windows that have diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index ebfaf0fe9a7e3..bd1b79b8e6ed4 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -163,7 +163,6 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import java.util.Objects; import java.util.Set; @@ -3448,8 +3447,10 @@ class ActivityStack extends ConfigurationContai final String myReason = reason + " adjustFocus"; if (next == r) { - mStackSupervisor.moveFocusableActivityToTop(mStackSupervisor.topRunningActivityLocked(), - myReason); + final ActivityRecord top = mStackSupervisor.topRunningActivityLocked(); + if (top != null) { + top.moveFocusableActivityToTop(myReason); + } return; } @@ -4660,7 +4661,9 @@ class ActivityStack extends ConfigurationContai // Set focus to the top running activity of this stack. final ActivityRecord r = topRunningActivityLocked(); - mStackSupervisor.moveFocusableActivityToTop(r, reason); + if (r != null) { + r.moveFocusableActivityToTop(reason); + } if (DEBUG_TRANSITION) Slog.v(TAG_TRANSITION, "Prepare to front transition: task=" + tr); if (noAnimation) { diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 0477d73301f17..90076b542a9e5 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -53,8 +53,8 @@ import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.INVALID_DISPLAY; import static android.view.Display.TYPE_VIRTUAL; import static android.view.WindowManager.TRANSIT_DOCK_TASK_FROM_RECENTS; + import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FOCUS; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_IDLE; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PAUSE; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_RECENTS; @@ -63,7 +63,6 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_STACK; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_STATES; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_SWITCH; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_TASKS; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_FOCUS; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_IDLE; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_PAUSE; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_RECENTS; @@ -99,6 +98,7 @@ import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_WHITELISTED; import static com.android.server.am.TaskRecord.REPARENT_KEEP_STACK_AT_FRONT; import static com.android.server.am.TaskRecord.REPARENT_LEAVE_STACK_IN_PLACE; import static com.android.server.am.TaskRecord.REPARENT_MOVE_STACK_TO_FRONT; + import static java.lang.Integer.MAX_VALUE; import android.Manifest; @@ -199,7 +199,6 @@ import java.util.Set; public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener, RecentTasks.Callbacks, RootWindowContainerListener { private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStackSupervisor" : TAG_AM; - private static final String TAG_FOCUS = TAG + POSTFIX_FOCUS; private static final String TAG_IDLE = TAG + POSTFIX_IDLE; private static final String TAG_PAUSE = TAG + POSTFIX_PAUSE; private static final String TAG_RECENTS = TAG + POSTFIX_RECENTS; @@ -783,7 +782,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D // Only resume home activity if isn't finishing. if (r != null && !r.finishing) { - moveFocusableActivityToTop(r, myReason); + r.moveFocusableActivityToTop(myReason); return resumeFocusedStacksTopActivitiesLocked(r.getStack(), prev, null); } return mService.startHomeActivityLocked(mCurrentUser, myReason, displayId); @@ -3359,41 +3358,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D mService.getTaskChangeNotificationController().notifyActivityPinned(r); } - /** Move activity with its stack to front and make the stack focused. */ - // TODO(b/111363427): Move this method to ActivityRecord. - boolean moveFocusableActivityToTop(ActivityRecord r, String reason) { - if (r == null || !r.isFocusable()) { - if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, - "moveActivityStackToFront: unfocusable r=" + r); - return false; - } - - final TaskRecord task = r.getTask(); - final ActivityStack stack = r.getStack(); - if (stack == null) { - Slog.w(TAG, "moveActivityStackToFront: invalid task or stack: r=" - + r + " task=" + task); - return false; - } - - if (r == getTopResumedActivity()) { - if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, - "moveActivityStackToFront: already on top, r=" + r); - return false; - } - - if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, - "moveActivityStackToFront: r=" + r); - - stack.moveToFront(reason, task); - // Report top activity change to tracking services and WM - if (r == getTopResumedActivity()) { - // TODO(b/111361570): Support multiple focused apps in WM - mService.setResumedActivityUncheckLocked(r, reason); - } - return true; - } - ActivityRecord findTaskLocked(ActivityRecord r, int preferredDisplayId) { if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Looking for task of " + r); mTmpFindTaskResult.clear(); diff --git a/services/core/java/com/android/server/am/ActivityTaskManagerService.java b/services/core/java/com/android/server/am/ActivityTaskManagerService.java index 8e3eeae5d569b..4dd5a998d433c 100644 --- a/services/core/java/com/android/server/am/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/am/ActivityTaskManagerService.java @@ -1707,7 +1707,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { return; } final ActivityRecord r = stack.topRunningActivityLocked(); - if (mStackSupervisor.moveFocusableActivityToTop(r, "setFocusedStack")) { + if (r != null && r.moveFocusableActivityToTop("setFocusedStack")) { mStackSupervisor.resumeFocusedStacksTopActivitiesLocked(); } } @@ -1728,7 +1728,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { return; } final ActivityRecord r = task.topRunningActivityLocked(); - if (mStackSupervisor.moveFocusableActivityToTop(r, "setFocusedTask")) { + if (r != null && r.moveFocusableActivityToTop("setFocusedTask")) { mStackSupervisor.resumeFocusedStacksTopActivitiesLocked(); } } @@ -5554,7 +5554,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { throw new IllegalArgumentException( "setFocusedActivity: No activity record matching token=" + token); } - if (mStackSupervisor.moveFocusableActivityToTop(r, "setFocusedActivity")) { + if (r.moveFocusableActivityToTop("setFocusedActivity")) { mStackSupervisor.resumeFocusedStacksTopActivitiesLocked(); } }