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

Commit ed90ea54 authored by Daisuke Miyakawa's avatar Daisuke Miyakawa
Browse files

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
parent 663d614c
Loading
Loading
Loading
Loading
+0 −82
Original line number Diff line number Diff line
/*
 * 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;
    }
}
+65 −69
Original line number Diff line number Diff line
@@ -38,7 +38,8 @@ import android.widget.ListView;
 */
public abstract class ContactListAdapter extends ContactEntryListAdapter {

    protected static final String[] PROJECTION_CONTACT = new String[] {
    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
@@ -50,7 +51,7 @@ public abstract class ContactListAdapter extends ContactEntryListAdapter {
            Contacts.IS_USER_PROFILE,               // 8
        };

    protected static final String[] PROJECTION_DATA = new String[] {
        public static final String[] PROJECTION_DATA = new String[] {
            Data.CONTACT_ID,                        // 0
            Data.DISPLAY_NAME_PRIMARY,              // 1
            Data.DISPLAY_NAME_ALTERNATIVE,          // 2
@@ -61,7 +62,7 @@ public abstract class ContactListAdapter extends ContactEntryListAdapter {
            Data.LOOKUP_KEY,                        // 7
        };

    protected static final String[] FILTER_PROJECTION = new String[] {
        public static final String[] FILTER_PROJECTION = new String[] {
            Contacts._ID,                           // 0
            Contacts.DISPLAY_NAME_PRIMARY,          // 1
            Contacts.DISPLAY_NAME_ALTERNATIVE,      // 2
@@ -74,27 +75,25 @@ public abstract class ContactListAdapter extends ContactEntryListAdapter {
            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 abstract class ContactListAdapter extends ContactEntryListAdapter {
    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 abstract class ContactListAdapter extends ContactEntryListAdapter {
    }

    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 @@ public abstract class ContactListAdapter extends ContactEntryListAdapter {
        }
        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 @@ public abstract class ContactListAdapter extends ContactEntryListAdapter {
            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 @@ public abstract class ContactListAdapter extends ContactEntryListAdapter {

        // 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 @@ public abstract class ContactListAdapter extends ContactEntryListAdapter {
        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 @@ public abstract class ContactListAdapter extends ContactEntryListAdapter {
            }
            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 @@ public abstract class ContactListAdapter extends ContactEntryListAdapter {
        // 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);
        }
    }
}
+36 −48
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package com.android.contacts.list;
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.os.Bundle;
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 @@ public class ContactListItemView extends ViewGroup
    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 @@ public class ContactListItemView extends ViewGroup

    /** 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 @@ public class ContactListItemView extends ViewGroup
        if (mActivatedBackgroundDrawable != null) {
            mActivatedBackgroundDrawable.setCallback(this);
        }

        mDisplayNameFormatter = new DisplayNameFormatter(mPrefixHighligher);
    }

    /**
@@ -307,7 +309,7 @@ public class ContactListItemView extends ViewGroup
    }

    public void setUnknownNameText(CharSequence unknownNameText) {
        mDisplayNameFormatter.setUnknownNameText(unknownNameText);
        mUnknownNameText = unknownNameText;
    }

    public void setQuickContactEnabled(boolean flag) {
@@ -790,7 +792,7 @@ public class ContactListItemView extends ViewGroup
                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 @@ public class ContactListItemView extends ViewGroup
            }
        } else {
            getPhoneticNameTextView();
            mPhoneticNameTextView.setText(getMarqueeText(text, size));
            setMarqueeText(mPhoneticNameTextView, text, size);
            mPhoneticNameTextView.setVisibility(VISIBLE);
        }
    }
@@ -967,22 +969,7 @@ public class ContactListItemView extends ViewGroup
            }
        } 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 @@ public class ContactListItemView extends ViewGroup
            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 @@ public class ContactListItemView extends ViewGroup
            }
        } 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 @@ public class ContactListItemView extends ViewGroup
            }
        } else {
            getStatusView();
            mStatusView.setText(getMarqueeText(text));
            setMarqueeText(mStatusView, text);
            mStatusView.setVisibility(VISIBLE);
        }
    }
@@ -1174,16 +1164,14 @@ public class ContactListItemView extends ViewGroup
        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,
+6 −7
Original line number Diff line number Diff line
@@ -72,7 +72,7 @@ public class DefaultContactListAdapter extends ContactListAdapter {
                // 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 @@ public class DefaultContactListAdapter extends ContactListAdapter {
                        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 @@ public class DefaultContactListAdapter extends ContactListAdapter {
    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 @@ public class DefaultContactListAdapter extends ContactListAdapter {
        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);
        }
+43 −44

File changed.

Preview size limit exceeded, changes collapsed.

Loading