1fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue/*
2fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue * Copyright (C) 2017 The Android Open Source Project
3fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue *
4fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue * Licensed under the Apache License, Version 2.0 (the "License");
5fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue * you may not use this file except in compliance with the License.
6fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue * You may obtain a copy of the License at
7fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue *
8fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue *      http://www.apache.org/licenses/LICENSE-2.0
9fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue *
10fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue * Unless required by applicable law or agreed to in writing, software
11fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue * distributed under the License is distributed on an "AS IS" BASIS,
12fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue * See the License for the specific language governing permissions and
14fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue * limitations under the License
15fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue */
16fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue
17fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xuepackage com.android.car.settings.common;
18fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue
19664ed2dc2488c50194a80004af759a765f0ce18froger xueimport android.support.annotation.Nullable;
20fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xueimport android.support.v7.widget.RecyclerView;
21fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xueimport android.text.Editable;
22664ed2dc2488c50194a80004af759a765f0ce18froger xueimport android.text.InputType;
23fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xueimport android.text.TextWatcher;
24fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xueimport android.view.LayoutInflater;
25fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xueimport android.view.View;
26fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xueimport android.view.ViewGroup;
27fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xueimport android.widget.EditText;
28fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xueimport android.widget.TextView;
29fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue
30fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xueimport com.android.car.settings.R;
31fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue
32fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue/**
33fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue * Contains logic for a line item represents text only view of a title and a EditText as input.
34fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue */
35664ed2dc2488c50194a80004af759a765f0ce18froger xuepublic class EditTextLineItem<VH extends EditTextLineItem.ViewHolder>
36664ed2dc2488c50194a80004af759a765f0ce18froger xue        extends TypedPagedListAdapter.LineItem<VH> {
37fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    private final CharSequence mTitle;
38664ed2dc2488c50194a80004af759a765f0ce18froger xue    private final CharSequence mInitialInputText;
39fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue
40fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    public interface TextChangeListener {
41664ed2dc2488c50194a80004af759a765f0ce18froger xue
42fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue        void textChanged(Editable s);
43fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    }
44fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue
45fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    private TextChangeListener mTextChangeListener;
46664ed2dc2488c50194a80004af759a765f0ce18froger xue    private EditText mEditText;
47664ed2dc2488c50194a80004af759a765f0ce18froger xue    protected TextType mTextType = TextType.NONE;
48664ed2dc2488c50194a80004af759a765f0ce18froger xue
49664ed2dc2488c50194a80004af759a765f0ce18froger xue    public enum TextType {
50664ed2dc2488c50194a80004af759a765f0ce18froger xue        // None editable text
51664ed2dc2488c50194a80004af759a765f0ce18froger xue        NONE(0),
52664ed2dc2488c50194a80004af759a765f0ce18froger xue        // text input
53664ed2dc2488c50194a80004af759a765f0ce18froger xue        TEXT(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL),
54664ed2dc2488c50194a80004af759a765f0ce18froger xue        // password, input is replaced by dot
55664ed2dc2488c50194a80004af759a765f0ce18froger xue        HIDDEN_PASSWORD(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD),
56664ed2dc2488c50194a80004af759a765f0ce18froger xue        // password, visible.
57664ed2dc2488c50194a80004af759a765f0ce18froger xue        VISIBLE_PASSWORD(
58664ed2dc2488c50194a80004af759a765f0ce18froger xue                InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
59664ed2dc2488c50194a80004af759a765f0ce18froger xue
60664ed2dc2488c50194a80004af759a765f0ce18froger xue        private int mValue;
61664ed2dc2488c50194a80004af759a765f0ce18froger xue
62664ed2dc2488c50194a80004af759a765f0ce18froger xue        TextType(int value) {
63664ed2dc2488c50194a80004af759a765f0ce18froger xue          mValue = value;
64664ed2dc2488c50194a80004af759a765f0ce18froger xue        }
65664ed2dc2488c50194a80004af759a765f0ce18froger xue
66664ed2dc2488c50194a80004af759a765f0ce18froger xue        public int getValue() {
67664ed2dc2488c50194a80004af759a765f0ce18froger xue            return mValue;
68664ed2dc2488c50194a80004af759a765f0ce18froger xue        }
69664ed2dc2488c50194a80004af759a765f0ce18froger xue    }
70664ed2dc2488c50194a80004af759a765f0ce18froger xue
71664ed2dc2488c50194a80004af759a765f0ce18froger xue    public EditTextLineItem(CharSequence title) {
72664ed2dc2488c50194a80004af759a765f0ce18froger xue        this(title, null);
73664ed2dc2488c50194a80004af759a765f0ce18froger xue    }
74fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue
75fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    public EditTextLineItem(CharSequence title, CharSequence initialInputText) {
76fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue        mTitle = title;
77664ed2dc2488c50194a80004af759a765f0ce18froger xue        mInitialInputText = initialInputText;
78664ed2dc2488c50194a80004af759a765f0ce18froger xue    }
79664ed2dc2488c50194a80004af759a765f0ce18froger xue
80664ed2dc2488c50194a80004af759a765f0ce18froger xue    public void setTextType(TextType textType) {
81664ed2dc2488c50194a80004af759a765f0ce18froger xue        mTextType = textType;
82fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    }
83fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue
84fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    public void setTextChangeListener(TextChangeListener listener) {
85fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue        mTextChangeListener = listener;
86fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    }
87fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue
88664ed2dc2488c50194a80004af759a765f0ce18froger xue    @Nullable
89664ed2dc2488c50194a80004af759a765f0ce18froger xue    public String getInput() {
90664ed2dc2488c50194a80004af759a765f0ce18froger xue        return mEditText == null ? null : mEditText.getText().toString();
91664ed2dc2488c50194a80004af759a765f0ce18froger xue    }
92664ed2dc2488c50194a80004af759a765f0ce18froger xue
93fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    @Override
94fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    public int getType() {
95fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue        return EDIT_TEXT_TYPE;
96fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    }
97fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue
98fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    @Override
99664ed2dc2488c50194a80004af759a765f0ce18froger xue    public void bindViewHolder(VH viewHolder) {
100fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue        viewHolder.titleView.setText(mTitle);
101664ed2dc2488c50194a80004af759a765f0ce18froger xue        mEditText = viewHolder.editText;
102664ed2dc2488c50194a80004af759a765f0ce18froger xue        mEditText.setInputType(mTextType.getValue());
103664ed2dc2488c50194a80004af759a765f0ce18froger xue        if (mInitialInputText != null) {
104664ed2dc2488c50194a80004af759a765f0ce18froger xue            mEditText.setText(mInitialInputText);
105664ed2dc2488c50194a80004af759a765f0ce18froger xue        }
106664ed2dc2488c50194a80004af759a765f0ce18froger xue        mEditText.addTextChangedListener(new TextWatcher() {
107fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue            @Override
108fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
109fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue                // don't care
110fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue            }
111fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue
112fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue            @Override
113fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue            public void onTextChanged(CharSequence s, int start, int before, int count) {
114fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue                // dont' care
115fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue            }
116fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue
117fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue            @Override
118fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue            public void afterTextChanged(Editable s) {
119fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue                if (mTextChangeListener != null) {
120fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue                    mTextChangeListener.textChanged(s);
121fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue                }
122fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue            }
123fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue        });
124fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    }
125fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue
126fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    public static class ViewHolder extends RecyclerView.ViewHolder {
127fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue        public final TextView titleView;
128fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue        public final EditText editText;
129fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue
130fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue        public ViewHolder(View view) {
131fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue            super(view);
132fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue            titleView = view.findViewById(R.id.title);
133fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue            editText = view.findViewById(R.id.input);
134fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue        }
135fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    }
136fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue
137fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    public static RecyclerView.ViewHolder createViewHolder(ViewGroup parent) {
138fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue        return new ViewHolder(LayoutInflater.from(parent.getContext())
139fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue                .inflate(R.layout.edit_text_line_item, parent, false));
140fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    }
141fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue
142fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    @Override
143fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    public CharSequence getDesc() {
144fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue        return null;
145fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    }
146fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue
147fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    @Override
148fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    public boolean isExpandable() {
149fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue        return false;
150fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue    }
151fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue}
152