diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 8a827024d2a..65f72d019d4 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2889,6 +2889,18 @@ android:value="true" /> + + + + + + + + options = new ArrayList(); ArrayList values = new ArrayList(); for(int n = 0; n < providers.length; n++) { - if (isPackageEnabled(providers[n].packageName)) { + if (Utils.isPackageEnabled(getActivity(), providers[n].packageName)) { options.add(providers[n].description); values.add(providers[n].packageName); } @@ -1929,15 +1929,6 @@ public class DevelopmentSettings extends RestrictedSettingsFragment requestCode, resources.getString(R.string.oem_unlock_enable)); } - private boolean isPackageEnabled(String packageName) { - try { - return getActivity().getPackageManager().getApplicationInfo(packageName, 0).enabled; - } catch (NameNotFoundException e) { - // Thrown by PackageManager.getApplicationInfo if the package does not exist - } - return false; - } - @Override public boolean onPreferenceChange(Preference preference, Object newValue) { if (HDCP_CHECKING_KEY.equals(preference.getKey())) { diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index d972e077fdf..4eaad7d8817 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -36,6 +36,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.IntentFilterVerificationInfo; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.content.pm.UserInfo; import android.content.res.Resources; @@ -87,7 +88,6 @@ import android.view.animation.Animation.AnimationListener; import android.view.animation.AnimationUtils; import android.widget.ListView; import android.widget.TabWidget; - import com.android.internal.app.UnlaunchableAppActivity; import com.android.internal.util.UserIcons; @@ -1137,5 +1137,14 @@ public final class Utils extends com.android.settingslib.Utils { } return null; } + + public static boolean isPackageEnabled(Context context, String packageName) { + try { + return context.getPackageManager().getApplicationInfo(packageName, 0).enabled; + } catch (NameNotFoundException e) { + // Thrown by PackageManager.getApplicationInfo if the package does not exist + } + return false; + } } diff --git a/src/com/android/settings/WebViewImplementation.java b/src/com/android/settings/WebViewImplementation.java new file mode 100644 index 00000000000..c949a39e35c --- /dev/null +++ b/src/com/android/settings/WebViewImplementation.java @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.android.settings; + +import android.annotation.Nullable; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.DialogInterface.OnCancelListener; +import android.content.DialogInterface.OnClickListener; +import android.content.DialogInterface.OnDismissListener; +import android.os.Bundle; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.os.UserManager; +import android.util.Log; +import android.webkit.IWebViewUpdateService; +import android.webkit.WebViewProviderInfo; +import com.android.internal.logging.MetricsProto.MetricsEvent; + +import java.util.ArrayList; + +public class WebViewImplementation extends InstrumentedActivity implements + OnCancelListener, OnDismissListener { + + private static final String TAG = "WebViewImplementation"; + + private IWebViewUpdateService mWebViewUpdateService; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (!UserManager.get(this).isAdminUser()) { + finish(); + return; + } + mWebViewUpdateService = + IWebViewUpdateService.Stub.asInterface(ServiceManager.getService("webviewupdate")); + try { + WebViewProviderInfo[] providers = mWebViewUpdateService.getValidWebViewPackages(); + if (providers == null) { + Log.e(TAG, "No WebView providers available"); + finish(); + return; + } + + String currentValue = mWebViewUpdateService.getCurrentWebViewPackageName(); + if (currentValue == null) { + currentValue = ""; + } + + int currentIndex = -1; + ArrayList options = new ArrayList<>(); + final ArrayList values = new ArrayList<>(); + for (WebViewProviderInfo provider : providers) { + if (Utils.isPackageEnabled(this, provider.packageName)) { + options.add(provider.description); + values.add(provider.packageName); + if (currentValue.contentEquals(provider.packageName)) { + currentIndex = values.size() - 1; + } + } + } + + new AlertDialog.Builder(this) + .setTitle(R.string.select_webview_provider_dialog_title) + .setSingleChoiceItems(options.toArray(new String[0]), currentIndex, + new OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + try { + mWebViewUpdateService.changeProviderAndSetting(values.get(which)); + } catch (RemoteException e) { + Log.w(TAG, "Problem reaching webviewupdate service", e); + } + finish(); + } + }).setNegativeButton(android.R.string.cancel, null) + .setOnCancelListener(this) + .setOnDismissListener(this) + .show(); + } catch (RemoteException e) { + Log.w(TAG, "Problem reaching webviewupdate service", e); + finish(); + } + } + + @Override + protected int getMetricsCategory() { + return MetricsEvent.WEBVIEW_IMPLEMENTATION; + } + + @Override + public void onCancel(DialogInterface dialog) { + finish(); + } + + @Override + public void onDismiss(DialogInterface dialog) { + finish(); + } +}