Merge "Handle runtime permissions" into mnc-dev
diff --git a/res/layout/compact_contact_editor_fields.xml b/res/layout/compact_contact_editor_fields.xml
index f59c5be..1ddd0b1 100644
--- a/res/layout/compact_contact_editor_fields.xml
+++ b/res/layout/compact_contact_editor_fields.xml
@@ -21,6 +21,7 @@
android:id="@+id/names"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/editor_compact_first_field_padding"
android:orientation="vertical"/>
<LinearLayout
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 2214215..b8650e3 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -98,6 +98,9 @@
<!-- Left padding of the label in the add field button for the contact editor -->
<dimen name="editor_add_field_label_left_padding">16dip</dimen>
+ <!-- Top margin for the first field of the compact contact editor -->
+ <dimen name="editor_compact_first_field_padding">10dp</dimen>
+
<!-- Width and height of the expanded contact photo on the contact detail page -->
<dimen name="detail_contact_photo_expanded_size">400dip</dimen>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index ca3f450..0cf4de4 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -123,8 +123,7 @@
</style>
<style name="EditorActionBarStyle" parent="@style/ContactsActionBarStyle">
- <!-- Do not use a contentInsetStart, since we are setting a custom ActionBar view -->
- <item name="android:contentInsetStart">0dp</item>
+ <item name="android:contentInsetStart">72dp</item>
</style>
<!-- When this style was added, android:toolbarStyle was private. Therefore, this style
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index c82c04e..5a95c90 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -81,6 +81,7 @@
private String mQueryString;
private EditText mSearchView;
+ private View mClearSearchView;
/** The view that represents tabs when we are in portrait mode **/
private View mPortraitTabs;
/** The view that represents tabs when we are in landscape mode **/
@@ -140,6 +141,7 @@
// Hide tabs initially
setPortraitTabHeight(0);
}
+
private void setupSearchAndSelectionViews() {
final LayoutInflater inflater = (LayoutInflater) mToolbar.getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
@@ -154,13 +156,6 @@
mSearchView = (EditText) mSearchContainer.findViewById(R.id.search_view);
mSearchView.setHint(mActivity.getString(R.string.hint_findContacts));
mSearchView.addTextChangedListener(new SearchTextWatcher());
- mSearchContainer.findViewById(R.id.search_close_button).setOnClickListener(
- new OnClickListener() {
- @Override
- public void onClick(View v) {
- setQueryString(null);
- }
- });
mSearchContainer.findViewById(R.id.search_back_button).setOnClickListener(
new OnClickListener() {
@Override
@@ -171,6 +166,15 @@
}
});
+ mClearSearchView = mSearchContainer.findViewById(R.id.search_close_button);
+ mClearSearchView.setOnClickListener(
+ new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ setQueryString(null);
+ }
+ });
+
// Setup selection bar
mSelectionContainer = inflater.inflate(R.layout.selection_bar, mToolbar,
/* attachToRoot = */ false);
@@ -235,6 +239,8 @@
} else if (mListener != null) {
mListener.onAction(Action.CHANGE_SEARCH_QUERY);
}
+ mClearSearchView.setVisibility(
+ TextUtils.isEmpty(queryString) ? View.GONE : View.VISIBLE);
}
@Override
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 83c4085..1591866 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -262,6 +262,7 @@
// Re-configure fragments.
configureFragments(true /* from request */);
+ initializeFabVisibility();
invalidateOptionsMenuIfNeeded();
}
@@ -380,9 +381,9 @@
final ImageButton floatingActionButton
= (ImageButton) findViewById(R.id.floating_action_button);
floatingActionButton.setOnClickListener(this);
- initializeFabVisibility();
mFloatingActionButtonController = new FloatingActionButtonController(this,
mFloatingActionButtonContainer, floatingActionButton);
+ initializeFabVisibility();
invalidateOptionsMenuIfNeeded();
}
@@ -509,6 +510,7 @@
final boolean hideFab = mActionBarAdapter.isSearchMode()
|| mActionBarAdapter.isSelectionMode();
mFloatingActionButtonContainer.setVisibility(hideFab ? View.GONE : View.VISIBLE);
+ mFloatingActionButtonController.resetIn();
wasLastFabAnimationScaleIn = !hideFab;
}
diff --git a/src/com/android/contacts/list/ContactPickerFragment.java b/src/com/android/contacts/list/ContactPickerFragment.java
index 0503d33..4e81389 100644
--- a/src/com/android/contacts/list/ContactPickerFragment.java
+++ b/src/com/android/contacts/list/ContactPickerFragment.java
@@ -113,7 +113,7 @@
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- if (position == 0 && mCreateContactEnabled) {
+ if (position == 0 && mCreateContactEnabled && mListener != null) {
mListener.onCreateNewContactAction();
} else {
super.onItemClick(parent, view, position, id);
@@ -142,15 +142,21 @@
}
public void createNewContact() {
- mListener.onCreateNewContactAction();
+ if (mListener != null) {
+ mListener.onCreateNewContactAction();
+ }
}
public void editContact(Uri contactUri) {
- mListener.onEditContactAction(contactUri);
+ if (mListener != null) {
+ mListener.onEditContactAction(contactUri);
+ }
}
public void pickContact(Uri uri) {
- mListener.onPickContactAction(uri);
+ if (mListener != null) {
+ mListener.onPickContactAction(uri);
+ }
}
@Override
@@ -190,11 +196,15 @@
@Override
public void onShortcutIntentCreated(Uri uri, Intent shortcutIntent) {
- mListener.onShortcutIntentCreated(shortcutIntent);
+ if (mListener != null) {
+ mListener.onShortcutIntentCreated(shortcutIntent);
+ }
}
@Override
public void onPickerResult(Intent data) {
- mListener.onPickContactAction(data.getData());
+ if (mListener != null) {
+ mListener.onPickContactAction(data.getData());
+ }
}
}
diff --git a/src/com/android/contacts/list/LegacyPhoneNumberPickerFragment.java b/src/com/android/contacts/list/LegacyPhoneNumberPickerFragment.java
index b88fa71..d62c730 100644
--- a/src/com/android/contacts/list/LegacyPhoneNumberPickerFragment.java
+++ b/src/com/android/contacts/list/LegacyPhoneNumberPickerFragment.java
@@ -42,6 +42,12 @@
}
@Override
+ protected String getLookupKey(int position) {
+ // There is no lookup key for the legacy adapter.
+ return null;
+ }
+
+ @Override
protected ContactEntryListAdapter createListAdapter() {
LegacyPhoneNumberListAdapter adapter = new LegacyPhoneNumberListAdapter(getActivity());
adapter.setDisplayPhotos(true);
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 66bb473..7e02782 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -2322,7 +2322,8 @@
}
private boolean isShortcutCreatable() {
- if (mContactData == null || mContactData.isUserProfile()) {
+ if (mContactData == null || mContactData.isUserProfile() ||
+ mContactData.isDirectoryEntry()) {
return false;
}
final Intent createShortcutIntent = new Intent();
@@ -2445,7 +2446,9 @@
}
return true;
case R.id.menu_delete:
- deleteContact();
+ if (isContactEditable()) {
+ deleteContact();
+ }
return true;
case R.id.menu_share:
if (isContactShareable()) {
@@ -2453,7 +2456,9 @@
}
return true;
case R.id.menu_create_contact_shortcut:
- createLauncherShortcutWithContact();
+ if (isShortcutCreatable()) {
+ createLauncherShortcutWithContact();
+ }
return true;
case R.id.menu_help:
HelpUtils.launchHelpAndFeedbackForContactScreen(this);