blob: 71f5d1afa870ac39f2b75d81ce82d82bb3ec0938 [file] [log] [blame]
/*
* Copyright 2019 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.ui.recyclerview;
import android.graphics.drawable.Drawable;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
/**
* Definition of list items that can be inserted into {@link CarUiListItemAdapter}.
*/
public class CarUiContentListItem extends CarUiListItem {
/**
* Callback to be invoked when the checked state of a list item changed.
*/
public interface OnCheckedChangeListener {
/**
* Called when the checked state of a list item has changed.
*
* @param item whose checked state changed.
* @param isChecked new checked state of list item.
*/
void onCheckedChanged(@NonNull CarUiContentListItem item, boolean isChecked);
}
/**
* Callback to be invoked when an item is clicked.
*/
public interface OnClickListener {
/**
* Called when the item has been clicked.
*
* @param item whose checked state changed.
*/
void onClick(@NonNull CarUiContentListItem item);
}
public enum IconType {
/**
* For an icon type of CONTENT, the primary icon is a larger than {@code STANDARD}.
*/
CONTENT,
/**
* For an icon type of STANDARD, the primary icon is the standard size.
*/
STANDARD,
/**
* For an icon type of AVATAR, the primary icon is masked to provide an icon with a modified
* shape.
*/
AVATAR
}
/**
* Enum of secondary action types of a list item.
*/
public enum Action {
/**
* For an action value of NONE, no action element is shown for a list item.
*/
NONE,
/**
* For an action value of SWITCH, a switch is shown for the action element of the list item.
*/
SWITCH,
/**
* For an action value of CHECK_BOX, a checkbox is shown for the action element of the list
* item.
*/
CHECK_BOX,
/**
* For an action value of RADIO_BUTTON, a radio button is shown for the action element of
* the list item.
*/
RADIO_BUTTON,
/**
* For an action value of ICON, an icon is shown for the action element of the list item.
*/
ICON,
/**
* For an action value CHEVRON, a chevron is shown for the action element of the list
* item.
*/
CHEVRON
}
private Drawable mIcon;
@Nullable
private Drawable mSupplementalIcon;
private CharSequence mTitle;
private CharSequence mBody;
private final Action mAction;
private IconType mPrimaryIconType;
private boolean mIsActionDividerVisible;
private boolean mIsChecked;
private boolean mIsEnabled = true;
private boolean mIsActivated;
private OnClickListener mOnClickListener;
private OnCheckedChangeListener mOnCheckedChangeListener;
private View.OnClickListener mSupplementalIconOnClickListener;
public CarUiContentListItem(Action action) {
mAction = action;
mPrimaryIconType = IconType.STANDARD;
}
/**
* Returns the title of the item.
*/
@Nullable
public CharSequence getTitle() {
return mTitle;
}
/**
* Sets the title of the item.
*
* @param title text to display as title.
*/
public void setTitle(@NonNull CharSequence title) {
mTitle = title;
}
/**
* Returns the body text of the item.
*/
@Nullable
public CharSequence getBody() {
return mBody;
}
/**
* Sets the body of the item.
*
* @param body text to display as body text.
*/
public void setBody(@NonNull CharSequence body) {
mBody = body;
}
/**
* Returns the icon of the item.
*/
@Nullable
public Drawable getIcon() {
return mIcon;
}
/**
* Sets the icon of the item.
*
* @param icon the icon to display.
*/
public void setIcon(@Nullable Drawable icon) {
mIcon = icon;
}
/**
* Returns the primary icon type for the item.
*/
public IconType getPrimaryIconType() {
return mPrimaryIconType;
}
/**
* Sets the primary icon type for the item.
*
* @param icon the icon type for the item.
*/
public void setPrimaryIconType(IconType icon) {
mPrimaryIconType = icon;
}
/**
* Returns {@code true} if the item is activated.
*/
public boolean isActivated() {
return mIsActivated;
}
/**
* Sets the activated state of the item.
*
* @param activated the activated state for the item.
*/
public void setActivated(boolean activated) {
mIsActivated = activated;
}
/**
* Returns {@code true} if the item is enabled.
*/
public boolean isEnabled() {
return mIsEnabled;
}
/**
* Sets the enabled state of the item.
*
* @param enabled the enabled state for the item.
*/
public void setEnabled(boolean enabled) {
mIsEnabled = enabled;
}
/**
* Returns {@code true} if the item is checked. Will always return {@code false} when the action
* type for the item is {@code Action.NONE}.
*/
public boolean isChecked() {
return mIsChecked;
}
/**
* Sets the checked state of the item.
*
* @param checked the checked state for the item.
*/
public void setChecked(boolean checked) {
if (checked == mIsChecked) {
return;
}
// Checked state can only be set when action type is checkbox, radio button or switch.
if (mAction == Action.CHECK_BOX || mAction == Action.SWITCH
|| mAction == Action.RADIO_BUTTON) {
mIsChecked = checked;
if (mOnCheckedChangeListener != null) {
mOnCheckedChangeListener.onCheckedChanged(this, mIsChecked);
}
}
}
/**
* Sets the visibility of the action divider.
*
* @param visible visibility of the action divider.
*/
public void setActionDividerVisible(boolean visible) {
mIsActionDividerVisible = visible;
}
/**
* Returns {@code true} if the action divider is visible.
*/
public boolean isActionDividerVisible() {
return mIsActionDividerVisible;
}
/**
* Returns the action type for the item.
*/
public Action getAction() {
return mAction;
}
/**
* Returns the supplemental icon for the item.
*/
@Nullable
public Drawable getSupplementalIcon() {
if (mAction != Action.ICON) {
return null;
}
return mSupplementalIcon;
}
/**
* Sets supplemental icon to be displayed in a list item.
*
* @param icon the Drawable to set as the icon, or null to clear the content.
*/
public void setSupplementalIcon(@Nullable Drawable icon) {
setSupplementalIcon(icon, null);
}
/**
* Sets supplemental icon to be displayed in a list item.
*
* @param icon the Drawable to set as the icon, or null to clear the content.
* @param listener the callback that is invoked when the icon is clicked.
*/
public void setSupplementalIcon(@Nullable Drawable icon,
@Nullable View.OnClickListener listener) {
if (mAction != Action.ICON) {
throw new IllegalStateException(
"Cannot set supplemental icon on list item that does not have an action of "
+ "type ICON");
}
mSupplementalIcon = icon;
mSupplementalIconOnClickListener = listener;
}
@Nullable
public View.OnClickListener getSupplementalIconOnClickListener() {
return mSupplementalIconOnClickListener;
}
/**
* Registers a callback to be invoked when the item is clicked.
*
* @param listener callback to be invoked when item is clicked.
*/
public void setOnItemClickedListener(@Nullable OnClickListener listener) {
mOnClickListener = listener;
}
/**
* Returns the {@link OnClickListener} registered for this item.
*/
@Nullable
public OnClickListener getOnClickListener() {
return mOnClickListener;
}
/**
* Registers a callback to be invoked when the checked state of list item changes.
*
* <p>Checked state changes can take place when the action type is {@code Action.SWITCH} or
* {@code Action.CHECK_BOX}.
*
* @param listener callback to be invoked when the checked state shown in the UI changes.
*/
public void setOnCheckedChangeListener(
@Nullable OnCheckedChangeListener listener) {
mOnCheckedChangeListener = listener;
}
/**
* Returns the {@link OnCheckedChangeListener} registered for this item.
*/
@Nullable
public OnCheckedChangeListener getOnCheckedChangeListener() {
return mOnCheckedChangeListener;
}
}