Loading core/java/android/content/pm/PackageManagerInternal.java +33 −0 Original line number Diff line number Diff line Loading @@ -136,6 +136,32 @@ public abstract class PackageManagerInternal { public String[] getPackages(String authority, int userId); } /** * Provider for default browser */ public interface DefaultBrowserProvider { /** * Get the package name of the default browser. * * @param userId the user id * * @return the package name of the default browser, or {@code null} if none */ @Nullable String getDefaultBrowser(@UserIdInt int userId); /** * Set the package name of the default browser. * * @param packageName package name of the default browser, or {@code null} to remove * @param userId the user id * * @return whether the default browser was successfully set. */ boolean setDefaultBrowser(@Nullable String packageName, @UserIdInt int userId); } /** * Sets the location provider packages provider. * @param provider The packages provider. Loading Loading @@ -853,4 +879,11 @@ public abstract class PackageManagerInternal { */ @Nullable public abstract String removeLegacyDefaultBrowserPackageName(int userId); /** * Sets the default browser provider. * * @param provider the provider */ public abstract void setDefaultBrowserProvider(@NonNull DefaultBrowserProvider provider); } core/java/com/android/internal/util/CollectionUtils.java +7 −0 Original line number Diff line number Diff line Loading @@ -334,6 +334,13 @@ public class CollectionUtils { return isEmpty(cur) ? null : cur.get(0); } /** * @return the first element if not empty/null, null otherwise */ public static @Nullable <T> T firstOrNull(@Nullable Collection<T> cur) { return isEmpty(cur) ? null : cur.iterator().next(); } /** * @return list of single given element if it's not null, empty list otherwise */ Loading services/core/java/com/android/server/pm/PackageManagerService.java +32 −28 Original line number Diff line number Diff line Loading @@ -131,8 +131,6 @@ import android.app.ResourcesManager; import android.app.admin.IDevicePolicyManager; import android.app.admin.SecurityLog; import android.app.backup.IBackupManager; import android.app.role.RoleManager; import android.app.role.RoleManagerCallback; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ContentResolver; Loading Loading @@ -290,7 +288,6 @@ import com.android.internal.os.SomeArgs; import com.android.internal.os.Zygote; import com.android.internal.telephony.CarrierAppUtils; import com.android.internal.util.ArrayUtils; import com.android.internal.util.CollectionUtils; import com.android.internal.util.ConcurrentUtils; import com.android.internal.util.DumpUtils; import com.android.internal.util.FastXmlSerializer; Loading Loading @@ -372,10 +369,8 @@ import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; Loading Loading @@ -989,6 +984,9 @@ public class PackageManagerService extends IPackageManager.Stub @GuardedBy("mPackages") private CheckPermissionDelegate mCheckPermissionDelegate; @GuardedBy("mPackages") private PackageManagerInternal.DefaultBrowserProvider mDefaultBrowserProvider; private class IntentVerifierProxy implements IntentFilterVerifier<ActivityIntentInfo> { private Context mContext; private ComponentName mIntentFilterVerifierComponent; Loading Loading @@ -13581,31 +13579,25 @@ public class PackageManagerService extends IPackageManager.Stub mContext.enforceCallingOrSelfPermission( android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null); } if (userId == UserHandle.USER_ALL) { return false; } RoleManager roleManager = mContext.getSystemService(RoleManager.class); UserHandle user = UserHandle.of(userId); RoleManagerCallback.Future future = new RoleManagerCallback.Future(); if (packageName != null) { Binder.withCleanCallingIdentity(() -> roleManager.addRoleHolderAsUser( RoleManager.ROLE_BROWSER, packageName, user, AsyncTask.THREAD_POOL_EXECUTOR, future)); } else { Binder.withCleanCallingIdentity(() -> roleManager.clearRoleHoldersAsUser( RoleManager.ROLE_BROWSER, user, AsyncTask.THREAD_POOL_EXECUTOR, future)); PackageManagerInternal.DefaultBrowserProvider provider; synchronized (mPackages) { provider = mDefaultBrowserProvider; } try { future.get(5, TimeUnit.SECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e) { Slog.e(TAG, "Exception while setting default browser package name: " + packageName, e); if (provider == null) { Slog.e(TAG, "mDefaultBrowserProvider is null"); return false; } boolean successful = provider.setDefaultBrowser(packageName, userId); if (!successful) { return false; } synchronized (mPackages) { if (packageName != null) { mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultBrowser( packageName, userId); synchronized (mPackages) { mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultBrowser(packageName, userId); } } return true; Loading @@ -13620,10 +13612,15 @@ public class PackageManagerService extends IPackageManager.Stub if (getInstantAppPackageName(Binder.getCallingUid()) != null) { return null; } RoleManager roleManager = mContext.getSystemService(RoleManager.class); List<String> packageNames = Binder.withCleanCallingIdentity(() -> roleManager.getRoleHoldersAsUser(RoleManager.ROLE_BROWSER, UserHandle.of(userId))); return CollectionUtils.firstOrNull(packageNames); PackageManagerInternal.DefaultBrowserProvider provider; synchronized (mPackages) { provider = mDefaultBrowserProvider; } if (provider == null) { Slog.e(TAG, "mDefaultBrowserProvider is null"); return null; } return provider.getDefaultBrowser(userId); } /** Loading Loading @@ -23922,6 +23919,13 @@ public class PackageManagerService extends IPackageManager.Stub return mSettings.removeDefaultBrowserPackageNameLPw(userId); } } @Override public void setDefaultBrowserProvider(@NonNull DefaultBrowserProvider provider) { synchronized (mPackages) { mDefaultBrowserProvider = provider; } } } @GuardedBy("mPackages") services/core/java/com/android/server/role/RoleManagerServiceInternal.java→services/core/java/com/android/server/role/RoleManagerInternal.java +8 −7 Original line number Diff line number Diff line Loading @@ -17,22 +17,23 @@ package com.android.server.role; import android.annotation.NonNull; import android.os.UserHandle; import android.annotation.UserIdInt; import android.util.ArrayMap; import android.util.ArraySet; /** * Internal calls into {@link RoleManagerService} * Internal calls into {@link RoleManagerService}. */ public abstract class RoleManagerServiceInternal { public abstract class RoleManagerInternal { /** * Get all roles and packages hold them. * Get all roles and their holders. * * @param user The user to query to roles for * @param userId The user to query to roles for * * @return The roles and their holders */ @NonNull public abstract ArrayMap<String, ArraySet<String>> getRoleHoldersAsUser( @NonNull UserHandle user); public abstract ArrayMap<String, ArraySet<String>> getRolesAndHolders( @UserIdInt int userId); } services/core/java/com/android/server/role/RoleManagerService.java +65 −53 Original line number Diff line number Diff line Loading @@ -146,8 +146,11 @@ public class RoleManagerService extends SystemService implements RoleUserState.C mUserManagerInternal = LocalServices.getService(UserManagerInternal.class); mAppOpsManager = context.getSystemService(AppOpsManager.class); LocalServices.addService(RoleManagerServiceInternal.class, new RoleManagerServiceInternalImpl()); LocalServices.addService(RoleManagerInternal.class, new Internal()); PackageManagerInternal packageManagerInternal = LocalServices.getService( PackageManagerInternal.class); packageManagerInternal.setDefaultBrowserProvider(new DefaultBrowserProvider()); registerUserRemovedReceiver(); } Loading Loading @@ -360,10 +363,10 @@ public class RoleManagerService extends SystemService implements RoleUserState.C notifyRoleHoldersChangedForListeners(listeners, roleName, userId); } RemoteCallbackList<IOnRoleHoldersChangedListener> allUserListeners = getListeners( RemoteCallbackList<IOnRoleHoldersChangedListener> allUsersListeners = getListeners( UserHandle.USER_ALL); if (allUserListeners != null) { notifyRoleHoldersChangedForListeners(allUserListeners, roleName, userId); if (allUsersListeners != null) { notifyRoleHoldersChangedForListeners(allUsersListeners, roleName, userId); } } Loading @@ -386,19 +389,6 @@ public class RoleManagerService extends SystemService implements RoleUserState.C } } /** * Get all roles and packages hold them. * * @param user The user to query to roles for * * @return The roles and their holders */ @NonNull private ArrayMap<String, ArraySet<String>> getRoleHoldersAsUser(@NonNull UserHandle user) { RoleUserState userState = getOrCreateUserState(user.getIdentifier()); return userState.getRoleHolders(); } private class Stub extends IRoleManager.Stub { @Override Loading @@ -406,8 +396,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty"); int userId = UserHandle.getUserId(getCallingUid()); RoleUserState userState = getOrCreateUserState(userId); return userState.isRoleAvailable(roleName); return getOrCreateUserState(userId).isRoleAvailable(roleName); } @Override Loading @@ -418,7 +407,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C mAppOpsManager.checkPackage(callingUid, packageName); int userId = UserHandle.getUserId(callingUid); ArraySet<String> roleHolders = getRoleHoldersInternal(roleName, userId); ArraySet<String> roleHolders = getOrCreateUserState(userId).getRoleHolders(roleName); if (roleHolders == null) { return false; } Loading @@ -433,24 +422,17 @@ public class RoleManagerService extends SystemService implements RoleUserState.C Slog.e(LOG_TAG, "user " + userId + " does not exist"); return Collections.emptyList(); } userId = handleIncomingUser(userId, "getRoleHoldersAsUser", false); userId = handleIncomingUser(userId, false, "getRoleHoldersAsUser"); getContext().enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ROLE_HOLDERS, "getRoleHoldersAsUser"); ArraySet<String> roleHolders = getRoleHoldersInternal(roleName, userId); ArraySet<String> roleHolders = getOrCreateUserState(userId).getRoleHolders(roleName); if (roleHolders == null) { return Collections.emptyList(); } return new ArrayList<>(roleHolders); } @Nullable private ArraySet<String> getRoleHoldersInternal(@NonNull String roleName, @UserIdInt int userId) { RoleUserState userState = getOrCreateUserState(userId); return userState.getRoleHolders(roleName); } @Override public void addRoleHolderAsUser(@NonNull String roleName, @NonNull String packageName, @UserIdInt int userId, @NonNull IRoleManagerCallback callback) { Loading @@ -461,7 +443,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C Slog.e(LOG_TAG, "user " + userId + " does not exist"); return; } userId = handleIncomingUser(userId, "addRoleHolderAsUser", false); userId = handleIncomingUser(userId, false, "addRoleHolderAsUser"); getContext().enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ROLE_HOLDERS, "addRoleHolderAsUser"); Loading @@ -478,7 +460,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C Slog.e(LOG_TAG, "user " + userId + " does not exist"); return; } userId = handleIncomingUser(userId, "removeRoleHolderAsUser", false); userId = handleIncomingUser(userId, false, "removeRoleHolderAsUser"); getContext().enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ROLE_HOLDERS, "removeRoleHolderAsUser"); Loading @@ -495,7 +477,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C Slog.e(LOG_TAG, "user " + userId + " does not exist"); return; } userId = handleIncomingUser(userId, "clearRoleHoldersAsUser", false); userId = handleIncomingUser(userId, false, "clearRoleHoldersAsUser"); getContext().enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ROLE_HOLDERS, "clearRoleHoldersAsUser"); Loading @@ -510,8 +492,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C Slog.e(LOG_TAG, "user " + userId + " does not exist"); return; } userId = handleIncomingUser(userId, "addOnRoleHoldersChangedListenerAsUser", true); userId = handleIncomingUser(userId, true, "addOnRoleHoldersChangedListenerAsUser"); getContext().enforceCallingOrSelfPermission(Manifest.permission.OBSERVE_ROLE_HOLDERS, "addOnRoleHoldersChangedListenerAsUser"); Loading @@ -528,8 +509,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C Slog.e(LOG_TAG, "user " + userId + " does not exist"); return; } userId = handleIncomingUser(userId, "removeOnRoleHoldersChangedListenerAsUser", true); userId = handleIncomingUser(userId, true, "removeOnRoleHoldersChangedListenerAsUser"); getContext().enforceCallingOrSelfPermission(Manifest.permission.OBSERVE_ROLE_HOLDERS, "removeOnRoleHoldersChangedListenerAsUser"); Loading @@ -548,8 +528,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C "setRoleNamesFromController"); int userId = UserHandle.getCallingUserId(); RoleUserState userState = getOrCreateUserState(userId); userState.setRoleNames(roleNames); getOrCreateUserState(userId).setRoleNames(roleNames); } @Override Loading @@ -562,8 +541,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C "addRoleHolderFromController"); int userId = UserHandle.getCallingUserId(); RoleUserState userState = getOrCreateUserState(userId); return userState.addRoleHolder(roleName, packageName); return getOrCreateUserState(userId).addRoleHolder(roleName, packageName); } @Override Loading @@ -576,8 +554,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C "removeRoleHolderFromController"); int userId = UserHandle.getCallingUserId(); RoleUserState userState = getOrCreateUserState(userId); return userState.removeRoleHolder(roleName, packageName); return getOrCreateUserState(userId).removeRoleHolder(roleName, packageName); } @Override Loading @@ -588,13 +565,12 @@ public class RoleManagerService extends SystemService implements RoleUserState.C "getRolesHeldFromController"); int userId = UserHandle.getCallingUserId(); RoleUserState userState = getOrCreateUserState(userId); return userState.getHeldRoles(packageName); return getOrCreateUserState(userId).getHeldRoles(packageName); } @CheckResult private int handleIncomingUser(@UserIdInt int userId, @NonNull String name, boolean allowAll) { private int handleIncomingUser(@UserIdInt int userId, boolean allowAll, @NonNull String name) { return ActivityManager.handleIncomingUser(getCallingPid(), getCallingUid(), userId, allowAll, true, name, null); } Loading Loading @@ -694,15 +670,51 @@ public class RoleManagerService extends SystemService implements RoleUserState.C } } /** * Entry point for internal calls into role manager */ private final class RoleManagerServiceInternalImpl extends RoleManagerServiceInternal { private class Internal extends RoleManagerInternal { @NonNull @Override public ArrayMap<String, ArraySet<String>> getRoleHoldersAsUser(@NonNull UserHandle user) { return RoleManagerService.this.getRoleHoldersAsUser(user); public ArrayMap<String, ArraySet<String>> getRolesAndHolders(@UserIdInt int userId) { return getOrCreateUserState(userId).getRolesAndHolders(); } } private class DefaultBrowserProvider implements PackageManagerInternal.DefaultBrowserProvider { @Nullable @Override public String getDefaultBrowser(@UserIdInt int userId) { return CollectionUtils.firstOrNull(getOrCreateUserState(userId).getRoleHolders( RoleManager.ROLE_BROWSER)); } @Override public boolean setDefaultBrowser(@Nullable String packageName, @UserIdInt int userId) { CompletableFuture<Void> future = new CompletableFuture<>(); IRoleManagerCallback callback = new IRoleManagerCallback.Stub() { @Override public void onSuccess() { future.complete(null); } @Override public void onFailure() { future.completeExceptionally(new RuntimeException()); } }; if (packageName != null) { getOrCreateControllerService(userId).onAddRoleHolder(RoleManager.ROLE_BROWSER, packageName, callback); } else { getOrCreateControllerService(userId).onClearRoleHolders(RoleManager.ROLE_BROWSER, callback); } try { future.get(5, TimeUnit.SECONDS); return true; } catch (InterruptedException | ExecutionException | TimeoutException e) { Slog.e(LOG_TAG, "Exception while setting default browser: " + packageName, e); return false; } } } } Loading
core/java/android/content/pm/PackageManagerInternal.java +33 −0 Original line number Diff line number Diff line Loading @@ -136,6 +136,32 @@ public abstract class PackageManagerInternal { public String[] getPackages(String authority, int userId); } /** * Provider for default browser */ public interface DefaultBrowserProvider { /** * Get the package name of the default browser. * * @param userId the user id * * @return the package name of the default browser, or {@code null} if none */ @Nullable String getDefaultBrowser(@UserIdInt int userId); /** * Set the package name of the default browser. * * @param packageName package name of the default browser, or {@code null} to remove * @param userId the user id * * @return whether the default browser was successfully set. */ boolean setDefaultBrowser(@Nullable String packageName, @UserIdInt int userId); } /** * Sets the location provider packages provider. * @param provider The packages provider. Loading Loading @@ -853,4 +879,11 @@ public abstract class PackageManagerInternal { */ @Nullable public abstract String removeLegacyDefaultBrowserPackageName(int userId); /** * Sets the default browser provider. * * @param provider the provider */ public abstract void setDefaultBrowserProvider(@NonNull DefaultBrowserProvider provider); }
core/java/com/android/internal/util/CollectionUtils.java +7 −0 Original line number Diff line number Diff line Loading @@ -334,6 +334,13 @@ public class CollectionUtils { return isEmpty(cur) ? null : cur.get(0); } /** * @return the first element if not empty/null, null otherwise */ public static @Nullable <T> T firstOrNull(@Nullable Collection<T> cur) { return isEmpty(cur) ? null : cur.iterator().next(); } /** * @return list of single given element if it's not null, empty list otherwise */ Loading
services/core/java/com/android/server/pm/PackageManagerService.java +32 −28 Original line number Diff line number Diff line Loading @@ -131,8 +131,6 @@ import android.app.ResourcesManager; import android.app.admin.IDevicePolicyManager; import android.app.admin.SecurityLog; import android.app.backup.IBackupManager; import android.app.role.RoleManager; import android.app.role.RoleManagerCallback; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ContentResolver; Loading Loading @@ -290,7 +288,6 @@ import com.android.internal.os.SomeArgs; import com.android.internal.os.Zygote; import com.android.internal.telephony.CarrierAppUtils; import com.android.internal.util.ArrayUtils; import com.android.internal.util.CollectionUtils; import com.android.internal.util.ConcurrentUtils; import com.android.internal.util.DumpUtils; import com.android.internal.util.FastXmlSerializer; Loading Loading @@ -372,10 +369,8 @@ import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; Loading Loading @@ -989,6 +984,9 @@ public class PackageManagerService extends IPackageManager.Stub @GuardedBy("mPackages") private CheckPermissionDelegate mCheckPermissionDelegate; @GuardedBy("mPackages") private PackageManagerInternal.DefaultBrowserProvider mDefaultBrowserProvider; private class IntentVerifierProxy implements IntentFilterVerifier<ActivityIntentInfo> { private Context mContext; private ComponentName mIntentFilterVerifierComponent; Loading Loading @@ -13581,31 +13579,25 @@ public class PackageManagerService extends IPackageManager.Stub mContext.enforceCallingOrSelfPermission( android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null); } if (userId == UserHandle.USER_ALL) { return false; } RoleManager roleManager = mContext.getSystemService(RoleManager.class); UserHandle user = UserHandle.of(userId); RoleManagerCallback.Future future = new RoleManagerCallback.Future(); if (packageName != null) { Binder.withCleanCallingIdentity(() -> roleManager.addRoleHolderAsUser( RoleManager.ROLE_BROWSER, packageName, user, AsyncTask.THREAD_POOL_EXECUTOR, future)); } else { Binder.withCleanCallingIdentity(() -> roleManager.clearRoleHoldersAsUser( RoleManager.ROLE_BROWSER, user, AsyncTask.THREAD_POOL_EXECUTOR, future)); PackageManagerInternal.DefaultBrowserProvider provider; synchronized (mPackages) { provider = mDefaultBrowserProvider; } try { future.get(5, TimeUnit.SECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e) { Slog.e(TAG, "Exception while setting default browser package name: " + packageName, e); if (provider == null) { Slog.e(TAG, "mDefaultBrowserProvider is null"); return false; } boolean successful = provider.setDefaultBrowser(packageName, userId); if (!successful) { return false; } synchronized (mPackages) { if (packageName != null) { mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultBrowser( packageName, userId); synchronized (mPackages) { mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultBrowser(packageName, userId); } } return true; Loading @@ -13620,10 +13612,15 @@ public class PackageManagerService extends IPackageManager.Stub if (getInstantAppPackageName(Binder.getCallingUid()) != null) { return null; } RoleManager roleManager = mContext.getSystemService(RoleManager.class); List<String> packageNames = Binder.withCleanCallingIdentity(() -> roleManager.getRoleHoldersAsUser(RoleManager.ROLE_BROWSER, UserHandle.of(userId))); return CollectionUtils.firstOrNull(packageNames); PackageManagerInternal.DefaultBrowserProvider provider; synchronized (mPackages) { provider = mDefaultBrowserProvider; } if (provider == null) { Slog.e(TAG, "mDefaultBrowserProvider is null"); return null; } return provider.getDefaultBrowser(userId); } /** Loading Loading @@ -23922,6 +23919,13 @@ public class PackageManagerService extends IPackageManager.Stub return mSettings.removeDefaultBrowserPackageNameLPw(userId); } } @Override public void setDefaultBrowserProvider(@NonNull DefaultBrowserProvider provider) { synchronized (mPackages) { mDefaultBrowserProvider = provider; } } } @GuardedBy("mPackages")
services/core/java/com/android/server/role/RoleManagerServiceInternal.java→services/core/java/com/android/server/role/RoleManagerInternal.java +8 −7 Original line number Diff line number Diff line Loading @@ -17,22 +17,23 @@ package com.android.server.role; import android.annotation.NonNull; import android.os.UserHandle; import android.annotation.UserIdInt; import android.util.ArrayMap; import android.util.ArraySet; /** * Internal calls into {@link RoleManagerService} * Internal calls into {@link RoleManagerService}. */ public abstract class RoleManagerServiceInternal { public abstract class RoleManagerInternal { /** * Get all roles and packages hold them. * Get all roles and their holders. * * @param user The user to query to roles for * @param userId The user to query to roles for * * @return The roles and their holders */ @NonNull public abstract ArrayMap<String, ArraySet<String>> getRoleHoldersAsUser( @NonNull UserHandle user); public abstract ArrayMap<String, ArraySet<String>> getRolesAndHolders( @UserIdInt int userId); }
services/core/java/com/android/server/role/RoleManagerService.java +65 −53 Original line number Diff line number Diff line Loading @@ -146,8 +146,11 @@ public class RoleManagerService extends SystemService implements RoleUserState.C mUserManagerInternal = LocalServices.getService(UserManagerInternal.class); mAppOpsManager = context.getSystemService(AppOpsManager.class); LocalServices.addService(RoleManagerServiceInternal.class, new RoleManagerServiceInternalImpl()); LocalServices.addService(RoleManagerInternal.class, new Internal()); PackageManagerInternal packageManagerInternal = LocalServices.getService( PackageManagerInternal.class); packageManagerInternal.setDefaultBrowserProvider(new DefaultBrowserProvider()); registerUserRemovedReceiver(); } Loading Loading @@ -360,10 +363,10 @@ public class RoleManagerService extends SystemService implements RoleUserState.C notifyRoleHoldersChangedForListeners(listeners, roleName, userId); } RemoteCallbackList<IOnRoleHoldersChangedListener> allUserListeners = getListeners( RemoteCallbackList<IOnRoleHoldersChangedListener> allUsersListeners = getListeners( UserHandle.USER_ALL); if (allUserListeners != null) { notifyRoleHoldersChangedForListeners(allUserListeners, roleName, userId); if (allUsersListeners != null) { notifyRoleHoldersChangedForListeners(allUsersListeners, roleName, userId); } } Loading @@ -386,19 +389,6 @@ public class RoleManagerService extends SystemService implements RoleUserState.C } } /** * Get all roles and packages hold them. * * @param user The user to query to roles for * * @return The roles and their holders */ @NonNull private ArrayMap<String, ArraySet<String>> getRoleHoldersAsUser(@NonNull UserHandle user) { RoleUserState userState = getOrCreateUserState(user.getIdentifier()); return userState.getRoleHolders(); } private class Stub extends IRoleManager.Stub { @Override Loading @@ -406,8 +396,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty"); int userId = UserHandle.getUserId(getCallingUid()); RoleUserState userState = getOrCreateUserState(userId); return userState.isRoleAvailable(roleName); return getOrCreateUserState(userId).isRoleAvailable(roleName); } @Override Loading @@ -418,7 +407,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C mAppOpsManager.checkPackage(callingUid, packageName); int userId = UserHandle.getUserId(callingUid); ArraySet<String> roleHolders = getRoleHoldersInternal(roleName, userId); ArraySet<String> roleHolders = getOrCreateUserState(userId).getRoleHolders(roleName); if (roleHolders == null) { return false; } Loading @@ -433,24 +422,17 @@ public class RoleManagerService extends SystemService implements RoleUserState.C Slog.e(LOG_TAG, "user " + userId + " does not exist"); return Collections.emptyList(); } userId = handleIncomingUser(userId, "getRoleHoldersAsUser", false); userId = handleIncomingUser(userId, false, "getRoleHoldersAsUser"); getContext().enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ROLE_HOLDERS, "getRoleHoldersAsUser"); ArraySet<String> roleHolders = getRoleHoldersInternal(roleName, userId); ArraySet<String> roleHolders = getOrCreateUserState(userId).getRoleHolders(roleName); if (roleHolders == null) { return Collections.emptyList(); } return new ArrayList<>(roleHolders); } @Nullable private ArraySet<String> getRoleHoldersInternal(@NonNull String roleName, @UserIdInt int userId) { RoleUserState userState = getOrCreateUserState(userId); return userState.getRoleHolders(roleName); } @Override public void addRoleHolderAsUser(@NonNull String roleName, @NonNull String packageName, @UserIdInt int userId, @NonNull IRoleManagerCallback callback) { Loading @@ -461,7 +443,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C Slog.e(LOG_TAG, "user " + userId + " does not exist"); return; } userId = handleIncomingUser(userId, "addRoleHolderAsUser", false); userId = handleIncomingUser(userId, false, "addRoleHolderAsUser"); getContext().enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ROLE_HOLDERS, "addRoleHolderAsUser"); Loading @@ -478,7 +460,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C Slog.e(LOG_TAG, "user " + userId + " does not exist"); return; } userId = handleIncomingUser(userId, "removeRoleHolderAsUser", false); userId = handleIncomingUser(userId, false, "removeRoleHolderAsUser"); getContext().enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ROLE_HOLDERS, "removeRoleHolderAsUser"); Loading @@ -495,7 +477,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C Slog.e(LOG_TAG, "user " + userId + " does not exist"); return; } userId = handleIncomingUser(userId, "clearRoleHoldersAsUser", false); userId = handleIncomingUser(userId, false, "clearRoleHoldersAsUser"); getContext().enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ROLE_HOLDERS, "clearRoleHoldersAsUser"); Loading @@ -510,8 +492,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C Slog.e(LOG_TAG, "user " + userId + " does not exist"); return; } userId = handleIncomingUser(userId, "addOnRoleHoldersChangedListenerAsUser", true); userId = handleIncomingUser(userId, true, "addOnRoleHoldersChangedListenerAsUser"); getContext().enforceCallingOrSelfPermission(Manifest.permission.OBSERVE_ROLE_HOLDERS, "addOnRoleHoldersChangedListenerAsUser"); Loading @@ -528,8 +509,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C Slog.e(LOG_TAG, "user " + userId + " does not exist"); return; } userId = handleIncomingUser(userId, "removeOnRoleHoldersChangedListenerAsUser", true); userId = handleIncomingUser(userId, true, "removeOnRoleHoldersChangedListenerAsUser"); getContext().enforceCallingOrSelfPermission(Manifest.permission.OBSERVE_ROLE_HOLDERS, "removeOnRoleHoldersChangedListenerAsUser"); Loading @@ -548,8 +528,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C "setRoleNamesFromController"); int userId = UserHandle.getCallingUserId(); RoleUserState userState = getOrCreateUserState(userId); userState.setRoleNames(roleNames); getOrCreateUserState(userId).setRoleNames(roleNames); } @Override Loading @@ -562,8 +541,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C "addRoleHolderFromController"); int userId = UserHandle.getCallingUserId(); RoleUserState userState = getOrCreateUserState(userId); return userState.addRoleHolder(roleName, packageName); return getOrCreateUserState(userId).addRoleHolder(roleName, packageName); } @Override Loading @@ -576,8 +554,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C "removeRoleHolderFromController"); int userId = UserHandle.getCallingUserId(); RoleUserState userState = getOrCreateUserState(userId); return userState.removeRoleHolder(roleName, packageName); return getOrCreateUserState(userId).removeRoleHolder(roleName, packageName); } @Override Loading @@ -588,13 +565,12 @@ public class RoleManagerService extends SystemService implements RoleUserState.C "getRolesHeldFromController"); int userId = UserHandle.getCallingUserId(); RoleUserState userState = getOrCreateUserState(userId); return userState.getHeldRoles(packageName); return getOrCreateUserState(userId).getHeldRoles(packageName); } @CheckResult private int handleIncomingUser(@UserIdInt int userId, @NonNull String name, boolean allowAll) { private int handleIncomingUser(@UserIdInt int userId, boolean allowAll, @NonNull String name) { return ActivityManager.handleIncomingUser(getCallingPid(), getCallingUid(), userId, allowAll, true, name, null); } Loading Loading @@ -694,15 +670,51 @@ public class RoleManagerService extends SystemService implements RoleUserState.C } } /** * Entry point for internal calls into role manager */ private final class RoleManagerServiceInternalImpl extends RoleManagerServiceInternal { private class Internal extends RoleManagerInternal { @NonNull @Override public ArrayMap<String, ArraySet<String>> getRoleHoldersAsUser(@NonNull UserHandle user) { return RoleManagerService.this.getRoleHoldersAsUser(user); public ArrayMap<String, ArraySet<String>> getRolesAndHolders(@UserIdInt int userId) { return getOrCreateUserState(userId).getRolesAndHolders(); } } private class DefaultBrowserProvider implements PackageManagerInternal.DefaultBrowserProvider { @Nullable @Override public String getDefaultBrowser(@UserIdInt int userId) { return CollectionUtils.firstOrNull(getOrCreateUserState(userId).getRoleHolders( RoleManager.ROLE_BROWSER)); } @Override public boolean setDefaultBrowser(@Nullable String packageName, @UserIdInt int userId) { CompletableFuture<Void> future = new CompletableFuture<>(); IRoleManagerCallback callback = new IRoleManagerCallback.Stub() { @Override public void onSuccess() { future.complete(null); } @Override public void onFailure() { future.completeExceptionally(new RuntimeException()); } }; if (packageName != null) { getOrCreateControllerService(userId).onAddRoleHolder(RoleManager.ROLE_BROWSER, packageName, callback); } else { getOrCreateControllerService(userId).onClearRoleHolders(RoleManager.ROLE_BROWSER, callback); } try { future.get(5, TimeUnit.SECONDS); return true; } catch (InterruptedException | ExecutionException | TimeoutException e) { Slog.e(LOG_TAG, "Exception while setting default browser: " + packageName, e); return false; } } } }