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
This commit is contained in:
@@ -13779,9 +13779,12 @@
|
||||
<string name="contacts_storage_no_account_set_summary">No default set</string>
|
||||
<!-- Text for displaying when default account is set as local only [CHAR LIMIT=50] -->
|
||||
<string name="contacts_storage_local_account_summary">Device only</string>
|
||||
<!-- Text for displaying eligible account preference title [CHAR LIMIT=50] -->
|
||||
<string name="contacts_storage_account_title">Device and %1$s</string>
|
||||
<!-- Text for add account selection message when no account has been added [CHAR LIMIT=100] -->
|
||||
<string name="contacts_storage_first_time_add_account_message">Add an account to get started</string>
|
||||
|
||||
<!-- Text for account preference category title for contacts storage settings page [CHAR LIMIT=100] -->
|
||||
<string name="contacts_storage_account_category_title">Where to save contacts</string>
|
||||
<!-- Circle to Search (shared between all entrypoints) -->
|
||||
<!-- Name of Google's new feature to circle to search anything on your phone screen,
|
||||
without switching apps. Also used as the setting title. [CHAR LIMIT=60] -->
|
||||
|
@@ -22,6 +22,12 @@
|
||||
<com.android.settingslib.widget.TopIntroPreference
|
||||
android:title="@string/contacts_storage_selection_message" />
|
||||
|
||||
<PreferenceCategory
|
||||
android:key="account_category"
|
||||
android:persistent="false"
|
||||
android:title="@string/contacts_storage_account_category_title">
|
||||
</PreferenceCategory>
|
||||
|
||||
<com.android.settingslib.widget.SelectorWithWidgetPreference
|
||||
android:key="device_only_account_preference"
|
||||
android:summary="@string/contacts_storage_device_only_preference_summary"
|
||||
|
@@ -61,6 +61,9 @@ public class ContactsStoragePreferenceController extends BasePreferenceControlle
|
||||
@Override
|
||||
public CharSequence getSummary() {
|
||||
if (mCurrentDefaultAccountAndState != null) {
|
||||
// Re-fetch account in controller to refresh the latest set default account.
|
||||
mCurrentDefaultAccountAndState =
|
||||
DefaultAccount.getDefaultAccountForNewContacts(mContext.getContentResolver());
|
||||
int currentDefaultAccountState = mCurrentDefaultAccountAndState.getState();
|
||||
Account currentDefaultAccount = mCurrentDefaultAccountAndState.getAccount();
|
||||
if (currentDefaultAccountState
|
||||
|
@@ -25,6 +25,7 @@ import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Bundle;
|
||||
import android.os.UserHandle;
|
||||
import android.provider.ContactsContract.RawContacts.DefaultAccount.DefaultAccountAndState;
|
||||
@@ -36,7 +37,7 @@ import androidx.annotation.Nullable;
|
||||
import androidx.annotation.UiThread;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.Preference.OnPreferenceClickListener;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
import androidx.preference.PreferenceGroup;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.settings.R;
|
||||
@@ -63,6 +64,7 @@ public class ContactsStorageSettings extends DashboardFragment
|
||||
private static final String TAG = "ContactsStorageSettings";
|
||||
private static final String PREF_KEY_ADD_ACCOUNT = "add_account";
|
||||
private static final String PREF_KEY_DEVICE_ONLY = "device_only_account_preference";
|
||||
private static final String PREF_KEY_ACCOUNT_CATEGORY = "account_category";
|
||||
private final Map<String, DefaultAccountAndState> 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<Account> 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);
|
||||
|
@@ -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");
|
||||
|
Reference in New Issue
Block a user