Stop using DisplayNameFormatter and reduce a query column
setDisplayName()'s 3rd param "highlightingEnabled" never becomes
true in the current implementation and thus using the entire class
seems less meaningful. After removing the formatter class, we can be
sure one of primary and alternative name column won't be needed and
can be conditionally removed.
Per the observation above, this change removes the column for Phone
UI. Note that this does *not* optimize People side yet, since it has
quite different and more complicated configuration there.
Other fixes:
- replace getMarqueeText() with setMarqueeText(), since the former
implicitly requires unconditional "new String()", while the latter
doesn't.
- Use SpannableString instead of SpannableStringBuilder. Our prefix
highlighter is already using SpannableString, and we can expect
less GC by using exactly same classes for constructing spanned
CharSequence.
- Group query constants like I5ad0876ce469fbf86334e3f77b15cd240d9f761b
for cleaning our code and make it more consistent.
-- Legacy adapters aren't modified since they are legacy anyway. We
probably don't want to touch those files as much as possible.
TESTED:
- Phone UI and People UI work with display/sort order changes
- "(No name)" is shown correctly (mUnknownNameText is working)
- Prefix highlighting works correctly (in search screens)
- Pickers work with sort order change (primary/alternative)
- no performance regression at least (no visible performance improve
will occur)
Bug: 5550672
Change-Id: Ie69b74bbabcc7211cf2b107c93980172da2d744e
diff --git a/src/com/android/contacts/format/DisplayNameFormatter.java b/src/com/android/contacts/format/DisplayNameFormatter.java
deleted file mode 100644
index 2099c53..0000000
--- a/src/com/android/contacts/format/DisplayNameFormatter.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2011 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.format;
-
-import com.android.contacts.widget.TextWithHighlighting;
-import com.android.contacts.widget.TextWithHighlightingFactory;
-
-import android.database.CharArrayBuffer;
-import android.widget.TextView;
-
-/**
- * Sets the content of the given text view, to contain the formatted display name, with a
- * prefix if necessary.
- */
-public final class DisplayNameFormatter {
- private final CharArrayBuffer mNameBuffer = new CharArrayBuffer(128);
- private final CharArrayBuffer mAlternateNameBuffer = new CharArrayBuffer(128);
- private final PrefixHighlighter mPrefixHighlighter;
-
- private TextWithHighlightingFactory mTextWithHighlightingFactory;
- private TextWithHighlighting mTextWithHighlighting;
- private CharSequence mUnknownNameText;
-
- public DisplayNameFormatter(PrefixHighlighter prefixHighlighter) {
- mPrefixHighlighter = prefixHighlighter;
- }
-
- public CharArrayBuffer getNameBuffer() {
- return mNameBuffer;
- }
-
- public CharArrayBuffer getAlternateNameBuffer() {
- return mAlternateNameBuffer;
- }
-
- public void setUnknownNameText(CharSequence unknownNameText) {
- mUnknownNameText = unknownNameText;
- }
-
- public void setDisplayName(TextView view, int displayOrder,
- boolean highlightingEnabled, char[] highlightedPrefix) {
- view.setText(getDisplayName(displayOrder, highlightingEnabled, highlightedPrefix));
- }
-
- public CharSequence getDisplayName(int displayOrder, boolean highlightingEnabled,
- char[] highlightedPrefix) {
- int size = mNameBuffer.sizeCopied;
- if (size == 0) {
- return mUnknownNameText;
- }
-
- CharSequence text;
- if (highlightingEnabled) {
- if (mTextWithHighlighting == null) {
- mTextWithHighlighting =
- mTextWithHighlightingFactory.createTextWithHighlighting();
- }
- mTextWithHighlighting.setText(mNameBuffer, mAlternateNameBuffer);
- text = mTextWithHighlighting;
- } else {
- text = FormatUtils.charArrayBufferToString(mNameBuffer);
- }
- if (highlightedPrefix != null) {
- text = mPrefixHighlighter.apply(text, highlightedPrefix);
- }
- return text;
- }
-}
diff --git a/src/com/android/contacts/list/ContactListAdapter.java b/src/com/android/contacts/list/ContactListAdapter.java
index bc988e4..1592004 100644
--- a/src/com/android/contacts/list/ContactListAdapter.java
+++ b/src/com/android/contacts/list/ContactListAdapter.java
@@ -38,63 +38,62 @@
*/
public abstract class ContactListAdapter extends ContactEntryListAdapter {
- protected static final String[] PROJECTION_CONTACT = new String[] {
- Contacts._ID, // 0
- Contacts.DISPLAY_NAME_PRIMARY, // 1
- Contacts.DISPLAY_NAME_ALTERNATIVE, // 2
- Contacts.CONTACT_PRESENCE, // 3
- Contacts.CONTACT_STATUS, // 4
- Contacts.PHOTO_ID, // 5
- Contacts.PHOTO_THUMBNAIL_URI, // 6
- Contacts.LOOKUP_KEY, // 7
- Contacts.IS_USER_PROFILE, // 8
- };
+ protected static class ContactQuery {
+ public static final String[] PROJECTION_CONTACT = new String[] {
+ Contacts._ID, // 0
+ Contacts.DISPLAY_NAME_PRIMARY, // 1
+ Contacts.DISPLAY_NAME_ALTERNATIVE, // 2
+ Contacts.CONTACT_PRESENCE, // 3
+ Contacts.CONTACT_STATUS, // 4
+ Contacts.PHOTO_ID, // 5
+ Contacts.PHOTO_THUMBNAIL_URI, // 6
+ Contacts.LOOKUP_KEY, // 7
+ Contacts.IS_USER_PROFILE, // 8
+ };
- protected static final String[] PROJECTION_DATA = new String[] {
- Data.CONTACT_ID, // 0
- Data.DISPLAY_NAME_PRIMARY, // 1
- Data.DISPLAY_NAME_ALTERNATIVE, // 2
- Data.CONTACT_PRESENCE, // 3
- Data.CONTACT_STATUS, // 4
- Data.PHOTO_ID, // 5
- Data.PHOTO_THUMBNAIL_URI, // 6
- Data.LOOKUP_KEY, // 7
- };
+ public static final String[] PROJECTION_DATA = new String[] {
+ Data.CONTACT_ID, // 0
+ Data.DISPLAY_NAME_PRIMARY, // 1
+ Data.DISPLAY_NAME_ALTERNATIVE, // 2
+ Data.CONTACT_PRESENCE, // 3
+ Data.CONTACT_STATUS, // 4
+ Data.PHOTO_ID, // 5
+ Data.PHOTO_THUMBNAIL_URI, // 6
+ Data.LOOKUP_KEY, // 7
+ };
- protected static final String[] FILTER_PROJECTION = new String[] {
- Contacts._ID, // 0
- Contacts.DISPLAY_NAME_PRIMARY, // 1
- Contacts.DISPLAY_NAME_ALTERNATIVE, // 2
- Contacts.CONTACT_PRESENCE, // 3
- Contacts.CONTACT_STATUS, // 4
- Contacts.PHOTO_ID, // 5
- Contacts.PHOTO_THUMBNAIL_URI, // 6
- Contacts.LOOKUP_KEY, // 7
- Contacts.IS_USER_PROFILE, // 8
- SearchSnippetColumns.SNIPPET, // 9
- };
+ public static final String[] FILTER_PROJECTION = new String[] {
+ Contacts._ID, // 0
+ Contacts.DISPLAY_NAME_PRIMARY, // 1
+ Contacts.DISPLAY_NAME_ALTERNATIVE, // 2
+ Contacts.CONTACT_PRESENCE, // 3
+ Contacts.CONTACT_STATUS, // 4
+ Contacts.PHOTO_ID, // 5
+ Contacts.PHOTO_THUMBNAIL_URI, // 6
+ Contacts.LOOKUP_KEY, // 7
+ Contacts.IS_USER_PROFILE, // 8
+ SearchSnippetColumns.SNIPPET, // 9
+ };
- protected static final int CONTACT_ID_COLUMN_INDEX = 0;
- protected static final int CONTACT_DISPLAY_NAME_PRIMARY_COLUMN_INDEX = 1;
- protected static final int CONTACT_DISPLAY_NAME_ALTERNATIVE_COLUMN_INDEX = 2;
- protected static final int CONTACT_PRESENCE_STATUS_COLUMN_INDEX = 3;
- protected static final int CONTACT_CONTACT_STATUS_COLUMN_INDEX = 4;
- protected static final int CONTACT_PHOTO_ID_COLUMN_INDEX = 5;
- protected static final int CONTACT_PHOTO_URI_COLUMN_INDEX = 6;
- protected static final int CONTACT_LOOKUP_KEY_COLUMN_INDEX = 7;
- protected static final int CONTACT_IS_USER_PROFILE = 8;
- protected static final int CONTACT_SNIPPET_COLUMN_INDEX = 9;
+ public static final int CONTACT_ID = 0;
+ public static final int CONTACT_DISPLAY_NAME_PRIMARY = 1;
+ public static final int CONTACT_DISPLAY_NAME_ALTERNATIVE = 2;
+ public static final int CONTACT_PRESENCE_STATUS = 3;
+ public static final int CONTACT_CONTACT_STATUS = 4;
+ public static final int CONTACT_PHOTO_ID = 5;
+ public static final int CONTACT_PHOTO_URI = 6;
+ public static final int CONTACT_LOOKUP_KEY = 7;
+ public static final int CONTACT_IS_USER_PROFILE = 8;
+ public static final int CONTACT_SNIPPET = 9;
+ }
private CharSequence mUnknownNameText;
private int mDisplayNameColumnIndex;
- private int mAlternativeDisplayNameColumnIndex;
private long mSelectedContactDirectoryId;
private String mSelectedContactLookupKey;
private long mSelectedContactId;
- private ContactListFilter mFilter;
-
public ContactListAdapter(Context context) {
super(context);
@@ -137,11 +136,9 @@
public void setContactNameDisplayOrder(int displayOrder) {
super.setContactNameDisplayOrder(displayOrder);
if (getContactNameDisplayOrder() == ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY) {
- mDisplayNameColumnIndex = CONTACT_DISPLAY_NAME_PRIMARY_COLUMN_INDEX;
- mAlternativeDisplayNameColumnIndex = CONTACT_DISPLAY_NAME_ALTERNATIVE_COLUMN_INDEX;
+ mDisplayNameColumnIndex = ContactQuery.CONTACT_DISPLAY_NAME_PRIMARY;
} else {
- mDisplayNameColumnIndex = CONTACT_DISPLAY_NAME_ALTERNATIVE_COLUMN_INDEX;
- mAlternativeDisplayNameColumnIndex = CONTACT_DISPLAY_NAME_PRIMARY_COLUMN_INDEX;
+ mDisplayNameColumnIndex = ContactQuery.CONTACT_DISPLAY_NAME_ALTERNATIVE;
}
}
@@ -156,8 +153,8 @@
}
public Uri getContactUri(int partitionIndex, Cursor cursor) {
- long contactId = cursor.getLong(CONTACT_ID_COLUMN_INDEX);
- String lookupKey = cursor.getString(CONTACT_LOOKUP_KEY_COLUMN_INDEX);
+ long contactId = cursor.getLong(ContactQuery.CONTACT_ID);
+ String lookupKey = cursor.getString(ContactQuery.CONTACT_LOOKUP_KEY);
Uri uri = Contacts.getLookupUri(contactId, lookupKey);
long directoryId = ((DirectoryPartition)getPartition(partitionIndex)).getDirectoryId();
if (directoryId != Directory.DEFAULT) {
@@ -180,12 +177,12 @@
}
String lookupKey = getSelectedContactLookupKey();
if (lookupKey != null && TextUtils.equals(lookupKey,
- cursor.getString(CONTACT_LOOKUP_KEY_COLUMN_INDEX))) {
+ cursor.getString(ContactQuery.CONTACT_LOOKUP_KEY))) {
return true;
}
return directoryId != Directory.DEFAULT && directoryId != Directory.LOCAL_INVISIBLE
- && getSelectedContactId() == cursor.getLong(CONTACT_ID_COLUMN_INDEX);
+ && getSelectedContactId() == cursor.getLong(ContactQuery.CONTACT_ID);
}
@Override
@@ -204,7 +201,7 @@
Placement placement = getItemPlacementInSection(position);
// First position, set the contacts number string
- if (position == 0 && cursor.getInt(CONTACT_IS_USER_PROFILE) == 1) {
+ if (position == 0 && cursor.getInt(ContactQuery.CONTACT_IS_USER_PROFILE) == 1) {
view.setCountView(getContactsCount());
} else {
view.setCountView(null);
@@ -226,32 +223,31 @@
// Set the photo, if available
long photoId = 0;
- if (!cursor.isNull(CONTACT_PHOTO_ID_COLUMN_INDEX)) {
- photoId = cursor.getLong(CONTACT_PHOTO_ID_COLUMN_INDEX);
+ if (!cursor.isNull(ContactQuery.CONTACT_PHOTO_ID)) {
+ photoId = cursor.getLong(ContactQuery.CONTACT_PHOTO_ID);
}
if (photoId != 0) {
getPhotoLoader().loadPhoto(view.getPhotoView(), photoId, false, false);
} else {
- final String photoUriString = cursor.getString(CONTACT_PHOTO_URI_COLUMN_INDEX);
+ final String photoUriString = cursor.getString(ContactQuery.CONTACT_PHOTO_URI);
final Uri photoUri = photoUriString == null ? null : Uri.parse(photoUriString);
getPhotoLoader().loadPhoto(view.getPhotoView(), photoUri, false, false);
}
}
protected void bindName(final ContactListItemView view, Cursor cursor) {
- view.showDisplayName(cursor, mDisplayNameColumnIndex, mAlternativeDisplayNameColumnIndex,
- false, getContactNameDisplayOrder());
+ view.showDisplayName(cursor, mDisplayNameColumnIndex, getContactNameDisplayOrder());
// Note: we don't show phonetic any more (See issue 5265330)
}
protected void bindPresenceAndStatusMessage(final ContactListItemView view, Cursor cursor) {
- view.showPresenceAndStatusMessage(cursor, CONTACT_PRESENCE_STATUS_COLUMN_INDEX,
- CONTACT_CONTACT_STATUS_COLUMN_INDEX);
+ view.showPresenceAndStatusMessage(cursor, ContactQuery.CONTACT_PRESENCE_STATUS,
+ ContactQuery.CONTACT_CONTACT_STATUS);
}
protected void bindSearchSnippet(final ContactListItemView view, Cursor cursor) {
- view.showSnippet(cursor, CONTACT_SNIPPET_COLUMN_INDEX);
+ view.showSnippet(cursor, ContactQuery.CONTACT_SNIPPET);
}
public int getSelectedContactPosition() {
@@ -282,7 +278,7 @@
int offset = -1;
while (cursor.moveToNext()) {
if (mSelectedContactLookupKey != null) {
- String lookupKey = cursor.getString(CONTACT_LOOKUP_KEY_COLUMN_INDEX);
+ String lookupKey = cursor.getString(ContactQuery.CONTACT_LOOKUP_KEY);
if (mSelectedContactLookupKey.equals(lookupKey)) {
offset = cursor.getPosition();
break;
@@ -290,7 +286,7 @@
}
if (mSelectedContactId != 0 && (mSelectedContactDirectoryId == Directory.DEFAULT
|| mSelectedContactDirectoryId == Directory.LOCAL_INVISIBLE)) {
- long contactId = cursor.getLong(CONTACT_ID_COLUMN_INDEX);
+ long contactId = cursor.getLong(ContactQuery.CONTACT_ID);
if (contactId == mSelectedContactId) {
offset = cursor.getPosition();
break;
@@ -342,7 +338,7 @@
// Check if a profile exists
if (cursor != null && cursor.getCount() > 0) {
cursor.moveToFirst();
- setProfileExists(cursor.getInt(CONTACT_IS_USER_PROFILE) == 1);
+ setProfileExists(cursor.getInt(ContactQuery.CONTACT_IS_USER_PROFILE) == 1);
}
}
}
diff --git a/src/com/android/contacts/list/ContactListItemView.java b/src/com/android/contacts/list/ContactListItemView.java
index 5617664..4390d78 100644
--- a/src/com/android/contacts/list/ContactListItemView.java
+++ b/src/com/android/contacts/list/ContactListItemView.java
@@ -19,7 +19,6 @@
import com.android.contacts.ContactPresenceIconUtil;
import com.android.contacts.ContactStatusUtil;
import com.android.contacts.R;
-import com.android.contacts.format.DisplayNameFormatter;
import com.android.contacts.format.PrefixHighlighter;
import android.content.Context;
@@ -36,7 +35,7 @@
import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;
import android.text.Spannable;
-import android.text.SpannableStringBuilder;
+import android.text.SpannableString;
import android.text.TextUtils;
import android.text.TextUtils.TruncateAt;
import android.util.AttributeSet;
@@ -188,8 +187,14 @@
private int mLabelAndDataViewMaxHeight;
private OnClickListener mCallButtonClickListener;
- private CharArrayBuffer mDataBuffer = new CharArrayBuffer(128);
- private CharArrayBuffer mPhoneticNameBuffer = new CharArrayBuffer(128);
+ // TODO: some TextView fields are using CharArrayBuffer while some are not. Determine which is
+ // more efficient for each case or in general, and simplify the whole implementation.
+ // Note: if we're sure MARQUEE will be used every time, there's no reason to use
+ // CharArrayBuffer, since MARQUEE requires Span and thus we need to copy characters inside the
+ // buffer to Spannable once, while CharArrayBuffer is for directly applying char array to
+ // TextView without any modification.
+ private final CharArrayBuffer mDataBuffer = new CharArrayBuffer(128);
+ private final CharArrayBuffer mPhoneticNameBuffer = new CharArrayBuffer(128);
private boolean mActivatedStateSupported;
@@ -197,8 +202,7 @@
/** A helper used to highlight a prefix in a text field. */
private PrefixHighlighter mPrefixHighligher;
- /** A helper used to format display names. */
- private DisplayNameFormatter mDisplayNameFormatter;
+ private CharSequence mUnknownNameText;
/**
* Special class to allow the parent to be pressed without being pressed itself.
@@ -295,8 +299,6 @@
if (mActivatedBackgroundDrawable != null) {
mActivatedBackgroundDrawable.setCallback(this);
}
-
- mDisplayNameFormatter = new DisplayNameFormatter(mPrefixHighligher);
}
/**
@@ -307,7 +309,7 @@
}
public void setUnknownNameText(CharSequence unknownNameText) {
- mDisplayNameFormatter.setUnknownNameText(unknownNameText);
+ mUnknownNameText = unknownNameText;
}
public void setQuickContactEnabled(boolean flag) {
@@ -790,7 +792,7 @@
mHeaderDivider.setBackgroundColor(mHeaderUnderlineColor);
addView(mHeaderDivider);
}
- mHeaderTextView.setText(getMarqueeText(title));
+ setMarqueeText(mHeaderTextView, title);
mHeaderTextView.setVisibility(View.VISIBLE);
mHeaderDivider.setVisibility(View.VISIBLE);
mHeaderTextView.setAllCaps(true);
@@ -936,7 +938,7 @@
}
} else {
getPhoneticNameTextView();
- mPhoneticNameTextView.setText(getMarqueeText(text, size));
+ setMarqueeText(mPhoneticNameTextView, text, size);
mPhoneticNameTextView.setVisibility(VISIBLE);
}
}
@@ -967,22 +969,7 @@
}
} else {
getLabelView();
- mLabelView.setText(getMarqueeText(text));
- mLabelView.setVisibility(VISIBLE);
- }
- }
-
- /**
- * Adds or updates a text view for the data label.
- */
- public void setLabel(char[] text, int size) {
- if (text == null || size == 0) {
- if (mLabelView != null) {
- mLabelView.setVisibility(View.GONE);
- }
- } else {
- getLabelView();
- mLabelView.setText(getMarqueeText(text, size));
+ setMarqueeText(mLabelView, text);
mLabelView.setVisibility(VISIBLE);
}
}
@@ -1017,28 +1004,31 @@
if (mDataView != null) {
mDataView.setVisibility(View.GONE);
}
- return;
} else {
getDataView();
- mDataView.setText(getMarqueeText(text, size));
+ setMarqueeText(mDataView, text, size);
mDataView.setVisibility(VISIBLE);
}
}
- private CharSequence getMarqueeText(char[] text, int size) {
- return getMarqueeText(new String(text, 0, size));
+ private void setMarqueeText(TextView textView, char[] text, int size) {
+ if (getTextEllipsis() == TruncateAt.MARQUEE) {
+ setMarqueeText(textView, new String(text, 0, size));
+ } else {
+ textView.setText(text, 0, size);
+ }
}
- private CharSequence getMarqueeText(CharSequence text) {
+ private void setMarqueeText(TextView textView, CharSequence text) {
if (getTextEllipsis() == TruncateAt.MARQUEE) {
// To show MARQUEE correctly (with END effect during non-active state), we need
// to build Spanned with MARQUEE in addition to TextView's ellipsize setting.
- final SpannableStringBuilder builder = new SpannableStringBuilder(text);
- builder.setSpan(TruncateAt.MARQUEE, 0, builder.length(),
+ final SpannableString spannable = new SpannableString(text);
+ spannable.setSpan(TruncateAt.MARQUEE, 0, spannable.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- return builder;
+ textView.setText(spannable);
} else {
- return text;
+ textView.setText(text);
}
}
@@ -1128,7 +1118,7 @@
}
} else {
getCountView();
- mCountView.setText(getMarqueeText(text));
+ setMarqueeText(mCountView, text);
mCountView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mCountViewTextSize);
mCountView.setGravity(Gravity.CENTER_VERTICAL);
mCountView.setTextColor(mContactsCountTextColor);
@@ -1146,7 +1136,7 @@
}
} else {
getStatusView();
- mStatusView.setText(getMarqueeText(text));
+ setMarqueeText(mStatusView, text);
mStatusView.setVisibility(VISIBLE);
}
}
@@ -1174,16 +1164,14 @@
return TruncateAt.MARQUEE;
}
- public void showDisplayName(Cursor cursor, int nameColumnIndex, int alternativeNameColumnIndex,
- boolean highlightingEnabled, int displayOrder) {
- // Copy out the display name and alternate display name.
- cursor.copyStringToBuffer(nameColumnIndex, mDisplayNameFormatter.getNameBuffer());
- cursor.copyStringToBuffer(alternativeNameColumnIndex,
- mDisplayNameFormatter.getAlternateNameBuffer());
-
- CharSequence displayName = mDisplayNameFormatter.getDisplayName(
- displayOrder, highlightingEnabled, mHighlightedPrefix);
- getNameTextView().setText(getMarqueeText(displayName));
+ public void showDisplayName(Cursor cursor, int nameColumnIndex, int displayOrder) {
+ CharSequence name = cursor.getString(nameColumnIndex);
+ if (!TextUtils.isEmpty(name)) {
+ name = mPrefixHighligher.apply(name, mHighlightedPrefix);
+ } else {
+ name = mUnknownNameText;
+ }
+ setMarqueeText(getNameTextView(), name);
// Since the quick contact content description is derived from the display name and there is
// no guarantee that when the quick contact is initialized the display name is already set,
diff --git a/src/com/android/contacts/list/DefaultContactListAdapter.java b/src/com/android/contacts/list/DefaultContactListAdapter.java
index 3409f56..deab8ab 100644
--- a/src/com/android/contacts/list/DefaultContactListAdapter.java
+++ b/src/com/android/contacts/list/DefaultContactListAdapter.java
@@ -72,7 +72,7 @@
// Regardless of the directory, we don't want anything returned,
// so let's just send a "nothing" query to the local directory.
loader.setUri(Contacts.CONTENT_URI);
- loader.setProjection(PROJECTION_CONTACT);
+ loader.setProjection(ContactQuery.PROJECTION_CONTACT);
loader.setSelection("0");
} else {
Builder builder = Contacts.CONTENT_FILTER_URI.buildUpon();
@@ -87,7 +87,7 @@
SNIPPET_ARGS);
builder.appendQueryParameter(SearchSnippetColumns.DEFERRED_SNIPPETING_KEY,"1");
loader.setUri(builder.build());
- loader.setProjection(FILTER_PROJECTION);
+ loader.setProjection(ContactQuery.FILTER_PROJECTION);
}
} else {
configureUri(loader, directoryId, filter);
@@ -139,9 +139,9 @@
protected void configureProjection(
CursorLoader loader, long directoryId, ContactListFilter filter) {
if (filter != null && filter.filterType == ContactListFilter.FILTER_TYPE_GROUP) {
- loader.setProjection(PROJECTION_DATA);
+ loader.setProjection(ContactQuery.PROJECTION_DATA);
} else {
- loader.setProjection(PROJECTION_CONTACT);
+ loader.setProjection(ContactQuery.PROJECTION_CONTACT);
}
}
@@ -228,9 +228,8 @@
bindSectionHeaderAndDivider(view, position, cursor);
if (isQuickContactEnabled()) {
- bindQuickContact(view, partition, cursor,
- CONTACT_PHOTO_ID_COLUMN_INDEX, CONTACT_ID_COLUMN_INDEX,
- CONTACT_LOOKUP_KEY_COLUMN_INDEX);
+ bindQuickContact(view, partition, cursor, ContactQuery.CONTACT_PHOTO_ID,
+ ContactQuery.CONTACT_ID, ContactQuery.CONTACT_LOOKUP_KEY);
} else {
bindPhoto(view, partition, cursor);
}
diff --git a/src/com/android/contacts/list/EmailAddressListAdapter.java b/src/com/android/contacts/list/EmailAddressListAdapter.java
index 52daaa0..e0c561f 100644
--- a/src/com/android/contacts/list/EmailAddressListAdapter.java
+++ b/src/com/android/contacts/list/EmailAddressListAdapter.java
@@ -34,27 +34,34 @@
*/
public class EmailAddressListAdapter extends ContactEntryListAdapter {
- static final String[] EMAILS_PROJECTION = new String[] {
- Email._ID, // 0
- Email.TYPE, // 1
- Email.LABEL, // 2
- Email.DATA, // 3
- Email.DISPLAY_NAME_PRIMARY, // 4
- Email.DISPLAY_NAME_ALTERNATIVE, // 5
- Email.PHOTO_ID, // 6
- };
+ protected static class EmailQuery {
+ private static final String[] PROJECTION_PRIMARY = new String[] {
+ Email._ID, // 0
+ Email.TYPE, // 1
+ Email.LABEL, // 2
+ Email.DATA, // 3
+ Email.PHOTO_ID, // 4
+ Email.DISPLAY_NAME_PRIMARY, // 5
+ };
- protected static final int EMAIL_ID_COLUMN_INDEX = 0;
- protected static final int EMAIL_TYPE_COLUMN_INDEX = 1;
- protected static final int EMAIL_LABEL_COLUMN_INDEX = 2;
- protected static final int EMAIL_ADDRESS_COLUMN_INDEX = 3;
- protected static final int EMAIL_PRIMARY_DISPLAY_NAME_COLUMN_INDEX = 4;
- protected static final int EMAIL_ALTERNATIVE_DISPLAY_NAME_COLUMN_INDEX = 5;
- protected static final int EMAIL_PHOTO_ID_COLUMN_INDEX = 6;
+ private static final String[] PROJECTION_ALTERNATIVE = new String[] {
+ Email._ID, // 0
+ Email.TYPE, // 1
+ Email.LABEL, // 2
+ Email.DATA, // 3
+ Email.PHOTO_ID, // 4
+ Email.DISPLAY_NAME_ALTERNATIVE, // 5
+ };
- private CharSequence mUnknownNameText;
- private int mDisplayNameColumnIndex;
- private int mAlternativeDisplayNameColumnIndex;
+ public static final int EMAIL_ID = 0;
+ public static final int EMAIL_TYPE = 1;
+ public static final int EMAIL_LABEL = 2;
+ public static final int EMAIL_ADDRESS = 3;
+ public static final int EMAIL_PHOTO_ID = 4;
+ public static final int EMAIL_DISPLAY_NAME = 5;
+ }
+
+ private final CharSequence mUnknownNameText;
public EmailAddressListAdapter(Context context) {
super(context);
@@ -75,7 +82,12 @@
builder.appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY,
String.valueOf(directoryId));
loader.setUri(builder.build());
- loader.setProjection(EMAILS_PROJECTION);
+
+ if (getContactNameDisplayOrder() == ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY) {
+ loader.setProjection(EmailQuery.PROJECTION_PRIMARY);
+ } else {
+ loader.setProjection(EmailQuery.PROJECTION_ALTERNATIVE);
+ }
if (getSortOrder() == ContactsContract.Preferences.SORT_ORDER_PRIMARY) {
loader.setSortOrder(Email.SORT_KEY_PRIMARY);
@@ -91,19 +103,7 @@
@Override
public String getContactDisplayName(int position) {
- return ((Cursor)getItem(position)).getString(mDisplayNameColumnIndex);
- }
-
- @Override
- public void setContactNameDisplayOrder(int displayOrder) {
- super.setContactNameDisplayOrder(displayOrder);
- if (getContactNameDisplayOrder() == ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY) {
- mDisplayNameColumnIndex = EMAIL_PRIMARY_DISPLAY_NAME_COLUMN_INDEX;
- mAlternativeDisplayNameColumnIndex = EMAIL_ALTERNATIVE_DISPLAY_NAME_COLUMN_INDEX;
- } else {
- mDisplayNameColumnIndex = EMAIL_ALTERNATIVE_DISPLAY_NAME_COLUMN_INDEX;
- mAlternativeDisplayNameColumnIndex = EMAIL_PRIMARY_DISPLAY_NAME_COLUMN_INDEX;
- }
+ return ((Cursor) getItem(position)).getString(EmailQuery.EMAIL_DISPLAY_NAME);
}
/**
@@ -111,7 +111,7 @@
* position.
*/
public Uri getDataUri(int position) {
- long id = ((Cursor)getItem(position)).getLong(EMAIL_ID_COLUMN_INDEX);
+ long id = ((Cursor)getItem(position)).getLong(EmailQuery.EMAIL_ID);
return ContentUris.withAppendedId(Data.CONTENT_URI, id);
}
@@ -135,15 +135,15 @@
protected void bindEmailAddress(ContactListItemView view, Cursor cursor) {
CharSequence label = null;
- if (!cursor.isNull(EMAIL_TYPE_COLUMN_INDEX)) {
- final int type = cursor.getInt(EMAIL_TYPE_COLUMN_INDEX);
- final String customLabel = cursor.getString(EMAIL_LABEL_COLUMN_INDEX);
+ if (!cursor.isNull(EmailQuery.EMAIL_TYPE)) {
+ final int type = cursor.getInt(EmailQuery.EMAIL_TYPE);
+ final String customLabel = cursor.getString(EmailQuery.EMAIL_LABEL);
// TODO cache
label = Email.getTypeLabel(getContext().getResources(), type, customLabel);
}
view.setLabel(label);
- view.showData(cursor, EMAIL_ADDRESS_COLUMN_INDEX);
+ view.showData(cursor, EmailQuery.EMAIL_ADDRESS);
}
protected void bindSectionHeaderAndDivider(final ContactListItemView view, int position) {
@@ -165,14 +165,13 @@
}
protected void bindName(final ContactListItemView view, Cursor cursor) {
- view.showDisplayName(cursor, mDisplayNameColumnIndex, mAlternativeDisplayNameColumnIndex,
- false, getContactNameDisplayOrder());
+ view.showDisplayName(cursor, EmailQuery.EMAIL_DISPLAY_NAME, getContactNameDisplayOrder());
}
protected void bindPhoto(final ContactListItemView view, Cursor cursor) {
long photoId = 0;
- if (!cursor.isNull(EMAIL_PHOTO_ID_COLUMN_INDEX)) {
- photoId = cursor.getLong(EMAIL_PHOTO_ID_COLUMN_INDEX);
+ if (!cursor.isNull(EmailQuery.EMAIL_PHOTO_ID)) {
+ photoId = cursor.getLong(EmailQuery.EMAIL_PHOTO_ID);
}
getPhotoLoader().loadPhoto(view.getPhotoView(), photoId, false, false);
diff --git a/src/com/android/contacts/list/JoinContactListAdapter.java b/src/com/android/contacts/list/JoinContactListAdapter.java
index 73bca52..b81dd3b 100644
--- a/src/com/android/contacts/list/JoinContactListAdapter.java
+++ b/src/com/android/contacts/list/JoinContactListAdapter.java
@@ -43,15 +43,12 @@
private long mTargetContactId;
- private int mShowAllContactsViewType;
-
public JoinContactListAdapter(Context context) {
super(context);
setPinnedPartitionHeadersEnabled(true);
setSectionHeaderDisplayEnabled(true);
setIndexedPartition(PARTITION_ALL_CONTACTS);
setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
- mShowAllContactsViewType = getViewTypeCount() - 1;
}
@Override
@@ -86,7 +83,7 @@
loader.setSuggestionUri(builder.build());
// TODO simplify projection
- loader.setProjection(PROJECTION_CONTACT);
+ loader.setProjection(ContactQuery.PROJECTION_CONTACT);
Uri allContactsUri = buildSectionIndexerUri(Contacts.CONTENT_URI).buildUpon()
.appendQueryParameter(
ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT))
@@ -193,16 +190,16 @@
}
public Cursor getShowAllContactsLabelCursor() {
- MatrixCursor matrixCursor = new MatrixCursor(PROJECTION_CONTACT);
- Object[] row = new Object[PROJECTION_CONTACT.length];
+ MatrixCursor matrixCursor = new MatrixCursor(ContactQuery.PROJECTION_CONTACT);
+ Object[] row = new Object[ContactQuery.PROJECTION_CONTACT.length];
matrixCursor.addRow(row);
return matrixCursor;
}
@Override
public Uri getContactUri(int partitionIndex, Cursor cursor) {
- long contactId = cursor.getLong(CONTACT_ID_COLUMN_INDEX);
- String lookupKey = cursor.getString(CONTACT_LOOKUP_KEY_COLUMN_INDEX);
+ long contactId = cursor.getLong(ContactQuery.CONTACT_ID);
+ String lookupKey = cursor.getString(ContactQuery.CONTACT_LOOKUP_KEY);
return Contacts.getLookupUri(contactId, lookupKey);
}
}
diff --git a/src/com/android/contacts/list/LegacyContactListAdapter.java b/src/com/android/contacts/list/LegacyContactListAdapter.java
index b21d484..dbdce5e 100644
--- a/src/com/android/contacts/list/LegacyContactListAdapter.java
+++ b/src/com/android/contacts/list/LegacyContactListAdapter.java
@@ -85,7 +85,7 @@
}
protected void bindName(final ContactListItemView view, Cursor cursor) {
- view.showDisplayName(cursor, PERSON_DISPLAY_NAME_COLUMN_INDEX, 0, false,
+ view.showDisplayName(cursor, PERSON_DISPLAY_NAME_COLUMN_INDEX,
getContactNameDisplayOrder());
view.showPhoneticName(cursor, PERSON_PHONETIC_NAME_COLUMN_INDEX);
}
diff --git a/src/com/android/contacts/list/LegacyPhoneNumberListAdapter.java b/src/com/android/contacts/list/LegacyPhoneNumberListAdapter.java
index 547650d..1ef106a 100644
--- a/src/com/android/contacts/list/LegacyPhoneNumberListAdapter.java
+++ b/src/com/android/contacts/list/LegacyPhoneNumberListAdapter.java
@@ -89,8 +89,7 @@
}
protected void bindName(final ContactListItemView view, Cursor cursor) {
- view.showDisplayName(cursor, PHONE_DISPLAY_NAME_COLUMN_INDEX, 0, false,
- getContactNameDisplayOrder());
+ view.showDisplayName(cursor, PHONE_DISPLAY_NAME_COLUMN_INDEX, getContactNameDisplayOrder());
view.showPhoneticName(cursor, PHONE_PHONETIC_NAME_COLUMN_INDEX);
}
diff --git a/src/com/android/contacts/list/LegacyPostalAddressListAdapter.java b/src/com/android/contacts/list/LegacyPostalAddressListAdapter.java
index 48b3f0c..91a0e3b 100644
--- a/src/com/android/contacts/list/LegacyPostalAddressListAdapter.java
+++ b/src/com/android/contacts/list/LegacyPostalAddressListAdapter.java
@@ -90,7 +90,7 @@
}
protected void bindName(final ContactListItemView view, Cursor cursor) {
- view.showDisplayName(cursor, POSTAL_DISPLAY_NAME_COLUMN_INDEX, 0, false,
+ view.showDisplayName(cursor, POSTAL_DISPLAY_NAME_COLUMN_INDEX,
getContactNameDisplayOrder());
view.showPhoneticName(cursor, POSTAL_PHONETIC_NAME_COLUMN_INDEX);
}
diff --git a/src/com/android/contacts/list/PhoneNumberListAdapter.java b/src/com/android/contacts/list/PhoneNumberListAdapter.java
index 459d232..d55787b 100644
--- a/src/com/android/contacts/list/PhoneNumberListAdapter.java
+++ b/src/com/android/contacts/list/PhoneNumberListAdapter.java
@@ -22,7 +22,6 @@
import android.net.Uri;
import android.net.Uri.Builder;
import android.provider.ContactsContract;
-import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.ContactCounts;
import android.provider.ContactsContract.Contacts;
@@ -43,31 +42,40 @@
public class PhoneNumberListAdapter extends ContactEntryListAdapter {
private static final String TAG = PhoneNumberListAdapter.class.getSimpleName();
- protected static final String[] PHONES_PROJECTION = new String[] {
- Phone._ID, // 0
- Phone.TYPE, // 1
- Phone.LABEL, // 2
- Phone.NUMBER, // 3
- Phone.DISPLAY_NAME_PRIMARY, // 4
- Phone.DISPLAY_NAME_ALTERNATIVE, // 5
- Phone.CONTACT_ID, // 6
- Phone.LOOKUP_KEY, // 7
- Phone.PHOTO_ID, // 8
- };
+ protected static class PhoneQuery {
+ private static final String[] PROJECTION_PRIMARY = new String[] {
+ Phone._ID, // 0
+ Phone.TYPE, // 1
+ Phone.LABEL, // 2
+ Phone.NUMBER, // 3
+ Phone.CONTACT_ID, // 4
+ Phone.LOOKUP_KEY, // 5
+ Phone.PHOTO_ID, // 6
+ Phone.DISPLAY_NAME_PRIMARY, // 7
+ };
- protected static final int PHONE_ID_COLUMN_INDEX = 0;
- protected static final int PHONE_TYPE_COLUMN_INDEX = 1;
- protected static final int PHONE_LABEL_COLUMN_INDEX = 2;
- protected static final int PHONE_NUMBER_COLUMN_INDEX = 3;
- protected static final int PHONE_PRIMARY_DISPLAY_NAME_COLUMN_INDEX = 4;
- protected static final int PHONE_ALTERNATIVE_DISPLAY_NAME_COLUMN_INDEX = 5;
- protected static final int PHONE_CONTACT_ID_COLUMN_INDEX = 6;
- protected static final int PHONE_LOOKUP_KEY_COLUMN_INDEX = 7;
- protected static final int PHONE_PHOTO_ID_COLUMN_INDEX = 8;
+ private static final String[] PROJECTION_ALTERNATIVE = new String[] {
+ Phone._ID, // 0
+ Phone.TYPE, // 1
+ Phone.LABEL, // 2
+ Phone.NUMBER, // 3
+ Phone.CONTACT_ID, // 4
+ Phone.LOOKUP_KEY, // 5
+ Phone.PHOTO_ID, // 6
+ Phone.DISPLAY_NAME_ALTERNATIVE, // 7
+ };
- private CharSequence mUnknownNameText;
- private int mDisplayNameColumnIndex;
- private int mAlternativeDisplayNameColumnIndex;
+ public static final int PHONE_ID = 0;
+ public static final int PHONE_TYPE = 1;
+ public static final int PHONE_LABEL = 2;
+ public static final int PHONE_NUMBER = 3;
+ public static final int PHONE_CONTACT_ID = 4;
+ public static final int PHONE_LOOKUP_KEY = 5;
+ public static final int PHONE_PHOTO_ID = 6;
+ public static final int PHONE_DISPLAY_NAME = 7;
+ }
+
+ private final CharSequence mUnknownNameText;
private ContactListItemView.PhotoPosition mPhotoPosition;
@@ -102,8 +110,6 @@
builder.appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY,
String.valueOf(directoryId));
uri = builder.build();
- // TODO a projection that includes the search snippet
- loader.setProjection(PHONES_PROJECTION);
} else {
uri = Phone.CONTENT_URI.buildUpon().appendQueryParameter(
ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT))
@@ -111,14 +117,18 @@
if (isSectionHeaderDisplayEnabled()) {
uri = buildSectionIndexerUri(uri);
}
-
- loader.setProjection(PHONES_PROJECTION);
configureSelection(loader, directoryId, getFilter());
}
loader.setUri(uri);
- // TODO: we probably want to use default sort order in search mode.
+ // TODO a projection that includes the search snippet
+ if (getContactNameDisplayOrder() == ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY) {
+ loader.setProjection(PhoneQuery.PROJECTION_PRIMARY);
+ } else {
+ loader.setProjection(PhoneQuery.PROJECTION_ALTERNATIVE);
+ }
+
if (getSortOrder() == ContactsContract.Preferences.SORT_ORDER_PRIMARY) {
loader.setSortOrder(Phone.SORT_KEY_PRIMARY);
} else {
@@ -180,19 +190,7 @@
@Override
public String getContactDisplayName(int position) {
- return ((Cursor)getItem(position)).getString(mDisplayNameColumnIndex);
- }
-
- @Override
- public void setContactNameDisplayOrder(int displayOrder) {
- super.setContactNameDisplayOrder(displayOrder);
- if (getContactNameDisplayOrder() == ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY) {
- mDisplayNameColumnIndex = PHONE_PRIMARY_DISPLAY_NAME_COLUMN_INDEX;
- mAlternativeDisplayNameColumnIndex = PHONE_ALTERNATIVE_DISPLAY_NAME_COLUMN_INDEX;
- } else {
- mDisplayNameColumnIndex = PHONE_ALTERNATIVE_DISPLAY_NAME_COLUMN_INDEX;
- mAlternativeDisplayNameColumnIndex = PHONE_PRIMARY_DISPLAY_NAME_COLUMN_INDEX;
- }
+ return ((Cursor) getItem(position)).getString(PhoneQuery.PHONE_DISPLAY_NAME);
}
/**
@@ -203,7 +201,7 @@
public Uri getDataUri(int position) {
Cursor cursor = ((Cursor)getItem(position));
if (cursor != null) {
- long id = cursor.getLong(PHONE_ID_COLUMN_INDEX);
+ long id = cursor.getLong(PhoneQuery.PHONE_ID);
return ContentUris.withAppendedId(Data.CONTENT_URI, id);
} else {
Log.w(TAG, "Cursor was null in getDataUri() call. Returning null instead.");
@@ -233,16 +231,16 @@
cursor.moveToPosition(position);
boolean isFirstEntry = true;
boolean showBottomDivider = true;
- final long currentContactId = cursor.getLong(PHONE_CONTACT_ID_COLUMN_INDEX);
+ final long currentContactId = cursor.getLong(PhoneQuery.PHONE_CONTACT_ID);
if (cursor.moveToPrevious() && !cursor.isBeforeFirst()) {
- final long previousContactId = cursor.getLong(PHONE_CONTACT_ID_COLUMN_INDEX);
+ final long previousContactId = cursor.getLong(PhoneQuery.PHONE_CONTACT_ID);
if (currentContactId == previousContactId) {
isFirstEntry = false;
}
}
cursor.moveToPosition(position);
if (cursor.moveToNext() && !cursor.isAfterLast()) {
- final long nextContactId = cursor.getLong(PHONE_CONTACT_ID_COLUMN_INDEX);
+ final long nextContactId = cursor.getLong(PhoneQuery.PHONE_CONTACT_ID);
if (currentContactId == nextContactId) {
// The following entry should be in the same group, which means we don't want a
// divider between them.
@@ -257,9 +255,8 @@
if (isFirstEntry) {
bindName(view, cursor);
if (isQuickContactEnabled()) {
- bindQuickContact(view, partition, cursor,
- PHONE_PHOTO_ID_COLUMN_INDEX, PHONE_CONTACT_ID_COLUMN_INDEX,
- PHONE_LOOKUP_KEY_COLUMN_INDEX);
+ bindQuickContact(view, partition, cursor, PhoneQuery.PHONE_PHOTO_ID,
+ PhoneQuery.PHONE_CONTACT_ID, PhoneQuery.PHONE_LOOKUP_KEY);
} else {
bindPhoto(view, cursor);
}
@@ -274,15 +271,15 @@
protected void bindPhoneNumber(ContactListItemView view, Cursor cursor) {
CharSequence label = null;
- if (!cursor.isNull(PHONE_TYPE_COLUMN_INDEX)) {
- final int type = cursor.getInt(PHONE_TYPE_COLUMN_INDEX);
- final String customLabel = cursor.getString(PHONE_LABEL_COLUMN_INDEX);
+ if (!cursor.isNull(PhoneQuery.PHONE_TYPE)) {
+ final int type = cursor.getInt(PhoneQuery.PHONE_TYPE);
+ final String customLabel = cursor.getString(PhoneQuery.PHONE_LABEL);
// TODO cache
label = Phone.getTypeLabel(getContext().getResources(), type, customLabel);
}
view.setLabel(label);
- view.showData(cursor, PHONE_NUMBER_COLUMN_INDEX);
+ view.showData(cursor, PhoneQuery.PHONE_NUMBER);
}
protected void bindSectionHeaderAndDivider(final ContactListItemView view, int position) {
@@ -297,8 +294,7 @@
}
protected void bindName(final ContactListItemView view, Cursor cursor) {
- view.showDisplayName(cursor, mDisplayNameColumnIndex, mAlternativeDisplayNameColumnIndex,
- false, getContactNameDisplayOrder());
+ view.showDisplayName(cursor, PhoneQuery.PHONE_DISPLAY_NAME, getContactNameDisplayOrder());
// Note: we don't show phonetic names any more (see issue 5265330)
}
@@ -308,8 +304,8 @@
protected void bindPhoto(final ContactListItemView view, Cursor cursor) {
long photoId = 0;
- if (!cursor.isNull(PHONE_PHOTO_ID_COLUMN_INDEX)) {
- photoId = cursor.getLong(PHONE_PHOTO_ID_COLUMN_INDEX);
+ if (!cursor.isNull(PhoneQuery.PHONE_PHOTO_ID)) {
+ photoId = cursor.getLong(PhoneQuery.PHONE_PHOTO_ID);
}
getPhotoLoader().loadPhoto(view.getPhotoView(), photoId, false, false);
diff --git a/src/com/android/contacts/list/PostalAddressListAdapter.java b/src/com/android/contacts/list/PostalAddressListAdapter.java
index 7e58a8e..e9bd11a 100644
--- a/src/com/android/contacts/list/PostalAddressListAdapter.java
+++ b/src/com/android/contacts/list/PostalAddressListAdapter.java
@@ -32,27 +32,34 @@
*/
public class PostalAddressListAdapter extends ContactEntryListAdapter {
- static final String[] POSTALS_PROJECTION = new String[] {
- StructuredPostal._ID, // 0
- StructuredPostal.TYPE, // 1
- StructuredPostal.LABEL, // 2
- StructuredPostal.DATA, // 3
- StructuredPostal.DISPLAY_NAME_PRIMARY, // 4
- StructuredPostal.DISPLAY_NAME_ALTERNATIVE, // 5
- StructuredPostal.PHOTO_ID, // 6
- };
+ protected static class PostalQuery {
+ private static final String[] PROJECTION_PRIMARY = new String[] {
+ StructuredPostal._ID, // 0
+ StructuredPostal.TYPE, // 1
+ StructuredPostal.LABEL, // 2
+ StructuredPostal.DATA, // 3
+ StructuredPostal.PHOTO_ID, // 4
+ StructuredPostal.DISPLAY_NAME_PRIMARY, // 5
+ };
- protected static final int POSTAL_ID_COLUMN_INDEX = 0;
- protected static final int POSTAL_TYPE_COLUMN_INDEX = 1;
- protected static final int POSTAL_LABEL_COLUMN_INDEX = 2;
- protected static final int POSTAL_ADDRESS_COLUMN_INDEX = 3;
- protected static final int POSTAL_PRIMARY_DISPLAY_NAME_COLUMN_INDEX = 4;
- protected static final int POSTAL_ALTERNATIVE_DISPLAY_NAME_COLUMN_INDEX = 5;
- protected static final int POSTAL_PHOTO_ID_COLUMN_INDEX = 6;
+ private static final String[] PROJECTION_ALTERNATIVE = new String[] {
+ StructuredPostal._ID, // 0
+ StructuredPostal.TYPE, // 1
+ StructuredPostal.LABEL, // 2
+ StructuredPostal.DATA, // 3
+ StructuredPostal.PHOTO_ID, // 4
+ StructuredPostal.DISPLAY_NAME_ALTERNATIVE, // 5
+ };
- private CharSequence mUnknownNameText;
- private int mDisplayNameColumnIndex;
- private int mAlternativeDisplayNameColumnIndex;
+ public static final int POSTAL_ID = 0;
+ public static final int POSTAL_TYPE = 1;
+ public static final int POSTAL_LABEL = 2;
+ public static final int POSTAL_ADDRESS = 3;
+ public static final int POSTAL_PHOTO_ID = 4;
+ public static final int POSTAL_DISPLAY_NAME = 5;
+ }
+
+ private final CharSequence mUnknownNameText;
public PostalAddressListAdapter(Context context) {
super(context);
@@ -64,7 +71,12 @@
public void configureLoader(CursorLoader loader, long directoryId) {
Uri uri = buildSectionIndexerUri(StructuredPostal.CONTENT_URI);
loader.setUri(uri);
- loader.setProjection(POSTALS_PROJECTION);
+
+ if (getContactNameDisplayOrder() == ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY) {
+ loader.setProjection(PostalQuery.PROJECTION_PRIMARY);
+ } else {
+ loader.setProjection(PostalQuery.PROJECTION_ALTERNATIVE);
+ }
if (getSortOrder() == ContactsContract.Preferences.SORT_ORDER_PRIMARY) {
loader.setSortOrder(StructuredPostal.SORT_KEY_PRIMARY);
@@ -80,19 +92,7 @@
@Override
public String getContactDisplayName(int position) {
- return ((Cursor)getItem(position)).getString(mDisplayNameColumnIndex);
- }
-
- @Override
- public void setContactNameDisplayOrder(int displayOrder) {
- super.setContactNameDisplayOrder(displayOrder);
- if (getContactNameDisplayOrder() == ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY) {
- mDisplayNameColumnIndex = POSTAL_PRIMARY_DISPLAY_NAME_COLUMN_INDEX;
- mAlternativeDisplayNameColumnIndex = POSTAL_ALTERNATIVE_DISPLAY_NAME_COLUMN_INDEX;
- } else {
- mDisplayNameColumnIndex = POSTAL_ALTERNATIVE_DISPLAY_NAME_COLUMN_INDEX;
- mAlternativeDisplayNameColumnIndex = POSTAL_PRIMARY_DISPLAY_NAME_COLUMN_INDEX;
- }
+ return ((Cursor) getItem(position)).getString(PostalQuery.POSTAL_DISPLAY_NAME);
}
/**
@@ -100,7 +100,7 @@
* position.
*/
public Uri getDataUri(int position) {
- long id = ((Cursor)getItem(position)).getLong(POSTAL_ID_COLUMN_INDEX);
+ long id = ((Cursor)getItem(position)).getLong(PostalQuery.POSTAL_ID);
return ContentUris.withAppendedId(Data.CONTENT_URI, id);
}
@@ -124,15 +124,15 @@
protected void bindPostalAddress(ContactListItemView view, Cursor cursor) {
CharSequence label = null;
- if (!cursor.isNull(POSTAL_TYPE_COLUMN_INDEX)) {
- final int type = cursor.getInt(POSTAL_TYPE_COLUMN_INDEX);
- final String customLabel = cursor.getString(POSTAL_LABEL_COLUMN_INDEX);
+ if (!cursor.isNull(PostalQuery.POSTAL_TYPE)) {
+ final int type = cursor.getInt(PostalQuery.POSTAL_TYPE);
+ final String customLabel = cursor.getString(PostalQuery.POSTAL_LABEL);
// TODO cache
label = StructuredPostal.getTypeLabel(getContext().getResources(), type, customLabel);
}
view.setLabel(label);
- view.showData(cursor, POSTAL_ADDRESS_COLUMN_INDEX);
+ view.showData(cursor, PostalQuery.POSTAL_ADDRESS);
}
protected void bindSectionHeaderAndDivider(final ContactListItemView view, int position) {
@@ -154,14 +154,13 @@
}
protected void bindName(final ContactListItemView view, Cursor cursor) {
- view.showDisplayName(cursor, mDisplayNameColumnIndex, mAlternativeDisplayNameColumnIndex,
- false, getContactNameDisplayOrder());
+ view.showDisplayName(cursor, PostalQuery.POSTAL_DISPLAY_NAME, getContactNameDisplayOrder());
}
protected void bindPhoto(final ContactListItemView view, Cursor cursor) {
long photoId = 0;
- if (!cursor.isNull(POSTAL_PHOTO_ID_COLUMN_INDEX)) {
- photoId = cursor.getLong(POSTAL_PHOTO_ID_COLUMN_INDEX);
+ if (!cursor.isNull(PostalQuery.POSTAL_PHOTO_ID)) {
+ photoId = cursor.getLong(PostalQuery.POSTAL_PHOTO_ID);
}
getPhotoLoader().loadPhoto(view.getPhotoView(), photoId, false, false);
diff --git a/tests/src/com/android/contacts/format/DisplayNameFormatterTest.java b/tests/src/com/android/contacts/format/DisplayNameFormatterTest.java
deleted file mode 100644
index 4dc932b..0000000
--- a/tests/src/com/android/contacts/format/DisplayNameFormatterTest.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (C) 2011 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.format;
-
-
-import android.provider.ContactsContract;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.widget.TextView;
-
-/**
- * Unit tests for {@link DisplayNameFormatter}.
- */
-@SmallTest
-public class DisplayNameFormatterTest extends AndroidTestCase {
- private static final int TEST_PREFIX_HIGHLIGHT_COLOR = 0xFF0000;
- /** The HTML code used to mark the start of the highlighted part. */
- private static final String START = "<font color =\"#1ff0000\">";
- /** The HTML code used to mark the end of the highlighted part. */
- private static final String END = "</font>";
-
- private PrefixHighlighter mPrefixHighlighter;
- /** The object under test. */
- private DisplayNameFormatter mDisplayNameFormatter;
- /** The view to on which the text is set. */
- private TextView mView;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mPrefixHighlighter = new PrefixHighlighter(TEST_PREFIX_HIGHLIGHT_COLOR);
- mDisplayNameFormatter = new DisplayNameFormatter(mPrefixHighlighter);
- mView = new TextView(getContext());
- // This guarantees that the text will be stored as a Spannable so that we can determine
- // which styles have been applied to it.
- mView.setText("", TextView.BufferType.SPANNABLE);
- }
-
- public void testSetDisplayName_Simple() {
- setNames("John Doe", "Doe John");
- setDisplayName();
- SpannedTestUtils.checkHtmlText("John Doe", mView);
- setNames("Jean Pierre Doe", "Doe Jean Pierre");
- setDisplayName();
- SpannedTestUtils.checkHtmlText("Jean Pierre Doe", mView);
- setNames("John Doe Smith", "Doe Smith John");
- setDisplayName();
- SpannedTestUtils.checkHtmlText("John Doe Smith", mView);
- }
- public void testSetDisplayName_AccidentalOverlap() {
- // This is probably not what we want, but we assume that the two names differ only in the
- // order in which the two components are listed.
- setNames("Johnson John", "Johnson Smith");
- setDisplayName();
- SpannedTestUtils.checkHtmlText("Johnson John", mView);
- }
-
- public void testSetDisplayName_Reversed() {
- setNames("John Doe", "Doe John");
- setDisplayNameReversed();
- SpannedTestUtils.checkHtmlText("John Doe", mView);
- setNames("Jean Pierre Doe", "Doe Jean Pierre");
- setDisplayNameReversed();
- SpannedTestUtils.checkHtmlText("Jean Pierre Doe", mView);
- setNames("John Doe Smith", "Doe Smith John");
- setDisplayNameReversed();
- SpannedTestUtils.checkHtmlText("John Doe Smith", mView);
- }
-
- public void testSetDisplayName_NoOverlap() {
- setNames("John Smith", "Doe Albert");
- setDisplayName();
- SpannedTestUtils.checkHtmlText("John Smith", mView);
- }
-
- public void testSetDisplayName_Prefix() {
- setNames("John Doe", "Doe John");
- setDisplayNameWithPrefix("DO");
- SpannedTestUtils.checkHtmlText("John " + START + "Do" + END + "e", mView);
- }
-
- public void testSetDisplayName_PrefixFirstName() {
- setNames("John Doe", "Doe John");
- setDisplayNameWithPrefix("JO");
- SpannedTestUtils.checkHtmlText(START + "Jo" + END + "hn Doe", mView);
- }
-
- public void testSetDisplayName_PrefixMiddleName() {
- setNames("John Paul Doe", "Doe John Paul");
- setDisplayNameWithPrefix("PAU");
- SpannedTestUtils.checkHtmlText("John " + START + "Pau" + END + "l Doe",
- mView);
- }
-
- public void testSetDisplayName_ReversedPrefix() {
- setNames("John Doe", "Doe John");
- setDisplayNameReversedWithPrefix("DO");
- SpannedTestUtils.checkHtmlText("John " + START + "Do" + END + "e", mView);
- }
-
- public void testSetDisplayName_Empty() {
- setNames("", "");
- setDisplayName();
- SpannedTestUtils.checkHtmlText("", mView);
- }
-
- public void testSetDisplayName_Unknown() {
- mDisplayNameFormatter.setUnknownNameText("unknown");
- setNames("", "");
- setDisplayName();
- SpannedTestUtils.checkHtmlText("unknown", mView);
- }
-
- /**
- * Sets the name and alternate name on the formatter.
- *
- * @param name the name to be display
- * @param alternateName the alternate name to be displayed
- */
- private void setNames(String name, String alternateName) {
- FormatUtils.copyToCharArrayBuffer(name, mDisplayNameFormatter.getNameBuffer());
- FormatUtils.copyToCharArrayBuffer(alternateName,
- mDisplayNameFormatter.getAlternateNameBuffer());
- }
-
- /**
- * Sets the display name on the text view.
- */
- private void setDisplayName() {
- mDisplayNameFormatter.setDisplayName(mView,
- ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY, false, null);
- }
-
- /**
- * Sets the display name on the text view using the reverted order.
- */
- private void setDisplayNameReversed() {
- mDisplayNameFormatter.setDisplayName(mView,
- ContactsContract.Preferences.DISPLAY_ORDER_ALTERNATIVE, false, null);
- }
-
- /**
- * Sets the display name on the text view with prefix highlighting enabled.
- */
- private void setDisplayNameWithPrefix(String prefix) {
- mDisplayNameFormatter.setDisplayName(mView,
- ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY, false, prefix.toCharArray());
- }
-
- /**
- * Sets the display name reversed on the text view with prefix highlighting enabled.
- */
- private void setDisplayNameReversedWithPrefix(String prefix) {
- mDisplayNameFormatter.setDisplayName(mView,
- ContactsContract.Preferences.DISPLAY_ORDER_ALTERNATIVE, false,
- prefix.toCharArray());
- }
-
- /**
- * Sets the display name on the text view with highlighting enabled.
- */
- private void setDisplayNameWithHighlighting() {
- mDisplayNameFormatter.setDisplayName(mView,
- ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY, true, null);
- }
-}
diff --git a/tests/src/com/android/contacts/list/ContactListItemViewTest.java b/tests/src/com/android/contacts/list/ContactListItemViewTest.java
index aaf7521..82305d5 100644
--- a/tests/src/com/android/contacts/list/ContactListItemViewTest.java
+++ b/tests/src/com/android/contacts/list/ContactListItemViewTest.java
@@ -64,8 +64,7 @@
Cursor cursor = createCursor("John Doe", "Doe John");
ContactListItemView view = createView();
- view.showDisplayName(cursor, 0, 1, false,
- ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY);
+ view.showDisplayName(cursor, 0, ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY);
SpannedTestUtils.checkHtmlText("John Doe", view.getNameTextView());
}
@@ -75,8 +74,7 @@
ContactListItemView view = createView();
view.setUnknownNameText("unknown");
- view.showDisplayName(cursor, 0, 1, false,
- ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY);
+ view.showDisplayName(cursor, 0, ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY);
SpannedTestUtils.checkHtmlText("unknown", view.getNameTextView());
}
@@ -86,8 +84,7 @@
ContactListItemView view = createView();
view.setHighlightedPrefix("DOE".toCharArray());
- view.showDisplayName(cursor, 0, 1, false,
- ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY);
+ view.showDisplayName(cursor, 0, ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY);
SpannedTestUtils.checkHtmlText("John " + START + "Doe" + END,
view.getNameTextView());
@@ -98,8 +95,7 @@
ContactListItemView view = createView();
view.setHighlightedPrefix("DOE".toCharArray());
- view.showDisplayName(cursor, 0, 1, false,
- ContactsContract.Preferences.DISPLAY_ORDER_ALTERNATIVE);
+ view.showDisplayName(cursor, 0, ContactsContract.Preferences.DISPLAY_ORDER_ALTERNATIVE);
SpannedTestUtils.checkHtmlText("John " + START + "Doe" + END,
view.getNameTextView());