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