Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bf7b6d33 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add pending restoration for default browser." into main

parents f775e70f a9ad2c2a
Loading
Loading
Loading
Loading
+5 −27
Original line number Diff line number Diff line
@@ -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;

@@ -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();
@@ -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;
    }

    /**
+15 −3
Original line number Diff line number Diff line
@@ -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);
@@ -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);
            }
        }

@@ -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() {
+11 −1
Original line number Diff line number Diff line
@@ -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) {
+18 −8
Original line number Diff line number Diff line
@@ -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.
@@ -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);
@@ -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<>();
@@ -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) {
@@ -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);
        }
    }

@@ -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);
    }