summaryrefslogtreecommitdiffstats
path: root/packages/SystemUI/src
diff options
context:
space:
mode:
authorDaniel Sandler <dsandler@android.com>2011-10-04 21:49:30 -0400
committerDaniel Sandler <dsandler@android.com>2011-10-06 13:49:57 -0400
commit8ba33c965f940070060585e45e1c833519bb45c9 (patch)
tree633ce8b62b3210280a17e2d45289344beebbc1e8 /packages/SystemUI/src
parentbeedd8627a82007de61480c9e794dd967b708ded (diff)
downloadframeworks_base-8ba33c965f940070060585e45e1c833519bb45c9.zip
frameworks_base-8ba33c965f940070060585e45e1c833519bb45c9.tar.gz
frameworks_base-8ba33c965f940070060585e45e1c833519bb45c9.tar.bz2
Cascading clear-all in the phone notifications panel.
Bug: 5156350 Change-Id: I22c5a19b162e4aa35bf66d51cd17c1e0cd079053
Diffstat (limited to 'packages/SystemUI/src')
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java79
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java22
2 files changed, 86 insertions, 15 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 79abfed..d6e4d1b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -87,6 +87,7 @@ import com.android.systemui.statusbar.policy.DateView;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.LocationController;
import com.android.systemui.statusbar.policy.NetworkController;
+import com.android.systemui.statusbar.policy.NotificationRowLayout;
public class PhoneStatusBar extends StatusBar {
static final String TAG = "PhoneStatusBar";
@@ -103,8 +104,10 @@ public class PhoneStatusBar extends StatusBar {
static final int EXPANDED_LEAVE_ALONE = -10000;
static final int EXPANDED_FULL_OPEN = -10001;
- private static final int MSG_ANIMATE = 1000;
- private static final int MSG_ANIMATE_REVEAL = 1001;
+ private static final int MSG_ANIMATE = 100;
+ private static final int MSG_ANIMATE_REVEAL = 101;
+ private static final int MSG_OPEN_NOTIFICATION_PANEL = 1000;
+ private static final int MSG_CLOSE_NOTIFICATION_PANEL = 1001;
private static final int MSG_SHOW_INTRUDER = 1002;
private static final int MSG_HIDE_INTRUDER = 1003;
private static final int MSG_OPEN_RECENTS_PANEL = 1020;
@@ -165,7 +168,7 @@ public class PhoneStatusBar extends StatusBar {
// all notifications
NotificationData mNotificationData = new NotificationData();
- ViewGroup mPile;
+ NotificationRowLayout mPile;
// position
int[] mPositionTmp = new int[2];
@@ -324,7 +327,7 @@ public class PhoneStatusBar extends StatusBar {
mExpandedDialog = new ExpandedDialog(context);
mExpandedView = expanded;
- mPile = (ViewGroup)expanded.findViewById(R.id.latestItems);
+ mPile = (NotificationRowLayout)expanded.findViewById(R.id.latestItems);
mExpandedContents = mPile; // was: expanded.findViewById(R.id.notificationLinearLayout);
mNoNotificationsTitle = (TextView)expanded.findViewById(R.id.noNotificationsTitle);
mNoNotificationsTitle.setVisibility(View.GONE); // disabling for now
@@ -332,6 +335,7 @@ public class PhoneStatusBar extends StatusBar {
mClearButton = expanded.findViewById(R.id.clear_all_button);
mClearButton.setOnClickListener(mClearButtonListener);
mClearButton.setAlpha(0f);
+ mClearButton.setEnabled(false);
mDateView = (DateView)expanded.findViewById(R.id.date);
mSettingsButton = expanded.findViewById(R.id.settings_button);
mSettingsButton.setOnClickListener(mSettingsButtonListener);
@@ -1005,6 +1009,7 @@ public class PhoneStatusBar extends StatusBar {
} else {
mClearButton.setAlpha(clearable ? 1.0f : 0.0f);
}
+ mClearButton.setEnabled(clearable);
/*
if (mNoNotificationsTitle.isShown()) {
@@ -1114,6 +1119,12 @@ public class PhoneStatusBar extends StatusBar {
case MSG_ANIMATE_REVEAL:
doRevealAnimation();
break;
+ case MSG_OPEN_NOTIFICATION_PANEL:
+ animateExpand();
+ break;
+ case MSG_CLOSE_NOTIFICATION_PANEL:
+ animateCollapse();
+ break;
case MSG_SHOW_INTRUDER:
setIntruderAlertVisibility(true);
break;
@@ -1181,6 +1192,10 @@ public class PhoneStatusBar extends StatusBar {
}
public void animateCollapse(boolean excludeRecents) {
+ animateCollapse(excludeRecents, 1.0f);
+ }
+
+ public void animateCollapse(boolean excludeRecents, float velocityMultiplier) {
if (SPEW) {
Slog.d(TAG, "animateCollapse(): mExpanded=" + mExpanded
+ " mExpandedVisible=" + mExpandedVisible
@@ -1209,7 +1224,7 @@ public class PhoneStatusBar extends StatusBar {
// and doesn't try to re-open the windowshade.
mExpanded = true;
prepareTracking(y, false);
- performFling(y, -mSelfCollapseVelocityPx, true);
+ performFling(y, -mSelfCollapseVelocityPx*velocityMultiplier, true);
}
void performExpand() {
@@ -2086,13 +2101,57 @@ public class PhoneStatusBar extends StatusBar {
}
private View.OnClickListener mClearButtonListener = new View.OnClickListener() {
+ final int mini(int a, int b) {
+ return (b>a?a:b);
+ }
public void onClick(View v) {
- try {
- mBarService.onClearAllNotifications();
- } catch (RemoteException ex) {
- // system process is dead if we're here.
+ synchronized (mNotificationData) {
+ // let's also queue up 400ms worth of animated dismissals
+ final int N = mini(5, mPile.getChildCount());
+
+ final ArrayList<View> snapshot = new ArrayList<View>(N);
+ for (int i=0; i<N; i++) {
+ final View child = mPile.getChildAt(i);
+ if (mPile.canChildBeDismissed(child)) snapshot.add(child);
+ }
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ final int ROW_DELAY = 100;
+
+ mHandler.postDelayed(new Runnable() {
+ public void run() {
+ animateCollapse(false, 0f);
+ }
+ }, (N-1) * ROW_DELAY);
+
+ mHandler.postDelayed(new Runnable() {
+ public void run() {
+ try {
+ mBarService.onClearAllNotifications();
+ } catch (RemoteException ex) { }
+ }
+ }, N * ROW_DELAY + 500);
+
+ mPile.setAnimateBounds(false); // temporarily disable some re-layouts
+
+ for (View v : snapshot) {
+ final View _v = v;
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mPile.dismissRowAnimated(_v, (int)(ROW_DELAY*0.25f));
+ }
+ });
+ try {
+ Thread.sleep(ROW_DELAY);
+ } catch (InterruptedException ex) { }
+ }
+
+ mPile.setAnimateBounds(true); // reenable layout animation
+ }
+ }).start();
}
- animateCollapse();
}
};
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java
index 06798c6..a7342dc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java
@@ -44,11 +44,11 @@ public class NotificationRowLayout extends ViewGroup implements SwipeHelper.Call
private static final boolean DEBUG = false;
private static final boolean SLOW_ANIMATIONS = DEBUG;
- private static final boolean ANIMATE_LAYOUT = true;
-
private static final int APPEAR_ANIM_LEN = SLOW_ANIMATIONS ? 5000 : 250;
private static final int DISAPPEAR_ANIM_LEN = APPEAR_ANIM_LEN;
+ boolean mAnimateBounds = true;
+
Rect mTmpRect = new Rect();
int mNumRows = 0;
int mRowHeight = 0;
@@ -93,6 +93,10 @@ public class NotificationRowLayout extends ViewGroup implements SwipeHelper.Call
mSwipeHelper = new SwipeHelper(SwipeHelper.X, this, densityScale, pagingTouchSlop);
}
+ public void setAnimateBounds(boolean anim) {
+ mAnimateBounds = anim;
+ }
+
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (DEBUG) Log.v(TAG, "onInterceptTouchEvent()");
@@ -165,7 +169,7 @@ public class NotificationRowLayout extends ViewGroup implements SwipeHelper.Call
final View childF = child;
- if (ANIMATE_LAYOUT) {
+ if (mAnimateBounds) {
child.setPivotY(0);
final ObjectAnimator alphaFade = ObjectAnimator.ofFloat(child, "alpha", 0f, 1f);
alphaFade.setDuration(APPEAR_ANIM_LEN);
@@ -185,10 +189,18 @@ public class NotificationRowLayout extends ViewGroup implements SwipeHelper.Call
}
}
+ public void dismissRowAnimated(View child) {
+ dismissRowAnimated(child, 0);
+ }
+
+ public void dismissRowAnimated(View child, int vel) {
+ mSwipeHelper.dismissChild(child, vel);
+ }
+
@Override
public void removeView(View child) {
final View childF = child;
- if (ANIMATE_LAYOUT) {
+ if (mAnimateBounds) {
if (mAppearingViews.containsKey(child)) {
mAppearingViews.remove(child);
}
@@ -264,7 +276,7 @@ public class NotificationRowLayout extends ViewGroup implements SwipeHelper.Call
mNumRows = numRows;
- if (ANIMATE_LAYOUT && isShown()) {
+ if (mAnimateBounds && isShown()) {
ObjectAnimator.ofInt(this, "forcedHeight", computedHeight)
.setDuration(APPEAR_ANIM_LEN)
.start();