Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ec01bff5 authored by Yi-Ling Chuang's avatar Yi-Ling Chuang
Browse files

Only shows two suggestion cards at once.

Displaying too many cards may overwhelm users, so limit
the number of suggestion cards that should be displayed to two.

Fixes: 126213965
Test: robotests
Change-Id: I17c43746f475b31121c5809e0e8c6cf932efb99d
parent 54cddc70
Loading
Loading
Loading
Loading
+11 −40
Original line number Diff line number Diff line
@@ -50,7 +50,7 @@ import java.util.concurrent.TimeoutException;
public class ContextualCardLoader extends AsyncLoaderCompat<List<ContextualCard>> {

    @VisibleForTesting
    static final int DEFAULT_CARD_COUNT = 4;
    static final int DEFAULT_CARD_COUNT = 2;
    static final int CARD_CONTENT_LOADER_ID = 1;

    private static final String TAG = "ContextualCardLoader";
@@ -141,29 +141,6 @@ public class ContextualCardLoader extends AsyncLoaderCompat<List<ContextualCard>
            }
        }

        try {
            // The maximum cards are four small cards OR
            // one large card with two small cards OR
            // two large cards
            if (visibleCards.size() <= 2 || getNumberOfLargeCard(visibleCards) == 0) {
                // four small cards
                return visibleCards;
            }

            if (visibleCards.size() == DEFAULT_CARD_COUNT) {
                hiddenCards.add(visibleCards.remove(visibleCards.size() - 1));
            }

            if (getNumberOfLargeCard(visibleCards) == 1) {
                // One large card with two small cards
                return visibleCards;
            }

            hiddenCards.add(visibleCards.remove(visibleCards.size() - 1));

            // Two large cards
            return visibleCards;
        } finally {
        if (!CardContentProvider.DELETE_CARD_URI.equals(mNotifyUri)) {
            final MetricsFeatureProvider metricsFeatureProvider =
                    FeatureFactory.getFactory(mContext).getMetricsFeatureProvider();
@@ -176,7 +153,7 @@ public class ContextualCardLoader extends AsyncLoaderCompat<List<ContextualCard>
                    SettingsEnums.ACTION_CONTEXTUAL_CARD_NOT_SHOW,
                    ContextualCardLogUtils.buildCardListLog(hiddenCards));
        }
        }
        return visibleCards;
    }

    @VisibleForTesting
@@ -208,12 +185,6 @@ public class ContextualCardLoader extends AsyncLoaderCompat<List<ContextualCard>
        return cards;
    }

    private int getNumberOfLargeCard(List<ContextualCard> cards) {
        return (int) cards.stream()
                .filter(card -> isLargeCard(card))
                .count();
    }

    private boolean isLargeCard(ContextualCard card) {
        return card.getSliceUri().equals(CONTEXTUAL_WIFI_SLICE_URI)
                || card.getSliceUri().equals(BLUETOOTH_DEVICES_SLICE_URI)
+12 −69
Original line number Diff line number Diff line
@@ -61,62 +61,33 @@ public class ContextualCardLoaderTest {
    }

    @Test
    public void getDisplayableCards_twoEligibleCards_shouldShowAll() {
        final List<ContextualCard> cards = getContextualCardList().stream().limit(2)
                .collect(Collectors.toList());
        doReturn(cards).when(mContextualCardLoader).filterEligibleCards(anyList());

        final List<ContextualCard> result = mContextualCardLoader.getDisplayableCards(cards);

        assertThat(result).hasSize(cards.size());
    }

    @Test
    public void getDisplayableCards_fiveEligibleCardsNoLarge_shouldShowDefaultCardCount() {
        final List<ContextualCard> fiveCards = getContextualCardListWithNoLargeCard();
        doReturn(fiveCards).when(mContextualCardLoader).filterEligibleCards(anyList());

        final List<ContextualCard> result = mContextualCardLoader.getDisplayableCards(
                fiveCards);
    public void loadInBackground_legacyMode_shouldReturnNothing() {
        assertThat(mContext.getResources().getBoolean(R.bool.config_use_legacy_suggestion))
                .isTrue();

        assertThat(result).hasSize(DEFAULT_CARD_COUNT);
        assertThat(mContextualCardLoader.loadInBackground()).isEmpty();
    }

    @Test
    public void getDisplayableCards_threeEligibleCardsOneLarge_shouldShowThreeCards() {
    public void getDisplayableCards_twoEligibleCards_shouldShowAll() {
        final List<ContextualCard> cards = getContextualCardList().stream().limit(2)
                .collect(Collectors.toList());
        cards.add(new ContextualCard.Builder()
                .setName("test_gesture")
                .setCardType(ContextualCard.CardType.SLICE)
                .setSliceUri(Uri.parse(
                        "content://com.android.settings.test.slices/action/gesture_pick_up"))
                .build());
        doReturn(cards).when(mContextualCardLoader).filterEligibleCards(anyList());

        final List<ContextualCard> result = mContextualCardLoader.getDisplayableCards(cards);

        assertThat(result).hasSize(3);
        assertThat(result).hasSize(cards.size());
    }

    @Test
    public void getDisplayableCards_threeEligibleCardsTwoLarge_shouldShowTwoCards() {
        final List<ContextualCard> threeCards = getContextualCardList().stream().limit(3)
                .collect(Collectors.toList());
        doReturn(threeCards).when(mContextualCardLoader).filterEligibleCards(anyList());

        final List<ContextualCard> result = mContextualCardLoader.getDisplayableCards(
                threeCards);

        assertThat(result).hasSize(2);
    }
    public void getDisplayableCards_fourEligibleCards_shouldShowDefaultCardCount() {
        final List<ContextualCard> fourCards = getContextualCardList();
        doReturn(fourCards).when(mContextualCardLoader).filterEligibleCards(anyList());

    @Test
    public void loadInBackground_legacyMode_shouldReturnNothing() {
        assertThat(mContext.getResources().getBoolean(R.bool.config_use_legacy_suggestion))
                .isTrue();
        final List<ContextualCard> result = mContextualCardLoader
                .getDisplayableCards(fourCards);

        assertThat(mContextualCardLoader.loadInBackground()).isEmpty();
        assertThat(result).hasSize(DEFAULT_CARD_COUNT);
    }

    @Test
@@ -167,32 +138,4 @@ public class ContextualCardLoaderTest {
                .build());
        return cards;
    }

    private List<ContextualCard> getContextualCardListWithNoLargeCard() {
        final List<ContextualCard> cards = new ArrayList<>();
        cards.add(new ContextualCard.Builder()
                .setName("test_rotate")
                .setCardType(ContextualCard.CardType.SLICE)
                .setSliceUri(
                        Uri.parse("content://com.android.settings.test.slices/action/auto_rotate"))
                .build());
        cards.add(new ContextualCard.Builder()
                .setName("test_flashlight")
                .setCardType(ContextualCard.CardType.SLICE)
                .setSliceUri(
                        Uri.parse("content://com.android.settings.test.slices/action/flashlight"))
                .build());
        cards.add(new ContextualCard.Builder()
                .setName("test_bt")
                .setCardType(ContextualCard.CardType.SLICE)
                .setSliceUri(Uri.parse("content://android.settings.test.slices/action/bluetooth"))
                .build());
        cards.add(new ContextualCard.Builder()
                .setName("test_gesture")
                .setCardType(ContextualCard.CardType.SLICE)
                .setSliceUri(Uri.parse(
                        "content://com.android.settings.test.slices/action/gesture_pick_up"))
                .build());
        return cards;
    }
}