Merge tag 'android-11.0.0_r48' into int/11/fp3
Android 11.0.0 Release 48 (RD2A.211001.002)
* tag 'android-11.0.0_r48':
Check READ_PRIVILEGED_PHONE_STATE in getAvailableSubscriptionInfoList CTS
Verify SAF blocks directory access to /sdcard/Android
[security] SubscriptionGroup is exposed to unprivileged callers
Change-Id: If34724b390a7aa75a8b40b63dcea972915db497e
diff --git a/hostsidetests/appsecurity/test-apps/DocumentClient/src/com/android/cts/documentclient/DocumentsClientTest.java b/hostsidetests/appsecurity/test-apps/DocumentClient/src/com/android/cts/documentclient/DocumentsClientTest.java
index 106434f..98f4ad1 100644
--- a/hostsidetests/appsecurity/test-apps/DocumentClient/src/com/android/cts/documentclient/DocumentsClientTest.java
+++ b/hostsidetests/appsecurity/test-apps/DocumentClient/src/com/android/cts/documentclient/DocumentsClientTest.java
@@ -140,6 +140,13 @@
assertTrue(title.waitForExists(TIMEOUT));
}
+ private String getDeviceName() {
+ final String deviceName = Settings.Global.getString(
+ mActivity.getContentResolver(), Settings.Global.DEVICE_NAME);
+ // Device name should always be set. In case it isn't, fall back to "Internal Storage"
+ return !TextUtils.isEmpty(deviceName) ? deviceName : "Internal Storage";
+ }
+
public void testOpenSimple() throws Exception {
if (!supportedHardware()) return;
@@ -371,6 +378,16 @@
// save button is disabled for the storage root
assertFalse(findSaveButton().isEnabled());
+ // We should always have Android directory available
+ findDocument("Android").click();
+ mDevice.waitForIdle();
+
+ // save button is disabled for Android folder
+ assertFalse(findSaveButton().isEnabled());
+
+ findRoot(getDeviceName()).click();
+ mDevice.waitForIdle();
+
try {
findDocument("Download").click();
mDevice.waitForIdle();
@@ -409,6 +426,16 @@
// save button is enabled for for the storage root
assertTrue(findSaveButton().isEnabled());
+ // We should always have Android directory available
+ findDocument("Android").click();
+ mDevice.waitForIdle();
+
+ // save button is enabled for Android folder
+ assertTrue(findSaveButton().isEnabled());
+
+ findRoot(getDeviceName()).click();
+ mDevice.waitForIdle();
+
try {
findDocument("Download").click();
mDevice.waitForIdle();
@@ -702,15 +729,8 @@
mActivity.startActivityForResult(intent, REQUEST_CODE);
mDevice.waitForIdle();
- final String deviceName = Settings.Global.getString(
- mActivity.getContentResolver(), Settings.Global.DEVICE_NAME);
-
- // Device name should always be set. In case it isn't, though,
- // fall back to "Internal Storage".
- final String title = !TextUtils.isEmpty(deviceName) ? deviceName : "Internal Storage";
-
// assert the default root is internal storage root
- assertToolbarTitleEquals(title);
+ assertToolbarTitleEquals(getDeviceName());
// no Downloads root
assertFalse(findRoot("Downloads").exists());
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/SubscriptionManagerTest.java b/tests/tests/telephony/current/src/android/telephony/cts/SubscriptionManagerTest.java
index 86371fd..02df1b0 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/SubscriptionManagerTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/SubscriptionManagerTest.java
@@ -571,9 +571,23 @@
List<SubscriptionInfo> infoList = mSm.getSubscriptionsInGroup(uuid);
assertNotNull(infoList);
assertEquals(1, infoList.size());
+ assertNull(infoList.get(0).getGroupUuid());
+
+ infoList = ShellIdentityUtils.invokeMethodWithShellPermissions(mSm,
+ (sm) -> sm.getSubscriptionsInGroup(uuid));
+ assertNotNull(infoList);
+ assertEquals(1, infoList.size());
assertEquals(uuid, infoList.get(0).getGroupUuid());
- List<SubscriptionInfo> availableInfoList = mSm.getAvailableSubscriptionInfoList();
+ List<SubscriptionInfo> availableInfoList;
+ try {
+ mSm.getAvailableSubscriptionInfoList();
+ fail("SecurityException should be thrown without READ_PRIVILEGED_PHONE_STATE");
+ } catch (SecurityException ex) {
+ // Ignore
+ }
+ availableInfoList = ShellIdentityUtils.invokeMethodWithShellPermissions(mSm,
+ (sm) -> sm.getAvailableSubscriptionInfoList());
if (availableInfoList.size() > 1) {
List<Integer> availableSubGroup = availableInfoList.stream()
.map(info -> info.getSubscriptionId())
@@ -615,6 +629,12 @@
List<SubscriptionInfo> infoList = mSm.getSubscriptionsInGroup(uuid);
assertNotNull(infoList);
assertEquals(1, infoList.size());
+ assertNull(infoList.get(0).getGroupUuid());
+
+ infoList = ShellIdentityUtils.invokeMethodWithShellPermissions(mSm,
+ (sm) -> sm.getSubscriptionsInGroup(uuid));
+ assertNotNull(infoList);
+ assertEquals(1, infoList.size());
assertEquals(uuid, infoList.get(0).getGroupUuid());
// Remove from subscription group with current sub Id.