Merge "Import translations. DO NOT MERGE" into lmp-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 92d6d94..f35fc0a 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -67,7 +67,7 @@
              stateAlwaysHidden is set to suppress keyboard show up on
              dialpad screen. -->
         <activity android:name=".DialtactsActivity"
-            android:label="@string/launcherDialer"
+            android:label="@string/launcherActivityLabel"
             android:theme="@style/DialtactsActivityTheme"
             android:launchMode="singleTask"
             android:clearTaskOnLaunch="true"
@@ -198,24 +198,11 @@
         <activity android:name="com.android.contacts.common.vcard.ImportVCardActivity"
                   android:configChanges="orientation|screenSize|keyboardHidden"
                   android:theme="@style/BackgroundOnlyTheme">
-            <intent-filter>
-                <action android:name="android.intent.action.VIEW"/>
-                <data android:mimeType="text/directory"/>
-                <data android:mimeType="text/vcard"/>
-                <data android:mimeType="text/x-vcard"/>
-                <category android:name="android.intent.category.DEFAULT"/>
-            </intent-filter>
         </activity>
 
         <activity android:name="com.android.contacts.common.vcard.NfcImportVCardActivity"
                   android:configChanges="orientation|screenSize|keyboardHidden"
                   android:theme="@style/BackgroundOnlyTheme">
-            <intent-filter>
-                <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
-                <data android:mimeType="text/vcard"/>
-                <data android:mimeType="text/x-vcard"/>
-                <category android:name="android.intent.category.DEFAULT"/>
-            </intent-filter>
         </activity>
 
         <activity android:name="com.android.contacts.common.vcard.CancelActivity"
diff --git a/res/drawable-hdpi/fab_green.png b/res/drawable-hdpi/fab_green.png
new file mode 100644
index 0000000..ff9753c
--- /dev/null
+++ b/res/drawable-hdpi/fab_green.png
Binary files differ
diff --git a/res/drawable-mdpi/fab_green.png b/res/drawable-mdpi/fab_green.png
new file mode 100644
index 0000000..947aac1
--- /dev/null
+++ b/res/drawable-mdpi/fab_green.png
Binary files differ
diff --git a/res/drawable-xhdpi/fab_green.png b/res/drawable-xhdpi/fab_green.png
new file mode 100644
index 0000000..e8bab3f
--- /dev/null
+++ b/res/drawable-xhdpi/fab_green.png
Binary files differ
diff --git a/res/drawable-xxhdpi/fab_green.png b/res/drawable-xxhdpi/fab_green.png
new file mode 100644
index 0000000..7e4fd3e
--- /dev/null
+++ b/res/drawable-xxhdpi/fab_green.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/fab_green.png b/res/drawable-xxxhdpi/fab_green.png
new file mode 100644
index 0000000..aa8849e
--- /dev/null
+++ b/res/drawable-xxxhdpi/fab_green.png
Binary files differ
diff --git a/res/drawable/floating_action_button.xml b/res/drawable/floating_action_button.xml
index cbbfb85..e5ae14a 100644
--- a/res/drawable/floating_action_button.xml
+++ b/res/drawable/floating_action_button.xml
@@ -16,6 +16,4 @@
 -->
 
 <ripple xmlns:android="http://schemas.android.com/apk/res/android"
-    android:color="@color/floating_action_button_touch_tint">
-    <item android:drawable="@drawable/fab_blue" />
-</ripple>
+    android:color="@color/floating_action_button_touch_tint" />
\ No newline at end of file
diff --git a/res/layout-land/dialpad_fragment.xml b/res/layout-land/dialpad_fragment.xml
index aac0daf..680c2d7 100644
--- a/res/layout-land/dialpad_fragment.xml
+++ b/res/layout-land/dialpad_fragment.xml
@@ -13,35 +13,75 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<view class="com.android.dialer.dialpad.DialpadFragment$DialpadSlidingLinearLayout"
+<view class="com.android.dialer.dialpad.DialpadFragment$DialpadSlidingRelativeLayout"
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="horizontal"
-    >
-    <!-- spacer view -->
-    <View
-        android:id="@+id/spacer"
-        android:layout_width="0dp"
-        android:layout_height="match_parent"
-        android:layout_weight="1"
-        android:background="#00000000" />
-    <!-- Dialpad shadow -->
-    <View
-        android:layout_width="@dimen/shadow_length"
-        android:layout_height="match_parent"
-        android:background="@drawable/shadow_fade_left" />
-    <include layout="@layout/dialpad_view"
-         android:layout_height="match_parent"
-         android:layout_width="0dp"
-         android:layout_weight="1" />
-    <!-- "Dialpad chooser" UI, shown only when the user brings up the
-             Dialer while a call is already in progress.
-             When this UI is visible, the other Dialer elements
-             (the textfield/button and the dialpad) are hidden. -->
-    <ListView android:id="@+id/dialpadChooser"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:background="@color/background_dialer_light"
-            android:visibility="gone" />
+    android:layout_height="wrap_content">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+
+        <!-- spacer view -->
+        <View
+            android:id="@+id/spacer"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:background="#00000000" />
+
+        <!-- Dialpad shadow -->
+        <View
+            android:layout_width="@dimen/shadow_length"
+            android:layout_height="match_parent"
+            android:background="@drawable/shadow_fade_left" />
+
+        <RelativeLayout
+            android:layout_height="match_parent"
+            android:layout_width="0dp"
+            android:layout_weight="1">
+
+            <include layout="@layout/dialpad_view"
+                 android:layout_height="match_parent"
+                 android:layout_width="match_parent" />
+
+            <!-- "Dialpad chooser" UI, shown only when the user brings up the
+                     Dialer while a call is already in progress.
+                     When this UI is visible, the other Dialer elements
+                     (the textfield/button and the dialpad) are hidden. -->
+
+            <ListView android:id="@+id/dialpadChooser"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:background="@color/background_dialer_light"
+                    android:visibility="gone" />
+
+            <!-- Margin bottom and alignParentBottom don't work well together, so use a Space instead. -->
+            <Space android:id="@+id/dialpad_floating_action_button_margin_bottom"
+                android:layout_width="match_parent"
+                android:layout_height="8dp"
+                android:layout_alignParentBottom="true" />
+
+            <FrameLayout
+                android:id="@+id/dialpad_floating_action_button_container"
+                android:background="@drawable/fab_green"
+                android:layout_width="@dimen/floating_action_button_width"
+                android:layout_height="@dimen/floating_action_button_height"
+                android:layout_above="@id/dialpad_floating_action_button_margin_bottom"
+                android:layout_centerHorizontal="true">
+
+                <ImageButton
+                    android:id="@+id/dialpad_floating_action_button"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:background="@drawable/floating_action_button"
+                    android:contentDescription="@string/description_dial_button"
+                    android:src="@drawable/fab_ic_call"/>
+
+            </FrameLayout>
+
+        </RelativeLayout>
+
+    </LinearLayout>
 </view>
diff --git a/res/layout/dialpad_fragment.xml b/res/layout/dialpad_fragment.xml
index 01bbecc..21cb586 100644
--- a/res/layout/dialpad_fragment.xml
+++ b/res/layout/dialpad_fragment.xml
@@ -13,31 +13,64 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<view class="com.android.dialer.dialpad.DialpadFragment$DialpadSlidingLinearLayout"
+<view class="com.android.dialer.dialpad.DialpadFragment$DialpadSlidingRelativeLayout"
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:orientation="vertical" >
-    <!-- spacer view -->
-    <View
-        android:id="@+id/spacer"
+    android:orientation="horizontal">
+
+    <LinearLayout
         android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:layout_weight="1"
-        android:background="#00000000" />
-    <!-- Dialpad shadow -->
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/shadow_length"
-        android:background="@drawable/shadow_fade_up" />
-    <include layout="@layout/dialpad_view" />
-    <!-- "Dialpad chooser" UI, shown only when the user brings up the
-             Dialer while a call is already in progress.
-             When this UI is visible, the other Dialer elements
-             (the textfield/button and the dialpad) are hidden. -->
-    <ListView android:id="@+id/dialpadChooser"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+
+        <!-- spacer view -->
+        <View
+            android:id="@+id/spacer"
             android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:background="@color/background_dialer_light"
-            android:visibility="gone" />
+            android:layout_height="0dp"
+            android:layout_weight="1"
+            android:background="#00000000" />
+        <!-- Dialpad shadow -->
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/shadow_length"
+            android:background="@drawable/shadow_fade_up" />
+        <include layout="@layout/dialpad_view" />
+        <!-- "Dialpad chooser" UI, shown only when the user brings up the
+                 Dialer while a call is already in progress.
+                 When this UI is visible, the other Dialer elements
+                 (the textfield/button and the dialpad) are hidden. -->
+        <ListView android:id="@+id/dialpadChooser"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@color/background_dialer_light"
+                android:visibility="gone" />
+
+    </LinearLayout>
+
+    <!-- Margin bottom and alignParentBottom don't work well together, so use a Space instead. -->
+    <Space android:id="@+id/dialpad_floating_action_button_margin_bottom"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/floating_action_button_margin_bottom"
+        android:layout_alignParentBottom="true" />
+
+    <FrameLayout
+        android:id="@+id/dialpad_floating_action_button_container"
+        android:background="@drawable/fab_green"
+        android:layout_width="@dimen/floating_action_button_width"
+        android:layout_height="@dimen/floating_action_button_height"
+        android:layout_above="@id/dialpad_floating_action_button_margin_bottom"
+        android:layout_centerHorizontal="true">
+
+        <ImageButton
+            android:id="@+id/dialpad_floating_action_button"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:background="@drawable/floating_action_button"
+            android:contentDescription="@string/description_dial_button"
+            android:src="@drawable/fab_ic_call"/>
+
+    </FrameLayout>
+
 </view>
diff --git a/res/layout/dialtacts_activity.xml b/res/layout/dialtacts_activity.xml
index aa4ce94..0f1f2bb 100644
--- a/res/layout/dialtacts_activity.xml
+++ b/res/layout/dialtacts_activity.xml
@@ -22,9 +22,8 @@
     android:focusable="true"
     android:focusableInTouchMode="true"
     android:clipChildren="false"
-    android:animateLayoutChanges="true"
-    android:background="@color/background_dialer_light"
-    >
+    android:background="@color/background_dialer_light">
+
     <FrameLayout
         android:id="@+id/dialtacts_container"
         android:layout_width="match_parent"
@@ -37,22 +36,25 @@
             android:id="@+id/dialtacts_frame"
             android:clipChildren="false" />
     </FrameLayout>
+
     <FrameLayout
         android:id="@+id/floating_action_button_container"
+        android:background="@drawable/fab_blue"
         android:layout_width="@dimen/floating_action_button_width"
         android:layout_height="@dimen/floating_action_button_height"
         android:layout_marginBottom="@dimen/floating_action_button_margin_bottom"
-        android:layout_gravity="center_horizontal|bottom" >
+        android:layout_gravity="center_horizontal|bottom">
 
         <ImageButton
             android:id="@+id/floating_action_button"
+            android:background="@drawable/floating_action_button"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:background="@drawable/floating_action_button"
             android:contentDescription="@string/action_menu_dialpad_button"
             android:src="@drawable/fab_ic_dial"/>
 
     </FrameLayout>
+
     <!-- Host container for the contact tile drag shadow -->
     <FrameLayout
         android:id="@+id/activity_overlay"
@@ -65,4 +67,5 @@
             android:visibility="gone"
             android:importantForAccessibility="no" />
     </FrameLayout>
+
 </FrameLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index f9bd79e..a59ea47 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -17,12 +17,14 @@
 
 
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- Directory partition name -->
+
+    <!-- Application name used in Settings/Apps. Default label for activities
+         that don't specify a label. -->
     <string name="applicationLabel">Dialer</string>
 
     <!-- Title for the activity that dials the phone.  This is the name
-    used in the Launcher icon. -->
-    <string name="launcherDialer">Phone</string>
+         used in the Launcher icon. -->
+    <string name="launcherActivityLabel">Phone</string>
 
     <!-- The description text for the dialer tab.
 
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 9d0fcd0..74a5231 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -76,6 +76,7 @@
         <item name="android:colorPrimary">@color/dialer_theme_color</item>
         <item name="android:colorPrimaryDark">@color/dialer_theme_color_dark</item>
         <item name="dialpad_key_button_touch_tint">@color/dialer_dialpad_touch_tint</item>
+        <item name="android:colorControlActivated">@color/dialer_theme_color</item>
     </style>
 
     <!-- Action bar overflow menu icon. -->
diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index 6991be6..035ec8b 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -16,9 +16,7 @@
 
 package com.android.dialer;
 
-import android.animation.LayoutTransition;
 import android.app.ActionBar;
-import android.app.Activity;
 import android.app.Fragment;
 import android.app.FragmentTransaction;
 import android.content.ActivityNotFoundException;
@@ -30,7 +28,6 @@
 import android.content.res.Resources;
 import android.net.Uri;
 import android.os.Bundle;
-import android.os.RemoteException;
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.Intents;
 import android.speech.RecognizerIntent;
@@ -53,7 +50,6 @@
 import android.view.ViewTreeObserver;
 import android.view.animation.Animation;
 import android.view.animation.AnimationUtils;
-import android.view.inputmethod.InputMethodManager;
 import android.widget.AbsListView.OnScrollListener;
 import android.widget.EditText;
 import android.widget.FrameLayout;
@@ -103,7 +99,6 @@
 public class DialtactsActivity extends TransactionSafeActivity implements View.OnClickListener,
         DialpadFragment.OnDialpadQueryChangedListener,
         OnListFragmentScrolledListener,
-        DialpadFragment.HostInterface,
         ListsFragment.HostInterface,
         SpeedDialFragment.HostInterface,
         SearchFragment.HostInterface,
@@ -224,9 +219,6 @@
     private DragDropController mDragDropController;
     private ActionBarController mActionBarController;
 
-    private String mDescriptionDialButtonStr;
-    private String mActionMenuDialpadButtonStr;
-    private ImageButton mFloatingActionButton;
     private FloatingActionButtonController mFloatingActionButtonController;
 
     private int mActionBarHeight;
@@ -351,8 +343,6 @@
 
         final Resources resources = getResources();
         mActionBarHeight = resources.getDimensionPixelSize(R.dimen.action_bar_height_large);
-        mDescriptionDialButtonStr = resources.getString(R.string.description_dial_button);
-        mActionMenuDialpadButtonStr = resources.getString(R.string.action_menu_dialpad_button);
 
         setContentView(R.layout.dialtacts_activity);
         getWindow().setBackgroundDrawable(null);
@@ -389,12 +379,10 @@
 
         final View floatingActionButtonContainer = findViewById(
                 R.id.floating_action_button_container);
-        mFloatingActionButton = (ImageButton) findViewById(R.id.floating_action_button);
-        int floatingActionButtonWidth = resources.getDimensionPixelSize(
-                R.dimen.floating_action_button_width);
-        mFloatingActionButton.setOnClickListener(this);
+        ImageButton floatingActionButton = (ImageButton) findViewById(R.id.floating_action_button);
+        floatingActionButton.setOnClickListener(this);
         mFloatingActionButtonController = new FloatingActionButtonController(this,
-                floatingActionButtonContainer, mFloatingActionButton);
+                floatingActionButtonContainer, floatingActionButton);
 
         ImageButton optionsMenuButton =
                 (ImageButton) searchEditTextLayout.findViewById(R.id.dialtacts_options_menu_button);
@@ -435,14 +423,13 @@
         mSlideOut.setAnimationListener(mSlideOutListener);
 
         parentLayout = (FrameLayout) findViewById(R.id.dialtacts_mainlayout);
-        parentLayout.getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);
         parentLayout.setOnDragListener(new LayoutOnDragListener());
         floatingActionButtonContainer.getViewTreeObserver().addOnGlobalLayoutListener(
                 new ViewTreeObserver.OnGlobalLayoutListener() {
                     @Override
                     public void onGlobalLayout() {
-                        final ViewTreeObserver observer = floatingActionButtonContainer
-                                .getViewTreeObserver();
+                        final ViewTreeObserver observer =
+                                floatingActionButtonContainer.getViewTreeObserver();
                         if (!observer.isAlive()) {
                             return;
                         }
@@ -543,9 +530,6 @@
                 if (!mIsDialpadShown) {
                     mInCallDialpadUp = false;
                     showDialpadFragment(true);
-                } else {
-                    // Dial button was pressed; tell the Dialpad fragment
-                    mDialpadFragment.dialButtonPressed();
                 }
                 break;
             case R.id.voice_search_button:
@@ -637,6 +621,7 @@
         ft.show(mDialpadFragment);
         ft.commit();
 
+        mFloatingActionButtonController.scaleOut();
         mActionBarController.onDialpadUp();
 
         if (!isInSearchUi()) {
@@ -648,9 +633,6 @@
      * Callback from child DialpadFragment when the dialpad is shown.
      */
     public void onDialpadShown() {
-        mFloatingActionButton.setImageResource(R.drawable.fab_ic_call);
-        mFloatingActionButton.setContentDescription(mDescriptionDialButtonStr);
-        updateFloatingActionButtonControllerAlignment(mDialpadFragment.getAnimate());
         if (mDialpadFragment.getAnimate()) {
             mDialpadFragment.getView().startAnimation(mSlideIn);
         } else {
@@ -679,8 +661,6 @@
         mDialpadFragment.setAnimate(animate);
 
         updateSearchFragmentPosition();
-        mFloatingActionButton.setImageResource(R.drawable.fab_ic_dial);
-        mFloatingActionButton.setContentDescription(mActionMenuDialpadButtonStr);
 
         updateFloatingActionButtonControllerAlignment(animate);
         if (animate) {
@@ -705,6 +685,8 @@
         final FragmentTransaction ft = getFragmentManager().beginTransaction();
         ft.hide(mDialpadFragment);
         ft.commit();
+
+        mFloatingActionButtonController.scaleIn(AnimUtils.NO_DELAY);
     }
 
     private void updateSearchFragmentPosition() {
@@ -1008,11 +990,6 @@
         // interactions with the ListsFragments.
     }
 
-    @Override
-    public void setFloatingActionButtonVisible(boolean visible) {
-        mFloatingActionButtonController.setVisible(visible);
-    }
-
     private boolean phoneIsInUse() {
         return getTelecommManager().isInCall();
     }
@@ -1180,19 +1157,9 @@
      * @param animate Whether or not to animate the transition.
      */
     private void updateFloatingActionButtonControllerAlignment(boolean animate) {
-        int align;
-        if (mIsDialpadShown) {
-            align = mIsLandscape ? FloatingActionButtonController.ALIGN_QUARTER_END
-                    : FloatingActionButtonController.ALIGN_MIDDLE;
-        } else {
-            if (!mIsLandscape) {
-                align = mCurrentTabPosition == ListsFragment.TAB_INDEX_SPEED_DIAL
-                        ? FloatingActionButtonController.ALIGN_MIDDLE
-                            : FloatingActionButtonController.ALIGN_END;
-            } else {
-                align = FloatingActionButtonController.ALIGN_END;
-            }
-        }
+        int align = (!mIsLandscape && mCurrentTabPosition == ListsFragment.TAB_INDEX_SPEED_DIAL) ?
+                FloatingActionButtonController.ALIGN_MIDDLE :
+                        FloatingActionButtonController.ALIGN_END;
         mFloatingActionButtonController.align(align, 0 /* offsetX */, 0 /* offsetY */, animate);
     }
 }
diff --git a/src/com/android/dialer/dialpad/DialpadFragment.java b/src/com/android/dialer/dialpad/DialpadFragment.java
index 9096791..7e9cc89 100644
--- a/src/com/android/dialer/dialpad/DialpadFragment.java
+++ b/src/com/android/dialer/dialpad/DialpadFragment.java
@@ -58,16 +58,19 @@
 import android.widget.AdapterView;
 import android.widget.BaseAdapter;
 import android.widget.EditText;
+import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.ListView;
 import android.widget.PopupMenu;
+import android.widget.RelativeLayout;
 import android.widget.TextView;
 
 import com.android.contacts.common.CallUtil;
 import com.android.contacts.common.GeoUtil;
 import com.android.contacts.common.util.PhoneNumberFormatter;
 import com.android.contacts.common.util.StopWatch;
+import com.android.contacts.common.widget.FloatingActionButtonController;
 import com.android.dialer.DialtactsActivity;
 import com.android.dialer.NeededForReflection;
 import com.android.dialer.R;
@@ -96,34 +99,20 @@
     private static final String TAG = DialpadFragment.class.getSimpleName();
 
     /**
-     * This interface allows the DialpadFragment to tell its hosting Activity when and when not
-     * to display the "dial" button. While this is logically part of the DialpadFragment, the
-     * need to have a particular kind of slick animation puts the "dial" button in the parent.
-     *
-     * The parent calls dialButtonPressed() and optionsMenuInvoked() on the dialpad fragment
-     * when appropriate.
-     *
-     * TODO: Refactor the app so this interchange is a bit cleaner.
-     */
-    public interface HostInterface {
-        void setFloatingActionButtonVisible(boolean visible);
-    }
-
-    /**
      * LinearLayout with getter and setter methods for the translationY property using floats,
      * for animation purposes.
      */
-    public static class DialpadSlidingLinearLayout extends LinearLayout {
+    public static class DialpadSlidingRelativeLayout extends RelativeLayout {
 
-        public DialpadSlidingLinearLayout(Context context) {
+        public DialpadSlidingRelativeLayout(Context context) {
             super(context);
         }
 
-        public DialpadSlidingLinearLayout(Context context, AttributeSet attrs) {
+        public DialpadSlidingRelativeLayout(Context context, AttributeSet attrs) {
             super(context, attrs);
         }
 
-        public DialpadSlidingLinearLayout(Context context, AttributeSet attrs, int defStyle) {
+        public DialpadSlidingRelativeLayout(Context context, AttributeSet attrs, int defStyle) {
             super(context, attrs, defStyle);
         }
 
@@ -167,6 +156,7 @@
 
     private DialpadView mDialpadView;
     private EditText mDigits;
+    private int mDialpadSlideInDuration;
 
     /** Remembers if we need to clear digits field when the screen is completely gone. */
     private boolean mClearDigitsOnStop;
@@ -178,6 +168,8 @@
     private final Object mToneGeneratorLock = new Object();
     private View mSpacer;
 
+    private FloatingActionButtonController mFloatingActionButtonController;
+
     /**
      * Set of dialpad keys that are currently being pressed
      */
@@ -337,6 +329,8 @@
         if (state != null) {
             mDigitsFilledByIntent = state.getBoolean(PREF_DIGITS_FILLED_BY_INTENT);
         }
+
+        mDialpadSlideInDuration = getResources().getInteger(R.integer.dialpad_slide_in_duration);
     }
 
     @Override
@@ -388,6 +382,14 @@
         mDialpadChooser = (ListView) fragmentView.findViewById(R.id.dialpadChooser);
         mDialpadChooser.setOnItemClickListener(this);
 
+        final View floatingActionButtonContainer =
+                fragmentView.findViewById(R.id.dialpad_floating_action_button_container);
+        final View floatingActionButton =
+                (ImageButton) fragmentView.findViewById(R.id.dialpad_floating_action_button);
+        floatingActionButton.setOnClickListener(this);
+        mFloatingActionButtonController = new FloatingActionButtonController(getActivity(),
+                floatingActionButtonContainer, floatingActionButton);
+
         return fragmentView;
     }
 
@@ -870,27 +872,22 @@
         return popupMenu;
     }
 
-    /**
-     * Called by the containing Activity to tell this Fragment that the dial button has been
-     * pressed.
-     */
-    public void dialButtonPressed() {
-        mHaptic.vibrate();
-        handleDialButtonPressed();
-    }
-
     @Override
     public void onClick(View view) {
         switch (view.getId()) {
+            case R.id.dialpad_floating_action_button:
+                mHaptic.vibrate();
+                handleDialButtonPressed();
+                break;
             case R.id.deleteButton: {
                 keyPressed(KeyEvent.KEYCODE_DEL);
-                return;
+                break;
             }
             case R.id.digits: {
                 if (!isDigitsEmpty()) {
                     mDigits.setCursorVisible(true);
                 }
-                return;
+                break;
             }
             case R.id.dialpad_overflow: {
                 mOverflowPopupMenu.show();
@@ -1217,8 +1214,8 @@
             if (mDialpadView != null) {
                 mDialpadView.setVisibility(View.GONE);
             }
-            ((HostInterface) getActivity()).setFloatingActionButtonVisible(false);
 
+            mFloatingActionButtonController.setVisible(false);
             mDialpadChooser.setVisibility(View.VISIBLE);
 
             // Instantiate the DialpadChooserAdapter and hook it up to the
@@ -1234,7 +1231,8 @@
             } else {
                 mDigits.setVisibility(View.VISIBLE);
             }
-            ((HostInterface) getActivity()).setFloatingActionButtonVisible(true);
+
+            mFloatingActionButtonController.setVisible(true);
             mDialpadChooser.setVisibility(View.GONE);
         }
     }
@@ -1608,10 +1606,14 @@
         if (!hidden) {
             if (mAnimate) {
                 dialpadView.animateShow();
+                mFloatingActionButtonController.scaleIn(mDialpadSlideInDuration);
             }
             activity.onDialpadShown();
             mDigits.requestFocus();
         }
+        if (hidden && mAnimate) {
+            mFloatingActionButtonController.scaleOut();
+        }
     }
 
     public void setAnimate(boolean value) {
@@ -1623,6 +1625,6 @@
     }
 
     public void setYFraction(float yFraction) {
-        ((DialpadSlidingLinearLayout) getView()).setYFraction(yFraction);
+        ((DialpadSlidingRelativeLayout) getView()).setYFraction(yFraction);
     }
 }