TextFieldsEditorView.java revision d8e0049c4c05a55b41566e3f53d38e877a8d71d2
1b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project/* 2b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * Copyright (C) 2010 The Android Open Source Project 3b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * 4b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * you may not use this file except in compliance with the License. 6b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * You may obtain a copy of the License at 7b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * 8b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * 10b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * See the License for the specific language governing permissions and 14b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * limitations under the License. 15b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project */ 16b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 17b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectpackage com.android.contacts.editor; 18b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 190935e09bb12a1886a801713bbd78bbc20bf4ea4eChih-yu Huangimport com.android.contacts.ContactsUtils; 2041ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport com.android.contacts.R; 21ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wangimport com.android.contacts.model.AccountType.EditField; 226fb969e2edd99340b3b77eae4e7b313a82937930Andy Stadlerimport com.android.contacts.model.DataKind; 2398d615769af2b08bcddf02ee1b11f5288ec5cf92Wu-cheng Liimport com.android.contacts.model.EntityDelta; 24c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Liimport com.android.contacts.model.EntityDelta.ValuesDelta; 25adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wangimport com.android.contacts.util.ThemeUtils; 261efb18228a45952d699af280482e1c51a4582690Owen Lin 27b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.content.Context; 28b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.content.Entity; 296d68a36b5da24f70e1a8d5e9529720eeb8ce6d86Ray Chenimport android.content.res.Resources; 30b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.graphics.Rect; 31b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.os.Parcel; 32b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.os.Parcelable; 33b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.telephony.PhoneNumberFormattingTextWatcher; 3459b5974a4ae078eb7628fd855db89e5be9b0fe6fOwen Linimport android.text.Editable; 35b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.text.InputType; 364aaa2130af7241f128ee561cafd17a4fb560b92cWu-cheng Liimport android.text.TextWatcher; 3741ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport android.util.AttributeSet; 3841ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Liimport android.view.Gravity; 394305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Liimport android.view.View; 40b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.widget.EditText; 414305c70dc849156be5d79d52772ea71cd890ca40Wu-cheng Liimport android.widget.ImageButton; 42b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.widget.LinearLayout; 4302af7e82f97ade581703c7f4a32666e4f578173bWu-cheng Li 44b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project/** 45b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * Simple editor that handles labels and any {@link EditField} defined for 46b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * the entry. Uses {@link ValuesDelta} to read any existing 47cdf69cba3617c446e4fe9a92b4b4199c6ed36d01Owen Lin * {@link Entity} values, and to correctly write any changes values. 48b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project */ 49f86e6af0b8833f5f8a4b03fefba54b1922280d28Chih-Chung Changpublic class TextFieldsEditorView extends LabeledEditorView { 50232700d54651dcaefb378dc22bdb008a9815d1cdWu-cheng Li private EditText[] mFieldEditTexts = null; 51b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project private ImageButton mMoreOrLess; 52b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project private boolean mHideOptional = true; 53aa3cc2012a1ee0cc04e1244dd977cb8bb84683e4Wu-cheng Li private boolean mHasShortAndLongForms; 54c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li private int mEditorTextSize; 55b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 56b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project public TextFieldsEditorView(Context context) { 57b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project super(context); 586fb969e2edd99340b3b77eae4e7b313a82937930Andy Stadler } 5995fc5b2c5b14bb81332570f6d74f75cd63ea04b5Wu-cheng Li 60b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project public TextFieldsEditorView(Context context, AttributeSet attrs) { 61b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project super(context, attrs); 62ffcca7403c9a364403357d3c76a3ff256c63c786Cheng-Ru Lin } 63b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 64b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project public TextFieldsEditorView(Context context, AttributeSet attrs, int defStyle) { 6598d615769af2b08bcddf02ee1b11f5288ec5cf92Wu-cheng Li super(context, attrs, defStyle); 66b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang } 67fba0439b62f19a2a19ff6559c1ae055e910400dbWu-cheng Li 682e768c1b835a127f190395a91477144d8ae850acOwen Lin public void setEditorTextSize(int textSize) { 690e841fe509c3b61ced7ddf4bee4728b382eae62fOwen Lin this.mEditorTextSize = textSize; 700e841fe509c3b61ced7ddf4bee4728b382eae62fOwen Lin } 710e841fe509c3b61ced7ddf4bee4728b382eae62fOwen Lin 720e841fe509c3b61ced7ddf4bee4728b382eae62fOwen Lin @Override 730e841fe509c3b61ced7ddf4bee4728b382eae62fOwen Lin protected int getLineItemCount() { 74cc5a6356055dd8a8a4017b0af5410b53f25aaef0Wu-cheng Li int count = mFieldEditTexts == null ? 0 : mFieldEditTexts.length; 75b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang return Math.max(count, super.getLineItemCount()); 7682544b4564c079ece1a9065d19add36b2635bb8fOwen Lin } 770e841fe509c3b61ced7ddf4bee4728b382eae62fOwen Lin 78271b3095b9f763421c0547109da9de774795072dChih-Chung Chang @Override 79a907c122ccec649c6cedf3a45b1c426a5fca932eAngus Kong protected boolean isLineItemVisible(int row) { 8022e1d11ab2e59b672885fa5f7e5f08b1a2455225Wu-cheng Li return mFieldEditTexts != null && mFieldEditTexts[row].getVisibility() != View.GONE; 8141ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li } 82c343fa06491ee5677b735920032d92e055c16366Wu-cheng Li 83c343fa06491ee5677b735920032d92e055c16366Wu-cheng Li @Override 84b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project public int getBaseline(int row) { 85b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project int baseline = super.getBaseline(row); 86b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project if (mFieldEditTexts != null) { 87b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project EditText editText = mFieldEditTexts[row]; 88e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li // The text field will be centered vertically in the corresponding line item 8955fd2a3b10b55cb107fe6613d1a0beda869b131cWu-cheng Li int lineItemHeight = getLineItemHeight(row); 9055fd2a3b10b55cb107fe6613d1a0beda869b131cWu-cheng Li int offset = (lineItemHeight - editText.getMeasuredHeight()) / 2; 9155fd2a3b10b55cb107fe6613d1a0beda869b131cWu-cheng Li baseline = Math.max(baseline, offset + editText.getBaseline()); 9255fd2a3b10b55cb107fe6613d1a0beda869b131cWu-cheng Li } 9355fd2a3b10b55cb107fe6613d1a0beda869b131cWu-cheng Li return baseline; 94b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 95ee1cf3f0509987e9c76626077bd8117399311cedChih-Chung Chang 96ee1cf3f0509987e9c76626077bd8117399311cedChih-Chung Chang @Override 97ee1cf3f0509987e9c76626077bd8117399311cedChih-Chung Chang protected void onLayout(boolean changed, int l, int t, int r, int b) { 98ee1cf3f0509987e9c76626077bd8117399311cedChih-Chung Chang super.onLayout(changed, l, t, r, b); 99ee1cf3f0509987e9c76626077bd8117399311cedChih-Chung Chang 100ee1cf3f0509987e9c76626077bd8117399311cedChih-Chung Chang int l1 = getPaddingLeft(); 101ee1cf3f0509987e9c76626077bd8117399311cedChih-Chung Chang int t1 = getPaddingTop(); 102ee1cf3f0509987e9c76626077bd8117399311cedChih-Chung Chang int r1 = getMeasuredWidth() - getPaddingRight(); 103ee1cf3f0509987e9c76626077bd8117399311cedChih-Chung Chang 104ee1cf3f0509987e9c76626077bd8117399311cedChih-Chung Chang if ((mMoreOrLess != null)) { 105b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project // Ensure that the more-or-less button does not overlap the delete button. 106b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project int moreOrLessTop = t1; 10733be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin if (getDelete() != null) { 10833be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin moreOrLessTop = getDelete().getBottom() + getPaddingTop(); 10933be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin } 11033be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin mMoreOrLess.layout( 11133be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin r1 - mMoreOrLess.getMeasuredWidth(), moreOrLessTop, 112316af30d026dd182edb482ef6de7a330d6b1b012Wu-cheng Li r1, moreOrLessTop + mMoreOrLess.getMeasuredHeight()); 113316af30d026dd182edb482ef6de7a330d6b1b012Wu-cheng Li } 114316af30d026dd182edb482ef6de7a330d6b1b012Wu-cheng Li 11533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin // Subtract buttons if necessary 116adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang final int labelWidth = (getLabel() != null) ? getLabel().getMeasuredWidth() : 0; 11735bda2dc8ab95a7baf68b544cf97826aabff6210Wu-cheng Li final int deleteWidth = (getDelete() != null) ? getDelete().getMeasuredWidth() : 0; 1185f6484a74fe019337e436e6e0dcb07375a74af25President Li final int moreOrLessWidth = mMoreOrLess != null ? mMoreOrLess.getMeasuredWidth() : 0; 11970fe12f4d0ba9c08be9e0f0bda75b172a21cf70aOwen Lin final int r2 = r1 - Math.max(deleteWidth, moreOrLessWidth) - labelWidth; 120838e6e75fdcb1946deef2fae276c03f2cb00e596Wu-cheng Li 121838e6e75fdcb1946deef2fae276c03f2cb00e596Wu-cheng Li // Layout text fields 122d5b2118fc4aa377a3c4f5e4052745f14ec78b2c4Wu-cheng Li int y = t1; 123d5b2118fc4aa377a3c4f5e4052745f14ec78b2c4Wu-cheng Li if (mFieldEditTexts != null) { 124d5b2118fc4aa377a3c4f5e4052745f14ec78b2c4Wu-cheng Li for (int i = 0; i < mFieldEditTexts.length; i++) { 1255f6484a74fe019337e436e6e0dcb07375a74af25President Li int baseline = getBaseline(i); 1264aaa2130af7241f128ee561cafd17a4fb560b92cWu-cheng Li EditText editText = mFieldEditTexts[i]; 127c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li if (editText.getVisibility() != View.GONE) { 1284aaa2130af7241f128ee561cafd17a4fb560b92cWu-cheng Li int height = editText.getMeasuredHeight(); 129c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li int top = t1 + y + baseline - editText.getBaseline(); 130c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li editText.layout( 1314aaa2130af7241f128ee561cafd17a4fb560b92cWu-cheng Li l1, top, 1321ef634d277d550ed55b5b7089dfd56ed71815bd6Chih-Chung Chang r2, top + height); 133b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project y += getLineItemHeight(i); 134b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 135b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 136b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 1376d68a36b5da24f70e1a8d5e9529720eeb8ce6d86Ray Chen } 138b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project 13995fc5b2c5b14bb81332570f6d74f75cd63ea04b5Wu-cheng Li @Override 14002ec7c0880ded5863d73d6f173ef35ab5c888dcdWu-cheng Li protected int getLineItemHeight(int row) { 14103eeea3750b6b540b735e0f4d5d6d76c128cbacbWu-cheng Li int fieldHeight = 0; 142dfb6f208e3f5dd7d68bcaade644aa1d1f1f0a98fWu-cheng Li int buttonHeight = 0; 14395fc5b2c5b14bb81332570f6d74f75cd63ea04b5Wu-cheng Li 144db3556078a75be0bd4a08195d90f060724034e88Chung-yih Wang boolean lastLineItem = true; 1457648319f0416b86ae13b97eeba0466581ace1a48Wu-cheng Li if (mFieldEditTexts != null) { 14622e1d11ab2e59b672885fa5f7e5f08b1a2455225Wu-cheng Li fieldHeight = mFieldEditTexts[row].getMeasuredHeight(); 14722e1d11ab2e59b672885fa5f7e5f08b1a2455225Wu-cheng Li lastLineItem = (row == mFieldEditTexts.length - 1); 148c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li } 149c5e37cbb96b8284203560c51dd5f41c705a21f58Wu-cheng Li 1508ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li // Ensure there is enough space for the more/less button 1518ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li if (row == 0) { 1528ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li final int moreOrLessHeight = mMoreOrLess != null ? mMoreOrLess.getMeasuredHeight() : 0; 153750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li buttonHeight += moreOrLessHeight; 154750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li } 155a72d73cbac59db43d413291e4db66763be08143arepo sync 15641ecefdc167ca88d785e6a1d58b706cc7f03c2bdWu-cheng Li // Ensure there is enough space for the minus button 15720b3c3526ebb8d8a6873f7a1110f23847a843515Wu-cheng Li if (lastLineItem) { 158b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project View deleteButton = getDelete(); 159c30e5c21c3858c15473427d82608c473d44bf3e4Chih-Chung Chang final int deleteHeight = (deleteButton != null) ? deleteButton.getMeasuredHeight() : 0; 160cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang buttonHeight += deleteHeight; 161cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang } 162cd972b0cd67d7a45084d9757ebd49b8f22989eddChih-Chung Chang 163b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang return Math.max(Math.max(buttonHeight, fieldHeight), super.getLineItemHeight(row)); 164b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang } 165b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang 166b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang @Override 167b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang public void setEnabled(boolean enabled) { 168b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang super.setEnabled(enabled); 169b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang 170b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang if (mFieldEditTexts != null) { 171f63366e6305e75ae289aaac20b397a3e9633d9dfHung-ying Tyan for (int index = 0; index < mFieldEditTexts.length; index++) { 1726490868a51c9b8c79f30c8d257f89adb8d26b7b9Owen Lin mFieldEditTexts[index].setEnabled(!isReadOnly() && enabled); 1736490868a51c9b8c79f30c8d257f89adb8d26b7b9Owen Lin } 1746490868a51c9b8c79f30c8d257f89adb8d26b7b9Owen Lin } 1756490868a51c9b8c79f30c8d257f89adb8d26b7b9Owen Lin if (mMoreOrLess != null) mMoreOrLess.setEnabled(!isReadOnly() && enabled); 1766490868a51c9b8c79f30c8d257f89adb8d26b7b9Owen Lin } 1776490868a51c9b8c79f30c8d257f89adb8d26b7b9Owen Lin 1786490868a51c9b8c79f30c8d257f89adb8d26b7b9Owen Lin /** 1796490868a51c9b8c79f30c8d257f89adb8d26b7b9Owen Lin * Creates or removes the type/label button. Doesn't do anything if already correctly configured 1806490868a51c9b8c79f30c8d257f89adb8d26b7b9Owen Lin */ 18149bc3fd984521c8c8eed8733d9bdd7f2ccdd9057Wu-cheng Li private void setupMoreOrLessButton(boolean shouldExist, boolean collapsed) { 18249bc3fd984521c8c8eed8733d9bdd7f2ccdd9057Wu-cheng Li if (shouldExist) { 183855b4ca04f982c7110acd81b509c955df976926fWu-cheng Li if (mMoreOrLess == null) { 1844b602592e0d189499b22d107d997b83e798b5bd9Wu-cheng Li mMoreOrLess = new ImageButton(mContext); 1854b602592e0d189499b22d107d997b83e798b5bd9Wu-cheng Li mMoreOrLess.setBackgroundResource( 18695fc5b2c5b14bb81332570f6d74f75cd63ea04b5Wu-cheng Li ThemeUtils.getSelectableItemBackground(mContext.getTheme())); 18795fc5b2c5b14bb81332570f6d74f75cd63ea04b5Wu-cheng Li final Resources resources = mContext.getResources(); 18895fc5b2c5b14bb81332570f6d74f75cd63ea04b5Wu-cheng Li mMoreOrLess.setPadding( 189b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project resources.getDimensionPixelOffset( 19049bc3fd984521c8c8eed8733d9bdd7f2ccdd9057Wu-cheng Li R.dimen.editor_round_button_padding_left), 19149bc3fd984521c8c8eed8733d9bdd7f2ccdd9057Wu-cheng Li resources.getDimensionPixelOffset( 192d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li R.dimen.editor_round_button_padding_top), 19349bc3fd984521c8c8eed8733d9bdd7f2ccdd9057Wu-cheng Li resources.getDimensionPixelOffset( 194d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li R.dimen.editor_round_button_padding_right), 19549bc3fd984521c8c8eed8733d9bdd7f2ccdd9057Wu-cheng Li resources.getDimensionPixelOffset( 196b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project R.dimen.editor_round_button_padding_bottom)); 1970e841fe509c3b61ced7ddf4bee4728b382eae62fOwen Lin mMoreOrLess.setLayoutParams( 198b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 199b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project mMoreOrLess.setOnClickListener(new OnClickListener() { 200a93a4d60eacee4e12471b45f8691c14114e113a4Wu-cheng Li @Override 201b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project public void onClick(View v) { 202bbc560b5216bbb2e3028020e426ce6a6e0e5df08Owen Lin // Save focus 2039324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li final View focusedChild = getFocusedChild(); 2049324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li final int focusedViewId = focusedChild == null ? -1 : focusedChild.getId(); 205bcd13fa071abe75b3275e3bc314601f33e33972aWu-cheng Li 206bcd13fa071abe75b3275e3bc314601f33e33972aWu-cheng Li // Reconfigure GUI 207bcd13fa071abe75b3275e3bc314601f33e33972aWu-cheng Li mHideOptional = !mHideOptional; 208bcd13fa071abe75b3275e3bc314601f33e33972aWu-cheng Li onOptionalFieldVisibilityChange(); 209e453bdb87ca7eb4e05b817774124731237a3d437Wu-cheng Li rebuildValues(); 2106eabb9b770a7c60cb92aa2e22f360754f32f39f8Wu-cheng Li 211cede87fa23b81b49786831e90a175293e9c8bc7cYu Shan Emily Lau // Restore focus 212b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project View newFocusView = findViewById(focusedViewId); 213b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project if (newFocusView == null || newFocusView.getVisibility() == GONE) { 214b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project // find first visible child 2159324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li newFocusView = TextFieldsEditorView.this; 216b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 217bcd13fa071abe75b3275e3bc314601f33e33972aWu-cheng Li newFocusView.requestFocus(); 218232700d54651dcaefb378dc22bdb008a9815d1cdWu-cheng Li } 219c8a7fc07e3b905a723e753b0c9144de2b0343f1fChia-chi Yeh }); 220edcae0ca2d9587e78cc52a58d0797d2aa28c0db9Wu-cheng Li addView(mMoreOrLess); 221b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 2220a28549a7e6db0307b2cb5d2df7444909fb03a48Chih-Chung Chang mMoreOrLess.setImageResource(collapsed 2230a28549a7e6db0307b2cb5d2df7444909fb03a48Chih-Chung Chang ? R.drawable.ic_menu_expander_minimized_holo_light 2240a28549a7e6db0307b2cb5d2df7444909fb03a48Chih-Chung Chang : R.drawable.ic_menu_expander_maximized_holo_light); 2259324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li } else if (mMoreOrLess != null) { 2269324f11afe9366cd5479828a214dc8de8696a5abWu-cheng Li removeView(mMoreOrLess); 227e6ffea291dde5adde94bf337731213e7fd3c8c56Wu-cheng Li mMoreOrLess = null; 22811cac263ec966e5a5ac751c53acb851de841c62eYu Shan Emily Lau } 229d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li } 230d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li 23118a0b5bb13b9dc9cdb01d03e901c0836742f7a3aOwen Lin @Override 232fba0439b62f19a2a19ff6559c1ae055e910400dbWu-cheng Li protected void requestFocusForFirstEditField() { 233f5e80a8a5670798d52afe08e0c15aa4448d33316Wu-cheng Li if (mFieldEditTexts != null && mFieldEditTexts.length != 0) { 2340f56ef5704b7f1a0874528367147487c051876d9Wu-cheng Li EditText firstField = null; 235bbc560b5216bbb2e3028020e426ce6a6e0e5df08Owen Lin boolean anyFieldHasFocus = false; 236ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang for (EditText editText : mFieldEditTexts) { 237dfee7f813adb8de209472d24553b860d2515ea0aWu-cheng Li if (firstField == null && editText.getVisibility() == View.VISIBLE) { 238b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project firstField = editText; 239ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang } 240ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang if (editText.hasFocus()) { 241ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang anyFieldHasFocus = true; 24259ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang break; 24359ddc8c1add2fcffe523e3877baad1b6cc5ba2fbChung-yih Wang } 244ac9d0a1ce538eb4bd50cba3b257737a05b9ac4e5Chih-Chung Chang } 2456490868a51c9b8c79f30c8d257f89adb8d26b7b9Owen Lin if (!anyFieldHasFocus && firstField != null) { 2466490868a51c9b8c79f30c8d257f89adb8d26b7b9Owen Lin firstField.requestFocus(); 2470e841fe509c3b61ced7ddf4bee4728b382eae62fOwen Lin } 2480e841fe509c3b61ced7ddf4bee4728b382eae62fOwen Lin } 2490e841fe509c3b61ced7ddf4bee4728b382eae62fOwen Lin } 2500e841fe509c3b61ced7ddf4bee4728b382eae62fOwen Lin 251b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project @Override 252b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project public void setValues(DataKind kind, ValuesDelta entry, EntityDelta state, boolean readOnly, 253b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project ViewIdGenerator vig) { 254b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project super.setValues(kind, entry, state, readOnly, vig); 255b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project // Remove edit texts that we currently have 2560e841fe509c3b61ced7ddf4bee4728b382eae62fOwen Lin if (mFieldEditTexts != null) { 2570e841fe509c3b61ced7ddf4bee4728b382eae62fOwen Lin for (EditText fieldEditText : mFieldEditTexts) { 258b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project removeView(fieldEditText); 259b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project } 260e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li } 261e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li boolean hidePossible = false; 262e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li 263e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li int fieldCount = kind.fieldList.size(); 264e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li mFieldEditTexts = new EditText[fieldCount]; 2651de0469fa91cee8ed0771d020042cc82576a601cChih-Chung Chang for (int index = 0; index < fieldCount; index++) { 2661de0469fa91cee8ed0771d020042cc82576a601cChih-Chung Chang final EditField field = kind.fieldList.get(index); 267ee1cf3f0509987e9c76626077bd8117399311cedChih-Chung Chang final EditText fieldView = new EditText(mContext); 2681de0469fa91cee8ed0771d020042cc82576a601cChih-Chung Chang fieldView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 2691de0469fa91cee8ed0771d020042cc82576a601cChih-Chung Chang LayoutParams.WRAP_CONTENT)); 270232700d54651dcaefb378dc22bdb008a9815d1cdWu-cheng Li fieldView.setGravity(Gravity.TOP); 271232700d54651dcaefb378dc22bdb008a9815d1cdWu-cheng Li if (mEditorTextSize != 0) { 272232700d54651dcaefb378dc22bdb008a9815d1cdWu-cheng Li fieldView.setTextSize(mEditorTextSize); 273232700d54651dcaefb378dc22bdb008a9815d1cdWu-cheng Li } 274232700d54651dcaefb378dc22bdb008a9815d1cdWu-cheng Li mFieldEditTexts[index] = fieldView; 275232700d54651dcaefb378dc22bdb008a9815d1cdWu-cheng Li fieldView.setId(vig.getId(state, kind, entry, index)); 276232700d54651dcaefb378dc22bdb008a9815d1cdWu-cheng Li if (field.titleRes > 0) { 277232700d54651dcaefb378dc22bdb008a9815d1cdWu-cheng Li fieldView.setHint(field.titleRes); 278232700d54651dcaefb378dc22bdb008a9815d1cdWu-cheng Li } 27984a4d3eb7c9a3e33e1898729a66671332fe81577Wu-cheng Li int inputType = field.inputType; 280232700d54651dcaefb378dc22bdb008a9815d1cdWu-cheng Li fieldView.setInputType(inputType); 281232700d54651dcaefb378dc22bdb008a9815d1cdWu-cheng Li if (inputType == InputType.TYPE_CLASS_PHONE) { 282232700d54651dcaefb378dc22bdb008a9815d1cdWu-cheng Li fieldView.addTextChangedListener(new PhoneNumberFormattingTextWatcher( 283232700d54651dcaefb378dc22bdb008a9815d1cdWu-cheng Li ContactsUtils.getCurrentCountryIso(mContext))); 284232700d54651dcaefb378dc22bdb008a9815d1cdWu-cheng Li } 285232700d54651dcaefb378dc22bdb008a9815d1cdWu-cheng Li fieldView.setMinLines(field.minLines); 2863958d6c215643953fced0b857c4c6e20e848e093Wu-cheng Li 28754fcae5227535ae6960d2cea4fe83b9ee848249eWu-cheng Li // Read current value from state 28854fcae5227535ae6960d2cea4fe83b9ee848249eWu-cheng Li final String column = field.column; 28954fcae5227535ae6960d2cea4fe83b9ee848249eWu-cheng Li final String value = entry.getAsString(column); 29054fcae5227535ae6960d2cea4fe83b9ee848249eWu-cheng Li fieldView.setText(value); 29154fcae5227535ae6960d2cea4fe83b9ee848249eWu-cheng Li 29298d615769af2b08bcddf02ee1b11f5288ec5cf92Wu-cheng Li // Prepare listener for writing changes 29398d615769af2b08bcddf02ee1b11f5288ec5cf92Wu-cheng Li fieldView.addTextChangedListener(new TextWatcher() { 29498d615769af2b08bcddf02ee1b11f5288ec5cf92Wu-cheng Li @Override 29598d615769af2b08bcddf02ee1b11f5288ec5cf92Wu-cheng Li public void afterTextChanged(Editable s) { 29698d615769af2b08bcddf02ee1b11f5288ec5cf92Wu-cheng Li // Trigger event for newly changed value 29798d615769af2b08bcddf02ee1b11f5288ec5cf92Wu-cheng Li onFieldChanged(column, s.toString()); 29898d615769af2b08bcddf02ee1b11f5288ec5cf92Wu-cheng Li } 299e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li 300e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li @Override 301e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li public void beforeTextChanged(CharSequence s, int start, int count, int after) { 302e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li } 30359b5974a4ae078eb7628fd855db89e5be9b0fe6fOwen Lin 304f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin @Override 305f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin public void onTextChanged(CharSequence s, int start, int before, int count) { 306f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin } 307f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin }); 308f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin 3094714a1cf1d211aad2d8cf1802f85f649e744beb0Wu-cheng Li fieldView.setEnabled(isEnabled() && !readOnly); 310ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang 311ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang if (field.shortForm) { 312842b44f24ab621122183a149e20a852e5d8e0200Wu-cheng Li hidePossible = true; 313f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin mHasShortAndLongForms = true; 31459b5974a4ae078eb7628fd855db89e5be9b0fe6fOwen Lin fieldView.setVisibility(mHideOptional ? View.VISIBLE : View.GONE); 31559b5974a4ae078eb7628fd855db89e5be9b0fe6fOwen Lin } else if (field.longForm) { 3166d68a36b5da24f70e1a8d5e9529720eeb8ce6d86Ray Chen hidePossible = true; 3176d68a36b5da24f70e1a8d5e9529720eeb8ce6d86Ray Chen mHasShortAndLongForms = true; 3186d68a36b5da24f70e1a8d5e9529720eeb8ce6d86Ray Chen fieldView.setVisibility(mHideOptional ? View.GONE : View.VISIBLE); 3196d68a36b5da24f70e1a8d5e9529720eeb8ce6d86Ray Chen } else { 3206d68a36b5da24f70e1a8d5e9529720eeb8ce6d86Ray Chen // Hide field when empty and optional value 3216d68a36b5da24f70e1a8d5e9529720eeb8ce6d86Ray Chen final boolean couldHide = (!ContactsUtils.isGraphic(value) && field.optional); 3226d68a36b5da24f70e1a8d5e9529720eeb8ce6d86Ray Chen final boolean willHide = (mHideOptional && couldHide); 3236d68a36b5da24f70e1a8d5e9529720eeb8ce6d86Ray Chen fieldView.setVisibility(willHide ? View.GONE : View.VISIBLE); 3246d68a36b5da24f70e1a8d5e9529720eeb8ce6d86Ray Chen hidePossible = hidePossible || couldHide; 3256d68a36b5da24f70e1a8d5e9529720eeb8ce6d86Ray Chen } 3266cc6daff9d7cb02805cd9ce71176c7b49655f8a8Wu-cheng Li 3276cc6daff9d7cb02805cd9ce71176c7b49655f8a8Wu-cheng Li addView(fieldView); 3286cc6daff9d7cb02805cd9ce71176c7b49655f8a8Wu-cheng Li } 329522e836abc90bcb2d4e7a4ac37e269154d06c715Chih-Chung Chang 330137417dade91f8a98cefa655cbd0d48b8cf52af1Chih-Chung Chang // When hiding fields, place expandable 331e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li setupMoreOrLessButton(hidePossible, mHideOptional); 332e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li if (mMoreOrLess != null) mMoreOrLess.setEnabled(!readOnly && isEnabled()); 333e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li } 3344aaa2130af7241f128ee561cafd17a4fb560b92cWu-cheng Li 335e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li /** 336e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li * Returns true if the editor is currently configured to show optional fields. 337e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li */ 338a93a4d60eacee4e12471b45f8691c14114e113a4Wu-cheng Li public boolean areOptionalFieldsVisible() { 339a9c2f922763d3f7d19c237f9c5bd46611b5076fdWu-cheng Li return !mHideOptional; 340b0c6bcf47a8ca1c096d98ebebd33a821dd483585Chih-yu Huang } 341a93a4d60eacee4e12471b45f8691c14114e113a4Wu-cheng Li 342e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li public boolean hasShortAndLongForms() { 3436d68a36b5da24f70e1a8d5e9529720eeb8ce6d86Ray Chen return mHasShortAndLongForms; 344d12ae2098b491bb55798758da8b698ffc625d62cWu-cheng Li } 345d12ae2098b491bb55798758da8b698ffc625d62cWu-cheng Li 346e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li /** 347e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li * Populates the bound rectangle with the bounds of the last editor field inside this view. 3488ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li */ 3499f73bd9a85d295091fae39dc256a122e1843e2e8Wu-cheng Li public void acquireEditorBounds(Rect bounds) { 350b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project if (mFieldEditTexts != null) { 351e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li for (int i = mFieldEditTexts.length; --i >= 0;) { 352e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li EditText editText = mFieldEditTexts[i]; 353dad4b187eec436a2716aca5af31f23ce5de95f39Owen Lin if (editText.getVisibility() == View.VISIBLE) { 354059daa36dc6e83ca24a16d9b99925e71010bccebOwen Lin bounds.set(editText.getLeft(), editText.getTop(), editText.getRight(), 355e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li editText.getBottom()); 356e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li return; 35722e1d11ab2e59b672885fa5f7e5f08b1a2455225Wu-cheng Li } 35818c1ad898f3fddcd321af7ffbb32416a1b32f323Wu-cheng Li } 35922e1d11ab2e59b672885fa5f7e5f08b1a2455225Wu-cheng Li } 36020b3c3526ebb8d8a6873f7a1110f23847a843515Wu-cheng Li } 36120b3c3526ebb8d8a6873f7a1110f23847a843515Wu-cheng Li 362d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li /** 363a959d05b52ac4b27dcdfe3d3a4e72220cf69d47aWei-Ta Chen * Saves the visibility of the child EditTexts, and mHideOptional. 364e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li */ 36533be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin @Override 36654fcae5227535ae6960d2cea4fe83b9ee848249eWu-cheng Li protected Parcelable onSaveInstanceState() { 367838e6e75fdcb1946deef2fae276c03f2cb00e596Wu-cheng Li Parcelable superState = super.onSaveInstanceState(); 36854fcae5227535ae6960d2cea4fe83b9ee848249eWu-cheng Li SavedState ss = new SavedState(superState); 36954fcae5227535ae6960d2cea4fe83b9ee848249eWu-cheng Li 37054fcae5227535ae6960d2cea4fe83b9ee848249eWu-cheng Li ss.mHideOptional = mHideOptional; 37154fcae5227535ae6960d2cea4fe83b9ee848249eWu-cheng Li 37254fcae5227535ae6960d2cea4fe83b9ee848249eWu-cheng Li final int numChildren = mFieldEditTexts == null ? 0 : mFieldEditTexts.length; 37333be45a1abaf6a8d611fb87b18945c84ab76c229Owen Lin ss.mVisibilities = new int[numChildren]; 374f86e6af0b8833f5f8a4b03fefba54b1922280d28Chih-Chung Chang for (int i = 0; i < numChildren; i++) { 375f86e6af0b8833f5f8a4b03fefba54b1922280d28Chih-Chung Chang ss.mVisibilities[i] = mFieldEditTexts[i].getVisibility(); 376f86e6af0b8833f5f8a4b03fefba54b1922280d28Chih-Chung Chang } 377f86e6af0b8833f5f8a4b03fefba54b1922280d28Chih-Chung Chang 378cdf69cba3617c446e4fe9a92b4b4199c6ed36d01Owen Lin return ss; 379f86e6af0b8833f5f8a4b03fefba54b1922280d28Chih-Chung Chang } 380f86e6af0b8833f5f8a4b03fefba54b1922280d28Chih-Chung Chang 381d1ec4e36667086836cd243bee38aded5e1fd88b1Chia-chi Yeh /** 382f86e6af0b8833f5f8a4b03fefba54b1922280d28Chih-Chung Chang * Restores the visibility of the child EditTexts, and mHideOptional. 383f86e6af0b8833f5f8a4b03fefba54b1922280d28Chih-Chung Chang */ 384f86e6af0b8833f5f8a4b03fefba54b1922280d28Chih-Chung Chang @Override 385e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li protected void onRestoreInstanceState(Parcelable state) { 386e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li SavedState ss = (SavedState) state; 3879f73bd9a85d295091fae39dc256a122e1843e2e8Wu-cheng Li super.onRestoreInstanceState(ss.getSuperState()); 3888ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li 389da7b4ed9303499c4449c7069461db42ff37e3e3fWu-cheng Li mHideOptional = ss.mHideOptional; 3908ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li 3919f73bd9a85d295091fae39dc256a122e1843e2e8Wu-cheng Li int numChildren = Math.min(mFieldEditTexts.length, ss.mVisibilities.length); 3929f73bd9a85d295091fae39dc256a122e1843e2e8Wu-cheng Li for (int i = 0; i < numChildren; i++) { 393547caa3586633adcaddfbe766ec46a0b97ee8d4crepo sync mFieldEditTexts[i].setVisibility(ss.mVisibilities[i]); 394d12ae2098b491bb55798758da8b698ffc625d62cWu-cheng Li } 3958ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li } 3968ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li 397382b51fa8f512d7f5d5163715eeb85bbfd0a02c7Wu-cheng Li private static class SavedState extends BaseSavedState { 3988ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li public boolean mHideOptional; 3998ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li public int[] mVisibilities; 400750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li 4018ab2b624d51b3b8254ece98c46a7e22a6fb5d4aaWu-cheng Li SavedState(Parcelable superState) { 402750173a4d20f1e8d6607edb3ada6be5166d0cd82Wu-cheng Li super(superState); 403547caa3586633adcaddfbe766ec46a0b97ee8d4crepo sync } 4049f73bd9a85d295091fae39dc256a122e1843e2e8Wu-cheng Li 4059f73bd9a85d295091fae39dc256a122e1843e2e8Wu-cheng Li private SavedState(Parcel in) { 406e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li super(in); 407e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li mVisibilities = new int[in.readInt()]; 408522e836abc90bcb2d4e7a4ac37e269154d06c715Chih-Chung Chang in.readIntArray(mVisibilities); 409e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li } 410e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li 411e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li @Override 412e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li public void writeToParcel(Parcel out, int flags) { 413e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li super.writeToParcel(out, flags); 414a93a4d60eacee4e12471b45f8691c14114e113a4Wu-cheng Li out.writeInt(mVisibilities.length); 4150d73bccf89870682007dd32d4a84bcdb812e2cc7Owen Lin out.writeIntArray(mVisibilities); 416a93a4d60eacee4e12471b45f8691c14114e113a4Wu-cheng Li } 417e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li 418e43adb123b34432b977f57943c3c42614ccfd985Wu-cheng Li @SuppressWarnings({"unused", "hiding" }) 419d480002ccad05cf992c628c72884091c36cc654cWu-cheng Li public static final Parcelable.Creator<SavedState> CREATOR 420f1672b4a703ea7600f17f451f6632f1cd399e839Owen Lin = new Parcelable.Creator<SavedState>() { 4216d68a36b5da24f70e1a8d5e9529720eeb8ce6d86Ray Chen @Override 422d12ae2098b491bb55798758da8b698ffc625d62cWu-cheng Li public SavedState createFromParcel(Parcel in) { 4231324c7a05149ffa07a2b1339d1bc9bdff862e77eWu-cheng Li return new SavedState(in); 424d12ae2098b491bb55798758da8b698ffc625d62cWu-cheng Li } 425547caa3586633adcaddfbe766ec46a0b97ee8d4crepo sync 426547caa3586633adcaddfbe766ec46a0b97ee8d4crepo sync @Override 427a72d73cbac59db43d413291e4db66763be08143arepo sync public SavedState[] newArray(int size) { 428547caa3586633adcaddfbe766ec46a0b97ee8d4crepo sync return new SavedState[size]; 429937fc48b37fafe3ffc8f4b52bd9a171bbb4d3a37Owen Lin } 430b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project }; 431ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang } 432ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang} 433ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang