From ebd80e68abda3088416ad0eb8890d9823e51cc61 Mon Sep 17 00:00:00 2001 From: Matthew Fritze Date: Tue, 30 May 2017 08:36:52 -0700 Subject: [PATCH] Prevent crash when removing duplicates The method that crashes is removed in O-DR, and thus does not need to be merged down. Change-Id: If30bd8bd92d578133984f7f35e7ec5288adfc390 Fixes: 62100634 Test: make RunSettingsRoboTests Merged-In: Id36f7bf4ceaaa3a2bd326ecafbfe97fd0b247df2 --- .../search2/DatabaseResultLoader.java | 6 +-- .../search2/DatabaseResultLoaderTest.java | 41 +++++++++++++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/search2/DatabaseResultLoader.java b/src/com/android/settings/search2/DatabaseResultLoader.java index 5892ebc1ede..70cefe56fd5 100644 --- a/src/com/android/settings/search2/DatabaseResultLoader.java +++ b/src/com/android/settings/search2/DatabaseResultLoader.java @@ -323,18 +323,18 @@ public class DatabaseResultLoader extends AsyncLoader= 0; j--) { primaryResult = results.get(j); if (areDuplicateResults(primaryResult, secondaryResult)) { - if (primaryResult.viewType != ResultPayload.PayloadType.INTENT) { // Case where both payloads are inline results.remove(i); break; } else if (secondaryResult.viewType != ResultPayload.PayloadType.INTENT) { - // Case where only second result is inline + // Case where only second result is inline. results.remove(j); i--; // shift the top index to reflect the lower element being removed } else { - // Case where both payloads are intent + // Case where both payloads are intent. results.remove(i); + break; } } } diff --git a/tests/robotests/src/com/android/settings/search2/DatabaseResultLoaderTest.java b/tests/robotests/src/com/android/settings/search2/DatabaseResultLoaderTest.java index 8b97a918d90..862db32add1 100644 --- a/tests/robotests/src/com/android/settings/search2/DatabaseResultLoaderTest.java +++ b/tests/robotests/src/com/android/settings/search2/DatabaseResultLoaderTest.java @@ -378,6 +378,47 @@ public class DatabaseResultLoaderTest { assertThat(results.get(3)).isEqualTo(resultFive); } + @Test + public void testDeDupe_threeDuplicates_onlyOneStays() { + /* + * Create a list as follows: + * (3) Intent One + * (2) Intent One + * (1) Intent One + * + * After removing duplicates: + * (1) Intent One + */ + List results = new ArrayList(); + IntentPayload intentPayload = new IntentPayload(new Intent()); + + SearchResult.Builder builder = new SearchResult.Builder(); + // Intent One + builder.addTitle(titleOne) + .addSummary(summaryOne) + .addPayload(intentPayload); + SearchResult resultOne = builder.build(); + results.add(resultOne); + + // Intent Two + builder.addTitle(titleOne) + .addSummary(summaryOne) + .addPayload(intentPayload); + SearchResult resultTwo = builder.build(); + results.add(resultTwo); + + // Intent Three + builder.addTitle(titleOne) + .addSummary(summaryOne) + .addPayload(intentPayload); + SearchResult resultThree = builder.build(); + results.add(resultThree); + + loader = new DatabaseResultLoader(mContext, "", null); + loader.removeDuplicates(results); + assertThat(results.size()).isEqualTo(1); + } + @Test public void testSpecialCaseTwoWords_firstWordMatches_ranksHigher() { final String caseOne = "Apple pear";