Prevent search crashes from uninstalled apps

All search results are now refreshed when resuming the
search fragment, to prevent crashes from results that
no longer exist.

Bug: 34817357
Test: make RunSettingsRoboTests
Change-Id: I96a0cbfee711ab9dee49d56bfdc4e885202d9ecd
This commit is contained in:
Matthew Fritze
2017-03-22 13:51:36 -07:00
parent 7cfaa8ceb2
commit 359bce4f50
6 changed files with 182 additions and 41 deletions

View File

@@ -57,6 +57,7 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static com.google.common.truth.Truth.assertThat;
@@ -75,6 +76,8 @@ public class SearchResultsAdapterTest {
private Context mContext;
private String mLoaderClassName;
private String[] TITLES = {"alpha", "bravo", "charlie", "appAlpha", "appBravo", "appCharlie"};
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
@@ -86,13 +89,13 @@ public class SearchResultsAdapterTest {
}
@Test
public void testNoResultsAdded_EmptyListReturned() {
public void testNoResultsAdded_emptyListReturned() {
List<SearchResult> updatedResults = mAdapter.getSearchResults();
assertThat(updatedResults).isEmpty();
}
@Test
public void testSingleSourceMerge_ExactCopyReturned() {
public void testSingleSourceMerge_exactCopyReturned() {
ArrayList<SearchResult> intentResults = getIntentSampleResults();
mAdapter.addSearchResults(intentResults, mLoaderClassName);
mAdapter.displaySearchResults("");
@@ -102,7 +105,7 @@ public class SearchResultsAdapterTest {
}
@Test
public void testCreateViewHolder_ReturnsIntentResult() {
public void testCreateViewHolder_returnsIntentResult() {
ViewGroup group = new FrameLayout(mContext);
SearchViewHolder view = mAdapter.onCreateViewHolder(group,
ResultPayload.PayloadType.INTENT);
@@ -110,7 +113,7 @@ public class SearchResultsAdapterTest {
}
@Test
public void testCreateViewHolder_ReturnsInlineSwitchResult() {
public void testCreateViewHolder_returnsInlineSwitchResult() {
ViewGroup group = new FrameLayout(mContext);
SearchViewHolder view = mAdapter.onCreateViewHolder(group,
ResultPayload.PayloadType.INLINE_SWITCH);
@@ -118,20 +121,42 @@ public class SearchResultsAdapterTest {
}
@Test
public void testEndToEndSearch_ProperResultsMerged() {
mAdapter.addSearchResults(getDummyAppResults(),
InstalledAppResultLoader.class.getName());
mAdapter.addSearchResults(getDummyDbResults(),
DatabaseResultLoader.class.getName());
public void testEndToEndSearch_properResultsMerged_correctOrder() {
mAdapter.addSearchResults(getDummyAppResults(), InstalledAppResultLoader.class.getName());
mAdapter.addSearchResults(getDummyDbResults(), DatabaseResultLoader.class.getName());
int count = mAdapter.displaySearchResults("");
List<SearchResult> results = mAdapter.getSearchResults();
assertThat(results.get(0).title).isEqualTo("alpha");
assertThat(results.get(1).title).isEqualTo("appAlpha");
assertThat(results.get(2).title).isEqualTo("appBravo");
assertThat(results.get(3).title).isEqualTo("bravo");
assertThat(results.get(4).title).isEqualTo("appCharlie");
assertThat(results.get(5).title).isEqualTo("Charlie");
assertThat(results.get(0).title).isEqualTo(TITLES[0]); // alpha
assertThat(results.get(1).title).isEqualTo(TITLES[3]); // appAlpha
assertThat(results.get(2).title).isEqualTo(TITLES[4]); // appBravo
assertThat(results.get(3).title).isEqualTo(TITLES[1]); // bravo
assertThat(results.get(4).title).isEqualTo(TITLES[5]); // appCharlie
assertThat(results.get(5).title).isEqualTo(TITLES[2]); // charlie
assertThat(count).isEqualTo(6);
}
@Test
public void testEndToEndSearch_addResults_resultsAddedInOrder() {
List<AppSearchResult> appResults = getDummyAppResults();
List<SearchResult> dbResults = getDummyDbResults();
// Add two individual items
mAdapter.addSearchResults(appResults.subList(0,1),
InstalledAppResultLoader.class.getName());
mAdapter.addSearchResults(dbResults.subList(0,1), DatabaseResultLoader.class.getName());
mAdapter.displaySearchResults("");
// Add super-set of items
mAdapter.addSearchResults(appResults, InstalledAppResultLoader.class.getName());
mAdapter.addSearchResults(dbResults, DatabaseResultLoader.class.getName());
int count = mAdapter.displaySearchResults("");
List<SearchResult> results = mAdapter.getSearchResults();
assertThat(results.get(0).title).isEqualTo(TITLES[0]); // alpha
assertThat(results.get(1).title).isEqualTo(TITLES[3]); // appAlpha
assertThat(results.get(2).title).isEqualTo(TITLES[4]); // appBravo
assertThat(results.get(3).title).isEqualTo(TITLES[1]); // bravo
assertThat(results.get(4).title).isEqualTo(TITLES[5]); // appCharlie
assertThat(results.get(5).title).isEqualTo(TITLES[2]); // charlie
assertThat(count).isEqualTo(6);
}
@@ -146,26 +171,46 @@ public class SearchResultsAdapterTest {
@Test
public void testDisplayResults_ShouldRunSmartRankingIfEnabled() {
when(mSearchFeatureProvider.isSmartSearchRankingEnabled(any()))
.thenReturn(true);
.thenReturn(true);
mAdapter.displaySearchResults("");
verify(mSearchFeatureProvider, times(1)).rankSearchResults(anyString(), anyList());
}
@Test
public void testEndToEndSearch_removeResults_resultsAdded() {
List<AppSearchResult> appResults = getDummyAppResults();
List<SearchResult> dbResults = getDummyDbResults();
// Add list of items
mAdapter.addSearchResults(appResults, InstalledAppResultLoader.class.getName());
mAdapter.addSearchResults(dbResults, DatabaseResultLoader.class.getName());
mAdapter.displaySearchResults("");
// Add subset of items
mAdapter.addSearchResults(appResults.subList(0,1),
InstalledAppResultLoader.class.getName());
mAdapter.addSearchResults(dbResults.subList(0,1), DatabaseResultLoader.class.getName());
int count = mAdapter.displaySearchResults("");
List<SearchResult> results = mAdapter.getSearchResults();
assertThat(results.get(0).title).isEqualTo(TITLES[0]);
assertThat(results.get(1).title).isEqualTo(TITLES[3]);
assertThat(count).isEqualTo(2);
}
private List<SearchResult> getDummyDbResults() {
List<SearchResult> results = new ArrayList<>();
ResultPayload payload = new ResultPayload(new Intent());
SearchResult.Builder builder = new SearchResult.Builder();
builder.addPayload(payload);
builder.addTitle("alpha")
builder.addTitle(TITLES[0])
.addRank(1);
results.add(builder.build());
builder.addTitle("bravo")
builder.addTitle(TITLES[1])
.addRank(3);
results.add(builder.build());
builder.addTitle("Charlie")
builder.addTitle(TITLES[2])
.addRank(6);
results.add(builder.build());
@@ -178,15 +223,15 @@ public class SearchResultsAdapterTest {
AppSearchResult.Builder builder = new AppSearchResult.Builder();
builder.addPayload(payload);
builder.addTitle("appAlpha")
builder.addTitle(TITLES[3])
.addRank(1);
results.add(builder.build());
builder.addTitle("appBravo")
builder.addTitle(TITLES[4])
.addRank(2);
results.add(builder.build());
builder.addTitle("appCharlie")
builder.addTitle(TITLES[5])
.addRank(4);
results.add(builder.build());