From f23b3b84d30009a7c3c25e1415710b5259130364 Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Tue, 2 Apr 2019 17:52:33 -0700 Subject: [PATCH] Fix conditionals not show up in homepage Settings will not refresh conditionals status if there is no condition card in homepage when Settings homepage gets in/out of window focus. Whether or not there are conditional cards in the homepage, Settings should always refresh conditional cards. Fixes: 129725565 Test: robotests, visual Change-Id: I1ed309d3fd4f7a2ba911097ea6b049c2aff48c8a --- .../ContextualCardManager.java | 22 +++++- .../ContextualCardManagerTest.java | 73 +++++++++++++++++++ 2 files changed, 93 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java index e454a3cc5d0..b39058bf098 100644 --- a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java +++ b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java @@ -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 mLifecycleObservers; private ContextualCardUpdateListener mListener; + @VisibleForTesting + final ControllerRendererPool mControllerRendererPool; @VisibleForTesting final List 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 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(); } 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 9759f982da8..895492e43d3 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java @@ -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 categories = Arrays.asList(