Add WebView provider setting to developer settings.

For bug, see crbug.com/546185

Change-Id: Id812b767dc28084f42db9f21949497dc1ef08926
diff --git a/res/xml/development_prefs.xml b/res/xml/development_prefs.xml
index d3c8852..a836fe4 100644
--- a/res/xml/development_prefs.xml
+++ b/res/xml/development_prefs.xml
@@ -79,6 +79,12 @@
         android:summary="@string/picture_color_mode_desc"
         android:persistent="false" />
 
+    <ListPreference
+        android:key="select_webview_provider"
+        android:title="@string/select_webview_provider_title"
+        android:dialogTitle="@string/select_webview_provider_dialog_title"
+        android:summary="%s" />
+
     <PreferenceCategory android:key="debug_debugging_category"
             android:title="@string/debug_debugging_category">
 
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index 950af3c..598608c 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -72,6 +72,8 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityManager;
+import android.webkit.IWebViewUpdateService;
+import android.webkit.WebViewProviderInfo;
 import android.widget.Switch;
 import android.widget.TextView;
 
@@ -110,6 +112,7 @@
     private static final String ENABLE_TERMINAL = "enable_terminal";
     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 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";
@@ -253,6 +256,7 @@
     private ListPreference mAnimatorDurationScale;
     private ListPreference mOverlayDisplayDevices;
     private ListPreference mOpenGLTraces;
+    private ListPreference mWebViewProvider;
 
     private ListPreference mSimulateColorSpace;
 
@@ -389,6 +393,7 @@
         mMobileDataAlwaysOn = findAndInitSwitchPref(MOBILE_DATA_ALWAYS_ON);
         mLogdSize = addListPreference(SELECT_LOGD_SIZE_KEY);
         mUsbConfiguration = addListPreference(USB_CONFIGURATION_KEY);
+        mWebViewProvider = addListPreference(WEBVIEW_PROVIDER_KEY);
 
         mWindowAnimationScale = addListPreference(WINDOW_ANIMATION_SCALE_KEY);
         mTransitionAnimationScale = addListPreference(TRANSITION_ANIMATION_SCALE_KEY);
@@ -461,6 +466,7 @@
             removePreference(KEY_COLOR_MODE);
             mColorModePreference = null;
         }
+        updateWebViewProviderOptions();
     }
 
     private ListPreference addListPreference(String prefKey) {
@@ -669,6 +675,7 @@
         updateSimulateColorSpace();
         updateUSBAudioOptions();
         updateForceResizableOptions();
+        updateWebViewProviderOptions();
     }
 
     private void resetDangerousOptions() {
@@ -697,6 +704,35 @@
         pokeSystemProperties();
     }
 
+    private void updateWebViewProviderOptions() {
+        IWebViewUpdateService webViewUpdateService  =
+            IWebViewUpdateService.Stub.asInterface(ServiceManager.getService("webviewupdate"));
+        try {
+            WebViewProviderInfo[] providers = webViewUpdateService.getValidWebViewPackages();
+            String[] options = new String[providers.length];
+            String[] values = new String[providers.length];
+            for(int n = 0; n < providers.length; n++) {
+                options[n] = providers[n].description;
+                values[n] = providers[n].packageName;
+            }
+            mWebViewProvider.setEntries(options);
+            mWebViewProvider.setEntryValues(values);
+
+            String value = webViewUpdateService.getCurrentWebViewPackageName();
+            if (value == null) {
+                value = "";
+            }
+
+            for (int i = 0; i < values.length; i++) {
+                if (value.contentEquals(values[i])) {
+                    mWebViewProvider.setValueIndex(i);
+                    return;
+                }
+            }
+        } catch(RemoteException e) {
+        }
+    }
+
     private void updateHdcpValues() {
         ListPreference hdcpChecking = (ListPreference) findPreference(HDCP_CHECKING_KEY);
         if (hdcpChecking != null) {
@@ -736,6 +772,18 @@
                 mBtHciSnoopLog.isChecked() ? 1 : 0);
     }
 
+    private void writeWebViewProviderOptions(Object newValue) {
+        IWebViewUpdateService webViewUpdateService  =
+            IWebViewUpdateService.Stub.asInterface(ServiceManager.getService("webviewupdate"));
+
+        try {
+            webViewUpdateService.changeProviderAndSetting(
+                    newValue == null ? "" : newValue.toString());
+            updateWebViewProviderOptions();
+        } catch(RemoteException e) {
+        }
+    }
+
     private void writeDebuggerOptions() {
         try {
             ActivityManagerNative.getDefault().setDebugApp(
@@ -1754,6 +1802,9 @@
             updateHdcpValues();
             pokeSystemProperties();
             return true;
+        } else if (preference == mWebViewProvider) {
+            writeWebViewProviderOptions(newValue);
+            return true;
         } else if (preference == mLogdSize) {
             writeLogdSizeOption(newValue);
             return true;