blob: 8d93295c00c587e50b5cf2e82a07784b9256e9f8 [file] [log] [blame]
/*
* Copyright (C) 2021 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.car.qc;
import android.app.PendingIntent;
import android.graphics.drawable.Icon;
import android.os.Parcel;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Quick Control Row Element
* ------------------------------------
* | | Title | |
* | StartItems | Subtitle | EndItems |
* | | Sliders | |
* ------------------------------------
*/
public class QCRow extends QCItem {
private final String mTitle;
private final String mSubtitle;
private final Icon mStartIcon;
private final boolean mIsStartIconTintable;
private final QCSlider mSlider;
private final List<QCActionItem> mStartItems;
private final List<QCActionItem> mEndItems;
private final PendingIntent mPrimaryAction;
private PendingIntent mDisabledClickAction;
public QCRow(@Nullable String title, @Nullable String subtitle, boolean isEnabled,
boolean isClickableWhileDisabled, @Nullable PendingIntent primaryAction,
@Nullable PendingIntent disabledClickAction, @Nullable Icon startIcon,
boolean isIconTintable, @Nullable QCSlider slider,
@NonNull List<QCActionItem> startItems, @NonNull List<QCActionItem> endItems) {
super(QC_TYPE_ROW, isEnabled, isClickableWhileDisabled);
mTitle = title;
mSubtitle = subtitle;
mPrimaryAction = primaryAction;
mDisabledClickAction = disabledClickAction;
mStartIcon = startIcon;
mIsStartIconTintable = isIconTintable;
mSlider = slider;
mStartItems = Collections.unmodifiableList(startItems);
mEndItems = Collections.unmodifiableList(endItems);
}
public QCRow(@NonNull Parcel in) {
super(in);
mTitle = in.readString();
mSubtitle = in.readString();
boolean hasIcon = in.readBoolean();
if (hasIcon) {
mStartIcon = Icon.CREATOR.createFromParcel(in);
} else {
mStartIcon = null;
}
mIsStartIconTintable = in.readBoolean();
boolean hasSlider = in.readBoolean();
if (hasSlider) {
mSlider = QCSlider.CREATOR.createFromParcel(in);
} else {
mSlider = null;
}
List<QCActionItem> startItems = new ArrayList<>();
int startItemCount = in.readInt();
for (int i = 0; i < startItemCount; i++) {
startItems.add(QCActionItem.CREATOR.createFromParcel(in));
}
mStartItems = Collections.unmodifiableList(startItems);
List<QCActionItem> endItems = new ArrayList<>();
int endItemCount = in.readInt();
for (int i = 0; i < endItemCount; i++) {
endItems.add(QCActionItem.CREATOR.createFromParcel(in));
}
mEndItems = Collections.unmodifiableList(endItems);
boolean hasPrimaryAction = in.readBoolean();
if (hasPrimaryAction) {
mPrimaryAction = PendingIntent.CREATOR.createFromParcel(in);
} else {
mPrimaryAction = null;
}
boolean hasDisabledClickAction = in.readBoolean();
if (hasDisabledClickAction) {
mDisabledClickAction = PendingIntent.CREATOR.createFromParcel(in);
} else {
mDisabledClickAction = null;
}
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeString(mTitle);
dest.writeString(mSubtitle);
boolean hasStartIcon = mStartIcon != null;
dest.writeBoolean(hasStartIcon);
if (hasStartIcon) {
mStartIcon.writeToParcel(dest, flags);
}
dest.writeBoolean(mIsStartIconTintable);
boolean hasSlider = mSlider != null;
dest.writeBoolean(hasSlider);
if (hasSlider) {
mSlider.writeToParcel(dest, flags);
}
dest.writeInt(mStartItems.size());
for (QCActionItem startItem : mStartItems) {
startItem.writeToParcel(dest, flags);
}
dest.writeInt(mEndItems.size());
for (QCActionItem endItem : mEndItems) {
endItem.writeToParcel(dest, flags);
}
boolean hasPrimaryAction = mPrimaryAction != null;
dest.writeBoolean(hasPrimaryAction);
if (hasPrimaryAction) {
mPrimaryAction.writeToParcel(dest, flags);
}
boolean hasDisabledClickAction = mDisabledClickAction != null;
dest.writeBoolean(hasDisabledClickAction);
if (hasDisabledClickAction) {
mDisabledClickAction.writeToParcel(dest, flags);
}
}
@Override
public PendingIntent getPrimaryAction() {
return mPrimaryAction;
}
@Override
public PendingIntent getDisabledClickAction() {
return mDisabledClickAction;
}
@Nullable
public String getTitle() {
return mTitle;
}
@Nullable
public String getSubtitle() {
return mSubtitle;
}
@Nullable
public Icon getStartIcon() {
return mStartIcon;
}
public boolean isStartIconTintable() {
return mIsStartIconTintable;
}
@Nullable
public QCSlider getSlider() {
return mSlider;
}
@NonNull
public List<QCActionItem> getStartItems() {
return mStartItems;
}
@NonNull
public List<QCActionItem> getEndItems() {
return mEndItems;
}
public static Creator<QCRow> CREATOR = new Creator<QCRow>() {
@Override
public QCRow createFromParcel(Parcel source) {
return new QCRow(source);
}
@Override
public QCRow[] newArray(int size) {
return new QCRow[size];
}
};
/**
* Builder for {@link QCRow}.
*/
public static class Builder {
private final List<QCActionItem> mStartItems = new ArrayList<>();
private final List<QCActionItem> mEndItems = new ArrayList<>();
private Icon mStartIcon;
private boolean mIsStartIconTintable = true;
private String mTitle;
private String mSubtitle;
private boolean mIsEnabled = true;
private boolean mIsClickableWhileDisabled = false;
private QCSlider mSlider;
private PendingIntent mPrimaryAction;
private PendingIntent mDisabledClickAction;
/**
* Sets the row title.
*/
public Builder setTitle(@Nullable String title) {
mTitle = title;
return this;
}
/**
* Sets the row subtitle.
*/
public Builder setSubtitle(@Nullable String subtitle) {
mSubtitle = subtitle;
return this;
}
/**
* Sets whether or not the row is enabled. Note that this only affects the main row area,
* not the action items contained within the row.
*/
public Builder setEnabled(boolean enabled) {
mIsEnabled = enabled;
return this;
}
/**
* Sets whether or not the row should be clickable while disabled.
*/
public Builder setClickableWhileDisabled(boolean clickable) {
mIsClickableWhileDisabled = clickable;
return this;
}
/**
* Sets the row icon.
*/
public Builder setIcon(@Nullable Icon icon) {
mStartIcon = icon;
return this;
}
/**
* Sets whether or not the row icon is tintable.
*/
public Builder setIconTintable(boolean tintable) {
mIsStartIconTintable = tintable;
return this;
}
/**
* Adds a {@link QCSlider} to the slider area.
*/
public Builder addSlider(@Nullable QCSlider slider) {
mSlider = slider;
return this;
}
/**
* Sets the PendingIntent to be sent when the row is clicked.
*/
public Builder setPrimaryAction(@Nullable PendingIntent action) {
mPrimaryAction = action;
return this;
}
/**
* Sets the PendingIntent to be sent when the action item is clicked while disabled.
*/
public Builder setDisabledClickAction(@Nullable PendingIntent action) {
mDisabledClickAction = action;
return this;
}
/**
* Adds a {@link QCActionItem} to the start items area.
*/
public Builder addStartItem(@NonNull QCActionItem item) {
mStartItems.add(item);
return this;
}
/**
* Adds a {@link QCActionItem} to the end items area.
*/
public Builder addEndItem(@NonNull QCActionItem item) {
mEndItems.add(item);
return this;
}
/**
* Builds the final {@link QCRow}.
*/
public QCRow build() {
return new QCRow(mTitle, mSubtitle, mIsEnabled, mIsClickableWhileDisabled,
mPrimaryAction, mDisabledClickAction, mStartIcon, mIsStartIconTintable,
mSlider, mStartItems, mEndItems);
}
}
}