Merge "Fix conditionals not show up in homepage" into qt-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
72f0aa2a68
@@ -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();
|
||||||
}
|
}
|
||||||
|
@@ -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(
|
||||||
|
Reference in New Issue
Block a user