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
This commit is contained in:
Mill Chen
2019-04-02 17:52:33 -07:00
parent cab405d84d
commit f23b3b84d3
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.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();
}