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