Merge "Update PermissionGroupChange for automotive" into rvc-dev
diff --git a/apps/CtsVerifierInstantApp/AndroidManifest.xml b/apps/CtsVerifierInstantApp/AndroidManifest.xml
index bb59c13..51a6df6 100644
--- a/apps/CtsVerifierInstantApp/AndroidManifest.xml
+++ b/apps/CtsVerifierInstantApp/AndroidManifest.xml
@@ -17,11 +17,13 @@
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT" />
- <data android:host="instantapp.cts.android.com" android:scheme="http"/>
- <data android:host="instantapp.cts.android.com" android:scheme="https"/>
+ <data android:host="source.android.com/compatibility/cts/verifier-instant-apps"
+ android:scheme="http"/>
+ <data android:host="source.android.com/compatibility/cts/verifier-instant-apps"
+ android:scheme="https"/>
</intent-filter>
<meta-data android:name="default-url"
- android:value="http://instantapp.cts.android.com" />
+ android:value="https://source.android.com/compatibility/cts/verifier-instant-apps" />
</activity>
</application>
</manifest>
diff --git a/hostsidetests/appcompat/host/lib/src/android/compat/cts/CompatChangeGatingTestCase.java b/hostsidetests/appcompat/host/lib/src/android/compat/cts/CompatChangeGatingTestCase.java
index 07a51af1d..d637ff0 100644
--- a/hostsidetests/appcompat/host/lib/src/android/compat/cts/CompatChangeGatingTestCase.java
+++ b/hostsidetests/appcompat/host/lib/src/android/compat/cts/CompatChangeGatingTestCase.java
@@ -226,7 +226,8 @@
StatsdConfigProto.StatsdConfig.Builder configBuilder =
StatsdConfigProto.StatsdConfig.newBuilder()
.setId(configId)
- .addAllowedLogSource(pkgName);
+ .addAllowedLogSource(pkgName)
+ .addWhitelistedAtomIds(Atom.APP_COMPATIBILITY_CHANGE_REPORTED_FIELD_NUMBER);
StatsdConfigProto.SimpleAtomMatcher.Builder simpleAtomMatcherBuilder =
StatsdConfigProto.SimpleAtomMatcher
.newBuilder().setAtomId(
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/DocumentsTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/DocumentsTest.java
index fc63925..fc97c75 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/DocumentsTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/DocumentsTest.java
@@ -28,6 +28,7 @@
*/
public class DocumentsTest extends DocumentsTestCase {
private static final String PROVIDER_PKG = "com.android.cts.documentprovider";
+ private static final String DUMMYIME_PKG = "com.android.cts.dummyime";
private static final String PROVIDER_APK = "CtsDocumentProvider.apk";
private static final String DUMMYIME_APK = "CtsDummyIme.apk";
@@ -48,7 +49,7 @@
super.tearDown();
getDevice().uninstallPackage(PROVIDER_PKG);
- getDevice().uninstallPackage(DUMMYIME_APK);
+ getDevice().uninstallPackage(DUMMYIME_PKG);
}
public void testOpenSimple() throws Exception {
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceAndProfileOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceAndProfileOwnerTest.java
index 72e8293..5beb487 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceAndProfileOwnerTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceAndProfileOwnerTest.java
@@ -726,6 +726,7 @@
try {
// Install and enable assistant, notice that profile can't have assistant.
installAppAsUser(ASSIST_APP_APK, mPrimaryUserId);
+ waitForBroadcastIdle();
setVoiceInteractionService(ASSIST_INTERACTION_SERVICE);
setScreenCaptureDisabled_assist(mUserId, true /* disabled */);
} finally {
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/QuietModeHostsideTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/QuietModeHostsideTest.java
index f13cd86..1313c31 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/QuietModeHostsideTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/QuietModeHostsideTest.java
@@ -28,7 +28,7 @@
private static final String ENABLED_TEST_APK = "CtsCrossProfileEnabledApp.apk";
private static final String USER_ENABLED_TEST_APK = "CtsCrossProfileUserEnabledApp.apk";
private static final String ENABLED_NO_PERMS_TEST_APK = "CtsCrossProfileEnabledNoPermsApp.apk";
- private static final String QUIET_MODE_ENABLED_TEST_APK = "CtsQuietModeEnabledApp.apk";
+ private static final String QUIET_MODE_ENABLED_TEST_APK = "CtsModifyQuietModeEnabledApp.apk";
private static final String NOT_ENABLED_TEST_APK = "CtsCrossProfileNotEnabledApp.apk";
private static final String ENABLED_TEST_PACKAGE = "com.android.cts.crossprofileenabledapp";
private static final String USER_ENABLED_TEST_PACKAGE =
@@ -38,7 +38,7 @@
private static final String NOT_ENABLED_TEST_PACKAGE =
"com.android.cts.crossprofilenotenabledapp";
private static final String QUIET_MODE_ENABLED_TEST_PACKAGE =
- "com.android.cts.quietmodeenabledapp";
+ "com.android.cts.modifyquietmodeenabledapp";
private int mProfileId;
private String mOriginalLauncher;
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/CecMessage.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/CecMessage.java
index 6437ec0..8d4ece1 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/CecMessage.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/CecMessage.java
@@ -67,4 +67,15 @@
private CecMessage(int messageId) {
this.messageId = messageId;
}
+
+ public static String formatParams(long rawParam) {
+ StringBuilder params = new StringBuilder("");
+
+ do {
+ params.insert(0, ":" + String.format("%02x", rawParam % 256));
+ rawParam >>= 8;
+ } while (rawParam > 0);
+
+ return params.toString();
+ }
}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecSystemAudioControlTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecSystemAudioControlTest.java
index 3ac2e5f..5162a27 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecSystemAudioControlTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecSystemAudioControlTest.java
@@ -64,6 +64,8 @@
@Test
public void cect_11_2_15_11_VolumeUpDownUserControlPressed() throws Exception {
ITestDevice device = getDevice();
+ hdmiCecClient.sendCecMessage(CecDevice.AUDIO_SYSTEM, CecDevice.BROADCAST,
+ CecMessage.SET_SYSTEM_AUDIO_MODE, CecMessage.formatParams(1));
device.executeShellCommand("input keyevent KEYCODE_VOLUME_UP");
String message = hdmiCecClient.checkExpectedOutput(CecDevice.AUDIO_SYSTEM,
CecMessage.USER_CONTROL_PRESSED);
@@ -89,7 +91,9 @@
@Test
public void cect_11_2_15_12_MuteUserControlPressed() throws Exception {
ITestDevice device = getDevice();
- device.executeShellCommand("input keyevent KEYCODE_MUTE");
+ hdmiCecClient.sendCecMessage(CecDevice.AUDIO_SYSTEM, CecDevice.BROADCAST,
+ CecMessage.SET_SYSTEM_AUDIO_MODE, CecMessage.formatParams(1));
+ device.executeShellCommand("input keyevent KEYCODE_VOLUME_MUTE");
String message = hdmiCecClient.checkExpectedOutput(CecDevice.AUDIO_SYSTEM,
CecMessage.USER_CONTROL_PRESSED);
assertEquals(HdmiCecConstants.CEC_CONTROL_MUTE,
diff --git a/hostsidetests/incrementalinstall/app/Android.bp b/hostsidetests/incrementalinstall/app/Android.bp
index 483011e..85a8be1 100644
--- a/hostsidetests/incrementalinstall/app/Android.bp
+++ b/hostsidetests/incrementalinstall/app/Android.bp
@@ -33,6 +33,10 @@
export_package_resources: true,
aapt_include_all_resources: true,
manifest: "AndroidManifestV1.xml",
+
+ // This flag allow the native lib to be compressed in the apk or associated split apk, and
+ // needs to be extracted by the installer instead of calling directly into the apk.
+ use_embedded_native_libs: false,
}
// v2 implementation of test app built with v1 manifest for zero version update test.
diff --git a/hostsidetests/inputmethodservice/deviceside/devicetest/src/android/inputmethodservice/cts/devicetest/InputMethodServiceDeviceTest.java b/hostsidetests/inputmethodservice/deviceside/devicetest/src/android/inputmethodservice/cts/devicetest/InputMethodServiceDeviceTest.java
index 7738e31..d508a1d 100644
--- a/hostsidetests/inputmethodservice/deviceside/devicetest/src/android/inputmethodservice/cts/devicetest/InputMethodServiceDeviceTest.java
+++ b/hostsidetests/inputmethodservice/deviceside/devicetest/src/android/inputmethodservice/cts/devicetest/InputMethodServiceDeviceTest.java
@@ -62,7 +62,7 @@
@RunWith(AndroidJUnit4.class)
public class InputMethodServiceDeviceTest {
- private static final long TIMEOUT = TimeUnit.SECONDS.toMillis(5);
+ private static final long TIMEOUT = TimeUnit.SECONDS.toMillis(7);
/** Test to check CtsInputMethod1 receives onCreate and onStartInput. */
@Test
diff --git a/hostsidetests/packagemanager/dynamicmime/test/src/android/dynamicmime/testapp/preferred/PreferredActivitiesTest.java b/hostsidetests/packagemanager/dynamicmime/test/src/android/dynamicmime/testapp/preferred/PreferredActivitiesTest.java
index 5ef052ef..eb1a474 100644
--- a/hostsidetests/packagemanager/dynamicmime/test/src/android/dynamicmime/testapp/preferred/PreferredActivitiesTest.java
+++ b/hostsidetests/packagemanager/dynamicmime/test/src/android/dynamicmime/testapp/preferred/PreferredActivitiesTest.java
@@ -55,7 +55,7 @@
private static final BySelector BUTTON_ALWAYS = By.res("android:id/button_always");
private static final BySelector RESOLVER_DIALOG = By.res("android:id/contentPanel");
- private static final long TIMEOUT = TimeUnit.SECONDS.toMillis(5);
+ private static final long TIMEOUT = TimeUnit.SECONDS.toMillis(30L);
private TestStrategy mTest;
@@ -281,7 +281,7 @@
private void chooseUseAlways() {
getUiDevice()
- .findObject(BUTTON_ALWAYS)
+ .wait(Until.findObject(BUTTON_ALWAYS), TIMEOUT)
.click();
}
diff --git a/hostsidetests/settings/app/DeviceOwnerApp/src/com/google/android/cts/deviceowner/DeviceOwnerTest.java b/hostsidetests/settings/app/DeviceOwnerApp/src/com/google/android/cts/deviceowner/DeviceOwnerTest.java
index 842d83a..3442ce1 100644
--- a/hostsidetests/settings/app/DeviceOwnerApp/src/com/google/android/cts/deviceowner/DeviceOwnerTest.java
+++ b/hostsidetests/settings/app/DeviceOwnerApp/src/com/google/android/cts/deviceowner/DeviceOwnerTest.java
@@ -77,6 +77,13 @@
} catch (RemoteException e) {
throw new RuntimeException("failed to freeze device orientation", e);
}
+ wakeupDeviceAndPressHome();
+ }
+
+ private void wakeupDeviceAndPressHome() throws Exception {
+ mDevice.wakeUp();
+ mDevice.pressMenu();
+ mDevice.pressHome();
}
@Override
diff --git a/hostsidetests/statsd/src/android/cts/statsd/atom/AtomTestCase.java b/hostsidetests/statsd/src/android/cts/statsd/atom/AtomTestCase.java
index 51e24ea..317c0d4 100644
--- a/hostsidetests/statsd/src/android/cts/statsd/atom/AtomTestCase.java
+++ b/hostsidetests/statsd/src/android/cts/statsd/atom/AtomTestCase.java
@@ -241,7 +241,8 @@
.addAllowedLogSource("AID_STATSD")
.addAllowedLogSource(DeviceAtomTestCase.DEVICE_SIDE_TEST_PACKAGE)
.addDefaultPullPackages("AID_RADIO")
- .addDefaultPullPackages("AID_SYSTEM");
+ .addDefaultPullPackages("AID_SYSTEM")
+ .addWhitelistedAtomIds(Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER);
}
protected void createAndUploadConfig(int atomTag) throws Exception {
diff --git a/tests/BlobStore/src/com/android/cts/blob/BlobStoreManagerTest.java b/tests/BlobStore/src/com/android/cts/blob/BlobStoreManagerTest.java
index dbafec8..3599107 100644
--- a/tests/BlobStore/src/com/android/cts/blob/BlobStoreManagerTest.java
+++ b/tests/BlobStore/src/com/android/cts/blob/BlobStoreManagerTest.java
@@ -133,6 +133,7 @@
public void tearDown() throws Exception {
runShellCmd("cmd blob_store clear-all-sessions");
runShellCmd("cmd blob_store clear-all-blobs");
+ mContext.getFilesDir().delete();
}
@Test
@@ -938,11 +939,30 @@
}
@Test
- public void testAcquireRelease_deleteAfterDelay() throws Exception {
+ public void testAcquireLease_leaseExpired() throws Exception {
final DummyBlobData blobData = new DummyBlobData.Builder(mContext).build();
blobData.prepare();
+ final long waitDurationMs = TimeUnit.SECONDS.toMillis(2);
+ try {
+ commitBlob(blobData);
+
+ acquireLease(mContext, blobData.getBlobHandle(), R.string.test_desc,
+ System.currentTimeMillis() + waitDurationMs);
+ assertLeasedBlobs(mBlobStoreManager, blobData.getBlobHandle());
+
+ waitForLeaseExpiration(waitDurationMs, blobData.getBlobHandle());
+ assertNoLeasedBlobs(mBlobStoreManager);
+ } finally {
+ blobData.delete();
+ }
+ }
+
+ @Test
+ public void testAcquireRelease_deleteAfterDelay() throws Exception {
final long waitDurationMs = TimeUnit.SECONDS.toMillis(1);
runWithKeyValues(() -> {
+ final DummyBlobData blobData = new DummyBlobData.Builder(mContext).build();
+ blobData.prepare();
try {
commitBlob(blobData);
@@ -1163,6 +1183,64 @@
}
@Test
+ public void testStorageAttribution_withExpiredLease() throws Exception {
+ final DummyBlobData blobData = new DummyBlobData.Builder(mContext).build();
+ blobData.prepare();
+
+ final StorageStatsManager storageStatsManager = mContext.getSystemService(
+ StorageStatsManager.class);
+ StorageStats beforeStatsForPkg = storageStatsManager
+ .queryStatsForPackage(UUID_DEFAULT, mContext.getPackageName(), mContext.getUser());
+ StorageStats beforeStatsForUid = storageStatsManager
+ .queryStatsForUid(UUID_DEFAULT, Process.myUid());
+
+ commitBlob(blobData);
+
+ StorageStats afterStatsForPkg = storageStatsManager
+ .queryStatsForPackage(UUID_DEFAULT, mContext.getPackageName(), mContext.getUser());
+ StorageStats afterStatsForUid = storageStatsManager
+ .queryStatsForUid(UUID_DEFAULT, Process.myUid());
+
+ // No leases on the blob, so it should not be attributed.
+ assertThat(afterStatsForPkg.getDataBytes() - beforeStatsForPkg.getDataBytes())
+ .isEqualTo(0L);
+ assertThat(afterStatsForUid.getDataBytes() - beforeStatsForUid.getDataBytes())
+ .isEqualTo(0L);
+
+ final long leaseExpiryDurationMs = TimeUnit.SECONDS.toMillis(5);
+ acquireLease(mContext, blobData.getBlobHandle(), R.string.test_desc,
+ System.currentTimeMillis() + leaseExpiryDurationMs);
+
+ final long startTimeMs = System.currentTimeMillis();
+ afterStatsForPkg = storageStatsManager
+ .queryStatsForPackage(UUID_DEFAULT, mContext.getPackageName(), mContext.getUser());
+ afterStatsForUid = storageStatsManager
+ .queryStatsForUid(UUID_DEFAULT, Process.myUid());
+
+ assertThat(afterStatsForPkg.getDataBytes() - beforeStatsForPkg.getDataBytes())
+ .isEqualTo(blobData.getFileSize());
+ assertThat(afterStatsForUid.getDataBytes() - beforeStatsForUid.getDataBytes())
+ .isEqualTo(blobData.getFileSize());
+
+ waitForLeaseExpiration(
+ Math.abs(leaseExpiryDurationMs - (System.currentTimeMillis() - startTimeMs)),
+ blobData.getBlobHandle());
+
+ afterStatsForPkg = storageStatsManager
+ .queryStatsForPackage(UUID_DEFAULT, mContext.getPackageName(), mContext.getUser());
+ afterStatsForUid = storageStatsManager
+ .queryStatsForUid(UUID_DEFAULT, Process.myUid());
+
+ // Lease is expired, so it should not be attributed anymore.
+ assertThat(afterStatsForPkg.getDataBytes() - beforeStatsForPkg.getDataBytes())
+ .isEqualTo(0L);
+ assertThat(afterStatsForUid.getDataBytes() - beforeStatsForUid.getDataBytes())
+ .isEqualTo(0L);
+
+ blobData.delete();
+ }
+
+ @Test
public void testLeaseQuotaExceeded() throws Exception {
final long totalBytes = Environment.getDataDirectory().getTotalSpace();
final long limitBytes = 100 * Utils.MB_IN_BYTES;
@@ -1218,6 +1296,36 @@
}
@Test
+ public void testLeaseQuotaExceeded_withExpiredLease() throws Exception {
+ final long totalBytes = Environment.getDataDirectory().getTotalSpace();
+ final long limitBytes = 50 * Utils.MB_IN_BYTES;
+ final long waitDurationMs = TimeUnit.SECONDS.toMillis(2);
+ runWithKeyValues(() -> {
+ final DummyBlobData blobData1 = new DummyBlobData.Builder(mContext)
+ .setFileSize(40 * Utils.MB_IN_BYTES)
+ .build();
+ blobData1.prepare();
+ final DummyBlobData blobData2 = new DummyBlobData.Builder(mContext)
+ .setFileSize(30 * Utils.MB_IN_BYTES)
+ .build();
+ blobData2.prepare();
+
+ commitBlob(blobData1);
+ commitBlob(blobData2);
+ acquireLease(mContext, blobData1.getBlobHandle(), R.string.test_desc,
+ System.currentTimeMillis() + waitDurationMs);
+
+ assertThrows(LimitExceededException.class, () -> mBlobStoreManager.acquireLease(
+ blobData2.getBlobHandle(), R.string.test_desc));
+
+ waitForLeaseExpiration(waitDurationMs, blobData1.getBlobHandle());
+ acquireLease(mContext, blobData2.getBlobHandle(), R.string.test_desc);
+ }, Pair.create(KEY_TOTAL_BYTES_PER_APP_LIMIT_FLOOR, String.valueOf(limitBytes)),
+ Pair.create(KEY_TOTAL_BYTES_PER_APP_LIMIT_FRACTION,
+ String.valueOf((double) limitBytes / totalBytes)));
+ }
+
+ @Test
public void testRemainingLeaseQuota() throws Exception {
final long initialRemainingQuota = mBlobStoreManager.getRemainingLeaseQuotaBytes();
final long blobSize = 100 * Utils.MB_IN_BYTES;
@@ -1242,6 +1350,31 @@
}
@Test
+ public void testRemainingLeaseQuota_withExpiredLease() throws Exception {
+ final long initialRemainingQuota = mBlobStoreManager.getRemainingLeaseQuotaBytes();
+ final long blobSize = 100 * Utils.MB_IN_BYTES;
+ final DummyBlobData blobData = new DummyBlobData.Builder(mContext)
+ .setFileSize(blobSize)
+ .build();
+ blobData.prepare();
+
+ final long waitDurationMs = TimeUnit.SECONDS.toMillis(2);
+ commitBlob(blobData);
+ acquireLease(mContext, blobData.getBlobHandle(), R.string.test_desc,
+ System.currentTimeMillis() + waitDurationMs);
+ assertLeasedBlobs(mBlobStoreManager, blobData.getBlobHandle());
+
+ assertThat(mBlobStoreManager.getRemainingLeaseQuotaBytes())
+ .isEqualTo(initialRemainingQuota - blobSize);
+
+ waitForLeaseExpiration(waitDurationMs, blobData.getBlobHandle());
+ assertNoLeasedBlobs(mBlobStoreManager);
+
+ assertThat(mBlobStoreManager.getRemainingLeaseQuotaBytes())
+ .isEqualTo(initialRemainingQuota);
+ }
+
+ @Test
public void testAccessExpiredBlob() throws Exception {
final long expiryDurationMs = TimeUnit.SECONDS.toMillis(6);
final DummyBlobData blobData = new DummyBlobData.Builder(mContext)
@@ -1293,6 +1426,40 @@
}
@Test
+ public void testAccessBlob_withExpiredLease() throws Exception {
+ final long leaseExpiryDurationMs = TimeUnit.SECONDS.toMillis(2);
+ final long leaseAcquisitionWaitDurationMs = TimeUnit.SECONDS.toMillis(1);
+ runWithKeyValues(() -> {
+ final DummyBlobData blobData = new DummyBlobData.Builder(mContext).build();
+ blobData.prepare();
+ try {
+ final long blobId = commitBlob(blobData);
+ assertThat(runShellCmd("cmd blob_store query-blob-existence -b " + blobId))
+ .isEqualTo("1");
+
+ acquireLease(mContext, blobData.getBlobHandle(), R.string.test_desc,
+ System.currentTimeMillis() + leaseExpiryDurationMs);
+ assertLeasedBlobs(mBlobStoreManager, blobData.getBlobHandle());
+
+ waitForLeaseExpiration(leaseExpiryDurationMs, blobData.getBlobHandle());
+ assertNoLeasedBlobs(mBlobStoreManager);
+
+ triggerIdleMaintenance();
+ assertThat(runShellCmd("cmd blob_store query-blob-existence -b " + blobId))
+ .isEqualTo("0");
+
+ assertThrows(SecurityException.class, () -> mBlobStoreManager.acquireLease(
+ blobData.getBlobHandle(), R.string.test_desc,
+ blobData.getExpiryTimeMillis()));
+ assertNoLeasedBlobs(mBlobStoreManager);
+ } finally {
+ blobData.delete();
+ }
+ }, Pair.create(KEY_LEASE_ACQUISITION_WAIT_DURATION_MS,
+ String.valueOf(leaseAcquisitionWaitDurationMs)));
+ }
+
+ @Test
public void testCommitBlobAfterIdleMaintenance() throws Exception {
final DummyBlobData blobData = new DummyBlobData.Builder(mContext).build();
blobData.prepare();
@@ -1322,10 +1489,11 @@
@Test
public void testExpiredSessionsDeleted() throws Exception {
- final DummyBlobData blobData = new DummyBlobData.Builder(mContext).build();
- blobData.prepare();
final long waitDurationMs = TimeUnit.SECONDS.toMillis(2);
runWithKeyValues(() -> {
+ final DummyBlobData blobData = new DummyBlobData.Builder(mContext).build();
+ blobData.prepare();
+
final long sessionId = mBlobStoreManager.createSession(blobData.getBlobHandle());
assertThat(sessionId).isGreaterThan(0L);
@@ -1340,10 +1508,11 @@
@Test
public void testExpiredSessionsDeleted_withPartialData() throws Exception {
- final DummyBlobData blobData = new DummyBlobData.Builder(mContext).build();
- blobData.prepare();
final long waitDurationMs = TimeUnit.SECONDS.toMillis(2);
runWithKeyValues(() -> {
+ final DummyBlobData blobData = new DummyBlobData.Builder(mContext).build();
+ blobData.prepare();
+
final long sessionId = mBlobStoreManager.createSession(blobData.getBlobHandle());
assertThat(sessionId).isGreaterThan(0L);
@@ -1362,11 +1531,12 @@
@Test
public void testCreateSession_countLimitExceeded() throws Exception {
- final DummyBlobData blobData1 = new DummyBlobData.Builder(mContext).build();
- blobData1.prepare();
- final DummyBlobData blobData2 = new DummyBlobData.Builder(mContext).build();
- blobData2.prepare();
runWithKeyValues(() -> {
+ final DummyBlobData blobData1 = new DummyBlobData.Builder(mContext).build();
+ blobData1.prepare();
+ final DummyBlobData blobData2 = new DummyBlobData.Builder(mContext).build();
+ blobData2.prepare();
+
mBlobStoreManager.createSession(blobData1.getBlobHandle());
assertThrows(LimitExceededException.class,
() -> mBlobStoreManager.createSession(blobData2.getBlobHandle()));
@@ -1375,11 +1545,12 @@
@Test
public void testCommitSession_countLimitExceeded() throws Exception {
- final DummyBlobData blobData1 = new DummyBlobData.Builder(mContext).build();
- blobData1.prepare();
- final DummyBlobData blobData2 = new DummyBlobData.Builder(mContext).build();
- blobData2.prepare();
runWithKeyValues(() -> {
+ final DummyBlobData blobData1 = new DummyBlobData.Builder(mContext).build();
+ blobData1.prepare();
+ final DummyBlobData blobData2 = new DummyBlobData.Builder(mContext).build();
+ blobData2.prepare();
+
commitBlob(blobData1, null /* accessModifier */, 0 /* expectedResult */);
commitBlob(blobData2, null /* accessModifier */, 1 /* expectedResult */);
}, Pair.create(KEY_MAX_COMMITTED_BLOBS, String.valueOf(1)));
@@ -1387,11 +1558,12 @@
@Test
public void testLeaseBlob_countLimitExceeded() throws Exception {
- final DummyBlobData blobData1 = new DummyBlobData.Builder(mContext).build();
- blobData1.prepare();
- final DummyBlobData blobData2 = new DummyBlobData.Builder(mContext).build();
- blobData2.prepare();
runWithKeyValues(() -> {
+ final DummyBlobData blobData1 = new DummyBlobData.Builder(mContext).build();
+ blobData1.prepare();
+ final DummyBlobData blobData2 = new DummyBlobData.Builder(mContext).build();
+ blobData2.prepare();
+
commitBlob(blobData1);
commitBlob(blobData2);
@@ -1402,10 +1574,41 @@
}
@Test
- public void testAllowPackageAccess_countLimitExceeded() throws Exception {
- final DummyBlobData blobData = new DummyBlobData.Builder(mContext).build();
- blobData.prepare();
+ public void testExpiredLease_countLimitExceeded() throws Exception {
runWithKeyValues(() -> {
+ final DummyBlobData blobData1 = new DummyBlobData.Builder(mContext).build();
+ blobData1.prepare();
+ final DummyBlobData blobData2 = new DummyBlobData.Builder(mContext).build();
+ blobData2.prepare();
+ final DummyBlobData blobData3 = new DummyBlobData.Builder(mContext).build();
+ blobData3.prepare();
+ final long waitDurationMs = TimeUnit.SECONDS.toMillis(2);
+
+ commitBlob(blobData1);
+ commitBlob(blobData2);
+ commitBlob(blobData3);
+
+ acquireLease(mContext, blobData1.getBlobHandle(), "test desc1",
+ System.currentTimeMillis() + waitDurationMs);
+ assertThrows(LimitExceededException.class,
+ () -> acquireLease(mContext, blobData2.getBlobHandle(), "test desc2",
+ System.currentTimeMillis() + TimeUnit.HOURS.toMillis(4)));
+
+ waitForLeaseExpiration(waitDurationMs, blobData1.getBlobHandle());
+
+ acquireLease(mContext, blobData2.getBlobHandle(), "test desc2",
+ System.currentTimeMillis() + TimeUnit.HOURS.toMillis(4));
+ assertThrows(LimitExceededException.class,
+ () -> acquireLease(mContext, blobData3.getBlobHandle(), "test desc3"));
+ }, Pair.create(KEY_MAX_LEASED_BLOBS, String.valueOf(1)));
+ }
+
+ @Test
+ public void testAllowPackageAccess_countLimitExceeded() throws Exception {
+ runWithKeyValues(() -> {
+ final DummyBlobData blobData = new DummyBlobData.Builder(mContext).build();
+ blobData.prepare();
+
final long sessionId = mBlobStoreManager.createSession(blobData.getBlobHandle());
assertThat(sessionId).isGreaterThan(0L);
try (BlobStoreManager.Session session = mBlobStoreManager.openSession(sessionId)) {
@@ -1555,6 +1758,12 @@
() -> commandReceiver.openBlob(blobData.getBlobHandle()));
}
+ private void waitForLeaseExpiration(long waitDurationMs, BlobHandle leasedBlob)
+ throws Exception {
+ SystemClock.sleep(waitDurationMs);
+ assertThat(mBlobStoreManager.getLeaseInfo(leasedBlob)).isNull();
+ }
+
private TestServiceConnection bindToHelperService(String pkg) throws Exception {
final TestServiceConnection serviceConnection = new TestServiceConnection(mContext);
final Intent intent = new Intent()
diff --git a/tests/JobScheduler/src/android/jobscheduler/cts/JobThrottlingTest.java b/tests/JobScheduler/src/android/jobscheduler/cts/JobThrottlingTest.java
index e013454..b6d6120 100644
--- a/tests/JobScheduler/src/android/jobscheduler/cts/JobThrottlingTest.java
+++ b/tests/JobScheduler/src/android/jobscheduler/cts/JobThrottlingTest.java
@@ -103,6 +103,7 @@
private boolean mInitialAirplaneModeState;
private String mInitialJobSchedulerConstants;
private String mInitialDisplayTimeout;
+ private String mInitialRestrictedBucketEnabled;
private boolean mAutomotiveDevice;
private TestAppInterface mTestAppInterface;
@@ -157,6 +158,8 @@
mInitialAirplaneModeState = isAirplaneModeOn();
mInitialJobSchedulerConstants = Settings.Global.getString(mContext.getContentResolver(),
Settings.Global.JOB_SCHEDULER_CONSTANTS);
+ mInitialRestrictedBucketEnabled = Settings.Global.getString(mContext.getContentResolver(),
+ Settings.Global.ENABLE_RESTRICTED_BUCKET);
// Make sure test jobs can run regardless of bucket.
Settings.Global.putString(mContext.getContentResolver(),
Settings.Global.JOB_SCHEDULER_CONSTANTS, "min_ready_non_active_jobs_count=0");
@@ -294,6 +297,8 @@
assumeTrue("app standby not enabled", mAppStandbyEnabled);
assumeFalse("not testable in automotive device", mAutomotiveDevice);
+ setRestrictedBucketEnabled(true);
+
// Disable coalescing
Settings.Global.putString(mContext.getContentResolver(),
Settings.Global.JOB_SCHEDULER_QUOTA_CONTROLLER_CONSTANTS,
@@ -318,6 +323,8 @@
assumeTrue("app standby not enabled", mAppStandbyEnabled);
assumeFalse("not testable in automotive device", mAutomotiveDevice);
+ setRestrictedBucketEnabled(true);
+
// Disable coalescing and the parole session
Settings.Global.putString(mContext.getContentResolver(),
Settings.Global.JOB_SCHEDULER_QUOTA_CONTROLLER_CONSTANTS,
@@ -356,6 +363,8 @@
assumeTrue(mHasWifi);
ensureSavedWifiNetwork(mWifiManager);
+ setRestrictedBucketEnabled(true);
+
// Disable coalescing and the parole session
Settings.Global.putString(mContext.getContentResolver(),
Settings.Global.JOB_SCHEDULER_QUOTA_CONTROLLER_CONSTANTS,
@@ -502,6 +511,8 @@
}
Settings.Global.putString(mContext.getContentResolver(),
Settings.Global.JOB_SCHEDULER_CONSTANTS, mInitialJobSchedulerConstants);
+ Settings.Global.putString(mContext.getContentResolver(),
+ Settings.Global.ENABLE_RESTRICTED_BUCKET, mInitialRestrictedBucketEnabled);
if (isAirplaneModeOn() != mInitialAirplaneModeState) {
setAirplaneMode(mInitialAirplaneModeState);
}
@@ -518,6 +529,11 @@
restricted ? AppOpsManager.MODE_IGNORED : AppOpsManager.MODE_ALLOWED);
}
+ private void setRestrictedBucketEnabled(boolean enabled) {
+ Settings.Global.putString(mContext.getContentResolver(),
+ Settings.Global.ENABLE_RESTRICTED_BUCKET, enabled ? "1" : "0");
+ }
+
private boolean isTestAppTempWhitelisted() throws Exception {
final String output = mUiDevice.executeShellCommand("cmd deviceidle tempwhitelist").trim();
for (String line : output.split("\n")) {
diff --git a/tests/inputmethod/mockime/src/com/android/cts/mockime/ImeEventStreamTestUtils.java b/tests/inputmethod/mockime/src/com/android/cts/mockime/ImeEventStreamTestUtils.java
index 1b71ff0..f08633f 100644
--- a/tests/inputmethod/mockime/src/com/android/cts/mockime/ImeEventStreamTestUtils.java
+++ b/tests/inputmethod/mockime/src/com/android/cts/mockime/ImeEventStreamTestUtils.java
@@ -340,21 +340,4 @@
throw new RuntimeException("notExpectEvent failed: " + stream.dump(), e);
}
}
-
- /**
- * Clear all events with {@code eventName} in given {@code stream} and returns a forked
- * {@link ImeEventStream} without events with {@code eventName}.
- * <p>It is used to make sure previous events influence the test. </p>
- *
- * @param stream {@link ImeEventStream} to be cleared
- * @param eventName The targeted cleared event name
- * @return A forked {@link ImeEventStream} without event with {@code eventName}
- */
- public static ImeEventStream clearAllEvents(@NonNull ImeEventStream stream,
- @NonNull String eventName) {
- while (stream.seekToFirst(event -> eventName.equals(event.getEventName())).isPresent()) {
- stream.skip(1);
- }
- return stream.copy();
- }
}
diff --git a/tests/inputmethod/mockime/src/com/android/cts/mockime/ImeSettings.java b/tests/inputmethod/mockime/src/com/android/cts/mockime/ImeSettings.java
index 6731e85..917f7b3 100644
--- a/tests/inputmethod/mockime/src/com/android/cts/mockime/ImeSettings.java
+++ b/tests/inputmethod/mockime/src/com/android/cts/mockime/ImeSettings.java
@@ -52,7 +52,6 @@
private static final String INLINE_SUGGESTIONS_ENABLED = "InlineSuggestionsEnabled";
private static final String INLINE_SUGGESTION_VIEW_CONTENT_DESC =
"InlineSuggestionViewContentDesc";
- private static final String STRICT_MODE_ENABLED = "StrictModeEnabled";
@NonNull
private final PersistableBundle mBundle;
@@ -128,10 +127,6 @@
return mBundle.getString(INLINE_SUGGESTION_VIEW_CONTENT_DESC, defaultValue);
}
- public boolean isStrictModeEnabled() {
- return mBundle.getBoolean(STRICT_MODE_ENABLED, false);
- }
-
static Bundle serializeToBundle(@NonNull String eventCallbackActionName,
@Nullable Builder builder) {
final Bundle result = new Bundle();
@@ -285,10 +280,5 @@
return this;
}
- /** Sets whether to enable {@link android.os.StrictMode} or not. */
- public Builder setStrictModeEnabled(boolean enabled) {
- mBundle.putBoolean(STRICT_MODE_ENABLED, enabled);
- return this;
- }
}
}
diff --git a/tests/inputmethod/mockime/src/com/android/cts/mockime/MockIme.java b/tests/inputmethod/mockime/src/com/android/cts/mockime/MockIme.java
index 3acf57b..b0c66cf 100644
--- a/tests/inputmethod/mockime/src/com/android/cts/mockime/MockIme.java
+++ b/tests/inputmethod/mockime/src/com/android/cts/mockime/MockIme.java
@@ -36,7 +36,6 @@
import android.os.Looper;
import android.os.Process;
import android.os.ResultReceiver;
-import android.os.StrictMode;
import android.os.SystemClock;
import android.text.TextUtils;
import android.util.Log;
@@ -45,7 +44,6 @@
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
-import android.view.ViewConfiguration;
import android.view.Window;
import android.view.WindowInsets;
import android.view.WindowManager;
@@ -61,9 +59,9 @@
import android.view.inputmethod.InputContentInfo;
import android.view.inputmethod.InputMethod;
import android.widget.FrameLayout;
-import android.widget.HorizontalScrollView;
import android.widget.ImageView;
import android.widget.LinearLayout;
+import android.widget.HorizontalScrollView;
import android.widget.TextView;
import android.widget.inline.InlinePresentationSpec;
@@ -290,7 +288,8 @@
return ImeEvent.RETURN_VALUE_UNAVAILABLE;
}
case "getDisplayId":
- return getDisplay().getDisplayId();
+ return getSystemService(WindowManager.class)
+ .getDefaultDisplay().getDisplayId();
case "verifyLayoutInflaterContext":
return getLayoutInflater().getContext() == this;
case "setHeight":
@@ -300,17 +299,6 @@
case "setInlineSuggestionsExtras":
mInlineSuggestionsExtras = command.getExtras();
return ImeEvent.RETURN_VALUE_UNAVAILABLE;
- case "verifyGetDisplay":
- Context configContext = createConfigurationContext(new Configuration());
- return getDisplay() != null && configContext.getDisplay() != null;
- case "verifyGetWindowManager":
- configContext = createConfigurationContext(new Configuration());
- return getSystemService(WindowManager.class) != null
- && configContext.getSystemService(WindowManager.class) != null;
- case "verifyGetViewConfiguration":
- configContext = createConfigurationContext(new Configuration());
- return ViewConfiguration.get(this) != null
- && ViewConfiguration.get(configContext) != null;
}
}
return ImeEvent.RETURN_VALUE_UNAVAILABLE;
@@ -380,16 +368,6 @@
mClientPackageName.set(mSettings.getClientPackageName());
mImeEventActionName.set(mSettings.getEventCallbackActionName());
- // TODO(b/159593676): consider to detect more violations
- if (mSettings.isStrictModeEnabled()) {
- StrictMode.setVmPolicy(
- new StrictMode.VmPolicy.Builder()
- .detectIncorrectContextUse()
- .penaltyLog()
- .build());
- StrictMode.setViolationLogger(info -> getTracer().onStrictModeViolated(() -> {}));
- }
-
getTracer().onCreate(() -> {
super.onCreate();
mHandlerThread.start();
@@ -1062,10 +1040,5 @@
return recordEventInternal("onInlineSuggestionsResponse", supplier::getAsBoolean,
arguments);
}
-
- void onStrictModeViolated(@NonNull Runnable runnable) {
- final Bundle arguments = new Bundle();
- recordEventInternal("onStrictModeViolated", runnable, arguments);
- }
}
}
diff --git a/tests/inputmethod/mockime/src/com/android/cts/mockime/MockImeSession.java b/tests/inputmethod/mockime/src/com/android/cts/mockime/MockImeSession.java
index 5a7d94a..699da4c 100644
--- a/tests/inputmethod/mockime/src/com/android/cts/mockime/MockImeSession.java
+++ b/tests/inputmethod/mockime/src/com/android/cts/mockime/MockImeSession.java
@@ -1006,19 +1006,4 @@
public ImeCommand callSetInlineSuggestionsExtras(@NonNull Bundle bundle) {
return callCommandInternal("setInlineSuggestionsExtras", bundle);
}
-
- @NonNull
- public ImeCommand callVerifyGetDisplay() {
- return callCommandInternal("verifyGetDisplay", new Bundle());
- }
-
- @NonNull
- public ImeCommand callVerifyGetWindowManager() {
- return callCommandInternal("verifyGetWindowManager", new Bundle());
- }
-
- @NonNull
- public ImeCommand callVerifyGetViewConfiguration() {
- return callCommandInternal("verifyGetViewConfiguration", new Bundle());
- }
}
diff --git a/tests/media/src/android/mediav2/cts/EncoderProfileLevelTest.java b/tests/media/src/android/mediav2/cts/EncoderProfileLevelTest.java
index 343f4f0..4b765ab 100644
--- a/tests/media/src/android/mediav2/cts/EncoderProfileLevelTest.java
+++ b/tests/media/src/android/mediav2/cts/EncoderProfileLevelTest.java
@@ -83,7 +83,7 @@
}
final List<Object[]> exhaustiveArgsList = Arrays.asList(new Object[][]{
// Audio - CodecMime, bit-rate, sample rate, channel count
- {MediaFormat.MIMETYPE_AUDIO_AAC, 64000, 8000, 1, -1},
+ {MediaFormat.MIMETYPE_AUDIO_AAC, 64000, 48000, 1, -1},
{MediaFormat.MIMETYPE_AUDIO_AAC, 128000, 48000, 2, -1},
// Video - CodecMime, bit-rate, height, width, frame-rate
diff --git a/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java b/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
index 29a860e..47ccab4 100644
--- a/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
+++ b/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
@@ -445,7 +445,10 @@
}
public void testInteractAcrossProfilesSettings() {
- assertCanBeHandled(new Intent(Settings.ACTION_MANAGE_CROSS_PROFILE_ACCESS));
+ PackageManager packageManager = mContext.getPackageManager();
+ if (packageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_PROFILES)) {
+ assertCanBeHandled(new Intent(Settings.ACTION_MANAGE_CROSS_PROFILE_ACCESS));
+ }
}
public void testChangeDefaultSmsApplication() {
@@ -496,6 +499,12 @@
@CddTest(requirement = "7.4.2.6/C-1-1")
public void testEasyConnectIntent() {
+ // Android only supports Initiator-... modes right now, which require the device to
+ // have a QR-code capture mechanism. Therefore this feature does not make sense on
+ // non-handheld devices.
+ if (!isHandheld()) {
+ return;
+ }
WifiManager manager = mContext.getSystemService(WifiManager.class);
if (manager.isEasyConnectSupported()) {
@@ -529,6 +538,11 @@
}
public void testVoiceInputSettingsIntent() {
+ // Non-handheld devices do not allow more than one VoiceInteractionService, and therefore do
+ // not have to support this Intent.
+ if (!isHandheld()) {
+ return;
+ }
Intent intent = new Intent(Settings.ACTION_VOICE_INPUT_SETTINGS);
assertCanBeHandled(intent);
}
diff --git a/tests/tests/graphics/src/android/graphics/cts/VulkanDeqpLevelTest.java b/tests/tests/graphics/src/android/graphics/cts/VulkanDeqpLevelTest.java
index a736878..a11406c 100644
--- a/tests/tests/graphics/src/android/graphics/cts/VulkanDeqpLevelTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/VulkanDeqpLevelTest.java
@@ -71,7 +71,8 @@
@CddTest(requirement = "7.1.4.2/C-1-8,C-1-9")
@Test
public void testVulkanDeqpLevel() {
- if (mVulkanHardwareVersion.version >= VULKAN_1_0) {
+ if (mVulkanHardwareVersion != null
+ && mVulkanHardwareVersion.version >= VULKAN_1_0) {
if (DEBUG) {
Log.d(TAG, "Checking whether " + PackageManager.FEATURE_VULKAN_DEQP_LEVEL
+ " has an acceptable value");
diff --git a/tests/tests/media/res/raw/sine_2ch_48khz_aot42_seek_mp4.m4a b/tests/tests/media/res/raw/sine_2ch_48khz_aot42_seek_mp4.m4a
new file mode 100644
index 0000000..c0d5056
--- /dev/null
+++ b/tests/tests/media/res/raw/sine_2ch_48khz_aot42_seek_mp4.m4a
Binary files differ
diff --git a/tests/tests/media/src/android/media/cts/DecoderTestXheAac.java b/tests/tests/media/src/android/media/cts/DecoderTestXheAac.java
index 0b4dee5..8536f30 100755
--- a/tests/tests/media/src/android/media/cts/DecoderTestXheAac.java
+++ b/tests/tests/media/src/android/media/cts/DecoderTestXheAac.java
@@ -559,6 +559,38 @@
}
}
+
+ /**
+ * Verify that seeking works correctly for USAC.
+ * Sync samples have to be taken into consideration.
+ */
+ @Test
+ public void testDecodeUsacSyncSampleSeekingM4a() throws Exception {
+ Log.v(TAG, "START testDecodeUsacSyncSampleSeekingM4a");
+
+ assertTrue("No AAC decoder found", sAacDecoderNames.size() > 0);
+
+ for (String aacDecName : sAacDecoderNames) {
+ try {
+ runDecodeUsacSyncSampleSeekingM4a(aacDecName);
+ } catch (Error err) {
+ throw new Error(err.getMessage() + " [dec=" + aacDecName + "]" , err);
+ }
+ }
+ }
+
+ private void runDecodeUsacSyncSampleSeekingM4a(String aacDecName) throws Exception {
+ Log.v(TAG, "testDecodeUsacSyncSampleSeekingM4a running for dec=" + aacDecName);
+ // test usac seeking
+ try {
+ checkUsacSyncSampleSeeking(R.raw.sine_2ch_48khz_aot42_seek_mp4, aacDecName);
+ } catch (Exception e) {
+ Log.v(TAG, "testDecodeUsacSyncSampleSeekingM4a failed for dec=" + aacDecName);
+ throw new RuntimeException(e);
+ }
+ Log.v(TAG, "testDecodeUsacSyncSampleSeekingM4a running for dec=" + aacDecName);
+ }
+
/**
* Internal utilities
*/
@@ -796,6 +828,17 @@
}
}
+ private void checkUsacSyncSampleSeeking(int testInput, String decoderName) throws Exception {
+
+ AudioParameter decParams = new AudioParameter();
+ DrcParams drcParams_def = new DrcParams();
+
+ short[] decSamples_seek_next_sync = decodeToMemory(decParams, testInput, -1, null,
+ drcParams_def, decoderName, false, -2, true, 1100000,
+ MediaExtractor.SEEK_TO_NEXT_SYNC);
+ float[] nrg_seek_next_sync = checkEnergyUSAC(decSamples_seek_next_sync, decParams, 2, 1);
+ }
+
/**
* Perform a segmented energy analysis on given audio signal samples and run several tests on
* the energy values.
@@ -1172,11 +1215,16 @@
* before starting to decode
* @param expectedOutputLoudness value to check if the correct output loudness is returned
* by the decoder
+ * @param seek_enable defines whether there will be an initial seek
+ * @param seek_duration seeking duration in microseconds
+ * @param seek_mode seeking mode
+ *
* @throws RuntimeException
*/
public short[] decodeToMemory(AudioParameter audioParams, int testinput, int eossample,
List<Long> timestamps, DrcParams drcParams, String decoderName, boolean runtimeChange,
- int expectedOutputLoudness) throws IOException {
+ int expectedOutputLoudness,
+ boolean seek_enable, int seek_duration, int seek_mode) throws IOException {
// TODO: code is the same as in DecoderTest, differences are:
// - addition of application of DRC parameters
// - no need/use of resetMode, configMode
@@ -1285,6 +1333,12 @@
extractor.selectTrack(0);
+ // execute initial seeking if specified
+ if (seek_enable) {
+ codec.flush();
+ extractor.seekTo(seek_duration, seek_mode);
+ }
+
// start decoding
final long kTimeOutUs = 5000;
MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
@@ -1436,7 +1490,7 @@
throws IOException
{
final short[] decoded = decodeToMemory(audioParams, testinput, eossample, timestamps,
- drcParams, decoderName, false, -2);
+ drcParams, decoderName, false, -2, false, 0, 0);
return decoded;
}
@@ -1446,9 +1500,18 @@
throws IOException
{
final short[] decoded = decodeToMemory(audioParams, testinput, eossample, timestamps,
- drcParams, decoderName, runtimeChange, -2);
+ drcParams, decoderName, runtimeChange, -2, false, 0, 0);
return decoded;
}
+ private short[] decodeToMemory(AudioParameter audioParams, int testinput,
+ int eossample, List<Long> timestamps, DrcParams drcParams, String decoderName,
+ boolean runtimeChange, int expectedOutputLoudness)
+ throws IOException
+ {
+ short [] decoded = decodeToMemory(audioParams, testinput, eossample, timestamps, drcParams,
+ decoderName, runtimeChange, expectedOutputLoudness, false, 0, 0);
+ return decoded;
+ }
}
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecBlockModelTest.java b/tests/tests/media/src/android/media/cts/MediaCodecBlockModelTest.java
index 58eec3e..f6ac4f7 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecBlockModelTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecBlockModelTest.java
@@ -59,6 +59,7 @@
/**
* MediaCodec tests with CONFIGURE_FLAG_USE_BLOCK_MODEL.
*/
+@NonMediaMainlineTest
public class MediaCodecBlockModelTest extends AndroidTestCase {
private static final String TAG = "MediaCodecBlockModelTest";
private static final boolean VERBOSE = false; // lots of logging
diff --git a/tests/tests/net/src/android/net/cts/ConnectivityDiagnosticsManagerTest.java b/tests/tests/net/src/android/net/cts/ConnectivityDiagnosticsManagerTest.java
index 34ca9a4..8f42f79 100644
--- a/tests/tests/net/src/android/net/cts/ConnectivityDiagnosticsManagerTest.java
+++ b/tests/tests/net/src/android/net/cts/ConnectivityDiagnosticsManagerTest.java
@@ -107,6 +107,7 @@
private static final int UNKNOWN_DETECTION_METHOD = 4;
private static final int FILTERED_UNKNOWN_DETECTION_METHOD = 0;
private static final int CARRIER_CONFIG_CHANGED_BROADCAST_TIMEOUT = 5000;
+ private static final int DELAY_FOR_ADMIN_UIDS_MILLIS = 2000;
private static final Executor INLINE_EXECUTOR = x -> x.run();
@@ -268,7 +269,8 @@
// CS does not trigger NetworkCallback#onCapabilitiesChanged as changing the
// administratorUids is not a publicly visible change. In lieu of a better signal to
// detministically wait for, use Thread#sleep here.
- Thread.sleep(500);
+ // TODO(b/157949581): replace this Thread#sleep with a deterministic signal
+ Thread.sleep(DELAY_FOR_ADMIN_UIDS_MILLIS);
final TestConnectivityDiagnosticsCallback connDiagsCallback =
createAndRegisterConnectivityDiagnosticsCallback(CELLULAR_NETWORK_REQUEST);
diff --git a/tests/tests/os/Android.bp b/tests/tests/os/Android.bp
index e04630b..b118392 100644
--- a/tests/tests/os/Android.bp
+++ b/tests/tests/os/Android.bp
@@ -26,7 +26,6 @@
"truth-prebuilt",
"guava",
"junit",
- "CtsMockInputMethodLib"
],
jni_uses_platform_apis: true,
jni_libs: [
diff --git a/tests/tests/os/CtsOsTestCases.xml b/tests/tests/os/CtsOsTestCases.xml
index 7ce85d6..3718c59 100644
--- a/tests/tests/os/CtsOsTestCases.xml
+++ b/tests/tests/os/CtsOsTestCases.xml
@@ -22,15 +22,6 @@
<option name="cleanup-apks" value="true" />
<option name="test-file-name" value="CtsOsTestCases.apk" />
</target_preparer>
- <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
- <option name="cleanup-apks" value="true" />
- <option name="force-install-mode" value="FULL"/>
- <option name="test-file-name" value="CtsMockInputMethod.apk" />
- </target_preparer>
- <target_preparer class="com.android.tradefed.targetprep.DeviceSetup">
- <option name="screen-always-on" value="on" />
- </target_preparer>
-
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="android.os.cts" />
<option name="runtime-hint" value="3m15s" />
diff --git a/tests/tests/os/src/android/os/cts/AutoRevokeTest.kt b/tests/tests/os/src/android/os/cts/AutoRevokeTest.kt
index 835f541..9bebccf 100644
--- a/tests/tests/os/src/android/os/cts/AutoRevokeTest.kt
+++ b/tests/tests/os/src/android/os/cts/AutoRevokeTest.kt
@@ -17,6 +17,7 @@
package android.os.cts
import android.content.Intent
+import android.content.Intent.ACTION_AUTO_REVOKE_PERMISSIONS
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
import android.content.pm.PackageManager
import android.content.pm.PackageManager.PERMISSION_DENIED
@@ -24,7 +25,6 @@
import android.net.Uri
import android.platform.test.annotations.AppModeFull
import android.provider.DeviceConfig
-import android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS
import android.support.test.uiautomator.By
import android.support.test.uiautomator.BySelector
import android.support.test.uiautomator.UiObject2
@@ -287,7 +287,7 @@
}
private fun goToPermissions(packageName: String = APK_PACKAGE_NAME) {
- context.startActivity(Intent(ACTION_APPLICATION_DETAILS_SETTINGS)
+ context.startActivity(Intent(ACTION_AUTO_REVOKE_PERMISSIONS)
.setData(Uri.fromParts("package", packageName, null))
.addFlags(FLAG_ACTIVITY_NEW_TASK))
diff --git a/tests/tests/os/src/android/os/cts/SimpleTestActivity.java b/tests/tests/os/src/android/os/cts/SimpleTestActivity.java
index 22c706f..4242315 100644
--- a/tests/tests/os/src/android/os/cts/SimpleTestActivity.java
+++ b/tests/tests/os/src/android/os/cts/SimpleTestActivity.java
@@ -16,30 +16,7 @@
package android.os.cts;
-import static android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE;
-
import android.app.Activity;
-import android.os.Bundle;
-import android.widget.EditText;
-import android.widget.LinearLayout;
public class SimpleTestActivity extends Activity {
- private EditText mEditText;
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- mEditText = new EditText(this);
- final LinearLayout layout = new LinearLayout(this);
- layout.setOrientation(LinearLayout.VERTICAL);
- layout.addView(mEditText);
- setContentView(layout);
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- getWindow().setSoftInputMode(SOFT_INPUT_STATE_ALWAYS_VISIBLE);
- mEditText.requestFocus();
- }
}
\ No newline at end of file
diff --git a/tests/tests/os/src/android/os/cts/StrictModeTest.java b/tests/tests/os/src/android/os/cts/StrictModeTest.java
index b1023f6..8ed37ca 100644
--- a/tests/tests/os/src/android/os/cts/StrictModeTest.java
+++ b/tests/tests/os/src/android/os/cts/StrictModeTest.java
@@ -17,15 +17,9 @@
package android.os.cts;
import static android.content.Context.WINDOW_SERVICE;
-import static android.content.pm.PackageManager.FEATURE_INPUT_METHODS;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
-import static com.android.cts.mockime.ImeEventStreamTestUtils.clearAllEvents;
-import static com.android.cts.mockime.ImeEventStreamTestUtils.expectCommand;
-import static com.android.cts.mockime.ImeEventStreamTestUtils.expectEvent;
-import static com.android.cts.mockime.ImeEventStreamTestUtils.notExpectEvent;
-
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
@@ -38,7 +32,7 @@
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
-import android.content.res.Configuration;
+import android.content.res.Resources;
import android.hardware.display.DisplayManager;
import android.inputmethodservice.InputMethodService;
import android.net.TrafficStats;
@@ -69,16 +63,10 @@
import android.view.ViewConfiguration;
import android.view.WindowManager;
-import androidx.annotation.IntDef;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.runner.AndroidJUnit4;
-import com.android.cts.mockime.ImeEvent;
-import com.android.cts.mockime.ImeEventStream;
-import com.android.cts.mockime.ImeSettings;
-import com.android.cts.mockime.MockImeSession;
-
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -90,8 +78,6 @@
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
import java.net.HttpURLConnection;
import java.net.Socket;
import java.net.URL;
@@ -110,49 +96,10 @@
public class StrictModeTest {
private static final String TAG = "StrictModeTest";
private static final String REMOTE_SERVICE_ACTION = "android.app.REMOTESERVICE";
- private static final long TIMEOUT = TimeUnit.SECONDS.toMillis(10); // 10 seconds
- private static final long NOT_EXPECT_TIMEOUT = TimeUnit.SECONDS.toMillis(2);
private StrictMode.ThreadPolicy mThreadPolicy;
private StrictMode.VmPolicy mVmPolicy;
- /**
- * Verify mode to verifying if APIs violates incorrect context violation.
- *
- * @see #VERIFY_MODE_GET_DISPLAY
- * @see #VERIFY_MODE_GET_WINDOW_MANAGER
- * @see #VERIFY_MODE_GET_VIEW_CONFIGURATION
- */
- @Retention(RetentionPolicy.SOURCE)
- @IntDef(flag = true, value = {
- VERIFY_MODE_GET_DISPLAY,
- VERIFY_MODE_GET_WINDOW_MANAGER,
- VERIFY_MODE_GET_VIEW_CONFIGURATION,
- })
- private @interface VerifyMode {}
-
- /**
- * Verifies if {@link Context#getDisplay} from {@link InputMethodService} and context created
- * from {@link InputMethodService#createConfigurationContext(Configuration)} violates
- * incorrect context violation.
- */
- private static final int VERIFY_MODE_GET_DISPLAY = 1;
- /**
- * Verifies if get {@link android.view.WindowManager} from {@link InputMethodService} and
- * context created from {@link InputMethodService#createConfigurationContext(Configuration)}
- * violates incorrect context violation.
- *
- * @see Context#getSystemService(String)
- * @see Context#getSystemService(Class)
- */
- private static final int VERIFY_MODE_GET_WINDOW_MANAGER = 2;
- /**
- * Verifies if passing {@link InputMethodService} and context created
- * from {@link InputMethodService#createConfigurationContext(Configuration)} to
- * {@link android.view.ViewConfiguration#get(Context)} violates incorrect context violation.
- */
- private static final int VERIFY_MODE_GET_VIEW_CONFIGURATION = 3;
-
private Context getContext() {
return ApplicationProvider.getApplicationContext();
}
@@ -700,9 +647,6 @@
final Activity activity = InstrumentationRegistry.getInstrumentation()
.startActivitySync(intent);
assertNoViolation(() -> activity.getSystemService(WINDOW_SERVICE));
-
- // TODO(b/159593676): move the logic to CtsInputMethodTestCases
- verifyIms(VERIFY_MODE_GET_WINDOW_MANAGER);
}
@Test
@@ -725,13 +669,10 @@
Intent intent = new Intent(getContext(), SimpleTestActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-
final Activity activity = InstrumentationRegistry.getInstrumentation()
.startActivitySync(intent);
assertNoViolation(() -> activity.getDisplay());
- // TODO(b/159593676): move the logic to CtsInputMethodTestCases
- verifyIms(VERIFY_MODE_GET_DISPLAY);
try {
getContext().getApplicationContext().getDisplay();
} catch (UnsupportedOperationException e) {
@@ -750,14 +691,14 @@
final Context baseContext = getContext();
assertViolation(
- "Tried to access UI constants from a non-visual Context:",
+ "Tried to access UI constants from a non-visual Context.",
() -> ViewConfiguration.get(baseContext));
final Display display = baseContext.getSystemService(DisplayManager.class)
.getDisplay(DEFAULT_DISPLAY);
final Context displayContext = baseContext.createDisplayContext(display);
assertViolation(
- "Tried to access UI constants from a non-visual Context:",
+ "Tried to access UI constants from a non-visual Context.",
() -> ViewConfiguration.get(displayContext));
final Context windowContext =
@@ -770,55 +711,14 @@
.startActivitySync(intent);
assertNoViolation(() -> ViewConfiguration.get(activity));
- // TODO(b/159593676): move the logic to CtsInputMethodTestCases
- verifyIms(VERIFY_MODE_GET_VIEW_CONFIGURATION);
+ final TestInputMethodService ims = new TestInputMethodService(getContext());
+ assertNoViolation(() -> ViewConfiguration.get(ims));
}
- // TODO(b/159593676): move the logic to CtsInputMethodTestCases
- /**
- * Verify if APIs violates incorrect context violations by {@code mode}.
- *
- * @see VerifyMode
- */
- private void verifyIms(@VerifyMode int mode) throws Exception {
- // If devices do not support installable IMEs, finish the test gracefully. We don't use
- // assumeTrue here because we do pass some cases, so showing "pass" instead of "skip" makes
- // sense here.
- if (!supportsInstallableIme()) {
- return;
+ private static class TestInputMethodService extends InputMethodService {
+ private TestInputMethodService(Context baseContext) {
+ attachBaseContext(baseContext);
}
-
- try (final MockImeSession imeSession = MockImeSession.create(getContext(),
- InstrumentationRegistry.getInstrumentation().getUiAutomation(),
- new ImeSettings.Builder().setStrictModeEnabled(true))) {
- final ImeEventStream stream = imeSession.openEventStream();
- expectEvent(stream, event -> "onStartInput".equals(event.getEventName()), TIMEOUT);
- final ImeEventStream forkedStream = clearAllEvents(stream, "onStrictModeViolated");
- final ImeEvent imeEvent;
- switch (mode) {
- case VERIFY_MODE_GET_DISPLAY:
- imeEvent = expectCommand(forkedStream, imeSession.callVerifyGetDisplay(),
- TIMEOUT);
- break;
- case VERIFY_MODE_GET_WINDOW_MANAGER:
- imeEvent = expectCommand(forkedStream, imeSession.callVerifyGetWindowManager(),
- TIMEOUT);
- break;
- case VERIFY_MODE_GET_VIEW_CONFIGURATION:
- imeEvent = expectCommand(forkedStream,
- imeSession.callVerifyGetViewConfiguration(), TIMEOUT);
- break;
- default:
- imeEvent = null;
- }
- assertTrue(imeEvent.getReturnBooleanValue());
- notExpectEvent(stream, event -> "onStrictModeViolated".equals(event.getEventName()),
- NOT_EXPECT_TIMEOUT);
- }
- }
-
- private boolean supportsInstallableIme() {
- return getContext().getPackageManager().hasSystemFeature(FEATURE_INPUT_METHODS);
}
private static void runWithRemoteServiceBound(Context context, Consumer<ISecondary> consumer)
diff --git a/tests/tests/permission2/res/raw/android_manifest.xml b/tests/tests/permission2/res/raw/android_manifest.xml
index 302e55b..3627195 100644
--- a/tests/tests/permission2/res/raw/android_manifest.xml
+++ b/tests/tests/permission2/res/raw/android_manifest.xml
@@ -4818,7 +4818,7 @@
<!-- @SystemApi Allows an application to turn on / off quiet mode.
@hide -->
<permission android:name="android.permission.MODIFY_QUIET_MODE"
- android:protectionLevel="signature|privileged|wellbeing" />
+ android:protectionLevel="signature|privileged|wellbeing|development" />
<!-- Allows internal management of the camera framework
@hide -->
diff --git a/tests/tests/role/src/android/app/role/cts/RoleManagerTest.java b/tests/tests/role/src/android/app/role/cts/RoleManagerTest.java
index 60cac6a..00ddc34 100644
--- a/tests/tests/role/src/android/app/role/cts/RoleManagerTest.java
+++ b/tests/tests/role/src/android/app/role/cts/RoleManagerTest.java
@@ -255,6 +255,10 @@
requestRole(ROLE_NAME);
findDontAskAgainCheck().click();
clickButtonAndWaitForResult(true);
+ // Wait for the RequestRoleActivity inside the test app to be removed from our task so that
+ // when the test app is force stopped, our task isn't force finished and our
+ // WaitForResultActivity can survive.
+ Thread.sleep(5000);
clearPackageData(APP_PACKAGE_NAME);
// Wait for the don't ask again to be forgotten.
@@ -285,6 +289,10 @@
requestRole(ROLE_NAME);
findDontAskAgainCheck().click();
clickButtonAndWaitForResult(true);
+ // Wait for the RequestRoleActivity inside the test app to be removed from our task so that
+ // when the test app is uninstalled, our task isn't force finished and our
+ // WaitForResultActivity can survive.
+ Thread.sleep(5000);
uninstallPackage(APP_PACKAGE_NAME);
// Wait for the don't ask again to be forgotten.
diff --git a/tests/tests/telecom/src/android/telecom/cts/BackgroundCallAudioTest.java b/tests/tests/telecom/src/android/telecom/cts/BackgroundCallAudioTest.java
index 1bd1b27..dc26f6d 100644
--- a/tests/tests/telecom/src/android/telecom/cts/BackgroundCallAudioTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/BackgroundCallAudioTest.java
@@ -95,6 +95,37 @@
verifySimulateRingAndUserPickup(call, connection);
}
+ public void testHoldAfterAudioProcessingFromCallScreening() throws Exception {
+ if (!mShouldTestTelecom) {
+ return;
+ }
+
+ setupIncomingCallWithCallScreening();
+
+ final MockConnection connection = verifyConnectionForIncomingCall();
+
+ if (!mInCallCallbacks.lock.tryAcquire(TestUtils.WAIT_FOR_CALL_ADDED_TIMEOUT_S,
+ TimeUnit.SECONDS)) {
+ fail("No call added to InCallService.");
+ }
+
+ Call call = mInCallCallbacks.getService().getLastCall();
+ assertCallState(call, Call.STATE_AUDIO_PROCESSING);
+ assertConnectionState(connection, Connection.STATE_ACTIVE);
+
+ AudioManager audioManager = mContext.getSystemService(AudioManager.class);
+ if (doesAudioManagerSupportCallScreening) {
+ assertAudioMode(audioManager, MODE_CALL_SCREENING);
+ }
+
+ verifySimulateRingAndUserPickup(call, connection);
+
+ call.hold();
+ assertCallState(call, Call.STATE_HOLDING);
+ call.unhold();
+ assertCallState(call, Call.STATE_ACTIVE);
+ }
+
public void testAudioProcessingFromCallScreeningDisallow() throws Exception {
if (!mShouldTestTelecom) {
return;
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/WifiManagerTest.java b/tests/tests/wifi/src/android/net/wifi/cts/WifiManagerTest.java
index 8ad29c7..fd61914 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/WifiManagerTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/WifiManagerTest.java
@@ -2781,14 +2781,6 @@
// Now trigger scan and ensure that the device does not connect to any networks.
mWifiManager.startScan();
ensureNotConnected();
-
- // Toggle Wifi off/on should clean the state.
- setWifiEnabled(false);
- setWifiEnabled(true);
-
- // Trigger a scan & wait for connection to one of the saved networks.
- mWifiManager.startScan();
- waitForConnection();
} finally {
uiAutomation.dropShellPermissionIdentity();
setWifiEnabled(false);