Merge "add developer setting for multiprocess webview" into nyc-dev
diff --git a/res/xml/development_prefs.xml b/res/xml/development_prefs.xml
index 02454c0..53ac1bb 100644
--- a/res/xml/development_prefs.xml
+++ b/res/xml/development_prefs.xml
@@ -85,6 +85,11 @@
         android:summary="%s" />
 
     <SwitchPreference
+        android:key="enable_webview_multiprocess"
+        android:title="@string/enable_webview_multiprocess"
+        android:summary="@string/enable_webview_multiprocess_desc" />
+
+    <SwitchPreference
         android:key="color_temperature"
         android:title="@string/color_temperature"
         android:summary="@string/color_temperature_desc" />
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index 3de2af2..084f25a 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -53,6 +53,7 @@
 import android.os.ServiceManager;
 import android.os.StrictMode;
 import android.os.SystemProperties;
+import android.os.UserHandle;
 import android.os.UserManager;
 import android.os.storage.IMountService;
 import android.provider.SearchIndexableResource;
@@ -115,6 +116,7 @@
     private static final String KEEP_SCREEN_ON = "keep_screen_on";
     private static final String BT_HCI_SNOOP_LOG = "bt_hci_snoop_log";
     private static final String WEBVIEW_PROVIDER_KEY = "select_webview_provider";
+    private static final String WEBVIEW_MULTIPROCESS_KEY = "enable_webview_multiprocess";
     private static final String ENABLE_OEM_UNLOCK = "oem_unlock_enable";
     private static final String HDCP_CHECKING_KEY = "hdcp_checking";
     private static final String HDCP_CHECKING_PROPERTY = "persist.sys.hdcp_checking";
@@ -218,6 +220,7 @@
 
     private IWindowManager mWindowManager;
     private IBackupManager mBackupManager;
+    private IWebViewUpdateService mWebViewUpdateService;
     private DevicePolicyManager mDpm;
     private UserManager mUm;
     private WifiManager mWifiManager;
@@ -277,6 +280,8 @@
     private ListPreference mAnimatorDurationScale;
     private ListPreference mOverlayDisplayDevices;
     private ListPreference mOpenGLTraces;
+
+    private SwitchPreference mWebViewMultiprocess;
     private ListPreference mWebViewProvider;
 
     private ListPreference mSimulateColorSpace;
@@ -324,6 +329,9 @@
         mWindowManager = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
         mBackupManager = IBackupManager.Stub.asInterface(
                 ServiceManager.getService(Context.BACKUP_SERVICE));
+        mWebViewUpdateService  =
+            IWebViewUpdateService.Stub.asInterface(ServiceManager.getService("webviewupdate"));
+
         mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
         mUm = (UserManager) getSystemService(Context.USER_SERVICE);
 
@@ -418,6 +426,7 @@
         mLogdSize = addListPreference(SELECT_LOGD_SIZE_KEY);
         mUsbConfiguration = addListPreference(USB_CONFIGURATION_KEY);
         mWebViewProvider = addListPreference(WEBVIEW_PROVIDER_KEY);
+        mWebViewMultiprocess = findAndInitSwitchPref(WEBVIEW_MULTIPROCESS_KEY);
         mBluetoothDisableAbsVolume = findAndInitSwitchPref(BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_KEY);
 
         mWindowAnimationScale = addListPreference(WINDOW_ANIMATION_SCALE_KEY);
@@ -713,6 +722,7 @@
         updateUSBAudioOptions();
         updateForceResizableOptions();
         updateEnableFreeformWindowsSupportOptions();
+        updateWebViewMultiprocessOptions();
         updateWebViewProviderOptions();
         updateOemUnlockOptions();
         if (mColorTemperaturePreference != null) {
@@ -748,10 +758,8 @@
     }
 
     private void updateWebViewProviderOptions() {
-        IWebViewUpdateService webViewUpdateService  =
-            IWebViewUpdateService.Stub.asInterface(ServiceManager.getService("webviewupdate"));
         try {
-            WebViewProviderInfo[] providers = webViewUpdateService.getValidWebViewPackages();
+            WebViewProviderInfo[] providers = mWebViewUpdateService.getValidWebViewPackages();
             if (providers == null) {
                 Log.e(TAG, "No WebView providers available");
                 return;
@@ -765,7 +773,7 @@
             mWebViewProvider.setEntries(options);
             mWebViewProvider.setEntryValues(values);
 
-            String value = webViewUpdateService.getCurrentWebViewPackageName();
+            String value = mWebViewUpdateService.getCurrentWebViewPackageName();
             if (value == null) {
                 value = "";
             }
@@ -780,6 +788,25 @@
         }
     }
 
+    private void updateWebViewMultiprocessOptions() {
+        updateSwitchPreference(mWebViewMultiprocess,
+                Settings.Global.getInt(getActivity().getContentResolver(),
+                        Settings.Global.WEBVIEW_MULTIPROCESS, 0) != 0);
+    }
+
+    private void writeWebViewMultiprocessOptions() {
+        boolean value = mWebViewMultiprocess.isChecked();
+        Settings.Global.putInt(getActivity().getContentResolver(),
+                Settings.Global.WEBVIEW_MULTIPROCESS, value ? 1 : 0);
+
+        try {
+            String wv_package = mWebViewUpdateService.getCurrentWebViewPackageName();
+            ActivityManagerNative.getDefault().killPackageDependents(
+                    wv_package, UserHandle.USER_ALL);
+        } catch(RemoteException e) {
+        }
+    }
+
     private void updateHdcpValues() {
         ListPreference hdcpChecking = (ListPreference) findPreference(HDCP_CHECKING_KEY);
         if (hdcpChecking != null) {
@@ -820,11 +847,8 @@
     }
 
     private void writeWebViewProviderOptions(Object newValue) {
-        IWebViewUpdateService webViewUpdateService  =
-            IWebViewUpdateService.Stub.asInterface(ServiceManager.getService("webviewupdate"));
-
         try {
-            webViewUpdateService.changeProviderAndSetting(
+            mWebViewUpdateService.changeProviderAndSetting(
                     newValue == null ? "" : newValue.toString());
             updateWebViewProviderOptions();
         } catch(RemoteException e) {
@@ -1912,6 +1936,8 @@
             startBackgroundCheckFragment();
         } else if (preference == mBluetoothDisableAbsVolume) {
             writeBluetoothDisableAbsVolumeOptions();
+        } else if (preference == mWebViewMultiprocess) {
+            writeWebViewMultiprocessOptions();
         } else {
             return super.onPreferenceTreeClick(preference);
         }