/*
* Copyright (C) 2014 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 android.support.v17.leanback.widget;
import static android.support.v17.leanback.widget.ObjectAdapter.NO_ID;
/**
* The base class for all rows. A commonly used subclass is the {@link ListRow}. Custom
* subclasses may define other types of rows.
*/
public class Row {
private static final int FLAG_ID_USE_MASK = 1;
private static final int FLAG_ID_USE_HEADER = 1;
private static final int FLAG_ID_USE_ID = 0;
private int mFlags = FLAG_ID_USE_HEADER;
private HeaderItem mHeaderItem;
private long mId = NO_ID;
/**
* Constructor for a Row.
*
* @param id The id of the row.
* @param headerItem The {@link HeaderItem} for this Row, or null if there
* is no header.
*/
public Row(long id, HeaderItem headerItem) {
setId(id);
setHeaderItem(headerItem);
}
/**
* Constructor for a Row.
*
* @param headerItem The {@link HeaderItem} for this Row, or null if there
* is no header.
*/
public Row(HeaderItem headerItem) {
setHeaderItem(headerItem);
}
/**
* Constructor for a Row.
*/
public Row() {
}
/**
* Returns the {@link HeaderItem} that represents metadata for the row.
*
* @return The HeaderItem for this row, or null if unset.
*/
public final HeaderItem getHeaderItem() {
return mHeaderItem;
}
/**
* Sets the {@link HeaderItem} that represents metadata for the row.
*
* @param headerItem The HeaderItem for this Row, or null if there is no
* header.
*/
public final void setHeaderItem(HeaderItem headerItem) {
mHeaderItem = headerItem;
}
/**
* Sets the id for this row.
*
* @param id The id of the row.
*/
public final void setId(long id) {
mId = id;
setFlags(FLAG_ID_USE_ID, FLAG_ID_USE_MASK);
}
/**
* Returns a unique identifier for this row. This id can come from one of
* three places:
* <ul>
* <li>If {@link #setId(long)} is ever called on this row, it will return
* this id.
* <li>If {@link #setId(long)} has not been called but the header item is
* not null, the result of {@link HeaderItem#getId()} is returned.
* <li>Otherwise {@link ObjectAdapter#NO_ID NO_ID} is returned.
* </ul>
*/
public final long getId() {
if ( (mFlags & FLAG_ID_USE_MASK) == FLAG_ID_USE_HEADER) {
HeaderItem header = getHeaderItem();
if (header != null) {
return header.getId();
}
return NO_ID;
} else {
return mId;
}
}
final void setFlags(int flags, int mask) {
mFlags = (mFlags & ~mask) | (flags & mask);
}
final int getFlags() {
return mFlags;
}
}