Merge "Use task's userId to obtain PackageManager instance" into main
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java
index 5c230c0..d8dba71 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java
@@ -33,6 +33,7 @@
 import android.hardware.input.InputManager;
 import android.os.Handler;
 import android.os.RemoteException;
+import android.os.UserHandle;
 import android.provider.Settings;
 import android.util.Log;
 import android.util.SparseArray;
@@ -288,6 +289,7 @@
         final CaptionWindowDecoration windowDecoration =
                 new CaptionWindowDecoration(
                         mContext,
+                        mContext.createContextAsUser(UserHandle.of(taskInfo.userId), 0 /* flags */),
                         mDisplayController,
                         mTaskOrganizer,
                         taskInfo,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java
index cf42a49..de514f6 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java
@@ -77,6 +77,7 @@
 
     CaptionWindowDecoration(
             Context context,
+            @NonNull Context userContext,
             DisplayController displayController,
             ShellTaskOrganizer taskOrganizer,
             RunningTaskInfo taskInfo,
@@ -85,7 +86,7 @@
             @ShellBackgroundThread ShellExecutor bgExecutor,
             Choreographer choreographer,
             SyncTransactionQueue syncQueue) {
-        super(context, displayController, taskOrganizer, taskInfo, taskSurface);
+        super(context, userContext, displayController, taskOrganizer, taskInfo, taskSurface);
         mHandler = handler;
         mBgExecutor = bgExecutor;
         mChoreographer = choreographer;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java
index 0ff3522..7c8f205 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java
@@ -59,6 +59,7 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.RemoteException;
+import android.os.UserHandle;
 import android.util.Log;
 import android.util.SparseArray;
 import android.view.Choreographer;
@@ -1149,6 +1150,7 @@
         final DesktopModeWindowDecoration windowDecoration =
                 mDesktopModeWindowDecorFactory.create(
                         mContext,
+                        mContext.createContextAsUser(UserHandle.of(taskInfo.userId), 0 /* flags */),
                         mDisplayController,
                         mSplitScreenController,
                         mTaskOrganizer,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java
index 41f428b..e82990f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java
@@ -160,6 +160,7 @@
 
     DesktopModeWindowDecoration(
             Context context,
+            @NonNull Context userContext,
             DisplayController displayController,
             SplitScreenController splitScreenController,
             ShellTaskOrganizer taskOrganizer,
@@ -171,8 +172,8 @@
             SyncTransactionQueue syncQueue,
             RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
             AppToWebGenericLinksParser genericLinksParser) {
-        this (context, displayController, splitScreenController, taskOrganizer, taskInfo,
-                taskSurface, handler, bgExecutor, choreographer, syncQueue,
+        this (context, userContext, displayController, splitScreenController, taskOrganizer,
+                taskInfo, taskSurface, handler, bgExecutor, choreographer, syncQueue,
                 rootTaskDisplayAreaOrganizer, genericLinksParser, SurfaceControl.Builder::new,
                 SurfaceControl.Transaction::new,  WindowContainerTransaction::new,
                 SurfaceControl::new, new SurfaceControlViewHostFactory() {},
@@ -181,6 +182,7 @@
 
     DesktopModeWindowDecoration(
             Context context,
+            @NonNull Context userContext,
             DisplayController displayController,
             SplitScreenController splitScreenController,
             ShellTaskOrganizer taskOrganizer,
@@ -199,7 +201,7 @@
             SurfaceControlViewHostFactory surfaceControlViewHostFactory,
             MaximizeMenuFactory maximizeMenuFactory,
             HandleMenuFactory handleMenuFactory) {
-        super(context, displayController, taskOrganizer, taskInfo, taskSurface,
+        super(context, userContext, displayController, taskOrganizer, taskInfo, taskSurface,
                 surfaceControlBuilderSupplier, surfaceControlTransactionSupplier,
                 windowContainerTransactionSupplier, surfaceControlSupplier,
                 surfaceControlViewHostFactory);
@@ -737,12 +739,8 @@
                 Slog.e(TAG, "Base activity component not found in task");
                 return;
             }
-            final PackageManager pm = mContext.getApplicationContext().getPackageManager();
-            final ActivityInfo activityInfo = pm.getActivityInfo(baseActivity,
-                    // Include uninstalled apps. Despite its name, adding this flag is a workaround
-                    // to #getActivityInfo throwing a NameNotFoundException for installed packages
-                    // when HSUM is enabled. See b/354884302.
-                    PackageManager.MATCH_UNINSTALLED_PACKAGES);
+            final PackageManager pm = mUserContext.getPackageManager();
+            final ActivityInfo activityInfo = pm.getActivityInfo(baseActivity, 0 /* flags */);
             final IconProvider provider = new IconProvider(mContext);
             final Drawable appIconDrawable = provider.getIcon(activityInfo);
             final BaseIconFactory headerIconFactory = createIconFactory(mContext,
@@ -1264,6 +1262,7 @@
 
         DesktopModeWindowDecoration create(
                 Context context,
+                @NonNull Context userContext,
                 DisplayController displayController,
                 SplitScreenController splitScreenController,
                 ShellTaskOrganizer taskOrganizer,
@@ -1277,6 +1276,7 @@
                 AppToWebGenericLinksParser genericLinksParser) {
             return new DesktopModeWindowDecoration(
                     context,
+                    userContext,
                     displayController,
                     splitScreenController,
                     taskOrganizer,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java
index 3b8657d4..6828560 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java
@@ -106,6 +106,7 @@
      * System-wide context. Only used to create context with overridden configurations.
      */
     final Context mContext;
+    final @NonNull Context mUserContext;
     final @NonNull DisplayController mDisplayController;
     final ShellTaskOrganizer mTaskOrganizer;
     final Supplier<SurfaceControl.Builder> mSurfaceControlBuilderSupplier;
@@ -147,11 +148,12 @@
 
     WindowDecoration(
             Context context,
+            @NonNull Context userContext,
             DisplayController displayController,
             ShellTaskOrganizer taskOrganizer,
             RunningTaskInfo taskInfo,
             SurfaceControl taskSurface) {
-        this(context, displayController, taskOrganizer, taskInfo, taskSurface,
+        this(context, userContext, displayController, taskOrganizer, taskInfo, taskSurface,
                 SurfaceControl.Builder::new, SurfaceControl.Transaction::new,
                 WindowContainerTransaction::new, SurfaceControl::new,
                 new SurfaceControlViewHostFactory() {});
@@ -159,6 +161,7 @@
 
     WindowDecoration(
             Context context,
+            @NonNull Context userContext,
             @NonNull DisplayController displayController,
             ShellTaskOrganizer taskOrganizer,
             RunningTaskInfo taskInfo,
@@ -169,6 +172,7 @@
             Supplier<SurfaceControl> surfaceControlSupplier,
             SurfaceControlViewHostFactory surfaceControlViewHostFactory) {
         mContext = context;
+        mUserContext = userContext;
         mDisplayController = displayController;
         mTaskOrganizer = taskOrganizer;
         mTaskInfo = taskInfo;
@@ -177,7 +181,6 @@
         mSurfaceControlTransactionSupplier = surfaceControlTransactionSupplier;
         mWindowContainerTransactionSupplier = windowContainerTransactionSupplier;
         mSurfaceControlViewHostFactory = surfaceControlViewHostFactory;
-
         mDisplay = mDisplayController.getDisplay(mTaskInfo.displayId);
     }
 
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt
index 01c4f3a..e264160 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt
@@ -103,6 +103,8 @@
 import org.mockito.quality.Strictness
 import java.util.Optional
 import java.util.function.Supplier
+import junit.framework.Assert.assertFalse
+import junit.framework.Assert.assertTrue
 
 /**
  * Tests of [DesktopModeWindowDecorViewModel]
@@ -206,25 +208,13 @@
         val decoration = setUpMockDecorationForTask(task)
 
         onTaskOpening(task, taskSurface)
+        assertTrue(windowDecorByTaskIdSpy.contains(task.taskId))
 
         task.setWindowingMode(WINDOWING_MODE_UNDEFINED)
         task.setActivityType(ACTIVITY_TYPE_UNDEFINED)
         onTaskChanging(task, taskSurface)
 
-        verify(mockDesktopModeWindowDecorFactory).create(
-                mContext,
-                mockDisplayController,
-                mockSplitScreenController,
-                mockTaskOrganizer,
-                task,
-                taskSurface,
-                mockMainHandler,
-                bgExecutor,
-                mockMainChoreographer,
-                mockSyncQueue,
-                mockRootTaskDisplayAreaOrganizer,
-                mockGenericLinksParser
-        )
+        assertFalse(windowDecorByTaskIdSpy.contains(task.taskId))
         verify(decoration).close()
     }
 
@@ -238,38 +228,12 @@
         setUpMockDecorationForTask(task)
 
         onTaskChanging(task, taskSurface)
-        verify(mockDesktopModeWindowDecorFactory, never()).create(
-                mContext,
-                mockDisplayController,
-                mockSplitScreenController,
-                mockTaskOrganizer,
-                task,
-                taskSurface,
-                mockMainHandler,
-                bgExecutor,
-                mockMainChoreographer,
-                mockSyncQueue,
-                mockRootTaskDisplayAreaOrganizer,
-                mockGenericLinksParser
-        )
+        assertFalse(windowDecorByTaskIdSpy.contains(task.taskId))
 
         task.setWindowingMode(WINDOWING_MODE_FREEFORM)
         task.setActivityType(ACTIVITY_TYPE_STANDARD)
         onTaskChanging(task, taskSurface)
-        verify(mockDesktopModeWindowDecorFactory, times(1)).create(
-                mContext,
-                mockDisplayController,
-                mockSplitScreenController,
-                mockTaskOrganizer,
-                task,
-                taskSurface,
-                mockMainHandler,
-                bgExecutor,
-                mockMainChoreographer,
-                mockSyncQueue,
-                mockRootTaskDisplayAreaOrganizer,
-                mockGenericLinksParser
-        )
+        assertTrue(windowDecorByTaskIdSpy.contains(task.taskId))
     }
 
     @Test
@@ -364,9 +328,7 @@
         task.setWindowingMode(ACTIVITY_TYPE_UNDEFINED)
         onTaskChanging(task)
 
-        verify(mockDesktopModeWindowDecorFactory, never())
-                .create(any(), any(), any(), any(), eq(task), any(), any(), any(), any(), any(),
-                    any(), any())
+        assertFalse(windowDecorByTaskIdSpy.contains(task.taskId))
     }
 
     @Test
@@ -386,9 +348,7 @@
             setUpMockDecorationsForTasks(task)
 
             onTaskOpening(task)
-            verify(mockDesktopModeWindowDecorFactory)
-                    .create(any(), any(), any(), any(), eq(task), any(), any(), any(), any(),
-                        any(), any(), any())
+            assertTrue(windowDecorByTaskIdSpy.contains(task.taskId))
         } finally {
             mockitoSession.finishMocking()
         }
@@ -404,9 +364,7 @@
         }
         onTaskOpening(task)
 
-        verify(mockDesktopModeWindowDecorFactory, never())
-                .create(any(), any(), any(), any(), eq(task), any(), any(), any(), any(), any(),
-                    any(), any())
+        assertFalse(windowDecorByTaskIdSpy.contains(task.taskId))
     }
 
     @Test
@@ -422,9 +380,7 @@
 
         onTaskOpening(task)
 
-        verify(mockDesktopModeWindowDecorFactory, never())
-                .create(any(), any(), any(), any(), eq(task), any(), any(), any(), any(), any(),
-                    any(), any())
+        assertFalse(windowDecorByTaskIdSpy.contains(task.taskId))
     }
 
     @Test
@@ -520,9 +476,7 @@
             doReturn(false).`when` { DesktopModeStatus.isDesktopModeSupported(any()) }
 
             onTaskOpening(task)
-            verify(mockDesktopModeWindowDecorFactory, never())
-                .create(any(), any(), any(), any(), eq(task), any(), any(), any(), any(), any(),
-                    any(), any())
+            assertFalse(windowDecorByTaskIdSpy.contains(task.taskId))
         } finally {
             mockitoSession.finishMocking()
         }
@@ -545,9 +499,7 @@
             setUpMockDecorationsForTasks(task)
 
             onTaskOpening(task)
-            verify(mockDesktopModeWindowDecorFactory)
-                .create(any(), any(), any(), any(), eq(task), any(), any(), any(), any(), any(),
-                    any(), any())
+            assertTrue(windowDecorByTaskIdSpy.contains(task.taskId))
         } finally {
             mockitoSession.finishMocking()
         }
@@ -569,9 +521,7 @@
             setUpMockDecorationsForTasks(task)
 
             onTaskOpening(task)
-            verify(mockDesktopModeWindowDecorFactory)
-                .create(any(), any(), any(), any(), eq(task), any(), any(), any(), any(), any(),
-                    any(), any())
+            assertTrue(windowDecorByTaskIdSpy.contains(task.taskId))
         } finally {
             mockitoSession.finishMocking()
         }
@@ -693,7 +643,7 @@
             @WindowConfiguration.WindowingMode windowingMode: Int,
             activityType: Int = ACTIVITY_TYPE_STANDARD,
             focused: Boolean = true,
-            activityInfo: ActivityInfo = ActivityInfo()
+            activityInfo: ActivityInfo = ActivityInfo(),
     ): RunningTaskInfo {
         return TestRunningTaskInfoBuilder()
                 .setDisplayId(displayId)
@@ -709,8 +659,8 @@
     private fun setUpMockDecorationForTask(task: RunningTaskInfo): DesktopModeWindowDecoration {
         val decoration = mock(DesktopModeWindowDecoration::class.java)
         whenever(
-            mockDesktopModeWindowDecorFactory.create(any(), any(), any(), any(), eq(task), any(),
-                any(), any(), any(), any(), any(), any())
+            mockDesktopModeWindowDecorFactory.create(any(), any(), any(), any(), any(), eq(task),
+                any(), any(), any(), any(), any(), any(), any())
         ).thenReturn(decoration)
         decoration.mTaskInfo = task
         whenever(decoration.isFocused).thenReturn(task.isFocused)
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java
index cee9307..04b1eed 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java
@@ -826,10 +826,10 @@
             ActivityManager.RunningTaskInfo taskInfo,
             MaximizeMenuFactory maximizeMenuFactory) {
         final DesktopModeWindowDecoration windowDecor = new DesktopModeWindowDecoration(mContext,
-                mMockDisplayController, mMockSplitScreenController, mMockShellTaskOrganizer,
-                taskInfo, mMockSurfaceControl, mMockHandler, mBgExecutor, mMockChoreographer,
-                mMockSyncQueue, mMockRootTaskDisplayAreaOrganizer, mMockGenericLinksParser,
-                SurfaceControl.Builder::new, mMockTransactionSupplier,
+                mContext, mMockDisplayController, mMockSplitScreenController,
+                mMockShellTaskOrganizer, taskInfo, mMockSurfaceControl, mMockHandler, mBgExecutor,
+                mMockChoreographer, mMockSyncQueue, mMockRootTaskDisplayAreaOrganizer,
+                mMockGenericLinksParser, SurfaceControl.Builder::new, mMockTransactionSupplier,
                 WindowContainerTransaction::new, SurfaceControl::new,
                 mMockSurfaceControlViewHostFactory, maximizeMenuFactory, mMockHandleMenuFactory);
         windowDecor.setCaptionListeners(mMockTouchEventListener, mMockTouchEventListener,
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java
index ca6e03c..e6e2d09 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java
@@ -51,6 +51,7 @@
 import static org.mockito.Mockito.when;
 import static org.mockito.quality.Strictness.LENIENT;
 
+import android.annotation.NonNull;
 import android.app.ActivityManager;
 import android.content.Context;
 import android.content.res.Resources;
@@ -893,8 +894,8 @@
     }
 
     private TestWindowDecoration createWindowDecoration(ActivityManager.RunningTaskInfo taskInfo) {
-        return new TestWindowDecoration(mContext, mMockDisplayController, mMockShellTaskOrganizer,
-                taskInfo, mMockTaskSurface,
+        return new TestWindowDecoration(mContext, mContext, mMockDisplayController,
+                mMockShellTaskOrganizer, taskInfo, mMockTaskSurface,
                 new MockObjectSupplier<>(mMockSurfaceControlBuilders,
                         () -> createMockSurfaceControlBuilder(mock(SurfaceControl.class))),
                 new MockObjectSupplier<>(mMockSurfaceControlTransactions,
@@ -932,7 +933,8 @@
     }
 
     private class TestWindowDecoration extends WindowDecoration<TestView> {
-        TestWindowDecoration(Context context, DisplayController displayController,
+        TestWindowDecoration(Context context, @NonNull Context userContext,
+                DisplayController displayController,
                 ShellTaskOrganizer taskOrganizer, ActivityManager.RunningTaskInfo taskInfo,
                 SurfaceControl taskSurface,
                 Supplier<SurfaceControl.Builder> surfaceControlBuilderSupplier,
@@ -940,7 +942,7 @@
                 Supplier<WindowContainerTransaction> windowContainerTransactionSupplier,
                 Supplier<SurfaceControl> surfaceControlSupplier,
                 SurfaceControlViewHostFactory surfaceControlViewHostFactory) {
-            super(context, displayController, taskOrganizer, taskInfo, taskSurface,
+            super(context, userContext, displayController, taskOrganizer, taskInfo, taskSurface,
                     surfaceControlBuilderSupplier, surfaceControlTransactionSupplier,
                     windowContainerTransactionSupplier, surfaceControlSupplier,
                     surfaceControlViewHostFactory);