summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
authortwyen <twyen@google.com>2018-06-26 15:51:30 -0700
committerandroid-build-merger <android-build-merger@google.com>2018-06-26 15:51:30 -0700
commitf9d508090cbf3b9f85b72241c77f625c152448bc (patch)
tree198fcf37848a75c8d68f74679a56fd9dc0f4891b /java
parenta3624bf414450b3dd35a8b358db1a2ffd7dee21a (diff)
parente6262b0bcebc185ee15ad22d6e723e80c2b267a2 (diff)
Merge changes I45374e61,I265dcc61,Id4622886,I09d0df69,I3ea0fb46 am: 2f6900466e
am: e6262b0bce Change-Id: I46367591d38db2178a9f5ac1b5b8ac8ca0487efd
Diffstat (limited to 'java')
-rw-r--r--java/com/android/contacts/common/list/ContactEntry.java21
-rw-r--r--java/com/android/contacts/common/preference/ContactsPreferences.java273
-rw-r--r--java/com/android/contacts/common/preference/DisplayOrderPreference.java89
-rw-r--r--java/com/android/contacts/common/preference/SortOrderPreference.java89
-rw-r--r--java/com/android/contacts/common/res/values/strings.xml20
-rw-r--r--java/com/android/contacts/common/util/ContactDisplayUtils.java59
-rw-r--r--java/com/android/dialer/app/calllog/CallLogAdapter.java9
-rw-r--r--java/com/android/dialer/app/list/OldSpeedDialFragment.java3
-rw-r--r--java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java2
-rw-r--r--java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java19
-rw-r--r--java/com/android/dialer/app/res/xml/display_options_settings.xml24
-rw-r--r--java/com/android/dialer/binary/aosp/AospDialerRootComponent.java2
-rw-r--r--java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java2
-rw-r--r--java/com/android/dialer/binary/google/GoogleStubDialerRootComponent.java2
-rw-r--r--java/com/android/dialer/calllogutils/PhoneCallDetails.java7
-rw-r--r--java/com/android/dialer/contacts/ContactsComponent.java39
-rw-r--r--java/com/android/dialer/contacts/ContactsModule.java32
-rw-r--r--java/com/android/dialer/contacts/displaypreference/AndroidManifest.xml18
-rw-r--r--java/com/android/dialer/contacts/displaypreference/ContactDisplayPreferences.java162
-rw-r--r--java/com/android/dialer/contacts/displaypreference/ContactDisplayPreferencesImpl.java115
-rw-r--r--java/com/android/dialer/contacts/displaypreference/res/values/display_preference.xml37
-rw-r--r--java/com/android/dialer/contacts/displaypreference/res/values/strings.xml48
-rw-r--r--java/com/android/dialer/contactsfragment/ContactsCursorLoader.java27
-rw-r--r--java/com/android/dialer/contactsfragment/ContactsFragment.java12
-rw-r--r--java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java12
-rw-r--r--java/com/android/dialer/searchfragment/list/NewSearchFragment.java2
-rw-r--r--java/com/android/dialer/shortcuts/DynamicShortcuts.java2
-rw-r--r--java/com/android/dialer/speeddial/loader/SpeedDialUiItemMutator.java14
-rw-r--r--java/com/android/dialer/theme/common/res/values/text_styles.xml2
-rw-r--r--java/com/android/incallui/CallCardPresenter.java13
-rw-r--r--java/com/android/incallui/ConferenceParticipantListAdapter.java26
-rw-r--r--java/com/android/incallui/ContactsPreferencesFactory.java56
-rw-r--r--java/com/android/incallui/ExternalCallNotifier.java19
-rw-r--r--java/com/android/incallui/ReturnToCallController.java9
-rw-r--r--java/com/android/incallui/RttRequestDialogFragment.java9
-rw-r--r--java/com/android/incallui/StatusBarNotifier.java10
-rw-r--r--java/com/android/incallui/answer/impl/res/drawable/urgent_call_background.xml2
-rw-r--r--java/com/android/incallui/answer/impl/res/layout/fragment_incoming_call.xml9
-rw-r--r--java/com/android/incallui/incall/impl/CheckableLabeledButton.java8
-rw-r--r--java/com/android/voicemail/impl/protocol/Vvm3Subscriber.java1
40 files changed, 564 insertions, 741 deletions
diff --git a/java/com/android/contacts/common/list/ContactEntry.java b/java/com/android/contacts/common/list/ContactEntry.java
index e33165e45..90e6735df 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 class ContactEntry {
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 d0adb0421..000000000
--- 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 8dda57f9f..000000000
--- 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 9b6f57860..000000000
--- 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 cf24a8867..201128258 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 7d428e102..967395af4 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.TextUtils;
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 @@ public class ContactDisplayUtils {
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 d3fd36520..f5474eec6 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.MenuItem;
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.AsyncTaskExecutor;
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 @@ public class CallLogAdapter extends GroupingListAdapter
private final Map<Long, Integer> dayGroups = new ArrayMap<>();
private boolean loading = true;
- private ContactsPreferences contactsPreferences;
private boolean isSpamEnabled;
@@ -551,8 +550,6 @@ public class CallLogAdapter extends GroupingListAdapter
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 @@ public class CallLogAdapter extends GroupingListAdapter
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 @@ public class CallLogAdapter extends GroupingListAdapter
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 9b83d54ef..9922ee232 100644
--- a/java/com/android/dialer/app/list/OldSpeedDialFragment.java
+++ b/java/com/android/dialer/app/list/OldSpeedDialFragment.java
@@ -113,9 +113,6 @@ public class OldSpeedDialFragment extends Fragment
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 6b41547c2..8fe67f4f0 100644
--- a/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java
+++ b/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java
@@ -104,7 +104,7 @@ public class PhoneFavoriteSquareTileView extends PhoneFavoriteTileView {
@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 a20185989..4cc48a6de 100644
--- a/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java
+++ b/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java
@@ -37,10 +37,10 @@ import android.widget.BaseAdapter;
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 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements OnDragDrop
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 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements OnDragDrop
}
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 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements OnDragDrop
this.listener = listener;
this.context = context;
resources = context.getResources();
- contactsPreferences = new ContactsPreferences(this.context);
numFrequents = 0;
contactEntries = new ArrayList<>();
}
@@ -140,11 +137,6 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements OnDragDrop
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 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements OnDragDrop
(!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 0b4e11d47..60301dbe8 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 ae068ac6b..8181e21bf 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.calllog.config.CallLogConfigModule;
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 @@ import javax.inject.Singleton;
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 666a0be50..acf14b1ea 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.calllog.ui.CallLogUiComponent;
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 @@ public interface BaseDialerRootComponent
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 622bd5d4f..35e7809ac 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.calllog.config.CallLogConfigModule;
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 @@ import javax.inject.Singleton;
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 fe8bfde43..7212fa960 100644
--- a/java/com/android/dialer/calllogutils/PhoneCallDetails.java
+++ b/java/com/android/dialer/calllogutils/PhoneCallDetails.java
@@ -25,8 +25,8 @@ import android.support.annotation.Nullable;
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 @@ public class PhoneCallDetails {
* 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 @@ public class PhoneCallDetails {
* @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 000000000..5c4097ace
--- /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 000000000..979c525eb
--- /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 000000000..27514615e
--- /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 000000000..dca466ebf
--- /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 000000000..6072cc12c
--- /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 000000000..b74b8b999
--- /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 000000000..8914ddfa4
--- /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 e55f95149..d74afe538 100644
--- a/java/com/android/dialer/contactsfragment/ContactsCursorLoader.java
+++ b/java/com/android/dialer/contactsfragment/ContactsCursorLoader.java
@@ -21,7 +21,7 @@ import android.content.CursorLoader;
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 @@ final class ContactsCursorLoader extends CursorLoader {
}
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 @@ final class ContactsCursorLoader extends CursorLoader {
}
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 794a5b91c..f40abec0d 100644
--- a/java/com/android/dialer/contactsfragment/ContactsFragment.java
+++ b/java/com/android/dialer/contactsfragment/ContactsFragment.java
@@ -41,8 +41,6 @@ import android.view.View.OnScrollChangeListener;
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 @@ import java.util.Arrays;
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 @@ public class ContactsFragment extends Fragment
private @Header int header;
- private ContactsPreferences contactsPrefs;
private boolean hasPhoneNumbers;
private String query;
@@ -154,8 +150,6 @@ public class ContactsFragment extends Fragment
@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 @@ public class ContactsFragment extends Fragment
}
@Override
- public void onChange() {
+ public void onResume() {
+ super.onResume();
if (getActivity() != null
&& isAdded()
&& PermissionsUtil.hasContactsReadPermissions(getContext())) {
@@ -268,7 +263,6 @@ public class ContactsFragment extends Fragment
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 7caa314f3..f4ed21ee4 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.provider.ContactsContract.Directory;
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 @@ public final class SearchContactsCursorLoader extends CursorLoader {
}
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 @@ public final class SearchContactsCursorLoader extends CursorLoader {
}
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/searchfragment/list/NewSearchFragment.java b/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
index fd6db75e9..65ce87340 100644
--- a/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
+++ b/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
@@ -404,7 +404,7 @@ public final class NewSearchFragment extends Fragment
}
// If the user dismissed the prompt without granting us the permission, don't load the cursor.
- if (!PermissionsUtil.hasLocationPermissions(getContext())) {
+ if (getContext() == null || !PermissionsUtil.hasLocationPermissions(getContext())) {
return;
}
diff --git a/java/com/android/dialer/shortcuts/DynamicShortcuts.java b/java/com/android/dialer/shortcuts/DynamicShortcuts.java
index be9e088e1..e39dc27a9 100644
--- a/java/com/android/dialer/shortcuts/DynamicShortcuts.java
+++ b/java/com/android/dialer/shortcuts/DynamicShortcuts.java
@@ -124,7 +124,7 @@ final class DynamicShortcuts {
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 72f0a68c6..b0b83ac32 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.MainThread;
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 @@ public final class SpeedDialUiItemMutator {
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 @@ public final class SpeedDialUiItemMutator {
@WorkerThread
private ImmutableList<SpeedDialUiItem> insertNewContactEntry(Uri contactUri) {
Assert.isWorkerThread();
- contactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
try (Cursor cursor =
appContext
.getContentResolver()
@@ -225,7 +226,6 @@ public final class SpeedDialUiItemMutator {
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 @@ public final class SpeedDialUiItemMutator {
}
private boolean isPrimaryDisplayNameOrder() {
- return contactsPreferences.getDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY;
+ return contactDisplayPreferences.getDisplayOrder() == DisplayOrder.PRIMARY;
}
}
diff --git a/java/com/android/dialer/theme/common/res/values/text_styles.xml b/java/com/android/dialer/theme/common/res/values/text_styles.xml
index def5862d4..0d1fd850e 100644
--- a/java/com/android/dialer/theme/common/res/values/text_styles.xml
+++ b/java/com/android/dialer/theme/common/res/values/text_styles.xml
@@ -33,7 +33,7 @@
<style name="Dialer.TextAppearance.SubHeader" parent="TextAppearance.AppCompat">
<item name="android:textColor">?android:attr/textColorPrimary</item>
- <item name="android:textSize">16sp</item>
+ <item name="android:textSize">14sp</item>
<item name="android:fontFamily">sans-serif-medium</item>
</style>
diff --git a/java/com/android/incallui/CallCardPresenter.java b/java/com/android/incallui/CallCardPresenter.java
index 91255cc7e..b9e6744ea 100644
--- a/java/com/android/incallui/CallCardPresenter.java
+++ b/java/com/android/incallui/CallCardPresenter.java
@@ -44,11 +44,10 @@ import android.view.View;
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 @@ public class CallCardPresenter
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 class CallCardPresenter
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 class CallCardPresenter
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 @@ public class CallCardPresenter
/** 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 c71bf59b2..d13bd3d5a 100644
--- a/java/com/android/incallui/ConferenceParticipantListAdapter.java
+++ b/java/com/android/incallui/ConferenceParticipantListAdapter.java
@@ -18,7 +18,6 @@ package com.android.incallui;
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.BaseAdapter;
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 @@ public class ConferenceParticipantListAdapter extends BaseAdapter {
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 @@ public class ConferenceParticipantListAdapter extends BaseAdapter {
ListView listView, ContactPhotoManager contactPhotoManager) {
this.listView = listView;
- contactsPreferences = ContactsPreferencesFactory.newContactsPreferences(getContext());
this.contactPhotoManager = contactPhotoManager;
}
@@ -116,10 +111,6 @@ public class ConferenceParticipantListAdapter extends BaseAdapter {
*/
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 @@ public class ConferenceParticipantListAdapter extends BaseAdapter {
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 @@ public class ConferenceParticipantListAdapter extends BaseAdapter {
// 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 a9a210963..000000000
--- 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 10c4a6490..160e2502f 100644
--- a/java/com/android/incallui/ExternalCallNotifier.java
+++ b/java/com/android/incallui/ExternalCallNotifier.java
@@ -38,10 +38,9 @@ import android.text.TextUtils;
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 @@ public class ExternalCallNotifier implements ExternalCallList.ExternalCallListen
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 @@ public class ExternalCallNotifier implements ExternalCallList.ExternalCallListen
* 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 @@ public class ExternalCallNotifier implements ExternalCallList.ExternalCallListen
* 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 @@ public class ExternalCallNotifier implements ExternalCallList.ExternalCallListen
}
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 94ce8d7af..addde55f0 100644
--- a/java/com/android/incallui/ReturnToCallController.java
+++ b/java/com/android/incallui/ReturnToCallController.java
@@ -30,9 +30,9 @@ import com.android.bubble.Bubble;
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 @@ public class ReturnToCallController implements InCallUiListener, Listener, Audio
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 5437cc699..589625b8e 100644
--- a/java/com/android/incallui/RttRequestDialogFragment.java
+++ b/java/com/android/incallui/RttRequestDialogFragment.java
@@ -28,9 +28,9 @@ import android.text.TextDirectionHeuristics;
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 @@ public class RttRequestDialogFragment extends DialogFragment {
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 1d73fe8e7..8316d76ee 100644
--- a/java/com/android/incallui/StatusBarNotifier.java
+++ b/java/com/android/incallui/StatusBarNotifier.java
@@ -64,12 +64,11 @@ import android.text.TextUtils;
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 @@ public class StatusBarNotifier
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 class StatusBarNotifier
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 @@ public class StatusBarNotifier
}
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/answer/impl/res/drawable/urgent_call_background.xml b/java/com/android/incallui/answer/impl/res/drawable/urgent_call_background.xml
index d995980c6..769529025 100644
--- a/java/com/android/incallui/answer/impl/res/drawable/urgent_call_background.xml
+++ b/java/com/android/incallui/answer/impl/res/drawable/urgent_call_background.xml
@@ -18,5 +18,5 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="24dp"/>
- <solid android:color="#F50057"/>
+ <solid android:color="?android:attr/colorPrimary"/>
</shape> \ No newline at end of file
diff --git a/java/com/android/incallui/answer/impl/res/layout/fragment_incoming_call.xml b/java/com/android/incallui/answer/impl/res/layout/fragment_incoming_call.xml
index 1672bf984..3a68bd4f6 100644
--- a/java/com/android/incallui/answer/impl/res/layout/fragment_incoming_call.xml
+++ b/java/com/android/incallui/answer/impl/res/layout/fragment_incoming_call.xml
@@ -121,19 +121,16 @@
<!-- TODO(a bug): textColorPrimary or textColorPrimaryInverse? -->
<TextView
android:id="@+id/incall_important_call_badge"
- android:textStyle="bold"
android:layout_width="wrap_content"
- android:layout_height="48dp"
+ android:layout_height="32dp"
android:layout_marginTop="4dp"
android:layout_marginBottom="@dimen/answer_importance_margin_bottom"
android:background="@drawable/urgent_call_background"
- android:elevation="@dimen/answer_data_elevation"
android:gravity="center"
android:maxLines="1"
android:text="@string/call_incoming_important"
- android:textAllCaps="true"
- android:textColor="?android:attr/colorBackground"
- android:textSize="14sp"/>
+ style="@style/Dialer.TextAppearance.SubHeader"
+ android:textColor="?android:attr/colorBackground"/>
<FrameLayout
android:id="@+id/incall_location_holder"
diff --git a/java/com/android/incallui/incall/impl/CheckableLabeledButton.java b/java/com/android/incallui/incall/impl/CheckableLabeledButton.java
index 4e8fa82c4..d4aba4c0b 100644
--- a/java/com/android/incallui/incall/impl/CheckableLabeledButton.java
+++ b/java/com/android/incallui/incall/impl/CheckableLabeledButton.java
@@ -39,7 +39,6 @@ import com.android.dialer.theme.base.ThemeComponent;
public class CheckableLabeledButton extends LinearLayout implements Checkable {
private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked};
- private static final float DISABLED_STATE_OPACITY = .3f;
private boolean broadcasting;
private boolean isChecked;
private OnCheckedChangeListener onCheckedChangeListener;
@@ -124,13 +123,6 @@ public class CheckableLabeledButton extends LinearLayout implements Checkable {
setOutlineProvider(null);
}
- @Override
- public void refreshDrawableState() {
- super.refreshDrawableState();
- iconView.setAlpha(isEnabled() ? 1f : DISABLED_STATE_OPACITY);
- labelView.setAlpha(isEnabled() ? 1f : DISABLED_STATE_OPACITY);
- }
-
public Drawable getIconDrawable() {
return iconView.getDrawable();
}
diff --git a/java/com/android/voicemail/impl/protocol/Vvm3Subscriber.java b/java/com/android/voicemail/impl/protocol/Vvm3Subscriber.java
index 6ac233729..3bbda4797 100644
--- a/java/com/android/voicemail/impl/protocol/Vvm3Subscriber.java
+++ b/java/com/android/voicemail/impl/protocol/Vvm3Subscriber.java
@@ -210,6 +210,7 @@ public class Vvm3Subscriber {
clickSubscribeLink(subscribeLink);
} catch (ProvisioningException e) {
VvmLog.e(TAG, e.toString());
+ helper.handleEvent(status, OmtpEvents.CONFIG_SERVICE_NOT_AVAILABLE);
task.fail();
}
}