JoinContactListFragment.java revision b22ca30163f5f99f07b906c20fd1a798541448a5
16e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov/*
26e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * Copyright (C) 2010 The Android Open Source Project
36e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov *
46e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License");
56e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * you may not use this file except in compliance with the License.
66e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * You may obtain a copy of the License at
76e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov *
86e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov *      http://www.apache.org/licenses/LICENSE-2.0
96e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov *
106e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * Unless required by applicable law or agreed to in writing, software
116e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS,
126e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * See the License for the specific language governing permissions and
146e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * limitations under the License.
156e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov */
166e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikovpackage com.android.contacts.list;
176e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov
18e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikovimport com.android.contacts.ContactsSearchManager;
19caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikovimport com.android.contacts.R;
206e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov
21e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.app.Activity;
22e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikovimport android.app.LoaderManager.LoaderCallbacks;
23e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.content.ContentUris;
243c46291ef057eaf7b7f8ca5971e59bebe734a660Jeff Hamiltonimport android.content.CursorLoader;
25e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikovimport android.content.Intent;
263c46291ef057eaf7b7f8ca5971e59bebe734a660Jeff Hamiltonimport android.content.Loader;
27e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.database.Cursor;
28e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.os.Bundle;
29e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.provider.ContactsContract.Contacts;
30caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikovimport android.view.LayoutInflater;
31caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikovimport android.view.View;
3259fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikovimport android.view.ViewGroup;
33e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.widget.TextView;
346e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov
356e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov/**
3659fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikov * Fragment for the Join Contact list.
376e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov */
38e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovpublic class JoinContactListFragment extends ContactEntryListFragment<JoinContactListAdapter> {
39e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
40e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    private static final int DISPLAY_NAME_LOADER = -2;
41e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
42e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    private OnContactPickerActionListener mListener;
43e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    private long mTargetContactId;
44e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    private boolean mAllContactsListShown = false;
45e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
46e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov    private LoaderCallbacks<Cursor> mLoaderCallbacks = new LoaderCallbacks<Cursor>() {
47e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov
48e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov        @Override
49e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
50e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov            switch (id) {
51e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                case DISPLAY_NAME_LOADER: {
52e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                    // Loader for the display name of the target contact
53e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                    return new CursorLoader(getActivity(),
54e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                            ContentUris.withAppendedId(Contacts.CONTENT_URI, mTargetContactId),
55e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                            new String[] { Contacts.DISPLAY_NAME }, null, null, null);
56e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                }
57e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                case JoinContactListAdapter.PARTITION_ALL_CONTACTS: {
58e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                    JoinContactLoader loader = new JoinContactLoader(getActivity());
59e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                    JoinContactListAdapter adapter = getAdapter();
60e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                    if (adapter != null) {
61e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                        adapter.configureLoader(loader, 0);
62e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                    }
63e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                    return loader;
64e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                }
65e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov            }
66e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov            throw new IllegalArgumentException("No loader for ID=" + id);
67e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov        }
68e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov
69e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov        @Override
70e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
71e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov            switch (loader.getId()) {
72e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                case DISPLAY_NAME_LOADER: {
73e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                    if (data != null && data.moveToFirst()) {
74e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                        showTargetContactName(data.getString(0));
75e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                    }
76e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                    break;
77e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                }
78e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                case JoinContactListAdapter.PARTITION_ALL_CONTACTS: {
79e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                    setAizyEnabled(mAllContactsListShown);
80e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov
81e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                    JoinContactListAdapter adapter = getAdapter();
82e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                    Cursor suggestionsCursor = ((JoinContactLoader)loader).getSuggestionsCursor();
83e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                    adapter.setSuggestionsCursor(suggestionsCursor);
84e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                    onPartitionLoaded(JoinContactListAdapter.PARTITION_ALL_CONTACTS, data);
85e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                    break;
86e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                }
87e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov            }
88e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov        }
89e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov    };
90e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov
91e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    public JoinContactListFragment() {
92e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        setPhotoLoaderEnabled(true);
93e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        setSectionHeaderDisplayEnabled(true);
94e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov        setAizyEnabled(false);
95b22ca30163f5f99f07b906c20fd1a798541448a5Dmitri Plotnikov        setQuickContactEnabled(false);
96e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    }
97e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
98e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    public void setOnContactPickerActionListener(OnContactPickerActionListener listener) {
99e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        mListener = listener;
100e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    }
101e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
102e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    @Override
103fec29c7320c6c45aff69dbd6ec0edb267fb402f4Daniel Lehmann    protected void startLoading() {
1044e0ce3fb44125453e0ad723d7e3d3e89ad639e01Dmitri Plotnikov        configureAdapter();
1054e0ce3fb44125453e0ad723d7e3d3e89ad639e01Dmitri Plotnikov
106e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov        getLoaderManager().initLoader(DISPLAY_NAME_LOADER, null, mLoaderCallbacks);
107e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov        getLoaderManager().initLoader(JoinContactListAdapter.PARTITION_ALL_CONTACTS,
108e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                null, mLoaderCallbacks);
109e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    }
110e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
111e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov    private void showTargetContactName(String displayName) {
112e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        Activity activity = getActivity();
113e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        TextView blurbView = (TextView)activity.findViewById(R.id.join_contact_blurb);
114e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        String blurb = activity.getString(R.string.blurbJoinContactDataWith, displayName);
115e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        blurbView.setText(blurb);
116e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    }
117e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
118e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    public void setTargetContactId(long targetContactId) {
119e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        mTargetContactId = targetContactId;
120e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    }
121e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
122e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    @Override
123e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    public JoinContactListAdapter createListAdapter() {
124e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        return new JoinContactListAdapter(getActivity());
125e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    }
1266e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov
1276e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    @Override
128e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    protected void configureAdapter() {
129e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        super.configureAdapter();
130e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        JoinContactListAdapter adapter = getAdapter();
131e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        adapter.setAllContactsListShown(mAllContactsListShown);
132e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        adapter.setTargetContactId(mTargetContactId);
1336e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    }
1346e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov
1356e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    @Override
13659fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikov    protected View inflateView(LayoutInflater inflater, ViewGroup container) {
13759fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikov        return inflater.inflate(R.layout.contacts_list_content_join, null);
1386e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    }
139caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov
140caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov    @Override
14159fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikov    protected void onItemClick(int position, long id) {
142e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        JoinContactListAdapter adapter = getAdapter();
143e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov        int partition = adapter.getPartitionForPosition(position);
144e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov        if (partition == JoinContactListAdapter.PARTITION_SHOW_ALL_CONTACTS) {
145e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov            mAllContactsListShown = true;
146e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov            configureAdapter();
147e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov            getLoaderManager().restartLoader(JoinContactListAdapter.PARTITION_ALL_CONTACTS,
148e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                    null, mLoaderCallbacks);
149e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        } else {
150e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov            mListener.onPickContactAction(adapter.getContactUri(position));
151e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        }
152caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov    }
153e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov
154e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    @Override
155e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    public void startSearch(String initialQuery) {
156e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov        ContactsRequest request = new ContactsRequest();
157e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov        request.setActionCode(ContactsRequest.ACTION_PICK_CONTACT);
1581c5c8e23849ac3babb2bdec65ec63c190a5c40dfDmitri Plotnikov        request.setDirectorySearchEnabled(false);
159e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov        ContactsSearchManager.startSearchForResult(getActivity(), initialQuery,
160e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov                ACTIVITY_REQUEST_CODE_PICKER, request);
161e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    }
162e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov
163e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    @Override
164e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    public void onPickerResult(Intent data) {
165e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov        mListener.onPickContactAction(data.getData());
166e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    }
1676e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov}
168