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

This commit is contained in:
TreeHugger Robot
2019-04-11 23:14:30 +00:00
committed by Android (Google) Code Review
2 changed files with 93 additions and 2 deletions

View File

@@ -37,6 +37,7 @@ import androidx.annotation.VisibleForTesting;
import androidx.loader.app.LoaderManager; import androidx.loader.app.LoaderManager;
import androidx.loader.content.Loader; 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.homepage.contextualcards.slices.SliceContextualCardRenderer;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
@@ -82,11 +83,12 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
{ContextualCard.CardType.CONDITIONAL, ContextualCard.CardType.LEGACY_SUGGESTION}; {ContextualCard.CardType.CONDITIONAL, ContextualCard.CardType.LEGACY_SUGGESTION};
private final Context mContext; private final Context mContext;
private final ControllerRendererPool mControllerRendererPool;
private final Lifecycle mLifecycle; private final Lifecycle mLifecycle;
private final List<LifecycleObserver> mLifecycleObservers; private final List<LifecycleObserver> mLifecycleObservers;
private ContextualCardUpdateListener mListener; private ContextualCardUpdateListener mListener;
@VisibleForTesting
final ControllerRendererPool mControllerRendererPool;
@VisibleForTesting @VisibleForTesting
final List<ContextualCard> mContextualCards; final List<ContextualCard> mContextualCards;
@VisibleForTesting @VisibleForTesting
@@ -246,9 +248,25 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
public void onWindowFocusChanged(boolean hasWindowFocus) { public void onWindowFocusChanged(boolean hasWindowFocus) {
// Duplicate a list to avoid java.util.ConcurrentModificationException. // Duplicate a list to avoid java.util.ConcurrentModificationException.
final List<ContextualCard> cards = new ArrayList<>(mContextualCards); final List<ContextualCard> cards = new ArrayList<>(mContextualCards);
boolean hasConditionController = false;
for (ContextualCard card : cards) { for (ContextualCard card : cards) {
final ContextualCardController controller = mControllerRendererPool final ContextualCardController controller = getControllerRendererPool()
.getController(mContext, card.getCardType()); .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) { if (hasWindowFocus && controller instanceof OnStart) {
((OnStart) controller).onStart(); ((OnStart) controller).onStart();
} }

View File

@@ -26,7 +26,9 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyMap; import static org.mockito.ArgumentMatchers.anyMap;
import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
@@ -38,6 +40,7 @@ import android.os.Bundle;
import android.provider.Settings; import android.provider.Settings;
import android.util.ArrayMap; 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.ConditionFooterContextualCard;
import com.android.settings.homepage.contextualcards.conditional.ConditionHeaderContextualCard; import com.android.settings.homepage.contextualcards.conditional.ConditionHeaderContextualCard;
import com.android.settings.homepage.contextualcards.conditional.ConditionalContextualCard; 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.settings.slices.CustomSliceRegistry;
import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver; 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.Before;
import org.junit.Test; import org.junit.Test;
@@ -311,6 +316,74 @@ public class ContextualCardManagerTest {
assertThat(actualCards).containsExactlyElementsIn(expectedCards); 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 @Test
public void getCardsWithViewType_noSuggestionCards_shouldNotHaveHalfCards() { public void getCardsWithViewType_noSuggestionCards_shouldNotHaveHalfCards() {
final List<Integer> categories = Arrays.asList( final List<Integer> categories = Arrays.asList(