From 97c821d1ed6f5e672df068a8eb230a2768093cb9 Mon Sep 17 00:00:00 2001 From: Valentin Iftime Date: Mon, 3 Jul 2023 18:56:33 +0200 Subject: [PATCH] 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 --- .../notification/ConditionProviders.java | 5 +++ .../server/notification/ManagedServices.java | 11 +++++- .../NotificationManagerService.java | 10 ++++++ .../notification/ManagedServicesTest.java | 35 +++++++++++++++++++ 4 files changed, 60 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/notification/ConditionProviders.java b/services/core/java/com/android/server/notification/ConditionProviders.java index 030c96e3dba6c..bfc4f5313a631 100644 --- a/services/core/java/com/android/server/notification/ConditionProviders.java +++ b/services/core/java/com/android/server/notification/ConditionProviders.java @@ -250,6 +250,11 @@ public class ConditionProviders extends ManagedServices { return true; } + @Override + protected boolean allowRebindForParentUser() { + return true; + } + @Override protected String getRequiredPermission() { return null; diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java index 12fc263e1c8c2..5dd958b78f5a6 100644 --- a/services/core/java/com/android/server/notification/ManagedServices.java +++ b/services/core/java/com/android/server/notification/ManagedServices.java @@ -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; diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index d093393e8d865..f1c0e130b2be6 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -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); diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java index 541739d500244..2136811728822 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java @@ -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 componentNames, ManagedServices service, ArrayMap 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 {