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

Commit 3fe6f8d2 authored by Richard Coles's avatar Richard Coles
Browse files

Refactor WebViewUpdateService context handling.

Previously, a number of the system interface methods took Context
parameters. However, the real update service implementation only stores
a context in order to pass it to these methods, and the mock
implementation of the system interface doesn't need a context at all. If
a context is needed in a system interface that currently doesn't have
one, this requires a change to the interface and tests.

Instead, just store the context in the implementation of the system
interface when it's created. This means we can remove the context
parameter throughout the rest of the code, simplifying the mock/test,
and future changes to the implementation can rely on having a context
available for all methods.

This is a pure refactor with no behaviour changes.

Bug: 310653407
Test: atest WebViewUpdateServiceTest
Flag: EXEMPT refactor
Change-Id: I53bf25ab2d5f9b2636ae279cd8ac72e473e97ee6
parent d659822b
Loading
Loading
Loading
Loading
+19 −27
Original line number Original line Diff line number Diff line
@@ -67,19 +67,13 @@ public class SystemImpl implements SystemInterface {
    private static final String TAG_SIGNATURE = "signature";
    private static final String TAG_SIGNATURE = "signature";
    private static final String TAG_FALLBACK = "isFallback";
    private static final String TAG_FALLBACK = "isFallback";
    private static final String PIN_GROUP = "webview";
    private static final String PIN_GROUP = "webview";
    private final WebViewProviderInfo[] mWebViewProviderPackages;


    // Initialization-on-demand holder idiom for getting the WebView provider packages once and
    private final Context mContext;
    // for all in a thread-safe manner.
    private final WebViewProviderInfo[] mWebViewProviderPackages;
    private static class LazyHolder {
        private static final SystemImpl INSTANCE = new SystemImpl();
    }


    public static SystemImpl getInstance() {
    SystemImpl(Context context) {
        return LazyHolder.INSTANCE;
        mContext = context;
    }


    private SystemImpl() {
        int numFallbackPackages = 0;
        int numFallbackPackages = 0;
        int numAvailableByDefaultPackages = 0;
        int numAvailableByDefaultPackages = 0;
        XmlResourceParser parser = null;
        XmlResourceParser parser = null;
@@ -184,14 +178,14 @@ public class SystemImpl implements SystemInterface {
    }
    }


    @Override
    @Override
    public String getUserChosenWebViewProvider(Context context) {
    public String getUserChosenWebViewProvider() {
        return Settings.Global.getString(context.getContentResolver(),
        return Settings.Global.getString(mContext.getContentResolver(),
                Settings.Global.WEBVIEW_PROVIDER);
                Settings.Global.WEBVIEW_PROVIDER);
    }
    }


    @Override
    @Override
    public void updateUserSetting(Context context, String newProviderName) {
    public void updateUserSetting(String newProviderName) {
        Settings.Global.putString(context.getContentResolver(),
        Settings.Global.putString(mContext.getContentResolver(),
                Settings.Global.WEBVIEW_PROVIDER,
                Settings.Global.WEBVIEW_PROVIDER,
                newProviderName == null ? "" : newProviderName);
                newProviderName == null ? "" : newProviderName);
    }
    }
@@ -207,8 +201,8 @@ public class SystemImpl implements SystemInterface {
    }
    }


    @Override
    @Override
    public void enablePackageForAllUsers(Context context, String packageName, boolean enable) {
    public void enablePackageForAllUsers(String packageName, boolean enable) {
        UserManager userManager = (UserManager)context.getSystemService(Context.USER_SERVICE);
        UserManager userManager = mContext.getSystemService(UserManager.class);
        for(UserInfo userInfo : userManager.getUsers()) {
        for(UserInfo userInfo : userManager.getUsers()) {
            enablePackageForUser(packageName, enable, userInfo.id);
            enablePackageForUser(packageName, enable, userInfo.id);
        }
        }
@@ -228,16 +222,15 @@ public class SystemImpl implements SystemInterface {
    }
    }


    @Override
    @Override
    public void installExistingPackageForAllUsers(Context context, String packageName) {
    public void installExistingPackageForAllUsers(String packageName) {
        UserManager userManager = context.getSystemService(UserManager.class);
        UserManager userManager = mContext.getSystemService(UserManager.class);
        for (UserInfo userInfo : userManager.getUsers()) {
        for (UserInfo userInfo : userManager.getUsers()) {
            installPackageForUser(packageName, userInfo.id);
            installPackageForUser(packageName, userInfo.id);
        }
        }
    }
    }


    private void installPackageForUser(String packageName, int userId) {
    private void installPackageForUser(String packageName, int userId) {
        final Context context = AppGlobals.getInitialApplication();
        final Context contextAsUser = mContext.createContextAsUser(UserHandle.of(userId), 0);
        final Context contextAsUser = context.createContextAsUser(UserHandle.of(userId), 0);
        final PackageInstaller installer = contextAsUser.getPackageManager().getPackageInstaller();
        final PackageInstaller installer = contextAsUser.getPackageManager().getPackageInstaller();
        installer.installExistingPackage(packageName, PackageManager.INSTALL_REASON_UNKNOWN, null);
        installer.installExistingPackage(packageName, PackageManager.INSTALL_REASON_UNKNOWN, null);
    }
    }
@@ -255,29 +248,28 @@ public class SystemImpl implements SystemInterface {
    }
    }


    @Override
    @Override
    public List<UserPackage> getPackageInfoForProviderAllUsers(Context context,
    public List<UserPackage> getPackageInfoForProviderAllUsers(WebViewProviderInfo configInfo) {
            WebViewProviderInfo configInfo) {
        return UserPackage.getPackageInfosAllUsers(mContext, configInfo.packageName, PACKAGE_FLAGS);
        return UserPackage.getPackageInfosAllUsers(context, configInfo.packageName, PACKAGE_FLAGS);
    }
    }


    @Override
    @Override
    public int getMultiProcessSetting(Context context) {
    public int getMultiProcessSetting() {
        if (updateServiceV2()) {
        if (updateServiceV2()) {
            throw new IllegalStateException(
            throw new IllegalStateException(
                    "getMultiProcessSetting shouldn't be called if update_service_v2 flag is set.");
                    "getMultiProcessSetting shouldn't be called if update_service_v2 flag is set.");
        }
        }
        return Settings.Global.getInt(
        return Settings.Global.getInt(
                context.getContentResolver(), Settings.Global.WEBVIEW_MULTIPROCESS, 0);
                mContext.getContentResolver(), Settings.Global.WEBVIEW_MULTIPROCESS, 0);
    }
    }


    @Override
    @Override
    public void setMultiProcessSetting(Context context, int value) {
    public void setMultiProcessSetting(int value) {
        if (updateServiceV2()) {
        if (updateServiceV2()) {
            throw new IllegalStateException(
            throw new IllegalStateException(
                    "setMultiProcessSetting shouldn't be called if update_service_v2 flag is set.");
                    "setMultiProcessSetting shouldn't be called if update_service_v2 flag is set.");
        }
        }
        Settings.Global.putInt(
        Settings.Global.putInt(
                context.getContentResolver(), Settings.Global.WEBVIEW_MULTIPROCESS, value);
                mContext.getContentResolver(), Settings.Global.WEBVIEW_MULTIPROCESS, value);
    }
    }


    @Override
    @Override
+17 −19
Original line number Original line Diff line number Diff line
@@ -16,7 +16,6 @@


package com.android.server.webkit;
package com.android.server.webkit;


import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManager.NameNotFoundException;
@@ -34,19 +33,19 @@ import java.util.List;
 * @hide
 * @hide
 */
 */
public interface SystemInterface {
public interface SystemInterface {
    public WebViewProviderInfo[] getWebViewPackages();
    WebViewProviderInfo[] getWebViewPackages();
    public int onWebViewProviderChanged(PackageInfo packageInfo);
    int onWebViewProviderChanged(PackageInfo packageInfo);
    public long getFactoryPackageVersion(String packageName) throws NameNotFoundException;
    long getFactoryPackageVersion(String packageName) throws NameNotFoundException;


    public String getUserChosenWebViewProvider(Context context);
    String getUserChosenWebViewProvider();
    public void updateUserSetting(Context context, String newProviderName);
    void updateUserSetting(String newProviderName);
    public void killPackageDependents(String packageName);
    void killPackageDependents(String packageName);


    public void enablePackageForAllUsers(Context context, String packageName, boolean enable);
    void enablePackageForAllUsers(String packageName, boolean enable);
    public void installExistingPackageForAllUsers(Context context, String packageName);
    void installExistingPackageForAllUsers(String packageName);


    public boolean systemIsDebuggable();
    boolean systemIsDebuggable();
    public PackageInfo getPackageInfoForProvider(WebViewProviderInfo configInfo)
    PackageInfo getPackageInfoForProvider(WebViewProviderInfo configInfo)
            throws NameNotFoundException;
            throws NameNotFoundException;
    /**
    /**
     * Get the PackageInfos of all users for the package represented by {@param configInfo}.
     * Get the PackageInfos of all users for the package represented by {@param configInfo}.
@@ -54,15 +53,14 @@ public interface SystemInterface {
     *         certain user. The returned array can contain null PackageInfos if the given package
     *         certain user. The returned array can contain null PackageInfos if the given package
     *         is uninstalled for some user.
     *         is uninstalled for some user.
     */
     */
    public List<UserPackage> getPackageInfoForProviderAllUsers(Context context,
    List<UserPackage> getPackageInfoForProviderAllUsers(WebViewProviderInfo configInfo);
            WebViewProviderInfo configInfo);


    public int getMultiProcessSetting(Context context);
    int getMultiProcessSetting();
    public void setMultiProcessSetting(Context context, int value);
    void setMultiProcessSetting(int value);
    public void notifyZygote(boolean enableMultiProcess);
    void notifyZygote(boolean enableMultiProcess);
    /** Start the zygote if it's not already running. */
    /** Start the zygote if it's not already running. */
    public void ensureZygoteStarted();
    void ensureZygoteStarted();
    public boolean isMultiProcessDefaultEnabled();
    boolean isMultiProcessDefaultEnabled();


    public void pinWebviewIfRequired(ApplicationInfo appInfo);
    void pinWebviewIfRequired(ApplicationInfo appInfo);
}
}
+2 −2
Original line number Original line Diff line number Diff line
@@ -73,9 +73,9 @@ public class WebViewUpdateService extends SystemService {
    public WebViewUpdateService(Context context) {
    public WebViewUpdateService(Context context) {
        super(context);
        super(context);
        if (updateServiceV2()) {
        if (updateServiceV2()) {
            mImpl = new WebViewUpdateServiceImpl2(context, SystemImpl.getInstance());
            mImpl = new WebViewUpdateServiceImpl2(new SystemImpl(context));
        } else {
        } else {
            mImpl = new WebViewUpdateServiceImpl(context, SystemImpl.getInstance());
            mImpl = new WebViewUpdateServiceImpl(new SystemImpl(context));
        }
        }
    }
    }


+12 −17
Original line number Original line Diff line number Diff line
@@ -16,7 +16,6 @@
package com.android.server.webkit;
package com.android.server.webkit;


import android.annotation.Nullable;
import android.annotation.Nullable;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
import android.content.pm.Signature;
@@ -92,7 +91,6 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
    private static final int MULTIPROCESS_SETTING_OFF_VALUE = Integer.MIN_VALUE;
    private static final int MULTIPROCESS_SETTING_OFF_VALUE = Integer.MIN_VALUE;


    private final SystemInterface mSystemInterface;
    private final SystemInterface mSystemInterface;
    private final Context mContext;


    private long mMinimumVersionCode = -1;
    private long mMinimumVersionCode = -1;


@@ -110,8 +108,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {


    private final Object mLock = new Object();
    private final Object mLock = new Object();


    WebViewUpdateServiceImpl(Context context, SystemInterface systemInterface) {
    WebViewUpdateServiceImpl(SystemInterface systemInterface) {
        mContext = context;
        mSystemInterface = systemInterface;
        mSystemInterface = systemInterface;
    }
    }


@@ -173,7 +170,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
        try {
        try {
            synchronized (mLock) {
            synchronized (mLock) {
                mCurrentWebViewPackage = findPreferredWebViewPackage();
                mCurrentWebViewPackage = findPreferredWebViewPackage();
                String userSetting = mSystemInterface.getUserChosenWebViewProvider(mContext);
                String userSetting = mSystemInterface.getUserChosenWebViewProvider();
                if (userSetting != null
                if (userSetting != null
                        && !userSetting.equals(mCurrentWebViewPackage.packageName)) {
                        && !userSetting.equals(mCurrentWebViewPackage.packageName)) {
                    // Don't persist the user-chosen setting across boots if the package being
                    // Don't persist the user-chosen setting across boots if the package being
@@ -181,8 +178,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
                    // be surprised by the device switching to using a certain webview package,
                    // be surprised by the device switching to using a certain webview package,
                    // that was uninstalled/disabled a long time ago, if it is installed/enabled
                    // that was uninstalled/disabled a long time ago, if it is installed/enabled
                    // again.
                    // again.
                    mSystemInterface.updateUserSetting(mContext,
                    mSystemInterface.updateUserSetting(mCurrentWebViewPackage.packageName);
                            mCurrentWebViewPackage.packageName);
                }
                }
                onWebViewProviderChanged(mCurrentWebViewPackage);
                onWebViewProviderChanged(mCurrentWebViewPackage);
            }
            }
@@ -203,8 +199,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
            WebViewProviderInfo fallbackProvider = getFallbackProvider(webviewProviders);
            WebViewProviderInfo fallbackProvider = getFallbackProvider(webviewProviders);
            if (fallbackProvider != null) {
            if (fallbackProvider != null) {
                Slog.w(TAG, "No valid provider, trying to enable " + fallbackProvider.packageName);
                Slog.w(TAG, "No valid provider, trying to enable " + fallbackProvider.packageName);
                mSystemInterface.enablePackageForAllUsers(mContext, fallbackProvider.packageName,
                mSystemInterface.enablePackageForAllUsers(fallbackProvider.packageName, true);
                                                          true);
            } else {
            } else {
                Slog.e(TAG, "No valid provider and no fallback available.");
                Slog.e(TAG, "No valid provider and no fallback available.");
            }
            }
@@ -316,7 +311,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
            oldPackage = mCurrentWebViewPackage;
            oldPackage = mCurrentWebViewPackage;


            if (newProviderName != null) {
            if (newProviderName != null) {
                mSystemInterface.updateUserSetting(mContext, newProviderName);
                mSystemInterface.updateUserSetting(newProviderName);
            }
            }


            try {
            try {
@@ -447,7 +442,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
    private PackageInfo findPreferredWebViewPackage() throws WebViewPackageMissingException {
    private PackageInfo findPreferredWebViewPackage() throws WebViewPackageMissingException {
        ProviderAndPackageInfo[] providers = getValidWebViewPackagesAndInfos();
        ProviderAndPackageInfo[] providers = getValidWebViewPackagesAndInfos();


        String userChosenProvider = mSystemInterface.getUserChosenWebViewProvider(mContext);
        String userChosenProvider = mSystemInterface.getUserChosenWebViewProvider();


        // If the user has chosen provider, use that (if it's installed and enabled for all
        // If the user has chosen provider, use that (if it's installed and enabled for all
        // users).
        // users).
@@ -455,7 +450,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
            if (providerAndPackage.provider.packageName.equals(userChosenProvider)) {
            if (providerAndPackage.provider.packageName.equals(userChosenProvider)) {
                // userPackages can contain null objects.
                // userPackages can contain null objects.
                List<UserPackage> userPackages =
                List<UserPackage> userPackages =
                        mSystemInterface.getPackageInfoForProviderAllUsers(mContext,
                        mSystemInterface.getPackageInfoForProviderAllUsers(
                                providerAndPackage.provider);
                                providerAndPackage.provider);
                if (isInstalledAndEnabledForAllUsers(userPackages)) {
                if (isInstalledAndEnabledForAllUsers(userPackages)) {
                    return providerAndPackage.packageInfo;
                    return providerAndPackage.packageInfo;
@@ -470,7 +465,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
            if (providerAndPackage.provider.availableByDefault) {
            if (providerAndPackage.provider.availableByDefault) {
                // userPackages can contain null objects.
                // userPackages can contain null objects.
                List<UserPackage> userPackages =
                List<UserPackage> userPackages =
                        mSystemInterface.getPackageInfoForProviderAllUsers(mContext,
                        mSystemInterface.getPackageInfoForProviderAllUsers(
                                providerAndPackage.provider);
                                providerAndPackage.provider);
                if (isInstalledAndEnabledForAllUsers(userPackages)) {
                if (isInstalledAndEnabledForAllUsers(userPackages)) {
                    return providerAndPackage.packageInfo;
                    return providerAndPackage.packageInfo;
@@ -658,7 +653,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {


    @Override
    @Override
    public boolean isMultiProcessEnabled() {
    public boolean isMultiProcessEnabled() {
        int settingValue = mSystemInterface.getMultiProcessSetting(mContext);
        int settingValue = mSystemInterface.getMultiProcessSetting();
        if (mSystemInterface.isMultiProcessDefaultEnabled()) {
        if (mSystemInterface.isMultiProcessDefaultEnabled()) {
            // Multiprocess should be enabled unless the user has turned it off manually.
            // Multiprocess should be enabled unless the user has turned it off manually.
            return settingValue > MULTIPROCESS_SETTING_OFF_VALUE;
            return settingValue > MULTIPROCESS_SETTING_OFF_VALUE;
@@ -671,7 +666,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
    @Override
    @Override
    public void enableMultiProcess(boolean enable) {
    public void enableMultiProcess(boolean enable) {
        PackageInfo current = getCurrentWebViewPackage();
        PackageInfo current = getCurrentWebViewPackage();
        mSystemInterface.setMultiProcessSetting(mContext,
        mSystemInterface.setMultiProcessSetting(
                enable ? MULTIPROCESS_SETTING_ON_VALUE : MULTIPROCESS_SETTING_OFF_VALUE);
                enable ? MULTIPROCESS_SETTING_ON_VALUE : MULTIPROCESS_SETTING_OFF_VALUE);
        mSystemInterface.notifyZygote(enable);
        mSystemInterface.notifyZygote(enable);
        if (current != null) {
        if (current != null) {
@@ -725,7 +720,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
        pw.println("  WebView packages:");
        pw.println("  WebView packages:");
        for (WebViewProviderInfo provider : allProviders) {
        for (WebViewProviderInfo provider : allProviders) {
            List<UserPackage> userPackages =
            List<UserPackage> userPackages =
                    mSystemInterface.getPackageInfoForProviderAllUsers(mContext, provider);
                    mSystemInterface.getPackageInfoForProviderAllUsers(provider);
            PackageInfo systemUserPackageInfo =
            PackageInfo systemUserPackageInfo =
                    userPackages.get(UserHandle.USER_SYSTEM).getPackageInfo();
                    userPackages.get(UserHandle.USER_SYSTEM).getPackageInfo();
            if (systemUserPackageInfo == null) {
            if (systemUserPackageInfo == null) {
@@ -741,7 +736,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
                    systemUserPackageInfo.applicationInfo.targetSdkVersion);
                    systemUserPackageInfo.applicationInfo.targetSdkVersion);
            if (validity == VALIDITY_OK) {
            if (validity == VALIDITY_OK) {
                boolean installedForAllUsers = isInstalledAndEnabledForAllUsers(
                boolean installedForAllUsers = isInstalledAndEnabledForAllUsers(
                        mSystemInterface.getPackageInfoForProviderAllUsers(mContext, provider));
                        mSystemInterface.getPackageInfoForProviderAllUsers(provider));
                pw.println(String.format(
                pw.println(String.format(
                        "    Valid package %s (%s) is %s installed/enabled for all users",
                        "    Valid package %s (%s) is %s installed/enabled for all users",
                        systemUserPackageInfo.packageName,
                        systemUserPackageInfo.packageName,
+11 −20
Original line number Original line Diff line number Diff line
@@ -16,7 +16,6 @@
package com.android.server.webkit;
package com.android.server.webkit;


import android.annotation.Nullable;
import android.annotation.Nullable;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
import android.content.pm.Signature;
@@ -86,7 +85,6 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {
    private static final int VALIDITY_NO_LIBRARY_FLAG = 4;
    private static final int VALIDITY_NO_LIBRARY_FLAG = 4;


    private final SystemInterface mSystemInterface;
    private final SystemInterface mSystemInterface;
    private final Context mContext;
    private final WebViewProviderInfo mDefaultProvider;
    private final WebViewProviderInfo mDefaultProvider;


    private long mMinimumVersionCode = -1;
    private long mMinimumVersionCode = -1;
@@ -108,8 +106,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {


    private final Object mLock = new Object();
    private final Object mLock = new Object();


    WebViewUpdateServiceImpl2(Context context, SystemInterface systemInterface) {
    WebViewUpdateServiceImpl2(SystemInterface systemInterface) {
        mContext = context;
        mSystemInterface = systemInterface;
        mSystemInterface = systemInterface;
        WebViewProviderInfo[] webviewProviders = getWebViewPackages();
        WebViewProviderInfo[] webviewProviders = getWebViewPackages();


@@ -194,8 +191,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {
        }
        }
        if (mCurrentWebViewPackage.packageName.equals(mDefaultProvider.packageName)) {
        if (mCurrentWebViewPackage.packageName.equals(mDefaultProvider.packageName)) {
            List<UserPackage> userPackages =
            List<UserPackage> userPackages =
                    mSystemInterface.getPackageInfoForProviderAllUsers(
                    mSystemInterface.getPackageInfoForProviderAllUsers(mDefaultProvider);
                            mContext, mDefaultProvider);
            return !isInstalledAndEnabledForAllUsers(userPackages);
            return !isInstalledAndEnabledForAllUsers(userPackages);
        } else {
        } else {
            return false;
            return false;
@@ -216,10 +212,8 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {
                TAG,
                TAG,
                "No provider available for all users, trying to install and enable "
                "No provider available for all users, trying to install and enable "
                        + mDefaultProvider.packageName);
                        + mDefaultProvider.packageName);
        mSystemInterface.installExistingPackageForAllUsers(
        mSystemInterface.installExistingPackageForAllUsers(mDefaultProvider.packageName);
                mContext, mDefaultProvider.packageName);
        mSystemInterface.enablePackageForAllUsers(mDefaultProvider.packageName, true);
        mSystemInterface.enablePackageForAllUsers(
                mContext, mDefaultProvider.packageName, true);
    }
    }


    @Override
    @Override
@@ -229,7 +223,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {
            synchronized (mLock) {
            synchronized (mLock) {
                mCurrentWebViewPackage = findPreferredWebViewPackage();
                mCurrentWebViewPackage = findPreferredWebViewPackage();
                repairNeeded = shouldTriggerRepairLocked();
                repairNeeded = shouldTriggerRepairLocked();
                String userSetting = mSystemInterface.getUserChosenWebViewProvider(mContext);
                String userSetting = mSystemInterface.getUserChosenWebViewProvider();
                if (userSetting != null
                if (userSetting != null
                        && !userSetting.equals(mCurrentWebViewPackage.packageName)) {
                        && !userSetting.equals(mCurrentWebViewPackage.packageName)) {
                    // Don't persist the user-chosen setting across boots if the package being
                    // Don't persist the user-chosen setting across boots if the package being
@@ -237,8 +231,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {
                    // be surprised by the device switching to using a certain webview package,
                    // be surprised by the device switching to using a certain webview package,
                    // that was uninstalled/disabled a long time ago, if it is installed/enabled
                    // that was uninstalled/disabled a long time ago, if it is installed/enabled
                    // again.
                    // again.
                    mSystemInterface.updateUserSetting(mContext,
                    mSystemInterface.updateUserSetting(mCurrentWebViewPackage.packageName);
                            mCurrentWebViewPackage.packageName);
                }
                }
                onWebViewProviderChanged(mCurrentWebViewPackage);
                onWebViewProviderChanged(mCurrentWebViewPackage);
            }
            }
@@ -362,7 +355,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {
            oldPackage = mCurrentWebViewPackage;
            oldPackage = mCurrentWebViewPackage;


            if (newProviderName != null) {
            if (newProviderName != null) {
                mSystemInterface.updateUserSetting(mContext, newProviderName);
                mSystemInterface.updateUserSetting(newProviderName);
            }
            }


            try {
            try {
@@ -493,7 +486,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {
        Counter.logIncrement("webview.value_find_preferred_webview_package_counter");
        Counter.logIncrement("webview.value_find_preferred_webview_package_counter");
        // If the user has chosen provider, use that (if it's installed and enabled for all
        // If the user has chosen provider, use that (if it's installed and enabled for all
        // users).
        // users).
        String userChosenPackageName = mSystemInterface.getUserChosenWebViewProvider(mContext);
        String userChosenPackageName = mSystemInterface.getUserChosenWebViewProvider();
        WebViewProviderInfo userChosenProvider =
        WebViewProviderInfo userChosenProvider =
                getWebViewProviderForPackage(userChosenPackageName);
                getWebViewProviderForPackage(userChosenPackageName);
        if (userChosenProvider != null) {
        if (userChosenProvider != null) {
@@ -502,8 +495,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {
                        mSystemInterface.getPackageInfoForProvider(userChosenProvider);
                        mSystemInterface.getPackageInfoForProvider(userChosenProvider);
                if (validityResult(userChosenProvider, packageInfo) == VALIDITY_OK) {
                if (validityResult(userChosenProvider, packageInfo) == VALIDITY_OK) {
                    List<UserPackage> userPackages =
                    List<UserPackage> userPackages =
                            mSystemInterface.getPackageInfoForProviderAllUsers(
                            mSystemInterface.getPackageInfoForProviderAllUsers(userChosenProvider);
                                    mContext, userChosenProvider);
                    if (isInstalledAndEnabledForAllUsers(userPackages)) {
                    if (isInstalledAndEnabledForAllUsers(userPackages)) {
                        return packageInfo;
                        return packageInfo;
                    }
                    }
@@ -779,7 +771,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {
        pw.println("  WebView packages:");
        pw.println("  WebView packages:");
        for (WebViewProviderInfo provider : allProviders) {
        for (WebViewProviderInfo provider : allProviders) {
            List<UserPackage> userPackages =
            List<UserPackage> userPackages =
                    mSystemInterface.getPackageInfoForProviderAllUsers(mContext, provider);
                    mSystemInterface.getPackageInfoForProviderAllUsers(provider);
            PackageInfo systemUserPackageInfo =
            PackageInfo systemUserPackageInfo =
                    userPackages.get(UserHandle.USER_SYSTEM).getPackageInfo();
                    userPackages.get(UserHandle.USER_SYSTEM).getPackageInfo();
            if (systemUserPackageInfo == null) {
            if (systemUserPackageInfo == null) {
@@ -798,8 +790,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {
            if (validity == VALIDITY_OK) {
            if (validity == VALIDITY_OK) {
                boolean installedForAllUsers =
                boolean installedForAllUsers =
                        isInstalledAndEnabledForAllUsers(
                        isInstalledAndEnabledForAllUsers(
                                mSystemInterface.getPackageInfoForProviderAllUsers(
                                mSystemInterface.getPackageInfoForProviderAllUsers(provider));
                                        mContext, provider));
                pw.println(
                pw.println(
                        TextUtils.formatSimple(
                        TextUtils.formatSimple(
                                "    Valid package %s (%s) is %s installed/enabled for all users",
                                "    Valid package %s (%s) is %s installed/enabled for all users",
Loading