Fix device config writes in TranscodeTest for U

Starting in U, adb can't write to DeviceConfig. This is leading to
unsuccesful writes and eventually test failures in TranscodeTest where
we're attempting to write to DeviceConfig using UiAutomation
executeShellCommand.

To fix these failures, we're instead adopting the shell permission
identity to write device config using the DeviceConfig APIs.

Test: atest TranscodeTest
Bug: 270825056
Change-Id: Iaf98b7e20bd48fd92adcb94b44387437803fbef9
diff --git a/tests/MediaProviderTranscode/src/android/mediaprovidertranscode/cts/TranscodeTestUtils.java b/tests/MediaProviderTranscode/src/android/mediaprovidertranscode/cts/TranscodeTestUtils.java
index cf105c2..447c1a5 100644
--- a/tests/MediaProviderTranscode/src/android/mediaprovidertranscode/cts/TranscodeTestUtils.java
+++ b/tests/MediaProviderTranscode/src/android/mediaprovidertranscode/cts/TranscodeTestUtils.java
@@ -16,17 +16,18 @@
 
 package android.mediaprovidertranscode.cts;
 
-import static androidx.test.InstrumentationRegistry.getContext;
-
+import static android.Manifest.permission.WRITE_DEVICE_CONFIG;
 import static android.mediaprovidertranscode.cts.TranscodeTestConstants.INTENT_EXTRA_CALLING_PKG;
 import static android.mediaprovidertranscode.cts.TranscodeTestConstants.INTENT_EXTRA_PATH;
-import static android.mediaprovidertranscode.cts.TranscodeTestConstants.OPEN_FILE_QUERY;
 import static android.mediaprovidertranscode.cts.TranscodeTestConstants.INTENT_QUERY_TYPE;
+import static android.provider.DeviceConfig.NAMESPACE_STORAGE_NATIVE_BOOT;
+
+import static androidx.test.InstrumentationRegistry.getContext;
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import android.Manifest;
 import android.app.ActivityManager;
@@ -38,6 +39,10 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
+import android.media.MediaCodecInfo;
+import android.media.MediaCodecInfo.CodecCapabilities;
+import android.media.MediaCodecList;
+import android.media.MediaFormat;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Environment;
@@ -46,18 +51,13 @@
 import android.os.Process;
 import android.os.SystemClock;
 import android.os.storage.StorageManager;
-import android.os.storage.StorageVolume;
+import android.provider.DeviceConfig;
 import android.provider.MediaStore;
 import android.system.Os;
 import android.system.OsConstants;
 import android.util.Log;
 
-import android.media.MediaCodecInfo;
-import android.media.MediaCodecInfo.CodecCapabilities;
-import android.media.MediaCodecInfo.VideoCapabilities;
-import android.media.MediaCodecList;
-import android.media.MediaFormat;
-
+import androidx.annotation.NonNull;
 import androidx.test.InstrumentationRegistry;
 
 import com.android.cts.install.lib.Install;
@@ -85,6 +85,8 @@
 
     private static final long POLLING_TIMEOUT_MILLIS = TimeUnit.SECONDS.toMillis(20);
     private static final long POLLING_SLEEP_MILLIS = 100;
+    private static final String TRANSCODE_COMPAT_MANIFEST_DEVICE_CONFIG_PROPERTY_NAME =
+            "transcode_compat_manifest";
 
     public static Uri stageHEVCVideoFile(File videoFile) throws IOException {
         return stageVideoFile(videoFile, R.raw.testvideo_HEVC);
@@ -165,9 +167,16 @@
         assertThat(numBytesWritten).isEqualTo(byteCount);
     }
 
-    public static void enableTranscodingForPackage(String packageName) throws Exception {
-        executeShellCommand("device_config put storage_native_boot transcode_compat_manifest "
-                + packageName + ",0");
+    public static void enableTranscodingForPackage(String packageName) {
+        getUiAutomation().adoptShellPermissionIdentity(WRITE_DEVICE_CONFIG);
+        try {
+            final String newPropertyValue = packageName + ",0";
+            DeviceConfig.setProperty(NAMESPACE_STORAGE_NATIVE_BOOT,
+                    TRANSCODE_COMPAT_MANIFEST_DEVICE_CONFIG_PROPERTY_NAME, newPropertyValue,
+                    /* makeDefault */ false);
+        } finally {
+            getUiAutomation().dropShellPermissionIdentity();
+        }
         SystemClock.sleep(1000);
     }
 
@@ -186,8 +195,14 @@
         executeShellCommand(command);
     }
 
-    public static void disableTranscodingForAllPackages() throws IOException {
-        executeShellCommand("device_config delete storage_native_boot transcode_compat_manifest");
+    public static void disableTranscodingForAllPackages() {
+        getUiAutomation().adoptShellPermissionIdentity(WRITE_DEVICE_CONFIG);
+        try {
+            DeviceConfig.deleteProperty(NAMESPACE_STORAGE_NATIVE_BOOT,
+                    TRANSCODE_COMPAT_MANIFEST_DEVICE_CONFIG_PROPERTY_NAME);
+        } finally {
+            getUiAutomation().dropShellPermissionIdentity();
+        }
         SystemClock.sleep(1000);
     }
 
@@ -486,4 +501,9 @@
         }
         return false;
     }
+
+    @NonNull
+    private static UiAutomation getUiAutomation() {
+        return InstrumentationRegistry.getInstrumentation().getUiAutomation();
+    }
 }