OSDN Git Service

Refresh the dashboard UI when swiping away the only suggestion.
authorDoris Ling <dling@google.com>
Wed, 21 Jun 2017 18:40:37 +0000 (11:40 -0700)
committerDoris Ling <dling@google.com>
Wed, 21 Jun 2017 22:37:31 +0000 (15:37 -0700)
In the new suggestion UI, the suggestions are listed inside the
suggestion container instead of individual dashboard items. When there
is only a single suggestion shown, and that is being swiped away, the
actual list for the suggestions will handle the swipe and remove that
list item from the list. However, the top level container will remain
until next time the dashboard list is being refreshed. Explicitly set
the suggestions to null to force refreshing of the dashboard UI.

Change-Id: I37f8c8f5a813a5c56f4f2f46103fdbb66ce97fcd
Fix: 62639824
Test: make RunSettingsRoboTests

src/com/android/settings/dashboard/DashboardAdapter.java
src/com/android/settings/dashboard/DashboardSummary.java
tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java

index 3a768cc..a084151 100644 (file)
@@ -264,6 +264,19 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
         notifyDashboardDataChanged(prevData);
     }
 
+    public void onSuggestionDismissed() {
+        final List<Tile> suggestions = mDashboardData.getSuggestions();
+        if (suggestions != null && 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;
+            mDashboardData = new DashboardData.Builder(prevData)
+                    .setSuggestions(null)
+                    .build();
+            notifyDashboardDataChanged(prevData);
+        }
+    }
+
     @Override
     public void notifySummaryChanged(Tile tile) {
         final int position = mDashboardData.getPositionByTile(tile);
@@ -449,7 +462,8 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
         return (Tile) getItem(getItemId(position));
     }
 
-    private void notifyDashboardDataChanged(DashboardData prevData) {
+    @VisibleForTesting
+    void notifyDashboardDataChanged(DashboardData prevData) {
         if (mFirstFrameDrawn && prevData != null) {
             final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DashboardData
                     .ItemsDataDiffCallback(prevData.getItemList(), mDashboardData.getItemList()));
index 9c0bfd8..9d2cc0d 100644 (file)
@@ -249,6 +249,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();
index 7ba38dc..6ef17b0 100644 (file)
@@ -21,6 +21,8 @@ import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -442,6 +444,33 @@ public class DashboardAdapterTest {
         assertThat(itemView.getChildCount()).isEqualTo(1);
     }
 
+    @Test
+    public void testSuggestioDismissed_notOnlySuggestion_doNothing() {
+        final DashboardAdapter adapter = spy(new DashboardAdapter(mContext, null, null));
+        adapter.setCategoriesAndSuggestions(
+                new ArrayList<>(), makeSuggestions("pkg1", "pkg2", "pkg3"));
+        final DashboardData dashboardData = adapter.mDashboardData;
+        reset(adapter); // clear interactions tracking
+
+        adapter.onSuggestionDismissed();
+
+        assertThat(adapter.mDashboardData).isEqualTo(dashboardData);
+        verify(adapter, never()).notifyDashboardDataChanged(any());
+    }
+
+    @Test
+    public void testSuggestioDismissed_onlySuggestion_updateDashboardData() {
+        DashboardAdapter adapter = spy(new DashboardAdapter(mContext, null, null));
+        adapter.setCategoriesAndSuggestions(new ArrayList<>(), makeSuggestions("pkg1"));
+        final DashboardData dashboardData = adapter.mDashboardData;
+        reset(adapter); // clear interactions tracking
+
+        adapter.onSuggestionDismissed();
+
+        assertThat(adapter.mDashboardData).isNotEqualTo(dashboardData);
+        verify(adapter).notifyDashboardDataChanged(any());
+    }
+
     private List<Tile> makeSuggestions(String... pkgNames) {
         final List<Tile> suggestions = new ArrayList<>();
         for (String pkgName : pkgNames) {