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

Unverified Commit 7fdd7b7d authored by Michael W's avatar Michael W Committed by Michael Bestas
Browse files

Contacts: Don't display duplicate numbers



* Currently the db stores the same number in various formats and the
  adapter shows each of them
* Manually filter the results before swapping the cursor with a new
  one where we explicitly skipped the duplicates

Co-authored-by: default avatarLuca Stefani <luca.stefani.ge1@gmail.com>
Change-Id: I5cc4e108a7ba308f8293edcae19360969a77b505
parent 0319084b
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ import android.content.ContentUris;
import android.content.Context;
import android.content.CursorLoader;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.net.Uri;
import android.net.Uri.Builder;
import android.provider.ContactsContract;
@@ -28,6 +29,7 @@ import android.provider.ContactsContract.CommonDataKinds.SipAddress;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.Directory;
import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
@@ -47,6 +49,7 @@ import com.android.contacts.extensions.ExtensionsFactory;
import com.android.contacts.preference.ContactsPreferences;
import com.android.contacts.util.Constants;

import com.android.contacts.util.CursorUtils;
import com.google.common.collect.Lists;

import java.util.ArrayList;
@@ -654,4 +657,27 @@ public class PhoneNumberListAdapter extends ContactEntryListAdapter {
    public void setListener(Listener listener) {
        mListener = listener;
    }

    @Override
    public void changeCursor(int partitionIndex, Cursor cursor) {
        String previousNumber = "";
        long previousContactId = -1;
        MatrixCursor matrixCursor = new MatrixCursor(cursor.getColumnNames());
        try {
            while (cursor.moveToNext()) {
                long currentContactId = cursor.getLong(PhoneQuery.CONTACT_ID);
                String currentNumber = cursor.getString(PhoneQuery.PHONE_NUMBER);
                currentNumber = PhoneNumberUtils.normalizeNumber(currentNumber);
                if (currentContactId == previousContactId && currentNumber.equals(previousNumber)) {
                    continue;
                }
                previousNumber = currentNumber;
                previousContactId = currentContactId;
                matrixCursor.addRow(CursorUtils.getObjectFromCursor(cursor));
            }
        } finally {
            cursor.close();
        }
        super.changeCursor(partitionIndex, matrixCursor);
    }
}
+45 −0
Original line number Diff line number Diff line
/*
 * SPDX-FileCopyrightText: 2023 The LineageOS Project
 * SPDX-License-Identifier: Apache-2.0
 */

package com.android.contacts.util;

import android.database.Cursor;

import androidx.annotation.NonNull;

public class CursorUtils {

    private CursorUtils() {
        // Do not instantiate
    }

    public static Object[] getObjectFromCursor(@NonNull Cursor cursor) {
        Object[] values = new Object[cursor.getColumnCount()];
        for (int i = 0; i < cursor.getColumnCount(); i++) {
            int fieldType = cursor.getType(i);
            switch (fieldType) {
                case Cursor.FIELD_TYPE_BLOB:
                    values[i] = cursor.getBlob(i);
                    break;
                case Cursor.FIELD_TYPE_FLOAT:
                    values[i] = cursor.getDouble(i);
                    break;
                case Cursor.FIELD_TYPE_INTEGER:
                    values[i] = cursor.getLong(i);
                    break;
                case Cursor.FIELD_TYPE_STRING:
                    values[i] = cursor.getString(i);
                    break;
                case Cursor.FIELD_TYPE_NULL:
                    values[i] = null;
                    break;
                default:
                    throw new IllegalStateException(
                            "Unknown fieldType (" + fieldType + ") for column: " + i);
            }
        }
        return values;
    }
}