1f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang/*
2f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang * Copyright (C) 2015 The Android Open Source Project
3f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang *
4f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang * Licensed under the Apache License, Version 2.0 (the "License");
5f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang * you may not use this file except in compliance with the License.
6f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang * You may obtain a copy of the License at
7f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang *
8f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang *      http://www.apache.org/licenses/LICENSE-2.0
9f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang *
10f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang * Unless required by applicable law or agreed to in writing, software
11f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang * distributed under the License is distributed on an "AS IS" BASIS,
12f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang * See the License for the specific language governing permissions and
14f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang * limitations under the License.
15f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang */
16f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
17f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangpackage com.android.contacts.editor;
18f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
19f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangimport android.content.Context;
20f10ca15ffa550b36805d2330fc210b58601a215cWalter Jangimport android.database.Cursor;
214f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jangimport android.provider.ContactsContract.CommonDataKinds.Event;
22f10ca15ffa550b36805d2330fc210b58601a215cWalter Jangimport android.provider.ContactsContract.CommonDataKinds.GroupMembership;
234f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jangimport android.provider.ContactsContract.CommonDataKinds.Nickname;
243e5ae0db65e842d49d047568fb5d6f331298da32Walter Jangimport android.provider.ContactsContract.CommonDataKinds.StructuredName;
25f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangimport android.util.AttributeSet;
26f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangimport android.view.LayoutInflater;
27f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangimport android.view.View;
28f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangimport android.view.ViewGroup;
29f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangimport android.widget.ImageView;
30f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangimport android.widget.LinearLayout;
311ee24ed873b91e1fe65dba2b122749fa1684e59dWalter Jangimport android.widget.TextView;
32f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
3398868d33107de0dd539441e80e94b856f2269057Gary Maiimport com.android.contacts.R;
3469c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.RawContactDelta;
3569c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.RawContactModifier;
3669c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.ValuesDelta;
3769c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.account.AccountType;
3869c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.dataitem.DataKind;
39bf9dddc9e9228478d1c49287271cb757d158a2f3avipulimport com.android.contacts.preference.ContactsPreferences;
4098868d33107de0dd539441e80e94b856f2269057Gary Mai
41f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangimport java.util.ArrayList;
42f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangimport java.util.List;
43f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
44f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang/**
4565971d0f87dbee0b5ff93a7d64cdaab0940f56f5Gary Mai * Custom view for an entire section of data as segmented by
4665971d0f87dbee0b5ff93a7d64cdaab0940f56f5Gary Mai * {@link DataKind} around a {@link Data#MIMETYPE}. This view shows a
4765971d0f87dbee0b5ff93a7d64cdaab0940f56f5Gary Mai * section header and a trigger for adding new {@link Data} rows.
48f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang */
49363af60ea23e5a3b945005712a16564ab69db18bGary Maipublic class KindSectionView extends LinearLayout {
50f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
513e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang    /**
523e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang     * Marks a name as super primary when it is changed.
533e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang     *
543e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang     * This is for the case when two or more raw contacts with names are joined where neither is
5579658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang     * marked as super primary.
563e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang     */
5779658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang    private static final class StructuredNameEditorListener implements Editor.EditorListener {
583e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang
593e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang        private final ValuesDelta mValuesDelta;
603e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang        private final long mRawContactId;
61363af60ea23e5a3b945005712a16564ab69db18bGary Mai        private final RawContactEditorView.Listener mListener;
623e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang
6379658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        public StructuredNameEditorListener(ValuesDelta valuesDelta, long rawContactId,
64363af60ea23e5a3b945005712a16564ab69db18bGary Mai                RawContactEditorView.Listener listener) {
653e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang            mValuesDelta = valuesDelta;
663e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang            mRawContactId = rawContactId;
673e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang            mListener = listener;
683e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang        }
693e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang
703e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang        @Override
713e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang        public void onRequest(int request) {
723e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang            if (request == Editor.EditorListener.FIELD_CHANGED) {
733e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang                mValuesDelta.setSuperPrimary(true);
743e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang                if (mListener != null) {
753e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang                    mListener.onNameFieldChanged(mRawContactId, mValuesDelta);
763e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang                }
773e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang            } else if (request == Editor.EditorListener.FIELD_TURNED_EMPTY) {
783e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang                mValuesDelta.setSuperPrimary(false);
793e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang            }
803e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang        }
813e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang
823e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang        @Override
833e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang        public void onDeleteRequested(Editor editor) {
84192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang            editor.clearAllFields();
853e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang        }
863e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang    }
873e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang
8879658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang    /**
8979658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang     * Clears fields when deletes are requested (on phonetic and nickename fields);
9079658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang     * does not change the number of editors.
9179658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang     */
9279658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang    private static final class OtherNameKindEditorListener implements Editor.EditorListener {
93192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang
94192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        @Override
95192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        public void onRequest(int request) {
96192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        }
97192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang
98192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        @Override
99192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        public void onDeleteRequested(Editor editor) {
100192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang            editor.clearAllFields();
101192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        }
102192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang    }
103f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
10479658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang    /**
10579658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang     * Updates empty fields when fields are deleted or turns empty.
10679658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang     * Whether a new empty editor is added is controlled by {@link #setShowOneEmptyEditor} and
10779658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang     * {@link #setHideWhenEmpty}.
10879658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang     */
1092da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang    private class NonNameEditorListener implements Editor.EditorListener {
11079658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang
11179658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        @Override
11279658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        public void onRequest(int request) {
11379658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            // If a field has become empty or non-empty, then check if another row
11479658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            // can be added dynamically.
11579658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            if (request == FIELD_TURNED_EMPTY || request == FIELD_TURNED_NON_EMPTY) {
11679658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang                updateEmptyEditors(/* shouldAnimate = */ true);
11779658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            }
11879658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        }
11979658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang
12079658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        @Override
12179658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        public void onDeleteRequested(Editor editor) {
12279658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            if (mShowOneEmptyEditor && mEditors.getChildCount() == 1) {
12379658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang                // If there is only 1 editor in the section, then don't allow the user to
12479658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang                // delete it.  Just clear the fields in the editor.
12579658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang                editor.clearAllFields();
12679658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            } else {
12779658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang                editor.deleteEditor();
12879658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            }
12979658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        }
13079658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang    }
13179658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang
1322da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang    private class EventEditorListener extends NonNameEditorListener {
1332da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang
1342da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang        @Override
1352da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang        public void onRequest(int request) {
1362da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang            super.onRequest(request);
1372da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang        }
1382da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang
1392da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang        @Override
1402da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang        public void onDeleteRequested(Editor editor) {
1412da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang            if (editor instanceof EventFieldEditorView){
1422da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang                final EventFieldEditorView delView = (EventFieldEditorView) editor;
1432da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang                if (delView.isBirthdayType() && mEditors.getChildCount() > 1) {
1442da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang                    final EventFieldEditorView bottomView = (EventFieldEditorView) mEditors
1452da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang                            .getChildAt(mEditors.getChildCount() - 1);
1462da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang                    bottomView.restoreBirthday();
1472da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang                }
1482da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang            }
1492da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang            super.onDeleteRequested(editor);
1502da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang        }
1512da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang    }
1522da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang
15398868d33107de0dd539441e80e94b856f2269057Gary Mai    private KindSectionData mKindSectionData;
1543e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang    private ViewIdGenerator mViewIdGenerator;
155363af60ea23e5a3b945005712a16564ab69db18bGary Mai    private RawContactEditorView.Listener mListener;
1563e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang
15745b86d5e83a7d6eca4abe5cdfece2e9050b1809cWalter Jang    private boolean mIsUserProfile;
158f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    private boolean mShowOneEmptyEditor = false;
159f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    private boolean mHideIfEmpty = true;
160f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
16179658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang    private LayoutInflater mLayoutInflater;
162192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang    private ViewGroup mEditors;
163192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang    private ImageView mIcon;
164f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
165363af60ea23e5a3b945005712a16564ab69db18bGary Mai    public KindSectionView(Context context) {
1663e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang        this(context, /* attrs =*/ null);
167f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    }
168f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
169363af60ea23e5a3b945005712a16564ab69db18bGary Mai    public KindSectionView(Context context, AttributeSet attrs) {
170f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        super(context, attrs);
171f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    }
172f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
173f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    @Override
174f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    public void setEnabled(boolean enabled) {
175f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        super.setEnabled(enabled);
176f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        if (mEditors != null) {
177f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            int childCount = mEditors.getChildCount();
178f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            for (int i = 0; i < childCount; i++) {
179f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang                mEditors.getChildAt(i).setEnabled(enabled);
180f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            }
181f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        }
182f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    }
183f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
184f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    @Override
185f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    protected void onFinishInflate() {
18665971d0f87dbee0b5ff93a7d64cdaab0940f56f5Gary Mai        super.onFinishInflate();
187f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        setDrawingCacheEnabled(true);
188f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        setAlwaysDrawnWithCacheEnabled(true);
189f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
19079658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        mLayoutInflater = (LayoutInflater) getContext().getSystemService(
19179658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang                Context.LAYOUT_INFLATER_SERVICE);
192f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
193f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        mEditors = (ViewGroup) findViewById(R.id.kind_editors);
194f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        mIcon = (ImageView) findViewById(R.id.kind_icon);
195f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    }
196f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
19745b86d5e83a7d6eca4abe5cdfece2e9050b1809cWalter Jang    public void setIsUserProfile(boolean isUserProfile) {
19845b86d5e83a7d6eca4abe5cdfece2e9050b1809cWalter Jang        mIsUserProfile = isUserProfile;
19945b86d5e83a7d6eca4abe5cdfece2e9050b1809cWalter Jang    }
20045b86d5e83a7d6eca4abe5cdfece2e9050b1809cWalter Jang
201f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    /**
202192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang     * @param showOneEmptyEditor If true, we will always show one empty editor, otherwise an empty
20379658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang     *         editor will not be shown until the user enters a value.  Note, this does not apply
20479658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang     *         to name editors since those are always displayed.
205f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang     */
206f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    public void setShowOneEmptyEditor(boolean showOneEmptyEditor) {
207f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        mShowOneEmptyEditor = showOneEmptyEditor;
208f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    }
209f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
210f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    /**
211f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang     * @param hideWhenEmpty If true, the entire section will be hidden if all inputs are empty,
21279658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang     *         otherwise one empty input will always be displayed.  Note, this does not apply
21379658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang     *         to name editors since those are always displayed.
214f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang     */
215f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    public void setHideWhenEmpty(boolean hideWhenEmpty) {
216f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        mHideIfEmpty = hideWhenEmpty;
217f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    }
218f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
21979658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang    /** Binds the given group data to every {@link GroupMembershipView}. */
220f10ca15ffa550b36805d2330fc210b58601a215cWalter Jang    public void setGroupMetaData(Cursor cursor) {
221f10ca15ffa550b36805d2330fc210b58601a215cWalter Jang        for (int i = 0; i < mEditors.getChildCount(); i++) {
222f10ca15ffa550b36805d2330fc210b58601a215cWalter Jang            final View view = mEditors.getChildAt(i);
223f10ca15ffa550b36805d2330fc210b58601a215cWalter Jang            if (view instanceof GroupMembershipView) {
224f10ca15ffa550b36805d2330fc210b58601a215cWalter Jang                ((GroupMembershipView) view).setGroupMetaData(cursor);
225f10ca15ffa550b36805d2330fc210b58601a215cWalter Jang            }
226f10ca15ffa550b36805d2330fc210b58601a215cWalter Jang        }
227f10ca15ffa550b36805d2330fc210b58601a215cWalter Jang    }
228f10ca15ffa550b36805d2330fc210b58601a215cWalter Jang
22979658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang    /**
2304f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang     * Whether this is a name kind section view and all name fields (structured, phonetic,
2314f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang     * and nicknames) are empty.
2324f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang     */
2334f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang    public boolean isEmptyName() {
23498868d33107de0dd539441e80e94b856f2269057Gary Mai        if (!StructuredName.CONTENT_ITEM_TYPE.equals(mKindSectionData.getMimeType())) {
2354f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang            return false;
2364f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang        }
2374f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang        for (int i = 0; i < mEditors.getChildCount(); i++) {
2384f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang            final View view = mEditors.getChildAt(i);
2394f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang            if (view instanceof Editor) {
2404f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                final Editor editor = (Editor) view;
2414f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                if (!editor.isEmpty()) {
2424f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                    return false;
2434f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                }
2444f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang            }
2454f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang        }
2464f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang        return true;
2474f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang    }
2484f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang
249698cee7d410f06b0c883c11f53481bfa5b2b787aGary Mai    public StructuredNameEditorView getNameEditorView() {
25098868d33107de0dd539441e80e94b856f2269057Gary Mai        if (!StructuredName.CONTENT_ITEM_TYPE.equals(mKindSectionData.getMimeType())
2514f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang            || mEditors.getChildCount() == 0) {
2524f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang            return null;
2534f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang        }
2544f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang        return (StructuredNameEditorView) mEditors.getChildAt(0);
2554f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang    }
2564f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang
2574f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang    /**
25898868d33107de0dd539441e80e94b856f2269057Gary Mai     * Binds views for the given {@link KindSectionData}.
25979658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang     *
26079658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang     * We create a structured name and phonetic name editor for each {@link DataKind} with a
2614f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang     * {@link StructuredName#CONTENT_ITEM_TYPE} mime type.  The number and order of editors are
26279658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang     * rendered as they are given to {@link #setState}.
26379658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang     *
26479658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang     * Empty name editors are never added and at least one structured name editor is always
26579658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang     * displayed, even if it is empty.
26679658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang     */
26798868d33107de0dd539441e80e94b856f2269057Gary Mai    public void setState(KindSectionData kindSectionData,
268363af60ea23e5a3b945005712a16564ab69db18bGary Mai            ViewIdGenerator viewIdGenerator, RawContactEditorView.Listener listener) {
26998868d33107de0dd539441e80e94b856f2269057Gary Mai        mKindSectionData = kindSectionData;
270f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        mViewIdGenerator = viewIdGenerator;
2713e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang        mListener = listener;
272f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
27398868d33107de0dd539441e80e94b856f2269057Gary Mai        // Set the icon using the DataKind
27498868d33107de0dd539441e80e94b856f2269057Gary Mai        final DataKind dataKind = mKindSectionData.getDataKind();
275f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        if (dataKind != null) {
276f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            mIcon.setImageDrawable(EditorUiUtils.getMimeTypeDrawable(getContext(),
277f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang                    dataKind.mimeType));
27879658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            if (mIcon.getDrawable() != null) {
27979658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang                mIcon.setContentDescription(dataKind.titleRes == -1 || dataKind.titleRes == 0
28079658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang                        ? "" : getResources().getString(dataKind.titleRes));
28179658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            }
282f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        }
283f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
284698cee7d410f06b0c883c11f53481bfa5b2b787aGary Mai        rebuildFromState();
28579658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang
286f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        updateEmptyEditors(/* shouldAnimate = */ false);
287f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    }
288f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
289698cee7d410f06b0c883c11f53481bfa5b2b787aGary Mai    private void rebuildFromState() {
290f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        mEditors.removeAllViews();
291f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
29298868d33107de0dd539441e80e94b856f2269057Gary Mai        final String mimeType = mKindSectionData.getMimeType();
29398868d33107de0dd539441e80e94b856f2269057Gary Mai        if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) {
29498868d33107de0dd539441e80e94b856f2269057Gary Mai            addNameEditorViews(mKindSectionData.getAccountType(),
295698cee7d410f06b0c883c11f53481bfa5b2b787aGary Mai                    mKindSectionData.getRawContactDelta());
29698868d33107de0dd539441e80e94b856f2269057Gary Mai        } else if (GroupMembership.CONTENT_ITEM_TYPE.equals(mimeType)) {
29798868d33107de0dd539441e80e94b856f2269057Gary Mai            addGroupEditorView(mKindSectionData.getRawContactDelta(),
29898868d33107de0dd539441e80e94b856f2269057Gary Mai                    mKindSectionData.getDataKind());
29998868d33107de0dd539441e80e94b856f2269057Gary Mai        } else {
30098868d33107de0dd539441e80e94b856f2269057Gary Mai            final Editor.EditorListener editorListener;
30198868d33107de0dd539441e80e94b856f2269057Gary Mai            if (Nickname.CONTENT_ITEM_TYPE.equals(mimeType)) {
30298868d33107de0dd539441e80e94b856f2269057Gary Mai                editorListener = new OtherNameKindEditorListener();
30398868d33107de0dd539441e80e94b856f2269057Gary Mai            } else if (Event.CONTENT_ITEM_TYPE.equals(mimeType)) {
30498868d33107de0dd539441e80e94b856f2269057Gary Mai                editorListener = new EventEditorListener();
3053e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang            } else {
30698868d33107de0dd539441e80e94b856f2269057Gary Mai                editorListener = new NonNameEditorListener();
30798868d33107de0dd539441e80e94b856f2269057Gary Mai            }
30898868d33107de0dd539441e80e94b856f2269057Gary Mai            final List<ValuesDelta> valuesDeltas = mKindSectionData.getVisibleValuesDeltas();
30998868d33107de0dd539441e80e94b856f2269057Gary Mai            for (int i = 0; i < valuesDeltas.size(); i++ ) {
31098868d33107de0dd539441e80e94b856f2269057Gary Mai                addNonNameEditorView(mKindSectionData.getRawContactDelta(),
31198868d33107de0dd539441e80e94b856f2269057Gary Mai                        mKindSectionData.getDataKind(), valuesDeltas.get(i), editorListener);
312f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            }
313f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        }
314f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    }
315f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
316698cee7d410f06b0c883c11f53481bfa5b2b787aGary Mai    private void addNameEditorViews(AccountType accountType, RawContactDelta rawContactDelta) {
317192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        final boolean readOnly = !accountType.areContactsWritable();
318698cee7d410f06b0c883c11f53481bfa5b2b787aGary Mai        final ValuesDelta nameValuesDelta = rawContactDelta
319698cee7d410f06b0c883c11f53481bfa5b2b787aGary Mai                .getSuperPrimaryEntry(StructuredName.CONTENT_ITEM_TYPE);
320192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang
3211ee24ed873b91e1fe65dba2b122749fa1684e59dWalter Jang        if (readOnly) {
32282acd42c04554bd565c42e0a6674159d6887e1feWalter Jang            final View nameView = mLayoutInflater.inflate(
32382acd42c04554bd565c42e0a6674159d6887e1feWalter Jang                    R.layout.structured_name_readonly_editor_view, mEditors,
32482acd42c04554bd565c42e0a6674159d6887e1feWalter Jang                    /* attachToRoot =*/ false);
32582acd42c04554bd565c42e0a6674159d6887e1feWalter Jang
32682acd42c04554bd565c42e0a6674159d6887e1feWalter Jang            // Display name
32782acd42c04554bd565c42e0a6674159d6887e1feWalter Jang            ((TextView) nameView.findViewById(R.id.display_name))
328698cee7d410f06b0c883c11f53481bfa5b2b787aGary Mai                    .setText(nameValuesDelta.getDisplayName());
32982acd42c04554bd565c42e0a6674159d6887e1feWalter Jang
33082acd42c04554bd565c42e0a6674159d6887e1feWalter Jang            // Account type info
33182acd42c04554bd565c42e0a6674159d6887e1feWalter Jang            final LinearLayout accountTypeLayout = (LinearLayout)
33282acd42c04554bd565c42e0a6674159d6887e1feWalter Jang                    nameView.findViewById(R.id.account_type);
33382acd42c04554bd565c42e0a6674159d6887e1feWalter Jang            accountTypeLayout.setVisibility(View.VISIBLE);
33482acd42c04554bd565c42e0a6674159d6887e1feWalter Jang            ((ImageView) accountTypeLayout.findViewById(R.id.account_type_icon))
33582acd42c04554bd565c42e0a6674159d6887e1feWalter Jang                    .setImageDrawable(accountType.getDisplayIcon(getContext()));
33682acd42c04554bd565c42e0a6674159d6887e1feWalter Jang            ((TextView) accountTypeLayout.findViewById(R.id.account_type_name))
33782acd42c04554bd565c42e0a6674159d6887e1feWalter Jang                    .setText(accountType.getDisplayLabel(getContext()));
33882acd42c04554bd565c42e0a6674159d6887e1feWalter Jang
33982acd42c04554bd565c42e0a6674159d6887e1feWalter Jang            mEditors.addView(nameView);
3401ee24ed873b91e1fe65dba2b122749fa1684e59dWalter Jang            return;
3411ee24ed873b91e1fe65dba2b122749fa1684e59dWalter Jang        }
3421ee24ed873b91e1fe65dba2b122749fa1684e59dWalter Jang
343192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        // Structured name
34479658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        final StructuredNameEditorView nameView = (StructuredNameEditorView) mLayoutInflater
34579658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang                .inflate(R.layout.structured_name_editor_view, mEditors, /* attachToRoot =*/ false);
34645b86d5e83a7d6eca4abe5cdfece2e9050b1809cWalter Jang        if (!mIsUserProfile) {
34745b86d5e83a7d6eca4abe5cdfece2e9050b1809cWalter Jang            // Don't set super primary for the me contact
34845b86d5e83a7d6eca4abe5cdfece2e9050b1809cWalter Jang            nameView.setEditorListener(new StructuredNameEditorListener(
349698cee7d410f06b0c883c11f53481bfa5b2b787aGary Mai                    nameValuesDelta, rawContactDelta.getRawContactId(), mListener));
35045b86d5e83a7d6eca4abe5cdfece2e9050b1809cWalter Jang        }
351192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        nameView.setDeletable(false);
352bf9dddc9e9228478d1c49287271cb757d158a2f3avipul        nameView.setValues(accountType.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_NAME),
353698cee7d410f06b0c883c11f53481bfa5b2b787aGary Mai                nameValuesDelta, rawContactDelta, /* readOnly =*/ false, mViewIdGenerator);
354192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang
35579658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        // Correct start margin since there is a second icon in the structured name layout
356192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        nameView.findViewById(R.id.kind_icon).setVisibility(View.GONE);
357192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        mEditors.addView(nameView);
358192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang
359192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        // Phonetic name
360cf7f295a05bd356ea8715ea456fbe5f6ced9d823Marcus Hagerott        final DataKind phoneticNameKind = accountType
361cf7f295a05bd356ea8715ea456fbe5f6ced9d823Marcus Hagerott                .getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME);
362cf7f295a05bd356ea8715ea456fbe5f6ced9d823Marcus Hagerott        // The account type doesn't support phonetic name.
363cf7f295a05bd356ea8715ea456fbe5f6ced9d823Marcus Hagerott        if (phoneticNameKind == null) return;
364cf7f295a05bd356ea8715ea456fbe5f6ced9d823Marcus Hagerott
3658bca12206d31072af65790e22fa3c3630f6b05a9avipul        final TextFieldsEditorView phoneticNameView = (TextFieldsEditorView) mLayoutInflater
3668bca12206d31072af65790e22fa3c3630f6b05a9avipul                .inflate(R.layout.text_fields_editor_view, mEditors, /* attachToRoot =*/ false);
36779658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        phoneticNameView.setEditorListener(new OtherNameKindEditorListener());
368192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        phoneticNameView.setDeletable(false);
369192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        phoneticNameView.setValues(
370192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang                accountType.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME),
371698cee7d410f06b0c883c11f53481bfa5b2b787aGary Mai                nameValuesDelta, rawContactDelta, /* readOnly =*/ false, mViewIdGenerator);
372192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang
373192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        // Fix the start margin for phonetic name views
374192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
375192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang                LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
376192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        layoutParams.setMargins(0, 0, 0, 0);
377192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        phoneticNameView.setLayoutParams(layoutParams);
378192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        mEditors.addView(phoneticNameView);
379bf9dddc9e9228478d1c49287271cb757d158a2f3avipul        // Display of phonetic name fields is controlled from settings preferences.
380bf9dddc9e9228478d1c49287271cb757d158a2f3avipul        mHideIfEmpty = new ContactsPreferences(getContext()).shouldHidePhoneticNamesIfEmpty();
3813e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang    }
3823e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang
38379658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang    private void addGroupEditorView(RawContactDelta rawContactDelta, DataKind dataKind) {
38479658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        final GroupMembershipView view = (GroupMembershipView) mLayoutInflater.inflate(
385f10ca15ffa550b36805d2330fc210b58601a215cWalter Jang                R.layout.item_group_membership, mEditors, /* attachToRoot =*/ false);
386f10ca15ffa550b36805d2330fc210b58601a215cWalter Jang        view.setKind(dataKind);
387f10ca15ffa550b36805d2330fc210b58601a215cWalter Jang        view.setEnabled(isEnabled());
388f10ca15ffa550b36805d2330fc210b58601a215cWalter Jang        view.setState(rawContactDelta);
389f10ca15ffa550b36805d2330fc210b58601a215cWalter Jang
39079658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        // Correct start margin since there is a second icon in the group layout
391f10ca15ffa550b36805d2330fc210b58601a215cWalter Jang        view.findViewById(R.id.kind_icon).setVisibility(View.GONE);
392f10ca15ffa550b36805d2330fc210b58601a215cWalter Jang
393f10ca15ffa550b36805d2330fc210b58601a215cWalter Jang        mEditors.addView(view);
394f10ca15ffa550b36805d2330fc210b58601a215cWalter Jang    }
395f10ca15ffa550b36805d2330fc210b58601a215cWalter Jang
39679658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang    private View addNonNameEditorView(RawContactDelta rawContactDelta, DataKind dataKind,
39779658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            ValuesDelta valuesDelta, Editor.EditorListener editorListener) {
398f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        // Inflate the layout
39979658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        final View view = mLayoutInflater.inflate(
40079658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang                EditorUiUtils.getLayoutResourceId(dataKind.mimeType), mEditors, false);
40179658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        view.setEnabled(isEnabled());
402f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        if (view instanceof Editor) {
4033e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang            final Editor editor = (Editor) view;
404f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            editor.setDeletable(true);
40579658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            editor.setEditorListener(editorListener);
4063e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang            editor.setValues(dataKind, valuesDelta, rawContactDelta, !dataKind.editable,
4073e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang                    mViewIdGenerator);
408f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        }
409f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        mEditors.addView(view);
41079658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang
411f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        return view;
412f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    }
413f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
414f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    /**
415f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang     * Updates the editors being displayed to the user removing extra empty
416f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang     * {@link Editor}s, so there is only max 1 empty {@link Editor} view at a time.
417f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang     * If there is only 1 empty editor and {@link #setHideWhenEmpty} was set to true,
418f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang     * then the entire section is hidden.
419f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang     */
420f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    public void updateEmptyEditors(boolean shouldAnimate) {
421cbd431df6e9c7116850249461faf9f5a9b8b89c3Walter Jang        final boolean isNameKindSection = StructuredName.CONTENT_ITEM_TYPE.equals(
42298868d33107de0dd539441e80e94b856f2269057Gary Mai                mKindSectionData.getMimeType());
42379658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        final boolean isGroupKindSection = GroupMembership.CONTENT_ITEM_TYPE.equals(
42498868d33107de0dd539441e80e94b856f2269057Gary Mai                mKindSectionData.getMimeType());
42579658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang
42679658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        if (isNameKindSection) {
42779658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            // The name kind section is always visible
42879658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            setVisibility(VISIBLE);
429192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang            updateEmptyNameEditors(shouldAnimate);
43079658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        } else if (isGroupKindSection) {
43179658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            // Check whether metadata has been bound for all group views
43279658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            for (int i = 0; i < mEditors.getChildCount(); i++) {
43379658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang                final View view = mEditors.getChildAt(i);
4346dc36b0172a79b8a310110739936ddae14234d32Tingting Wang                if (view instanceof GroupMembershipView) {
4356dc36b0172a79b8a310110739936ddae14234d32Tingting Wang                    final GroupMembershipView groupView = (GroupMembershipView) view;
4366dc36b0172a79b8a310110739936ddae14234d32Tingting Wang                    if (!groupView.wasGroupMetaDataBound() || !groupView.accountHasGroups()) {
4376dc36b0172a79b8a310110739936ddae14234d32Tingting Wang                        setVisibility(GONE);
4386dc36b0172a79b8a310110739936ddae14234d32Tingting Wang                        return;
4396dc36b0172a79b8a310110739936ddae14234d32Tingting Wang                    }
44079658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang                }
44179658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            }
44279658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            // Check that the user has selected to display all fields
44379658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            if (mHideIfEmpty) {
44479658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang                setVisibility(GONE);
44579658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang                return;
44679658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            }
44779658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            setVisibility(VISIBLE);
44879658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang
44979658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            // We don't check the emptiness of the group views
450192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        } else {
45179658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            // Determine if the entire kind section should be visible
45279658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            final int editorCount = mEditors.getChildCount();
45379658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            final List<View> emptyEditors = getEmptyEditors();
45479658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            if (editorCount == emptyEditors.size() && mHideIfEmpty) {
45579658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang                setVisibility(GONE);
45679658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang                return;
45779658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            }
45879658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            setVisibility(VISIBLE);
45979658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang
460192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang            updateEmptyNonNameEditors(shouldAnimate);
461192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        }
462192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang    }
463f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
464192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang    private void updateEmptyNameEditors(boolean shouldAnimate) {
465192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        boolean isEmptyNameEditorVisible = false;
466192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang
467192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        for (int i = 0; i < mEditors.getChildCount(); i++) {
468192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang            final View view = mEditors.getChildAt(i);
4694f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang            if (view instanceof Editor) {
4704f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                final Editor editor = (Editor) view;
4714f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                if (view instanceof StructuredNameEditorView) {
4724f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                    // We always show one empty structured name view
4734f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                    if (editor.isEmpty()) {
4744f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                        if (isEmptyNameEditorVisible) {
4754f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                            // If we're already showing an empty editor then hide any other empties
4764f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                            if (mHideIfEmpty) {
4774f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                                view.setVisibility(View.GONE);
4784f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                            }
4794f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                        } else {
4804f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                            isEmptyNameEditorVisible = true;
481192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang                        }
482192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang                    } else {
4834f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                        showView(view, shouldAnimate);
484192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang                        isEmptyNameEditorVisible = true;
485192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang                    }
486192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang                } else {
4874f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                    // Since we can't add phonetic names and nicknames, just show or hide them
4884f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                    if (mHideIfEmpty && editor.isEmpty()) {
4894f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                        hideView(view);
4904f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                    } else {
4914f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                        showView(view, /* shouldAnimate =*/ false); // Animation here causes jank
4924f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                    }
493192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang                }
494192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang            } else {
4954f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                // For read only names, only show them if we're not hiding empty views
4964f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                if (mHideIfEmpty) {
49779658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang                    hideView(view);
498192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang                } else {
4994f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                    showView(view, shouldAnimate);
500192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang                }
501192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang            }
502192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        }
503192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang    }
504192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang
505192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang    private void updateEmptyNonNameEditors(boolean shouldAnimate) {
506192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        // Prune excess empty editors
50779658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        final List<View> emptyEditors = getEmptyEditors();
508f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        if (emptyEditors.size() > 1) {
509f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            // If there is more than 1 empty editor, then remove it from the list of editors.
510f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            int deleted = 0;
51198868d33107de0dd539441e80e94b856f2269057Gary Mai            for (int i = 0; i < emptyEditors.size(); i++) {
51298868d33107de0dd539441e80e94b856f2269057Gary Mai                final View view = emptyEditors.get(i);
513f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang                // If no child {@link View}s are being focused on within this {@link View}, then
514192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang                // remove this empty editor. We can assume that at least one empty editor has
515192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang                // focus. One way to get two empty editors is by deleting characters from a
516192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang                // non-empty editor, in which case this editor has focus.  Another way is if
517192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang                // there is more values delta so we must also count number of editors deleted.
518192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang                if (view.findFocus() == null) {
519192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang                    deleteView(view, shouldAnimate);
520f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang                    deleted++;
521192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang                    if (deleted == emptyEditors.size() - 1) break;
522f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang                }
523f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            }
524f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            return;
525f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        }
526192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        // Determine if we should add a new empty editor
52798868d33107de0dd539441e80e94b856f2269057Gary Mai        final DataKind dataKind = mKindSectionData.getDataKind();
52898868d33107de0dd539441e80e94b856f2269057Gary Mai        final RawContactDelta rawContactDelta = mKindSectionData.getRawContactDelta();
52979658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        if (dataKind == null // There is nothing we can do.
530f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang                // We have already reached the maximum number of editors, don't add any more.
5316d8c6294a5167cbdb832df07bf677a7f5bdd618cTingting Wang                || !RawContactModifier.canInsert(rawContactDelta, dataKind)
532f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang                // We have already reached the maximum number of empty editors, don't add any more.
533f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang                || emptyEditors.size() == 1) {
534f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            return;
535f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        }
536f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        // Add a new empty editor
537f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        if (mShowOneEmptyEditor) {
53898868d33107de0dd539441e80e94b856f2269057Gary Mai            final String mimeType = mKindSectionData.getMimeType();
539f695eb38011cf1140f73f533be726f420bc0a3fdTingting Wang            if (Nickname.CONTENT_ITEM_TYPE.equals(mimeType) && mEditors.getChildCount() > 0) {
540f695eb38011cf1140f73f533be726f420bc0a3fdTingting Wang                return;
541f695eb38011cf1140f73f533be726f420bc0a3fdTingting Wang            }
542f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            final ValuesDelta values = RawContactModifier.insertChild(rawContactDelta, dataKind);
5434f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang            final Editor.EditorListener editorListener = Event.CONTENT_ITEM_TYPE.equals(mimeType)
5444f5594a0437e8592b6f828f8344d3f83cbd9aad6Walter Jang                    ? new EventEditorListener() : new NonNameEditorListener();
54579658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang            final View view = addNonNameEditorView(rawContactDelta, dataKind, values,
5462da5d2ff897741fed33b44f0f733f542aca7a3e4Wenyi Wang                    editorListener);
547192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang            showView(view, shouldAnimate);
548192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        }
549192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang    }
550192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang
55179658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang    private void hideView(View view) {
55279658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        view.setVisibility(View.GONE);
553192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang    }
554192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang
555192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang    private void deleteView(View view, boolean shouldAnimate) {
556192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        if (shouldAnimate) {
557192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang            final Editor editor = (Editor) view;
558192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang            editor.deleteEditor();
559192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        } else {
560192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang            mEditors.removeView(view);
561192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        }
562192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang    }
563192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang
564192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang    private void showView(View view, boolean shouldAnimate) {
565192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        if (shouldAnimate) {
566192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang            view.setVisibility(View.GONE);
567192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang            EditorAnimator.getInstance().showFieldFooter(view);
568192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang        } else {
569192a01c63c836a7a6ac3e75d8cc14e764f34a42bWalter Jang            view.setVisibility(View.VISIBLE);
570f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        }
571f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    }
572f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
573f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    private List<View> getEmptyEditors() {
57479658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        final List<View> emptyEditors = new ArrayList<>();
575f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        for (int i = 0; i < mEditors.getChildCount(); i++) {
576f10ca15ffa550b36805d2330fc210b58601a215cWalter Jang            final View view = mEditors.getChildAt(i);
577f10ca15ffa550b36805d2330fc210b58601a215cWalter Jang            if (view instanceof Editor && ((Editor) view).isEmpty()) {
57879658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang                emptyEditors.add(view);
579f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            }
580f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        }
58179658e14360a4ec75530a9dcae338f48c9d5f043Walter Jang        return emptyEditors;
582f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    }
583f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang}
584