GroupDetailFragment.java revision be18de05d6f6a107c552e369bce58f51c946fde7
1/*
2 * Copyright (C) 2011 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 */
16
17package com.android.contacts.group;
18
19import com.android.contacts.ContactPhotoManager;
20import com.android.contacts.GroupMetaData;
21import com.android.contacts.GroupMetaDataLoader;
22import com.android.contacts.R;
23import com.android.contacts.activities.GroupDetailActivity;
24import com.android.contacts.list.ContactListAdapter;
25import com.android.contacts.list.ContactListFilter;
26import com.android.contacts.list.DefaultContactListAdapter;
27
28import android.accounts.Account;
29import android.app.Activity;
30import android.app.Fragment;
31import android.app.LoaderManager;
32import android.app.LoaderManager.LoaderCallbacks;
33import android.content.ContentValues;
34import android.content.Context;
35import android.content.CursorLoader;
36import android.content.Intent;
37import android.content.Loader;
38import android.database.Cursor;
39import android.net.Uri;
40import android.os.Bundle;
41import android.provider.ContactsContract;
42import android.provider.ContactsContract.Directory;
43import android.view.LayoutInflater;
44import android.view.View;
45import android.view.ViewGroup;
46import android.widget.AbsListView;
47import android.widget.AbsListView.OnScrollListener;
48import android.widget.AdapterView;
49import android.widget.AdapterView.OnItemClickListener;
50import android.widget.ListView;
51import android.widget.TextView;
52
53import java.util.ArrayList;
54
55/**
56 * Displays the details of a group and shows a list of actions possible for the group.
57 */
58public class GroupDetailFragment extends Fragment implements OnScrollListener {
59
60    public static interface Listener {
61        /**
62         * The group title has been loaded
63         */
64        public void onGroupTitleUpdated(String title);
65
66        /**
67         * The number of group members has been determined
68         */
69        public void onGroupSizeUpdated(String size);
70    }
71
72    private static final String TAG = "GroupDetailFragment";
73
74    private static final int LOADER_METADATA = 0;
75    private static final int LOADER_MEMBERS = 1;
76
77    private Context mContext;
78
79    private View mRootView;
80    private TextView mGroupTitle;
81    private TextView mGroupSize;
82    private ListView mMemberListView;
83
84    private Listener mListener;
85
86    private ContactListAdapter mAdapter;
87    private ContactPhotoManager mPhotoManager;
88
89    private Uri mGroupUri;
90    private long mGroupId;
91
92    public GroupDetailFragment() {
93    }
94
95    @Override
96    public void onAttach(Activity activity) {
97        super.onAttach(activity);
98        mContext = activity;
99        configurePhotoLoader();
100    }
101
102    @Override
103    public void onDetach() {
104        super.onDetach();
105        mContext = null;
106    }
107
108    @Override
109    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
110        mRootView = inflater.inflate(R.layout.group_detail_fragment, container, false);
111        mGroupTitle = (TextView) mRootView.findViewById(R.id.group_title);
112        mGroupSize = (TextView) mRootView.findViewById(R.id.group_size);
113        mMemberListView = (ListView) mRootView.findViewById(android.R.id.list);
114        mMemberListView.setOnItemClickListener(new OnItemClickListener() {
115            @Override
116            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
117                // TODO: Open contact detail for this person
118            }
119        });
120        return mRootView;
121    }
122
123    public void loadGroup(Uri groupUri) {
124        mGroupUri= groupUri;
125        startGroupMetadataLoader();
126    }
127
128    private void configureAdapter(long groupId) {
129        mAdapter = new DefaultContactListAdapter(getActivity());
130        mAdapter.setSectionHeaderDisplayEnabled(false);
131        mAdapter.setDisplayPhotos(true);
132        mAdapter.setHasHeader(0, false);
133        mAdapter.setQuickContactEnabled(false);
134        mAdapter.setPinnedPartitionHeadersEnabled(false);
135        mAdapter.setContactNameDisplayOrder(ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY);
136        mAdapter.setSortOrder(ContactsContract.Preferences.SORT_ORDER_PRIMARY);
137        mAdapter.setPhotoLoader(mPhotoManager);
138        mAdapter.setFilter(ContactListFilter.createGroupFilter(groupId));
139        mMemberListView.setAdapter(mAdapter);
140    }
141
142    private void configurePhotoLoader() {
143        if (mContext != null) {
144            if (mPhotoManager == null) {
145                mPhotoManager = ContactPhotoManager.getInstance(mContext);
146            }
147            if (mMemberListView != null) {
148                mMemberListView.setOnScrollListener(this);
149            }
150            if (mAdapter != null) {
151                mAdapter.setPhotoLoader(mPhotoManager);
152            }
153        }
154    }
155
156    public void setListener(Listener value) {
157        mListener = value;
158    }
159
160    /**
161     * Start the loader to retrieve the metadata for this group.
162     */
163    private void startGroupMetadataLoader() {
164        getLoaderManager().destroyLoader(LOADER_METADATA);
165        getLoaderManager().restartLoader(LOADER_METADATA, null, mGroupMetadataLoaderListener);
166    }
167
168    /**
169     * Start the loader to retrieve the list of group members.
170     */
171    private void startGroupMembersLoader() {
172        getLoaderManager().destroyLoader(LOADER_MEMBERS);
173        getLoaderManager().restartLoader(LOADER_MEMBERS, null, mGroupMemberListLoaderListener);
174    }
175
176    /**
177     * The listener for the group metadata loader.
178     */
179    private final LoaderManager.LoaderCallbacks<Cursor> mGroupMetadataLoaderListener =
180            new LoaderCallbacks<Cursor>() {
181
182        @Override
183        public CursorLoader onCreateLoader(int id, Bundle args) {
184            return new GroupMetaDataLoader(mContext, mGroupUri);
185        }
186
187        @Override
188        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
189            bindGroupMetaData(data);
190
191            // Retrieve the list of members
192            configureAdapter(mGroupId);
193            startGroupMembersLoader();
194        }
195
196        @Override
197        public void onLoaderReset(Loader<Cursor> loader) {}
198    };
199
200    /**
201     * The listener for the group members list loader
202     */
203    private final LoaderManager.LoaderCallbacks<Cursor> mGroupMemberListLoaderListener =
204            new LoaderCallbacks<Cursor>() {
205
206        @Override
207        public CursorLoader onCreateLoader(int id, Bundle args) {
208            CursorLoader loader = new CursorLoader(mContext, null, null, null, null, null);
209            mAdapter.configureLoader(loader, Directory.DEFAULT);
210            return loader;
211        }
212
213        @Override
214        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
215            updateSize(Integer.toString(data.getCount()));
216            mAdapter.changeCursor(0, data);
217        }
218
219        @Override
220        public void onLoaderReset(Loader<Cursor> loader) {}
221    };
222
223    private void bindGroupMetaData(Cursor cursor) {
224        cursor.moveToPosition(-1);
225        if (cursor.moveToNext()) {
226            mGroupId = cursor.getLong(GroupMetaDataLoader.GROUP_ID);
227            updateTitle(cursor.getString(GroupMetaDataLoader.TITLE));
228        }
229    }
230
231    private void updateTitle(String title) {
232        if (mGroupTitle != null) {
233            mGroupTitle.setText(title);
234        } else {
235            mListener.onGroupTitleUpdated(title);
236        }
237    }
238
239    private void updateSize(String size) {
240        if (mGroupSize != null) {
241            mGroupSize.setText(size);
242        } else {
243            mListener.onGroupSizeUpdated(size);
244        }
245    }
246
247    @Override
248    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
249            int totalItemCount) {
250    }
251
252    @Override
253    public void onScrollStateChanged(AbsListView view, int scrollState) {
254        if (scrollState == OnScrollListener.SCROLL_STATE_FLING) {
255            mPhotoManager.pause();
256        } else {
257            mPhotoManager.resume();
258        }
259    }
260}
261