Settings: Fabulous "Add rule" button.

Bug: 20064962
Change-Id: If7ff9d6cdfc61e5dd9e0d3bc4e2228c5fdaf9fa9
diff --git a/res/anim/fab_elevation.xml b/res/anim/fab_elevation.xml
new file mode 100644
index 0000000..af75db0
--- /dev/null
+++ b/res/anim/fab_elevation.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_enabled="true" android:state_pressed="true">
+        <set>
+            <objectAnimator
+                android:duration="@android:integer/config_shortAnimTime"
+                android:propertyName="translationZ"
+                android:valueTo="@dimen/fab_press_translation_z"
+                android:valueType="floatType" />
+        </set>
+    </item>
+    <item>
+        <set>
+            <objectAnimator
+                android:duration="@android:integer/config_shortAnimTime"
+                android:propertyName="translationZ"
+                android:valueTo="0"
+                android:valueType="floatType" />
+        </set>
+    </item>
+</selector>
\ No newline at end of file
diff --git a/res/menu/zen_mode_automation.xml b/res/drawable/fab_background.xml
similarity index 67%
rename from res/menu/zen_mode_automation.xml
rename to res/drawable/fab_background.xml
index 02ec41f..a692a2a 100644
--- a/res/menu/zen_mode_automation.xml
+++ b/res/drawable/fab_background.xml
@@ -13,12 +13,11 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
-    <item
-        android:id="@+id/add"
-        android:title="@string/zen_mode_time_add_rule"
-        android:icon="@drawable/ic_menu_add_white"
-        android:visible="true"
-        android:showAsAction="collapseActionView|ifRoom" />
-</menu>
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+        android:color="@color/fab_ripple">
+    <item>
+        <shape>
+            <solid android:color="@color/fab_shape" />
+        </shape>
+    </item>
+</ripple>
\ No newline at end of file
diff --git a/res/layout/preference_list_fragment.xml b/res/layout/preference_list_fragment.xml
index 195f6eb..1412381 100644
--- a/res/layout/preference_list_fragment.xml
+++ b/res/layout/preference_list_fragment.xml
@@ -49,6 +49,18 @@
 
         <include layout="@layout/loading_container" />
 
+        <com.android.settings.widget.FloatingActionButton
+                  android:id="@+id/fab"
+                  android:visibility="gone"
+                  android:clickable="true"
+                  android:layout_width="@dimen/fab_size"
+                  android:layout_height="@dimen/fab_size"
+                  android:layout_gravity="bottom|end"
+                  android:layout_marginEnd="@dimen/fab_margin"
+                  android:layout_marginBottom="@dimen/fab_margin"
+                  android:elevation="@dimen/fab_elevation"
+                  android:background="@drawable/fab_background" />
+
     </FrameLayout>
 
     <TextView android:id="@android:id/empty"
diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml
index a26c99b..d9521db 100755
--- a/res/values-sw600dp/dimens.xml
+++ b/res/values-sw600dp/dimens.xml
@@ -89,4 +89,5 @@
     <dimen name="wifi_assistant_text_padding">24dp</dimen>
 
     <dimen name="confirm_credentials_security_method_margin">72dp</dimen>
+    <dimen name="fab_margin">24dp</dimen>
 </resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 0d0637c..6f0352c 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -81,4 +81,6 @@
 
     <color name="warning">#ff5621</color>
     <color name="confirm_device_credential_dark_background">#263238</color>
+    <color name="fab_ripple">#1fffffff</color><!-- 12% white -->
+    <color name="fab_shape">#ff009688</color><!-- Teal 500 -->
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 07e6957..8a58c5c 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -239,4 +239,8 @@
     <dimen name="fingerprint_ring_thickness">4dip</dimen>
 
     <dimen name="confirm_credentials_security_method_margin">48dp</dimen>
+    <dimen name="fab_size">56dp</dimen>
+    <dimen name="fab_margin">16dp</dimen>
+    <dimen name="fab_elevation">12dp</dimen>
+    <dimen name="fab_press_translation_z">9dp</dimen>
 </resources>
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index 9e645ab..17ff4b2 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -42,6 +42,8 @@
 import android.widget.ListAdapter;
 import android.widget.ListView;
 
+import com.android.settings.widget.FloatingActionButton;
+
 /**
  * Base class for Settings fragments, with some helper functions and dialog management.
  */
@@ -80,6 +82,7 @@
     };
 
     private ViewGroup mPinnedHeaderFrameLayout;
+    private FloatingActionButton mFloatingActionButton;
 
     @Override
     public void onCreate(Bundle icicle) {
@@ -101,9 +104,14 @@
             Bundle savedInstanceState) {
         final View root = super.onCreateView(inflater, container, savedInstanceState);
         mPinnedHeaderFrameLayout = (ViewGroup) root.findViewById(R.id.pinned_header);
+        mFloatingActionButton = (FloatingActionButton) root.findViewById(R.id.fab);
         return root;
     }
 
+    public FloatingActionButton getFloatingActionButton() {
+        return mFloatingActionButton;
+    }
+
     public void setPinnedHeaderView(View pinnedHeader) {
         mPinnedHeaderFrameLayout.addView(pinnedHeader);
         mPinnedHeaderFrameLayout.setVisibility(View.VISIBLE);
diff --git a/src/com/android/settings/notification/ZenModeAutomationSettings.java b/src/com/android/settings/notification/ZenModeAutomationSettings.java
index f2ee71d..6636b33 100644
--- a/src/com/android/settings/notification/ZenModeAutomationSettings.java
+++ b/src/com/android/settings/notification/ZenModeAutomationSettings.java
@@ -33,14 +33,14 @@
 import android.service.notification.ZenModeConfig.ZenRule;
 import android.text.format.DateFormat;
 import android.util.Log;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
+import android.view.View;
+import android.view.View.OnClickListener;
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.notification.ManagedServiceSettings.Config;
 import com.android.settings.notification.ZenRuleNameDialog.RuleInfo;
+import com.android.settings.widget.FloatingActionButton;
 
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
@@ -59,7 +59,6 @@
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
-        setHasOptionsMenu(true);
         addPreferencesFromResource(R.xml.zen_mode_automation_settings);
         mServiceListing = new ServiceListing(mContext, CONFIG);
         mServiceListing.addCallback(mServiceListingCallback);
@@ -68,6 +67,21 @@
     }
 
     @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        final FloatingActionButton fab = getFloatingActionButton();
+        fab.setVisibility(View.VISIBLE);
+        fab.setImageResource(R.drawable.ic_menu_add_white);
+        fab.setContentDescription(getString(R.string.zen_mode_time_add_rule));
+        fab.setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                showAddRuleDialog();
+            }
+        });
+    }
+
+    @Override
     public void onDestroy() {
         super.onDestroy();
         mServiceListing.setListening(false);
@@ -75,20 +89,6 @@
     }
 
     @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        inflater.inflate(R.menu.zen_mode_automation, menu);
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        if (item.getItemId() == R.id.add) {
-            showAddRuleDialog();
-            return true;
-        }
-        return super.onOptionsItemSelected(item);
-    }
-
-    @Override
     protected void onZenModeChanged() {
         // don't care
     }
diff --git a/src/com/android/settings/widget/FloatingActionButton.java b/src/com/android/settings/widget/FloatingActionButton.java
new file mode 100644
index 0000000..181c6c0
--- /dev/null
+++ b/src/com/android/settings/widget/FloatingActionButton.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+package com.android.settings.widget;
+
+import android.animation.AnimatorInflater;
+import android.content.Context;
+import android.graphics.Outline;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewOutlineProvider;
+import android.widget.ImageView;
+
+import com.android.settings.R;
+
+public class FloatingActionButton extends ImageView {
+
+    public FloatingActionButton(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        setScaleType(ScaleType.CENTER);
+        setStateListAnimator(AnimatorInflater.loadStateListAnimator(context, R.anim.fab_elevation));
+        setOutlineProvider(new ViewOutlineProvider() {
+            @Override
+            public void getOutline(View view, Outline outline) {
+                outline.setOval(0, 0, getWidth(), getHeight());
+            }
+        });
+        setClipToOutline(true);
+    }
+
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        super.onSizeChanged(w, h, oldw, oldh);
+        invalidateOutline();
+    }
+}