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

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

Merge "Refactor WebViewUpdateService context handling." into main

parents 15ac2ef9 3fe6f8d2
Loading
Loading
Loading
Loading
+19 −27
Original line number 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_FALLBACK = "isFallback";
    private static final String PIN_GROUP = "webview";
    private final WebViewProviderInfo[] mWebViewProviderPackages;

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

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

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

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

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

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

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

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

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

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

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

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

package com.android.server.webkit;

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

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

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

    public boolean systemIsDebuggable();
    public PackageInfo getPackageInfoForProvider(WebViewProviderInfo configInfo)
    boolean systemIsDebuggable();
    PackageInfo getPackageInfoForProvider(WebViewProviderInfo configInfo)
            throws NameNotFoundException;
    /**
     * 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
     *         is uninstalled for some user.
     */
    public List<UserPackage> getPackageInfoForProviderAllUsers(Context context,
            WebViewProviderInfo configInfo);
    List<UserPackage> getPackageInfoForProviderAllUsers(WebViewProviderInfo configInfo);

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

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

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

import android.annotation.Nullable;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
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 final SystemInterface mSystemInterface;
    private final Context mContext;

    private long mMinimumVersionCode = -1;

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

    private final Object mLock = new Object();

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

@@ -173,7 +170,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
        try {
            synchronized (mLock) {
                mCurrentWebViewPackage = findPreferredWebViewPackage();
                String userSetting = mSystemInterface.getUserChosenWebViewProvider(mContext);
                String userSetting = mSystemInterface.getUserChosenWebViewProvider();
                if (userSetting != null
                        && !userSetting.equals(mCurrentWebViewPackage.packageName)) {
                    // 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,
                    // that was uninstalled/disabled a long time ago, if it is installed/enabled
                    // again.
                    mSystemInterface.updateUserSetting(mContext,
                            mCurrentWebViewPackage.packageName);
                    mSystemInterface.updateUserSetting(mCurrentWebViewPackage.packageName);
                }
                onWebViewProviderChanged(mCurrentWebViewPackage);
            }
@@ -203,8 +199,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
            WebViewProviderInfo fallbackProvider = getFallbackProvider(webviewProviders);
            if (fallbackProvider != null) {
                Slog.w(TAG, "No valid provider, trying to enable " + fallbackProvider.packageName);
                mSystemInterface.enablePackageForAllUsers(mContext, fallbackProvider.packageName,
                                                          true);
                mSystemInterface.enablePackageForAllUsers(fallbackProvider.packageName, true);
            } else {
                Slog.e(TAG, "No valid provider and no fallback available.");
            }
@@ -316,7 +311,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
            oldPackage = mCurrentWebViewPackage;

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

            try {
@@ -447,7 +442,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
    private PackageInfo findPreferredWebViewPackage() throws WebViewPackageMissingException {
        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
        // users).
@@ -455,7 +450,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
            if (providerAndPackage.provider.packageName.equals(userChosenProvider)) {
                // userPackages can contain null objects.
                List<UserPackage> userPackages =
                        mSystemInterface.getPackageInfoForProviderAllUsers(mContext,
                        mSystemInterface.getPackageInfoForProviderAllUsers(
                                providerAndPackage.provider);
                if (isInstalledAndEnabledForAllUsers(userPackages)) {
                    return providerAndPackage.packageInfo;
@@ -470,7 +465,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
            if (providerAndPackage.provider.availableByDefault) {
                // userPackages can contain null objects.
                List<UserPackage> userPackages =
                        mSystemInterface.getPackageInfoForProviderAllUsers(mContext,
                        mSystemInterface.getPackageInfoForProviderAllUsers(
                                providerAndPackage.provider);
                if (isInstalledAndEnabledForAllUsers(userPackages)) {
                    return providerAndPackage.packageInfo;
@@ -658,7 +653,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {

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

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

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

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

    private final Object mLock = new Object();

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

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

    @Override
@@ -229,7 +223,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {
            synchronized (mLock) {
                mCurrentWebViewPackage = findPreferredWebViewPackage();
                repairNeeded = shouldTriggerRepairLocked();
                String userSetting = mSystemInterface.getUserChosenWebViewProvider(mContext);
                String userSetting = mSystemInterface.getUserChosenWebViewProvider();
                if (userSetting != null
                        && !userSetting.equals(mCurrentWebViewPackage.packageName)) {
                    // 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,
                    // that was uninstalled/disabled a long time ago, if it is installed/enabled
                    // again.
                    mSystemInterface.updateUserSetting(mContext,
                            mCurrentWebViewPackage.packageName);
                    mSystemInterface.updateUserSetting(mCurrentWebViewPackage.packageName);
                }
                onWebViewProviderChanged(mCurrentWebViewPackage);
            }
@@ -362,7 +355,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {
            oldPackage = mCurrentWebViewPackage;

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

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