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

Commit 325cdfa5 authored by Danny Baumann's avatar Danny Baumann
Browse files

Improve callstats number matching code.

Make it a little more efficient, and make sure the ContactInfo and
CallStatsDetails instances always stay in sync.

Change-Id: I0b01e6fc036ce70dccbccf1d9002843331304d50
parent 4c8dc577
Loading
Loading
Loading
Loading
+22 −30
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.os.Looper;
import android.os.Message;
import android.provider.CallLog.Calls;
import android.util.Log;
import android.util.Pair;

import com.android.contacts.common.CallUtil;
import com.android.contacts.common.util.UriUtils;
@@ -152,9 +153,8 @@ public class CallStatsQueryHandler extends AsyncQueryHandler {
    }

    private Map<ContactInfo, CallStatsDetails> processData(Cursor cursor) {
        final Map<ContactInfo, CallStatsDetails> result = new HashMap<ContactInfo, CallStatsDetails>();
        final ArrayList<ContactInfo> infos = new ArrayList<ContactInfo>();
        final ArrayList<CallStatsDetails> calls = new ArrayList<CallStatsDetails>();
        final ArrayList<Pair<ContactInfo, CallStatsDetails>> infos =
                new ArrayList<Pair<ContactInfo, CallStatsDetails>>();
        CallStatsDetails pending = null;

        cursor.moveToFirst();
@@ -173,8 +173,7 @@ public class CallStatsQueryHandler extends AsyncQueryHandler {

                pending = new CallStatsDetails(number, numberPresentation,
                        info, countryIso, geocode, date);
                infos.add(info);
                calls.add(pending);
                infos.add(Pair.create(info, pending));
            }

            pending.addTimeOrMissed(callType, duration);
@@ -182,26 +181,21 @@ public class CallStatsQueryHandler extends AsyncQueryHandler {
        }

        cursor.close();
        mergeItemsByNumber(calls, infos);

        for (int i = 0; i < calls.size(); i++) {
            result.put(infos.get(i), calls.get(i));
        }

        return result;
        return mergeItemsByNumber(infos);
    }

    private void mergeItemsByNumber(List<CallStatsDetails> calls, List<ContactInfo> infos) {
        // temporarily store items marked for removal
        final ArrayList<CallStatsDetails> callsToRemove = new ArrayList<CallStatsDetails>();
        final ArrayList<ContactInfo> infosToRemove = new ArrayList<ContactInfo>();
    private Map<ContactInfo, CallStatsDetails> mergeItemsByNumber(List<Pair<ContactInfo,
            CallStatsDetails>> infos) {
        final HashMap<ContactInfo, CallStatsDetails> result =
                new HashMap<ContactInfo, CallStatsDetails>();

        for (int i = 0; i < calls.size(); i++) {
            final CallStatsDetails outerItem = calls.get(i);
        for (int i = 0; i < infos.size(); i++) {
            final Pair<ContactInfo, CallStatsDetails> info = infos.get(i);
            final CallStatsDetails outerItem = info.second;
            final String currentFormattedNumber = outerItem.number.toString();

            for (int j = calls.size() - 1; j > i; j--) {
                final CallStatsDetails innerItem = calls.get(j);
            for (int j = infos.size() - 1; j > i; j--) {
                final CallStatsDetails innerItem = infos.get(j).second;
                final String innerNumber = innerItem.number.toString();

                if (CallUtil.phoneNumbersEqual(currentFormattedNumber, innerNumber)) {
@@ -209,18 +203,16 @@ public class CallStatsQueryHandler extends AsyncQueryHandler {
                    // make sure we're not counting twice in case we're dealing with
                    // multiple different formats
                    innerItem.reset();
                    callsToRemove.add(innerItem);
                    infosToRemove.add(infos.get(j));
                }
                }
            }

        for (CallStatsDetails call : callsToRemove) {
            calls.remove(call);
            // only add items which weren't merged with others before
            if (outerItem.getFullDuration() != 0 || outerItem.getTotalCount() != 0) {
                result.put(info.first, info.second);
            }
        for (ContactInfo info : infosToRemove) {
            infos.remove(info);
        }

        return result;
    }

    private ContactInfo getContactInfoFromCallStats(Cursor c) {