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

Commit 679c717f authored by Tony Mak's avatar Tony Mak
Browse files

Use DATA.CONTACT_ID when lookup SIP call

It is actually a naming mistake in framework, the column store contact id
of normal query is _id, but that of sip query is contact_id.
It is an old issue and we can't do much in the framework side.

So, we need to use the correct projection when it is a SIP call.

Bug:27143980
Bug:27141566

(cherry picked from commit 328f75ff)

Change-Id: I0551c308072892ef13c8cb14ea4a4ab37ffa6f83
parent 49df92e2
Loading
Loading
Loading
Loading
+12 −8
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import com.android.dialer.service.CachedNumberLookupService;
import com.android.dialer.service.CachedNumberLookupService.CachedContactInfo;
import com.android.dialer.util.TelecomUtil;
import com.android.dialerbind.ObjectFactory;
import com.google.common.annotations.VisibleForTesting;

import org.json.JSONException;
import org.json.JSONObject;
@@ -82,17 +83,17 @@ public class ContactInfoHelper {

        if (PhoneNumberHelper.isUriNumber(number)) {
            // The number is a SIP address..
            info = lookupContactFromUri(getContactInfoLookupUri(number));
            info = lookupContactFromUri(getContactInfoLookupUri(number), true);
            if (info == null || info == ContactInfo.EMPTY) {
                // If lookup failed, check if the "username" of the SIP address is a phone number.
                String username = PhoneNumberHelper.getUsernameFromUriNumber(number);
                if (PhoneNumberUtils.isGlobalPhoneNumber(username)) {
                    info = queryContactInfoForPhoneNumber(username, countryIso);
                    info = queryContactInfoForPhoneNumber(username, countryIso, true);
                }
            }
        } else {
            // Look for a contact that has the given phone number.
            info = queryContactInfoForPhoneNumber(number, countryIso);
            info = queryContactInfoForPhoneNumber(number, countryIso, false);
        }

        final ContactInfo updatedInfo;
@@ -153,7 +154,7 @@ public class ContactInfoHelper {
     * The {@link ContactInfo#formattedNumber} field is always set to {@code null} in the returned
     * value.
     */
    public ContactInfo lookupContactFromUri(Uri uri) {
    ContactInfo lookupContactFromUri(Uri uri, boolean isSip) {
        if (uri == null) {
            return null;
        }
@@ -163,8 +164,10 @@ public class ContactInfoHelper {

        Cursor phoneLookupCursor = null;
        try {
            phoneLookupCursor = mContext.getContentResolver().query(uri,
                    PhoneQuery.PHONE_LOOKUP_PROJECTION, null, null, null);
            String[] projection = (isSip) ? PhoneQuery.SIP_PHONE_LOOKUP_PROJECTION
                    : PhoneQuery.PHONE_LOOKUP_PROJECTION;
            phoneLookupCursor = mContext.getContentResolver().query(uri, projection, null, null,
                    null);
        } catch (NullPointerException e) {
            // Trap NPE from pre-N CP2
            return null;
@@ -241,12 +244,13 @@ public class ContactInfoHelper {
     * <p>
     * If the lookup fails for some other reason, it returns null.
     */
    private ContactInfo queryContactInfoForPhoneNumber(String number, String countryIso) {
    private ContactInfo queryContactInfoForPhoneNumber(String number, String countryIso,
                                                       boolean isSip) {
        if (TextUtils.isEmpty(number)) {
            return null;
        }

        ContactInfo info = lookupContactFromUri(getContactInfoLookupUri(number));
        ContactInfo info = lookupContactFromUri(getContactInfoLookupUri(number), isSip);
        if (info != null && info != ContactInfo.EMPTY) {
            info.formattedNumber = formatPhoneNumber(number, null, countryIso);
        } else if (mCachedNumberLookupService != null) {
+20 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.dialer.calllog;

import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.PhoneLookup;

/**
@@ -37,7 +38,25 @@ final class PhoneQuery {
            PhoneLookup.NORMALIZED_NUMBER,
            PhoneLookup.PHOTO_ID,
            PhoneLookup.LOOKUP_KEY,
            PhoneLookup.PHOTO_URI};
            PhoneLookup.PHOTO_URI
    };

    /**
     * Similar to {@link PHONE_LOOKUP_PROJECTION}. Due to a bug in framework, the column name of
     * contact id in normal phonelookup query is _id, but that in sip phonelookup query is
     * contact_id.
     */
    public static final String[] SIP_PHONE_LOOKUP_PROJECTION = new String[] {
            Data.CONTACT_ID,
            PhoneLookup.DISPLAY_NAME,
            PhoneLookup.TYPE,
            PhoneLookup.LABEL,
            PhoneLookup.NUMBER,
            PhoneLookup.NORMALIZED_NUMBER,
            PhoneLookup.PHOTO_ID,
            PhoneLookup.LOOKUP_KEY,
            PhoneLookup.PHOTO_URI
    };

    public static final int PERSON_ID = 0;
    public static final int NAME = 1;
+4 −4
Original line number Diff line number Diff line
@@ -58,7 +58,7 @@ public class ContactInfoHelperTest extends AndroidTestCase {
    }

    public void testLookupContactFromUri_NullUri() {
        Assert.assertNull(mContactInfoHelper.lookupContactFromUri(null));
        Assert.assertNull(mContactInfoHelper.lookupContactFromUri(null, false));
    }

    public void testLookupContactFromUri_NoResults() {
@@ -66,7 +66,7 @@ public class ContactInfoHelperTest extends AndroidTestCase {
                PhoneQuery.PHONE_LOOKUP_PROJECTION);

        Assert.assertEquals(ContactInfo.EMPTY, mContactInfoHelper.lookupContactFromUri(
                PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI));
                PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI, false));
        mContext.verify();
    }

@@ -77,7 +77,7 @@ public class ContactInfoHelperTest extends AndroidTestCase {
                PhoneQuery.DISPLAY_NAME_ALTERNATIVE_PROJECTION);

        ContactInfo contactInfo = mContactInfoHelper.lookupContactFromUri(
                PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI);
                PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI, false);
        Assert.assertEquals(TEST_DISPLAY_NAME, contactInfo.name);
        Assert.assertNull(contactInfo.nameAlternative);
        mContext.verify();
@@ -90,7 +90,7 @@ public class ContactInfoHelperTest extends AndroidTestCase {
                PhoneQuery.DISPLAY_NAME_ALTERNATIVE_PROJECTION, TEST_DISPLAY_NAME_ALTERNATIVE_ROW);

        ContactInfo contactInfo = mContactInfoHelper.lookupContactFromUri(
                PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI);
                PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI, false);
        Assert.assertEquals(TEST_DISPLAY_NAME, contactInfo.name);
        Assert.assertEquals(TEST_DISPLAY_NAME_ALTERNATIVE, contactInfo.nameAlternative);
        mContext.verify();