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
18caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikovimport com.android.contacts.R;
196e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov
20e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.app.Activity;
21e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikovimport android.app.LoaderManager.LoaderCallbacks;
22e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.content.ContentUris;
233c46291ef057eaf7b7f8ca5971e59bebe734a660Jeff Hamiltonimport android.content.CursorLoader;
24e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikovimport android.content.Intent;
253c46291ef057eaf7b7f8ca5971e59bebe734a660Jeff Hamiltonimport android.content.Loader;
26e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.database.Cursor;
27e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.os.Bundle;
28e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.provider.ContactsContract.Contacts;
29caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikovimport android.view.LayoutInflater;
30caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikovimport android.view.View;
3159fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikovimport android.view.ViewGroup;
32e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.widget.TextView;
336e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov
346e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov/**
3559fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikov * Fragment for the Join Contact list.
366e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov */
37e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovpublic class JoinContactListFragment extends ContactEntryListFragment<JoinContactListAdapter> {
38e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
39e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    private static final int DISPLAY_NAME_LOADER = -2;
40e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
41a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    private static final String KEY_TARGET_CONTACT_ID = "targetContactId";
42d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov
43e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    private OnContactPickerActionListener mListener;
44e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    private long mTargetContactId;
45e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
46a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    private final 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: {
79a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                    Cursor suggestionsCursor = ((JoinContactLoader) loader).getSuggestionsCursor();
80d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov                    onContactListLoaded(suggestionsCursor, data);
81e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                    break;
82e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                }
83e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov            }
84e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov        }
85d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov
864ef95cc3329b4ad9fa450e4090efaad9935d493fDianne Hackborn        public void onLoaderReset(Loader<Cursor> loader) {
874ef95cc3329b4ad9fa450e4090efaad9935d493fDianne Hackborn        }
88e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov    };
89e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov
90e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    public JoinContactListFragment() {
91e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        setPhotoLoaderEnabled(true);
92e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        setSectionHeaderDisplayEnabled(true);
935245ea63b4cca18ee504b27abd534fc13d33dea9Dmitri Plotnikov        setVisibleScrollbarEnabled(false);
94b22ca30163f5f99f07b906c20fd1a798541448a5Dmitri Plotnikov        setQuickContactEnabled(false);
95e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    }
96e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
97e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    public void setOnContactPickerActionListener(OnContactPickerActionListener listener) {
98e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        mListener = listener;
99e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    }
100e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
101e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    @Override
102fec29c7320c6c45aff69dbd6ec0edb267fb402f4Daniel Lehmann    protected void startLoading() {
1034e0ce3fb44125453e0ad723d7e3d3e89ad639e01Dmitri Plotnikov        configureAdapter();
1044e0ce3fb44125453e0ad723d7e3d3e89ad639e01Dmitri Plotnikov
105e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov        getLoaderManager().initLoader(DISPLAY_NAME_LOADER, null, mLoaderCallbacks);
106e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov        getLoaderManager().initLoader(JoinContactListAdapter.PARTITION_ALL_CONTACTS,
107e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov                null, mLoaderCallbacks);
108e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    }
109e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
110a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    private void onContactListLoaded(Cursor suggestionsCursor, Cursor allContactsCursor) {
111d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov        JoinContactListAdapter adapter = getAdapter();
112d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov        adapter.setSuggestionsCursor(suggestionsCursor);
113a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        setVisibleScrollbarEnabled(true);
114a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        onPartitionLoaded(JoinContactListAdapter.PARTITION_ALL_CONTACTS, allContactsCursor);
115d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov    }
116d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov
117e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov    private void showTargetContactName(String displayName) {
118e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        Activity activity = getActivity();
119a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        TextView blurbView = (TextView) activity.findViewById(R.id.join_contact_blurb);
120e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        String blurb = activity.getString(R.string.blurbJoinContactDataWith, displayName);
121e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        blurbView.setText(blurb);
122e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    }
123e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
124e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    public void setTargetContactId(long targetContactId) {
125e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        mTargetContactId = targetContactId;
126e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    }
127e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
128e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    @Override
129e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    public JoinContactListAdapter createListAdapter() {
130e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        return new JoinContactListAdapter(getActivity());
131e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    }
1326e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov
1336e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    @Override
134e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    protected void configureAdapter() {
135e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        super.configureAdapter();
136e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        JoinContactListAdapter adapter = getAdapter();
137e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        adapter.setTargetContactId(mTargetContactId);
1386e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    }
1396e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov
1406e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    @Override
14159fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikov    protected View inflateView(LayoutInflater inflater, ViewGroup container) {
142d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov        return inflater.inflate(R.layout.join_contact_picker_list_content, null);
1436e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    }
144caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov
145caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov    @Override
14659fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikov    protected void onItemClick(int position, long id) {
147e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        JoinContactListAdapter adapter = getAdapter();
148e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov        int partition = adapter.getPartitionForPosition(position);
149a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        mListener.onPickContactAction(adapter.getContactUri(position));
150caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov    }
151e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov
152e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    @Override
153e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    public void onPickerResult(Intent data) {
154e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov        mListener.onPickContactAction(data.getData());
155e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    }
156d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov
157d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov    @Override
158d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov    public void onSaveInstanceState(Bundle outState) {
159d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov        super.onSaveInstanceState(outState);
160a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        outState.putLong(KEY_TARGET_CONTACT_ID, mTargetContactId);
161d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov    }
162d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov
163d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov    @Override
164d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov    public void restoreSavedState(Bundle savedState) {
165d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov        super.restoreSavedState(savedState);
166d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov        if (savedState != null) {
167a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa            mTargetContactId = savedState.getLong(KEY_TARGET_CONTACT_ID);
168d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov        }
169d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov    }
1706e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov}
171