1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5  * in compliance with the License. You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software distributed under the License
10  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11  * or implied. See the License for the specific language governing permissions and limitations under
12  * the License.
13  */
14 package android.support.v17.leanback.widget;
15 
16 import static android.support.v17.leanback.widget.ObjectAdapter.NO_ID;
17 
18 /**
19  * The base class for all rows.  A commonly used subclass is the {@link ListRow}.  Custom
20  * subclasses may define other types of rows.
21  */
22 public class Row {
23 
24     private static final int FLAG_ID_USE_MASK = 1;
25     private static final int FLAG_ID_USE_HEADER = 1;
26     private static final int FLAG_ID_USE_ID = 0;
27 
28     private int mFlags = FLAG_ID_USE_HEADER;
29     private HeaderItem mHeaderItem;
30     private long mId = NO_ID;
31 
32     /**
33      * Constructor for a Row.
34      *
35      * @param id The id of the row.
36      * @param headerItem The {@link HeaderItem} for this Row, or null if there
37      *        is no header.
38      */
Row(long id, HeaderItem headerItem)39     public Row(long id, HeaderItem headerItem) {
40         setId(id);
41         setHeaderItem(headerItem);
42     }
43 
44     /**
45      * Constructor for a Row.
46      *
47      * @param headerItem The {@link HeaderItem} for this Row, or null if there
48      *        is no header.
49      */
Row(HeaderItem headerItem)50     public Row(HeaderItem headerItem) {
51         setHeaderItem(headerItem);
52     }
53 
54     /**
55      * Constructor for a Row.
56      */
Row()57     public Row() {
58     }
59 
60     /**
61      * Returns the {@link HeaderItem} that represents metadata for the row.
62      *
63      * @return The HeaderItem for this row, or null if unset.
64      */
getHeaderItem()65     public final HeaderItem getHeaderItem() {
66         return mHeaderItem;
67     }
68 
69     /**
70      * Sets the {@link HeaderItem} that represents metadata for the row.
71      *
72      * @param headerItem The HeaderItem for this Row, or null if there is no
73      *        header.
74      */
setHeaderItem(HeaderItem headerItem)75     public final void setHeaderItem(HeaderItem headerItem) {
76         mHeaderItem = headerItem;
77     }
78 
79     /**
80      * Sets the id for this row.
81      *
82      * @param id The id of the row.
83      */
setId(long id)84     public final void setId(long id) {
85         mId = id;
86         setFlags(FLAG_ID_USE_ID, FLAG_ID_USE_MASK);
87     }
88 
89     /**
90      * Returns a unique identifier for this row. This id can come from one of
91      * three places:
92      * <ul>
93      *   <li>If {@link #setId(long)} is ever called on this row, it will return
94      *   this id.
95      *   <li>If {@link #setId(long)} has not been called but the header item is
96      *   not null, the result of {@link HeaderItem#getId()} is returned.
97      *   <li>Otherwise {@link ObjectAdapter#NO_ID NO_ID} is returned.
98      * </ul>
99      */
getId()100     public final long getId() {
101         if ( (mFlags & FLAG_ID_USE_MASK) == FLAG_ID_USE_HEADER) {
102             HeaderItem header = getHeaderItem();
103             if (header != null) {
104                 return header.getId();
105             }
106             return NO_ID;
107         } else {
108             return mId;
109         }
110     }
111 
setFlags(int flags, int mask)112     final void setFlags(int flags, int mask) {
113         mFlags = (mFlags & ~mask) | (flags & mask);
114     }
115 
getFlags()116     final int getFlags() {
117         return mFlags;
118     }
119 }
120