diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java index 39ceff317b6..ae6f6132c83 100644 --- a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java +++ b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java @@ -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 cards) { + @VisibleForTesting + List sortCards(List 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(); diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCard.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCard.java index 81219c33010..4f92534cc18 100644 --- a/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCard.java +++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCard.java @@ -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); } } diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java index 598e23f6f7c..f9eda497cb2 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java @@ -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; diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java new file mode 100644 index 00000000000..091a51b1d4c --- /dev/null +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java @@ -0,0 +1,67 @@ +/* + * 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 cards = new ArrayList<>(); + cards.add(new ConditionalContextualCard.Builder().build()); + cards.add(buildContextualCard(sliceUri)); + + final List 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(); + } +} diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ConditionalContextualCardTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCardTest.java similarity index 74% rename from tests/robotests/src/com/android/settings/homepage/contextualcards/ConditionalContextualCardTest.java rename to tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCardTest.java index 74e88d7eebf..1c74ef32bcc 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ConditionalContextualCardTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCardTest.java @@ -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); + } }