TypedPagedListAdapter.java revision 664ed2dc2488c50194a80004af759a765f0ce18f
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    private static final String TAG = "TypedPagedListAdapter";
41b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
42b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    private final Context mContext;
4324b50803fa603b04e74752beb19f85038515919aroger xue    private ArrayList<? extends LineItem> mContentList;
44b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
4524b50803fa603b04e74752beb19f85038515919aroger xue    public TypedPagedListAdapter(@NonNull Context context) {
4624b50803fa603b04e74752beb19f85038515919aroger xue        this(context, new ArrayList<>());
4724b50803fa603b04e74752beb19f85038515919aroger xue    }
4824b50803fa603b04e74752beb19f85038515919aroger xue
4924b50803fa603b04e74752beb19f85038515919aroger xue    public TypedPagedListAdapter(
5024b50803fa603b04e74752beb19f85038515919aroger xue            @NonNull Context context, ArrayList<? extends LineItem> contentList) {
51b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        mContext = context;
52b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        mContentList = contentList;
53b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
54b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
5524b50803fa603b04e74752beb19f85038515919aroger xue    public void updateList(ArrayList<? extends LineItem> contentList) {
5624b50803fa603b04e74752beb19f85038515919aroger xue        mContentList = contentList;
5724b50803fa603b04e74752beb19f85038515919aroger xue        notifyDataSetChanged();
5824b50803fa603b04e74752beb19f85038515919aroger xue    }
5924b50803fa603b04e74752beb19f85038515919aroger xue
60b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    public boolean isEmpty() {
61b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        return mContentList.isEmpty();
62b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
63b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
64b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    public static abstract class LineItem<VH extends ViewHolder> {
65b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        @Retention(SOURCE)
66b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        @IntDef({TEXT_TYPE,
67b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue                TOGGLE_TYPE,
68b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue                ICON_TEXT_TYPE,
69b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue                SEEKBAR_TYPE,
705e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue                ICON_TOGGLE_TYPE,
71fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue                CHECKBOX_TYPE,
72fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue                EDIT_TEXT_TYPE,
73664ed2dc2488c50194a80004af759a765f0ce18froger xue                SINGLE_TEXT_TYPE,
74664ed2dc2488c50194a80004af759a765f0ce18froger xue                SPINNER_TYPE,
75664ed2dc2488c50194a80004af759a765f0ce18froger xue                PASSWORD_TYPE})
76b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        public @interface LineItemType {}
77b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
78b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        // with one title and one description
79b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        static final int TEXT_TYPE = 1;
80b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
81b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        // with one tile, one description, and a toggle on the right.
82b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        static final int TOGGLE_TYPE = 2;
83b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
84b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue        // with one icon, one tile and one description.
85b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue        static final int ICON_TEXT_TYPE = 3;
86b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue
87d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue        // with one tile and one seekbar.
88d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue        static final int SEEKBAR_TYPE = 4;
89d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue
90b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        // with one icon, title, description and a toggle.
91b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        static final int ICON_TOGGLE_TYPE = 5;
92b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue
935e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue        // with one icon, title and a checkbox.
945e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue        static final int CHECKBOX_TYPE = 6;
955e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue
96fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue        // with one title and a EditText.
97fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue        static final int EDIT_TEXT_TYPE = 7;
98fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue
99fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue        // with one title.
100fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue        static final int SINGLE_TEXT_TYPE = 8;
101fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue
102664ed2dc2488c50194a80004af759a765f0ce18froger xue        // with a spinner.
103664ed2dc2488c50194a80004af759a765f0ce18froger xue        static final int SPINNER_TYPE = 9;
104664ed2dc2488c50194a80004af759a765f0ce18froger xue
105664ed2dc2488c50194a80004af759a765f0ce18froger xue        // with a password input window and a checkbox for show password or not.
106664ed2dc2488c50194a80004af759a765f0ce18froger xue        static final int PASSWORD_TYPE = 10;
107664ed2dc2488c50194a80004af759a765f0ce18froger xue
108b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        @LineItemType
109b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        abstract int getType();
110b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
111b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        abstract void bindViewHolder(VH holder);
112b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
113b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        public abstract CharSequence getDesc();
1145e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue
1155e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue        /**
1165e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue         * Returns true if this item is ready to receive touch. If it's set to false,
1175e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue         * this item maybe not clickable or temporarily not functional.
1185e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue         */
1195e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue        public boolean isEnabled() {
1205e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue            return true;
1215e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue        }
1225e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue
1235e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue        /**
1245e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue         * Returns true if some component on this item can be clicked.
1255e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue         */
1265e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue        public boolean isClickable() {
1275e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue            return isExpandable();
1285e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue        }
1295e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue
1305e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue        /**
1315e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue         * Returns true if this item can launch another activity or fragment.
1325e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue         */
1335e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue        public abstract boolean isExpandable();
134b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
135b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
136b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    @Override
137b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
138b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        switch (viewType) {
139b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue            case LineItem.TEXT_TYPE:
140b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue                return TextLineItem.createViewHolder(parent);
141b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue            case LineItem.TOGGLE_TYPE:
142b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue                return ToggleLineItem.createViewHolder(parent);
143b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue            case LineItem.ICON_TEXT_TYPE:
144b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue                return IconTextLineItem.createViewHolder(parent);
145d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue            case LineItem.SEEKBAR_TYPE:
146d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue                return SeekbarLineItem.createViewHolder(parent);
147b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue            case LineItem.ICON_TOGGLE_TYPE:
148b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue                return IconToggleLineItem.createViewHolder(parent);
1495e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue            case LineItem.CHECKBOX_TYPE:
1505e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue                return CheckBoxLineItem.createViewHolder(parent);
151fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue            case LineItem.EDIT_TEXT_TYPE:
152fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue                return EditTextLineItem.createViewHolder(parent);
153fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue            case LineItem.SINGLE_TEXT_TYPE:
154fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue                return SingleTextLineItem.createViewHolder(parent);
155664ed2dc2488c50194a80004af759a765f0ce18froger xue            case LineItem.SPINNER_TYPE:
156664ed2dc2488c50194a80004af759a765f0ce18froger xue                return SpinnerLineItem.createViewHolder(parent);
157664ed2dc2488c50194a80004af759a765f0ce18froger xue            case LineItem.PASSWORD_TYPE:
158664ed2dc2488c50194a80004af759a765f0ce18froger xue                return PasswordLineItem.createViewHolder(parent);
159b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue            default:
160b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue                throw new IllegalStateException("ViewType not supported: " + viewType);
161b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        }
162b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
163b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
164b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    @Override
165b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    public void onBindViewHolder(ViewHolder holder, int position) {
166b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        mContentList.get(position).bindViewHolder(holder);
167b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
168b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
169b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    @Override
170b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    @LineItem.LineItemType
171b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    public int getItemViewType(int position) {
172b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        return mContentList.get(position).getType();
173b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
174b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
175b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    @Override
176b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    public int getItemCount() {
177b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        return mContentList.size();
178b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
179b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
180b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    @Override
181b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    public void setMaxItems(int maxItems) {
182b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        // no limit in this list.
183b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
184b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue}
185