Merge "Fix visual glitch when no contacts/groups"
diff --git a/res/drawable-hdpi/bg_status_contact_widget.9.png b/res/drawable-hdpi/bg_status_contact_widget.9.png
index a2853c0..f73c005 100644
--- a/res/drawable-hdpi/bg_status_contact_widget.9.png
+++ b/res/drawable-hdpi/bg_status_contact_widget.9.png
Binary files differ
diff --git a/res/drawable-hdpi/contacts_widget_preview.png b/res/drawable-hdpi/contacts_widget_preview.png
index 4cc51ad..8156317 100644
--- a/res/drawable-hdpi/contacts_widget_preview.png
+++ b/res/drawable-hdpi/contacts_widget_preview.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_2sec_pause.png b/res/drawable-hdpi/ic_menu_2sec_pause.png
deleted file mode 100644
index 3951948..0000000
--- a/res/drawable-hdpi/ic_menu_2sec_pause.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_accounts_holo_light.png b/res/drawable-hdpi/ic_menu_accounts_holo_light.png
deleted file mode 100644
index 59496c9..0000000
--- a/res/drawable-hdpi/ic_menu_accounts_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_display_all_holo_light.png b/res/drawable-hdpi/ic_menu_display_all_holo_light.png
deleted file mode 100644
index 59631f0..0000000
--- a/res/drawable-hdpi/ic_menu_display_all_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_import_export_holo_light.png b/res/drawable-hdpi/ic_menu_import_export_holo_light.png
deleted file mode 100644
index a67386f..0000000
--- a/res/drawable-hdpi/ic_menu_import_export_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_mark.png b/res/drawable-hdpi/ic_menu_mark.png
deleted file mode 100755
index 1c09175..0000000
--- a/res/drawable-hdpi/ic_menu_mark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_merge_holo_light.png b/res/drawable-hdpi/ic_menu_merge_holo_light.png
deleted file mode 100644
index eaf32d2..0000000
--- a/res/drawable-hdpi/ic_menu_merge_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_share_holo_light.png b/res/drawable-hdpi/ic_menu_share_holo_light.png
deleted file mode 100644
index 2ba6fb7..0000000
--- a/res/drawable-hdpi/ic_menu_share_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_split_holo_light.png b/res/drawable-hdpi/ic_menu_split_holo_light.png
deleted file mode 100644
index 3784544..0000000
--- a/res/drawable-hdpi/ic_menu_split_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_trash_holo_light.png b/res/drawable-hdpi/ic_menu_trash_holo_light.png
deleted file mode 100644
index 481eb65..0000000
--- a/res/drawable-hdpi/ic_menu_trash_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_wait.png b/res/drawable-hdpi/ic_menu_wait.png
deleted file mode 100644
index 6886e5d..0000000
--- a/res/drawable-hdpi/ic_menu_wait.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/bg_status_contact_widget.9.png b/res/drawable-mdpi/bg_status_contact_widget.9.png
index e3eccc2..99e5d6e 100644
--- a/res/drawable-mdpi/bg_status_contact_widget.9.png
+++ b/res/drawable-mdpi/bg_status_contact_widget.9.png
Binary files differ
diff --git a/res/drawable-mdpi/contacts_widget_preview.png b/res/drawable-mdpi/contacts_widget_preview.png
index e0bd83e..6cf6d43 100644
--- a/res/drawable-mdpi/contacts_widget_preview.png
+++ b/res/drawable-mdpi/contacts_widget_preview.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_2sec_pause.png b/res/drawable-mdpi/ic_menu_2sec_pause.png
deleted file mode 100644
index dcaa5ff..0000000
--- a/res/drawable-mdpi/ic_menu_2sec_pause.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_accounts_holo_light.png b/res/drawable-mdpi/ic_menu_accounts_holo_light.png
deleted file mode 100644
index ae291d8..0000000
--- a/res/drawable-mdpi/ic_menu_accounts_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_display_all_holo_light.png b/res/drawable-mdpi/ic_menu_display_all_holo_light.png
deleted file mode 100644
index 9781312..0000000
--- a/res/drawable-mdpi/ic_menu_display_all_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_import_export_holo_light.png b/res/drawable-mdpi/ic_menu_import_export_holo_light.png
deleted file mode 100644
index e31ec6b..0000000
--- a/res/drawable-mdpi/ic_menu_import_export_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_mark.png b/res/drawable-mdpi/ic_menu_mark.png
deleted file mode 100644
index 41ccddf..0000000
--- a/res/drawable-mdpi/ic_menu_mark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_merge_holo_light.png b/res/drawable-mdpi/ic_menu_merge_holo_light.png
deleted file mode 100644
index a650c4d..0000000
--- a/res/drawable-mdpi/ic_menu_merge_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_share_holo_light.png b/res/drawable-mdpi/ic_menu_share_holo_light.png
deleted file mode 100644
index 6b42585..0000000
--- a/res/drawable-mdpi/ic_menu_share_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_split_holo_light.png b/res/drawable-mdpi/ic_menu_split_holo_light.png
deleted file mode 100644
index 56afbc9..0000000
--- a/res/drawable-mdpi/ic_menu_split_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_trash_holo_light.png b/res/drawable-mdpi/ic_menu_trash_holo_light.png
deleted file mode 100644
index 29801b4..0000000
--- a/res/drawable-mdpi/ic_menu_trash_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_wait.png b/res/drawable-mdpi/ic_menu_wait.png
deleted file mode 100644
index c20457a..0000000
--- a/res/drawable-mdpi/ic_menu_wait.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/bg_status_contact_widget.9.png b/res/drawable-xhdpi/bg_status_contact_widget.9.png
index ced5296..de5d9d2 100644
--- a/res/drawable-xhdpi/bg_status_contact_widget.9.png
+++ b/res/drawable-xhdpi/bg_status_contact_widget.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/contacts_widget_preview.png b/res/drawable-xhdpi/contacts_widget_preview.png
index 1f42ca0..407c3c3 100644
--- a/res/drawable-xhdpi/contacts_widget_preview.png
+++ b/res/drawable-xhdpi/contacts_widget_preview.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_2sec_pause.png b/res/drawable-xhdpi/ic_menu_2sec_pause.png
deleted file mode 100644
index 56f68b3..0000000
--- a/res/drawable-xhdpi/ic_menu_2sec_pause.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_accounts_holo_light.png b/res/drawable-xhdpi/ic_menu_accounts_holo_light.png
deleted file mode 100644
index e58c7c8..0000000
--- a/res/drawable-xhdpi/ic_menu_accounts_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_display_all_holo_light.png b/res/drawable-xhdpi/ic_menu_display_all_holo_light.png
deleted file mode 100644
index 0aa4cad..0000000
--- a/res/drawable-xhdpi/ic_menu_display_all_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_import_export_holo_light.png b/res/drawable-xhdpi/ic_menu_import_export_holo_light.png
deleted file mode 100644
index 7b7d9da..0000000
--- a/res/drawable-xhdpi/ic_menu_import_export_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_mark.png b/res/drawable-xhdpi/ic_menu_mark.png
deleted file mode 100644
index a24adc5..0000000
--- a/res/drawable-xhdpi/ic_menu_mark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_merge_holo_light.png b/res/drawable-xhdpi/ic_menu_merge_holo_light.png
deleted file mode 100644
index 31bc346..0000000
--- a/res/drawable-xhdpi/ic_menu_merge_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_share_holo_light.png b/res/drawable-xhdpi/ic_menu_share_holo_light.png
deleted file mode 100644
index 1c88e0e..0000000
--- a/res/drawable-xhdpi/ic_menu_share_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_split_holo_light.png b/res/drawable-xhdpi/ic_menu_split_holo_light.png
deleted file mode 100644
index 16c6ade..0000000
--- a/res/drawable-xhdpi/ic_menu_split_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_trash_holo_light.png b/res/drawable-xhdpi/ic_menu_trash_holo_light.png
deleted file mode 100644
index d234d73..0000000
--- a/res/drawable-xhdpi/ic_menu_trash_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_wait.png b/res/drawable-xhdpi/ic_menu_wait.png
deleted file mode 100644
index ee5ee68..0000000
--- a/res/drawable-xhdpi/ic_menu_wait.png
+++ /dev/null
Binary files differ
diff --git a/res/layout/account_filter_header.xml b/res/layout/account_filter_header.xml
index ef0a9c2..0ffb7e1 100644
--- a/res/layout/account_filter_header.xml
+++ b/res/layout/account_filter_header.xml
@@ -23,7 +23,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
- android:paddingTop="@dimen/account_filter_header_top_padding"
+ android:paddingTop="@dimen/list_header_extra_top_padding"
android:layout_marginLeft="@dimen/contact_browser_list_header_left_margin"
android:layout_marginRight="@dimen/contact_browser_list_header_right_margin"
android:background="?android:attr/selectableItemBackground"
diff --git a/res/layout/contact_tile_starred.xml b/res/layout/contact_tile_starred.xml
index 4116157..91438e9 100644
--- a/res/layout/contact_tile_starred.xml
+++ b/res/layout/contact_tile_starred.xml
@@ -73,7 +73,7 @@
</LinearLayout>
- <View
+ <View
android:id="@+id/contact_tile_push_state"
android:layout_width="match_parent"
android:layout_height="match_parent"
diff --git a/res/layout/contacts_unavailable_fragment.xml b/res/layout/contacts_unavailable_fragment.xml
index 1abc020..9f28a55 100644
--- a/res/layout/contacts_unavailable_fragment.xml
+++ b/res/layout/contacts_unavailable_fragment.xml
@@ -62,12 +62,13 @@
android:layout_marginBottom="15dip"
android:text="@string/contacts_unavailable_add_account" />
+ <!-- TODO: Use a string that says "Import" instead of "Import/export contacts"-->
<Button
android:id="@+id/import_contacts_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="15dip"
- android:text="@string/contacts_unavailable_import_contacts" />
+ android:text="@string/dialog_import_export" />
<Button
android:id="@+id/import_failure_uninstall_button"
diff --git a/res/layout/group_browse_list_account_header.xml b/res/layout/group_browse_list_account_header.xml
index 709c276..78e0639 100644
--- a/res/layout/group_browse_list_account_header.xml
+++ b/res/layout/group_browse_list_account_header.xml
@@ -24,7 +24,7 @@
<View
android:id="@+id/header_extra_top_padding"
android:layout_width="match_parent"
- android:layout_height="@dimen/contact_browser_list_top_margin" />
+ android:layout_height="@dimen/list_header_extra_top_padding" />
<LinearLayout
android:layout_width="match_parent"
diff --git a/res/menu-sw580dp-w720dp/actions.xml b/res/menu-sw580dp-w720dp/people_options.xml
similarity index 88%
rename from res/menu-sw580dp-w720dp/actions.xml
rename to res/menu-sw580dp-w720dp/people_options.xml
index 8735d89..5f939cc 100644
--- a/res/menu-sw580dp-w720dp/actions.xml
+++ b/res/menu-sw580dp-w720dp/people_options.xml
@@ -34,25 +34,21 @@
<item
android:id="@+id/menu_contacts_filter"
- android:icon="@drawable/ic_menu_settings_holo_light"
android:orderInCategory="1"
android:title="@string/menu_contacts_filter" />
<item
android:id="@+id/menu_import_export"
- android:icon="@drawable/ic_menu_import_export_holo_light"
android:orderInCategory="2"
android:title="@string/menu_import_export" />
<item
android:id="@+id/menu_accounts"
- android:icon="@drawable/ic_menu_accounts_holo_light"
android:orderInCategory="3"
android:title="@string/menu_accounts" />
<item
android:id="@+id/menu_settings"
- android:icon="@drawable/ic_menu_settings_holo_light"
android:orderInCategory="4"
android:title="@string/menu_settings" />
</menu>
diff --git a/res/menu-sw580dp-w720dp/view_contact.xml b/res/menu-sw580dp-w720dp/view_contact.xml
index 734e6b2..c1f99a8 100644
--- a/res/menu-sw580dp-w720dp/view_contact.xml
+++ b/res/menu-sw580dp-w720dp/view_contact.xml
@@ -24,13 +24,11 @@
<item
android:id="@+id/menu_share"
- android:icon="@drawable/ic_menu_share_holo_light"
android:title="@string/menu_share"
android:alphabeticShortcut="s" />
<item
android:id="@+id/menu_delete"
- android:icon="@drawable/ic_menu_trash_holo_light"
android:title="@string/menu_deleteContact" />
</menu>
diff --git a/res/menu-sw580dp-w720dp/view_group.xml b/res/menu-sw580dp-w720dp/view_group.xml
index 1348d84..3836c0f 100644
--- a/res/menu-sw580dp-w720dp/view_group.xml
+++ b/res/menu-sw580dp-w720dp/view_group.xml
@@ -24,6 +24,5 @@
<item
android:id="@+id/menu_delete_group"
- android:icon="@drawable/ic_menu_trash_holo_light"
android:title="@string/menu_deleteGroup" />
</menu>
diff --git a/res/menu-sw580dp/actions.xml b/res/menu-sw580dp/people_options.xml
similarity index 89%
rename from res/menu-sw580dp/actions.xml
rename to res/menu-sw580dp/people_options.xml
index 35a9c0a..c8c114a 100644
--- a/res/menu-sw580dp/actions.xml
+++ b/res/menu-sw580dp/people_options.xml
@@ -37,25 +37,21 @@
-->
<item
android:id="@+id/menu_contacts_filter"
- android:icon="@drawable/ic_menu_settings_holo_light"
android:orderInCategory="1"
android:title="@string/menu_contacts_filter" />
<item
android:id="@+id/menu_import_export"
- android:icon="@drawable/ic_menu_import_export_holo_light"
android:orderInCategory="2"
android:title="@string/menu_import_export" />
<item
android:id="@+id/menu_accounts"
- android:icon="@drawable/ic_menu_accounts_holo_light"
android:orderInCategory="3"
android:title="@string/menu_accounts" />
<item
android:id="@+id/menu_settings"
- android:icon="@drawable/ic_menu_settings_holo_light"
android:orderInCategory="4"
android:title="@string/menu_settings" />
</menu>
diff --git a/res/menu-sw580dp/view_contact.xml b/res/menu-sw580dp/view_contact.xml
index 1279601..0f285db 100644
--- a/res/menu-sw580dp/view_contact.xml
+++ b/res/menu-sw580dp/view_contact.xml
@@ -23,13 +23,11 @@
<item
android:id="@+id/menu_share"
- android:icon="@drawable/ic_menu_share_holo_light"
android:title="@string/menu_share"
android:alphabeticShortcut="s" />
<item
android:id="@+id/menu_delete"
- android:icon="@drawable/ic_menu_trash_holo_light"
android:title="@string/menu_deleteContact" />
</menu>
diff --git a/res/menu-sw580dp/view_group.xml b/res/menu-sw580dp/view_group.xml
index cd52030..d01c167 100644
--- a/res/menu-sw580dp/view_group.xml
+++ b/res/menu-sw580dp/view_group.xml
@@ -23,6 +23,5 @@
<item
android:id="@+id/menu_delete_group"
- android:icon="@drawable/ic_menu_trash_holo_light"
android:title="@string/menu_deleteGroup" />
</menu>
diff --git a/res/menu/call_details_options.xml b/res/menu/call_details_options.xml
index ed0111b..63ce8f5 100644
--- a/res/menu/call_details_options.xml
+++ b/res/menu/call_details_options.xml
@@ -23,7 +23,6 @@
/>
<item
android:id="@+id/menu_remove_from_call_log"
- android:icon="@android:drawable/ic_menu_close_clear_cancel"
android:title="@string/recentCalls_removeFromRecentList"
android:onClick="onMenuRemoveFromCallLog"
/>
diff --git a/res/menu/call_log_options.xml b/res/menu/call_log_options.xml
index 3d0fb6a..c41f9da 100644
--- a/res/menu/call_log_options.xml
+++ b/res/menu/call_log_options.xml
@@ -29,7 +29,6 @@
<item
android:id="@+id/delete_all"
- android:icon="@android:drawable/ic_menu_close_clear_cancel"
android:title="@string/recentCalls_deleteAll"
android:showAsAction="withText"
android:orderInCategory="1" />
diff --git a/res/menu/dialpad_options.xml b/res/menu/dialpad_options.xml
index 02b1f7f..6dda8fc 100644
--- a/res/menu/dialpad_options.xml
+++ b/res/menu/dialpad_options.xml
@@ -16,20 +16,17 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_add_contacts"
- android:icon="@android:drawable/ic_menu_add"
android:title="@string/recentCalls_addToContact"
android:showAsAction="withText"
android:orderInCategory="1" />
<item
android:id="@+id/menu_2s_pause"
- android:icon="@drawable/ic_menu_2sec_pause"
android:title="@string/add_2sec_pause"
android:showAsAction="withText"
android:orderInCategory="1" />
<item
android:id="@+id/menu_add_wait"
- android:icon="@drawable/ic_menu_wait"
android:title="@string/add_wait"
android:showAsAction="withText"
android:orderInCategory="1" />
@@ -37,7 +34,6 @@
<item
android:id="@+id/menu_call_settings_dialpad"
android:title="@string/call_settings"
- android:icon="@drawable/ic_menu_settings_holo_light"
android:showAsAction="withText"
android:orderInCategory="1" />
</menu>
diff --git a/res/menu/dialtacts_options.xml b/res/menu/dialtacts_options.xml
index 54ca086..a35f2ea 100644
--- a/res/menu/dialtacts_options.xml
+++ b/res/menu/dialtacts_options.xml
@@ -24,7 +24,6 @@
<item
android:id="@+id/menu_call_settings"
android:title="@string/call_settings"
- android:icon="@drawable/ic_menu_settings_holo_light"
android:showAsAction="withText"
android:orderInCategory="2" />
@@ -35,6 +34,7 @@
<item
android:id="@+id/add_contact"
+ android:icon="@drawable/ic_add_contact_holo_dark"
android:title="@string/menu_newContact"
- android:showAsAction="withText" />
+ android:showAsAction="ifRoom" />
</menu>
diff --git a/res/menu/edit_contact.xml b/res/menu/edit_contact.xml
index 26b89df..93c19dc 100644
--- a/res/menu/edit_contact.xml
+++ b/res/menu/edit_contact.xml
@@ -22,12 +22,10 @@
<item
android:id="@+id/menu_split"
- android:icon="@drawable/ic_menu_split_holo_light"
android:title="@string/menu_splitAggregate" />
<item
android:id="@+id/menu_join"
- android:icon="@drawable/ic_menu_merge_holo_light"
android:title="@string/menu_joinAggregate" />
<item
diff --git a/res/menu/list.xml b/res/menu/list.xml
index 56d92f8..f4a8751 100644
--- a/res/menu/list.xml
+++ b/res/menu/list.xml
@@ -28,17 +28,14 @@
<item
android:id="@+id/menu_settings"
- android:icon="@drawable/ic_menu_settings_holo_light"
android:title="@string/menu_settings" />
<item
android:id="@+id/menu_accounts"
- android:icon="@drawable/ic_menu_accounts_holo_light"
android:title="@string/menu_accounts" />
<item
android:id="@+id/menu_import_export"
- android:icon="@drawable/ic_menu_import_export_holo_light"
android:title="@string/menu_import_export" />
</menu>
diff --git a/res/menu/actions.xml b/res/menu/people_options.xml
similarity index 87%
rename from res/menu/actions.xml
rename to res/menu/people_options.xml
index 9067a46..0c82f99 100644
--- a/res/menu/actions.xml
+++ b/res/menu/people_options.xml
@@ -34,21 +34,17 @@
<item
android:id="@+id/menu_contacts_filter"
- android:icon="@drawable/ic_menu_settings_holo_light"
android:title="@string/menu_contacts_filter" />
<item
android:id="@+id/menu_import_export"
- android:icon="@drawable/ic_menu_import_export_holo_light"
android:title="@string/menu_import_export" />
<item
android:id="@+id/menu_accounts"
- android:icon="@drawable/ic_menu_accounts_holo_light"
android:title="@string/menu_accounts" />
<item
android:id="@+id/menu_settings"
- android:icon="@drawable/ic_menu_settings_holo_light"
android:title="@string/menu_settings" />
</menu>
diff --git a/res/menu/phone_favorite_options.xml b/res/menu/phone_favorite_options.xml
new file mode 100644
index 0000000..ac67d6e
--- /dev/null
+++ b/res/menu/phone_favorite_options.xml
@@ -0,0 +1,24 @@
+<?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.
+-->
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:id="@+id/menu_import_export"
+ android:title="@string/menu_import_export" />
+
+ <item
+ android:id="@+id/menu_accounts"
+ android:title="@string/menu_accounts" />
+</menu>
diff --git a/res/menu/view_contact.xml b/res/menu/view_contact.xml
index 2ae4806..6712cb6 100644
--- a/res/menu/view_contact.xml
+++ b/res/menu/view_contact.xml
@@ -17,24 +17,20 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_edit"
- android:icon="@drawable/ic_menu_compose_holo_dark"
android:title="@string/menu_editContact"
android:alphabeticShortcut="e" />
<item
android:id="@+id/menu_share"
- android:icon="@drawable/ic_menu_share_holo_light"
android:title="@string/menu_share"
android:alphabeticShortcut="s" />
<item
android:id="@+id/menu_delete"
- android:icon="@drawable/ic_menu_trash_holo_light"
android:title="@string/menu_deleteContact" />
<item
android:id="@+id/menu_set_ringtone"
- android:icon="@drawable/ic_menu_mark"
android:title="@string/menu_set_ring_tone" />
<item
diff --git a/res/menu/view_group.xml b/res/menu/view_group.xml
index cd52030..669f401 100644
--- a/res/menu/view_group.xml
+++ b/res/menu/view_group.xml
@@ -17,12 +17,10 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_edit_group"
- android:icon="@drawable/ic_menu_compose_holo_dark"
android:title="@string/menu_editGroup"
android:alphabeticShortcut="e" />
<item
android:id="@+id/menu_delete_group"
- android:icon="@drawable/ic_menu_trash_holo_light"
android:title="@string/menu_deleteGroup" />
</menu>
diff --git a/res/values-sw580dp/dimens.xml b/res/values-sw580dp/dimens.xml
index 3d3cb17..264565f 100644
--- a/res/values-sw580dp/dimens.xml
+++ b/res/values-sw580dp/dimens.xml
@@ -38,7 +38,7 @@
<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="list_visible_scrollbar_padding">48dip</dimen>
- <dimen name="account_filter_header_top_padding">@dimen/contact_browser_list_top_margin</dimen>
+ <dimen name="list_header_extra_top_padding">@dimen/contact_browser_list_top_margin</dimen>
<!-- Because the "join" screen has the vertical scroll bar on right,
we cannot use @dimen/contact_browser_list_header_left_margin as is. -->
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index e856d67..e1d611d 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -178,7 +178,9 @@
<dimen name="join_header_top_margin">16dip</dimen>
<dimen name="join_header_bottom_margin">0dip</dimen>
- <dimen name="account_filter_header_top_padding">0dip</dimen>
+ <!-- Padding between the action bar's bottom edge and the first header
+ in contacts/group lists. -->
+ <dimen name="list_header_extra_top_padding">0dip</dimen>
<!-- ContactTile Layouts -->
<!--
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7bb875c..225c9fe 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -163,9 +163,6 @@
<!-- Toast shown after two contacts have been joined by a user action -->
<string name="contactsJoinedMessage">Contacts joined</string>
- <!-- Confirmation dialog title after users selects to delete a contact. [CHAR LIMIT=25]-->
- <string name="deleteConfirmation_title">Delete contact?</string>
-
<!-- Menu item that opens the Options activity for a given contact [CHAR LIMIT=15] -->
<string name="menu_set_ring_tone">Set ringtone</string>
@@ -452,7 +449,8 @@
<!-- Hint text displayed in the "digits" field above the dialer's
dialpad, if there's already a call in progress. (This hint
reminds the user that the dialer will add a new call, as opposed
- to sending DTMF tones over the current call.) -->
+ to sending DTMF tones over the current call.)
+ [CHAR LIMIT=40] -->
<string name="dialerDialpadHintText">Dial to add a call</string>
<!-- Dialog text displayed when loading a phone number from the SIM card for speed dial -->
@@ -584,8 +582,6 @@
<!-- The text displayed on the divider for the Favorites tab in Phone app indicating that items below it are frequently called as opposed to starred contacts [CHAR LIMIT = 39] -->
<string name="favoritesFrequentCalled">Frequently called</string>
- <!-- Dialog title when prompting before creating a contact -->
- <string name="add_contact_dlg_title">Add contact</string>
<!-- Dialog message when prompting before creating a contact. Includes
the email address, e.g. "Add xyz@foo.com to contacts?" -->
<string name="add_contact_dlg_message_fmt">Add \"<xliff:g id="email">%s</xliff:g>\" to contacts?</string>
@@ -731,19 +727,11 @@
-->
<string name="description_view_contact_detail" msgid="2795575601596468581">View contact</string>
- <!-- Dialog title shown when (USB) storage does not exist [CHAR LIMIT=25] -->
- <string name="no_sdcard_title" product="nosdcard">Storage unavailable</string>
- <!-- Dialog title shown when SD Card does not exist -->
- <string name="no_sdcard_title" product="default">No SD card</string>
-
<!-- Dialog message shown when (USB) storage does not exist [CHAR LIMIT=30] -->
<string name="no_sdcard_message" product="nosdcard">No storage was found.</string>
<!-- Dialog message shown when SDcard does not exist. [CHAR LIMIT=30] -->
<string name="no_sdcard_message" product="default">No SD card was found.</string>
- <!-- Dialog title shown when searching vCard data from SD Card -->
- <string name="searching_vcard_title">Searching for vCard</string>
-
<!-- Action string for selecting SIM for importing contacts -->
<string name="import_from_sim">Import from SIM card</string>
@@ -776,11 +764,6 @@
<!-- Dialog message shown when searching VCard data from SD Card. [CHAR LIMIT=NONE] -->
<string name="searching_vcard_message" product="default">Searching for vCard data on SD card\u2026</string>
- <!-- Dialog title shown when scanning VCard data failed. [CHAR LIMIT=NONE] -->
- <string name="scanning_sdcard_failed_title" product="nosdcard">Couldn\'t scan storage</string>
- <!-- Dialog title shown when scanning VCard data failed. -->
- <string name="scanning_sdcard_failed_title" product="default">Couldn\'t scan SD card</string>
-
<!-- Dialog message shown when searching VCard data failed.
An exact reason for the failure should [CHAR LIMIT=NONE] -->
<string name="scanning_sdcard_failed_message" product="nosdcard">The storage couldn\'t be scanned. (Reason: \"<xliff:g id="fail_reason">%s</xliff:g>\")</string>
@@ -968,17 +951,11 @@
<!-- Message in progress bar while exporting contact list to a file "(current number) of (total number) contacts" The order of "current number" and "total number" cannot be changed (like "total: (total number), current: (current number)")-->
<string name="exporting_contact_list_progress"><xliff:g id="current_number">%s</xliff:g> of <xliff:g id="total_number">%s</xliff:g> contacts</string>
- <!-- Title shown in a Dialog confirming a user's cancel request toward existing vCard import. [CHAR LIMIT=40] -->
- <string name="cancel_import_confirmation_title">Canceling vCard import</string>
-
<!-- Message shown in a Dialog confirming a user's cancel request toward existing vCard import.
The argument is file name for the vCard import the user wants to cancel.
[CHAR LIMIT=128] -->
<string name="cancel_import_confirmation_message">Cancel import of <xliff:g id="filename" example="import.vcf">%s</xliff:g>?</string>
- <!-- Title shown in a Dialog confirming a user's cancel request toward existing vCard export. [CHAR LIMIT=128] -->
- <string name="cancel_export_confirmation_title">Canceling vCard export</string>
-
<!-- Message shown in a Dialog confirming a user's cancel request toward existing vCard export.
The argument is file name for the vCard export the user wants to cancel.
[CHAR LIMIT=128] -->
@@ -1393,19 +1370,11 @@
<!-- The name of the invisible local contact directory -->
<string name="local_invisible_directory">Other</string>
- <!-- The title of a confirmation dialog shown when the user selects a
- contact aggregation suggestion in Contact editor. [CHAR LIMIT=128]-->
- <string name="aggregation_suggestion_join_dialog_title">Join contacts</string>
-
<!-- The message in a confirmation dialog shown when the user selects a
contact aggregation suggestion in Contact editor. [CHAR LIMIT=512]-->
<string name="aggregation_suggestion_join_dialog_message">Join
the current contact with the selected contact?</string>
- <!-- The title of a confirmation dialog shown when the user selects a
- contact aggregation suggestion in Contact editor. [CHAR LIMIT=128]-->
- <string name="aggregation_suggestion_edit_dialog_title">Edit selected contacts</string>
-
<!-- The message in a confirmation dialog shown when the user selects a
contact aggregation suggestion in Contact editor. [CHAR LIMIT=512]-->
<string name="aggregation_suggestion_edit_dialog_message">Switch to editing
@@ -1517,9 +1486,6 @@
<!-- An item in the popup list of groups that triggers creation of a contact group [CHAR LIMIT=128] -->
<string name="create_group_item_label">[Create new group]</string>
- <!-- Title of the dialog that allows deletion of a contact group [CHAR LIMIT=128] -->
- <string name="delete_group_dialog_title">Delete group</string>
-
<!-- Shows how many groups are from the specified account [CHAR LIMIT=15] -->
<plurals name="num_groups_in_account">
<item quantity="one">1 group</item>
@@ -1562,9 +1528,6 @@
<!-- Toast shown when text is copied to the clipboard [CHAR LIMIT=64] -->
<string name="toast_text_copied">Text copied</string>
- <!-- Title of the alert dialog when the user hits the Cancel button in the editor [CHAR LIMIT=64] -->
- <string name="cancel_confirmation_dialog_title">Discard changes</string>
-
<!-- Contents of the alert dialog when the user hits the Cancel button in the editor [CHAR LIMIT=128] -->
<string name="cancel_confirmation_dialog_message">Discard your changes?</string>
diff --git a/src/com/android/contacts/activities/DialtactsActivity.java b/src/com/android/contacts/activities/DialtactsActivity.java
index 7e95fed..d4a96e1 100644
--- a/src/com/android/contacts/activities/DialtactsActivity.java
+++ b/src/com/android/contacts/activities/DialtactsActivity.java
@@ -165,6 +165,40 @@
actionBar.selectTab(actionBar.getTabAt(position));
mNextPosition = position;
+
+ // This method is called halfway between swiping between the two pages.
+ // When the next page is fully selected, the ViewPager will go back to IDLE state in
+ // onPageScrollStateChanged(). The order should be:
+ // (user's swipe) -> onPageSelected() -> IDLE in onPageScrollStateChanged()
+ //
+ // sendFragmentVisibilityChange() must be called from here or in the IDLE state to
+ // notify the visibility change events to two pages: the current page (pointed by
+ // mCurrentPosition) should receive sendFragmentVisibilityChange() with the second
+ // argument false, meaning "the page is now invisible", while the next page (pointed by
+ // mNextPosition) should receive the method with the second argument true, meaning
+ // "the page becomes visible".
+ //
+ // To make transition animation smooth enough, we need to delay the event in some cases:
+ // - We should delay both method calls when the dialpad screen is involved.
+ // The screen does not have the bottom action bar, requiring different layout to
+ // fill the screen. The layout refresh takes some time and thus should be done after
+ // the page migration being completed.
+ // - We should delay the method for the call log screen. The screen will update
+ // its internal state and may query full call log. which is too costly to do when
+ // onVisibilityChanged() is called, making the animation slower.
+ // - We should *not* delay the method for the phone favorite screen. The screen has
+ // another icon the call log screen doesn't have. We want to show/hide it immediately
+ // after user's choosing pages.
+ if (mCurrentPosition == TAB_INDEX_CALL_LOG && mNextPosition == TAB_INDEX_FAVORITES) {
+ sendFragmentVisibilityChange(mNextPosition, true /* visible */ );
+ invalidateOptionsMenu();
+ } else if (mCurrentPosition == TAB_INDEX_FAVORITES
+ && mNextPosition == TAB_INDEX_CALL_LOG) {
+ sendFragmentVisibilityChange(mCurrentPosition, false /* not visible */ );
+ invalidateOptionsMenu();
+ } else {
+ // Delay sendFragmentVisibilityChange() for both positions.
+ }
}
public void setCurrentPosition(int position) {
@@ -175,11 +209,17 @@
public void onPageScrollStateChanged(int state) {
switch (state) {
case ViewPager.SCROLL_STATE_IDLE: {
- if (mCurrentPosition >= 0) {
- sendFragmentVisibilityChange(mCurrentPosition, false);
- }
- if (mNextPosition >= 0) {
- sendFragmentVisibilityChange(mNextPosition, true);
+ // Call delayed sendFragmentVisibilityChange() call(s).
+ // See comments in onPageSelected() for more details.
+ if (mCurrentPosition == TAB_INDEX_CALL_LOG
+ && mNextPosition == TAB_INDEX_FAVORITES) {
+ sendFragmentVisibilityChange(mCurrentPosition, false /* not visible */ );
+ } else if (mCurrentPosition == TAB_INDEX_FAVORITES
+ && mNextPosition == TAB_INDEX_CALL_LOG) {
+ sendFragmentVisibilityChange(mNextPosition, true /* visible */ );
+ } else {
+ sendFragmentVisibilityChange(mCurrentPosition, false /* not visible */ );
+ sendFragmentVisibilityChange(mNextPosition, true /* visible */ );
}
invalidateOptionsMenu();
@@ -526,12 +566,16 @@
&& mContactListFilterController.getFilter() != null) {
mPhoneFavoriteFragment.setFilter(mContactListFilterController.getFilter());
}
+ if (currentPosition == TAB_INDEX_FAVORITES) {
+ mPhoneFavoriteFragment.onVisibilityChanged(true);
+ }
} else if (fragment instanceof PhoneNumberPickerFragment) {
mSearchFragment = (PhoneNumberPickerFragment) fragment;
mSearchFragment.setOnPhoneNumberPickerActionListener(mPhoneNumberPickerActionListener);
mSearchFragment.setQuickContactEnabled(true);
mSearchFragment.setDarkTheme(true);
mSearchFragment.setPhotoPosition(ContactListItemView.PhotoPosition.LEFT);
+ mSearchFragment.setUseCallableUri(true);
if (mContactListFilterController != null
&& mContactListFilterController.getFilter() != null) {
mSearchFragment.setFilter(mContactListFilterController.getFilter());
@@ -652,10 +696,10 @@
final int previousItemIndex = mViewPager.getCurrentItem();
mViewPager.setCurrentItem(tabIndex, false /* smoothScroll */);
if (previousItemIndex != tabIndex) {
- sendFragmentVisibilityChange(previousItemIndex, false);
+ sendFragmentVisibilityChange(previousItemIndex, false /* not visible */ );
}
mPageChangeListener.setCurrentPosition(tabIndex);
- sendFragmentVisibilityChange(tabIndex, true);
+ sendFragmentVisibilityChange(tabIndex, true /* visible */ );
// Restore to the previous manual selection
mLastManuallySelectedFragment = savedTabIndex;
@@ -776,21 +820,18 @@
final MenuItem filterOptionMenuItem = menu.findItem(R.id.filter_option);
final MenuItem addContactOptionMenuItem = menu.findItem(R.id.add_contact);
final MenuItem callSettingsMenuItem = menu.findItem(R.id.menu_call_settings);
- Tab tab = getActionBar().getSelectedTab();
+ final Tab tab = getActionBar().getSelectedTab();
if (mInSearchUi) {
searchMenuItem.setVisible(false);
if (ViewConfiguration.get(this).hasPermanentMenuKey()) {
filterOptionMenuItem.setVisible(true);
filterOptionMenuItem.setOnMenuItemClickListener(
mFilterOptionsMenuItemClickListener);
- addContactOptionMenuItem.setVisible(true);
- addContactOptionMenuItem.setIntent(
- new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI));
} else {
// Filter option menu should be not be shown as a overflow menu.
filterOptionMenuItem.setVisible(false);
- addContactOptionMenuItem.setVisible(false);
}
+ addContactOptionMenuItem.setVisible(false);
callSettingsMenuItem.setVisible(false);
} else {
final boolean showCallSettingsMenu;
@@ -878,7 +919,7 @@
actionBar.setDisplayShowHomeEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
- sendFragmentVisibilityChange(mViewPager.getCurrentItem(), false);
+ sendFragmentVisibilityChange(mViewPager.getCurrentItem(), false /* not visible */ );
// Show the search fragment and hide everything else.
mSearchFragment.setUserVisibleHint(true);
@@ -930,7 +971,7 @@
actionBar.setDisplayShowHomeEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
- sendFragmentVisibilityChange(mViewPager.getCurrentItem(), true);
+ sendFragmentVisibilityChange(mViewPager.getCurrentItem(), true /* visible */ );
mViewPager.setVisibility(View.VISIBLE);
@@ -958,9 +999,12 @@
}
private void sendFragmentVisibilityChange(int position, boolean visibility) {
- final Fragment fragment = getFragmentAt(position);
- if (fragment instanceof ViewPagerVisibilityListener) {
- ((ViewPagerVisibilityListener) fragment).onVisibilityChanged(visibility);
+ // Position can be -1 initially. See PageChangeListener.
+ if (position >= 0) {
+ final Fragment fragment = getFragmentAt(position);
+ if (fragment instanceof ViewPagerVisibilityListener) {
+ ((ViewPagerVisibilityListener) fragment).onVisibilityChanged(visibility);
+ }
}
}
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 103dd2b..6bc959d 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -1210,7 +1210,7 @@
@Override
public void onImportContactsFromFileAction() {
- AccountSelectionUtil.doImportFromSdCard(PeopleActivity.this, null);
+ ImportExportDialogFragment.show(getFragmentManager());
}
@Override
@@ -1300,7 +1300,7 @@
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.actions, menu);
+ inflater.inflate(R.menu.people_options, menu);
// On narrow screens we specify a NEW group button in the {@link ActionBar}, so that
// it can be in the overflow menu. On wide screens, we use a custom view because we need
diff --git a/src/com/android/contacts/activities/ShowOrCreateActivity.java b/src/com/android/contacts/activities/ShowOrCreateActivity.java
index c60d0fb..50658c3 100755
--- a/src/com/android/contacts/activities/ShowOrCreateActivity.java
+++ b/src/com/android/contacts/activities/ShowOrCreateActivity.java
@@ -216,7 +216,6 @@
R.string.add_contact_dlg_message_fmt, mCreateDescrip);
return new AlertDialog.Builder(this, AlertDialog.THEME_HOLO_LIGHT)
- .setTitle(R.string.add_contact_dlg_title)
.setMessage(message)
.setPositiveButton(android.R.string.ok,
new IntentClickListener(this, createIntent))
diff --git a/src/com/android/contacts/calllog/CallLogAdapter.java b/src/com/android/contacts/calllog/CallLogAdapter.java
index b38430b..ea282fc 100644
--- a/src/com/android/contacts/calllog/CallLogAdapter.java
+++ b/src/com/android/contacts/calllog/CallLogAdapter.java
@@ -54,6 +54,37 @@
public void fetchCalls();
}
+ /**
+ * Stores a phone number of a call with the country code where it originally occurred.
+ * <p>
+ * Note the country does not necessarily specifies the country of the phone number itself, but
+ * it is the country in which the user was in when the call was placed or received.
+ */
+ private static final class NumberWithCountryIso {
+ public final String number;
+ public final String countryIso;
+
+ public NumberWithCountryIso(String number, String countryIso) {
+ this.number = number;
+ this.countryIso = countryIso;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == null) return false;
+ if (!(o instanceof NumberWithCountryIso)) return false;
+ NumberWithCountryIso other = (NumberWithCountryIso) o;
+ return TextUtils.equals(number, other.number)
+ && TextUtils.equals(countryIso, other.countryIso);
+ }
+
+ @Override
+ public int hashCode() {
+ return (number == null ? 0 : number.hashCode())
+ ^ (countryIso == null ? 0 : countryIso.hashCode());
+ }
+ }
+
/** The time in millis to delay starting the thread processing requests. */
private static final int START_PROCESSING_REQUESTS_DELAY_MILLIS = 1000;
@@ -69,8 +100,10 @@
* <p>
* The content of the cache is expired (but not purged) whenever the application comes to
* the foreground.
+ * <p>
+ * The key is number with the country in which the call was placed or received.
*/
- private ExpirableCache<String, ContactInfo> mContactInfoCache;
+ private ExpirableCache<NumberWithCountryIso, ContactInfo> mContactInfoCache;
/**
* A request for contact details for the given number.
@@ -317,14 +350,15 @@
// Check the existing entry in the cache: only if it has changed we should update the
// view.
- ContactInfo existingInfo = mContactInfoCache.getPossiblyExpired(number);
+ NumberWithCountryIso numberCountryIso = new NumberWithCountryIso(number, countryIso);
+ ContactInfo existingInfo = mContactInfoCache.getPossiblyExpired(numberCountryIso);
boolean updated = !info.equals(existingInfo);
// Store the data in the cache so that the UI thread can use to display it. Store it
// even if it has not changed so that it is marked as not expired.
- mContactInfoCache.put(number, info);
+ mContactInfoCache.put(numberCountryIso, info);
// Update the call log even if the cache it is up-to-date: it is possible that the cache
// contains the value from a different call log entry.
- updateCallLogContactInfoCache(number, info, callLogInfo);
+ updateCallLogContactInfoCache(number, countryIso, info, callLogInfo);
return updated;
}
/*
@@ -471,8 +505,9 @@
}
// Lookup contacts with this number
+ NumberWithCountryIso numberCountryIso = new NumberWithCountryIso(number, countryIso);
ExpirableCache.CachedValue<ContactInfo> cachedInfo =
- mContactInfoCache.getCachedValue(number);
+ mContactInfoCache.getCachedValue(numberCountryIso);
ContactInfo info = cachedInfo == null ? null : cachedInfo.getValue();
if (!mPhoneNumberHelper.canPlaceCallsTo(number)
|| mPhoneNumberHelper.isVoicemailNumber(number)) {
@@ -480,7 +515,7 @@
// for it.
info = ContactInfo.EMPTY;
} else if (cachedInfo == null) {
- mContactInfoCache.put(number, ContactInfo.EMPTY);
+ mContactInfoCache.put(numberCountryIso, ContactInfo.EMPTY);
// Use the cached contact info from the call log.
info = cachedContactInfo;
// The db request should happen on a non-UI thread.
@@ -558,8 +593,8 @@
}
/** Stores the updated contact info in the call log if it is different from the current one. */
- private void updateCallLogContactInfoCache(String number, ContactInfo updatedInfo,
- ContactInfo callLogInfo) {
+ private void updateCallLogContactInfoCache(String number, String countryIso,
+ ContactInfo updatedInfo, ContactInfo callLogInfo) {
final ContentValues values = new ContentValues();
boolean needsUpdate = false;
@@ -615,12 +650,9 @@
return;
}
- StringBuilder where = new StringBuilder();
- where.append(Calls.NUMBER);
- where.append(" = ?");
-
mContext.getContentResolver().update(Calls.CONTENT_URI_WITH_VOICEMAIL, values,
- where.toString(), new String[]{ number });
+ Calls.NUMBER + " = ? AND " + Calls.COUNTRY_ISO + " = ?",
+ new String[]{ number, countryIso });
}
/** Returns the contact information as stored in the call log. */
@@ -674,8 +706,9 @@
}
@VisibleForTesting
- void injectContactInfoForTest(String number, ContactInfo contactInfo) {
- mContactInfoCache.put(number, contactInfo);
+ void injectContactInfoForTest(String number, String countryIso, ContactInfo contactInfo) {
+ NumberWithCountryIso numberCountryIso = new NumberWithCountryIso(number, countryIso);
+ mContactInfoCache.put(numberCountryIso, contactInfo);
}
@Override
@@ -692,10 +725,11 @@
* Else if the number in the contacts starts with a "+", use that one
* Else if the number in the contacts is longer, use that one
*/
- public String getBetterNumberFromContacts(String number) {
+ public String getBetterNumberFromContacts(String number, String countryIso) {
String matchingNumber = null;
// Look in the cache first. If it's not found then query the Phones db
- ContactInfo ci = mContactInfoCache.getPossiblyExpired(number);
+ NumberWithCountryIso numberCountryIso = new NumberWithCountryIso(number, countryIso);
+ ContactInfo ci = mContactInfoCache.getPossiblyExpired(numberCountryIso);
if (ci != null && ci != ContactInfo.EMPTY) {
matchingNumber = ci.number;
} else {
diff --git a/src/com/android/contacts/calllog/CallLogFragment.java b/src/com/android/contacts/calllog/CallLogFragment.java
index 88aab4d..2033d25 100644
--- a/src/com/android/contacts/calllog/CallLogFragment.java
+++ b/src/com/android/contacts/calllog/CallLogFragment.java
@@ -334,7 +334,8 @@
(callType == Calls.INCOMING_TYPE
|| callType == Calls.MISSED_TYPE)) {
// If the caller-id matches a contact with a better qualified number, use it
- number = mAdapter.getBetterNumberFromContacts(number);
+ String countryIso = cursor.getString(CallLogQuery.COUNTRY_ISO);
+ number = mAdapter.getBetterNumberFromContacts(number, countryIso);
}
intent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
Uri.fromParts("tel", number, null));
@@ -354,11 +355,6 @@
public void onVisibilityChanged(boolean visible) {
if (mShowOptionsMenu != visible) {
mShowOptionsMenu = visible;
- // Invalidate the options menu since we are changing the list of options shown in it.
- Activity activity = getActivity();
- if (activity != null) {
- activity.invalidateOptionsMenu();
- }
}
if (visible && isResumed()) {
diff --git a/src/com/android/contacts/calllog/ContactInfoHelper.java b/src/com/android/contacts/calllog/ContactInfoHelper.java
index b4e4cf7..90d5e8b 100644
--- a/src/com/android/contacts/calllog/ContactInfoHelper.java
+++ b/src/com/android/contacts/calllog/ContactInfoHelper.java
@@ -57,8 +57,9 @@
// This "number" is really a SIP address.
ContactInfo sipInfo = queryContactInfoForSipAddress(number);
if (sipInfo == null || sipInfo == ContactInfo.EMPTY) {
- // Check whether the username is actually a phone number of contact.
- String username = number.substring(0, number.indexOf('@'));
+ // Check whether the "username" part of the SIP address is
+ // actually the phone number of a contact.
+ String username = PhoneNumberUtils.getUsernameFromUriNumber(number);
if (PhoneNumberUtils.isGlobalPhoneNumber(username)) {
sipInfo = queryContactInfoForPhoneNumber(username, countryIso);
}
diff --git a/src/com/android/contacts/dialpad/DialpadFragment.java b/src/com/android/contacts/dialpad/DialpadFragment.java
index 064e054..410aec9 100644
--- a/src/com/android/contacts/dialpad/DialpadFragment.java
+++ b/src/com/android/contacts/dialpad/DialpadFragment.java
@@ -54,9 +54,11 @@
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.text.Editable;
+import android.text.SpannableString;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.method.DialerKeyListener;
+import android.text.style.RelativeSizeSpan;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
@@ -64,21 +66,16 @@
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
-import android.view.View.OnClickListener;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
-import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupMenu;
import android.widget.TextView;
-import java.util.HashSet;
-import java.util.Set;
-
/**
* Fragment that displays a twelve-key phone dialpad.
*/
@@ -526,7 +523,10 @@
// another call, but that call is guaranteed to fail. Perhaps the
// entire dialer UI should be disabled instead.)
if (phoneIsInUse()) {
- mDigits.setHint(R.string.dialerDialpadHintText);
+ final SpannableString hint = new SpannableString(
+ getActivity().getString(R.string.dialerDialpadHintText));
+ hint.setSpan(new RelativeSizeSpan(0.8f), 0, hint.length(), 0);
+ mDigits.setHint(hint);
} else {
// Common case; no hint necessary.
mDigits.setHint(null);
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index 844f892..da5237f 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -1062,7 +1062,6 @@
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog dialog = new AlertDialog.Builder(getActivity())
.setIconAttribute(android.R.attr.alertDialogIcon)
- .setTitle(R.string.cancel_confirmation_dialog_title)
.setMessage(R.string.cancel_confirmation_dialog_message)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
@@ -1456,7 +1455,6 @@
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setIconAttribute(android.R.attr.alertDialogIcon)
- .setTitle(R.string.aggregation_suggestion_join_dialog_title)
.setMessage(R.string.aggregation_suggestion_join_dialog_message)
.setPositiveButton(android.R.string.yes,
new DialogInterface.OnClickListener() {
@@ -1504,7 +1502,6 @@
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setIconAttribute(android.R.attr.alertDialogIcon)
- .setTitle(R.string.aggregation_suggestion_edit_dialog_title)
.setMessage(R.string.aggregation_suggestion_edit_dialog_message)
.setPositiveButton(android.R.string.yes,
new DialogInterface.OnClickListener() {
diff --git a/src/com/android/contacts/editor/LabeledEditorView.java b/src/com/android/contacts/editor/LabeledEditorView.java
index ff0af6f..2a1ec5e 100644
--- a/src/com/android/contacts/editor/LabeledEditorView.java
+++ b/src/com/android/contacts/editor/LabeledEditorView.java
@@ -364,14 +364,15 @@
* no empty text is allowed in any custom label.
*/
private Dialog createCustomDialog() {
- final EditText customType = new EditText(mContext);
+ final AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
+ builder.setTitle(R.string.customLabelPickerTitle);
+
+ final EditText customType = new EditText(builder.getContext());
customType.setId(R.id.custom_dialog_content);
customType.setInputType(INPUT_TYPE_CUSTOM);
customType.setSaveEnabled(true);
customType.requestFocus();
- final AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
- builder.setTitle(R.string.customLabelPickerTitle);
builder.setView(customType);
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
diff --git a/src/com/android/contacts/group/GroupEditorFragment.java b/src/com/android/contacts/group/GroupEditorFragment.java
index a3ebeb0..9d056f4 100644
--- a/src/com/android/contacts/group/GroupEditorFragment.java
+++ b/src/com/android/contacts/group/GroupEditorFragment.java
@@ -550,7 +550,6 @@
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog dialog = new AlertDialog.Builder(getActivity())
.setIconAttribute(android.R.attr.alertDialogIcon)
- .setTitle(R.string.cancel_confirmation_dialog_title)
.setMessage(R.string.cancel_confirmation_dialog_message)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
diff --git a/src/com/android/contacts/interactions/ContactDeletionInteraction.java b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
index 7e880a4..4aa4030 100644
--- a/src/com/android/contacts/interactions/ContactDeletionInteraction.java
+++ b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
@@ -274,7 +274,6 @@
private void showDialog(int messageId, final Uri contactUri) {
mDialog = new AlertDialog.Builder(getActivity())
- .setTitle(R.string.deleteConfirmation_title)
.setIconAttribute(android.R.attr.alertDialogIcon)
.setMessage(messageId)
.setNegativeButton(android.R.string.cancel, null)
diff --git a/src/com/android/contacts/interactions/GroupDeletionDialogFragment.java b/src/com/android/contacts/interactions/GroupDeletionDialogFragment.java
index c1f3bd7..09306f2 100644
--- a/src/com/android/contacts/interactions/GroupDeletionDialogFragment.java
+++ b/src/com/android/contacts/interactions/GroupDeletionDialogFragment.java
@@ -52,7 +52,6 @@
return new AlertDialog.Builder(getActivity())
.setIconAttribute(android.R.attr.alertDialogIcon)
- .setTitle(R.string.delete_group_dialog_title)
.setMessage(message)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
diff --git a/src/com/android/contacts/interactions/PhoneNumberInteraction.java b/src/com/android/contacts/interactions/PhoneNumberInteraction.java
index 4c75896..4033c71 100644
--- a/src/com/android/contacts/interactions/PhoneNumberInteraction.java
+++ b/src/com/android/contacts/interactions/PhoneNumberInteraction.java
@@ -47,6 +47,7 @@
import android.os.Parcel;
import android.os.Parcelable;
import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.ContactsContract.CommonDataKinds.SipAddress;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;
@@ -65,6 +66,11 @@
* Initiates phone calls or a text message. If there are multiple candidates, this class shows a
* dialog to pick one. Creating one of these interactions should be done through the static
* factory methods.
+ *
+ * Note that this class initiates not only usual *phone* calls but also *SIP* calls.
+ *
+ * TODO: clean up code and documents since it is quite confusing to use "phone numbers" or
+ * "phone calls" here while they can be SIP addresses or SIP calls (See also issue 5039627).
*/
public class PhoneNumberInteraction implements OnLoadCompleteListener<Cursor> {
private static final String TAG = PhoneNumberInteraction.class.getSimpleName();
@@ -86,6 +92,8 @@
String dataSet;
long type;
String label;
+ /** {@link Phone#CONTENT_ITEM_TYPE} or {@link SipAddress#CONTENT_ITEM_TYPE}. */
+ String mimeType;
public PhoneItem() {
}
@@ -97,6 +105,7 @@
this.dataSet = in.readString();
this.type = in.readLong();
this.label = in.readString();
+ this.mimeType = in.readString();
}
public void writeToParcel(Parcel dest, int flags) {
@@ -106,6 +115,7 @@
dest.writeString(dataSet);
dest.writeLong(type);
dest.writeString(label);
+ dest.writeString(mimeType);
}
public int describeContents() {
@@ -260,11 +270,15 @@
RawContacts.ACCOUNT_TYPE,
RawContacts.DATA_SET,
Phone.TYPE,
- Phone.LABEL
+ Phone.LABEL,
+ Phone.MIMETYPE
};
- private static final String PHONE_NUMBER_SELECTION = Data.MIMETYPE + "='"
- + Phone.CONTENT_ITEM_TYPE + "' AND " + Phone.NUMBER + " NOT NULL";
+ private static final String PHONE_NUMBER_SELECTION =
+ Data.MIMETYPE + " IN ('"
+ + Phone.CONTENT_ITEM_TYPE + "', "
+ + "'" + SipAddress.CONTENT_ITEM_TYPE + "') AND "
+ + Data.DATA1 + " NOT NULL";
private final Context mContext;
private final OnDismissListener mDismissListener;
@@ -378,6 +392,7 @@
item.dataSet = cursor.getString(cursor.getColumnIndex(RawContacts.DATA_SET));
item.type = cursor.getInt(cursor.getColumnIndex(Phone.TYPE));
item.label = cursor.getString(cursor.getColumnIndex(Phone.LABEL));
+ item.mimeType = cursor.getString(cursor.getColumnIndex(Phone.MIMETYPE));
phoneList.add(item);
}
@@ -396,8 +411,9 @@
if (phoneList.size() == 0) {
onDismiss();
} else if (phoneList.size() == 1) {
+ PhoneItem item = phoneList.get(0);
onDismiss();
- performAction(phoneList.get(0).phoneNumber);
+ performAction(item.phoneNumber);
} else {
// There are multiple candidates. Let the user choose one.
showDisambiguationDialog(phoneList);
diff --git a/src/com/android/contacts/list/ContactEntryListAdapter.java b/src/com/android/contacts/list/ContactEntryListAdapter.java
index 9c36f05..cf86dc9 100644
--- a/src/com/android/contacts/list/ContactEntryListAdapter.java
+++ b/src/com/android/contacts/list/ContactEntryListAdapter.java
@@ -54,13 +54,8 @@
*/
private static final boolean LOCAL_INVISIBLE_DIRECTORY_ENABLED = false;
- /**
- * The animation is used here to allocate animated name text views.
- */
- private TextWithHighlightingFactory mTextWithHighlightingFactory;
private int mDisplayOrder;
private int mSortOrder;
- private boolean mNameHighlightingEnabled;
private boolean mDisplayPhotos;
private boolean mQuickContactEnabled;
diff --git a/src/com/android/contacts/list/EmailAddressListAdapter.java b/src/com/android/contacts/list/EmailAddressListAdapter.java
index 93f435e..13853a1 100644
--- a/src/com/android/contacts/list/EmailAddressListAdapter.java
+++ b/src/com/android/contacts/list/EmailAddressListAdapter.java
@@ -78,6 +78,9 @@
builder.appendPath(TextUtils.isEmpty(query) ? "" : query);
} else {
builder = Email.CONTENT_URI.buildUpon();
+ if (isSectionHeaderDisplayEnabled()) {
+ builder.appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true");
+ }
}
builder.appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY,
String.valueOf(directoryId));
@@ -97,11 +100,6 @@
}
}
- protected static Builder buildSectionIndexerUri(Uri uri) {
- return uri.buildUpon()
- .appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true");
- }
-
@Override
public String getContactDisplayName(int position) {
return ((Cursor) getItem(position)).getString(EmailQuery.EMAIL_DISPLAY_NAME);
@@ -112,7 +110,7 @@
* position.
*/
public Uri getDataUri(int position) {
- long id = ((Cursor)getItem(position)).getLong(EmailQuery.EMAIL_ID);
+ long id = ((Cursor) getItem(position)).getLong(EmailQuery.EMAIL_ID);
return ContentUris.withAppendedId(Data.CONTENT_URI, id);
}
diff --git a/src/com/android/contacts/list/EmailAddressPickerFragment.java b/src/com/android/contacts/list/EmailAddressPickerFragment.java
index 14b6c23..13fe541 100644
--- a/src/com/android/contacts/list/EmailAddressPickerFragment.java
+++ b/src/com/android/contacts/list/EmailAddressPickerFragment.java
@@ -58,6 +58,13 @@
return inflater.inflate(R.layout.contact_list_content, null);
}
+ @Override
+ protected void onCreateView(LayoutInflater inflater, ViewGroup container) {
+ super.onCreateView(inflater, container);
+
+ setVisibleScrollbarEnabled(!isLegacyCompatibilityMode());
+ }
+
private void pickEmailAddress(Uri uri) {
mListener.onPickEmailAddressAction(uri);
}
diff --git a/src/com/android/contacts/list/PhoneFavoriteFragment.java b/src/com/android/contacts/list/PhoneFavoriteFragment.java
index b6e8dd6..b512bf1 100644
--- a/src/com/android/contacts/list/PhoneFavoriteFragment.java
+++ b/src/com/android/contacts/list/PhoneFavoriteFragment.java
@@ -18,6 +18,8 @@
import com.android.contacts.ContactPhotoManager;
import com.android.contacts.ContactTileLoaderFactory;
import com.android.contacts.R;
+import com.android.contacts.activities.DialtactsActivity.ViewPagerVisibilityListener;
+import com.android.contacts.interactions.ImportExportDialogFragment;
import com.android.contacts.preference.ContactsPreferences;
import com.android.contacts.util.AccountFilterUtil;
@@ -32,9 +34,15 @@
import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Directory;
+import android.provider.Settings;
import android.util.Log;
import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
@@ -53,7 +61,8 @@
* {@link PhoneNumberListAdapter} into one unified list using {@link PhoneFavoriteMergedAdapter}.
* A contact filter header is also inserted between those adapters' results.
*/
-public class PhoneFavoriteFragment extends Fragment implements OnItemClickListener {
+public class PhoneFavoriteFragment extends Fragment implements OnItemClickListener,
+ ViewPagerVisibilityListener{
private static final String TAG = PhoneFavoriteFragment.class.getSimpleName();
private static final boolean DEBUG = false;
@@ -215,12 +224,15 @@
new ContactsPreferenceChangeListener();
private final ScrollListener mScrollListener = new ScrollListener();
+ private boolean mShowOptionsMenu;
+
@Override
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
if (savedState != null) {
mFilter = savedState.getParcelable(KEY_FILTER);
}
+ setHasOptionsMenu(true);
}
@Override
@@ -299,6 +311,8 @@
// Put photos on left for consistency with "frequent" contacts section.
mAllContactsAdapter.setPhotoPosition(ContactListItemView.PhotoPosition.LEFT);
+ mAllContactsAdapter.setUseCallableUri(true);
+
if (mFilter != null) {
mAllContactsAdapter.setFilter(mFilter);
}
@@ -317,6 +331,32 @@
}
@Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ super.onCreateOptionsMenu(menu, inflater);
+ if (mShowOptionsMenu) {
+ inflater.inflate(R.menu.phone_favorite_options, menu);
+ }
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.menu_import_export:
+ ImportExportDialogFragment.show(getFragmentManager());
+ return true;
+ case R.id.menu_accounts:
+ final Intent intent = new Intent(Settings.ACTION_SYNC_SETTINGS);
+ intent.putExtra(Settings.EXTRA_AUTHORITIES, new String[] {
+ ContactsContract.AUTHORITY
+ });
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+ startActivity(intent);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
public void onStart() {
super.onStart();
@@ -451,4 +491,9 @@
public void setListener(Listener listener) {
mListener = listener;
}
+
+ @Override
+ public void onVisibilityChanged(boolean visible) {
+ mShowOptionsMenu = visible;
+ }
}
\ No newline at end of file
diff --git a/src/com/android/contacts/list/PhoneNumberListAdapter.java b/src/com/android/contacts/list/PhoneNumberListAdapter.java
index 1d077b7..79114eb 100644
--- a/src/com/android/contacts/list/PhoneNumberListAdapter.java
+++ b/src/com/android/contacts/list/PhoneNumberListAdapter.java
@@ -15,6 +15,8 @@
*/
package com.android.contacts.list;
+import com.android.contacts.R;
+
import android.content.ContentUris;
import android.content.Context;
import android.content.CursorLoader;
@@ -22,7 +24,9 @@
import android.net.Uri;
import android.net.Uri.Builder;
import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.Callable;
import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.ContactsContract.CommonDataKinds.SipAddress;
import android.provider.ContactsContract.ContactCounts;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Data;
@@ -37,7 +41,12 @@
import java.util.List;
/**
- * A cursor adapter for the {@link Phone#CONTENT_TYPE} content type.
+ * A cursor adapter for the {@link Phone#CONTENT_ITEM_TYPE} and
+ * {@link SipAddress#CONTENT_ITEM_TYPE}.
+ *
+ * By default this adapter just handles phone numbers. When {@link #setUseCallableUri(boolean)} is
+ * called with "true", this adapter starts handling SIP addresses too, by using {@link Callable}
+ * API instead of {@link Phone}.
*/
public class PhoneNumberListAdapter extends ContactEntryListAdapter {
private static final String TAG = PhoneNumberListAdapter.class.getSimpleName();
@@ -79,6 +88,8 @@
private ContactListItemView.PhotoPosition mPhotoPosition;
+ private boolean mUseCallableUri;
+
public PhoneNumberListAdapter(Context context) {
super(context);
@@ -91,40 +102,37 @@
@Override
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 Builder builder;
if (isSearchMode()) {
- String query = getQueryString();
- Builder builder = Phone.CONTENT_FILTER_URI.buildUpon();
+ final Uri baseUri =
+ mUseCallableUri ? Callable.CONTENT_FILTER_URI : Phone.CONTENT_FILTER_URI;
+ builder = baseUri.buildUpon();
+ final String query = getQueryString();
if (TextUtils.isEmpty(query)) {
builder.appendPath("");
} else {
builder.appendPath(query); // Builder will encode the query
}
-
builder.appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY,
String.valueOf(directoryId));
- uri = builder.build();
} else {
- uri = Phone.CONTENT_URI.buildUpon().appendQueryParameter(
- ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT))
- .build();
+ final Uri baseUri = mUseCallableUri ? Callable.CONTENT_URI : Phone.CONTENT_URI;
+ builder = baseUri.buildUpon().appendQueryParameter(
+ ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT));
if (isSectionHeaderDisplayEnabled()) {
- uri = buildSectionIndexerUri(uri);
+ builder.appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true");
}
configureSelection(loader, directoryId, getFilter());
}
// Remove duplicates when it is possible.
- uri = uri.buildUpon()
- .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "true")
- .build();
- loader.setUri(uri);
+ builder.appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "true");
+ loader.setUri(builder.build());
// TODO a projection that includes the search snippet
if (getContactNameDisplayOrder() == ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY) {
@@ -187,11 +195,6 @@
loader.setSelectionArgs(selectionArgs.toArray(new String[0]));
}
- protected static Uri buildSectionIndexerUri(Uri uri) {
- return uri.buildUpon()
- .appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true").build();
- }
-
@Override
public String getContactDisplayName(int position) {
return ((Cursor) getItem(position)).getString(PhoneQuery.PHONE_DISPLAY_NAME);
@@ -322,4 +325,12 @@
public ContactListItemView.PhotoPosition getPhotoPosition() {
return mPhotoPosition;
}
+
+ public void setUseCallableUri(boolean useCallableUri) {
+ mUseCallableUri = useCallableUri;
+ }
+
+ public boolean usesCallableUri() {
+ return mUseCallableUri;
+ }
}
diff --git a/src/com/android/contacts/list/PhoneNumberPickerFragment.java b/src/com/android/contacts/list/PhoneNumberPickerFragment.java
index c96956b..149b391 100644
--- a/src/com/android/contacts/list/PhoneNumberPickerFragment.java
+++ b/src/com/android/contacts/list/PhoneNumberPickerFragment.java
@@ -55,6 +55,8 @@
/** true if the loader has started at least once. */
private boolean mLoaderStarted;
+ private boolean mUseCallableUri;
+
private ContactListItemView.PhotoPosition mPhotoPosition =
ContactListItemView.DEFAULT_PHOTO_POSITION;
@@ -180,11 +182,20 @@
super.startLoading();
}
+ public void setUseCallableUri(boolean useCallableUri) {
+ mUseCallableUri = useCallableUri;
+ }
+
+ public boolean usesCallableUri() {
+ return mUseCallableUri;
+ }
+
@Override
protected ContactEntryListAdapter createListAdapter() {
if (!isLegacyCompatibilityMode()) {
PhoneNumberListAdapter adapter = new PhoneNumberListAdapter(getActivity());
adapter.setDisplayPhotos(true);
+ adapter.setUseCallableUri(mUseCallableUri);
return adapter;
} else {
LegacyPhoneNumberListAdapter adapter = new LegacyPhoneNumberListAdapter(getActivity());
diff --git a/src/com/android/contacts/list/PostalAddressListAdapter.java b/src/com/android/contacts/list/PostalAddressListAdapter.java
index 41591de..2750e11 100644
--- a/src/com/android/contacts/list/PostalAddressListAdapter.java
+++ b/src/com/android/contacts/list/PostalAddressListAdapter.java
@@ -20,10 +20,11 @@
import android.content.CursorLoader;
import android.database.Cursor;
import android.net.Uri;
+import android.net.Uri.Builder;
import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.provider.ContactsContract.ContactCounts;
import android.provider.ContactsContract.Data;
-import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.view.View;
import android.view.ViewGroup;
@@ -69,11 +70,12 @@
@Override
public void configureLoader(CursorLoader loader, long directoryId) {
- Uri uri = buildSectionIndexerUri(StructuredPostal.CONTENT_URI)
- .buildUpon()
- .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "true")
- .build();
- loader.setUri(uri);
+ final Builder builder = StructuredPostal.CONTENT_URI.buildUpon()
+ .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "true");
+ if (isSectionHeaderDisplayEnabled()) {
+ builder.appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true");
+ }
+ loader.setUri(builder.build());
if (getContactNameDisplayOrder() == ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY) {
loader.setProjection(PostalQuery.PROJECTION_PRIMARY);
@@ -88,11 +90,6 @@
}
}
- protected static Uri buildSectionIndexerUri(Uri uri) {
- return uri.buildUpon()
- .appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true").build();
- }
-
@Override
public String getContactDisplayName(int position) {
return ((Cursor) getItem(position)).getString(PostalQuery.POSTAL_DISPLAY_NAME);
diff --git a/src/com/android/contacts/list/PostalAddressPickerFragment.java b/src/com/android/contacts/list/PostalAddressPickerFragment.java
index 85fc155..ddb8e9a 100644
--- a/src/com/android/contacts/list/PostalAddressPickerFragment.java
+++ b/src/com/android/contacts/list/PostalAddressPickerFragment.java
@@ -73,6 +73,13 @@
return inflater.inflate(R.layout.contact_list_content, null);
}
+ @Override
+ protected void onCreateView(LayoutInflater inflater, ViewGroup container) {
+ super.onCreateView(inflater, container);
+
+ setVisibleScrollbarEnabled(!isLegacyCompatibilityMode());
+ }
+
private void pickPostalAddress(Uri uri) {
mListener.onPickPostalAddressAction(uri);
}
diff --git a/src/com/android/contacts/vcard/CancelActivity.java b/src/com/android/contacts/vcard/CancelActivity.java
index c890607..5dafa53 100644
--- a/src/com/android/contacts/vcard/CancelActivity.java
+++ b/src/com/android/contacts/vcard/CancelActivity.java
@@ -87,17 +87,13 @@
protected Dialog onCreateDialog(int id, Bundle bundle) {
switch (id) {
case R.id.dialog_cancel_confirmation: {
- final String title;
final String message;
if (mType == VCardService.TYPE_IMPORT) {
- title = getString(R.string.cancel_import_confirmation_title);
message = getString(R.string.cancel_import_confirmation_message, mDisplayName);
} else {
- title = getString(R.string.cancel_export_confirmation_title);
message = getString(R.string.cancel_export_confirmation_message, mDisplayName);
}
final AlertDialog.Builder builder = new AlertDialog.Builder(this)
- .setTitle(title)
.setMessage(message)
.setPositiveButton(android.R.string.ok, new RequestCancelListener())
.setOnCancelListener(mCancelListener)
diff --git a/src/com/android/contacts/vcard/ExportVCardActivity.java b/src/com/android/contacts/vcard/ExportVCardActivity.java
index c36cc38..f38c9df 100644
--- a/src/com/android/contacts/vcard/ExportVCardActivity.java
+++ b/src/com/android/contacts/vcard/ExportVCardActivity.java
@@ -235,7 +235,6 @@
case R.id.dialog_sdcard_not_found: {
mProcessOngoing = false;
return new AlertDialog.Builder(this)
- .setTitle(R.string.no_sdcard_title)
.setIconAttribute(android.R.attr.alertDialogIcon)
.setMessage(R.string.no_sdcard_message)
.setPositiveButton(android.R.string.ok, this).create();
diff --git a/src/com/android/contacts/vcard/ImportVCardActivity.java b/src/com/android/contacts/vcard/ImportVCardActivity.java
index 18b9cc1..2dc92af 100644
--- a/src/com/android/contacts/vcard/ImportVCardActivity.java
+++ b/src/com/android/contacts/vcard/ImportVCardActivity.java
@@ -901,10 +901,9 @@
}
case R.id.dialog_searching_vcard: {
if (mProgressDialogForScanVCard == null) {
- String title = getString(R.string.searching_vcard_title);
String message = getString(R.string.searching_vcard_message);
mProgressDialogForScanVCard =
- ProgressDialog.show(this, title, message, true, false);
+ ProgressDialog.show(this, "", message, true, false);
mProgressDialogForScanVCard.setOnCancelListener(mVCardScanThread);
mVCardScanThread.start();
}
@@ -912,7 +911,6 @@
}
case R.id.dialog_sdcard_not_found: {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
- .setTitle(R.string.no_sdcard_title)
.setIconAttribute(android.R.attr.alertDialogIcon)
.setMessage(R.string.no_sdcard_message)
.setOnCancelListener(mCancelListener)
@@ -922,7 +920,6 @@
case R.id.dialog_vcard_not_found: {
final String message = getString(R.string.import_failure_no_vcard_file);
AlertDialog.Builder builder = new AlertDialog.Builder(this)
- .setTitle(R.string.scanning_sdcard_failed_title)
.setMessage(message)
.setOnCancelListener(mCancelListener)
.setPositiveButton(android.R.string.ok, mCancelListener);
@@ -954,7 +951,6 @@
String message = (getString(R.string.scanning_sdcard_failed_message,
getString(R.string.fail_reason_io_error)));
AlertDialog.Builder builder = new AlertDialog.Builder(this)
- .setTitle(R.string.scanning_sdcard_failed_title)
.setIconAttribute(android.R.attr.alertDialogIcon)
.setMessage(message)
.setOnCancelListener(mCancelListener)
diff --git a/tests/src/com/android/contacts/calllog/CallLogAdapterTest.java b/tests/src/com/android/contacts/calllog/CallLogAdapterTest.java
index 600a589..8a98018 100644
--- a/tests/src/com/android/contacts/calllog/CallLogAdapterTest.java
+++ b/tests/src/com/android/contacts/calllog/CallLogAdapterTest.java
@@ -117,7 +117,7 @@
public void testBindView_NoCallLogButMemoryCache_EnqueueRequest() {
mCursor.addRow(createCallLogEntry());
- mAdapter.injectContactInfoForTest(TEST_NUMBER, createContactInfo());
+ mAdapter.injectContactInfoForTest(TEST_NUMBER, TEST_COUNTRY_ISO, createContactInfo());
// Bind the views of a single row.
mAdapter.bindStandAloneView(mView, getContext(), mCursor);
@@ -132,7 +132,7 @@
public void testBindView_BothCallLogAndMemoryCache_NoEnqueueRequest() {
mCursor.addRow(createCallLogEntryWithCachedValues());
- mAdapter.injectContactInfoForTest(TEST_NUMBER, createContactInfo());
+ mAdapter.injectContactInfoForTest(TEST_NUMBER, TEST_COUNTRY_ISO, createContactInfo());
// Bind the views of a single row.
mAdapter.bindStandAloneView(mView, getContext(), mCursor);
@@ -147,7 +147,7 @@
// Contact info contains a different name.
ContactInfo info = createContactInfo();
info.name = "new name";
- mAdapter.injectContactInfoForTest(TEST_NUMBER, info);
+ mAdapter.injectContactInfoForTest(TEST_NUMBER, TEST_COUNTRY_ISO, info);
// Bind the views of a single row.
mAdapter.bindStandAloneView(mView, getContext(), mCursor);
diff --git a/tests/src/com/android/contacts/calllog/CallLogFragmentTest.java b/tests/src/com/android/contacts/calllog/CallLogFragmentTest.java
index 09fe463..9cac8fe 100644
--- a/tests/src/com/android/contacts/calllog/CallLogFragmentTest.java
+++ b/tests/src/com/android/contacts/calllog/CallLogFragmentTest.java
@@ -482,7 +482,7 @@
contactInfo.formattedNumber = formattedNumber;
contactInfo.normalizedNumber = number;
contactInfo.photoId = 0;
- mAdapter.injectContactInfoForTest(number, contactInfo);
+ mAdapter.injectContactInfoForTest(number, TEST_COUNTRY_ISO, contactInfo);
}
/**