Remove mIsHalfWidth field from ContextualCard

mIsHalfWidth in ContextualCard is too generic to identify its
responsibility, it is used to hold the value of is_support_half from
database and used to decide the card width. Also, it limits the
relationship of CardType-to-Renderer not to be extended to one-to-many.

To deal with this, we replaced mIsHalfWidth with mViewType to implement
one-to-many relationship of CardType-to-Renderer, and removed all
related logic of mIsHalfWidth.

Bug: 121303357
Test: robotests, visual

Change-Id: I03e14392272194424f317d11bf9d0d794a6133f4
This commit is contained in:
Mill Chen
2019-01-09 18:54:31 +08:00
parent 46285fe08f
commit 1c3ed19a09
34 changed files with 187 additions and 228 deletions

View File

@@ -22,6 +22,10 @@ import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.text.TextUtils; import android.text.TextUtils;
import androidx.annotation.LayoutRes;
import com.android.settings.homepage.contextualcards.slices.SliceContextualCardRenderer;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
@@ -63,9 +67,10 @@ public class ContextualCard {
private final int mIconResId; private final int mIconResId;
private final int mCardAction; private final int mCardAction;
private final long mExpireTimeMS; private final long mExpireTimeMS;
private final boolean mIsHalfWidth;
private final boolean mIsLargeCard; private final boolean mIsLargeCard;
private final Drawable mIconDrawable; private final Drawable mIconDrawable;
@LayoutRes
private final int mViewType;
public String getName() { public String getName() {
return mName; return mName;
@@ -139,10 +144,6 @@ public class ContextualCard {
return mIconDrawable; return mIconDrawable;
} }
public boolean isHalfWidth() {
return mIsHalfWidth;
}
public boolean isLargeCard() { public boolean isLargeCard() {
return mIsLargeCard; return mIsLargeCard;
} }
@@ -151,6 +152,10 @@ public class ContextualCard {
return TextUtils.isEmpty(mSliceUri); return TextUtils.isEmpty(mSliceUri);
} }
public int getViewType() {
return mViewType;
}
public Builder mutate() { public Builder mutate() {
return mBuilder; return mBuilder;
} }
@@ -174,8 +179,8 @@ public class ContextualCard {
mCardAction = builder.mCardAction; mCardAction = builder.mCardAction;
mExpireTimeMS = builder.mExpireTimeMS; mExpireTimeMS = builder.mExpireTimeMS;
mIconDrawable = builder.mIconDrawable; mIconDrawable = builder.mIconDrawable;
mIsHalfWidth = builder.mIsHalfWidth;
mIsLargeCard = builder.mIsLargeCard; mIsLargeCard = builder.mIsLargeCard;
mViewType = builder.mViewType;
} }
ContextualCard(Cursor c) { ContextualCard(Cursor c) {
@@ -215,13 +220,12 @@ public class ContextualCard {
mBuilder.setCardAction(mCardAction); mBuilder.setCardAction(mCardAction);
mExpireTimeMS = c.getLong(c.getColumnIndex(CardDatabaseHelper.CardColumns.EXPIRE_TIME_MS)); mExpireTimeMS = c.getLong(c.getColumnIndex(CardDatabaseHelper.CardColumns.EXPIRE_TIME_MS));
mBuilder.setExpireTimeMS(mExpireTimeMS); mBuilder.setExpireTimeMS(mExpireTimeMS);
mIsHalfWidth = (c.getInt(
c.getColumnIndex(CardDatabaseHelper.CardColumns.SUPPORT_HALF_WIDTH)) == 1);
mBuilder.setIsHalfWidth(mIsHalfWidth);
mIsLargeCard = false; mIsLargeCard = false;
mBuilder.setIsLargeCard(mIsLargeCard); mBuilder.setIsLargeCard(mIsLargeCard);
mIconDrawable = null; mIconDrawable = null;
mBuilder.setIconDrawable(mIconDrawable); mBuilder.setIconDrawable(mIconDrawable);
mViewType = getViewTypeByCardType(mCardType);
mBuilder.setViewType(mViewType);
} }
@Override @Override
@@ -245,6 +249,13 @@ public class ContextualCard {
return TextUtils.equals(mName, that.mName); return TextUtils.equals(mName, that.mName);
} }
private int getViewTypeByCardType(int cardType) {
if (cardType == CardType.SLICE) {
return SliceContextualCardRenderer.VIEW_TYPE_FULL_WIDTH;
}
return 0;
}
public static class Builder { public static class Builder {
private String mName; private String mName;
private int mCardType; private int mCardType;
@@ -263,8 +274,9 @@ public class ContextualCard {
private int mCardAction; private int mCardAction;
private long mExpireTimeMS; private long mExpireTimeMS;
private Drawable mIconDrawable; private Drawable mIconDrawable;
private boolean mIsHalfWidth;
private boolean mIsLargeCard; private boolean mIsLargeCard;
@LayoutRes
private int mViewType;
public Builder setName(String name) { public Builder setName(String name) {
mName = name; mName = name;
@@ -351,13 +363,13 @@ public class ContextualCard {
return this; return this;
} }
public Builder setIsHalfWidth(boolean isHalfWidth) { public Builder setIsLargeCard(boolean isLargeCard) {
mIsHalfWidth = isHalfWidth; mIsLargeCard = isLargeCard;
return this; return this;
} }
public Builder setIsLargeCard(boolean isLargeCard) { public Builder setViewType(@LayoutRes int viewType) {
mIsLargeCard = isLargeCard; mViewType = viewType;
return this; return this;
} }

View File

@@ -24,14 +24,10 @@ import androidx.annotation.VisibleForTesting;
import com.android.settings.homepage.contextualcards.ContextualCard.CardType; import com.android.settings.homepage.contextualcards.ContextualCard.CardType;
import com.android.settings.homepage.contextualcards.conditional.ConditionContextualCardController; import com.android.settings.homepage.contextualcards.conditional.ConditionContextualCardController;
import com.android.settings.homepage.contextualcards.conditional.ConditionContextualCardRenderer; import com.android.settings.homepage.contextualcards.conditional.ConditionContextualCardRenderer;
import com.android.settings.homepage.contextualcards.conditional import com.android.settings.homepage.contextualcards.conditional.ConditionFooterContextualCardRenderer;
.ConditionHeaderContextualCardRenderer; import com.android.settings.homepage.contextualcards.conditional.ConditionHeaderContextualCardRenderer;
import com.android.settings.homepage.contextualcards.legacysuggestion import com.android.settings.homepage.contextualcards.legacysuggestion.LegacySuggestionContextualCardController;
.LegacySuggestionContextualCardController; import com.android.settings.homepage.contextualcards.legacysuggestion.LegacySuggestionContextualCardRenderer;
import com.android.settings.homepage.contextualcards.legacysuggestion
.LegacySuggestionContextualCardRenderer;
import com.android.settings.homepage.contextualcards.conditional
.ConditionFooterContextualCardRenderer;
import com.android.settings.homepage.contextualcards.slices.SliceContextualCardController; import com.android.settings.homepage.contextualcards.slices.SliceContextualCardController;
import com.android.settings.homepage.contextualcards.slices.SliceContextualCardRenderer; import com.android.settings.homepage.contextualcards.slices.SliceContextualCardRenderer;
@@ -72,11 +68,11 @@ public class ContextualCardLookupTable {
static final Set<ControllerRendererMapping> LOOKUP_TABLE = static final Set<ControllerRendererMapping> LOOKUP_TABLE =
new TreeSet<ControllerRendererMapping>() {{ new TreeSet<ControllerRendererMapping>() {{
add(new ControllerRendererMapping(CardType.CONDITIONAL, add(new ControllerRendererMapping(CardType.CONDITIONAL,
ConditionContextualCardRenderer.HALF_WIDTH_VIEW_TYPE, ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH,
ConditionContextualCardController.class, ConditionContextualCardController.class,
ConditionContextualCardRenderer.class)); ConditionContextualCardRenderer.class));
add(new ControllerRendererMapping(CardType.CONDITIONAL, add(new ControllerRendererMapping(CardType.CONDITIONAL,
ConditionContextualCardRenderer.FULL_WIDTH_VIEW_TYPE, ConditionContextualCardRenderer.VIEW_TYPE_FULL_WIDTH,
ConditionContextualCardController.class, ConditionContextualCardController.class,
ConditionContextualCardRenderer.class)); ConditionContextualCardRenderer.class));
add(new ControllerRendererMapping(CardType.LEGACY_SUGGESTION, add(new ControllerRendererMapping(CardType.LEGACY_SUGGESTION,
@@ -111,15 +107,6 @@ public class ContextualCardLookupTable {
return null; return null;
} }
public static Class<? extends ContextualCardRenderer> getCardRendererClassByCardType(
@CardType int cardType) {
return LOOKUP_TABLE.stream()
.filter(m -> m.mCardType == cardType)
.findFirst()
.map(mapping -> mapping.mRendererClass)
.orElse(null);
}
public static Class<? extends ContextualCardRenderer> getCardRendererClassByViewType( public static Class<? extends ContextualCardRenderer> getCardRendererClassByViewType(
int viewType) throws IllegalStateException { int viewType) throws IllegalStateException {
List<ControllerRendererMapping> validMappings = LOOKUP_TABLE.stream() List<ControllerRendererMapping> validMappings = LOOKUP_TABLE.stream()

View File

@@ -33,6 +33,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.slices.SliceContextualCardRenderer;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
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;
@@ -236,8 +237,10 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
final ContextualCard current = result.get(index); final ContextualCard current = result.get(index);
if (current.getCategory() == SUGGESTION_VALUE if (current.getCategory() == SUGGESTION_VALUE
&& previous.getCategory() == SUGGESTION_VALUE) { && previous.getCategory() == SUGGESTION_VALUE) {
result.set(index - 1, previous.mutate().setIsHalfWidth(true).build()); result.set(index - 1, previous.mutate().setViewType(
result.set(index, current.mutate().setIsHalfWidth(true).build()); SliceContextualCardRenderer.VIEW_TYPE_HALF_WIDTH).build());
result.set(index, current.mutate().setViewType(
SliceContextualCardRenderer.VIEW_TYPE_HALF_WIDTH).build());
index++; index++;
} }
} }

View File

@@ -26,18 +26,12 @@ import androidx.recyclerview.widget.RecyclerView;
*/ */
public interface ContextualCardRenderer { public interface ContextualCardRenderer {
/**
* The layout type of the renderer.
*/
@LayoutRes
int getViewType(boolean isHalfWidth);
/** /**
* When {@link ContextualCardsAdapter} calls {@link ContextualCardsAdapter#onCreateViewHolder}, * When {@link ContextualCardsAdapter} calls {@link ContextualCardsAdapter#onCreateViewHolder},
* this method will be called to retrieve the corresponding * this method will be called to retrieve the corresponding
* {@link androidx.recyclerview.widget.RecyclerView.ViewHolder}. * {@link androidx.recyclerview.widget.RecyclerView.ViewHolder}.
*/ */
RecyclerView.ViewHolder createViewHolder(View view); RecyclerView.ViewHolder createViewHolder(View view, @LayoutRes int viewType);
/** /**
* When {@link ContextualCardsAdapter} calls {@link ContextualCardsAdapter#onBindViewHolder}, * When {@link ContextualCardsAdapter} calls {@link ContextualCardsAdapter#onBindViewHolder},

View File

@@ -21,11 +21,15 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import androidx.annotation.LayoutRes;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.android.settings.homepage.contextualcards.conditional.ConditionContextualCardRenderer;
import com.android.settings.homepage.contextualcards.slices.SliceContextualCardRenderer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -62,24 +66,22 @@ public class ContextualCardsAdapter extends RecyclerView.Adapter<RecyclerView.Vi
@Override @Override
public int getItemViewType(int position) { public int getItemViewType(int position) {
final ContextualCard card = mContextualCards.get(position); final ContextualCard card = mContextualCards.get(position);
final ContextualCardRenderer renderer = mControllerRendererPool.getRendererByCardType( return card.getViewType();
mContext, mLifecycleOwner, card.getCardType());
return renderer.getViewType(card.isHalfWidth());
} }
@Override @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, @LayoutRes int viewType) {
final ContextualCardRenderer renderer = mControllerRendererPool.getRendererByViewType( final ContextualCardRenderer renderer = mControllerRendererPool.getRendererByViewType(
mContext, mLifecycleOwner, viewType); mContext, mLifecycleOwner, viewType);
final View view = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false); final View view = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false);
return renderer.createViewHolder(view); return renderer.createViewHolder(view, viewType);
} }
@Override @Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
final ContextualCard card = mContextualCards.get(position); final ContextualCard card = mContextualCards.get(position);
final ContextualCardRenderer renderer = mControllerRendererPool.getRendererByCardType( final ContextualCardRenderer renderer = mControllerRendererPool.getRendererByViewType(
mContext, mLifecycleOwner, card.getCardType()); mContext, mLifecycleOwner, card.getViewType());
renderer.bindView(holder, card); renderer.bindView(holder, card);
} }
@@ -98,12 +100,15 @@ public class ContextualCardsAdapter extends RecyclerView.Adapter<RecyclerView.Vi
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override @Override
public int getSpanSize(int position) { public int getSpanSize(int position) {
final ContextualCard card = mContextualCards.get(position); final int viewType = mContextualCards.get(position).getViewType();
if (card.isHalfWidth()) { switch (viewType) {
case ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH:
case SliceContextualCardRenderer.VIEW_TYPE_HALF_WIDTH:
return HALF_WIDTH; return HALF_WIDTH;
} default:
return FULL_WIDTH; return FULL_WIDTH;
} }
}
}); });
} }
} }

View File

@@ -26,14 +26,10 @@ import androidx.lifecycle.LifecycleOwner;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.homepage.contextualcards.conditional.ConditionContextualCardController; import com.android.settings.homepage.contextualcards.conditional.ConditionContextualCardController;
import com.android.settings.homepage.contextualcards.conditional.ConditionContextualCardRenderer; import com.android.settings.homepage.contextualcards.conditional.ConditionContextualCardRenderer;
import com.android.settings.homepage.contextualcards.conditional import com.android.settings.homepage.contextualcards.conditional.ConditionFooterContextualCardRenderer;
.ConditionHeaderContextualCardRenderer; import com.android.settings.homepage.contextualcards.conditional.ConditionHeaderContextualCardRenderer;
import com.android.settings.homepage.contextualcards.legacysuggestion import com.android.settings.homepage.contextualcards.legacysuggestion.LegacySuggestionContextualCardController;
.LegacySuggestionContextualCardController; import com.android.settings.homepage.contextualcards.legacysuggestion.LegacySuggestionContextualCardRenderer;
import com.android.settings.homepage.contextualcards.legacysuggestion
.LegacySuggestionContextualCardRenderer;
import com.android.settings.homepage.contextualcards.conditional
.ConditionFooterContextualCardRenderer;
import com.android.settings.homepage.contextualcards.slices.SliceContextualCardController; import com.android.settings.homepage.contextualcards.slices.SliceContextualCardController;
import com.android.settings.homepage.contextualcards.slices.SliceContextualCardRenderer; import com.android.settings.homepage.contextualcards.slices.SliceContextualCardRenderer;
@@ -90,13 +86,6 @@ public class ControllerRendererPool {
return getRenderer(context, lifecycleOwner, clz); return getRenderer(context, lifecycleOwner, clz);
} }
public ContextualCardRenderer getRendererByCardType(Context context,
LifecycleOwner lifecycleOwner, @ContextualCard.CardType int cardType) {
final Class<? extends ContextualCardRenderer> clz =
ContextualCardLookupTable.getCardRendererClassByCardType(cardType);
return getRenderer(context, lifecycleOwner, clz);
}
private ContextualCardRenderer getRenderer(Context context, LifecycleOwner lifecycleOwner, private ContextualCardRenderer getRenderer(Context context, LifecycleOwner lifecycleOwner,
@NonNull Class<? extends ContextualCardRenderer> clz) { @NonNull Class<? extends ContextualCardRenderer> clz) {
for (ContextualCardRenderer renderer : mRenderers) { for (ContextualCardRenderer renderer : mRenderers) {

View File

@@ -79,7 +79,7 @@ public class AirplaneModeConditionController implements ConditionalCardControlle
.setTitleText(mAppContext.getText(R.string.condition_airplane_title).toString()) .setTitleText(mAppContext.getText(R.string.condition_airplane_title).toString())
.setSummaryText(mAppContext.getText(R.string.condition_airplane_summary).toString()) .setSummaryText(mAppContext.getText(R.string.condition_airplane_summary).toString())
.setIconDrawable(mAppContext.getDrawable(R.drawable.ic_airplanemode_active)) .setIconDrawable(mAppContext.getDrawable(R.drawable.ic_airplanemode_active))
.setIsHalfWidth(true) .setViewType(ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH)
.build(); .build();
} }

View File

@@ -73,7 +73,7 @@ public class BackgroundDataConditionController implements ConditionalCardControl
.setTitleText(mAppContext.getText(R.string.condition_bg_data_title).toString()) .setTitleText(mAppContext.getText(R.string.condition_bg_data_title).toString())
.setSummaryText(mAppContext.getText(R.string.condition_bg_data_summary).toString()) .setSummaryText(mAppContext.getText(R.string.condition_bg_data_summary).toString())
.setIconDrawable(mAppContext.getDrawable(R.drawable.ic_data_saver)) .setIconDrawable(mAppContext.getDrawable(R.drawable.ic_data_saver))
.setIsHalfWidth(true) .setViewType(ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH)
.build(); .build();
} }

View File

@@ -82,7 +82,7 @@ public class BatterySaverConditionController implements ConditionalCardControlle
.setTitleText(mAppContext.getText(R.string.condition_battery_title).toString()) .setTitleText(mAppContext.getText(R.string.condition_battery_title).toString())
.setSummaryText(mAppContext.getText(R.string.condition_battery_summary).toString()) .setSummaryText(mAppContext.getText(R.string.condition_battery_summary).toString())
.setIconDrawable(mAppContext.getDrawable(R.drawable.ic_battery_saver_accent_24dp)) .setIconDrawable(mAppContext.getDrawable(R.drawable.ic_battery_saver_accent_24dp))
.setIsHalfWidth(true) .setViewType(ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH)
.build(); .build();
} }

View File

@@ -89,7 +89,7 @@ public class CellularDataConditionController implements ConditionalCardControlle
.setTitleText(mAppContext.getText(R.string.condition_cellular_title).toString()) .setTitleText(mAppContext.getText(R.string.condition_cellular_title).toString())
.setSummaryText(mAppContext.getText(R.string.condition_cellular_summary).toString()) .setSummaryText(mAppContext.getText(R.string.condition_cellular_summary).toString())
.setIconDrawable(mAppContext.getDrawable(R.drawable.ic_cellular_off)) .setIconDrawable(mAppContext.getDrawable(R.drawable.ic_cellular_off))
.setIsHalfWidth(true) .setViewType(ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH)
.build(); .build();
} }

View File

@@ -168,7 +168,8 @@ public class ConditionContextualCardController implements ContextualCardControll
final int lastIndex = expandedCards.size() - 1; final int lastIndex = expandedCards.size() - 1;
final ConditionalContextualCard card = final ConditionalContextualCard card =
(ConditionalContextualCard) expandedCards.get(lastIndex); (ConditionalContextualCard) expandedCards.get(lastIndex);
expandedCards.set(lastIndex, card.mutate().setIsHalfWidth(false).build()); expandedCards.set(lastIndex, card.mutate().setViewType(
ConditionContextualCardRenderer.VIEW_TYPE_FULL_WIDTH).build());
} }
return expandedCards; return expandedCards;
} }
@@ -180,6 +181,7 @@ public class ConditionContextualCardController implements ContextualCardControll
footerCards.add(new ConditionFooterContextualCard.Builder() footerCards.add(new ConditionFooterContextualCard.Builder()
.setName(CONDITION_FOOTER) .setName(CONDITION_FOOTER)
.setRankingScore(UNSUPPORTED_RANKING) .setRankingScore(UNSUPPORTED_RANKING)
.setViewType(ConditionFooterContextualCardRenderer.VIEW_TYPE)
.build()); .build());
return footerCards; return footerCards;
} }
@@ -194,6 +196,7 @@ public class ConditionContextualCardController implements ContextualCardControll
.setConditionalCards(conditionCards) .setConditionalCards(conditionCards)
.setName(CONDITION_HEADER) .setName(CONDITION_HEADER)
.setRankingScore(UNSUPPORTED_RANKING) .setRankingScore(UNSUPPORTED_RANKING)
.setViewType(ConditionHeaderContextualCardRenderer.VIEW_TYPE)
.build()); .build());
return headerCards; return headerCards;
} }

View File

@@ -39,9 +39,9 @@ import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
*/ */
public class ConditionContextualCardRenderer implements ContextualCardRenderer { public class ConditionContextualCardRenderer implements ContextualCardRenderer {
@LayoutRes @LayoutRes
public static final int HALF_WIDTH_VIEW_TYPE = R.layout.homepage_condition_half_tile; public static final int VIEW_TYPE_HALF_WIDTH = R.layout.homepage_condition_half_tile;
@LayoutRes @LayoutRes
public static final int FULL_WIDTH_VIEW_TYPE = R.layout.homepage_condition_full_tile; public static final int VIEW_TYPE_FULL_WIDTH = R.layout.homepage_condition_full_tile;
private final Context mContext; private final Context mContext;
private final ControllerRendererPool mControllerRendererPool; private final ControllerRendererPool mControllerRendererPool;
@@ -53,16 +53,7 @@ public class ConditionContextualCardRenderer implements ContextualCardRenderer {
} }
@Override @Override
public int getViewType(boolean isHalfWidth) { public RecyclerView.ViewHolder createViewHolder(View view, @LayoutRes int viewType) {
if (isHalfWidth) {
return HALF_WIDTH_VIEW_TYPE;
} else {
return FULL_WIDTH_VIEW_TYPE;
}
}
@Override
public RecyclerView.ViewHolder createViewHolder(View view) {
return new ConditionalCardHolder(view); return new ConditionalCardHolder(view);
} }

View File

@@ -20,6 +20,7 @@ import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.view.View; import android.view.View;
import androidx.annotation.LayoutRes;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto;
@@ -44,12 +45,7 @@ public class ConditionFooterContextualCardRenderer implements ContextualCardRend
} }
@Override @Override
public int getViewType(boolean isHalfWidth) { public RecyclerView.ViewHolder createViewHolder(View view, @LayoutRes int viewType) {
return VIEW_TYPE;
}
@Override
public RecyclerView.ViewHolder createViewHolder(View view) {
return new ConditionFooterCardHolder(view); return new ConditionFooterCardHolder(view);
} }

View File

@@ -23,6 +23,7 @@ import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import androidx.annotation.LayoutRes;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto;
@@ -47,12 +48,7 @@ public class ConditionHeaderContextualCardRenderer implements ContextualCardRend
} }
@Override @Override
public int getViewType(boolean isHalfWidth) { public RecyclerView.ViewHolder createViewHolder(View view, @LayoutRes int viewType) {
return VIEW_TYPE;
}
@Override
public RecyclerView.ViewHolder createViewHolder(View view) {
return new ConditionHeaderCardHolder(view); return new ConditionHeaderCardHolder(view);
} }

View File

@@ -22,7 +22,6 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.provider.Settings; import android.provider.Settings;
import android.service.notification.ZenModeConfig;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
@@ -100,7 +99,7 @@ public class DndConditionCardController implements ConditionalCardController {
.setTitleText(mAppContext.getText(R.string.condition_zen_title).toString()) .setTitleText(mAppContext.getText(R.string.condition_zen_title).toString())
.setSummaryText(mAppContext.getText(R.string.condition_zen_summary).toString()) .setSummaryText(mAppContext.getText(R.string.condition_zen_summary).toString())
.setIconDrawable(mAppContext.getDrawable(R.drawable.ic_do_not_disturb_on_24dp)) .setIconDrawable(mAppContext.getDrawable(R.drawable.ic_do_not_disturb_on_24dp))
.setIsHalfWidth(true) .setViewType(ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH)
.build(); .build();
} }

View File

@@ -99,7 +99,7 @@ public class HotspotConditionController implements ConditionalCardController {
.setTitleText(mAppContext.getText(R.string.condition_hotspot_title).toString()) .setTitleText(mAppContext.getText(R.string.condition_hotspot_title).toString())
.setSummaryText(getSummary().toString()) .setSummaryText(getSummary().toString())
.setIconDrawable(mAppContext.getDrawable(R.drawable.ic_hotspot)) .setIconDrawable(mAppContext.getDrawable(R.drawable.ic_hotspot))
.setIsHalfWidth(true) .setViewType(ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH)
.build(); .build();
} }

View File

@@ -78,7 +78,7 @@ public class NightDisplayConditionController implements ConditionalCardControlle
.setSummaryText( .setSummaryText(
mAppContext.getText(R.string.condition_night_display_summary).toString()) mAppContext.getText(R.string.condition_night_display_summary).toString())
.setIconDrawable(mAppContext.getDrawable(R.drawable.ic_settings_night_display)) .setIconDrawable(mAppContext.getDrawable(R.drawable.ic_settings_night_display))
.setIsHalfWidth(true) .setViewType(ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH)
.build(); .build();
} }

View File

@@ -58,7 +58,7 @@ public class RingerMutedConditionController extends AbnormalRingerConditionContr
.setSummaryText( .setSummaryText(
mAppContext.getText(R.string.condition_device_muted_summary).toString()) mAppContext.getText(R.string.condition_device_muted_summary).toString())
.setIconDrawable(mAppContext.getDrawable(R.drawable.ic_notifications_off_24dp)) .setIconDrawable(mAppContext.getDrawable(R.drawable.ic_notifications_off_24dp))
.setIsHalfWidth(true) .setViewType(ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH)
.build(); .build();
} }
} }

View File

@@ -60,7 +60,7 @@ public class RingerVibrateConditionController extends AbnormalRingerConditionCon
.setSummaryText( .setSummaryText(
mAppContext.getText(R.string.condition_device_vibrate_summary).toString()) mAppContext.getText(R.string.condition_device_vibrate_summary).toString())
.setIconDrawable(mAppContext.getDrawable(R.drawable.ic_volume_ringer_vibrate)) .setIconDrawable(mAppContext.getDrawable(R.drawable.ic_volume_ringer_vibrate))
.setIsHalfWidth(true) .setViewType(ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH)
.build(); .build();
} }
} }

View File

@@ -93,7 +93,7 @@ public class WorkModeConditionController implements ConditionalCardController {
.setTitleText(mAppContext.getText(R.string.condition_work_title).toString()) .setTitleText(mAppContext.getText(R.string.condition_work_title).toString())
.setSummaryText(mAppContext.getText(R.string.condition_work_summary).toString()) .setSummaryText(mAppContext.getText(R.string.condition_work_summary).toString())
.setIconDrawable(mAppContext.getDrawable(R.drawable.ic_signal_workmode_enable)) .setIconDrawable(mAppContext.getDrawable(R.drawable.ic_signal_workmode_enable))
.setIsHalfWidth(true) .setViewType(ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH)
.build(); .build();
} }

View File

@@ -144,7 +144,8 @@ public class LegacySuggestionContextualCardController implements ContextualCardC
.setPendingIntent(suggestion.getPendingIntent()) .setPendingIntent(suggestion.getPendingIntent())
.setName(suggestion.getId()) .setName(suggestion.getId())
.setTitleText(suggestion.getTitle().toString()) .setTitleText(suggestion.getTitle().toString())
.setSummaryText(suggestion.getSummary().toString()); .setSummaryText(suggestion.getSummary().toString())
.setViewType(LegacySuggestionContextualCardRenderer.VIEW_TYPE);
cards.add(cardBuilder.build()); cards.add(cardBuilder.build());
} }

View File

@@ -44,12 +44,7 @@ public class LegacySuggestionContextualCardRenderer implements ContextualCardRen
} }
@Override @Override
public int getViewType(boolean isHalfWidth) { public RecyclerView.ViewHolder createViewHolder(View view, @LayoutRes int viewType) {
return VIEW_TYPE;
}
@Override
public RecyclerView.ViewHolder createViewHolder(View view) {
return new LegacySuggestionViewHolder(view); return new LegacySuggestionViewHolder(view);
} }

View File

@@ -26,6 +26,7 @@ import android.view.View;
import android.widget.Button; import android.widget.Button;
import android.widget.ViewFlipper; import android.widget.ViewFlipper;
import androidx.annotation.LayoutRes;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.lifecycle.Lifecycle; import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.LifecycleObserver;
@@ -66,9 +67,6 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer, Life
private final SliceFullCardRendererHelper mFullCardHelper; private final SliceFullCardRendererHelper mFullCardHelper;
private final SliceHalfCardRendererHelper mHalfCardHelper; private final SliceHalfCardRendererHelper mHalfCardHelper;
//TODO(b/121303357): Remove isHalfWidth field from SliceContextualCardRenderer class.
private boolean mIsHalfWidth;
public SliceContextualCardRenderer(Context context, LifecycleOwner lifecycleOwner, public SliceContextualCardRenderer(Context context, LifecycleOwner lifecycleOwner,
ControllerRendererPool controllerRendererPool) { ControllerRendererPool controllerRendererPool) {
mContext = context; mContext = context;
@@ -83,18 +81,14 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer, Life
} }
@Override @Override
public int getViewType(boolean isHalfWidth) { public RecyclerView.ViewHolder createViewHolder(View view, @LayoutRes int viewType) {
mIsHalfWidth = isHalfWidth; switch (viewType) {
return isHalfWidth? VIEW_TYPE_HALF_WIDTH : VIEW_TYPE_FULL_WIDTH; case VIEW_TYPE_HALF_WIDTH:
}
@Override
public RecyclerView.ViewHolder createViewHolder(View view) {
if (mIsHalfWidth) {
return mHalfCardHelper.createViewHolder(view); return mHalfCardHelper.createViewHolder(view);
} default:
return mFullCardHelper.createViewHolder(view); return mFullCardHelper.createViewHolder(view);
} }
}
@Override @Override
public void bindView(RecyclerView.ViewHolder holder, ContextualCard card) { public void bindView(RecyclerView.ViewHolder holder, ContextualCard card) {

View File

@@ -18,17 +18,16 @@ package com.android.settings.homepage.contextualcards;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import com.android.settings.homepage.contextualcards.ContextualCardLookupTable import com.android.settings.homepage.contextualcards.ContextualCardLookupTable.ControllerRendererMapping;
.ControllerRendererMapping;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.robolectric.RobolectricTestRunner;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class ContextualCardLookupTableTest { public class ContextualCardLookupTableTest {
@@ -98,18 +97,4 @@ public class ContextualCardLookupTableTest {
ContextualCardLookupTable.getCardRendererClassByViewType(UNSUPPORTED_VIEW_TYPE); ContextualCardLookupTable.getCardRendererClassByViewType(UNSUPPORTED_VIEW_TYPE);
} }
@Test
public void getRendererClassByCardType_hasSupportedCardType_shouldGetCorrespondingRenderer() {
for (ControllerRendererMapping mapping : ContextualCardLookupTable.LOOKUP_TABLE) {
assertThat(ContextualCardLookupTable.getCardRendererClassByCardType(mapping.mCardType))
.isEqualTo(mapping.mRendererClass);
}
}
@Test
public void getCardRendererClassByCardType_hasUnsupportedCardType_shouldAlwaysGetNull() {
assertThat(ContextualCardLookupTable.getCardRendererClassByCardType(UNSUPPORTED_CARD_TYPE))
.isNull();
}
} }

View File

@@ -16,6 +16,9 @@
package com.android.settings.homepage.contextualcards; package com.android.settings.homepage.contextualcards;
import static com.android.settings.homepage.contextualcards.slices.SliceContextualCardRenderer.VIEW_TYPE_FULL_WIDTH;
import static com.android.settings.homepage.contextualcards.slices.SliceContextualCardRenderer.VIEW_TYPE_HALF_WIDTH;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyMap; import static org.mockito.ArgumentMatchers.anyMap;
@@ -222,7 +225,7 @@ public class ContextualCardManagerTest {
assertThat(result).hasSize(5); assertThat(result).hasSize(5);
for (ContextualCard card : result) { for (ContextualCard card : result) {
assertThat(card.isHalfWidth()).isFalse(); assertThat(card.getViewType()).isEqualTo(VIEW_TYPE_FULL_WIDTH);
} }
} }
@@ -242,7 +245,7 @@ public class ContextualCardManagerTest {
assertThat(result).hasSize(5); assertThat(result).hasSize(5);
for (ContextualCard card : result) { for (ContextualCard card : result) {
assertThat(card.isHalfWidth()).isFalse(); assertThat(card.getViewType()).isEqualTo(VIEW_TYPE_FULL_WIDTH);
} }
} }
@@ -257,14 +260,16 @@ public class ContextualCardManagerTest {
); );
final List<ContextualCard> twoConsecutiveSuggestionCards = buildCategoriedCards( final List<ContextualCard> twoConsecutiveSuggestionCards = buildCategoriedCards(
getContextualCardList(), categories); getContextualCardList(), categories);
final List<Boolean> expectedValues = Arrays.asList(false, false, true, true, false); final List<Integer> expectedValues = Arrays.asList(VIEW_TYPE_FULL_WIDTH,
VIEW_TYPE_FULL_WIDTH, VIEW_TYPE_HALF_WIDTH, VIEW_TYPE_HALF_WIDTH,
VIEW_TYPE_FULL_WIDTH);
final List<ContextualCard> result = mManager.assignCardWidth( final List<ContextualCard> result = mManager.assignCardWidth(
twoConsecutiveSuggestionCards); twoConsecutiveSuggestionCards);
assertThat(result).hasSize(5); assertThat(result).hasSize(5);
for (int i = 0; i < result.size(); i++) { for (int i = 0; i < result.size(); i++) {
assertThat(result.get(i).isHalfWidth()).isEqualTo(expectedValues.get(i)); assertThat(result.get(i).getViewType()).isEqualTo(expectedValues.get(i));
} }
} }
@@ -285,7 +290,7 @@ public class ContextualCardManagerTest {
assertThat(result).hasSize(5); assertThat(result).hasSize(5);
for (ContextualCard card : result) { for (ContextualCard card : result) {
assertThat(card.isHalfWidth()).isFalse(); assertThat(card.getViewType()).isEqualTo(VIEW_TYPE_FULL_WIDTH);
} }
} }
@@ -300,14 +305,16 @@ public class ContextualCardManagerTest {
); );
final List<ContextualCard> threeConsecutiveSuggestionCards = buildCategoriedCards( final List<ContextualCard> threeConsecutiveSuggestionCards = buildCategoriedCards(
getContextualCardList(), categories); getContextualCardList(), categories);
final List<Boolean> expectedValues = Arrays.asList(false, true, true, false, false); final List<Integer> expectedValues = Arrays.asList(VIEW_TYPE_FULL_WIDTH,
VIEW_TYPE_HALF_WIDTH, VIEW_TYPE_HALF_WIDTH, VIEW_TYPE_FULL_WIDTH,
VIEW_TYPE_FULL_WIDTH);
final List<ContextualCard> result = mManager.assignCardWidth( final List<ContextualCard> result = mManager.assignCardWidth(
threeConsecutiveSuggestionCards); threeConsecutiveSuggestionCards);
assertThat(result).hasSize(5); assertThat(result).hasSize(5);
for (int i = 0; i < result.size(); i++) { for (int i = 0; i < result.size(); i++) {
assertThat(result.get(i).isHalfWidth()).isEqualTo(expectedValues.get(i)); assertThat(result.get(i).getViewType()).isEqualTo(expectedValues.get(i));
} }
} }
@@ -322,14 +329,16 @@ public class ContextualCardManagerTest {
); );
final List<ContextualCard> fourConsecutiveSuggestionCards = buildCategoriedCards( final List<ContextualCard> fourConsecutiveSuggestionCards = buildCategoriedCards(
getContextualCardList(), categories); getContextualCardList(), categories);
final List<Boolean> expectedValues = Arrays.asList(false, true, true, true, true); final List<Integer> expectedValues = Arrays.asList(VIEW_TYPE_FULL_WIDTH,
VIEW_TYPE_HALF_WIDTH, VIEW_TYPE_HALF_WIDTH, VIEW_TYPE_HALF_WIDTH,
VIEW_TYPE_HALF_WIDTH);
final List<ContextualCard> result = mManager.assignCardWidth( final List<ContextualCard> result = mManager.assignCardWidth(
fourConsecutiveSuggestionCards); fourConsecutiveSuggestionCards);
assertThat(result).hasSize(5); assertThat(result).hasSize(5);
for (int i = 0; i < result.size(); i++) { for (int i = 0; i < result.size(); i++) {
assertThat(result.get(i).isHalfWidth()).isEqualTo(expectedValues.get(i)); assertThat(result.get(i).getViewType()).isEqualTo(expectedValues.get(i));
} }
} }
@@ -338,6 +347,7 @@ public class ContextualCardManagerTest {
.setName(TEST_SLICE_NAME) .setName(TEST_SLICE_NAME)
.setCardType(ContextualCard.CardType.SLICE) .setCardType(ContextualCard.CardType.SLICE)
.setSliceUri(Uri.parse(sliceUri)) .setSliceUri(Uri.parse(sliceUri))
.setViewType(VIEW_TYPE_FULL_WIDTH)
.build(); .build();
} }
@@ -356,28 +366,33 @@ public class ContextualCardManagerTest {
.setName("test_wifi") .setName("test_wifi")
.setCardType(ContextualCard.CardType.SLICE) .setCardType(ContextualCard.CardType.SLICE)
.setSliceUri(CustomSliceRegistry.CONTEXTUAL_WIFI_SLICE_URI) .setSliceUri(CustomSliceRegistry.CONTEXTUAL_WIFI_SLICE_URI)
.setViewType(VIEW_TYPE_FULL_WIDTH)
.build()); .build());
cards.add(new ContextualCard.Builder() cards.add(new ContextualCard.Builder()
.setName("test_flashlight") .setName("test_flashlight")
.setCardType(ContextualCard.CardType.SLICE) .setCardType(ContextualCard.CardType.SLICE)
.setSliceUri( .setSliceUri(
Uri.parse("content://com.android.settings.test.slices/action/flashlight")) Uri.parse("content://com.android.settings.test.slices/action/flashlight"))
.setViewType(VIEW_TYPE_FULL_WIDTH)
.build()); .build());
cards.add(new ContextualCard.Builder() cards.add(new ContextualCard.Builder()
.setName("test_connected") .setName("test_connected")
.setCardType(ContextualCard.CardType.SLICE) .setCardType(ContextualCard.CardType.SLICE)
.setSliceUri(CustomSliceRegistry.BLUETOOTH_DEVICES_SLICE_URI) .setSliceUri(CustomSliceRegistry.BLUETOOTH_DEVICES_SLICE_URI)
.setViewType(VIEW_TYPE_FULL_WIDTH)
.build()); .build());
cards.add(new ContextualCard.Builder() cards.add(new ContextualCard.Builder()
.setName("test_gesture") .setName("test_gesture")
.setCardType(ContextualCard.CardType.SLICE) .setCardType(ContextualCard.CardType.SLICE)
.setSliceUri(Uri.parse( .setSliceUri(Uri.parse(
"content://com.android.settings.test.slices/action/gesture_pick_up")) "content://com.android.settings.test.slices/action/gesture_pick_up"))
.setViewType(VIEW_TYPE_FULL_WIDTH)
.build()); .build());
cards.add(new ContextualCard.Builder() cards.add(new ContextualCard.Builder()
.setName("test_battery") .setName("test_battery")
.setCardType(ContextualCard.CardType.SLICE) .setCardType(ContextualCard.CardType.SLICE)
.setSliceUri(CustomSliceRegistry.BATTERY_INFO_SLICE_URI) .setSliceUri(CustomSliceRegistry.BATTERY_INFO_SLICE_URI)
.setViewType(VIEW_TYPE_FULL_WIDTH)
.build()); .build());
return cards; return cards;
} }

View File

@@ -105,33 +105,4 @@ public class ControllerRendererPoolTest {
assertThat(renderer).isNull(); assertThat(renderer).isNull();
assertThat(mPool.getRenderers()).isEmpty(); assertThat(mPool.getRenderers()).isEmpty();
} }
@Test
public void getRenderer_hasSupportedCardTypeAndWidth_shouldReturnCorrespondingRenderer() {
ContextualCardLookupTable.LOOKUP_TABLE.stream().forEach(mapping -> assertThat(
mPool.getRendererByCardType(mContext, mLifecycleOwner,
mapping.mCardType).getClass()).isEqualTo(mapping.mRendererClass));
}
@Test
public void getRenderer_hasSupportedCardTypeAndWidth_shouldHaveDistinctRenderersInPool() {
final long count = ContextualCardLookupTable.LOOKUP_TABLE.stream().map(
mapping -> mapping.mRendererClass).distinct().count();
ContextualCardLookupTable.LOOKUP_TABLE.stream().forEach(
mapping -> mPool.getRendererByCardType(mContext, mLifecycleOwner,
mapping.mCardType));
assertThat(mPool.getRenderers()).hasSize((int) count);
}
@Test
public void getRenderer_hasUnsupportedCardType_shouldReturnNullAndPoolIsEmpty() {
final ContextualCardRenderer renderer = mPool.getRendererByCardType(mContext,
mLifecycleOwner,
UNSUPPORTED_CARD_TYPE);
assertThat(renderer).isNull();
assertThat(mPool.getRenderers()).isEmpty();
}
} }

View File

@@ -119,7 +119,8 @@ public class ConditionContextualCardControllerTest {
assertThat(conditionalCards).hasSize(3); assertThat(conditionalCards).hasSize(3);
assertThat(conditionalCards.get(CardType.CONDITIONAL)).hasSize(1); assertThat(conditionalCards.get(CardType.CONDITIONAL)).hasSize(1);
assertThat(conditionalCards.get(CardType.CONDITIONAL).get(0).isHalfWidth()).isFalse(); assertThat(conditionalCards.get(CardType.CONDITIONAL).get(0).getViewType()).isEqualTo(
ConditionContextualCardRenderer.VIEW_TYPE_FULL_WIDTH);
assertThat(conditionalCards.get(CardType.CONDITIONAL_HEADER)).isEmpty(); assertThat(conditionalCards.get(CardType.CONDITIONAL_HEADER)).isEmpty();
assertThat(conditionalCards.get(CardType.CONDITIONAL_FOOTER)).isNotEmpty(); assertThat(conditionalCards.get(CardType.CONDITIONAL_FOOTER)).isNotEmpty();
} }
@@ -145,7 +146,8 @@ public class ConditionContextualCardControllerTest {
assertThat(conditionalCards).hasSize(3); assertThat(conditionalCards).hasSize(3);
assertThat(conditionalCards.get(CardType.CONDITIONAL)).hasSize(2); assertThat(conditionalCards.get(CardType.CONDITIONAL)).hasSize(2);
for (ContextualCard card : conditionalCards.get(CardType.CONDITIONAL)) { for (ContextualCard card : conditionalCards.get(CardType.CONDITIONAL)) {
assertThat(card.isHalfWidth()).isTrue(); assertThat(card.getViewType()).isEqualTo(
ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH);
} }
assertThat(conditionalCards.get(CardType.CONDITIONAL_HEADER)).isEmpty(); assertThat(conditionalCards.get(CardType.CONDITIONAL_HEADER)).isEmpty();
assertThat(conditionalCards.get(CardType.CONDITIONAL_FOOTER)).isNotEmpty(); assertThat(conditionalCards.get(CardType.CONDITIONAL_FOOTER)).isNotEmpty();
@@ -197,7 +199,7 @@ public class ConditionContextualCardControllerTest {
.setName("test_name" + i) .setName("test_name" + i)
.setTitleText("test_title" + i) .setTitleText("test_title" + i)
.setSummaryText("test_summary" + i) .setSummaryText("test_summary" + i)
.setIsHalfWidth(true) .setViewType(ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH)
.build()); .build());
} }
return conditionCards; return conditionCards;

View File

@@ -65,36 +65,40 @@ public class ConditionContextualCardRendererTest {
@Test @Test
public void bindView_shouldSetListener() { public void bindView_shouldSetListener() {
final int viewType = mRenderer.getViewType(false /* isHalfWidth */);
final RecyclerView recyclerView = new RecyclerView(mActivity); final RecyclerView recyclerView = new RecyclerView(mActivity);
recyclerView.setLayoutManager(new LinearLayoutManager(mActivity)); recyclerView.setLayoutManager(new LinearLayoutManager(mActivity));
final View view = LayoutInflater.from(mActivity).inflate(viewType, recyclerView, false); final ContextualCard card = buildConditionContextualCard();
final RecyclerView.ViewHolder viewHolder = mRenderer.createViewHolder(view); final View view = LayoutInflater.from(mActivity).inflate(card.getViewType(), recyclerView,
final View card = view.findViewById(R.id.content); false);
final RecyclerView.ViewHolder viewHolder = mRenderer.createViewHolder(view,
card.getViewType());
final View cardView = view.findViewById(R.id.content);
when(mControllerRendererPool.getController(mActivity, when(mControllerRendererPool.getController(mActivity,
ContextualCard.CardType.CONDITIONAL)).thenReturn(mController); ContextualCard.CardType.CONDITIONAL)).thenReturn(mController);
mRenderer.bindView(viewHolder, buildConditionContextualCard()); mRenderer.bindView(viewHolder, card);
assertThat(card).isNotNull(); assertThat(cardView).isNotNull();
assertThat(card.hasOnClickListeners()).isTrue(); assertThat(cardView.hasOnClickListeners()).isTrue();
} }
@Test @Test
public void viewClick_shouldInvokeControllerPrimaryClick() { public void viewClick_shouldInvokeControllerPrimaryClick() {
final int viewType = mRenderer.getViewType(false /* isHalfWidth */);
final RecyclerView recyclerView = new RecyclerView(mActivity); final RecyclerView recyclerView = new RecyclerView(mActivity);
recyclerView.setLayoutManager(new LinearLayoutManager(mActivity)); recyclerView.setLayoutManager(new LinearLayoutManager(mActivity));
final View view = LayoutInflater.from(mActivity).inflate(viewType, recyclerView, false); final ContextualCard card = buildConditionContextualCard();
final RecyclerView.ViewHolder viewHolder = mRenderer.createViewHolder(view); final View view = LayoutInflater.from(mActivity).inflate(card.getViewType(), recyclerView,
final View card = view.findViewById(R.id.content); false);
final RecyclerView.ViewHolder viewHolder = mRenderer.createViewHolder(view,
card.getViewType());
final View cardView = view.findViewById(R.id.content);
when(mControllerRendererPool.getController(mActivity, when(mControllerRendererPool.getController(mActivity,
ContextualCard.CardType.CONDITIONAL)).thenReturn(mController); ContextualCard.CardType.CONDITIONAL)).thenReturn(mController);
mRenderer.bindView(viewHolder, buildConditionContextualCard()); mRenderer.bindView(viewHolder, card);
assertThat(card).isNotNull(); assertThat(cardView).isNotNull();
card.performClick(); cardView.performClick();
verify(mController).onPrimaryClick(any(ContextualCard.class)); verify(mController).onPrimaryClick(any(ContextualCard.class));
} }
@@ -108,7 +112,7 @@ public class ConditionContextualCardRendererTest {
.setTitleText("test_title") .setTitleText("test_title")
.setSummaryText("test_summary") .setSummaryText("test_summary")
.setIconDrawable(mActivity.getDrawable(R.drawable.ic_do_not_disturb_on_24dp)) .setIconDrawable(mActivity.getDrawable(R.drawable.ic_do_not_disturb_on_24dp))
.setIsHalfWidth(true) .setViewType(ConditionContextualCardRenderer.VIEW_TYPE_FULL_WIDTH)
.build(); .build();
} }
} }

View File

@@ -59,15 +59,17 @@ public class ConditionFooterContextualCardRendererTest {
@Test @Test
public void bindView_shouldSetClickListener() { public void bindView_shouldSetClickListener() {
final int viewType = mRenderer.getViewType(false /* isHalfWidth */);
final RecyclerView recyclerView = new RecyclerView(mContext); final RecyclerView recyclerView = new RecyclerView(mContext);
recyclerView.setLayoutManager(new LinearLayoutManager(mContext)); recyclerView.setLayoutManager(new LinearLayoutManager(mContext));
final View view = LayoutInflater.from(mContext).inflate(viewType, recyclerView, false); final ContextualCard card = generateConditionFooterContextualCard();
final RecyclerView.ViewHolder viewHolder = mRenderer.createViewHolder(view); final View view = LayoutInflater.from(mContext).inflate(card.getViewType(), recyclerView,
false);
final RecyclerView.ViewHolder viewHolder = mRenderer.createViewHolder(view,
card.getViewType());
when(mControllerRendererPool.getController(mContext, when(mControllerRendererPool.getController(mContext,
ContextualCard.CardType.CONDITIONAL_FOOTER)).thenReturn(mController); ContextualCard.CardType.CONDITIONAL_FOOTER)).thenReturn(mController);
mRenderer.bindView(viewHolder, generateConditionFooterContextualCard()); mRenderer.bindView(viewHolder, card);
assertThat(viewHolder.itemView).isNotNull(); assertThat(viewHolder.itemView).isNotNull();
assertThat(viewHolder.itemView.hasOnClickListeners()).isTrue(); assertThat(viewHolder.itemView.hasOnClickListeners()).isTrue();
@@ -75,15 +77,17 @@ public class ConditionFooterContextualCardRendererTest {
@Test @Test
public void bindView_clickView_shouldSetTrueToIsConditionExpanded() { public void bindView_clickView_shouldSetTrueToIsConditionExpanded() {
final int viewType = mRenderer.getViewType(false /* isHalfWidth */);
final RecyclerView recyclerView = new RecyclerView(mContext); final RecyclerView recyclerView = new RecyclerView(mContext);
recyclerView.setLayoutManager(new LinearLayoutManager(mContext)); recyclerView.setLayoutManager(new LinearLayoutManager(mContext));
final View view = LayoutInflater.from(mContext).inflate(viewType, recyclerView, false); final ContextualCard card = generateConditionFooterContextualCard();
final RecyclerView.ViewHolder viewHolder = mRenderer.createViewHolder(view); final View view = LayoutInflater.from(mContext).inflate(card.getViewType(), recyclerView,
false);
final RecyclerView.ViewHolder viewHolder = mRenderer.createViewHolder(view,
card.getViewType());
when(mControllerRendererPool.getController(mContext, when(mControllerRendererPool.getController(mContext,
ContextualCard.CardType.CONDITIONAL_FOOTER)).thenReturn(mController); ContextualCard.CardType.CONDITIONAL_FOOTER)).thenReturn(mController);
mRenderer.bindView(viewHolder, generateConditionFooterContextualCard()); mRenderer.bindView(viewHolder, card);
assertThat(viewHolder.itemView).isNotNull(); assertThat(viewHolder.itemView).isNotNull();
viewHolder.itemView.performClick(); viewHolder.itemView.performClick();
@@ -96,6 +100,7 @@ public class ConditionFooterContextualCardRendererTest {
return new ConditionFooterContextualCard.Builder() return new ConditionFooterContextualCard.Builder()
.setName("test_condition_footer") .setName("test_condition_footer")
.setRankingScore(-9999.0) .setRankingScore(-9999.0)
.setViewType(ConditionFooterContextualCardRenderer.VIEW_TYPE)
.build(); .build();
} }
} }

View File

@@ -67,11 +67,13 @@ public class ConditionHeaderContextualCardRendererTest {
@Test @Test
public void bindView_shouldSetClickListener() { public void bindView_shouldSetClickListener() {
final int viewType = mRenderer.getViewType(false /* isHalfWidth */);
final RecyclerView recyclerView = new RecyclerView(mActivity); final RecyclerView recyclerView = new RecyclerView(mActivity);
recyclerView.setLayoutManager(new LinearLayoutManager(mActivity)); recyclerView.setLayoutManager(new LinearLayoutManager(mActivity));
final View view = LayoutInflater.from(mActivity).inflate(viewType, recyclerView, false); final ContextualCard card = generateConditionHeaderContextualCard();
final RecyclerView.ViewHolder viewHolder = mRenderer.createViewHolder(view); final View view = LayoutInflater.from(mActivity).inflate(card.getViewType(), recyclerView,
false);
final RecyclerView.ViewHolder viewHolder = mRenderer.createViewHolder(view,
card.getViewType());
when(mControllerRendererPool.getController(mActivity, when(mControllerRendererPool.getController(mActivity,
ContextualCard.CardType.CONDITIONAL_HEADER)).thenReturn(mController); ContextualCard.CardType.CONDITIONAL_HEADER)).thenReturn(mController);
@@ -83,11 +85,13 @@ public class ConditionHeaderContextualCardRendererTest {
@Test @Test
public void bindView_clickView_shouldSetTrueToIsConditionExpanded() { public void bindView_clickView_shouldSetTrueToIsConditionExpanded() {
final int viewType = mRenderer.getViewType(false /* isHalfWidth */);
final RecyclerView recyclerView = new RecyclerView(mActivity); final RecyclerView recyclerView = new RecyclerView(mActivity);
recyclerView.setLayoutManager(new LinearLayoutManager(mActivity)); recyclerView.setLayoutManager(new LinearLayoutManager(mActivity));
final View view = LayoutInflater.from(mActivity).inflate(viewType, recyclerView, false); final ContextualCard card = generateConditionHeaderContextualCard();
final RecyclerView.ViewHolder viewHolder = mRenderer.createViewHolder(view); final View view = LayoutInflater.from(mActivity).inflate(card.getViewType(), recyclerView,
false);
final RecyclerView.ViewHolder viewHolder = mRenderer.createViewHolder(view,
card.getViewType());
when(mControllerRendererPool.getController(mActivity, when(mControllerRendererPool.getController(mActivity,
ContextualCard.CardType.CONDITIONAL_HEADER)).thenReturn(mController); ContextualCard.CardType.CONDITIONAL_HEADER)).thenReturn(mController);
@@ -105,6 +109,7 @@ public class ConditionHeaderContextualCardRendererTest {
.setConditionalCards(generateConditionCards(3)) .setConditionalCards(generateConditionCards(3))
.setName("test_condition_header") .setName("test_condition_header")
.setRankingScore(-9999.0) .setRankingScore(-9999.0)
.setViewType(ConditionHeaderContextualCardRenderer.VIEW_TYPE)
.build(); .build();
} }
@@ -118,7 +123,7 @@ public class ConditionHeaderContextualCardRendererTest {
.setName("test_name" + i) .setName("test_name" + i)
.setTitleText("test_title" + i) .setTitleText("test_title" + i)
.setSummaryText("test_summary" + i) .setSummaryText("test_summary" + i)
.setIsHalfWidth(true) .setViewType(ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH)
.build()); .build());
} }
return conditionCards; return conditionCards;

View File

@@ -66,35 +66,38 @@ public class LegacySuggestionContextualCardRendererTest {
@Test @Test
public void bindView_shouldSetListener() { public void bindView_shouldSetListener() {
final int viewType = mRenderer.getViewType(true /* isHalfWidth */);
final RecyclerView recyclerView = new RecyclerView(mActivity); final RecyclerView recyclerView = new RecyclerView(mActivity);
recyclerView.setLayoutManager(new LinearLayoutManager(mActivity)); recyclerView.setLayoutManager(new LinearLayoutManager(mActivity));
final View card = LayoutInflater.from(mActivity).inflate(viewType, recyclerView, false); final ContextualCard card = buildContextualCard();
final RecyclerView.ViewHolder viewHolder = mRenderer.createViewHolder(card); final View cardView = LayoutInflater.from(mActivity).inflate(card.getViewType(),
recyclerView, false);
final RecyclerView.ViewHolder viewHolder = mRenderer.createViewHolder(cardView,
card.getViewType());
when(mControllerRendererPool.getController(mActivity, when(mControllerRendererPool.getController(mActivity,
ContextualCard.CardType.LEGACY_SUGGESTION)).thenReturn(mController); ContextualCard.CardType.LEGACY_SUGGESTION)).thenReturn(mController);
mRenderer.bindView(viewHolder, buildContextualCard()); mRenderer.bindView(viewHolder, buildContextualCard());
assertThat(card).isNotNull(); assertThat(cardView).isNotNull();
assertThat(card.hasOnClickListeners()).isTrue(); assertThat(cardView.hasOnClickListeners()).isTrue();
} }
@Test @Test
public void viewClick_shouldInvokeControllerPrimaryClick() { public void viewClick_shouldInvokeControllerPrimaryClick() {
final int viewType = mRenderer.getViewType(true /* isHalfWidth */);
final RecyclerView recyclerView = new RecyclerView(mActivity); final RecyclerView recyclerView = new RecyclerView(mActivity);
recyclerView.setLayoutManager(new LinearLayoutManager(mActivity)); recyclerView.setLayoutManager(new LinearLayoutManager(mActivity));
final View card = LayoutInflater.from(mActivity).inflate(viewType, recyclerView, false); final ContextualCard card = buildContextualCard();
final RecyclerView.ViewHolder viewHolder = mRenderer.createViewHolder(card); final View cardView = LayoutInflater.from(mActivity).inflate(card.getViewType(),
recyclerView, false);
final RecyclerView.ViewHolder viewHolder = mRenderer.createViewHolder(cardView,
card.getViewType());
when(mControllerRendererPool.getController(mActivity, when(mControllerRendererPool.getController(mActivity,
ContextualCard.CardType.LEGACY_SUGGESTION)).thenReturn(mController); ContextualCard.CardType.LEGACY_SUGGESTION)).thenReturn(mController);
mRenderer.bindView(viewHolder, buildContextualCard()); mRenderer.bindView(viewHolder, buildContextualCard());
assertThat(card).isNotNull(); assertThat(cardView).isNotNull();
card.performClick(); cardView.performClick();
verify(mController).onPrimaryClick(any(ContextualCard.class)); verify(mController).onPrimaryClick(any(ContextualCard.class));
} }
@@ -105,6 +108,7 @@ public class LegacySuggestionContextualCardRendererTest {
.setTitleText("test_title") .setTitleText("test_title")
.setSummaryText("test_summary") .setSummaryText("test_summary")
.setIconDrawable(mActivity.getDrawable(R.drawable.ic_do_not_disturb_on_24dp)) .setIconDrawable(mActivity.getDrawable(R.drawable.ic_do_not_disturb_on_24dp))
.setViewType(LegacySuggestionContextualCardRenderer.VIEW_TYPE)
.build(); .build();
} }
} }

View File

@@ -16,6 +16,8 @@
package com.android.settings.homepage.contextualcards.slices; package com.android.settings.homepage.contextualcards.slices;
import static com.android.settings.homepage.contextualcards.slices.SliceContextualCardRenderer.VIEW_TYPE_FULL_WIDTH;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
@@ -211,12 +213,12 @@ public class SliceContextualCardRendererTest {
} }
private RecyclerView.ViewHolder getSliceViewHolder() { private RecyclerView.ViewHolder getSliceViewHolder() {
final int viewType = mRenderer.getViewType(false /* isHalfWidth */);
final RecyclerView recyclerView = new RecyclerView(mActivity); final RecyclerView recyclerView = new RecyclerView(mActivity);
recyclerView.setLayoutManager(new LinearLayoutManager(mActivity)); recyclerView.setLayoutManager(new LinearLayoutManager(mActivity));
final View view = LayoutInflater.from(mActivity).inflate(viewType, recyclerView, false); final View view = LayoutInflater.from(mActivity).inflate(VIEW_TYPE_FULL_WIDTH, recyclerView,
false);
return mRenderer.createViewHolder(view); return mRenderer.createViewHolder(view, VIEW_TYPE_FULL_WIDTH);
} }
private ContextualCard buildContextualCard(Uri sliceUri) { private ContextualCard buildContextualCard(Uri sliceUri) {
@@ -224,6 +226,7 @@ public class SliceContextualCardRendererTest {
.setName("test_name") .setName("test_name")
.setCardType(ContextualCard.CardType.SLICE) .setCardType(ContextualCard.CardType.SLICE)
.setSliceUri(sliceUri) .setSliceUri(sliceUri)
.setViewType(VIEW_TYPE_FULL_WIDTH)
.build(); .build();
} }
} }

View File

@@ -127,7 +127,7 @@ public class SliceFullCardRendererHelperTest {
.setCategory(ContextualCardProto.ContextualCard.Category.SUGGESTION_VALUE) .setCategory(ContextualCardProto.ContextualCard.Category.SUGGESTION_VALUE)
.setCardType(ContextualCard.CardType.SLICE) .setCardType(ContextualCard.CardType.SLICE)
.setSliceUri(TEST_SLICE_URI) .setSliceUri(TEST_SLICE_URI)
.setIsHalfWidth(false /* isHalfWidth */) .setViewType(VIEW_TYPE_FULL_WIDTH)
.build(); .build();
} }

View File

@@ -95,7 +95,7 @@ public class SliceHalfCardRendererHelperTest {
.setCategory(ContextualCardProto.ContextualCard.Category.SUGGESTION_VALUE) .setCategory(ContextualCardProto.ContextualCard.Category.SUGGESTION_VALUE)
.setCardType(ContextualCard.CardType.SLICE) .setCardType(ContextualCard.CardType.SLICE)
.setSliceUri(TEST_SLICE_URI) .setSliceUri(TEST_SLICE_URI)
.setIsHalfWidth(false /* isHalfWidth */) .setViewType(VIEW_TYPE_HALF_WIDTH)
.build(); .build();
} }