Merge "Improve touch target for the gear beneath a notification" into nyc-dev
diff --git a/packages/SystemUI/res/layout/notification_settings_icon_row.xml b/packages/SystemUI/res/layout/notification_settings_icon_row.xml
index 74f6f9d..52d07fc 100644
--- a/packages/SystemUI/res/layout/notification_settings_icon_row.xml
+++ b/packages/SystemUI/res/layout/notification_settings_icon_row.xml
@@ -17,20 +17,21 @@
 <com.android.systemui.statusbar.NotificationSettingsIconRow
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
+    android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     >
 
     <com.android.systemui.statusbar.AlphaOptimizedImageView
         android:id="@+id/gear_icon"
-        android:layout_width="@dimen/notification_gear_size"
-        android:layout_height="@dimen/notification_gear_size"
-        android:layout_marginTop="@dimen/notification_gear_top_margin"
-        android:layout_marginStart="@dimen/notification_gear_side_margin"
-        android:layout_marginEnd="@dimen/notification_gear_side_margin"
+        android:layout_width="@dimen/notification_gear_width"
+        android:layout_height="@dimen/notification_gear_height"
+        android:paddingTop="@dimen/notification_gear_top_padding"
+        android:paddingStart="@dimen/notification_gear_padding"
+        android:paddingEnd="@dimen/notification_gear_padding"
+        android:paddingBottom="@dimen/notification_gear_padding"
         android:src="@drawable/ic_settings"
         android:tint="@color/notification_gear_color"
-        android:visibility="gone"
+        android:visibility="invisible"
         android:alpha="0"
         android:background="?android:attr/selectableItemBackgroundBorderless"
         />
diff --git a/packages/SystemUI/res/layout/status_bar_notification_row.xml b/packages/SystemUI/res/layout/status_bar_notification_row.xml
index 045ede3..c4c45bb 100644
--- a/packages/SystemUI/res/layout/status_bar_notification_row.xml
+++ b/packages/SystemUI/res/layout/status_bar_notification_row.xml
@@ -27,7 +27,7 @@
         android:layout="@layout/notification_settings_icon_row"
         android:id="@+id/settings_icon_row_stub"
         android:inflatedId="@+id/notification_settings_icon_row"
-        android:layout_width="match_parent"
+        android:layout_width="wrap_content"
         android:layout_height="match_parent"
         />
 
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 8c93e2a..27bfcd7 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -78,14 +78,17 @@
     <!-- Minimum layouted height of a notification in the statusbar-->
     <dimen name="min_notification_layout_height">48dp</dimen>
 
-    <!-- Size of gear icon displayed behind a notification -->
-    <dimen name="notification_gear_size">24dp</dimen>
+    <!-- Width of the space containing the gear icon behind a notification -->
+    <dimen name="notification_gear_width">64dp</dimen>
+
+    <!-- Height of the space containing the gear icon behind a notification -->
+    <dimen name="notification_gear_height">74dp</dimen>
 
     <!-- The space above the gear icon displayed behind a notification -->
-    <dimen name="notification_gear_top_margin">30dp</dimen>
+    <dimen name="notification_gear_top_padding">30dp</dimen>
 
-    <!-- The space on either side of the gear icon displayed behind a notification  -->
-    <dimen name="notification_gear_side_margin">20dp</dimen>
+    <!-- The space on either side and below the gear icon displayed behind a notification  -->
+    <dimen name="notification_gear_padding">20dp</dimen>
 
     <!-- size at which Notification icons will be drawn in the status bar -->
     <dimen name="status_bar_icon_drawing_size">17dip</dimen>
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
index 874defa..315c509 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
@@ -208,6 +208,10 @@
         return false;
     }
 
+    protected boolean handleSlideBack() {
+        return false;
+    }
+
     @Override
     public boolean onTouchEvent(MotionEvent event) {
         boolean result;
@@ -260,6 +264,9 @@
                 break;
             case MotionEvent.ACTION_UP:
                 if (isWithinTouchSlop(event)) {
+                    if (handleSlideBack()) {
+                        return true;
+                    }
                     if (!mActivated) {
                         makeActive();
                         postDelayed(mTapTimeoutRunnable, DOUBLETAP_TIMEOUT_MS);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index 411fd08..ea8b75e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -1657,6 +1657,12 @@
                 return;
             }
 
+            // Check if the notification is displaying the gear, if so slide notification back
+            if (row.getSettingsRow() != null && row.getSettingsRow().isVisible()) {
+                row.animateTranslateNotification(0);
+                return;
+            }
+
             Notification notification = sbn.getNotification();
             final PendingIntent intent = notification.contentIntent != null
                     ? notification.contentIntent
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index 94511da..397afb3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -340,6 +340,15 @@
     }
 
     @Override
+    protected boolean handleSlideBack() {
+        if (mSettingsIconRow != null && mSettingsIconRow.isVisible()) {
+            animateTranslateNotification(0 /* targetLeft */);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
     protected boolean shouldHideBackground() {
         return super.shouldHideBackground() || mShowNoBackground;
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSettingsIconRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSettingsIconRow.java
index 8fcd455..4491ebd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSettingsIconRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSettingsIconRow.java
@@ -22,7 +22,6 @@
 import android.content.Context;
 import android.util.AttributeSet;
 import android.view.View;
-import android.view.ViewGroup;
 import android.widget.FrameLayout;
 
 import com.android.systemui.Interpolators;
@@ -69,12 +68,9 @@
         super.onFinishInflate();
         mGearIcon = (AlphaOptimizedImageView) findViewById(R.id.gear_icon);
         mGearIcon.setOnClickListener(this);
-
-        final float iconMargin =
-                ((ViewGroup.MarginLayoutParams) mGearIcon.getLayoutParams()).getMarginStart();
-        final float iconWidth =
-                getResources().getDimensionPixelOffset(R.dimen.notification_gear_size);
-        mHorizSpaceForGear = (iconWidth + iconMargin * 2);
+        setOnClickListener(this);
+        mHorizSpaceForGear =
+                getResources().getDimensionPixelOffset(R.dimen.notification_gear_width);
         resetState();
     }
 
@@ -140,7 +136,6 @@
         final float absTrans = Math.abs(transX);
         float desiredAlpha = 0;
 
-        // if ((fromLeft && transX <= fadeThreshold) || (!fromLeft && absTrans <= fadeThreshold)) {
         if (absTrans <= fadeThreshold) {
             desiredAlpha = 1;
         } else {
@@ -191,17 +186,24 @@
         mFadeAnimator.start();
     }
 
-    @Override
-    public void onClick(View v) {
-        mListener.onGearTouched(mParent);
-    }
-
     private void setIconLocation(boolean onLeft) {
         if (onLeft == mOnLeft) {
             // Same side? Do nothing.
             return;
         }
-        mGearIcon.setTranslationX(onLeft ? 0 : (getWidth() - mHorizSpaceForGear));
+
+        setTranslationX(onLeft ? 0 : (mParent.getWidth() - mHorizSpaceForGear));
         mOnLeft = onLeft;
     }
+
+    @Override
+    public void onClick(View v) {
+        if (v.getId() == R.id.gear_icon) {
+            if (mListener != null) {
+                mListener.onGearTouched(mParent);
+            }
+        } else {
+            // Do nothing when the background is touched.
+        }
+    }
 }