diff --git a/src/com/android/settings/homepage/ContextualCardController.java b/src/com/android/settings/homepage/ContextualCardController.java index 4a7a1498bf5..e47f70ce397 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 @@ public interface ContextualCardController { @ContextualCard.CardType int getCardType(); - /** - * When data is updated or changed, the new data should be passed to ContextualCardManager for - * list updating. - */ - void onDataUpdated(List 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 b9aa7920e6f..87b048ea959 100644 --- a/src/com/android/settings/homepage/ContextualCardManager.java +++ b/src/com/android/settings/homepage/ContextualCardManager.java @@ -18,8 +18,11 @@ package com.android.settings.homepage; 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 com.android.settingslib.core.lifecycle.LifecycleObserver; 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 @@ public class ContextualCardManager implements CardContentLoader.CardContentLoade } @Override - public void onContextualCardUpdated(List updateList) { + public void onContextualCardUpdated(Map> updateList) { //TODO(b/112245748): Should implement a DiffCallback. //Keep the old list for comparison. final List prevCards = mContextualCards; - final Set cardTypes = updateList - .stream() - .map(card -> card.getCardType()) - .collect(Collectors.toSet()); + final Set cardTypes = updateList.keySet(); //Remove the existing data that matches the certain cardType before inserting new data. final List cardsToKeep = mContextualCards .stream() @@ -126,10 +127,10 @@ public class ContextualCardManager implements CardContentLoader.CardContentLoade .collect(Collectors.toList()); final List 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 @@ public class ContextualCardManager implements CardContentLoader.CardContentLoade loadCardControllers(); if (mListener != null) { - mListener.onContextualCardUpdated(mContextualCards); + final Map> cardsToUpdate = new ArrayMap<>(); + cardsToUpdate.put(ContextualCard.CardType.DEFAULT, mContextualCards); + mListener.onContextualCardUpdated(cardsToUpdate); } } @Override - public void onFinishCardLoading(List contextualCards) { - onContextualCardUpdated(contextualCards); + public void onFinishCardLoading(List 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 812c4cea4f3..60dd3a7147a 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 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> 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 402212f020e..9ab88936790 100644 --- a/src/com/android/settings/homepage/ContextualCardsAdapter.java +++ b/src/com/android/settings/homepage/ContextualCardsAdapter.java @@ -26,6 +26,7 @@ import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList; import java.util.List; +import java.util.Map; public class ContextualCardsAdapter extends RecyclerView.Adapter implements ContextualCardUpdateListener { @@ -101,7 +102,8 @@ public class ContextualCardsAdapter extends RecyclerView.Adapter contextualCards) { + public void onContextualCardUpdated(Map> cards) { + final List 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 adac8ebcfc4..fbbab14ca3e 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 com.android.settingslib.core.lifecycle.events.OnStop; 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 @@ -56,11 +58,6 @@ public class ConditionContextualCardController implements ContextualCardControll return ContextualCard.CardType.CONDITIONAL; } - @Override - public void onDataUpdated(List cardList) { - mListener.onContextualCardUpdated(cardList); - } - @Override public void onStart() { mConditionManager.startMonitoringStateChange(); @@ -105,7 +102,9 @@ public class ConditionContextualCardController implements ContextualCardControll } if (mListener != null) { - onDataUpdated(conditionCards); + final Map> 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 ed45ce7480d..a59a3bc2462 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 @@ public class ConditionContextualCardControllerTest { mController.onConditionsChanged(); - verify(mController).onDataUpdated(any()); + verify(mListener).onContextualCardUpdated(any()); } @Test @@ -94,7 +94,7 @@ public class ConditionContextualCardControllerTest { mController.onConditionsChanged(); - verify(mController, never()).onDataUpdated(any()); + verify(mListener, never()).onContextualCardUpdated(any()); } private class FakeConditionalCard implements ConditionalCard {