diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 92f51ed03533d..3676a9b2548ff 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -11585,12 +11585,14 @@ public class DevicePolicyManager {
* #setCrossProfilePackages(ComponentName, Set)}.
*
The default package names set by the OEM that are allowed to request user consent for
* cross-profile communication without being explicitly enabled by the admin, via
- * {@link com.android.internal.R.array#cross_profile_apps}
+ * {@link com.android.internal.R.array#cross_profile_apps} and
+ * {@link com.android.internal.R.array#vendor_cross_profile_apps}.
*
*
* @return the combined set of whitelisted package names set via
- * {@link #setCrossProfilePackages(ComponentName, Set)} and
- * {@link com.android.internal.R.array#cross_profile_apps}
+ * {@link #setCrossProfilePackages(ComponentName, Set)},
+ * {@link com.android.internal.R.array#cross_profile_apps},
+ * and {@link com.android.internal.R.array#vendor_cross_profile_apps}.
*
* @hide
*/
@@ -11600,7 +11602,7 @@ public class DevicePolicyManager {
permission.INTERACT_ACROSS_PROFILES
})
public @NonNull Set getAllCrossProfilePackages() {
- throwIfParentInstance("getDefaultCrossProfilePackages");
+ throwIfParentInstance("getAllCrossProfilePackages");
if (mService != null) {
try {
return new ArraySet<>(mService.getAllCrossProfilePackages());
@@ -11611,6 +11613,26 @@ public class DevicePolicyManager {
return Collections.emptySet();
}
+ /**
+ * Returns the default package names set by the OEM that are allowed to request user consent for
+ * cross-profile communication without being explicitly enabled by the admin, via
+ * {@link com.android.internal.R.array#cross_profile_apps} and
+ * {@link com.android.internal.R.array#vendor_cross_profile_apps}.
+ *
+ * @hide
+ */
+ public @NonNull Set getDefaultCrossProfilePackages() {
+ throwIfParentInstance("getDefaultCrossProfilePackages");
+ if (mService != null) {
+ try {
+ return new ArraySet<>(mService.getDefaultCrossProfilePackages());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ return Collections.emptySet();
+ }
+
/**
* Returns whether the device is being used as a managed kiosk. These requirements are as
* follows:
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index 7fd0ae4a1a005..d2672eb3e2b23 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -457,6 +457,7 @@ interface IDevicePolicyManager {
List getCrossProfilePackages(in ComponentName admin);
List getAllCrossProfilePackages();
+ List getDefaultCrossProfilePackages();
boolean isManagedKiosk();
boolean isUnattendedManagedKiosk();
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 21128e33b6e55..21d1d3cf9c899 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1266,6 +1266,7 @@
+
diff --git a/core/res/res/values/vendor_cross_profile_apps.xml b/core/res/res/values/vendor_cross_profile_apps.xml
new file mode 100644
index 0000000000000..32839cd17e1de
--- /dev/null
+++ b/core/res/res/values/vendor_cross_profile_apps.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index ec3ef7807c3a0..65cabadaa3d8a 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -15077,9 +15077,16 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
return packages;
}
- private List getDefaultCrossProfilePackages() {
- return Arrays.asList(mContext.getResources()
+ @Override
+ public List getDefaultCrossProfilePackages() {
+ Set crossProfilePackages = new HashSet<>();
+
+ Collections.addAll(crossProfilePackages, mContext.getResources()
.getStringArray(R.array.cross_profile_apps));
+ Collections.addAll(crossProfilePackages, mContext.getResources()
+ .getStringArray(R.array.vendor_cross_profile_apps));
+
+ return new ArrayList<>(crossProfilePackages);
}
private List getProfileOwnerAdminsForCurrentProfileGroup() {
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index f7a9e5456156c..b193a34952f49 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -5817,6 +5817,7 @@ public class DevicePolicyManagerTest extends DpmTestBase {
mContext.packageName = admin1.getPackageName();
setCrossProfileAppsList();
+ setVendorCrossProfileAppsList();
assertTrue(dpm.getAllCrossProfilePackages().isEmpty());
}
@@ -5827,6 +5828,7 @@ public class DevicePolicyManagerTest extends DpmTestBase {
mContext.packageName = admin1.getPackageName();
setCrossProfileAppsList();
+ setVendorCrossProfileAppsList();
initializeDpms();
assertTrue(dpm.getAllCrossProfilePackages().isEmpty());
@@ -5839,9 +5841,11 @@ public class DevicePolicyManagerTest extends DpmTestBase {
dpm.setCrossProfilePackages(admin1, packages);
setCrossProfileAppsList("TEST_DEFAULT_PACKAGE", "TEST_COMMON_PACKAGE");
+ setVendorCrossProfileAppsList("TEST_VENDOR_DEFAULT_PACKAGE");
assertEquals(Sets.newSet(
- "TEST_PACKAGE", "TEST_DEFAULT_PACKAGE", "TEST_COMMON_PACKAGE"),
+ "TEST_PACKAGE", "TEST_DEFAULT_PACKAGE", "TEST_COMMON_PACKAGE",
+ "TEST_VENDOR_DEFAULT_PACKAGE"),
dpm.getAllCrossProfilePackages());
}
@@ -5854,13 +5858,31 @@ public class DevicePolicyManagerTest extends DpmTestBase {
dpm.setCrossProfilePackages(admin1, packages);
setCrossProfileAppsList("TEST_DEFAULT_PACKAGE", "TEST_COMMON_PACKAGE");
+ setVendorCrossProfileAppsList("TEST_VENDOR_DEFAULT_PACKAGE");
initializeDpms();
assertEquals(Sets.newSet(
- "TEST_PACKAGE", "TEST_DEFAULT_PACKAGE", "TEST_COMMON_PACKAGE"),
+ "TEST_PACKAGE", "TEST_DEFAULT_PACKAGE", "TEST_COMMON_PACKAGE",
+ "TEST_VENDOR_DEFAULT_PACKAGE"),
dpm.getAllCrossProfilePackages());
}
+ public void testGetDefaultCrossProfilePackages_noPackagesSet_returnsEmpty() {
+ setCrossProfileAppsList();
+ setVendorCrossProfileAppsList();
+
+ assertThat(dpm.getDefaultCrossProfilePackages()).isEmpty();
+ }
+
+ public void testGetDefaultCrossProfilePackages_packagesSet_returnsCombinedSet() {
+ setCrossProfileAppsList("TEST_DEFAULT_PACKAGE", "TEST_COMMON_PACKAGE");
+ setVendorCrossProfileAppsList("TEST_VENDOR_DEFAULT_PACKAGE");
+
+ assertThat(dpm.getDefaultCrossProfilePackages()).isEqualTo(Sets.newSet(
+ "TEST_DEFAULT_PACKAGE", "TEST_COMMON_PACKAGE", "TEST_VENDOR_DEFAULT_PACKAGE"
+ ));
+ }
+
public void testSetCommonCriteriaMode_asDeviceOwner() throws Exception {
setDeviceOwner();
@@ -5892,6 +5914,12 @@ public class DevicePolicyManagerTest extends DpmTestBase {
.thenReturn(packages);
}
+ private void setVendorCrossProfileAppsList(String... packages) {
+ when(mContext.getResources()
+ .getStringArray(eq(R.array.vendor_cross_profile_apps)))
+ .thenReturn(packages);
+ }
+
// admin1 is the outgoing DPC, adminAnotherPakcage is the incoming one.
private void assertDeviceOwnershipRevertedWithFakeTransferMetadata() throws Exception {
writeFakeTransferMetadataFile(UserHandle.USER_SYSTEM,