From 2f16e5824e3bd2cc8189fdf4b5ecdb9df861ce34 Mon Sep 17 00:00:00 2001 From: Dongzhuo Zhang Date: Tue, 5 Nov 2024 23:25:02 +0000 Subject: [PATCH] Few update on contacts storage settings. 1. Add account preference category to contacts storage settings page 2. Preload account icon in settings constructor 3. Re-fetch account in controller to refresh the default account after user sets a different default account. Test: atest SettingsRoboTests:com.android.settings.applications.contacts.ContactsStorageSettingsTest atest SettingsRoboTests:com.android.settings.applications.contacts.ContactsStoragePreferenceControllerTest Bug: 368641291 Flag: android.provider.new_default_account_api_enabled Change-Id: I3ca2a7a0905118c7a3a47fe4573781ae86c246bd --- res/values/strings.xml | 5 +- res/xml/contacts_storage_settings.xml | 6 +++ .../ContactsStoragePreferenceController.java | 3 ++ .../contacts/ContactsStorageSettings.java | 30 ++++++++---- .../contacts/ContactsStorageSettingsTest.java | 46 +++++++++++-------- 5 files changed, 61 insertions(+), 29 deletions(-) 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");