1392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann/*
2392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Copyright (C) 2010 The Android Open Source Project
3392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann *
4392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Licensed under the Apache License, Version 2.0 (the "License");
5392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * you may not use this file except in compliance with the License.
6392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * You may obtain a copy of the License at
7392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann *
8392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann *      http://www.apache.org/licenses/LICENSE-2.0
9392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann *
10392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * Unless required by applicable law or agreed to in writing, software
11392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * distributed under the License is distributed on an "AS IS" BASIS,
12392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * See the License for the specific language governing permissions and
14392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann * limitations under the License.
15392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann */
16392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
1718ffaa2561cc7dd2e3ef81737e6537931c0a9a11Dmitri Plotnikovpackage com.android.contacts.editor;
18392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
19392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.content.Context;
20392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.graphics.Rect;
213e9637f91b3b7f985212e1c9d6d94c996c13100eGary Maiimport android.graphics.drawable.Drawable;
22392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.os.Parcel;
23392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.os.Parcelable;
24b6949dc7ed1b0ab47dc6a39b3ae0d42e029be2b4Tingting Wangimport android.provider.ContactsContract;
255ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimotoimport android.provider.ContactsContract.CommonDataKinds.StructuredName;
26392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.text.Editable;
27392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.text.InputType;
281d896225c06d079ea1f771ea0127248ebe1798e1Wenyi Wangimport android.text.Spannable;
295ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimotoimport android.text.Spanned;
301b22073590c1801c3e6c7bde2f4636632a049f6cKatherine Kuanimport android.text.TextUtils;
31392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.text.TextWatcher;
321d896225c06d079ea1f771ea0127248ebe1798e1Wenyi Wangimport android.text.style.TtsSpan;
33392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.util.AttributeSet;
3426918da1650c1ff7b6f92deb978ab976525c811aJosh Gargusimport android.util.Log;
35043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwellimport android.util.TypedValue;
36392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.view.View;
3763ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuanimport android.view.ViewGroup;
380af02581eecabbe234e54364bdbbd65090518d7cKatherine Kuanimport android.view.inputmethod.EditorInfo;
3926918da1650c1ff7b6f92deb978ab976525c811aJosh Gargusimport android.view.inputmethod.InputMethodManager;
40392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.widget.EditText;
4112a93637e406ba7f3da4db8d53cd035c2c1d6e6eKatherine Kuanimport android.widget.ImageView;
42392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannimport android.widget.LinearLayout;
43da5bf1cf60beef3de5e651a569fa544293683926Dave Santoro
440a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport com.android.contacts.ContactsUtils;
45e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.R;
4669c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.compat.PhoneNumberUtilsCompat;
4769c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.RawContactDelta;
4869c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.ValuesDelta;
4969c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.account.AccountType.EditField;
5069c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.dataitem.DataKind;
5169c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.util.PhoneNumberFormatter;
52e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng
53392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann/**
5463ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan * Simple editor that handles labels and any {@link EditField} defined for the
55851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * entry. Uses {@link ValuesDelta} to read any existing {@link RawContact} values,
5663ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan * and to correctly write any changes values.
57392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann */
58392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmannpublic class TextFieldsEditorView extends LabeledEditorView {
5926918da1650c1ff7b6f92deb978ab976525c811aJosh Gargus    private static final String TAG = TextFieldsEditorView.class.getSimpleName();
6026918da1650c1ff7b6f92deb978ab976525c811aJosh Gargus
61392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private EditText[] mFieldEditTexts = null;
6263ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan    private ViewGroup mFields = null;
631c6298b67fe3f25562b50793e610334a43d6a34cGary Mai    protected View mExpansionViewContainer;
641c6298b67fe3f25562b50793e610334a43d6a34cGary Mai    protected ImageView mExpansionView;
651c6298b67fe3f25562b50793e610334a43d6a34cGary Mai    protected String mCollapseButtonDescription;
661c6298b67fe3f25562b50793e610334a43d6a34cGary Mai    protected String mExpandButtonDescription;
671c6298b67fe3f25562b50793e610334a43d6a34cGary Mai    protected String mCollapsedAnnouncement;
681c6298b67fe3f25562b50793e610334a43d6a34cGary Mai    protected String mExpandedAnnouncement;
69392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private boolean mHideOptional = true;
70392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private boolean mHasShortAndLongForms;
711ebbd5bbe71814123b80df702b474bcd7196cbb7Katherine Kuan    private int mMinFieldHeight;
72ba48d21f2ab25c8ffb30198a752e5cd215553728Yorke Lee    private int mPreviousViewHeight;
73d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell    private int mHintTextColorUnfocused;
745ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto    private String mFixedPhonetic = "";
755ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto    private String mFixedDisplayName = "";
765ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto    private boolean needInputInitialize;
775ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto
78392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
79392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public TextFieldsEditorView(Context context) {
80392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super(context);
81392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
82392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
83392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public TextFieldsEditorView(Context context, AttributeSet attrs) {
84392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super(context, attrs);
85392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
86392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
87392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public TextFieldsEditorView(Context context, AttributeSet attrs, int defStyle) {
88392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super(context, attrs, defStyle);
89392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
90392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
9163ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan    /** {@inheritDoc} */
9291d8e892d549bbeba721cb434163a83bc99330a9Dmitri Plotnikov    @Override
9363ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan    protected void onFinishInflate() {
9463ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan        super.onFinishInflate();
9563ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan
9663ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan        setDrawingCacheEnabled(true);
9763ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan        setAlwaysDrawnWithCacheEnabled(true);
9863ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan
99f140227beb6d9e78955a7676dc0dd3f793f72017Brian Attwell        mMinFieldHeight = getContext().getResources().getDimensionPixelSize(
1001ebbd5bbe71814123b80df702b474bcd7196cbb7Katherine Kuan                R.dimen.editor_min_line_item_height);
10163ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan        mFields = (ViewGroup) findViewById(R.id.editors);
102d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell        mHintTextColorUnfocused = getResources().getColor(R.color.editor_disabled_text_color);
10312a93637e406ba7f3da4db8d53cd035c2c1d6e6eKatherine Kuan        mExpansionView = (ImageView) findViewById(R.id.expansion_view);
1041c6298b67fe3f25562b50793e610334a43d6a34cGary Mai        mCollapseButtonDescription = getResources()
1051c6298b67fe3f25562b50793e610334a43d6a34cGary Mai                .getString(R.string.collapse_fields_description);
1061c6298b67fe3f25562b50793e610334a43d6a34cGary Mai        mCollapsedAnnouncement = getResources()
1071c6298b67fe3f25562b50793e610334a43d6a34cGary Mai                .getString(R.string.announce_collapsed_fields);
1081c6298b67fe3f25562b50793e610334a43d6a34cGary Mai        mExpandButtonDescription = getResources()
1091c6298b67fe3f25562b50793e610334a43d6a34cGary Mai                .getString(R.string.expand_fields_description);
1101c6298b67fe3f25562b50793e610334a43d6a34cGary Mai        mExpandedAnnouncement = getResources()
1111c6298b67fe3f25562b50793e610334a43d6a34cGary Mai                .getString(R.string.announce_expanded_fields);
1121c6298b67fe3f25562b50793e610334a43d6a34cGary Mai
11312a93637e406ba7f3da4db8d53cd035c2c1d6e6eKatherine Kuan        mExpansionViewContainer = findViewById(R.id.expansion_view_container);
114043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell        if (mExpansionViewContainer != null) {
115043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell            mExpansionViewContainer.setOnClickListener(new OnClickListener() {
116043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                @Override
117043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                public void onClick(View v) {
118043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                    mPreviousViewHeight = mFields.getHeight();
119043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell
120043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                    // Save focus
121698cee7d410f06b0c883c11f53481bfa5b2b787aGary Mai                    final View focusedChild = findFocus();
122043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                    final int focusedViewId = focusedChild == null ? -1 : focusedChild.getId();
123043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell
124043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                    // Reconfigure GUI
125043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                    mHideOptional = !mHideOptional;
126043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                    onOptionalFieldVisibilityChange();
127043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                    rebuildValues();
128043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell
129043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                    // Restore focus
130043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                    View newFocusView = findViewById(focusedViewId);
131043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                    if (newFocusView == null || newFocusView.getVisibility() == GONE) {
132043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                        // find first visible child
133043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                        newFocusView = TextFieldsEditorView.this;
134043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                    }
135043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                    newFocusView.requestFocus();
136043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell
137043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                    EditorAnimator.getInstance().slideAndFadeIn(mFields, mPreviousViewHeight);
1381c6298b67fe3f25562b50793e610334a43d6a34cGary Mai                    announceForAccessibility(mHideOptional ?
1391c6298b67fe3f25562b50793e610334a43d6a34cGary Mai                            mCollapsedAnnouncement : mExpandedAnnouncement);
140392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                }
141043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell            });
142043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell        }
143392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
144392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
145392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
14626918da1650c1ff7b6f92deb978ab976525c811aJosh Gargus    public void editNewlyAddedField() {
14726918da1650c1ff7b6f92deb978ab976525c811aJosh Gargus        // Some editors may have multiple fields (eg: first-name/last-name), but since the user
14826918da1650c1ff7b6f92deb978ab976525c811aJosh Gargus        // has not selected a particular one, it is reasonable to simply pick the first.
14926918da1650c1ff7b6f92deb978ab976525c811aJosh Gargus        final View editor = mFields.getChildAt(0);
15026918da1650c1ff7b6f92deb978ab976525c811aJosh Gargus
15126918da1650c1ff7b6f92deb978ab976525c811aJosh Gargus        // Show the soft-keyboard.
152a07c90b6b07bfbd527dbf815d65b8ee0d28fbd6aWenyi Wang        InputMethodManager imm =
153a07c90b6b07bfbd527dbf815d65b8ee0d28fbd6aWenyi Wang                (InputMethodManager)getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
154a07c90b6b07bfbd527dbf815d65b8ee0d28fbd6aWenyi Wang        if (imm != null) {
155a07c90b6b07bfbd527dbf815d65b8ee0d28fbd6aWenyi Wang            if (!imm.showSoftInput(editor, InputMethodManager.SHOW_IMPLICIT)) {
156a07c90b6b07bfbd527dbf815d65b8ee0d28fbd6aWenyi Wang                Log.w(TAG, "Failed to show soft input method.");
157a07c90b6b07bfbd527dbf815d65b8ee0d28fbd6aWenyi Wang            }
158a07c90b6b07bfbd527dbf815d65b8ee0d28fbd6aWenyi Wang        }
15926918da1650c1ff7b6f92deb978ab976525c811aJosh Gargus    }
16026918da1650c1ff7b6f92deb978ab976525c811aJosh Gargus
16126918da1650c1ff7b6f92deb978ab976525c811aJosh Gargus    @Override
162392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public void setEnabled(boolean enabled) {
163392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super.setEnabled(enabled);
164392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
165392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (mFieldEditTexts != null) {
166392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            for (int index = 0; index < mFieldEditTexts.length; index++) {
16702bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov                mFieldEditTexts[index].setEnabled(!isReadOnly() && enabled);
168392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
169392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
170043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell        if (mExpansionView != null) {
171043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell            mExpansionView.setEnabled(!isReadOnly() && enabled);
172043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell        }
173392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
174392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
175d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell    private OnFocusChangeListener mTextFocusChangeListener = new OnFocusChangeListener() {
176d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell        @Override
177d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell        public void onFocusChange(View v, boolean hasFocus) {
178d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell            if (getEditorListener() != null) {
179d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell                getEditorListener().onRequest(EditorListener.EDITOR_FOCUS_CHANGED);
180d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell            }
181d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell            // Rebuild the label spinner using the new colors.
182d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell            rebuildLabel();
1835ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto
1845ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto            if (hasFocus) {
1855ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                needInputInitialize = true;
1865ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto            }
187d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell        }
188d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell    };
189d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell
190d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell    /**
191392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * Creates or removes the type/label button. Doesn't do anything if already correctly configured
192392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     */
19312a93637e406ba7f3da4db8d53cd035c2c1d6e6eKatherine Kuan    private void setupExpansionView(boolean shouldExist, boolean collapsed) {
1943e9637f91b3b7f985212e1c9d6d94c996c13100eGary Mai        final Drawable expandIcon = getContext().getDrawable(collapsed
195bd9ef3c60669d71543b3506d4959c1fe4be409dcJohn Shao                ? R.drawable.quantum_ic_expand_more_vd_theme_24
196bd9ef3c60669d71543b3506d4959c1fe4be409dcJohn Shao                : R.drawable.quantum_ic_expand_less_vd_theme_24);
1973e9637f91b3b7f985212e1c9d6d94c996c13100eGary Mai        mExpansionView.setImageDrawable(expandIcon);
1981c6298b67fe3f25562b50793e610334a43d6a34cGary Mai        mExpansionView.setContentDescription(collapsed ? mExpandButtonDescription
1991c6298b67fe3f25562b50793e610334a43d6a34cGary Mai                : mCollapseButtonDescription);
20093f22ec7bf10df0d0a785d56e07d78b60a449975Brian Attwell        mExpansionViewContainer.setVisibility(shouldExist ? View.VISIBLE : View.INVISIBLE);
201392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
202392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
203392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
204392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    protected void requestFocusForFirstEditField() {
205392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (mFieldEditTexts != null && mFieldEditTexts.length != 0) {
206392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            EditText firstField = null;
207392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            boolean anyFieldHasFocus = false;
208392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            for (EditText editText : mFieldEditTexts) {
209392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                if (firstField == null && editText.getVisibility() == View.VISIBLE) {
210392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    firstField = editText;
211392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                }
212392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                if (editText.hasFocus()) {
213392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    anyFieldHasFocus = true;
214392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    break;
215392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                }
216392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
217392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            if (!anyFieldHasFocus && firstField != null) {
218392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                firstField.requestFocus();
219392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
220392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
221392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
222392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
22344cfc56d1701629070384364416c1311b780535dChiao Cheng    public void setValue(int field, String value) {
22444cfc56d1701629070384364416c1311b780535dChiao Cheng        mFieldEditTexts[field].setText(value);
22544cfc56d1701629070384364416c1311b780535dChiao Cheng    }
22644cfc56d1701629070384364416c1311b780535dChiao Cheng
2275ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto    private boolean isUnFixed(Editable input) {
2285ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto        boolean unfixed = false;
2295ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto        Object[] spanned = input.getSpans(0, input.length(), Object.class);
2305ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto        if (spanned != null) {
2315ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto            for (Object obj : spanned) {
2325ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                if ((input.getSpanFlags(obj) & Spanned.SPAN_COMPOSING) == Spanned.SPAN_COMPOSING) {
2335ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                    unfixed = true;
2345ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                }
2355ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto            }
2365ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto        }
2375ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto        return unfixed;
2385ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto    }
2395ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto
2405ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto    private String getNameField(String column) {
2415ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto
2425ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto      EditText editText = null;
2435ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto
2445ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto      if (StructuredName.FAMILY_NAME.equals(column)) {
2455ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto          editText = (EditText) mFields.getChildAt(1);
2465ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto      } else if (StructuredName.GIVEN_NAME.equals(column)) {
2475ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto          editText = (EditText) mFields.getChildAt(3);
2485ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto      } else if (StructuredName.MIDDLE_NAME.equals(column)) {
2495ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto          editText = (EditText) mFields.getChildAt(2);
2505ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto      }
2515ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto
2525ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto      if (editText != null) {
2535ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto          return editText.getText().toString();
2545ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto      }
2555ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto
2565ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto      return "";
2575ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto    }
2585ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto
259392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
260851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public void setValues(DataKind kind, ValuesDelta entry, RawContactDelta state, boolean readOnly,
261392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            ViewIdGenerator vig) {
262392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super.setValues(kind, entry, state, readOnly, vig);
263392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        // Remove edit texts that we currently have
264392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (mFieldEditTexts != null) {
265392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            for (EditText fieldEditText : mFieldEditTexts) {
26663ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan                mFields.removeView(fieldEditText);
267392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
268392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
269392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        boolean hidePossible = false;
270392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
271f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        int fieldCount = kind.fieldList == null ? 0 : kind.fieldList.size();
272392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mFieldEditTexts = new EditText[fieldCount];
273392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        for (int index = 0; index < fieldCount; index++) {
274392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            final EditField field = kind.fieldList.get(index);
275f140227beb6d9e78955a7676dc0dd3f793f72017Brian Attwell            final EditText fieldView = new EditText(getContext());
276392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            fieldView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,
2775cc21eb9fd21c50ada1d94665560099025f9853dBrian Attwell                    LayoutParams.WRAP_CONTENT));
278043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell            fieldView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
279043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                    getResources().getDimension(R.dimen.editor_form_text_size));
280d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell            fieldView.setHintTextColor(mHintTextColorUnfocused);
281392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mFieldEditTexts[index] = fieldView;
282392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            fieldView.setId(vig.getId(state, kind, entry, index));
283392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            if (field.titleRes > 0) {
284392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                fieldView.setHint(field.titleRes);
285392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
286392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            int inputType = field.inputType;
287392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            fieldView.setInputType(inputType);
288392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            if (inputType == InputType.TYPE_CLASS_PHONE) {
2893d59049c39e5c3896a3d741c4f7cafbbf26c8e69guanxiongliu                PhoneNumberFormatter.setPhoneNumberFormattingTextWatcher(
290c03cfc04a8f66dc30360f3eb7ec876d4cae64237Gary Mai                        getContext(), fieldView,
291c03cfc04a8f66dc30360f3eb7ec876d4cae64237Gary Mai                        /* formatAfterWatcherSet =*/ state.isContactInsert());
292cbfb11288368bca3a6e350ae880d53ffb4907b78Yorke Lee                fieldView.setTextDirection(View.TEXT_DIRECTION_LTR);
293392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
2949f153a02a56b9d97dc51371243c52e79fbce5813Tingting Wang            fieldView.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
295392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
296043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell            // Set either a minimum line requirement or a minimum height (because {@link TextView}
297043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell            // only takes one or the other at a single time).
298043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell            if (field.minLines > 1) {
299043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                fieldView.setMinLines(field.minLines);
300043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell            } else {
301043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                // This needs to be called after setInputType. Otherwise, calling setInputType
302043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                // will unset this value.
303043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell                fieldView.setMinHeight(mMinFieldHeight);
304043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell            }
305043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell
3060af02581eecabbe234e54364bdbbd65090518d7cKatherine Kuan            // Show the "next" button in IME to navigate between text fields
3070af02581eecabbe234e54364bdbbd65090518d7cKatherine Kuan            // TODO: Still need to properly navigate to/from sections without text fields,
3080af02581eecabbe234e54364bdbbd65090518d7cKatherine Kuan            // See Bug: 5713510
3096eb8e0d5d8304e5220c95a07bfd54c6a44674fddGary Mai            fieldView.setImeOptions(EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NO_FULLSCREEN);
3100af02581eecabbe234e54364bdbbd65090518d7cKatherine Kuan
311392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            // Read current value from state
312392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            final String column = field.column;
313392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            final String value = entry.getAsString(column);
314b6949dc7ed1b0ab47dc6a39b3ae0d42e029be2b4Tingting Wang            if (ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE.equals(kind.mimeType)) {
315fcc7dc9e271df409247b24cb3e8cdeb9017beeb5Wenyi Wang                fieldView.setText(PhoneNumberUtilsCompat.createTtsSpannable(value));
316b6949dc7ed1b0ab47dc6a39b3ae0d42e029be2b4Tingting Wang            } else {
317b6949dc7ed1b0ab47dc6a39b3ae0d42e029be2b4Tingting Wang                fieldView.setText(value);
318b6949dc7ed1b0ab47dc6a39b3ae0d42e029be2b4Tingting Wang            }
319392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
32083e7e63a8c482a6969cd62ba5b33a6700c87efcdWenyi Wang            // Show the delete button if we have a non-empty value
32183e7e63a8c482a6969cd62ba5b33a6700c87efcdWenyi Wang            setDeleteButtonVisible(!TextUtils.isEmpty(value));
3225e330ed98f1c2711b4cd3b375a1c0f76bedaf3e1Katherine Kuan
323392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            // Prepare listener for writing changes
324392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            fieldView.addTextChangedListener(new TextWatcher() {
3255ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                private int mStart = 0;
326392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                @Override
327392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                public void afterTextChanged(Editable s) {
328392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    // Trigger event for newly changed value
329392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    onFieldChanged(column, s.toString());
3305ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto
3315ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                    if (!DataKind.PSEUDO_MIME_TYPE_NAME.equals(getKind().mimeType)){
3325ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                        return;
3335ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                    }
3345ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto
3355ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                    String displayNameField = s.toString();
3365ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto
3375ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                    int nonFixedLen = displayNameField.length() - mFixedDisplayName.length();
3385ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                    if (isUnFixed(s) || nonFixedLen == 0) {
3395ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                        String tmpString = mFixedPhonetic
3405ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                             + displayNameField.substring(mStart, displayNameField.length());
3415ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto
3425ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                        updatePhonetic(column, tmpString);
3435ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                    } else {
3445ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                        mFixedPhonetic = getPhonetic(column);
3455ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                        mFixedDisplayName = displayNameField;
3465ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                    }
347392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                }
348392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
349392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                @Override
350392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
3515ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                    if (!DataKind.PSEUDO_MIME_TYPE_NAME.equals(getKind().mimeType)){
3525ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                        return;
3535ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                    }
3545ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                    if (needInputInitialize) {
3555ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                        mFixedPhonetic = getPhonetic(column);
3565ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                        mFixedDisplayName = getNameField(column);
3575ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                        needInputInitialize = false;
3585ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                    }
359392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                }
360392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
361392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                @Override
362392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                public void onTextChanged(CharSequence s, int start, int before, int count) {
3635ed462afae8eb162473fe2fbd02ae60e7c73c676yoichi kakimoto                    mStart = start;
3641d896225c06d079ea1f771ea0127248ebe1798e1Wenyi Wang                    if (!ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE.equals(
3651d896225c06d079ea1f771ea0127248ebe1798e1Wenyi Wang                            getKind().mimeType) || !(s instanceof Spannable)) {
3661d896225c06d079ea1f771ea0127248ebe1798e1Wenyi Wang                        return;
3671d896225c06d079ea1f771ea0127248ebe1798e1Wenyi Wang                    }
3681d896225c06d079ea1f771ea0127248ebe1798e1Wenyi Wang                    final Spannable spannable = (Spannable) s;
3691d896225c06d079ea1f771ea0127248ebe1798e1Wenyi Wang                    final TtsSpan[] spans = spannable.getSpans(0, s.length(), TtsSpan.class);
3701d896225c06d079ea1f771ea0127248ebe1798e1Wenyi Wang                    for (int i = 0; i < spans.length; i++) {
3711d896225c06d079ea1f771ea0127248ebe1798e1Wenyi Wang                        spannable.removeSpan(spans[i]);
3721d896225c06d079ea1f771ea0127248ebe1798e1Wenyi Wang                    }
3731d896225c06d079ea1f771ea0127248ebe1798e1Wenyi Wang                    PhoneNumberUtilsCompat.addTtsSpan(spannable, 0, s.length());
374392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                }
375392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            });
376392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
37702bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov            fieldView.setEnabled(isEnabled() && !readOnly);
378d690dff231dd5a81b9bd7563838455f24e49c75cBrian Attwell            fieldView.setOnFocusChangeListener(mTextFocusChangeListener);
379392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
380392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            if (field.shortForm) {
381392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                hidePossible = true;
382392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                mHasShortAndLongForms = true;
383392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                fieldView.setVisibility(mHideOptional ? View.VISIBLE : View.GONE);
384392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            } else if (field.longForm) {
385392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                hidePossible = true;
386392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                mHasShortAndLongForms = true;
387392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                fieldView.setVisibility(mHideOptional ? View.GONE : View.VISIBLE);
388392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            } else {
389392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                // Hide field when empty and optional value
390392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                final boolean couldHide = (!ContactsUtils.isGraphic(value) && field.optional);
391392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                final boolean willHide = (mHideOptional && couldHide);
392392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                fieldView.setVisibility(willHide ? View.GONE : View.VISIBLE);
393392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                hidePossible = hidePossible || couldHide;
394392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
395392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
39663ffb90935d8aec295e4a8f62af6c77dafe1899fKatherine Kuan            mFields.addView(fieldView);
397392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
398392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
399043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell        if (mExpansionView != null) {
400043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell            // When hiding fields, place expandable
401043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell            setupExpansionView(hidePossible, mHideOptional);
402043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell            mExpansionView.setEnabled(!readOnly && isEnabled());
403043fba637b421dcd554c634f769f0e883fb5ff8bBrian Attwell        }
4048f9d84fffbc32b50cf3133b2340b18d0510a6c6eBrian Attwell        updateEmptiness();
405392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
406392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
4072591436971bad3050c85929c8e0c5a8d48111f88Katherine Kuan    @Override
4082591436971bad3050c85929c8e0c5a8d48111f88Katherine Kuan    public boolean isEmpty() {
4091b22073590c1801c3e6c7bde2f4636632a049f6cKatherine Kuan        for (int i = 0; i < mFields.getChildCount(); i++) {
4101b22073590c1801c3e6c7bde2f4636632a049f6cKatherine Kuan            EditText editText = (EditText) mFields.getChildAt(i);
4112591436971bad3050c85929c8e0c5a8d48111f88Katherine Kuan            if (!TextUtils.isEmpty(editText.getText())) {
4122591436971bad3050c85929c8e0c5a8d48111f88Katherine Kuan                return false;
4131b22073590c1801c3e6c7bde2f4636632a049f6cKatherine Kuan            }
4141b22073590c1801c3e6c7bde2f4636632a049f6cKatherine Kuan        }
4152591436971bad3050c85929c8e0c5a8d48111f88Katherine Kuan        return true;
4161b22073590c1801c3e6c7bde2f4636632a049f6cKatherine Kuan    }
4171b22073590c1801c3e6c7bde2f4636632a049f6cKatherine Kuan
418392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    /**
419392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * Returns true if the editor is currently configured to show optional fields.
420392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     */
421392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public boolean areOptionalFieldsVisible() {
422392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        return !mHideOptional;
423392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
424392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
425392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public boolean hasShortAndLongForms() {
426392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        return mHasShortAndLongForms;
427392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
428392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
429392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    /**
430392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * Populates the bound rectangle with the bounds of the last editor field inside this view.
431392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     */
432392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    public void acquireEditorBounds(Rect bounds) {
433392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        if (mFieldEditTexts != null) {
434392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            for (int i = mFieldEditTexts.length; --i >= 0;) {
435392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                EditText editText = mFieldEditTexts[i];
436392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                if (editText.getVisibility() == View.VISIBLE) {
437392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    bounds.set(editText.getLeft(), editText.getTop(), editText.getRight(),
438392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                            editText.getBottom());
439392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                    return;
440392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                }
441392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
442392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
443392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
444392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
445392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    /**
446392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * Saves the visibility of the child EditTexts, and mHideOptional.
447392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     */
448392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
449392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    protected Parcelable onSaveInstanceState() {
450392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        Parcelable superState = super.onSaveInstanceState();
451392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        SavedState ss = new SavedState(superState);
452392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
453392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        ss.mHideOptional = mHideOptional;
454392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
4555ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov        final int numChildren = mFieldEditTexts == null ? 0 : mFieldEditTexts.length;
456392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        ss.mVisibilities = new int[numChildren];
457392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        for (int i = 0; i < numChildren; i++) {
458392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            ss.mVisibilities[i] = mFieldEditTexts[i].getVisibility();
459392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
460392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
461392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        return ss;
462392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
463392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
464392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    /**
465392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     * Restores the visibility of the child EditTexts, and mHideOptional.
466392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann     */
467392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    @Override
468392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    protected void onRestoreInstanceState(Parcelable state) {
469392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        SavedState ss = (SavedState) state;
470392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        super.onRestoreInstanceState(ss.getSuperState());
471392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
472392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        mHideOptional = ss.mHideOptional;
473392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
474882128af0b342f13b03f78491225a89c45822699Jay Shrauner        int numChildren = Math.min(mFieldEditTexts == null ? 0 : mFieldEditTexts.length,
475882128af0b342f13b03f78491225a89c45822699Jay Shrauner                ss.mVisibilities == null ? 0 : ss.mVisibilities.length);
476392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        for (int i = 0; i < numChildren; i++) {
477392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mFieldEditTexts[i].setVisibility(ss.mVisibilities[i]);
478392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
4791c6298b67fe3f25562b50793e610334a43d6a34cGary Mai        rebuildValues();
480392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
481392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
482392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    private static class SavedState extends BaseSavedState {
483392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        public boolean mHideOptional;
484392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        public int[] mVisibilities;
485392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
486392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        SavedState(Parcelable superState) {
487392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            super(superState);
488392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
489392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
490392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        private SavedState(Parcel in) {
491392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            super(in);
492392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            mVisibilities = new int[in.readInt()];
493392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            in.readIntArray(mVisibilities);
494392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
495392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
496392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        @Override
497392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        public void writeToParcel(Parcel out, int flags) {
498392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            super.writeToParcel(out, flags);
499392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            out.writeInt(mVisibilities.length);
500392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            out.writeIntArray(mVisibilities);
501392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        }
502392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
503cfb525b3f18d71d6cc5d4ef36d704b3ba9e9a6f3Daniel Lehmann        @SuppressWarnings({"unused", "hiding" })
504392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        public static final Parcelable.Creator<SavedState> CREATOR
505392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                = new Parcelable.Creator<SavedState>() {
506392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            @Override
507392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            public SavedState createFromParcel(Parcel in) {
508392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                return new SavedState(in);
509392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
510392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann
511392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            @Override
512392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            public SavedState[] newArray(int size) {
513392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann                return new SavedState[size];
514392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann            }
515392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann        };
516392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann    }
517da5bf1cf60beef3de5e651a569fa544293683926Dave Santoro
5182293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan    @Override
5192293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan    public void clearAllFields() {
5202293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan        if (mFieldEditTexts != null) {
5212293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan            for (EditText fieldEditText : mFieldEditTexts) {
5222293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan                // Update UI (which will trigger a state change through the {@link TextWatcher})
5232293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan                fieldEditText.setText("");
5242293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan            }
5252293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan        }
5262293e55d550fbc9974d1185960715e59acb14a85Katherine Kuan    }
527392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann}
528