diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java index 13be4539d1892..2c7b3ebccdaf3 100644 --- a/core/java/android/webkit/WebViewFactory.java +++ b/core/java/android/webkit/WebViewFactory.java @@ -63,6 +63,11 @@ public final class WebViewFactory { private static final Object sProviderLock = new Object(); private static boolean sAddressSpaceReserved = false; + public static String getWebViewPackageName() { + // TODO: Make this dynamic based on resource configuration. + return "com.android.webview"; + } + static WebViewFactoryProvider getProvider() { synchronized (sProviderLock) { // For now the main purpose of this function (and the factory abstraction) is to keep diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateService.java b/services/core/java/com/android/server/webkit/WebViewUpdateService.java index e8ae97c29cae4..60724e73ed624 100644 --- a/services/core/java/com/android/server/webkit/WebViewUpdateService.java +++ b/services/core/java/com/android/server/webkit/WebViewUpdateService.java @@ -16,10 +16,15 @@ package com.android.server.webkit; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.os.Binder; import android.os.Process; import android.util.Log; import android.webkit.IWebViewUpdateService; +import android.webkit.WebViewFactory; /** * Private service to wait for the updatable WebView to be ready for use. @@ -32,7 +37,22 @@ public class WebViewUpdateService extends IWebViewUpdateService.Stub { private boolean mRelroReady32Bit = false; private boolean mRelroReady64Bit = false; - public WebViewUpdateService() { + private BroadcastReceiver mWebViewUpdatedReceiver; + + public WebViewUpdateService(Context context) { + mWebViewUpdatedReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String webviewPackage = "package:" + WebViewFactory.getWebViewPackageName(); + if (webviewPackage.equals(intent.getDataString())) { + onWebViewUpdateInstalled(); + } + } + }; + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_PACKAGE_REPLACED); + filter.addDataScheme("package"); + context.registerReceiver(mWebViewUpdatedReceiver, filter); } /** @@ -75,4 +95,14 @@ public class WebViewUpdateService extends IWebViewUpdateService.Stub { } } } + + private void onWebViewUpdateInstalled() { + Log.d(TAG, "WebView Package updated!"); + + synchronized (this) { + mRelroReady32Bit = false; + mRelroReady64Bit = false; + } + WebViewFactory.prepareWebViewInSystemServer(); + } } diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index a6030cfc7dcab..b2242494ec3dd 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -411,7 +411,7 @@ public final class SystemServer { SystemConfig.getInstance(); Slog.i(TAG, "WebView Update Service"); - ServiceManager.addService("webviewupdate", new WebViewUpdateService()); + ServiceManager.addService("webviewupdate", new WebViewUpdateService(context)); Slog.i(TAG, "WebViewFactory preparation"); WebViewFactory.prepareWebViewInSystemServer();