Merge "Fix bug in Add network fragment"
diff --git a/src/com/android/settings/homepage/ContextualCardController.java b/src/com/android/settings/homepage/ContextualCardController.java
index 4a7a149..e47f70c 100644
--- a/src/com/android/settings/homepage/ContextualCardController.java
+++ b/src/com/android/settings/homepage/ContextualCardController.java
@@ -16,8 +16,6 @@
 
 package com.android.settings.homepage;
 
-import java.util.List;
-
 /**
  * Data controller for {@link ContextualCard}.
  */
@@ -26,12 +24,6 @@
     @ContextualCard.CardType
     int getCardType();
 
-    /**
-     * When data is updated or changed, the new data should be passed to ContextualCardManager for
-     * list updating.
-     */
-    void onDataUpdated(List<ContextualCard> cardList);
-
     void onPrimaryClick(ContextualCard card);
 
     void onActionClick(ContextualCard card);
diff --git a/src/com/android/settings/homepage/ContextualCardManager.java b/src/com/android/settings/homepage/ContextualCardManager.java
index b9aa792..87b048e 100644
--- a/src/com/android/settings/homepage/ContextualCardManager.java
+++ b/src/com/android/settings/homepage/ContextualCardManager.java
@@ -18,8 +18,11 @@
 
 import static com.android.settings.homepage.CardContentLoader.CARD_CONTENT_LOADER_ID;
 
+import static java.util.stream.Collectors.groupingBy;
+
 import android.content.Context;
 import android.os.Bundle;
+import android.util.ArrayMap;
 import android.util.Log;
 import android.widget.BaseAdapter;
 
@@ -33,6 +36,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -110,15 +114,12 @@
     }
 
     @Override
-    public void onContextualCardUpdated(List<ContextualCard> updateList) {
+    public void onContextualCardUpdated(Map<Integer, List<ContextualCard>> updateList) {
         //TODO(b/112245748): Should implement a DiffCallback.
         //Keep the old list for comparison.
         final List<ContextualCard> prevCards = mContextualCards;
 
-        final Set<Integer> cardTypes = updateList
-                .stream()
-                .map(card -> card.getCardType())
-                .collect(Collectors.toSet());
+        final Set<Integer> cardTypes = updateList.keySet();
         //Remove the existing data that matches the certain cardType before inserting new data.
         final List<ContextualCard> cardsToKeep = mContextualCards
                 .stream()
@@ -126,10 +127,10 @@
                 .collect(Collectors.toList());
         final List<ContextualCard> allCards = new ArrayList<>();
         allCards.addAll(cardsToKeep);
-        allCards.addAll(updateList);
+        allCards.addAll(
+                updateList.values().stream().flatMap(List::stream).collect(Collectors.toList()));
 
         sortCards(allCards);
-
         //replace with the new data
         mContextualCards.clear();
         mContextualCards.addAll(allCards);
@@ -137,13 +138,15 @@
         loadCardControllers();
 
         if (mListener != null) {
-            mListener.onContextualCardUpdated(mContextualCards);
+            final Map<Integer, List<ContextualCard>> cardsToUpdate = new ArrayMap<>();
+            cardsToUpdate.put(ContextualCard.CardType.DEFAULT, mContextualCards);
+            mListener.onContextualCardUpdated(cardsToUpdate);
         }
     }
 
     @Override
-    public void onFinishCardLoading(List<ContextualCard> contextualCards) {
-        onContextualCardUpdated(contextualCards);
+    public void onFinishCardLoading(List<ContextualCard> cards) {
+        onContextualCardUpdated(cards.stream().collect(groupingBy(ContextualCard::getCardType)));
     }
 
     void setListener(ContextualCardUpdateListener listener) {
diff --git a/src/com/android/settings/homepage/ContextualCardUpdateListener.java b/src/com/android/settings/homepage/ContextualCardUpdateListener.java
index 812c4ce..60dd3a7 100644
--- a/src/com/android/settings/homepage/ContextualCardUpdateListener.java
+++ b/src/com/android/settings/homepage/ContextualCardUpdateListener.java
@@ -17,15 +17,19 @@
 package com.android.settings.homepage;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * When {@link ContextualCardController} detects changes, it will notify the listeners registered.
- * In our case, {@link ContextualCardManager} gets noticed.
- *
- * After the list of {@link ContextualCard} gets updated in{@link ContextualCardManager},
- * {@link ContextualCardManager} will notify the listeners registered, {@link
- * ContextualCardsAdapter} in this case.
  */
 public interface ContextualCardUpdateListener {
-    void onContextualCardUpdated(List<ContextualCard> updateList);
+
+    /**
+     * Called when a set of cards are updated.
+     *
+     * @param cards A map of updates grouped by {@link ContextualCard.CardType}. Values can be
+     *              null, which means all cards from corresponding {@link
+     *              ContextualCard.CardType} are removed.
+     */
+    void onContextualCardUpdated(Map<Integer, List<ContextualCard>> cards);
 }
\ No newline at end of file
diff --git a/src/com/android/settings/homepage/ContextualCardsAdapter.java b/src/com/android/settings/homepage/ContextualCardsAdapter.java
index 402212f..9ab8893 100644
--- a/src/com/android/settings/homepage/ContextualCardsAdapter.java
+++ b/src/com/android/settings/homepage/ContextualCardsAdapter.java
@@ -26,6 +26,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 public class ContextualCardsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
         implements ContextualCardUpdateListener {
@@ -101,7 +102,8 @@
     }
 
     @Override
-    public void onContextualCardUpdated(List<ContextualCard> contextualCards) {
+    public void onContextualCardUpdated(Map<Integer, List<ContextualCard>> cards) {
+        final List<ContextualCard> contextualCards = cards.get(ContextualCard.CardType.DEFAULT);
         //TODO(b/112245748): Should implement a DiffCallback so we can use notifyItemChanged()
         // instead.
         if (contextualCards == null) {
diff --git a/src/com/android/settings/homepage/conditional/ConditionContextualCardController.java b/src/com/android/settings/homepage/conditional/ConditionContextualCardController.java
index adac8eb..fbbab14 100644
--- a/src/com/android/settings/homepage/conditional/ConditionContextualCardController.java
+++ b/src/com/android/settings/homepage/conditional/ConditionContextualCardController.java
@@ -17,6 +17,7 @@
 package com.android.settings.homepage.conditional;
 
 import android.content.Context;
+import android.util.ArrayMap;
 
 import com.android.settings.homepage.ContextualCard;
 import com.android.settings.homepage.ContextualCardController;
@@ -27,6 +28,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * This controller triggers the loading of conditional cards and monitors state changes to
@@ -57,11 +59,6 @@
     }
 
     @Override
-    public void onDataUpdated(List<ContextualCard> cardList) {
-        mListener.onContextualCardUpdated(cardList);
-    }
-
-    @Override
     public void onStart() {
         mConditionManager.startMonitoringStateChange();
     }
@@ -105,7 +102,9 @@
         }
 
         if (mListener != null) {
-            onDataUpdated(conditionCards);
+            final Map<Integer, List<ContextualCard>> conditionalCards = new ArrayMap<>();
+            conditionalCards.put(ContextualCard.CardType.CONDITIONAL, conditionCards);
+            mListener.onContextualCardUpdated(conditionalCards);
         }
     }
 }
diff --git a/tests/robotests/src/com/android/settings/homepage/conditional/ConditionContextualCardControllerTest.java b/tests/robotests/src/com/android/settings/homepage/conditional/ConditionContextualCardControllerTest.java
index ed45ce7..a59a3bc 100644
--- a/tests/robotests/src/com/android/settings/homepage/conditional/ConditionContextualCardControllerTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/conditional/ConditionContextualCardControllerTest.java
@@ -82,7 +82,7 @@
 
         mController.onConditionsChanged();
 
-        verify(mController).onDataUpdated(any());
+        verify(mListener).onContextualCardUpdated(any());
     }
 
     @Test
@@ -94,7 +94,7 @@
 
         mController.onConditionsChanged();
 
-        verify(mController, never()).onDataUpdated(any());
+        verify(mListener, never()).onContextualCardUpdated(any());
     }
 
     private class FakeConditionalCard implements ConditionalCard {