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);