OSDN Git Service

Fix conditionals not show up in homepage
authorMill Chen <millchen@google.com>
Wed, 3 Apr 2019 00:52:33 +0000 (17:52 -0700)
committerMill Chen <millchen@google.com>
Thu, 11 Apr 2019 21:43:58 +0000 (14:43 -0700)
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

src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java

index e454a3c..b39058b 100644 (file)
@@ -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,12 +83,13 @@ 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
     long mStartTime;
@@ -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();
             }
index 9759f98..895492e 100644 (file)
@@ -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;
@@ -312,6 +317,74 @@ public class ContextualCardManagerTest {
     }
 
     @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(
                 ContextualCardProto.ContextualCard.Category.IMPORTANT_VALUE,