Loading src/com/android/settings/dashboard/DashboardAdapter.java +12 −3 Original line number Diff line number Diff line Loading @@ -67,6 +67,8 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash static final String STATE_SUGGESTION_CONDITION_MODE = "suggestion_condition_mode"; @VisibleForTesting static final int SUGGESTION_CONDITION_HEADER_POSITION = 0; @VisibleForTesting static final int MAX_SUGGESTION_TO_SHOW = 5; private final IconCache mCache; private final Context mContext; Loading Loading @@ -174,7 +176,8 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash final DashboardData prevData = mDashboardData; mDashboardData = new DashboardData.Builder(prevData) .setSuggestions(suggestions) .setSuggestions(suggestions.subList(0, Math.min(suggestions.size(), MAX_SUGGESTION_TO_SHOW))) .setCategories(categories) .build(); notifyDashboardDataChanged(prevData); Loading Loading @@ -215,9 +218,12 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash notifyDashboardDataChanged(prevData); } public void onSuggestionDismissed() { public void onSuggestionDismissed(Tile suggestion) { final List<Tile> suggestions = mDashboardData.getSuggestions(); if (suggestions != null && suggestions.size() == 1) { if (suggestions == null || suggestions.isEmpty()) { return; } if (suggestions.size() == 1) { // The only suggestion is dismissed, and the the empty suggestion container will // remain as the dashboard item. Need to refresh the dashboard list. final DashboardData prevData = mDashboardData; Loading @@ -225,6 +231,9 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash .setSuggestions(null) .build(); notifyDashboardDataChanged(prevData); } else { suggestions.remove(suggestion); mSuggestionAdapter.notifyDataSetChanged(); } } Loading src/com/android/settings/dashboard/DashboardSummary.java +1 −4 Original line number Diff line number Diff line Loading @@ -245,10 +245,7 @@ public class DashboardSummary extends InstrumentedFragment @Override public void onSuggestionDismissed(Tile suggestion) { mAdapter.onSuggestionDismissed(); // Refresh the UI to pick up suggestions that can now be shown because, say, a higher // priority suggestion has been dismissed, or an exclusive suggestion category is emptied. rebuildUI(); mAdapter.onSuggestionDismissed(suggestion); } private class SuggestionLoader extends AsyncTask<Void, Void, List<Tile>> { Loading tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java +33 −6 Original line number Diff line number Diff line Loading @@ -325,17 +325,33 @@ public class DashboardAdapterTest { } @Test public void testSuggestioDismissed_notOnlySuggestion_doNothing() { public void testSuggestioDismissed_notOnlySuggestion_updateSuggestionOnly() { final DashboardAdapter adapter = spy(new DashboardAdapter(mContext, null, null, null, null)); adapter.setCategoriesAndSuggestions( new ArrayList<>(), makeSuggestions("pkg1", "pkg2", "pkg3")); final List<Tile> suggestions = makeSuggestions("pkg1", "pkg2", "pkg3"); adapter.setCategoriesAndSuggestions(new ArrayList<>(), suggestions); final RecyclerView data = mock(RecyclerView.class); when(data.getResources()).thenReturn(mResources); when(data.getContext()).thenReturn(mContext); when(mResources.getDisplayMetrics()).thenReturn(mock(DisplayMetrics.class)); final View itemView = mock(View.class); when(itemView.findViewById(R.id.data)).thenReturn(data); final DashboardAdapter.SuggestionAndConditionContainerHolder holder = new DashboardAdapter.SuggestionAndConditionContainerHolder(itemView); adapter.onBindConditionAndSuggestion( holder, DashboardAdapter.SUGGESTION_CONDITION_HEADER_POSITION); final DashboardData dashboardData = adapter.mDashboardData; reset(adapter); // clear interactions tracking adapter.onSuggestionDismissed(); final Tile suggestionToRemove = suggestions.get(1); adapter.onSuggestionDismissed(suggestionToRemove); assertThat(adapter.mDashboardData).isEqualTo(dashboardData); assertThat(suggestions.size()).isEqualTo(2); assertThat(suggestions.contains(suggestionToRemove)).isFalse(); verify(adapter, never()).notifyDashboardDataChanged(any()); } Loading @@ -343,11 +359,12 @@ public class DashboardAdapterTest { public void testSuggestioDismissed_onlySuggestion_updateDashboardData() { DashboardAdapter adapter = spy(new DashboardAdapter(mContext, null, null, null, null)); adapter.setCategoriesAndSuggestions(new ArrayList<>(), makeSuggestions("pkg1")); final List<Tile> suggestions = makeSuggestions("pkg1"); adapter.setCategoriesAndSuggestions(new ArrayList<>(), suggestions); final DashboardData dashboardData = adapter.mDashboardData; reset(adapter); // clear interactions tracking adapter.onSuggestionDismissed(); adapter.onSuggestionDismissed(suggestions.get(0)); assertThat(adapter.mDashboardData).isNotEqualTo(dashboardData); verify(adapter).notifyDashboardDataChanged(any()); Loading @@ -369,6 +386,16 @@ public class DashboardAdapterTest { verify(mockIcon).setTint(eq(0x89000000)); } @Test public void testSetCategoriesAndSuggestions_limitSuggestionSize() { List<Tile> packages = makeSuggestions("pkg1", "pkg2", "pkg3", "pkg4", "pkg5", "pkg6", "pkg7"); mDashboardAdapter.setCategoriesAndSuggestions(Collections.emptyList(), packages); assertThat(mDashboardAdapter.mDashboardData.getSuggestions().size()) .isEqualTo(DashboardAdapter.MAX_SUGGESTION_TO_SHOW); } @Test public void testBindConditionAndSuggestion_shouldSetSuggestionAdapterAndNoCrash() { mDashboardAdapter = new DashboardAdapter(mContext, null, null, null, null); Loading tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java +2 −3 Original line number Diff line number Diff line Loading @@ -111,9 +111,8 @@ public class DashboardSummaryTest { } @Test public void onSuggestionDismissed_categoryShouldBeRefreshed() { doNothing().when(mSummary).rebuildUI(); public void onSuggestionDismissed_shouldNotRebuildUI() { mSummary.onSuggestionDismissed(mock(Tile.class)); verify(mSummary).rebuildUI(); verify(mSummary, never()).rebuildUI(); } } No newline at end of file Loading
src/com/android/settings/dashboard/DashboardAdapter.java +12 −3 Original line number Diff line number Diff line Loading @@ -67,6 +67,8 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash static final String STATE_SUGGESTION_CONDITION_MODE = "suggestion_condition_mode"; @VisibleForTesting static final int SUGGESTION_CONDITION_HEADER_POSITION = 0; @VisibleForTesting static final int MAX_SUGGESTION_TO_SHOW = 5; private final IconCache mCache; private final Context mContext; Loading Loading @@ -174,7 +176,8 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash final DashboardData prevData = mDashboardData; mDashboardData = new DashboardData.Builder(prevData) .setSuggestions(suggestions) .setSuggestions(suggestions.subList(0, Math.min(suggestions.size(), MAX_SUGGESTION_TO_SHOW))) .setCategories(categories) .build(); notifyDashboardDataChanged(prevData); Loading Loading @@ -215,9 +218,12 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash notifyDashboardDataChanged(prevData); } public void onSuggestionDismissed() { public void onSuggestionDismissed(Tile suggestion) { final List<Tile> suggestions = mDashboardData.getSuggestions(); if (suggestions != null && suggestions.size() == 1) { if (suggestions == null || suggestions.isEmpty()) { return; } if (suggestions.size() == 1) { // The only suggestion is dismissed, and the the empty suggestion container will // remain as the dashboard item. Need to refresh the dashboard list. final DashboardData prevData = mDashboardData; Loading @@ -225,6 +231,9 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash .setSuggestions(null) .build(); notifyDashboardDataChanged(prevData); } else { suggestions.remove(suggestion); mSuggestionAdapter.notifyDataSetChanged(); } } Loading
src/com/android/settings/dashboard/DashboardSummary.java +1 −4 Original line number Diff line number Diff line Loading @@ -245,10 +245,7 @@ public class DashboardSummary extends InstrumentedFragment @Override public void onSuggestionDismissed(Tile suggestion) { mAdapter.onSuggestionDismissed(); // Refresh the UI to pick up suggestions that can now be shown because, say, a higher // priority suggestion has been dismissed, or an exclusive suggestion category is emptied. rebuildUI(); mAdapter.onSuggestionDismissed(suggestion); } private class SuggestionLoader extends AsyncTask<Void, Void, List<Tile>> { Loading
tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java +33 −6 Original line number Diff line number Diff line Loading @@ -325,17 +325,33 @@ public class DashboardAdapterTest { } @Test public void testSuggestioDismissed_notOnlySuggestion_doNothing() { public void testSuggestioDismissed_notOnlySuggestion_updateSuggestionOnly() { final DashboardAdapter adapter = spy(new DashboardAdapter(mContext, null, null, null, null)); adapter.setCategoriesAndSuggestions( new ArrayList<>(), makeSuggestions("pkg1", "pkg2", "pkg3")); final List<Tile> suggestions = makeSuggestions("pkg1", "pkg2", "pkg3"); adapter.setCategoriesAndSuggestions(new ArrayList<>(), suggestions); final RecyclerView data = mock(RecyclerView.class); when(data.getResources()).thenReturn(mResources); when(data.getContext()).thenReturn(mContext); when(mResources.getDisplayMetrics()).thenReturn(mock(DisplayMetrics.class)); final View itemView = mock(View.class); when(itemView.findViewById(R.id.data)).thenReturn(data); final DashboardAdapter.SuggestionAndConditionContainerHolder holder = new DashboardAdapter.SuggestionAndConditionContainerHolder(itemView); adapter.onBindConditionAndSuggestion( holder, DashboardAdapter.SUGGESTION_CONDITION_HEADER_POSITION); final DashboardData dashboardData = adapter.mDashboardData; reset(adapter); // clear interactions tracking adapter.onSuggestionDismissed(); final Tile suggestionToRemove = suggestions.get(1); adapter.onSuggestionDismissed(suggestionToRemove); assertThat(adapter.mDashboardData).isEqualTo(dashboardData); assertThat(suggestions.size()).isEqualTo(2); assertThat(suggestions.contains(suggestionToRemove)).isFalse(); verify(adapter, never()).notifyDashboardDataChanged(any()); } Loading @@ -343,11 +359,12 @@ public class DashboardAdapterTest { public void testSuggestioDismissed_onlySuggestion_updateDashboardData() { DashboardAdapter adapter = spy(new DashboardAdapter(mContext, null, null, null, null)); adapter.setCategoriesAndSuggestions(new ArrayList<>(), makeSuggestions("pkg1")); final List<Tile> suggestions = makeSuggestions("pkg1"); adapter.setCategoriesAndSuggestions(new ArrayList<>(), suggestions); final DashboardData dashboardData = adapter.mDashboardData; reset(adapter); // clear interactions tracking adapter.onSuggestionDismissed(); adapter.onSuggestionDismissed(suggestions.get(0)); assertThat(adapter.mDashboardData).isNotEqualTo(dashboardData); verify(adapter).notifyDashboardDataChanged(any()); Loading @@ -369,6 +386,16 @@ public class DashboardAdapterTest { verify(mockIcon).setTint(eq(0x89000000)); } @Test public void testSetCategoriesAndSuggestions_limitSuggestionSize() { List<Tile> packages = makeSuggestions("pkg1", "pkg2", "pkg3", "pkg4", "pkg5", "pkg6", "pkg7"); mDashboardAdapter.setCategoriesAndSuggestions(Collections.emptyList(), packages); assertThat(mDashboardAdapter.mDashboardData.getSuggestions().size()) .isEqualTo(DashboardAdapter.MAX_SUGGESTION_TO_SHOW); } @Test public void testBindConditionAndSuggestion_shouldSetSuggestionAdapterAndNoCrash() { mDashboardAdapter = new DashboardAdapter(mContext, null, null, null, null); Loading
tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java +2 −3 Original line number Diff line number Diff line Loading @@ -111,9 +111,8 @@ public class DashboardSummaryTest { } @Test public void onSuggestionDismissed_categoryShouldBeRefreshed() { doNothing().when(mSummary).rebuildUI(); public void onSuggestionDismissed_shouldNotRebuildUI() { mSummary.onSuggestionDismissed(mock(Tile.class)); verify(mSummary).rebuildUI(); verify(mSummary, never()).rebuildUI(); } } No newline at end of file