| /* |
| * Copyright (C) 2018 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.settings.homepage.contextualcards; |
| |
| import android.annotation.IntDef; |
| import android.database.Cursor; |
| import android.graphics.drawable.Drawable; |
| import android.net.Uri; |
| import android.text.TextUtils; |
| |
| import androidx.annotation.LayoutRes; |
| import androidx.slice.Slice; |
| |
| import com.android.settings.homepage.contextualcards.slices.SliceContextualCardRenderer; |
| |
| import java.lang.annotation.Retention; |
| import java.lang.annotation.RetentionPolicy; |
| |
| /** |
| * Data class representing a {@link ContextualCard}. |
| */ |
| public class ContextualCard { |
| |
| /** |
| * Flags indicating the type of the ContextualCard. |
| */ |
| @IntDef({CardType.DEFAULT, CardType.SLICE, CardType.LEGACY_SUGGESTION, CardType.CONDITIONAL, |
| CardType.CONDITIONAL_HEADER, CardType.CONDITIONAL_FOOTER}) |
| @Retention(RetentionPolicy.SOURCE) |
| public @interface CardType { |
| int DEFAULT = 0; |
| int SLICE = 1; |
| int LEGACY_SUGGESTION = 2; |
| int CONDITIONAL = 3; |
| int CONDITIONAL_HEADER = 4; |
| int CONDITIONAL_FOOTER = 5; |
| } |
| |
| private final Builder mBuilder; |
| private final String mName; |
| @CardType |
| private final int mCardType; |
| private final double mRankingScore; |
| private final String mSliceUri; |
| private final int mCategory; |
| private final String mPackageName; |
| private final long mAppVersion; |
| private final String mTitleText; |
| private final String mSummaryText; |
| private final boolean mIsLargeCard; |
| private final Drawable mIconDrawable; |
| @LayoutRes |
| private final int mViewType; |
| private final boolean mIsPendingDismiss; |
| private final boolean mHasInlineAction; |
| private final Slice mSlice; |
| |
| public String getName() { |
| return mName; |
| } |
| |
| public int getCardType() { |
| return mCardType; |
| } |
| |
| public double getRankingScore() { |
| return mRankingScore; |
| } |
| |
| public String getTextSliceUri() { |
| return mSliceUri; |
| } |
| |
| public Uri getSliceUri() { |
| return Uri.parse(mSliceUri); |
| } |
| |
| public int getCategory() { |
| return mCategory; |
| } |
| |
| public String getPackageName() { |
| return mPackageName; |
| } |
| |
| public long getAppVersion() { |
| return mAppVersion; |
| } |
| |
| public String getTitleText() { |
| return mTitleText; |
| } |
| |
| public String getSummaryText() { |
| return mSummaryText; |
| } |
| |
| public Drawable getIconDrawable() { |
| return mIconDrawable; |
| } |
| |
| public boolean isLargeCard() { |
| return mIsLargeCard; |
| } |
| |
| public int getViewType() { |
| return mViewType; |
| } |
| |
| public boolean isPendingDismiss() { |
| return mIsPendingDismiss; |
| } |
| |
| public boolean hasInlineAction() { |
| return mHasInlineAction; |
| } |
| |
| public Slice getSlice() { |
| return mSlice; |
| } |
| |
| public Builder mutate() { |
| return mBuilder; |
| } |
| |
| public ContextualCard(Builder builder) { |
| mBuilder = builder; |
| mName = builder.mName; |
| mCardType = builder.mCardType; |
| mRankingScore = builder.mRankingScore; |
| mSliceUri = builder.mSliceUri; |
| mCategory = builder.mCategory; |
| mPackageName = builder.mPackageName; |
| mAppVersion = builder.mAppVersion; |
| mTitleText = builder.mTitleText; |
| mSummaryText = builder.mSummaryText; |
| mIconDrawable = builder.mIconDrawable; |
| mIsLargeCard = builder.mIsLargeCard; |
| mViewType = builder.mViewType; |
| mIsPendingDismiss = builder.mIsPendingDismiss; |
| mHasInlineAction = builder.mHasInlineAction; |
| mSlice = builder.mSlice; |
| } |
| |
| ContextualCard(Cursor c) { |
| mBuilder = new Builder(); |
| mName = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.NAME)); |
| mBuilder.setName(mName); |
| mCardType = c.getInt(c.getColumnIndex(CardDatabaseHelper.CardColumns.TYPE)); |
| mBuilder.setCardType(mCardType); |
| mRankingScore = c.getDouble(c.getColumnIndex(CardDatabaseHelper.CardColumns.SCORE)); |
| mBuilder.setRankingScore(mRankingScore); |
| mSliceUri = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.SLICE_URI)); |
| mBuilder.setSliceUri(Uri.parse(mSliceUri)); |
| mCategory = c.getInt(c.getColumnIndex(CardDatabaseHelper.CardColumns.CATEGORY)); |
| mBuilder.setCategory(mCategory); |
| mPackageName = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.PACKAGE_NAME)); |
| mBuilder.setPackageName(mPackageName); |
| mAppVersion = c.getLong(c.getColumnIndex(CardDatabaseHelper.CardColumns.APP_VERSION)); |
| mBuilder.setAppVersion(mAppVersion); |
| mTitleText = ""; |
| mBuilder.setTitleText(mTitleText); |
| mSummaryText = ""; |
| mBuilder.setTitleText(mSummaryText); |
| mIsLargeCard = false; |
| mBuilder.setIsLargeCard(mIsLargeCard); |
| mIconDrawable = null; |
| mBuilder.setIconDrawable(mIconDrawable); |
| mViewType = getViewTypeByCardType(mCardType); |
| mBuilder.setViewType(mViewType); |
| mIsPendingDismiss = false; |
| mBuilder.setIsPendingDismiss(mIsPendingDismiss); |
| mHasInlineAction = false; |
| mBuilder.setHasInlineAction(mHasInlineAction); |
| mSlice = null; |
| mBuilder.setSlice(mSlice); |
| } |
| |
| @Override |
| public int hashCode() { |
| return mName.hashCode(); |
| } |
| |
| /** |
| * Note that {@link #mName} is treated as a primary key for this class and determines equality. |
| */ |
| @Override |
| public boolean equals(Object obj) { |
| if (this == obj) { |
| return true; |
| } |
| if (!(obj instanceof ContextualCard)) { |
| return false; |
| } |
| final ContextualCard that = (ContextualCard) obj; |
| |
| 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; |
| private double mRankingScore; |
| private String mSliceUri; |
| private int mCategory; |
| private String mPackageName; |
| private long mAppVersion; |
| private String mTitleText; |
| private String mSummaryText; |
| private Drawable mIconDrawable; |
| private boolean mIsLargeCard; |
| @LayoutRes |
| private int mViewType; |
| private boolean mIsPendingDismiss; |
| private boolean mHasInlineAction; |
| private Slice mSlice; |
| |
| public Builder setName(String name) { |
| mName = name; |
| return this; |
| } |
| |
| public Builder setCardType(int cardType) { |
| mCardType = cardType; |
| return this; |
| } |
| |
| public Builder setRankingScore(double rankingScore) { |
| mRankingScore = rankingScore; |
| return this; |
| } |
| |
| public Builder setSliceUri(Uri sliceUri) { |
| mSliceUri = sliceUri.toString(); |
| return this; |
| } |
| |
| public Builder setCategory(int category) { |
| mCategory = category; |
| return this; |
| } |
| |
| public Builder setPackageName(String packageName) { |
| mPackageName = packageName; |
| return this; |
| } |
| |
| public Builder setAppVersion(long appVersion) { |
| mAppVersion = appVersion; |
| return this; |
| } |
| |
| public Builder setTitleText(String titleText) { |
| mTitleText = titleText; |
| return this; |
| } |
| |
| public Builder setSummaryText(String summaryText) { |
| mSummaryText = summaryText; |
| return this; |
| } |
| |
| public Builder setIconDrawable(Drawable iconDrawable) { |
| mIconDrawable = iconDrawable; |
| return this; |
| } |
| |
| public Builder setIsLargeCard(boolean isLargeCard) { |
| mIsLargeCard = isLargeCard; |
| return this; |
| } |
| |
| public Builder setViewType(@LayoutRes int viewType) { |
| mViewType = viewType; |
| return this; |
| } |
| |
| public Builder setIsPendingDismiss(boolean isPendingDismiss) { |
| mIsPendingDismiss = isPendingDismiss; |
| return this; |
| } |
| |
| public Builder setHasInlineAction(boolean hasInlineAction) { |
| mHasInlineAction = hasInlineAction; |
| return this; |
| } |
| |
| /** |
| * Cache a slice created at pre-check time for later usage. |
| */ |
| public Builder setSlice(Slice slice) { |
| mSlice = slice; |
| return this; |
| } |
| |
| public ContextualCard build() { |
| return new ContextualCard(this); |
| } |
| } |
| } |