blob: 510c36d13e9d20a43850c2fb0cb57e8400434ea5 [file] [log] [blame]
/*
* 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);
}
}
}