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