Merge "Handle media transcoding enqueue failures" into sc-dev
diff --git a/src/com/android/providers/media/MediaProvider.java b/src/com/android/providers/media/MediaProvider.java
index e13d874..5fd69ed 100644
--- a/src/com/android/providers/media/MediaProvider.java
+++ b/src/com/android/providers/media/MediaProvider.java
@@ -1300,28 +1300,14 @@
             UserHandle user1 = UserHandle.of(userId1);
             UserHandle user2 = UserHandle.of(userId2);
 
-            // Need to create system package context here as the clone profile user doesn't run
-            // a MediaProvider instance of its own, and hence we can't use
-            // createContextAsUser which uses the current MediaProvider module package.
-            final Context userContext1 = getContext().createPackageContextAsUser("system", 0,
-                    user1);
-            boolean isMediaSharedWithParent1 = userContext1.getSystemService(
-                    UserManager.class).isMediaSharedWithParent();
-            final Context userContext2 = getContext().createPackageContextAsUser("system", 0,
-                    user2);
-            boolean isMediaSharedWithParent2 = userContext2.getSystemService(
-                    UserManager.class).isMediaSharedWithParent();
-
-            // Clone profiles share media with the parent user
-            if (SdkLevel.isAtLeastS() && (isMediaSharedWithParent1
-                    || isMediaSharedWithParent2)) {
-                return mUserManager.isSameProfileGroup(user1, user2);
+            if (SdkLevel.isAtLeastS() && (mUserCache.userSharesMediaWithParent(user1)
+                    || mUserCache.userSharesMediaWithParent(user2))) {
+                return true;
             }
             Method isAppCloneUserPair = StorageManager.class.getMethod("isAppCloneUserPair",
                     int.class, int.class);
             return (Boolean) isAppCloneUserPair.invoke(mStorageManager, userId1, userId2);
-        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException |
-                NameNotFoundException e) {
+        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
             Log.w(TAG, "isAppCloneUserPair failed. Users: " + userId1 + " and " + userId2);
             return false;
         }
diff --git a/tests/src/com/android/providers/media/util/PermissionUtilsTest.java b/tests/src/com/android/providers/media/util/PermissionUtilsTest.java
index 7facf05..c434bd2 100644
--- a/tests/src/com/android/providers/media/util/PermissionUtilsTest.java
+++ b/tests/src/com/android/providers/media/util/PermissionUtilsTest.java
@@ -89,14 +89,9 @@
     private static final TestApp LEGACY_TEST_APP = new TestApp("LegacyTestApp",
             "com.android.providers.media.testapp.legacy", 1, false,
             "LegacyMediaProviderTestApp.apk");
-    private static final Map<String, Integer> pidMap = new HashMap<>();
 
-    @BeforeClass
-    public static void startTestApps() throws Exception {
-        startTestApp(TEST_APP_WITH_STORAGE_PERMS);
-        startTestApp(TEST_APP_WITHOUT_PERMS);
-        startTestApp(LEGACY_TEST_APP);
-    }
+    // Permission checks are based on uid, so we can pass -1 pid and avoid starting the test apps.
+    private static final int TEST_APP_PID = -1;
 
     @Test
     public void testConstructor() {
@@ -149,25 +144,24 @@
     public void testDefaultPermissionsOnTestAppWithStoragePerms() throws Exception {
         String packageName = TEST_APP_WITH_STORAGE_PERMS.getPackageName();
         int testAppUid = getContext().getPackageManager().getPackageUid(packageName, 0);
-        int testAppPid = pidMap.get(packageName);
         adoptShellPermission(UPDATE_APP_OPS_STATS);
 
         try {
-            assertThat(checkPermissionSelf(getContext(), testAppPid, testAppUid)).isFalse();
-            assertThat(checkPermissionShell(getContext(), testAppPid, testAppUid)).isFalse();
+            assertThat(checkPermissionSelf(getContext(), TEST_APP_PID, testAppUid)).isFalse();
+            assertThat(checkPermissionShell(getContext(), TEST_APP_PID, testAppUid)).isFalse();
             assertThat(
                     checkIsLegacyStorageGranted(getContext(), testAppUid, packageName,
                             null)).isFalse();
             assertThat(
-                    checkPermissionInstallPackages(getContext(), testAppPid, testAppUid,
+                    checkPermissionInstallPackages(getContext(), TEST_APP_PID, testAppUid,
                             packageName, null)).isFalse();
             assertThat(
-                    checkPermissionAccessMtp(getContext(), testAppPid, testAppUid, packageName,
+                    checkPermissionAccessMtp(getContext(), TEST_APP_PID, testAppUid, packageName,
                             null)).isFalse();
             assertThat(
-                    checkPermissionWriteStorage(getContext(), testAppPid, testAppUid, packageName,
+                    checkPermissionWriteStorage(getContext(), TEST_APP_PID, testAppUid, packageName,
                             null)).isTrue();
-            checkReadPermissions(testAppPid, testAppUid, packageName, true);
+            checkReadPermissions(TEST_APP_PID, testAppUid, packageName, true);
         } finally {
             dropShellPermission();
         }
@@ -177,36 +171,37 @@
     public void testDefaultPermissionsOnTestAppWithoutPerms() throws Exception {
         String packageName = TEST_APP_WITHOUT_PERMS.getPackageName();
         int testAppUid = getContext().getPackageManager().getPackageUid(packageName, 0);
-        int testAppPid = pidMap.get(packageName);
         adoptShellPermission(UPDATE_APP_OPS_STATS);
 
         try {
-            assertThat(checkPermissionSelf(getContext(), testAppPid, testAppUid)).isFalse();
-            assertThat(checkPermissionShell(getContext(), testAppPid, testAppUid)).isFalse();
+            assertThat(checkPermissionSelf(getContext(), TEST_APP_PID, testAppUid)).isFalse();
+            assertThat(checkPermissionShell(getContext(), TEST_APP_PID, testAppUid)).isFalse();
             assertThat(
-                    checkPermissionManager(getContext(), testAppPid, testAppUid, packageName,
+                    checkPermissionManager(getContext(), TEST_APP_PID, testAppUid, packageName,
                             null)).isFalse();
 
-            assertThat(checkPermissionManageMedia(getContext(), testAppPid, testAppUid, packageName,
-                    null)).isFalse();
+            assertThat(
+                    checkPermissionManageMedia(
+                            getContext(), TEST_APP_PID, testAppUid, packageName, null))
+                    .isFalse();
 
-            assertThat(checkPermissionAccessMediaLocation(getContext(), testAppPid, testAppUid,
+            assertThat(checkPermissionAccessMediaLocation(getContext(), TEST_APP_PID, testAppUid,
                     packageName, null)).isFalse();
 
             assertThat(
                     checkIsLegacyStorageGranted(getContext(), testAppUid, packageName,
                             null)).isFalse();
             assertThat(
-                    checkPermissionInstallPackages(getContext(), testAppPid, testAppUid,
+                    checkPermissionInstallPackages(getContext(), TEST_APP_PID, testAppUid,
                             packageName,
                             null)).isFalse();
             assertThat(
-                    checkPermissionAccessMtp(getContext(), testAppPid, testAppUid, packageName,
+                    checkPermissionAccessMtp(getContext(), TEST_APP_PID, testAppUid, packageName,
                             null)).isFalse();
             assertThat(
-                    checkPermissionWriteStorage(getContext(), testAppPid, testAppUid, packageName,
+                    checkPermissionWriteStorage(getContext(), TEST_APP_PID, testAppUid, packageName,
                             null)).isFalse();
-            checkReadPermissions(testAppPid, testAppUid, packageName, false);
+            checkReadPermissions(TEST_APP_PID, testAppUid, packageName, false);
         } finally {
             dropShellPermission();
         }
@@ -216,35 +211,36 @@
     public void testDefaultPermissionsOnLegacyTestApp() throws Exception {
         String packageName = LEGACY_TEST_APP.getPackageName();
         int testAppUid = getContext().getPackageManager().getPackageUid(packageName, 0);
-        int testAppPid = pidMap.get(packageName);
         adoptShellPermission(UPDATE_APP_OPS_STATS);
 
         try {
-            assertThat(checkPermissionSelf(getContext(), testAppPid, testAppUid)).isFalse();
-            assertThat(checkPermissionShell(getContext(), testAppPid, testAppUid)).isFalse();
+            assertThat(checkPermissionSelf(getContext(), TEST_APP_PID, testAppUid)).isFalse();
+            assertThat(checkPermissionShell(getContext(), TEST_APP_PID, testAppUid)).isFalse();
             assertThat(
-                    checkPermissionManager(getContext(), testAppPid, testAppUid, packageName,
+                    checkPermissionManager(getContext(), TEST_APP_PID, testAppUid, packageName,
                             null)).isFalse();
 
-            assertThat(checkPermissionManageMedia(getContext(), testAppPid, testAppUid, packageName,
-                    null)).isFalse();
+            assertThat(
+                    checkPermissionManageMedia(
+                            getContext(), TEST_APP_PID, testAppUid, packageName, null))
+                    .isFalse();
 
-            assertThat(checkPermissionAccessMediaLocation(getContext(), testAppPid, testAppUid,
+            assertThat(checkPermissionAccessMediaLocation(getContext(), TEST_APP_PID, testAppUid,
                     packageName, null)).isTrue();
 
             assertThat(
                     checkIsLegacyStorageGranted(getContext(), testAppUid, packageName,
                             null)).isTrue();
             assertThat(
-                    checkPermissionInstallPackages(getContext(), testAppPid, testAppUid,
+                    checkPermissionInstallPackages(getContext(), TEST_APP_PID, testAppUid,
                             packageName, null)).isFalse();
             assertThat(
-                    checkPermissionAccessMtp(getContext(), testAppPid, testAppUid, packageName,
+                    checkPermissionAccessMtp(getContext(), TEST_APP_PID, testAppUid, packageName,
                             null)).isFalse();
             assertThat(
-                    checkPermissionWriteStorage(getContext(), testAppPid, testAppUid, packageName,
+                    checkPermissionWriteStorage(getContext(), TEST_APP_PID, testAppUid, packageName,
                             null)).isFalse();
-            checkReadPermissions(testAppPid, testAppUid, packageName, true);
+            checkReadPermissions(TEST_APP_PID, testAppUid, packageName, true);
         } finally {
             dropShellPermission();
         }
@@ -254,19 +250,18 @@
     public void testManageExternalStoragePermissionsOnTestApp() throws Exception {
         final String packageName = TEST_APP_WITH_STORAGE_PERMS.getPackageName();
         final int testAppUid = getContext().getPackageManager().getPackageUid(packageName, 0);
-        final int testAppPid = pidMap.get(packageName);
         final String op = AppOpsManager.permissionToOp(MANAGE_EXTERNAL_STORAGE);
         adoptShellPermission(UPDATE_APP_OPS_STATS, MANAGE_APP_OPS_MODES);
 
         try {
             modifyAppOp(testAppUid, op, AppOpsManager.MODE_ERRORED);
 
-            assertThat(checkPermissionManager(getContext(), testAppPid, testAppUid, packageName,
+            assertThat(checkPermissionManager(getContext(), TEST_APP_PID, testAppUid, packageName,
                     null)).isFalse();
 
             modifyAppOp(testAppUid, op, AppOpsManager.MODE_ALLOWED);
 
-            assertThat(checkPermissionManager(getContext(), testAppPid, testAppUid, packageName,
+            assertThat(checkPermissionManager(getContext(), TEST_APP_PID, testAppUid, packageName,
                     null)).isTrue();
         } finally {
             dropShellPermission();
@@ -278,20 +273,23 @@
     public void testManageMediaPermissionsOnTestApp() throws Exception {
         final String packageName = TEST_APP_WITH_STORAGE_PERMS.getPackageName();
         final int testAppUid = getContext().getPackageManager().getPackageUid(packageName, 0);
-        final int testAppPid = pidMap.get(packageName);
         final String op = AppOpsManager.permissionToOp(MANAGE_MEDIA);
         adoptShellPermission(UPDATE_APP_OPS_STATS, MANAGE_APP_OPS_MODES);
 
         try {
             modifyAppOp(testAppUid, op, AppOpsManager.MODE_ERRORED);
 
-            assertThat(checkPermissionManageMedia(getContext(), testAppPid, testAppUid, packageName,
-                    null)).isFalse();
+            assertThat(
+                    checkPermissionManageMedia(
+                            getContext(), TEST_APP_PID, testAppUid, packageName, null))
+                    .isFalse();
 
             modifyAppOp(testAppUid, op, AppOpsManager.MODE_ALLOWED);
 
-            assertThat(checkPermissionManageMedia(getContext(), testAppPid, testAppUid, packageName,
-                    null)).isTrue();
+            assertThat(
+                    checkPermissionManageMedia(
+                            getContext(), TEST_APP_PID, testAppUid, packageName, null))
+                    .isTrue();
         } finally {
             dropShellPermission();
         }
@@ -301,23 +299,22 @@
     public void testSystemGalleryPermissionsOnTestApp() throws Exception {
         String packageName = TEST_APP_WITH_STORAGE_PERMS.getPackageName();
         int testAppUid = getContext().getPackageManager().getPackageUid(packageName, 0);
-        int testAppPid = pidMap.get(packageName);
         adoptShellPermission(UPDATE_APP_OPS_STATS, MANAGE_APP_OPS_MODES);
 
         try {
-            checkPermissionsForGallery(testAppUid, testAppPid, packageName, false);
+            checkPermissionsForGallery(testAppUid, TEST_APP_PID, packageName, false);
 
             final String[] SYSTEM_GALERY_APPOPS =
                     {OPSTR_WRITE_MEDIA_IMAGES, OPSTR_WRITE_MEDIA_VIDEO};
             for (String op : SYSTEM_GALERY_APPOPS) {
                 modifyAppOp(testAppUid, op, AppOpsManager.MODE_ALLOWED);
             }
-            checkPermissionsForGallery(testAppUid, testAppPid, packageName, true);
+            checkPermissionsForGallery(testAppUid, TEST_APP_PID, packageName, true);
 
             for (String op : SYSTEM_GALERY_APPOPS) {
                 modifyAppOp(testAppUid, op, AppOpsManager.MODE_ERRORED);
             }
-            checkPermissionsForGallery(testAppUid, testAppPid, packageName, false);
+            checkPermissionsForGallery(testAppUid, TEST_APP_PID, packageName, false);
         } finally {
             dropShellPermission();
         }
@@ -353,22 +350,21 @@
         final String packageName = TEST_APP_WITH_STORAGE_PERMS.getPackageName();
         int testAppUid = getContext().getPackageManager().getPackageUid(
                 packageName, 0);
-        int testAppPid = pidMap.get(packageName);
         adoptShellPermission(UPDATE_APP_OPS_STATS, MANAGE_APP_OPS_MODES);
 
         try {
             assertThat(
-                    checkPermissionReadVideo(getContext(), testAppPid, testAppUid, packageName,
+                    checkPermissionReadVideo(getContext(), TEST_APP_PID, testAppUid, packageName,
                             null)).isTrue();
 
             modifyAppOp(testAppUid, OPSTR_READ_MEDIA_VIDEO, AppOpsManager.MODE_ERRORED);
             assertThat(
-                    checkPermissionReadVideo(getContext(), testAppPid, testAppUid, packageName,
+                    checkPermissionReadVideo(getContext(), TEST_APP_PID, testAppUid, packageName,
                             null)).isFalse();
 
             modifyAppOp(testAppUid, OPSTR_READ_MEDIA_VIDEO, AppOpsManager.MODE_ALLOWED);
             assertThat(
-                    checkPermissionReadVideo(getContext(), testAppPid, testAppUid, packageName,
+                    checkPermissionReadVideo(getContext(), TEST_APP_PID, testAppUid, packageName,
                             null)).isTrue();
         } finally {
             dropShellPermission();
@@ -380,22 +376,21 @@
         final String packageName = TEST_APP_WITH_STORAGE_PERMS.getPackageName();
         int testAppUid = getContext().getPackageManager().getPackageUid(
                 packageName, 0);
-        int testAppPid = pidMap.get(packageName);
         adoptShellPermission(UPDATE_APP_OPS_STATS, MANAGE_APP_OPS_MODES);
 
         try {
             assertThat(
-                    checkPermissionWriteAudio(getContext(), testAppPid, testAppUid, packageName,
+                    checkPermissionWriteAudio(getContext(), TEST_APP_PID, testAppUid, packageName,
                             null)).isFalse();
 
             modifyAppOp(testAppUid, OPSTR_WRITE_MEDIA_AUDIO, AppOpsManager.MODE_ALLOWED);
             assertThat(
-                    checkPermissionWriteAudio(getContext(), testAppPid, testAppUid, packageName,
+                    checkPermissionWriteAudio(getContext(), TEST_APP_PID, testAppUid, packageName,
                             null)).isTrue();
 
             modifyAppOp(testAppUid, OPSTR_WRITE_MEDIA_AUDIO, AppOpsManager.MODE_ERRORED);
             assertThat(
-                    checkPermissionWriteAudio(getContext(), testAppPid, testAppUid, packageName,
+                    checkPermissionWriteAudio(getContext(), TEST_APP_PID, testAppUid, packageName,
                             null)).isFalse();
         } finally {
             dropShellPermission();
@@ -407,22 +402,21 @@
         final String packageName = TEST_APP_WITH_STORAGE_PERMS.getPackageName();
         int testAppUid = getContext().getPackageManager().getPackageUid(
                 packageName, 0);
-        int testAppPid = pidMap.get(packageName);
         adoptShellPermission(UPDATE_APP_OPS_STATS, MANAGE_APP_OPS_MODES);
 
         try {
             assertThat(
-                    checkPermissionReadAudio(getContext(), testAppPid, testAppUid, packageName,
+                    checkPermissionReadAudio(getContext(), TEST_APP_PID, testAppUid, packageName,
                             null)).isTrue();
 
             modifyAppOp(testAppUid, OPSTR_READ_MEDIA_AUDIO, AppOpsManager.MODE_ERRORED);
             assertThat(
-                    checkPermissionReadAudio(getContext(), testAppPid, testAppUid, packageName,
+                    checkPermissionReadAudio(getContext(), TEST_APP_PID, testAppUid, packageName,
                             null)).isFalse();
 
             modifyAppOp(testAppUid, OPSTR_READ_MEDIA_AUDIO, AppOpsManager.MODE_ALLOWED);
             assertThat(
-                    checkPermissionReadAudio(getContext(), testAppPid, testAppUid, packageName,
+                    checkPermissionReadAudio(getContext(), TEST_APP_PID, testAppUid, packageName,
                             null)).isTrue();
         } finally {
             dropShellPermission();
@@ -433,22 +427,21 @@
     public void testReadImagesOnTestApp() throws Exception {
         final String packageName = TEST_APP_WITH_STORAGE_PERMS.getPackageName();
         int testAppUid = getContext().getPackageManager().getPackageUid(packageName, 0);
-        int testAppPid = pidMap.get(packageName);
         adoptShellPermission(UPDATE_APP_OPS_STATS, MANAGE_APP_OPS_MODES);
 
         try {
             assertThat(
-                    checkPermissionReadImages(getContext(), testAppPid, testAppUid, packageName,
+                    checkPermissionReadImages(getContext(), TEST_APP_PID, testAppUid, packageName,
                             null)).isTrue();
 
             modifyAppOp(testAppUid, OPSTR_READ_MEDIA_IMAGES, AppOpsManager.MODE_ERRORED);
             assertThat(
-                    checkPermissionReadImages(getContext(), testAppPid, testAppUid, packageName,
+                    checkPermissionReadImages(getContext(), TEST_APP_PID, testAppUid, packageName,
                             null)).isFalse();
 
             modifyAppOp(testAppUid, OPSTR_READ_MEDIA_IMAGES, AppOpsManager.MODE_ALLOWED);
             assertThat(
-                    checkPermissionReadImages(getContext(), testAppPid, testAppUid, packageName,
+                    checkPermissionReadImages(getContext(), TEST_APP_PID, testAppUid, packageName,
                             null)).isTrue();
         } finally {
             dropShellPermission();
@@ -477,23 +470,10 @@
                     checkAppOpRequestInstallPackagesForSharedUid(getContext(), testAppUid,
                             packageName, null)).isFalse();
         } finally {
-            // App gets killed when we try to give it OPSTR_REQUEST_INSTALL_PACKAGES. Restart the
-            // app so it doesn't affect other tests.
-            startTestApp(TEST_APP_WITH_STORAGE_PERMS);
             dropShellPermission();
         }
     }
 
-    static private void startTestApp(TestApp testApp) throws Exception {
-        Intent intent = new Intent(Intent.ACTION_MAIN);
-        intent.setPackage(testApp.getPackageName());
-        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        intent.addCategory(Intent.CATEGORY_LAUNCHER);
-        intent.putExtra(QUERY_TYPE, RUN_INFINITE_ACTIVITY);
-        getContext().startActivity(intent);
-        pidMap.put(testApp.getPackageName(), getPid(testApp.getPackageName()));
-    }
-
     static private void modifyAppOp(int uid, String op, int mode) {
         getContext().getSystemService(AppOpsManager.class).setUidMode(op, uid, mode);
     }
@@ -506,7 +486,9 @@
                 checkPermissionWriteImages(getContext(), pid, uid, packageName, null));
         assertEquals(expected,
                 checkPermissionWriteVideo(getContext(), pid, uid, packageName, null));
-        assertThat(checkPermissionWriteAudio(getContext(), pid, uid, packageName, null)).isFalse();
+        assertThat(
+                checkPermissionWriteAudio(getContext(), pid, uid, packageName, null))
+                .isFalse();
     }
 
     static private void checkReadPermissions(int pid, int uid, String packageName,