summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/com/android/dialer/dialpad/SmartDialNameMatcher.java42
-rw-r--r--tests/src/com/android/dialer/dialpad/SmartDialNameMatcherTest.java25
2 files changed, 64 insertions, 3 deletions
diff --git a/src/com/android/dialer/dialpad/SmartDialNameMatcher.java b/src/com/android/dialer/dialpad/SmartDialNameMatcher.java
index 53f564275..6f0f35423 100644
--- a/src/com/android/dialer/dialpad/SmartDialNameMatcher.java
+++ b/src/com/android/dialer/dialpad/SmartDialNameMatcher.java
@@ -44,6 +44,13 @@ public class SmartDialNameMatcher {
'9', '9', '9', '9' // W,X,Y,Z -> 9
};
+ // Whether or not we allow matches like 57 - (J)ohn (S)mith
+ private static final boolean ALLOW_INITIAL_MATCH = true;
+
+ // The maximum length of the initial we will match - typically set to 1 to minimize false
+ // positives
+ private static final int INITIAL_LENGTH_LIMIT = 1;
+
/*
* The switch statement in this function was generated using the python code:
* from unidecode import unidecode
@@ -511,6 +518,34 @@ public class SmartDialNameMatcher {
matchList.add(new SmartDialMatchPosition(
tokenStart, queryLength + tokenStart + seperatorCount));
return true;
+ } else if (ALLOW_INITIAL_MATCH && queryStart < INITIAL_LENGTH_LIMIT) {
+ // we matched the first character.
+ // branch off and see if we can find another match with the remaining
+ // characters in the query string and the remaining tokens
+ //find the next space in the query string
+ int j = nameStart;
+ while (j < nameLength && displayName.charAt(j) != ' ') {
+ j++;
+ }
+ // this means there is at least one character left after the space
+ if (j < nameLength - 1) {
+ final String remainder = displayName.substring(j + 1);
+ final ArrayList<SmartDialMatchPosition> partialTemp =
+ Lists.newArrayList();
+ if (matchesCombination(
+ remainder, query.substring(queryStart + 1), partialTemp)) {
+
+ // store the list of possible match positions
+ SmartDialMatchPosition.advanceMatchPositions(partialTemp, j + 1);
+ partialTemp.add(0,
+ new SmartDialMatchPosition(nameStart, nameStart + 1));
+
+ // we found a partial token match, store the data in a
+ // temp buffer and return it if we end up not finding a full
+ // token match
+ partial = partialTemp;
+ }
+ }
}
nameStart++;
queryStart++;
@@ -532,6 +567,13 @@ public class SmartDialNameMatcher {
}
}
}
+ // if we have no complete match at this point, then we attempt to fall back to the partial
+ // token match(if any). If we don't allow initial matching (ALLOW_INITIAL_MATCH = false)
+ // then partial will always be empty.
+ if (!partial.isEmpty()) {
+ matchList.addAll(partial);
+ return true;
+ }
return false;
}
diff --git a/tests/src/com/android/dialer/dialpad/SmartDialNameMatcherTest.java b/tests/src/com/android/dialer/dialpad/SmartDialNameMatcherTest.java
index 492e5b422..8b7ee03f6 100644
--- a/tests/src/com/android/dialer/dialpad/SmartDialNameMatcherTest.java
+++ b/tests/src/com/android/dialer/dialpad/SmartDialNameMatcherTest.java
@@ -66,6 +66,20 @@ public class SmartDialNameMatcherTest extends TestCase {
checkMatches("William J Smith", "6576", false, 0, 0);
}
+
+ public void testMatches_Initial() {
+ // wjs matches (W)illiam (J)ohn (S)mith
+ checkMatches("William John Smith", "957", true, 0, 1, 8, 9, 13, 14);
+ // wjsmit matches (W)illiam (J)ohn (Smit)h
+ checkMatches("William John Smith", "957648", true, 0, 1, 8, 9, 13, 17);
+ // wjohn matches (W)illiam (John) Smith
+ checkMatches("William John Smith", "95646", true, 0, 1, 8, 12);
+ // jsmi matches William (J)ohn (Smi)th
+ checkMatches("William John Smith", "5764", true, 8, 9, 13, 16);
+ // make sure multiple spaces don't mess things up
+ checkMatches("William John Smith", "5764", true, 15, 16, 22, 25);
+ }
+
// TODO: Do we want to make these pass anymore?
@Suppress
public void testMatches_repeatedSeparators() {
@@ -102,7 +116,7 @@ public class SmartDialNameMatcherTest extends TestCase {
}
private void checkMatches(String displayName, String query, boolean expectedMatches,
- int expectedMatchStart, int expectedMatchEnd) {
+ int... expectedMatchPositions) {
final SmartDialNameMatcher matcher = new SmartDialNameMatcher(query);
final ArrayList<SmartDialMatchPosition> matchPositions =
new ArrayList<SmartDialMatchPosition>();
@@ -115,9 +129,14 @@ public class SmartDialNameMatcherTest extends TestCase {
+ " nfkc=" + Normalizer.normalize(displayName, Normalizer.Form.NFKC)
+ " matches=" + matches);
assertEquals("matches", expectedMatches, matches);
+ final int length = expectedMatchPositions.length;
+ assertEquals(length % 2, 0);
if (matches) {
- assertEquals("start", expectedMatchStart, matchPositions.get(0).start);
- assertEquals("end", expectedMatchEnd, matchPositions.get(0).end);
+ for (int i = 0; i < length/2; i++) {
+ assertEquals("start", expectedMatchPositions[i * 2], matchPositions.get(i).start);
+ assertEquals("end", expectedMatchPositions[i * 2 + 1], matchPositions.get(i).end);
+ }
}
}
+
}