Merge "Remove some TODOs and imports"
diff --git a/res/layout-sw580dp/people_activity.xml b/res/layout-sw580dp/people_activity.xml
index 1d02042..8bf627f 100644
--- a/res/layout-sw580dp/people_activity.xml
+++ b/res/layout-sw580dp/people_activity.xml
@@ -40,11 +40,6 @@
android:background="@drawable/list_background_holo"
android:visibility="gone">
- <View
- style="@style/SectionDivider"
- android:layout_marginLeft="40dip"
- android:layout_marginTop="24dip" />
-
<!-- All -->
<fragment
android:id="@+id/all_fragment"
diff --git a/res/layout/contact_list_filter.xml b/res/layout/contact_list_filter.xml
index de05cf8..37aaf53 100644
--- a/res/layout/contact_list_filter.xml
+++ b/res/layout/contact_list_filter.xml
@@ -25,7 +25,9 @@
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dip"
- android:layout_weight="1" />
+ android:layout_weight="1"
+ android:layout_marginLeft="@dimen/contact_filter_left_margin"
+ android:layout_marginRight="@dimen/contact_filter_right_margin" />
<View
android:layout_width="match_parent"
diff --git a/res/layout/contact_list_filter_custom.xml b/res/layout/contact_list_filter_custom.xml
index 195ff1a..a4fe48e 100644
--- a/res/layout/contact_list_filter_custom.xml
+++ b/res/layout/contact_list_filter_custom.xml
@@ -25,8 +25,8 @@
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"/>
+ android:layout_marginLeft="@dimen/contact_filter_left_margin"
+ android:layout_marginRight="@dimen/contact_filter_right_margin" />
<View
android:layout_width="match_parent"
diff --git a/res/layout/filter_spinner_item.xml b/res/layout/contact_list_filter_item.xml
similarity index 75%
rename from res/layout/filter_spinner_item.xml
rename to res/layout/contact_list_filter_item.xml
index c2d5d68..b27cab8 100644
--- a/res/layout/filter_spinner_item.xml
+++ b/res/layout/contact_list_filter_item.xml
@@ -17,32 +17,27 @@
<view
xmlns:android="http://schemas.android.com/apk/res/android"
class="com.android.contacts.list.ContactListFilterView"
- android:layout_height="52dip"
- android:layout_width="fill_parent"
- android:paddingLeft="7dip"
- android:paddingRight="7dip"
- android:paddingTop="2dip"
- android:paddingBottom="2dip"
- android:gravity="left">
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="@dimen/contact_filter_item_min_height">
<View
android:id="@+id/indent"
- android:layout_width="40dip"
+ android:layout_width="32dip"
android:layout_height="fill_parent" />
<ImageView
android:id="@+id/icon"
android:scaleType="fitCenter"
- android:layout_width="24dip"
- android:layout_height="24dip"
- android:layout_marginLeft="8dip"
- android:layout_marginRight="7dip"
+ android:layout_width="@dimen/contact_filter_icon_size"
+ android:layout_height="@dimen/contact_filter_icon_size"
android:layout_gravity="center_vertical" />
<TextView
android:id="@+id/label"
android:layout_width="wrap_content"
- android:layout_height="fill_parent"
+ android:layout_height="match_parent"
+ android:layout_marginLeft="8dip"
android:textAppearance="?android:attr/textAppearanceMedium"
android:gravity="center_vertical"
android:ellipsize="end" />
diff --git a/res/layout/contacts_list_content.xml b/res/layout/contacts_list_content.xml
index 490499c..92841b6 100644
--- a/res/layout/contacts_list_content.xml
+++ b/res/layout/contacts_list_content.xml
@@ -14,10 +14,14 @@
limitations under the License.
-->
+<!-- android:paddingTop is used instead of android:layout_marginTop. It looks
+ android:layout_marginTop is ignored when used with <fragment></fragment>, which
+ only happens in Tablet UI since we rely on ViewPager in Phone UI.
+ Instead, android:layout_marginTop inside <fragment /> is effective. -->
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pinned_header_list_layout"
- android:layout_marginTop="@dimen/contact_browser_list_top_margin"
+ android:paddingTop="@dimen/contact_browser_list_top_margin"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
@@ -25,24 +29,38 @@
android:layout_height="match_parent"
android:orientation="vertical">
- <TextView
- android:id="@+id/account_filter_header"
+ <!-- Shown only when an Account filter is set. -->
+ <LinearLayout
+ android:id="@+id/account_filter_header_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:singleLine="true"
- android:ellipsize="end"
- android:gravity="center"
- android:padding="5dip"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="@android:color/white"
- android:background="@android:color/black"
- android:visibility="gone" />
+ android:orientation="vertical"
+ android:layout_marginLeft="@dimen/contact_browser_list_header_left_margin"
+ android:layout_marginRight="@dimen/contact_browser_list_header_right_margin"
+ android:visibility="gone">
+ <TextView
+ android:id="@+id/account_filter_header"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="@dimen/contact_filter_header_min_height"
+ android:layout_marginLeft="8dip"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:gravity="left"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="?android:attr/textColorSecondary" />
+ <View
+ android:id="@+id/account_filter_header_bottom_divider"
+ style="@style/SectionDivider" />
+ </LinearLayout>
<view
class="com.android.contacts.list.ContactEntryListView"
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dip"
+ android:layout_marginLeft="@dimen/contact_browser_list_left_margin"
+ android:layout_marginRight="@dimen/contact_browser_list_right_margin"
android:fastScrollEnabled="true"
android:layout_weight="1" />
@@ -61,7 +79,7 @@
android:ellipsize="end"
android:gravity="right"
android:layout_gravity="top|right"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="@color/contact_count_text_color"
android:background="@color/contact_browser_list_bk_color" />
</FrameLayout>
diff --git a/res/layout/custom_contact_list_filter_account.xml b/res/layout/custom_contact_list_filter_account.xml
index b19ae2d..8c1b6c1 100644
--- a/res/layout/custom_contact_list_filter_account.xml
+++ b/res/layout/custom_contact_list_filter_account.xml
@@ -37,7 +37,7 @@
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="marquee"
- android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textAppearance="?android:attr/textAppearanceMedium"
android:duplicateParentState="true" />
<TextView
@@ -46,8 +46,9 @@
android:layout_height="wrap_content"
android:layout_below="@android:id/text1"
android:layout_alignLeft="@android:id/text1"
- android:maxLines="2"
+ android:maxLines="1"
android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="?android:attr/textColorTertiary"
android:duplicateParentState="true" />
</RelativeLayout>
diff --git a/res/layout/directory_header.xml b/res/layout/directory_header.xml
index 2748923..af0b5bd 100644
--- a/res/layout/directory_header.xml
+++ b/res/layout/directory_header.xml
@@ -19,42 +19,40 @@
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/DirectoryHeader"
android:layout_width="match_parent"
- android:layout_height="@dimen/directory_header_height"
- >
- <TextView
- android:id="@+id/count"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_centerVertical="true"
- android:layout_alignParentRight="true"
- android:layout_marginRight="8dip"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorTertiary"
- android:textStyle="bold"
- />
- <TextView
- android:id="@+id/label"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_alignBaseline="@id/count"
- android:layout_marginLeft="8dip"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorTertiary"
- android:textStyle="bold"
- />
+ android:layout_height="wrap_content">
<TextView
android:id="@+id/display_name"
- android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:layout_toRightOf="@id/label"
- android:layout_toLeftOf="@id/count"
- android:layout_alignBaseline="@id/count"
- android:layout_marginLeft="6dip"
- android:layout_marginRight="6dip"
+ android:layout_height="wrap_content"
+ android:minHeight="@dimen/directory_header_height"
+ android:layout_toRightOf="@+id/label"
+ android:layout_toLeftOf="@+id/count"
+ android:layout_centerVertical="true"
+ android:layout_marginLeft="8dip"
+ android:layout_marginRight="8dip"
android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorTertiary"
- android:singleLine="true"
- android:ellipsize="end"
- />
+ android:textColor="?android:attr/textColorSecondary"
+ android:singleLine="true" />
+ <TextView
+ android:id="@+id/label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentLeft="true"
+ android:layout_alignBaseline="@id/display_name"
+ android:layout_marginLeft="8dip"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="?android:attr/textColorSecondary" />
+ <TextView
+ android:id="@+id/count"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+ android:layout_marginRight="8dip"
+ android:layout_alignBaseline="@id/display_name"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="?android:attr/textColorSecondary" />
+ <View
+ android:id="@+id/contact_filter_header_bottom_divider"
+ style="@style/SectionDivider"
+ android:layout_below="@id/display_name" />
</RelativeLayout>
diff --git a/res/layout/search_header.xml b/res/layout/search_header.xml
index ab8ec53..b1ba00f 100644
--- a/res/layout/search_header.xml
+++ b/res/layout/search_header.xml
@@ -17,18 +17,17 @@
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
- android:layout_height="28dip"
- android:background="@drawable/infobar_dark">
+ android:layout_height="wrap_content"
+ android:minHeight="@dimen/contact_filter_header_min_height"
+ android:background="@android:color/transparent">
<TextView
android:id="@+id/totalContactsText"
- android:layout_height="wrap_content"
android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true"
- android:layout_marginLeft="8dip"
- android:textColor="#ffbfbfbf"
- android:textSize="14sp"
- android:textStyle="normal" />
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="?android:attr/textColorSecondary" />
<ProgressBar
android:id="@+id/progress"
@@ -37,7 +36,6 @@
android:layout_toRightOf="@id/totalContactsText"
style="?android:attr/progressBarStyleSmall"
android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:layout_marginRight="10dip" />
+ android:layout_centerVertical="true" />
</RelativeLayout>
diff --git a/res/menu/dialtacts_options.xml b/res/menu/dialtacts_options.xml
index aa3af3f..99f87ff 100644
--- a/res/menu/dialtacts_options.xml
+++ b/res/menu/dialtacts_options.xml
@@ -18,4 +18,9 @@
android:id="@+id/search_on_action_bar"
android:icon="@android:drawable/ic_menu_search"
android:showAsAction="always" />
+
+ <item
+ android:id="@+id/filter_option"
+ android:title="@string/menu_contacts_filter"
+ android:showAsAction="withText" />
</menu>
diff --git a/res/values-sw580dp-w1000dp/dimens.xml b/res/values-sw580dp-w1000dp/dimens.xml
index d8503d9..d5f5e58 100644
--- a/res/values-sw580dp-w1000dp/dimens.xml
+++ b/res/values-sw580dp-w1000dp/dimens.xml
@@ -21,6 +21,4 @@
<dimen name="detail_header_view_margin">16dip</dimen>
<dimen name="detail_header_attribution_height">56dip</dimen>
<dimen name="detail_update_section_top_padding">48dip</dimen>
- <dimen name="contact_browser_list_left_margin">0dip</dimen>
- <dimen name="contacts_count_right_margin">24dip</dimen>
</resources>
diff --git a/res/values-sw580dp-w720dp/dimens.xml b/res/values-sw580dp-w720dp/dimens.xml
index c072a95..399c26c 100644
--- a/res/values-sw580dp-w720dp/dimens.xml
+++ b/res/values-sw580dp-w720dp/dimens.xml
@@ -21,6 +21,4 @@
<dimen name="editor_title_label_width">150dip</dimen>
<dimen name="editor_interpolator_narrow_width">800dip</dimen>
<dimen name="editor_name_text_field_right_margin">10dip</dimen>
- <dimen name="contact_browser_list_left_margin">0dip</dimen>
- <dimen name="contacts_count_right_margin">24dip</dimen>
-</resources>
\ No newline at end of file
+</resources>
diff --git a/res/values-sw580dp/dimens.xml b/res/values-sw580dp/dimens.xml
index ab630d2..ed845be 100644
--- a/res/values-sw580dp/dimens.xml
+++ b/res/values-sw580dp/dimens.xml
@@ -32,11 +32,17 @@
<dimen name="action_bar_search_spacing">12dip</dimen>
<dimen name="shortcut_icon_size">64dip</dimen>
<dimen name="list_section_height">37dip</dimen>
- <dimen name="directory_header_height">56dip</dimen>
<dimen name="detail_update_section_item_vertical_padding">32dip</dimen>
<dimen name="search_view_width">400dip</dimen>
- <dimen name="contact_browser_list_left_margin">0dip</dimen>
- <dimen name="contacts_count_right_margin">24dip</dimen>
<!-- Center vertically -->
<dimen name="quick_contact_top_position">-1px</dimen>
+ <!-- Contact list (vertical scroll bar comes left) -->
+ <dimen name="directory_header_height">24dip</dimen>
+ <dimen name="contacts_count_right_margin">24dip</dimen>
+ <dimen name="contact_browser_list_top_margin">16dip</dimen>
+ <dimen name="contact_browser_list_header_left_margin">@dimen/list_visible_scrollbar_padding</dimen>
+ <dimen name="contact_browser_list_header_right_margin">24dip</dimen>
+ <dimen name="contact_browser_list_left_margin">0dip</dimen>
+ <dimen name="contact_browser_list_right_margin">0dip</dimen>
+ <dimen name="list_visible_scrollbar_padding">48dip</dimen>
</resources>
diff --git a/res/values-sw580dp/styles.xml b/res/values-sw580dp/styles.xml
index 0c4c8ba..b9b87cf 100644
--- a/res/values-sw580dp/styles.xml
+++ b/res/values-sw580dp/styles.xml
@@ -84,6 +84,8 @@
</style>
<style name="DirectoryHeader" parent="PeopleTheme">
+ <item name="android:paddingTop">0dip</item>
+ <item name="android:paddingBottom">0dip</item>
<item name="android:background">@drawable/directory_bg_holo</item>
</style>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 997cdf0..a9d745f 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -90,6 +90,7 @@
<!-- Secondary text color in the People app -->
<color name="secondary_text_color">#777777</color>
+ <color name="dialtacts_secondary_text_color">#888888</color>
<!-- Colors in the contact browser list -->
<color name="contact_browser_list_bk_color">#EEEEEE</color>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index ae2bed5..1b737bc 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -143,7 +143,7 @@
<dimen name="detail_vertical_divider_vertical_margin">16dip</dimen>
<!-- Padding to be used between a visible scrollbar and the contact list -->
- <dimen name="list_visible_scrollbar_padding">40dip</dimen>
+ <dimen name="list_visible_scrollbar_padding">32dip</dimen>
<!-- Font size used for the contact name in the widget -->
<dimen name="widget_text_size_name">14sp</dimen>
@@ -187,9 +187,6 @@
<!-- Height of the member list in the group editor -->
<dimen name="group_editor_member_list_height">550dip</dimen>
- <!-- Height for directory headers in contact lists -->
- <dimen name="directory_header_height">28dip</dimen>
-
<!-- Height of edit text in dialpad fragment -->
<dimen name="dialpad_digits_height">67dip</dimen>
<dimen name="dialpad_digits_text_size">33sp</dimen>
@@ -204,8 +201,12 @@
<dimen name="search_view_width">0dip</dimen>
<!-- contact browser list margins -->
- <dimen name="contact_browser_list_left_margin">24dip</dimen>
- <dimen name="contact_browser_list_top_margin">8dip</dimen>
+ <dimen name="contact_browser_list_header_left_margin">16dip</dimen>
+ <dimen name="contact_browser_list_header_right_margin">@dimen/list_visible_scrollbar_padding</dimen>
+ <dimen name="contact_browser_list_left_margin">16dip</dimen>
+ <dimen name="contact_browser_list_right_margin">0dip</dimen>
+
+ <dimen name="contact_browser_list_top_margin">0dip</dimen>
<dimen name="contacts_count_right_margin">40dip</dimen>
<!-- ContactTile Layouts -->
@@ -229,4 +230,14 @@
<dimen name="no_accounts_message_margin">15dip</dimen>
<dimen name="add_account_button_left_margin">50dip</dimen>
<dimen name="add_account_button_right_margin">50dip</dimen>
+
+ <!-- For contact filter setting screens -->
+ <dimen name="contact_filter_left_margin">16dip</dimen>
+ <dimen name="contact_filter_right_margin">16dip</dimen>
+ <dimen name="contact_filter_item_min_height">48dip</dimen>
+ <dimen name="contact_filter_icon_size">32dip</dimen>
+ <dimen name="contact_filter_header_min_height">24dip</dimen>
+
+ <!-- Height for directory headers in contact lists -->
+ <dimen name="directory_header_height">24dip</dimen>
</resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index f8c1931..b25f0af 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -16,6 +16,7 @@
<resources>
<style name="DialtactsTheme"
parent="android:Theme.Holo">
+ <item name="android:textColorSecondary">@color/dialtacts_secondary_text_color</item>
<item name="android:windowActionBarOverlay">true</item>
<item name="android:actionBarStyle">@style/DialtactsActionBarStyle</item>
<item name="android:windowContentOverlay">@null</item>
@@ -27,7 +28,7 @@
<item name="list_item_padding_top">0dip</item>
<item name="list_item_padding_right">0dip</item>
<item name="list_item_padding_bottom">0dip</item>
- <item name="list_item_padding_left">24dip</item>
+ <item name="list_item_padding_left">0dip</item>
<item name="list_item_gap_between_image_and_text">8dip</item>
<item name="list_item_gap_between_label_and_data">5dip</item>
<item name="list_item_call_button_padding">14dip</item>
@@ -132,7 +133,7 @@
<item name="list_item_padding_top">0dip</item>
<item name="list_item_padding_right">0dip</item>
<item name="list_item_padding_bottom">0dip</item>
- <item name="list_item_padding_left">24dip</item>
+ <item name="list_item_padding_left">0dip</item>
<item name="list_item_gap_between_image_and_text">8dip</item>
<item name="list_item_gap_between_label_and_data">5dip</item>
<item name="list_item_call_button_padding">14dip</item>
@@ -226,7 +227,7 @@
</style>
<style name="DirectoryHeader" parent="PeopleTheme">
- <item name="android:background">@drawable/directory_bg</item>
+ <item name="android:background">@android:color/transparent</item>
</style>
<style name="NonPhoneActivityTheme" parent="@android:Theme.Translucent">
diff --git a/src/com/android/contacts/activities/DialtactsActivity.java b/src/com/android/contacts/activities/DialtactsActivity.java
index 9daa9af..a943130 100644
--- a/src/com/android/contacts/activities/DialtactsActivity.java
+++ b/src/com/android/contacts/activities/DialtactsActivity.java
@@ -20,10 +20,14 @@
import com.android.contacts.calllog.CallLogFragment;
import com.android.contacts.dialpad.DialpadFragment;
import com.android.contacts.interactions.PhoneNumberInteraction;
+import com.android.contacts.list.AccountFilterActivity;
+import com.android.contacts.list.ContactListFilter;
+import com.android.contacts.list.ContactListFilterController;
+import com.android.contacts.list.ContactListFilterController.ContactListFilterListener;
import com.android.contacts.list.ContactTileAdapter.DisplayType;
+import com.android.contacts.list.ContactTileListFragment;
import com.android.contacts.list.OnPhoneNumberPickerActionListener;
import com.android.contacts.list.PhoneNumberPickerFragment;
-import com.android.contacts.list.ContactTileListFragment;
import com.android.internal.telephony.ITelephony;
import android.app.ActionBar;
@@ -81,6 +85,8 @@
private static final int TAB_INDEX_COUNT = 3;
+ private static final int SUBACTIVITY_ACCOUNT_FILTER = 0;
+
/** Name of the dialtacts shared preferences */
static final String PREFS_DIALTACTS = "dialtacts";
static final boolean PREF_FAVORITES_AS_CONTACTS_DEFAULT = false;
@@ -225,6 +231,28 @@
*/
private int mLastManuallySelectedFragment;
+ private ContactListFilterController mContactListFilterController;
+ private OnMenuItemClickListener mFilterOptionsMenuItemClickListener =
+ new OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ final Intent intent =
+ new Intent(DialtactsActivity.this, AccountFilterActivity.class);
+ ContactListFilter filter = mContactListFilterController.getFilter();
+ startActivityForResult(intent, SUBACTIVITY_ACCOUNT_FILTER);
+ return true;
+ }
+ };
+
+ private OnMenuItemClickListener mSearchMenuItemClickListener =
+ new OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ enterSearchUi();
+ return true;
+ }
+ };
+
/**
* Listener used when one of phone numbers in search UI is selected. This will initiate a
* phone call using the phone number.
@@ -299,6 +327,20 @@
setContentView(R.layout.dialtacts_activity);
+ mContactListFilterController = new ContactListFilterController(this);
+ mContactListFilterController.addListener(new ContactListFilterListener() {
+ @Override
+ public void onContactListFilterChanged() {
+ if (mSearchFragment == null || !mSearchFragment.isAdded()) {
+ Log.w(TAG, "Search Fragment isn't available when ContactListFilter is changed");
+ return;
+ }
+ mSearchFragment .setFilter(mContactListFilterController.getFilter());
+
+ invalidateOptionsMenu();
+ }
+ });
+
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(new ViewPagerAdapter(getFragmentManager()));
mViewPager.setOnPageChangeListener(mPageChangeListener);
@@ -583,17 +625,20 @@
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
final MenuItem searchMenuItem = menu.findItem(R.id.search_on_action_bar);
- if (mInSearchUi || getActionBar().getSelectedTab().getPosition() == TAB_INDEX_DIALER) {
+ final MenuItem filterOptionMenuItem = menu.findItem(R.id.filter_option);
+ Tab tab = getActionBar().getSelectedTab();
+ if (mInSearchUi) {
searchMenuItem.setVisible(false);
+ filterOptionMenuItem.setVisible(true);
+ filterOptionMenuItem.setOnMenuItemClickListener(
+ mFilterOptionsMenuItemClickListener);
+ } else if (tab == null || tab.getPosition() == TAB_INDEX_DIALER) {
+ searchMenuItem.setVisible(false);
+ filterOptionMenuItem.setVisible(false);
} else {
+ filterOptionMenuItem.setVisible(false);
searchMenuItem.setVisible(true);
- searchMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- enterSearchUi();
- return true;
- }
- });
+ searchMenuItem.setOnMenuItemClickListener(mSearchMenuItemClickListener);
}
return true;
@@ -753,4 +798,26 @@
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
return intent;
}
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (resultCode != Activity.RESULT_OK) {
+ return;
+ }
+ switch (requestCode) {
+ case SUBACTIVITY_ACCOUNT_FILTER: {
+ ContactListFilter filter = (ContactListFilter) data.getParcelableExtra(
+ AccountFilterActivity.KEY_EXTRA_CONTACT_LIST_FILTER);
+ if (filter == null) {
+ return;
+ }
+ if (filter.filterType == ContactListFilter.FILTER_TYPE_CUSTOM) {
+ mContactListFilterController.selectCustomFilter();
+ } else {
+ mContactListFilterController.setContactListFilter(filter, true);
+ }
+ }
+ break;
+ }
+ }
}
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 282e0b3..4da032e 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -42,7 +42,6 @@
import com.android.contacts.list.ContactsIntentResolver;
import com.android.contacts.list.ContactsRequest;
import com.android.contacts.list.ContactsUnavailableFragment;
-import com.android.contacts.list.CustomContactListFilterActivity;
import com.android.contacts.list.DefaultContactBrowseListFragment;
import com.android.contacts.list.DirectoryListLoader;
import com.android.contacts.list.OnContactBrowserActionListener;
@@ -109,7 +108,6 @@
private static final int SUBACTIVITY_NEW_GROUP = 2;
private static final int SUBACTIVITY_EDIT_GROUP = 3;
private static final int SUBACTIVITY_ACCOUNT_FILTER = 4;
- private static final int SUBACTIVITY_CUSTOMIZE_FILTER = 5;
private static final String KEY_SEARCH_MODE = "searchMode";
@@ -1443,23 +1441,14 @@
if (filter == null) {
return;
}
- // If this is a custom filter, launch the activity to customize the display list
if (filter.filterType == ContactListFilter.FILTER_TYPE_CUSTOM) {
- final Intent intent = new Intent(this,
- CustomContactListFilterActivity.class);
- startActivityForResult(intent, SUBACTIVITY_CUSTOMIZE_FILTER);
+ mContactListFilterController.selectCustomFilter();
} else {
mContactListFilterController.setContactListFilter(filter, true);
}
}
break;
}
- case SUBACTIVITY_CUSTOMIZE_FILTER: {
- if (resultCode == Activity.RESULT_OK) {
- mContactListFilterController.selectCustomFilter();
- }
- break;
- }
case SUBACTIVITY_NEW_GROUP:
case SUBACTIVITY_EDIT_GROUP: {
diff --git a/src/com/android/contacts/list/AccountFilterActivity.java b/src/com/android/contacts/list/AccountFilterActivity.java
index f99b14e..9d872da 100644
--- a/src/com/android/contacts/list/AccountFilterActivity.java
+++ b/src/com/android/contacts/list/AccountFilterActivity.java
@@ -19,7 +19,6 @@
import com.android.contacts.ContactsActivity;
import com.android.contacts.ContactsSearchManager;
import com.android.contacts.R;
-import com.android.contacts.activities.PeopleActivity;
import com.android.contacts.model.AccountType;
import com.android.contacts.model.AccountTypeManager;
import com.android.contacts.model.AccountWithDataSet;
@@ -35,7 +34,6 @@
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
@@ -51,6 +49,8 @@
private static final String TAG = AccountFilterActivity.class.getSimpleName();
+ private static final int SUBACTIVITY_CUSTOMIZE_FILTER = 0;
+
public static final String KEY_EXTRA_CONTACT_LIST_FILTER = "contactListFilter";
private ListView mListView;
@@ -63,14 +63,9 @@
setContentView(R.layout.contact_list_filter);
mListView = (ListView) findViewById(com.android.internal.R.id.list);
- mListView.setOnItemClickListener(new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- finishAndSetResult(mFilters.get(position));
- }
- });
+ mListView.setOnItemClickListener(this);
- ActionBar actionBar = getActionBar();
+ ActionBar actionBar = getActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
@@ -104,15 +99,38 @@
mListView.setAdapter(new FilterListAdapter(this));
}
+ @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- finishAndSetResult(mFilters.get(position));
+ ContactListFilter filter = mFilters.get(position);
+ if (filter.filterType == ContactListFilter.FILTER_TYPE_CUSTOM) {
+ final Intent intent = new Intent(this,
+ CustomContactListFilterActivity.class);
+ startActivityForResult(intent, SUBACTIVITY_CUSTOMIZE_FILTER);
+ } else {
+ final Intent intent = new Intent();
+ intent.putExtra(KEY_EXTRA_CONTACT_LIST_FILTER, filter);
+ setResult(Activity.RESULT_OK, intent);
+ finish();
+ }
}
- private void finishAndSetResult(ContactListFilter filter) {
- final Intent intent = new Intent();
- intent.putExtra(KEY_EXTRA_CONTACT_LIST_FILTER, filter);
- setResult(Activity.RESULT_OK, intent);
- finish();
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (resultCode != Activity.RESULT_OK) {
+ return;
+ }
+
+ switch (requestCode) {
+ case SUBACTIVITY_CUSTOMIZE_FILTER: {
+ final Intent intent = new Intent();
+ ContactListFilter filter = ContactListFilter.createFilterWithType(
+ ContactListFilter.FILTER_TYPE_CUSTOM);
+ intent.putExtra(KEY_EXTRA_CONTACT_LIST_FILTER, filter);
+ setResult(Activity.RESULT_OK, intent);
+ finish();
+ break;
+ }
+ }
}
@Override
@@ -154,7 +172,7 @@
view = (ContactListFilterView) convertView;
} else {
view = (ContactListFilterView) mLayoutInflater.inflate(
- R.layout.filter_spinner_item, parent, false);
+ R.layout.contact_list_filter_item, parent, false);
}
view.setSingleAccount(mFilters.size() == 1);
ContactListFilter filter = mFilters.get(position);
@@ -168,10 +186,10 @@
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
- Intent intent = new Intent(this, PeopleActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- startActivity(intent);
- finish();
+ // We have two logical "up" Activities: People and Phone.
+ // Instead of having one static "up" direction, behave like back as an
+ // exceptional case.
+ onBackPressed();
return true;
default:
break;
diff --git a/src/com/android/contacts/list/ContactEntryListAdapter.java b/src/com/android/contacts/list/ContactEntryListAdapter.java
index cd3a7ed..f95dea3 100644
--- a/src/com/android/contacts/list/ContactEntryListAdapter.java
+++ b/src/com/android/contacts/list/ContactEntryListAdapter.java
@@ -77,6 +77,8 @@
private boolean mSelectionVisible;
+ private ContactListFilter mFilter;
+
public ContactEntryListAdapter(Context context) {
super(context);
addPartitions();
@@ -558,6 +560,17 @@
return true;
}
+ /**
+ * Returns the currently selected filter.
+ */
+ public ContactListFilter getFilter() {
+ return mFilter;
+ }
+
+ public void setFilter(ContactListFilter filter) {
+ mFilter = filter;
+ }
+
@Override
public Placement getItemPlacementInSection(int position) {
// Special case code to prevent a section header from being displayed above the user's
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index e32e131..73d0859 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -544,13 +544,13 @@
mListView.setFastScrollEnabled(hasScrollbar);
mListView.setFastScrollAlwaysVisible(hasScrollbar);
mListView.setVerticalScrollbarPosition(mVerticalScrollbarPosition);
+ mListView.setScrollBarStyle(ListView.SCROLLBARS_OUTSIDE_OVERLAY);
int leftPadding = 0;
int rightPadding = 0;
if (mVerticalScrollbarPosition == View.SCROLLBAR_POSITION_LEFT) {
leftPadding = mContext.getResources().getDimensionPixelOffset(
R.dimen.list_visible_scrollbar_padding);
- mListView.setScrollBarStyle(ListView.SCROLLBARS_OUTSIDE_OVERLAY);
- } else if (hasScrollbar){
+ } else {
rightPadding = mContext.getResources().getDimensionPixelOffset(
R.dimen.list_visible_scrollbar_padding);
}
diff --git a/src/com/android/contacts/list/ContactListAdapter.java b/src/com/android/contacts/list/ContactListAdapter.java
index 467dcc3..48fd342 100644
--- a/src/com/android/contacts/list/ContactListAdapter.java
+++ b/src/com/android/contacts/list/ContactListAdapter.java
@@ -113,12 +113,9 @@
private String mSelectedContactLookupKey;
private long mSelectedContactId;
- private ContactListFilter mFilter;
-
// View types for entries in the list view.
private final int mViewTypeProfileEntry;
-
public ContactListAdapter(Context context) {
super(context);
@@ -130,17 +127,6 @@
return mUnknownNameText;
}
- /**
- * Returns the currently selected filter.
- */
- public ContactListFilter getFilter() {
- return mFilter;
- }
-
- public void setFilter(ContactListFilter filter) {
- mFilter = filter;
- }
-
public long getSelectedContactDirectoryId() {
return mSelectedContactDirectoryId;
}
diff --git a/src/com/android/contacts/list/CustomContactListFilterActivity.java b/src/com/android/contacts/list/CustomContactListFilterActivity.java
index e0965cc..26610dc 100644
--- a/src/com/android/contacts/list/CustomContactListFilterActivity.java
+++ b/src/com/android/contacts/list/CustomContactListFilterActivity.java
@@ -29,6 +29,7 @@
import com.android.contacts.util.WeakAsyncTask;
import com.google.android.collect.Lists;
+import android.app.ActionBar;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.LoaderManager.LoaderCallbacks;
@@ -107,6 +108,12 @@
mList.setOnCreateContextMenuListener(this);
mList.setAdapter(mAdapter);
+
+ ActionBar actionBar = getActionBar();
+ if (actionBar != null) {
+ // android.R.id.home will be triggered in onOptionsItemSelected()
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
}
public static class CustomFilterConfigurationLoader extends AsyncTaskLoader<AccountSet> {
@@ -801,12 +808,6 @@
}
}
- /** {@inheritDoc} */
- @Override
- public void onBackPressed() {
- doSaveAction();
- }
-
@SuppressWarnings("unchecked")
private void doSaveAction() {
if (mAdapter == null || mAdapter.mAccounts == null) {
@@ -897,4 +898,18 @@
ContactsSearchManager.startSearch(this, initialQuery);
}
}
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ // Pretend cancel.
+ setResult(Activity.RESULT_CANCELED);
+ finish();
+ return true;
+ default:
+ break;
+ }
+ return super.onOptionsItemSelected(item);
+ }
}
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index ded35a4..b6a5be0 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -35,6 +35,7 @@
private TextView mCounterHeaderView;
private View mSearchHeaderView;
private TextView mAccountFilterHeaderView;
+ private View mAccountFilterHeaderContainer;
public DefaultContactBrowseListFragment() {
setPhotoLoaderEnabled(true);
@@ -65,6 +66,8 @@
super.onCreateView(inflater, container);
mAccountFilterHeaderView = (TextView) getView().findViewById(R.id.account_filter_header);
+ mAccountFilterHeaderContainer =
+ getView().findViewById(R.id.account_filter_header_container);
mCounterHeaderView = (TextView) getView().findViewById(R.id.contacts_count);
// Putting the header view inside a container will allow us to make
@@ -107,11 +110,11 @@
}
if (filter != null && filter.filterType != ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS &&
!isSearchMode() && filter.filterType != ContactListFilter.FILTER_TYPE_CUSTOM) {
+ mAccountFilterHeaderContainer.setVisibility(View.VISIBLE);
mAccountFilterHeaderView.setText(getContext().getString(
R.string.listAllContactsInAccount, filter.accountName));
- mAccountFilterHeaderView.setVisibility(View.VISIBLE);
} else {
- mAccountFilterHeaderView.setVisibility(View.GONE);
+ mAccountFilterHeaderContainer.setVisibility(View.GONE);
}
}
diff --git a/src/com/android/contacts/list/PhoneNumberListAdapter.java b/src/com/android/contacts/list/PhoneNumberListAdapter.java
index 21a7846..87fb60f 100644
--- a/src/com/android/contacts/list/PhoneNumberListAdapter.java
+++ b/src/com/android/contacts/list/PhoneNumberListAdapter.java
@@ -22,15 +22,21 @@
import android.net.Uri;
import android.net.Uri.Builder;
import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.ContactCounts;
+import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.Directory;
+import android.provider.ContactsContract.RawContacts;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* A cursor adapter for the {@link Phone#CONTENT_TYPE} content type.
*/
@@ -79,6 +85,20 @@
public void configureLoader(CursorLoader loader, long directoryId) {
Uri uri;
+ if (directoryId != Directory.DEFAULT) {
+ Log.w(TAG, "PhoneNumberListAdapter is not ready for non-default directory ID ("
+ + "directoryId: " + directoryId + ")");
+ }
+
+ final ContactListFilter filter = getFilter();
+ if (filter != null &&
+ (filter.filterType != ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS &&
+ filter.filterType != ContactListFilter.FILTER_TYPE_ACCOUNT &&
+ filter.filterType != ContactListFilter.FILTER_TYPE_CUSTOM)) {
+ throw new IllegalArgumentException("Unexpected filter type came " +
+ "(type: " + filter.filterType + ", toString: " + filter + ")");
+ }
+
if (isSearchMode()) {
String query = getQueryString();
Builder builder = Phone.CONTENT_FILTER_URI.buildUpon();
@@ -102,6 +122,7 @@
}
loader.setProjection(PHONES_PROJECTION);
+ configureSelection(loader, directoryId, filter);
}
loader.setUri(uri);
@@ -114,6 +135,59 @@
}
}
+ private void configureSelection(
+ CursorLoader loader, long directoryId, ContactListFilter filter) {
+ if (filter == null || directoryId != Directory.DEFAULT) {
+ return;
+ }
+
+ final StringBuilder selection = new StringBuilder();
+ final List<String> selectionArgs = new ArrayList<String>();
+
+ switch (filter.filterType) {
+ case ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS: {
+ break;
+ }
+ case ContactListFilter.FILTER_TYPE_CUSTOM: {
+ selection.append(Contacts.IN_VISIBLE_GROUP + "=1");
+ selection.append(" AND " + Contacts.HAS_PHONE_NUMBER + "=1");
+ break;
+ }
+ case ContactListFilter.FILTER_TYPE_ACCOUNT: {
+ selection.append("(");
+
+ selection.append(RawContacts.ACCOUNT_TYPE + "=?"
+ + " AND " + RawContacts.ACCOUNT_NAME + "=?");
+ selectionArgs.add(filter.accountType);
+ selectionArgs.add(filter.accountName);
+ if (filter.dataSet != null) {
+ selection.append(" AND " + RawContacts.DATA_SET + "=?");
+ selectionArgs.add(filter.dataSet);
+ } else {
+ selection.append(" AND " + RawContacts.DATA_SET + " IS NULL");
+ }
+ selection.append(")");
+ break;
+ }
+ case ContactListFilter.FILTER_TYPE_GROUP: {
+ selection.append(Data.MIMETYPE + "=?"
+ + " AND " + GroupMembership.GROUP_ROW_ID + "=?");
+ selectionArgs.add(GroupMembership.CONTENT_ITEM_TYPE);
+ selectionArgs.add(String.valueOf(filter.groupId));
+ break;
+ }
+
+ case ContactListFilter.FILTER_TYPE_SINGLE_CONTACT:
+ case ContactListFilter.FILTER_TYPE_STARRED:
+ case ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY:
+ default:
+ throw new IllegalArgumentException("Unexpected filter type came " +
+ "(type: " + filter.filterType + ", toString: " + filter + ")");
+ }
+ loader.setSelection(selection.toString());
+ loader.setSelectionArgs(selectionArgs.toArray(new String[0]));
+ }
+
protected static Uri buildSectionIndexerUri(Uri uri) {
return uri.buildUpon()
.appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true").build();
diff --git a/src/com/android/contacts/list/PhoneNumberPickerFragment.java b/src/com/android/contacts/list/PhoneNumberPickerFragment.java
index 1866ea0..306efbd 100644
--- a/src/com/android/contacts/list/PhoneNumberPickerFragment.java
+++ b/src/com/android/contacts/list/PhoneNumberPickerFragment.java
@@ -19,14 +19,19 @@
import com.android.contacts.R;
import com.android.contacts.list.ShortcutIntentBuilder.OnShortcutIntentCreatedListener;
+import android.app.Activity;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.net.Uri;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
+import android.widget.TextView;
/**
* Fragment containing a phone number list for picking.
@@ -38,6 +43,14 @@
private OnPhoneNumberPickerActionListener mListener;
private String mShortcutAction;
+ private SharedPreferences mPrefs;
+ private ContactListFilter mFilter;
+
+ private TextView mAccountFilterHeaderView;
+ private View mAccountFilterHeaderContainer;
+
+ private static final String KEY_FILTER = "filter";
+
/**
* Used to remember the result of {@link #setNameHighlightingEnabled(boolean)} when it is called
* before this Fragment is attached to its parent Activity. The value will be used after
@@ -64,6 +77,66 @@
}
@Override
+ protected void onCreateView(LayoutInflater inflater, ViewGroup container) {
+ super.onCreateView(inflater, container);
+
+ mAccountFilterHeaderView = (TextView) getView().findViewById(R.id.account_filter_header);
+ mAccountFilterHeaderContainer =
+ getView().findViewById(R.id.account_filter_header_container);
+ updateFilterHeaderView();
+ }
+
+ @Override
+ public void setSearchMode(boolean flag) {
+ super.setSearchMode(flag);
+ updateFilterHeaderView();
+ }
+
+ private void updateFilterHeaderView() {
+ if (mAccountFilterHeaderView != null) {
+ ContactListFilter filter = getFilter();
+ if (filter != null
+ && !isSearchMode()
+ && filter.filterType == ContactListFilter.FILTER_TYPE_ACCOUNT) {
+ mAccountFilterHeaderContainer.setVisibility(View.VISIBLE);
+ mAccountFilterHeaderView.setText(getContext().getString(
+ R.string.listAllContactsInAccount, filter.accountName));
+ } else {
+ mAccountFilterHeaderContainer.setVisibility(View.GONE);
+ }
+ }
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ mPrefs = PreferenceManager.getDefaultSharedPreferences(activity);
+ }
+
+ @Override
+ public void onDetach() {
+ super.onDetach();
+ mPrefs = null;
+ }
+
+ @Override
+ public void restoreSavedState(Bundle savedState) {
+ super.restoreSavedState(savedState);
+
+ if (savedState == null) {
+ return;
+ }
+
+ mFilter = savedState.getParcelable(KEY_FILTER);
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putParcelable(KEY_FILTER, mFilter);
+ }
+
+ @Override
public boolean onOptionsItemSelected(MenuItem item) {
final int itemId = item.getItemId();
if (itemId == android.R.id.home) { // See ActionBar#setDisplayHomeAsUpEnabled()
@@ -122,6 +195,20 @@
}
@Override
+ protected void configureAdapter() {
+ super.configureAdapter();
+
+ ContactEntryListAdapter adapter = getAdapter();
+ if (adapter == null) {
+ return;
+ }
+
+ if (!isSearchMode() && mFilter != null) {
+ adapter.setFilter(mFilter);
+ }
+ }
+
+ @Override
protected View inflateView(LayoutInflater inflater, ViewGroup container) {
return inflater.inflate(R.layout.contacts_list_content, null);
}
@@ -171,4 +258,24 @@
mDelayedNameHighlightingEnabled = null;
}
}
+
+ public ContactListFilter getFilter() {
+ return mFilter;
+ }
+
+ public void setFilter(ContactListFilter filter) {
+ if ((mFilter == null && filter == null) ||
+ (mFilter != null && mFilter.equals(filter))) {
+ return;
+ }
+
+ mFilter = filter;
+ if (mPrefs != null) {
+ // Save the preference now.
+ ContactListFilter.storeToPreferences(mPrefs, mFilter);
+ }
+
+ reloadData();
+ updateFilterHeaderView();
+ }
}