Loading data/etc/services.core.protolog.json +12 −6 Original line number Diff line number Diff line Loading @@ -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", Loading Loading @@ -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", Loading Loading @@ -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", Loading services/core/java/com/android/server/wm/ActivityRecord.java +22 −5 Original line number Diff line number Diff line Loading @@ -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, " // 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); Loading services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java +8 −0 Original line number Diff line number Diff line Loading @@ -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); } } Loading
data/etc/services.core.protolog.json +12 −6 Original line number Diff line number Diff line Loading @@ -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", Loading Loading @@ -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", Loading Loading @@ -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", Loading
services/core/java/com/android/server/wm/ActivityRecord.java +22 −5 Original line number Diff line number Diff line Loading @@ -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, " // 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); Loading
services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java +8 −0 Original line number Diff line number Diff line Loading @@ -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); } }