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