Loading services/core/java/com/android/server/pm/DefaultAppProvider.java +5 −27 Original line number Diff line number Diff line Loading @@ -24,14 +24,10 @@ import android.os.Binder; import android.os.UserHandle; import android.util.Slog; import com.android.internal.infra.AndroidFuture; import com.android.internal.util.CollectionUtils; import com.android.server.FgThread; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.function.Consumer; import java.util.function.Supplier; Loading Loading @@ -70,27 +66,19 @@ public class DefaultAppProvider { * Set the package name of the default browser. * * @param packageName package name of the default browser, or {@code null} to unset * @param async whether the operation should be asynchronous * @param userId the user ID * @return whether the default browser was successfully set. */ public boolean setDefaultBrowser(@Nullable String packageName, boolean async, @UserIdInt int userId) { if (userId == UserHandle.USER_ALL) { return false; } public void setDefaultBrowser(@Nullable String packageName, @UserIdInt int userId) { final RoleManager roleManager = mRoleManagerSupplier.get(); if (roleManager == null) { return false; return; } final UserHandle user = UserHandle.of(userId); final Executor executor = FgThread.getExecutor(); final AndroidFuture<Void> future = new AndroidFuture<>(); final Consumer<Boolean> callback = successful -> { if (successful) { future.complete(null); } else { future.completeExceptionally(new RuntimeException()); if (!successful) { Slog.e(PackageManagerService.TAG, "Failed to set default browser to " + packageName); } }; final long identity = Binder.clearCallingIdentity(); Loading @@ -102,19 +90,9 @@ public class DefaultAppProvider { roleManager.clearRoleHoldersAsUser(RoleManager.ROLE_BROWSER, 0, user, executor, callback); } if (!async) { try { future.get(5, TimeUnit.SECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e) { Slog.e(PackageManagerService.TAG, "Exception while setting default browser: " + packageName, e); return false; } } } finally { Binder.restoreCallingIdentity(identity); } return true; } /** Loading services/core/java/com/android/server/pm/PackageManagerService.java +15 −3 Original line number Diff line number Diff line Loading @@ -3425,6 +3425,18 @@ public class PackageManagerService implements PackageSender, TestUtilityService // within these users. mPermissionManager.restoreDelayedRuntimePermissions(packageName, userId); // Restore default browser setting if it is now installed. String defaultBrowser; synchronized (mLock) { defaultBrowser = mSettings.getPendingDefaultBrowserLPr(userId); } if (Objects.equals(packageName, defaultBrowser)) { mDefaultAppProvider.setDefaultBrowser(packageName, userId); synchronized (mLock) { mSettings.removePendingDefaultBrowserLPw(userId); } } // Persistent preferred activity might have came into effect due to this // install. mPreferredActivityHelper.updateDefaultHomeNotLocked(snapshotComputer(), userId); Loading Loading @@ -6647,7 +6659,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public String removeLegacyDefaultBrowserPackageName(int userId) { synchronized (mLock) { return mSettings.removeDefaultBrowserPackageNameLPw(userId); return mSettings.removePendingDefaultBrowserLPw(userId); } } Loading Loading @@ -7523,8 +7535,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mDefaultAppProvider.getDefaultBrowser(userId); } void setDefaultBrowser(@Nullable String packageName, boolean async, @UserIdInt int userId) { mDefaultAppProvider.setDefaultBrowser(packageName, async, userId); void setDefaultBrowser(@Nullable String packageName, @UserIdInt int userId) { mDefaultAppProvider.setDefaultBrowser(packageName, userId); } PackageUsage getPackageUsage() { Loading services/core/java/com/android/server/pm/PreferredActivityHelper.java +11 −1 Original line number Diff line number Diff line Loading @@ -585,7 +585,17 @@ final class PreferredActivityHelper { (parser1, userId1) -> { final String defaultBrowser = Settings.readDefaultApps(parser1); if (defaultBrowser != null) { mPm.setDefaultBrowser(defaultBrowser, false, userId1); final PackageStateInternal packageState = mPm.snapshotComputer() .getPackageStateInternal(defaultBrowser); if (packageState != null && packageState.getUserStateOrDefault(userId1).isInstalled()) { mPm.setDefaultBrowser(defaultBrowser, userId1); } else { synchronized (mPm.mLock) { mPm.mSettings.setPendingDefaultBrowserLPw(defaultBrowser, userId1); } } } }); } catch (Exception e) { Loading services/core/java/com/android/server/pm/Settings.java +18 −8 Original line number Diff line number Diff line Loading @@ -518,9 +518,11 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile private final WatchedArrayMap<String, String> mRenamedPackages = new WatchedArrayMap<String, String>(); // For every user, it is used to find the package name of the default Browser App. // For every user, it is used to find the package name of the default browser app pending to be // applied, either on first boot after upgrade, or after backup & restore but before app is // installed. @Watched final WatchedSparseArray<String> mDefaultBrowserApp = new WatchedSparseArray<String>(); final WatchedSparseArray<String> mPendingDefaultBrowser = new WatchedSparseArray<>(); // TODO(b/161161364): This seems unused, and is probably not relevant in the new API, but should // verify. Loading Loading @@ -593,7 +595,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile mAppIds.registerObserver(mObserver); mRenamedPackages.registerObserver(mObserver); mNextAppLinkGeneration.registerObserver(mObserver); mDefaultBrowserApp.registerObserver(mObserver); mPendingDefaultBrowser.registerObserver(mObserver); mPendingPackages.registerObserver(mObserver); mPastSignatures.registerObserver(mObserver); mKeySetRefs.registerObserver(mObserver); Loading Loading @@ -788,7 +790,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile mRenamedPackages.snapshot(r.mRenamedPackages); mNextAppLinkGeneration.snapshot(r.mNextAppLinkGeneration); mDefaultBrowserApp.snapshot(r.mDefaultBrowserApp); mPendingDefaultBrowser.snapshot(r.mPendingDefaultBrowser); // mReadMessages mPendingPackages = r.mPendingPackagesSnapshot.snapshot(); mPendingPackagesSnapshot = new SnapshotCache.Sealed<>(); Loading Loading @@ -1509,8 +1511,16 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile return cpir; } String removeDefaultBrowserPackageNameLPw(int userId) { return (userId == UserHandle.USER_ALL) ? null : mDefaultBrowserApp.removeReturnOld(userId); String getPendingDefaultBrowserLPr(int userId) { return mPendingDefaultBrowser.get(userId); } void setPendingDefaultBrowserLPw(String defaultBrowser, int userId) { mPendingDefaultBrowser.put(userId, defaultBrowser); } String removePendingDefaultBrowserLPw(int userId) { return mPendingDefaultBrowser.removeReturnOld(userId); } private File getUserSystemDirectory(int userId) { Loading Loading @@ -1695,7 +1705,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile throws XmlPullParserException, IOException { String defaultBrowser = readDefaultApps(parser); if (defaultBrowser != null) { mDefaultBrowserApp.put(userId, defaultBrowser); mPendingDefaultBrowser.put(userId, defaultBrowser); } } Loading Loading @@ -2105,7 +2115,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile void writeDefaultAppsLPr(XmlSerializer serializer, int userId) throws IllegalArgumentException, IllegalStateException, IOException { String defaultBrowser = mDefaultBrowserApp.get(userId); String defaultBrowser = mPendingDefaultBrowser.get(userId); writeDefaultApps(serializer, defaultBrowser); } Loading Loading
services/core/java/com/android/server/pm/DefaultAppProvider.java +5 −27 Original line number Diff line number Diff line Loading @@ -24,14 +24,10 @@ import android.os.Binder; import android.os.UserHandle; import android.util.Slog; import com.android.internal.infra.AndroidFuture; import com.android.internal.util.CollectionUtils; import com.android.server.FgThread; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.function.Consumer; import java.util.function.Supplier; Loading Loading @@ -70,27 +66,19 @@ public class DefaultAppProvider { * Set the package name of the default browser. * * @param packageName package name of the default browser, or {@code null} to unset * @param async whether the operation should be asynchronous * @param userId the user ID * @return whether the default browser was successfully set. */ public boolean setDefaultBrowser(@Nullable String packageName, boolean async, @UserIdInt int userId) { if (userId == UserHandle.USER_ALL) { return false; } public void setDefaultBrowser(@Nullable String packageName, @UserIdInt int userId) { final RoleManager roleManager = mRoleManagerSupplier.get(); if (roleManager == null) { return false; return; } final UserHandle user = UserHandle.of(userId); final Executor executor = FgThread.getExecutor(); final AndroidFuture<Void> future = new AndroidFuture<>(); final Consumer<Boolean> callback = successful -> { if (successful) { future.complete(null); } else { future.completeExceptionally(new RuntimeException()); if (!successful) { Slog.e(PackageManagerService.TAG, "Failed to set default browser to " + packageName); } }; final long identity = Binder.clearCallingIdentity(); Loading @@ -102,19 +90,9 @@ public class DefaultAppProvider { roleManager.clearRoleHoldersAsUser(RoleManager.ROLE_BROWSER, 0, user, executor, callback); } if (!async) { try { future.get(5, TimeUnit.SECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e) { Slog.e(PackageManagerService.TAG, "Exception while setting default browser: " + packageName, e); return false; } } } finally { Binder.restoreCallingIdentity(identity); } return true; } /** Loading
services/core/java/com/android/server/pm/PackageManagerService.java +15 −3 Original line number Diff line number Diff line Loading @@ -3425,6 +3425,18 @@ public class PackageManagerService implements PackageSender, TestUtilityService // within these users. mPermissionManager.restoreDelayedRuntimePermissions(packageName, userId); // Restore default browser setting if it is now installed. String defaultBrowser; synchronized (mLock) { defaultBrowser = mSettings.getPendingDefaultBrowserLPr(userId); } if (Objects.equals(packageName, defaultBrowser)) { mDefaultAppProvider.setDefaultBrowser(packageName, userId); synchronized (mLock) { mSettings.removePendingDefaultBrowserLPw(userId); } } // Persistent preferred activity might have came into effect due to this // install. mPreferredActivityHelper.updateDefaultHomeNotLocked(snapshotComputer(), userId); Loading Loading @@ -6647,7 +6659,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public String removeLegacyDefaultBrowserPackageName(int userId) { synchronized (mLock) { return mSettings.removeDefaultBrowserPackageNameLPw(userId); return mSettings.removePendingDefaultBrowserLPw(userId); } } Loading Loading @@ -7523,8 +7535,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mDefaultAppProvider.getDefaultBrowser(userId); } void setDefaultBrowser(@Nullable String packageName, boolean async, @UserIdInt int userId) { mDefaultAppProvider.setDefaultBrowser(packageName, async, userId); void setDefaultBrowser(@Nullable String packageName, @UserIdInt int userId) { mDefaultAppProvider.setDefaultBrowser(packageName, userId); } PackageUsage getPackageUsage() { Loading
services/core/java/com/android/server/pm/PreferredActivityHelper.java +11 −1 Original line number Diff line number Diff line Loading @@ -585,7 +585,17 @@ final class PreferredActivityHelper { (parser1, userId1) -> { final String defaultBrowser = Settings.readDefaultApps(parser1); if (defaultBrowser != null) { mPm.setDefaultBrowser(defaultBrowser, false, userId1); final PackageStateInternal packageState = mPm.snapshotComputer() .getPackageStateInternal(defaultBrowser); if (packageState != null && packageState.getUserStateOrDefault(userId1).isInstalled()) { mPm.setDefaultBrowser(defaultBrowser, userId1); } else { synchronized (mPm.mLock) { mPm.mSettings.setPendingDefaultBrowserLPw(defaultBrowser, userId1); } } } }); } catch (Exception e) { Loading
services/core/java/com/android/server/pm/Settings.java +18 −8 Original line number Diff line number Diff line Loading @@ -518,9 +518,11 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile private final WatchedArrayMap<String, String> mRenamedPackages = new WatchedArrayMap<String, String>(); // For every user, it is used to find the package name of the default Browser App. // For every user, it is used to find the package name of the default browser app pending to be // applied, either on first boot after upgrade, or after backup & restore but before app is // installed. @Watched final WatchedSparseArray<String> mDefaultBrowserApp = new WatchedSparseArray<String>(); final WatchedSparseArray<String> mPendingDefaultBrowser = new WatchedSparseArray<>(); // TODO(b/161161364): This seems unused, and is probably not relevant in the new API, but should // verify. Loading Loading @@ -593,7 +595,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile mAppIds.registerObserver(mObserver); mRenamedPackages.registerObserver(mObserver); mNextAppLinkGeneration.registerObserver(mObserver); mDefaultBrowserApp.registerObserver(mObserver); mPendingDefaultBrowser.registerObserver(mObserver); mPendingPackages.registerObserver(mObserver); mPastSignatures.registerObserver(mObserver); mKeySetRefs.registerObserver(mObserver); Loading Loading @@ -788,7 +790,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile mRenamedPackages.snapshot(r.mRenamedPackages); mNextAppLinkGeneration.snapshot(r.mNextAppLinkGeneration); mDefaultBrowserApp.snapshot(r.mDefaultBrowserApp); mPendingDefaultBrowser.snapshot(r.mPendingDefaultBrowser); // mReadMessages mPendingPackages = r.mPendingPackagesSnapshot.snapshot(); mPendingPackagesSnapshot = new SnapshotCache.Sealed<>(); Loading Loading @@ -1509,8 +1511,16 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile return cpir; } String removeDefaultBrowserPackageNameLPw(int userId) { return (userId == UserHandle.USER_ALL) ? null : mDefaultBrowserApp.removeReturnOld(userId); String getPendingDefaultBrowserLPr(int userId) { return mPendingDefaultBrowser.get(userId); } void setPendingDefaultBrowserLPw(String defaultBrowser, int userId) { mPendingDefaultBrowser.put(userId, defaultBrowser); } String removePendingDefaultBrowserLPw(int userId) { return mPendingDefaultBrowser.removeReturnOld(userId); } private File getUserSystemDirectory(int userId) { Loading Loading @@ -1695,7 +1705,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile throws XmlPullParserException, IOException { String defaultBrowser = readDefaultApps(parser); if (defaultBrowser != null) { mDefaultBrowserApp.put(userId, defaultBrowser); mPendingDefaultBrowser.put(userId, defaultBrowser); } } Loading Loading @@ -2105,7 +2115,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile void writeDefaultAppsLPr(XmlSerializer serializer, int userId) throws IllegalArgumentException, IllegalStateException, IOException { String defaultBrowser = mDefaultBrowserApp.get(userId); String defaultBrowser = mPendingDefaultBrowser.get(userId); writeDefaultApps(serializer, defaultBrowser); } Loading