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

Commit 7a3137be authored by Richard MacGregor's avatar Richard MacGregor Committed by Rajesh Yengisetty
Browse files

Fix call log and contact lookup

Call log lookup was broken by InCallApi introduction.
Contact custom number labels weren't synced to dialer database, causing
the label to be shown as "custom" instead of the correct string during T9
dialpad search.

Use InCallApi plugin name as label if available, becauase some
plugins use the label column for strings that are too long to be
considered a label.

Ticket CD-460
Change-Id: I38bbbdbee23598e5d6ca6347ed77ae9c318a1c6b
(cherry picked from commit 8a1a13a0)
parent 297eb8ad
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import android.widget.Toast;

import com.android.contacts.common.ContactPhotoManager;
import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
import com.android.contacts.common.util.ContactDisplayUtils;
import com.android.contacts.common.GeoUtil;
import com.android.contacts.common.CallUtil;
import com.android.contacts.common.activity.fragment.BlockContactDialogFragment;
@@ -196,8 +197,18 @@ public class CallDetailActivity extends Activity
         */
        private CharSequence getNumberTypeOrLocation(PhoneCallDetails details) {
            if (!TextUtils.isEmpty(details.name)) {
                return Phone.getTypeLabel(mResources, details.numberType,
                        details.numberLabel);
                String callMethodName = null;
                if (details.inCallComponentName != null) {
                    CallMethodInfo cmi = DialerDataSubscription.get(mContext)
                            .getPluginIfExists(details.inCallComponentName);
                    if (cmi != null) {
                        callMethodName = cmi.mName;
                    }
                }

                return ContactDisplayUtils.getLabelForCall(getApplicationContext(),
                        details.number.toString(), details.numberType,
                        details.numberLabel, callMethodName);
            } else {
                return details.geocode;
            }
+21 −5
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import android.content.SharedPreferences;
import android.content.res.Resources;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.support.v7.widget.RecyclerView;
import android.os.Bundle;
import android.os.Trace;
@@ -46,6 +45,7 @@ import android.view.accessibility.AccessibilityEvent;

import com.android.contacts.common.CallUtil;
import com.android.contacts.common.ClipboardUtils;
import com.android.contacts.common.util.ContactDisplayUtils;
import com.android.contacts.common.util.PermissionsUtil;
import com.android.dialer.DialtactsActivity;
import com.android.dialer.PhoneCallDetails;
@@ -58,6 +58,8 @@ import com.android.dialer.deeplink.DeepLinkRequest;
import com.android.dialer.util.DialerUtils;
import com.android.dialer.util.PhoneNumberUtil;
import com.android.dialer.voicemail.VoicemailPlaybackPresenter;
import com.android.phone.common.incall.CallMethodInfo;
import com.android.phone.common.incall.DialerDataSubscription;

import com.cyanogen.ambient.deeplink.DeepLink;
import com.cyanogen.ambient.incall.extension.OriginCodes;
@@ -502,7 +504,7 @@ public class CallLogAdapter extends GroupingListAdapter
                c.getString(CallLogQuery.ACCOUNT_COMPONENT_NAME),
                c.getString(CallLogQuery.ACCOUNT_ID));
        final String countryIso = c.getString(CallLogQuery.COUNTRY_ISO);
        final ContactInfo cachedContactInfo = mContactInfoHelper.getContactInfo(c);
        final ContactInfo cachedContactInfo = mContactInfoHelper.getContactInfo(mContext, c);
        final boolean isVoicemailNumber =
                mTelecomCallLogCache.isVoicemailNumber(accountHandle, number);

@@ -558,8 +560,6 @@ public class CallLogAdapter extends GroupingListAdapter
        // Stash away the Ids of the calls so that we can support deleting a row in the call log.
        views.callIds = getCallIds(c, count);
        views.isBusiness = mContactInfoHelper.isBusiness(info.sourceType);
        views.numberType = (String) Phone.getTypeLabel(mContext.getResources(), details.numberType,
                details.numberLabel);
        String component = c.getString(CallLogQuery.PLUGIN_PACKAGE_NAME);
        if (!TextUtils.isEmpty(component)) {
            views.inCallComponentName = ComponentName.unflattenFromString(component);
@@ -577,7 +577,23 @@ public class CallLogAdapter extends GroupingListAdapter
            views.phoneCallDetailsViews.noteIconView.setVisibility(View.GONE);
        }

        String callMethodName = null;
        if (views.inCallComponentName != null) {
            CallMethodInfo cmi = DialerDataSubscription.get(mContext)
                    .getPluginIfExists(views.inCallComponentName);
            if (cmi != null) {
                callMethodName = cmi.mName;
            }
        }

        final String label = ContactDisplayUtils.getLabelForCall(mContext, number,
                details.numberType, details.numberLabel, callMethodName);

        views.numberType = label;
        details.numberLabel = label;

        views.mDeepLinkPresenter.prepareUi(number);

        // Check if the day group has changed and display a header if necessary.
        int currentGroup = getDayGroupForCall(views.rowId);
        int previousGroup = getPreviousDayGroup(c);
+7 −1
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.text.TextUtils;
import android.util.Log;

import com.android.contacts.common.GeoUtil;
import com.android.contacts.common.util.PhoneNumberHelper;
import com.android.dialer.PhoneCallDetails;
import com.android.dialer.util.AsyncTaskExecutor;
import com.android.dialer.util.AsyncTaskExecutors;
@@ -156,6 +157,10 @@ public class CallLogAsyncTaskUtil {
                    cursor.getString(CallDetailQuery.ACCOUNT_COMPONENT_NAME),
                    cursor.getString(CallDetailQuery.ACCOUNT_ID));

            final boolean isInCallPluginContactId =
                    ContactInfoHelper.isInCallPluginContactId(context, accountHandle, number,
                            countryIso, cursor.getString(CallDetailQuery.PLUGIN_PACKAGE_NAME));

            // If this is not a regular number, there is no point in looking it up in the contacts.
            ContactInfoHelper contactInfoHelper =
                    new ContactInfoHelper(context, GeoUtil.getCurrentCountryIso(context));
@@ -165,7 +170,8 @@ public class CallLogAsyncTaskUtil {

            ContactInfo info = ContactInfo.EMPTY;
            if (shouldLookupNumber) {
                ContactInfo lookupInfo = contactInfoHelper.lookupNumber(number, countryIso);
                ContactInfo lookupInfo =
                        contactInfoHelper.lookupNumber(number, countryIso, isInCallPluginContactId);
                info = lookupInfo != null ? lookupInfo : ContactInfo.EMPTY;
            }

+2 −0
Original line number Diff line number Diff line
@@ -58,6 +58,8 @@ public class ContactInfo {
    public String lookupProviderName;
    public Drawable attributionDrawable;

    public boolean isInCallPluginContactId;

    public static ContactInfo EMPTY = new ContactInfo();

    public int sourceType = 0;
+41 −8
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@ import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.DisplayNameSources;
import android.provider.ContactsContract.PhoneLookup;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
import android.util.Log;
@@ -56,6 +58,14 @@ import org.json.JSONObject;
public class ContactInfoHelper {
    private static final String TAG = ContactInfoHelper.class.getSimpleName();

    /**
     * If this boolean parameter is set to true, then the appended query is treated as a
     * InCallApi plugin contact ID and the lookup will be performed against InCallApi contacts in
     * the user's contacts.
     */
    // TODO: Move this to a more central place
    private static final String QUERY_PARAMETER_INCALLAPI_ID = "incallapi_contactid";

    private final Context mContext;
    private final String mCurrentCountryIso;
    private final LookupProvider mLookupProvider;
@@ -84,8 +94,10 @@ public class ContactInfoHelper {
     *
     * @param number the number to look up
     * @param countryIso the country associated with this number
     * @param isInCallPluginContactId true if number is an InCallApi plugin contact id
     */
    public ContactInfo lookupNumber(String number, String countryIso) {
    public ContactInfo lookupNumber(String number, String countryIso,
            boolean isInCallPluginContactId) {
        if (TextUtils.isEmpty(number)) {
            return null;
        }
@@ -100,13 +112,14 @@ public class ContactInfoHelper {
                // actually the phone number of a contact.
                String username = PhoneNumberHelper.getUsernameFromUriNumber(number);
                if (PhoneNumberUtils.isGlobalPhoneNumber(username)) {
                    sipInfo = queryContactInfoForPhoneNumber(username, countryIso);
                    sipInfo = queryContactInfoForPhoneNumber(username, countryIso, false);
                }
            }
            info = sipInfo;
        } else {
            // Look for a contact that has the given phone number.
            ContactInfo phoneInfo = queryContactInfoForPhoneNumber(number, countryIso);
            ContactInfo phoneInfo =
                    queryContactInfoForPhoneNumber(number, countryIso, isInCallPluginContactId);

            if (phoneInfo == null || phoneInfo == ContactInfo.EMPTY) {
                // Check whether the phone number has been saved as an "Internet call" number.
@@ -264,7 +277,8 @@ 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 isInCallPluginContactId) {
        if (TextUtils.isEmpty(number)) {
            return null;
        }
@@ -280,9 +294,11 @@ public class ContactInfoHelper {
        }

        // The "contactNumber" is a regular phone number, so use the PhoneLookup table.
        Uri uri = Uri.withAppendedPath(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI,
                Uri.encode(contactNumber));
        ContactInfo info = lookupContactFromUri(uri);
        Uri.Builder uriBuilder = PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI.buildUpon();
        uriBuilder.appendPath(Uri.encode(contactNumber));
        uriBuilder.appendQueryParameter(QUERY_PARAMETER_INCALLAPI_ID,
                String.valueOf(isInCallPluginContactId));
        ContactInfo info = lookupContactFromUri(uriBuilder.build());
        boolean isLocalContact = info != null && info != ContactInfo.EMPTY;
        if (info != null && info != ContactInfo.EMPTY) {
            info.formattedNumber = formatPhoneNumber(number, null, countryIso);
@@ -467,7 +483,7 @@ public class ContactInfoHelper {
     *
     * @param c A cursor pointing to an entry in the call log.
     */
    public static ContactInfo getContactInfo(Cursor c) {
    public static ContactInfo getContactInfo(Context context, Cursor c) {
        ContactInfo info = new ContactInfo();

        info.lookupUri = UriUtils.parseUriOrNull(c.getString(CallLogQuery.CACHED_LOOKUP_URI));
@@ -482,6 +498,15 @@ public class ContactInfoHelper {
                UriUtils.parseUriOrNull(c.getString(CallLogQuery.CACHED_PHOTO_URI)));
        info.formattedNumber = c.getString(CallLogQuery.CACHED_FORMATTED_NUMBER);

        final String componentString = c.getString(CallLogQuery.ACCOUNT_COMPONENT_NAME);
        final String accountId = c.getString(CallLogQuery.ACCOUNT_ID);
        final String countryIso = c.getString(CallLogQuery.COUNTRY_ISO);
        info.isInCallPluginContactId = isInCallPluginContactId(context,
                PhoneAccountUtils.getAccount(componentString, accountId),
                info.number,
                countryIso,
                c.getString(CallLogQuery.PLUGIN_PACKAGE_NAME));

        return info;
    }

@@ -520,4 +545,12 @@ public class ContactInfoHelper {
                field);
    }

    public static boolean isInCallPluginContactId(Context context,
            PhoneAccountHandle accountHandle, String number, String countryIso, String pluginName) {
        boolean isInCallPluginContactId = accountHandle == null &&
                !PhoneNumberHelper.isValidNumber(context, number, countryIso) &&
                !TextUtils.isEmpty(pluginName);

        return isInCallPluginContactId;
    }
}
Loading