Merge "Set empty label view to new spec" into ub-contactsdialer-f-dev
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/values/colors.xml b/res/values/colors.xml
index 8089a2e..0d1b6ea 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>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 0a8d4f1..2b20c3e 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -295,4 +295,7 @@
<!-- Minimum height for group name EditText -->
<dimen name="group_name_edit_text_min_height">48dp</dimen>
+
+ <!-- Elevation of contact list header -->
+ <dimen name="contact_list_header_elevation">2dp</dimen>
</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/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) {