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