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

Commit 72f0aa2a authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fix conditionals not show up in homepage" into qt-dev

parents ba05893e f23b3b84
Loading
Loading
Loading
Loading
+20 −2
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import androidx.annotation.VisibleForTesting;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.Loader;

import com.android.settings.homepage.contextualcards.conditional.ConditionalCardController;
import com.android.settings.homepage.contextualcards.slices.SliceContextualCardRenderer;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
@@ -82,11 +83,12 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
            {ContextualCard.CardType.CONDITIONAL, ContextualCard.CardType.LEGACY_SUGGESTION};

    private final Context mContext;
    private final ControllerRendererPool mControllerRendererPool;
    private final Lifecycle mLifecycle;
    private final List<LifecycleObserver> mLifecycleObservers;
    private ContextualCardUpdateListener mListener;

    @VisibleForTesting
    final ControllerRendererPool mControllerRendererPool;
    @VisibleForTesting
    final List<ContextualCard> mContextualCards;
    @VisibleForTesting
@@ -246,9 +248,25 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
    public void onWindowFocusChanged(boolean hasWindowFocus) {
        // Duplicate a list to avoid java.util.ConcurrentModificationException.
        final List<ContextualCard> cards = new ArrayList<>(mContextualCards);
        boolean hasConditionController = false;
        for (ContextualCard card : cards) {
            final ContextualCardController controller = mControllerRendererPool
            final ContextualCardController controller = getControllerRendererPool()
                    .getController(mContext, card.getCardType());
            if (controller instanceof ConditionalCardController) {
                hasConditionController = true;
            }
            if (hasWindowFocus && controller instanceof OnStart) {
                ((OnStart) controller).onStart();
            }
            if (!hasWindowFocus && controller instanceof OnStop) {
                ((OnStop) controller).onStop();
            }
        }
        // Conditional cards will always be refreshed whether or not there are conditional cards
        // in the homepage.
        if (!hasConditionController) {
            final ContextualCardController controller = getControllerRendererPool()
                    .getController(mContext, ContextualCard.CardType.CONDITIONAL);
            if (hasWindowFocus && controller instanceof OnStart) {
                ((OnStart) controller).onStart();
            }
+73 −0
Original line number Diff line number Diff line
@@ -26,7 +26,9 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyMap;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
@@ -38,6 +40,7 @@ import android.os.Bundle;
import android.provider.Settings;
import android.util.ArrayMap;

import com.android.settings.homepage.contextualcards.conditional.ConditionContextualCardController;
import com.android.settings.homepage.contextualcards.conditional.ConditionFooterContextualCard;
import com.android.settings.homepage.contextualcards.conditional.ConditionHeaderContextualCard;
import com.android.settings.homepage.contextualcards.conditional.ConditionalContextualCard;
@@ -45,6 +48,8 @@ import com.android.settings.intelligence.ContextualCardProto;
import com.android.settings.slices.CustomSliceRegistry;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;

import org.junit.Before;
import org.junit.Test;
@@ -311,6 +316,74 @@ public class ContextualCardManagerTest {
        assertThat(actualCards).containsExactlyElementsIn(expectedCards);
    }

    @Test
    public void onWindowFocusChanged_hasFocusAndNoConditional_startMonitoringConditionCard() {
        final ContextualCardManager manager = spy(mManager);
        final ControllerRendererPool pool = spy(mManager.mControllerRendererPool);
        doReturn(pool).when(manager).getControllerRendererPool();
        final ConditionContextualCardController conditionController =
                pool.getController(mContext,
                        ContextualCard.CardType.CONDITIONAL);
        final OnStart controller = spy((OnStart)conditionController);
        doReturn(controller).when(pool).getController(mContext, ContextualCard.CardType.CONDITIONAL);

        manager.onWindowFocusChanged(true /* hasWindowFocus */);

        verify(controller, atLeast(1)).onStart();
    }

    @Test
    public void onWindowFocusChanged_hasFocusAndHasConditionals_startMonitoringConditionCard() {
        mManager.mContextualCards.add(new ConditionalContextualCard.Builder().build());
        mManager.mContextualCards.add(new ConditionFooterContextualCard.Builder().build());
        final ContextualCardManager manager = spy(mManager);
        final ControllerRendererPool pool = spy(mManager.mControllerRendererPool);
        doReturn(pool).when(manager).getControllerRendererPool();
        final ConditionContextualCardController conditionController =
                pool.getController(mContext,
                        ContextualCard.CardType.CONDITIONAL);
        final OnStart controller = spy((OnStart)conditionController);
        doReturn(controller).when(pool).getController(mContext, ContextualCard.CardType.CONDITIONAL);

        manager.onWindowFocusChanged(true /* hasWindowFocus */);

        verify(controller, atLeast(2)).onStart();
    }

    @Test
    public void onWindowFocusChanged_loseFocusAndHasConditionals_stopMonitoringConditionCard() {
        mManager.mContextualCards.add(new ConditionalContextualCard.Builder().build());
        mManager.mContextualCards.add(new ConditionFooterContextualCard.Builder().build());
        final ContextualCardManager manager = spy(mManager);
        final ControllerRendererPool pool = spy(mManager.mControllerRendererPool);
        doReturn(pool).when(manager).getControllerRendererPool();
        final ConditionContextualCardController conditionController =
                pool.getController(mContext,
                        ContextualCard.CardType.CONDITIONAL);
        final OnStop controller = spy((OnStop) conditionController);
        doReturn(controller).when(pool).getController(mContext, ContextualCard.CardType.CONDITIONAL);

        manager.onWindowFocusChanged(false /* hasWindowFocus */);

        verify(controller, atLeast(2)).onStop();
    }

    @Test
    public void onWindowFocusChanged_loseFocusAndNoConditional_stopMonitoringConditionCard() {
        final ContextualCardManager manager = spy(mManager);
        final ControllerRendererPool pool = spy(mManager.mControllerRendererPool);
        doReturn(pool).when(manager).getControllerRendererPool();
        final ConditionContextualCardController conditionController =
                pool.getController(mContext,
                        ContextualCard.CardType.CONDITIONAL);
        final OnStop controller = spy((OnStop) conditionController);
        doReturn(controller).when(pool).getController(mContext, ContextualCard.CardType.CONDITIONAL);

        manager.onWindowFocusChanged(false /* hasWindowFocus */);

        verify(controller, atLeast(1)).onStop();
    }

    @Test
    public void getCardsWithViewType_noSuggestionCards_shouldNotHaveHalfCards() {
        final List<Integer> categories = Arrays.asList(