diff options
| -rw-r--r-- | core/java/android/webkit/WebViewFactory.java | 53 | ||||
| -rw-r--r-- | core/res/res/values/config.xml | 6 | ||||
| -rw-r--r-- | core/res/res/values/symbols.xml | 2 | ||||
| -rw-r--r-- | services/core/java/com/android/server/webkit/WebViewUpdateService.java | 21 |
4 files changed, 63 insertions, 19 deletions
diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java index 584deff2659b..cb18b49b65f8 100644 --- a/core/java/android/webkit/WebViewFactory.java +++ b/core/java/android/webkit/WebViewFactory.java @@ -96,27 +96,49 @@ public final class WebViewFactory { public MissingWebViewPackageException(Exception e) { super(e); } } + /** @hide */ + public static String[] getWebViewPackageNames() { + return AppGlobals.getInitialApplication().getResources().getStringArray( + com.android.internal.R.array.config_webViewPackageNames); + } + + // TODO (gsennton) remove when committing webview xts test change public static String getWebViewPackageName() { - return AppGlobals.getInitialApplication().getString( - com.android.internal.R.string.config_webViewPackageName); + String[] webViewPackageNames = getWebViewPackageNames(); + return webViewPackageNames[webViewPackageNames.length-1]; } - private static PackageInfo fetchPackageInfo() { + /** + * Return the package info of the first package in the webview priority list that contains + * webview. + * + * @hide + */ + public static PackageInfo findPreferredWebViewPackage() { PackageManager pm = AppGlobals.getInitialApplication().getPackageManager(); - try { - return pm.getPackageInfo(getWebViewPackageName(), PackageManager.GET_META_DATA); - } catch (PackageManager.NameNotFoundException e) { - throw new MissingWebViewPackageException(e); + + for (String packageName : getWebViewPackageNames()) { + try { + PackageInfo packageInfo = pm.getPackageInfo(packageName, + PackageManager.GET_META_DATA); + ApplicationInfo applicationInfo = packageInfo.applicationInfo; + + // If the correct flag is set the package contains webview. + if (getWebViewLibrary(applicationInfo) != null) { + return packageInfo; + } + } catch (PackageManager.NameNotFoundException e) { + } } + throw new MissingWebViewPackageException("Could not find a loadable WebView package"); } // throws MissingWebViewPackageException private static ApplicationInfo getWebViewApplicationInfo() { - if (sPackageInfo == null) { - return fetchPackageInfo().applicationInfo; - } else { + if (sPackageInfo == null) + return findPreferredWebViewPackage().applicationInfo; + else return sPackageInfo.applicationInfo; - } } private static String getWebViewLibrary(ApplicationInfo ai) { @@ -134,7 +156,12 @@ public final class WebViewFactory { * name is the same as the one providing the webview. */ public static int loadWebViewNativeLibraryFromPackage(String packageName) { - sPackageInfo = fetchPackageInfo(); + try { + sPackageInfo = findPreferredWebViewPackage(); + } catch (MissingWebViewPackageException e) { + return LIBLOAD_FAILED_LISTING_WEBVIEW_PACKAGES; + } + if (packageName != null && packageName.equals(sPackageInfo.packageName)) { return loadNativeLibrary(); } @@ -180,7 +207,7 @@ public final class WebViewFactory { private static Class<WebViewFactoryProvider> getProviderClass() { try { // First fetch the package info so we can log the webview package version. - sPackageInfo = fetchPackageInfo(); + sPackageInfo = findPreferredWebViewPackage(); Log.i(LOGTAG, "Loading " + sPackageInfo.packageName + " version " + sPackageInfo.versionName + " (code " + sPackageInfo.versionCode + ")"); diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index d20b09fdf4b4..0ded80246649 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2123,8 +2123,10 @@ string that's stored in 8-bit unpacked format) characters.--> <bool translatable="false" name="config_sms_decode_gsm_8bit_data">false</bool> - <!-- Package name providing WebView implementation. --> - <string name="config_webViewPackageName" translatable="false">com.android.webview</string> + <!-- List of package names (ordered by preference) providing WebView implementations. --> + <string-array name="config_webViewPackageNames" translatable="false"> + <item>com.android.webview</item> + </string-array> <!-- If EMS is not supported, framework breaks down EMS into single segment SMS and adds page info " x/y". This config is used to set which carrier doesn't diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 6f239e63fe67..868c6af3e4dc 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2016,7 +2016,7 @@ <java-symbol type="attr" name="actionModeWebSearchDrawable" /> <java-symbol type="string" name="websearch" /> <java-symbol type="drawable" name="ic_media_video_poster" /> - <java-symbol type="string" name="config_webViewPackageName" /> + <java-symbol type="array" name="config_webViewPackageNames" /> <!-- From SubtitleView --> <java-symbol type="dimen" name="subtitle_corner_radius" /> diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateService.java b/services/core/java/com/android/server/webkit/WebViewUpdateService.java index d4c5f8716c0e..ac79b36f7005 100644 --- a/services/core/java/com/android/server/webkit/WebViewUpdateService.java +++ b/services/core/java/com/android/server/webkit/WebViewUpdateService.java @@ -40,6 +40,8 @@ public class WebViewUpdateService extends SystemService { private boolean mRelroReady32Bit = false; private boolean mRelroReady64Bit = false; + private String oldWebViewPackageName = null; + private BroadcastReceiver mWebViewUpdatedReceiver; public WebViewUpdateService(Context context) { @@ -51,9 +53,22 @@ public class WebViewUpdateService extends SystemService { mWebViewUpdatedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - String webviewPackage = "package:" + WebViewFactory.getWebViewPackageName(); - if (webviewPackage.equals(intent.getDataString())) { - onWebViewUpdateInstalled(); + + for (String packageName : WebViewFactory.getWebViewPackageNames()) { + String webviewPackage = "package:" + packageName; + + if (webviewPackage.equals(intent.getDataString())) { + String usedPackageName = + WebViewFactory.findPreferredWebViewPackage().packageName; + // Only trigger update actions if the updated package is the one that + // will be used, or the one that was in use before the update. + if (packageName.equals(usedPackageName) || + packageName.equals(oldWebViewPackageName)) { + onWebViewUpdateInstalled(); + oldWebViewPackageName = usedPackageName; + } + return; + } } } }; |