1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.contacts.list;
17
18import android.content.Intent;
19import android.net.Uri;
20import android.os.Bundle;
21import android.view.LayoutInflater;
22import android.view.View;
23import android.view.ViewGroup;
24import android.widget.AdapterView;
25
26import com.android.contacts.R;
27import com.android.contacts.common.list.ContactEntryListAdapter;
28import com.android.contacts.common.list.ContactEntryListFragment;
29import com.android.contacts.common.list.ContactListAdapter;
30import com.android.contacts.common.list.ContactListFilter;
31import com.android.contacts.common.list.DirectoryListLoader;
32import com.android.contacts.common.list.ShortcutIntentBuilder;
33import com.android.contacts.common.list.ShortcutIntentBuilder.OnShortcutIntentCreatedListener;
34
35/**
36 * Fragment for the contact list used for browsing contacts (as compared to
37 * picking a contact with one of the PICK or SHORTCUT intents).
38 */
39public class ContactPickerFragment extends ContactEntryListFragment<ContactEntryListAdapter>
40        implements OnShortcutIntentCreatedListener {
41
42    private static final String KEY_EDIT_MODE = "editMode";
43    private static final String KEY_CREATE_CONTACT_ENABLED = "createContactEnabled";
44    private static final String KEY_SHORTCUT_REQUESTED = "shortcutRequested";
45
46    private OnContactPickerActionListener mListener;
47    private boolean mCreateContactEnabled;
48    private boolean mEditMode;
49    private boolean mShortcutRequested;
50
51    public ContactPickerFragment() {
52        setPhotoLoaderEnabled(true);
53        setSectionHeaderDisplayEnabled(true);
54        setVisibleScrollbarEnabled(true);
55        setQuickContactEnabled(false);
56        setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_CONTACT_SHORTCUT);
57    }
58
59    public void setOnContactPickerActionListener(OnContactPickerActionListener listener) {
60        mListener = listener;
61    }
62
63    public boolean isCreateContactEnabled() {
64        return mCreateContactEnabled;
65    }
66
67    public void setCreateContactEnabled(boolean flag) {
68        this.mCreateContactEnabled = flag;
69    }
70
71    public boolean isEditMode() {
72        return mEditMode;
73    }
74
75    public void setEditMode(boolean flag) {
76        mEditMode = flag;
77    }
78
79    public void setShortcutRequested(boolean flag) {
80        mShortcutRequested = flag;
81    }
82
83    @Override
84    public void onSaveInstanceState(Bundle outState) {
85        super.onSaveInstanceState(outState);
86        outState.putBoolean(KEY_EDIT_MODE, mEditMode);
87        outState.putBoolean(KEY_CREATE_CONTACT_ENABLED, mCreateContactEnabled);
88        outState.putBoolean(KEY_SHORTCUT_REQUESTED, mShortcutRequested);
89    }
90
91    @Override
92    public void restoreSavedState(Bundle savedState) {
93        super.restoreSavedState(savedState);
94
95        if (savedState == null) {
96            return;
97        }
98
99        mEditMode = savedState.getBoolean(KEY_EDIT_MODE);
100        mCreateContactEnabled = savedState.getBoolean(KEY_CREATE_CONTACT_ENABLED);
101        mShortcutRequested = savedState.getBoolean(KEY_SHORTCUT_REQUESTED);
102    }
103
104    @Override
105    protected void onCreateView(LayoutInflater inflater, ViewGroup container) {
106        super.onCreateView(inflater, container);
107        if (mCreateContactEnabled && isLegacyCompatibilityMode()) {
108            // Since we are using the legacy adapter setShowCreateContact(true) isn't supported.
109            // So we need to add an ugly header above the list.
110            getListView().addHeaderView(inflater.inflate(R.layout.create_new_contact, null, false));
111        }
112    }
113
114    @Override
115    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
116        if (position == 0 && mCreateContactEnabled) {
117            mListener.onCreateNewContactAction();
118        } else {
119            super.onItemClick(parent, view, position, id);
120        }
121    }
122
123    @Override
124    protected void onItemClick(int position, long id) {
125        Uri uri;
126        if (isLegacyCompatibilityMode()) {
127            uri = ((LegacyContactListAdapter)getAdapter()).getPersonUri(position);
128        } else {
129            uri = ((ContactListAdapter)getAdapter()).getContactUri(position);
130        }
131        if (uri == null) {
132            return;
133        }
134        if (mEditMode) {
135            editContact(uri);
136        } else  if (mShortcutRequested) {
137            ShortcutIntentBuilder builder = new ShortcutIntentBuilder(getActivity(), this);
138            builder.createContactShortcutIntent(uri);
139        } else {
140            pickContact(uri);
141        }
142    }
143
144    public void createNewContact() {
145        mListener.onCreateNewContactAction();
146    }
147
148    public void editContact(Uri contactUri) {
149        mListener.onEditContactAction(contactUri);
150    }
151
152    public void pickContact(Uri uri) {
153        mListener.onPickContactAction(uri);
154    }
155
156    @Override
157    protected ContactEntryListAdapter createListAdapter() {
158        if (!isLegacyCompatibilityMode()) {
159            HeaderEntryContactListAdapter adapter
160                    = new HeaderEntryContactListAdapter(getActivity());
161            adapter.setFilter(ContactListFilter.createFilterWithType(
162                    ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS));
163            adapter.setSectionHeaderDisplayEnabled(true);
164            adapter.setDisplayPhotos(true);
165            adapter.setQuickContactEnabled(false);
166            adapter.setShowCreateContact(mCreateContactEnabled);
167            return adapter;
168        } else {
169            LegacyContactListAdapter adapter = new LegacyContactListAdapter(getActivity());
170            adapter.setSectionHeaderDisplayEnabled(false);
171            adapter.setDisplayPhotos(false);
172            return adapter;
173        }
174    }
175
176    @Override
177    protected void configureAdapter() {
178        super.configureAdapter();
179
180        ContactEntryListAdapter adapter = getAdapter();
181
182        // If "Create new contact" is shown, don't display the empty list UI
183        adapter.setEmptyListEnabled(!isCreateContactEnabled());
184    }
185
186    @Override
187    protected View inflateView(LayoutInflater inflater, ViewGroup container) {
188        return inflater.inflate(R.layout.contact_picker_content, null);
189    }
190
191    @Override
192    public void onShortcutIntentCreated(Uri uri, Intent shortcutIntent) {
193        mListener.onShortcutIntentCreated(shortcutIntent);
194    }
195
196    @Override
197    public void onPickerResult(Intent data) {
198        mListener.onPickContactAction(data.getData());
199    }
200}
201