1732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov/*
2732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * Copyright (C) 2010 The Android Open Source Project
3732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov *
4732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License");
5732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * you may not use this file except in compliance with the License.
6732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * You may obtain a copy of the License at
7732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov *
8732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov *      http://www.apache.org/licenses/LICENSE-2.0
9732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov *
10732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software
11732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS,
12732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * See the License for the specific language governing permissions and
14732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * limitations under the License.
15732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov */
16732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikovpackage com.android.contacts.list;
17732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
188a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikovimport android.content.Intent;
198a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikovimport android.net.Uri;
2086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikovimport android.os.Bundle;
21732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikovimport android.view.LayoutInflater;
22732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikovimport android.view.View;
23732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikovimport android.view.ViewGroup;
24b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikovimport android.widget.AdapterView;
25732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
26e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.R;
27a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.ContactEntryListAdapter;
28821a657d618285c04cbb3c440f1777a08381f868Chiao Chengimport com.android.contacts.common.list.ContactEntryListFragment;
29a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.ContactListAdapter;
30a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.ContactListFilter;
31a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.DirectoryListLoader;
3230868d4ef831b6ff7b2e7a00027bb0222d93135dChiao Chengimport com.android.contacts.common.list.ShortcutIntentBuilder;
3330868d4ef831b6ff7b2e7a00027bb0222d93135dChiao Chengimport com.android.contacts.common.list.ShortcutIntentBuilder.OnShortcutIntentCreatedListener;
34e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng
35732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov/**
36416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov * Fragment for the contact list used for browsing contacts (as compared to
37416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov * picking a contact with one of the PICK or SHORTCUT intents).
38732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov */
39413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikovpublic class ContactPickerFragment extends ContactEntryListFragment<ContactEntryListAdapter>
408a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov        implements OnShortcutIntentCreatedListener {
41732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
4286092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    private static final String KEY_EDIT_MODE = "editMode";
4386092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    private static final String KEY_CREATE_CONTACT_ENABLED = "createContactEnabled";
4486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    private static final String KEY_SHORTCUT_REQUESTED = "shortcutRequested";
4586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
46416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov    private OnContactPickerActionListener mListener;
47732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    private boolean mCreateContactEnabled;
4886092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    private boolean mEditMode;
498a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov    private boolean mShortcutRequested;
50732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
51d621f71428a7fd1aa15bd101423c9a690b44ea07Dmitri Plotnikov    public ContactPickerFragment() {
52d621f71428a7fd1aa15bd101423c9a690b44ea07Dmitri Plotnikov        setPhotoLoaderEnabled(true);
53d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        setSectionHeaderDisplayEnabled(true);
545245ea63b4cca18ee504b27abd534fc13d33dea9Dmitri Plotnikov        setVisibleScrollbarEnabled(true);
5584b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov        setQuickContactEnabled(false);
564d174aad97cd382f810e3bf1a7f1f4f4772be118Dmitri Plotnikov        setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_CONTACT_SHORTCUT);
57d621f71428a7fd1aa15bd101423c9a690b44ea07Dmitri Plotnikov    }
58d621f71428a7fd1aa15bd101423c9a690b44ea07Dmitri Plotnikov
59416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov    public void setOnContactPickerActionListener(OnContactPickerActionListener listener) {
60732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        mListener = listener;
61732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    }
62732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
638a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov    public boolean isCreateContactEnabled() {
648a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov        return mCreateContactEnabled;
658a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov    }
668a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov
67b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov    public void setCreateContactEnabled(boolean flag) {
68b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov        this.mCreateContactEnabled = flag;
69b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov    }
70b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov
7186092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    public boolean isEditMode() {
7286092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        return mEditMode;
7386092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    }
7486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
7586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    public void setEditMode(boolean flag) {
7686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        mEditMode = flag;
7786092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    }
7886092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
798a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov    public void setShortcutRequested(boolean flag) {
808a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov        mShortcutRequested = flag;
81b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov    }
82b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov
83b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov    @Override
8486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    public void onSaveInstanceState(Bundle outState) {
8586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        super.onSaveInstanceState(outState);
8686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        outState.putBoolean(KEY_EDIT_MODE, mEditMode);
8786092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        outState.putBoolean(KEY_CREATE_CONTACT_ENABLED, mCreateContactEnabled);
8886092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        outState.putBoolean(KEY_SHORTCUT_REQUESTED, mShortcutRequested);
8986092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    }
9086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
9186092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    @Override
9286092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    public void restoreSavedState(Bundle savedState) {
9386092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        super.restoreSavedState(savedState);
9486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
9586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        if (savedState == null) {
9686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov            return;
9786092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        }
9886092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
9986092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        mEditMode = savedState.getBoolean(KEY_EDIT_MODE);
10086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        mCreateContactEnabled = savedState.getBoolean(KEY_CREATE_CONTACT_ENABLED);
10186092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        mShortcutRequested = savedState.getBoolean(KEY_SHORTCUT_REQUESTED);
10286092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    }
10386092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
10486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    @Override
105bba62ac4a2d519be8e4896261d14b168fa49fbdfDmitri Plotnikov    protected void onCreateView(LayoutInflater inflater, ViewGroup container) {
106bba62ac4a2d519be8e4896261d14b168fa49fbdfDmitri Plotnikov        super.onCreateView(inflater, container);
107bbd220183e9bc6d0b056af3c68fa4a31f5b747f2Brian Attwell        if (mCreateContactEnabled && isLegacyCompatibilityMode()) {
108bbd220183e9bc6d0b056af3c68fa4a31f5b747f2Brian Attwell            // Since we are using the legacy adapter setShowCreateContact(true) isn't supported.
109bbd220183e9bc6d0b056af3c68fa4a31f5b747f2Brian Attwell            // So we need to add an ugly header above the list.
110b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov            getListView().addHeaderView(inflater.inflate(R.layout.create_new_contact, null, false));
111b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov        }
112b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov    }
113b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov
114732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    @Override
115b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
1169e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang        if (position == 0 && mCreateContactEnabled && mListener != null) {
117b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov            mListener.onCreateNewContactAction();
118b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov        } else {
119b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov            super.onItemClick(parent, view, position, id);
120b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov        }
121b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov    }
122b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov
123b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov    @Override
124732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    protected void onItemClick(int position, long id) {
125d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        Uri uri;
126d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        if (isLegacyCompatibilityMode()) {
127d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov            uri = ((LegacyContactListAdapter)getAdapter()).getPersonUri(position);
128416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov        } else {
129d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov            uri = ((ContactListAdapter)getAdapter()).getContactUri(position);
130d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        }
131b831b14466d640fe260ba2e752c88c7fcd62a14bBrian Attwell        if (uri == null) {
132b831b14466d640fe260ba2e752c88c7fcd62a14bBrian Attwell            return;
133b831b14466d640fe260ba2e752c88c7fcd62a14bBrian Attwell        }
13486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        if (mEditMode) {
13586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov            editContact(uri);
13686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        } else  if (mShortcutRequested) {
137d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov            ShortcutIntentBuilder builder = new ShortcutIntentBuilder(getActivity(), this);
138d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov            builder.createContactShortcutIntent(uri);
139d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        } else {
14086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov            pickContact(uri);
141732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        }
142732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    }
143732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
14486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    public void createNewContact() {
1459e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang        if (mListener != null) {
1469e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang            mListener.onCreateNewContactAction();
1479e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang        }
14886092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    }
14986092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
15086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    public void editContact(Uri contactUri) {
1519e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang        if (mListener != null) {
1529e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang            mListener.onEditContactAction(contactUri);
1539e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang        }
15486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    }
15586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
15686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    public void pickContact(Uri uri) {
1579e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang        if (mListener != null) {
1589e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang            mListener.onPickContactAction(uri);
1599e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang        }
16086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    }
16186092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
162732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    @Override
163413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov    protected ContactEntryListAdapter createListAdapter() {
1641ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        if (!isLegacyCompatibilityMode()) {
165bbd220183e9bc6d0b056af3c68fa4a31f5b747f2Brian Attwell            HeaderEntryContactListAdapter adapter
166bbd220183e9bc6d0b056af3c68fa4a31f5b747f2Brian Attwell                    = new HeaderEntryContactListAdapter(getActivity());
167be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            adapter.setFilter(ContactListFilter.createFilterWithType(
168be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                    ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS));
169413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov            adapter.setSectionHeaderDisplayEnabled(true);
170413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov            adapter.setDisplayPhotos(true);
171413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov            adapter.setQuickContactEnabled(false);
172bbd220183e9bc6d0b056af3c68fa4a31f5b747f2Brian Attwell            adapter.setShowCreateContact(mCreateContactEnabled);
173413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov            return adapter;
174413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov        } else {
175413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov            LegacyContactListAdapter adapter = new LegacyContactListAdapter(getActivity());
176413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov            adapter.setSectionHeaderDisplayEnabled(false);
177413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov            adapter.setDisplayPhotos(false);
178413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov            return adapter;
179413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov        }
180413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov    }
181b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov
182413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov    @Override
183413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov    protected void configureAdapter() {
184413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov        super.configureAdapter();
185d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov
186413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov        ContactEntryListAdapter adapter = getAdapter();
187e44b043f8a49c0974bd2f705f98ac3277aaf1b67Dmitri Plotnikov
18868e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov        // If "Create new contact" is shown, don't display the empty list UI
18968e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov        adapter.setEmptyListEnabled(!isCreateContactEnabled());
190732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    }
191732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
192732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    @Override
193732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    protected View inflateView(LayoutInflater inflater, ViewGroup container) {
19484b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov        return inflater.inflate(R.layout.contact_picker_content, null);
195732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    }
1968a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov
19768e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov    @Override
1988a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov    public void onShortcutIntentCreated(Uri uri, Intent shortcutIntent) {
1999e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang        if (mListener != null) {
2009e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang            mListener.onShortcutIntentCreated(shortcutIntent);
2019e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang        }
2028a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov    }
203d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov
204d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov    @Override
205e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    public void onPickerResult(Intent data) {
2069e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang        if (mListener != null) {
2079e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang            mListener.onPickContactAction(data.getData());
2089e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang        }
209d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov    }
210732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov}
211