From fb0c9ab82954cf41bb985957d3eddfd190ca2ca5 Mon Sep 17 00:00:00 2001 From: Pranav Vashi Date: Sat, 21 Sep 2024 13:44:09 +0530 Subject: [PATCH 10/11] WebView: Add check before setting default or fallback provider Signed-off-by: Pranav Vashi --- .../webkit/WebViewUpdateServiceImpl.java | 14 ++++++-- .../webkit/WebViewUpdateServiceImpl2.java | 34 ++++++++++++++----- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java index b9be4a2de..e98196f9f 100644 --- a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java +++ b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java @@ -15,6 +15,7 @@ */ package com.android.server.webkit; +import android.app.AppGlobals; import android.annotation.Nullable; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; @@ -396,7 +397,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface { @Override public WebViewProviderInfo getDefaultWebViewPackage() { for (WebViewProviderInfo provider : getWebViewPackages()) { - if (provider.availableByDefault) { + if (provider.availableByDefault && isPackageAvailable(provider.packageName)) { return provider; } } @@ -406,6 +407,15 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface { throw new AndroidRuntimeException("No available by default WebView Provider."); } + private static boolean isPackageAvailable(String packageName) { + try { + AppGlobals.getInitialApplication().getPackageManager().getPackageInfo(packageName, 0); + return true; + } catch (NameNotFoundException e) { + return false; + } + } + private static class ProviderAndPackageInfo { public final WebViewProviderInfo provider; public final PackageInfo packageInfo; @@ -644,7 +654,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface { */ private static WebViewProviderInfo getFallbackProvider(WebViewProviderInfo[] webviewPackages) { for (WebViewProviderInfo provider : webviewPackages) { - if (provider.isFallback) { + if (provider.isFallback && isPackageAvailable(provider.packageName)) { return provider; } } diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java index 307c15b72..26d1195dc 100644 --- a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java +++ b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java @@ -15,6 +15,7 @@ */ package com.android.server.webkit; +import android.app.AppGlobals; import android.annotation.Nullable; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; @@ -112,7 +113,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { WebViewProviderInfo defaultProvider = null; for (WebViewProviderInfo provider : webviewProviders) { - if (provider.availableByDefault) { + if (provider.availableByDefault && isPackageAvailable(provider.packageName)) { defaultProvider = provider; break; } @@ -182,6 +183,15 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { } } + private static boolean isPackageAvailable(String packageName) { + try { + AppGlobals.getInitialApplication().getPackageManager().getPackageInfo(packageName, 0); + return true; + } catch (NameNotFoundException e) { + return false; + } + } + private boolean shouldTriggerRepairLocked() { if (mAttemptedToRepairBefore) { return false; @@ -208,12 +218,20 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { } mAttemptedToRepairBefore = true; } - Slog.w( - TAG, - "No provider available for all users, trying to install and enable " - + mDefaultProvider.packageName); - mSystemInterface.installExistingPackageForAllUsers(mDefaultProvider.packageName); - mSystemInterface.enablePackageForAllUsers(mDefaultProvider.packageName, true); + + WebViewProviderInfo[] webviewProviders = mSystemInterface.getWebViewPackages(); + WebViewProviderInfo fallbackProvider = getFallbackProvider(webviewProviders); + if (fallbackProvider != null) { + Slog.w(TAG, "No valid provider, trying to install and enable " + + fallbackProvider.packageName); + mSystemInterface.installExistingPackageForAllUsers(fallbackProvider.packageName); + mSystemInterface.enablePackageForAllUsers(fallbackProvider.packageName, true); + } else { + Slog.w(TAG, "No provider available for all users, trying to install and enable " + + mDefaultProvider.packageName); + mSystemInterface.installExistingPackageForAllUsers(mDefaultProvider.packageName); + mSystemInterface.enablePackageForAllUsers(mDefaultProvider.packageName, true); + } } @Override @@ -701,7 +719,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { */ private static WebViewProviderInfo getFallbackProvider(WebViewProviderInfo[] webviewPackages) { for (WebViewProviderInfo provider : webviewPackages) { - if (provider.isFallback) { + if (provider.isFallback && isPackageAvailable(provider.packageName)) { return provider; } } -- 2.44.0