Merge "Use the call log to cache additional contact information."
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 9640536..e6336bc 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -254,6 +254,13 @@
<data android:mimeType="vnd.android.cursor.dir/contact" />
</intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="vnd.android.cursor.dir/person" />
+ <data android:mimeType="vnd.android.cursor.dir/contact" />
+ </intent-filter>
+
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable"
/>
@@ -480,8 +487,6 @@
<intent-filter android:label="@string/viewContactDesription">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.dir/person" />
- <data android:mimeType="vnd.android.cursor.dir/contact" />
<data android:mimeType="vnd.android.cursor.item/person" />
<data android:mimeType="vnd.android.cursor.item/contact" />
<data android:mimeType="vnd.android.cursor.item/raw_contact" />
@@ -492,7 +497,6 @@
<activity
android:name=".activities.ContactEditorActivity"
android:theme="@style/EditorActivityTheme"
- android:uiOptions="splitActionBarWhenNarrow"
android:windowSoftInputMode="adjustResize">
<intent-filter android:label="@string/editContactDescription">
diff --git a/res/layout-sw580dp-w1000dp/contact_detail_updates_fragment.xml b/res/layout-sw580dp-w1000dp/contact_detail_updates_fragment.xml
index 71c2267..5daf555 100644
--- a/res/layout-sw580dp-w1000dp/contact_detail_updates_fragment.xml
+++ b/res/layout-sw580dp-w1000dp/contact_detail_updates_fragment.xml
@@ -20,4 +20,6 @@
android:layout_height="match_parent"
android:background="@color/background_social_updates"
android:fadingEdge="none"
- android:divider="@null"/>
+ android:divider="@null"
+ android:paddingTop="@dimen/contact_detail_list_top_padding"
+ android:clipToPadding="false"/>
diff --git a/res/layout-sw580dp/contact_detail_updates_fragment.xml b/res/layout-sw580dp/contact_detail_updates_fragment.xml
index 3bcb01c..513254e 100644
--- a/res/layout-sw580dp/contact_detail_updates_fragment.xml
+++ b/res/layout-sw580dp/contact_detail_updates_fragment.xml
@@ -25,7 +25,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fadingEdge="none"
- android:divider="@null"/>
+ android:divider="@null"
+ android:paddingTop="32dip"/>
<View
android:id="@+id/alpha_overlay"
diff --git a/res/layout-sw580dp/group_editor_view.xml b/res/layout-sw580dp/group_editor_view.xml
index 7874c8c..a31a36a 100644
--- a/res/layout-sw580dp/group_editor_view.xml
+++ b/res/layout-sw580dp/group_editor_view.xml
@@ -19,8 +19,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="50dip"
- android:paddingLeft="50dip"
- android:paddingRight="100dip"
+ android:paddingLeft="64dip"
+ android:paddingRight="64dip"
android:orientation="horizontal"
android:background="@color/background_primary">
@@ -39,11 +39,12 @@
android:id="@+id/group_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:minHeight="48dip"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold"
android:inputType="textCapWords"
android:hint="@string/group_name_hint"
- android:layout_marginBottom="5dip"/>
+ android:paddingLeft="16dip"/>
</LinearLayout>
@@ -55,6 +56,11 @@
android:orientation="vertical">
<include
+ android:id="@+id/spacer"
+ layout="@layout/editor_account_header"
+ android:visibility="invisible"/>
+
+ <include
layout="@layout/group_editor_autocomplete_view"
android:id="@+id/add_member_field"/>
diff --git a/res/layout/contact_picker_content.xml b/res/layout/contact_picker_content.xml
index c30add7..14eaf15 100644
--- a/res/layout/contact_picker_content.xml
+++ b/res/layout/contact_picker_content.xml
@@ -22,7 +22,7 @@
android:orientation="vertical">
<view
- class="com.android.contacts.list.ContactEntryListView"
+ class="com.android.contacts.widget.PinnedHeaderListView"
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dip"
diff --git a/res/layout/contacts_list_content.xml b/res/layout/contacts_list_content.xml
index 4223f54..8e1289f 100644
--- a/res/layout/contacts_list_content.xml
+++ b/res/layout/contacts_list_content.xml
@@ -57,7 +57,7 @@
</LinearLayout>
<view
- class="com.android.contacts.list.ContactEntryListView"
+ class="com.android.contacts.widget.PinnedHeaderListView"
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dip"
diff --git a/res/layout/editor_account_header.xml b/res/layout/editor_account_header.xml
index 5181708..dd4bc30 100644
--- a/res/layout/editor_account_header.xml
+++ b/res/layout/editor_account_header.xml
@@ -24,7 +24,7 @@
android:orientation="horizontal"
android:paddingTop="8dip"
android:paddingBottom="8dip"
- android:paddingLeft="16dip"
+ android:paddingLeft="@dimen/account_container_left_padding"
android:paddingRight="16dip">
<LinearLayout
diff --git a/res/layout/external_group_member_item.xml b/res/layout/external_group_member_item.xml
index 5fa81d0..1fba205 100644
--- a/res/layout/external_group_member_item.xml
+++ b/res/layout/external_group_member_item.xml
@@ -18,9 +18,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:minHeight="58dip"
- android:paddingLeft="10dip">
+ android:orientation="horizontal">
<TextView
android:id="@+id/name"
@@ -31,7 +29,8 @@
android:gravity="center_vertical"
android:paddingRight="3dip"
android:textAppearance="?android:attr/textAppearanceMedium"
- android:focusable="true" />
+ android:focusable="true"
+ android:paddingLeft="@dimen/group_member_item_left_padding" />
<QuickContactBadge
android:id="@+id/badge"
diff --git a/res/layout/group_editor_autocomplete_view.xml b/res/layout/group_editor_autocomplete_view.xml
index 6b35cae..46539de 100644
--- a/res/layout/group_editor_autocomplete_view.xml
+++ b/res/layout/group_editor_autocomplete_view.xml
@@ -22,4 +22,6 @@
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?android:attr/textColorPrimary"
- android:hint="@string/enter_contact_name"/>
\ No newline at end of file
+ android:hint="@string/enter_contact_name"
+ android:minHeight="48dip"
+ android:paddingLeft="@dimen/group_editor_autocomplete_left_padding"/>
\ No newline at end of file
diff --git a/res/layout/group_editor_existing_member_list.xml b/res/layout/group_editor_existing_member_list.xml
index 9765de1..3933670 100644
--- a/res/layout/group_editor_existing_member_list.xml
+++ b/res/layout/group_editor_existing_member_list.xml
@@ -21,5 +21,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="5dip"
- android:cacheColorHint="@android:color/transparent"
- android:divider="@null" />
\ No newline at end of file
+ android:layout_marginLeft="@dimen/group_editor_member_list_left_margin"
+ android:layout_marginRight="@dimen/group_editor_member_list_right_margin"
+ android:cacheColorHint="@android:color/transparent" />
\ No newline at end of file
diff --git a/res/layout/group_editor_fragment.xml b/res/layout/group_editor_fragment.xml
index 3d72384..3a69e05 100644
--- a/res/layout/group_editor_fragment.xml
+++ b/res/layout/group_editor_fragment.xml
@@ -22,7 +22,4 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@color/background_primary"
- android:paddingTop="5dip"
- android:paddingLeft="5dip"
- android:paddingRight="5dip" />
+ android:background="@color/background_primary" />
diff --git a/res/layout/group_editor_view.xml b/res/layout/group_editor_view.xml
index 59f2986..e94b387 100644
--- a/res/layout/group_editor_view.xml
+++ b/res/layout/group_editor_view.xml
@@ -24,22 +24,30 @@
android:id="@+id/account_header"
layout="@layout/editor_account_header"/>
- <EditText
- android:id="@+id/group_name"
- android:layout_width="match_parent"
+ <LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textStyle="bold"
- android:inputType="textCapWords"
- android:hint="@string/group_name_hint"
- android:layout_marginBottom="5dip"/>
+ android:paddingLeft="8dip"
+ android:paddingRight="8dip"
+ android:orientation="vertical">
- <include
- layout="@layout/group_editor_autocomplete_view"
- android:id="@+id/add_member_field"/>
+ <EditText
+ android:id="@+id/group_name"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textStyle="bold"
+ android:inputType="textCapWords"
+ android:hint="@string/group_name_hint"
+ android:minHeight="48dip"
+ android:paddingLeft="8dip"/>
- <include
- layout="@layout/group_editor_existing_member_list"
- android:id="@android:id/list"/>
+ <include
+ layout="@layout/group_editor_autocomplete_view"
+ android:id="@+id/add_member_field"/>
+
+ <include
+ layout="@layout/group_editor_existing_member_list"
+ android:id="@android:id/list"/>
+ </LinearLayout>
</LinearLayout>
diff --git a/res/layout/group_member_item.xml b/res/layout/group_member_item.xml
index 23f02e0..518e26f 100644
--- a/res/layout/group_member_item.xml
+++ b/res/layout/group_member_item.xml
@@ -18,9 +18,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:minHeight="58dip"
- android:paddingLeft="10dip">
+ android:orientation="horizontal">
<TextView
android:id="@+id/name"
@@ -31,7 +29,8 @@
android:gravity="center_vertical"
android:paddingRight="3dip"
android:textAppearance="?android:attr/textAppearanceMedium"
- android:focusable="true" />
+ android:focusable="true"
+ android:paddingLeft="@dimen/group_member_item_left_padding" />
<QuickContactBadge
android:id="@+id/badge"
diff --git a/res/layout/join_contact_picker_list_content.xml b/res/layout/join_contact_picker_list_content.xml
index 9e72c31..1535539 100644
--- a/res/layout/join_contact_picker_list_content.xml
+++ b/res/layout/join_contact_picker_list_content.xml
@@ -36,7 +36,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<view
- class="com.android.contacts.list.ContactEntryListView"
+ class="com.android.contacts.widget.PinnedHeaderListView"
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
diff --git a/res/layout/stream_item_container.xml b/res/layout/stream_item_container.xml
index a88dd9a..6a65357 100644
--- a/res/layout/stream_item_container.xml
+++ b/res/layout/stream_item_container.xml
@@ -17,14 +17,16 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical">
+ android:orientation="vertical"
+ android:paddingLeft="@dimen/detail_update_section_side_padding"
+ android:paddingRight="@dimen/detail_update_section_side_padding">
<TableLayout
android:id="@+id/stream_item_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/detail_update_section_item_vertical_padding"
- android:paddingBottom="@dimen/detail_update_section_item_last_row_extra_vertical_padding"
+ android:paddingBottom="@dimen/detail_update_section_item_vertical_padding"
android:paddingLeft="@dimen/detail_update_section_item_horizontal_padding"
android:paddingRight="@dimen/detail_update_section_item_horizontal_padding"
android:background="?android:attr/selectableItemBackground"
@@ -34,8 +36,6 @@
android:id="@+id/horizontal_divider"
android:layout_width="match_parent"
android:layout_height="1px"
- android:layout_marginLeft="@dimen/detail_update_section_side_padding"
- android:layout_marginRight="@dimen/detail_update_section_side_padding"
android:background="?android:attr/dividerHorizontal" />
</LinearLayout>
diff --git a/res/layout/stream_item_row_image_and_text.xml b/res/layout/stream_item_row_image_and_text.xml
index 8c67ce1..ea87ff0 100644
--- a/res/layout/stream_item_row_image_and_text.xml
+++ b/res/layout/stream_item_row_image_and_text.xml
@@ -17,7 +17,8 @@
<TableRow
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ex="http://schemas.android.com/apk/res/com.android.contacts"
- android:paddingBottom="@dimen/detail_update_section_between_items_vertical_padding">
+ android:paddingBottom="@dimen/detail_update_section_between_items_vertical_padding"
+ android:paddingTop="@dimen/detail_update_section_between_items_vertical_padding">
<view
class="com.android.contacts.widget.ProportionalLayout"
@@ -45,12 +46,11 @@
android:id="@+id/stream_item_second_text"
android:orientation="vertical"
android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_height="wrap_content">
<TextView android:id="@+id/stream_item_html"
android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
+ android:layout_height="wrap_content"
android:textSize="16sp"
android:textColor="?android:attr/textColorPrimary" />
@@ -69,7 +69,8 @@
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/detail_update_section_attribution_comments_padding"
android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorSecondary" />
+ android:textColor="?android:attr/textColorSecondary"
+ android:visibility="gone" />
</LinearLayout>
</LinearLayout>
diff --git a/res/layout/updates_title.xml b/res/layout/updates_title.xml
index 78fe178..995a3b9 100644
--- a/res/layout/updates_title.xml
+++ b/res/layout/updates_title.xml
@@ -34,9 +34,7 @@
android:textAllCaps="true"
android:singleLine="true"
android:ellipsize="end"
- android:paddingLeft="8dip"
- android:paddingTop="5dip"
- android:paddingBottom="2dip" />
+ style="@style/UpdatesTitleStyle"/>
<View
android:layout_width="match_parent"
diff --git a/res/values-sw580dp-w1000dp/dimens.xml b/res/values-sw580dp-w1000dp/dimens.xml
index 34c89fc..fe03b0d 100644
--- a/res/values-sw580dp-w1000dp/dimens.xml
+++ b/res/values-sw580dp-w1000dp/dimens.xml
@@ -22,4 +22,5 @@
<dimen name="detail_header_view_margin">16dip</dimen>
<dimen name="detail_header_attribution_height">56dip</dimen>
<dimen name="detail_update_section_top_padding">48dip</dimen>
+ <dimen name="contact_detail_list_top_padding">32dip</dimen>
</resources>
diff --git a/res/values-sw580dp/dimens.xml b/res/values-sw580dp/dimens.xml
index c75ba6e..ef0e04f 100644
--- a/res/values-sw580dp/dimens.xml
+++ b/res/values-sw580dp/dimens.xml
@@ -21,7 +21,7 @@
<dimen name="editor_round_button_padding_right">16dip</dimen>
<dimen name="editor_kind_title_left_padding">16dip</dimen>
<dimen name="editor_add_field_label_left_padding">24dip</dimen>
- <dimen name="detail_item_side_margin">0dip</dimen>
+ <dimen name="detail_item_side_margin">16dip</dimen>
<dimen name="detail_item_vertical_margin">16dip</dimen>
<dimen name="detail_item_icon_margin">8dip</dimen>
<dimen name="contact_name_text_size">26sp</dimen>
@@ -32,10 +32,11 @@
<dimen name="shortcut_icon_size">64dip</dimen>
<dimen name="list_section_height">37dip</dimen>
<dimen name="group_detail_border_padding">16dip</dimen>
- <dimen name="detail_update_section_side_padding">0dip</dimen>
+ <dimen name="detail_update_section_side_padding">16dip</dimen>
<dimen name="detail_update_section_item_horizontal_padding">8dip</dimen>
- <dimen name="detail_update_section_item_vertical_padding">32dip</dimen>
- <dimen name="detail_update_section_item_last_row_extra_vertical_padding">16dip</dimen>
+ <dimen name="detail_update_section_item_vertical_padding">16dip</dimen>
+ <dimen name="detail_update_section_between_items_vertical_padding">16dip</dimen>
+ <dimen name="detail_update_section_item_last_row_extra_vertical_padding">8dip</dimen>
<dimen name="search_view_width">400dip</dimen>
<!-- Center vertically -->
<dimen name="quick_contact_top_position">-1px</dimen>
@@ -52,4 +53,16 @@
<dimen name="widget_snippet_bottom_margin">6dip</dimen>
<dimen name="widget_snippet_top_padding">6dip</dimen>
<dimen name="widget_snippet_bottom_padding">3dip</dimen>
+
+ <!-- Left padding for a group member list item -->
+ <dimen name="group_member_item_left_padding">12dip</dimen>
+ <!-- Left margin for the group member list to match the built in margin in the autocomplete asset -->
+ <dimen name="group_editor_member_list_left_margin">4dip</dimen>
+ <!-- Right margin for the group member list to match the built in margin in the autocomplete asset -->
+ <dimen name="group_editor_member_list_right_margin">4dip</dimen>
+ <!-- Account title left padding -->
+ <dimen name="account_container_left_padding">16dip</dimen>
+ <!-- Left padding of the auto complete field to line hint text up with member list -->
+ <dimen name="group_editor_autocomplete_left_padding">16dip</dimen>
+ <dimen name="contact_detail_list_top_padding">8dip</dimen>
</resources>
diff --git a/res/values-sw580dp/styles.xml b/res/values-sw580dp/styles.xml
index 4029401..5f18d22 100644
--- a/res/values-sw580dp/styles.xml
+++ b/res/values-sw580dp/styles.xml
@@ -121,4 +121,11 @@
<item name="android:windowNoDisplay">true</item>
<item name="android:windowIsFloating">true</item>
</style>
+
+ <style name="UpdatesTitleStyle">
+ <item name="android:paddingLeft">8dip</item>
+ <item name="android:layout_height">16dip</item>
+ <item name="android:layout_gravity">center_vertical</item>
+ <item name="android:gravity">center_vertical</item>
+ </style>
</resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index f5fd3bf..419e9ce 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -190,6 +190,21 @@
<!-- Border padding for the group list header for each account -->
<dimen name="group_list_header_padding">5dip</dimen>
+ <!-- Account title left padding -->
+ <dimen name="account_container_left_padding">16dip</dimen>
+
+ <!-- Left padding for a group member list item -->
+ <dimen name="group_member_item_left_padding">4dip</dimen>
+
+ <!-- Left margin for the group member list to match the built in margin in the autocomplete asset -->
+ <dimen name="group_editor_member_list_left_margin">4dip</dimen>
+
+ <!-- Right margin for the group member list to match the built in margin in the autocomplete asset -->
+ <dimen name="group_editor_member_list_right_margin">4dip</dimen>
+
+ <!-- Left padding of the auto complete field to line hint text up with member list -->
+ <dimen name="group_editor_autocomplete_left_padding">8dip</dimen>
+
<!-- Size of group list icons -->
<dimen name="group_list_icon_size">32dip</dimen>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index aa421f1..90cb071 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -265,4 +265,10 @@
<item name="android:displayOptions"></item>
</style>
+ <style name="UpdatesTitleStyle">
+ <item name="android:paddingLeft">8dip</item>
+ <item name="android:paddingTop">5dip</item>
+ <item name="android:paddingBottom">2dip</item>
+ </style>
+
</resources>
diff --git a/src/com/android/contacts/CallDetailActivity.java b/src/com/android/contacts/CallDetailActivity.java
index d7881a2..6ab4b68 100644
--- a/src/com/android/contacts/CallDetailActivity.java
+++ b/src/com/android/contacts/CallDetailActivity.java
@@ -220,7 +220,7 @@
playbackFragment.setArguments(fragmentArguments);
voicemailContainer.setVisibility(View.VISIBLE);
getFragmentManager().beginTransaction()
- .add(R.id.voicemail_container, playbackFragment).commit();
+ .add(R.id.voicemail_container, playbackFragment).commitAllowingStateLoss();
mAsyncQueryHandler.startVoicemailStatusQuery(getVoicemailUri());
markVoicemailAsRead(getVoicemailUri());
} else {
diff --git a/src/com/android/contacts/activities/ContactSelectionActivity.java b/src/com/android/contacts/activities/ContactSelectionActivity.java
index 9c6e243..fbb9b66 100644
--- a/src/com/android/contacts/activities/ContactSelectionActivity.java
+++ b/src/com/android/contacts/activities/ContactSelectionActivity.java
@@ -284,7 +284,7 @@
getFragmentManager().beginTransaction()
.replace(R.id.list_container, mListFragment)
- .commit();
+ .commitAllowingStateLoss();
}
public void setupActionListener() {
diff --git a/src/com/android/contacts/activities/DialtactsActivity.java b/src/com/android/contacts/activities/DialtactsActivity.java
index c604e99..7d96973 100644
--- a/src/com/android/contacts/activities/DialtactsActivity.java
+++ b/src/com/android/contacts/activities/DialtactsActivity.java
@@ -409,6 +409,20 @@
}
}
+ @Override
+ public void onStart() {
+ super.onStart();
+ // Force filter reload to reflect possible filter changes done via People UI.
+ //
+ // Ideally both (People/Phone) UI should share the same instance for
+ // ContactListFilterController and they should be able to receive filter change event
+ // from the same controller (Bug 5165507)
+ mContactListFilterController.onStart(true);
+ if (mSearchFragment != null) {
+ mSearchFragment.setFilter(mContactListFilterController.getFilter());
+ }
+ }
+
private void prepareSearchView() {
final View searchViewLayout =
getLayoutInflater().inflate(R.layout.dialtacts_custom_action_bar, null);
@@ -476,7 +490,7 @@
} else {
transaction.hide(mSearchFragment);
}
- transaction.commit();
+ transaction.commitAllowingStateLoss();
}
}
@@ -793,7 +807,7 @@
// Show the search fragment and hide everything else.
final FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.show(mSearchFragment);
- transaction.commit();
+ transaction.commitAllowingStateLoss();
mViewPager.setVisibility(View.GONE);
// We need to call this and onActionViewCollapsed() manually, since we are using a custom
@@ -830,7 +844,7 @@
final FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.hide(mSearchFragment);
- transaction.commit();
+ transaction.commitAllowingStateLoss();
// We want to hide SearchView and show Tabs. Also focus on previously selected one.
actionBar.setDisplayShowCustomEnabled(false);
diff --git a/src/com/android/contacts/activities/JoinContactActivity.java b/src/com/android/contacts/activities/JoinContactActivity.java
index 5ee6de2..7f22b18 100644
--- a/src/com/android/contacts/activities/JoinContactActivity.java
+++ b/src/com/android/contacts/activities/JoinContactActivity.java
@@ -95,7 +95,7 @@
getFragmentManager().beginTransaction()
.replace(R.id.list_container, mListFragment)
- .commit();
+ .commitAllowingStateLoss();
}
}
diff --git a/src/com/android/contacts/activities/NonPhoneActivity.java b/src/com/android/contacts/activities/NonPhoneActivity.java
index 26eed7c..922be47 100644
--- a/src/com/android/contacts/activities/NonPhoneActivity.java
+++ b/src/com/android/contacts/activities/NonPhoneActivity.java
@@ -48,7 +48,7 @@
final NonPhoneDialogFragment fragment = new NonPhoneDialogFragment();
fragment.setArguments(Bundle.forPair("PHONE_NUMBER", phoneNumber));
- getFragmentManager().beginTransaction().add(fragment, "Fragment").commit();
+ getFragmentManager().beginTransaction().add(fragment, "Fragment").commitAllowingStateLoss();
}
private String getPhoneNumber() {
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index a03f83f..1d3fda4 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -388,7 +388,7 @@
getFragmentManager(), findViewById(R.id.contact_detail_container),
new ContactDetailFragmentListener());
}
- transaction.commit();
+ transaction.commitAllowingStateLoss();
fragmentManager.executePendingTransactions();
// Setting Properties after fragment is created
@@ -427,7 +427,7 @@
*/
configureFragments(!mIsRecreatedInstance);
}
- mContactListFilterController.onStart();
+ mContactListFilterController.onStart(false);
super.onStart();
}
@@ -665,7 +665,7 @@
break;
}
if (!ft.isEmpty()) {
- ft.commit();
+ ft.commitAllowingStateLoss();
fragmentManager.executePendingTransactions();
// When switching tabs, we need to invalidate options menu, but executing a
// fragment transaction does it implicitly. We don't have to call invalidateOptionsMenu
@@ -816,7 +816,7 @@
@Override
public void finishUpdate(View container) {
if (mCurTransaction != null) {
- mCurTransaction.commit();
+ mCurTransaction.commitAllowingStateLoss();
mCurTransaction = null;
mFragmentManager.executePendingTransactions();
}
@@ -926,7 +926,7 @@
new ContactsUnavailableFragmentListener());
getFragmentManager().beginTransaction()
.replace(R.id.contacts_unavailable_container, mContactsUnavailableFragment)
- .commit();
+ .commitAllowingStateLoss();
} else {
mContactsUnavailableFragment.update();
}
diff --git a/src/com/android/contacts/detail/ContactDetailLayoutController.java b/src/com/android/contacts/detail/ContactDetailLayoutController.java
index f9d6443..b26f8eb 100644
--- a/src/com/android/contacts/detail/ContactDetailLayoutController.java
+++ b/src/com/android/contacts/detail/ContactDetailLayoutController.java
@@ -168,7 +168,7 @@
ContactDetailViewPagerAdapter.ABOUT_FRAGMENT_TAG);
transaction.add(R.id.updates_fragment_container, mUpdatesFragment,
ContactDetailViewPagerAdapter.UPDTES_FRAGMENT_TAG);
- transaction.commit();
+ transaction.commitAllowingStateLoss();
mFragmentManager.executePendingTransactions();
}
@@ -187,7 +187,7 @@
ContactDetailViewPagerAdapter.ABOUT_FRAGMENT_TAG);
transaction.add(R.id.updates_fragment_container, mUpdatesFragment,
ContactDetailViewPagerAdapter.UPDTES_FRAGMENT_TAG);
- transaction.commit();
+ transaction.commitAllowingStateLoss();
mFragmentManager.executePendingTransactions();
}
break;
@@ -202,7 +202,7 @@
ContactDetailViewPagerAdapter.ABOUT_FRAGMENT_TAG);
transaction.add(R.id.updates_fragment_container, mUpdatesFragment,
ContactDetailViewPagerAdapter.UPDTES_FRAGMENT_TAG);
- transaction.commit();
+ transaction.commitAllowingStateLoss();
mFragmentManager.executePendingTransactions();
}
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index 046b1ed..124cd86 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -352,8 +352,6 @@
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
- Log.d(TAG, "onActivityCreated(" + savedInstanceState + ")");
-
// Handle initial actions only when existing state missing
final boolean hasIncomingState = savedInstanceState != null;
diff --git a/src/com/android/contacts/group/GroupDetailFragment.java b/src/com/android/contacts/group/GroupDetailFragment.java
index 1164069..f54dbd6 100644
--- a/src/com/android/contacts/group/GroupDetailFragment.java
+++ b/src/com/android/contacts/group/GroupDetailFragment.java
@@ -403,10 +403,9 @@
mOptionsMenuEditable = isGroupEditable() && isVisible();
mOptionsMenuGroupPresent = isGroupPresent() && isVisible();
- // Editing a group is always possible if a group is selected
- // TODO: check for external group (member editable) buganizer #5049046
+ // Editing is not possible for read only groups
final MenuItem editMenu = menu.findItem(R.id.menu_edit_group);
- editMenu.setVisible(mOptionsMenuGroupPresent);
+ editMenu.setVisible(mOptionsMenuGroupPresent && mOptionsMenuEditable);
final MenuItem deleteMenu = menu.findItem(R.id.menu_delete_group);
deleteMenu.setVisible(mOptionsMenuEditable);
diff --git a/src/com/android/contacts/interactions/ContactDeletionInteraction.java b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
index 93bd10e..86f4eda 100644
--- a/src/com/android/contacts/interactions/ContactDeletionInteraction.java
+++ b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
@@ -123,7 +123,8 @@
fragment.setTestLoaderManager(testLoaderManager);
fragment.setContactUri(contactUri);
fragment.setFinishActivityWhenDone(finishActivityWhenDone);
- fragmentManager.beginTransaction().add(fragment, FRAGMENT_TAG).commit();
+ fragmentManager.beginTransaction().add(fragment, FRAGMENT_TAG)
+ .commitAllowingStateLoss();
} else {
fragment.setTestLoaderManager(testLoaderManager);
fragment.setContactUri(contactUri);
diff --git a/src/com/android/contacts/list/AccountFilterActivity.java b/src/com/android/contacts/list/AccountFilterActivity.java
index 02abb53..8e0f9b8 100644
--- a/src/com/android/contacts/list/AccountFilterActivity.java
+++ b/src/com/android/contacts/list/AccountFilterActivity.java
@@ -68,10 +68,6 @@
private ListView mListView;
- private static final String[] ID_PROJECTION = new String[] {BaseColumns._ID};
- private static final Uri RAW_CONTACTS_URI_LIMIT_1 = RawContacts.CONTENT_URI.buildUpon()
- .appendQueryParameter(ContactsContract.LIMIT_PARAM_KEY, "1").build();
-
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
@@ -124,7 +120,7 @@
List<AccountWithDataSet> accounts = accountTypes.getAccounts(false);
for (AccountWithDataSet account : accounts) {
AccountType accountType = accountTypes.getAccountType(account.type, account.dataSet);
- if (accountType.isExtension() && !hasAccountData(context, account)) {
+ if (accountType.isExtension() && !account.hasData(context)) {
// Hide extensions with no raw_contacts.
continue;
}
@@ -149,29 +145,6 @@
return result;
}
- private static boolean hasAccountData(Context context, AccountWithDataSet account) {
- final String BASE_SELECTION =
- RawContacts.ACCOUNT_TYPE + " = ?" + " AND " + RawContacts.ACCOUNT_NAME + " = ?";
- final String selection;
- final String[] args;
- if (TextUtils.isEmpty(account.dataSet)) {
- selection = BASE_SELECTION + " AND " + RawContacts.DATA_SET + " IS NULL";
- args = new String[] {account.type, account.name};
- } else {
- selection = BASE_SELECTION + " AND " + RawContacts.DATA_SET + " = ?";
- args = new String[] {account.type, account.name, account.dataSet};
- }
-
- final Cursor c = context.getContentResolver().query(RAW_CONTACTS_URI_LIMIT_1,
- ID_PROJECTION, selection, args, null);
- if (c == null) return false;
- try {
- return c.moveToFirst();
- } finally {
- c.close();
- }
- }
-
private class MyLoaderCallbacks implements LoaderCallbacks<List<ContactListFilter>> {
@Override
public Loader<List<ContactListFilter>> onCreateLoader(int id, Bundle args) {
diff --git a/src/com/android/contacts/list/ContactEntryListAdapter.java b/src/com/android/contacts/list/ContactEntryListAdapter.java
index ba16c17..9b968f7 100644
--- a/src/com/android/contacts/list/ContactEntryListAdapter.java
+++ b/src/com/android/contacts/list/ContactEntryListAdapter.java
@@ -242,22 +242,6 @@
mSortOrder = sortOrder;
}
- public void setNameHighlightingEnabled(boolean flag) {
- mNameHighlightingEnabled = flag;
- }
-
- public boolean isNameHighlightingEnabled() {
- return mNameHighlightingEnabled;
- }
-
- public void setTextWithHighlightingFactory(TextWithHighlightingFactory factory) {
- mTextWithHighlightingFactory = factory;
- }
-
- protected TextWithHighlightingFactory getTextWithHighlightingFactory() {
- return mTextWithHighlightingFactory;
- }
-
public void setPhotoLoader(ContactPhotoManager photoLoader) {
mPhotoLoader = photoLoader;
}
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index 4ddba75..a4163fd 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -717,11 +717,6 @@
changed = true;
}
- if (mListView instanceof ContactEntryListView) {
- ContactEntryListView listView = (ContactEntryListView)mListView;
- listView.setHighlightNamesWhenScrolling(isNameHighlightingEnabled());
- }
-
return changed;
}
@@ -756,6 +751,8 @@
"'android.R.id.list'");
}
+ mListView.setSelector(getContext().getResources().getDrawable(R.drawable.list_selector));
+
View emptyView = mView.findViewById(com.android.internal.R.id.empty);
if (emptyView != null) {
mListView.setEmptyView(emptyView);
@@ -810,30 +807,11 @@
mAdapter.setPinnedPartitionHeadersEnabled(mSearchMode);
mAdapter.setContactNameDisplayOrder(mDisplayOrder);
mAdapter.setSortOrder(mSortOrder);
- mAdapter.setNameHighlightingEnabled(isNameHighlightingEnabled());
mAdapter.setSectionHeaderDisplayEnabled(mSectionHeaderDisplayEnabled);
mAdapter.setSelectionVisible(mSelectionVisible);
mAdapter.setDirectoryResultLimit(mDirectoryResultLimit);
}
- protected boolean isNameHighlightingEnabled() {
- if (mAdapter.isNameHighlightingEnabled()) {
- return true;
- }
-
- // When sort order and display order contradict each other, we want to
- // highlight the part of the name used for sorting.
- if (mSortOrder == ContactsContract.Preferences.SORT_ORDER_PRIMARY &&
- mDisplayOrder == ContactsContract.Preferences.DISPLAY_ORDER_ALTERNATIVE) {
- return true;
- } else if (mSortOrder == ContactsContract.Preferences.SORT_ORDER_ALTERNATIVE &&
- mDisplayOrder == ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY) {
- return true;
- } else {
- return false;
- }
- }
-
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
diff --git a/src/com/android/contacts/list/ContactEntryListView.java b/src/com/android/contacts/list/ContactEntryListView.java
deleted file mode 100644
index 86e33fe..0000000
--- a/src/com/android/contacts/list/ContactEntryListView.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.list;
-
-import com.android.contacts.R;
-import com.android.contacts.widget.PinnedHeaderListView;
-import com.android.contacts.widget.TextHighlightingAnimation;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.widget.AbsListView;
-import android.widget.ListAdapter;
-
-/**
- * A custom list view for a list of contacts or contact-related entries. It handles
- * animation of names on scroll.
- */
-public class ContactEntryListView extends PinnedHeaderListView {
-
- private static final int TEXT_HIGHLIGHTING_ANIMATION_DURATION = 350;
-
- private final TextHighlightingAnimation mHighlightingAnimation =
- new ContactNameHighlightingAnimation(this, TEXT_HIGHLIGHTING_ANIMATION_DURATION);
-
- private boolean mHighlightNamesWhenScrolling;
-
- public ContactEntryListView(Context context) {
- this(context, null);
- }
-
- public ContactEntryListView(Context context, AttributeSet attrs) {
- this(context, attrs, com.android.internal.R.attr.listViewStyle);
- }
-
- public ContactEntryListView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- setSelector(getContext().getResources().getDrawable(R.drawable.list_selector));
- }
-
- public TextHighlightingAnimation getTextHighlightingAnimation() {
- return mHighlightingAnimation;
- }
-
- public boolean getHighlightNamesWhenScrolling() {
- return mHighlightNamesWhenScrolling;
- }
-
- public void setHighlightNamesWhenScrolling(boolean flag) {
- mHighlightNamesWhenScrolling = flag;
- }
-
- @Override
- public void setAdapter(ListAdapter adapter) {
- super.setAdapter(adapter);
- if (adapter instanceof ContactEntryListAdapter) {
- ((ContactEntryListAdapter)adapter)
- .setTextWithHighlightingFactory(mHighlightingAnimation);
- }
- }
-
- @Override
- public void onScrollStateChanged(AbsListView view, int scrollState) {
- super.onScrollStateChanged(view, scrollState);
- if (mHighlightNamesWhenScrolling) {
- if (scrollState != OnScrollListener.SCROLL_STATE_IDLE) {
- mHighlightingAnimation.startHighlighting();
- } else {
- mHighlightingAnimation.stopHighlighting();
- }
- }
- }
-}
diff --git a/src/com/android/contacts/list/ContactListAdapter.java b/src/com/android/contacts/list/ContactListAdapter.java
index 2e511bc..c057a48 100644
--- a/src/com/android/contacts/list/ContactListAdapter.java
+++ b/src/com/android/contacts/list/ContactListAdapter.java
@@ -222,7 +222,6 @@
ViewGroup parent) {
ContactListItemView view = new ContactListItemView(context, null);
view.setUnknownNameText(mUnknownNameText);
- view.setTextWithHighlightingFactory(getTextWithHighlightingFactory());
view.setQuickContactEnabled(isQuickContactEnabled());
view.setActivatedStateSupported(isSelectionVisible());
return view;
@@ -271,7 +270,7 @@
protected void bindName(final ContactListItemView view, Cursor cursor) {
view.showDisplayName(cursor, mDisplayNameColumnIndex, mAlternativeDisplayNameColumnIndex,
- isNameHighlightingEnabled(), getContactNameDisplayOrder());
+ false, getContactNameDisplayOrder());
view.showPhoneticName(cursor, CONTACT_PHONETIC_NAME_COLUMN_INDEX);
}
diff --git a/src/com/android/contacts/list/ContactListFilterController.java b/src/com/android/contacts/list/ContactListFilterController.java
index 87228a2..ead3a60 100644
--- a/src/com/android/contacts/list/ContactListFilterController.java
+++ b/src/com/android/contacts/list/ContactListFilterController.java
@@ -43,11 +43,15 @@
mContext = activity;
}
- public void onStart() {
- if (mFilter == null) {
+ /**
+ * @param forceFilterReload when true filter is reloaded even when there's already a cache
+ * for it.
+ */
+ public void onStart(boolean forceFilterReload) {
+ if (mFilter == null || forceFilterReload) {
mFilter = ContactListFilter.restoreDefaultPreferences(getSharedPreferences());
- mIsInitialized = true;
}
+ mIsInitialized = true;
}
public boolean isInitialized() {
diff --git a/src/com/android/contacts/list/ContactsIntentResolver.java b/src/com/android/contacts/list/ContactsIntentResolver.java
index 63cadf1..a3fa7b0 100644
--- a/src/com/android/contacts/list/ContactsIntentResolver.java
+++ b/src/com/android/contacts/list/ContactsIntentResolver.java
@@ -27,6 +27,7 @@
import android.provider.Contacts.ContactMethods;
import android.provider.Contacts.People;
import android.provider.Contacts.Phones;
+import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
@@ -145,10 +146,16 @@
request.setSearchMode(true);
}
} else if (Intent.ACTION_VIEW.equals(action)) {
- request.setActionCode(ContactsRequest.ACTION_VIEW_CONTACT);
- request.setContactUri(intent.getData());
- intent.setAction(Intent.ACTION_DEFAULT);
- intent.setData(null);
+ final String resolvedType = intent.resolveType(mContext);
+ if (ContactsContract.Contacts.CONTENT_TYPE.equals(resolvedType)
+ || android.provider.Contacts.People.CONTENT_TYPE.equals(resolvedType)) {
+ request.setActionCode(ContactsRequest.ACTION_ALL_CONTACTS);
+ } else {
+ request.setActionCode(ContactsRequest.ACTION_VIEW_CONTACT);
+ request.setContactUri(intent.getData());
+ intent.setAction(Intent.ACTION_DEFAULT);
+ intent.setData(null);
+ }
} else if (UI.FILTER_CONTACTS_ACTION.equals(action)) {
// When we get a FILTER_CONTACTS_ACTION, it represents search in the context
// of some other action. Let's retrieve the original action to provide proper
diff --git a/src/com/android/contacts/list/CustomContactListFilterActivity.java b/src/com/android/contacts/list/CustomContactListFilterActivity.java
index 26610dc..1ac1d32 100644
--- a/src/com/android/contacts/list/CustomContactListFilterActivity.java
+++ b/src/com/android/contacts/list/CustomContactListFilterActivity.java
@@ -132,6 +132,12 @@
final AccountSet accounts = new AccountSet();
for (AccountWithDataSet account : accountTypes.getAccounts(false)) {
+ final AccountType accountType = accountTypes.getAccountTypeForAccount(account);
+ if (accountType.isExtension() && !account.hasData(context)) {
+ // Extension with no data -- skip.
+ continue;
+ }
+
AccountDisplay accountDisplay =
new AccountDisplay(resolver, account.name, account.type, account.dataSet);
diff --git a/src/com/android/contacts/list/EmailAddressListAdapter.java b/src/com/android/contacts/list/EmailAddressListAdapter.java
index e1c8ea2..5f96297 100644
--- a/src/com/android/contacts/list/EmailAddressListAdapter.java
+++ b/src/com/android/contacts/list/EmailAddressListAdapter.java
@@ -120,7 +120,6 @@
ViewGroup parent) {
final ContactListItemView view = new ContactListItemView(context, null);
view.setUnknownNameText(mUnknownNameText);
- view.setTextWithHighlightingFactory(getTextWithHighlightingFactory());
view.setQuickContactEnabled(isQuickContactEnabled());
return view;
}
@@ -167,8 +166,7 @@
protected void bindName(final ContactListItemView view, Cursor cursor) {
view.showDisplayName(cursor, mDisplayNameColumnIndex, mAlternativeDisplayNameColumnIndex,
- isNameHighlightingEnabled(), getContactNameDisplayOrder());
-// view.showPhoneticName(cursor, PHONE_PHONETIC_NAME_COLUMN_INDEX);
+ false, getContactNameDisplayOrder());
}
protected void bindPhoto(final ContactListItemView view, Cursor cursor) {
diff --git a/src/com/android/contacts/list/PhoneNumberListAdapter.java b/src/com/android/contacts/list/PhoneNumberListAdapter.java
index 87fb60f..cac89b1 100644
--- a/src/com/android/contacts/list/PhoneNumberListAdapter.java
+++ b/src/com/android/contacts/list/PhoneNumberListAdapter.java
@@ -231,7 +231,6 @@
ViewGroup parent) {
final ContactListItemView view = new ContactListItemView(context, null);
view.setUnknownNameText(mUnknownNameText);
- view.setTextWithHighlightingFactory(getTextWithHighlightingFactory());
view.setQuickContactEnabled(isQuickContactEnabled());
return view;
}
@@ -240,9 +239,6 @@
protected void bindView(View itemView, int partition, Cursor cursor, int position) {
ContactListItemView view = (ContactListItemView)itemView;
- view.setHighlightedPrefix(isNameHighlightingEnabled() && isSearchMode() ?
- getUpperCaseQueryString() : null);
-
// Look at elements before and after this position, checking if contact IDs are same.
// If they have one same contact ID, it means they can be grouped.
//
@@ -317,7 +313,7 @@
protected void bindName(final ContactListItemView view, Cursor cursor) {
view.showDisplayName(cursor, mDisplayNameColumnIndex, mAlternativeDisplayNameColumnIndex,
- isNameHighlightingEnabled(), getContactNameDisplayOrder());
+ false, getContactNameDisplayOrder());
view.showPhoneticName(cursor, PHONE_PHONETIC_NAME_COLUMN_INDEX);
}
diff --git a/src/com/android/contacts/list/PhoneNumberPickerFragment.java b/src/com/android/contacts/list/PhoneNumberPickerFragment.java
index 5986b9c..2798905 100644
--- a/src/com/android/contacts/list/PhoneNumberPickerFragment.java
+++ b/src/com/android/contacts/list/PhoneNumberPickerFragment.java
@@ -56,16 +56,6 @@
private static final String KEY_FILTER = "filter";
- /**
- * Used to remember the result of {@link #setNameHighlightingEnabled(boolean)} when it is called
- * before this Fragment is attached to its parent Activity. The value will be used after
- * an actual Adapter is ready.
- *
- * Null if the Adapter is already available and thus we don't need to remember the user's
- * decision.
- */
- private Boolean mDelayedNameHighlightingEnabled;
-
public PhoneNumberPickerFragment() {
setQuickContactEnabled(false);
setPhotoLoaderEnabled(true);
@@ -191,16 +181,10 @@
if (!isLegacyCompatibilityMode()) {
PhoneNumberListAdapter adapter = new PhoneNumberListAdapter(getActivity());
adapter.setDisplayPhotos(true);
- if (mDelayedNameHighlightingEnabled != null) {
- adapter.setNameHighlightingEnabled(mDelayedNameHighlightingEnabled);
- }
return adapter;
} else {
LegacyPhoneNumberListAdapter adapter = new LegacyPhoneNumberListAdapter(getActivity());
adapter.setDisplayPhotos(true);
- if (mDelayedNameHighlightingEnabled != null) {
- adapter.setNameHighlightingEnabled(mDelayedNameHighlightingEnabled);
- }
return adapter;
}
}
@@ -251,25 +235,6 @@
mListener.onPickPhoneNumberAction(data.getData());
}
- public void setNameHighlightingEnabled(boolean highlight) {
- final Adapter adapter = getAdapter();
- // This may happen when the Fragment is not attached to its parent Activity and thus
- // parent's onCreateView() isn't called yet (where adapter will be prepared).
- // See also ContactEntryListFragment#onCreateView()
- if (adapter == null) {
- mDelayedNameHighlightingEnabled = highlight;
- } else {
- if (!isLegacyCompatibilityMode()) {
- ((PhoneNumberListAdapter) adapter).setNameHighlightingEnabled(highlight);
- } else {
- ((LegacyPhoneNumberListAdapter) adapter).setNameHighlightingEnabled(highlight);
- }
-
- // We don't want to remember the choice if the adapter is already available.
- mDelayedNameHighlightingEnabled = null;
- }
- }
-
public ContactListFilter getFilter() {
return mFilter;
}
diff --git a/src/com/android/contacts/list/PostalAddressListAdapter.java b/src/com/android/contacts/list/PostalAddressListAdapter.java
index 5642045..c9da281 100644
--- a/src/com/android/contacts/list/PostalAddressListAdapter.java
+++ b/src/com/android/contacts/list/PostalAddressListAdapter.java
@@ -109,7 +109,6 @@
ViewGroup parent) {
final ContactListItemView view = new ContactListItemView(context, null);
view.setUnknownNameText(mUnknownNameText);
- view.setTextWithHighlightingFactory(getTextWithHighlightingFactory());
view.setQuickContactEnabled(isQuickContactEnabled());
return view;
}
@@ -156,8 +155,7 @@
protected void bindName(final ContactListItemView view, Cursor cursor) {
view.showDisplayName(cursor, mDisplayNameColumnIndex, mAlternativeDisplayNameColumnIndex,
- isNameHighlightingEnabled(), getContactNameDisplayOrder());
-// view.showPhoneticName(cursor, PHONE_PHONETIC_NAME_COLUMN_INDEX);
+ false, getContactNameDisplayOrder());
}
protected void bindPhoto(final ContactListItemView view, Cursor cursor) {
diff --git a/src/com/android/contacts/model/AccountTypeManager.java b/src/com/android/contacts/model/AccountTypeManager.java
index d28d5bb..d60f355 100644
--- a/src/com/android/contacts/model/AccountTypeManager.java
+++ b/src/com/android/contacts/model/AccountTypeManager.java
@@ -85,7 +85,15 @@
public abstract List<AccountWithDataSet> getAccounts(boolean writableOnly);
- public abstract AccountType getAccountType(String accountType, String dataSet);
+ public abstract AccountType getAccountType(AccountTypeWithDataSet accountTypeWithDataSet);
+
+ public final AccountType getAccountType(String accountType, String dataSet) {
+ return getAccountType(AccountTypeWithDataSet.get(accountType, dataSet));
+ }
+
+ public final AccountType getAccountTypeForAccount(AccountWithDataSet account) {
+ return getAccountType(account.getAccountTypeWithDataSet());
+ }
/**
* @return Unmodifiable map from {@link AccountTypeWithDataSet}s to {@link AccountType}s
@@ -482,11 +490,10 @@
* Return {@link AccountType} for the given account type and data set.
*/
@Override
- public AccountType getAccountType(String accountType, String dataSet) {
+ public AccountType getAccountType(AccountTypeWithDataSet accountTypeWithDataSet) {
ensureAccountsLoaded();
synchronized (this) {
- AccountType type = mAccountTypesWithDataSets.get(
- AccountTypeWithDataSet.get(accountType, dataSet));
+ AccountType type = mAccountTypesWithDataSets.get(accountTypeWithDataSet);
return type != null ? type : mFallbackAccountType;
}
}
@@ -506,7 +513,7 @@
Map<AccountTypeWithDataSet, AccountType> accountTypesByTypeAndDataSet) {
HashMap<AccountTypeWithDataSet, AccountType> result = Maps.newHashMap();
for (AccountWithDataSet account : accounts) {
- AccountTypeWithDataSet accountTypeWithDataSet = account.getAccountTypeAndWithDataSet();
+ AccountTypeWithDataSet accountTypeWithDataSet = account.getAccountTypeWithDataSet();
AccountType type = accountTypesByTypeAndDataSet.get(accountTypeWithDataSet);
if (type == null) continue; // just in case
if (result.containsKey(accountTypeWithDataSet)) continue;
diff --git a/src/com/android/contacts/model/AccountWithDataSet.java b/src/com/android/contacts/model/AccountWithDataSet.java
index f607737..55af795 100644
--- a/src/com/android/contacts/model/AccountWithDataSet.java
+++ b/src/com/android/contacts/model/AccountWithDataSet.java
@@ -19,7 +19,14 @@
import com.android.internal.util.Objects;
import android.accounts.Account;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
import android.os.Parcel;
+import android.provider.BaseColumns;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.RawContacts;
+import android.text.TextUtils;
/**
* Wrapper for an account that includes a data set (which may be null).
@@ -29,6 +36,11 @@
public final String dataSet;
private final AccountTypeWithDataSet mAccountTypeWithDataSet;
+ private static final String[] ID_PROJECTION = new String[] {BaseColumns._ID};
+ private static final Uri RAW_CONTACTS_URI_LIMIT_1 = RawContacts.CONTENT_URI.buildUpon()
+ .appendQueryParameter(ContactsContract.LIMIT_PARAM_KEY, "1").build();
+
+
public AccountWithDataSet(String name, String type, String dataSet) {
super(name, type);
this.dataSet = dataSet;
@@ -41,10 +53,37 @@
mAccountTypeWithDataSet = AccountTypeWithDataSet.get(type, dataSet);
}
- public AccountTypeWithDataSet getAccountTypeAndWithDataSet() {
+ public AccountTypeWithDataSet getAccountTypeWithDataSet() {
return mAccountTypeWithDataSet;
}
+ /**
+ * Return {@code true} if this account has any contacts in the database.
+ * Touches DB. Don't use in the UI thread.
+ */
+ public boolean hasData(Context context) {
+ final String BASE_SELECTION =
+ RawContacts.ACCOUNT_TYPE + " = ?" + " AND " + RawContacts.ACCOUNT_NAME + " = ?";
+ final String selection;
+ final String[] args;
+ if (TextUtils.isEmpty(dataSet)) {
+ selection = BASE_SELECTION + " AND " + RawContacts.DATA_SET + " IS NULL";
+ args = new String[] {type, name};
+ } else {
+ selection = BASE_SELECTION + " AND " + RawContacts.DATA_SET + " = ?";
+ args = new String[] {type, name, dataSet};
+ }
+
+ final Cursor c = context.getContentResolver().query(RAW_CONTACTS_URI_LIMIT_1,
+ ID_PROJECTION, selection, args, null);
+ if (c == null) return false;
+ try {
+ return c.moveToFirst();
+ } finally {
+ c.close();
+ }
+ }
+
@Override
public boolean equals(Object o) {
return (o instanceof AccountWithDataSet) && super.equals(o)
diff --git a/tests/res/values/donottranslate_strings.xml b/tests/res/values/donottranslate_strings.xml
index 194b6ca..27b9176 100644
--- a/tests/res/values/donottranslate_strings.xml
+++ b/tests/res/values/donottranslate_strings.xml
@@ -28,6 +28,7 @@
<item>LIST_FREQUENT_ACTION</item>
<item>LIST_STREQUENT_ACTION</item>
<item>LIST_GROUP_ACTION</item>
+ <item>VIEW (content uri without any id)</item>
<item>ACTION_PICK: contact</item>
<item>ACTION_PICK: contact (legacy)</item>
<item>ACTION_PICK: phone</item>
diff --git a/tests/src/com/android/contacts/detail/StreamItemAdapterTest.java b/tests/src/com/android/contacts/detail/StreamItemAdapterTest.java
index 1fee9b6..09af97a 100644
--- a/tests/src/com/android/contacts/detail/StreamItemAdapterTest.java
+++ b/tests/src/com/android/contacts/detail/StreamItemAdapterTest.java
@@ -55,8 +55,8 @@
public void testGetCount_Empty() {
mAdapter.setStreamItems(createStreamItemList(0));
- // There is actually one view: the header.
- assertEquals(2, mAdapter.getCount());
+ // The header and title are gone when there are no stream items.
+ assertEquals(0, mAdapter.getCount());
}
public void testGetCount_NonEmpty() {
diff --git a/tests/src/com/android/contacts/list/ContactListItemViewTest.java b/tests/src/com/android/contacts/list/ContactListItemViewTest.java
index ccd2fb5..8372f96 100644
--- a/tests/src/com/android/contacts/list/ContactListItemViewTest.java
+++ b/tests/src/com/android/contacts/list/ContactListItemViewTest.java
@@ -19,6 +19,7 @@
import com.android.contacts.activities.PeopleActivity;
import com.android.contacts.format.SpannedTestUtils;
import com.android.contacts.format.TestTextWithHighlightingFactory;
+import com.android.contacts.util.IntegrationTestUtils;
import android.database.Cursor;
import android.database.MatrixCursor;
@@ -40,10 +41,26 @@
/** The HTML code used to mark the end of the highlighted part. */
private static final String END = "</font>";
+ private IntegrationTestUtils mUtils;
+
public ContactListItemViewTest() {
super(PeopleActivity.class);
}
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ // This test requires that the screen be turned on.
+ mUtils = new IntegrationTestUtils(getInstrumentation());
+ mUtils.acquireScreenWakeLock(getInstrumentation().getTargetContext());
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ mUtils.releaseScreenWakeLock();
+ super.tearDown();
+ }
+
public void testShowDisplayName_Simple() {
Cursor cursor = createCursor("John Doe", "Doe John");
ContactListItemView view = createView();
diff --git a/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java b/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
index 97816c2..f624113 100644
--- a/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
+++ b/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
@@ -70,6 +70,7 @@
LIST_FREQUENT_ACTION,
LIST_STREQUENT_ACTION,
LIST_GROUP_ACTION,
+ VIEW_CONTACT_WITHOUT_ID,
ACTION_PICK_CONTACT,
ACTION_PICK_CONTACT_LEGACY,
ACTION_PICK_PHONE,
@@ -409,6 +410,10 @@
startActivity(intent);
break;
}
+ case VIEW_CONTACT_WITHOUT_ID: {
+ startActivity(new Intent(Intent.ACTION_VIEW, Contacts.CONTENT_URI));
+ break;
+ }
case VIEW_CONTACT_LOOKUP: {
final long contactId = findArbitraryContactWithPhoneNumber();
final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
diff --git a/tests/src/com/android/contacts/tests/mocks/MockAccountTypeManager.java b/tests/src/com/android/contacts/tests/mocks/MockAccountTypeManager.java
index 2be662d..7a04ae3 100644
--- a/tests/src/com/android/contacts/tests/mocks/MockAccountTypeManager.java
+++ b/tests/src/com/android/contacts/tests/mocks/MockAccountTypeManager.java
@@ -25,6 +25,8 @@
import java.util.List;
import java.util.Map;
+import libcore.util.Objects;
+
/**
* A mock {@link AccountTypeManager} class.
*/
@@ -39,9 +41,10 @@
}
@Override
- public AccountType getAccountType(String accountType, String dataSet) {
+ public AccountType getAccountType(AccountTypeWithDataSet accountTypeWithDataSet) {
for (AccountType type : mTypes) {
- if (accountType.equals(type.accountType)) {
+ if (Objects.equal(accountTypeWithDataSet.accountType, type.accountType)
+ && Objects.equal(accountTypeWithDataSet.dataSet, type.dataSet)) {
return type;
}
}