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

Commit adb612b4 authored by Gustav Sennton's avatar Gustav Sennton
Browse files

Add info on each WebView package in webviewupdate-dumpsys.

Add information such as versionName and versionCode for each WebView
package to the dumpState of WebViewUpdateService. Also print the package
that would be used at the time of printing if the package-choice logic
had been rerun then.

Bug: 35862676
Test: Ensure running 'adb shell dumpsys webviewupdate' prints correct
info.
Change-Id: Ic1eb576f4f58680a867c591c705cfcebf1d9a5b0
parent a33ae2d8
Loading
Loading
Loading
Loading
+84 −11
Original line number Diff line number Diff line
@@ -625,26 +625,52 @@ public class WebViewUpdateServiceImpl {
            return v1 >= v2;
        }

        /**
         * Returns whether this provider is valid for use as a WebView provider.
         */
        public boolean isValidProvider(WebViewProviderInfo configInfo,
                PackageInfo packageInfo) {
        private final static int VALIDITY_OK = 0;
        private final static int VALIDITY_INCORRECT_SDK_VERSION = 1;
        private final static int VALIDITY_INCORRECT_VERSION_CODE = 2;
        private final static int VALIDITY_INCORRECT_SIGNATURE = 3;
        private final static int VALIDITY_NO_LIBRARY_FLAG = 4;

        private static String getInvalidityReason(int invalidityReason) {
            switch (invalidityReason) {
                case VALIDITY_INCORRECT_SDK_VERSION:
                    return "SDK version too low";
                case VALIDITY_INCORRECT_VERSION_CODE:
                    return "Version code too low";
                case VALIDITY_INCORRECT_SIGNATURE:
                    return "Incorrect signature";
                case VALIDITY_NO_LIBRARY_FLAG:
                    return "No WebView-library manifest flag";
                default:
                    return "Unexcepted validity-reason";
            }
        }

        private int validityResult(WebViewProviderInfo configInfo, PackageInfo packageInfo) {
            // Ensure the provider targets this framework release (or a later one).
            if (!UserPackage.hasCorrectTargetSdkVersion(packageInfo)) {
                return false;
                return VALIDITY_INCORRECT_SDK_VERSION;
            }
            if (!versionCodeGE(packageInfo.versionCode, getMinimumVersionCode())
                    && !mSystemInterface.systemIsDebuggable()) {
                // Webview providers may be downgraded arbitrarily low, prevent that by enforcing
                // minimum version code. This check is only enforced for user builds.
                return false;
                return VALIDITY_INCORRECT_VERSION_CODE;
            }
            if (providerHasValidSignature(configInfo, packageInfo, mSystemInterface) &&
                    WebViewFactory.getWebViewLibrary(packageInfo.applicationInfo) != null) {
                return true;
            if (!providerHasValidSignature(configInfo, packageInfo, mSystemInterface)) {
                return VALIDITY_INCORRECT_SIGNATURE;
            }
            return false;
            if (WebViewFactory.getWebViewLibrary(packageInfo.applicationInfo) == null) {
                return VALIDITY_NO_LIBRARY_FLAG;
            }
            return VALIDITY_OK;
        }

        /**
         * Returns whether this provider is valid for use as a WebView provider.
         */
        public boolean isValidProvider(WebViewProviderInfo configInfo, PackageInfo packageInfo) {
            return VALIDITY_OK == validityResult(configInfo, packageInfo);
        }

        /**
@@ -699,6 +725,53 @@ public class WebViewUpdateServiceImpl {
                pw.println(String.format("  WebView package dirty: %b", mWebViewPackageDirty));
                pw.println(String.format("  Any WebView package installed: %b",
                        mAnyWebViewInstalled));

                try {
                    PackageInfo preferredWebViewPackage = findPreferredWebViewPackage();
                    pw.println(String.format(
                            "  Preferred WebView package (name, version): (%s, %s)",
                            preferredWebViewPackage.packageName,
                            preferredWebViewPackage.versionName));
                } catch (WebViewPackageMissingException e) {
                    pw.println(String.format("  Preferred WebView package: none"));
                }

                dumpAllPackageInformationLocked(pw);
            }
        }

        private void dumpAllPackageInformationLocked(PrintWriter pw) {
            WebViewProviderInfo[] allProviders = mSystemInterface.getWebViewPackages();
            pw.println("  WebView packages:");
            for (WebViewProviderInfo provider : allProviders) {
                List<UserPackage> userPackages =
                        mSystemInterface.getPackageInfoForProviderAllUsers(mContext, provider);
                PackageInfo systemUserPackageInfo =
                        userPackages.get(UserHandle.USER_SYSTEM).getPackageInfo();
                if (systemUserPackageInfo == null) {
                    continue;
                }

                int validity = validityResult(provider, systemUserPackageInfo);
                String packageDetails = String.format(
                        "versionName: %s, versionCode: %d, targetSdkVersion: %d",
                        systemUserPackageInfo.versionName,
                        systemUserPackageInfo.versionCode,
                        systemUserPackageInfo.applicationInfo.targetSdkVersion);
                if (validity == VALIDITY_OK) {
                    boolean installedForAllUsers = isInstalledAndEnabledForAllUsers(
                            mSystemInterface.getPackageInfoForProviderAllUsers(mContext, provider));
                    pw.println(String.format(
                            "    Valid package %s (%s) is %s installed/enabled for all users",
                            systemUserPackageInfo.packageName,
                            packageDetails,
                            installedForAllUsers ? "" : "NOT"));
                } else {
                    pw.println(String.format("    Invalid package %s (%s), reason: %s",
                            systemUserPackageInfo.packageName,
                            packageDetails,
                            getInvalidityReason(validity)));
                }
            }
        }