diff --git a/res/values/strings.xml b/res/values/strings.xml
index e986ce08663..6b409057883 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -13779,9 +13779,12 @@
No default set
Device only
+
+ Device and %1$s
Add an account to get started
-
+
+ Where to save contacts
diff --git a/res/xml/contacts_storage_settings.xml b/res/xml/contacts_storage_settings.xml
index 7cbabe725ce..691a1cc16fd 100644
--- a/res/xml/contacts_storage_settings.xml
+++ b/res/xml/contacts_storage_settings.xml
@@ -22,6 +22,12 @@
+
+
+
mAccountMap = new HashMap<>();
private AuthenticatorHelper mAuthenticatorHelper;
@@ -71,6 +73,12 @@ public class ContactsStorageSettings extends DashboardFragment
super.onAttach(context);
mAuthenticatorHelper = new AuthenticatorHelper(context,
new UserHandle(UserHandle.myUserId()), null);
+ String[] accountTypes = getEligibleAccountTypes();
+ for (String accountType : accountTypes) {
+ // Preload the drawable for the account type to avoid the latency when rendering the
+ // account preference.
+ mAuthenticatorHelper.preloadDrawableForType(context, accountType);
+ }
}
@UiThread
@@ -130,23 +138,24 @@ public class ContactsStorageSettings extends DashboardFragment
// Clear all the accounts stored in the map and later on re-fetch the eligible accounts
// when creating eligible account preferences.
mAccountMap.clear();
- final PreferenceScreen screen = getPreferenceScreen();
+ final PreferenceGroup preferenceGroup = findPreference(PREF_KEY_ACCOUNT_CATEGORY);
// If the default account is SIM, we should show in the page, otherwise don't show.
SelectorWithWidgetPreference simAccountPreference = buildSimAccountPreference();
if (simAccountPreference != null) {
- getPreferenceScreen().addPreference(simAccountPreference);
+ preferenceGroup.addPreference(simAccountPreference);
}
List accounts = DefaultAccount.getEligibleCloudAccounts(getContentResolver());
for (int i = 0; i < accounts.size(); i++) {
- screen.addPreference(buildCloudAccountPreference(accounts.get(i), /*order=*/i));
+ preferenceGroup.addPreference(
+ buildCloudAccountPreference(accounts.get(i), /*order=*/i));
}
// If there's no eligible account types, the "Add Account" preference should
// not be shown to the users.
if (getEligibleAccountTypes().length > 0) {
- screen.addPreference(buildAddAccountPreference(accounts.isEmpty()));
+ getPreferenceScreen().addPreference(buildAddAccountPreference(accounts.isEmpty()));
}
setupDeviceOnlyPreference();
- setDefaultAccountPreference();
+ setDefaultAccountPreference(preferenceGroup);
}
private void setupDeviceOnlyPreference() {
@@ -157,7 +166,7 @@ public class ContactsStorageSettings extends DashboardFragment
}
}
- private void setDefaultAccountPreference() {
+ private void setDefaultAccountPreference(PreferenceGroup preferenceGroup) {
DefaultAccountAndState currentDefaultAccountAndState =
DefaultAccount.getDefaultAccountForNewContacts(getContentResolver());
String preferenceKey = getAccountHashCode(currentDefaultAccountAndState);
@@ -170,20 +179,21 @@ public class ContactsStorageSettings extends DashboardFragment
preference = getPreferenceScreen().findPreference(preferenceKey);
} else if (preferenceKey != null && currentDefaultAccount != null) {
preference = buildCloudAccountPreference(currentDefaultAccount, mAccountMap.size());
- getPreferenceScreen().addPreference(preference);
+ preferenceGroup.addPreference(preference);
}
if (preference != null) {
preference.setChecked(true);
}
}
- //TODO: Add preference category on account preferences.
private SelectorWithWidgetPreference buildCloudAccountPreference(Account account, int order) {
SelectorWithWidgetPreference preference = new SelectorWithWidgetPreference(
getPrefContext());
DefaultAccountAndState accountAndState = DefaultAccountAndState.ofCloud(account);
String preferenceKey = getAccountHashCode(accountAndState);
- preference.setTitle(mAuthenticatorHelper.getLabelForType(getPrefContext(), account.type));
+ String accountPreferenceTitle = getString(R.string.contacts_storage_account_title,
+ mAuthenticatorHelper.getLabelForType(getPrefContext(), account.type));
+ preference.setTitle(accountPreferenceTitle);
preference.setIcon(mAuthenticatorHelper.getDrawableForType(getPrefContext(), account.type));
preference.setSummary(account.name);
preference.setKey(preferenceKey);
diff --git a/tests/robotests/src/com/android/settings/applications/contacts/ContactsStorageSettingsTest.java b/tests/robotests/src/com/android/settings/applications/contacts/ContactsStorageSettingsTest.java
index 4e873fb20ee..a2debd24ee2 100644
--- a/tests/robotests/src/com/android/settings/applications/contacts/ContactsStorageSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/contacts/ContactsStorageSettingsTest.java
@@ -44,6 +44,7 @@ import android.provider.ContactsContract.RawContacts.DefaultAccount.DefaultAccou
import android.provider.SearchIndexableResource;
import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
@@ -73,7 +74,7 @@ import java.util.List;
@Config(shadows = ShadowAuthenticationHelper.class)
public class ContactsStorageSettingsTest {
private static final String PREF_KEY_DEVICE_ONLY = "device_only_account_preference";
-
+ private static final String PREF_KEY_ACCOUNT_CATEGORY = "account_category";
private static final String PREF_KEY_ADD_ACCOUNT = "add_account";
private static final Account TEST_ACCOUNT1 = new Account("test@gmail.com", "type1");
@@ -95,6 +96,7 @@ public class ContactsStorageSettingsTest {
private PreferenceManager mPreferenceManager;
private TestContactsStorageSettings mContactsStorageSettings;
private PreferenceScreen mScreen;
+ private PreferenceGroup accountCategory;
@Before
public void setUp() throws Exception {
@@ -103,8 +105,16 @@ public class ContactsStorageSettingsTest {
eq(ContactsContract.AUTHORITY_URI))).thenReturn(mContentProviderClient);
mPreferenceManager = new PreferenceManager(mContext);
when(mContactsStorageSettings.getPreferenceManager()).thenReturn(mPreferenceManager);
- mScreen = spy(new PreferenceScreen(mContext, /* attrs= */ null));
+ mScreen = spy(mPreferenceManager.inflateFromResource(mContext,
+ R.xml.contacts_storage_settings, mScreen));
when(mScreen.getPreferenceManager()).thenReturn(mPreferenceManager);
+ accountCategory = mScreen.findPreference(PREF_KEY_ACCOUNT_CATEGORY);
+ SelectorWithWidgetPreference deviceOnlyPreference = mScreen.findPreference(
+ PREF_KEY_DEVICE_ONLY);
+ when(mContactsStorageSettings.findPreference(eq(PREF_KEY_DEVICE_ONLY))).thenReturn(
+ deviceOnlyPreference);
+ when(mContactsStorageSettings.findPreference(eq(PREF_KEY_ACCOUNT_CATEGORY))).thenReturn(
+ accountCategory);
when(mContactsStorageSettings.getPreferenceScreen()).thenReturn(mScreen);
mContactsStorageSettings.onAttach(mContext);
}
@@ -134,17 +144,15 @@ public class ContactsStorageSettingsTest {
when(mContentProviderClient.call(eq(QUERY_ELIGIBLE_DEFAULT_ACCOUNTS_METHOD), any(),
any())).thenReturn(eligibleAccountBundle);
- PreferenceScreen settingScreen = mPreferenceManager.inflateFromResource(mContext,
- R.xml.contacts_storage_settings, mScreen);
- SelectorWithWidgetPreference deviceOnlyPreference = settingScreen.findPreference(
+ SelectorWithWidgetPreference deviceOnlyPreference = mContactsStorageSettings.findPreference(
PREF_KEY_DEVICE_ONLY);
- when(mContactsStorageSettings.findPreference(eq(PREF_KEY_DEVICE_ONLY))).thenReturn(
- deviceOnlyPreference);
assertThat(deviceOnlyPreference.getTitle()).isEqualTo("Device only");
assertThat(deviceOnlyPreference.getSummary()).isEqualTo(
"New contacts won't be synced with an account");
assertThat(deviceOnlyPreference.getOrder()).isEqualTo(999);
+ assertThat(mContactsStorageSettings.findPreference(
+ PREF_KEY_ACCOUNT_CATEGORY).getTitle()).isEqualTo("Where to save contacts");
mContactsStorageSettings.refreshUI();
mContactsStorageSettings.onRadioButtonClicked(deviceOnlyPreference);
@@ -175,6 +183,8 @@ public class ContactsStorageSettingsTest {
mContactsStorageSettings.refreshUI();
+ assertThat(mContactsStorageSettings.findPreference(
+ PREF_KEY_ACCOUNT_CATEGORY).getTitle()).isEqualTo("Where to save contacts");
assertThat(mScreen.findPreference(PREF_KEY_ADD_ACCOUNT).getTitle()).isEqualTo(
"Add an account to get started");
assertThat(mScreen.findPreference(PREF_KEY_ADD_ACCOUNT).getOrder()).isEqualTo(998);
@@ -232,15 +242,15 @@ public class ContactsStorageSettingsTest {
mContactsStorageSettings.refreshUI();
- SelectorWithWidgetPreference account1Preference = mScreen.findPreference(
+ SelectorWithWidgetPreference account1Preference = accountCategory.findPreference(
String.valueOf(TEST_ACCOUNT1.hashCode()));
- assertThat(account1Preference.getTitle()).isEqualTo("LABEL1");
+ assertThat(account1Preference.getTitle()).isEqualTo("Device and LABEL1");
assertThat(account1Preference.getSummary()).isEqualTo("test@gmail.com");
assertThat(account1Preference.getIcon()).isNotNull();
- SelectorWithWidgetPreference account2Preference = mScreen.findPreference(
+ SelectorWithWidgetPreference account2Preference = accountCategory.findPreference(
String.valueOf(TEST_ACCOUNT2.hashCode()));
- assertThat(account2Preference.getTitle()).isEqualTo("LABEL2");
+ assertThat(account2Preference.getTitle()).isEqualTo("Device and LABEL2");
assertThat(account2Preference.getSummary()).isEqualTo("test@samsung.com");
assertThat(account2Preference.getIcon()).isNotNull();
@@ -286,21 +296,21 @@ public class ContactsStorageSettingsTest {
mContactsStorageSettings.refreshUI();
- SelectorWithWidgetPreference account1Preference = mScreen.findPreference(
+ SelectorWithWidgetPreference account1Preference = accountCategory.findPreference(
String.valueOf(TEST_ACCOUNT1.hashCode()));
- assertThat(account1Preference.getTitle()).isEqualTo("LABEL1");
+ assertThat(account1Preference.getTitle()).isEqualTo("Device and LABEL1");
assertThat(account1Preference.getSummary()).isEqualTo("test@gmail.com");
assertThat(account1Preference.getIcon()).isNotNull();
- SelectorWithWidgetPreference account2Preference = mScreen.findPreference(
+ SelectorWithWidgetPreference account2Preference = accountCategory.findPreference(
String.valueOf(TEST_ACCOUNT2.hashCode()));
- assertThat(account2Preference.getTitle()).isEqualTo("LABEL2");
+ assertThat(account2Preference.getTitle()).isEqualTo("Device and LABEL2");
assertThat(account2Preference.getSummary()).isEqualTo("test@samsung.com");
assertThat(account2Preference.getIcon()).isNotNull();
- SelectorWithWidgetPreference account3Preference = mScreen.findPreference(
+ SelectorWithWidgetPreference account3Preference = accountCategory.findPreference(
String.valueOf(TEST_ACCOUNT3.hashCode()));
- assertThat(account3Preference.getTitle()).isEqualTo("LABEL3");
+ assertThat(account3Preference.getTitle()).isEqualTo("Device and LABEL3");
assertThat(account3Preference.getSummary()).isEqualTo("test@outlook.com");
assertThat(account3Preference.getIcon()).isNotNull();
@@ -327,7 +337,7 @@ public class ContactsStorageSettingsTest {
mContactsStorageSettings.refreshUI();
- SelectorWithWidgetPreference simPreference = mScreen.findPreference(
+ SelectorWithWidgetPreference simPreference = accountCategory.findPreference(
String.valueOf(SIM_ACCOUNT.hashCode()));
assertThat(simPreference.getTitle()).isEqualTo("SIM");
assertThat(simPreference.getSummary()).isEqualTo("SIM");