Merge "Merging Gingerbread Phone dialer launcher icon"
diff --git a/res/layout-xlarge/group_detail_fragment.xml b/res/layout-xlarge/group_detail_fragment.xml
new file mode 100644
index 0000000..a824319
--- /dev/null
+++ b/res/layout-xlarge/group_detail_fragment.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/group_detail"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@drawable/panel_content">
+
+ <TextView
+ android:id="@+id/group_title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingLeft="@dimen/group_detail_border_padding"
+ android:paddingTop="@dimen/group_detail_vertical_padding"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textStyle="bold" />
+
+ <TextView
+ android:id="@+id/group_size"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingLeft="@dimen/group_detail_border_padding"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textColor="?android:attr/textColorSecondary" />
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider"
+ android:layout_marginTop="@dimen/group_detail_vertical_padding"
+ android:layout_marginBottom="@dimen/group_detail_vertical_padding"
+ android:layout_marginLeft="@dimen/group_detail_divider_margin"
+ android:layout_marginRight="@dimen/group_detail_divider_margin" />
+
+ <ListView android:id="@android:id/list"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginLeft="@dimen/group_detail_border_padding"
+ android:layout_marginRight="@dimen/group_detail_border_padding"
+ android:cacheColorHint="#00000000"
+ android:divider="@null" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/res/layout-xlarge/people_activity.xml b/res/layout-xlarge/people_activity.xml
index 3fbb3d2..969bbf9 100644
--- a/res/layout-xlarge/people_activity.xml
+++ b/res/layout-xlarge/people_activity.xml
@@ -84,10 +84,16 @@
ex:exitAnimation="@android:animator/fade_out"
ex:animationDuration="200">
<fragment
- android:id="@+id/detail_fragment"
+ android:id="@+id/contact_detail_fragment"
class="com.android.contacts.detail.ContactDetailFragment"
android:layout_width="match_parent"
- android:layout_height="match_parent"
+ android:layout_height="match_parent"
+ />
+ <fragment
+ android:id="@+id/group_detail_fragment"
+ class="com.android.contacts.group.GroupDetailFragment"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
/>
</view>
diff --git a/res/layout/call_detail.xml b/res/layout/call_detail.xml
index a8da153..a47452c 100644
--- a/res/layout/call_detail.xml
+++ b/res/layout/call_detail.xml
@@ -29,8 +29,7 @@
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:adjustViewBounds="true"
- android:scaleX="2.5"
- android:scaleY="2.5"
+ android:scaleType="centerCrop"
android:background="@drawable/ic_contact_picture"
/>
diff --git a/res/layout/call_log_list_child_item.xml b/res/layout/call_log_list_child_item.xml
index 10e09a4..d2c22a9 100644
--- a/res/layout/call_log_list_child_item.xml
+++ b/res/layout/call_log_list_child_item.xml
@@ -17,7 +17,6 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
- android:paddingLeft="7dip"
>
<include layout="@layout/call_log_action_call"/>
diff --git a/res/layout/call_log_list_group_item.xml b/res/layout/call_log_list_group_item.xml
index c922540..e7ab026 100644
--- a/res/layout/call_log_list_group_item.xml
+++ b/res/layout/call_log_list_group_item.xml
@@ -17,7 +17,6 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
- android:paddingLeft="7dip"
>
<include layout="@layout/call_log_contact_photo"/>
diff --git a/res/layout/call_log_list_item.xml b/res/layout/call_log_list_item.xml
index 88a1ba1..e07479d 100644
--- a/res/layout/call_log_list_item.xml
+++ b/res/layout/call_log_list_item.xml
@@ -17,7 +17,6 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
- android:paddingLeft="7dip"
>
<include layout="@layout/call_log_contact_photo"/>
diff --git a/res/layout/contact_tile_row_regular.xml b/res/layout/contact_tile_row_regular.xml
new file mode 100644
index 0000000..79b670a
--- /dev/null
+++ b/res/layout/contact_tile_row_regular.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/contactTile_row_regular"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <RelativeLayout android:id="@+id/contactTile_row_left"
+ style="@style/ContactTileRegularLayout">
+ <ImageView android:id="@+id/contactTile_left_image"
+ style="@style/ContactTileRegularImage" />
+ <TextView android:id="@+id/contactTile_left_name"
+ style="@style/ContactTileRegularText" />
+ </RelativeLayout>
+
+ <RelativeLayout android:id="@+id/contactTile_row_right"
+ style="@style/ContactTileRegularLayout">
+ <ImageView android:id="@+id/contactTile_right_image"
+ style="@style/ContactTileRegularImage" />
+ <TextView android:id="@+id/contactTile_right_name"
+ style="@style/ContactTileRegularText" />
+ </RelativeLayout>
+
+</LinearLayout>
diff --git a/res/layout/group_browse_list_item.xml b/res/layout/group_browse_list_item.xml
index accbedd..28f4e17 100644
--- a/res/layout/group_browse_list_item.xml
+++ b/res/layout/group_browse_list_item.xml
@@ -14,7 +14,9 @@
limitations under the License.
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<view
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ class="com.android.contacts.group.GroupBrowseListAdapter$GroupListItem"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
@@ -26,7 +28,8 @@
android:layout_height="match_parent"
android:layout_marginLeft="10dip"
android:layout_marginRight="10dip"
- android:layout_gravity="center_vertical" />
+ android:layout_gravity="center_vertical"
+ android:src="@drawable/ic_menu_display_all_holo_light" />
<LinearLayout
android:orientation="vertical"
@@ -57,4 +60,4 @@
</LinearLayout>
-</LinearLayout>
+</view>
diff --git a/res/layout/group_detail_fragment.xml b/res/layout/group_detail_fragment.xml
index 70d67b6..76f7214 100644
--- a/res/layout/group_detail_fragment.xml
+++ b/res/layout/group_detail_fragment.xml
@@ -21,7 +21,7 @@
android:layout_height="match_parent">
<ListView
- android:id="@+id/member_list"
+ android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbarStyle="outsideOverlay"/>
diff --git a/res/layout/strequent_fragment.xml b/res/layout/strequent_fragment.xml
new file mode 100644
index 0000000..348fd0c
--- /dev/null
+++ b/res/layout/strequent_fragment.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<ListView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/strequent_list"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:divider="@null"
+/>
diff --git a/res/values-xlarge/styles.xml b/res/values-xlarge/styles.xml
index 9d0ff29..0179f6a 100644
--- a/res/values-xlarge/styles.xml
+++ b/res/values-xlarge/styles.xml
@@ -92,7 +92,9 @@
<item name="android:background">@drawable/directory_bg_holo</item>
</style>
- <style name="NonPhoneDialogTheme" parent="@android:Theme.Holo.Light.Dialog.Alert">
+ <style name="NonPhoneDialogTheme" parent="@android:Theme.Holo.Light.Dialog">
+ <item name="android:windowBackground">@android:color/transparent</item>
+ <item name="android:windowContentOverlay">@null</item>
</style>
<style name="BackgroundOnly" parent="@android:Theme.Holo.Light">
diff --git a/res/values/colors.xml b/res/values/colors.xml
index ace8869..9a60815 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -48,4 +48,8 @@
<!-- Color of the text indicating the type of entry (e.g. Home, Work etc) -->
<color name="detail_header_view_text_color">#FFFFFF</color>
+
+ <!-- Color of the text foreground and background of Regular Sized ContactTile -->
+ <color name="contact_tile_regular_text">#2B1B17</color>
+ <color name="contact_tile_regular_text_background">#FFFFFF</color>
</resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index ff7d873..68655d8 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -111,4 +111,13 @@
<!-- Height of list sections (A, B, C) that show the first character of the contacts -->
<dimen name="list_section_height">25dip</dimen>
+
+ <!-- Border padding for the group detail fragment header -->
+ <dimen name="group_detail_border_padding">20dip</dimen>
+
+ <!-- Vertical padding for the group detail fragment header -->
+ <dimen name="group_detail_vertical_padding">15dip</dimen>
+
+ <!-- Margins for the group detail fragment divider in the header -->
+ <dimen name="group_detail_divider_margin">15dip</dimen>
</resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index aefb719..f18a340 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -162,7 +162,7 @@
</style>
<!-- TODO: Clean up this file so themes aren't copied. -->
- <style name="GroupDetailTheme" parent="@android:Theme">
+ <style name="GroupDetailTheme" parent="android:Theme.Holo.Light">
<item name="list_item_height">?android:attr/listPreferredItemHeight</item>
<item name="activated_background">@drawable/list_item_activated_background</item>
<item name="section_header_background">@drawable/list_title_holo</item>
@@ -274,4 +274,52 @@
<item name="android:gravity">center_vertical</item>
<item name="android:paddingTop">5dip</item>
</style>
+
+ <style name="ContactTileRegularText">
+ <item name="android:layout_width">fill_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_alignParentBottom">true</item>
+ <item name="android:background">@color/contact_tile_regular_text</item>
+ <item name="android:textColor">@color/contact_tile_regular_text_background</item>
+ <item name="android:textSize">17sp</item>
+ <item name="android:alpha">0.7</item>
+ <item name="android:gravity">center_horizontal</item>
+ </style>
+
+ <style name="ContactTileRegularImage">
+ <item name="android:layout_width">160dip</item>
+ <item name="android:layout_height">160dip</item>
+ <item name="android:layout_alignParentTop">true</item>
+ <item name="android:layout_alignParentLeft">true</item>
+ <item name="android:scaleType">centerCrop</item>
+ </style>
+
+ <style name="ContactTileRegularLayout">
+ <item name="android:layout_width">155dip</item>
+ <item name="android:layout_height">160dip</item>
+ <item name="android:focusable">true</item>
+ <item name="android:padding">5dip</item>
+ <item name="android:background">@drawable/list_selector</item>
+ </style>
+
+ <style name="ContactTileSmallText">
+ <item name="android:layout_width">80dip</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:paddingTop">8dip</item>
+ <item name="android:paddingLeft">4dip</item>
+ </style>
+
+ <style name="ContactTileSmallImage">
+ <item name="android:layout_width">80dip</item>
+ <item name="android:layout_height">80dip</item>
+ <item name="android:scaleType">centerCrop</item>
+ </style>
+
+ <style name="ContactTileSmallLayout">
+ <item name="android:layout_width">160dip</item>
+ <item name="android:layout_height">80dip</item>
+ <item name="android:focusable">true</item>
+ <item name="android:padding">5dip</item>
+ <item name="android:background">@drawable/list_selector</item>
+ </style>
</resources>
diff --git a/src/com/android/contacts/GroupMetaDataLoader.java b/src/com/android/contacts/GroupMetaDataLoader.java
index d08d007..927697a 100644
--- a/src/com/android/contacts/GroupMetaDataLoader.java
+++ b/src/com/android/contacts/GroupMetaDataLoader.java
@@ -17,10 +17,12 @@
import android.content.Context;
import android.content.CursorLoader;
+import android.net.Uri;
import android.provider.ContactsContract.Groups;
/**
- * Group meta-data loader. Loads all groups from the database.
+ * Group meta-data loader. Loads all groups or just a single group from the
+ * database (if given a {@link Uri}).
*/
public final class GroupMetaDataLoader extends CursorLoader {
@@ -40,8 +42,23 @@
public final static int AUTO_ADD = 4;
public final static int FAVORITES = 5;
- public GroupMetaDataLoader(Context context) {
- super(context, Groups.CONTENT_URI, COLUMNS, Groups.ACCOUNT_TYPE + " NOT NULL AND "
+ public GroupMetaDataLoader(Context context, Uri groupUri) {
+ super(context, ensureIsGroupUri(groupUri), COLUMNS, Groups.ACCOUNT_TYPE + " NOT NULL AND "
+ Groups.ACCOUNT_NAME + " NOT NULL", null, null);
}
+
+ /**
+ * Ensures that this is a valid group URI. If invalid, then an exception is
+ * thrown. Otherwise, the original URI is returned.
+ */
+ private static Uri ensureIsGroupUri(final Uri groupUri) {
+ // TODO: Fix ContactsProvider2 getType method to resolve the group Uris
+ if (groupUri == null) {
+ throw new IllegalArgumentException("Uri must not be null");
+ }
+ if (!groupUri.toString().startsWith(Groups.CONTENT_URI.toString())) {
+ throw new IllegalArgumentException("Invalid group Uri: " + groupUri);
+ }
+ return groupUri;
+ }
}
diff --git a/src/com/android/contacts/StrequentMetaDataLoader.java b/src/com/android/contacts/StrequentMetaDataLoader.java
new file mode 100644
index 0000000..203b25f
--- /dev/null
+++ b/src/com/android/contacts/StrequentMetaDataLoader.java
@@ -0,0 +1,44 @@
+/*
+ * 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.Contacts;
+
+/**
+ * Strequent meta-data loader. Loads all starred and frequent contacts from the database.
+ */
+public final class StrequentMetaDataLoader extends CursorLoader {
+
+ public final static int CONTACT_ID = 0;
+ public final static int DISPLAY_NAME = 1;
+ public final static int STARRED = 2;
+ public final static int PHOTO_URI = 3;
+ public final static int PHOTO_ID = 4;
+
+ private static final String[] COLUMNS = new String[] {
+ Contacts._ID,
+ Contacts.DISPLAY_NAME,
+ Contacts.STARRED,
+ Contacts.PHOTO_URI,
+ Contacts.PHOTO_ID
+ };
+
+ public StrequentMetaDataLoader(Context context) {
+ super(context, Contacts.CONTENT_STREQUENT_URI, COLUMNS, null, null, null);
+ }
+}
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index 680c8bd..0541edb 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -108,6 +108,9 @@
if (mSearchMode != flag) {
mSearchMode = flag;
update();
+ if (mSearchView == null) {
+ return;
+ }
if (mSearchMode) {
mSearchView.requestFocus();
} else {
@@ -122,7 +125,9 @@
public void setQueryString(String query) {
mQueryString = query;
- mSearchView.setQuery(query, false);
+ if (mSearchView != null) {
+ mSearchView.setQuery(query, false);
+ }
}
public void update() {
diff --git a/src/com/android/contacts/activities/ContactDetailActivity.java b/src/com/android/contacts/activities/ContactDetailActivity.java
index 17e05c7..5992042 100644
--- a/src/com/android/contacts/activities/ContactDetailActivity.java
+++ b/src/com/android/contacts/activities/ContactDetailActivity.java
@@ -47,7 +47,7 @@
if (PhoneCapabilityTester.isUsingTwoPanes(this)) {
// This activity must not be shown. We have to select the contact in the
- // ContactBrowserActivity instead ==> Create a forward intent and finish
+ // PeopleActivity instead ==> Create a forward intent and finish
final Intent originalIntent = getIntent();
Intent intent = new Intent();
intent.setAction(originalIntent.getAction());
diff --git a/src/com/android/contacts/activities/DialtactsActivity.java b/src/com/android/contacts/activities/DialtactsActivity.java
index a0d77ab..083e5ce 100644
--- a/src/com/android/contacts/activities/DialtactsActivity.java
+++ b/src/com/android/contacts/activities/DialtactsActivity.java
@@ -207,7 +207,7 @@
ContactsIntentResolver resolver = new ContactsIntentResolver(this);
ContactsRequest request = resolver.resolveIntent(intent);
- final ContactListFilter filter = new ContactListFilter(
+ final ContactListFilter filter = ContactListFilter.createFilterWithType(
ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
mContactsFragment.setFilter(filter, false);
mContactsFragment.setSearchMode(request.isSearchMode());
@@ -225,24 +225,7 @@
tab.setIcon(R.drawable.ic_tab_starred);
tab.setTabListener(new TabChangeListener(mStrequentFragment));
getActionBar().addTab(tab);
-
- // TODO: We should not artificially create Intents and put them into the Fragment.
- // It would be nicer to directly pass in the UI constant
- Intent intent = new Intent(UI.LIST_STREQUENT_ACTION);
- intent.setClass(this, PeopleActivity.class);
-
- ContactsIntentResolver resolver = new ContactsIntentResolver(this);
- ContactsRequest request = resolver.resolveIntent(intent);
- final ContactListFilter filter = new ContactListFilter(
- ContactListFilter.FILTER_TYPE_STARRED);
- mStrequentFragment.setFilter(filter, false);
- mStrequentFragment.setSearchMode(request.isSearchMode());
- mStrequentFragment.setQueryString(request.getQueryString(), false);
- mStrequentFragment.setContactsRequest(request);
- mStrequentFragment.setDirectorySearchMode(request.isDirectorySearchEnabled()
- ? DirectoryListLoader.SEARCH_MODE_DEFAULT
- : DirectoryListLoader.SEARCH_MODE_NONE);
- mStrequentFragment.setOnContactListActionListener(mListFragmentListener);
+ mStrequentFragment.setListener(mStrequentListener);
}
/**
@@ -505,6 +488,14 @@
}
};
+ private StrequentContactListFragment.Listener mStrequentListener =
+ new StrequentContactListFragment.Listener() {
+ @Override
+ public void onContactSelected(Uri contactUri) {
+ getPhoneNumberCallInteraction().startInteraction(contactUri);
+ }
+ };
+
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// For now, create the menu in here. It would be nice to do this in the Fragment,
@@ -523,7 +514,7 @@
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- // This is currently a copy of the equivalent code of ContactBrowserActivity (with the
+ // This is currently a copy of the equivalent code of PeopleActivity (with the
// exception of menu_add, because we do not select items in the list).
// Should be consolidated
switch (item.getItemId()) {
diff --git a/src/com/android/contacts/activities/GroupDetailActivity.java b/src/com/android/contacts/activities/GroupDetailActivity.java
index edc460c..95f804c 100644
--- a/src/com/android/contacts/activities/GroupDetailActivity.java
+++ b/src/com/android/contacts/activities/GroupDetailActivity.java
@@ -18,6 +18,7 @@
import com.android.contacts.ContactsActivity;
import com.android.contacts.R;
+import com.android.contacts.group.GroupDetailFragment;
import android.os.Bundle;
@@ -25,13 +26,6 @@
private static final String TAG = "GroupDetailActivity";
- public static final String KEY_ACCOUNT_TYPE = "accountType";
- public static final String KEY_ACCOUNT_NAME = "accountName";
- public static final String KEY_GROUP_ID = "groupId";
- public static final String KEY_GROUP_SOURCE_ID = "groupSourceId";
- public static final String KEY_GROUP_READ_ONLY = "groupReadOnly";
- public static final String KEY_GROUP_TITLE = "title";
-
@Override
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
@@ -40,5 +34,26 @@
// TODO: Handle search or key down
setContentView(R.layout.group_detail_activity);
+
+ getActionBar().setDisplayHomeAsUpEnabled(true);
+
+ GroupDetailFragment fragment = (GroupDetailFragment) getFragmentManager().findFragmentById(
+ R.id.group_detail_fragment);
+ fragment.setListener(mFragmentListener);
+ fragment.loadGroup(getIntent().getData());
}
+
+ private final GroupDetailFragment.Listener mFragmentListener =
+ new GroupDetailFragment.Listener() {
+
+ @Override
+ public void onGroupSizeUpdated(String size) {
+ getActionBar().setSubtitle(size);
+ }
+
+ @Override
+ public void onGroupTitleUpdated(String title) {
+ getActionBar().setTitle(title);
+ }
+ };
}
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index f537c9e..502c31d 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -18,11 +18,14 @@
import com.android.contacts.ContactSaveService;
import com.android.contacts.ContactsActivity;
+import com.android.contacts.GroupMetaData;
import com.android.contacts.R;
import com.android.contacts.calllog.CallLogFragment;
import com.android.contacts.detail.ContactDetailFragment;
import com.android.contacts.dialpad.DialpadFragment;
import com.android.contacts.group.GroupBrowseListFragment;
+import com.android.contacts.group.GroupBrowseListFragment.OnGroupBrowserActionListener;
+import com.android.contacts.group.GroupDetailFragment;
import com.android.contacts.interactions.ContactDeletionInteraction;
import com.android.contacts.interactions.GroupDeletionDialogFragment;
import com.android.contacts.interactions.GroupRenamingDialogFragment;
@@ -92,7 +95,7 @@
DialogManager.DialogShowingViewActivity,
ContactListFilterController.ContactListFilterListener, ProviderStatusListener {
- private static final String TAG = "ContactBrowserActivity";
+ private static final String TAG = "PeopleActivity";
private static final int SUBACTIVITY_NEW_CONTACT = 2;
private static final int SUBACTIVITY_EDIT_CONTACT = 3;
@@ -112,13 +115,16 @@
private ContactBrowseListFragment mListFragment;
/**
- * Whether we have a right-side contact pane for displaying contact info while browsing.
- * Generally means "this is a tablet".
+ * Whether we have a right-side contact or group detail pane for displaying info on that
+ * contact or group while browsing. Generally means "this is a tablet".
*/
- private boolean mContactContentDisplayed;
+ private boolean mContentPaneDisplayed;
- private ContactDetailFragment mDetailFragment;
- private DetailFragmentListener mDetailFragmentListener = new DetailFragmentListener();
+ private ContactDetailFragment mContactDetailFragment;
+ private ContactDetailFragmentListener mContactDetailFragmentListener =
+ new ContactDetailFragmentListener();
+
+ private GroupDetailFragment mGroupDetailFragment;
private PhoneNumberInteraction mPhoneNumberCallInteraction;
private PhoneNumberInteraction mSendTextMessageInteraction;
@@ -162,15 +168,21 @@
mListFragment.setContextMenuAdapter(
new ContactBrowseListContextMenuAdapter(mListFragment));
}
+ } else if (fragment instanceof GroupBrowseListFragment) {
+ mGroupsFragment = (GroupBrowseListFragment) fragment;
+ mGroupsFragment.setListener(new GroupBrowserActionListener());
} else if (fragment instanceof ContactDetailFragment) {
- mDetailFragment = (ContactDetailFragment)fragment;
- mDetailFragment.setListener(mDetailFragmentListener);
- mContactContentDisplayed = true;
+ mContactDetailFragment = (ContactDetailFragment) fragment;
+ mContactDetailFragment.setListener(mContactDetailFragmentListener);
+ mContentPaneDisplayed = true;
} else if (fragment instanceof ContactsUnavailableFragment) {
mContactsUnavailableFragment = (ContactsUnavailableFragment)fragment;
mContactsUnavailableFragment.setProviderStatusLoader(mProviderStatusLoader);
mContactsUnavailableFragment.setOnContactsUnavailableActionListener(
new ContactsUnavailableFragmentListener());
+ } else if (fragment instanceof GroupDetailFragment) {
+ mGroupDetailFragment = (GroupDetailFragment) fragment;
+ mContentPaneDisplayed = true;
}
}
@@ -231,11 +243,17 @@
transaction.hide(mFavoritesFragment);
transaction.hide(mContactsFragment);
transaction.hide(mGroupsFragment);
+ if (mContactDetailFragment != null) {
+ transaction.hide(mContactDetailFragment);
+ }
+ if (mGroupDetailFragment != null) {
+ transaction.hide(mGroupDetailFragment);
+ }
transaction.commit();
}
if (mRequest.getActionCode() == ContactsRequest.ACTION_VIEW_CONTACT
- && !mContactContentDisplayed) {
+ && !mContentPaneDisplayed) {
redirect = new Intent(this, ContactDetailActivity.class);
redirect.setAction(Intent.ACTION_VIEW);
redirect.setData(mRequest.getContactUri());
@@ -254,17 +272,20 @@
actionBar.removeAllTabs();
Tab favoritesTab = actionBar.newTab();
favoritesTab.setText(getString(R.string.strequentList));
- favoritesTab.setTabListener(new TabChangeListener(mFavoritesFragment));
+ favoritesTab.setTabListener(new TabChangeListener(mFavoritesFragment,
+ mContactDetailFragment));
actionBar.addTab(favoritesTab);
Tab peopleTab = actionBar.newTab();
peopleTab.setText(getString(R.string.people));
- peopleTab.setTabListener(new TabChangeListener(mContactsFragment));
+ peopleTab.setTabListener(new TabChangeListener(mContactsFragment,
+ mContactDetailFragment));
actionBar.addTab(peopleTab);
Tab groupsTab = actionBar.newTab();
groupsTab.setText(getString(R.string.contactsGroupsLabel));
- groupsTab.setTabListener(new TabChangeListener(mGroupsFragment));
+ groupsTab.setTabListener(new TabChangeListener(mGroupsFragment,
+ mGroupDetailFragment));
actionBar.addTab(groupsTab);
actionBar.setDisplayShowTitleEnabled(true);
@@ -284,20 +305,33 @@
* support library in our app.
*/
private class TabChangeListener implements TabListener {
- private final Fragment mFragment;
+ private final Fragment mBrowseListFragment;
- public TabChangeListener(Fragment fragment) {
- mFragment = fragment;
+ /**
+ * Right pane fragment that is present on larger screen sizes (can be
+ * null for smaller screen sizes).
+ */
+ private final Fragment mDetailFragment;
+
+ public TabChangeListener(Fragment listFragment, Fragment detailFragment) {
+ mBrowseListFragment = listFragment;
+ mDetailFragment = detailFragment;
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
- ft.hide(mFragment);
+ ft.hide(mBrowseListFragment);
+ if (mDetailFragment != null) {
+ ft.hide(mDetailFragment);
+ }
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
- ft.show(mFragment);
+ ft.show(mBrowseListFragment);
+ if (mDetailFragment != null) {
+ ft.show(mDetailFragment);
+ }
}
@Override
@@ -341,10 +375,11 @@
int actionCode = mRequest.getActionCode();
switch (actionCode) {
case ContactsRequest.ACTION_ALL_CONTACTS:
- filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
+ filter = ContactListFilter.createFilterWithType(
+ ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
break;
case ContactsRequest.ACTION_CONTACTS_WITH_PHONES:
- filter = new ContactListFilter(
+ filter = ContactListFilter.createFilterWithType(
ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY);
break;
@@ -353,7 +388,8 @@
case ContactsRequest.ACTION_STREQUENT:
// For now they are treated the same as STARRED
case ContactsRequest.ACTION_STARRED:
- filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_STARRED);
+ filter = ContactListFilter.createFilterWithType(
+ ContactListFilter.FILTER_TYPE_STARRED);
break;
}
@@ -362,7 +398,8 @@
mContactListFilterController.setContactListFilter(filter, false);
mSearchMode = false;
} else if (mRequest.getActionCode() == ContactsRequest.ACTION_ALL_CONTACTS) {
- mContactListFilterController.setContactListFilter(new ContactListFilter(
+ mContactListFilterController.setContactListFilter(
+ ContactListFilter.createFilterWithType(
ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS), false);
}
@@ -411,7 +448,11 @@
}
private void setupContactDetailFragment(final Uri contactLookupUri) {
- mDetailFragment.loadUri(contactLookupUri);
+ mContactDetailFragment.loadUri(contactLookupUri);
+ }
+
+ private void setupGroupDetailFragment(Uri groupUri) {
+ mGroupDetailFragment.loadGroup(groupUri);
}
/**
@@ -462,11 +503,11 @@
mListFragment.setVisibleScrollbarEnabled(!mSearchMode);
mListFragment.setVerticalScrollbarPosition(
- mContactContentDisplayed
+ mContentPaneDisplayed
? View.SCROLLBAR_POSITION_LEFT
: View.SCROLLBAR_POSITION_RIGHT);
- mListFragment.setSelectionVisible(mContactContentDisplayed);
- mListFragment.setQuickContactEnabled(!mContactContentDisplayed);
+ mListFragment.setSelectionVisible(mContentPaneDisplayed);
+ mListFragment.setQuickContactEnabled(!mContentPaneDisplayed);
}
@Override
@@ -521,14 +562,14 @@
@Override
public void onSelectionChange() {
- if (mContactContentDisplayed) {
+ if (mContentPaneDisplayed) {
setupContactDetailFragment(mListFragment.getSelectedContactUri());
}
}
@Override
public void onViewContactAction(Uri contactLookupUri) {
- if (mContactContentDisplayed) {
+ if (mContentPaneDisplayed) {
setupContactDetailFragment(contactLookupUri);
} else {
startActivity(new Intent(Intent.ACTION_VIEW, contactLookupUri));
@@ -595,17 +636,19 @@
ContactListFilter currentFilter = mListFragment.getFilter();
if (currentFilter != null
&& currentFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
- filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
+ filter = ContactListFilter.createFilterWithType(
+ ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
mListFragment.setFilter(filter);
} else {
- filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_SINGLE_CONTACT);
+ filter = ContactListFilter.createFilterWithType(
+ ContactListFilter.FILTER_TYPE_SINGLE_CONTACT);
mListFragment.setFilter(filter, false);
}
mContactListFilterController.setContactListFilter(filter, true);
}
}
- private class DetailFragmentListener implements ContactDetailFragment.Listener {
+ private class ContactDetailFragmentListener implements ContactDetailFragment.Listener {
@Override
public void onContactNotFound() {
// Nothing needs to be done here
@@ -670,6 +713,20 @@
}
}
+ private final class GroupBrowserActionListener implements OnGroupBrowserActionListener {
+
+ @Override
+ public void onViewGroupAction(Uri groupUri) {
+ if (mContentPaneDisplayed) {
+ setupGroupDetailFragment(groupUri);
+ } else {
+ Intent intent = new Intent(PeopleActivity.this, GroupDetailActivity.class);
+ intent.setData(groupUri);
+ startActivity(intent);
+ }
+ }
+ }
+
public void startActivityAndForwardResult(final Intent intent) {
intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
@@ -751,7 +808,7 @@
return true;
}
- if (mDetailFragment != null && mDetailFragment.isOptionsMenuChanged()) {
+ if (mContactDetailFragment != null && mContactDetailFragment.isOptionsMenuChanged()) {
return true;
}
@@ -897,7 +954,7 @@
case SUBACTIVITY_EDIT_CONTACT:
case SUBACTIVITY_NEW_CONTACT: {
- if (resultCode == RESULT_OK && mContactContentDisplayed) {
+ if (resultCode == RESULT_OK && mContentPaneDisplayed) {
mRequest.setActionCode(ContactsRequest.ACTION_VIEW_CONTACT);
mListFragment.reloadDataAndSetSelectedUri(data.getData());
}
@@ -1039,6 +1096,6 @@
// Visible for testing
public ContactDetailFragment getDetailFragment() {
- return mDetailFragment;
+ return mContactDetailFragment;
}
}
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index 96d5843..8cab92a 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -66,6 +66,7 @@
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.provider.ContactsContract.CommonDataKinds.Website;
import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.Groups;
import android.provider.ContactsContract.Intents;
import android.provider.ContactsContract.RawContacts;
import android.provider.MediaStore;
@@ -1585,14 +1586,14 @@
};
/**
- * The listener for the group meta data loader
+ * The listener for the group meta data loader for all groups.
*/
private final LoaderManager.LoaderCallbacks<Cursor> mGroupLoaderListener =
new LoaderCallbacks<Cursor>() {
@Override
public CursorLoader onCreateLoader(int id, Bundle args) {
- return new GroupMetaDataLoader(mContext);
+ return new GroupMetaDataLoader(mContext, Groups.CONTENT_URI);
}
@Override
diff --git a/src/com/android/contacts/group/GroupBrowseListAdapter.java b/src/com/android/contacts/group/GroupBrowseListAdapter.java
index bccc207..c17fc08 100644
--- a/src/com/android/contacts/group/GroupBrowseListAdapter.java
+++ b/src/com/android/contacts/group/GroupBrowseListAdapter.java
@@ -16,15 +16,19 @@
package com.android.contacts.group;
-import com.android.contacts.R;
import com.android.contacts.GroupMetaData;
+import com.android.contacts.R;
+import android.content.ContentUris;
import android.content.Context;
+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.ImageView;
+import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.List;
@@ -59,21 +63,50 @@
@Override
public View getView(int position, View convertView, ViewGroup parent) {
- if (convertView == null) {
- convertView = mLayoutInflater.inflate(R.layout.group_browse_list_item, parent, false);
- }
- GroupMetaData group = getItem(position);
- ImageView icon = (ImageView) convertView.findViewById(R.id.icon);
- TextView label = (TextView) convertView.findViewById(R.id.label);
- TextView account = (TextView) convertView.findViewById(R.id.account);
- icon.setImageResource(R.drawable.ic_menu_display_all_holo_light);
- label.setText(group.getTitle());
- account.setText(group.getAccountName());
-
- // Set the tag to be the GroupMetaData object, in order to extract group attributes from the
- // view later.
- convertView.setTag(group);
- return convertView;
+ GroupListItem result = (GroupListItem) (convertView == null ?
+ mLayoutInflater.inflate(R.layout.group_browse_list_item, parent, false) :
+ convertView);
+ result.loadFromGroup(getItem(position));
+ return result;
}
+ /**
+ * A row in a list of groups, where this row displays a single group's title
+ * and associated account.
+ */
+ public static class GroupListItem extends LinearLayout {
+
+ private TextView mLabel;
+ private TextView mAccount;
+ private Uri mUri;
+
+ public GroupListItem(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ 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);
+ mAccount = (TextView) findViewById(R.id.account);
+ }
+
+ public void loadFromGroup(GroupMetaData group) {
+ mLabel.setText(group.getTitle());
+ mAccount.setText(group.getAccountName());
+ mUri = ContentUris.withAppendedId(Groups.CONTENT_URI, group.getGroupId());
+ }
+
+ public Uri getUri() {
+ return mUri;
+ }
+ }
}
\ 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 d9d020e..150a00f 100644
--- a/src/com/android/contacts/group/GroupBrowseListFragment.java
+++ b/src/com/android/contacts/group/GroupBrowseListFragment.java
@@ -19,7 +19,7 @@
import com.android.contacts.GroupMetaData;
import com.android.contacts.GroupMetaDataLoader;
import com.android.contacts.R;
-import com.android.contacts.activities.GroupDetailActivity;
+import com.android.contacts.group.GroupBrowseListAdapter.GroupListItem;
import android.app.Activity;
import android.app.Fragment;
@@ -27,10 +27,11 @@
import android.app.LoaderManager.LoaderCallbacks;
import android.content.Context;
import android.content.CursorLoader;
-import android.content.Intent;
import android.content.Loader;
import android.database.Cursor;
+import android.net.Uri;
import android.os.Bundle;
+import android.provider.ContactsContract.Groups;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
@@ -51,6 +52,19 @@
public class GroupBrowseListFragment extends Fragment
implements OnFocusChangeListener, OnTouchListener {
+ /**
+ * Action callbacks that can be sent by a group list.
+ */
+ public interface OnGroupBrowserActionListener {
+
+ /**
+ * Opens the specified group for viewing.
+ *
+ * @param groupUri for the group that the user wishes to view.
+ */
+ void onViewGroupAction(Uri groupUri);
+ }
+
private static final String TAG = "GroupBrowseListFragment";
private static final int LOADER_GROUPS = 1;
@@ -63,6 +77,8 @@
private ListView mListView;
private View mEmptyView;
+ private OnGroupBrowserActionListener mListener;
+
public GroupBrowseListFragment() {
}
@@ -96,14 +112,14 @@
}
/**
- * The listener for the group meta data loader.
+ * The listener for the group meta data loader for all groups.
*/
private final LoaderManager.LoaderCallbacks<Cursor> mGroupLoaderListener =
new LoaderCallbacks<Cursor>() {
@Override
public CursorLoader onCreateLoader(int id, Bundle args) {
- return new GroupMetaDataLoader(mContext);
+ return new GroupMetaDataLoader(mContext, Groups.CONTENT_URI);
}
@Override
@@ -144,21 +160,18 @@
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- startGroupDetailActivity((GroupMetaData) view.getTag());
+ GroupListItem groupListItem = (GroupListItem) view;
+ viewGroup(groupListItem.getUri());
}
});
}
- private void startGroupDetailActivity(GroupMetaData group) {
- if (group == null) {
- return;
- }
- Intent intent = new Intent(mContext, GroupDetailActivity.class);
- intent.putExtra(GroupDetailActivity.KEY_ACCOUNT_TYPE, group.getAccountType());
- intent.putExtra(GroupDetailActivity.KEY_ACCOUNT_NAME, group.getAccountName());
- intent.putExtra(GroupDetailActivity.KEY_GROUP_ID, group.getGroupId());
- intent.putExtra(GroupDetailActivity.KEY_GROUP_TITLE, group.getTitle());
- mContext.startActivity(intent);
+ public void setListener(OnGroupBrowserActionListener listener) {
+ mListener = listener;
+ }
+
+ private void viewGroup(Uri groupUri) {
+ if (mListener != null) mListener.onViewGroupAction(groupUri);
}
private void hideSoftKeyboard() {
diff --git a/src/com/android/contacts/group/GroupDetailFragment.java b/src/com/android/contacts/group/GroupDetailFragment.java
index 98babac..8cffd05 100644
--- a/src/com/android/contacts/group/GroupDetailFragment.java
+++ b/src/com/android/contacts/group/GroupDetailFragment.java
@@ -17,21 +17,26 @@
package com.android.contacts.group;
import com.android.contacts.ContactPhotoManager;
+import com.android.contacts.GroupMetaData;
+import com.android.contacts.GroupMetaDataLoader;
import com.android.contacts.R;
import com.android.contacts.activities.GroupDetailActivity;
import com.android.contacts.list.ContactListAdapter;
import com.android.contacts.list.ContactListFilter;
import com.android.contacts.list.DefaultContactListAdapter;
+import android.accounts.Account;
import android.app.Activity;
import android.app.Fragment;
import android.app.LoaderManager;
import android.app.LoaderManager.LoaderCallbacks;
+import android.content.ContentValues;
import android.content.Context;
import android.content.CursorLoader;
import android.content.Intent;
import android.content.Loader;
import android.database.Cursor;
+import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Directory;
@@ -43,24 +48,47 @@
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
/**
* Displays the details of a group and shows a list of actions possible for the group.
*/
public class GroupDetailFragment extends Fragment implements OnScrollListener {
+ public static interface Listener {
+ /**
+ * The group title has been loaded
+ */
+ public void onGroupTitleUpdated(String title);
+
+ /**
+ * The number of group members has been determined
+ */
+ public void onGroupSizeUpdated(String size);
+ }
+
private static final String TAG = "GroupDetailFragment";
- private static final int LOADER_MEMBERS = 0;
+ private static final int LOADER_METADATA = 0;
+ private static final int LOADER_MEMBERS = 1;
private Context mContext;
private View mRootView;
+ private TextView mGroupTitle;
+ private TextView mGroupSize;
private ListView mMemberListView;
+ private Listener mListener;
+
private ContactListAdapter mAdapter;
private ContactPhotoManager mPhotoManager;
+ private Uri mGroupUri;
+ private long mGroupId;
+
public GroupDetailFragment() {
}
@@ -80,7 +108,9 @@
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
mRootView = inflater.inflate(R.layout.group_detail_fragment, container, false);
- mMemberListView = (ListView) mRootView.findViewById(R.id.member_list);
+ mGroupTitle = (TextView) mRootView.findViewById(R.id.group_title);
+ mGroupSize = (TextView) mRootView.findViewById(R.id.group_size);
+ mMemberListView = (ListView) mRootView.findViewById(android.R.id.list);
mMemberListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
@@ -90,22 +120,12 @@
return mRootView;
}
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
-
- Intent intent = getActivity().getIntent();
- String accountType = intent.getStringExtra(GroupDetailActivity.KEY_ACCOUNT_TYPE);
- String accountName = intent.getStringExtra(GroupDetailActivity.KEY_ACCOUNT_NAME);
- long groupId = intent.getLongExtra(GroupDetailActivity.KEY_GROUP_ID, -1);
- String groupTitle = intent.getStringExtra(GroupDetailActivity.KEY_GROUP_TITLE);
-
- configureAdapter(accountType, accountName, groupId, groupTitle);
- startGroupMembersLoader();
+ public void loadGroup(Uri groupUri) {
+ mGroupUri= groupUri;
+ startGroupMetadataLoader();
}
- private void configureAdapter(String accountType, String accountName,
- long groupId, String groupTitle) {
+ private void configureAdapter(long groupId) {
mAdapter = new DefaultContactListAdapter(getActivity());
mAdapter.setSectionHeaderDisplayEnabled(false);
mAdapter.setDisplayPhotos(true);
@@ -115,8 +135,7 @@
mAdapter.setContactNameDisplayOrder(ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY);
mAdapter.setSortOrder(ContactsContract.Preferences.SORT_ORDER_PRIMARY);
mAdapter.setPhotoLoader(mPhotoManager);
- mAdapter.setFilter(new ContactListFilter(accountType, accountName, groupId, "", false,
- groupTitle));
+ mAdapter.setFilter(ContactListFilter.createGroupFilter(groupId));
mMemberListView.setAdapter(mAdapter);
}
@@ -134,6 +153,18 @@
}
}
+ public void setListener(Listener value) {
+ mListener = value;
+ }
+
+ /**
+ * Start the loader to retrieve the metadata for this group.
+ */
+ private void startGroupMetadataLoader() {
+ getLoaderManager().destroyLoader(LOADER_METADATA);
+ getLoaderManager().restartLoader(LOADER_METADATA, null, mGroupMetadataLoaderListener);
+ }
+
/**
* Start the loader to retrieve the list of group members.
*/
@@ -143,6 +174,30 @@
}
/**
+ * The listener for the group metadata loader.
+ */
+ private final LoaderManager.LoaderCallbacks<Cursor> mGroupMetadataLoaderListener =
+ new LoaderCallbacks<Cursor>() {
+
+ @Override
+ public CursorLoader onCreateLoader(int id, Bundle args) {
+ return new GroupMetaDataLoader(mContext, mGroupUri);
+ }
+
+ @Override
+ public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+ bindGroupMetaData(data);
+
+ // Retrieve the list of members
+ configureAdapter(mGroupId);
+ startGroupMembersLoader();
+ }
+
+ @Override
+ public void onLoaderReset(Loader<Cursor> loader) {}
+ };
+
+ /**
* The listener for the group members list loader
*/
private final LoaderManager.LoaderCallbacks<Cursor> mGroupMemberListLoaderListener =
@@ -157,13 +212,38 @@
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
- mAdapter.changeCursor(loader.getId(), data);
+ updateSize(Integer.toString(data.getCount()));
+ mAdapter.changeCursor(0, data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {}
};
+ private void bindGroupMetaData(Cursor cursor) {
+ cursor.moveToPosition(-1);
+ if (cursor.moveToNext()) {
+ mGroupId = cursor.getLong(GroupMetaDataLoader.GROUP_ID);
+ updateTitle(cursor.getString(GroupMetaDataLoader.TITLE));
+ }
+ }
+
+ private void updateTitle(String title) {
+ if (mGroupTitle != null) {
+ mGroupTitle.setText(title);
+ } else {
+ mListener.onGroupTitleUpdated(title);
+ }
+ }
+
+ private void updateSize(String size) {
+ if (mGroupSize != null) {
+ mGroupSize.setText(size);
+ } else {
+ mListener.onGroupSizeUpdated(size);
+ }
+ }
+
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
diff --git a/src/com/android/contacts/list/ContactBrowseListFragment.java b/src/com/android/contacts/list/ContactBrowseListFragment.java
index 1ecfff1..7f7dad4 100644
--- a/src/com/android/contacts/list/ContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/ContactBrowseListFragment.java
@@ -658,7 +658,8 @@
private void restoreFilter() {
mFilter = ContactListFilter.restoreFromPreferences(mPrefs);
if (mFilter == null) {
- mFilter = new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
+ mFilter = ContactListFilter.createFilterWithType(
+ ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
}
}
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index fcced62..a080b37 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -70,7 +70,7 @@
LoaderCallbacks<Cursor> {
private static final String TAG = "ContactEntryListFragment";
- // TODO: Make this protected. This should not be used from the ContactBrowserActivity but
+ // TODO: Make this protected. This should not be used from the PeopleActivity but
// instead use the new startActivityWithResultFromFragment API
public static final int ACTIVITY_REQUEST_CODE_PICKER = 1;
diff --git a/src/com/android/contacts/list/ContactListFilter.java b/src/com/android/contacts/list/ContactListFilter.java
index c53859b..0651986 100644
--- a/src/com/android/contacts/list/ContactListFilter.java
+++ b/src/com/android/contacts/list/ContactListFilter.java
@@ -45,40 +45,49 @@
private static final String KEY_GROUP_READ_ONLY = "filter.groupReadOnly";
private static final String KEY_GROUP_TITLE = "filter.groupTitle";
- public int filterType;
- public String accountType;
- public String accountName;
- public Drawable icon;
+ public final int filterType;
+ public final String accountType;
+ public final String accountName;
+ public final Drawable icon;
public long groupId;
public String groupSourceId;
- public boolean groupReadOnly;
- public String title;
+ public final boolean groupReadOnly;
+ public final String title;
private String mId;
- public ContactListFilter(int filterType) {
+ public ContactListFilter(int filterType, String accountType, String accountName, Drawable icon,
+ long groupId, String groupSourceId, boolean groupReadOnly, String title) {
this.filterType = filterType;
- }
-
- public ContactListFilter(
- String accountType, String accountName, Drawable icon, String title) {
- this.filterType = ContactListFilter.FILTER_TYPE_ACCOUNT;
this.accountType = accountType;
this.accountName = accountName;
this.icon = icon;
- this.title = title;
- }
-
- public ContactListFilter(String accountType, String accountName, long groupId,
- String groupSourceId, boolean groupReadOnly, String title) {
- this.filterType = ContactListFilter.FILTER_TYPE_GROUP;
- this.accountType = accountType;
- this.accountName = accountName;
this.groupId = groupId;
this.groupSourceId = groupSourceId;
this.groupReadOnly = groupReadOnly;
this.title = title;
}
+ public static ContactListFilter createFilterWithType(int filterType) {
+ return new ContactListFilter(filterType, null, null, null, 0, null, false, null);
+ }
+
+ public static ContactListFilter createGroupFilter(long groupId) {
+ return new ContactListFilter(ContactListFilter.FILTER_TYPE_GROUP, null, null, null, groupId,
+ null, false, null);
+ }
+
+ public static ContactListFilter createGroupFilter(String accountType, String accountName,
+ long groupId, String groupSourceId, boolean groupReadOnly, String title) {
+ return new ContactListFilter(ContactListFilter.FILTER_TYPE_GROUP, accountType, accountName,
+ null, groupId, groupSourceId, groupReadOnly, title);
+ }
+
+ public static ContactListFilter createAccountFilter(String accountType, String accountName,
+ Drawable icon, String title) {
+ return new ContactListFilter(ContactListFilter.FILTER_TYPE_ACCOUNT, accountType,
+ accountName, icon, 0, null, false, title);
+ }
+
/**
* Returns true if this filter is based on data and may become invalid over time.
*/
@@ -188,14 +197,14 @@
return null;
}
- ContactListFilter filter = new ContactListFilter(filterType);
- filter.accountName = prefs.getString(KEY_ACCOUNT_NAME, null);
- filter.accountType = prefs.getString(KEY_ACCOUNT_TYPE, null);
- filter.groupId = prefs.getLong(KEY_GROUP_ID, -1);
- filter.groupSourceId = prefs.getString(KEY_GROUP_SOURCE_ID, null);
- filter.groupReadOnly = prefs.getBoolean(KEY_GROUP_READ_ONLY, false);
- filter.title = prefs.getString(KEY_GROUP_TITLE, "group");
- return filter;
+ String accountName = prefs.getString(KEY_ACCOUNT_NAME, null);
+ String accountType = prefs.getString(KEY_ACCOUNT_TYPE, null);
+ long groupId = prefs.getLong(KEY_GROUP_ID, -1);
+ String groupSourceId = prefs.getString(KEY_GROUP_SOURCE_ID, null);
+ boolean groupReadOnly = prefs.getBoolean(KEY_GROUP_READ_ONLY, false);
+ String title = prefs.getString(KEY_GROUP_TITLE, "group");
+ return new ContactListFilter(filterType, accountType, accountName, null, groupId,
+ groupSourceId, groupReadOnly, title);
}
@@ -210,18 +219,17 @@
}
public static final Parcelable.Creator<ContactListFilter> CREATOR =
- new Parcelable.Creator<ContactListFilter>()
- {
+ new Parcelable.Creator<ContactListFilter>() {
@Override
public ContactListFilter createFromParcel(Parcel source) {
int filterType = source.readInt();
- ContactListFilter filter = new ContactListFilter(filterType);
- filter.accountName = source.readString();
- filter.accountType = source.readString();
- filter.groupId = source.readLong();
- filter.groupSourceId = source.readString();
- filter.groupReadOnly = source.readInt() != 0;
- return filter;
+ String accountName = source.readString();
+ String accountType = source.readString();
+ long groupId = source.readLong();
+ String groupSourceId = source.readString();
+ boolean groupReadOnly = source.readInt() != 0;
+ return new ContactListFilter(filterType, accountType, accountName, null, groupId,
+ groupSourceId, groupReadOnly, null);
}
@Override
diff --git a/src/com/android/contacts/list/ContactListFilterController.java b/src/com/android/contacts/list/ContactListFilterController.java
index 4da5baa..533f24a 100644
--- a/src/com/android/contacts/list/ContactListFilterController.java
+++ b/src/com/android/contacts/list/ContactListFilterController.java
@@ -160,10 +160,10 @@
}
if (mAccountCount != 1) {
- mFilters.append(mNextFilterId++,
- new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS));
- mFilters.append(mNextFilterId++,
- new ContactListFilter(ContactListFilter.FILTER_TYPE_STARRED));
+ mFilters.append(mNextFilterId++, ContactListFilter.createFilterWithType(
+ ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS));
+ mFilters.append(mNextFilterId++, ContactListFilter.createFilterWithType(
+ ContactListFilter.FILTER_TYPE_STARRED));
}
for (int index = 0; index < count; index++) {
@@ -174,7 +174,8 @@
// If we only have one account, don't show it as "account", instead show it as "all"
if (firstAndOnly) {
- filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
+ filter = ContactListFilter.createFilterWithType(
+ ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
}
mFilters.append(mNextFilterId++, filter);
@@ -186,14 +187,14 @@
}
if (firstAndOnly) {
- mFilters.append(mNextFilterId++,
- new ContactListFilter(ContactListFilter.FILTER_TYPE_STARRED));
+ mFilters.append(mNextFilterId++, ContactListFilter.createFilterWithType(
+ ContactListFilter.FILTER_TYPE_STARRED));
}
}
if (mAccountCount > 0) {
- mFilters.append(
- mNextFilterId++, new ContactListFilter(ContactListFilter.FILTER_TYPE_CUSTOM));
+ mFilters.append(mNextFilterId++, ContactListFilter.createFilterWithType(
+ ContactListFilter.FILTER_TYPE_CUSTOM));
}
boolean filterChanged = false;
@@ -222,11 +223,14 @@
private void setContactListFilter(int filterId) {
ContactListFilter filter;
if (filterId == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) {
- filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
+ filter = ContactListFilter.createFilterWithType(
+ ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
} else if (filterId == ContactListFilter.FILTER_TYPE_CUSTOM) {
- filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_CUSTOM);
+ filter = ContactListFilter.createFilterWithType(
+ ContactListFilter.FILTER_TYPE_CUSTOM);
} else if (filterId == ContactListFilter.FILTER_TYPE_STARRED) {
- filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_STARRED);
+ filter = ContactListFilter.createFilterWithType(
+ ContactListFilter.FILTER_TYPE_STARRED);
} else {
filter = mFilters.get(filterId);
if (filter == null) {
@@ -286,7 +290,7 @@
}
public void selectCustomFilter() {
- mFilter = new ContactListFilter(ContactListFilter.FILTER_TYPE_CUSTOM);
+ mFilter = ContactListFilter.createFilterWithType(ContactListFilter.FILTER_TYPE_CUSTOM);
notifyContactListFilterChanged();
}
diff --git a/src/com/android/contacts/list/ContactListFilterLoader.java b/src/com/android/contacts/list/ContactListFilterLoader.java
index 82749ff..6bca4ad 100644
--- a/src/com/android/contacts/list/ContactListFilterLoader.java
+++ b/src/com/android/contacts/list/ContactListFilterLoader.java
@@ -81,7 +81,8 @@
for (Account account : accounts) {
AccountType accountType = accountTypes.getAccountType(account.type);
Drawable icon = accountType != null ? accountType.getDisplayIcon(getContext()) : null;
- results.add(new ContactListFilter(account.type, account.name, icon, account.name));
+ results.add(ContactListFilter.createAccountFilter(account.type, account.name, icon,
+ account.name));
}
ContentResolver resolver = context.getContentResolver();
@@ -111,8 +112,8 @@
}
} else {
String title = cursor.getString(GroupQuery.TITLE);
- results.add(new ContactListFilter(accountType, accountName, groupId,
- groupSourceId, groupReadOnly, title));
+ results.add(ContactListFilter.createGroupFilter(accountType, accountName,
+ groupId, groupSourceId, groupReadOnly, title));
}
}
} finally {
diff --git a/src/com/android/contacts/list/ContactPickerFragment.java b/src/com/android/contacts/list/ContactPickerFragment.java
index 17e3fb9..6bfca57 100644
--- a/src/com/android/contacts/list/ContactPickerFragment.java
+++ b/src/com/android/contacts/list/ContactPickerFragment.java
@@ -151,8 +151,8 @@
protected ContactEntryListAdapter createListAdapter() {
if (!isLegacyCompatibilityMode()) {
DefaultContactListAdapter adapter = new DefaultContactListAdapter(getActivity());
- adapter.setFilter(
- new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS));
+ adapter.setFilter(ContactListFilter.createFilterWithType(
+ ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS));
adapter.setSectionHeaderDisplayEnabled(true);
adapter.setDisplayPhotos(true);
adapter.setQuickContactEnabled(false);
diff --git a/src/com/android/contacts/list/StrequentAdapter.java b/src/com/android/contacts/list/StrequentAdapter.java
new file mode 100644
index 0000000..4c6109a
--- /dev/null
+++ b/src/com/android/contacts/list/StrequentAdapter.java
@@ -0,0 +1,232 @@
+/*
+ * 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.list;
+
+import com.android.contacts.ContactPhotoManager;
+import com.android.contacts.R;
+import com.android.contacts.StrequentMetaDataLoader;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.provider.ContactsContract.Contacts;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+
+/**
+ * Arranges contacts in {@link StrequentFragment} (aka favorites) according to if the contact
+ * is starred or not. Also shows two contacts per row.
+ */
+public class StrequentAdapter extends BaseAdapter implements OnClickListener {
+
+ private LayoutInflater mInflater;
+ private ArrayList<StrequentEntry> mAllEntries;
+ private ContactPhotoManager mPhotoManager;
+ private Listener mListener;
+ private int mMostFrequentCount;
+ private int mStarredCount;
+ private static final int NUMCOLS = 2;
+
+ public StrequentAdapter(Context context, Listener listener) {
+ mInflater = LayoutInflater.from(context);
+ mPhotoManager = ContactPhotoManager.createContactPhotoManager(context);
+ mListener = listener;
+ }
+
+ public void setCursor(Cursor cursor){
+ populateStrequentEntries(cursor);
+ }
+
+ private void populateStrequentEntries(Cursor cursor) {
+ mAllEntries = new ArrayList<StrequentEntry>();
+ mMostFrequentCount = mStarredCount = 0;
+
+ while (cursor.moveToNext()) {
+ StrequentEntry contact = new StrequentEntry();
+
+ contact.id = cursor.getLong(StrequentMetaDataLoader.CONTACT_ID);
+ contact.photoId = cursor.getLong(StrequentMetaDataLoader.PHOTO_ID);
+ contact.name = cursor.getString(StrequentMetaDataLoader.DISPLAY_NAME);
+
+ // Adding Starred Contact
+ if (cursor.getInt(StrequentMetaDataLoader.STARRED) == 1) {
+ mStarredCount++;
+ } else {
+ mMostFrequentCount++;
+ }
+ mAllEntries.add(contact);
+ }
+ this.notifyDataSetChanged();
+ }
+
+ @Override
+ public int getCount() {
+ return mAllEntries.size() / NUMCOLS;
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return mAllEntries.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return mAllEntries.get(position).id;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ ViewHolder holder;
+ // Note: For now, every row except for the last row will have 2 columns
+ int index = position * NUMCOLS;
+
+ // Try to recycle convertView
+ if (convertView != null) {
+ holder = (ViewHolder) convertView.getTag();
+ } else {
+ // Must create new View
+ convertView = mInflater.inflate(R.layout.contact_tile_row_regular, null);
+ holder = new ViewHolder(convertView);
+
+ holder.getLayoutLeft().setOnClickListener(this);
+ holder.getLayoutRight().setOnClickListener(this);
+
+ convertView.setTag(holder);
+ }
+
+ holder.getTextLeft().setText(mAllEntries.get(index).name);
+ mPhotoManager.loadPhoto(holder.getImageLeft(), mAllEntries.get(index).photoId);
+ holder.getLayoutLeft().setTag(mAllEntries.get(index));
+
+ if (++index < mAllEntries.size()) {
+ holder.getTextRight().setText(mAllEntries.get(index).name);
+ mPhotoManager.loadPhoto(holder.mImageRight, mAllEntries.get(index).photoId);
+ holder.getLayoutRight().setTag(mAllEntries.get(index));
+ } else {
+ holder.getTextRight().setText(null);
+ holder.getImageRight().setImageBitmap(null);
+ holder.getLayoutRight().setOnClickListener(null);
+ }
+
+ return convertView;
+ }
+
+ @Override
+ public int getViewTypeCount() {
+ return 1;
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ return 1;
+ }
+
+ /**
+ * Class it hold views for layout to help make wonderful listview faster
+ */
+ private static class ViewHolder {
+ private TextView mTextLeft, mTextRight;
+ private ImageView mImageLeft, mImageRight;
+ private View mLayoutLeft, mLayoutRight;
+
+ public ViewHolder(View convertView){
+ // Left Column
+ mTextLeft = (TextView) convertView.findViewById(R.id.contactTile_left_name);
+ mImageLeft = (ImageView) convertView.findViewById(R.id.contactTile_left_image);
+ mLayoutLeft = convertView.findViewById(R.id.contactTile_row_left);
+
+ // Right Column
+ mTextRight = (TextView) convertView.findViewById(R.id.contactTile_right_name);
+ mImageRight = (ImageView) convertView.findViewById(R.id.contactTile_right_image);
+ mLayoutRight = convertView.findViewById(R.id.contactTile_row_right);
+ }
+
+ public TextView getTextLeft() {
+ return mTextLeft;
+ }
+
+ public void setTextLeft(TextView textLeft) {
+ this.mTextLeft = textLeft;
+ }
+
+ public TextView getTextRight() {
+ return mTextRight;
+ }
+
+ public void setTextRight(TextView textRight) {
+ this.mTextRight = textRight;
+ }
+
+ public ImageView getImageLeft() {
+ return mImageLeft;
+ }
+
+ public void setImageLeft(ImageView imageLeft) {
+ this.mImageLeft = imageLeft;
+ }
+
+ public ImageView getImageRight() {
+ return mImageRight;
+ }
+
+ public void setImageRight(ImageView imageRight) {
+ this.mImageRight = imageRight;
+ }
+
+ public View getLayoutLeft() {
+ return mLayoutLeft;
+ }
+
+ public void setLayoutLeft(View layoutLeft) {
+ this.mLayoutLeft = layoutLeft;
+ }
+
+ public View getLayoutRight() {
+ return mLayoutRight;
+ }
+
+ public void setLayoutRight(View layoutRight) {
+ this.mLayoutRight = layoutRight;
+ }
+ }
+
+ /**
+ * Class to hold contact information
+ */
+ private static class StrequentEntry {
+ public long id;
+ public long photoId;
+ public String name;
+ }
+
+ @Override
+ public void onClick(View v) {
+ StrequentEntry entry = (StrequentEntry)v.getTag();
+ Uri data = Uri.withAppendedPath(Contacts.CONTENT_URI, String.valueOf(entry.id));
+ mListener.onContactSelected(data);
+ }
+
+ public interface Listener {
+ public void onContactSelected(Uri contactUri);
+ }
+}
diff --git a/src/com/android/contacts/list/StrequentContactListFragment.java b/src/com/android/contacts/list/StrequentContactListFragment.java
index 393e698..47cc7be 100644
--- a/src/com/android/contacts/list/StrequentContactListFragment.java
+++ b/src/com/android/contacts/list/StrequentContactListFragment.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 The Android Open Source Project
+ * 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.
@@ -16,94 +16,94 @@
package com.android.contacts.list;
import com.android.contacts.R;
+import com.android.contacts.StrequentMetaDataLoader;
+import android.app.Activity;
+import android.app.Fragment;
+import android.app.LoaderManager;
+import android.app.LoaderManager.LoaderCallbacks;
+import android.content.Context;
+import android.content.CursorLoader;
+import android.content.Loader;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.view.View.OnClickListener;
+import android.widget.ListView;
/**
* Fragment containing a list of starred contacts followed by a list of frequently contacted.
*/
-public class StrequentContactListFragment extends ContactBrowseListFragment
- implements OnClickListener {
+public class StrequentContactListFragment extends Fragment {
+ public interface Listener {
+ public void onContactSelected(Uri contactUri);
+ }
- private static final int CALL_BUTTON_ID = android.R.id.button1;
+ private static int LOADER_STREQUENT = 1;
- private boolean mStarredContactsIncluded = true;
- private boolean mFrequentlyContactedContactsIncluded = true;
+ private Listener mListener;
+ private StrequentAdapter mAdapter;
+ private ListView mListView;
+ private Context mContext;
- public StrequentContactListFragment() {
- setSectionHeaderDisplayEnabled(false);
- setPhotoLoaderEnabled(true);
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ mAdapter = new StrequentAdapter(getActivity(), mAdapterListener);
+ mContext = activity;
}
@Override
- protected boolean isNameHighlighingEnabled() {
- // Since the list is not ordered alphabetically, we don't need to highlight the part
- // that is used for sorting.
- return false;
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View v = inflater.inflate(R.layout.strequent_fragment, container, false);
+ mListView = (ListView) v.findViewById(R.id.strequent_list);
+ mListView.setItemsCanFocus(true);
+ return v;
}
- public void setStarredContactsIncluded(boolean flag) {
- mStarredContactsIncluded = flag;
- configureAdapter();
- }
-
- public void setFrequentlyContactedContactsIncluded(boolean flag) {
- mFrequentlyContactedContactsIncluded = flag;
- configureAdapter();
+ public void setListener(Listener listener) {
+ mListener = listener;
}
@Override
- protected void onItemClick(int position, long id) {
- ContactListAdapter adapter = getAdapter();
- viewContact(adapter.getContactUri(position));
+ public void onStart(){
+ super.onStart();
+ getLoaderManager().restartLoader(LOADER_STREQUENT, null, mStrequentLoaderListener);
}
- @Override
- protected ContactListAdapter createListAdapter() {
- StrequentContactListAdapter adapter =
- new StrequentContactListAdapter(getActivity(), CALL_BUTTON_ID);
- adapter.setSectionHeaderDisplayEnabled(false);
- adapter.setDisplayPhotos(true);
- adapter.setQuickContactEnabled(true);
- adapter.setCallButtonListener(this);
+ /**
+ * The listener for the strequent meta data loader.
+ */
+ private final LoaderManager.LoaderCallbacks<Cursor> mStrequentLoaderListener =
+ new LoaderCallbacks<Cursor>() {
- return adapter;
- }
-
- @Override
- protected void configureAdapter() {
- super.configureAdapter();
-
- StrequentContactListAdapter adapter = (StrequentContactListAdapter)getAdapter();
- if (adapter != null) {
- adapter.setStarredContactsIncluded(mStarredContactsIncluded);
- adapter.setFrequentlyContactedContactsIncluded(mFrequentlyContactedContactsIncluded);
+ @Override
+ public CursorLoader onCreateLoader(int id, Bundle args) {
+ return new StrequentMetaDataLoader(mContext);
}
- }
- @Override
- protected View inflateView(LayoutInflater inflater, ViewGroup container) {
- return inflater.inflate(R.layout.contacts_list_content, null);
- }
+ @Override
+ public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+ mAdapter.setCursor(data);
+ mListView.setAdapter(mAdapter);
+ }
- @Override
- protected void prepareEmptyView() {
- setEmptyText(R.string.noFavoritesHelpText);
- }
+ @Override
+ public void onLoaderReset(Loader<Cursor> loader) {
+ mAdapter.setCursor(null);
+ }
+ };
- @Override
- public void onClick(View v) {
- int id = v.getId();
- switch (id) {
- case CALL_BUTTON_ID: {
- final int position = (Integer)v.getTag();
- ContactListAdapter adapter = getAdapter();
- callContact(adapter.getContactUri(position));
- break;
+ private StrequentAdapter.Listener mAdapterListener =
+ new StrequentAdapter.Listener() {
+ @Override
+ public void onContactSelected(Uri contactUri) {
+ if (mListener != null) {
+ mListener.onContactSelected(contactUri);
}
}
- }
+ };
}
diff --git a/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java b/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
index 03b6302..71012de 100644
--- a/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
+++ b/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
@@ -58,7 +58,7 @@
private static final String ANDROID_CONTACTS_PACKAGE = "com.android.contacts";
private static final String CONTACT_LIST_ACTIVITY_CLASS_NAME =
- "com.android.contacts.activities.ContactBrowserActivity";
+ "com.android.contacts.activities.PeopleActivity";
public enum ContactsIntent {
LIST_DEFAULT,