From bbe09689c2add49fa9bac062523049472b1ab4a7 Mon Sep 17 00:00:00 2001 From: Yuncheol Heo Date: Wed, 5 Apr 2023 17:42:13 -0700 Subject: [PATCH] Send HOME Intent for the main display of the visibule user, with the visible userId. Previously CATEGORY_HOME is used for the default display, and CATEGORY_SECONDARY_HOME is used for all non-default displays with the current user id. But, in the concurrent multi user enviorment, we should use CATEGORY_HOME Intent for each user's main display, CATEGORY_SECONDARY_HOME for the others. This CL fixes - to use CATEGORY_HOME for main displays assigned to concurrent users. - to send HOME Intent with the correct userId. Bug: 272281432 Test: atest MultiDisplaySystemDecorationTests Change-Id: I562e271b7b350f06238f6291ed84c468cfb2d28a Merged-In: I562e271b7b350f06238f6291ed84c468cfb2d28a --- .../android/server/policy/PhoneWindowManager.java | 6 +++++- .../android/server/wm/RootWindowContainer.java | 15 ++++++++++----- .../android/server/wm/WindowManagerService.java | 13 +++++++++++++ .../server/policy/PhoneWindowManagerTests.java | 2 ++ .../server/policy/TestPhoneWindowManager.java | 4 ++++ 5 files changed, 34 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 79eed644de788..dc56def09ee8f 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -216,6 +216,7 @@ import com.android.server.UiThread; import com.android.server.display.BrightnessUtils; import com.android.server.input.InputManagerInternal; import com.android.server.inputmethod.InputMethodManagerInternal; +import com.android.server.pm.UserManagerInternal; import com.android.server.policy.KeyCombinationManager.TwoKeysCombinationRule; import com.android.server.policy.keyguard.KeyguardServiceDelegate; import com.android.server.policy.keyguard.KeyguardServiceDelegate.DrawnListener; @@ -413,6 +414,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { SensorPrivacyManager mSensorPrivacyManager; DisplayManager mDisplayManager; DisplayManagerInternal mDisplayManagerInternal; + UserManagerInternal mUserManagerInternal; private WallpaperManagerInternal mWallpaperManagerInternal; @@ -2009,6 +2011,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mSensorPrivacyManager = mContext.getSystemService(SensorPrivacyManager.class); mDisplayManager = mContext.getSystemService(DisplayManager.class); mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class); + mUserManagerInternal = LocalServices.getService(UserManagerInternal.class); mPackageManager = mContext.getPackageManager(); mHasFeatureWatch = mPackageManager.hasSystemFeature(FEATURE_WATCH); mHasFeatureLeanback = mPackageManager.hasSystemFeature(FEATURE_LEANBACK); @@ -5742,8 +5745,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { Log.d(TAG, "startDockOrHome: startReason= " + startReason); } + int userId = mUserManagerInternal.getUserAssignedToDisplay(displayId); // Start home. - mActivityTaskManagerInternal.startHomeOnDisplay(mCurrentUserId, startReason, + mActivityTaskManagerInternal.startHomeOnDisplay(userId, startReason, displayId, true /* allowInstrumenting */, fromHomeKey); } diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index d3edeaebbf996..5149985f8ff98 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -1374,7 +1374,8 @@ class RootWindowContainer extends WindowContainer void startHomeOnEmptyDisplays(String reason) { forAllTaskDisplayAreas(taskDisplayArea -> { if (taskDisplayArea.topRunningActivity() == null) { - startHomeOnTaskDisplayArea(mCurrentUser, reason, taskDisplayArea, + int userId = mWmService.getUserAssignedToDisplay(taskDisplayArea.getDisplayId()); + startHomeOnTaskDisplayArea(userId, reason, taskDisplayArea, false /* allowInstrumenting */, false /* fromHomeKey */); } }); @@ -1422,7 +1423,9 @@ class RootWindowContainer extends WindowContainer Intent homeIntent = null; ActivityInfo aInfo = null; - if (taskDisplayArea == getDefaultTaskDisplayArea()) { + if (taskDisplayArea == getDefaultTaskDisplayArea() + || mWmService.shouldPlacePrimaryHomeOnDisplay( + taskDisplayArea.getDisplayId(), userId)) { homeIntent = mService.getHomeIntent(); aInfo = resolveHomeActivity(userId, homeIntent); } else if (shouldPlaceSecondaryHomeOnDisplayArea(taskDisplayArea)) { @@ -1589,7 +1592,8 @@ class RootWindowContainer extends WindowContainer r.moveFocusableActivityToTop(myReason); return resumeFocusedTasksTopActivities(r.getRootTask(), prev, null); } - return startHomeOnTaskDisplayArea(mCurrentUser, myReason, taskDisplayArea, + int userId = mWmService.getUserAssignedToDisplay(taskDisplayArea.getDisplayId()); + return startHomeOnTaskDisplayArea(userId, myReason, taskDisplayArea, false /* allowInstrumenting */, false /* fromHomeKey */); } @@ -1667,8 +1671,9 @@ class RootWindowContainer extends WindowContainer final int displayId = taskDisplayArea != null ? taskDisplayArea.getDisplayId() : INVALID_DISPLAY; if (displayId == DEFAULT_DISPLAY || (displayId != INVALID_DISPLAY - && displayId == mService.mVr2dDisplayId)) { - // No restrictions to default display or vr 2d display. + && (displayId == mService.mVr2dDisplayId + || mWmService.shouldPlacePrimaryHomeOnDisplay(displayId)))) { + // No restrictions to default display, vr 2d display or main display for visible users. return true; } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index f9b6fc10360df..b0fc14d956c20 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -3615,6 +3615,19 @@ public class WindowManagerService extends IWindowManager.Stub return mUmInternal.isUserVisible(userId); } + @UserIdInt int getUserAssignedToDisplay(int displayId) { + return mUmInternal.getUserAssignedToDisplay(displayId); + } + + boolean shouldPlacePrimaryHomeOnDisplay(int displayId) { + int userId = mUmInternal.getUserAssignedToDisplay(displayId); + return shouldPlacePrimaryHomeOnDisplay(displayId, userId); + } + + boolean shouldPlacePrimaryHomeOnDisplay(int displayId, int userId) { + return mUmInternal.getMainDisplayAssignedToUser(userId) == displayId; + } + public void enableScreenAfterBoot() { synchronized (mGlobalLock) { ProtoLog.i(WM_DEBUG_BOOT, "enableScreenAfterBoot: mDisplayEnabled=%b " diff --git a/services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerTests.java b/services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerTests.java index fc24f5e207a80..53635835f1646 100644 --- a/services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerTests.java +++ b/services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerTests.java @@ -34,6 +34,7 @@ import android.app.ActivityManager; import androidx.test.filters.SmallTest; +import com.android.server.pm.UserManagerInternal; import com.android.server.wm.ActivityTaskManagerInternal; import org.junit.After; @@ -91,5 +92,6 @@ public class PhoneWindowManagerTests { when(mMockActivityTaskManagerInternal.startHomeOnDisplay( anyInt(), anyString(), anyInt(), anyBoolean(), anyBoolean())).thenReturn(false); mPhoneWindowManager.mActivityTaskManagerInternal = mMockActivityTaskManagerInternal; + mPhoneWindowManager.mUserManagerInternal = mock(UserManagerInternal.class); } } diff --git a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java index 3513557d8374d..1053fd5c4518c 100644 --- a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java +++ b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java @@ -78,6 +78,7 @@ import com.android.server.GestureLauncherService; import com.android.server.LocalServices; import com.android.server.input.InputManagerInternal; import com.android.server.inputmethod.InputMethodManagerInternal; +import com.android.server.pm.UserManagerInternal; import com.android.server.statusbar.StatusBarManagerInternal; import com.android.server.vr.VrManagerInternal; import com.android.server.wm.ActivityTaskManagerInternal; @@ -118,6 +119,7 @@ class TestPhoneWindowManager { @Mock private PowerManager mPowerManager; @Mock private WindowManagerPolicy.WindowManagerFuncs mWindowManagerFuncsImpl; @Mock private InputMethodManagerInternal mInputMethodManagerInternal; + @Mock private UserManagerInternal mUserManagerInternal; @Mock private AudioManagerInternal mAudioManagerInternal; @Mock private SearchManager mSearchManager; @@ -186,6 +188,8 @@ class TestPhoneWindowManager { () -> LocalServices.getService(eq(DisplayManagerInternal.class))); doReturn(mGestureLauncherService).when( () -> LocalServices.getService(eq(GestureLauncherService.class))); + doReturn(mUserManagerInternal).when( + () -> LocalServices.getService(eq(UserManagerInternal.class))); doReturn(null).when(() -> LocalServices.getService(eq(VrManagerInternal.class))); doReturn(null).when(() -> LocalServices.getService(eq(AutofillManagerInternal.class))); LocalServices.removeServiceForTest(InputMethodManagerInternal.class);