Move current WebView provider from Settings.Secure to Settings.Global

The current WebView provider is not user-specific and should therefore
be stored as a Global rather than a Secure setting.

Also do some code cleaning including a fix in WebViewProviderInfo to
always fetch up-to-date information about whether a webview
implementation package is enabled.

Bug: 27142972
Change-Id: I4d4b8fca775e97980fb5c34313be6d82472e7d33
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 7830142..9b5d865 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -5907,13 +5907,6 @@
                 "camera_double_tap_power_gesture_disabled";
 
         /**
-         * Name of the package used as WebView provider (if unset the provider is instead determined
-         * by the system).
-         * @hide
-         */
-        public static final String WEBVIEW_PROVIDER = "webview_provider";
-
-        /**
          * This are the settings to be backed up.
          *
          * NOTE: Settings are backed up and restored in the order they appear
@@ -6940,6 +6933,13 @@
         public static final String WEBVIEW_DATA_REDUCTION_PROXY_KEY =
                 "webview_data_reduction_proxy_key";
 
+        /**
+         * Name of the package used as WebView provider (if unset the provider is instead determined
+         * by the system).
+         * @hide
+         */
+        public static final String WEBVIEW_PROVIDER = "webview_provider";
+
        /**
         * Whether Wifi display is enabled/disabled
         * 0=disabled. 1=enabled.
diff --git a/core/java/android/webkit/WebViewProviderInfo.java b/core/java/android/webkit/WebViewProviderInfo.java
index 3f50fe2..94e8b70 100644
--- a/core/java/android/webkit/WebViewProviderInfo.java
+++ b/core/java/android/webkit/WebViewProviderInfo.java
@@ -97,22 +97,12 @@
      */
     public boolean isEnabled() {
         try {
-            PackageManager pm = AppGlobals.getInitialApplication().getPackageManager();
-            int enabled_state = pm.getApplicationEnabledSetting(packageName);
-            switch (enabled_state) {
-                case PackageManager.COMPONENT_ENABLED_STATE_ENABLED:
-                    return true;
-                case PackageManager.COMPONENT_ENABLED_STATE_DEFAULT:
-                    ApplicationInfo applicationInfo = getPackageInfo().applicationInfo;
-                    return applicationInfo.enabled;
-                default:
-                    return false;
-            }
+            // Explicitly fetch up-to-date package info here since the enabled-state of the package
+            // might have changed since we last fetched its package info.
+            updatePackageInfo();
+            return getPackageInfo().applicationInfo.enabled;
         } catch (WebViewPackageNotFoundException e) {
             return false;
-        } catch (IllegalArgumentException e) {
-            // Thrown by PackageManager.getApplicationEnabledSetting if the package does not exist
-            return false;
         }
     }
 
@@ -124,14 +114,18 @@
         return availableByDefault;
     }
 
+    private void updatePackageInfo() {
+        try {
+            PackageManager pm = AppGlobals.getInitialApplication().getPackageManager();
+            packageInfo = pm.getPackageInfo(packageName, PACKAGE_FLAGS);
+        } catch (PackageManager.NameNotFoundException e) {
+            throw new WebViewPackageNotFoundException(e);
+        }
+    }
+
     public PackageInfo getPackageInfo() {
         if (packageInfo == null) {
-            try {
-                PackageManager pm = AppGlobals.getInitialApplication().getPackageManager();
-                packageInfo = pm.getPackageInfo(packageName, PACKAGE_FLAGS);
-            } catch (PackageManager.NameNotFoundException e) {
-                throw new WebViewPackageNotFoundException(e);
-            }
+            updatePackageInfo();
         }
         return packageInfo;
     }
diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateService.java b/services/core/java/com/android/server/webkit/WebViewUpdateService.java
index c3a6f5d..fb2974b 100644
--- a/services/core/java/com/android/server/webkit/WebViewUpdateService.java
+++ b/services/core/java/com/android/server/webkit/WebViewUpdateService.java
@@ -30,7 +30,7 @@
 import android.os.Process;
 import android.os.RemoteException;
 import android.provider.Settings;
-import android.provider.Settings.Secure;
+import android.provider.Settings.Global;
 import android.util.AndroidRuntimeException;
 import android.util.Slog;
 import android.webkit.IWebViewUpdateService;
@@ -90,7 +90,7 @@
                     // change provider when the new version of the package is being installed).
                     if (intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)
                         && intent.getExtras().getBoolean(Intent.EXTRA_REPLACING)) {
-                        synchronized(this) {
+                        synchronized(WebViewUpdateService.this) {
                             if (mCurrentWebViewPackage == null) return;
 
                             String webViewPackage = "package:" + mCurrentWebViewPackage.packageName;
@@ -267,13 +267,13 @@
     }
 
     private static String getUserChosenWebViewProvider() {
-        return Settings.Secure.getString(AppGlobals.getInitialApplication().getContentResolver(),
-                Settings.Secure.WEBVIEW_PROVIDER);
+        return Settings.Global.getString(AppGlobals.getInitialApplication().getContentResolver(),
+                Settings.Global.WEBVIEW_PROVIDER);
     }
 
     private void updateUserSetting(String newProviderName) {
-        Settings.Secure.putString(getContext().getContentResolver(),
-                Settings.Secure.WEBVIEW_PROVIDER,
+        Settings.Global.putString(getContext().getContentResolver(),
+                Settings.Global.WEBVIEW_PROVIDER,
                 newProviderName == null ? "" : newProviderName);
     }