Merge "Add call button to details, increase hit area." into mnc-dev
diff --git a/res/drawable-hdpi/ic_delete_wht_24dp.png b/res/drawable-hdpi/ic_delete_24dp.png
similarity index 100%
rename from res/drawable-hdpi/ic_delete_wht_24dp.png
rename to res/drawable-hdpi/ic_delete_24dp.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_delete_wht_24dp.png b/res/drawable-mdpi/ic_delete_24dp.png
similarity index 100%
rename from res/drawable-mdpi/ic_delete_wht_24dp.png
rename to res/drawable-mdpi/ic_delete_24dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_delete_wht_24dp.png b/res/drawable-xhdpi/ic_delete_24dp.png
similarity index 100%
rename from res/drawable-xhdpi/ic_delete_wht_24dp.png
rename to res/drawable-xhdpi/ic_delete_24dp.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_delete_wht_24dp.png b/res/drawable-xxhdpi/ic_delete_24dp.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_delete_wht_24dp.png
rename to res/drawable-xxhdpi/ic_delete_24dp.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_delete_wht_24dp.png b/res/drawable-xxxhdpi/ic_delete_24dp.png
similarity index 100%
rename from res/drawable-xxxhdpi/ic_delete_wht_24dp.png
rename to res/drawable-xxxhdpi/ic_delete_24dp.png
Binary files differ
diff --git a/res/drawable/ic_calllog_delete.xml b/res/drawable/ic_calllog_delete.xml
deleted file mode 100644
index 2f9f0ae..0000000
--- a/res/drawable/ic_calllog_delete.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 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.
--->
-
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-    android:src="@drawable/ic_delete_wht_24dp"
-    android:gravity="center"
-    android:tint="@color/actionbar_icon_color" />
diff --git a/res/layout/voicemail_playback_layout.xml b/res/layout/voicemail_playback_layout.xml
index 96feba6..97bb5f8 100644
--- a/res/layout/voicemail_playback_layout.xml
+++ b/res/layout/voicemail_playback_layout.xml
@@ -27,11 +27,6 @@
         android:layout_height="80dp"
         android:layout_marginTop="@dimen/call_detail_button_spacing">
 
-        <!-- SeekBar left-right margin decreased from redlines 72dp by 8dp to account for
-             half thumb width (thumb is 16dp).
-             Vertically, SeekBar and rate buttons should be below centre, position achieved by
-             making them centred but giving a difference between top and bottom padding,
-             difference is currently 10dp. -->
         <SeekBar
             android:id="@+id/playback_seek"
             android:layout_width="match_parent"
@@ -61,15 +56,12 @@
 
     </RelativeLayout>
 
-    <!-- Playback, speakerphone buttons. -->
-    <LinearLayout
-        android:id="@+id/buttons_linear_layout"
+    <LinearLayout android:id="@+id/buttons_linear_layout"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:orientation="horizontal">
 
-        <ImageButton
-            android:id="@+id/playback_start_stop"
+        <ImageButton android:id="@+id/playback_start_stop"
             android:layout_width="match_parent"
             android:layout_height="58dp"
             android:layout_marginEnd="@dimen/call_detail_button_spacing"
@@ -78,8 +70,7 @@
             android:src="@drawable/ic_hold_pause"
             android:contentDescription="@string/voicemail_play_start_pause" />
 
-        <ImageButton
-            android:id="@+id/playback_speakerphone"
+        <ImageButton android:id="@+id/playback_speakerphone"
             android:layout_width="match_parent"
             android:layout_height="58dp"
             android:layout_weight="1"
@@ -87,6 +78,15 @@
             android:src="@drawable/ic_speakerphone_on"
             android:contentDescription="@string/description_playback_speakerphone" />
 
+        <ImageButton android:id="@+id/delete_voicemail"
+            android:layout_width="match_parent"
+            android:layout_height="58dp"
+            android:layout_weight="1"
+            android:background="?android:attr/selectableItemBackground"
+            android:src="@drawable/ic_delete_24dp"
+            android:tint="@color/voicemail_playback_icon_tint"
+            android:contentDescription="@string/recentCalls_trashVoicemail" />
+
     </LinearLayout>
 
 </LinearLayout>
diff --git a/res/menu/call_details_options.xml b/res/menu/call_details_options.xml
index a48687e..b98ec9e 100644
--- a/res/menu/call_details_options.xml
+++ b/res/menu/call_details_options.xml
@@ -14,23 +14,21 @@
      limitations under the License.
 -->
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
-    <item
-        android:id="@+id/menu_trash"
-        android:icon="@drawable/ic_calllog_delete"
+
+    <item android:id="@+id/menu_trash"
+        android:icon="@drawable/ic_delete_24dp"
         android:showAsAction="ifRoom"
         android:title="@string/recentCalls_trashVoicemail"
-        android:onClick="onMenuTrashVoicemail"
-    />
-    <item
-        android:id="@+id/menu_remove_from_call_log"
-        android:icon="@drawable/ic_calllog_delete"
+        android:onClick="onMenuTrashVoicemail" />
+
+    <item android:id="@+id/menu_remove_from_call_log"
+        android:icon="@drawable/ic_delete_24dp"
         android:showAsAction="ifRoom"
         android:title="@string/recentCalls_removeFromRecentList"
-        android:onClick="onMenuRemoveFromCallLog"
-    />
-    <item
-        android:id="@+id/menu_edit_number_before_call"
+        android:onClick="onMenuRemoveFromCallLog" />
+
+    <item android:id="@+id/menu_edit_number_before_call"
         android:title="@string/recentCalls_editNumberBeforeCall"
-        android:onClick="onMenuEditNumberBeforeCall"
-    />
+        android:onClick="onMenuEditNumberBeforeCall" />
+
 </menu>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 38a3325..352bce5 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -39,6 +39,8 @@
     <!-- Tint of the recent card phone icon; 30% black -->
     <color name="recent_call_log_item_phone_icon_tint">#4d000000</color>
 
+    <color name="voicemail_playback_icon_tint">#8e8e8e</color>
+
     <!--
          Colour of voicemail progress bar to the right of position indicator.
          Same as the background color of the dialer
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 213d340..d8a8ffe 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -51,7 +51,7 @@
     <string name="recentCalls_editNumberBeforeCall">Edit number before call</string>
 
     <!-- Menu item used to add a number from the call log to contacts -->
-    <string name="recentCalls_addToContact">Add to contacts</string>
+    <string name="recentCalls_addToContact">Add to a contact</string>
 
     <!-- Menu item used to remove a single call from the call log -->
     <string name="recentCalls_removeFromRecentList">Delete from call history</string>
@@ -500,7 +500,7 @@
 
     <!-- Shortcut item used to add a number to an existing contact directly from search.
          [CHAR LIMIT=25] -->
-    <string name="search_shortcut_add_to_contact">Add to contact</string>
+    <string name="search_shortcut_add_to_contact">Add to a contact</string>
 
     <!-- Shortcut item used to send a text message directly from search. [CHAR LIMIT=25] -->
     <string name="search_shortcut_send_sms_message">Send SMS</string>
diff --git a/src/com/android/dialer/list/AllContactsFragment.java b/src/com/android/dialer/list/AllContactsFragment.java
index eaa5cc8..20e88e2 100644
--- a/src/com/android/dialer/list/AllContactsFragment.java
+++ b/src/com/android/dialer/list/AllContactsFragment.java
@@ -16,6 +16,7 @@
 
 package com.android.dialer.list;
 
+import android.content.Loader;
 import android.database.Cursor;
 import android.net.Uri;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
@@ -39,6 +40,8 @@
  */
 public class AllContactsFragment extends ContactEntryListFragment<ContactEntryListAdapter> {
 
+    private View mEmptyListView;
+
     public AllContactsFragment() {
         setQuickContactEnabled(false);
         setAdjustSelectionBoundsEnabled(true);
@@ -52,10 +55,11 @@
     public void onViewCreated(View view, android.os.Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
 
-        View emptyListView = view.findViewById(R.id.empty_list_view);
-        DialerUtils.configureEmptyListView(emptyListView, R.drawable.empty_contacts,
+        View mEmptyListView = view.findViewById(R.id.empty_list_view);
+        DialerUtils.configureEmptyListView(mEmptyListView, R.drawable.empty_contacts,
                 R.string.all_contacts_empty, getResources());
-        getListView().setEmptyView(emptyListView);
+        getListView().setEmptyView(mEmptyListView);
+        mEmptyListView.setVisibility(View.GONE);
 
         ViewUtil.addBottomPaddingToListViewForFab(getListView(), getResources());
     }
@@ -68,6 +72,15 @@
     }
 
     @Override
+    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+        super.onLoadFinished(loader, data);
+
+        if (data.getCount() == 0) {
+            mEmptyListView.setVisibility(View.VISIBLE);
+        }
+    }
+
+    @Override
     protected ContactEntryListAdapter createListAdapter() {
         if (!PermissionsUtil.hasContactsPermissions(getActivity())) {
             return new EmptyContactsListAdapter(getActivity());
diff --git a/src/com/android/dialer/list/DialerPhoneNumberListAdapter.java b/src/com/android/dialer/list/DialerPhoneNumberListAdapter.java
index 8a43023..17c573f 100644
--- a/src/com/android/dialer/list/DialerPhoneNumberListAdapter.java
+++ b/src/com/android/dialer/list/DialerPhoneNumberListAdapter.java
@@ -3,6 +3,8 @@
 import android.content.Context;
 import android.content.res.Resources;
 import android.telephony.PhoneNumberUtils;
+import android.text.BidiFormatter;
+import android.text.TextDirectionHeuristics;
 import android.view.View;
 import android.view.ViewGroup;
 
@@ -36,6 +38,8 @@
 
     private final boolean[] mShortcutEnabled = new boolean[SHORTCUT_COUNT];
 
+    private final BidiFormatter mBidiFormatter = BidiFormatter.getInstance();
+
     public DialerPhoneNumberListAdapter(Context context) {
         super(context);
 
@@ -141,7 +145,9 @@
         final String number = getFormattedQueryString();
         switch (shortcutType) {
             case SHORTCUT_DIRECT_CALL:
-                text = resources.getString(R.string.search_shortcut_call_number, number);
+                text = resources.getString(
+                        R.string.search_shortcut_call_number,
+                        mBidiFormatter.unicodeWrap(number, TextDirectionHeuristics.LTR));
                 drawableId = R.drawable.ic_search_phone;
                 break;
             case SHORTCUT_CREATE_NEW_CONTACT:
diff --git a/src/com/android/dialer/voicemail/VoicemailPlaybackLayout.java b/src/com/android/dialer/voicemail/VoicemailPlaybackLayout.java
index 703004d..0313f40 100644
--- a/src/com/android/dialer/voicemail/VoicemailPlaybackLayout.java
+++ b/src/com/android/dialer/voicemail/VoicemailPlaybackLayout.java
@@ -37,6 +37,7 @@
 
 import com.android.common.io.MoreCloseables;
 import com.android.dialer.R;
+import com.android.dialer.calllog.CallLogAsyncTaskUtil;
 
 import com.google.common.base.Preconditions;
 
@@ -124,7 +125,7 @@
     /**
      * Handle state changes when the user manipulates the seek bar.
      */
-    private final OnSeekBarChangeListener seekBarChangeListener = new OnSeekBarChangeListener() {
+    private final OnSeekBarChangeListener mSeekBarChangeListener = new OnSeekBarChangeListener() {
         @Override
         public void onStartTrackingTouch(SeekBar seekBar) {
             if (mPresenter != null) {
@@ -148,7 +149,7 @@
     /**
      * Click listener to toggle speakerphone.
      */
-    private final View.OnClickListener speakerphoneListener = new View.OnClickListener() {
+    private final View.OnClickListener mSpeakerphoneListener = new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             if (mPresenter != null) {
@@ -160,7 +161,7 @@
     /**
      * Click listener to play or pause voicemail playback.
      */
-    private final View.OnClickListener startStopButtonListener = new View.OnClickListener() {
+    private final View.OnClickListener mStartStopButtonListener = new View.OnClickListener() {
         @Override
         public void onClick(View view) {
             if (mPresenter == null) {
@@ -175,6 +176,16 @@
         }
     };
 
+    private final View.OnClickListener mDeleteButtonListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View view ) {
+            if (mPresenter == null) {
+                return;
+            }
+            CallLogAsyncTaskUtil.deleteVoicemail(mContext, mPresenter.getVoicemailUri(), null);
+        }
+    };
+
     private Context mContext;
     private VoicemailPlaybackPresenter mPresenter;
 
@@ -183,6 +194,7 @@
     private SeekBar mPlaybackSeek;
     private ImageButton mStartStopButton;
     private ImageButton mPlaybackSpeakerphone;
+    private ImageButton mDeleteButton;
     private TextView mPlaybackPosition;
 
     private PositionUpdater mPositionUpdater;
@@ -212,11 +224,13 @@
         mPlaybackSeek = (SeekBar) findViewById(R.id.playback_seek);
         mStartStopButton = (ImageButton) findViewById(R.id.playback_start_stop);
         mPlaybackSpeakerphone = (ImageButton) findViewById(R.id.playback_speakerphone);
+        mDeleteButton = (ImageButton) findViewById(R.id.delete_voicemail);
         mPlaybackPosition = (TextView) findViewById(R.id.playback_position_text);
 
-        mPlaybackSeek.setOnSeekBarChangeListener(seekBarChangeListener);
-        mStartStopButton.setOnClickListener(startStopButtonListener);
-        mPlaybackSpeakerphone.setOnClickListener(speakerphoneListener);
+        mPlaybackSeek.setOnSeekBarChangeListener(mSeekBarChangeListener);
+        mStartStopButton.setOnClickListener(mStartStopButtonListener);
+        mPlaybackSpeakerphone.setOnClickListener(mSpeakerphoneListener);
+        mDeleteButton.setOnClickListener(mDeleteButtonListener);
     }
 
     @Override
diff --git a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
index 99d2734..1a15476 100644
--- a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
+++ b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
@@ -204,7 +204,7 @@
 
     public void onPause(boolean isFinishing) {
         // Do not pause for orientation changes.
-        if (mMediaPlayer.isPlaying() && isFinishing) {
+        if (mIsPrepared && mMediaPlayer.isPlaying() && isFinishing) {
             pausePlayback();
         }
 
@@ -556,6 +556,10 @@
         return mAudioManager.isSpeakerphoneOn();
     }
 
+    public Uri getVoicemailUri() {
+        return mVoicemailUri;
+    }
+
     private static synchronized ScheduledExecutorService getScheduledExecutorServiceInstance() {
         if (mScheduledExecutorService == null) {
             mScheduledExecutorService = Executors.newScheduledThreadPool(NUMBER_OF_THREADS_IN_POOL);