OSDN Git Service

Block the user from enabling or disabling webview fallback packages.
authorGustav Sennton <gsennton@google.com>
Thu, 18 Feb 2016 12:28:36 +0000 (12:28 +0000)
committerGustav Sennton <gsennton@google.com>
Tue, 23 Feb 2016 14:09:13 +0000 (14:09 +0000)
Now that we support webview fallback packages - packages that should be
enabled if and only if no other webview packages are available - we need
to ensure that the Settings UI consistently shows that these packages
cannot be enabled or disabled (e.g. the 'Enable' and 'Disable' buttons
for enabling/disabling them are greyed out).

Also, remove the Dialog that lets a user enable a disabled webview
package from the webview implementation Dev Setting. Instead show a
Toast if the user has chosen an invalid package.

Bug: 2637552426375860

Change-Id: I949083d3f7c83cd2e049dd2c5c15ec5ab880fe07

src/com/android/settings/DevelopmentSettings.java
src/com/android/settings/applications/InstalledAppDetails.java
src/com/android/settings/applications/ResetAppsHelper.java

index 79ea0cb..26f5ab7 100644 (file)
@@ -821,13 +821,15 @@ public class DevelopmentSettings extends RestrictedSettingsFragment
                 mBtHciSnoopLog.isChecked() ? 1 : 0);
     }
 
-    private void writeWebViewProviderOptions(Object newValue) {
+    private boolean writeWebViewProviderOptions(Object newValue) {
         try {
-            mWebViewUpdateService.changeProviderAndSetting(
+            String updatedProvider = mWebViewUpdateService.changeProviderAndSetting(
                     newValue == null ? "" : newValue.toString());
             updateWebViewProviderOptions();
+            return newValue != null && newValue.equals(updatedProvider);
         } catch(RemoteException e) {
         }
+        return false;
     }
 
     private void writeDebuggerOptions() {
@@ -1933,18 +1935,6 @@ public class DevelopmentSettings extends RestrictedSettingsFragment
         return false;
     }
 
-    private void enableAndSetWebViewPackage(String packageName) {
-        getActivity().getPackageManager().setApplicationEnabledSetting(packageName,
-                PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
-        mWebViewProvider.setValue(packageName);
-        writeWebViewProviderOptions(packageName);
-    }
-
-    private void showEnableWebViewProviderAlert(final String packageName) {
-        EnableWebViewProviderDialogFragment.newInstance(packageName).show(
-                getChildFragmentManager(), EnableWebViewProviderDialogFragment.TAG);
-    }
-
     @Override
     public boolean onPreferenceChange(Preference preference, Object newValue) {
         if (HDCP_CHECKING_KEY.equals(preference.getKey())) {
@@ -1957,19 +1947,15 @@ public class DevelopmentSettings extends RestrictedSettingsFragment
                 Log.e(TAG, "Tried to set a null WebView provider");
                 return false;
             }
-            String newWebViewPackageName = (String) newValue;
-            if (isPackageEnabled(newWebViewPackageName)) {
-                writeWebViewProviderOptions(newValue);
+            if (writeWebViewProviderOptions(newValue)) {
                 return true;
+            } else {
+                // The user chose a package that became invalid since the list was last updated,
+                // show a Toast to explain the situation.
+                Toast toast = Toast.makeText(getActivity(),
+                        R.string.select_webview_provider_toast_text, Toast.LENGTH_SHORT);
+                toast.show();
             }
-            // Package is disabled or uninstalled, if it is simply disabled, check if the user wants
-            // to enable it
-            if (isPackageInstalled(getActivity(), newWebViewPackageName)) {
-                showEnableWebViewProviderAlert(newWebViewPackageName);
-                return false;
-            }
-            // Package has been uninstalled (could happen if the package was uninstalled between
-            // opening and closing the setting).
             return false;
         } else if (preference == mLogdSize) {
             writeLogdSizeOption(newValue);
@@ -2128,36 +2114,6 @@ public class DevelopmentSettings extends RestrictedSettingsFragment
         }
     }
 
-    public static class EnableWebViewProviderDialogFragment extends DialogFragment {
-        public static final String TAG = "EnableWebViewProviderDialogFragment";
-        private static final String PACKAGE_NAME_TAG = "packageName";
-
-        public static EnableWebViewProviderDialogFragment newInstance(String packageName) {
-            EnableWebViewProviderDialogFragment fragment
-                = new EnableWebViewProviderDialogFragment();
-            Bundle args = new Bundle();
-            args.putString(PACKAGE_NAME_TAG, packageName);
-            fragment.setArguments(args);
-            return fragment;
-        }
-
-        @Override
-        public Dialog onCreateDialog(Bundle savedInstanceState) {
-            final String packageName = getArguments().getString(PACKAGE_NAME_TAG);
-
-            return new AlertDialog.Builder(getActivity())
-                .setMessage(R.string.select_webview_provider_confirmation_text)
-                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int id) {
-                        ((DevelopmentSettings)getParentFragment()).enableAndSetWebViewPackage(
-                            packageName);
-                    }
-                })
-                .setNegativeButton(android.R.string.cancel, null)
-                .create();
-        }
-    }
-
 
     /**
      * For Search.
index 7ba6c7f..69a1142 100755 (executable)
@@ -61,6 +61,7 @@ import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
+import android.webkit.IWebViewUpdateService;
 import android.widget.Button;
 import android.widget.ImageView;
 import android.widget.TextView;
@@ -254,6 +255,16 @@ public class InstalledAppDetails extends AppInfoBase
             enabled = false;
         }
 
+        try {
+            IWebViewUpdateService webviewUpdateService =
+                IWebViewUpdateService.Stub.asInterface(ServiceManager.getService("webviewupdate"));
+            if (webviewUpdateService.isFallbackPackage(mAppEntry.info.packageName)) {
+                enabled = false;
+            }
+        } catch (RemoteException e) {
+            throw new RuntimeException(e);
+        }
+
         mUninstallButton.setEnabled(enabled);
         if (enabled) {
             // Register listener
index 5d87204..ddcb244 100644 (file)
@@ -30,6 +30,7 @@ import android.os.Bundle;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.UserHandle;
+import android.webkit.IWebViewUpdateService;
 
 import com.android.settings.R;
 
@@ -46,6 +47,7 @@ public class ResetAppsHelper implements DialogInterface.OnClickListener,
     private final PackageManager mPm;
     private final IPackageManager mIPm;
     private final INotificationManager mNm;
+    private final IWebViewUpdateService mWvus;
     private final NetworkPolicyManager mNpm;
     private final AppOpsManager mAom;
     private final Context mContext;
@@ -58,6 +60,7 @@ public class ResetAppsHelper implements DialogInterface.OnClickListener,
         mIPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
         mNm = INotificationManager.Stub.asInterface(
                 ServiceManager.getService(Context.NOTIFICATION_SERVICE));
+        mWvus = IWebViewUpdateService.Stub.asInterface(ServiceManager.getService("webviewupdate"));
         mNpm = NetworkPolicyManager.from(context);
         mAom = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
     }
@@ -118,7 +121,8 @@ public class ResetAppsHelper implements DialogInterface.OnClickListener,
                     }
                     if (!app.enabled) {
                         if (mPm.getApplicationEnabledSetting(app.packageName)
-                                == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
+                                == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER
+                                && !isNonEnableableFallback(app.packageName)) {
                             mPm.setApplicationEnabledSetting(app.packageName,
                                     PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
                                     PackageManager.DONT_KILL_APP);
@@ -142,4 +146,12 @@ public class ResetAppsHelper implements DialogInterface.OnClickListener,
             }
         });
     }
+
+    private boolean isNonEnableableFallback(String packageName) {
+        try {
+            return mWvus.isFallbackPackage(packageName);
+        } catch (RemoteException e) {
+            throw new RuntimeException(e);
+        }
+    }
 }