Refactor ContactPreference
Moving it outside contacts.commons reduces dependency to legacy code. Also removed redundant implementations such as caching SharedPreferences (it is already cached), custom ListPreferences (standard ListPreferences already have what we want), and corrected preference storage location (allow standard ListPreferences to work)
TEST=TAP
Test: TAP
PiperOrigin-RevId: 202000393
Change-Id: I45374e610b3510784b5a4da92e5d8462cbfc92bb
diff --git a/java/com/android/contacts/common/list/ContactEntry.java b/java/com/android/contacts/common/list/ContactEntry.java
index e33165e..90e6735 100644
--- a/java/com/android/contacts/common/list/ContactEntry.java
+++ b/java/com/android/contacts/common/list/ContactEntry.java
@@ -16,25 +16,19 @@
package com.android.contacts.common.list;
+import android.content.Context;
import android.net.Uri;
import android.provider.ContactsContract.PinnedPositions;
-import android.text.TextUtils;
-import com.android.contacts.common.preference.ContactsPreferences;
+import com.android.dialer.contacts.ContactsComponent;
/** Class to hold contact information */
public class ContactEntry {
public static final ContactEntry BLANK_ENTRY = new ContactEntry();
- private static final int UNSET_DISPLAY_ORDER_PREFERENCE = -1;
/** Primary name for a Contact */
public String namePrimary;
/** Alternative name for a Contact, e.g. last name first */
public String nameAlternative;
- /**
- * The user's preference on name display order, last name first or first time first. {@see
- * ContactsPreferences}
- */
- public int nameDisplayOrder = UNSET_DISPLAY_ORDER_PREFERENCE;
public String phoneLabel;
public String phoneNumber;
@@ -46,12 +40,9 @@
public boolean isFavorite = false;
public boolean isDefaultNumber = false;
- public String getPreferredDisplayName() {
- if (nameDisplayOrder == UNSET_DISPLAY_ORDER_PREFERENCE
- || nameDisplayOrder == ContactsPreferences.DISPLAY_ORDER_PRIMARY
- || TextUtils.isEmpty(nameAlternative)) {
- return namePrimary;
- }
- return nameAlternative;
+ public String getPreferredDisplayName(Context context) {
+ return ContactsComponent.get(context)
+ .contactDisplayPreferences()
+ .getDisplayName(namePrimary, nameAlternative);
}
}
diff --git a/java/com/android/contacts/common/preference/ContactsPreferences.java b/java/com/android/contacts/common/preference/ContactsPreferences.java
deleted file mode 100644
index d0adb04..0000000
--- a/java/com/android/contacts/common/preference/ContactsPreferences.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.common.preference;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.Editor;
-import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
-import android.os.Handler;
-import android.preference.PreferenceManager;
-import android.provider.Settings;
-import android.provider.Settings.SettingNotFoundException;
-import android.text.TextUtils;
-import com.android.contacts.common.R;
-import com.android.contacts.common.model.account.AccountWithDataSet;
-import com.android.dialer.strictmode.StrictModeUtils;
-
-/** Manages user preferences for contacts. */
-public class ContactsPreferences implements OnSharedPreferenceChangeListener {
-
- /** The value for the DISPLAY_ORDER key to show the given name first. */
- public static final int DISPLAY_ORDER_PRIMARY = 1;
-
- /** The value for the DISPLAY_ORDER key to show the family name first. */
- public static final int DISPLAY_ORDER_ALTERNATIVE = 2;
-
- public static final String DISPLAY_ORDER_KEY = "android.contacts.DISPLAY_ORDER";
-
- /** The value for the SORT_ORDER key corresponding to sort by given name first. */
- public static final int SORT_ORDER_PRIMARY = 1;
-
- public static final String SORT_ORDER_KEY = "android.contacts.SORT_ORDER";
-
- /** The value for the SORT_ORDER key corresponding to sort by family name first. */
- public static final int SORT_ORDER_ALTERNATIVE = 2;
-
- public static final String PREF_DISPLAY_ONLY_PHONES = "only_phones";
-
- public static final boolean PREF_DISPLAY_ONLY_PHONES_DEFAULT = false;
-
- /**
- * Value to use when a preference is unassigned and needs to be read from the shared preferences
- */
- private static final int PREFERENCE_UNASSIGNED = -1;
-
- private final Context mContext;
- private final SharedPreferences mPreferences;
- private int mSortOrder = PREFERENCE_UNASSIGNED;
- private int mDisplayOrder = PREFERENCE_UNASSIGNED;
- private String mDefaultAccount = null;
- private ChangeListener mListener = null;
- private Handler mHandler;
- private String mDefaultAccountKey;
- private String mDefaultAccountSavedKey;
-
- public ContactsPreferences(Context context) {
- mContext = context;
- mHandler = new Handler();
- mPreferences =
- mContext
- .getApplicationContext()
- .getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE);
- mDefaultAccountKey =
- mContext.getResources().getString(R.string.contact_editor_default_account_key);
- mDefaultAccountSavedKey =
- mContext.getResources().getString(R.string.contact_editor_anything_saved_key);
- maybeMigrateSystemSettings();
- }
-
- private boolean isSortOrderUserChangeable() {
- return mContext.getResources().getBoolean(R.bool.config_sort_order_user_changeable);
- }
-
- private int getDefaultSortOrder() {
- if (mContext.getResources().getBoolean(R.bool.config_default_sort_order_primary)) {
- return SORT_ORDER_PRIMARY;
- } else {
- return SORT_ORDER_ALTERNATIVE;
- }
- }
-
- public int getSortOrder() {
- if (!isSortOrderUserChangeable()) {
- return getDefaultSortOrder();
- }
- if (mSortOrder == PREFERENCE_UNASSIGNED) {
- mSortOrder = mPreferences.getInt(SORT_ORDER_KEY, getDefaultSortOrder());
- }
- return mSortOrder;
- }
-
- public void setSortOrder(int sortOrder) {
- mSortOrder = sortOrder;
- final Editor editor = mPreferences.edit();
- editor.putInt(SORT_ORDER_KEY, sortOrder);
- StrictModeUtils.bypass(editor::commit);
- }
-
- private boolean isDisplayOrderUserChangeable() {
- return mContext.getResources().getBoolean(R.bool.config_display_order_user_changeable);
- }
-
- private int getDefaultDisplayOrder() {
- if (mContext.getResources().getBoolean(R.bool.config_default_display_order_primary)) {
- return DISPLAY_ORDER_PRIMARY;
- } else {
- return DISPLAY_ORDER_ALTERNATIVE;
- }
- }
-
- public int getDisplayOrder() {
- if (!isDisplayOrderUserChangeable()) {
- return getDefaultDisplayOrder();
- }
- if (mDisplayOrder == PREFERENCE_UNASSIGNED) {
- mDisplayOrder = mPreferences.getInt(DISPLAY_ORDER_KEY, getDefaultDisplayOrder());
- }
- return mDisplayOrder;
- }
-
- public void setDisplayOrder(int displayOrder) {
- mDisplayOrder = displayOrder;
- final Editor editor = mPreferences.edit();
- editor.putInt(DISPLAY_ORDER_KEY, displayOrder);
- StrictModeUtils.bypass(editor::commit);
- }
-
- private boolean isDefaultAccountUserChangeable() {
- return mContext.getResources().getBoolean(R.bool.config_default_account_user_changeable);
- }
-
- private String getDefaultAccount() {
- if (!isDefaultAccountUserChangeable()) {
- return mDefaultAccount;
- }
- if (TextUtils.isEmpty(mDefaultAccount)) {
- final String accountString = mPreferences.getString(mDefaultAccountKey, mDefaultAccount);
- if (!TextUtils.isEmpty(accountString)) {
- final AccountWithDataSet accountWithDataSet = AccountWithDataSet.unstringify(accountString);
- mDefaultAccount = accountWithDataSet.name;
- }
- }
- return mDefaultAccount;
- }
-
- private void setDefaultAccount(AccountWithDataSet accountWithDataSet) {
- mDefaultAccount = accountWithDataSet == null ? null : accountWithDataSet.name;
- final Editor editor = mPreferences.edit();
- if (TextUtils.isEmpty(mDefaultAccount)) {
- editor.remove(mDefaultAccountKey);
- } else {
- editor.putString(mDefaultAccountKey, accountWithDataSet.stringify());
- }
- editor.putBoolean(mDefaultAccountSavedKey, true);
- StrictModeUtils.bypass(editor::commit);
- }
-
- public void registerChangeListener(ChangeListener listener) {
- if (mListener != null) {
- unregisterChangeListener();
- }
-
- mListener = listener;
-
- // Reset preferences to "unknown" because they may have changed while the
- // listener was unregistered.
- mDisplayOrder = PREFERENCE_UNASSIGNED;
- mSortOrder = PREFERENCE_UNASSIGNED;
- mDefaultAccount = null;
-
- mPreferences.registerOnSharedPreferenceChangeListener(this);
- }
-
- public void unregisterChangeListener() {
- if (mListener != null) {
- mListener = null;
- }
-
- mPreferences.unregisterOnSharedPreferenceChangeListener(this);
- }
-
- @Override
- public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, final String key) {
- // This notification is not sent on the Ui thread. Use the previously created Handler
- // to switch to the Ui thread
- mHandler.post(
- new Runnable() {
- @Override
- public void run() {
- refreshValue(key);
- }
- });
- }
-
- /**
- * Forces the value for the given key to be looked up from shared preferences and notifies the
- * registered {@link ChangeListener}
- *
- * @param key the {@link SharedPreferences} key to look up
- */
- public void refreshValue(String key) {
- if (DISPLAY_ORDER_KEY.equals(key)) {
- mDisplayOrder = PREFERENCE_UNASSIGNED;
- mDisplayOrder = getDisplayOrder();
- } else if (SORT_ORDER_KEY.equals(key)) {
- mSortOrder = PREFERENCE_UNASSIGNED;
- mSortOrder = getSortOrder();
- } else if (mDefaultAccountKey.equals(key)) {
- mDefaultAccount = null;
- mDefaultAccount = getDefaultAccount();
- }
- if (mListener != null) {
- mListener.onChange();
- }
- }
-
- /**
- * If there are currently no preferences (which means this is the first time we are run), For sort
- * order and display order, check to see if there are any preferences stored in system settings
- * (pre-L) which can be copied into our own SharedPreferences. For default account setting, check
- * to see if there are any preferences stored in the previous SharedPreferences which can be
- * copied into current SharedPreferences.
- */
- private void maybeMigrateSystemSettings() {
- if (!mPreferences.contains(SORT_ORDER_KEY)) {
- int sortOrder = getDefaultSortOrder();
- try {
- sortOrder = Settings.System.getInt(mContext.getContentResolver(), SORT_ORDER_KEY);
- } catch (SettingNotFoundException e) {
- }
- setSortOrder(sortOrder);
- }
-
- if (!mPreferences.contains(DISPLAY_ORDER_KEY)) {
- int displayOrder = getDefaultDisplayOrder();
- try {
- displayOrder = Settings.System.getInt(mContext.getContentResolver(), DISPLAY_ORDER_KEY);
- } catch (SettingNotFoundException e) {
- }
- setDisplayOrder(displayOrder);
- }
-
- if (!mPreferences.contains(mDefaultAccountKey)) {
- final SharedPreferences previousPrefs =
- PreferenceManager.getDefaultSharedPreferences(mContext.getApplicationContext());
- final String defaultAccount = previousPrefs.getString(mDefaultAccountKey, null);
- if (!TextUtils.isEmpty(defaultAccount)) {
- final AccountWithDataSet accountWithDataSet =
- AccountWithDataSet.unstringify(defaultAccount);
- setDefaultAccount(accountWithDataSet);
- }
- }
- }
-
- public interface ChangeListener {
-
- void onChange();
- }
-}
diff --git a/java/com/android/contacts/common/preference/DisplayOrderPreference.java b/java/com/android/contacts/common/preference/DisplayOrderPreference.java
deleted file mode 100644
index 8dda57f..0000000
--- a/java/com/android/contacts/common/preference/DisplayOrderPreference.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.common.preference;
-
-import android.app.AlertDialog.Builder;
-import android.content.Context;
-import android.preference.ListPreference;
-import android.util.AttributeSet;
-import com.android.contacts.common.R;
-
-/** Custom preference: view-name-as (first name first or last name first). */
-public final class DisplayOrderPreference extends ListPreference {
-
- private ContactsPreferences mPreferences;
- private Context mContext;
-
- public DisplayOrderPreference(Context context) {
- super(context);
- prepare();
- }
-
- public DisplayOrderPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- prepare();
- }
-
- private void prepare() {
- mContext = getContext();
- mPreferences = new ContactsPreferences(mContext);
- setEntries(
- new String[] {
- mContext.getString(R.string.display_options_view_given_name_first),
- mContext.getString(R.string.display_options_view_family_name_first),
- });
- setEntryValues(
- new String[] {
- String.valueOf(ContactsPreferences.DISPLAY_ORDER_PRIMARY),
- String.valueOf(ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE),
- });
- setValue(String.valueOf(mPreferences.getDisplayOrder()));
- }
-
- @Override
- protected boolean shouldPersist() {
- return false; // This preference takes care of its own storage
- }
-
- @Override
- public CharSequence getSummary() {
- switch (mPreferences.getDisplayOrder()) {
- case ContactsPreferences.DISPLAY_ORDER_PRIMARY:
- return mContext.getString(R.string.display_options_view_given_name_first);
- case ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE:
- return mContext.getString(R.string.display_options_view_family_name_first);
- }
- return null;
- }
-
- @Override
- protected boolean persistString(String value) {
- int newValue = Integer.parseInt(value);
- if (newValue != mPreferences.getDisplayOrder()) {
- mPreferences.setDisplayOrder(newValue);
- notifyChanged();
- }
- return true;
- }
-
- @Override
- // UX recommendation is not to show cancel button on such lists.
- protected void onPrepareDialogBuilder(Builder builder) {
- super.onPrepareDialogBuilder(builder);
- builder.setNegativeButton(null, null);
- }
-}
diff --git a/java/com/android/contacts/common/preference/SortOrderPreference.java b/java/com/android/contacts/common/preference/SortOrderPreference.java
deleted file mode 100644
index 9b6f578..0000000
--- a/java/com/android/contacts/common/preference/SortOrderPreference.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.common.preference;
-
-import android.app.AlertDialog.Builder;
-import android.content.Context;
-import android.preference.ListPreference;
-import android.util.AttributeSet;
-import com.android.contacts.common.R;
-
-/** Custom preference: sort-by. */
-public final class SortOrderPreference extends ListPreference {
-
- private ContactsPreferences mPreferences;
- private Context mContext;
-
- public SortOrderPreference(Context context) {
- super(context);
- prepare();
- }
-
- public SortOrderPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- prepare();
- }
-
- private void prepare() {
- mContext = getContext();
- mPreferences = new ContactsPreferences(mContext);
- setEntries(
- new String[] {
- mContext.getString(R.string.display_options_sort_by_given_name),
- mContext.getString(R.string.display_options_sort_by_family_name),
- });
- setEntryValues(
- new String[] {
- String.valueOf(ContactsPreferences.SORT_ORDER_PRIMARY),
- String.valueOf(ContactsPreferences.SORT_ORDER_ALTERNATIVE),
- });
- setValue(String.valueOf(mPreferences.getSortOrder()));
- }
-
- @Override
- protected boolean shouldPersist() {
- return false; // This preference takes care of its own storage
- }
-
- @Override
- public CharSequence getSummary() {
- switch (mPreferences.getSortOrder()) {
- case ContactsPreferences.SORT_ORDER_PRIMARY:
- return mContext.getString(R.string.display_options_sort_by_given_name);
- case ContactsPreferences.SORT_ORDER_ALTERNATIVE:
- return mContext.getString(R.string.display_options_sort_by_family_name);
- }
- return null;
- }
-
- @Override
- protected boolean persistString(String value) {
- int newValue = Integer.parseInt(value);
- if (newValue != mPreferences.getSortOrder()) {
- mPreferences.setSortOrder(newValue);
- notifyChanged();
- }
- return true;
- }
-
- @Override
- // UX recommendation is not to show cancel button on such lists.
- protected void onPrepareDialogBuilder(Builder builder) {
- super.onPrepareDialogBuilder(builder);
- builder.setNegativeButton(null, null);
- }
-}
diff --git a/java/com/android/contacts/common/res/values/strings.xml b/java/com/android/contacts/common/res/values/strings.xml
index cf24a88..2011282 100644
--- a/java/com/android/contacts/common/res/values/strings.xml
+++ b/java/com/android/contacts/common/res/values/strings.xml
@@ -332,26 +332,6 @@
<!-- Displayed at the top of the contacts showing single contact. [CHAR LIMIT=64] -->
<string name="listSingleContact">Single contact</string>
- <!-- Contact preferences related strings -->
-
- <!-- Label of the "sort by" display option -->
- <string name="display_options_sort_list_by">Sort by</string>
-
- <!-- An allowable value for the "sort list by" contact display option -->
- <string name="display_options_sort_by_given_name">First name</string>
-
- <!-- An allowable value for the "sort list by" contact display option -->
- <string name="display_options_sort_by_family_name">Last name</string>
-
- <!-- Label of the "name format" display option [CHAR LIMIT=64]-->
- <string name="display_options_view_names_as">Name format</string>
-
- <!-- An allowable value for the "view names as" contact display option -->
- <string name="display_options_view_given_name_first">First name first</string>
-
- <!-- An allowable value for the "view names as" contact display option -->
- <string name="display_options_view_family_name_first">Last name first</string>
-
<!-- The menu item to clear frequents [CHAR LIMIT=30] -->
<string name="menu_clear_frequents">Clear frequents</string>
diff --git a/java/com/android/contacts/common/util/ContactDisplayUtils.java b/java/com/android/contacts/common/util/ContactDisplayUtils.java
index 7d428e1..967395a 100644
--- a/java/com/android/contacts/common/util/ContactDisplayUtils.java
+++ b/java/com/android/contacts/common/util/ContactDisplayUtils.java
@@ -28,7 +28,6 @@
import android.text.style.TtsSpan;
import android.util.Patterns;
import com.android.contacts.common.R;
-import com.android.contacts.common.preference.ContactsPreferences;
import com.android.dialer.common.LogUtil;
import java.util.Objects;
@@ -244,62 +243,4 @@
String msg = resources.getString(stringId, number);
return ContactDisplayUtils.getTelephoneTtsSpannable(msg, number);
}
-
- /**
- * Returns either namePrimary or nameAlternative based on the {@link ContactsPreferences}.
- * Defaults to the name that is non-null.
- *
- * @param namePrimary the primary name.
- * @param nameAlternative the alternative name.
- * @param contactsPreferences the ContactsPreferences used to determine the preferred display
- * name.
- * @return namePrimary or nameAlternative depending on the value of displayOrderPreference.
- */
- public static String getPreferredDisplayName(
- String namePrimary,
- String nameAlternative,
- @Nullable ContactsPreferences contactsPreferences) {
- if (contactsPreferences == null) {
- return namePrimary != null ? namePrimary : nameAlternative;
- }
- if (contactsPreferences.getDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY) {
- return namePrimary;
- }
-
- if (contactsPreferences.getDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE
- && !TextUtils.isEmpty(nameAlternative)) {
- return nameAlternative;
- }
-
- return namePrimary;
- }
-
- /**
- * Returns either namePrimary or nameAlternative based on the {@link ContactsPreferences}.
- * Defaults to the name that is non-null.
- *
- * @param namePrimary the primary name.
- * @param nameAlternative the alternative name.
- * @param contactsPreferences the ContactsPreferences used to determine the preferred sort order.
- * @return namePrimary or nameAlternative depending on the value of displayOrderPreference.
- */
- public static String getPreferredSortName(
- String namePrimary,
- String nameAlternative,
- @Nullable ContactsPreferences contactsPreferences) {
- if (contactsPreferences == null) {
- return namePrimary != null ? namePrimary : nameAlternative;
- }
-
- if (contactsPreferences.getSortOrder() == ContactsPreferences.SORT_ORDER_PRIMARY) {
- return namePrimary;
- }
-
- if (contactsPreferences.getSortOrder() == ContactsPreferences.SORT_ORDER_ALTERNATIVE
- && !TextUtils.isEmpty(nameAlternative)) {
- return nameAlternative;
- }
-
- return namePrimary;
- }
}
diff --git a/java/com/android/dialer/app/calllog/CallLogAdapter.java b/java/com/android/dialer/app/calllog/CallLogAdapter.java
index d3fd365..f5474ee 100644
--- a/java/com/android/dialer/app/calllog/CallLogAdapter.java
+++ b/java/com/android/dialer/app/calllog/CallLogAdapter.java
@@ -53,7 +53,6 @@
import android.view.View;
import android.view.ViewGroup;
import com.android.contacts.common.ContactsUtils;
-import com.android.contacts.common.preference.ContactsPreferences;
import com.android.dialer.app.R;
import com.android.dialer.app.calllog.CallLogFragment.CallLogFragmentListener;
import com.android.dialer.app.calllog.CallLogGroupBuilder.GroupCreator;
@@ -73,6 +72,7 @@
import com.android.dialer.common.concurrent.AsyncTaskExecutors;
import com.android.dialer.compat.android.provider.VoicemailCompat;
import com.android.dialer.configprovider.ConfigProviderComponent;
+import com.android.dialer.contacts.ContactsComponent;
import com.android.dialer.duo.Duo;
import com.android.dialer.duo.DuoComponent;
import com.android.dialer.duo.DuoListener;
@@ -506,7 +506,6 @@
private final Map<Long, Integer> dayGroups = new ArrayMap<>();
private boolean loading = true;
- private ContactsPreferences contactsPreferences;
private boolean isSpamEnabled;
@@ -551,8 +550,6 @@
callLogGroupBuilder = new CallLogGroupBuilder(activity.getApplicationContext(), this);
this.filteredNumberAsyncQueryHandler = Assert.isNotNull(filteredNumberAsyncQueryHandler);
- contactsPreferences = new ContactsPreferences(this.activity);
-
blockReportSpamListener =
new BlockReportSpamListener(
this.activity,
@@ -674,7 +671,6 @@
if (PermissionsUtil.hasPermission(activity, android.Manifest.permission.READ_CONTACTS)) {
contactInfoCache.start();
}
- contactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
isSpamEnabled = SpamComponent.get(activity).spamSettings().isSpamEnabled();
getDuo().registerListener(this);
notifyDataSetChanged();
@@ -1078,7 +1074,8 @@
details.contactUri = info.lookupUri;
details.namePrimary = info.name;
details.nameAlternative = info.nameAlternative;
- details.nameDisplayOrder = contactsPreferences.getDisplayOrder();
+ details.nameDisplayOrder =
+ ContactsComponent.get(activity).contactDisplayPreferences().getDisplayOrder();
details.numberType = info.type;
details.numberLabel = info.label;
details.photoUri = info.photoUri;
diff --git a/java/com/android/dialer/app/list/OldSpeedDialFragment.java b/java/com/android/dialer/app/list/OldSpeedDialFragment.java
index 9b83d54..9922ee2 100644
--- a/java/com/android/dialer/app/list/OldSpeedDialFragment.java
+++ b/java/com/android/dialer/app/list/OldSpeedDialFragment.java
@@ -113,9 +113,6 @@
public void onResume() {
Trace.beginSection(TAG + " onResume");
super.onResume();
- if (contactTileAdapter != null) {
- contactTileAdapter.refreshContactsPreferences();
- }
if (PermissionsUtil.hasContactsReadPermissions(getContext())) {
if (getLoaderManager().getLoader(LOADER_ID_CONTACT_TILE) == null) {
getLoaderManager().initLoader(LOADER_ID_CONTACT_TILE, null, contactTileLoaderListener);
diff --git a/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java b/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java
index 6b41547..8fe67f4 100644
--- a/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java
+++ b/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java
@@ -104,7 +104,7 @@
@Override
protected String getNameForView(ContactEntry contactEntry) {
- return contactEntry.getPreferredDisplayName();
+ return contactEntry.getPreferredDisplayName(getContext());
}
public ContactEntry getContactEntry() {
diff --git a/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java b/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java
index a201859..4cc48a6 100644
--- a/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java
+++ b/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java
@@ -37,10 +37,10 @@
import com.android.contacts.common.ContactTileLoaderFactory;
import com.android.contacts.common.list.ContactEntry;
import com.android.contacts.common.list.ContactTileView;
-import com.android.contacts.common.preference.ContactsPreferences;
import com.android.dialer.app.R;
import com.android.dialer.common.LogUtil;
import com.android.dialer.contactphoto.ContactPhotoManager;
+import com.android.dialer.contacts.ContactsComponent;
import com.android.dialer.duo.Duo;
import com.android.dialer.duo.DuoComponent;
import com.android.dialer.logging.InteractionEvent;
@@ -78,11 +78,11 @@
private OnDataSetChangedForAnimationListener dataSetChangedListener;
private Context context;
private Resources resources;
- private ContactsPreferences contactsPreferences;
private final Comparator<ContactEntry> contactEntryComparator =
new Comparator<ContactEntry>() {
@Override
public int compare(ContactEntry lhs, ContactEntry rhs) {
+
return ComparisonChain.start()
.compare(lhs.pinned, rhs.pinned)
.compare(getPreferredSortName(lhs), getPreferredSortName(rhs))
@@ -90,11 +90,9 @@
}
private String getPreferredSortName(ContactEntry contactEntry) {
- if (contactsPreferences.getSortOrder() == ContactsPreferences.SORT_ORDER_PRIMARY
- || TextUtils.isEmpty(contactEntry.nameAlternative)) {
- return contactEntry.namePrimary;
- }
- return contactEntry.nameAlternative;
+ return ContactsComponent.get(context)
+ .contactDisplayPreferences()
+ .getSortName(contactEntry.namePrimary, contactEntry.nameAlternative);
}
};
/** Back up of the temporarily removed Contact during dragging. */
@@ -121,7 +119,6 @@
this.listener = listener;
this.context = context;
resources = context.getResources();
- contactsPreferences = new ContactsPreferences(this.context);
numFrequents = 0;
contactEntries = new ArrayList<>();
}
@@ -140,11 +137,6 @@
this.inDragging = inDragging;
}
- void refreshContactsPreferences() {
- contactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
- contactsPreferences.refreshValue(ContactsPreferences.SORT_ORDER_KEY);
- }
-
/**
* Gets the number of frequents from the passed in cursor.
*
@@ -256,7 +248,6 @@
(!TextUtils.isEmpty(nameAlternative))
? nameAlternative
: resources.getString(R.string.missing_name);
- contact.nameDisplayOrder = contactsPreferences.getDisplayOrder();
contact.photoUri = (photoUri != null ? Uri.parse(photoUri) : null);
contact.lookupKey = lookupKey;
contact.lookupUri =
diff --git a/java/com/android/dialer/app/res/xml/display_options_settings.xml b/java/com/android/dialer/app/res/xml/display_options_settings.xml
index 0b4e11d..60301db 100644
--- a/java/com/android/dialer/app/res/xml/display_options_settings.xml
+++ b/java/com/android/dialer/app/res/xml/display_options_settings.xml
@@ -18,14 +18,22 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
- <com.android.contacts.common.preference.SortOrderPreference
- android:dialogTitle="@string/display_options_sort_list_by"
- android:key="sortOrder"
- android:title="@string/display_options_sort_list_by"/>
+ <ListPreference
+ android:dialogTitle="@string/display_options_sort_list_by"
+ android:key="@string/display_options_sort_list_by_key"
+ android:summary="%s"
+ android:entries="@array/contact_sort_order_entries"
+ android:entryValues="@array/contact_sort_order_values"
+ android:title="@string/display_options_sort_list_by"
+ android:defaultValue="1"/>
- <com.android.contacts.common.preference.DisplayOrderPreference
- android:dialogTitle="@string/display_options_view_names_as"
- android:key="displayOrder"
- android:title="@string/display_options_view_names_as"/>
+ <ListPreference
+ android:dialogTitle="@string/display_options_view_names_as"
+ android:key="@string/display_options_view_names_as_key"
+ android:summary="%s"
+ android:entries="@array/contact_display_order_entries"
+ android:entryValues="@array/contact_display_order_values"
+ android:title="@string/display_options_view_names_as"
+ android:defaultValue="1"/>
</PreferenceScreen>
diff --git a/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java b/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java
index ae068ac..8181e21 100644
--- a/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java
+++ b/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java
@@ -24,6 +24,7 @@
import com.android.dialer.commandline.CommandLineModule;
import com.android.dialer.common.concurrent.DialerExecutorModule;
import com.android.dialer.configprovider.SharedPrefConfigProviderModule;
+import com.android.dialer.contacts.ContactsModule;
import com.android.dialer.duo.stub.StubDuoModule;
import com.android.dialer.enrichedcall.stub.StubEnrichedCallModule;
import com.android.dialer.feedback.stub.StubFeedbackModule;
@@ -57,6 +58,7 @@
CallLogModule.class,
CallLogConfigModule.class,
CommandLineModule.class,
+ ContactsModule.class,
ContextModule.class,
DialerExecutorModule.class,
GlidePhotoManagerModule.class,
diff --git a/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java b/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java
index 666a0be..acf14b1 100644
--- a/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java
+++ b/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java
@@ -25,6 +25,7 @@
import com.android.dialer.commandline.CommandLineComponent;
import com.android.dialer.common.concurrent.DialerExecutorComponent;
import com.android.dialer.configprovider.ConfigProviderComponent;
+import com.android.dialer.contacts.ContactsComponent;
import com.android.dialer.duo.DuoComponent;
import com.android.dialer.enrichedcall.EnrichedCallComponent;
import com.android.dialer.feedback.FeedbackComponent;
@@ -62,6 +63,7 @@
CallLogUiComponent.HasComponent,
ConfigProviderComponent.HasComponent,
CommandLineComponent.HasComponent,
+ ContactsComponent.HasComponent,
DialerExecutorComponent.HasComponent,
DuoComponent.HasComponent,
EnrichedCallComponent.HasComponent,
diff --git a/java/com/android/dialer/binary/google/GoogleStubDialerRootComponent.java b/java/com/android/dialer/binary/google/GoogleStubDialerRootComponent.java
index 622bd5d..35e7809 100644
--- a/java/com/android/dialer/binary/google/GoogleStubDialerRootComponent.java
+++ b/java/com/android/dialer/binary/google/GoogleStubDialerRootComponent.java
@@ -24,6 +24,7 @@
import com.android.dialer.commandline.CommandLineModule;
import com.android.dialer.common.concurrent.DialerExecutorModule;
import com.android.dialer.configprovider.SharedPrefConfigProviderModule;
+import com.android.dialer.contacts.ContactsModule;
import com.android.dialer.duo.stub.StubDuoModule;
import com.android.dialer.enrichedcall.stub.StubEnrichedCallModule;
import com.android.dialer.feedback.stub.StubFeedbackModule;
@@ -62,6 +63,7 @@
CallLogConfigModule.class,
CommandLineModule.class,
ContextModule.class,
+ ContactsModule.class,
DialerExecutorModule.class,
GlidePhotoManagerModule.class,
MapsModule.class,
diff --git a/java/com/android/dialer/calllogutils/PhoneCallDetails.java b/java/com/android/dialer/calllogutils/PhoneCallDetails.java
index fe8bfde..7212fa9 100644
--- a/java/com/android/dialer/calllogutils/PhoneCallDetails.java
+++ b/java/com/android/dialer/calllogutils/PhoneCallDetails.java
@@ -25,8 +25,8 @@
import android.telecom.PhoneAccountHandle;
import android.text.TextUtils;
import com.android.contacts.common.ContactsUtils.UserType;
-import com.android.contacts.common.preference.ContactsPreferences;
import com.android.contacts.common.util.ContactDisplayUtils;
+import com.android.dialer.contacts.displaypreference.ContactDisplayPreferences.DisplayOrder;
import com.android.dialer.logging.ContactSource;
import com.android.dialer.phonenumbercache.ContactInfo;
@@ -65,7 +65,7 @@
* The user's preference on name display order, last name first or first time first. {@see
* ContactsPreferences}
*/
- public int nameDisplayOrder;
+ public DisplayOrder nameDisplayOrder;
// The type of phone, e.g., {@link Phone#TYPE_HOME}, 0 if not available.
public int numberType;
// The custom label associated with the phone number in the contact, or the empty string.
@@ -183,8 +183,7 @@
* @return the preferred name
*/
public CharSequence getPreferredName() {
- if (nameDisplayOrder == ContactsPreferences.DISPLAY_ORDER_PRIMARY
- || TextUtils.isEmpty(nameAlternative)) {
+ if (nameDisplayOrder == DisplayOrder.PRIMARY || TextUtils.isEmpty(nameAlternative)) {
return namePrimary;
}
return nameAlternative;
diff --git a/java/com/android/dialer/contacts/ContactsComponent.java b/java/com/android/dialer/contacts/ContactsComponent.java
new file mode 100644
index 0000000..5c4097a
--- /dev/null
+++ b/java/com/android/dialer/contacts/ContactsComponent.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.contacts;
+
+import android.content.Context;
+import com.android.dialer.contacts.displaypreference.ContactDisplayPreferences;
+import com.android.dialer.inject.HasRootComponent;
+import dagger.Subcomponent;
+
+/** Component for contacts related utilities */
+@Subcomponent
+public abstract class ContactsComponent {
+
+ public abstract ContactDisplayPreferences contactDisplayPreferences();
+
+ public static ContactsComponent get(Context context) {
+ return ((HasComponent) ((HasRootComponent) context.getApplicationContext()).component())
+ .contactsComponent();
+ }
+
+ /** Used to refer to the root application component. */
+ public interface HasComponent {
+ ContactsComponent contactsComponent();
+ }
+}
diff --git a/java/com/android/dialer/contacts/ContactsModule.java b/java/com/android/dialer/contacts/ContactsModule.java
new file mode 100644
index 0000000..979c525
--- /dev/null
+++ b/java/com/android/dialer/contacts/ContactsModule.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.contacts;
+
+import com.android.dialer.contacts.displaypreference.ContactDisplayPreferences;
+import com.android.dialer.contacts.displaypreference.ContactDisplayPreferencesImpl;
+import com.android.dialer.inject.DialerVariant;
+import com.android.dialer.inject.InstallIn;
+import dagger.Binds;
+import dagger.Module;
+
+/** Module for standard {@link ContactsComponent} */
+@InstallIn(variants = {DialerVariant.DIALER_TEST})
+@Module
+public abstract class ContactsModule {
+ @Binds
+ public abstract ContactDisplayPreferences to(ContactDisplayPreferencesImpl impl);
+}
diff --git a/java/com/android/dialer/contacts/displaypreference/AndroidManifest.xml b/java/com/android/dialer/contacts/displaypreference/AndroidManifest.xml
new file mode 100644
index 0000000..2751461
--- /dev/null
+++ b/java/com/android/dialer/contacts/displaypreference/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<manifest
+ package="com.android.dialer.contacts.displaypreference">
+</manifest>
\ No newline at end of file
diff --git a/java/com/android/dialer/contacts/displaypreference/ContactDisplayPreferences.java b/java/com/android/dialer/contacts/displaypreference/ContactDisplayPreferences.java
new file mode 100644
index 0000000..dca466e
--- /dev/null
+++ b/java/com/android/dialer/contacts/displaypreference/ContactDisplayPreferences.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.contacts.displaypreference;
+
+import android.content.Context;
+import android.support.annotation.Nullable;
+import android.support.annotation.StringRes;
+import android.text.TextUtils;
+import java.util.Arrays;
+
+/** Handles name ordering of a contact (Given name first or family name first.) */
+public interface ContactDisplayPreferences {
+
+ /**
+ * A enum whose value is a String from a Android string resource which can only be resolved at run
+ * time.
+ */
+ interface StringResEnum {
+
+ @StringRes
+ int getStringRes();
+
+ default String getValue(Context context) {
+ return context.getString(getStringRes());
+ }
+
+ static <T extends Enum<T> & StringResEnum> T fromValue(
+ Context context, T[] values, String value) {
+ return Arrays.stream(values)
+ .filter(enumValue -> TextUtils.equals(enumValue.getValue(context), value))
+ // MoreCollectors.onlyElement() is not available to android guava.
+ .reduce(
+ (a, b) -> {
+ throw new AssertionError("multiple result");
+ })
+ .get();
+ }
+ }
+
+ /** Order when displaying the name; */
+ enum DisplayOrder implements StringResEnum {
+
+ /**
+ * The default display order of a name. For western names it will be "Given Family". For
+ * unstructured names like east asian this will be the only order.
+ *
+ * @see android.provider.ContactsContract.Contacts#DISPLAY_NAME_PRIMARY
+ */
+ PRIMARY(R.string.display_options_view_given_name_first_value),
+ /**
+ * The alternative display order of a name. For western names it will be "Family, Given". For
+ * unstructured names like east asian this order will be ignored and treated as primary.
+ *
+ * @see android.provider.ContactsContract.Contacts#DISPLAY_NAME_ALTERNATIVE
+ */
+ ALTERNATIVE(R.string.display_options_view_family_name_first_value);
+
+ @StringRes private final int value;
+
+ DisplayOrder(@StringRes int value) {
+ this.value = value;
+ }
+
+ @Override
+ @StringRes
+ public int getStringRes() {
+ return value;
+ }
+
+ static DisplayOrder fromValue(Context context, String value) {
+ return StringResEnum.fromValue(context, DisplayOrder.values(), value);
+ }
+ }
+
+ /**
+ * Order when sorting the name. In some conventions, names are displayed as given name first, but
+ * sorted by family name.
+ */
+ enum SortOrder implements StringResEnum {
+ /**
+ * Sort by the default display order of a name. For western names it will be "Given Family". For
+ * unstructured names like east asian this will be the only order.
+ *
+ * @see android.provider.ContactsContract.Contacts#DISPLAY_NAME_PRIMARY
+ */
+ BY_PRIMARY(R.string.display_options_sort_by_given_name_value),
+ /**
+ * Sort by the alternative display order of a name. For western names it will be "Family,
+ * Given". For unstructured names like east asian this order will be ignored and treated as
+ * primary.
+ *
+ * @see android.provider.ContactsContract.Contacts#DISPLAY_NAME_ALTERNATIVE
+ */
+ BY_ALTERNATIVE(R.string.display_options_sort_by_family_name_value);
+
+ @StringRes private final int value;
+
+ SortOrder(@StringRes int value) {
+ this.value = value;
+ }
+
+ @Override
+ @StringRes
+ public int getStringRes() {
+ return value;
+ }
+
+ static SortOrder fromValue(Context context, String value) {
+ return StringResEnum.fromValue(context, SortOrder.values(), value);
+ }
+ }
+
+ DisplayOrder getDisplayOrder();
+
+ void setDisplayOrder(DisplayOrder displayOrder);
+
+ SortOrder getSortOrder();
+
+ void setSortOrder(SortOrder sortOrder);
+
+ /** Selects display name based on {@link DisplayOrder} */
+ default String getDisplayName(@Nullable String primaryName, @Nullable String alternativeName) {
+ if (TextUtils.isEmpty(alternativeName)) {
+ return primaryName;
+ }
+ switch (getDisplayOrder()) {
+ case PRIMARY:
+ return primaryName;
+ case ALTERNATIVE:
+ return alternativeName;
+ }
+ throw new AssertionError("exhaustive switch");
+ }
+
+ /** Selects sort name based on {@link SortOrder} */
+ default String getSortName(@Nullable String primaryName, @Nullable String alternativeName) {
+ if (TextUtils.isEmpty(alternativeName)) {
+ return primaryName;
+ }
+ switch (getSortOrder()) {
+ case BY_PRIMARY:
+ return primaryName;
+ case BY_ALTERNATIVE:
+ return alternativeName;
+ }
+ throw new AssertionError("exhaustive switch");
+ }
+}
diff --git a/java/com/android/dialer/contacts/displaypreference/ContactDisplayPreferencesImpl.java b/java/com/android/dialer/contacts/displaypreference/ContactDisplayPreferencesImpl.java
new file mode 100644
index 0000000..6072cc1
--- /dev/null
+++ b/java/com/android/dialer/contacts/displaypreference/ContactDisplayPreferencesImpl.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.contacts.displaypreference;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.UserManager;
+import android.preference.PreferenceManager;
+import com.android.dialer.inject.ApplicationContext;
+import javax.inject.Inject;
+
+/** Implementation of {@link ContactDisplayPreferences} backed by a {@link SharedPreferences} */
+public final class ContactDisplayPreferencesImpl implements ContactDisplayPreferences {
+
+ private final Context appContext;
+ private final SharedPreferences sharedPreferences;
+ private final String displayOrderKey;
+ private final String sortOrderKey;
+
+ @Inject
+ ContactDisplayPreferencesImpl(@ApplicationContext Context appContext) {
+ this.appContext = appContext;
+ // @Unencrypted preference would be a better choice, but Android Preference only supports the
+ // default file. Names cannot be shown on @Unencrypted anyway.
+ this.sharedPreferences = PreferenceManager.getDefaultSharedPreferences(appContext);
+ displayOrderKey = appContext.getString(R.string.display_options_view_names_as_key);
+ sortOrderKey = appContext.getString(R.string.display_options_sort_list_by_key);
+ }
+
+ @Override
+ public DisplayOrder getDisplayOrder() {
+ migrate();
+ if (!sharedPreferences.contains(displayOrderKey)) {
+ return DisplayOrder.PRIMARY;
+ }
+ return DisplayOrder.fromValue(appContext, sharedPreferences.getString(displayOrderKey, null));
+ }
+
+ @Override
+ public void setDisplayOrder(DisplayOrder displayOrder) {
+ sharedPreferences.edit().putString(displayOrderKey, displayOrder.getValue(appContext)).apply();
+ }
+
+ @Override
+ public SortOrder getSortOrder() {
+ migrate();
+ if (!sharedPreferences.contains(sortOrderKey)) {
+ return SortOrder.BY_PRIMARY;
+ }
+ return SortOrder.fromValue(appContext, sharedPreferences.getString(sortOrderKey, null));
+ }
+
+ @Override
+ public void setSortOrder(SortOrder sortOrder) {
+ sharedPreferences.edit().putString(sortOrderKey, sortOrder.getValue(appContext)).apply();
+ }
+
+ /**
+ * Moves the stored values to the standard location.
+ *
+ * <p>Usually preferences are stored in {@code package.name_preferences.xml}. However the old
+ * com.android.contacts.common.preference.ContactsPreferences stored it in {@code
+ * package.name.xml} which is incompatible with the regular {@link android.preference.Preference}
+ * widgets.
+ */
+ private void migrate() {
+ if (!appContext.getSystemService(UserManager.class).isUserUnlocked()) {
+ return;
+ }
+ SharedPreferences oldPreference =
+ appContext.getSharedPreferences(appContext.getPackageName(), Context.MODE_PRIVATE);
+ if (oldPreference.contains(displayOrderKey) || oldPreference.contains(sortOrderKey)) {
+ sharedPreferences
+ .edit()
+ .putString(
+ displayOrderKey,
+ translateLegacyDisplayOrder(oldPreference.getInt(displayOrderKey, 1)))
+ .putString(sortOrderKey, translateLegacySortOrder(oldPreference.getInt(sortOrderKey, 1)))
+ .apply();
+ oldPreference.edit().remove(displayOrderKey).remove(sortOrderKey).apply();
+ }
+ }
+
+ private String translateLegacyDisplayOrder(int legacyValue) {
+ switch (legacyValue) {
+ case 2:
+ return DisplayOrder.ALTERNATIVE.getValue(appContext);
+ default:
+ return DisplayOrder.PRIMARY.getValue(appContext);
+ }
+ }
+
+ private String translateLegacySortOrder(int legacyValue) {
+ switch (legacyValue) {
+ case 2:
+ return SortOrder.BY_ALTERNATIVE.getValue(appContext);
+ default:
+ return SortOrder.BY_PRIMARY.getValue(appContext);
+ }
+ }
+}
diff --git a/java/com/android/dialer/contacts/displaypreference/res/values/display_preference.xml b/java/com/android/dialer/contacts/displaypreference/res/values/display_preference.xml
new file mode 100644
index 0000000..b74b8b9
--- /dev/null
+++ b/java/com/android/dialer/contacts/displaypreference/res/values/display_preference.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+<resources>
+ <string-array name="contact_display_order_entries">
+ <item>@string/display_options_view_given_name_first</item>
+ <item>@string/display_options_view_family_name_first</item>
+ </string-array>
+
+ <string-array name="contact_display_order_values">
+ <item>@string/display_options_view_given_name_first_value</item>
+ <item>@string/display_options_view_family_name_first_value</item>
+ </string-array>
+
+ <string-array name="contact_sort_order_entries">
+ <item>@string/display_options_sort_by_given_name</item>
+ <item>@string/display_options_sort_by_family_name</item>
+ </string-array>
+
+ <string-array name="contact_sort_order_values">
+ <item>@string/display_options_sort_by_given_name_value</item>
+ <item>@string/display_options_sort_by_family_name_value</item>
+ </string-array>
+</resources>
\ No newline at end of file
diff --git a/java/com/android/dialer/contacts/displaypreference/res/values/strings.xml b/java/com/android/dialer/contacts/displaypreference/res/values/strings.xml
new file mode 100644
index 0000000..8914ddf
--- /dev/null
+++ b/java/com/android/dialer/contacts/displaypreference/res/values/strings.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Contact preferences related strings -->
+
+ <!-- Label of the "sort by" display option -->
+ <string name="display_options_sort_list_by">Sort by</string>
+
+ <string translatable="false" name="display_options_sort_list_by_key">android.contacts.SORT_ORDER</string>
+
+ <!-- An allowable value for the "sort list by" contact display option -->
+ <string name="display_options_sort_by_given_name">First name</string>
+
+ <string translatable="false" name="display_options_sort_by_given_name_value">sort_by_given_name</string>
+
+ <!-- An allowable value for the "sort list by" contact display option -->
+ <string name="display_options_sort_by_family_name">Last name</string>
+
+ <string translatable="false" name="display_options_sort_by_family_name_value">sort_by_family_name</string>
+
+ <!-- Label of the "name format" display option [CHAR LIMIT=64]-->
+ <string name="display_options_view_names_as">Name format</string>
+ <string translatable="false" name="display_options_view_names_as_key">android.contacts.DISPLAY_ORDER</string>
+
+ <!-- An allowable value for the "view names as" contact display option -->
+ <string name="display_options_view_given_name_first">First name first</string>
+
+ <string translatable="false" name="display_options_view_given_name_first_value">view_given_name_first</string>
+
+ <!-- An allowable value for the "view names as" contact display option -->
+ <string name="display_options_view_family_name_first">Last name first</string>
+
+ <string translatable="false" name="display_options_view_family_name_first_value">view_family_name_first</string>
+</resources>
diff --git a/java/com/android/dialer/contactsfragment/ContactsCursorLoader.java b/java/com/android/dialer/contactsfragment/ContactsCursorLoader.java
index e55f951..d74afe5 100644
--- a/java/com/android/dialer/contactsfragment/ContactsCursorLoader.java
+++ b/java/com/android/dialer/contactsfragment/ContactsCursorLoader.java
@@ -21,7 +21,7 @@
import android.net.Uri;
import android.provider.ContactsContract.Contacts;
import android.text.TextUtils;
-import com.android.contacts.common.preference.ContactsPreferences;
+import com.android.dialer.contacts.ContactsComponent;
/** Cursor Loader for {@link ContactsFragment}. */
final class ContactsCursorLoader extends CursorLoader {
@@ -61,12 +61,13 @@
}
private static String[] getProjection(Context context) {
- ContactsPreferences contactsPrefs = new ContactsPreferences(context);
- boolean displayOrderPrimary =
- (contactsPrefs.getDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY);
- return displayOrderPrimary
- ? CONTACTS_PROJECTION_DISPLAY_NAME_PRIMARY
- : CONTACTS_PROJECTION_DISPLAY_NAME_ALTERNATIVE;
+ switch (ContactsComponent.get(context).contactDisplayPreferences().getDisplayOrder()) {
+ case PRIMARY:
+ return CONTACTS_PROJECTION_DISPLAY_NAME_PRIMARY;
+ case ALTERNATIVE:
+ return CONTACTS_PROJECTION_DISPLAY_NAME_ALTERNATIVE;
+ }
+ throw new AssertionError("exhaustive switch");
}
private static String getWhere(Context context, boolean hasPhoneNumbers) {
@@ -78,10 +79,14 @@
}
private static String getSortKey(Context context) {
- ContactsPreferences contactsPrefs = new ContactsPreferences(context);
- boolean sortOrderPrimary =
- (contactsPrefs.getSortOrder() == ContactsPreferences.SORT_ORDER_PRIMARY);
- return sortOrderPrimary ? Contacts.SORT_KEY_PRIMARY : Contacts.SORT_KEY_ALTERNATIVE;
+
+ switch (ContactsComponent.get(context).contactDisplayPreferences().getSortOrder()) {
+ case BY_PRIMARY:
+ return Contacts.SORT_KEY_PRIMARY;
+ case BY_ALTERNATIVE:
+ return Contacts.SORT_KEY_ALTERNATIVE;
+ }
+ throw new AssertionError("exhaustive switch");
}
/** Update cursor loader to filter contacts based on the provided query. */
diff --git a/java/com/android/dialer/contactsfragment/ContactsFragment.java b/java/com/android/dialer/contactsfragment/ContactsFragment.java
index 794a5b9..f40abec 100644
--- a/java/com/android/dialer/contactsfragment/ContactsFragment.java
+++ b/java/com/android/dialer/contactsfragment/ContactsFragment.java
@@ -41,8 +41,6 @@
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
-import com.android.contacts.common.preference.ContactsPreferences;
-import com.android.contacts.common.preference.ContactsPreferences.ChangeListener;
import com.android.dialer.common.Assert;
import com.android.dialer.common.FragmentUtils;
import com.android.dialer.common.LogUtil;
@@ -60,8 +58,7 @@
public class ContactsFragment extends Fragment
implements LoaderCallbacks<Cursor>,
OnScrollChangeListener,
- OnEmptyViewActionButtonClickedListener,
- ChangeListener {
+ OnEmptyViewActionButtonClickedListener {
/** An enum for the different types of headers that be inserted at position 0 in the list. */
@Retention(RetentionPolicy.SOURCE)
@@ -98,7 +95,6 @@
private @Header int header;
- private ContactsPreferences contactsPrefs;
private boolean hasPhoneNumbers;
private String query;
@@ -154,8 +150,6 @@
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- contactsPrefs = new ContactsPreferences(getContext());
- contactsPrefs.registerChangeListener(this);
header = getArguments().getInt(EXTRA_HEADER);
hasPhoneNumbers = getArguments().getBoolean(EXTRA_HAS_PHONE_NUMBERS);
if (savedInstanceState == null) {
@@ -224,7 +218,8 @@
}
@Override
- public void onChange() {
+ public void onResume() {
+ super.onResume();
if (getActivity() != null
&& isAdded()
&& PermissionsUtil.hasContactsReadPermissions(getContext())) {
@@ -268,7 +263,6 @@
recyclerView.setAdapter(null);
recyclerView.setOnScrollChangeListener(null);
adapter = null;
- contactsPrefs.unregisterChangeListener();
}
/*
diff --git a/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java b/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java
index 7caa314..f4ed21e 100644
--- a/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java
+++ b/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java
@@ -27,8 +27,10 @@
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;
-import com.android.contacts.common.preference.ContactsPreferences;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.contacts.ContactsComponent;
+import com.android.dialer.contacts.displaypreference.ContactDisplayPreferences.DisplayOrder;
+import com.android.dialer.contacts.displaypreference.ContactDisplayPreferences.SortOrder;
import com.android.dialer.searchfragment.common.Projections;
import com.android.dialer.searchfragment.common.SearchCursor;
import com.android.dialer.smartdial.SmartDialCursorLoader;
@@ -55,9 +57,9 @@
}
private static String[] getProjection(Context context) {
- ContactsPreferences contactsPrefs = new ContactsPreferences(context);
boolean displayOrderPrimary =
- (contactsPrefs.getDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY);
+ (ContactsComponent.get(context).contactDisplayPreferences().getDisplayOrder()
+ == DisplayOrder.PRIMARY);
return displayOrderPrimary
? Projections.CP2_PROJECTION
: Projections.CP2_PROJECTION_ALTERNATIVE;
@@ -70,9 +72,9 @@
}
private static String getSortKey(Context context) {
- ContactsPreferences contactsPrefs = new ContactsPreferences(context);
boolean sortOrderPrimary =
- (contactsPrefs.getSortOrder() == ContactsPreferences.SORT_ORDER_PRIMARY);
+ (ContactsComponent.get(context).contactDisplayPreferences().getSortOrder()
+ == SortOrder.BY_PRIMARY);
return sortOrderPrimary ? Phone.SORT_KEY_PRIMARY : Phone.SORT_KEY_ALTERNATIVE;
}
diff --git a/java/com/android/dialer/shortcuts/DynamicShortcuts.java b/java/com/android/dialer/shortcuts/DynamicShortcuts.java
index be9e088..e39dc27 100644
--- a/java/com/android/dialer/shortcuts/DynamicShortcuts.java
+++ b/java/com/android/dialer/shortcuts/DynamicShortcuts.java
@@ -124,7 +124,7 @@
DialerShortcut.builder()
.setContactId(entry.id)
.setLookupKey(entry.lookupKey)
- .setDisplayName(entry.getPreferredDisplayName())
+ .setDisplayName(entry.getPreferredDisplayName(context))
.setRank(rank++)
.build();
newDynamicShortcutsById.put(shortcut.getShortcutId(), shortcut);
diff --git a/java/com/android/dialer/speeddial/loader/SpeedDialUiItemMutator.java b/java/com/android/dialer/speeddial/loader/SpeedDialUiItemMutator.java
index 72f0a68..b0b83ac 100644
--- a/java/com/android/dialer/speeddial/loader/SpeedDialUiItemMutator.java
+++ b/java/com/android/dialer/speeddial/loader/SpeedDialUiItemMutator.java
@@ -31,13 +31,14 @@
import android.support.annotation.WorkerThread;
import android.util.ArrayMap;
import android.util.ArraySet;
-import com.android.contacts.common.preference.ContactsPreferences;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor;
import com.android.dialer.common.concurrent.DialerExecutor.SuccessListener;
import com.android.dialer.common.concurrent.DialerFutureSerializer;
import com.android.dialer.common.database.Selection;
+import com.android.dialer.contacts.displaypreference.ContactDisplayPreferences;
+import com.android.dialer.contacts.displaypreference.ContactDisplayPreferences.DisplayOrder;
import com.android.dialer.duo.DuoComponent;
import com.android.dialer.inject.ApplicationContext;
import com.android.dialer.speeddial.database.SpeedDialEntry;
@@ -84,15 +85,16 @@
private final ListeningExecutorService backgroundExecutor;
// Used to ensure that only one refresh flow runs at a time.
private final DialerFutureSerializer dialerFutureSerializer = new DialerFutureSerializer();
- private final ContactsPreferences contactsPreferences;
+ private final ContactDisplayPreferences contactDisplayPreferences;
@Inject
public SpeedDialUiItemMutator(
@ApplicationContext Context appContext,
- @BackgroundExecutor ListeningExecutorService backgroundExecutor) {
+ @BackgroundExecutor ListeningExecutorService backgroundExecutor,
+ ContactDisplayPreferences contactDisplayPreferences) {
this.appContext = appContext;
this.backgroundExecutor = backgroundExecutor;
- this.contactsPreferences = new ContactsPreferences(appContext);
+ this.contactDisplayPreferences = contactDisplayPreferences;
}
/**
@@ -183,7 +185,6 @@
@WorkerThread
private ImmutableList<SpeedDialUiItem> insertNewContactEntry(Uri contactUri) {
Assert.isWorkerThread();
- contactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
try (Cursor cursor =
appContext
.getContentResolver()
@@ -225,7 +226,6 @@
private ImmutableList<SpeedDialUiItem> loadSpeedDialUiItemsInternal() {
Trace.beginSection("loadSpeedDialUiItemsInternal");
Assert.isWorkerThread();
- contactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
Trace.beginSection("getAllEntries");
SpeedDialEntryDao db = getSpeedDialEntryDao();
Trace.endSection(); // getAllEntries
@@ -663,6 +663,6 @@
}
private boolean isPrimaryDisplayNameOrder() {
- return contactsPreferences.getDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY;
+ return contactDisplayPreferences.getDisplayOrder() == DisplayOrder.PRIMARY;
}
}
diff --git a/java/com/android/incallui/CallCardPresenter.java b/java/com/android/incallui/CallCardPresenter.java
index 91255cc..b9e6744 100644
--- a/java/com/android/incallui/CallCardPresenter.java
+++ b/java/com/android/incallui/CallCardPresenter.java
@@ -44,11 +44,10 @@
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import com.android.contacts.common.ContactsUtils;
-import com.android.contacts.common.preference.ContactsPreferences;
-import com.android.contacts.common.util.ContactDisplayUtils;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.configprovider.ConfigProviderComponent;
+import com.android.dialer.contacts.ContactsComponent;
import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
import com.android.dialer.multimedia.MultimediaData;
@@ -123,7 +122,6 @@
private String secondaryNumber;
private ContactCacheEntry primaryContactInfo;
private ContactCacheEntry secondaryContactInfo;
- @Nullable private ContactsPreferences contactsPreferences;
private boolean isFullscreen = false;
private InCallScreen inCallScreen;
private boolean isInCallScreenReady;
@@ -159,7 +157,6 @@
public void onInCallScreenDelegateInit(InCallScreen inCallScreen) {
Assert.isNotNull(inCallScreen);
this.inCallScreen = inCallScreen;
- contactsPreferences = ContactsPreferencesFactory.newContactsPreferences(context);
// Call may be null if disconnect happened already.
DialerCall call = CallList.getInstance().getFirstCall();
@@ -184,9 +181,6 @@
public void onInCallScreenReady() {
LogUtil.i("CallCardPresenter.onInCallScreenReady", null);
Assert.checkState(!isInCallScreenReady);
- if (contactsPreferences != null) {
- contactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
- }
// Contact search may have completed before ui is ready.
if (primaryContactInfo != null) {
@@ -985,8 +979,9 @@
/** Gets the name to display for the call. */
private String getNameForCall(ContactCacheEntry contactInfo) {
String preferredName =
- ContactDisplayUtils.getPreferredDisplayName(
- contactInfo.namePrimary, contactInfo.nameAlternative, contactsPreferences);
+ ContactsComponent.get(context)
+ .contactDisplayPreferences()
+ .getDisplayName(contactInfo.namePrimary, contactInfo.nameAlternative);
if (TextUtils.isEmpty(preferredName)) {
return TextUtils.isEmpty(contactInfo.number)
? null
diff --git a/java/com/android/incallui/ConferenceParticipantListAdapter.java b/java/com/android/incallui/ConferenceParticipantListAdapter.java
index c71bf59..d13bd3d 100644
--- a/java/com/android/incallui/ConferenceParticipantListAdapter.java
+++ b/java/com/android/incallui/ConferenceParticipantListAdapter.java
@@ -18,7 +18,6 @@
import android.content.Context;
import android.net.Uri;
-import android.support.annotation.Nullable;
import android.support.v4.util.ArrayMap;
import android.telephony.PhoneNumberUtils;
import android.text.BidiFormatter;
@@ -33,11 +32,10 @@
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
-import com.android.contacts.common.preference.ContactsPreferences;
-import com.android.contacts.common.util.ContactDisplayUtils;
import com.android.dialer.common.LogUtil;
import com.android.dialer.contactphoto.ContactPhotoManager;
import com.android.dialer.contactphoto.ContactPhotoManager.DefaultImageRequest;
+import com.android.dialer.contacts.ContactsComponent;
import com.android.incallui.ContactInfoCache.ContactCacheEntry;
import com.android.incallui.call.CallList;
import com.android.incallui.call.DialerCall;
@@ -59,8 +57,6 @@
private final ListView listView;
/** Hashmap to make accessing participant info by call Id faster. */
private final Map<String, ParticipantInfo> participantsByCallId = new ArrayMap<>();
- /** ContactsPreferences used to lookup displayName preferences */
- @Nullable private final ContactsPreferences contactsPreferences;
/** Contact photo manager to retrieve cached contact photo information. */
private final ContactPhotoManager contactPhotoManager;
/** Listener used to handle tap of the "disconnect' button for a participant. */
@@ -103,7 +99,6 @@
ListView listView, ContactPhotoManager contactPhotoManager) {
this.listView = listView;
- contactsPreferences = ContactsPreferencesFactory.newContactsPreferences(getContext());
this.contactPhotoManager = contactPhotoManager;
}
@@ -116,10 +111,6 @@
*/
public void updateParticipants(
List<DialerCall> conferenceParticipants, boolean parentCanSeparate) {
- if (contactsPreferences != null) {
- contactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
- contactsPreferences.refreshValue(ContactsPreferences.SORT_ORDER_KEY);
- }
this.parentCanSeparate = parentCanSeparate;
updateParticipantInfo(conferenceParticipants);
}
@@ -235,8 +226,9 @@
call.can(android.telecom.Call.Details.CAPABILITY_DISCONNECT_FROM_CONFERENCE);
String name =
- ContactDisplayUtils.getPreferredDisplayName(
- contactCache.namePrimary, contactCache.nameAlternative, contactsPreferences);
+ ContactsComponent.get(getContext())
+ .contactDisplayPreferences()
+ .getDisplayName(contactCache.namePrimary, contactCache.nameAlternative);
setCallerInfoForRow(
result,
@@ -441,14 +433,16 @@
// Contact names might be null, so replace with empty string.
ContactCacheEntry c1 = p1.getContactCacheEntry();
String p1Name =
- ContactDisplayUtils.getPreferredSortName(
- c1.namePrimary, c1.nameAlternative, contactsPreferences);
+ ContactsComponent.get(getContext())
+ .contactDisplayPreferences()
+ .getSortName(c1.namePrimary, c1.nameAlternative);
p1Name = p1Name != null ? p1Name : "";
ContactCacheEntry c2 = p2.getContactCacheEntry();
String p2Name =
- ContactDisplayUtils.getPreferredSortName(
- c2.namePrimary, c2.nameAlternative, contactsPreferences);
+ ContactsComponent.get(getContext())
+ .contactDisplayPreferences()
+ .getSortName(c2.namePrimary, c2.nameAlternative);
p2Name = p2Name != null ? p2Name : "";
return p1Name.compareToIgnoreCase(p2Name);
diff --git a/java/com/android/incallui/ContactsPreferencesFactory.java b/java/com/android/incallui/ContactsPreferencesFactory.java
deleted file mode 100644
index a9a2109..0000000
--- a/java/com/android/incallui/ContactsPreferencesFactory.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.incallui;
-
-import android.content.Context;
-import android.support.annotation.Nullable;
-import android.support.v4.os.UserManagerCompat;
-import com.android.contacts.common.preference.ContactsPreferences;
-
-/** Factory class for {@link ContactsPreferences}. */
-public class ContactsPreferencesFactory {
-
- private static boolean useTestInstance;
- private static ContactsPreferences testInstance;
-
- /**
- * Creates a new {@link ContactsPreferences} object if possible.
- *
- * @param context the context to use when creating the ContactsPreferences.
- * @return a new ContactsPreferences object or {@code null} if the user is locked.
- */
- @Nullable
- public static ContactsPreferences newContactsPreferences(Context context) {
- if (useTestInstance) {
- return testInstance;
- }
- if (UserManagerCompat.isUserUnlocked(context)) {
- return new ContactsPreferences(context);
- }
- return null;
- }
-
- /**
- * Sets the instance to be returned by all calls to {@link #newContactsPreferences(Context)}.
- *
- * @param testInstance the instance to return.
- */
- static void setTestInstance(ContactsPreferences testInstance) {
- useTestInstance = true;
- ContactsPreferencesFactory.testInstance = testInstance;
- }
-}
diff --git a/java/com/android/incallui/ExternalCallNotifier.java b/java/com/android/incallui/ExternalCallNotifier.java
index 10c4a64..160e250 100644
--- a/java/com/android/incallui/ExternalCallNotifier.java
+++ b/java/com/android/incallui/ExternalCallNotifier.java
@@ -38,10 +38,9 @@
import android.util.ArrayMap;
import com.android.contacts.common.ContactsUtils;
import com.android.contacts.common.compat.CallCompat;
-import com.android.contacts.common.preference.ContactsPreferences;
-import com.android.contacts.common.util.ContactDisplayUtils;
import com.android.dialer.common.Assert;
import com.android.dialer.contactphoto.BitmapUtil;
+import com.android.dialer.contacts.ContactsComponent;
import com.android.dialer.notification.DialerNotificationManager;
import com.android.dialer.notification.NotificationChannelId;
import com.android.dialer.telecom.TelecomCallUtil;
@@ -78,13 +77,11 @@
private final ContactInfoCache contactInfoCache;
private Map<Call, NotificationInfo> notifications = new ArrayMap<>();
private int nextUniqueNotificationId;
- private ContactsPreferences contactsPreferences;
/** Initializes a new instance of the external call notifier. */
public ExternalCallNotifier(
@NonNull Context context, @NonNull ContactInfoCache contactInfoCache) {
this.context = context;
- contactsPreferences = ContactsPreferencesFactory.newContactsPreferences(this.context);
this.contactInfoCache = contactInfoCache;
}
@@ -216,7 +213,7 @@
* notification to the notification manager.
*/
private void saveContactInfo(NotificationInfo info, ContactInfoCache.ContactCacheEntry entry) {
- info.setContentTitle(getContentTitle(context, contactsPreferences, entry, info.getCall()));
+ info.setContentTitle(getContentTitle(context, entry, info.getCall()));
info.setPersonReference(getPersonReference(entry, info.getCall()));
postNotification(info);
}
@@ -342,17 +339,12 @@
* number.
*
* @param context The context.
- * @param contactsPreferences Contacts preferences, used to determine the preferred formatting for
- * contact names.
* @param contactInfo The contact info which was looked up in the contact cache.
* @param call The call to generate a title for.
* @return The content title.
*/
private @Nullable String getContentTitle(
- Context context,
- @Nullable ContactsPreferences contactsPreferences,
- ContactInfoCache.ContactCacheEntry contactInfo,
- android.telecom.Call call) {
+ Context context, ContactInfoCache.ContactCacheEntry contactInfo, android.telecom.Call call) {
if (call.getDetails().hasProperty(android.telecom.Call.Details.PROPERTY_CONFERENCE)) {
return CallerInfoUtils.getConferenceString(
@@ -361,8 +353,9 @@
}
String preferredName =
- ContactDisplayUtils.getPreferredDisplayName(
- contactInfo.namePrimary, contactInfo.nameAlternative, contactsPreferences);
+ ContactsComponent.get(context)
+ .contactDisplayPreferences()
+ .getDisplayName(contactInfo.namePrimary, contactInfo.nameAlternative);
if (TextUtils.isEmpty(preferredName)) {
return TextUtils.isEmpty(contactInfo.number)
? null
diff --git a/java/com/android/incallui/ReturnToCallController.java b/java/com/android/incallui/ReturnToCallController.java
index 94ce8d7..addde55 100644
--- a/java/com/android/incallui/ReturnToCallController.java
+++ b/java/com/android/incallui/ReturnToCallController.java
@@ -30,9 +30,9 @@
import com.android.bubble.BubbleComponent;
import com.android.bubble.BubbleInfo;
import com.android.bubble.BubbleInfo.Action;
-import com.android.contacts.common.util.ContactDisplayUtils;
import com.android.dialer.common.LogUtil;
import com.android.dialer.configprovider.ConfigProviderComponent;
+import com.android.dialer.contacts.ContactsComponent;
import com.android.dialer.lettertile.LetterTileDrawable;
import com.android.dialer.telecom.TelecomUtil;
import com.android.dialer.theme.base.ThemeComponent;
@@ -369,10 +369,9 @@
private LetterTileDrawable createLettleTileDrawable(
DialerCall dialerCall, ContactCacheEntry entry) {
String preferredName =
- ContactDisplayUtils.getPreferredDisplayName(
- entry.namePrimary,
- entry.nameAlternative,
- ContactsPreferencesFactory.newContactsPreferences(context));
+ ContactsComponent.get(context)
+ .contactDisplayPreferences()
+ .getDisplayName(entry.namePrimary, entry.nameAlternative);
if (TextUtils.isEmpty(preferredName)) {
preferredName = entry.number;
}
diff --git a/java/com/android/incallui/RttRequestDialogFragment.java b/java/com/android/incallui/RttRequestDialogFragment.java
index 5437cc6..589625b 100644
--- a/java/com/android/incallui/RttRequestDialogFragment.java
+++ b/java/com/android/incallui/RttRequestDialogFragment.java
@@ -28,9 +28,9 @@
import android.text.TextUtils;
import android.view.View;
import android.widget.TextView;
-import com.android.contacts.common.util.ContactDisplayUtils;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.contacts.ContactsComponent;
import com.android.incallui.ContactInfoCache.ContactCacheEntry;
import com.android.incallui.ContactInfoCache.ContactInfoCacheCallback;
import com.android.incallui.call.CallList;
@@ -130,10 +130,9 @@
private CharSequence getNameOrNumber(ContactCacheEntry entry, Context context) {
String preferredName =
- ContactDisplayUtils.getPreferredDisplayName(
- entry.namePrimary,
- entry.nameAlternative,
- ContactsPreferencesFactory.newContactsPreferences(context));
+ ContactsComponent.get(context)
+ .contactDisplayPreferences()
+ .getDisplayName(entry.namePrimary, entry.nameAlternative);
if (TextUtils.isEmpty(preferredName)) {
return TextUtils.isEmpty(entry.number)
? null
diff --git a/java/com/android/incallui/StatusBarNotifier.java b/java/com/android/incallui/StatusBarNotifier.java
index 1d73fe8..8316d76 100644
--- a/java/com/android/incallui/StatusBarNotifier.java
+++ b/java/com/android/incallui/StatusBarNotifier.java
@@ -64,12 +64,11 @@
import android.text.style.ForegroundColorSpan;
import com.android.contacts.common.ContactsUtils;
import com.android.contacts.common.ContactsUtils.UserType;
-import com.android.contacts.common.preference.ContactsPreferences;
-import com.android.contacts.common.util.ContactDisplayUtils;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.configprovider.ConfigProviderComponent;
import com.android.dialer.contactphoto.BitmapUtil;
+import com.android.dialer.contacts.ContactsComponent;
import com.android.dialer.enrichedcall.EnrichedCallManager;
import com.android.dialer.enrichedcall.Session;
import com.android.dialer.lettertile.LetterTileDrawable;
@@ -121,7 +120,6 @@
private final Context context;
private final ContactInfoCache contactInfoCache;
private final DialerRingtoneManager dialerRingtoneManager;
- @Nullable private ContactsPreferences contactsPreferences;
private int currentNotification = NOTIFICATION_NONE;
private int callState = DialerCallState.INVALID;
private int videoState = VideoProfile.STATE_AUDIO_ONLY;
@@ -136,7 +134,6 @@
public StatusBarNotifier(@NonNull Context context, @NonNull ContactInfoCache contactInfoCache) {
Trace.beginSection("StatusBarNotifier.Constructor");
this.context = Assert.isNotNull(context);
- contactsPreferences = ContactsPreferencesFactory.newContactsPreferences(this.context);
this.contactInfoCache = contactInfoCache;
dialerRingtoneManager =
new DialerRingtoneManager(
@@ -565,8 +562,9 @@
}
String preferredName =
- ContactDisplayUtils.getPreferredDisplayName(
- contactInfo.namePrimary, contactInfo.nameAlternative, contactsPreferences);
+ ContactsComponent.get(context)
+ .contactDisplayPreferences()
+ .getDisplayName(contactInfo.namePrimary, contactInfo.nameAlternative);
if (TextUtils.isEmpty(preferredName)) {
return TextUtils.isEmpty(contactInfo.number)
? null
diff --git a/packages.mk b/packages.mk
index f2b1c7e..1be1f83 100644
--- a/packages.mk
+++ b/packages.mk
@@ -30,6 +30,7 @@
com.android.dialer.common.concurrent.testing \
com.android.dialer.common.preference \
com.android.dialer.configprovider \
+ com.android.dialer.contacts.displaypreference \
com.android.dialer.contactphoto \
com.android.dialer.contactsfragment \
com.android.dialer.databasepopulator \