Merge "Modify content descriptions of star and search icon" into ub-contactsdialer-h-dev
diff --git a/res/layout/fragment_sim_import.xml b/res/layout/fragment_sim_import.xml
index d6d3acf..f848cef 100644
--- a/res/layout/fragment_sim_import.xml
+++ b/res/layout/fragment_sim_import.xml
@@ -56,7 +56,7 @@
android:background="?android:colorBackground"
android:minHeight="48dp"
android:orientation="horizontal"
- android:paddingEnd="32dp"
+ android:paddingEnd="16dp"
android:paddingStart="16dp">
<ImageView
@@ -83,8 +83,8 @@
android:id="@+id/account_expander_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginRight="9dp"
android:layout_gravity="center_vertical"
+ android:layout_marginEnd="10dp"
android:scaleType="center"
android:src="@drawable/ic_arrow_drop_down_black_24dp"
android:tint="?android:textColorSecondary"
diff --git a/res/layout/item_read_only_field.xml b/res/layout/item_read_only_field.xml
index e5444a4..8c77eee 100644
--- a/res/layout/item_read_only_field.xml
+++ b/res/layout/item_read_only_field.xml
@@ -16,9 +16,10 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/read_only_row"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginEnd="@dimen/editor_delete_button_width"
+ android:focusableInTouchMode="true"
android:layout_marginBottom="@dimen/editor_padding_between_read_only_editor_views"
android:orientation="horizontal">
@@ -41,9 +42,7 @@
android:textSize="@dimen/editor_form_text_size"
android:textColor="?android:attr/textColorSecondary"
android:singleLine="true"
- android:saveEnabled="false"
- android:textAlignment="viewStart"
- android:enabled="false"/>
+ android:textAlignment="viewStart"/>
<TextView
android:id="@+id/type"
@@ -52,9 +51,7 @@
android:textSize="@dimen/editor_form_text_size"
android:textColor="?android:attr/textColorSecondary"
android:singleLine="true"
- android:saveEnabled="false"
- android:textAlignment="viewStart"
- android:enabled="false"/>
+ android:textAlignment="viewStart"/>
</LinearLayout>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index d603973..de9764d 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -458,4 +458,9 @@
<dimen name="call_subject_dialog_secondary_text_size">14sp</dimen>
<!-- Row padding for call subject history items. -->
<dimen name="call_subject_history_item_padding">15dp</dimen>
+
+ <!-- Padding between SIM checkbox and end of row -->
+ <dimen name="sim_import_checkbox_end_padding">16dp</dimen>
+
+
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 547258c..a50c155 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -193,7 +193,7 @@
<string name="contacts_deleted_two_named_toast"><xliff:g id="name">%1$s</xliff:g> and <xliff:g id="name">%2$s</xliff:g> deleted</string>
<!-- Toast shown with names after user selected contacts are deleted by user action. [CHAR LIMIT=50] -->
- <string name="contacts_deleted_many_named_toast"><xliff:g id="name">%1$s</xliff:g>, <xliff:g id="name">%2$s</xliff:g>, <xliff:g id="name">%3$s</xliff:g>... deleted</string>
+ <string name="contacts_deleted_many_named_toast"><xliff:g id="name">%1$s</xliff:g>, <xliff:g id="name">%2$s</xliff:g>, <xliff:g id="name">%3$s</xliff:g>\u2026 deleted</string>
<!-- Toast shown after contacts that the user has selected are deleted by a user action. [CHAR LIMIT=30] -->
<plurals name="contacts_deleted_toast">
@@ -724,7 +724,7 @@
<!-- Title of the editor activity when creating a new contact. The char
limit is short and cannot be increased, since this needs to be displayed in a single line
at a pre-determined text size. [CHAR LIMIT=20] -->
- <string name="contact_editor_title_new_contact">Add new contact</string>
+ <string name="contact_editor_title_new_contact">Create new contact</string>
<!-- Title of the editor activity when editing a contact that already exists. The char
limit is short and cannot be increased, since this needs to be displayed in a single line
@@ -759,7 +759,7 @@
<!-- Content description for the button that adds a new contact
[CHAR LIMIT=NONE] -->
- <string name="action_menu_add_new_contact_button">add new contact</string>
+ <string name="action_menu_add_new_contact_button">Create new contact</string>
<!-- Button Label to see more on an ExpandingEntryCardView [CHAR LIMIT=40] -->
<string name="expanding_entry_card_view_see_more">See more</string>
<!-- Button Label to see less on an ExpandingEntryCardView [CHAR LIMIT=40] -->
@@ -848,8 +848,14 @@
<!-- Button to expand the contact editor to show all available input fields. [CHAR LIMIT=60] -->
<string name="editor_more_fields">More fields</string>
- <!-- Content description for the contact editor photo overlay which, when clicked, shows a dialog with the options for changing the contact photo. [CHAR LIMIT=30] -->
- <string name="editor_change_photo_content_description">Change photo</string>
+ <!-- Content description for the contact editor photo overlay which, when clicked, shows a dialog with the options for changing the contact photo. [CHAR LIMIT=NONE] -->
+ <string name="editor_change_photo_content_description">Change contact photo</string>
+
+ <!-- Content description for the contact editor photo overlay which, when clicked, shows a dialog with the options for adding a contact photo. [CHAR LIMIT=NONE] -->
+ <string name="editor_add_photo_content_description">Add contact photo</string>
+
+ <!-- Accessibility content description, describes the image as being the photo for the contact the user is viewing. [CHAR LIMIT=NONE] -->
+ <string name="editor_contact_photo_content_description">Contact photo</string>
<!-- Toast message displayed when the editor fails to load for a contacts. [CHAR LIMIT=NONE] -->
<string name="editor_failed_to_load">Failed to open editor.</string>
diff --git a/src/com/android/contacts/ContactsDrawerActivity.java b/src/com/android/contacts/ContactsDrawerActivity.java
index 79d0fe2..b786940 100644
--- a/src/com/android/contacts/ContactsDrawerActivity.java
+++ b/src/com/android/contacts/ContactsDrawerActivity.java
@@ -24,6 +24,7 @@
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.os.Bundle;
+import android.os.Handler;
import android.provider.ContactsContract.Intents;
import android.support.annotation.LayoutRes;
import android.support.design.widget.NavigationView;
@@ -112,11 +113,11 @@
private static final String KEY_NEW_GROUP_ACCOUNT = "newGroupAccount";
private static final String KEY_CONTACTS_VIEW = "contactsView";
+ private static final long DRAWER_CLOSE_DELAY = 300L;
+
protected ContactsView mCurrentView;
private class ContactsActionBarDrawerToggle extends ActionBarDrawerToggle {
-
- private Runnable mRunnable;
private boolean mMenuClickedBefore = SharedPreferenceUtil.getHamburgerMenuClickedBefore(
ContactsDrawerActivity.this);
@@ -177,16 +178,8 @@
if (newState != DrawerLayout.STATE_IDLE) {
updateStatusBarBackground();
}
- if (mRunnable != null && newState == DrawerLayout.STATE_IDLE) {
- mRunnable.run();
- mRunnable = null;
- }
initializeAssistantNewBadge();
}
-
- public void runWhenIdle(Runnable runnable) {
- mRunnable = runnable;
- }
}
protected ContactListFilterController mContactListFilterController;
@@ -437,14 +430,9 @@
menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
- mToggle.runWhenIdle(new Runnable() {
- @Override
- public void run() {
- onGroupMenuItemClicked(groupListItem.getGroupId(),
- groupListItem.getTitle());
- updateMenuSelection(menuItem);
- }
- });
+ onGroupMenuItemClicked(groupListItem.getGroupId(),
+ groupListItem.getTitle());
+ updateMenuSelection(menuItem);
mDrawer.closeDrawer(GravityCompat.START);
return true;
}
@@ -464,12 +452,7 @@
menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
- mToggle.runWhenIdle(new Runnable() {
- @Override
- public void run() {
- onCreateGroupMenuItemClicked();
- }
- });
+ onCreateGroupMenuItemClicked();
mDrawer.closeDrawer(GravityCompat.START);
return true;
}
@@ -562,13 +545,8 @@
menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
- mToggle.runWhenIdle(new Runnable() {
- @Override
- public void run() {
- onFilterMenuItemClicked(intent);
- updateMenuSelection(menuItem);
- }
- });
+ onFilterMenuItemClicked(intent);
+ updateMenuSelection(menuItem);
mDrawer.closeDrawer(GravityCompat.START);
return true;
}
@@ -614,28 +592,29 @@
@Override
public boolean onNavigationItemSelected(final MenuItem item) {
final int id = item.getItemId();
- mToggle.runWhenIdle(new Runnable() {
- @Override
- public void run() {
- if (id == R.id.nav_settings) {
+
+ if (id == R.id.nav_settings) {
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
startActivity(createPreferenceIntent());
- } else if (id == R.id.nav_help) {
- HelpUtils.launchHelpAndFeedbackForMainScreen(ContactsDrawerActivity.this);
- } else if (id == R.id.nav_all_contacts) {
- switchToAllContacts();
- } else if (id == R.id.nav_assistant) {
- if (!isAssistantView()) {
- launchAssistant();
- updateMenuSelection(item);
- }
- } else if (item.getIntent() != null) {
- ImplicitIntentsUtil.startActivityInApp(ContactsDrawerActivity.this,
- item.getIntent());
- } else {
- Log.w(TAG, "Unhandled navigation view item selection");
}
+ }, DRAWER_CLOSE_DELAY);
+ } else if (id == R.id.nav_help) {
+ HelpUtils.launchHelpAndFeedbackForMainScreen(ContactsDrawerActivity.this);
+ } else if (id == R.id.nav_all_contacts) {
+ switchToAllContacts();
+ } else if (id == R.id.nav_assistant) {
+ if (!isAssistantView()) {
+ launchAssistant();
+ updateMenuSelection(item);
}
- });
+ } else if (item.getIntent() != null) {
+ ImplicitIntentsUtil.startActivityInApp(ContactsDrawerActivity.this,
+ item.getIntent());
+ } else {
+ Log.w(TAG, "Unhandled navigation view item selection");
+ }
mDrawer.closeDrawer(GravityCompat.START);
return true;
diff --git a/src/com/android/contacts/DynamicShortcuts.java b/src/com/android/contacts/DynamicShortcuts.java
index 52307e4..49cc722 100644
--- a/src/com/android/contacts/DynamicShortcuts.java
+++ b/src/com/android/contacts/DynamicShortcuts.java
@@ -215,9 +215,14 @@
final List<ShortcutInfo> result = new ArrayList<>();
try {
- // For some reason the limit query parameter is ignored for the strequent content uri
- for (int i = 0; i < MAX_SHORTCUTS && cursor.moveToNext(); i++) {
- result.add(createShortcutFromRow(cursor));
+ int i = 0;
+ while (i < MAX_SHORTCUTS && cursor.moveToNext()) {
+ final ShortcutInfo shortcut = createShortcutFromRow(cursor);
+ if (shortcut == null) {
+ continue;
+ }
+ result.add(shortcut);
+ i++;
}
} finally {
cursor.close();
@@ -229,6 +234,9 @@
@VisibleForTesting
ShortcutInfo createShortcutFromRow(Cursor cursor) {
final ShortcutInfo.Builder builder = builderForContactShortcut(cursor);
+ if (builder == null) {
+ return null;
+ }
addIconForContact(cursor, builder);
return builder.build();
}
@@ -243,6 +251,9 @@
@VisibleForTesting
ShortcutInfo.Builder builderForContactShortcut(long id, String lookupKey, String displayName) {
+ if (lookupKey == null || displayName == null) {
+ return null;
+ }
final PersistableBundle extras = new PersistableBundle();
extras.putLong(Contacts._ID, id);
@@ -392,8 +403,6 @@
JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS))
.setTriggerContentUpdateDelay(mContentChangeMinUpdateDelay)
.setTriggerContentMaxDelay(mContentChangeMaxUpdateDelay)
- // Minimize impact on UX by waiting for idle before updating.
- .setRequiresDeviceIdle(true)
.build();
mJobScheduler.schedule(job);
}
diff --git a/src/com/android/contacts/SimImportFragment.java b/src/com/android/contacts/SimImportFragment.java
index 66be41b..a873842 100644
--- a/src/com/android/contacts/SimImportFragment.java
+++ b/src/com/android/contacts/SimImportFragment.java
@@ -259,11 +259,6 @@
updateSelectedCount();
}
- @Override
- public void onSelectedContactsChangedViaCheckBox() {
- updateSelectedCount();
- }
-
private void updateSelectedCount() {
final int selectedCount = mAdapter.getSelectedContactIds().size();
if (selectedCount == 0) {
@@ -325,9 +320,12 @@
private AccountWithDataSet mSelectedAccount;
private Map<AccountWithDataSet, Set<SimContact>> mExistingMap;
private Map<AccountWithDataSet, TreeSet<Long>> mPerAccountCheckedIds = new ArrayMap<>();
+ private final int mCheckboxPaddingEnd;
public SimContactAdapter(Context context) {
super(context);
+ mCheckboxPaddingEnd = context.getResources()
+ .getDimensionPixelOffset(R.dimen.sim_import_checkbox_end_padding);
}
@Override
@@ -344,6 +342,10 @@
// clickable
contactView.getCheckBox().setFocusable(false);
contactView.getCheckBox().setClickable(false);
+ // The default list pads the checkbox by a larger amount than we want.
+ contactView.setPaddingRelative(contactView.getPaddingStart(),
+ contactView.getPaddingTop(), mCheckboxPaddingEnd,
+ contactView.getPaddingBottom());
setViewEnabled(contactView, !existsInCurrentAccount(position));
}
diff --git a/src/com/android/contacts/common/activity/LicenseActivity.java b/src/com/android/contacts/common/activity/LicenseActivity.java
index 71bcd84..9e86ee8 100644
--- a/src/com/android/contacts/common/activity/LicenseActivity.java
+++ b/src/com/android/contacts/common/activity/LicenseActivity.java
@@ -17,8 +17,8 @@
import com.android.contacts.common.R;
-import android.app.ActionBar;
-import android.app.Activity;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuItem;
import android.webkit.WebView;
@@ -26,7 +26,7 @@
/**
* Displays the licenses for all open source libraries.
*/
-public class LicenseActivity extends Activity {
+public class LicenseActivity extends AppCompatActivity {
private static final String LICENSE_FILE = "file:///android_asset/licenses.html";
private WebView mWebView;
@@ -36,7 +36,7 @@
setContentView(R.layout.licenses);
mWebView = (WebView) findViewById(R.id.webview);
mWebView.loadUrl(LICENSE_FILE);
- final ActionBar actionBar = getActionBar();
+ final ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP);
}
diff --git a/src/com/android/contacts/common/list/MultiSelectEntryContactListAdapter.java b/src/com/android/contacts/common/list/MultiSelectEntryContactListAdapter.java
index b08e367..1a18f46 100644
--- a/src/com/android/contacts/common/list/MultiSelectEntryContactListAdapter.java
+++ b/src/com/android/contacts/common/list/MultiSelectEntryContactListAdapter.java
@@ -20,7 +20,6 @@
import android.database.Cursor;
import android.provider.ContactsContract;
import android.view.View;
-import android.view.View.OnClickListener;
import android.widget.CheckBox;
import com.android.contacts.group.GroupUtil;
@@ -35,13 +34,12 @@
private SelectedContactsListener mSelectedContactsListener;
private DeleteContactListener mDeleteContactListener;
- private TreeSet<Long> mSelectedContactIds = new TreeSet<Long>();
+ private TreeSet<Long> mSelectedContactIds = new TreeSet<>();
private boolean mDisplayCheckBoxes;
private final int mContactIdColumnIndex;
public interface SelectedContactsListener {
void onSelectedContactsChanged();
- void onSelectedContactsChangedViaCheckBox();
}
public interface DeleteContactListener {
@@ -149,18 +147,17 @@
return cursor.getLong(getContactColumnIdIndex());
}
return 0;
- }
+ }
@Override
protected void bindView(View itemView, int partition, Cursor cursor, int position) {
super.bindView(itemView, partition, cursor, position);
final ContactListItemView view = (ContactListItemView) itemView;
bindViewId(view, cursor, getContactColumnIdIndex());
- bindCheckBox(view, cursor, position, partition == ContactsContract.Directory.DEFAULT);
+ bindCheckBox(view, cursor, partition == ContactsContract.Directory.DEFAULT);
}
- private void bindCheckBox(ContactListItemView view, Cursor cursor, int position,
- boolean isLocalDirectory) {
+ private void bindCheckBox(ContactListItemView view, Cursor cursor, boolean isLocalDirectory) {
// Disable clicking on all contacts from remote directories when showing check boxes. We do
// this by telling the view to handle clicking itself.
view.setClickable(!isLocalDirectory && mDisplayCheckBoxes);
@@ -173,24 +170,7 @@
final CheckBox checkBox = view.getCheckBox();
final long contactId = cursor.getLong(mContactIdColumnIndex);
checkBox.setChecked(mSelectedContactIds.contains(contactId));
+ checkBox.setClickable(false);
checkBox.setTag(contactId);
- checkBox.setOnClickListener(mCheckBoxClickListener);
}
-
- private final OnClickListener mCheckBoxClickListener = new OnClickListener() {
- @Override
- public void onClick(View v) {
- final CheckBox checkBox = (CheckBox) v;
- final Long contactId = (Long) checkBox.getTag();
- if (checkBox.isChecked()) {
- mSelectedContactIds.add(contactId);
- } else {
- mSelectedContactIds.remove(contactId);
- }
- notifyDataSetChanged();
- if (mSelectedContactsListener != null) {
- mSelectedContactsListener.onSelectedContactsChangedViaCheckBox();
- }
- }
- };
}
diff --git a/src/com/android/contacts/common/vcard/ImportVCardActivity.java b/src/com/android/contacts/common/vcard/ImportVCardActivity.java
index d7b64b4..e5fab4e 100644
--- a/src/com/android/contacts/common/vcard/ImportVCardActivity.java
+++ b/src/com/android/contacts/common/vcard/ImportVCardActivity.java
@@ -290,7 +290,12 @@
} finally {
Log.i(LOG_TAG, "Finished caching vCard.");
mWakeLock.release();
- unbindService(mConnection);
+ try {
+ unbindService(mConnection);
+ } catch (IllegalArgumentException e) {
+ FeedbackHelper.sendFeedback(ImportVCardActivity.this, LOG_TAG,
+ "Cannot unbind service connection", e);
+ }
mProgressDialogForCachingVCard.dismiss();
mProgressDialogForCachingVCard = null;
finish();
diff --git a/src/com/android/contacts/editor/PhotoEditorView.java b/src/com/android/contacts/editor/PhotoEditorView.java
index 5283009..1e727df 100644
--- a/src/com/android/contacts/editor/PhotoEditorView.java
+++ b/src/com/android/contacts/editor/PhotoEditorView.java
@@ -116,10 +116,13 @@
mPhotoIcon.setVisibility(View.GONE);
mPhotoIconOverlay.setVisibility(View.GONE);
mPhotoTouchInterceptOverlay.setClickable(false);
+ mPhotoTouchInterceptOverlay.setContentDescription(getContext().getString(
+ R.string.editor_contact_photo_content_description));
} else {
mPhotoIcon.setVisibility(View.VISIBLE);
mPhotoIconOverlay.setVisibility(View.VISIBLE);
mPhotoTouchInterceptOverlay.setOnClickListener(this);
+ updatePhotoDescription();
}
}
@@ -208,13 +211,21 @@
private void setPhoto(Bitmap bitmap) {
mPhotoImageView.setImageBitmap(bitmap);
mIsNonDefaultPhotoBound = true;
+ updatePhotoDescription();
}
private void setDefaultPhoto(MaterialPalette materialPalette) {
mIsNonDefaultPhotoBound = false;
+ updatePhotoDescription();
EditorUiUtils.setDefaultPhoto(mPhotoImageView, getResources(), materialPalette);
}
+ private void updatePhotoDescription() {
+ mPhotoTouchInterceptOverlay.setContentDescription(getContext().getString(
+ mIsNonDefaultPhotoBound
+ ? R.string.editor_change_photo_content_description
+ : R.string.editor_add_photo_content_description));
+ }
/**
* Binds a full size photo loaded from the given Uri.
*/
@@ -222,6 +233,7 @@
EditorUiUtils.loadPhoto(ContactPhotoManager.getInstance(getContext()),
mPhotoImageView, photoUri);
mIsNonDefaultPhotoBound = true;
+ updatePhotoDescription();
}
/**
diff --git a/src/com/android/contacts/editor/RawContactEditorView.java b/src/com/android/contacts/editor/RawContactEditorView.java
index 8df7c37..8e177e4 100644
--- a/src/com/android/contacts/editor/RawContactEditorView.java
+++ b/src/com/android/contacts/editor/RawContactEditorView.java
@@ -685,10 +685,8 @@
private void bindData(Drawable icon, String iconContentDescription, CharSequence data,
CharSequence type, boolean isFirstEntry, boolean forceLTR) {
- final LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
- final View field = inflater.inflate(R.layout.item_read_only_field, mKindSectionViews,
- false);
+ final View field = mLayoutInflater.inflate(R.layout.item_read_only_field, mKindSectionViews,
+ /* attachToRoot */ false);
if (isFirstEntry) {
final ImageView imageView = (ImageView) field.findViewById(R.id.kind_icon);
imageView.setImageDrawable(icon);
@@ -749,8 +747,7 @@
// Set the content description
mAccountHeaderContainer.setContentDescription(
- EditorUiUtils.getAccountInfoContentDescription(primaryText,
- secondaryText));
+ EditorUiUtils.getAccountInfoContentDescription(secondaryText, primaryText));
}
private void addAccountSelector(final RawContactDelta rawContactDelta) {
diff --git a/src/com/android/contacts/list/MultiSelectContactsListFragment.java b/src/com/android/contacts/list/MultiSelectContactsListFragment.java
index 10e9370..7a6a64a 100644
--- a/src/com/android/contacts/list/MultiSelectContactsListFragment.java
+++ b/src/com/android/contacts/list/MultiSelectContactsListFragment.java
@@ -115,16 +115,6 @@
}
@Override
- public void onSelectedContactsChangedViaCheckBox() {
- if (getAdapter().getSelectedContactIds().size() == 0) {
- // Last checkbox has been unchecked. So we should stop displaying checkboxes.
- mCheckBoxListListener.onStopDisplayingCheckBoxes();
- } else {
- onSelectedContactsChanged();
- }
- }
-
- @Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
@@ -403,8 +393,8 @@
if (accountType instanceof GoogleAccountType) {
accountFilterHeaderIcon.getLayoutParams().height = getResources()
.getDimensionPixelOffset(R.dimen.contact_browser_list_header_icon_size);
- accountFilterHeaderIcon.getLayoutParams().width =
- accountFilterHeaderIcon.getLayoutParams().height;
+ accountFilterHeaderIcon.getLayoutParams().width = getResources()
+ .getDimensionPixelOffset(R.dimen.contact_browser_list_header_icon_size);
setMargins(accountFilterHeaderIcon,
getResources().getDimensionPixelOffset(
@@ -414,8 +404,8 @@
} else {
accountFilterHeaderIcon.getLayoutParams().height = getResources()
.getDimensionPixelOffset(R.dimen.contact_browser_list_header_icon_size_alt);
- accountFilterHeaderIcon.getLayoutParams().width =
- accountFilterHeaderIcon.getLayoutParams().height;
+ accountFilterHeaderIcon.getLayoutParams().width = getResources()
+ .getDimensionPixelOffset(R.dimen.contact_browser_list_header_icon_size_alt);
setMargins(accountFilterHeaderIcon,
getResources().getDimensionPixelOffset(
diff --git a/src/com/android/contacts/list/MultiSelectEmailAddressesListFragment.java b/src/com/android/contacts/list/MultiSelectEmailAddressesListFragment.java
index 956e473..64489a0 100644
--- a/src/com/android/contacts/list/MultiSelectEmailAddressesListFragment.java
+++ b/src/com/android/contacts/list/MultiSelectEmailAddressesListFragment.java
@@ -53,11 +53,6 @@
}
@Override
- public void onSelectedContactsChangedViaCheckBox() {
- onSelectedContactsChanged();
- }
-
- @Override
public void onCreateOptionsMenu(Menu menu, final MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.items_multi_select, menu);
diff --git a/src/com/android/contacts/list/MultiSelectPhoneNumbersListFragment.java b/src/com/android/contacts/list/MultiSelectPhoneNumbersListFragment.java
index 751449b..96a1de6 100644
--- a/src/com/android/contacts/list/MultiSelectPhoneNumbersListFragment.java
+++ b/src/com/android/contacts/list/MultiSelectPhoneNumbersListFragment.java
@@ -53,11 +53,6 @@
}
@Override
- public void onSelectedContactsChangedViaCheckBox() {
- onSelectedContactsChanged();
- }
-
- @Override
public void onCreateOptionsMenu(Menu menu, final MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.items_multi_select, menu);
diff --git a/src/com/android/contacts/util/SharedPreferenceUtil.java b/src/com/android/contacts/util/SharedPreferenceUtil.java
index 14f5494..3d138fb 100644
--- a/src/com/android/contacts/util/SharedPreferenceUtil.java
+++ b/src/com/android/contacts/util/SharedPreferenceUtil.java
@@ -36,14 +36,14 @@
public static final String PREFERENCE_KEY_GLOBAL_SYNC_OFF_DISMISSES =
"num-of-dismisses-auto-sync-off";
- private static final String PREFERENCE_KEY_HAMBURGER_PROMO_DISPLAYED_BEFORE =
- "hamburgerPromoDisplayedBefore";
+ private static final String PREFERENCE_KEY_HAMBURGER_PROMO_DISPLAYED =
+ "hamburgerPromoDisplayed";
- private static final String PREFERENCE_KEY_HAMBURGER_MENU_CLICKED_BEFORE =
- "hamburgerMenuClickedBefore";
+ private static final String PREFERENCE_KEY_HAMBURGER_MENU_CLICKED =
+ "hamburgerMenuClicked";
- private static final String PREFERENCE_KEY_HAMBURGER_PROMO_TRIGGER_ACTION_HAPPENED_BEFORE =
- "hamburgerPromoTriggerActionHappenedBefore";
+ private static final String PREFERENCE_KEY_HAMBURGER_PROMO_TRIGGER_ACTION_HAPPENED =
+ "hamburgerPromoTriggerActionHappened";
private static final String PREFERENCE_KEY_IMPORTED_SIM_CARDS =
"importedSimCards";
@@ -62,34 +62,34 @@
public static boolean getHamburgerPromoDisplayedBefore(Context context) {
return getSharedPreferences(context)
- .getBoolean(PREFERENCE_KEY_HAMBURGER_PROMO_DISPLAYED_BEFORE, false);
+ .getBoolean(PREFERENCE_KEY_HAMBURGER_PROMO_DISPLAYED, false);
}
public static void setHamburgerPromoDisplayedBefore(Context context) {
getSharedPreferences(context).edit()
- .putBoolean(PREFERENCE_KEY_HAMBURGER_PROMO_DISPLAYED_BEFORE, true)
+ .putBoolean(PREFERENCE_KEY_HAMBURGER_PROMO_DISPLAYED, true)
.apply();
}
public static boolean getHamburgerMenuClickedBefore(Context context) {
return getSharedPreferences(context)
- .getBoolean(PREFERENCE_KEY_HAMBURGER_MENU_CLICKED_BEFORE, false);
+ .getBoolean(PREFERENCE_KEY_HAMBURGER_MENU_CLICKED, false);
}
public static void setHamburgerMenuClickedBefore(Context context) {
getSharedPreferences(context).edit()
- .putBoolean(PREFERENCE_KEY_HAMBURGER_MENU_CLICKED_BEFORE, true)
+ .putBoolean(PREFERENCE_KEY_HAMBURGER_MENU_CLICKED, true)
.apply();
}
public static boolean getHamburgerPromoTriggerActionHappenedBefore(Context context) {
return getSharedPreferences(context)
- .getBoolean(PREFERENCE_KEY_HAMBURGER_PROMO_TRIGGER_ACTION_HAPPENED_BEFORE, false);
+ .getBoolean(PREFERENCE_KEY_HAMBURGER_PROMO_TRIGGER_ACTION_HAPPENED, false);
}
public static void setHamburgerPromoTriggerActionHappenedBefore(Context context) {
getSharedPreferences(context).edit()
- .putBoolean(PREFERENCE_KEY_HAMBURGER_PROMO_TRIGGER_ACTION_HAPPENED_BEFORE, true)
+ .putBoolean(PREFERENCE_KEY_HAMBURGER_PROMO_TRIGGER_ACTION_HAPPENED, true)
.apply();
}
diff --git a/tests/src/com/android/contacts/DynamicShortcutsTests.java b/tests/src/com/android/contacts/DynamicShortcutsTests.java
index 106b72a..34cd8c4 100644
--- a/tests/src/com/android/contacts/DynamicShortcutsTests.java
+++ b/tests/src/com/android/contacts/DynamicShortcutsTests.java
@@ -100,6 +100,14 @@
assertEquals(1l, shortcut.getExtras().getLong(Contacts._ID));
}
+ public void test_builderForContactShortcut_returnsNullWhenNameIsNull() {
+ final DynamicShortcuts sut = createDynamicShortcuts();
+
+ final ShortcutInfo.Builder shortcut = sut.builderForContactShortcut(1l, "lookup_key", null);
+
+ assertNull(shortcut);
+ }
+
public void test_builderForContactShortcut_ellipsizesLongNamesForLabels() {
final DynamicShortcuts sut = createDynamicShortcuts();
sut.setShortLabelMaxLength(5);
@@ -183,6 +191,43 @@
assertThat(arg.get(2), isShortcutForContact(3l, "starred_2", "Starred Two"));
}
+ public void test_refresh_skipsContactsWithNullName() {
+ final ShortcutManager mockShortcutManager = mock(ShortcutManager.class);
+ when(mockShortcutManager.getPinnedShortcuts()).thenReturn(
+ Collections.<ShortcutInfo>emptyList());
+ final DynamicShortcuts sut = createDynamicShortcuts(resolverWithExpectedQueries(
+ queryFor(Contacts.CONTENT_STREQUENT_URI,
+ 1l, "key1", "first",
+ 2l, "key2", "second",
+ 3l, "key3", null,
+ 4l, null, null,
+ 5l, "key5", "fifth",
+ 6l, "key6", "sixth")), mockShortcutManager);
+
+ sut.refresh();
+
+ final ArgumentCaptor<List<ShortcutInfo>> updateArgs =
+ ArgumentCaptor.forClass((Class) List.class);
+
+ verify(mockShortcutManager).setDynamicShortcuts(updateArgs.capture());
+
+ final List<ShortcutInfo> arg = updateArgs.getValue();
+ assertThat(arg.size(), equalTo(3));
+ assertThat(arg.get(0), isShortcutForContact(1l, "key1", "first"));
+ assertThat(arg.get(1), isShortcutForContact(2l, "key2", "second"));
+ assertThat(arg.get(2), isShortcutForContact(5l, "key5", "fifth"));
+
+
+ // Also verify that it doesn't crash if there are fewer than 3 valid strequent contacts
+ createDynamicShortcuts(resolverWithExpectedQueries(
+ queryFor(Contacts.CONTENT_STREQUENT_URI,
+ 1l, "key1", "first",
+ 2l, "key2", "second",
+ 3l, "key3", null,
+ 4l, null, null)), mock(ShortcutManager.class)).refresh();
+ }
+
+
public void test_handleFlagDisabled_stopsJob() {
final ShortcutManager mockShortcutManager = mock(ShortcutManager.class);
final JobScheduler mockJobScheduler = mock(JobScheduler.class);