Make conditional work properly when toggle it in QS

Some conditionals do not work properly when users toggle its state in
QS, the cause is that these conditionals don't have a way to monitor the
status changed. Make RecyclerView handle onWindowFocusChanged event and
make sure that conditionals can update the status when going back to
Settings from QS.

Bug: 118387886
Bug: 123171638
Bug: 123167705
Test: visual, robotests
Change-Id: Ib3bb9bf43afaa58726502eea1e98bcf602bc3677
This commit is contained in:
Mill Chen
2019-03-19 18:56:11 -07:00
parent 2f8e02fdbe
commit bd10886288
4 changed files with 63 additions and 5 deletions

View File

@@ -43,6 +43,8 @@ import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;
import java.util.ArrayList;
import java.util.List;
@@ -98,7 +100,6 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
mLifecycleObservers = new ArrayList<>();
mControllerRendererPool = new ControllerRendererPool();
mLifecycle.addObserver(this);
if (savedInstanceState == null) {
mIsFirstLaunch = true;
mSavedCards = null;
@@ -240,6 +241,21 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
outState.putStringArrayList(KEY_CONTEXTUAL_CARDS, cards);
}
public void onWindowFocusChanged(boolean hasWindowFocus) {
// Duplicate a list to avoid java.util.ConcurrentModificationException.
final List<ContextualCard> cards = new ArrayList<>(mContextualCards);
for (ContextualCard card : cards) {
final ContextualCardController controller = mControllerRendererPool
.getController(mContext, card.getCardType());
if (hasWindowFocus && controller instanceof OnStart) {
((OnStart) controller).onStart();
}
if (!hasWindowFocus && controller instanceof OnStop) {
((OnStop) controller).onStop();
}
}
}
public ControllerRendererPool getControllerRendererPool() {
return mControllerRendererPool;
}