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.app.Activity;
19import android.app.LoaderManager.LoaderCallbacks;
20import android.content.ContentUris;
21import android.content.CursorLoader;
22import android.content.Intent;
23import android.content.Loader;
24import android.database.Cursor;
25import android.net.Uri;
26import android.os.Bundle;
27import android.provider.ContactsContract.Contacts;
28import android.text.TextUtils;
29import android.view.LayoutInflater;
30import android.view.View;
31import android.view.ViewGroup;
32import android.widget.TextView;
33
34import com.android.contacts.R;
35import com.android.contacts.common.list.ContactEntryListFragment;
36import com.android.contacts.common.list.ContactListItemView;
37import com.android.contacts.list.JoinContactLoader.JoinContactLoaderResult;
38
39/**
40 * Fragment for the Join Contact list.
41 */
42public class JoinContactListFragment extends ContactEntryListFragment<JoinContactListAdapter> {
43
44    private static final int DISPLAY_NAME_LOADER = -2;
45
46    private static final String KEY_TARGET_CONTACT_ID = "targetContactId";
47
48    private OnContactPickerActionListener mListener;
49    private long mTargetContactId;
50
51    private final LoaderCallbacks<Cursor> mLoaderCallbacks = new LoaderCallbacks<Cursor>() {
52
53        @Override
54        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
55            switch (id) {
56                case DISPLAY_NAME_LOADER: {
57                    // Loader for the display name of the target contact
58                    return new CursorLoader(getActivity(),
59                            ContentUris.withAppendedId(Contacts.CONTENT_URI, mTargetContactId),
60                            new String[] { Contacts.DISPLAY_NAME }, null, null, null);
61                }
62                case JoinContactListAdapter.PARTITION_ALL_CONTACTS: {
63                    JoinContactLoader loader = new JoinContactLoader(getActivity());
64                    JoinContactListAdapter adapter = getAdapter();
65                    if (adapter != null) {
66                        adapter.configureLoader(loader, 0);
67                    }
68                    return loader;
69                }
70            }
71            throw new IllegalArgumentException("No loader for ID=" + id);
72        }
73
74        @Override
75        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
76            switch (loader.getId()) {
77                case DISPLAY_NAME_LOADER: {
78                    if (data != null && data.moveToFirst()) {
79                        showTargetContactName(data.getString(0));
80                    }
81                    break;
82                }
83                case JoinContactListAdapter.PARTITION_ALL_CONTACTS: {
84                    if (data != null) {
85                        final Cursor suggestionsCursor =
86                                ((JoinContactLoaderResult) data).suggestionCursor;
87                        onContactListLoaded(suggestionsCursor, data);
88                    }
89                    break;
90                }
91            }
92        }
93
94        @Override
95        public void onLoaderReset(Loader<Cursor> loader) {
96        }
97    };
98
99    public JoinContactListFragment() {
100        setPhotoLoaderEnabled(true);
101        setSectionHeaderDisplayEnabled(true);
102        setVisibleScrollbarEnabled(false);
103        setQuickContactEnabled(false);
104    }
105
106    public void setOnContactPickerActionListener(OnContactPickerActionListener listener) {
107        mListener = listener;
108    }
109
110    @Override
111    protected void startLoading() {
112        configureAdapter();
113
114        getLoaderManager().initLoader(DISPLAY_NAME_LOADER, null, mLoaderCallbacks);
115
116        // When this method is called, Uri to be used may be changed. We should use restartLoader()
117        // to load the parameter again.
118        getLoaderManager().restartLoader(JoinContactListAdapter.PARTITION_ALL_CONTACTS,
119                null, mLoaderCallbacks);
120    }
121
122    private void onContactListLoaded(Cursor suggestionsCursor, Cursor allContactsCursor) {
123        JoinContactListAdapter adapter = getAdapter();
124        adapter.setSuggestionsCursor(suggestionsCursor);
125        setVisibleScrollbarEnabled(true);
126        onPartitionLoaded(JoinContactListAdapter.PARTITION_ALL_CONTACTS, allContactsCursor);
127    }
128
129    private void showTargetContactName(String displayName) {
130        Activity activity = getActivity();
131        TextView blurbView = (TextView) activity.findViewById(R.id.join_contact_blurb);
132        final String name = !TextUtils.isEmpty(displayName) ? displayName
133            : activity.getString(R.string.missing_name);
134        String blurb = activity.getString(R.string.blurbJoinContactDataWith, name);
135        blurbView.setText(blurb);
136    }
137
138    public void setTargetContactId(long targetContactId) {
139        mTargetContactId = targetContactId;
140    }
141
142    @Override
143    public JoinContactListAdapter createListAdapter() {
144        JoinContactListAdapter adapter = new JoinContactListAdapter(getActivity());
145        adapter.setPhotoPosition(ContactListItemView.getDefaultPhotoPosition(true /* opposite */));
146        return adapter;
147    }
148
149    @Override
150    protected void configureAdapter() {
151        super.configureAdapter();
152        JoinContactListAdapter adapter = getAdapter();
153        adapter.setTargetContactId(mTargetContactId);
154    }
155
156    @Override
157    protected View inflateView(LayoutInflater inflater, ViewGroup container) {
158        return inflater.inflate(R.layout.join_contact_picker_list_content, null);
159    }
160
161    @Override
162    protected void onItemClick(int position, long id) {
163        final Uri contactUri = getAdapter().getContactUri(position);
164        if (contactUri != null) mListener.onPickContactAction(contactUri);
165    }
166
167    @Override
168    public void onPickerResult(Intent data) {
169        final Uri contactUri = data.getData();
170        if (contactUri != null) mListener.onPickContactAction(contactUri);
171    }
172
173    @Override
174    public void onSaveInstanceState(Bundle outState) {
175        super.onSaveInstanceState(outState);
176        outState.putLong(KEY_TARGET_CONTACT_ID, mTargetContactId);
177    }
178
179    @Override
180    public void restoreSavedState(Bundle savedState) {
181        super.restoreSavedState(savedState);
182        if (savedState != null) {
183            mTargetContactId = savedState.getLong(KEY_TARGET_CONTACT_ID);
184        }
185    }
186
187    @Override
188    public void setQueryString(String queryString, boolean delaySelection) {
189        super.setQueryString(queryString, delaySelection);
190
191        setSearchMode(!TextUtils.isEmpty(queryString));
192    }
193}
194