Have WebView Implementation Dev Setting use DefaultAppPickerFragment.

Make the WebView Implementation Dev Setting look like the fullscreen
settings deriving from DefaultAppPickerFragment.
Point the Activity opened through Settings.ACTION_WEBVIEW_SETTINGS to
the class WebViewAppPicker which is our new implementation of the
WebView Implementation setting.

Ensure the new setting closes if it is reached from a user that isn't an
admin of the device.

Bug: 34806477
Bug: 34966439
Test: Ensure WebView implementation Dev Setting looks ok (disabled
packages should have a text showing why they cannot be chosen).
Test: Start Intent with action Settings.ACTION_WEBVIEW_SETTINGS and
ensure the started Activity looks similar to the WebView Implementation
Dev Setting.
Test: Ensure picking a package that is no longer active, updates the
setting (so that package isn't visible anymore).
Change-Id: I08007c515193739ad61dfd735bb5130fc07bd6e6
This commit is contained in:
Gustav Sennton
2017-02-03 16:19:02 +00:00
parent 8be6862021
commit 5b596285a0
15 changed files with 365 additions and 512 deletions

View File

@@ -16,57 +16,83 @@
package com.android.settings.webview;
import android.app.ListActivity;
import static android.provider.Settings.ACTION_WEBVIEW_SETTINGS;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.RemoteException;
import android.support.annotation.VisibleForTesting;
import android.util.Log;
import android.view.View;
import android.webkit.WebViewFactory;
import android.widget.ListView;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.core.instrumentation.Instrumentable;
import com.android.settings.core.instrumentation.VisibilityLoggerMixin;
import com.android.settings.R;
import com.android.settings.applications.defaultapps.DefaultAppInfo;
import com.android.settings.applications.defaultapps.DefaultAppPickerFragment;
public class WebViewAppPicker extends ListActivity implements Instrumentable {
private static final String TAG = WebViewAppPicker.class.getSimpleName();
private WebViewAppListAdapter mAdapter;
import java.util.ArrayList;
import java.util.List;
public class WebViewAppPicker extends DefaultAppPickerFragment {
private WebViewUpdateServiceWrapper mWebViewUpdateServiceWrapper;
private final VisibilityLoggerMixin mVisibilityLoggerMixin =
new VisibilityLoggerMixin(getMetricsCategory());
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
private WebViewUpdateServiceWrapper getWebViewUpdateServiceWrapper() {
if (mWebViewUpdateServiceWrapper == null) {
setWebViewUpdateServiceWrapper(createDefaultWebViewUpdateServiceWrapper());
}
mAdapter = new WebViewAppListAdapter(this, mWebViewUpdateServiceWrapper);
setListAdapter(mAdapter);
mVisibilityLoggerMixin.onAttach(this);
return mWebViewUpdateServiceWrapper;
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
WebViewApplicationInfo app = mAdapter.getItem(position);
public void onAttach(Context context) {
super.onAttach(context);
if (mWebViewUpdateServiceWrapper.setWebViewProvider(app.info.packageName)) {
Intent intent = new Intent();
intent.setAction(app.info.packageName);
setResult(RESULT_OK, intent);
} else {
mWebViewUpdateServiceWrapper.showInvalidChoiceToast(this);
if (!mUserManager.isAdminUser()) {
getActivity().finish();
}
finish();
}
@Override
protected List<DefaultAppInfo> getCandidates() {
final List<DefaultAppInfo> packageInfoList = new ArrayList<DefaultAppInfo>();
List<ApplicationInfo> pkgs =
getWebViewUpdateServiceWrapper().getValidWebViewApplicationInfos(getContext());
for (ApplicationInfo ai : pkgs) {
packageInfoList.add(new DefaultAppInfo(ai,
getDisabledReason(getWebViewUpdateServiceWrapper(),
getContext(), ai.packageName)));
}
return packageInfoList;
}
@Override
protected String getDefaultAppKey() {
PackageInfo currentPackage = getWebViewUpdateServiceWrapper().getCurrentWebViewPackage();
return currentPackage == null ? null : currentPackage.packageName;
}
protected boolean setDefaultAppKey(String key) {
boolean success = getWebViewUpdateServiceWrapper().setWebViewProvider(key);
return success;
}
@Override
protected void onSelectionPerformed(boolean success) {
if (success) {
Activity activity = getActivity();
Intent intent = activity == null ? null : activity.getIntent();
if (intent != null && ACTION_WEBVIEW_SETTINGS.equals(intent.getAction())) {
// If this was started through ACTION_WEBVIEW_SETTINGS then return once we have
// chosen a new package.
getActivity().finish();
}
} else {
getWebViewUpdateServiceWrapper().showInvalidChoiceToast(getActivity());
updateCandidates();
}
}
private WebViewUpdateServiceWrapper createDefaultWebViewUpdateServiceWrapper() {
return new WebViewUpdateServiceWrapper();
}
@@ -76,20 +102,32 @@ public class WebViewAppPicker extends ListActivity implements Instrumentable {
mWebViewUpdateServiceWrapper = wvusWrapper;
}
@Override
public void onResume() {
super.onResume();
mVisibilityLoggerMixin.onResume();
}
@Override
public void onPause() {
super.onPause();
mVisibilityLoggerMixin.onPause();
}
@Override
public int getMetricsCategory() {
return MetricsEvent.WEBVIEW_IMPLEMENTATION;
}
/**
* Returns the reason why a package cannot be used as WebView implementation.
* This is either because of it being disabled, uninstalled, or hidden for any user.
*/
@VisibleForTesting
String getDisabledReason(WebViewUpdateServiceWrapper webviewUpdateServiceWrapper,
Context context, String packageName) {
StringBuilder disabledReason = new StringBuilder();
List<UserPackageWrapper> userPackages =
webviewUpdateServiceWrapper.getPackageInfosAllUsers(context, packageName);
for (UserPackageWrapper userPackage : userPackages) {
if (!userPackage.isInstalledPackage()) {
// Package uninstalled/hidden
return context.getString(
R.string.webview_uninstalled_for_user, userPackage.getUserInfo().name);
} else if (!userPackage.isEnabledPackage()) {
// Package disabled
return context.getString(
R.string.webview_disabled_for_user, userPackage.getUserInfo().name);
}
}
return null;
}
}