public final ComponentName componentName;
public final PackageItemInfo packageItemInfo;
public final String summary;
- // Description for why this item is disabled, if null, the item is enabled.
- public final String disabledDescription;
public final boolean enabled;
public DefaultAppInfo(int uid, ComponentName cn) {
userId = uid;
componentName = cn;
this.summary = summary;
- this.disabledDescription = null;
this.enabled = enabled;
}
- public DefaultAppInfo(PackageItemInfo info, String description) {
+ public DefaultAppInfo(PackageItemInfo info, String summary, boolean enabled) {
userId = UserHandle.myUserId();
packageItemInfo = info;
componentName = null;
- summary = null;
- this.disabledDescription = description;
- enabled = true;
+ this.summary = summary;
+ this.enabled = enabled;
}
public DefaultAppInfo(PackageItemInfo info) {
- this(info, null);
+ this(info, null /* summary */, true /* enabled */);
}
public CharSequence loadLabel(PackageManager pm) {
screen.addPreference(nonePref);
}
for (Map.Entry<String, DefaultAppInfo> app : mCandidates.entrySet()) {
- final RadioButtonPreference pref = new RadioButtonPreference(getPrefContext());
- final String appKey = app.getKey();
- final DefaultAppInfo info = app.getValue();
- pref.setTitle(info.loadLabel(mPm.getPackageManager()));
- pref.setIcon(info.loadIcon(mPm.getPackageManager()));
- pref.setKey(appKey);
- if (TextUtils.equals(defaultAppKey, appKey)) {
- pref.setChecked(true);
- }
- if (TextUtils.equals(systemDefaultAppKey, appKey)) {
- pref.setSummary(R.string.system_app);
- } else if (!TextUtils.isEmpty(info.summary)) {
- pref.setSummary(info.summary);
- }
- if (!TextUtils.isEmpty(app.getValue().disabledDescription)) {
- pref.setEnabled(false);
- pref.setSummary(app.getValue().disabledDescription);
- }
- pref.setEnabled(info.enabled);
- pref.setOnClickListener(this);
+ RadioButtonPreference pref = new RadioButtonPreference(getPrefContext());
+ configurePreferenceFromAppInfo(
+ pref, app.getKey(), app.getValue(), defaultAppKey, systemDefaultAppKey);
screen.addPreference(pref);
}
mayCheckOnlyRadioButton();
}
}
+ @VisibleForTesting
+ public RadioButtonPreference configurePreferenceFromAppInfo(RadioButtonPreference pref,
+ String appKey, DefaultAppInfo info, String defaultAppKey, String systemDefaultAppKey) {
+ pref.setTitle(info.loadLabel(mPm.getPackageManager()));
+ pref.setIcon(info.loadIcon(mPm.getPackageManager()));
+ pref.setKey(appKey);
+ if (TextUtils.equals(defaultAppKey, appKey)) {
+ pref.setChecked(true);
+ }
+ if (TextUtils.equals(systemDefaultAppKey, appKey)) {
+ pref.setSummary(R.string.system_app);
+ } else if (!TextUtils.isEmpty(info.summary)) {
+ pref.setSummary(info.summary);
+ }
+ pref.setEnabled(info.enabled);
+ pref.setOnClickListener(this);
+ return pref;
+ }
}
import android.content.pm.PackageInfo;
import android.content.Context;
import android.support.annotation.VisibleForTesting;
+import android.text.TextUtils;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
List<ApplicationInfo> pkgs =
getWebViewUpdateServiceWrapper().getValidWebViewApplicationInfos(getContext());
for (ApplicationInfo ai : pkgs) {
- packageInfoList.add(new DefaultAppInfo(ai,
+ packageInfoList.add(createDefaultAppInfo(ai,
getDisabledReason(getWebViewUpdateServiceWrapper(),
getContext(), ai.packageName)));
}
}
}
-
private WebViewUpdateServiceWrapper createDefaultWebViewUpdateServiceWrapper() {
return new WebViewUpdateServiceWrapper();
}
return MetricsEvent.WEBVIEW_IMPLEMENTATION;
}
+ @VisibleForTesting
+ DefaultAppInfo createDefaultAppInfo(
+ ApplicationInfo applicationInfo, String disabledReason) {
+ return new DefaultAppInfo(applicationInfo, disabledReason,
+ TextUtils.isEmpty(disabledReason) /* enabled */);
+ }
+
/**
* 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.
import android.content.pm.ApplicationInfo;
import android.content.pm.UserInfo;
import android.os.UserManager;
+import android.support.v7.preference.PreferenceManager;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
-import com.android.settings.widget.RadioButtonPreference;
import com.android.settings.applications.PackageManagerWrapper;
+import com.android.settings.applications.defaultapps.DefaultAppInfo;
+import com.android.settings.widget.RadioButtonPreference;
import java.util.Arrays;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
private Activity mActivity;
@Mock
private UserManager mUserManager;
- @Mock
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
private PackageManagerWrapper mPackageManager;
private WebViewAppPicker mPicker;
doNothing().when(mPicker).updateCheckedState(any());
doReturn(mActivity).when(mPicker).getActivity();
+ ReflectionHelpers.setField(mPicker, "mPm", mPackageManager);
+
mWvusWrapper = mock(WebViewUpdateServiceWrapper.class);
mPicker.setWebViewUpdateServiceWrapper(mWvusWrapper);
}
}
@Test
+ public void testDisabledPackageShownAsDisabled() {
+ String disabledReason = "disabled";
+ DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(
+ createApplicationInfo(DEFAULT_PACKAGE_NAME), disabledReason);
+
+ RadioButtonPreference mockPreference = mock(RadioButtonPreference.class);
+ mPicker.configurePreferenceFromAppInfo(mockPreference,
+ DEFAULT_PACKAGE_NAME, webviewAppInfo, null, null);
+
+ verify(mockPreference, times(1)).setEnabled(eq(false));
+ verify(mockPreference, never()).setEnabled(eq(true));
+ }
+
+ @Test
+ public void testEnabledPackageShownAsEnabled() {
+ String disabledReason = "";
+ DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(
+ createApplicationInfo(DEFAULT_PACKAGE_NAME), disabledReason);
+
+ RadioButtonPreference mockPreference = mock(RadioButtonPreference.class);
+ mPicker.configurePreferenceFromAppInfo(mockPreference,
+ DEFAULT_PACKAGE_NAME, webviewAppInfo, null, null);
+
+ verify(mockPreference, times(1)).setEnabled(eq(true));
+ verify(mockPreference, never()).setEnabled(eq(false));
+ }
+
+ @Test
+ public void testDisabledPackageShowsDisabledReasonSummary() {
+ String disabledReason = "disabled";
+ DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(
+ createApplicationInfo(DEFAULT_PACKAGE_NAME), disabledReason);
+
+ RadioButtonPreference mockPreference = mock(RadioButtonPreference.class);
+ mPicker.configurePreferenceFromAppInfo(mockPreference,
+ DEFAULT_PACKAGE_NAME, webviewAppInfo, null, null);
+
+ verify(mockPreference, times(1)).setSummary(eq(disabledReason));
+ // Ensure we haven't called setSummary several times.
+ verify(mockPreference, times(1)).setSummary(any());
+ }
+
+ @Test
+ public void testEnabledPackageShowsEmptySummary() {
+ String disabledReason = null;
+ DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(
+ createApplicationInfo(DEFAULT_PACKAGE_NAME), disabledReason);
+
+ RadioButtonPreference mockPreference = mock(RadioButtonPreference.class);
+ mPicker.configurePreferenceFromAppInfo(mockPreference,
+ DEFAULT_PACKAGE_NAME, webviewAppInfo, null, null);
+
+ verify(mockPreference, never()).setSummary(any());
+ }
+
+ @Test
public void testFinishIfNotAdmin() {
doReturn(false).when(mUserManager).isAdminUser();
mPicker.onAttach((Context) mActivity);