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