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

Commit f7f1b9b2 authored by Emily Chuang's avatar Emily Chuang
Browse files

Sort contextual cards based on their score.

Fixes: 119493779
Bug: 111822376
Test: robotests
Change-Id: I254cba3c92ca1b58633f2ea6b2fa381607549e0c
parent 4864624c
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.widget.BaseAdapter;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.Loader;

@@ -109,9 +110,12 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
        }
    }

    //TODO(b/111822376): implement sorting mechanism.
    private void sortCards(List<ContextualCard> cards) {
    @VisibleForTesting
    List<ContextualCard> sortCards(List<ContextualCard> cards) {
        //take mContextualCards as the source and do the ranking based on the rule.
        return cards.stream()
                .sorted((c1, c2) -> Double.compare(c2.getRankingScore(), c1.getRankingScore()))
                .collect(Collectors.toList());
    }

    @Override
@@ -127,10 +131,9 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
        allCards.addAll(
                updateList.values().stream().flatMap(List::stream).collect(Collectors.toList()));

        sortCards(allCards);
        //replace with the new data
        mContextualCards.clear();
        mContextualCards.addAll(allCards);
        mContextualCards.addAll(sortCards(allCards));

        loadCardControllers();

+6 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.settings.homepage.contextualcards.conditional;

import androidx.annotation.VisibleForTesting;

import com.android.settings.homepage.contextualcards.ContextualCard;

/**
@@ -26,6 +28,9 @@ import com.android.settings.homepage.contextualcards.ContextualCard;
 */
public class ConditionalContextualCard extends ContextualCard {

    @VisibleForTesting
    static final double UNSUPPORTED_RANKING_SCORE = -100.0;

    private final long mConditionId;
    private final int mMetricsConstant;
    private final CharSequence mActionText;
@@ -83,6 +88,7 @@ public class ConditionalContextualCard extends ContextualCard {
        }

        public ConditionalContextualCard build() {
            setRankingScore(UNSUPPORTED_RANKING_SCORE);
            return new ConditionalContextualCard(this);
        }
    }
+0 −1
Original line number Diff line number Diff line
@@ -38,7 +38,6 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.shadows.ShadowContentResolver;
import org.robolectric.shadows.ShadowLog;

import java.util.ArrayList;
import java.util.Arrays;
+67 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.homepage.contextualcards;

import static com.google.common.truth.Truth.assertThat;

import android.content.Context;
import android.net.Uri;

import com.android.settings.homepage.contextualcards.conditional.ConditionalContextualCard;
import com.android.settings.testutils.SettingsRobolectricTestRunner;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RuntimeEnvironment;

import java.util.ArrayList;
import java.util.List;

@RunWith(SettingsRobolectricTestRunner.class)
public class ContextualCardManagerTest {

    private Context mContext;
    private ContextualCardManager mManager;

    @Before
    public void setUp() {
        mContext = RuntimeEnvironment.application;
        final ContextualCardsFragment fragment = new ContextualCardsFragment();
        mManager = new ContextualCardManager(mContext, fragment.getSettingsLifecycle());
    }

    @Test
    public void sortCards_hasConditionalAndSliceCards_conditionalShouldAlwaysBeTheLast() {
        final String sliceUri = "content://com.android.settings.slices/action/flashlight";
        final List<ContextualCard> cards = new ArrayList<>();
        cards.add(new ConditionalContextualCard.Builder().build());
        cards.add(buildContextualCard(sliceUri));

        final List<ContextualCard> sortedCards = mManager.sortCards(cards);

        assertThat(sortedCards.get(cards.size() - 1).getCardType())
                .isEqualTo(ContextualCard.CardType.CONDITIONAL);
    }

    private ContextualCard buildContextualCard(String sliceUri) {
        return new ContextualCard.Builder()
                .setName("test_name")
                .setSliceUri(Uri.parse(sliceUri))
                .build();
    }
}
+11 −1
Original line number Diff line number Diff line
@@ -14,10 +14,14 @@
 * limitations under the License.
 */

package com.android.settings.homepage.contextualcards;
package com.android.settings.homepage.contextualcards.conditional;

import static com.android.settings.homepage.contextualcards.conditional.ConditionalContextualCard
        .UNSUPPORTED_RANKING_SCORE;

import static com.google.common.truth.Truth.assertThat;

import com.android.settings.homepage.contextualcards.ContextualCard;
import com.android.settings.homepage.contextualcards.conditional.ConditionalContextualCard;
import com.android.settings.testutils.SettingsRobolectricTestRunner;

@@ -39,4 +43,10 @@ public class ConditionalContextualCardTest {
        assertThat(new ConditionalContextualCard.Builder().build().getCardType())
                .isEqualTo(ContextualCard.CardType.CONDITIONAL);
    }

    @Test
    public void getRankingScore_shouldAlwaysBeUnsupportedScore() {
        assertThat(new ConditionalContextualCard.Builder().build().getRankingScore())
                .isEqualTo(UNSUPPORTED_RANKING_SCORE);
    }
}