12ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey/* 22ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey * Copyright (C) 2009 The Android Open Source Project 32ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey * 42ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 52ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey * you may not use this file except in compliance with the License. 62ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey * You may obtain a copy of the License at 72ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey * 82ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 92ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey * 102ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey * Unless required by applicable law or agreed to in writing, software 112ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 122ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey * See the License for the specific language governing permissions and 142ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey * limitations under the License. 152ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey */ 162ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey 1718ffaa2561cc7dd2e3ef81737e6537931c0a9a11Dmitri Plotnikovpackage com.android.contacts.editor; 182ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey 1918ffaa2561cc7dd2e3ef81737e6537931c0a9a11Dmitri Plotnikovimport com.android.contacts.GroupMetaDataLoader; 202ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkeyimport com.android.contacts.R; 214597c92d655d45447780b32c7572acef110b6ed1Dmitri Plotnikovimport com.android.contacts.model.AccountType; 224597c92d655d45447780b32c7572acef110b6ed1Dmitri Plotnikovimport com.android.contacts.model.AccountType.EditType; 23405671a7b42d97ebf7ae7c0eeb4721f881139673Daisuke Miyakawaimport com.android.contacts.model.DataKind; 247d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikovimport com.android.contacts.model.EntityDelta; 253f0b7b87cd41b5a9cd631b6fcf29ea5025905e18Jeff Sharkeyimport com.android.contacts.model.EntityDelta.ValuesDelta; 267d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikovimport com.android.contacts.model.EntityModifier; 272b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoroimport com.android.internal.util.Objects; 282ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey 292ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkeyimport android.content.Context; 302ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkeyimport android.content.Entity; 31e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport android.database.Cursor; 32e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership; 333fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuanimport android.provider.ContactsContract.CommonDataKinds.Organization; 347d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Photo; 357d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 362ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkeyimport android.provider.ContactsContract.Contacts; 372ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkeyimport android.provider.ContactsContract.Data; 386f8d46b5fb96c2bead1317aae93a73fc89b093abJeff Sharkeyimport android.provider.ContactsContract.RawContacts; 395297c6af41f3fd2f08cff5b84105af4efd1ab79fJeff Hamiltonimport android.text.TextUtils; 40aad8848282f51d73ad308e9ad3ebcef592fa153fJeff Sharkeyimport android.util.AttributeSet; 41e731d426eda3692402f3cecdc29421fcf7f1fb54Jeff Sharkeyimport android.view.LayoutInflater; 42ab8dbcc888ceb38a56965260ae7b15c97c55588dDaniel Lehmannimport android.view.Menu; 43ab8dbcc888ceb38a56965260ae7b15c97c55588dDaniel Lehmannimport android.view.MenuItem; 442ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkeyimport android.view.View; 452ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkeyimport android.view.ViewGroup; 46bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmannimport android.widget.Button; 475297c6af41f3fd2f08cff5b84105af4efd1ab79fJeff Hamiltonimport android.widget.ImageView; 48ab8dbcc888ceb38a56965260ae7b15c97c55588dDaniel Lehmannimport android.widget.PopupMenu; 492ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkeyimport android.widget.TextView; 502ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey 51bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmannimport java.util.ArrayList; 52bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmann 532ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey/** 542ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey * Custom view that provides all the editor interaction for a specific 558d9767d79f9fe2a09ee6e981b1fede7e9863d62aJeff Sharkey * {@link Contacts} represented through an {@link EntityDelta}. Callers can 562ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey * reuse this view and quickly rebuild its contents through 574597c92d655d45447780b32c7572acef110b6ed1Dmitri Plotnikov * {@link #setState(EntityDelta, AccountType, ViewIdGenerator)}. 582ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey * <p> 598d9767d79f9fe2a09ee6e981b1fede7e9863d62aJeff Sharkey * Internal updates are performed against {@link ValuesDelta} so that the 602ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey * source {@link Entity} can be swapped out. Any state-based changes, such as 612ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey * adding {@link Data} rows or changing {@link EditType}, are performed through 624597c92d655d45447780b32c7572acef110b6ed1Dmitri Plotnikov * {@link EntityModifier} to ensure that {@link AccountType} are enforced. 632ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey */ 6472af89f9e497bb8ef54fe3deeec7e8477d192242Daniel Lehmannpublic class RawContactEditorView extends BaseRawContactEditorView { 65ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov private LayoutInflater mInflater; 66ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov 675ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov private StructuredNameEditorView mName; 685ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov private PhoneticNameEditorView mPhoneticName; 69e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov private GroupMembershipView mGroupMembershipView; 702ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey 71bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmann private ViewGroup mFields; 7214f61ab769f6e178a540a7579e446a010fb836daJeff Sharkey 73d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa private ImageView mAccountIcon; 74d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa private TextView mAccountTypeTextView; 75d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa private TextView mAccountNameTextView; 762fb3db55d68ff8a8d9cf8e329de3ec8687d5ff29Evan Millar 77bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmann private Button mAddFieldButton; 78bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmann 792fb3db55d68ff8a8d9cf8e329de3ec8687d5ff29Evan Millar private long mRawContactId = -1; 807d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov private boolean mAutoAddToDefaultGroup = true; 817d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov private Cursor mGroupMetaData; 827d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov private DataKind mGroupMembershipKind; 837d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov private EntityDelta mState; 842fb3db55d68ff8a8d9cf8e329de3ec8687d5ff29Evan Millar 855ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov private boolean mPhoneticNameAdded; 865ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 8772af89f9e497bb8ef54fe3deeec7e8477d192242Daniel Lehmann public RawContactEditorView(Context context) { 88aad8848282f51d73ad308e9ad3ebcef592fa153fJeff Sharkey super(context); 89aad8848282f51d73ad308e9ad3ebcef592fa153fJeff Sharkey } 90aad8848282f51d73ad308e9ad3ebcef592fa153fJeff Sharkey 9172af89f9e497bb8ef54fe3deeec7e8477d192242Daniel Lehmann public RawContactEditorView(Context context, AttributeSet attrs) { 92aad8848282f51d73ad308e9ad3ebcef592fa153fJeff Sharkey super(context, attrs); 93aad8848282f51d73ad308e9ad3ebcef592fa153fJeff Sharkey } 94aad8848282f51d73ad308e9ad3ebcef592fa153fJeff Sharkey 95aad8848282f51d73ad308e9ad3ebcef592fa153fJeff Sharkey @Override 9602bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov public void setEnabled(boolean enabled) { 9702bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov super.setEnabled(enabled); 9802bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov 9902bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov View view = getPhotoEditor(); 10002bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov if (view != null) { 1015ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov view.setEnabled(enabled); 10202bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov } 10302bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov 10402bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov if (mName != null) { 1055ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov mName.setEnabled(enabled); 1065ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 1075ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 1085ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov if (mPhoneticName != null) { 1095ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov mPhoneticName.setEnabled(enabled); 11002bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov } 11102bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov 11202bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov if (mFields != null) { 11302bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov int count = mFields.getChildCount(); 11402bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov for (int i = 0; i < count; i++) { 11502bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov mFields.getChildAt(i).setEnabled(enabled); 11602bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov } 11702bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov } 11802bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov 11902bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov if (mGroupMembershipView != null) { 12002bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov mGroupMembershipView.setEnabled(enabled); 12102bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov } 12202bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov 1235ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov mAddFieldButton.setEnabled(enabled); 12402bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov } 12502bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov 12602bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov @Override 127aad8848282f51d73ad308e9ad3ebcef592fa153fJeff Sharkey protected void onFinishInflate() { 1286f8d46b5fb96c2bead1317aae93a73fc89b093abJeff Sharkey super.onFinishInflate(); 1296f8d46b5fb96c2bead1317aae93a73fc89b093abJeff Sharkey 130bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmann mInflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 131aad8848282f51d73ad308e9ad3ebcef592fa153fJeff Sharkey 1325ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov mName = (StructuredNameEditorView)findViewById(R.id.edit_name); 133aad8848282f51d73ad308e9ad3ebcef592fa153fJeff Sharkey mName.setDeletable(false); 134aad8848282f51d73ad308e9ad3ebcef592fa153fJeff Sharkey 1355ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov mPhoneticName = (PhoneticNameEditorView)findViewById(R.id.edit_phonetic_name); 1361ebbd5bbe71814123b80df702b474bcd7196cbb7Katherine Kuan mPhoneticName.setDeletable(false); 1375ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 138bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmann mFields = (ViewGroup)findViewById(R.id.sect_fields); 139aad8848282f51d73ad308e9ad3ebcef592fa153fJeff Sharkey 140d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa mAccountIcon = (ImageView) findViewById(R.id.account_icon); 141d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa mAccountTypeTextView = (TextView) findViewById(R.id.account_type); 142d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa mAccountNameTextView = (TextView) findViewById(R.id.account_name); 1432fb3db55d68ff8a8d9cf8e329de3ec8687d5ff29Evan Millar 144bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmann mAddFieldButton = (Button) findViewById(R.id.button_add_field); 145bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmann mAddFieldButton.setOnClickListener(new OnClickListener() { 146ab8dbcc888ceb38a56965260ae7b15c97c55588dDaniel Lehmann @Override 147bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmann public void onClick(View v) { 148ab8dbcc888ceb38a56965260ae7b15c97c55588dDaniel Lehmann showAddInformationPopupWindow(); 149bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmann } 150bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmann }); 1512ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey } 1522ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey 1532ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey /** 1542ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey * Set the internal state for this view, given a current 1554597c92d655d45447780b32c7572acef110b6ed1Dmitri Plotnikov * {@link EntityDelta} state and the {@link AccountType} that 1562ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey * apply to that state. 1572ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey */ 1584bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton @Override 159681f36cc7cc49be781eedc4685eda2d1b2c0444cIsaac Katzenelson public void setState(EntityDelta state, AccountType type, ViewIdGenerator vig, 160681f36cc7cc49be781eedc4685eda2d1b2c0444cIsaac Katzenelson boolean isProfile) { 1613fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan 1627d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov mState = state; 1637d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov 1642ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey // Remove any existing sections 165bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmann mFields.removeAllViews(); 1662ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey 16769f9e6f0cd9b5401da55f251e9bd98e69643d7dfDmitri Plotnikov // Bail if invalid state or account type 16869f9e6f0cd9b5401da55f251e9bd98e69643d7dfDmitri Plotnikov if (state == null || type == null) return; 169d046a039e41deab0635c3327cd40c3896e39acadJeff Sharkey 1704b722a93f1ecdeb2890fb7e5db4c22794bccfdcdMakoto Onuki setId(vig.getId(state, null, null, ViewIdGenerator.NO_VIEW_INDEX)); 1714b722a93f1ecdeb2890fb7e5db4c22794bccfdcdMakoto Onuki 1723fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan // Make sure we have a StructuredName and Organization 17369f9e6f0cd9b5401da55f251e9bd98e69643d7dfDmitri Plotnikov EntityModifier.ensureKindExists(state, type, StructuredName.CONTENT_ITEM_TYPE); 1743fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan EntityModifier.ensureKindExists(state, type, Organization.CONTENT_ITEM_TYPE); 175aad8848282f51d73ad308e9ad3ebcef592fa153fJeff Sharkey 1765297c6af41f3fd2f08cff5b84105af4efd1ab79fJeff Hamilton ValuesDelta values = state.getValues(); 1772fb3db55d68ff8a8d9cf8e329de3ec8687d5ff29Evan Millar mRawContactId = values.getAsLong(RawContacts._ID); 1782fb3db55d68ff8a8d9cf8e329de3ec8687d5ff29Evan Millar 179a7c3d4d726b91f645431af14d8cceadd2245f4ceKatherine Kuan // Fill in the account info 180681f36cc7cc49be781eedc4685eda2d1b2c0444cIsaac Katzenelson if (isProfile) { 181681f36cc7cc49be781eedc4685eda2d1b2c0444cIsaac Katzenelson String accountName = values.getAsString(RawContacts.ACCOUNT_NAME); 182681f36cc7cc49be781eedc4685eda2d1b2c0444cIsaac Katzenelson if (TextUtils.isEmpty(accountName)) { 1832cb71bd0d6096f48d9d8c6d66a753b164468abb2Isaac Katzenelson mAccountNameTextView.setVisibility(View.GONE); 184681f36cc7cc49be781eedc4685eda2d1b2c0444cIsaac Katzenelson mAccountTypeTextView.setText(R.string.local_profile_title); 185681f36cc7cc49be781eedc4685eda2d1b2c0444cIsaac Katzenelson } else { 1862cb71bd0d6096f48d9d8c6d66a753b164468abb2Isaac Katzenelson CharSequence accountType = type.getDisplayLabel(mContext); 1872cb71bd0d6096f48d9d8c6d66a753b164468abb2Isaac Katzenelson mAccountTypeTextView.setText(mContext.getString(R.string.external_profile_title, 1882cb71bd0d6096f48d9d8c6d66a753b164468abb2Isaac Katzenelson accountType)); 1892cb71bd0d6096f48d9d8c6d66a753b164468abb2Isaac Katzenelson mAccountNameTextView.setText(accountName); 190681f36cc7cc49be781eedc4685eda2d1b2c0444cIsaac Katzenelson } 191681f36cc7cc49be781eedc4685eda2d1b2c0444cIsaac Katzenelson } else { 192681f36cc7cc49be781eedc4685eda2d1b2c0444cIsaac Katzenelson String accountName = values.getAsString(RawContacts.ACCOUNT_NAME); 193681f36cc7cc49be781eedc4685eda2d1b2c0444cIsaac Katzenelson CharSequence accountType = type.getDisplayLabel(mContext); 194681f36cc7cc49be781eedc4685eda2d1b2c0444cIsaac Katzenelson if (TextUtils.isEmpty(accountType)) { 195681f36cc7cc49be781eedc4685eda2d1b2c0444cIsaac Katzenelson accountType = mContext.getString(R.string.account_phone); 196681f36cc7cc49be781eedc4685eda2d1b2c0444cIsaac Katzenelson } 197681f36cc7cc49be781eedc4685eda2d1b2c0444cIsaac Katzenelson if (!TextUtils.isEmpty(accountName)) { 1982ea2ebbd23320f09ed38bf22d053842cc244646cKatherine Kuan mAccountNameTextView.setVisibility(View.VISIBLE); 199681f36cc7cc49be781eedc4685eda2d1b2c0444cIsaac Katzenelson mAccountNameTextView.setText( 200681f36cc7cc49be781eedc4685eda2d1b2c0444cIsaac Katzenelson mContext.getString(R.string.from_account_format, accountName)); 2012ea2ebbd23320f09ed38bf22d053842cc244646cKatherine Kuan } else { 2022ea2ebbd23320f09ed38bf22d053842cc244646cKatherine Kuan // Hide this view so the other text view will be centered vertically 2032ea2ebbd23320f09ed38bf22d053842cc244646cKatherine Kuan mAccountNameTextView.setVisibility(View.GONE); 204681f36cc7cc49be781eedc4685eda2d1b2c0444cIsaac Katzenelson } 205681f36cc7cc49be781eedc4685eda2d1b2c0444cIsaac Katzenelson mAccountTypeTextView.setText( 206681f36cc7cc49be781eedc4685eda2d1b2c0444cIsaac Katzenelson mContext.getString(R.string.account_type_format, accountType)); 207769e5fed7af619d538da66adb926eeccdc159cd9Daisuke Miyakawa } 208a7c3d4d726b91f645431af14d8cceadd2245f4ceKatherine Kuan mAccountIcon.setImageDrawable(type.getDisplayIcon(mContext)); 209769e5fed7af619d538da66adb926eeccdc159cd9Daisuke Miyakawa 2106f8d46b5fb96c2bead1317aae93a73fc89b093abJeff Sharkey // Show photo editor when supported 21169f9e6f0cd9b5401da55f251e9bd98e69643d7dfDmitri Plotnikov EntityModifier.ensureKindExists(state, type, Photo.CONTENT_ITEM_TYPE); 21269f9e6f0cd9b5401da55f251e9bd98e69643d7dfDmitri Plotnikov setHasPhotoEditor((type.getKindForMimetype(Photo.CONTENT_ITEM_TYPE) != null)); 21302bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov getPhotoEditor().setEnabled(isEnabled()); 21402bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov mName.setEnabled(isEnabled()); 2156f8d46b5fb96c2bead1317aae93a73fc89b093abJeff Sharkey 2165ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov mPhoneticName.setEnabled(isEnabled()); 2175ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 2181fb6275a57318261cb6dba511954cb754cd17fa2Jeff Hamilton // Show and hide the appropriate views 219bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmann mFields.setVisibility(View.VISIBLE); 220bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmann mName.setVisibility(View.VISIBLE); 2215ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov mPhoneticName.setVisibility(View.VISIBLE); 2222fb3db55d68ff8a8d9cf8e329de3ec8687d5ff29Evan Millar 22369f9e6f0cd9b5401da55f251e9bd98e69643d7dfDmitri Plotnikov mGroupMembershipKind = type.getKindForMimetype(GroupMembership.CONTENT_ITEM_TYPE); 2247d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov if (mGroupMembershipKind != null) { 225e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov mGroupMembershipView = (GroupMembershipView)mInflater.inflate( 226e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov R.layout.item_group_membership, mFields, false); 2277d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov mGroupMembershipView.setKind(mGroupMembershipKind); 22802bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov mGroupMembershipView.setEnabled(isEnabled()); 229e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 230e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 2312ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey // Create editor sections for each possible data kind 23269f9e6f0cd9b5401da55f251e9bd98e69643d7dfDmitri Plotnikov for (DataKind kind : type.getSortedDataKinds()) { 2332ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey // Skip kind of not editable 2342ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey if (!kind.editable) continue; 2352ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey 2362ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey final String mimeType = kind.mimeType; 2372ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) { 2382ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey // Handle special case editor for structured name 2398d9767d79f9fe2a09ee6e981b1fede7e9863d62aJeff Sharkey final ValuesDelta primary = state.getPrimaryEntry(mimeType); 2405ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov mName.setValues( 2415ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov type.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME), 2425ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov primary, state, false, vig); 2435ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov mPhoneticName.setValues( 2445ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov type.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME), 2455ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov primary, state, false, vig); 2462ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey } else if (Photo.CONTENT_ITEM_TYPE.equals(mimeType)) { 2472ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey // Handle special case editor for photos 2480b45a58fad48888fee36eb0edf50705e0aa00e30Jeff Sharkey final ValuesDelta primary = state.getPrimaryEntry(mimeType); 249ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov getPhotoEditor().setValues(kind, primary, state, false, vig); 250e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } else if (GroupMembership.CONTENT_ITEM_TYPE.equals(mimeType)) { 251e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov if (mGroupMembershipView != null) { 252e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov mGroupMembershipView.setState(state); 253e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 2543fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan } else if (Organization.CONTENT_ITEM_TYPE.equals(mimeType)) { 2553fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan // Create the organization section 2563fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan final KindSectionView section = (KindSectionView) mInflater.inflate( 2573fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan R.layout.item_kind_section, mFields, false); 2583fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan section.setTitleVisible(false); 2593fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan section.setEnabled(isEnabled()); 2603fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan section.setState(kind, state, false, vig); 2613fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan 2623fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan // If there is organization info for the contact already, display it 2633fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan if (!section.isEmpty()) { 2643fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan mFields.addView(section); 2653fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan } else { 2663fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan // Otherwise provide the user with an "add organization" button that shows the 2673fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan // EditText fields only when clicked 2683fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan final View organizationView = mInflater.inflate( 2693fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan R.layout.organization_editor_view_switcher, mFields, false); 2703fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan final View addOrganizationButton = organizationView.findViewById( 2713fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan R.id.add_organization_button); 2723fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan final ViewGroup organizationSectionViewContainer = 2733fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan (ViewGroup) organizationView.findViewById(R.id.container); 2743fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan 2753fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan organizationSectionViewContainer.addView(section); 2763fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan 2773fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan // Setup the click listener for the "add organization" button 2783fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan addOrganizationButton.setOnClickListener(new OnClickListener() { 2793fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan @Override 2803fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan public void onClick(View v) { 2813fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan // Once the user expands the organization field, the user cannot 2823fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan // collapse them again. 2833fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan addOrganizationButton.setVisibility(View.GONE); 2843fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan organizationSectionViewContainer.setVisibility(View.VISIBLE); 2853c6af944f1c2c64de3839809460b368b718a8f5aKatherine Kuan organizationSectionViewContainer.requestFocus(); 2863fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan } 2873fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan }); 2883fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan 2893fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan mFields.addView(organizationView); 2903fa75acf99f5245eae00c77086ff130b3552ceecKatherine Kuan } 291bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmann } else { 2922ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey // Otherwise use generic section-based editors 2932ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey if (kind.fieldList == null) continue; 294aad8848282f51d73ad308e9ad3ebcef592fa153fJeff Sharkey final KindSectionView section = (KindSectionView)mInflater.inflate( 295bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmann R.layout.item_kind_section, mFields, false); 29602bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov section.setEnabled(isEnabled()); 297bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmann section.setState(kind, state, false, vig); 298bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmann mFields.addView(section); 2992ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey } 3002ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey } 301e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 302e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov if (mGroupMembershipView != null) { 303e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov mFields.addView(mGroupMembershipView); 304e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 3057d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov 3065ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov updatePhoneticNameVisibility(); 3075ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 3087d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov addToDefaultGroupIfNeeded(); 30902bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov 31002bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov mAddFieldButton.setEnabled(isEnabled()); 311e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 312e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov 313e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov @Override 314e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov public void setGroupMetaData(Cursor groupMetaData) { 3157d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov mGroupMetaData = groupMetaData; 3167d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov addToDefaultGroupIfNeeded(); 317e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov if (mGroupMembershipView != null) { 318e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov mGroupMembershipView.setGroupMetaData(groupMetaData); 319e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov } 3202ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey } 32147673e82f210e3b2d38d49652726b51770e71230Neel Parekh 3227d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov public void setAutoAddToDefaultGroup(boolean flag) { 3237d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov this.mAutoAddToDefaultGroup = flag; 3247d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov } 3257d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov 3267d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov /** 3277d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov * If automatic addition to the default group was requested (see 3287d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov * {@link #setAutoAddToDefaultGroup}, checks if the raw contact is in any 3297d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov * group and if it is not adds it to the default group (in case of Google 3307d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov * contacts that's "My Contacts"). 3317d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov */ 3327d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov private void addToDefaultGroupIfNeeded() { 3337d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov if (!mAutoAddToDefaultGroup || mGroupMetaData == null || mGroupMetaData.isClosed() 3347d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov || mState == null) { 3357d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov return; 3367d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov } 3377d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov 3387d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov boolean hasGroupMembership = false; 3397d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov ArrayList<ValuesDelta> entries = mState.getMimeEntries(GroupMembership.CONTENT_ITEM_TYPE); 3407d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov if (entries != null) { 3417d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov for (ValuesDelta values : entries) { 3427d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov Long id = values.getAsLong(GroupMembership.GROUP_ROW_ID); 3437d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov if (id != null && id.longValue() != 0) { 3447d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov hasGroupMembership = true; 3457d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov break; 3467d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov } 3477d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov } 3487d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov } 3497d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov 3507d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov if (!hasGroupMembership) { 3517d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov long defaultGroupId = getDefaultGroupId(); 3527d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov if (defaultGroupId != -1) { 3537d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov ValuesDelta entry = EntityModifier.insertChild(mState, mGroupMembershipKind); 3547d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov entry.put(GroupMembership.GROUP_ROW_ID, defaultGroupId); 3557d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov } 3567d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov } 3577d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov } 3587d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov 3597d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov /** 3607d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov * Returns the default group (e.g. "My Contacts") for the current raw contact's 3617d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov * account. Returns -1 if there is no such group. 3627d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov */ 3637d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov private long getDefaultGroupId() { 3647d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov String accountType = mState.getValues().getAsString(RawContacts.ACCOUNT_TYPE); 3657d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov String accountName = mState.getValues().getAsString(RawContacts.ACCOUNT_NAME); 3662b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro String accountDataSet = mState.getValues().getAsString(RawContacts.DATA_SET); 3677d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov mGroupMetaData.moveToPosition(-1); 3687d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov while (mGroupMetaData.moveToNext()) { 3697d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov String name = mGroupMetaData.getString(GroupMetaDataLoader.ACCOUNT_NAME); 3707d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov String type = mGroupMetaData.getString(GroupMetaDataLoader.ACCOUNT_TYPE); 3712b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro String dataSet = mGroupMetaData.getString(GroupMetaDataLoader.DATA_SET); 3722b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro if (name.equals(accountName) && type.equals(accountType) 3732b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro && Objects.equal(dataSet, accountDataSet)) { 3747d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov long groupId = mGroupMetaData.getLong(GroupMetaDataLoader.GROUP_ID); 3757d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov if (!mGroupMetaData.isNull(GroupMetaDataLoader.AUTO_ADD) 3767d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov && mGroupMetaData.getInt(GroupMetaDataLoader.AUTO_ADD) != 0) { 3777d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov return groupId; 3787d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov } 3797d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov } 3807d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov } 3817d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov return -1; 3827d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov } 3837d901bb3d4118762e21f4db19e35fc937dcf96feDmitri Plotnikov 384392ccec3b56e8074a5a028af28106134b39f64bcDaniel Lehmann public TextFieldsEditorView getNameEditor() { 385f491ae914769f1062a4d9c31fcbec5ff0e01e4e6Dmitri Plotnikov return mName; 38647673e82f210e3b2d38d49652726b51770e71230Neel Parekh } 3872fb3db55d68ff8a8d9cf8e329de3ec8687d5ff29Evan Millar 3885ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov public TextFieldsEditorView getPhoneticNameEditor() { 3895ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov return mPhoneticName; 3905ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 3915ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 3925ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov private void updatePhoneticNameVisibility() { 3935ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov boolean showByDefault = 3945ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov getContext().getResources().getBoolean(R.bool.config_editor_include_phonetic_name); 3955ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 3965ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov if (showByDefault || mPhoneticName.hasData() || mPhoneticNameAdded) { 3975ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov mPhoneticName.setVisibility(View.VISIBLE); 3985ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } else { 3995ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov mPhoneticName.setVisibility(View.GONE); 4005ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 4015ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 4025ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 4034bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton @Override 4042fb3db55d68ff8a8d9cf8e329de3ec8687d5ff29Evan Millar public long getRawContactId() { 4052fb3db55d68ff8a8d9cf8e329de3ec8687d5ff29Evan Millar return mRawContactId; 4062fb3db55d68ff8a8d9cf8e329de3ec8687d5ff29Evan Millar } 4074cbb29a41b5cfec61b6b785794878cce4c00b445Makoto Onuki 408ab8dbcc888ceb38a56965260ae7b15c97c55588dDaniel Lehmann private void showAddInformationPopupWindow() { 409ab8dbcc888ceb38a56965260ae7b15c97c55588dDaniel Lehmann final ArrayList<KindSectionView> fields = 410ab8dbcc888ceb38a56965260ae7b15c97c55588dDaniel Lehmann new ArrayList<KindSectionView>(mFields.getChildCount()); 411ab8dbcc888ceb38a56965260ae7b15c97c55588dDaniel Lehmann 412ab8dbcc888ceb38a56965260ae7b15c97c55588dDaniel Lehmann final PopupMenu popupMenu = new PopupMenu(getContext(), mAddFieldButton); 413ab8dbcc888ceb38a56965260ae7b15c97c55588dDaniel Lehmann final Menu menu = popupMenu.getMenu(); 414ab8dbcc888ceb38a56965260ae7b15c97c55588dDaniel Lehmann for (int i = 0; i < mFields.getChildCount(); i++) { 4155fb1fec44e99da51f5479450d066ca4484cda619Dmitri Plotnikov View child = mFields.getChildAt(i); 4165fb1fec44e99da51f5479450d066ca4484cda619Dmitri Plotnikov if (child instanceof KindSectionView) { 4175fb1fec44e99da51f5479450d066ca4484cda619Dmitri Plotnikov final KindSectionView sectionView = (KindSectionView) child; 41813cc7c59d540608a2f1c68be0a31a0560392e0aeKatherine Kuan // If the section is already visible (has 1 or more editors), then don't offer the 41913cc7c59d540608a2f1c68be0a31a0560392e0aeKatherine Kuan // option to add this type of field in the popup menu 42013cc7c59d540608a2f1c68be0a31a0560392e0aeKatherine Kuan if (sectionView.getEditorCount() > 0) { 42113cc7c59d540608a2f1c68be0a31a0560392e0aeKatherine Kuan continue; 42213cc7c59d540608a2f1c68be0a31a0560392e0aeKatherine Kuan } 4235ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov DataKind kind = sectionView.getKind(); 42413cc7c59d540608a2f1c68be0a31a0560392e0aeKatherine Kuan // not a list and already exists? ignore 42550a27b70581b0191995969c63edd1f6a3db3d1b7Makoto Onuki if ((kind.typeOverallMax == 1) && sectionView.getEditorCount() != 0) { 4265ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov continue; 4275ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 4285ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov if (DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME.equals(kind.mimeType)) { 4295ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov continue; 4305ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 4315ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 4325ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov if (DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME.equals(kind.mimeType) 4335ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov && mPhoneticName.getVisibility() == View.VISIBLE) { 4345fb1fec44e99da51f5479450d066ca4484cda619Dmitri Plotnikov continue; 4355fb1fec44e99da51f5479450d066ca4484cda619Dmitri Plotnikov } 4365ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 4372962187a8eb68924a0d52696e033f99c5bb12cb4Daniel Lehmann menu.add(Menu.NONE, fields.size(), Menu.NONE, sectionView.getTitle()); 4385fb1fec44e99da51f5479450d066ca4484cda619Dmitri Plotnikov fields.add(sectionView); 439bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmann } 440bb556954e29ae0700b729f128d8cd09ecdd91ee3Daniel Lehmann } 4415ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 442ab8dbcc888ceb38a56965260ae7b15c97c55588dDaniel Lehmann popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 443ab8dbcc888ceb38a56965260ae7b15c97c55588dDaniel Lehmann @Override 444ab8dbcc888ceb38a56965260ae7b15c97c55588dDaniel Lehmann public boolean onMenuItemClick(MenuItem item) { 445b8bfcb481de15c3d28deb6e0e53566bf54e59a01Daniel Lehmann final KindSectionView view = fields.get(item.getItemId()); 4465ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov if (DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME.equals(view.getKind().mimeType)) { 4475ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov mPhoneticNameAdded = true; 4485ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov updatePhoneticNameVisibility(); 4495ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } else { 4505ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov view.addItem(); 4515ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 452ab8dbcc888ceb38a56965260ae7b15c97c55588dDaniel Lehmann return true; 453ab8dbcc888ceb38a56965260ae7b15c97c55588dDaniel Lehmann } 454ab8dbcc888ceb38a56965260ae7b15c97c55588dDaniel Lehmann }); 4554cbb29a41b5cfec61b6b785794878cce4c00b445Makoto Onuki 456ab8dbcc888ceb38a56965260ae7b15c97c55588dDaniel Lehmann popupMenu.show(); 4574cbb29a41b5cfec61b6b785794878cce4c00b445Makoto Onuki } 4582ae666ec99ae9318936a9326e5243987e4e1c586Jeff Sharkey} 459