Improved the dismiss all animation

Added an AVD to the icon and changed the order
to be from bottom to the top.

Bug: 17903685
Bug: 17007783
Change-Id: Ia1509e2d4e02c87782285e05b7b7fb6a11854f95
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DismissViewButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/DismissViewButton.java
new file mode 100644
index 0000000..f2a5673
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/DismissViewButton.java
@@ -0,0 +1,136 @@
+/*
+ * 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
+ */
+
+package com.android.systemui.statusbar;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.drawable.AnimatedVectorDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.SystemClock;
+import android.util.AttributeSet;
+import android.view.Choreographer;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewRootImpl;
+import android.widget.Button;
+import com.android.systemui.R;
+import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
+
+public class DismissViewButton extends Button {
+    private AnimatedVectorDrawable mAnimatedDismissDrawable;
+    private final Drawable mStaticDismissDrawable;
+    private Drawable mActiveDrawable;
+
+    public DismissViewButton(Context context) {
+        this(context, null);
+    }
+
+    public DismissViewButton(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public DismissViewButton(Context context, AttributeSet attrs, int defStyleAttr) {
+        this(context, attrs, defStyleAttr, 0);
+    }
+
+    public DismissViewButton(Context context, AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+        mAnimatedDismissDrawable = (AnimatedVectorDrawable) getContext().getResources().getDrawable(
+                R.drawable.dismiss_all_shape_animation).mutate();
+        mAnimatedDismissDrawable.setCallback(this);
+        mAnimatedDismissDrawable.setBounds(0,
+                0,
+                mAnimatedDismissDrawable.getIntrinsicWidth(),
+                mAnimatedDismissDrawable.getIntrinsicHeight());
+        mStaticDismissDrawable = getContext().getResources().getDrawable(
+                R.drawable.dismiss_all_shape);
+        mStaticDismissDrawable.setBounds(0,
+                0,
+                mStaticDismissDrawable.getIntrinsicWidth(),
+                mStaticDismissDrawable.getIntrinsicHeight());
+        mStaticDismissDrawable.setCallback(this);
+        mActiveDrawable = mStaticDismissDrawable;
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        super.onDraw(canvas);
+        canvas.save();
+        int drawableHeight = mActiveDrawable.getBounds().height();
+        boolean isRtl = (getLayoutDirection() == View.LAYOUT_DIRECTION_RTL);
+        int dx = isRtl ? getWidth() / 2 + drawableHeight / 2 : getWidth() / 2 - drawableHeight / 2;
+        canvas.translate(dx, getHeight() / 2.0f + drawableHeight /
+                2.0f);
+        canvas.scale(isRtl ? -1.0f : 1.0f, -1.0f);
+        mActiveDrawable.draw(canvas);
+        canvas.restore();
+    }
+
+    @Override
+    public boolean performClick() {
+        if (!mAnimatedDismissDrawable.isRunning()) {
+            mActiveDrawable = mAnimatedDismissDrawable;
+            mAnimatedDismissDrawable.start();
+        }
+        return super.performClick();
+    }
+
+    @Override
+    protected boolean verifyDrawable(Drawable who) {
+        return super.verifyDrawable(who)
+                || who == mAnimatedDismissDrawable
+                || who == mStaticDismissDrawable;
+    }
+
+    @Override
+    public boolean hasOverlappingRendering() {
+        return false;
+    }
+
+    /**
+     * This method returns the drawing rect for the view which is different from the regular
+     * drawing rect, since we layout all children in the {@link NotificationStackScrollLayout} at
+     * position 0 and usually the translation is neglected. The standard implementation doesn't
+     * account for translation.
+     *
+     * @param outRect The (scrolled) drawing bounds of the view.
+     */
+    @Override
+    public void getDrawingRect(Rect outRect) {
+        super.getDrawingRect(outRect);
+        float translationX = ((ViewGroup) mParent).getTranslationX();
+        float translationY = ((ViewGroup) mParent).getTranslationY();
+        outRect.left += translationX;
+        outRect.right += translationX;
+        outRect.top += translationY;
+        outRect.bottom += translationY;
+    }
+
+    public void showButton() {
+        mActiveDrawable = mStaticDismissDrawable;
+        invalidate();
+    }
+
+    /**
+     * @return Whether the button is currently static and not being animated.
+     */
+    public boolean isButtonStatic() {
+        return mActiveDrawable == mStaticDismissDrawable;
+    }
+}