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.DefaultContactListAdapter;
32a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.DirectoryListLoader;
3330868d4ef831b6ff7b2e7a00027bb0222d93135dChiao Chengimport com.android.contacts.common.list.ShortcutIntentBuilder;
3430868d4ef831b6ff7b2e7a00027bb0222d93135dChiao Chengimport com.android.contacts.common.list.ShortcutIntentBuilder.OnShortcutIntentCreatedListener;
35e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng
36732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov/**
37416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov * Fragment for the contact list used for browsing contacts (as compared to
38416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov * picking a contact with one of the PICK or SHORTCUT intents).
39732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov */
40413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikovpublic class ContactPickerFragment extends ContactEntryListFragment<ContactEntryListAdapter>
418a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov        implements OnShortcutIntentCreatedListener {
42732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
4386092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    private static final String KEY_EDIT_MODE = "editMode";
4486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    private static final String KEY_CREATE_CONTACT_ENABLED = "createContactEnabled";
4586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    private static final String KEY_SHORTCUT_REQUESTED = "shortcutRequested";
4686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
47416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov    private OnContactPickerActionListener mListener;
48732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    private boolean mCreateContactEnabled;
4986092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    private boolean mEditMode;
508a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov    private boolean mShortcutRequested;
51732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
52d621f71428a7fd1aa15bd101423c9a690b44ea07Dmitri Plotnikov    public ContactPickerFragment() {
53d621f71428a7fd1aa15bd101423c9a690b44ea07Dmitri Plotnikov        setPhotoLoaderEnabled(true);
54d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        setSectionHeaderDisplayEnabled(true);
555245ea63b4cca18ee504b27abd534fc13d33dea9Dmitri Plotnikov        setVisibleScrollbarEnabled(true);
5684b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov        setQuickContactEnabled(false);
574d174aad97cd382f810e3bf1a7f1f4f4772be118Dmitri Plotnikov        setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_CONTACT_SHORTCUT);
58d621f71428a7fd1aa15bd101423c9a690b44ea07Dmitri Plotnikov    }
59d621f71428a7fd1aa15bd101423c9a690b44ea07Dmitri Plotnikov
60416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov    public void setOnContactPickerActionListener(OnContactPickerActionListener listener) {
61732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        mListener = listener;
62732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    }
63732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
648a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov    public boolean isCreateContactEnabled() {
658a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov        return mCreateContactEnabled;
668a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov    }
678a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov
68b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov    public void setCreateContactEnabled(boolean flag) {
69b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov        this.mCreateContactEnabled = flag;
70b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov    }
71b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov
7286092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    public boolean isEditMode() {
7386092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        return mEditMode;
7486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    }
7586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
7686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    public void setEditMode(boolean flag) {
7786092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        mEditMode = flag;
7886092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    }
7986092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
808a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov    public void setShortcutRequested(boolean flag) {
818a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov        mShortcutRequested = flag;
82b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov    }
83b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov
84b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov    @Override
8586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    public void onSaveInstanceState(Bundle outState) {
8686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        super.onSaveInstanceState(outState);
8786092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        outState.putBoolean(KEY_EDIT_MODE, mEditMode);
8886092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        outState.putBoolean(KEY_CREATE_CONTACT_ENABLED, mCreateContactEnabled);
8986092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        outState.putBoolean(KEY_SHORTCUT_REQUESTED, mShortcutRequested);
9086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    }
9186092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
9286092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    @Override
9386092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    public void restoreSavedState(Bundle savedState) {
9486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        super.restoreSavedState(savedState);
9586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
9686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        if (savedState == null) {
9786092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov            return;
9886092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        }
9986092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
10086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        mEditMode = savedState.getBoolean(KEY_EDIT_MODE);
10186092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        mCreateContactEnabled = savedState.getBoolean(KEY_CREATE_CONTACT_ENABLED);
10286092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        mShortcutRequested = savedState.getBoolean(KEY_SHORTCUT_REQUESTED);
10386092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    }
10486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
10586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    @Override
106bba62ac4a2d519be8e4896261d14b168fa49fbdfDmitri Plotnikov    protected void onCreateView(LayoutInflater inflater, ViewGroup container) {
107bba62ac4a2d519be8e4896261d14b168fa49fbdfDmitri Plotnikov        super.onCreateView(inflater, container);
108b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov        if (mCreateContactEnabled) {
109b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov            getListView().addHeaderView(inflater.inflate(R.layout.create_new_contact, null, false));
110b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov        }
111b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov    }
112b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov
113732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    @Override
114b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
11586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        if (position == 0 && mCreateContactEnabled) {
116b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov            mListener.onCreateNewContactAction();
117b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov        } else {
118b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov            super.onItemClick(parent, view, position, id);
119b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov        }
120b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov    }
121b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov
122b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov    @Override
123732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    protected void onItemClick(int position, long id) {
124d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        Uri uri;
125d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        if (isLegacyCompatibilityMode()) {
126d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov            uri = ((LegacyContactListAdapter)getAdapter()).getPersonUri(position);
127416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov        } else {
128d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov            uri = ((ContactListAdapter)getAdapter()).getContactUri(position);
129d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        }
13086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        if (mEditMode) {
13186092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov            editContact(uri);
13286092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        } else  if (mShortcutRequested) {
133d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov            ShortcutIntentBuilder builder = new ShortcutIntentBuilder(getActivity(), this);
134d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov            builder.createContactShortcutIntent(uri);
135d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov        } else {
13686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov            pickContact(uri);
137732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov        }
138732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    }
139732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
14086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    public void createNewContact() {
14186092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        mListener.onCreateNewContactAction();
14286092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    }
14386092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
14486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    public void editContact(Uri contactUri) {
14586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        mListener.onEditContactAction(contactUri);
14686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    }
14786092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
14886092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    public void pickContact(Uri uri) {
14986092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov        mListener.onPickContactAction(uri);
15086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov    }
15186092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov
152732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    @Override
153413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov    protected ContactEntryListAdapter createListAdapter() {
1541ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov        if (!isLegacyCompatibilityMode()) {
15558be7ed2428ba22400cc342f5e07e8ff99e91380Dmitri Plotnikov            DefaultContactListAdapter adapter = new DefaultContactListAdapter(getActivity());
156be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan            adapter.setFilter(ContactListFilter.createFilterWithType(
157be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan                    ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS));
158413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov            adapter.setSectionHeaderDisplayEnabled(true);
159413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov            adapter.setDisplayPhotos(true);
160413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov            adapter.setQuickContactEnabled(false);
161413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov            return adapter;
162413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov        } else {
163413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov            LegacyContactListAdapter adapter = new LegacyContactListAdapter(getActivity());
164413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov            adapter.setSectionHeaderDisplayEnabled(false);
165413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov            adapter.setDisplayPhotos(false);
166413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov            return adapter;
167413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov        }
168413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov    }
169b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov
170413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov    @Override
171413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov    protected void configureAdapter() {
172413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov        super.configureAdapter();
173d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov
174413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov        ContactEntryListAdapter adapter = getAdapter();
175e44b043f8a49c0974bd2f705f98ac3277aaf1b67Dmitri Plotnikov
17668e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov        // If "Create new contact" is shown, don't display the empty list UI
17768e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov        adapter.setEmptyListEnabled(!isCreateContactEnabled());
178732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    }
179732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov
180732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    @Override
181732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    protected View inflateView(LayoutInflater inflater, ViewGroup container) {
18284b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov        return inflater.inflate(R.layout.contact_picker_content, null);
183732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov    }
1848a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov
18568e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov    @Override
1868a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov    public void onShortcutIntentCreated(Uri uri, Intent shortcutIntent) {
1878a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov        mListener.onShortcutIntentCreated(shortcutIntent);
1888a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov    }
189d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov
190d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov    @Override
191e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    public void onPickerResult(Intent data) {
192e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov        mListener.onPickContactAction(data.getData());
193d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov    }
194732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov}
195