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();
+ }
+}