Add all profiles if user is profile for rebindServices

Ad the parent user and other profiles to the list of userIds when calling
   rebindServices with a profile userId.

 Otherwise mEnabledServicesForCurrentProfiles and mEnabledServicesPackageNames will
  be cleared of enabled components for the parent user and the other profiles.

Test: atest ManagedServicesTest
Bug: 239846857
Change-Id: I6f03a9267a70c967302b6a2ab8c561bd9223e5d0
This commit is contained in:
Valentin Iftime
2023-07-03 18:56:33 +02:00
parent 19d00b9447
commit 97c821d1ed
4 changed files with 60 additions and 1 deletions

View File

@@ -250,6 +250,11 @@ public class ConditionProviders extends ManagedServices {
return true;
}
@Override
protected boolean allowRebindForParentUser() {
return true;
}
@Override
protected String getRequiredPermission() {
return null;

View File

@@ -1371,7 +1371,9 @@ abstract public class ManagedServices {
protected void rebindServices(boolean forceRebind, int userToRebind) {
if (DEBUG) Slog.d(TAG, "rebindServices " + forceRebind + " " + userToRebind);
IntArray userIds = mUserProfiles.getCurrentProfileIds();
if (userToRebind != USER_ALL) {
boolean rebindAllCurrentUsers = mUserProfiles.isProfileUser(userToRebind)
&& allowRebindForParentUser();
if (userToRebind != USER_ALL && !rebindAllCurrentUsers) {
userIds = new IntArray(1);
userIds.add(userToRebind);
}
@@ -1758,6 +1760,13 @@ abstract public class ManagedServices {
return true;
}
/**
* Returns true if services in the parent user should be rebound
* when rebindServices is called with a profile userId.
* Must be false for NotificationAssistants.
*/
protected abstract boolean allowRebindForParentUser();
public class ManagedServiceInfo implements IBinder.DeathRecipient {
public IInterface service;
public ComponentName component;

View File

@@ -10503,6 +10503,11 @@ public class NotificationManagerService extends SystemService {
rebindServices(true, user);
}
@Override
protected boolean allowRebindForParentUser() {
return false;
}
@Override
protected String getRequiredPermission() {
// only signature/privileged apps can be bound.
@@ -11047,6 +11052,11 @@ public class NotificationManagerService extends SystemService {
}
}
@Override
protected boolean allowRebindForParentUser() {
return true;
}
@Override
public void onPackagesChanged(boolean removingPackage, String[] pkgList, int[] uidList) {
super.onPackagesChanged(removingPackage, pkgList, uidList);

View File

@@ -1933,6 +1933,36 @@ public class ManagedServicesTest extends UiServiceTestCase {
}, 20, 30);
}
@Test
public void isComponentEnabledForCurrentProfiles_profileUserId() {
final int profileUserId = 10;
when(mUserProfiles.isProfileUser(profileUserId)).thenReturn(true);
// Only approve for parent user (0)
mService.addApprovedList("pkg1/cmp1:pkg2/cmp2:pkg3/cmp3", 0, true);
// Test that the component is enabled after calling rebindServices with profile userId (10)
mService.rebindServices(false, profileUserId);
assertThat(mService.isComponentEnabledForCurrentProfiles(
new ComponentName("pkg1", "cmp1"))).isTrue();
}
@Test
public void isComponentEnabledForCurrentProfiles_profileUserId_NAS() {
final int profileUserId = 10;
when(mUserProfiles.isProfileUser(profileUserId)).thenReturn(true);
// Do not rebind for parent users (NAS use-case)
ManagedServices service = spy(mService);
when(service.allowRebindForParentUser()).thenReturn(false);
// Only approve for parent user (0)
service.addApprovedList("pkg1/cmp1:pkg2/cmp2:pkg3/cmp3", 0, true);
// Test that the component is disabled after calling rebindServices with profile userId (10)
service.rebindServices(false, profileUserId);
assertThat(service.isComponentEnabledForCurrentProfiles(
new ComponentName("pkg1", "cmp1"))).isFalse();
}
private void mockServiceInfoWithMetaData(List<ComponentName> componentNames,
ManagedServices service, ArrayMap<ComponentName, Bundle> metaDatas)
throws RemoteException {
@@ -2276,6 +2306,11 @@ public class ManagedServicesTest extends UiServiceTestCase {
protected String getRequiredPermission() {
return null;
}
@Override
protected boolean allowRebindForParentUser() {
return true;
}
}
class TestManagedServicesSettings extends TestManagedServices {