1b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue/* 2b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * Copyright (C) 2017 The Android Open Source Project 3b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * 4b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * Licensed under the Apache License, Version 2.0 (the "License"); 5b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * you may not use this file except in compliance with the License. 6b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * You may obtain a copy of the License at 7b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * 8b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * http://www.apache.org/licenses/LICENSE-2.0 9b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * 10b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * Unless required by applicable law or agreed to in writing, software 11b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * distributed under the License is distributed on an "AS IS" BASIS, 12b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * See the License for the specific language governing permissions and 14b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * limitations under the License 15b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue */ 16b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 17b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xuepackage com.android.car.settings.common; 18b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 19b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport static java.lang.annotation.RetentionPolicy.SOURCE; 20b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 21b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport android.annotation.IntDef; 22b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport android.annotation.NonNull; 23b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport android.content.Context; 24b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport android.support.v7.widget.RecyclerView; 25b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport android.support.v7.widget.RecyclerView.ViewHolder; 26b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport android.view.ViewGroup; 27b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 28b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport com.android.car.settings.R; 29d28162c2c6c760c760125f444069841f1e4d21d9Rakesh Iyerimport com.android.car.view.PagedListView; 30b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 31b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport java.lang.annotation.Retention; 32b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport java.util.ArrayList; 33b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 34b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue/** 35b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * Renders all types of LineItem to a view to be displayed as a row in a list. 36b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue */ 37b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xuepublic class TypedPagedListAdapter 38b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue extends RecyclerView.Adapter<ViewHolder> 39b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue implements PagedListView.ItemCap { 40b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 41b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue private final Context mContext; 42a76987ecf243fa3ff76f7ea8a40597baeb763e3croger xue private ArrayList<LineItem> mContentList; 43b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 4424b50803fa603b04e74752beb19f85038515919aroger xue public TypedPagedListAdapter(@NonNull Context context) { 4524b50803fa603b04e74752beb19f85038515919aroger xue this(context, new ArrayList<>()); 4624b50803fa603b04e74752beb19f85038515919aroger xue } 4724b50803fa603b04e74752beb19f85038515919aroger xue 48a76987ecf243fa3ff76f7ea8a40597baeb763e3croger xue public TypedPagedListAdapter(@NonNull Context context, ArrayList<LineItem> contentList) { 49b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue mContext = context; 50b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue mContentList = contentList; 51b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue } 52b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 53a76987ecf243fa3ff76f7ea8a40597baeb763e3croger xue public void updateList(ArrayList<LineItem> contentList) { 5424b50803fa603b04e74752beb19f85038515919aroger xue mContentList = contentList; 5524b50803fa603b04e74752beb19f85038515919aroger xue notifyDataSetChanged(); 5624b50803fa603b04e74752beb19f85038515919aroger xue } 5724b50803fa603b04e74752beb19f85038515919aroger xue 58b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue public boolean isEmpty() { 59b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue return mContentList.isEmpty(); 60b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue } 61b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 62b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue public static abstract class LineItem<VH extends ViewHolder> { 63b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue @Retention(SOURCE) 64b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue @IntDef({TEXT_TYPE, 65b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue TOGGLE_TYPE, 66b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue ICON_TEXT_TYPE, 67b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue SEEKBAR_TYPE, 685e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue ICON_TOGGLE_TYPE, 69fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue CHECKBOX_TYPE, 70fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue EDIT_TEXT_TYPE, 71664ed2dc2488c50194a80004af759a765f0ce18froger xue SINGLE_TEXT_TYPE, 72664ed2dc2488c50194a80004af759a765f0ce18froger xue SPINNER_TYPE, 73664ed2dc2488c50194a80004af759a765f0ce18froger xue PASSWORD_TYPE}) 74b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue public @interface LineItemType {} 75b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 76b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue // with one title and one description 77b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue static final int TEXT_TYPE = 1; 78b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 79b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue // with one tile, one description, and a toggle on the right. 80b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue static final int TOGGLE_TYPE = 2; 81b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 82b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue // with one icon, one tile and one description. 83b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue static final int ICON_TEXT_TYPE = 3; 84b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue 85d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue // with one tile and one seekbar. 86d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue static final int SEEKBAR_TYPE = 4; 87d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue 88b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue // with one icon, title, description and a toggle. 89b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue static final int ICON_TOGGLE_TYPE = 5; 90b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue 915e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue // with one icon, title and a checkbox. 925e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue static final int CHECKBOX_TYPE = 6; 935e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue 94fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue // with one title and a EditText. 95fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue static final int EDIT_TEXT_TYPE = 7; 96fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue 97fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue // with one title. 98fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue static final int SINGLE_TEXT_TYPE = 8; 99fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue 100664ed2dc2488c50194a80004af759a765f0ce18froger xue // with a spinner. 101664ed2dc2488c50194a80004af759a765f0ce18froger xue static final int SPINNER_TYPE = 9; 102664ed2dc2488c50194a80004af759a765f0ce18froger xue 103664ed2dc2488c50194a80004af759a765f0ce18froger xue // with a password input window and a checkbox for show password or not. 104664ed2dc2488c50194a80004af759a765f0ce18froger xue static final int PASSWORD_TYPE = 10; 105664ed2dc2488c50194a80004af759a765f0ce18froger xue 106b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue @LineItemType 107b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue abstract int getType(); 108b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 109b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue abstract void bindViewHolder(VH holder); 110b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 111b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue public abstract CharSequence getDesc(); 1125e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue 1135e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue /** 1145e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue * Returns true if this item is ready to receive touch. If it's set to false, 1155e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue * this item maybe not clickable or temporarily not functional. 1165e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue */ 1175e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue public boolean isEnabled() { 1185e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue return true; 1195e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue } 1205e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue 1215e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue /** 1225e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue * Returns true if some component on this item can be clicked. 1235e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue */ 1245e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue public boolean isClickable() { 1255e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue return isExpandable(); 1265e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue } 1275e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue 1285e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue /** 1295e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue * Returns true if this item can launch another activity or fragment. 1305e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue */ 1315e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue public abstract boolean isExpandable(); 132b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue } 133b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 134b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue @Override 135b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 136b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue switch (viewType) { 137b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue case LineItem.TEXT_TYPE: 138b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue return TextLineItem.createViewHolder(parent); 139b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue case LineItem.TOGGLE_TYPE: 140b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue return ToggleLineItem.createViewHolder(parent); 141b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue case LineItem.ICON_TEXT_TYPE: 142b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue return IconTextLineItem.createViewHolder(parent); 143d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue case LineItem.SEEKBAR_TYPE: 144d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue return SeekbarLineItem.createViewHolder(parent); 145b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue case LineItem.ICON_TOGGLE_TYPE: 146b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue return IconToggleLineItem.createViewHolder(parent); 1475e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue case LineItem.CHECKBOX_TYPE: 1485e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue return CheckBoxLineItem.createViewHolder(parent); 149fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue case LineItem.EDIT_TEXT_TYPE: 150fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue return EditTextLineItem.createViewHolder(parent); 151fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue case LineItem.SINGLE_TEXT_TYPE: 152fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue return SingleTextLineItem.createViewHolder(parent); 153664ed2dc2488c50194a80004af759a765f0ce18froger xue case LineItem.SPINNER_TYPE: 154664ed2dc2488c50194a80004af759a765f0ce18froger xue return SpinnerLineItem.createViewHolder(parent); 155664ed2dc2488c50194a80004af759a765f0ce18froger xue case LineItem.PASSWORD_TYPE: 156664ed2dc2488c50194a80004af759a765f0ce18froger xue return PasswordLineItem.createViewHolder(parent); 157b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue default: 158b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue throw new IllegalStateException("ViewType not supported: " + viewType); 159b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue } 160b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue } 161b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 162b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue @Override 163b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue public void onBindViewHolder(ViewHolder holder, int position) { 164b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue mContentList.get(position).bindViewHolder(holder); 165b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue } 166b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 167b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue @Override 168b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue @LineItem.LineItemType 169b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue public int getItemViewType(int position) { 170b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue return mContentList.get(position).getType(); 171b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue } 172b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 173b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue @Override 174b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue public int getItemCount() { 175b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue return mContentList.size(); 176b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue } 177b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 178b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue @Override 179b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue public void setMaxItems(int maxItems) { 180b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue // no limit in this list. 181b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue } 182b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue} 183