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