Update WebViewUpdateService to receive PACKAGE_REPLACED broadcast.

This allows the WebViewUpdateService to receive notifications that
an update has been installed and we need to trigger recreation of
the relro file.

bug: 16329377
Change-Id: I088e61487416add997995db304beca0cde71390c
diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateService.java b/services/core/java/com/android/server/webkit/WebViewUpdateService.java
index e8ae97c..60724e7 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 @@
     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 @@
             }
         }
     }
+
+    private void onWebViewUpdateInstalled() {
+        Log.d(TAG, "WebView Package updated!");
+
+        synchronized (this) {
+            mRelroReady32Bit = false;
+            mRelroReady64Bit = false;
+        }
+        WebViewFactory.prepareWebViewInSystemServer();
+    }
 }