Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 288cb409 authored by Dongzhuo Zhang's avatar Dongzhuo Zhang Committed by Android (Google) Code Review
Browse files

Merge "Few update on contacts storage settings. 1. Add account preference...

Merge "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." into main
parents 5585690b 2f16e582
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -13781,9 +13781,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] -->
+6 −0
Original line number Diff line number Diff line
@@ -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"
+3 −0
Original line number Diff line number Diff line
@@ -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
+20 −10
Original line number Diff line number Diff line
@@ -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);
+28 −18
Original line number Diff line number Diff line
@@ -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");