1b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue/*
2b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue * Copyright (C) 2017 The Android Open Source Project
3b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue *
4b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue * Licensed under the Apache License, Version 2.0 (the "License");
5b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue * you may not use this file except in compliance with the License.
6b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue * You may obtain a copy of the License at
7b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue *
8b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue *      http://www.apache.org/licenses/LICENSE-2.0
9b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue *
10b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue * Unless required by applicable law or agreed to in writing, software
11b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue * distributed under the License is distributed on an "AS IS" BASIS,
12b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue * See the License for the specific language governing permissions and
14b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue * limitations under the License
15b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue */
16b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue
17b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xuepackage com.android.car.settings.common;
18b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue
19b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xueimport android.annotation.DrawableRes;
20b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xueimport android.content.Context;
21b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xueimport android.support.v7.widget.RecyclerView;
22b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xueimport android.view.LayoutInflater;
23b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xueimport android.view.View;
24b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xueimport android.view.ViewGroup;
25b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xueimport android.widget.ImageView;
26b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xueimport android.widget.Switch;
27b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xueimport android.widget.TextView;
28b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue
29b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xueimport com.android.car.settings.R;
30b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue
31b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue/**
32b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue * Contains logic for a line item represents title text, description text and a toggle widget.
33b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue */
34b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xuepublic abstract class IconToggleLineItem
35b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        extends TypedPagedListAdapter.LineItem<IconToggleLineItem.ViewHolder> {
36ddb7544cfc9f5263d719c9d2760451e9316d3bderoger xue    protected final Context mContext;
37b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    private final CharSequence mTitle;
38b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    protected IconUpdateListener mIconUpdateListener;
39b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue
40b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    public interface IconUpdateListener {
41b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        void onUpdateIcon(@DrawableRes int iconRes);
42b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    }
43b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue
44b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    private final View.OnClickListener mOnClickListener = v -> onClicked();
45b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue
46b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    private final Switch.OnCheckedChangeListener mOnCheckedChangeListener =
47b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue            (view, isChecked) -> onToggleClicked(isChecked);
48b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue
49b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    public IconToggleLineItem(CharSequence title, Context context) {
50b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        mTitle = title;
51b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        mContext = context;
52b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    }
53b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue
54b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    public int getType() {
55b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        return ICON_TOGGLE_TYPE;
56b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    }
57b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue
58b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    public void bindViewHolder(ViewHolder viewHolder) {
59b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        viewHolder.title.setText(mTitle);
60b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        viewHolder.summary.setText(getDesc());
61b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        viewHolder.toggle.setChecked(isChecked());
62b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        viewHolder.onUpdateIcon(getIcon());
63b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        viewHolder.itemView.setOnClickListener(mOnClickListener);
64b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        viewHolder.toggle.setOnCheckedChangeListener(mOnCheckedChangeListener);
65b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        mIconUpdateListener = viewHolder;
66b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    }
67b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue
68b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    static class ViewHolder extends RecyclerView.ViewHolder implements IconUpdateListener {
69b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        public final ImageView icon;
70b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        public final TextView title;
71b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        public final TextView summary;
72b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        public final Switch toggle;
73b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue
74b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        public ViewHolder(View itemView) {
75b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue            super(itemView);
76b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue            icon = (ImageView) itemView.findViewById(R.id.icon);
77b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue            title = (TextView) itemView.findViewById(R.id.title);
78b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue            summary = (TextView) itemView.findViewById(R.id.desc);
79b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue            toggle = (Switch) itemView.findViewById(R.id.toggle_switch);
80b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        }
81b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue
82b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        @Override
83b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        public void onUpdateIcon(@DrawableRes int iconRes) {
84b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue            icon.setImageResource(iconRes);
85b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        }
86b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    }
87b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue
88b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    public static RecyclerView.ViewHolder createViewHolder(ViewGroup parent) {
89b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        View v = LayoutInflater.from(parent.getContext())
90ddb7544cfc9f5263d719c9d2760451e9316d3bderoger xue                .inflate(R.layout.icon_toggle_line_item, parent, false);
91b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        return new ViewHolder(v);
92b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    }
93b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue
94b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    /**
95b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue     * Called when any part of the line is clicked.
96b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue     * @param isChecked the state of the switch widget at the time of click.
97b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue     */
98b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    public abstract void onToggleClicked(boolean isChecked);
99b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue
100b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    /**
101b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue     * called when anywhere other than the toggle on the line item got clicked.
102b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue     */
103b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    public abstract void onClicked();
104b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue
105b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    public abstract boolean isChecked();
106b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue
107b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    public abstract @DrawableRes int getIcon();
1085e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue
1095e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue    @Override
1105e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue    public boolean isClickable() {
1115e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue        return true;
1125e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue    }
113b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue}
114