Merge "Fix typo in singleTop compact contact editor Activity"
diff --git a/res/layout/selection_bar.xml b/res/layout/selection_bar.xml
index e91311f..e6b1f66 100644
--- a/res/layout/selection_bar.xml
+++ b/res/layout/selection_bar.xml
@@ -13,13 +13,11 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<LinearLayout
+<FrameLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/selection_bar"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:orientation="horizontal"
-    android:gravity="center_vertical"
     android:background="@color/contextual_selection_bar_color" >
 
     <ImageButton
@@ -29,13 +27,16 @@
         android:src="@drawable/ic_close_dk"
         android:background="?android:attr/selectableItemBackgroundBorderless"
         android:contentDescription="@string/action_menu_back_from_search"
+        android:layout_gravity="center_vertical|start"
         android:tint="@android:color/white" />
 
     <TextView
         android:id="@+id/selection_count_text"
+        android:layout_marginStart="72dp"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:visibility="gone"
+        android:layout_gravity="center_vertical|start"
         style="@style/ContactsActionBarTitleText" />
 
-</LinearLayout>
+</FrameLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 787828a..8ebf1fc 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -165,8 +165,11 @@
     <!-- List separator for the Join Contact list: A-Z -->
     <string name="separatorJoinAggregateAll">All contacts</string>
 
-    <!-- Toast shown after two contacts have been joined by a user action -->
-    <string name="contactsJoinedMessage">Contacts joined</string>
+    <!-- Toast shown after two contacts have been joined by a user action. [CHAR LIMIT=NONE] -->
+    <string name="contactsJoinedMessage">Contacts merged</string>
+
+    <!-- Toast shown after contacts that the user has selected are deleted by a user action. [CHAR LIMIT=NONE] -->
+    <string name="contacts_deleted_toast">Contacts deleted</string>
 
     <!-- Menu item that opens the Options activity for a given contact [CHAR LIMIT=15] -->
     <string name="menu_set_ring_tone">Set ringtone</string>
diff --git a/src/com/android/contacts/ContactSaveService.java b/src/com/android/contacts/ContactSaveService.java
index cf36edf..d81867c 100644
--- a/src/com/android/contacts/ContactSaveService.java
+++ b/src/com/android/contacts/ContactSaveService.java
@@ -982,7 +982,7 @@
             final Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
             getContentResolver().delete(contactUri, null, null);
         }
-
+        showToast(R.string.contacts_deleted_toast);
     }
 
     /**
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index a272f56..4770909 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -945,6 +945,11 @@
             mActionBarAdapter.setSelectionCount(mAllFragment.getSelectedContactIds().size());
             invalidateOptionsMenu();
         }
+
+        @Override
+        public void onStopDisplayingCheckBoxes() {
+            mActionBarAdapter.setSelectionMode(false);
+        }
     }
 
     private class ContactsUnavailableFragmentListener
diff --git a/src/com/android/contacts/list/MultiSelectContactsListFragment.java b/src/com/android/contacts/list/MultiSelectContactsListFragment.java
index 75a6863..a58a8ee 100644
--- a/src/com/android/contacts/list/MultiSelectContactsListFragment.java
+++ b/src/com/android/contacts/list/MultiSelectContactsListFragment.java
@@ -37,6 +37,7 @@
     public interface OnCheckBoxListActionListener {
         void onStartDisplayingCheckBoxes();
         void onSelectedContactIdsChanged();
+        void onStopDisplayingCheckBoxes();
     }
 
     private static final String EXTRA_KEY_SELECTED_CONTACTS = "selected_contacts";
@@ -55,6 +56,16 @@
     }
 
     @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) {
@@ -102,17 +113,23 @@
 
     @Override
     protected boolean onItemLongClick(int position, long id) {
-        final MultiSelectEntryContactListAdapter adapter = getAdapter();
-        if (mCheckBoxListListener != null) {
-            mCheckBoxListListener.onStartDisplayingCheckBoxes();
-        }
+        final int previouslySelectedCount = getAdapter().getSelectedContactIds().size();
         final Uri uri = getAdapter().getContactUri(position);
         if (uri != null && (position > 0 || !getAdapter().hasProfile())) {
             final String contactId = uri.getLastPathSegment();
             if (!TextUtils.isEmpty(contactId)) {
+                if (mCheckBoxListListener != null) {
+                    mCheckBoxListListener.onStartDisplayingCheckBoxes();
+                }
                 getAdapter().toggleSelectionOfContactId(Long.valueOf(contactId));
             }
         }
+        final int nowSelectedCount = getAdapter().getSelectedContactIds().size();
+        if (mCheckBoxListListener != null
+                && previouslySelectedCount != 0 && nowSelectedCount == 0) {
+            // Last checkbox has been unchecked. So we should stop displaying checkboxes.
+            mCheckBoxListListener.onStopDisplayingCheckBoxes();
+        }
         return true;
     }
 
@@ -130,6 +147,9 @@
         } else {
             super.onItemClick(position, id);
         }
+        if (mCheckBoxListListener != null && getAdapter().getSelectedContactIds().size() == 0) {
+            mCheckBoxListListener.onStopDisplayingCheckBoxes();
+        }
     }
 
     @Override
diff --git a/src/com/android/contacts/list/MultiSelectEntryContactListAdapter.java b/src/com/android/contacts/list/MultiSelectEntryContactListAdapter.java
index 4748dc4..7c6f7bc 100644
--- a/src/com/android/contacts/list/MultiSelectEntryContactListAdapter.java
+++ b/src/com/android/contacts/list/MultiSelectEntryContactListAdapter.java
@@ -39,6 +39,7 @@
 
     public interface SelectedContactsListener {
         void onSelectedContactsChanged();
+        void onSelectedContactsChangedViaCheckBox();
     }
 
     public MultiSelectEntryContactListAdapter(Context context) {
@@ -139,7 +140,7 @@
                 mSelectedContactIds.remove(contactId);
             }
             if (mSelectedContactsListener != null) {
-                mSelectedContactsListener.onSelectedContactsChanged();
+                mSelectedContactsListener.onSelectedContactsChangedViaCheckBox();
             }
         }
     };