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

Commit 6c88a2e4 authored by Danny Baumann's avatar Danny Baumann
Browse files

Fix a number of issues with T9 dialer.

- Fix an ArrayIndexOutOfBoundsException which happened when highlighting  
  the last digits of a number and the number had additional characters 
  after those digits.
- Fix another potential ArrayIndexOutOfBoundsException due to the
  highlighting code relying on normalNumber being a subset of number,
  which wasn't the case due to number being additionally sent through a
  formatter. Fix that by running the formatter before normalizing.
- Fix number highlighting not working if the number match occured at the
  end of the number.
- Fix number type label & formatting not being updated on locale
  changes.
- Fix T9 search not being triggered when pressing the dial button to
  recall the last dialed number.

Change-Id: Iae1087cf1805fd2840cb6c740e763037d59bd564
parent 07c3032b
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1327,6 +1327,9 @@ public class DialpadFragment extends Fragment
                // contains a *formatted* version of mLastNumberDialed (due to
                // mTextWatcher) and its length may have changed.
                mDigits.setSelection(mDigits.getText().length());

                // Retrigger T9 search to show the matching contact if present
                searchContacts();
            } else {
                // There's no "last number dialed" or the
                // background query is still running. There's
+32 −12
Original line number Diff line number Diff line
@@ -136,13 +136,22 @@ public class T9SearchCache implements ComponentCallbacks2 {
            }

            initNormalizer();

            for (ContactItem contact : mContacts) {
                for (NameMatchEntry entry : contact.nameEntries.values()) {
                    if (entry.value != null) {
                        entry.normalValue = mNormalizer.convert(entry.value);
                    }
                }

                contact.formattedNumber = PhoneNumberUtils.formatNumber(contact.number);
                contact.normalNumber = removeNonDigits(contact.formattedNumber);
                if (contact.numberType >= 0) {
                    final int labelId = Phone.getTypeLabelResource(contact.numberType);
                    contact.groupType = context.getResources().getString(labelId);
                }
            }

            notifyLoadFinished();
        }
    };
@@ -249,16 +258,21 @@ public class T9SearchCache implements ComponentCallbacks2 {
                while (!data.isAfterLast() && data.getLong(DATA_COLUMN_CONTACT) == contactId) {
                    final String mimeType = data.getString(DATA_COLUMN_MIMETYPE);
                    if (TextUtils.equals(mimeType, Phone.CONTENT_ITEM_TYPE)) {
                        String num = data.getString(DATA_COLUMN_PHONENUMBER);
                        ContactItem contactInfo = new ContactItem();
                        String numberTypeLabel = data.getString(DATA_COLUMN_PHONELABEL);

                        contactInfo.id = contactId;
                        contactInfo.number = PhoneNumberUtils.formatNumber(num);
                        contactInfo.normalNumber = removeNonDigits(num);
                        contactInfo.number = data.getString(DATA_COLUMN_PHONENUMBER);
                        contactInfo.formattedNumber = PhoneNumberUtils.formatNumber(contactInfo.number);
                        contactInfo.normalNumber = removeNonDigits(contactInfo.formattedNumber);
                        contactInfo.timesContacted = contactContactedCount;
                        contactInfo.isSuperPrimary = data.getInt(DATA_COLUMN_PRIMARY) > 0;
                        contactInfo.numberType = data.getInt(DATA_COLUMN_PHONETYPE);
                        contactInfo.groupType = Phone.getTypeLabel(mContext.getResources(),
                                data.getInt(DATA_COLUMN_PHONETYPE), data.getString(DATA_COLUMN_PHONELABEL));
                                contactInfo.numberType, numberTypeLabel);
                        if (TextUtils.equals(contactInfo.groupType, numberTypeLabel)) {
                            contactInfo.numberType = -1;
                        }
                        contactInfo.photo = photo;
                        contactItems.add(contactInfo);
                    } else if (TextUtils.equals(mimeType, Organization.CONTENT_ITEM_TYPE)) {
@@ -359,7 +373,9 @@ public class T9SearchCache implements ComponentCallbacks2 {
    public static class ContactItem {
        Uri photo;
        String number;
        String formattedNumber;
        String normalNumber;
        int numberType;
        int numberMatchId;
        Map<Integer, NameMatchEntry> nameEntries;
        int timesContacted;
@@ -607,28 +623,32 @@ public class T9SearchCache implements ComponentCallbacks2 {
                }

                SpannableStringBuilder numberBuilder = new SpannableStringBuilder();
                numberBuilder.append(o.number);
                numberBuilder.append(o.formattedNumber);
                numberBuilder.append(" (");
                numberBuilder.append(o.groupType);
                numberBuilder.append(")");
                if (o.numberMatchId != -1) {
                    int numberStart = -1, numberEnd = -1;
                    int formattedNumberLength = o.number.length();
                    final int formattedLength = o.formattedNumber.length();
                    final int normalLength = o.normalNumber.length();
                    final int inputLength = mPrevInput.length();
                    int numberStart = -1, numberEnd = formattedLength;

                    for (int i = 0, normalIndex = 0; i < formattedNumberLength; i++) {
                        if (o.number.charAt(i) != o.normalNumber.charAt(normalIndex)) {
                    for (int i = 0, normalIndex = 0; i < formattedLength && normalIndex < normalLength; i++) {
                        if (o.formattedNumber.charAt(i) != o.normalNumber.charAt(normalIndex)) {
                            continue;
                        }

                        if (normalIndex == o.numberMatchId) {
                            numberStart = i;
                        } else if (normalIndex == o.numberMatchId + mPrevInput.length()) {
                            numberEnd = i;
                        }
                        if (normalIndex == o.numberMatchId + inputLength - 1) {
                            numberEnd = i + 1;
                            break;
                        }

                        normalIndex++;
                    }
                    if (numberStart >= 0 && numberEnd >= 0) {
                    if (numberStart >= 0) {
                        numberBuilder.setSpan(new ForegroundColorSpan(mHighlightColor),
                                numberStart, numberEnd, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
                    }