diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json index 6d8020369391e..6706e4e87e0d4 100644 --- a/data/etc/services.core.protolog.json +++ b/data/etc/services.core.protolog.json @@ -2605,6 +2605,12 @@ "group": "WM_DEBUG_STATES", "at": "com\/android\/server\/wm\/TaskFragment.java" }, + "385237117": { + "message": "moveFocusableActivityToTop: already on top and focused, activity=%s", + "level": "DEBUG", + "group": "WM_DEBUG_FOCUS", + "at": "com\/android\/server\/wm\/ActivityRecord.java" + }, "385595355": { "message": "Starting animation on %s: type=%d, anim=%s", "level": "VERBOSE", @@ -3409,6 +3415,12 @@ "group": "WM_DEBUG_BOOT", "at": "com\/android\/server\/wm\/WindowManagerService.java" }, + "1239439010": { + "message": "moveFocusableActivityToTop: set focused, activity=%s", + "level": "DEBUG", + "group": "WM_DEBUG_FOCUS", + "at": "com\/android\/server\/wm\/ActivityRecord.java" + }, "1252594551": { "message": "Window types in WindowContext and LayoutParams.type should match! Type from LayoutParams is %d, but type from WindowContext is %d", "level": "WARN", @@ -3991,12 +4003,6 @@ "group": "WM_DEBUG_STARTING_WINDOW", "at": "com\/android\/server\/wm\/ActivityRecord.java" }, - "1856211951": { - "message": "moveFocusableActivityToTop: already on top, activity=%s", - "level": "DEBUG", - "group": "WM_DEBUG_FOCUS", - "at": "com\/android\/server\/wm\/ActivityRecord.java" - }, "1856783490": { "message": "resumeTopActivity: Restarting %s", "level": "DEBUG", diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index b6870f5e035b6..359079a1474bd 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -3215,12 +3215,29 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return false; } - if (mRootWindowContainer.getTopResumedActivity() == this - && getDisplayContent().mFocusedApp == this) { - ProtoLog.d(WM_DEBUG_FOCUS, "moveFocusableActivityToTop: already on top, " - + "activity=%s", this); - return !isState(RESUMED); + // If this activity already positions on the top focused task, moving the task to front + // is not needed. But we still need to ensure this activity is focused because the + // current focused activity could be another activity in the same Task if activities are + // displayed on adjacent TaskFragments. + final ActivityRecord currentFocusedApp = mDisplayContent.mFocusedApp; + if (currentFocusedApp != null && currentFocusedApp.task == task) { + final Task topFocusableTask = mDisplayContent.getTask( + (t) -> t.isLeafTask() && t.isFocusable(), true /* traverseTopToBottom */); + if (task == topFocusableTask) { + if (currentFocusedApp == this) { + ProtoLog.d(WM_DEBUG_FOCUS, "moveFocusableActivityToTop: already on top " + + "and focused, activity=%s", this); + } else { + ProtoLog.d(WM_DEBUG_FOCUS, "moveFocusableActivityToTop: set focused, " + + "activity=%s", this); + mDisplayContent.setFocusedApp(this); + mAtmService.mWindowManager.updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, + true /* updateInputWindows */); + } + return !isState(RESUMED); + } } + ProtoLog.d(WM_DEBUG_FOCUS, "moveFocusableActivityToTop: activity=%s", this); rootTask.moveToFront(reason, task); diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java index 228cb65aab384..5f3096356bc52 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java @@ -475,5 +475,13 @@ public class TaskFragmentTest extends WindowTestsBase { assertFalse(activity0.isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(activity1.isLetterboxedForFixedOrientationAndAspectRatio()); assertEquals(SCREEN_ORIENTATION_UNSET, task.getOrientation()); + + tf0.setResumedActivity(activity0, "test"); + tf1.setResumedActivity(activity1, "test"); + mDisplayContent.mFocusedApp = activity1; + + // Making the activity0 be the focused activity and ensure the focused app is updated. + activity0.moveFocusableActivityToTop("test"); + assertEquals(activity0, mDisplayContent.mFocusedApp); } }