diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java index 69dacf43af6..34bf00ebbd5 100644 --- a/src/com/android/settings/DevelopmentSettings.java +++ b/src/com/android/settings/DevelopmentSettings.java @@ -23,6 +23,7 @@ import android.app.AlertDialog; import android.app.AppOpsManager; import android.app.AppOpsManager.PackageOps; import android.app.Dialog; +import android.app.DialogFragment; import android.app.UiModeManager; import android.app.admin.DevicePolicyManager; import android.app.backup.IBackupManager; @@ -1863,6 +1864,38 @@ public class DevelopmentSettings extends SettingsPreferenceFragment requestCode, resources.getString(R.string.oem_unlock_enable)); } + private boolean isPackageEnabled(String packageName) { + try { + PackageManager pm = getActivity().getPackageManager(); + int enabled_state = pm.getApplicationEnabledSetting(packageName); + switch (enabled_state) { + case PackageManager.COMPONENT_ENABLED_STATE_ENABLED: + return true; + case PackageManager.COMPONENT_ENABLED_STATE_DEFAULT: + return pm.getPackageInfo(packageName, 0).applicationInfo.enabled; + default: + return false; + } + } catch (NameNotFoundException e) { + // Thrown by PackageManager.getPackageInfo if the package does not exist + } catch (IllegalArgumentException e) { + // Thrown by PackageManager.getApplicationEnabledSetting if the package does not exist + } + 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())) { @@ -1871,8 +1904,24 @@ public class DevelopmentSettings extends SettingsPreferenceFragment pokeSystemProperties(); return true; } else if (preference == mWebViewProvider) { - writeWebViewProviderOptions(newValue); - return true; + if (newValue == null) { + Log.e(TAG, "Tried to set a null WebView provider"); + return false; + } + String newWebViewPackageName = (String) newValue; + if (isPackageEnabled(newWebViewPackageName)) { + writeWebViewProviderOptions(newValue); + return true; + } + // 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); return true; @@ -2030,6 +2079,37 @@ public class DevelopmentSettings extends SettingsPreferenceFragment } } + 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. */