Merge "Allow volume paths from both users when verifying file columns." into sc-dev
diff --git a/apex/Android.bp b/apex/Android.bp
index a5e9942..cb6da5f 100644
--- a/apex/Android.bp
+++ b/apex/Android.bp
@@ -17,7 +17,7 @@
 
 apex_defaults {
     name: "com.android.mediaprovider-defaults",
-    java_libs: ["framework-mediaprovider"],
+    bootclasspath_fragments: ["com.android.mediaprovider-bootclasspath-fragment"],
     key: "com.android.mediaprovider.key",
     certificate: ":com.android.mediaprovider.certificate",
     file_contexts: ":com.android.mediaprovider-file_contexts",
@@ -45,3 +45,10 @@
         "framework-mediaprovider",
     ],
 }
+
+// Encapsulate the contributions made by the com.android.mediaprovider to the bootclasspath.
+bootclasspath_fragment {
+    name: "com.android.mediaprovider-bootclasspath-fragment",
+    contents: ["framework-mediaprovider"],
+    apex_available: ["com.android.mediaprovider"],
+}
diff --git a/apex/apex_manifest.json b/apex/apex_manifest.json
index 6d8da53..d87ce8d 100644
--- a/apex/apex_manifest.json
+++ b/apex/apex_manifest.json
@@ -1,4 +1,4 @@
 {
   "name": "com.android.mediaprovider",
-  "version": 309999900
+  "version": 309999910
 }
diff --git a/jni/FuseDaemon.cpp b/jni/FuseDaemon.cpp
index a482e01..833e9c6 100755
--- a/jni/FuseDaemon.cpp
+++ b/jni/FuseDaemon.cpp
@@ -749,13 +749,8 @@
     ATRACE_CALL();
     struct fuse* fuse = get_fuse(req);
 
-    if (mode) {
-        fuse_reply_err(req, EOPNOTSUPP);
-        return;
-    }
-
     handle* h = reinterpret_cast<handle*>(fi->fh);
-    auto err = posix_fallocate(h->fd, offset, length);
+    auto err = fallocate(h->fd, mode, offset, length);
     fuse_reply_err(req, err);
 }
 
diff --git a/src/com/android/providers/media/DatabaseHelper.java b/src/com/android/providers/media/DatabaseHelper.java
index f853150..7bcdf62 100644
--- a/src/com/android/providers/media/DatabaseHelper.java
+++ b/src/com/android/providers/media/DatabaseHelper.java
@@ -26,7 +26,6 @@
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.Intent;
-import android.content.SharedPreferences;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ProviderInfo;
@@ -62,7 +61,6 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
-import com.android.modules.utils.build.SdkLevel;
 import com.android.providers.media.playlist.Playlist;
 import com.android.providers.media.util.BackgroundThread;
 import com.android.providers.media.util.DatabaseUtils;
@@ -106,8 +104,6 @@
      */
     public static final String CURRENT_GENERATION_CLAUSE = "SELECT generation FROM local_metadata";
 
-    static final String PREF_DB_FROM_VERSION = "db_from_version";
-
     private static final int NOTIFY_BATCH_SIZE = 256;
 
     final Context mContext;
@@ -359,8 +355,6 @@
             updateDatabase(db, oldV, newV);
         } finally {
             mSchemaLock.writeLock().unlock();
-            SharedPreferences prefs = mContext.getSharedPreferences(TAG, Context.MODE_PRIVATE);
-            prefs.edit().putInt(PREF_DB_FROM_VERSION, oldV).commit();
         }
     }
 
@@ -1412,7 +1406,8 @@
 
     private static void updateAddRecording(SQLiteDatabase db, boolean internal) {
         db.execSQL("ALTER TABLE files ADD COLUMN is_recording INTEGER DEFAULT 0;");
-        updateRecordingForSUpdate(db, internal);
+        // We add the column is_recording, rescan all music files
+        db.execSQL("UPDATE files SET date_modified=0 WHERE is_music=1;");
     }
 
     private static void updateAddRedactedUriId(SQLiteDatabase db) {
@@ -1567,7 +1562,6 @@
                 UserHandle.myUserId()));
     }
 
-
     private static void recomputeDataValues(SQLiteDatabase db, boolean internal) {
         try (Cursor c = db.query("files", new String[] { FileColumns._ID, FileColumns.DATA },
                 null, null, null, null, null, null)) {
@@ -1619,13 +1613,6 @@
         }
     }
 
-    static void updateRecordingForSUpdate(SQLiteDatabase db, boolean internal) {
-        if (SdkLevel.isAtLeastS()) {
-            // Rescan all music files to update is_recording type
-            db.execSQL("UPDATE files SET date_modified=0 WHERE is_music=1;");
-        }
-    }
-
     static final int VERSION_J = 509;
     static final int VERSION_K = 700;
     static final int VERSION_L = 700;
diff --git a/src/com/android/providers/media/MediaProvider.java b/src/com/android/providers/media/MediaProvider.java
index 283d5a1..c369257 100644
--- a/src/com/android/providers/media/MediaProvider.java
+++ b/src/com/android/providers/media/MediaProvider.java
@@ -1312,28 +1312,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;
         }
@@ -3070,6 +3056,7 @@
                             Environment.DIRECTORY_MUSIC,
                             Environment.DIRECTORY_NOTIFICATIONS,
                             Environment.DIRECTORY_PODCASTS,
+                            FileUtils.DIRECTORY_RECORDINGS,
                             Environment.DIRECTORY_RINGTONES);
                 }
                 break;
diff --git a/src/com/android/providers/media/MediaUpgradeReceiver.java b/src/com/android/providers/media/MediaUpgradeReceiver.java
index 320e1c2..abb326a 100644
--- a/src/com/android/providers/media/MediaUpgradeReceiver.java
+++ b/src/com/android/providers/media/MediaUpgradeReceiver.java
@@ -24,7 +24,6 @@
 import android.util.Log;
 
 import com.android.providers.media.util.ForegroundThread;
-import com.android.providers.media.util.Logging;
 import com.android.providers.media.util.Metrics;
 
 import java.io.File;
@@ -43,8 +42,6 @@
     static final String TAG = "MediaUpgradeReceiver";
     static final String PREF_DB_VERSION = "db_version";
 
-    private static final int UPDATE_RECORDING_VERSION = 1205;
-
     @Override
     public void onReceive(Context context, Intent intent) {
         // We are now running with the system up, but no apps started,
@@ -67,10 +64,6 @@
         prefs.edit().putInt(PREF_DB_VERSION, dbVersion).commit();
 
         try {
-            // Lookup the last from_version when upgrade database
-            prefs = context.getSharedPreferences(Logging.TAG, Context.MODE_PRIVATE);
-            final int fromVersion = prefs.getInt(DatabaseHelper.PREF_DB_FROM_VERSION, 0);
-
             File dbDir = context.getDatabasePath("foo").getParentFile();
             String[] files = dbDir.list();
             if (files == null) return;
@@ -86,13 +79,7 @@
                                 MediaProvider.MIGRATION_LISTENER, null);
                         helper.runWithTransaction((db) -> {
                             // Perform just enough to force database upgrade
-                            final int version = db.getVersion();
-                            // update the is_recording column for R OS upgraded to S OS
-                            if (fromVersion >= UPDATE_RECORDING_VERSION
-                                    && prefVersion < DatabaseHelper.VERSION_S) {
-                                helper.updateRecordingForSUpdate(db, helper.mInternal);
-                            }
-                            return version;
+                            return db.getVersion();
                         });
                         helper.close();
                     } catch (Throwable t) {
diff --git a/src/com/android/providers/media/TranscodeHelper.java b/src/com/android/providers/media/TranscodeHelper.java
index e1ffbca..9a74ddc 100644
--- a/src/com/android/providers/media/TranscodeHelper.java
+++ b/src/com/android/providers/media/TranscodeHelper.java
@@ -437,8 +437,8 @@
         CountDownLatch latch = null;
         long startTime = SystemClock.elapsedRealtime();
         boolean result = false;
-        int errorCode = TranscodingSession.ERROR_NONE;
-        int failureReason = TRANSCODING_DATA__FAILURE_CAUSE__CAUSE_UNKNOWN;
+        int errorCode = TranscodingSession.ERROR_SERVICE_DIED;
+        int failureReason = TRANSCODING_DATA__FAILURE_CAUSE__TRANSCODING_SERVICE_ERROR;
 
         try {
             synchronized (mLock) {
@@ -481,6 +481,16 @@
                 transcodingSession.cancel();
             }
         } finally {
+            if (storageSession == null) {
+                Log.w(TAG, "Failed to create a StorageTranscodingSession");
+                // We were unable to even queue the request. Which means the media service is
+                // in a very bad state
+                reportTranscodingResult(uid, result, errorCode, failureReason,
+                        SystemClock.elapsedRealtime() - startTime, reason,
+                        src, dst, false /* hasAnr */);
+                return false;
+            }
+
             storageSession.notifyFinished(failureReason, errorCode);
             if (errorCode == TranscodingSession.ERROR_DROPPED_BY_SERVICE) {
                 // If the transcoding service drops a request for a uid the uid will be denied
diff --git a/src/com/android/providers/media/scan/ModernMediaScanner.java b/src/com/android/providers/media/scan/ModernMediaScanner.java
index 9a38945..8927bfa 100644
--- a/src/com/android/providers/media/scan/ModernMediaScanner.java
+++ b/src/com/android/providers/media/scan/ModernMediaScanner.java
@@ -1226,6 +1226,8 @@
         sAudioTypes.put(Environment.DIRECTORY_MUSIC, AudioColumns.IS_MUSIC);
         if (SdkLevel.isAtLeastS()) {
             sAudioTypes.put(Environment.DIRECTORY_RECORDINGS, AudioColumns.IS_RECORDING);
+        } else {
+            sAudioTypes.put(FileUtils.DIRECTORY_RECORDINGS, AudioColumns.IS_RECORDING);
         }
     }
 
diff --git a/src/com/android/providers/media/util/FileUtils.java b/src/com/android/providers/media/util/FileUtils.java
index cf7c23a..47e1559 100644
--- a/src/com/android/providers/media/util/FileUtils.java
+++ b/src/com/android/providers/media/util/FileUtils.java
@@ -964,6 +964,12 @@
     public static final Pattern PATTERN_OBB_OR_CHILD_PATH = Pattern.compile(
             "(?i)^/storage/[^/]+/(?:[0-9]+/)?Android/(?:obb)(/?.*)");
 
+    /**
+     * The recordings directory. This is used for R OS. For S OS or later,
+     * we use {@link Environment#DIRECTORY_RECORDINGS} directly.
+     */
+    public static final String DIRECTORY_RECORDINGS = "Recordings";
+
     @VisibleForTesting
     public static final String[] DEFAULT_FOLDER_NAMES;
     static {
@@ -995,6 +1001,7 @@
                     Environment.DIRECTORY_DCIM,
                     Environment.DIRECTORY_DOCUMENTS,
                     Environment.DIRECTORY_AUDIOBOOKS,
+                    DIRECTORY_RECORDINGS,
             };
         }
     }
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,