Use group summary URI
- This is part 1 of showing more details in the group list.
This CL just uses an existing group URI and sets up the
UI to read from a cursor as the user scrolls the list
(instead of reading the entire list and storing it in memory)
- Include count of # members in a group as a subtitle for
each group
- Include the header as an optionally visible part of the
list item because we don't know how many groups are in an account.
Only show the header if it's the first group in an account.
- Refactor some of the code to make it simpler
Bug: 5039532
Change-Id: Ie01fd005416992c4a1b4d89a1591942dc601c894
diff --git a/res/layout/group_list_header_item.xml b/res/layout/group_browse_list_account_header.xml
similarity index 98%
rename from res/layout/group_list_header_item.xml
rename to res/layout/group_browse_list_account_header.xml
index b38920f..73684c1 100644
--- a/res/layout/group_list_header_item.xml
+++ b/res/layout/group_browse_list_account_header.xml
@@ -33,6 +33,7 @@
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="@color/people_app_theme_color"
android:textStyle="bold"
+ android:textAllCaps="true"
android:singleLine="true"/>
<TextView
diff --git a/res/layout/group_browse_list_item.xml b/res/layout/group_browse_list_item.xml
index b829704..ecdc132 100644
--- a/res/layout/group_browse_list_item.xml
+++ b/res/layout/group_browse_list_item.xml
@@ -14,21 +14,48 @@
limitations under the License.
-->
-<view
+<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- class="com.android.contacts.group.GroupBrowseListAdapter$GroupListItem"
- android:orientation="horizontal"
+ android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:paddingBottom="10dip"
style="@style/GroupBrowseListItem">
+ <ImageView
+ android:id="@+id/divider"
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:layout_marginBottom="10dip"
+ android:paddingLeft="10dip"
+ android:paddingRight="10dip"
+ android:scaleType="fitXY"
+ android:src="@color/people_app_theme_color"/>
+
+ <include
+ android:id="@+id/group_list_header"
+ layout="@layout/group_browse_list_account_header"
+ android:visibility="gone" />
+
<TextView
android:id="@+id/label"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:padding="10dip"
- android:textAppearance="?android:attr/textAppearanceLarge"
+ android:paddingLeft="10dip"
+ android:paddingRight="10dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
android:ellipsize="end"
android:singleLine="true" />
-</view>
+ <TextView
+ android:id="@+id/count"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:paddingLeft="10dip"
+ android:paddingRight="10dip"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="?android:attr/textColorTertiary"
+ android:ellipsize="end"
+ android:singleLine="true" />
+
+</LinearLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7d11c54..7f729f6 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1557,6 +1557,12 @@
<item quantity="other"><xliff:g id="count">%1$d</xliff:g> people from <xliff:g id="account_type">%2$s</xliff:g></item>
</plurals>
+ <!-- Subtitle of a group (in the group list) that describes how many people are in the current group [CHAR LIMIT=30] -->
+ <plurals name="group_list_num_contacts_in_group">
+ <item quantity="one"><xliff:g id="count">%1$d</xliff:g> person</item>
+ <item quantity="other"><xliff:g id="count">%1$d</xliff:g> people</item>
+ </plurals>
+
<!-- Toast displayed when the user creates a new contact and attempts to join it
with another before entering any data [CHAR LIMIT=256] -->
<string name="toast_join_with_empty_contact">Please enter contact name before joining
diff --git a/src/com/android/contacts/GroupListLoader.java b/src/com/android/contacts/GroupListLoader.java
new file mode 100644
index 0000000..49aa602
--- /dev/null
+++ b/src/com/android/contacts/GroupListLoader.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package com.android.contacts;
+
+import android.content.Context;
+import android.content.CursorLoader;
+import android.provider.ContactsContract.Groups;
+
+/**
+ * Group loader for the group list that includes details such as the number of contacts per group.
+ * This group list excludes default, favorite, and deleted groups.
+ */
+public final class GroupListLoader extends CursorLoader {
+
+ private final static String[] COLUMNS = new String[] {
+ Groups.ACCOUNT_NAME,
+ Groups.ACCOUNT_TYPE,
+ Groups._ID,
+ Groups.TITLE,
+ Groups.ACTION,
+ Groups.ACTION_URI,
+ Groups.SUMMARY_COUNT,
+ };
+
+ public final static int ACCOUNT_NAME = 0;
+ public final static int ACCOUNT_TYPE = 1;
+ public final static int GROUP_ID = 2;
+ public final static int TITLE = 3;
+ public final static int ACTION = 4;
+ public final static int ACTION_URI = 5;
+ public final static int MEMBER_COUNT = 6;
+
+ public GroupListLoader(Context context) {
+ super(context, Groups.CONTENT_SUMMARY_URI, COLUMNS, Groups.ACCOUNT_TYPE + " NOT NULL AND "
+ + Groups.ACCOUNT_NAME + " NOT NULL AND " + Groups.AUTO_ADD + "=0 AND " +
+ Groups.FAVORITES + "=0 AND " + Groups.DELETED + "=0", null,
+ Groups.ACCOUNT_NAME + " ASC");
+ }
+}
diff --git a/src/com/android/contacts/group/GroupBrowseListAdapter.java b/src/com/android/contacts/group/GroupBrowseListAdapter.java
index 2dd194d..d44733b 100644
--- a/src/com/android/contacts/group/GroupBrowseListAdapter.java
+++ b/src/com/android/contacts/group/GroupBrowseListAdapter.java
@@ -16,28 +16,22 @@
package com.android.contacts.group;
-import com.android.contacts.GroupMetaData;
+import com.android.contacts.GroupListLoader;
import com.android.contacts.R;
import com.android.contacts.model.AccountType;
import com.android.contacts.model.AccountTypeManager;
-import android.accounts.Account;
import android.content.ContentUris;
import android.content.Context;
+import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract.Groups;
-import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
-import android.widget.LinearLayout;
import android.widget.TextView;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
/**
* Adapter to populate the list of groups.
*/
@@ -47,49 +41,36 @@
private final LayoutInflater mLayoutInflater;
private final AccountTypeManager mAccountTypeManager;
- private List<GroupListEntry> mGroupList = new ArrayList<GroupListEntry>();
+ private Cursor mCursor;
+
private boolean mSelectionVisible;
private Uri mSelectedGroupUri;
- enum ViewType {
- HEADER, ITEM;
- }
-
- private static final int VIEW_TYPE_COUNT = ViewType.values().length;
-
- public GroupBrowseListAdapter(Context context, Map<Account, List<GroupMetaData>> groupMap) {
+ public GroupBrowseListAdapter(Context context) {
mContext = context;
mLayoutInflater = LayoutInflater.from(context);
mAccountTypeManager = AccountTypeManager.getInstance(mContext);
+ }
- for (Account account : groupMap.keySet()) {
- List<GroupMetaData> groupsListForAccount = groupMap.get(account);
-
- // Add account name, type, and # of groups as header for section
- mGroupList.add(GroupListEntry.createEntryForHeader(account.name, account.type,
- groupsListForAccount.size()));
-
- // Add groups within that account as subsequent list items.
- for (GroupMetaData singleGroup : groupsListForAccount) {
- mGroupList.add(GroupListEntry.createEntryForGroup(singleGroup));
- }
- }
+ public void setCursor(Cursor cursor) {
+ mCursor = cursor;
+ notifyDataSetChanged();
}
public int getSelectedGroupPosition() {
- if (mSelectedGroupUri == null) {
+ if (mSelectedGroupUri == null || mCursor == null || mCursor.getCount() == 0) {
return -1;
}
- int size = mGroupList.size();
- for (int i = 0; i < size; i++) {
- GroupListEntry group = mGroupList.get(i);
- if (group.type == ViewType.ITEM) {
- Uri uri = getGroupUriFromId(group.groupData.getGroupId());
- if (mSelectedGroupUri.equals(uri)) {
- return i;
- }
+ int index = 0;
+ mCursor.moveToPosition(-1);
+ while (mCursor.moveToNext()) {
+ long groupId = mCursor.getLong(GroupListLoader.GROUP_ID);
+ Uri uri = getGroupUriFromId(groupId);
+ if (mSelectedGroupUri.equals(uri)) {
+ return index;
}
+ index++;
}
return -1;
}
@@ -108,163 +89,123 @@
@Override
public int getCount() {
- return mGroupList.size();
+ return mCursor == null ? 0 : mCursor.getCount();
}
@Override
public long getItemId(int position) {
- return mGroupList.get(position).id;
+ return position;
}
@Override
- public GroupListEntry getItem(int position) {
- return mGroupList.get(position);
- }
+ public GroupListItem getItem(int position) {
+ if (mCursor == null || mCursor.isClosed() || !mCursor.moveToPosition(position)) {
+ return null;
+ }
+ String accountName = mCursor.getString(GroupListLoader.ACCOUNT_NAME);
+ String accountType = mCursor.getString(GroupListLoader.ACCOUNT_TYPE);
+ long groupId = mCursor.getLong(GroupListLoader.GROUP_ID);
+ String title = mCursor.getString(GroupListLoader.TITLE);
+ int memberCount = mCursor.getInt(GroupListLoader.MEMBER_COUNT);
- @Override
- public int getItemViewType(int position) {
- return mGroupList.get(position).type.ordinal();
- }
+ // Figure out if this is the first group for this account name / account type pair by
+ // checking the previous entry. This is to determine whether or not we need to display an
+ // account header in this item.
+ int previousIndex = position - 1;
+ boolean isFirstGroupInAccount = true;
+ if (previousIndex >= 0 && mCursor.moveToPosition(previousIndex)) {
+ String previousGroupAccountName = mCursor.getString(GroupListLoader.ACCOUNT_NAME);
+ String previousGroupAccountType = mCursor.getString(GroupListLoader.ACCOUNT_TYPE);
+ if (accountName.equals(previousGroupAccountName) &&
+ accountType.equals(previousGroupAccountType)) {
+ isFirstGroupInAccount = false;
+ }
+ }
- @Override
- public int getViewTypeCount() {
- return VIEW_TYPE_COUNT;
- }
-
- @Override
- public boolean areAllItemsEnabled() {
- return false;
- }
-
- @Override
- public boolean isEnabled(int position) {
- return mGroupList.get(position).type == ViewType.ITEM;
+ return new GroupListItem(accountName, accountType, groupId, title, isFirstGroupInAccount,
+ memberCount);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
- GroupListEntry item = getItem(position);
- switch (item.type) {
- case HEADER:
- return getHeaderView(item, convertView, parent);
- case ITEM:
- return getGroupListItemView(item, convertView, parent);
- default:
- throw new IllegalStateException("Invalid GroupListEntry item type " + item.type);
+ GroupListItem entry = getItem(position);
+ View result;
+ GroupListItemViewCache viewCache;
+ if (convertView != null) {
+ result = convertView;
+ viewCache = (GroupListItemViewCache) result.getTag();
+ } else {
+ result = mLayoutInflater.inflate(R.layout.group_browse_list_item, parent, false);
+ viewCache = new GroupListItemViewCache(result);
+ result.setTag(viewCache);
}
- }
+ // Add a header if this is the first group in an account and hide the divider
+ if (entry.isFirstGroupInAccount()) {
+ bindHeaderView(entry, viewCache);
+ viewCache.accountHeader.setVisibility(View.VISIBLE);
+ viewCache.divider.setVisibility(View.GONE);
+ } else {
+ viewCache.accountHeader.setVisibility(View.GONE);
+ viewCache.divider.setVisibility(View.VISIBLE);
+ }
- private View getHeaderView(GroupListEntry entry, View convertView, ViewGroup parent) {
- View result = (convertView == null ?
- mLayoutInflater.inflate(R.layout.group_list_header_item, parent, false) :
- convertView);
+ // Bind the group data
+ Uri groupUri = getGroupUriFromId(entry.getGroupId());
+ String memberCountString = mContext.getResources().getQuantityString(
+ R.plurals.group_list_num_contacts_in_group, entry.getMemberCount(),
+ entry.getMemberCount());
+ viewCache.setUri(groupUri);
+ viewCache.groupTitle.setText(entry.getTitle());
+ viewCache.groupMemberCount.setText(memberCountString);
- TextView accountTypeTextView = (TextView) result.findViewById(R.id.account_type);
- AccountType accountType = mAccountTypeManager.getAccountType(entry.accountType);
- accountTypeTextView.setText(accountType.getDisplayLabel(mContext).toString().toUpperCase());
-
- TextView accountNameTextView = (TextView) result.findViewById(R.id.account_name);
- accountNameTextView.setText(entry.accountName);
-
- String groupCountString = mContext.getResources().getQuantityString(
- R.plurals.num_groups_in_account, entry.count, entry.count);
- TextView groupCountTextView = (TextView) result.findViewById(R.id.group_count);
- groupCountTextView.setText(groupCountString);
-
- return result;
- }
-
- private View getGroupListItemView(GroupListEntry entry, View convertView, ViewGroup parent) {
- GroupListItem result = (GroupListItem) (convertView == null ?
- mLayoutInflater.inflate(R.layout.group_browse_list_item, parent, false) :
- convertView);
- result.loadFromGroup(entry.groupData);
if (mSelectionVisible) {
- result.setActivated(isSelectedGroup(result.getUri()));
+ result.setActivated(isSelectedGroup(groupUri));
}
return result;
}
- /**
- * This is a data model object to represent one row in the list of groups were the entry
- * could be a header or group item.
- */
- public static class GroupListEntry {
- public final ViewType type;
- public final String accountType;
- public final String accountName;
- public final int count;
- public final GroupMetaData groupData;
- /**
- * The id is equal to the group ID (if groupData is available), otherwise it is -1 for
- * header entries.
- */
- public final long id;
+ private void bindHeaderView(GroupListItem entry, GroupListItemViewCache viewCache) {
+ AccountType accountType = mAccountTypeManager.getAccountType(entry.getAccountType());
+ viewCache.accountType.setText(accountType.getDisplayLabel(mContext).toString());
+ viewCache.accountName.setText(entry.getAccountName());
- private GroupListEntry(ViewType entryType, String groupAccountName, String groupAccountType,
- int headerGroupCount, GroupMetaData groupMetaData, long entryId) {
- type = entryType;
- accountName = groupAccountName;
- accountType = groupAccountType;
- count = headerGroupCount;
- groupData = groupMetaData;
- id = entryId;
- }
+ // TODO: Add in number of groups within this account name / type using this string:
+ // getQuantityString(R.plurals.num_groups_in_account, entry.count, entry.count);
+ }
- public static GroupListEntry createEntryForHeader(String groupAccountName,
- String groupAccountType, int groupCount) {
- return new GroupListEntry(ViewType.HEADER, groupAccountName, groupAccountType,
- groupCount, null, -1);
- }
-
- public static GroupListEntry createEntryForGroup(GroupMetaData groupMetaData) {
- if (groupMetaData == null) {
- throw new IllegalStateException("Cannot create list entry for a null group");
- }
- return new GroupListEntry(ViewType.ITEM, null, null, 0, groupMetaData,
- groupMetaData.getGroupId());
- }
+ private static Uri getGroupUriFromId(long groupId) {
+ return ContentUris.withAppendedId(Groups.CONTENT_URI, groupId);
}
/**
- * A row in a list of groups, where this row displays a single group's title
- * and associated account.
+ * Cache of the children views of a contact detail entry represented by a
+ * {@link GroupListItem}
*/
- public static class GroupListItem extends LinearLayout {
-
- private TextView mLabel;
+ public static class GroupListItemViewCache {
+ public final TextView accountType;
+ public final TextView accountName;
+ public final TextView groupTitle;
+ public final TextView groupMemberCount;
+ public final View accountHeader;
+ public final View divider;
private Uri mUri;
- public GroupListItem(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
+ public GroupListItemViewCache(View view) {
+ accountType = (TextView) view.findViewById(R.id.account_type);
+ accountName = (TextView) view.findViewById(R.id.account_name);
+ groupTitle = (TextView) view.findViewById(R.id.label);
+ groupMemberCount = (TextView) view.findViewById(R.id.count);
+ accountHeader = view.findViewById(R.id.group_list_header);
+ divider = view.findViewById(R.id.divider);
}
- public GroupListItem(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public GroupListItem(Context context) {
- super(context);
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- mLabel = (TextView) findViewById(R.id.label);
- }
-
- public void loadFromGroup(GroupMetaData group) {
- mLabel.setText(group.getTitle());
- mUri = getGroupUriFromId(group.getGroupId());
+ public void setUri(Uri uri) {
+ mUri = uri;
}
public Uri getUri() {
return mUri;
}
}
-
- private static Uri getGroupUriFromId(long groupId) {
- return ContentUris.withAppendedId(Groups.CONTENT_URI, groupId);
- }
}
\ No newline at end of file
diff --git a/src/com/android/contacts/group/GroupBrowseListFragment.java b/src/com/android/contacts/group/GroupBrowseListFragment.java
index 4e6bdbc..d0d370e 100644
--- a/src/com/android/contacts/group/GroupBrowseListFragment.java
+++ b/src/com/android/contacts/group/GroupBrowseListFragment.java
@@ -16,13 +16,11 @@
package com.android.contacts.group;
-import com.android.contacts.GroupMetaData;
-import com.android.contacts.GroupMetaDataLoader;
+import com.android.contacts.GroupListLoader;
import com.android.contacts.R;
-import com.android.contacts.group.GroupBrowseListAdapter.GroupListItem;
+import com.android.contacts.group.GroupBrowseListAdapter.GroupListItemViewCache;
import com.android.contacts.widget.AutoScrollListView;
-import android.accounts.Account;
import android.app.Activity;
import android.app.Fragment;
import android.app.LoaderManager;
@@ -34,7 +32,6 @@
import android.net.Uri;
import android.os.Bundle;
import android.os.Parcelable;
-import android.provider.ContactsContract.Groups;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@@ -47,11 +44,6 @@
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
/**
* Fragment to display the list of groups.
*/
@@ -82,13 +74,6 @@
private static final String EXTRA_KEY_GROUP_URI = "groups.groupUri";
- /**
- * Map of {@link Account} to a list of {@link GroupMetaData} objects
- * representing groups within that account.
- */
- private final Map<Account, List<GroupMetaData>> mGroupMap =
- new HashMap<Account, List<GroupMetaData>>();
-
private View mRootView;
private AutoScrollListView mListView;
private View mEmptyView;
@@ -108,10 +93,25 @@
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mRootView = inflater.inflate(R.layout.group_browse_list_fragment, null);
+ mEmptyView = mRootView.findViewById(R.id.empty);
+
+ mAdapter = new GroupBrowseListAdapter(mContext);
+ mAdapter.setSelectionVisible(mSelectionVisible);
+ mAdapter.setSelectedGroup(mSelectedGroupUri);
+
mListView = (AutoScrollListView) mRootView.findViewById(R.id.list);
mListView.setOnFocusChangeListener(this);
mListView.setOnTouchListener(this);
- mEmptyView = mRootView.findViewById(R.id.empty);
+ mListView.setAdapter(mAdapter);
+ mListView.setOnItemClickListener(new OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ GroupListItemViewCache groupListItem = (GroupListItemViewCache) view.getTag();
+ if (groupListItem != null) {
+ viewGroup(groupListItem.getUri());
+ }
+ }
+ });
if (savedInstanceState != null) {
String groupUriString = savedInstanceState.getString(EXTRA_KEY_GROUP_URI);
@@ -173,7 +173,7 @@
@Override
public CursorLoader onCreateLoader(int id, Bundle args) {
- return new GroupMetaDataLoader(mContext, Groups.CONTENT_URI);
+ return new GroupListLoader(mContext);
}
@Override
@@ -190,64 +190,16 @@
if (mGroupListCursor == null) {
return;
}
- mGroupMap.clear();
- mGroupListCursor.moveToPosition(-1);
- while (mGroupListCursor.moveToNext()) {
- String accountName = mGroupListCursor.getString(GroupMetaDataLoader.ACCOUNT_NAME);
- String accountType = mGroupListCursor.getString(GroupMetaDataLoader.ACCOUNT_TYPE);
- long groupId = mGroupListCursor.getLong(GroupMetaDataLoader.GROUP_ID);
- String title = mGroupListCursor.getString(GroupMetaDataLoader.TITLE);
- boolean deleted =
- (mGroupListCursor.getInt(GroupMetaDataLoader.DELETED) == 1);
- boolean defaultGroup = mGroupListCursor.isNull(GroupMetaDataLoader.AUTO_ADD)
- ? false
- : mGroupListCursor.getInt(GroupMetaDataLoader.AUTO_ADD) != 0;
- boolean favorites = mGroupListCursor.isNull(GroupMetaDataLoader.FAVORITES)
- ? false
- : mGroupListCursor.getInt(GroupMetaDataLoader.FAVORITES) != 0;
-
- // Don't show the "auto-added" (i.e. My Contacts) or "favorites" groups because
- // they show up elsewhere in the app. Also skip groups that are marked as "deleted"
- if (defaultGroup || favorites || deleted) {
- continue;
- }
-
- GroupMetaData newGroup = new GroupMetaData(accountName, accountType, groupId, title,
- defaultGroup, favorites);
- Account account = new Account(accountName, accountType);
-
- if (mGroupMap.containsKey(account)) {
- List<GroupMetaData> groups = mGroupMap.get(account);
- groups.add(newGroup);
- } else {
- List<GroupMetaData> groups = new ArrayList<GroupMetaData>();
- groups.add(newGroup);
- mGroupMap.put(account, groups);
- }
-
- }
-
- mAdapter = new GroupBrowseListAdapter(mContext, mGroupMap);
- mAdapter.setSelectionVisible(mSelectionVisible);
- mAdapter.setSelectedGroup(mSelectedGroupUri);
+ mAdapter.setCursor(mGroupListCursor);
Parcelable listState = mListView.onSaveInstanceState();
- mListView.setAdapter(mAdapter);
- mListView.setEmptyView(mEmptyView);
- mListView.setOnItemClickListener(new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- GroupListItem groupListItem = (GroupListItem) view;
- viewGroup(groupListItem.getUri());
- }
- });
-
if (mSelectionToScreenRequested) {
requestSelectionToScreen();
} else {
// Restore the scroll position.
mListView.onRestoreInstanceState(listState);
}
+ mListView.setEmptyView(mEmptyView);
if (mSelectionVisible && mSelectedGroupUri != null) {
viewGroup(mSelectedGroupUri);
@@ -260,6 +212,9 @@
public void setSelectionVisible(boolean flag) {
mSelectionVisible = flag;
+ if (mAdapter != null) {
+ mAdapter.setSelectionVisible(mSelectionVisible);
+ }
}
private void setSelectedGroup(Uri groupUri) {
diff --git a/src/com/android/contacts/group/GroupListItem.java b/src/com/android/contacts/group/GroupListItem.java
new file mode 100644
index 0000000..4740c44
--- /dev/null
+++ b/src/com/android/contacts/group/GroupListItem.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package com.android.contacts.group;
+
+/**
+ * Meta-data for a contact group. We load all groups associated with the contact's
+ * constituent accounts.
+ */
+public final class GroupListItem {
+ private final String mAccountName;
+ private final String mAccountType;
+ private final long mGroupId;
+ private final String mTitle;
+ private final boolean mIsFirstGroupInAccount;
+ private final int mMemberCount;
+
+ public GroupListItem(String accountName, String accountType, long groupId, String title,
+ boolean isFirstGroupInAccount, int memberCount) {
+ this.mAccountName = accountName;
+ this.mAccountType = accountType;
+ this.mGroupId = groupId;
+ this.mTitle = title;
+ this.mIsFirstGroupInAccount = isFirstGroupInAccount;
+ this.mMemberCount = memberCount;
+ }
+
+ public String getAccountName() {
+ return mAccountName;
+ }
+
+ public String getAccountType() {
+ return mAccountType;
+ }
+
+ public long getGroupId() {
+ return mGroupId;
+ }
+
+ public String getTitle() {
+ return mTitle;
+ }
+
+ public int getMemberCount() {
+ return mMemberCount;
+ }
+
+ public boolean hasMemberCount() {
+ return mMemberCount != -1;
+ }
+
+ public boolean isFirstGroupInAccount() {
+ return mIsFirstGroupInAccount;
+ }
+}
\ No newline at end of file