From e44d953a25e713cedd719570ff7fa83193dc8f1c Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Wed, 28 Nov 2018 16:35:25 +0800 Subject: [PATCH] Fix conditional cards disappeared from contextual homepage This symptom only occurred in the case of more than 3 conditional cards and no suggestion cards in homepage. It is caused by incompletely keeping conditional cards. So adding missing card types makes conditional cards be kept correctly. Bug: 120115919 Test: robotest Change-Id: Ic67c0a813de4f966c164bf92e4d4d64debcf95be --- .../ContextualCardManager.java | 8 ++++- .../ContextualCardManagerTest.java | 29 ++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java index 30eae298752..5f397d787eb 100644 --- a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java +++ b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java @@ -40,6 +40,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TreeSet; import java.util.stream.Collectors; /** @@ -132,8 +133,13 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo // except Conditional cards, all other cards are from the database. So when the map sent // here is empty, we only keep Conditional cards. if (cardTypes.isEmpty()) { + final Set conditionalCardTypes = new TreeSet() {{ + add(ContextualCard.CardType.CONDITIONAL); + add(ContextualCard.CardType.CONDITIONAL_HEADER); + add(ContextualCard.CardType.CONDITIONAL_FOOTER); + }}; cardsToKeep = mContextualCards.stream() - .filter(card -> card.getCardType() == ContextualCard.CardType.CONDITIONAL) + .filter(card -> conditionalCardTypes.contains(card.getCardType())) .collect(Collectors.toList()); } else { cardsToKeep = mContextualCards.stream() diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java index 82876722efa..28015a770c8 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java @@ -25,6 +25,8 @@ import android.content.Context; import android.net.Uri; import android.util.ArrayMap; +import com.android.settings.homepage.contextualcards.conditional.ConditionFooterContextualCard; +import com.android.settings.homepage.contextualcards.conditional.ConditionHeaderContextualCard; import com.android.settings.homepage.contextualcards.conditional.ConditionalContextualCard; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -70,7 +72,7 @@ public class ContextualCardManagerTest { } @Test - public void onContextualCardUpdated_emtpyMapWithExistingCards_shouldOnlyKeepConditionalCard() { + public void onContextualCardUpdated_emptyMapWithExistingCards_shouldOnlyKeepConditionalCard() { mManager.mContextualCards.add(new ConditionalContextualCard.Builder().build()); mManager.mContextualCards.add( buildContextualCard(TEST_SLICE_URI)); @@ -84,6 +86,31 @@ public class ContextualCardManagerTest { .isEqualTo(ContextualCard.CardType.CONDITIONAL); } + @Test + public void onContextualCardUpdated_hasEmptyMap_shouldKeepConditionalHeaderCard() { + mManager.mContextualCards.add(new ConditionHeaderContextualCard.Builder().build()); + mManager.setListener(mListener); + + mManager.onContextualCardUpdated(new ArrayMap<>()); + + assertThat(mManager.mContextualCards).hasSize(1); + assertThat(mManager.mContextualCards.get(0).getCardType()) + .isEqualTo(ContextualCard.CardType.CONDITIONAL_HEADER); + } + + @Test + public void onContextualCardUpdated_hasEmptyMap_shouldKeepConditionalFooterCard() { + mManager.mContextualCards.add(new ConditionFooterContextualCard.Builder().build()); + mManager.setListener(mListener); + + mManager.onContextualCardUpdated(new ArrayMap<>()); + + assertThat(mManager.mContextualCards).hasSize(1); + assertThat(mManager.mContextualCards.get(0).getCardType()) + .isEqualTo(ContextualCard.CardType.CONDITIONAL_FOOTER); + } + + private ContextualCard buildContextualCard(String sliceUri) { return new ContextualCard.Builder() .setName("test_name")