Snap for 7991789 from 34b0e3f6c84ee1e8ed1fd5d45ce368a526d1a85d to mainline-permission-release
Change-Id: I33cadeb9bd197dc5a36a25e6be0a9add0f00671f
diff --git a/hostsidetests/appcompat/strictjavapackages/src/android/compat/sjp/cts/StrictJavaPackagesTest.java b/hostsidetests/appcompat/strictjavapackages/src/android/compat/sjp/cts/StrictJavaPackagesTest.java
index ca23a71..5ac8f32 100644
--- a/hostsidetests/appcompat/strictjavapackages/src/android/compat/sjp/cts/StrictJavaPackagesTest.java
+++ b/hostsidetests/appcompat/strictjavapackages/src/android/compat/sjp/cts/StrictJavaPackagesTest.java
@@ -26,7 +26,7 @@
import android.compat.testing.Classpaths;
import android.compat.testing.SharedLibraryInfo;
-import com.android.compatibility.common.util.ApiLevelUtil;
+import com.android.modules.utils.build.testing.DeviceSdkLevel;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
@@ -35,15 +35,20 @@
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSetMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multimaps;
+import org.jf.dexlib2.iface.ClassDef;
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.IOException;
import java.util.Collection;
import java.util.Set;
+import java.util.stream.Stream;
+
/**
* Tests for detecting no duplicate class files are present on BOOTCLASSPATH and
@@ -55,6 +60,17 @@
@RunWith(DeviceJUnit4ClassRunner.class)
public class StrictJavaPackagesTest extends BaseHostJUnit4Test {
+ private static final String ANDROID_TEST_MOCK_JAR = "/system/framework/android.test.mock.jar";
+
+ private static final Object sLock = new Object();
+ private static ImmutableList<String> sBootclasspathJars;
+ private static ImmutableList<String> sSystemserverclasspathJars;
+ private static ImmutableList<String> sSharedLibJars;
+ private static ImmutableList<SharedLibraryInfo> sSharedLibs;
+ private static ImmutableSetMultimap<String, String> sJarsToClasses;
+
+ private DeviceSdkLevel mDeviceSdkLevel;
+
/**
* This is the list of classes that are currently duplicated and should be addressed.
*
@@ -192,6 +208,28 @@
"Lcom/android/internal/util/FrameworkStatsLog;"
);
+ private static final String FEATURE_WEARABLE = "android.hardware.type.watch";
+ private static final String FEATURE_AUTOMOTIVE = "android.hardware.type.automotive";
+
+ private static final Set<String> WEAR_HIDL_OVERLAP_BURNDOWN_LIST =
+ ImmutableSet.of(
+ "Landroid/hidl/base/V1_0/DebugInfo$Architecture;",
+ "Landroid/hidl/base/V1_0/IBase;",
+ "Landroid/hidl/base/V1_0/IBase$Proxy;",
+ "Landroid/hidl/base/V1_0/IBase$Stub;",
+ "Landroid/hidl/base/V1_0/DebugInfo;",
+ "Landroid/hidl/safe_union/V1_0/Monostate;"
+ );
+
+ private static final Set<String> AUTOMOTIVE_HIDL_OVERLAP_BURNDOWN_LIST =
+ ImmutableSet.of(
+ "Landroid/hidl/base/V1_0/DebugInfo$Architecture;",
+ "Landroid/hidl/base/V1_0/IBase;",
+ "Landroid/hidl/base/V1_0/IBase$Proxy;",
+ "Landroid/hidl/base/V1_0/IBase$Stub;",
+ "Landroid/hidl/base/V1_0/DebugInfo;"
+ );
+
/**
* TODO(b/199529199): Address these.
* List of duplicate classes between bootclasspath and shared libraries.
@@ -199,7 +237,7 @@
* <p> DO NOT ADD CLASSES TO THIS LIST!
*/
private static final Set<String> BCP_AND_SHARED_LIB_BURNDOWN_LIST =
- ImmutableSet.of(
+ ImmutableSet.of(
"Landroid/hidl/base/V1_0/DebugInfo;",
"Landroid/hidl/base/V1_0/IBase;",
"Landroid/hidl/manager/V1_0/IServiceManager;",
@@ -245,6 +283,9 @@
"Lcom/qualcomm/qcrilmsgtunnel/IQcrilMsgTunnel;",
"Lcom/qualcomm/utils/CommandException;",
"Lcom/qualcomm/utils/RILConstants;",
+ "Lorg/codeaurora/telephony/utils/CommandException;",
+ "Lorg/codeaurora/telephony/utils/Log;",
+ "Lorg/codeaurora/telephony/utils/RILConstants;",
"Lorg/chromium/net/ApiVersion;",
"Lorg/chromium/net/BidirectionalStream;",
"Lorg/chromium/net/CallbackException;",
@@ -269,16 +310,70 @@
"Lorg/chromium/net/UploadDataSink;",
"Lorg/chromium/net/UrlRequest;",
"Lorg/chromium/net/UrlResponseInfo;"
- );
+ );
+
+ /**
+ * Fetch all jar files in BCP, SSCP and shared libs and extract all the classes.
+ *
+ * <p>This method cannot be static, as there are no static equivalents for {@link #getDevice()}
+ * and {@link #getBuild()}.
+ */
+ @Before
+ public void setupOnce() throws IOException, DeviceNotAvailableException {
+ if (getDevice() == null || getBuild() == null) {
+ throw new RuntimeException("No device and/or build type specified!");
+ }
+ mDeviceSdkLevel = new DeviceSdkLevel(getDevice());
+
+ synchronized (sLock) {
+ if (sJarsToClasses != null) {
+ return;
+ }
+ sBootclasspathJars = Classpaths.getJarsOnClasspath(getDevice(), BOOTCLASSPATH);
+ sSystemserverclasspathJars =
+ Classpaths.getJarsOnClasspath(getDevice(), SYSTEMSERVERCLASSPATH);
+ sSharedLibs = mDeviceSdkLevel.isDeviceAtLeastS()
+ ? Classpaths.getSharedLibraryInfos(getDevice(), getBuild())
+ : ImmutableList.of();
+ sSharedLibJars = sSharedLibs.stream()
+ .map(sharedLibraryInfo -> sharedLibraryInfo.paths)
+ .flatMap(ImmutableCollection::stream)
+ .filter(this::doesFileExist)
+ .collect(ImmutableList.toImmutableList());
+
+ final ImmutableSetMultimap.Builder<String, String> jarsToClasses =
+ ImmutableSetMultimap.builder();
+ Stream.of(sBootclasspathJars.stream(),
+ sSystemserverclasspathJars.stream(),
+ sSharedLibJars.stream())
+ .reduce(Stream::concat).orElseGet(Stream::empty)
+ .parallel()
+ .forEach(jar -> {
+ try {
+ ImmutableSet<String> classes =
+ Classpaths.getClassDefsFromJar(getDevice(), jar).stream()
+ .map(ClassDef::getType)
+ // Inner classes always go with their parent.
+ .filter(className -> !className.contains("$"))
+ .collect(ImmutableSet.toImmutableSet());
+ synchronized (jarsToClasses) {
+ jarsToClasses.putAll(jar, classes);
+ }
+ } catch (DeviceNotAvailableException | IOException e) {
+ throw new RuntimeException(e);
+ }
+ });
+ sJarsToClasses = jarsToClasses.build();
+ }
+ }
+
/**
* Ensure that there are no duplicate classes among jars listed in BOOTCLASSPATH.
*/
@Test
public void testBootclasspath_nonDuplicateClasses() throws Exception {
- assumeTrue(ApiLevelUtil.isAfter(getDevice(), 29));
- ImmutableList<String> jars =
- Classpaths.getJarsOnClasspath(getDevice(), BOOTCLASSPATH);
- assertThat(getDuplicateClasses(jars)).isEmpty();
+ assumeTrue(mDeviceSdkLevel.isDeviceAtLeastR());
+ assertThat(getDuplicateClasses(sBootclasspathJars)).isEmpty();
}
/**
@@ -286,10 +381,20 @@
*/
@Test
public void testSystemServerClasspath_nonDuplicateClasses() throws Exception {
- assumeTrue(ApiLevelUtil.isAfter(getDevice(), 29));
- ImmutableList<String> jars =
- Classpaths.getJarsOnClasspath(getDevice(), SYSTEMSERVERCLASSPATH);
- assertThat(getDuplicateClasses(jars)).isEmpty();
+ assumeTrue(mDeviceSdkLevel.isDeviceAtLeastR());
+ ImmutableSet<String> overlapBurndownList;
+ if (hasFeature(FEATURE_AUTOMOTIVE)) {
+ overlapBurndownList = ImmutableSet.copyOf(AUTOMOTIVE_HIDL_OVERLAP_BURNDOWN_LIST);
+ } else if (hasFeature(FEATURE_WEARABLE)) {
+ overlapBurndownList = ImmutableSet.copyOf(WEAR_HIDL_OVERLAP_BURNDOWN_LIST);
+ } else {
+ overlapBurndownList = ImmutableSet.of();
+ }
+ Multimap<String, String> duplicates = getDuplicateClasses(sSystemserverclasspathJars);
+ Multimap<String, String> filtered = Multimaps.filterKeys(duplicates,
+ duplicate -> !overlapBurndownList.contains(duplicate));
+
+ assertThat(filtered).isEmpty();
}
/**
@@ -298,14 +403,25 @@
*/
@Test
public void testBootClasspathAndSystemServerClasspath_nonDuplicateClasses() throws Exception {
- assumeTrue(ApiLevelUtil.isAfter(getDevice(), 29));
+ assumeTrue(mDeviceSdkLevel.isDeviceAtLeastR());
ImmutableList.Builder<String> jars = ImmutableList.builder();
- jars.addAll(Classpaths.getJarsOnClasspath(getDevice(), BOOTCLASSPATH));
- jars.addAll(Classpaths.getJarsOnClasspath(getDevice(), SYSTEMSERVERCLASSPATH));
-
+ jars.addAll(sBootclasspathJars);
+ jars.addAll(sSystemserverclasspathJars);
+ ImmutableSet<String> overlapBurndownList;
+ if (hasFeature(FEATURE_AUTOMOTIVE)) {
+ overlapBurndownList = ImmutableSet.<String>builder()
+ .addAll(BCP_AND_SSCP_OVERLAP_BURNDOWN_LIST)
+ .addAll(AUTOMOTIVE_HIDL_OVERLAP_BURNDOWN_LIST).build();
+ } else if (hasFeature(FEATURE_WEARABLE)) {
+ overlapBurndownList = ImmutableSet.<String>builder()
+ .addAll(BCP_AND_SSCP_OVERLAP_BURNDOWN_LIST)
+ .addAll(WEAR_HIDL_OVERLAP_BURNDOWN_LIST).build();
+ } else {
+ overlapBurndownList = ImmutableSet.copyOf(BCP_AND_SSCP_OVERLAP_BURNDOWN_LIST);
+ }
Multimap<String, String> duplicates = getDuplicateClasses(jars.build());
Multimap<String, String> filtered = Multimaps.filterKeys(duplicates,
- duplicate -> !BCP_AND_SSCP_OVERLAP_BURNDOWN_LIST.contains(duplicate));
+ duplicate -> !overlapBurndownList.contains(duplicate));
assertThat(filtered).isEmpty();
}
@@ -315,13 +431,9 @@
*/
@Test
public void testBootClasspath_nonDuplicateApexJarClasses() throws Exception {
- ImmutableList<String> jars =
- Classpaths.getJarsOnClasspath(getDevice(), BOOTCLASSPATH);
-
- Multimap<String, String> duplicates = getDuplicateClasses(jars);
+ Multimap<String, String> duplicates = getDuplicateClasses(sBootclasspathJars);
Multimap<String, String> filtered =
Multimaps.filterValues(duplicates, jar -> jar.startsWith("/apex/"));
-
assertThat(filtered).isEmpty();
}
@@ -330,10 +442,7 @@
*/
@Test
public void testSystemServerClasspath_nonDuplicateApexJarClasses() throws Exception {
- ImmutableList<String> jars =
- Classpaths.getJarsOnClasspath(getDevice(), SYSTEMSERVERCLASSPATH);
-
- Multimap<String, String> duplicates = getDuplicateClasses(jars);
+ Multimap<String, String> duplicates = getDuplicateClasses(sSystemserverclasspathJars);
Multimap<String, String> filtered =
Multimaps.filterValues(duplicates, jar -> jar.startsWith("/apex/"));
@@ -348,8 +457,8 @@
public void testBootClasspathAndSystemServerClasspath_nonApexDuplicateClasses()
throws Exception {
ImmutableList.Builder<String> jars = ImmutableList.builder();
- jars.addAll(Classpaths.getJarsOnClasspath(getDevice(), BOOTCLASSPATH));
- jars.addAll(Classpaths.getJarsOnClasspath(getDevice(), SYSTEMSERVERCLASSPATH));
+ jars.addAll(sBootclasspathJars);
+ jars.addAll(sSystemserverclasspathJars);
Multimap<String, String> duplicates = getDuplicateClasses(jars.build());
Multimap<String, String> filtered = Multimaps.filterKeys(duplicates,
@@ -365,22 +474,40 @@
*/
@Test
public void testBootClasspathAndSharedLibs_nonDuplicateClasses() throws Exception {
- assumeTrue(ApiLevelUtil.isAfter(getDevice(), 29));
+ assumeTrue(mDeviceSdkLevel.isDeviceAtLeastS());
final ImmutableList.Builder<String> jars = ImmutableList.builder();
- final ImmutableList<SharedLibraryInfo> sharedLibs =
- Classpaths.getSharedLibraryInfos(getDevice(), getBuild());
- jars.addAll(Classpaths.getJarsOnClasspath(getDevice(), BOOTCLASSPATH));
- jars.addAll(sharedLibs.stream()
- .map(sharedLibraryInfo -> sharedLibraryInfo.paths)
- .flatMap(ImmutableCollection::stream)
- .filter(this::doesFileExist)
- .collect(ImmutableList.toImmutableList())
- );
+ jars.addAll(sBootclasspathJars);
+ jars.addAll(sSharedLibJars);
final Multimap<String, String> duplicates = getDuplicateClasses(jars.build());
final Multimap<String, String> filtered = Multimaps.filterKeys(duplicates,
- duplicate -> !BCP_AND_SHARED_LIB_BURNDOWN_LIST.contains(duplicate)
- && !isSameLibrary(duplicates.get(duplicate), sharedLibs)
- );
+ dupeClass -> {
+ try {
+ final Collection<String> dupeJars = duplicates.get(dupeClass);
+ // Duplicate is already known.
+ if (BCP_AND_SHARED_LIB_BURNDOWN_LIST.contains(dupeClass)) {
+ return false;
+ }
+ // Duplicate is only between different versions of the same shared library.
+ if (isSameLibrary(dupeJars)) {
+ return false;
+ }
+ // Pre-T, the Android test mock library included some platform classes.
+ if (!mDeviceSdkLevel.isDeviceAtLeastT()
+ && dupeJars.contains(ANDROID_TEST_MOCK_JAR)) {
+ return false;
+ }
+ // Different versions of the same library may have different names, and
+ // there's
+ // no reliable way to dedupe them. Ignore duplicates if they do not
+ // include apex jars.
+ if (dupeJars.stream().noneMatch(lib -> lib.startsWith("/apex/"))) {
+ return false;
+ }
+ } catch (DeviceNotAvailableException e) {
+ throw new RuntimeException(e);
+ }
+ return true;
+ });
assertThat(filtered).isEmpty();
}
@@ -390,26 +517,9 @@
* @param jars a list of jar files.
* @return a multimap with the class name as a key and the jar files as a value.
*/
- private Multimap<String, String> getDuplicateClasses(ImmutableCollection<String> jars)
- throws Exception {
- final Multimap<String, String> allClasses = HashMultimap.create();
- jars.stream()
- .parallel()
- .forEach(jar -> {
- try {
- Classpaths.getClassDefsFromJar(getDevice(), jar)
- .stream()
- // Inner classes always go with their parent.
- .filter(classDef -> !classDef.getType().contains("$"))
- .forEach(classDef -> {
- synchronized (allClasses) {
- allClasses.put(classDef.getType(), jar);
- }
- });
- } catch (DeviceNotAvailableException | IOException e) {
- throw new RuntimeException(e);
- }
- });
+ private Multimap<String, String> getDuplicateClasses(ImmutableCollection<String> jars) {
+ final HashMultimap<String, String> allClasses = HashMultimap.create();
+ Multimaps.invertFrom(Multimaps.filterKeys(sJarsToClasses, jars::contains), allClasses);
return Multimaps.filterKeys(allClasses, key -> allClasses.get(key).size() > 1);
}
@@ -417,7 +527,7 @@
assertThat(path).isNotNull();
try {
return getDevice().doesFileExist(path);
- } catch(DeviceNotAvailableException e) {
+ } catch (DeviceNotAvailableException e) {
throw new RuntimeException("Could not check whether " + path + " exists on device", e);
}
}
@@ -427,22 +537,24 @@
*
* @return the shared library name or the jar's path if it's not a shared library.
*/
- private String getSharedLibraryNameOrPath(String jar,
- ImmutableList<SharedLibraryInfo> sharedLibs) {
- return sharedLibs.stream()
- .filter(sharedLib -> sharedLib.paths.contains(jar))
- .map(sharedLib -> sharedLib.name)
- .findFirst().orElse(jar);
+ private String getSharedLibraryNameOrPath(String jar) {
+ return sSharedLibs.stream()
+ .filter(sharedLib -> sharedLib.paths.contains(jar))
+ .map(sharedLib -> sharedLib.name)
+ .findFirst().orElse(jar);
}
/**
* Check whether a list of jars are all different versions of the same library.
*/
- private boolean isSameLibrary(Collection<String> jars,
- ImmutableList<SharedLibraryInfo> sharedLibs) {
+ private boolean isSameLibrary(Collection<String> jars) {
return jars.stream()
- .map(jar -> getSharedLibraryNameOrPath(jar, sharedLibs))
- .distinct()
- .count() == 1;
+ .map(this::getSharedLibraryNameOrPath)
+ .distinct()
+ .count() == 1;
+ }
+
+ private boolean hasFeature(String featureName) throws DeviceNotAvailableException {
+ return getDevice().executeShellCommand("pm list features").contains(featureName);
}
}
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/DirectBootHostTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/DirectBootHostTest.java
index 0abb593..096eb5a 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/DirectBootHostTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/DirectBootHostTest.java
@@ -49,7 +49,7 @@
private static final String CLASS = PKG + ".EncryptionAppTest";
private static final String APK = "CtsEncryptionApp.apk";
- private static final String OTHER_APK = "CtsSplitApp.apk";
+ private static final String OTHER_APK = "CtsSplitApp29.apk";
private static final String OTHER_PKG = "com.android.cts.splitapp";
private static final String MODE_NATIVE = "native";
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/ResumeOnRebootHostTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/ResumeOnRebootHostTest.java
index dcf30b4..c5fad14 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/ResumeOnRebootHostTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/ResumeOnRebootHostTest.java
@@ -55,7 +55,7 @@
private static final String CLASS = PKG + ".EncryptionAppTest";
private static final String APK = "CtsEncryptionApp.apk";
- private static final String OTHER_APK = "CtsSplitApp.apk";
+ private static final String OTHER_APK = "CtsSplitApp29.apk";
private static final String OTHER_PKG = "com.android.cts.splitapp";
private static final String FEATURE_REBOOT_ESCROW = "feature:android.hardware.reboot_escrow";
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/Android.bp b/hostsidetests/appsecurity/test-apps/SplitApp/Android.bp
index 1a02f52..c42fd09 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/Android.bp
@@ -36,6 +36,7 @@
"android.test.runner.stubs",
"android.test.base.stubs",
],
+ target_sdk_version: "current"
}
android_test_helper_app {
@@ -66,6 +67,35 @@
],
}
+android_test_helper_app {
+ name: "CtsSplitApp29",
+ defaults: ["CtsSplitAppDefaults"],
+ package_splits: [
+ "mdpi-v4",
+ "hdpi-v4",
+ "xhdpi-v4",
+ "xxhdpi-v4",
+ "v7",
+ "v23",
+ "fr",
+ "de",
+ ],
+ certificate: ":cts-testkey1",
+ aaptflags: [
+ "--version-code 100",
+ "--version-name OneHundred",
+ "--replace-version",
+ ],
+ // Feature splits are dependent on this base, so it must be exported.
+ export_package_resources: true,
+ test_suites: [
+ "cts",
+ "general-tests",
+ "mts-mainline-infra",
+ ],
+ target_sdk_version: "29"
+}
+
// Define a variant with a different revision code
android_test_helper_app {
name: "CtsSplitAppDiffRevision",
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/SplitApp/AndroidManifest.xml
index 97a02e7..f61bc16 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/AndroidManifest.xml
@@ -21,8 +21,7 @@
<!-- The androidx test libraries uses minSdkVersion 14. Applies an overrideLibrary rule here
to pass the build error, since tests need to use minSdkVersion 4. -->
- <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="29" tools:overrideLibrary=
- "androidx.test.runner, androidx.test.rules, androidx.test.monitor, androidx.test.services.storage"/>
+ <uses-sdk android:minSdkVersion="4" tools:overrideLibrary="androidx.test.runner, androidx.test.rules, androidx.test.monitor, androidx.test.services.storage"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
diff --git a/hostsidetests/scopedstorage/Android.bp b/hostsidetests/scopedstorage/Android.bp
index fbfd706..689141f 100644
--- a/hostsidetests/scopedstorage/Android.bp
+++ b/hostsidetests/scopedstorage/Android.bp
@@ -25,7 +25,7 @@
min_sdk_version: "30",
srcs: ["ScopedStorageTestHelper/src/**/*.java"],
// Tag as a CTS artifact
- test_suites: ["device-tests", "mts-mediaprovider", "cts"],
+ test_suites: ["general-tests", "mts-mediaprovider", "cts"],
}
android_test_helper_app {
name: "CtsScopedStorageTestAppB",
@@ -36,7 +36,7 @@
min_sdk_version: "30",
srcs: ["ScopedStorageTestHelper/src/**/*.java"],
// Tag as a CTS artifact
- test_suites: ["device-tests", "mts-mediaprovider", "cts"],
+ test_suites: ["general-tests", "mts-mediaprovider", "cts"],
}
android_test_helper_app {
name: "CtsScopedStorageTestAppC",
@@ -47,7 +47,7 @@
min_sdk_version: "30",
srcs: ["ScopedStorageTestHelper/src/**/*.java"],
// Tag as a CTS artifact
- test_suites: ["device-tests", "mts-mediaprovider", "cts"],
+ test_suites: ["general-tests", "mts-mediaprovider", "cts"],
}
android_test_helper_app {
name: "CtsScopedStorageTestAppC30",
@@ -58,7 +58,7 @@
min_sdk_version: "30",
srcs: ["ScopedStorageTestHelper/src/**/*.java"],
// Tag as a CTS artifact
- test_suites: ["device-tests", "mts", "cts"],
+ test_suites: ["general-tests", "mts", "cts"],
}
android_test_helper_app {
name: "CtsScopedStorageTestAppCLegacy",
@@ -69,7 +69,7 @@
min_sdk_version: "28",
srcs: ["ScopedStorageTestHelper/src/**/*.java"],
// Tag as a CTS artifact
- test_suites: ["device-tests", "mts-mediaprovider", "cts"],
+ test_suites: ["general-tests", "mts-mediaprovider", "cts"],
}
android_test_helper_app {
name: "CtsScopedStorageTestAppDLegacy",
@@ -80,7 +80,7 @@
min_sdk_version: "28",
srcs: ["ScopedStorageTestHelper/src/**/*.java"],
// Tag as a CTS artifact
- test_suites: ["device-tests", "mts-mediaprovider", "cts"],
+ test_suites: ["general-tests", "mts-mediaprovider", "cts"],
}
android_test_helper_app {
@@ -92,7 +92,7 @@
min_sdk_version: "30",
srcs: ["ScopedStorageTestHelper/src/**/*.java"],
// Tag as a CTS artifact
- test_suites: ["device-tests", "mts-mediaprovider", "cts"],
+ test_suites: ["general-tests", "mts-mediaprovider", "cts"],
}
android_test_helper_app {
name: "CtsScopedStorageTestAppFileManagerBypassDB",
@@ -103,7 +103,7 @@
min_sdk_version: "30",
srcs: ["ScopedStorageTestHelper/src/**/*.java"],
// Tag as a CTS artifact
- test_suites: ["device-tests", "mts", "cts"],
+ test_suites: ["general-tests", "mts", "cts"],
}
android_test_helper_app {
name: "CtsScopedStorageTestAppSystemGalleryBypassDB",
@@ -114,7 +114,7 @@
min_sdk_version: "30",
srcs: ["ScopedStorageTestHelper/src/**/*.java"],
// Tag as a CTS artifact
- test_suites: ["device-tests", "mts", "cts"],
+ test_suites: ["general-tests", "mts", "cts"],
}
android_test_helper_app {
name: "CtsScopedStorageTestAppSystemGallery30BypassDB",
@@ -125,7 +125,7 @@
min_sdk_version: "30",
srcs: ["ScopedStorageTestHelper/src/**/*.java"],
// Tag as a CTS artifact
- test_suites: ["device-tests", "mts", "cts"],
+ test_suites: ["general-tests", "mts", "cts"],
}
android_test_helper_app {
@@ -228,7 +228,7 @@
srcs: ["device/**/*.java"],
static_libs: ["truth-prebuilt", "cts-scopedstorage-lib",],
compile_multilib: "both",
- test_suites: ["device-tests", "mts-mediaprovider", "cts"],
+ test_suites: ["general-tests", "mts-mediaprovider", "cts"],
sdk_version: "test_current",
target_sdk_version: "31",
min_sdk_version: "30",
diff --git a/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/LegacyStorageHostTest.java b/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/LegacyStorageHostTest.java
index e4d3541..75c3f0d 100644
--- a/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/LegacyStorageHostTest.java
+++ b/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/LegacyStorageHostTest.java
@@ -219,6 +219,15 @@
runDeviceTest("testLegacySystemGalleryCanRenameImagesAndVideosWithoutDbUpdates");
}
+ /**
+ * (b/205673506): Test that legacy System Gallery can update() media file's releative_path to a
+ * non default top level directory.
+ */
+ @Test
+ public void testLegacySystemGalleryCanUpdateToExistingDirectory() throws Exception {
+ runDeviceTest("testLegacySystemGalleryCanUpdateToExistingDirectory");
+ }
+
@Test
public void testLegacySystemGalleryWithoutWESCannotRename() throws Exception {
revokePermissions("android.permission.WRITE_EXTERNAL_STORAGE");
diff --git a/hostsidetests/scopedstorage/legacy/src/android/scopedstorage/cts/legacy/LegacyStorageTest.java b/hostsidetests/scopedstorage/legacy/src/android/scopedstorage/cts/legacy/LegacyStorageTest.java
index fd83a2e..1c8b3f5 100644
--- a/hostsidetests/scopedstorage/legacy/src/android/scopedstorage/cts/legacy/LegacyStorageTest.java
+++ b/hostsidetests/scopedstorage/legacy/src/android/scopedstorage/cts/legacy/LegacyStorageTest.java
@@ -38,6 +38,7 @@
import static android.scopedstorage.cts.lib.TestUtils.getContentResolver;
import static android.scopedstorage.cts.lib.TestUtils.getDcimDir;
import static android.scopedstorage.cts.lib.TestUtils.getExternalFilesDir;
+import static android.scopedstorage.cts.lib.TestUtils.getExternalStorageDir;
import static android.scopedstorage.cts.lib.TestUtils.getFileOwnerPackageFromDatabase;
import static android.scopedstorage.cts.lib.TestUtils.getFileRowIdFromDatabase;
import static android.scopedstorage.cts.lib.TestUtils.getImageContentUri;
@@ -61,6 +62,7 @@
import static androidx.test.InstrumentationRegistry.getContext;
import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
@@ -128,12 +130,14 @@
* test runs.
*/
static final String NONCE = String.valueOf(System.nanoTime());
- static final String CONTENT_PROVIDER_URL = "content://android.tradefed.contentprovider";
+ static final String TEST_DIRECTORY_NAME = "ScopedStorageTestDirectory" + NONCE;
static final String IMAGE_FILE_NAME = "LegacyStorageTest_file_" + NONCE + ".jpg";
static final String VIDEO_FILE_NAME = "LegacyStorageTest_file_" + NONCE + ".mp4";
static final String NONMEDIA_FILE_NAME = "LegacyStorageTest_file_" + NONCE + ".pdf";
+ static final String CONTENT_PROVIDER_URL = "content://android.tradefed.contentprovider";
+
// The following apps are installed before the tests are run via a target_preparer.
// See test config for details.
// An app with READ_EXTERNAL_STORAGE permission
@@ -871,6 +875,41 @@
}
}
+ /**
+ * (b/205673506): Test that legacy System Gallery can update() media file's releative_path to a
+ * non default top level directory.
+ */
+ @Test
+ public void testLegacySystemGalleryCanUpdateToExistingDirectory() throws Exception {
+ pollForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, /*granted*/ true);
+ final File imageFile = new File(getPicturesDir(), IMAGE_FILE_NAME);
+ // Top level non default directory
+ final File topLevelTestDirectory = new File(getExternalStorageDir(), TEST_DIRECTORY_NAME);
+ final File imageFileInTopLevelDir = new File(topLevelTestDirectory, IMAGE_FILE_NAME);
+ try {
+ assertThat(imageFile.createNewFile()).isTrue();
+ final Uri imageUri = MediaStore.scanFile(getContentResolver(), imageFile);
+ assertThat(imageUri).isNotNull();
+
+ topLevelTestDirectory.mkdirs();
+ assertThat(topLevelTestDirectory.exists()).isTrue();
+
+ allowAppOpsToUid(Process.myUid(), SYSTEM_GALERY_APPOPS);
+
+ ContentValues values = new ContentValues();
+ values.put(MediaStore.MediaColumns.RELATIVE_PATH, topLevelTestDirectory.getName());
+ final int result = getContentResolver().update(imageUri, values, Bundle.EMPTY);
+ assertWithMessage("Result of update() from DCIM -> top level test directory")
+ .that(result).isEqualTo(1);
+ assertThat(imageFileInTopLevelDir.exists()).isTrue();
+ } finally {
+ imageFile.delete();
+ imageFileInTopLevelDir.delete();
+ topLevelTestDirectory.delete();
+ denyAppOpsToUid(Process.myUid(), SYSTEM_GALERY_APPOPS);
+ }
+ }
+
@Test
public void testLegacySystemGalleryWithoutWESCannotRename() throws Exception {
pollForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, /*granted*/ false);
diff --git a/tests/PhotoPicker/AndroidTest.xml b/tests/PhotoPicker/AndroidTest.xml
index 89fc076..dbd1bc4 100644
--- a/tests/PhotoPicker/AndroidTest.xml
+++ b/tests/PhotoPicker/AndroidTest.xml
@@ -35,6 +35,7 @@
<option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
<option name="exclude-annotation" value="com.android.bedstead.harrier.annotations.RequireRunOnWorkProfile" />
<option name="exclude-annotation" value="com.android.bedstead.harrier.annotations.RequireRunOnSecondaryUser" />
+ <option name="instrumentation-arg" key="thisisignored" value="thisisignored --no-window-animation" />
</test>
<option name="config-descriptor:metadata" key="parameter" value="multiuser" />
diff --git a/tests/PhotoPicker/TEST_MAPPING b/tests/PhotoPicker/TEST_MAPPING
new file mode 100644
index 0000000..f48e90c
--- /dev/null
+++ b/tests/PhotoPicker/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+ "presubmit": [
+ {
+ "name": "CtsPhotoPickerTest"
+ }
+ ]
+}
diff --git a/tests/PhotoPicker/res/raw/testvideo_meta.mp4 b/tests/PhotoPicker/res/raw/testvideo_meta.mp4
index e83c61d..9b38f0e 100644
--- a/tests/PhotoPicker/res/raw/testvideo_meta.mp4
+++ b/tests/PhotoPicker/res/raw/testvideo_meta.mp4
Binary files differ
diff --git a/tests/PhotoPicker/src/android/photopicker/cts/PhotoPickerTest.java b/tests/PhotoPicker/src/android/photopicker/cts/PhotoPickerTest.java
index 761511a..e218d4d 100644
--- a/tests/PhotoPicker/src/android/photopicker/cts/PhotoPickerTest.java
+++ b/tests/PhotoPicker/src/android/photopicker/cts/PhotoPickerTest.java
@@ -26,6 +26,7 @@
import static android.photopicker.cts.util.PhotoPickerUiUtils.REGEX_PACKAGE_NAME;
import static android.photopicker.cts.util.PhotoPickerUiUtils.findAddButton;
import static android.photopicker.cts.util.PhotoPickerUiUtils.findItemList;
+import static android.photopicker.cts.util.PhotoPickerUiUtils.findPreviewAddButton;
import static android.photopicker.cts.util.PhotoPickerUiUtils.findPreviewAddOrSelectButton;
import static com.google.common.truth.Truth.assertThat;
@@ -293,7 +294,7 @@
selectCheckButton.click();
mDevice.waitForIdle();
- final UiObject addButton = findPreviewAddOrSelectButton();
+ final UiObject addButton = findPreviewAddButton();
addButton.click();
mDevice.waitForIdle();
diff --git a/tests/PhotoPicker/src/android/photopicker/cts/util/PhotoPickerAssertionsUtils.java b/tests/PhotoPicker/src/android/photopicker/cts/util/PhotoPickerAssertionsUtils.java
index 28380f9..020cbe1 100644
--- a/tests/PhotoPicker/src/android/photopicker/cts/util/PhotoPickerAssertionsUtils.java
+++ b/tests/PhotoPicker/src/android/photopicker/cts/util/PhotoPickerAssertionsUtils.java
@@ -16,7 +16,7 @@
package android.photopicker.cts.util;
-import static android.photopicker.cts.util.PhotoPickerFilesUtils.DISPLAY_NAME_PREFIX;
+import static android.os.SystemProperties.getBoolean;
import static android.provider.MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE;
import static android.provider.MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO;
@@ -32,8 +32,8 @@
import android.net.Uri;
import android.os.FileUtils;
import android.os.ParcelFileDescriptor;
+import android.provider.CloudMediaProviderContract;
import android.provider.MediaStore;
-import android.util.Log;
import androidx.test.InstrumentationRegistry;
@@ -66,56 +66,53 @@
public static void assertRedactedReadOnlyAccess(Uri uri) throws Exception {
assertThat(uri).isNotNull();
final String[] projection = new String[]{MediaStore.Files.FileColumns.TITLE,
- MediaStore.Files.FileColumns.MEDIA_TYPE};
+ MediaStore.Files.FileColumns.MEDIA_TYPE};
final Context context = InstrumentationRegistry.getTargetContext();
final ContentResolver resolver = context.getContentResolver();
final Cursor c = resolver.query(uri, projection, null, null);
assertThat(c).isNotNull();
assertThat(c.moveToFirst()).isTrue();
- boolean canCheckRedacted = false;
- // If the file is inserted by this test case, we can check the redaction.
- // To avoid checking the redaction on the other media file.
- if (c.getString(0).startsWith(DISPLAY_NAME_PREFIX)) {
- canCheckRedacted = true;
+ if (getBoolean("sys.photopicker.pickerdb.enabled", true)) {
+ final String mimeType = c.getString(c.getColumnIndex(
+ CloudMediaProviderContract.MediaColumns.MIME_TYPE));
+ if (mimeType.startsWith("image")) {
+ assertImageRedactedReadOnlyAccess(uri, resolver);
+ } else if (mimeType.startsWith("video")) {
+ assertVideoRedactedReadOnlyAccess(uri, resolver);
+ } else {
+ fail("The mime type is not as expected: " + mimeType);
+ }
} else {
- Log.d(TAG, uri + " is not the test file we expected, don't check the redaction");
- }
-
- final int mediaType = c.getInt(1);
- switch (mediaType) {
- case MEDIA_TYPE_IMAGE:
- assertImageRedactedReadOnlyAccess(uri, canCheckRedacted, resolver);
- break;
- case MEDIA_TYPE_VIDEO:
- assertVideoRedactedReadOnlyAccess(uri, canCheckRedacted, resolver);
- break;
- default:
- fail("The media type is not as expected: " + mediaType);
+ final int mediaType = c.getInt(1);
+ switch (mediaType) {
+ case MEDIA_TYPE_IMAGE:
+ assertImageRedactedReadOnlyAccess(uri, resolver);
+ break;
+ case MEDIA_TYPE_VIDEO:
+ assertVideoRedactedReadOnlyAccess(uri, resolver);
+ break;
+ default:
+ fail("The media type is not as expected: " + mediaType);
+ }
}
}
- private static void assertVideoRedactedReadOnlyAccess(Uri uri, boolean shouldCheckRedacted,
- ContentResolver resolver) throws Exception {
- if (shouldCheckRedacted) {
- // The location is redacted
- try (InputStream in = resolver.openInputStream(uri);
- ByteArrayOutputStream out = new ByteArrayOutputStream()) {
- FileUtils.copy(in, out);
- byte[] bytes = out.toByteArray();
- byte[] xmpBytes = Arrays.copyOfRange(bytes, 3269, 3269 + 13197);
- String xmp = new String(xmpBytes);
- assertWithMessage("Failed to redact XMP longitude")
- .that(xmp.contains("10,41.751000E")).isFalse();
- assertWithMessage("Failed to redact XMP latitude")
- .that(xmp.contains("53,50.070500N")).isFalse();
- assertWithMessage("Redacted non-location XMP")
- .that(xmp.contains("13166/7763")).isTrue();
- }
- }
-
- try (ParcelFileDescriptor pfd = resolver.openFileDescriptor(uri, "r")) {
- // this should pass
+ private static void assertVideoRedactedReadOnlyAccess(Uri uri, ContentResolver resolver)
+ throws Exception {
+ // The location is redacted
+ try (InputStream in = resolver.openInputStream(uri);
+ ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+ FileUtils.copy(in, out);
+ byte[] bytes = out.toByteArray();
+ byte[] xmpBytes = Arrays.copyOfRange(bytes, 3269, 3269 + 13197);
+ String xmp = new String(xmpBytes);
+ assertWithMessage("Failed to redact XMP longitude")
+ .that(xmp.contains("10,41.751000E")).isFalse();
+ assertWithMessage("Failed to redact XMP latitude")
+ .that(xmp.contains("53,50.070500N")).isFalse();
+ assertWithMessage("Redacted non-location XMP")
+ .that(xmp.contains("13166/7763")).isTrue();
}
// assert no write access
@@ -125,31 +122,25 @@
}
}
- private static void assertImageRedactedReadOnlyAccess(Uri uri, boolean shouldCheckRedacted,
- ContentResolver resolver) throws Exception {
- if (shouldCheckRedacted) {
- // The location is redacted
- try (InputStream is = resolver.openInputStream(uri)) {
- final ExifInterface exif = new ExifInterface(is);
- final float[] latLong = new float[2];
- exif.getLatLong(latLong);
- assertWithMessage("Failed to redact latitude")
- .that(latLong[0]).isWithin(0.001f).of(0);
- assertWithMessage("Failed to redact longitude")
- .that(latLong[1]).isWithin(0.001f).of(0);
+ private static void assertImageRedactedReadOnlyAccess(Uri uri, ContentResolver resolver)
+ throws Exception {
+ // The location is redacted
+ try (InputStream is = resolver.openInputStream(uri)) {
+ final ExifInterface exif = new ExifInterface(is);
+ final float[] latLong = new float[2];
+ exif.getLatLong(latLong);
+ assertWithMessage("Failed to redact latitude")
+ .that(latLong[0]).isWithin(0.001f).of(0);
+ assertWithMessage("Failed to redact longitude")
+ .that(latLong[1]).isWithin(0.001f).of(0);
- String xmp = exif.getAttribute(ExifInterface.TAG_XMP);
- assertWithMessage("Failed to redact XMP longitude")
- .that(xmp.contains("10,41.751000E")).isFalse();
- assertWithMessage("Failed to redact XMP latitude")
- .that(xmp.contains("53,50.070500N")).isFalse();
- assertWithMessage("Redacted non-location XMP")
- .that(xmp.contains("LensDefaults")).isTrue();
- }
- }
-
- try (ParcelFileDescriptor pfd = resolver.openFileDescriptor(uri, "r")) {
- // this should pass
+ String xmp = exif.getAttribute(ExifInterface.TAG_XMP);
+ assertWithMessage("Failed to redact XMP longitude")
+ .that(xmp.contains("10,41.751000E")).isFalse();
+ assertWithMessage("Failed to redact XMP latitude")
+ .that(xmp.contains("53,50.070500N")).isFalse();
+ assertWithMessage("Redacted non-location XMP")
+ .that(xmp.contains("LensDefaults")).isTrue();
}
// assert no write access
diff --git a/tests/PhotoPicker/src/android/photopicker/cts/util/PhotoPickerUiUtils.java b/tests/PhotoPicker/src/android/photopicker/cts/util/PhotoPickerUiUtils.java
index 6a64e72..d20dcd6 100644
--- a/tests/PhotoPicker/src/android/photopicker/cts/util/PhotoPickerUiUtils.java
+++ b/tests/PhotoPicker/src/android/photopicker/cts/util/PhotoPickerUiUtils.java
@@ -73,6 +73,11 @@
return itemList;
}
+ public static UiObject findPreviewAddButton() {
+ return new UiObject(new UiSelector().resourceIdMatches(
+ REGEX_PACKAGE_NAME + ":id/preview_add_button"));
+ }
+
public static UiObject findPreviewAddOrSelectButton() {
return new UiObject(new UiSelector().resourceIdMatches(
REGEX_PACKAGE_NAME + ":id/preview_add_or_select_button"));
diff --git a/tests/media/src/android/mediav2/cts/AdaptivePlaybackTest.java b/tests/media/src/android/mediav2/cts/AdaptivePlaybackTest.java
index e803863..ae9054f 100644
--- a/tests/media/src/android/mediav2/cts/AdaptivePlaybackTest.java
+++ b/tests/media/src/android/mediav2/cts/AdaptivePlaybackTest.java
@@ -219,6 +219,7 @@
queueEOS();
waitForAllOutputs();
mCodec.reset();
+ mCodec.release();
}
tearDownSurface();
}
diff --git a/tests/media/src/android/mediav2/cts/DecoderColorAspectsTest.java b/tests/media/src/android/mediav2/cts/DecoderColorAspectsTest.java
index f7466b0..15f5e65 100644
--- a/tests/media/src/android/mediav2/cts/DecoderColorAspectsTest.java
+++ b/tests/media/src/android/mediav2/cts/DecoderColorAspectsTest.java
@@ -51,10 +51,10 @@
mCheckESList = new ArrayList<>();
mCheckESList.add(MediaFormat.MIMETYPE_VIDEO_AVC);
mCheckESList.add(MediaFormat.MIMETYPE_VIDEO_HEVC);
- /* TODO (b/165492703) Mpeg2 and (b/165787556) AV1 has problems in signalling color
+ /* TODO (b/165492703) Mpeg2 has problems in signalling color
aspects information via elementary stream. */
// mCheckESList.add(MediaFormat.MIMETYPE_VIDEO_MPEG2);
- // mCheckESList.add(MediaFormat.MIMETYPE_VIDEO_AV1);
+ mCheckESList.add(MediaFormat.MIMETYPE_VIDEO_AV1);
mCanIgnoreColorBox = canIgnoreColorBox;
}
diff --git a/tests/tests/mediatranscoding/OWNERS b/tests/tests/mediatranscoding/OWNERS
index e653979..a4393a7 100644
--- a/tests/tests/mediatranscoding/OWNERS
+++ b/tests/tests/mediatranscoding/OWNERS
@@ -1,4 +1,4 @@
# Bug component: 761430
-hkuang@google.com
-chz@google.com
-lnilsson@google.com
+
+# go/android-fwk-media-solutions for info on areas of ownership.
+include platform/frameworks/av:/media/janitors/media_solutions_OWNERS
diff --git a/tests/tests/mediatranscoding/res/raw/Video_HEVC_480p_30Frames.mp4 b/tests/tests/mediatranscoding/res/raw/Video_HEVC_480p_30Frames.mp4
new file mode 100644
index 0000000..41f6c22
--- /dev/null
+++ b/tests/tests/mediatranscoding/res/raw/Video_HEVC_480p_30Frames.mp4
Binary files differ
diff --git a/tests/tests/mediatranscoding/res/raw/Video_HEVC_720p_30Frames.mp4 b/tests/tests/mediatranscoding/res/raw/Video_HEVC_720p_30Frames.mp4
new file mode 100644
index 0000000..7211fec1
--- /dev/null
+++ b/tests/tests/mediatranscoding/res/raw/Video_HEVC_720p_30Frames.mp4
Binary files differ
diff --git a/tests/tests/mediatranscoding/src/android/media/mediatranscoding/cts/MediaTranscodingManagerTest.java b/tests/tests/mediatranscoding/src/android/media/mediatranscoding/cts/MediaTranscodingManagerTest.java
index 33bb8b7..a88f81c 100644
--- a/tests/tests/mediatranscoding/src/android/media/mediatranscoding/cts/MediaTranscodingManagerTest.java
+++ b/tests/tests/mediatranscoding/src/android/media/mediatranscoding/cts/MediaTranscodingManagerTest.java
@@ -91,9 +91,9 @@
// Default setting for transcoding to H.264.
private static final String MIME_TYPE = MediaFormat.MIMETYPE_VIDEO_AVC;
- private static final int BIT_RATE = 20000000; // 20Mbps
- private static final int WIDTH = 1920;
- private static final int HEIGHT = 1080;
+ private static final int BIT_RATE = 4000000; // 4Mbps
+ private static final int WIDTH = 720;
+ private static final int HEIGHT = 480;
// Threshold for the psnr to make sure the transcoded video is valid.
private static final int PSNR_THRESHOLD = 20;
@@ -151,9 +151,9 @@
androidx.test.InstrumentationRegistry.registerInstance(
InstrumentationRegistry.getInstrumentation(), new Bundle());
- // Setup source HEVC file uri.
- mSourceHEVCVideoUri = resourceToUri(mContext, R.raw.Video_HEVC_30Frames,
- "Video_HEVC_30Frames.mp4");
+ // Setup default source HEVC 480p file uri.
+ mSourceHEVCVideoUri = resourceToUri(mContext, R.raw.Video_HEVC_480p_30Frames,
+ "Video_HEVC_480p_30Frames.mp4");
// Setup source AVC file uri.
mSourceAVCVideoUri = resourceToUri(mContext, R.raw.Video_AVC_30Frames,
@@ -344,7 +344,7 @@
// Tests transcoding to a uri in res folder and expects failure as test could not write to res
// folder.
public void testTranscodingToResFolder() throws Exception {
- if (shouldSkip() || !isVideoTranscodingSupported(mSourceHEVCVideoUri)) {
+ if (shouldSkip()) {
return;
}
// Create a file Uri: android.resource://android.media.cts/temp.mp4
@@ -358,7 +358,7 @@
// Tests transcoding to a uri in internal cache folder and expects success.
public void testTranscodingToCacheDir() throws Exception {
- if (shouldSkip() || !isVideoTranscodingSupported(mSourceHEVCVideoUri)) {
+ if (shouldSkip()) {
return;
}
// Create a file Uri: file:///data/user/0/android.media.cts/cache/temp.mp4
@@ -372,7 +372,7 @@
// Tests transcoding to a uri in internal files directory and expects success.
public void testTranscodingToInternalFilesDir() throws Exception {
- if (shouldSkip() || !isVideoTranscodingSupported(mSourceHEVCVideoUri)) {
+ if (shouldSkip()) {
return;
}
// Create a file Uri: file:///data/user/0/android.media.cts/files/temp.mp4
@@ -383,6 +383,14 @@
TranscodingSession.RESULT_SUCCESS);
}
+ public void testHevcTranscoding720PVideo30FramesWithoutAudio() throws Exception {
+ if (shouldSkip()) {
+ return;
+ }
+ transcodeFile(resourceToUri(mContext, R.raw.Video_HEVC_720p_30Frames,
+ "Video_HEVC_720p_30Frames.mp4"), false /* testFileDescriptor */);
+ }
+
public void testAvcTranscoding1080PVideo30FramesWithoutAudio() throws Exception {
if (shouldSkip()) {
return;
@@ -566,7 +574,7 @@
}
public void testCancelTranscoding() throws Exception {
- if (shouldSkip() || !isVideoTranscodingSupported(mSourceHEVCVideoUri)) {
+ if (shouldSkip()) {
return;
}
Log.d(TAG, "Starting: testCancelTranscoding");
@@ -657,7 +665,7 @@
}*/
public void testTranscodingProgressUpdate() throws Exception {
- if (shouldSkip() || !isVideoTranscodingSupported(mSourceHEVCVideoUri)) {
+ if (shouldSkip()) {
return;
}
Log.d(TAG, "Starting: testTranscodingProgressUpdate");
@@ -709,7 +717,7 @@
}
public void testAddingClientUids() throws Exception {
- if (shouldSkip() || !isVideoTranscodingSupported(mSourceHEVCVideoUri)) {
+ if (shouldSkip()) {
return;
}
Log.d(TAG, "Starting: testTranscodingProgressUpdate");
@@ -786,27 +794,6 @@
return videoFormat;
}
- private boolean isVideoTranscodingSupported(Uri fileUri) throws IOException {
- MediaFormat sourceFormat = getVideoTrackFormat(fileUri);
- if (sourceFormat != null) {
- // Since destination format is not available, we assume width, height and
- // frame rate same as source format, and mime as AVC for destination format.
- MediaFormat destinationFormat = new MediaFormat();
- destinationFormat.setString(MediaFormat.KEY_MIME, MIME_TYPE);
- destinationFormat.setInteger(MediaFormat.KEY_WIDTH,
- sourceFormat.getInteger(MediaFormat.KEY_WIDTH));
- destinationFormat.setInteger(MediaFormat.KEY_HEIGHT,
- sourceFormat.getInteger(MediaFormat.KEY_HEIGHT));
- if (sourceFormat.containsKey(MediaFormat.KEY_FRAME_RATE)) {
- destinationFormat.setInteger(MediaFormat.KEY_FRAME_RATE,
- sourceFormat.getInteger(MediaFormat.KEY_FRAME_RATE));
- }
- return isFormatSupported(sourceFormat, false)
- && isFormatSupported(destinationFormat, true);
- }
- return false;
- }
-
private boolean isFormatSupported(MediaFormat format, boolean isEncoder) {
String mime = format.getString(MediaFormat.KEY_MIME);
MediaCodec codec = null;