Rollback decision to merge by package name

At the moment settings aggregates by
package name and it has been decided that
we should do per-service instead.

Test: atest & manual
Bug: 278598419
Change-Id: I6b7c8adac4957f1c3382044208e1642d0b6e3fab
This commit is contained in:
Becca Hughes
2023-04-17 21:48:16 +00:00
parent 92e0bf9b1f
commit ca542c90cd
2 changed files with 132 additions and 195 deletions

View File

@@ -22,11 +22,9 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Activity;
import android.app.Dialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.content.res.Resources;
@@ -81,10 +79,10 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
private final PackageManager mPm;
private final IconDrawableFactory mIconFactory;
private final List<CredentialProviderInfo> mServices;
private final Set<String> mEnabledPackageNames;
private final Set<ServiceInfo> mEnabledServiceInfos;
private final @Nullable CredentialManager mCredentialManager;
private final Executor mExecutor;
private final Map<String, SwitchPreference> mPrefs = new HashMap<>(); // key is package name
private final Map<ServiceInfo, SwitchPreference> mPrefs = new HashMap<>();
private final List<ServiceInfo> mPendingServiceInfos = new ArrayList<>();
private @Nullable FragmentManager mFragmentManager = null;
@@ -96,7 +94,7 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
mPm = context.getPackageManager();
mIconFactory = IconDrawableFactory.newInstance(mContext);
mServices = new ArrayList<>();
mEnabledPackageNames = new HashSet<>();
mEnabledServiceInfos = new HashSet<>();
mExecutor = ContextCompat.getMainExecutor(mContext);
mCredentialManager =
getCredentialManager(context, preferenceKey.equals("credentials_test"));
@@ -213,20 +211,18 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
}
ServiceInfo serviceInfo = pendingServiceInfos.get(0);
ApplicationInfo appInfo = serviceInfo.applicationInfo;
CharSequence appName = "";
if (appInfo.nonLocalizedLabel != null) {
appName = appInfo.loadLabel(mPm);
CharSequence serviceLabel = "";
if (serviceInfo.nonLocalizedLabel != null) {
serviceLabel = serviceInfo.loadLabel(mPm);
}
// Stop if there is no name.
if (TextUtils.isEmpty(appName)) {
// Stop if there is no service label.
if (TextUtils.isEmpty(serviceLabel)) {
return;
}
NewProviderConfirmationDialogFragment fragment =
newNewProviderConfirmationDialogFragment(
serviceInfo.packageName, appName, /* setActivityResult= */ true);
newNewProviderConfirmationDialogFragment(serviceInfo, serviceLabel, /* setActivityResult= */ true);
if (fragment == null || mFragmentManager == null) {
return;
}
@@ -259,15 +255,15 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
// If there is a pending dialog then show it.
handleIntent();
mEnabledPackageNames.clear();
mEnabledServiceInfos.clear();
for (CredentialProviderInfo cpi : availableServices) {
if (cpi.isEnabled()) {
mEnabledPackageNames.add(cpi.getServiceInfo().packageName);
mEnabledServiceInfos.add(cpi.getServiceInfo());
}
}
for (String packageName : mPrefs.keySet()) {
mPrefs.get(packageName).setChecked(mEnabledPackageNames.contains(packageName));
for (ServiceInfo serviceInfo : mPrefs.keySet()) {
mPrefs.get(serviceInfo).setChecked(mEnabledServiceInfos.contains(serviceInfo));
}
}
@@ -349,28 +345,15 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
/** Aggregates the list of services and builds a list of UI prefs to show. */
@VisibleForTesting
public Map<String, SwitchPreference> buildPreferenceList(
public Map<ServiceInfo, SwitchPreference> buildPreferenceList(
Context context, PreferenceGroup group) {
// Group the services by package name.
Map<String, List<CredentialProviderInfo>> groupedInfos = new HashMap<>();
for (CredentialProviderInfo cpi : mServices) {
String packageName = cpi.getServiceInfo().packageName;
if (!groupedInfos.containsKey(packageName)) {
groupedInfos.put(packageName, new ArrayList<>());
}
groupedInfos.get(packageName).add(cpi);
}
// Build the pref list.
Map<String, SwitchPreference> output = new HashMap<>();
for (String packageName : groupedInfos.keySet()) {
List<CredentialProviderInfo> infos = groupedInfos.get(packageName);
SwitchPreference pref = createPreference(context, groupedInfos.get(packageName));
if (pref != null) {
output.put(packageName, pref);
group.addPreference(pref);
}
Map<ServiceInfo, SwitchPreference> output = new HashMap<>();
for (CredentialProviderInfo service : mServices) {
// Build the pref and add it to the output & group.
SwitchPreference pref = createPreference(mContext, service);
output.put(service.getServiceInfo(), pref);
group.addPreference(pref);
}
return output;
@@ -378,63 +361,55 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
/** Creates a preference object based on the provider info. */
@VisibleForTesting
public @Nullable SwitchPreference createPreference(
Context context, List<CredentialProviderInfo> infos) {
final CredentialProviderInfo firstInfo = infos.get(0);
final ServiceInfo firstServiceInfo = firstInfo.getServiceInfo();
final String packageName = firstServiceInfo.packageName;
CharSequence title = firstInfo.getLabel(context);
Drawable icon = firstInfo.getServiceIcon(context);
public SwitchPreference createPreference(Context context, CredentialProviderInfo service) {
final String packageName = service.getServiceInfo().packageName;
CharSequence label = service.getLabel(context);
if (infos.size() > 1) {
// If there is more than one then group them under the package.
ApplicationInfo appInfo = firstServiceInfo.applicationInfo;
if (appInfo.nonLocalizedLabel != null) {
title = appInfo.loadLabel(mPm);
}
icon = mIconFactory.getBadgedIcon(appInfo, getUser());
}
// If there is no title then show the package manager.
if (TextUtils.isEmpty(title)) {
title = firstServiceInfo.packageName;
// If there is no label then show the package name.
if (label == null || TextUtils.isEmpty(label)) {
label = packageName;
}
return addProviderPreference(
context, title, icon, packageName, firstInfo.getSettingsSubtitle());
context,
label,
service.getServiceIcon(mContext),
packageName,
service.getSettingsSubtitle(),
service.getServiceInfo());
}
/**
* Enables the package name as an enabled credential manager provider.
* Enables the service as an enabled credential manager provider.
*
* @param packageName the package name to enable
* @param service the service to enable
*/
@VisibleForTesting
public boolean togglePackageNameEnabled(String packageName) {
if (mEnabledPackageNames.size() >= MAX_SELECTABLE_PROVIDERS) {
public boolean toggleServiceInfoEnabled(ServiceInfo service) {
if (mEnabledServiceInfos.size() >= MAX_SELECTABLE_PROVIDERS) {
return false;
} else {
mEnabledPackageNames.add(packageName);
commitEnabledPackages();
mEnabledServiceInfos.add(service);
commitEnabledServices();
return true;
}
}
/**
* Disables the package name as a credential manager provider.
* Disables the service as a credential manager provider.
*
* @param packageName the package name to disable
* @param service the service to disable
*/
@VisibleForTesting
public void togglePackageNameDisabled(String packageName) {
mEnabledPackageNames.remove(packageName);
commitEnabledPackages();
public void toggleServiceInfoDisabled(ServiceInfo service) {
mEnabledServiceInfos.remove(service);
commitEnabledServices();
}
/** Returns the enabled credential manager provider package names. */
@VisibleForTesting
public Set<String> getEnabledProviders() {
return mEnabledPackageNames;
public Set<ServiceInfo> getEnabledProviders() {
return mEnabledServiceInfos;
}
/**
@@ -445,11 +420,8 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
public List<String> getEnabledSettings() {
// Get all the component names that match the enabled package names.
List<String> enabledServices = new ArrayList<>();
for (CredentialProviderInfo service : mServices) {
ComponentName cn = service.getServiceInfo().getComponentName();
if (mEnabledPackageNames.contains(service.getServiceInfo().packageName)) {
enabledServices.add(cn.flattenToString());
}
for (ServiceInfo service : mEnabledServiceInfos) {
enabledServices.add(service.getComponentName().flattenToString());
}
return enabledServices;
@@ -460,10 +432,11 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
@NonNull CharSequence title,
@Nullable Drawable icon,
@NonNull String packageName,
@Nullable CharSequence subtitle) {
@Nullable CharSequence subtitle,
@NonNull ServiceInfo service) {
final SwitchPreference pref = new SwitchPreference(prefContext);
pref.setTitle(title);
pref.setChecked(mEnabledPackageNames.contains(packageName));
pref.setChecked(mEnabledServiceInfos.contains(service));
if (icon != null) {
pref.setIcon(Utils.getSafeIcon(icon));
@@ -482,7 +455,7 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
// dialog box.
NewProviderConfirmationDialogFragment fragment =
newNewProviderConfirmationDialogFragment(
packageName, title, /* setActivityResult= */ false);
service, title, /* setActivityResult= */ false);
if (fragment == null || mFragmentManager == null) {
return true;
}
@@ -492,9 +465,9 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
return true;
} else {
// If we are disabling the last enabled provider then show a warning.
if (mEnabledPackageNames.size() <= 1) {
if (mEnabledServiceInfos.size() <= 1) {
final DialogFragment fragment =
newConfirmationDialogFragment(packageName, title, pref);
newConfirmationDialogFragment(service, title, pref);
if (fragment == null || mFragmentManager == null) {
return true;
@@ -502,7 +475,7 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
fragment.show(mFragmentManager, ConfirmationDialogFragment.TAG);
} else {
togglePackageNameDisabled(packageName);
toggleServiceInfoDisabled(service);
}
}
@@ -512,7 +485,7 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
return pref;
}
private void commitEnabledPackages() {
private void commitEnabledServices() {
// Commit using the CredMan API.
if (mCredentialManager == null) {
return;
@@ -539,30 +512,28 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
/** Create the new provider confirmation dialog. */
private @Nullable NewProviderConfirmationDialogFragment
newNewProviderConfirmationDialogFragment(
@NonNull String packageName,
@NonNull ServiceInfo service,
@NonNull CharSequence appName,
boolean setActivityResult) {
DialogHost host =
new DialogHost() {
@Override
public void onDialogClick(int whichButton) {
completeEnableProviderDialogBox(
whichButton, packageName, setActivityResult);
completeEnableProviderDialogBox(whichButton, service, setActivityResult);
}
};
return new NewProviderConfirmationDialogFragment(host, packageName, appName);
return new NewProviderConfirmationDialogFragment(host, service, appName);
}
@VisibleForTesting
void completeEnableProviderDialogBox(
int whichButton, String packageName, boolean setActivityResult) {
void completeEnableProviderDialogBox(int whichButton, ServiceInfo service, boolean setActivityResult) {
int activityResult = -1;
if (whichButton == DialogInterface.BUTTON_POSITIVE) {
if (togglePackageNameEnabled(packageName)) {
if (toggleServiceInfoEnabled(service)) {
// Enable all prefs.
if (mPrefs.containsKey(packageName)) {
mPrefs.get(packageName).setChecked(true);
if (mPrefs.containsKey(service)) {
mPrefs.get(service).setChecked(true);
}
activityResult = Activity.RESULT_OK;
} else {
@@ -601,7 +572,7 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
}
private @Nullable ConfirmationDialogFragment newConfirmationDialogFragment(
@NonNull String packageName,
@NonNull ServiceInfo service,
@NonNull CharSequence appName,
@NonNull SwitchPreference pref) {
DialogHost host =
@@ -611,7 +582,7 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
if (whichButton == DialogInterface.BUTTON_POSITIVE) {
// Since the package is now enabled then we
// should remove it from the enabled list.
togglePackageNameDisabled(packageName);
toggleServiceInfoDisabled(service);
} else if (whichButton == DialogInterface.BUTTON_NEGATIVE) {
// Set the checked back to true because we
// backed out of turning this off.
@@ -620,7 +591,7 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
}
};
return new ConfirmationDialogFragment(host, packageName, appName);
return new ConfirmationDialogFragment(host, service, appName);
}
private int getUser() {
@@ -685,11 +656,13 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
public static class ConfirmationDialogFragment extends CredentialManagerDialogFragment {
ConfirmationDialogFragment(
DialogHost dialogHost, @NonNull String packageName, @NonNull CharSequence appName) {
DialogHost dialogHost,
@NonNull ServiceInfo serviceInfo,
@NonNull CharSequence appName) {
super(dialogHost);
final Bundle argument = new Bundle();
argument.putString(PACKAGE_NAME_KEY, packageName);
argument.putString(PACKAGE_NAME_KEY, serviceInfo.packageName);
argument.putCharSequence(APP_NAME_KEY, appName);
setArguments(argument);
}
@@ -726,11 +699,13 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
extends CredentialManagerDialogFragment {
NewProviderConfirmationDialogFragment(
DialogHost dialogHost, @NonNull String packageName, @NonNull CharSequence appName) {
DialogHost dialogHost,
@NonNull ServiceInfo service,
@NonNull CharSequence appName) {
super(dialogHost);
final Bundle argument = new Bundle();
argument.putString(PACKAGE_NAME_KEY, packageName);
argument.putString(PACKAGE_NAME_KEY, service.packageName);
argument.putCharSequence(APP_NAME_KEY, appName);
setArguments(argument);
}

View File

@@ -54,7 +54,6 @@ import org.junit.runner.RunWith;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
@@ -191,20 +190,20 @@ public class CredentialManagerPreferenceControllerTest {
assertThat(controller.getEnabledProviders().size()).isEqualTo(0);
// Toggle one provider and make sure it worked.
assertThat(controller.togglePackageNameEnabled("com.android.provider1")).isTrue();
Set<String> enabledProviders = controller.getEnabledProviders();
assertThat(controller.toggleServiceInfoEnabled(providerInfo1.getServiceInfo())).isTrue();
Set<ServiceInfo> enabledProviders = controller.getEnabledProviders();
assertThat(enabledProviders.size()).isEqualTo(1);
assertThat(enabledProviders.contains("com.android.provider1")).isTrue();
assertThat(enabledProviders.contains(providerInfo1.getServiceInfo())).isTrue();
// Create the pref (checked).
SwitchPreference pref = controller.createPreference(mContext, Arrays.asList(providerInfo1));
SwitchPreference pref = controller.createPreference(mContext, providerInfo1);
assertThat(pref.getTitle().toString()).isEqualTo("Service Title");
assertThat(pref.isChecked()).isTrue();
assertThat(pref.getSummary()).isNull();
// Create the pref (not checked).
SwitchPreference pref2 =
controller.createPreference(mContext, Arrays.asList(providerInfo2));
controller.createPreference(mContext, providerInfo2);
assertThat(pref2.getTitle().toString()).isEqualTo("Service Title");
assertThat(pref2.isChecked()).isFalse();
assertThat(pref2.getSummary().toString()).isEqualTo("Summary Text");
@@ -212,6 +211,14 @@ public class CredentialManagerPreferenceControllerTest {
@Test
public void getAvailabilityStatus_handlesToggleAndSave() {
ServiceInfo providerService1a = createServiceInfo("com.android.provider1", "ClassA");
ServiceInfo providerService1b = createServiceInfo("com.android.provider1", "ClassB");
ServiceInfo providerService2 = createServiceInfo("com.android.provider2", "ClassA");
ServiceInfo providerService3 = createServiceInfo("com.android.provider3", "ClassA");
ServiceInfo providerService4 = createServiceInfo("com.android.provider4", "ClassA");
ServiceInfo providerService5 = createServiceInfo("com.android.provider5", "ClassA");
ServiceInfo providerService6 = createServiceInfo("com.android.provider6", "ClassA");
CredentialManagerPreferenceController controller =
createControllerWithServices(
Lists.newArrayList(
@@ -226,28 +233,28 @@ public class CredentialManagerPreferenceControllerTest {
assertThat(controller.isConnected()).isFalse();
// Ensure that we stay under 5 providers.
assertThat(controller.togglePackageNameEnabled("com.android.provider1")).isTrue();
assertThat(controller.togglePackageNameEnabled("com.android.provider2")).isTrue();
assertThat(controller.togglePackageNameEnabled("com.android.provider3")).isTrue();
assertThat(controller.togglePackageNameEnabled("com.android.provider4")).isTrue();
assertThat(controller.togglePackageNameEnabled("com.android.provider5")).isTrue();
assertThat(controller.togglePackageNameEnabled("com.android.provider6")).isFalse();
assertThat(controller.toggleServiceInfoEnabled(providerService1a)).isTrue();
assertThat(controller.toggleServiceInfoEnabled(providerService2)).isTrue();
assertThat(controller.toggleServiceInfoEnabled(providerService3)).isTrue();
assertThat(controller.toggleServiceInfoEnabled(providerService4)).isTrue();
assertThat(controller.toggleServiceInfoEnabled(providerService5)).isTrue();
assertThat(controller.toggleServiceInfoEnabled(providerService6)).isFalse();
// Check that they are all actually registered.
Set<String> enabledProviders = controller.getEnabledProviders();
Set<ServiceInfo> enabledProviders = controller.getEnabledProviders();
assertThat(enabledProviders.size()).isEqualTo(5);
assertThat(enabledProviders.contains("com.android.provider1")).isTrue();
assertThat(enabledProviders.contains("com.android.provider2")).isTrue();
assertThat(enabledProviders.contains("com.android.provider3")).isTrue();
assertThat(enabledProviders.contains("com.android.provider4")).isTrue();
assertThat(enabledProviders.contains("com.android.provider5")).isTrue();
assertThat(enabledProviders.contains("com.android.provider6")).isFalse();
assertThat(enabledProviders.contains(providerService1a)).isTrue();
assertThat(enabledProviders.contains(providerService2)).isTrue();
assertThat(enabledProviders.contains(providerService3)).isTrue();
assertThat(enabledProviders.contains(providerService4)).isTrue();
assertThat(enabledProviders.contains(providerService5)).isTrue();
assertThat(enabledProviders.contains(providerService6)).isFalse();
// Check that the settings string has the right component names.
List<String> enabledServices = controller.getEnabledSettings();
assertThat(enabledServices.size()).isEqualTo(6);
assertThat(enabledServices.size()).isEqualTo(5);
assertThat(enabledServices.contains("com.android.provider1/ClassA")).isTrue();
assertThat(enabledServices.contains("com.android.provider1/ClassB")).isTrue();
assertThat(enabledServices.contains("com.android.provider1/ClassB")).isFalse();
assertThat(enabledServices.contains("com.android.provider2/ClassA")).isTrue();
assertThat(enabledServices.contains("com.android.provider3/ClassA")).isTrue();
assertThat(enabledServices.contains("com.android.provider4/ClassA")).isTrue();
@@ -255,23 +262,24 @@ public class CredentialManagerPreferenceControllerTest {
assertThat(enabledServices.contains("com.android.provider6/ClassA")).isFalse();
// Toggle the provider disabled.
controller.togglePackageNameDisabled("com.android.provider2");
controller.toggleServiceInfoDisabled(providerService2);
// Check that the provider was removed from the list of providers.
Set<String> currentlyEnabledProviders = controller.getEnabledProviders();
Set<ServiceInfo> currentlyEnabledProviders = controller.getEnabledProviders();
assertThat(currentlyEnabledProviders.size()).isEqualTo(4);
assertThat(currentlyEnabledProviders.contains("com.android.provider1")).isTrue();
assertThat(currentlyEnabledProviders.contains("com.android.provider2")).isFalse();
assertThat(currentlyEnabledProviders.contains("com.android.provider3")).isTrue();
assertThat(currentlyEnabledProviders.contains("com.android.provider4")).isTrue();
assertThat(currentlyEnabledProviders.contains("com.android.provider5")).isTrue();
assertThat(currentlyEnabledProviders.contains("com.android.provider6")).isFalse();
assertThat(enabledProviders.contains(providerService1a)).isTrue();
assertThat(enabledProviders.contains(providerService2)).isFalse();
assertThat(enabledProviders.contains(providerService3)).isTrue();
assertThat(enabledProviders.contains(providerService4)).isTrue();
assertThat(enabledProviders.contains(providerService5)).isTrue();
assertThat(enabledProviders.contains(providerService6)).isFalse();
// Check that the provider was removed from the list of services stored in the setting.
List<String> currentlyEnabledServices = controller.getEnabledSettings();
assertThat(currentlyEnabledServices.size()).isEqualTo(5);
assertThat(currentlyEnabledServices.size()).isEqualTo(4);
assertThat(currentlyEnabledServices.contains("com.android.provider1/ClassA")).isTrue();
assertThat(currentlyEnabledServices.contains("com.android.provider1/ClassB")).isTrue();
assertThat(currentlyEnabledServices.contains("com.android.provider1/ClassB")).isFalse();
assertThat(currentlyEnabledServices.contains("com.android.provider2/ClassA")).isFalse();
assertThat(currentlyEnabledServices.contains("com.android.provider3/ClassA")).isTrue();
assertThat(currentlyEnabledServices.contains("com.android.provider4/ClassA")).isTrue();
assertThat(currentlyEnabledServices.contains("com.android.provider5/ClassA")).isTrue();
@@ -280,6 +288,8 @@ public class CredentialManagerPreferenceControllerTest {
@Test
public void handlesCredentialProviderInfoEnabledDisabled() {
ServiceInfo providerService1 = createServiceInfo("com.android.provider1", "ClassA");
ServiceInfo providerService2 = createServiceInfo("com.android.provider2", "ClassA");
CredentialProviderInfo providerInfo1 =
createCredentialProviderInfoWithIsEnabled(
"com.android.provider1", "ClassA", "Service Title", false);
@@ -296,10 +306,10 @@ public class CredentialManagerPreferenceControllerTest {
assertThat(providerInfo2.isEnabled()).isTrue();
// Check that they are all actually registered.
Set<String> enabledProviders = controller.getEnabledProviders();
Set<ServiceInfo> enabledProviders = controller.getEnabledProviders();
assertThat(enabledProviders.size()).isEqualTo(1);
assertThat(enabledProviders.contains("com.android.provider1")).isFalse();
assertThat(enabledProviders.contains("com.android.provider2")).isTrue();
assertThat(enabledProviders.contains(providerInfo1.getServiceInfo())).isFalse();
assertThat(enabledProviders.contains(providerInfo2.getServiceInfo())).isTrue();
// Check that the settings string has the right component names.
List<String> enabledServices = controller.getEnabledSettings();
@@ -308,66 +318,6 @@ public class CredentialManagerPreferenceControllerTest {
assertThat(enabledServices.contains("com.android.provider2/ClassA")).isTrue();
}
@Test
public void displayPreference_withServices_preferencesAdded_sameAppShouldBeMerged() {
CredentialProviderInfo serviceA1 =
createCredentialProviderInfoWithAppLabel(
TEST_PACKAGE_NAME_A,
"CredManProviderA1",
TEST_TITLE_APP_A,
"test service A1");
CredentialProviderInfo serviceB1 =
createCredentialProviderInfoWithAppLabel(
TEST_PACKAGE_NAME_B,
"CredManProviderB1",
TEST_TITLE_APP_B,
"test service B");
CredentialProviderInfo serviceC1 =
createCredentialProviderInfoWithAppLabel(
TEST_PACKAGE_NAME_C,
"CredManProviderC1",
"test app C1",
TEST_TITLE_SERVICE_C);
CredentialProviderInfo serviceC2 =
createCredentialProviderInfoWithAppLabel(
TEST_PACKAGE_NAME_C,
"CredManProviderC2",
"test app C2",
TEST_TITLE_SERVICE_C);
CredentialProviderInfo serviceC3 =
createCredentialProviderInfoBuilder(
TEST_PACKAGE_NAME_C,
"CredManProviderC3",
"test app C3",
TEST_TITLE_SERVICE_C)
.setEnabled(true)
.build();
CredentialManagerPreferenceController controller =
createControllerWithServices(
Lists.newArrayList(serviceA1, serviceB1, serviceC1, serviceC2, serviceC3));
controller.displayPreference(mScreen);
assertThat(controller.isConnected()).isFalse();
assertThat(mCredentialsPreferenceCategory.getPreferenceCount()).isEqualTo(3);
Map<String, SwitchPreference> prefs =
controller.buildPreferenceList(mContext, mCredentialsPreferenceCategory);
assertThat(prefs.size()).isEqualTo(3);
SwitchPreference pref1 = prefs.get(TEST_PACKAGE_NAME_A);
assertThat(pref1).isNotNull();
assertThat(pref1.getTitle()).isEqualTo(TEST_TITLE_APP_A);
assertThat(pref1.isChecked()).isFalse();
SwitchPreference pref2 = prefs.get(TEST_PACKAGE_NAME_B);
assertThat(pref2).isNotNull();
assertThat(pref2.getTitle()).isEqualTo(TEST_TITLE_APP_B);
assertThat(pref2.isChecked()).isFalse();
SwitchPreference pref3 = prefs.get(TEST_PACKAGE_NAME_C);
assertThat(pref3).isNotNull();
assertThat(pref3.getTitle()).isEqualTo(TEST_TITLE_SERVICE_C);
assertThat(pref3.isChecked()).isTrue();
}
@Test
public void handleIntentWithProviderServiceInfo_handleBadIntent_missingData() {
CredentialProviderInfo cpi = createCredentialProviderInfo();
@@ -390,7 +340,8 @@ public class CredentialManagerPreferenceControllerTest {
Intent intent = new Intent(Settings.ACTION_CREDENTIAL_PROVIDER);
intent.setData(Uri.parse("package:" + packageName));
assertThat(controller.verifyReceivedIntent(intent)).isTrue();
controller.completeEnableProviderDialogBox(DialogInterface.BUTTON_POSITIVE, packageName, true);
controller.completeEnableProviderDialogBox(
DialogInterface.BUTTON_POSITIVE, cpi.getServiceInfo(), true);
assertThat(mReceivedResultCode.get()).isEqualTo(Activity.RESULT_OK);
}
@@ -405,7 +356,7 @@ public class CredentialManagerPreferenceControllerTest {
Intent intent = new Intent(Settings.ACTION_CREDENTIAL_PROVIDER);
intent.setData(Uri.parse("package:" + packageName));
assertThat(controller.verifyReceivedIntent(intent)).isTrue();
controller.completeEnableProviderDialogBox(DialogInterface.BUTTON_NEGATIVE, packageName, true);
controller.completeEnableProviderDialogBox(DialogInterface.BUTTON_NEGATIVE, cpi.getServiceInfo(), true);
assertThat(mReceivedResultCode.get()).isEqualTo(Activity.RESULT_CANCELED);
}
@@ -444,7 +395,8 @@ public class CredentialManagerPreferenceControllerTest {
CredentialManagerPreferenceController controller =
new CredentialManagerPreferenceController(
mContext, mCredentialsPreferenceCategory.getKey());
controller.setAvailableServices(() -> mock(Lifecycle.class), availableServices, addServiceOverride);
controller.setAvailableServices(
() -> mock(Lifecycle.class), availableServices, addServiceOverride);
controller.setDelegate(mDelegate);
return controller;
}
@@ -518,4 +470,14 @@ public class CredentialManagerPreferenceControllerTest {
return new CredentialProviderInfo.Builder(si).setOverrideLabel(serviceLabel);
}
private ServiceInfo createServiceInfo(String packageName, String className) {
ServiceInfo si = new ServiceInfo();
si.packageName = packageName;
si.name = className;
si.applicationInfo = new ApplicationInfo();
si.applicationInfo.packageName = packageName;
return si;
}
}