Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1c3ed19a authored by Mill Chen's avatar Mill Chen
Browse files

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
parent 46285fe0
Loading
Loading
Loading
Loading
+26 −14
Original line number Diff line number Diff line
@@ -22,6 +22,10 @@ import android.graphics.drawable.Drawable;
import android.net.Uri;
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.RetentionPolicy;

@@ -63,9 +67,10 @@ public class ContextualCard {
    private final int mIconResId;
    private final int mCardAction;
    private final long mExpireTimeMS;
    private final boolean mIsHalfWidth;
    private final boolean mIsLargeCard;
    private final Drawable mIconDrawable;
    @LayoutRes
    private final int mViewType;

    public String getName() {
        return mName;
@@ -139,10 +144,6 @@ public class ContextualCard {
        return mIconDrawable;
    }

    public boolean isHalfWidth() {
        return mIsHalfWidth;
    }

    public boolean isLargeCard() {
        return mIsLargeCard;
    }
@@ -151,6 +152,10 @@ public class ContextualCard {
        return TextUtils.isEmpty(mSliceUri);
    }

    public int getViewType() {
        return mViewType;
    }

    public Builder mutate() {
        return mBuilder;
    }
@@ -174,8 +179,8 @@ public class ContextualCard {
        mCardAction = builder.mCardAction;
        mExpireTimeMS = builder.mExpireTimeMS;
        mIconDrawable = builder.mIconDrawable;
        mIsHalfWidth = builder.mIsHalfWidth;
        mIsLargeCard = builder.mIsLargeCard;
        mViewType = builder.mViewType;
    }

    ContextualCard(Cursor c) {
@@ -215,13 +220,12 @@ public class ContextualCard {
        mBuilder.setCardAction(mCardAction);
        mExpireTimeMS = c.getLong(c.getColumnIndex(CardDatabaseHelper.CardColumns.EXPIRE_TIME_MS));
        mBuilder.setExpireTimeMS(mExpireTimeMS);
        mIsHalfWidth = (c.getInt(
                c.getColumnIndex(CardDatabaseHelper.CardColumns.SUPPORT_HALF_WIDTH)) == 1);
        mBuilder.setIsHalfWidth(mIsHalfWidth);
        mIsLargeCard = false;
        mBuilder.setIsLargeCard(mIsLargeCard);
        mIconDrawable = null;
        mBuilder.setIconDrawable(mIconDrawable);
        mViewType = getViewTypeByCardType(mCardType);
        mBuilder.setViewType(mViewType);
    }

    @Override
@@ -245,6 +249,13 @@ public class ContextualCard {
        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 {
        private String mName;
        private int mCardType;
@@ -263,8 +274,9 @@ public class ContextualCard {
        private int mCardAction;
        private long mExpireTimeMS;
        private Drawable mIconDrawable;
        private boolean mIsHalfWidth;
        private boolean mIsLargeCard;
        @LayoutRes
        private int mViewType;

        public Builder setName(String name) {
            mName = name;
@@ -351,13 +363,13 @@ public class ContextualCard {
            return this;
        }

        public Builder setIsHalfWidth(boolean isHalfWidth) {
            mIsHalfWidth = isHalfWidth;
        public Builder setIsLargeCard(boolean isLargeCard) {
            mIsLargeCard = isLargeCard;
            return this;
        }

        public Builder setIsLargeCard(boolean isLargeCard) {
            mIsLargeCard = isLargeCard;
        public Builder setViewType(@LayoutRes int viewType) {
            mViewType = viewType;
            return this;
        }

+6 −19
Original line number Diff line number Diff line
@@ -24,14 +24,10 @@ 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.conditional
        .ConditionHeaderContextualCardRenderer;
import com.android.settings.homepage.contextualcards.legacysuggestion
        .LegacySuggestionContextualCardController;
import com.android.settings.homepage.contextualcards.legacysuggestion
        .LegacySuggestionContextualCardRenderer;
import com.android.settings.homepage.contextualcards.conditional
        .ConditionFooterContextualCardRenderer;
import com.android.settings.homepage.contextualcards.conditional.ConditionFooterContextualCardRenderer;
import com.android.settings.homepage.contextualcards.conditional.ConditionHeaderContextualCardRenderer;
import com.android.settings.homepage.contextualcards.legacysuggestion.LegacySuggestionContextualCardController;
import com.android.settings.homepage.contextualcards.legacysuggestion.LegacySuggestionContextualCardRenderer;
import com.android.settings.homepage.contextualcards.slices.SliceContextualCardController;
import com.android.settings.homepage.contextualcards.slices.SliceContextualCardRenderer;

@@ -72,11 +68,11 @@ public class ContextualCardLookupTable {
    static final Set<ControllerRendererMapping> LOOKUP_TABLE =
            new TreeSet<ControllerRendererMapping>() {{
                add(new ControllerRendererMapping(CardType.CONDITIONAL,
                        ConditionContextualCardRenderer.HALF_WIDTH_VIEW_TYPE,
                        ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH,
                        ConditionContextualCardController.class,
                        ConditionContextualCardRenderer.class));
                add(new ControllerRendererMapping(CardType.CONDITIONAL,
                        ConditionContextualCardRenderer.FULL_WIDTH_VIEW_TYPE,
                        ConditionContextualCardRenderer.VIEW_TYPE_FULL_WIDTH,
                        ConditionContextualCardController.class,
                        ConditionContextualCardRenderer.class));
                add(new ControllerRendererMapping(CardType.LEGACY_SUGGESTION,
@@ -111,15 +107,6 @@ public class ContextualCardLookupTable {
        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(
            int viewType) throws IllegalStateException {
        List<ControllerRendererMapping> validMappings = LOOKUP_TABLE.stream()
+5 −2
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import androidx.annotation.VisibleForTesting;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.Loader;

import com.android.settings.homepage.contextualcards.slices.SliceContextualCardRenderer;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
@@ -236,8 +237,10 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
            final ContextualCard current = result.get(index);
            if (current.getCategory() == SUGGESTION_VALUE
                    && previous.getCategory() == SUGGESTION_VALUE) {
                result.set(index - 1, previous.mutate().setIsHalfWidth(true).build());
                result.set(index, current.mutate().setIsHalfWidth(true).build());
                result.set(index - 1, previous.mutate().setViewType(
                        SliceContextualCardRenderer.VIEW_TYPE_HALF_WIDTH).build());
                result.set(index, current.mutate().setViewType(
                        SliceContextualCardRenderer.VIEW_TYPE_HALF_WIDTH).build());
                index++;
            }
        }
+1 −7
Original line number Diff line number Diff line
@@ -26,18 +26,12 @@ import androidx.recyclerview.widget.RecyclerView;
 */
public interface ContextualCardRenderer {

    /**
     * The layout type of the renderer.
     */
    @LayoutRes
    int getViewType(boolean isHalfWidth);

    /**
     * When {@link ContextualCardsAdapter} calls {@link ContextualCardsAdapter#onCreateViewHolder},
     * this method will be called to retrieve the corresponding
     * {@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},
+16 −11
Original line number Diff line number Diff line
@@ -21,11 +21,15 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.LayoutRes;
import androidx.lifecycle.LifecycleOwner;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.GridLayoutManager;
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.List;
import java.util.Map;
@@ -62,24 +66,22 @@ public class ContextualCardsAdapter extends RecyclerView.Adapter<RecyclerView.Vi
    @Override
    public int getItemViewType(int position) {
        final ContextualCard card = mContextualCards.get(position);
        final ContextualCardRenderer renderer = mControllerRendererPool.getRendererByCardType(
                mContext, mLifecycleOwner, card.getCardType());
        return renderer.getViewType(card.isHalfWidth());
        return card.getViewType();
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, @LayoutRes int viewType) {
        final ContextualCardRenderer renderer = mControllerRendererPool.getRendererByViewType(
                mContext, mLifecycleOwner, viewType);
        final View view = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false);
        return renderer.createViewHolder(view);
        return renderer.createViewHolder(view, viewType);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        final ContextualCard card = mContextualCards.get(position);
        final ContextualCardRenderer renderer = mControllerRendererPool.getRendererByCardType(
                mContext, mLifecycleOwner, card.getCardType());
        final ContextualCardRenderer renderer = mControllerRendererPool.getRendererByViewType(
                mContext, mLifecycleOwner, card.getViewType());
        renderer.bindView(holder, card);
    }

@@ -98,12 +100,15 @@ public class ContextualCardsAdapter extends RecyclerView.Adapter<RecyclerView.Vi
            gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                @Override
                public int getSpanSize(int position) {
                    final ContextualCard card = mContextualCards.get(position);
                    if (card.isHalfWidth()) {
                    final int viewType = mContextualCards.get(position).getViewType();
                    switch (viewType) {
                        case ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH:
                        case SliceContextualCardRenderer.VIEW_TYPE_HALF_WIDTH:
                            return HALF_WIDTH;
                    }
                        default:
                            return FULL_WIDTH;
                    }
                }
            });
        }
    }
Loading