Adjust lookup table mechanism to support new UI of conditional card
Use layout resource id as the return value of getItemViewType in the ContextualCardsAdapter to make sure the RecyclerView could work normally, and adjust the lookup table mechanism to meet the current design as well. Bug: 113451905, 112578070 Test: visual, robotest Change-Id: I8fa299e44025a0b71b6990d020e7f0683c153337
This commit is contained in:
@@ -16,43 +16,57 @@
|
||||
|
||||
package com.android.settings.homepage.contextualcards;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
import com.android.settings.homepage.contextualcards.ContextualCard.CardType;
|
||||
import com.android.settings.homepage.contextualcards.conditional.ConditionContextualCardController;
|
||||
import com.android.settings.homepage.contextualcards.conditional.ConditionContextualCardRenderer;
|
||||
import com.android.settings.homepage.contextualcards.slices.SliceContextualCardController;
|
||||
import com.android.settings.homepage.contextualcards.slices.SliceContextualCardRenderer;
|
||||
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.TreeSet;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class ContextualCardLookupTable {
|
||||
|
||||
private static final String TAG = "ContextualCardLookup";
|
||||
static class ControllerRendererMapping implements Comparable<ControllerRendererMapping> {
|
||||
@CardType
|
||||
private final int mCardType;
|
||||
private final Class<? extends ContextualCardController> mControllerClass;
|
||||
private final Class<? extends ContextualCardRenderer> mRendererClass;
|
||||
final int mCardType;
|
||||
final int mViewType;
|
||||
final Class<? extends ContextualCardController> mControllerClass;
|
||||
final Class<? extends ContextualCardRenderer> mRendererClass;
|
||||
|
||||
private ControllerRendererMapping(@CardType int cardType,
|
||||
ControllerRendererMapping(@CardType int cardType, int viewType,
|
||||
Class<? extends ContextualCardController> controllerClass,
|
||||
Class<? extends ContextualCardRenderer> rendererClass) {
|
||||
mCardType = cardType;
|
||||
mViewType = viewType;
|
||||
mControllerClass = controllerClass;
|
||||
mRendererClass = rendererClass;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(ControllerRendererMapping other) {
|
||||
return Integer.compare(this.mCardType, other.mCardType);
|
||||
return Comparator.comparingInt((ControllerRendererMapping mapping) -> mapping.mCardType)
|
||||
.thenComparingInt(mapping -> mapping.mViewType)
|
||||
.compare(this, other);
|
||||
}
|
||||
}
|
||||
|
||||
private static final Set<ControllerRendererMapping> LOOKUP_TABLE =
|
||||
@VisibleForTesting
|
||||
static final Set<ControllerRendererMapping> LOOKUP_TABLE =
|
||||
new TreeSet<ControllerRendererMapping>() {{
|
||||
add(new ControllerRendererMapping(CardType.CONDITIONAL,
|
||||
ConditionContextualCardRenderer.VIEW_TYPE,
|
||||
ConditionContextualCardController.class,
|
||||
ConditionContextualCardRenderer.class));
|
||||
add(new ControllerRendererMapping(CardType.SLICE,
|
||||
SliceContextualCardRenderer.VIEW_TYPE,
|
||||
SliceContextualCardController.class,
|
||||
SliceContextualCardRenderer.class));
|
||||
}};
|
||||
@@ -67,14 +81,27 @@ public class ContextualCardLookupTable {
|
||||
return null;
|
||||
}
|
||||
|
||||
//TODO(b/112578070): Implement multi renderer cases.
|
||||
public static Class<? extends ContextualCardRenderer> getCardRendererClasses(
|
||||
public static Class<? extends ContextualCardRenderer> getCardRendererClassByCardType(
|
||||
@CardType int cardType) {
|
||||
for (ControllerRendererMapping mapping : LOOKUP_TABLE) {
|
||||
if (mapping.mCardType == cardType) {
|
||||
return mapping.mRendererClass;
|
||||
}
|
||||
return LOOKUP_TABLE.stream()
|
||||
.filter(m -> m.mCardType == cardType)
|
||||
.findFirst()
|
||||
.map(mapping -> mapping.mRendererClass)
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
public static Class<? extends ContextualCardRenderer> getCardRendererClassByViewType(
|
||||
int viewType) throws IllegalStateException {
|
||||
List<ControllerRendererMapping> validMappings = LOOKUP_TABLE.stream()
|
||||
.filter(m -> m.mViewType == viewType).collect(Collectors.toList());
|
||||
if (validMappings == null || validMappings.isEmpty()) {
|
||||
Log.w(TAG, "No matching mapping");
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
if (validMappings.size() != 1) {
|
||||
throw new IllegalStateException("Have duplicate VIEW_TYPE in lookup table.");
|
||||
}
|
||||
|
||||
return validMappings.get(0).mRendererClass;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user