diff options
| author | 2023-09-25 08:52:09 +0000 | |
|---|---|---|
| committer | 2023-09-25 15:24:41 +0000 | |
| commit | 21610f8cdafd9b93797dd408f190a8fb41238ea7 (patch) | |
| tree | dfc9a49203df7f1280f9484695500991a31a5e4a | |
| parent | a93ce5ac0be21bbc2eb1aa704a4fdfb9745053de (diff) | |
Store process of window in Session
Currently all logic assume that the owner process of window
is the process that creates the Session.
This also makes the tests closer to real case.
Bug: 163976519
Test: atest WindowStateTests DragDropControllerTests
Change-Id: Ia46dd49a3427bd28dfac9b5153556432ea38f6a9
11 files changed, 111 insertions, 104 deletions
diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java index 0674ec1e8b82..bbe44c540c39 100644 --- a/services/core/java/com/android/server/wm/Session.java +++ b/services/core/java/com/android/server/wm/Session.java @@ -42,6 +42,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_POSITIONING; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; +import android.annotation.NonNull; import android.annotation.Nullable; import android.app.PendingIntent; import android.content.ClipData; @@ -100,6 +101,8 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { final IWindowSessionCallback mCallback; final int mUid; final int mPid; + @NonNull + final WindowProcessController mProcess; private final String mStringName; SurfaceSession mSurfaceSession; private int mNumWindow = 0; @@ -126,11 +129,23 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { final boolean mSetsUnrestrictedKeepClearAreas; public Session(WindowManagerService service, IWindowSessionCallback callback) { + this(service, callback, Binder.getCallingPid(), Binder.getCallingUid()); + } + + @VisibleForTesting + Session(WindowManagerService service, IWindowSessionCallback callback, + int callingPid, int callingUid) { mService = service; mCallback = callback; - mUid = Binder.getCallingUid(); - mPid = Binder.getCallingPid(); - mLastReportedAnimatorScale = service.getCurrentAnimatorScale(); + mPid = callingPid; + mUid = callingUid; + synchronized (service.mGlobalLock) { + mLastReportedAnimatorScale = service.getCurrentAnimatorScale(); + mProcess = service.mAtmService.mProcessMap.getProcess(mPid); + } + if (mProcess == null) { + throw new IllegalStateException("Unknown pid=" + mPid + " uid=" + mUid); + } mCanAddInternalSystemWindow = service.mContext.checkCallingOrSelfPermission( INTERNAL_SYSTEM_WINDOW) == PERMISSION_GRANTED; mCanForceShowingInsets = service.mAtmService.isCallerRecents(mUid) @@ -715,13 +730,8 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { void windowAddedLocked() { if (mPackageName == null) { - final WindowProcessController wpc = mService.mAtmService.mProcessMap.getProcess(mPid); - if (wpc != null) { - mPackageName = wpc.mInfo.packageName; - mRelayoutTag = "relayoutWindow: " + mPackageName; - } else { - Slog.e(TAG_WM, "Unknown process pid=" + mPid); - } + mPackageName = mProcess.mInfo.packageName; + mRelayoutTag = "relayoutWindow: " + mPackageName; } if (mSurfaceSession == null) { if (DEBUG) { diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index b12cc0b30f53..ebef606a8d60 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -754,8 +754,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP static final int BLAST_TIMEOUT_DURATION = 5000; /* milliseconds */ - private final WindowProcessController mWpcForDisplayAreaConfigChanges; - class DrawHandler { Consumer<SurfaceControl.Transaction> mConsumer; int mSeqId; @@ -1129,7 +1127,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP mBaseLayer = 0; mSubLayer = 0; mWinAnimator = null; - mWpcForDisplayAreaConfigChanges = null; mOverrideScale = 1f; return; } @@ -1186,11 +1183,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP ProtoLog.v(WM_DEBUG_ADD_REMOVE, "Adding %s to %s", this, parentWindow); parentWindow.addChild(this, sWindowSubLayerComparator); } - - // System process or invalid process cannot register to display area config change. - mWpcForDisplayAreaConfigChanges = (s.mPid == MY_PID || s.mPid < 0) - ? null - : service.mAtmService.getProcessController(s.mPid, s.mUid); } boolean shouldWindowHandleBeTrusted(Session s) { @@ -3621,14 +3613,17 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP /** @return {@code true} if the process registered to a display area as a config listener. */ private boolean registeredForDisplayAreaConfigChanges() { final WindowState parentWindow = getParentWindow(); - final WindowProcessController wpc = parentWindow != null - ? parentWindow.mWpcForDisplayAreaConfigChanges - : mWpcForDisplayAreaConfigChanges; - return wpc != null && wpc.registeredForDisplayAreaConfigChanges(); + final Session session = parentWindow != null ? parentWindow.mSession : mSession; + if (session.mPid == MY_PID) { + // System process cannot register to display area config change. + return false; + } + return session.mProcess.registeredForDisplayAreaConfigChanges(); } + @NonNull WindowProcessController getProcess() { - return mWpcForDisplayAreaConfigChanges; + return mSession.mProcess; } /** diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index ae587003c1c2..880eaaf70d49 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -147,14 +147,12 @@ import android.view.DisplayInfo; import android.view.IRemoteAnimationFinishedCallback; import android.view.IRemoteAnimationRunner.Stub; import android.view.IWindowManager; -import android.view.IWindowSession; import android.view.InsetsSource; import android.view.InsetsState; import android.view.RemoteAnimationAdapter; import android.view.RemoteAnimationTarget; import android.view.Surface; import android.view.WindowManager; -import android.view.WindowManagerGlobal; import android.window.TaskSnapshot; import androidx.test.filters.MediumTest; @@ -2072,7 +2070,7 @@ public class ActivityRecordTests extends WindowTestsBase { WindowManager.LayoutParams.TYPE_APPLICATION_STARTING); params.width = params.height = WindowManager.LayoutParams.MATCH_PARENT; final TestWindowState w = new TestWindowState( - mAtm.mWindowManager, mock(Session.class), new TestIWindow(), params, activity); + mAtm.mWindowManager, getTestSession(), new TestIWindow(), params, activity); activity.addWindow(w); // Assume the activity is launching in different rotation, and there was an available @@ -2082,23 +2080,8 @@ public class ActivityRecordTests extends WindowTestsBase { .build(); setRotatedScreenOrientationSilently(activity); activity.setVisible(false); - - final IWindowSession session = WindowManagerGlobal.getWindowSession(); - spyOn(session); - try { - // Return error to skip unnecessary operation. - doReturn(WindowManagerGlobal.ADD_STARTING_NOT_NEEDED).when(session).addToDisplay( - any() /* window */, any() /* attrs */, - anyInt() /* viewVisibility */, anyInt() /* displayId */, - anyInt() /* requestedVisibleTypes */, any() /* outInputChannel */, - any() /* outInsetsState */, any() /* outActiveControls */, - any() /* outAttachedFrame */, any() /* outSizeCompatScale */); - mAtm.mWindowManager.mStartingSurfaceController - .createTaskSnapshotSurface(activity, snapshot); - } catch (RemoteException ignored) { - } finally { - reset(session); - } + mAtm.mWindowManager.mStartingSurfaceController + .createTaskSnapshotSurface(activity, snapshot); // Because the rotation of snapshot and the corresponding top activity are different, fixed // rotation should be applied when creating snapshot surface if the display rotation may be diff --git a/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java index f30ecbe96c8b..8e7ba7030e82 100644 --- a/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java @@ -337,6 +337,7 @@ public class BackNavigationControllerTests extends WindowTestsBase { WindowState appWindow = task.getTopVisibleAppMainWindow(); WindowOnBackInvokedDispatcher dispatcher = new WindowOnBackInvokedDispatcher(context); + spyOn(appWindow.mSession); doAnswer(invocation -> { appWindow.setOnBackInvokedCallbackInfo(invocation.getArgument(1)); return null; diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java index 1ad04a254f66..cd0389dce416 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java @@ -700,7 +700,7 @@ public class DisplayAreaTest extends WindowTestsBase { } private WindowState createWindowState(WindowToken token) { - return new WindowState(mWm, mock(Session.class), new TestIWindow(), token, + return new WindowState(mWm, getTestSession(), new TestIWindow(), token, null /* parentWindow */, 0 /* appOp */, new WindowManager.LayoutParams(), View.VISIBLE, 0 /* ownerId */, 0 /* showUserId */, false /* ownerCanAddInternalSystemWindow */); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index ae4ebc1223b2..397681cf134e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -573,7 +573,10 @@ public class DisplayContentTests extends WindowTestsBase { assertEquals(window1, mWm.mRoot.getTopFocusedDisplayContent().mCurrentFocus); // Add a window to the second display, and it should be focused - final WindowState window2 = createWindow(null, TYPE_BASE_APPLICATION, dc, "window2"); + final ActivityRecord app2 = new ActivityBuilder(mAtm) + .setTask(new TaskBuilder(mSupervisor).setDisplay(dc).build()) + .setUseProcess(window1.getProcess()).setOnTop(true).build(); + final WindowState window2 = createWindow(null, TYPE_BASE_APPLICATION, app2, "window2"); window2.mActivityRecord.mTargetSdk = targetSdk; updateFocusedWindow(); assertTrue(window2.isFocused()); diff --git a/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java index 4526d18d63d8..50fe0425fe9c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java @@ -55,7 +55,6 @@ import android.os.Parcelable; import android.os.UserHandle; import android.platform.test.annotations.Presubmit; import android.view.DragEvent; -import android.view.IWindowSessionCallback; import android.view.InputChannel; import android.view.SurfaceControl; import android.view.SurfaceSession; @@ -98,6 +97,7 @@ public class DragDropControllerTests extends WindowTestsBase { private static final String TEST_PACKAGE = "com.test.package"; private TestDragDropController mTarget; + private WindowProcessController mProcess; private WindowState mWindow; private IBinder mToken; @@ -137,10 +137,9 @@ public class DragDropControllerTests extends WindowTestsBase { * Creates a window state which can be used as a drop target. */ private WindowState createDropTargetWindow(String name, int ownerId) { - final ActivityRecord activity = createNonAttachedActivityRecord(mDisplayContent); - final Task rootTask = createTask(mDisplayContent); - final Task task = createTaskInRootTask(rootTask, ownerId); - task.addChild(activity, 0); + final Task task = new TaskBuilder(mSupervisor).setUserId(ownerId).build(); + final ActivityRecord activity = new ActivityBuilder(mAtm).setTask(task) + .setUseProcess(mProcess).build(); // Use a new TestIWindow so we don't collect events for other windows final WindowState window = createWindow( @@ -167,6 +166,8 @@ public class DragDropControllerTests extends WindowTestsBase { @Before public void setUp() throws Exception { mTarget = new TestDragDropController(mWm, mWm.mH.getLooper()); + mProcess = mSystemServicesTestRule.addProcess(TEST_PACKAGE, "testProc", + TEST_PID, TEST_UID); mWindow = createDropTargetWindow("Drag test window", 0); doReturn(mWindow).when(mDisplayContent).getTouchableWinAtPointLocked(0, 0); when(mWm.mInputManager.transferTouchFocus(any(InputChannel.class), @@ -221,8 +222,6 @@ public class DragDropControllerTests extends WindowTestsBase { @Test public void testPrivateInterceptGlobalDragDropFlagChecksPermission() { - spyOn(mWm.mContext); - DisplayPolicy policy = mDisplayContent.getDisplayPolicy(); WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(); attrs.privateFlags |= PRIVATE_FLAG_INTERCEPT_GLOBAL_DRAG_AND_DROP; @@ -323,10 +322,7 @@ public class DragDropControllerTests extends WindowTestsBase { @Test public void testValidateAppActivityArguments() { - final Session session = new Session(mWm, new IWindowSessionCallback.Stub() { - @Override - public void onAnimatorScaleChanged(float scale) {} - }); + final Session session = getTestSession(); try { session.validateAndResolveDragMimeTypeExtras( createClipDataForActivity(mock(PendingIntent.class), null), TEST_UID, TEST_PID, @@ -364,10 +360,7 @@ public class DragDropControllerTests extends WindowTestsBase { public void testValidateAppShortcutArguments() { doReturn(PERMISSION_GRANTED).when(mWm.mContext) .checkCallingOrSelfPermission(eq(START_TASKS_FROM_RECENTS)); - final Session session = new Session(mWm, new IWindowSessionCallback.Stub() { - @Override - public void onAnimatorScaleChanged(float scale) {} - }); + final Session session = createTestSession(mAtm); try { session.validateAndResolveDragMimeTypeExtras( createClipDataForShortcut(null, "test_shortcut_id", mock(UserHandle.class)), @@ -398,10 +391,7 @@ public class DragDropControllerTests extends WindowTestsBase { public void testValidateProfileAppShortcutArguments_notCallingUid() { doReturn(PERMISSION_GRANTED).when(mWm.mContext) .checkCallingOrSelfPermission(eq(START_TASKS_FROM_RECENTS)); - final Session session = Mockito.spy(new Session(mWm, new IWindowSessionCallback.Stub() { - @Override - public void onAnimatorScaleChanged(float scale) {} - })); + final Session session = createTestSession(mAtm); final ShortcutServiceInternal shortcutService = mock(ShortcutServiceInternal.class); final Intent[] shortcutIntents = new Intent[1]; shortcutIntents[0] = new Intent(); @@ -443,10 +433,7 @@ public class DragDropControllerTests extends WindowTestsBase { public void testValidateAppTaskArguments() { doReturn(PERMISSION_GRANTED).when(mWm.mContext) .checkCallingOrSelfPermission(eq(START_TASKS_FROM_RECENTS)); - final Session session = new Session(mWm, new IWindowSessionCallback.Stub() { - @Override - public void onAnimatorScaleChanged(float scale) {} - }); + final Session session = createTestSession(mAtm); try { final ClipData clipData = new ClipData( new ClipDescription("drag", new String[] { MIMETYPE_APPLICATION_TASK }), @@ -462,10 +449,7 @@ public class DragDropControllerTests extends WindowTestsBase { @Test public void testValidateFlags() { - final Session session = new Session(mWm, new IWindowSessionCallback.Stub() { - @Override - public void onAnimatorScaleChanged(float scale) {} - }); + final Session session = getTestSession(); try { session.validateDragFlags(View.DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION); fail("Expected failure without permission"); @@ -478,10 +462,7 @@ public class DragDropControllerTests extends WindowTestsBase { public void testValidateFlagsWithPermission() { doReturn(PERMISSION_GRANTED).when(mWm.mContext) .checkCallingOrSelfPermission(eq(START_TASKS_FROM_RECENTS)); - final Session session = new Session(mWm, new IWindowSessionCallback.Stub() { - @Override - public void onAnimatorScaleChanged(float scale) {} - }); + final Session session = createTestSession(mAtm); try { session.validateDragFlags(View.DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION); // Expected pass @@ -571,7 +552,8 @@ public class DragDropControllerTests extends WindowTestsBase { assertTrue(mWm.mInputManager.transferTouchFocus(new InputChannel(), new InputChannel(), true /* isDragDrop */)); - mToken = mTarget.performDrag(0, 0, mWindow.mClient, flag, surface, 0, 0, 0, 0, 0, data); + mToken = mTarget.performDrag(TEST_PID, 0, mWindow.mClient, + flag, surface, 0, 0, 0, 0, 0, data); assertNotNull(mToken); r.run(); diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index 8f68c0fa0b73..1ceb1a8c7097 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -4739,24 +4739,20 @@ public class SizeCompatTests extends WindowTestsBase { assertEquals(new Rect(1050, 0, 1750, 1400), mActivity.getBounds()); } - private static WindowState addWindowToActivity(ActivityRecord activity) { + private WindowState addWindowToActivity(ActivityRecord activity) { final WindowManager.LayoutParams params = new WindowManager.LayoutParams(); params.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION; params.setFitInsetsSides(0); params.setFitInsetsTypes(0); final TestWindowState w = new TestWindowState( - activity.mWmService, mock(Session.class), new TestIWindow(), params, activity); + activity.mWmService, getTestSession(), new TestIWindow(), params, activity); makeWindowVisible(w); w.mWinAnimator.mDrawState = WindowStateAnimator.HAS_DRAWN; activity.addWindow(w); return w; } - private static TestWindowState addStatusBar(DisplayContent displayContent) { - final DisplayPolicy displayPolicy = displayContent.getDisplayPolicy(); - doReturn(true).when(displayPolicy).hasStatusBar(); - displayPolicy.onConfigurationChanged(); - + private TestWindowState addStatusBar(DisplayContent displayContent) { final TestWindowToken token = createTestWindowToken( TYPE_STATUS_BAR, displayContent); final WindowManager.LayoutParams attrs = @@ -4772,11 +4768,12 @@ public class SizeCompatTests extends WindowTestsBase { new InsetsFrameProvider(owner, 0, WindowInsets.Type.mandatorySystemGestures()) }; final TestWindowState statusBar = new TestWindowState( - displayContent.mWmService, mock(Session.class), new TestIWindow(), attrs, token); + displayContent.mWmService, getTestSession(), new TestIWindow(), attrs, token); token.addWindow(statusBar); statusBar.setRequestedSize(displayContent.mBaseDisplayWidth, SystemBarUtils.getStatusBarHeight(displayContent.getDisplayUiContext())); + final DisplayPolicy displayPolicy = displayContent.getDisplayPolicy(); displayPolicy.addWindowLw(statusBar, attrs); displayPolicy.layoutWindowLw(statusBar, null, displayContent.mDisplayFrames); return statusBar; diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java index 76576f76355d..e86fc366a631 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java @@ -82,7 +82,6 @@ import android.platform.test.annotations.Presubmit; import android.util.MergedConfiguration; import android.view.ContentRecordingSession; import android.view.IWindow; -import android.view.IWindowSessionCallback; import android.view.InputChannel; import android.view.InsetsSourceControl; import android.view.InsetsState; @@ -496,11 +495,7 @@ public class WindowManagerServiceTests extends WindowTestsBase { spyOn(mWm.mWindowContextListenerController); final WindowToken windowToken = createTestWindowToken(TYPE_INPUT_METHOD, mDefaultDisplay); - final Session session = new Session(mWm, new IWindowSessionCallback.Stub() { - @Override - public void onAnimatorScaleChanged(float v) throws RemoteException { - } - }); + final Session session = getTestSession(); final WindowManager.LayoutParams params = new WindowManager.LayoutParams( TYPE_APPLICATION_ATTACHED_DIALOG); params.token = windowToken.token; diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java index 0ddd3135506e..014d57dd9970 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java @@ -95,7 +95,6 @@ import android.util.ArraySet; import android.util.MergedConfiguration; import android.view.Gravity; import android.view.IWindow; -import android.view.IWindowSessionCallback; import android.view.InputWindowHandle; import android.view.InsetsSource; import android.view.InsetsSourceControl; @@ -1332,12 +1331,7 @@ public class WindowStateTests extends WindowTestsBase { final WindowToken windowToken = createTestWindowToken(TYPE_APPLICATION_OVERLAY, mDisplayContent); final IWindow client = new TestIWindow(); - final Session session = new Session(mWm, new IWindowSessionCallback.Stub() { - @Override - public void onAnimatorScaleChanged(float v) throws RemoteException { - - } - }); + final Session session = getTestSession(); final ClientWindowFrames outFrames = new ClientWindowFrames(); final MergedConfiguration outConfig = new MergedConfiguration(); final SurfaceControl outSurfaceControl = new SurfaceControl(); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java index 99688dabda6e..9146889e37d9 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java @@ -94,6 +94,7 @@ import android.view.DisplayInfo; import android.view.Gravity; import android.view.IDisplayWindowInsetsController; import android.view.IWindow; +import android.view.IWindowSessionCallback; import android.view.InsetsFrameProvider; import android.view.InsetsSourceControl; import android.view.InsetsState; @@ -153,7 +154,7 @@ class WindowTestsBase extends SystemServiceTestsBase { ActivityTaskSupervisor mSupervisor; WindowManagerService mWm; private final IWindow mIWindow = new TestIWindow(); - private Session mMockSession; + private Session mTestSession; private boolean mUseFakeSettingsProvider; DisplayInfo mDisplayInfo = new DisplayInfo(); @@ -231,7 +232,6 @@ class WindowTestsBase extends SystemServiceTestsBase { suppressInsetsAnimation(insetsPolicy.getPermanentControlTarget()); mTransaction = mSystemServicesTestRule.mTransaction; - mMockSession = mock(Session.class); mContext.getSystemService(DisplayManager.class) .getDisplay(Display.DEFAULT_DISPLAY).getDisplayInfo(mDisplayInfo); @@ -508,6 +508,54 @@ class WindowTestsBase extends SystemServiceTestsBase { return statusBar; } + Session getTestSession() { + if (mTestSession != null) { + return mTestSession; + } + mTestSession = createTestSession(mAtm); + return mTestSession; + } + + private Session getTestSession(WindowToken token) { + final ActivityRecord r = token.asActivityRecord(); + if (r == null || r.app == null) { + return getTestSession(); + } + // If the activity has a process, let the window session belonging to activity use the + // process of the activity. + int pid = r.app.getPid(); + if (pid == 0) { + // See SystemServicesTestRule#addProcess, pid 0 isn't added to the map. So generate + // a non-zero pid to initialize it. + final int numPid = mAtm.mProcessMap.getPidMap().size(); + pid = numPid > 0 ? mAtm.mProcessMap.getPidMap().keyAt(numPid - 1) + 1 : 1; + r.app.setPid(pid); + mAtm.mProcessMap.put(pid, r.app); + } else { + final WindowState win = mRootWindowContainer.getWindow(w -> w.getProcess() == r.app); + if (win != null) { + // Reuse the same Session if there is a window uses the same process. + return win.mSession; + } + } + return createTestSession(mAtm, pid, r.getUid()); + } + + static Session createTestSession(ActivityTaskManagerService atms) { + return createTestSession(atms, WindowManagerService.MY_PID, WindowManagerService.MY_UID); + } + + static Session createTestSession(ActivityTaskManagerService atms, int pid, int uid) { + if (atms.mProcessMap.getProcess(pid) == null) { + SystemServicesTestRule.addProcess(atms, "testPkg", "testProc", pid, uid); + } + return new Session(atms.mWindowManager, new IWindowSessionCallback.Stub() { + @Override + public void onAnimatorScaleChanged(float scale) { + } + }, pid, uid); + } + WindowState createAppWindow(Task task, int type, String name) { final ActivityRecord activity = createNonAttachedActivityRecord(task.getDisplayContent()); task.addChild(activity, 0); @@ -587,7 +635,7 @@ class WindowTestsBase extends SystemServiceTestsBase { WindowState createWindow(WindowState parent, int type, WindowToken token, String name, int ownerId, boolean ownerCanAddInternalSystemWindow, IWindow iwindow) { return createWindow(parent, type, token, name, ownerId, UserHandle.getUserId(ownerId), - ownerCanAddInternalSystemWindow, mWm, mMockSession, iwindow, + ownerCanAddInternalSystemWindow, mWm, getTestSession(token), iwindow, mSystemServicesTestRule.getPowerManagerWrapper()); } @@ -891,7 +939,7 @@ class WindowTestsBase extends SystemServiceTestsBase { TestWindowState createWindowState(WindowManager.LayoutParams attrs, WindowToken token) { SystemServicesTestRule.checkHoldsLock(mWm.mGlobalLock); - return new TestWindowState(mWm, mMockSession, mIWindow, attrs, token); + return new TestWindowState(mWm, getTestSession(), mIWindow, attrs, token); } /** Creates a {@link DisplayContent} as parts of simulate display info for test. */ @@ -1705,8 +1753,7 @@ class WindowTestsBase extends SystemServiceTestsBase { final WindowState window = WindowTestsBase.createWindow(null, TYPE_APPLICATION_STARTING, activity, "Starting window", 0 /* ownerId */, 0 /* userId*/, - false /* internalWindows */, mWMService, mock(Session.class), - iWindow, + false /* internalWindows */, mWMService, createTestSession(mAtm), iWindow, mPowerManagerWrapper); activity.mStartingWindow = window; mAppWindowMap.put(info.appToken, window); |