Merge "Set ContactInfo.normalizedNumber to null for SIP addresses"
diff --git a/res/drawable-hdpi/btn_dial_action_left_disable.9.png b/res/drawable-hdpi/btn_dial_action_left_disable.9.png
index 7ba8672..8a2625b 100644
--- a/res/drawable-hdpi/btn_dial_action_left_disable.9.png
+++ b/res/drawable-hdpi/btn_dial_action_left_disable.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_left_disable_focused.9.png b/res/drawable-hdpi/btn_dial_action_left_disable_focused.9.png
index b4300b6..32c9772 100644
--- a/res/drawable-hdpi/btn_dial_action_left_disable_focused.9.png
+++ b/res/drawable-hdpi/btn_dial_action_left_disable_focused.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_left_normal.9.png b/res/drawable-hdpi/btn_dial_action_left_normal.9.png
index 7ba8672..255ae18 100644
--- a/res/drawable-hdpi/btn_dial_action_left_normal.9.png
+++ b/res/drawable-hdpi/btn_dial_action_left_normal.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_left_pressed.9.png b/res/drawable-hdpi/btn_dial_action_left_pressed.9.png
index 1dc40b7..f63fee6 100644
--- a/res/drawable-hdpi/btn_dial_action_left_pressed.9.png
+++ b/res/drawable-hdpi/btn_dial_action_left_pressed.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_left_selected.9.png b/res/drawable-hdpi/btn_dial_action_left_selected.9.png
index 4f6c7cf..77ddcb0 100644
--- a/res/drawable-hdpi/btn_dial_action_left_selected.9.png
+++ b/res/drawable-hdpi/btn_dial_action_left_selected.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_middle_disable.9.png b/res/drawable-hdpi/btn_dial_action_middle_disable.9.png
index 0a6cd66..8556118 100644
--- a/res/drawable-hdpi/btn_dial_action_middle_disable.9.png
+++ b/res/drawable-hdpi/btn_dial_action_middle_disable.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_middle_disable_focused.9.png b/res/drawable-hdpi/btn_dial_action_middle_disable_focused.9.png
index b28176f..965fe7d 100644
--- a/res/drawable-hdpi/btn_dial_action_middle_disable_focused.9.png
+++ b/res/drawable-hdpi/btn_dial_action_middle_disable_focused.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_middle_normal.9.png b/res/drawable-hdpi/btn_dial_action_middle_normal.9.png
index 0a6cd66..cef64b3 100644
--- a/res/drawable-hdpi/btn_dial_action_middle_normal.9.png
+++ b/res/drawable-hdpi/btn_dial_action_middle_normal.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_middle_pressed.9.png b/res/drawable-hdpi/btn_dial_action_middle_pressed.9.png
index 58f187d..971ea2d 100644
--- a/res/drawable-hdpi/btn_dial_action_middle_pressed.9.png
+++ b/res/drawable-hdpi/btn_dial_action_middle_pressed.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_middle_selected.9.png b/res/drawable-hdpi/btn_dial_action_middle_selected.9.png
index f201dee..3fa740c 100644
--- a/res/drawable-hdpi/btn_dial_action_middle_selected.9.png
+++ b/res/drawable-hdpi/btn_dial_action_middle_selected.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_right_disable.9.png b/res/drawable-hdpi/btn_dial_action_right_disable.9.png
index 6e6fa30..c9bb623 100644
--- a/res/drawable-hdpi/btn_dial_action_right_disable.9.png
+++ b/res/drawable-hdpi/btn_dial_action_right_disable.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_right_disable_focused.9.png b/res/drawable-hdpi/btn_dial_action_right_disable_focused.9.png
index 46a042f..1b909d4 100644
--- a/res/drawable-hdpi/btn_dial_action_right_disable_focused.9.png
+++ b/res/drawable-hdpi/btn_dial_action_right_disable_focused.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_right_normal.9.png b/res/drawable-hdpi/btn_dial_action_right_normal.9.png
index 6e6fa30..d994935 100644
--- a/res/drawable-hdpi/btn_dial_action_right_normal.9.png
+++ b/res/drawable-hdpi/btn_dial_action_right_normal.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_right_pressed.9.png b/res/drawable-hdpi/btn_dial_action_right_pressed.9.png
index d66a509..416a925 100644
--- a/res/drawable-hdpi/btn_dial_action_right_pressed.9.png
+++ b/res/drawable-hdpi/btn_dial_action_right_pressed.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_action_right_selected.9.png b/res/drawable-hdpi/btn_dial_action_right_selected.9.png
index d2ee98b..9e1d474 100644
--- a/res/drawable-hdpi/btn_dial_action_right_selected.9.png
+++ b/res/drawable-hdpi/btn_dial_action_right_selected.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_normal.9.png b/res/drawable-hdpi/btn_dial_normal.9.png
index 5702e47..8126679 100644
--- a/res/drawable-hdpi/btn_dial_normal.9.png
+++ b/res/drawable-hdpi/btn_dial_normal.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_pressed.9.png b/res/drawable-hdpi/btn_dial_pressed.9.png
index a5b51d5..e38ae1e 100644
--- a/res/drawable-hdpi/btn_dial_pressed.9.png
+++ b/res/drawable-hdpi/btn_dial_pressed.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_selected.9.png b/res/drawable-hdpi/btn_dial_selected.9.png
index b578146..f38b767 100644
--- a/res/drawable-hdpi/btn_dial_selected.9.png
+++ b/res/drawable-hdpi/btn_dial_selected.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_textfield_activated.9.png b/res/drawable-hdpi/btn_dial_textfield_activated.9.png
index c937c5e..58d0b6a 100644
--- a/res/drawable-hdpi/btn_dial_textfield_activated.9.png
+++ b/res/drawable-hdpi/btn_dial_textfield_activated.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_textfield_normal.9.png b/res/drawable-hdpi/btn_dial_textfield_normal.9.png
index 0c38b39..6234b7b 100644
--- a/res/drawable-hdpi/btn_dial_textfield_normal.9.png
+++ b/res/drawable-hdpi/btn_dial_textfield_normal.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_textfield_pressed.9.png b/res/drawable-hdpi/btn_dial_textfield_pressed.9.png
index 22d8235..dbceaf2 100644
--- a/res/drawable-hdpi/btn_dial_textfield_pressed.9.png
+++ b/res/drawable-hdpi/btn_dial_textfield_pressed.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_dial_textfield_selected.9.png b/res/drawable-hdpi/btn_dial_textfield_selected.9.png
index 1fe4dfc..710c88c 100644
--- a/res/drawable-hdpi/btn_dial_textfield_selected.9.png
+++ b/res/drawable-hdpi/btn_dial_textfield_selected.9.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_0_wht.png b/res/drawable-hdpi/dial_num_0_wht.png
index d46f5f8..d9a139c 100644
--- a/res/drawable-hdpi/dial_num_0_wht.png
+++ b/res/drawable-hdpi/dial_num_0_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_1_no_vm_wht.png b/res/drawable-hdpi/dial_num_1_no_vm_wht.png
index b40dbed..30329ae 100644
--- a/res/drawable-hdpi/dial_num_1_no_vm_wht.png
+++ b/res/drawable-hdpi/dial_num_1_no_vm_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_2_wht.png b/res/drawable-hdpi/dial_num_2_wht.png
index bcd2908..3ac9d36 100644
--- a/res/drawable-hdpi/dial_num_2_wht.png
+++ b/res/drawable-hdpi/dial_num_2_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_3_wht.png b/res/drawable-hdpi/dial_num_3_wht.png
index 8d2257c..c3896cd 100644
--- a/res/drawable-hdpi/dial_num_3_wht.png
+++ b/res/drawable-hdpi/dial_num_3_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_4_wht.png b/res/drawable-hdpi/dial_num_4_wht.png
index 41456ba..2366755 100644
--- a/res/drawable-hdpi/dial_num_4_wht.png
+++ b/res/drawable-hdpi/dial_num_4_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_5_wht.png b/res/drawable-hdpi/dial_num_5_wht.png
index b80302c..437ce93 100644
--- a/res/drawable-hdpi/dial_num_5_wht.png
+++ b/res/drawable-hdpi/dial_num_5_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_6_wht.png b/res/drawable-hdpi/dial_num_6_wht.png
index f264730..ca6a87b 100644
--- a/res/drawable-hdpi/dial_num_6_wht.png
+++ b/res/drawable-hdpi/dial_num_6_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_7_wht.png b/res/drawable-hdpi/dial_num_7_wht.png
index 7d85570..1e6a2ed 100644
--- a/res/drawable-hdpi/dial_num_7_wht.png
+++ b/res/drawable-hdpi/dial_num_7_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_8_wht.png b/res/drawable-hdpi/dial_num_8_wht.png
index 29ab93d..113a58a 100644
--- a/res/drawable-hdpi/dial_num_8_wht.png
+++ b/res/drawable-hdpi/dial_num_8_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_9_wht.png b/res/drawable-hdpi/dial_num_9_wht.png
index 0d7c515..ed52823 100644
--- a/res/drawable-hdpi/dial_num_9_wht.png
+++ b/res/drawable-hdpi/dial_num_9_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_pound_blk.png b/res/drawable-hdpi/dial_num_pound_blk.png
index fcfc58c..ee772f1 100644
--- a/res/drawable-hdpi/dial_num_pound_blk.png
+++ b/res/drawable-hdpi/dial_num_pound_blk.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_pound_wht.png b/res/drawable-hdpi/dial_num_pound_wht.png
index 8c7bce3..0bad3f9 100644
--- a/res/drawable-hdpi/dial_num_pound_wht.png
+++ b/res/drawable-hdpi/dial_num_pound_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_star_blk.png b/res/drawable-hdpi/dial_num_star_blk.png
index ddda118..28a4504 100644
--- a/res/drawable-hdpi/dial_num_star_blk.png
+++ b/res/drawable-hdpi/dial_num_star_blk.png
Binary files differ
diff --git a/res/drawable-hdpi/dial_num_star_wht.png b/res/drawable-hdpi/dial_num_star_wht.png
index 6fd5d0a..fa8b047 100644
--- a/res/drawable-hdpi/dial_num_star_wht.png
+++ b/res/drawable-hdpi/dial_num_star_wht.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_contact_list_picture.png b/res/drawable-hdpi/ic_contact_list_picture.png
old mode 100755
new mode 100644
index 296ab9f..b96fbf4
--- a/res/drawable-hdpi/ic_contact_list_picture.png
+++ b/res/drawable-hdpi/ic_contact_list_picture.png
Binary files differ
diff --git a/res/drawable-hdpi/aizy_bottom.png b/res/drawable-hdpi/temp_aizy_bottom.png
similarity index 100%
rename from res/drawable-hdpi/aizy_bottom.png
rename to res/drawable-hdpi/temp_aizy_bottom.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_dial_action_left_disable.9.png b/res/drawable-mdpi/btn_dial_action_left_disable.9.png
index 6ab27d8..af596d1 100644
--- a/res/drawable-mdpi/btn_dial_action_left_disable.9.png
+++ b/res/drawable-mdpi/btn_dial_action_left_disable.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_dial_action_left_disable_focused.9.png b/res/drawable-mdpi/btn_dial_action_left_disable_focused.9.png
index 5bba3c4..b0188dc 100644
--- a/res/drawable-mdpi/btn_dial_action_left_disable_focused.9.png
+++ b/res/drawable-mdpi/btn_dial_action_left_disable_focused.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_dial_action_left_normal.9.png b/res/drawable-mdpi/btn_dial_action_left_normal.9.png
index 6ab27d8..6f7d991 100644
--- a/res/drawable-mdpi/btn_dial_action_left_normal.9.png
+++ b/res/drawable-mdpi/btn_dial_action_left_normal.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_dial_action_left_pressed.9.png b/res/drawable-mdpi/btn_dial_action_left_pressed.9.png
index 542abe7..31f9e70 100644
--- a/res/drawable-mdpi/btn_dial_action_left_pressed.9.png
+++ b/res/drawable-mdpi/btn_dial_action_left_pressed.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_dial_action_left_selected.9.png b/res/drawable-mdpi/btn_dial_action_left_selected.9.png
index 34caba1..96e3aec 100644
--- a/res/drawable-mdpi/btn_dial_action_left_selected.9.png
+++ b/res/drawable-mdpi/btn_dial_action_left_selected.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_dial_action_right_disable.9.png b/res/drawable-mdpi/btn_dial_action_right_disable.9.png
index 85dfff0..9bde573 100644
--- a/res/drawable-mdpi/btn_dial_action_right_disable.9.png
+++ b/res/drawable-mdpi/btn_dial_action_right_disable.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_dial_action_right_disable_focused.9.png b/res/drawable-mdpi/btn_dial_action_right_disable_focused.9.png
index 1f76f0c..c2aa050 100644
--- a/res/drawable-mdpi/btn_dial_action_right_disable_focused.9.png
+++ b/res/drawable-mdpi/btn_dial_action_right_disable_focused.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_dial_action_right_normal.9.png b/res/drawable-mdpi/btn_dial_action_right_normal.9.png
index 85dfff0..7d408e6 100644
--- a/res/drawable-mdpi/btn_dial_action_right_normal.9.png
+++ b/res/drawable-mdpi/btn_dial_action_right_normal.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_dial_action_right_pressed.9.png b/res/drawable-mdpi/btn_dial_action_right_pressed.9.png
index 226633f..229e6ba 100644
--- a/res/drawable-mdpi/btn_dial_action_right_pressed.9.png
+++ b/res/drawable-mdpi/btn_dial_action_right_pressed.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_dial_action_right_selected.9.png b/res/drawable-mdpi/btn_dial_action_right_selected.9.png
index 9cca52c..e11a660 100644
--- a/res/drawable-mdpi/btn_dial_action_right_selected.9.png
+++ b/res/drawable-mdpi/btn_dial_action_right_selected.9.png
Binary files differ
diff --git a/res/drawable-mdpi/aizy_bottom.png b/res/drawable-mdpi/temp_aizy_bottom.png
similarity index 100%
rename from res/drawable-mdpi/aizy_bottom.png
rename to res/drawable-mdpi/temp_aizy_bottom.png
Binary files differ
diff --git a/res/drawable-mdpi/temp_aizy_knob.png b/res/drawable-mdpi/temp_aizy_knob.png
new file mode 100644
index 0000000..daa8242
--- /dev/null
+++ b/res/drawable-mdpi/temp_aizy_knob.png
Binary files differ
diff --git a/res/layout-xlarge/contact_detail_fragment.xml b/res/layout-xlarge/contact_detail_fragment.xml
index 034d1ce..391a2fe 100644
--- a/res/layout-xlarge/contact_detail_fragment.xml
+++ b/res/layout-xlarge/contact_detail_fragment.xml
@@ -69,9 +69,13 @@
android:layout_height="match_parent"
ex:layout_wideParentWidth="800dip"
ex:layout_wideLeftMargin="144dip"
+ ex:layout_wideRightMargin="64dip"
ex:layout_narrowParentWidth="500dip"
ex:layout_narrowLeftMargin="42dip"
+ ex:layout_narrowRightMargin="0dip"
android:cacheColorHint="#00000000"
+ android:divider="#ffe5e5e5"
+ android:dividerHeight="1px"
/>
</com.android.contacts.widget.InterpolatingLayout>
diff --git a/res/layout-xlarge/contact_detail_header_view.xml b/res/layout-xlarge/contact_detail_header_view.xml
index be86255..3299b34 100644
--- a/res/layout-xlarge/contact_detail_header_view.xml
+++ b/res/layout-xlarge/contact_detail_header_view.xml
@@ -22,7 +22,7 @@
android:paddingTop="40dip"
android:paddingRight="5dip">
- <android.widget.QuickContactBadge android:id="@+id/photo"
+ <ImageView android:id="@+id/photo"
android:layout_marginRight="8dip"
android:layout_marginLeft="-1dip"
android:layout_width="96dip"
diff --git a/res/layout/aizy_popup_window.xml b/res/layout/aizy_popup_window.xml
index 801b481..5e83766 100644
--- a/res/layout/aizy_popup_window.xml
+++ b/res/layout/aizy_popup_window.xml
@@ -18,7 +18,7 @@
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:background="@drawable/aizy_bottom"
+ android:background="@drawable/temp_aizy_bottom"
>
<TextView
diff --git a/res/layout/contact_detail_header_view.xml b/res/layout/contact_detail_header_view.xml
index b7c7988..2417e45 100644
--- a/res/layout/contact_detail_header_view.xml
+++ b/res/layout/contact_detail_header_view.xml
@@ -22,11 +22,11 @@
android:background="@drawable/title_bar_medium"
android:paddingRight="5dip">
- <android.widget.QuickContactBadge android:id="@+id/photo"
+ <ImageView android:id="@+id/photo"
android:layout_gravity="center_vertical"
android:layout_marginRight="8dip"
android:layout_marginLeft="-1dip"
- style="@*android:style/Widget.QuickContactBadge.WindowSmall" />
+ android:src="@*android:drawable/ic_contact_picture"
/>
<LinearLayout
diff --git a/res/values-xlarge/colors.xml b/res/values-xlarge/colors.xml
index 4eaa941..0f8f8de 100644
--- a/res/values-xlarge/colors.xml
+++ b/res/values-xlarge/colors.xml
@@ -16,12 +16,6 @@
<resources>
- <!-- Color used in the Aizy visual scroll control for empty section -->
- <color name="aizy_empty_section">#ffcccccc</color>
-
- <!-- Color used in the Aizy visual scroll control for non-empty sections -->
- <color name="aizy_non_empty_section">#ff9490a0</color>
-
<!-- Color used for the letter in the A-Z section header -->
<color name="section_header_text_color">#ff000000</color>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 9da6a61..cea3573 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -27,10 +27,7 @@
<color name="translucent_search_background">#cc000000</color>
<!-- Color used in the Aizy visual scroll control for empty section -->
- <color name="aizy_empty_section">#ff666666</color>
-
- <!-- Color used in the Aizy visual scroll control for non-empty sections -->
- <color name="aizy_non_empty_section">#ffcccccc</color>
+ <color name="aizy_line_color">#ff689afe</color>
<!-- Color used for the letter in the A-Z section header -->
<color name="section_header_text_color">#ff999999</color>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a15619a..9b43a31 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -982,7 +982,7 @@
<!-- Title for data source when creating or editing a contact that doesn't
belong to a specific account. This contact will only exist on the phone
and will not be synced. -->
- <string name="account_phone">Phone-only (unsynced)</string>
+ <string name="account_phone">Phone-only, unsynced</string>
<!-- Action string for calling a custom phone number -->
<string name="call_custom">Call <xliff:g id="custom">%s</xliff:g></string>
@@ -1308,16 +1308,6 @@
<!-- The button next to the message about multiple contact aggregation suggestions in Contact editor. [CHAR LIMIT=12]-->
<string name="aggregation_suggestion_view_button">View</string>
- <!-- Primary alphabet of this language. Each of these characters always has its own section in
- the visual scroll control next to the contact list. These letters must be uppercase.
- While there is no hard limit on the number of characters, there should not be more than
- 40. If the language requires more, this string should instead be empty so that the
- visual scroll control adapts to the contents.
- This text must only contain letters that can appear as sections, otherwise they would
- only be empty.
- Translations require extensive QA! -->
- <string name="visualScrollerAlphabet">A;B;C;D;E;F;G;H;I;J;K;L;M;N;O;P;Q;R;S;T;U;V;W;X;Y;Z</string>
-
<!-- The menu item (or button) that creates a local copy of a corporate contact. [CHAR LIMIT=40]-->
<string name="menu_copyContact">Copy to my contacts</string>
diff --git a/src/com/android/contacts/activities/ContactBrowserActivity.java b/src/com/android/contacts/activities/ContactBrowserActivity.java
index 2deb549..a70fbc4 100644
--- a/src/com/android/contacts/activities/ContactBrowserActivity.java
+++ b/src/com/android/contacts/activities/ContactBrowserActivity.java
@@ -35,7 +35,6 @@
import com.android.contacts.views.ContactSaveService;
import com.android.contacts.views.detail.ContactDetailFragment;
import com.android.contacts.views.detail.ContactNoneFragment;
-import com.android.contacts.views.editor.ContactEditorFragment;
import com.android.contacts.widget.ContextMenuAdapter;
import android.accounts.Account;
@@ -104,9 +103,6 @@
private ContactDetailFragment mDetailFragment;
private DetailFragmentListener mDetailFragmentListener = new DetailFragmentListener();
- private ContactEditorFragment mEditorFragment;
- private EditorFragmentListener mEditorFragmentListener = new EditorFragmentListener();
-
private PhoneNumberInteraction mPhoneNumberCallInteraction;
private PhoneNumberInteraction mSendTextMessageInteraction;
private ContactDeletionInteraction mContactDeletionInteraction;
@@ -135,9 +131,6 @@
} else if (fragment instanceof ContactDetailFragment) {
mDetailFragment = (ContactDetailFragment)fragment;
mDetailFragment.setListener(mDetailFragmentListener);
- } else if (fragment instanceof ContactEditorFragment) {
- mEditorFragment = (ContactEditorFragment)fragment;
- mEditorFragment.setListener(mEditorFragmentListener);
}
}
@@ -237,9 +230,28 @@
private void configureListFragment(boolean fromRequest) {
boolean searchMode = mSearchMode;
if (fromRequest) {
- if (mRequest.getDisplayWithPhoneNumbersOnly()) {
- mContactListFilterController.setContactListFilter(new ContactListFilter(
- ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY), false);
+ ContactListFilter filter = null;
+ int actionCode = mRequest.getActionCode();
+ switch (actionCode) {
+ case ContactsRequest.ACTION_ALL_CONTACTS:
+ filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
+ break;
+ case ContactsRequest.ACTION_CONTACTS_WITH_PHONES:
+ filter = new ContactListFilter(
+ ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY);
+ break;
+
+ // TODO: handle FREQUENT and STREQUENT according to the spec
+ case ContactsRequest.ACTION_FREQUENT:
+ case ContactsRequest.ACTION_STREQUENT:
+ // For now they are treated the same as STARRED
+ case ContactsRequest.ACTION_STARRED:
+ filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_STARRED);
+ break;
+ }
+
+ if (filter != null) {
+ mContactListFilterController.setContactListFilter(filter, false);
searchMode = false;
} else if (mRequest.getActionCode() == ContactsRequest.ACTION_ALL_CONTACTS) {
mContactListFilterController.setContactListFilter(new ContactListFilter(
@@ -248,16 +260,6 @@
} else {
if (mHasActionBar) {
searchMode = mActionBarAdapter.isSearchMode();
- } else {
-// TODO: reenable FREQUENT, STARRED and STREQUENT
-// int actionCode = mRequest.getActionCode();
-// if (actionCode == ContactsRequest.ACTION_FREQUENT ||
-// actionCode == ContactsRequest.ACTION_STARRED ||
-// actionCode == ContactsRequest.ACTION_STREQUENT) {
-// mode = ContactBrowserMode.MODE_FAVORITES;
-// } else {
-// mode = ContactBrowserMode.MODE_CONTACTS;
-// }
}
}
@@ -333,25 +335,11 @@
}
private void setupContactDetailFragment(Uri contactLookupUri) {
-
- // If we are already editing this URI - just continue editing
- if (mEditorFragment != null && contactLookupUri != null
- && contactLookupUri.equals(mEditorFragment.getLookupUri())) {
- return;
- }
-
if (mDetailFragment != null && contactLookupUri != null
&& contactLookupUri.equals(mDetailFragment.getUri())) {
return;
}
- // If we are closing the editor, it's a good idea to scroll the list
- // to the contact we have just finished editing.
- boolean scrollToSelection = mEditorFragment != null;
-
- // No editor here
- closeEditorFragment(true);
-
if (contactLookupUri != null) {
// Already showing? Nothing to do
if (mDetailFragment != null) {
@@ -376,27 +364,6 @@
.replace(R.id.detail_container, mEmptyFragment)
.commit();
}
- if (scrollToSelection) {
- mListFragment.requestSelectionOnScreen(true);
- }
- }
-
- private void setupContactEditorFragment(Uri contactLookupUri) {
- // No detail view here
- closeDetailFragment();
- closeEmptyFragment();
-
- // Already showing? Nothing to do
- if (mEditorFragment != null) return;
-
- mEditorFragment = new ContactEditorFragment();
- mEditorFragment.load(Intent.ACTION_EDIT, contactLookupUri,
- Contacts.CONTENT_ITEM_TYPE, new Bundle());
-
- // Nothing showing yet? Create (this happens during Activity-Startup)
- getFragmentManager().openTransaction()
- .replace(R.id.detail_container, mEditorFragment)
- .commit();
}
private void closeDetailFragment() {
@@ -406,23 +373,6 @@
}
}
- /**
- * Closes the editor, if it is currently open
- * @param save Whether the changes should be saved. This should always be true, unless
- * this is called from a Revert/Undo button
- */
- private void closeEditorFragment(boolean save) {
- Log.d(TAG, "closeEditorFragment(" + save + ")");
-
- if (mEditorFragment != null) {
- // Remove the listener before saving, because it will be used to forward the onClose
- // after save
- mEditorFragment.setListener(null);
- if (save) mEditorFragment.save(true);
- mEditorFragment = null;
- }
- }
-
private void closeEmptyFragment() {
mEmptyFragment = null;
}
@@ -515,9 +465,9 @@
}
private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
- public void onViewContactAction(Uri contactLookupUri, boolean force) {
+ @Override
+ public void onViewContactAction(Uri contactLookupUri) {
if (mContactContentDisplayed) {
- if (force) closeEditorFragment(true);
setSelectedContactUri(contactLookupUri);
setupContactDetailFragment(contactLookupUri);
} else {
@@ -525,6 +475,7 @@
}
}
+ @Override
public void onCreateNewContactAction() {
Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
Bundle extras = getIntent().getExtras();
@@ -534,45 +485,46 @@
startActivity(intent);
}
+ @Override
public void onEditContactAction(Uri contactLookupUri) {
- if (mContactContentDisplayed) {
- closeEditorFragment(true);
- setSelectedContactUri(contactLookupUri);
- setupContactEditorFragment(contactLookupUri);
- } else {
- Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri);
- Bundle extras = getIntent().getExtras();
- if (extras != null) {
- intent.putExtras(extras);
- }
- startActivityForResult(intent, SUBACTIVITY_EDIT_CONTACT);
+ Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri);
+ Bundle extras = getIntent().getExtras();
+ if (extras != null) {
+ intent.putExtras(extras);
}
+ startActivityForResult(intent, SUBACTIVITY_EDIT_CONTACT);
}
+ @Override
public void onAddToFavoritesAction(Uri contactUri) {
ContentValues values = new ContentValues(1);
values.put(Contacts.STARRED, 1);
getContentResolver().update(contactUri, values, null, null);
}
+ @Override
public void onRemoveFromFavoritesAction(Uri contactUri) {
ContentValues values = new ContentValues(1);
values.put(Contacts.STARRED, 0);
getContentResolver().update(contactUri, values, null, null);
}
+ @Override
public void onCallContactAction(Uri contactUri) {
getPhoneNumberCallInteraction().startInteraction(contactUri);
}
+ @Override
public void onSmsContactAction(Uri contactUri) {
getSendTextMessageInteraction().startInteraction(contactUri);
}
+ @Override
public void onDeleteContactAction(Uri contactUri) {
getContactDeletionInteraction().deleteContact(contactUri);
}
+ @Override
public void onFinishAction() {
onBackPressed();
}
@@ -614,54 +566,6 @@
}
}
- private class EditorFragmentListener implements ContactEditorFragment.Listener {
- @Override
- public void onReverted() {
- final Uri uri = mEditorFragment.getLookupUri();
- closeEditorFragment(false);
- setupContactDetailFragment(uri);
- }
-
- @Override
- public void onSaveFinished(int resultCode, Intent resultIntent) {
- Log.d(TAG, "onSaveFinished(" + resultCode + "," + resultIntent + ")");
- // it is already saved, so no need to save again here
- final Uri uri = mEditorFragment.getLookupUri();
- closeEditorFragment(false);
- setupContactDetailFragment(uri);
- }
-
- @Override
- public void onAggregationChangeFinished(Uri newLookupUri) {
- // We have already saved. Close the editor so that we can open again with the
- // new contact
- Log.d(TAG, "onAggregationChangeFinished(" + newLookupUri + ")");
- closeEditorFragment(false);
- setSelectedContactUri(newLookupUri);
- setupContactDetailFragment(newLookupUri);
- }
-
- @Override
- public void onAccountSelectorAborted() {
- Toast.makeText(ContactBrowserActivity.this, "closeBecauseAccountSelectorAborted",
- Toast.LENGTH_LONG).show();
- }
-
- @Override
- public void onContactNotFound() {
- setupContactDetailFragment(null);
- }
-
- @Override
- public void setTitleTo(int resourceId) {
- }
-
- @Override
- public void onDeleteRequested(Uri contactLookupUri) {
- getContactDeletionInteraction().deleteContact(contactLookupUri);
- }
- }
-
public void startActivityAndForwardResult(final Intent intent) {
intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
diff --git a/src/com/android/contacts/activities/ContactSearchActivity.java b/src/com/android/contacts/activities/ContactSearchActivity.java
index 708099c..5b52d9a 100644
--- a/src/com/android/contacts/activities/ContactSearchActivity.java
+++ b/src/com/android/contacts/activities/ContactSearchActivity.java
@@ -75,10 +75,12 @@
mSearchEditText = (SearchEditText)findViewById(R.id.search_src_text);
mSearchEditText.setText(mRequest.getQueryString());
mSearchEditText.setOnFilterTextListener(new OnFilterTextListener() {
+ @Override
public void onFilterChange(String queryString) {
mListFragment.setQueryString(queryString);
}
+ @Override
public void onCancelSearch() {
finish();
}
@@ -106,13 +108,16 @@
}
private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
- public void onViewContactAction(Uri contactLookupUri, boolean force) {
+ @Override
+ public void onViewContactAction(Uri contactLookupUri) {
startActivity(new Intent(Intent.ACTION_VIEW, contactLookupUri));
}
+ @Override
public void onCreateNewContactAction() {
}
+ @Override
public void onEditContactAction(Uri contactLookupUri) {
Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri);
Bundle extras = getIntent().getExtras();
@@ -122,30 +127,36 @@
startActivity(intent);
}
+ @Override
public void onAddToFavoritesAction(Uri contactUri) {
ContentValues values = new ContentValues(1);
values.put(Contacts.STARRED, 1);
getContentResolver().update(contactUri, values, null, null);
}
+ @Override
public void onRemoveFromFavoritesAction(Uri contactUri) {
ContentValues values = new ContentValues(1);
values.put(Contacts.STARRED, 0);
getContentResolver().update(contactUri, values, null, null);
}
+ @Override
public void onCallContactAction(Uri contactUri) {
getPhoneNumberCallInteraction().startInteraction(contactUri);
}
+ @Override
public void onSmsContactAction(Uri contactUri) {
getSendTextMessageInteraction().startInteraction(contactUri);
}
+ @Override
public void onDeleteContactAction(Uri contactUri) {
getContactDeletionInteraction().deleteContact(contactUri);
}
+ @Override
public void onFinishAction() {
onBackPressed();
}
diff --git a/src/com/android/contacts/activities/ContactSelectionActivity.java b/src/com/android/contacts/activities/ContactSelectionActivity.java
index bd2834d..938bf0a 100644
--- a/src/com/android/contacts/activities/ContactSelectionActivity.java
+++ b/src/com/android/contacts/activities/ContactSelectionActivity.java
@@ -49,14 +49,8 @@
* purposes of selecting one.
*/
public class ContactSelectionActivity extends Activity implements View.OnCreateContextMenuListener {
-
private static final String TAG = "ContactSelectionActivity";
- private static final int SUBACTIVITY_NEW_CONTACT = 1;
- private static final int SUBACTIVITY_VIEW_CONTACT = 2;
- private static final int SUBACTIVITY_DISPLAY_GROUP = 3;
- private static final int SUBACTIVITY_SEARCH = 4;
-
private ContactsIntentResolver mIntentResolver;
protected ContactEntryListFragment<?> mListFragment;
@@ -113,10 +107,12 @@
mSearchEditText = (SearchEditText)findViewById(R.id.search_src_text);
mSearchEditText.setText(mRequest.getQueryString());
mSearchEditText.setOnFilterTextListener(new OnFilterTextListener() {
+ @Override
public void onFilterChange(String queryString) {
mListFragment.setQueryString(queryString);
}
+ @Override
public void onCancelSearch() {
finish();
}
@@ -229,10 +225,12 @@
}
private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
- public void onViewContactAction(Uri contactLookupUri, boolean force) {
+ @Override
+ public void onViewContactAction(Uri contactLookupUri) {
throw new UnsupportedOperationException();
}
+ @Override
public void onCreateNewContactAction() {
Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
Bundle extras = getIntent().getExtras();
@@ -242,6 +240,7 @@
startActivity(intent);
}
+ @Override
public void onEditContactAction(Uri contactLookupUri) {
Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri);
Bundle extras = getIntent().getExtras();
@@ -251,43 +250,52 @@
startActivity(intent);
}
+ @Override
public void onAddToFavoritesAction(Uri contactUri) {
throw new UnsupportedOperationException();
}
+ @Override
public void onRemoveFromFavoritesAction(Uri contactUri) {
throw new UnsupportedOperationException();
}
+ @Override
public void onCallContactAction(Uri contactUri) {
throw new UnsupportedOperationException();
}
+ @Override
public void onSmsContactAction(Uri contactUri) {
throw new UnsupportedOperationException();
}
+ @Override
public void onDeleteContactAction(Uri contactUri) {
throw new UnsupportedOperationException();
}
+ @Override
public void onFinishAction() {
onBackPressed();
}
}
private final class ContactPickerActionListener implements OnContactPickerActionListener {
+ @Override
public void onCreateNewContactAction() {
Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
startActivityAndForwardResult(intent);
}
+ @Override
public void onPickContactAction(Uri contactUri) {
Intent intent = new Intent();
setResult(RESULT_OK, intent.setData(contactUri));
finish();
}
+ @Override
public void onShortcutIntentCreated(Intent intent) {
setResult(RESULT_OK, intent);
finish();
@@ -296,12 +304,14 @@
private final class PhoneNumberPickerActionListener implements
OnPhoneNumberPickerActionListener {
+ @Override
public void onPickPhoneNumberAction(Uri dataUri) {
Intent intent = new Intent();
setResult(RESULT_OK, intent.setData(dataUri));
finish();
}
+ @Override
public void onShortcutIntentCreated(Intent intent) {
setResult(RESULT_OK, intent);
finish();
@@ -310,6 +320,7 @@
private final class PostalAddressPickerActionListener implements
OnPostalAddressPickerActionListener {
+ @Override
public void onPickPostalAddressAction(Uri dataUri) {
Intent intent = new Intent();
setResult(RESULT_OK, intent.setData(dataUri));
diff --git a/src/com/android/contacts/list/ContactBrowseListContextMenuAdapter.java b/src/com/android/contacts/list/ContactBrowseListContextMenuAdapter.java
index 9ed6ad9..f2a53ca 100644
--- a/src/com/android/contacts/list/ContactBrowseListContextMenuAdapter.java
+++ b/src/com/android/contacts/list/ContactBrowseListContextMenuAdapter.java
@@ -48,6 +48,7 @@
this.mContactListFragment = fragment;
}
+ @Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
AdapterView.AdapterContextMenuInfo info;
try {
@@ -89,6 +90,7 @@
menu.add(0, MENU_ITEM_DELETE, 0, R.string.menu_deleteContact);
}
+ @Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info;
try {
@@ -105,7 +107,7 @@
final Uri contactUri = adapter.getContactUri(position);
switch (item.getItemId()) {
case MENU_ITEM_VIEW_CONTACT: {
- mContactListFragment.viewContact(contactUri, true);
+ mContactListFragment.viewContact(contactUri);
return true;
}
diff --git a/src/com/android/contacts/list/ContactBrowseListFragment.java b/src/com/android/contacts/list/ContactBrowseListFragment.java
index e780c5c..f99134b 100644
--- a/src/com/android/contacts/list/ContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/ContactBrowseListFragment.java
@@ -203,8 +203,8 @@
mListener.onCreateNewContactAction();
}
- public void viewContact(Uri contactUri, boolean finishEditing) {
- mListener.onViewContactAction(contactUri, finishEditing);
+ public void viewContact(Uri contactUri) {
+ mListener.onViewContactAction(contactUri);
}
public void editContact(Uri contactUri) {
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index afb748e..98c01d4 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -417,7 +417,7 @@
mAdapter.changeCursor(partitionIndex, data);
showCount(partitionIndex, data);
if (partitionIndex == mAdapter.getIndexedPartition()) {
- mAizy.readFromIndexer(mAdapter.getIndexer());
+ mAizy.setIndexer(mAdapter.getIndexer(), data.getCount());
}
// TODO should probably only restore instance state after all directories are loaded
@@ -676,8 +676,7 @@
mAizy.setListener(new ContactListAizyView.Listener() {
@Override
public void onScroll(int position) {
- mListView.smoothScrollToPositionFromTop(
- position + mListView.getHeaderViewsCount(),
+ mListView.smoothScrollToPositionFromTop(position + mListView.getHeaderViewsCount(),
0);
}
});
@@ -734,6 +733,9 @@
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
+ if (isAizyEnabled()) {
+ mAizy.listOnScroll(firstVisibleItem);
+ }
}
public void onScrollStateChanged(AbsListView view, int scrollState) {
diff --git a/src/com/android/contacts/list/ContactListAizyView.java b/src/com/android/contacts/list/ContactListAizyView.java
index d2cc279..69a10cf 100644
--- a/src/com/android/contacts/list/ContactListAizyView.java
+++ b/src/com/android/contacts/list/ContactListAizyView.java
@@ -17,16 +17,12 @@
package com.android.contacts.list;
import com.android.contacts.R;
-import com.android.contacts.util.PhonebookCollatorFactory;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Paint;
-import android.graphics.Paint.Align;
-import android.graphics.Paint.FontMetrics;
-import android.graphics.Rect;
-import android.graphics.Typeface;
+import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
@@ -36,9 +32,6 @@
import android.widget.SectionIndexer;
import android.widget.TextView;
-import java.text.Collator;
-import java.util.ArrayList;
-
/**
* A View that displays the sections given by an Indexer and their relative sizes. For
* English and similar languages, this is an A to Z list (where only the used letters are
@@ -48,51 +41,19 @@
public class ContactListAizyView extends View {
private static final String TAG = "ContactListAizyView";
- private static final int PREVIEW_TIME_DELAY_MS = 400;
+ private SectionIndexer mIndexer;
+ private int mItemCount;
+ private int[] mSectionPositions;
private Listener mListener;
+ private float mPosition;
private PopupWindow mPreviewPopupWindow;
private TextView mPreviewPopupTextView;
+ private boolean mPreviewPopupVisible;
+ private final int[] mWindowOffset = new int[2];
private ResourceValues mResourceValues;
- /**
- * True if the popup window is currently visible.
- */
- private boolean mPreviewPopupVisible;
-
- /**
- * Time when the user started tapping. This is used to calculate the time delay before fading
- * in the PopupWindow
- */
- private long mPreviewPopupStartTime;
-
- /**
- * Needed only inside {@link #onTouchEvent(MotionEvent)} to get the location of touch events.
- */
- private int[] mWindowOffset;
-
- /**
- * Needed to measure text. Used inside {@link #onDraw(Canvas)}
- */
- private final Rect bounds = new Rect();
-
- /**
- * Used and cached inside {@link #onDraw(Canvas)}
- */
- private FontMetrics mFontMetrics;
-
- /**
- * Used and cached inside {@link #onDraw(Canvas)}
- */
- private Paint mPaint;
-
- /**
- * The list of displayed sections. "Virtual" sections can be empty and therefore don't show
- * up as regular sections
- */
- private final ArrayList<VirtualSection> mVirtualSections = new ArrayList<VirtualSection>();
-
public ContactListAizyView(Context context) {
super(context);
}
@@ -109,78 +70,37 @@
protected void onAttachedToWindow() {
super.onAttachedToWindow();
- mResourceValues = new ResourceValues(getResources());
+ mResourceValues = new ResourceValues(getContext().getResources());
final LayoutInflater inflater =
(LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mPreviewPopupWindow = new PopupWindow(
inflater.inflate(R.layout.aizy_popup_window, null, false),
- (int) mResourceValues.previewWidth, (int) mResourceValues.previewHeight);
- mPreviewPopupWindow.setAnimationStyle(android.R.style.Animation_Toast);
+ mResourceValues.getPreviewWidth(), mResourceValues.getPreviewHeight());
mPreviewPopupTextView =
(TextView) mPreviewPopupWindow.getContentView().findViewById(R.id.caption);
}
- /**
- * Sets up the Aizy based on the indexer and completely reads its contents.
- * This function has to be called everytime the data is changed.
- */
- public void readFromIndexer(SectionIndexer indexer) {
- mVirtualSections.clear();
- final String alphabetString = getResources().getString(R.string.visualScrollerAlphabet);
- final String[] alphabet = alphabetString.split(";");
-
- // We expect to get 10 additional items that the base alphabet
- mVirtualSections.ensureCapacity(alphabet.length + 10);
-
- if (indexer != null) {
- // Add the real sections
- final Object[] sections = indexer.getSections();
- for (int sectionIndex = 0; sectionIndex < sections.length; sectionIndex++) {
- final Object section = sections[sectionIndex];
- final String caption = section == null ? "" : section.toString();
- final int position = indexer.getPositionForSection(sectionIndex);
- mVirtualSections.add(new VirtualSection(caption, sectionIndex, position));
- }
+ public void setIndexer(SectionIndexer indexer, int itemCount) {
+ mIndexer = indexer;
+ mItemCount = itemCount;
+ if (mIndexer == null) {
+ mSectionPositions = null;
+ return;
}
- final Collator collator = PhonebookCollatorFactory.getCollator();
-
- // Add the base alphabet if missing
- for (String caption : alphabet) {
- boolean insertAtEnd = true;
- VirtualSection previousVirtualSection = null;
- for (int i = 0; i < mVirtualSections.size(); i++) {
- final VirtualSection virtualSection = mVirtualSections.get(i);
- final String virtualSectionCaption = virtualSection.getCaption();
- final int comparison = collator.compare(virtualSectionCaption, caption);
- if (comparison == 0) {
- // element is already in the list.
- insertAtEnd = false;
- break;
- }
- if (comparison > 0) {
- // we stepped too far. the element belongs before the element at i
- insertAtEnd = false;
- final int realSectionPosition = previousVirtualSection == null ? 0
- : previousVirtualSection.getRealSectionPosition();
- mVirtualSections.add(i, new VirtualSection(caption, -1, realSectionPosition));
- break;
- }
- previousVirtualSection = virtualSection;
- }
- if (insertAtEnd) {
- final int realSectionPosition = previousVirtualSection == null ? 0
- : previousVirtualSection.getRealSectionPosition();
- mVirtualSections.add(new VirtualSection(caption, -1, realSectionPosition));
- }
+ // Read the section positions
+ final Object[] sections = mIndexer.getSections();
+ final int sectionCount = sections.length;
+ if (mSectionPositions == null || mSectionPositions.length != sectionCount) {
+ mSectionPositions = new int[sectionCount];
}
- invalidate();
+ for (int i = 0; i < sectionCount; i++) {
+ mSectionPositions[i] = mIndexer.getPositionForSection(i);
+ }
+
}
- /**
- * Sets the Listener that is called everytime the user taps on this control.
- */
public void setListener(Listener listener) {
mListener = listener;
}
@@ -192,75 +112,19 @@
@Override
protected void onDraw(Canvas canvas) {
- if (mPaint == null) {
- mPaint = new Paint();
- mPaint.setTextSize(mResourceValues.textSize);
- mPaint.setAntiAlias(true);
- mPaint.setTextAlign(Align.CENTER);
- mPaint.setTypeface(Typeface.DEFAULT_BOLD);
- }
- if (mFontMetrics == null) {
- mFontMetrics = mPaint.getFontMetrics();
- }
- final float fontHeight = mFontMetrics.descent - mFontMetrics.ascent;
- final int halfWidth = getWidth() / 2;
- // Draw
- float lastVisibleY = Float.NEGATIVE_INFINITY;
- final float sectionHeight = (float) getHeight() / mVirtualSections.size();
- for (int i = 0; i < mVirtualSections.size(); i++) {
- final VirtualSection virtualSection = mVirtualSections.get(i);
- final String caption = virtualSection.getCaption();
- if (!virtualSection.isMeasured()) {
- mPaint.getTextBounds(caption, 0, caption.length(), bounds);
- virtualSection.setMeasuredSize(-bounds.top);
- }
- final float y = i * sectionHeight;
- if (lastVisibleY + fontHeight < y) {
- mPaint.setColor(virtualSection.getRealSectionIndex() != -1
- ? mResourceValues.nonEmptySectionColor : mResourceValues.emptySectionColor);
+ if (mIndexer == null) return;
- canvas.drawText(caption, halfWidth,
- y + sectionHeight / 2 + virtualSection.getMeasuredSize() / 2, mPaint);
- lastVisibleY = y;
- }
- }
+ drawLineAndText(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
- if (mWindowOffset == null) {
- mWindowOffset = new int[2];
- getLocationInWindow(mWindowOffset);
- }
+ getLocationInWindow(mWindowOffset);
- // Not initialized? Ignore
- if (mVirtualSections.size() == 0) return true;
-
- // Scroll the list itself
- final int boundedY = Math.min(Math.max(0, (int) (event.getY())), getHeight() - 1);
- final int index = boundedY * mVirtualSections.size() / getHeight();
- final VirtualSection virtualSection = mVirtualSections.get(index);
- final int sectionY = index * getHeight() / mVirtualSections.size();
- mPreviewPopupTextView.setText(virtualSection.getCaption());
- mPreviewPopupTextView.setTextColor(virtualSection.getRealSectionIndex() != -1
- ? mResourceValues.nonEmptySectionColor : mResourceValues.emptySectionColor);
-
- // Draw popup window
final int previewX = mWindowOffset[0] + getWidth();
- final float sectionHeight = (float) getHeight() / mVirtualSections.size();
- final int previewY = (int) (sectionY + mWindowOffset[1] + (sectionHeight -
- mPreviewPopupWindow.getHeight()) / 2);
- final int actionMasked = event.getActionMasked();
- final boolean fingerIsDown = actionMasked == MotionEvent.ACTION_DOWN;
- if (fingerIsDown) {
- mPreviewPopupStartTime = System.currentTimeMillis();
- }
- final boolean fingerIsDownOrScrubbing =
- actionMasked == MotionEvent.ACTION_MOVE || actionMasked == MotionEvent.ACTION_DOWN;
-
- final boolean previewPopupVisible = fingerIsDownOrScrubbing &&
- (System.currentTimeMillis() > mPreviewPopupStartTime + PREVIEW_TIME_DELAY_MS);
-
+ final int previewY = (int) event.getY() + mWindowOffset[1]
+ - mPreviewPopupWindow.getHeight() / 2;
+ final boolean previewPopupVisible = event.getActionMasked() == MotionEvent.ACTION_MOVE;
if (previewPopupVisible != mPreviewPopupVisible) {
if (previewPopupVisible) {
mPreviewPopupWindow.showAtLocation(this, Gravity.LEFT | Gravity.TOP,
@@ -272,70 +136,88 @@
} else {
mPreviewPopupWindow.update(previewX, previewY, -1, -1);
}
+ final float yFactor = (float) getHeight() / mItemCount;
+ final int position = Math.max(0, (int) (event.getY() / yFactor));
+ if (mIndexer != null) {
+ final int index = mIndexer.getSectionForPosition(position);
+ final Object[] sections = mIndexer.getSections();
+ final String caption =
+ (index != -1 && index < sections.length) ? sections[index].toString() : "";
+ mPreviewPopupTextView.setText(caption);
+ }
- // Perform the actual scrolling
- if (mListener != null) mListener.onScroll(virtualSection.getRealSectionPosition());
+ if (mListener != null) mListener.onScroll(position);
+ super.onTouchEvent(event);
return true;
}
- /**
- * Reads an provides all values from the resource files
- */
- private static class ResourceValues {
- private final int emptySectionColor;
- private final int nonEmptySectionColor;
- private final float textSize;
- private final float previewWidth;
- private final float previewHeight;
+ private void drawLineAndText(Canvas canvas) {
+ final float yFactor = (float) getHeight() / mItemCount;
- private ResourceValues(Resources resources) {
- emptySectionColor = resources.getColor(R.color.aizy_empty_section);
- nonEmptySectionColor = resources.getColor(R.color.aizy_non_empty_section);
- textSize = resources.getDimension(R.dimen.aizy_text_size);
- previewWidth = resources.getDimension(R.dimen.aizy_preview_width);
- previewHeight = resources.getDimension(R.dimen.aizy_preview_height);
+ final Paint paint = new Paint();
+
+ paint.setColor(mResourceValues.getLineColor());
+ paint.setAntiAlias(true);
+
+ // Draw sections
+ final float centerX = getWidth() * 0.5f;
+ for (int i = 1; i < mSectionPositions.length; i++) {
+ final float y1 = mSectionPositions[i - 1] * yFactor;
+ final float y2 = mSectionPositions[i] * yFactor;
+ canvas.drawLine(
+ centerX, y1 + 1.0f,
+ centerX, y2 - 1.0f,
+ paint);
}
+
+ // Draw knob
+ final Drawable knob = mResourceValues.getKnobDrawable();
+ final int w = knob.getIntrinsicWidth();
+ final int h = knob.getIntrinsicWidth();
+ final float y = mPosition * yFactor;
+ knob.setBounds(
+ (int) (centerX - w / 2.0f), (int) (y - h / 2.0f),
+ (int) (centerX + w / 2.0f), (int) (y + h / 2.0f));
+ knob.draw(canvas);
}
- private static class VirtualSection {
- private final String mCaption;
- private final int mRealSectionIndex;
- private final int mRealSectionPosition;
- private float mMeasuredSize = Float.NaN;
+ public void listOnScroll(int firstVisibleItem) {
+ mPosition = firstVisibleItem;
+ invalidate();
+ }
- public String getCaption() {
- return mCaption;
+ private static class ResourceValues {
+ private int mLineColor;
+ private Drawable mKnobDrawable;
+ private int mPreviewWidth;
+ private int mPreviewHeight;
+
+ public int getLineColor() {
+ return mLineColor;
}
- public int getRealSectionIndex() {
- return mRealSectionIndex;
+ public Drawable getKnobDrawable() {
+ return mKnobDrawable;
}
- public int getRealSectionPosition() {
- return mRealSectionPosition;
+ public int getPreviewWidth() {
+ return mPreviewWidth;
}
- public boolean isMeasured() {
- return mMeasuredSize == Float.NaN;
+ public int getPreviewHeight() {
+ return mPreviewHeight;
}
- public void setMeasuredSize(float value) {
- mMeasuredSize = value;
- }
-
- public float getMeasuredSize() {
- return mMeasuredSize;
- }
-
- public VirtualSection(String caption, int realSectionIndex, int realSectionPosition) {
- mCaption = caption;
- mRealSectionIndex = realSectionIndex;
- mRealSectionPosition = realSectionPosition;
+ public ResourceValues(Resources resources) {
+ mLineColor = resources.getColor(R.color.aizy_line_color);
+ mKnobDrawable = resources.getDrawable(R.drawable.temp_aizy_knob);
+ mPreviewWidth = resources.getDimensionPixelSize(R.dimen.aizy_preview_width);
+ mPreviewHeight = resources.getDimensionPixelSize(R.dimen.aizy_preview_height);
}
}
public interface Listener {
void onScroll(int position);
}
-}
+}
\ No newline at end of file
diff --git a/src/com/android/contacts/list/ContactsIntentResolver.java b/src/com/android/contacts/list/ContactsIntentResolver.java
index 2386cc6..3b34cb5 100644
--- a/src/com/android/contacts/list/ContactsIntentResolver.java
+++ b/src/com/android/contacts/list/ContactsIntentResolver.java
@@ -63,8 +63,7 @@
} else if (UI.LIST_ALL_CONTACTS_ACTION.equals(action)) {
request.setActionCode(ContactsRequest.ACTION_ALL_CONTACTS);
} else if (UI.LIST_CONTACTS_WITH_PHONES_ACTION.equals(action)) {
- request.setActionCode(ContactsRequest.ACTION_DEFAULT);
- request.setDisplayWithPhoneNumbersOnly(true);
+ request.setActionCode(ContactsRequest.ACTION_CONTACTS_WITH_PHONES);
} else if (UI.LIST_STARRED_ACTION.equals(action)) {
request.setActionCode(ContactsRequest.ACTION_STARRED);
} else if (UI.LIST_FREQUENT_ACTION.equals(action)) {
diff --git a/src/com/android/contacts/list/ContactsRequest.java b/src/com/android/contacts/list/ContactsRequest.java
index 21e66ac..aefa451 100644
--- a/src/com/android/contacts/list/ContactsRequest.java
+++ b/src/com/android/contacts/list/ContactsRequest.java
@@ -32,6 +32,9 @@
/** Show all contacts */
public static final int ACTION_ALL_CONTACTS = 15;
+ /** Show all contacts with phone numbers */
+ public static final int ACTION_CONTACTS_WITH_PHONES = 17;
+
/** Show contents of a specific group */
public static final int ACTION_GROUP = 20;
@@ -77,7 +80,6 @@
private CharSequence mTitle;
private boolean mSearchMode;
private String mQueryString;
- private boolean mDisplayOnlyWithPhones;
private String mGroupName;
private boolean mLegacyCompatibilityMode;
private boolean mDirectorySearchEnabled = true;
@@ -93,7 +95,6 @@
mTitle = request.mTitle;
mSearchMode = request.mSearchMode;
mQueryString = request.mQueryString;
- mDisplayOnlyWithPhones = request.mDisplayOnlyWithPhones;
mGroupName = request.mGroupName;
mLegacyCompatibilityMode = request.mLegacyCompatibilityMode;
mDirectorySearchEnabled = request.mDirectorySearchEnabled;
@@ -115,7 +116,6 @@
request.mTitle = source.readCharSequence();
request.mSearchMode = source.readInt() != 0;
request.mQueryString = source.readString();
- request.mDisplayOnlyWithPhones = source.readInt() != 0;
request.mGroupName = source.readString();
request.mLegacyCompatibilityMode = source.readInt() != 0;
request.mDirectorySearchEnabled = source.readInt() != 0;
@@ -131,7 +131,6 @@
dest.writeCharSequence(mTitle);
dest.writeInt(mSearchMode ? 1 : 0);
dest.writeString(mQueryString);
- dest.writeInt(mDisplayOnlyWithPhones ? 1 : 0);
dest.writeString(mGroupName);
dest.writeInt(mLegacyCompatibilityMode ? 1 : 0);
dest.writeInt(mDirectorySearchEnabled ? 1 : 0);
@@ -174,14 +173,6 @@
mActionCode = actionCode;
}
- public boolean getDisplayWithPhoneNumbersOnly() {
- return mDisplayOnlyWithPhones;
- }
-
- public void setDisplayWithPhoneNumbersOnly(boolean option) {
- mDisplayOnlyWithPhones = option;
- }
-
public boolean isSearchMode() {
return mSearchMode;
}
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index 10f2290..4d66dd2 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -91,7 +91,7 @@
editContact(adapter.getContactUri(position));
}
} else {
- viewContact(adapter.getContactUri(position), false);
+ viewContact(adapter.getContactUri(position));
}
}
diff --git a/src/com/android/contacts/list/OnContactBrowserActionListener.java b/src/com/android/contacts/list/OnContactBrowserActionListener.java
index 5291639..239f8e1 100644
--- a/src/com/android/contacts/list/OnContactBrowserActionListener.java
+++ b/src/com/android/contacts/list/OnContactBrowserActionListener.java
@@ -26,9 +26,8 @@
* Opens the specified contact for viewing.
*
* @param contactLookupUri The lookup-uri of the Contact that should be opened
- * @param finishEditing The user has explicitly requested to leave the edit mode
*/
- void onViewContactAction(Uri contactLookupUri, boolean finishEditing);
+ void onViewContactAction(Uri contactLookupUri);
/**
* Creates a new contact.
diff --git a/src/com/android/contacts/list/StrequentContactListFragment.java b/src/com/android/contacts/list/StrequentContactListFragment.java
index 722e3b7..393e698 100644
--- a/src/com/android/contacts/list/StrequentContactListFragment.java
+++ b/src/com/android/contacts/list/StrequentContactListFragment.java
@@ -58,7 +58,7 @@
@Override
protected void onItemClick(int position, long id) {
ContactListAdapter adapter = getAdapter();
- viewContact(adapter.getContactUri(position), false);
+ viewContact(adapter.getContactUri(position));
}
@Override
@@ -94,6 +94,7 @@
setEmptyText(R.string.noFavoritesHelpText);
}
+ @Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
diff --git a/src/com/android/contacts/model/EntityDeltaList.java b/src/com/android/contacts/model/EntityDeltaList.java
index e68b6ef..455cced 100644
--- a/src/com/android/contacts/model/EntityDeltaList.java
+++ b/src/com/android/contacts/model/EntityDeltaList.java
@@ -141,7 +141,9 @@
// Second pass builds actual operations
for (EntityDelta delta : this) {
final int firstBatch = diff.size();
- backRefs[rawContactIndex++] = firstBatch;
+ final boolean isInsert = delta.isContactInsert();
+ backRefs[rawContactIndex++] = isInsert ? firstBatch : -1;
+
delta.buildDiff(diff);
// If the user chose to join with some other existing raw contact(s) at save time,
@@ -161,7 +163,7 @@
}
// Only create rules for inserts
- if (!delta.isContactInsert()) continue;
+ if (!isInsert) continue;
// If we are going to split all contacts, there is no point in first combining them
if (mSplitRawContacts) continue;
@@ -236,18 +238,25 @@
builder.withValue(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_SEPARATE);
Long rawContactId1 = get(index1).getValues().getAsLong(RawContacts._ID);
+ int backRef1 = backRefs[index1];
if (rawContactId1 != null && rawContactId1 >= 0) {
builder.withValue(AggregationExceptions.RAW_CONTACT_ID1, rawContactId1);
+ } else if (backRef1 >= 0) {
+ builder.withValueBackReference(AggregationExceptions.RAW_CONTACT_ID1, backRef1);
} else {
- builder.withValueBackReference(AggregationExceptions.RAW_CONTACT_ID1, backRefs[index1]);
+ return;
}
Long rawContactId2 = get(index2).getValues().getAsLong(RawContacts._ID);
+ int backRef2 = backRefs[index2];
if (rawContactId2 != null && rawContactId2 >= 0) {
builder.withValue(AggregationExceptions.RAW_CONTACT_ID2, rawContactId2);
+ } else if (backRef2 >= 0) {
+ builder.withValueBackReference(AggregationExceptions.RAW_CONTACT_ID2, backRef2);
} else {
- builder.withValueBackReference(AggregationExceptions.RAW_CONTACT_ID2, backRefs[index2]);
+ return;
}
+
diff.add(builder.build());
}
diff --git a/src/com/android/contacts/ui/QuickContactWindow.java b/src/com/android/contacts/ui/QuickContactWindow.java
index 4cf0d1d..ca40066 100644
--- a/src/com/android/contacts/ui/QuickContactWindow.java
+++ b/src/com/android/contacts/ui/QuickContactWindow.java
@@ -27,6 +27,7 @@
import com.android.contacts.util.Constants;
import com.android.contacts.util.DataStatus;
import com.android.contacts.util.NotifyingAsyncQueryHandler;
+import com.android.contacts.util.PhoneCapabilityTester;
import com.android.internal.policy.PolicyManager;
import com.google.android.collect.Sets;
@@ -768,10 +769,12 @@
// Handle well-known MIME-types with special care
if (Phone.CONTENT_ITEM_TYPE.equals(mimeType)) {
- final String number = getAsString(cursor, Phone.NUMBER);
- if (!TextUtils.isEmpty(number)) {
- final Uri callUri = Uri.fromParts(Constants.SCHEME_TEL, number, null);
- mIntent = new Intent(Intent.ACTION_CALL_PRIVILEGED, callUri);
+ if (PhoneCapabilityTester.isPhone(mContext)) {
+ final String number = getAsString(cursor, Phone.NUMBER);
+ if (!TextUtils.isEmpty(number)) {
+ final Uri callUri = Uri.fromParts(Constants.SCHEME_TEL, number, null);
+ mIntent = new Intent(Intent.ACTION_CALL_PRIVILEGED, callUri);
+ }
}
} else if (SipAddress.CONTENT_ITEM_TYPE.equals(mimeType)) {
final String address = getAsString(cursor, SipAddress.SIP_ADDRESS);
@@ -786,12 +789,13 @@
// for the SIP-related intent-filters in its manifest.
}
} else if (Constants.MIME_SMS_ADDRESS.equals(mimeType)) {
- final String number = getAsString(cursor, Phone.NUMBER);
- if (!TextUtils.isEmpty(number)) {
- final Uri smsUri = Uri.fromParts(Constants.SCHEME_SMSTO, number, null);
- mIntent = new Intent(Intent.ACTION_SENDTO, smsUri);
+ if (PhoneCapabilityTester.isSmsIntentRegistered(mContext)) {
+ final String number = getAsString(cursor, Phone.NUMBER);
+ if (!TextUtils.isEmpty(number)) {
+ final Uri smsUri = Uri.fromParts(Constants.SCHEME_SMSTO, number, null);
+ mIntent = new Intent(Intent.ACTION_SENDTO, smsUri);
+ }
}
-
} else if (Email.CONTENT_ITEM_TYPE.equals(mimeType)) {
final String address = getAsString(cursor, Email.DATA);
if (!TextUtils.isEmpty(address)) {
diff --git a/src/com/android/contacts/vcard/ImportProcessor.java b/src/com/android/contacts/vcard/ImportProcessor.java
index 14cba46..6a7dbe6 100644
--- a/src/com/android/contacts/vcard/ImportProcessor.java
+++ b/src/com/android/contacts/vcard/ImportProcessor.java
@@ -84,7 +84,7 @@
mBound = false;
}
- public void sendFinisheNotification() {
+ public void sendFinishNotification() {
try {
mMessenger.send(Message.obtain(null,
VCardService.MSG_NOTIFY_IMPORT_FINISHED,
@@ -233,7 +233,7 @@
// Currenty we don't have an appropriate way to let users see all URIs imported.
// Instead, we show one only when there's just one created uri.
doFinishNotification(mCreatedUris.size() > 0 ? mCreatedUris.get(0) : null);
- mConnection.sendFinisheNotification();
+ mConnection.sendFinishNotification();
} finally {
// TODO: verify this works fine.
mReadyForRequest = false; // Just in case.
diff --git a/src/com/android/contacts/vcard/VCardService.java b/src/com/android/contacts/vcard/VCardService.java
index b5a216e..1e855ab 100644
--- a/src/com/android/contacts/vcard/VCardService.java
+++ b/src/com/android/contacts/vcard/VCardService.java
@@ -66,7 +66,7 @@
} else {
final ImportRequest parameter = (ImportRequest)msg.obj;
- if (mImportProcessor == null) {
+ if (mImportProcessor == null || !mImportProcessor.isReadyForRequest()) {
mImportProcessor = new ImportProcessor(VCardService.this);
} else if (mImportProcessor.isCanceled()) {
Log.i(LOG_TAG,
diff --git a/src/com/android/contacts/views/detail/ContactDetailFragment.java b/src/com/android/contacts/views/detail/ContactDetailFragment.java
index b456f59..4a3f46f 100644
--- a/src/com/android/contacts/views/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/views/detail/ContactDetailFragment.java
@@ -190,9 +190,6 @@
mInflater = inflater;
mHeaderView = (ContactDetailHeaderView) view.findViewById(R.id.contact_header_widget);
- mHeaderView.setExcludeMimes(new String[] {
- Contacts.CONTENT_ITEM_TYPE
- });
mHeaderView.setListener(mHeaderViewListener);
mListView = (ListView) view.findViewById(android.R.id.list);
@@ -924,11 +921,7 @@
@Override
public void onPrepareOptionsMenu(Menu menu) {
- if (mContactData == null) {
- return;
- }
-
- boolean isDirectoryEntry = mContactData.isDirectoryEntry();
+ boolean isDirectoryEntry = mContactData != null && mContactData.isDirectoryEntry();
// Options only shows telephony-related settings (ringtone, send to voicemail).
// ==> Hide if we don't have a telephone
@@ -958,6 +951,7 @@
return true;
}
case R.id.menu_options: {
+ if (mContactData == null) return false;
final Intent intent = new Intent(mContext, ContactOptionsActivity.class);
intent.setData(mContactData.getLookupUri());
mContext.startActivity(intent);
@@ -965,6 +959,7 @@
}
case R.id.menu_share: {
if (mAllRestricted) return false;
+ if (mContactData == null) return false;
final String lookupKey = mContactData.getLookupKey();
final Uri shareUri = Uri.withAppendedPath(Contacts.CONTENT_VCARD_URI, lookupKey);
diff --git a/src/com/android/contacts/views/detail/ContactDetailHeaderView.java b/src/com/android/contacts/views/detail/ContactDetailHeaderView.java
index 8ac9ce7..16a2320 100644
--- a/src/com/android/contacts/views/detail/ContactDetailHeaderView.java
+++ b/src/com/android/contacts/views/detail/ContactDetailHeaderView.java
@@ -43,7 +43,6 @@
import android.view.View;
import android.widget.CheckBox;
import android.widget.ImageButton;
-import android.widget.QuickContactBadge;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
@@ -60,7 +59,7 @@
private TextView mDisplayNameView;
private TextView mPhoneticNameView;
private CheckBox mStarredView;
- private QuickContactBadge mPhotoView;
+ private ImageView mPhotoView;
private ImageView mPresenceView;
private View mStatusContainerView;
private TextView mStatusView;
@@ -100,7 +99,7 @@
mStarredView = (CheckBox)findViewById(R.id.star);
mStarredView.setOnClickListener(this);
- mPhotoView = (QuickContactBadge) findViewById(R.id.photo);
+ mPhotoView = (ImageView) findViewById(R.id.photo);
mPresenceView = (ImageView) findViewById(R.id.presence);
mStatusContainerView = findViewById(R.id.status_container);
@@ -116,7 +115,6 @@
*/
public void loadData(ContactLoader.Result contactData) {
mContactUri = contactData.getLookupUri();
- mPhotoView.assignContactUri(contactData.getLookupUri());
setDisplayName(contactData.getDisplayName(), contactData.getPhoneticName());
setPhoto(findPhoto(contactData));
@@ -241,15 +239,6 @@
}
/**
- * Set a list of specific MIME-types to exclude and not display. For
- * example, this can be used to hide the {@link Contacts#CONTENT_ITEM_TYPE}
- * profile icon.
- */
- public void setExcludeMimes(String[] excludeMimes) {
- mPhotoView.setExcludeMimes(excludeMimes);
- }
-
- /**
* Set all the status values to display in the header.
* @param status The status of the contact. If this is either null or empty,
* the status is cleared and the other parameters are ignored.