Moving up avatar by 1dp (1/2)
am: da16146b91
Change-Id: I96bd6b0034c28ffaf06f63ab274d60cee7d5eebd
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index dda7590..f2bb449 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -16,8 +16,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.contacts"
- android:versionCode="10508"
- android:versionName="1.5.8">
+ android:versionCode="10509"
+ android:versionName="1.5.9">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="25" />
@@ -49,6 +49,8 @@
<uses-permission android:name="com.android.voicemail.permission.READ_VOICEMAIL" />
<!-- Following used for Contact metadata syncing -->
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
+ <!-- Following used for getting the status of the contacts sync adapter -->
+ <uses-permission android:name="android.permission.READ_SYNC_STATS" />
<uses-feature android:name="android.hardware.telephony" android:required="false"/>
diff --git a/res/drawable/account_header_background.xml b/res/drawable/account_header_background.xml
deleted file mode 100644
index af72c6d..0000000
--- a/res/drawable/account_header_background.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- ~ Copyright (C) 2016 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
- -->
-
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <shape android:shape="rectangle">
- <solid android:color="@color/list_item_account_header_border_color" />
- </shape>
- </item>
- <item android:bottom="1dp">
- <shape android:shape="rectangle">
- <solid android:color="@color/background_primary" />
- </shape>
- </item>
-</layer-list>
\ No newline at end of file
diff --git a/res/layout/empty_group_view.xml b/res/layout/empty_group_view.xml
index 6f6e3a8..76b06d7 100644
--- a/res/layout/empty_group_view.xml
+++ b/res/layout/empty_group_view.xml
@@ -10,8 +10,9 @@
<ImageView
android:id="@+id/empty_group_image"
- android:layout_width="@dimen/empty_group_view_image_width"
- android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/empty_group_view_image_height"
+ android:paddingTop="@dimen/empty_group_view_image_padding_top"
android:scaleType="centerInside"
android:adjustViewBounds="true"
android:src="@drawable/label_empty"/>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 3078976..ca2197a 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -52,7 +52,7 @@
<string name="menu_call" msgid="3992595586042260618">"Pozovi kontakt"</string>
<string name="menu_sendSMS" msgid="5535886767547006515">"Pošalji SMS kontaktu"</string>
<string name="menu_splitAggregate" msgid="2627252205317945563">"Razdvoji"</string>
- <string name="menu_editGroup" msgid="5062005185370983720">"Izmeni"</string>
+ <string name="menu_editGroup" msgid="6696843438454341063">"Ukloni kontakte"</string>
<string name="menu_renameGroup" msgid="7169512355179757182">"Preimenuj oznaku"</string>
<string name="menu_deleteGroup" msgid="1126469629233412249">"Izbriši oznaku"</string>
<string name="menu_addToGroup" msgid="3267409983764370041">"Dodaj kontakt"</string>
@@ -80,10 +80,15 @@
<item quantity="few">Kontakti su izbrisani</item>
<item quantity="other">Kontakti su izbrisani</item>
</plurals>
- <plurals name="contacts_count" formatted="false" msgid="3287407967505649458">
- <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> kontakt</item>
- <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> kontakta</item>
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> kontakata</item>
+ <plurals name="contacts_count" formatted="false" msgid="8696793457340503668">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> kontakt</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> kontakta</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> kontakata</item>
+ </plurals>
+ <plurals name="contacts_count_with_account" formatted="false" msgid="7402583111980220575">
+ <item quantity="one"><xliff:g id="COUNT_2">%d</xliff:g> kontakt · <xliff:g id="ACCOUNT_3">%s</xliff:g></item>
+ <item quantity="few"><xliff:g id="COUNT_2">%d</xliff:g> kontakta · <xliff:g id="ACCOUNT_3">%s</xliff:g></item>
+ <item quantity="other"><xliff:g id="COUNT_2">%d</xliff:g> kontakata · <xliff:g id="ACCOUNT_3">%s</xliff:g></item>
</plurals>
<string name="title_from_google" msgid="4664084747121207202">"Sa Google-a"</string>
<string name="title_from_other_accounts" msgid="8307885412426754288">"Sa <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
@@ -237,8 +242,7 @@
<string name="cancel_confirmation_dialog_keep_editing_button" msgid="7737724111972855348">"Nastavi izmene"</string>
<string name="call_type_and_date" msgid="747163730039311423">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="enter_contact_name" msgid="4594274696120278368">"Pretražite kontakte"</string>
- <!-- no translation found for title_edit_group (1889302367574226969) -->
- <skip />
+ <string name="title_edit_group" msgid="8602752287270586734">"Uklonite kontakte"</string>
<string name="local_profile_title" msgid="2021416826991393684">"Moj lokalni profil"</string>
<string name="external_profile_title" msgid="8034998767621359438">"Moj <xliff:g id="EXTERNAL_SOURCE">%1$s</xliff:g> profil"</string>
<string name="toast_displaying_all_contacts" msgid="2737388783898593875">"Prikazani su svi kontakti"</string>
diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml
index 2eee399..42d52e3 100644
--- a/res/values-be-rBY/strings.xml
+++ b/res/values-be-rBY/strings.xml
@@ -52,7 +52,8 @@
<string name="menu_call" msgid="3992595586042260618">"Выклікаць кантакт"</string>
<string name="menu_sendSMS" msgid="5535886767547006515">"Паведамленне кантакту"</string>
<string name="menu_splitAggregate" msgid="2627252205317945563">"Выдаліць сувязь"</string>
- <string name="menu_editGroup" msgid="5062005185370983720">"Рэдагаваць"</string>
+ <!-- no translation found for menu_editGroup (6696843438454341063) -->
+ <skip />
<string name="menu_renameGroup" msgid="7169512355179757182">"Перайменаваць метку"</string>
<string name="menu_deleteGroup" msgid="1126469629233412249">"Выдаліць метку"</string>
<string name="menu_addToGroup" msgid="3267409983764370041">"Дадаць кантакт"</string>
@@ -81,11 +82,17 @@
<item quantity="many">Кантакты выдалены</item>
<item quantity="other">Кантакты выдалены</item>
</plurals>
- <plurals name="contacts_count" formatted="false" msgid="3287407967505649458">
- <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> кантакт</item>
- <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> кантакты</item>
- <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> кантактаў</item>
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> кантакту</item>
+ <plurals name="contacts_count" formatted="false" msgid="8696793457340503668">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> кантакт</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> кантакты</item>
+ <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> кантактаў</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> кантакту</item>
+ </plurals>
+ <plurals name="contacts_count_with_account" formatted="false" msgid="7402583111980220575">
+ <item quantity="one"><xliff:g id="COUNT_2">%d</xliff:g> кантакт · <xliff:g id="ACCOUNT_3">%s</xliff:g></item>
+ <item quantity="few"><xliff:g id="COUNT_2">%d</xliff:g> кантакты · <xliff:g id="ACCOUNT_3">%s</xliff:g></item>
+ <item quantity="many"><xliff:g id="COUNT_2">%d</xliff:g> кантактаў · <xliff:g id="ACCOUNT_3">%s</xliff:g></item>
+ <item quantity="other"><xliff:g id="COUNT_2">%d</xliff:g> кантакту · <xliff:g id="ACCOUNT_3">%s</xliff:g></item>
</plurals>
<string name="title_from_google" msgid="4664084747121207202">"З Google"</string>
<string name="title_from_other_accounts" msgid="8307885412426754288">"З <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
@@ -243,7 +250,7 @@
<string name="cancel_confirmation_dialog_keep_editing_button" msgid="7737724111972855348">"Працягнуць рэдагаванне"</string>
<string name="call_type_and_date" msgid="747163730039311423">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="enter_contact_name" msgid="4594274696120278368">"Пошук кантактаў"</string>
- <!-- no translation found for title_edit_group (1889302367574226969) -->
+ <!-- no translation found for title_edit_group (8602752287270586734) -->
<skip />
<string name="local_profile_title" msgid="2021416826991393684">"Мой лакальны профіль"</string>
<string name="external_profile_title" msgid="8034998767621359438">"Мой профіль у <xliff:g id="EXTERNAL_SOURCE">%1$s</xliff:g>"</string>
diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml
index 67f5166..7b3d95a 100644
--- a/res/values-bs-rBA/strings.xml
+++ b/res/values-bs-rBA/strings.xml
@@ -52,7 +52,7 @@
<string name="menu_call" msgid="3992595586042260618">"Pozovi kontakt"</string>
<string name="menu_sendSMS" msgid="5535886767547006515">"Pošalji tekstualnu poruku kontaktu"</string>
<string name="menu_splitAggregate" msgid="2627252205317945563">"Razdvoji"</string>
- <string name="menu_editGroup" msgid="5062005185370983720">"Uredi"</string>
+ <string name="menu_editGroup" msgid="6696843438454341063">"Ukloni kontakte"</string>
<string name="menu_renameGroup" msgid="7169512355179757182">"Preimenuj oznaku"</string>
<string name="menu_deleteGroup" msgid="1126469629233412249">"Izbriši oznaku"</string>
<string name="menu_addToGroup" msgid="3267409983764370041">"Dodaj kontakt"</string>
@@ -80,10 +80,15 @@
<item quantity="few">Kontakti su izbrisani</item>
<item quantity="other">Kontakti su izbrisani</item>
</plurals>
- <plurals name="contacts_count" formatted="false" msgid="3287407967505649458">
- <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> kontakt</item>
- <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> kontakta</item>
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> kontakata</item>
+ <plurals name="contacts_count" formatted="false" msgid="8696793457340503668">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> kontakt</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> kontakta</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> kontakata</item>
+ </plurals>
+ <plurals name="contacts_count_with_account" formatted="false" msgid="7402583111980220575">
+ <item quantity="one"><xliff:g id="COUNT_2">%d</xliff:g> kontakt · <xliff:g id="ACCOUNT_3">%s</xliff:g></item>
+ <item quantity="few"><xliff:g id="COUNT_2">%d</xliff:g> kontakta · <xliff:g id="ACCOUNT_3">%s</xliff:g></item>
+ <item quantity="other"><xliff:g id="COUNT_2">%d</xliff:g> kontakata · <xliff:g id="ACCOUNT_3">%s</xliff:g></item>
</plurals>
<string name="title_from_google" msgid="4664084747121207202">"Sa Googlea"</string>
<string name="title_from_other_accounts" msgid="8307885412426754288">"Sa računa <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
@@ -237,8 +242,7 @@
<string name="cancel_confirmation_dialog_keep_editing_button" msgid="7737724111972855348">"Nastavi uređivanje"</string>
<string name="call_type_and_date" msgid="747163730039311423">"<xliff:g id="CALL_TYPE">%1$s</xliff:g> <xliff:g id="CALL_SHORT_DATE">%2$s</xliff:g>"</string>
<string name="enter_contact_name" msgid="4594274696120278368">"Traži kontakte"</string>
- <!-- no translation found for title_edit_group (1889302367574226969) -->
- <skip />
+ <string name="title_edit_group" msgid="8602752287270586734">"Ukloni kontakte"</string>
<string name="local_profile_title" msgid="2021416826991393684">"Moj lokalni profil"</string>
<string name="external_profile_title" msgid="8034998767621359438">"Moj profil <xliff:g id="EXTERNAL_SOURCE">%1$s</xliff:g>"</string>
<string name="toast_displaying_all_contacts" msgid="2737388783898593875">"Prikazuju se svi kontakti"</string>
diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml
index 6404cf2..e66ab0d 100644
--- a/res/values-land/dimens.xml
+++ b/res/values-land/dimens.xml
@@ -19,9 +19,13 @@
<dimen name="dialpad_digits_margin_bottom">50dip</dimen>
<dimen name="editor_type_label_width">120dip</dimen>
- <!-- Top padding for the text for empty group view-->
- <dimen name="empty_group_view_text_padding_top">20dp</dimen>
+ <!-- Top padding for the image for empty group view-->
+ <dimen name="empty_group_view_image_padding_top">0dp</dimen>
- <!-- Width for the image for empty group view-->
- <dimen name="empty_group_view_image_width">176dp</dimen>
+ <!-- Height for the image for empty group view-->
+ <dimen name="empty_group_view_image_height">150dp</dimen>
+
+ <!-- Top and Bottom padding for the text for empty group view-->
+ <dimen name="empty_group_view_text_padding_top">14dp</dimen>
+ <dimen name="empty_group_view_text_padding_bottom">10dp</dimen>
</resources>
diff --git a/res/values-land/integers.xml b/res/values-land/integers.xml
index 3e7643d..f6e9ef6 100644
--- a/res/values-land/integers.xml
+++ b/res/values-land/integers.xml
@@ -16,4 +16,7 @@
<resources>
<!-- Number of lines the QuickContact title can have -->
<integer name="quickcontact_title_lines">2</integer>
+
+ <!-- Top margin ratio for the image for empty group view-->
+ <integer name="empty_group_view_image_margin">12</integer>
</resources>
diff --git a/res/values-sw600dp-land/dimens.xml b/res/values-sw600dp-land/dimens.xml
index b4b5259..b5db99d 100644
--- a/res/values-sw600dp-land/dimens.xml
+++ b/res/values-sw600dp-land/dimens.xml
@@ -18,4 +18,11 @@
<dimen name="quick_contact_photo_container_height">180dip</dimen>
<dimen name="detail_contact_photo_size">192dip</dimen>
<dimen name="detail_contact_photo_margin">16dip</dimen>
+
+ <!-- Height for the image for empty group view-->
+ <dimen name="empty_group_view_image_height">180dp</dimen>
+
+ <!-- Top and Bottom padding for the text for empty group view-->
+ <dimen name="empty_group_view_text_padding_top">32dp</dimen>
+ <dimen name="empty_group_view_text_padding_bottom">16dp</dimen>
</resources>
diff --git a/res/values-sw600dp-land/integers.xml b/res/values-sw600dp-land/integers.xml
index 0ee0135..f5f713a 100644
--- a/res/values-sw600dp-land/integers.xml
+++ b/res/values-sw600dp-land/integers.xml
@@ -20,4 +20,7 @@
<!-- Layout weight of ListViews in PeopleActivityfor tile favorites list and all
contacts list in PeopleActivity -->
<integer name="contact_list_card_layout_weight">6</integer>
+
+ <!-- Top margin ratio for the image for empty group view-->
+ <integer name="empty_group_view_image_margin">8</integer>
</resources>
diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml
index 0d4d820..65f75e1 100644
--- a/res/values-sw600dp/dimens.xml
+++ b/res/values-sw600dp/dimens.xml
@@ -48,4 +48,7 @@
<!-- End margin of edit group title -->
<dimen name="edit_group_end_margin">80dp</dimen>
+
+ <!-- Top padding for the image for empty group view-->
+ <dimen name="empty_group_view_image_padding_top">0dp</dimen>
</resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 8089a2e..f1b6f06 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -60,9 +60,6 @@
<!-- Background color of pinned header items. -->
<color name="list_item_pinned_header_color">@color/background_primary</color>
- <!-- 8% black. -->
- <color name="list_item_account_header_border_color">#15000000</color>
-
<!-- Color of the mime-type icons inside the editor. 50% black. -->
<color name="editor_icon_color">#7f7f7f</color>
@@ -84,4 +81,9 @@
<!-- Color of background of all empty states. -->
<color name="empty_state_background">#efefef</color>
+ <!-- Colors of swipeRefreshLayout's spinning circle. -->
+ <color name="swipe_refresh_color1">#0f9d58</color>
+ <color name="swipe_refresh_color2">#dd4b37</color>
+ <color name="swipe_refresh_color3">#4285f4</color>
+ <color name="swipe_refresh_color4">#f4b400</color>
</resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index f577f50..171c9d5 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -276,16 +276,25 @@
<dimen name="nav_activity_horizontal_margin">16dp</dimen>
<dimen name="nav_activity_vertical_margin">16dp</dimen>
+ <!-- Top padding for the image for empty group view-->
+ <dimen name="empty_group_view_image_padding_top">8dp</dimen>
+
+ <!-- Height for the image for empty group view-->
+ <dimen name="empty_group_view_image_height">180dp</dimen>
+
<!-- Top and Bottom padding for the text for empty group view-->
<dimen name="empty_group_view_text_padding_top">32dp</dimen>
<dimen name="empty_group_view_text_padding_bottom">16dp</dimen>
- <!-- Width for the image for empty group view-->
- <dimen name="empty_group_view_image_width">232dp</dimen>
-
<!-- End margin of edit group title -->
<dimen name="edit_group_end_margin">72dp</dimen>
<!-- Minimum height for group name EditText -->
<dimen name="group_name_edit_text_min_height">48dp</dimen>
+
+ <!-- Distance to pull down before causing a refresh. -->
+ <dimen name="pull_to_refresh_distance">40dp</dimen>
+
+ <!-- Elevation of contact list header -->
+ <dimen name="contact_list_header_elevation">2dp</dimen>
</resources>
diff --git a/res/values/integers.xml b/res/values/integers.xml
index c1d0e11..26e72a5 100644
--- a/res/values/integers.xml
+++ b/res/values/integers.xml
@@ -28,4 +28,6 @@
<!-- Fade in/out duration of search and selection -->
<integer name="action_bar_animation_duration">195</integer>
+ <!-- Top margin ratio for the image for empty group view-->
+ <integer name="empty_group_view_image_margin">6</integer>
</resources>
diff --git a/src/com/android/contacts/ContactSaveService.java b/src/com/android/contacts/ContactSaveService.java
index b68d34c..8683809 100755
--- a/src/com/android/contacts/ContactSaveService.java
+++ b/src/com/android/contacts/ContactSaveService.java
@@ -1142,7 +1142,8 @@
/**
* Creates an intent that can be sent to this service to split a contact into it's constituent
- * pieces.
+ * pieces. This will set the raw contact ids to TYPE_AUTOMATIC for AggregationExceptions so
+ * they may be re-merged by the auto-aggregator.
*/
public static Intent createSplitContactIntent(Context context, long[][] rawContactIds,
ResultReceiver receiver) {
@@ -1193,7 +1194,7 @@
}
/**
- * Adds insert aggregation exception ContentProviderOperations between {@param rawContactIds1}
+ * Insert aggregation exception ContentProviderOperations between {@param rawContactIds1}
* and {@param rawContactIds2} to {@param operations}.
* @return false if an error occurred, true otherwise.
*/
@@ -1546,13 +1547,13 @@
}
/**
- * Construct a {@link AggregationExceptions#TYPE_KEEP_SEPARATE} ContentProviderOperation.
+ * Construct a {@link AggregationExceptions#TYPE_AUTOMATIC} ContentProviderOperation.
*/
private void buildSplitContactDiff(ArrayList<ContentProviderOperation> operations,
long rawContactId1, long rawContactId2) {
final Builder builder =
ContentProviderOperation.newUpdate(AggregationExceptions.CONTENT_URI);
- builder.withValue(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_SEPARATE);
+ builder.withValue(AggregationExceptions.TYPE, AggregationExceptions.TYPE_AUTOMATIC);
builder.withValue(AggregationExceptions.RAW_CONTACT_ID1, rawContactId1);
builder.withValue(AggregationExceptions.RAW_CONTACT_ID2, rawContactId2);
operations.add(builder.build());
diff --git a/src/com/android/contacts/ContactsDrawerActivity.java b/src/com/android/contacts/ContactsDrawerActivity.java
index a12d0e1..6ae6a59 100644
--- a/src/com/android/contacts/ContactsDrawerActivity.java
+++ b/src/com/android/contacts/ContactsDrawerActivity.java
@@ -43,6 +43,7 @@
import android.view.SubMenu;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.LinearLayout;
import android.widget.Toast;
import com.android.contacts.activities.GroupMembersActivity;
@@ -53,6 +54,7 @@
import com.android.contacts.common.list.ContactListFilter;
import com.android.contacts.common.list.ContactListFilterController;
import com.android.contacts.common.model.AccountTypeManager;
+import com.android.contacts.common.model.account.AccountType;
import com.android.contacts.common.model.account.AccountWithDataSet;
import com.android.contacts.common.preference.ContactsPreferenceActivity;
import com.android.contacts.common.util.AccountFilterUtil;
@@ -488,6 +490,16 @@
menuItem.setIcon(filter.icon);
// Get rid of the default menu item overlay and show original account icons.
menuItem.getIcon().setColorFilter(Color.TRANSPARENT, PorterDuff.Mode.SRC_ATOP);
+ // Create a dummy action view to attach extra hidden content description to the menuItem
+ // for Talkback. We want Talkback to read out the account type but not have it be part
+ // of the menuItem title.
+ final AccountType account = AccountTypeManager.getInstance(this)
+ .getAccountType(filter.accountType, filter.dataSet);
+ LinearLayout view = (LinearLayout) LayoutInflater.from(this)
+ .inflate(R.layout.account_type_info, null);
+ view.setContentDescription(account.getDisplayLabel(this));
+ view.setVisibility(View.VISIBLE);
+ menuItem.setActionView(view);
}
if (getContactListFilter() != null) {
diff --git a/src/com/android/contacts/activities/ContactSelectionActivity.java b/src/com/android/contacts/activities/ContactSelectionActivity.java
index d1f05f6..ab25dc8 100644
--- a/src/com/android/contacts/activities/ContactSelectionActivity.java
+++ b/src/com/android/contacts/activities/ContactSelectionActivity.java
@@ -683,11 +683,11 @@
return;
}
- if (mIsSearchMode) {
+ if (isSelectionMode()) {
+ mActionBarAdapter.setSelectionMode(false);
+ } else if (mIsSearchMode) {
mIsSearchMode = false;
configureSearchMode();
- } else if (isSelectionMode()) {
- mActionBarAdapter.setSelectionMode(false);
} else {
super.onBackPressed();
}
diff --git a/src/com/android/contacts/activities/GroupMembersActivity.java b/src/com/android/contacts/activities/GroupMembersActivity.java
index edd93dd..f8efa85 100644
--- a/src/com/android/contacts/activities/GroupMembersActivity.java
+++ b/src/com/android/contacts/activities/GroupMembersActivity.java
@@ -25,7 +25,6 @@
import android.os.Bundle;
import android.provider.ContactsContract.RawContacts;
import android.support.v4.view.GravityCompat;
-import android.support.v7.app.ActionBar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 756aeb4..4d0f033 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -21,13 +21,16 @@
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.ActivityNotFoundException;
+import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Intent;
+import android.content.SyncStatusObserver;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
+import android.os.Handler;
import android.os.Parcelable;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Intents;
@@ -37,6 +40,7 @@
import android.support.v4.view.GravityCompat;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
+import android.support.v4.widget.SwipeRefreshLayout;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyCharacterMap;
@@ -55,6 +59,7 @@
import com.android.contacts.ContactsDrawerActivity;
import com.android.contacts.R;
import com.android.contacts.activities.ActionBarAdapter.TabState;
+import com.android.contacts.common.Experiments;
import com.android.contacts.common.activity.RequestPermissionsActivity;
import com.android.contacts.common.compat.CompatUtils;
import com.android.contacts.common.interactions.ImportExportDialogFragment;
@@ -74,6 +79,7 @@
import com.android.contacts.common.util.Constants;
import com.android.contacts.common.util.ImplicitIntentsUtil;
import com.android.contacts.common.widget.FloatingActionButtonController;
+import com.android.contacts.commonbind.experiments.Flags;
import com.android.contacts.editor.EditorIntents;
import com.android.contacts.interactions.ContactDeletionInteraction;
import com.android.contacts.interactions.ContactMultiDeletionInteraction;
@@ -87,6 +93,7 @@
import com.android.contacts.list.OnContactsUnavailableActionListener;
import com.android.contacts.quickcontact.QuickContactActivity;
import com.android.contacts.util.DialogManager;
+import com.android.contacts.util.SyncUtil;
import java.util.List;
import java.util.Locale;
@@ -164,6 +171,53 @@
private final int mInstanceId;
private static final AtomicInteger sNextInstanceId = new AtomicInteger();
+ private Object mStatusChangeListenerHandle;
+
+ private final Handler mHandler = new Handler();
+
+ private SyncStatusObserver mSyncStatusObserver = new SyncStatusObserver() {
+ public void onStatusChanged(int which) {
+ mHandler.post(new Runnable() {
+ public void run() {
+ onSyncStateUpdated();
+ }
+ });
+ }
+ };
+
+ // Update sync status for accounts in current ContactListFilter
+ private void onSyncStateUpdated() {
+ if (mActionBarAdapter.isSearchMode()) {
+ return;
+ }
+
+ final ContactListFilter filter = mContactListFilterController.getFilter();
+ if (filter != null) {
+ final SwipeRefreshLayout swipeRefreshLayout = mAllFragment.getSwipeRefreshLayout();
+ if (swipeRefreshLayout == null) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Can not load swipeRefreshLayout, swipeRefreshLayout is null");
+ }
+ return;
+ }
+
+ final List<AccountWithDataSet> accounts = AccountTypeManager.getInstance(this)
+ .getAccounts(/* contactsWritableOnly */ true);
+ final List<Account> syncableAccounts = filter.getSyncableAccounts(accounts);
+ // If one of the accounts is active or pending, use spinning circle to indicate one of
+ // the syncs is in progress.
+ if (syncableAccounts != null && syncableAccounts.size() > 0) {
+ for (Account account: syncableAccounts) {
+ if (SyncUtil.isSyncStatusPendingOrActive(account)) {
+ swipeRefreshLayout.setRefreshing(true);
+ return;
+ }
+ }
+ }
+ swipeRefreshLayout.setRefreshing(false);
+ }
+ }
+
public PeopleActivity() {
mInstanceId = sNextInstanceId.getAndIncrement();
mIntentResolver = new ContactsIntentResolver(this);
@@ -397,6 +451,11 @@
mOptionsMenuContactsAvailable = false;
mProviderStatusWatcher.stop();
super.onPause();
+
+ if (Flags.getInstance(this).getBoolean(Experiments.PULL_TO_REFRESH)) {
+ ContentResolver.removeStatusChangeListener(mStatusChangeListenerHandle);
+ onSyncStateUpdated();
+ }
}
@Override
@@ -416,6 +475,15 @@
// Current tab may have changed since the last onSaveInstanceState(). Make sure
// the actual contents match the tab.
updateFragmentsVisibility();
+
+ if (Flags.getInstance(this).getBoolean(Experiments.PULL_TO_REFRESH)) {
+ mStatusChangeListenerHandle = ContentResolver.addStatusChangeListener(
+ ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE
+ | ContentResolver.SYNC_OBSERVER_TYPE_PENDING
+ | ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS,
+ mSyncStatusObserver);
+ onSyncStateUpdated();
+ }
}
@Override
@@ -1420,6 +1488,32 @@
.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
}
}
+
+ // Determine whether the account has pullToRefresh feature
+ if (Flags.getInstance(this).getBoolean(Experiments.PULL_TO_REFRESH)) {
+ setSwipeRefreshLayoutEnabledOrNot(filter);
+ }
+ }
+
+ private void setSwipeRefreshLayoutEnabledOrNot(ContactListFilter filter) {
+ final SwipeRefreshLayout swipeRefreshLayout = mAllFragment.getSwipeRefreshLayout();
+ if (swipeRefreshLayout == null) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Can not load swipeRefreshLayout, swipeRefreshLayout is null");
+ }
+ return;
+ }
+
+ swipeRefreshLayout.setRefreshing(false);
+ swipeRefreshLayout.setEnabled(false);
+
+ if (filter != null && !mActionBarAdapter.isSearchMode()) {
+ final List<AccountWithDataSet> accounts = AccountTypeManager.getInstance(this)
+ .getAccounts(/* contactsWritableOnly */ true);
+ if (filter.isSyncable(accounts)) {
+ swipeRefreshLayout.setEnabled(true);
+ }
+ }
}
private String getActionBarTitleForAccount(ContactListFilter filter) {
diff --git a/src/com/android/contacts/group/GroupMembersAdapter.java b/src/com/android/contacts/group/GroupMembersAdapter.java
index 622db67..af1f61e 100644
--- a/src/com/android/contacts/group/GroupMembersAdapter.java
+++ b/src/com/android/contacts/group/GroupMembersAdapter.java
@@ -73,8 +73,8 @@
public GroupMembersAdapter(Context context) {
super(context, GroupMembersQuery.CONTACT_ID);
+
mUnknownNameText = context.getText(R.string.missing_name);
- setSectionHeaderDisplayEnabled(true);
}
/** Sets the ID of the group whose members will be displayed. */
@@ -83,7 +83,7 @@
}
/** Returns the lookup Uri for the contact at the given position in the underlying cursor. */
- public Uri getContactLookupUri(int position) {
+ public Uri getContactUri(int position) {
final Cursor cursor = (Cursor) getItem(position);
final long contactId = cursor.getLong(GroupMembersQuery.CONTACT_ID);
final String lookupKey = cursor.getString(GroupMembersQuery.CONTACT_LOOKUP_KEY);
@@ -135,13 +135,6 @@
return ((Cursor) getItem(position)).getString(GroupMembersQuery.CONTACT_DISPLAY_NAME);
}
- public Uri getContactUri(int position) {
- final Cursor cursor = (Cursor) getItem(position);
- final long contactId = cursor.getLong(GroupMembersQuery.CONTACT_ID);
- final String lookupKey = cursor.getString(GroupMembersQuery.CONTACT_LOOKUP_KEY);
- return Contacts.getLookupUri(contactId, lookupKey);
- }
-
@Override
protected ContactListItemView newView(Context context, int partition, Cursor cursor,
int position, ViewGroup parent) {
@@ -155,7 +148,6 @@
protected void bindView(View v, int partition, Cursor cursor, int position) {
super.bindView(v, partition, cursor, position);
final ContactListItemView view = (ContactListItemView) v;
- bindViewId(view, cursor, GroupMembersQuery.CONTACT_ID);
bindSectionHeaderAndDivider(view, position);
bindName(view, cursor);
bindPhoto(view, cursor);
diff --git a/src/com/android/contacts/group/GroupMembersFragment.java b/src/com/android/contacts/group/GroupMembersFragment.java
index 266e5fc..276a7e9 100644
--- a/src/com/android/contacts/group/GroupMembersFragment.java
+++ b/src/com/android/contacts/group/GroupMembersFragment.java
@@ -17,7 +17,6 @@
import android.app.Activity;
import android.app.LoaderManager.LoaderCallbacks;
-import android.content.Context;
import android.content.CursorLoader;
import android.content.Loader;
import android.content.res.Configuration;
@@ -162,8 +161,15 @@
@Override
public boolean moveToPosition(int position) {
- if (position >= mCount || position < 0) return false;
- return super.moveToPosition(mIndex[position]);
+ if (position >= mCount) {
+ mPos = mCount;
+ return false;
+ } else if (position < 0) {
+ mPos = -1;
+ return false;
+ }
+ mPos = mIndex[position];
+ return super.moveToPosition(mPos);
}
@Override
@@ -364,11 +370,9 @@
final Resources resources = getContext().getResources();
final DisplayMetrics metrics = resources.getDisplayMetrics();
final int height = metrics.heightPixels;
- if (resources.getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
- params.setMargins(0, height / 8, 0, 0);
- } else {
- params.setMargins(0, height / 6, 0, 0);
- }
+
+ params.setMargins(0,
+ height / getResources().getInteger(R.integer.empty_group_view_image_margin), 0, 0);
params.gravity = Gravity.CENTER_HORIZONTAL;
image.setLayoutParams(params);
@@ -397,8 +401,7 @@
return;
}
if (mListener != null) {
- final Uri contactLookupUri = getAdapter().getContactLookupUri(position);
- mListener.onGroupMemberListItemClicked(position, contactLookupUri);
+ mListener.onGroupMemberListItemClicked(position, uri);
}
}
diff --git a/src/com/android/contacts/list/ContactBrowseListFragment.java b/src/com/android/contacts/list/ContactBrowseListFragment.java
index 2060068..da33b55 100644
--- a/src/com/android/contacts/list/ContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/ContactBrowseListFragment.java
@@ -92,7 +92,7 @@
private boolean mSelectionVerified;
private int mLastSelectedPosition = -1;
private boolean mRefreshingContactUri;
- private ContactListFilter mFilter;
+ protected ContactListFilter mFilter;
private String mPersistentSelectionPrefix = PERSISTENT_SELECTION_PREFIX;
protected OnContactBrowserActionListener mListener;
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index 8fdce75..41917a5 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -15,11 +15,16 @@
*/
package com.android.contacts.list;
+import android.accounts.Account;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
+import android.os.Bundle;
+import android.provider.ContactsContract;
+import android.support.v4.widget.SwipeRefreshLayout;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
@@ -29,13 +34,19 @@
import android.widget.TextView;
import com.android.contacts.R;
+import com.android.contacts.common.Experiments;
import com.android.contacts.common.list.ContactListAdapter;
import com.android.contacts.common.list.ContactListFilter;
import com.android.contacts.common.list.ContactListFilterController;
import com.android.contacts.common.list.ContactListItemView;
import com.android.contacts.common.list.DefaultContactListAdapter;
import com.android.contacts.common.list.FavoritesAndContactsLoader;
+import com.android.contacts.common.model.AccountTypeManager;
import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.commonbind.experiments.Flags;
+import com.android.contacts.util.SyncUtil;
+
+import java.util.List;
/**
* Fragment containing a contact list used for browsing (as compared to
@@ -45,6 +56,7 @@
private View mSearchHeaderView;
private View mSearchProgress;
private TextView mSearchProgressText;
+ private SwipeRefreshLayout mSwipeRefreshLayout;
public DefaultContactBrowseListFragment() {
setPhotoLoaderEnabled(true);
@@ -119,6 +131,10 @@
protected void onCreateView(LayoutInflater inflater, ViewGroup container) {
super.onCreateView(inflater, container);
+ if (Flags.getInstance(getActivity()).getBoolean(Experiments.PULL_TO_REFRESH)) {
+ initSwipeRefreshLayout();
+
+ }
// Putting the header view inside a container will allow us to make
// it invisible later. See checkHeaderViewVisibility()
FrameLayout headerContainer = new FrameLayout(inflater.getContext());
@@ -131,6 +147,50 @@
mSearchProgressText = (TextView) mSearchHeaderView.findViewById(R.id.totalContactsText);
}
+ private void initSwipeRefreshLayout() {
+ mSwipeRefreshLayout = (SwipeRefreshLayout) mView.findViewById(R.id.swipe_refresh);
+ if (mSwipeRefreshLayout == null) {
+ return;
+ }
+
+ mSwipeRefreshLayout.setEnabled(true);
+ // Request sync contacts
+ mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+ @Override
+ public void onRefresh() {
+ syncContacts(mFilter);
+ }
+ });
+ mSwipeRefreshLayout.setColorSchemeResources(
+ R.color.swipe_refresh_color1,
+ R.color.swipe_refresh_color2,
+ R.color.swipe_refresh_color3,
+ R.color.swipe_refresh_color4);
+ mSwipeRefreshLayout.setDistanceToTriggerSync(
+ (int) getResources().getDimension(R.dimen.pull_to_refresh_distance));
+ }
+
+ /** Request sync for Google accounts(not include Google+ accounts) in filter. */
+ private void syncContacts(ContactListFilter filter) {
+ if (filter == null) {
+ return;
+ }
+ final Bundle bundle = new Bundle();
+ bundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
+ bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
+
+ final List<AccountWithDataSet> accounts = AccountTypeManager.getInstance(
+ getActivity()).getAccounts(/* contactsWritableOnly */ true);
+ final List<Account> syncableAccounts = filter.getSyncableAccounts(accounts);
+ if (syncableAccounts != null && syncableAccounts.size() > 0) {
+ for (Account account : syncableAccounts) {
+ if (!SyncUtil.isSyncStatusPendingOrActive(account)) {
+ ContentResolver.requestSync(account, ContactsContract.AUTHORITY, bundle);
+ }
+ }
+ }
+ }
+
@Override
protected void setSearchMode(boolean flag) {
super.setSearchMode(flag);
@@ -179,4 +239,8 @@
}
}
}
+
+ public SwipeRefreshLayout getSwipeRefreshLayout() {
+ return mSwipeRefreshLayout;
+ }
}
\ No newline at end of file
diff --git a/src/com/android/contacts/list/GroupMemberPickerFragment.java b/src/com/android/contacts/list/GroupMemberPickerFragment.java
index 519a6a9..6f4d0c0 100644
--- a/src/com/android/contacts/list/GroupMemberPickerFragment.java
+++ b/src/com/android/contacts/list/GroupMemberPickerFragment.java
@@ -148,8 +148,15 @@
@Override
public boolean moveToPosition(int position) {
- if (position >= mCount || position < 0) return false;
- return super.moveToPosition(mIndex[position]);
+ if (position >= mCount) {
+ mPos = mCount;
+ return false;
+ } else if (position < 0) {
+ mPos = -1;
+ return false;
+ }
+ mPos = mIndex[position];
+ return super.moveToPosition(mPos);
}
@Override
diff --git a/src/com/android/contacts/list/MultiSelectContactsListFragment.java b/src/com/android/contacts/list/MultiSelectContactsListFragment.java
index 2612cf2..937d4c2 100644
--- a/src/com/android/contacts/list/MultiSelectContactsListFragment.java
+++ b/src/com/android/contacts/list/MultiSelectContactsListFragment.java
@@ -30,12 +30,13 @@
import android.content.Context;
import android.database.Cursor;
-import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.provider.ContactsContract;
+import android.support.v4.view.ViewCompat;
import android.util.Log;
import android.view.View;
+import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.widget.AbsListView;
import android.widget.ImageView;
@@ -291,11 +292,10 @@
return;
}
if (firstVisibleItem == 0) {
- accountFilterContainer.setBackground(
- new ColorDrawable(getResources().getColor(R.color.background_primary)));
+ ViewCompat.setElevation(accountFilterContainer, 0);
} else {
- accountFilterContainer.setBackground(
- getResources().getDrawable(R.drawable.account_header_background));
+ ViewCompat.setElevation(accountFilterContainer,
+ getResources().getDimension(R.dimen.contact_list_header_elevation));
}
}
@@ -343,10 +343,49 @@
final Drawable icon = accountType != null ? accountType.getDisplayIcon(context) : null;
final ImageView accountFilterHeaderIcon = (ImageView) accountFilterContainer
.findViewById(R.id.account_filter_icon);
+
+ // If it's a writable Google account, we set icon size as 24dp; otherwise, we set it as
+ // 20dp. And we need to change margin accordingly. This is because the Google icon looks
+ // smaller when the icons are of the same size.
+ if (accountType instanceof GoogleAccountType) {
+ accountFilterHeaderIcon.getLayoutParams().height = getResources()
+ .getDimensionPixelOffset(R.dimen.contact_browser_list_header_icon_size);
+ accountFilterHeaderIcon.getLayoutParams().width =
+ accountFilterHeaderIcon.getLayoutParams().height;
+
+ setMargins(accountFilterHeaderIcon,
+ getResources().getDimensionPixelOffset(
+ R.dimen.contact_browser_list_header_icon_left_margin),
+ getResources().getDimensionPixelOffset(
+ R.dimen.contact_browser_list_header_icon_right_margin));
+ } else {
+ accountFilterHeaderIcon.getLayoutParams().height = getResources()
+ .getDimensionPixelOffset(R.dimen.contact_browser_list_header_icon_size_alt);
+ accountFilterHeaderIcon.getLayoutParams().width =
+ accountFilterHeaderIcon.getLayoutParams().height;
+
+ setMargins(accountFilterHeaderIcon,
+ getResources().getDimensionPixelOffset(
+ R.dimen.contact_browser_list_header_icon_left_margin_alt),
+ getResources().getDimensionPixelOffset(
+ R.dimen.contact_browser_list_header_icon_right_margin_alt));
+ }
+ accountFilterHeaderIcon.requestLayout();
+
accountFilterHeaderIcon.setVisibility(View.VISIBLE);
accountFilterHeaderIcon.setImageDrawable(icon);
}
+ private void setMargins(View v, int l, int r) {
+ if (v.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
+ ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
+ p.setMarginStart(l);
+ p.setMarginEnd(r);
+ v.setLayoutParams(p);
+ v.requestLayout();
+ }
+ }
+
private void bindListHeaderCommon(View listView, View accountFilterContainer) {
// Show header and remove top padding of the list
accountFilterContainer.setVisibility(View.VISIBLE);
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 7a01ede..16f137e 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -958,21 +958,25 @@
// 2. App doesn't have permission, user denied it previously.
// 3. App has permission.
// Permission explanation card is displayed only for case 1.
+ final boolean hasTelephonyFeature =
+ getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
+
final boolean hasCalendarPermission = PermissionsUtil.hasPermission(
this, Manifest.permission.READ_CALENDAR);
- final boolean hasSMSPermission = PermissionsUtil.hasPermission(
- this, Manifest.permission.READ_SMS);
+ final boolean hasSMSPermission = hasTelephonyFeature
+ && PermissionsUtil.hasPermission(this, Manifest.permission.READ_SMS);
final boolean wasCalendarPermissionDenied =
ActivityCompat.shouldShowRequestPermissionRationale(
this, Manifest.permission.READ_CALENDAR);
final boolean wasSMSPermissionDenied =
- ActivityCompat.shouldShowRequestPermissionRationale(
+ hasTelephonyFeature && ActivityCompat.shouldShowRequestPermissionRationale(
this, Manifest.permission.READ_SMS);
final boolean shouldDisplayCalendarMessage =
!hasCalendarPermission && !wasCalendarPermissionDenied;
- final boolean shouldDisplaySMSMessage = !hasSMSPermission && !wasSMSPermissionDenied;
+ final boolean shouldDisplaySMSMessage =
+ hasTelephonyFeature && !hasSMSPermission && !wasSMSPermissionDenied;
mShouldShowPermissionExplanation = shouldDisplayCalendarMessage || shouldDisplaySMSMessage;
if (shouldDisplayCalendarMessage && shouldDisplaySMSMessage) {
diff --git a/src/com/android/contacts/util/SyncUtil.java b/src/com/android/contacts/util/SyncUtil.java
new file mode 100644
index 0000000..0823ba3
--- /dev/null
+++ b/src/com/android/contacts/util/SyncUtil.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2016 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.util;
+
+import android.accounts.Account;
+import android.content.ContentResolver;
+import android.provider.ContactsContract;
+
+/**
+ * Utilities related to sync.
+ */
+public final class SyncUtil {
+ private static final String TAG = "SyncUtil";
+
+ private SyncUtil() {
+ }
+
+ public static final boolean isSyncStatusPendingOrActive(Account account) {
+ return ContentResolver.isSyncPending(account, ContactsContract.AUTHORITY)
+ || ContentResolver.isSyncActive(account, ContactsContract.AUTHORITY);
+ }
+}