Skip to content

Commit 040c2e4

Browse files
committed
For Matias.
<3, dsandler. Bug: 7348917 Change-Id: I193a94ab82a9e59068c95624c2e8d375543f71f7
1 parent 91ffedd commit 040c2e4

File tree

4 files changed

+170
-95
lines changed

4 files changed

+170
-95
lines changed

packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import android.graphics.Canvas;
2222
import android.graphics.drawable.Drawable;
2323
import android.util.AttributeSet;
24+
import android.util.Slog;
25+
import android.view.MotionEvent;
2426
import android.view.View;
2527

2628
import com.android.systemui.R;
@@ -31,11 +33,18 @@ public class NotificationPanelView extends PanelView {
3133
Drawable mHandleBar;
3234
float mHandleBarHeight;
3335
View mHandleView;
36+
int mFingers;
37+
PhoneStatusBar mStatusBar;
38+
private boolean mFlipped;
3439

3540
public NotificationPanelView(Context context, AttributeSet attrs) {
3641
super(context, attrs);
3742
}
3843

44+
public void setStatusBar(PhoneStatusBar bar) {
45+
mStatusBar = bar;
46+
}
47+
3948
@Override
4049
protected void onFinishInflate() {
4150
super.onFinishInflate();
@@ -79,4 +88,35 @@ public void draw(Canvas canvas) {
7988
mHandleBar.draw(canvas);
8089
canvas.translate(0, -off);
8190
}
91+
92+
@Override
93+
public boolean onTouchEvent(MotionEvent event) {
94+
if (PhoneStatusBar.SETTINGS_DRAG_SHORTCUT && mStatusBar.mHasFlipSettings) {
95+
switch (event.getActionMasked()) {
96+
case MotionEvent.ACTION_DOWN:
97+
mFlipped = false;
98+
break;
99+
case MotionEvent.ACTION_POINTER_DOWN:
100+
if (!mFlipped) {
101+
float miny = event.getY(0);
102+
float maxy = miny;
103+
for (int i=1; i<event.getPointerCount(); i++) {
104+
final float y = event.getY(i);
105+
if (y < miny) miny = y;
106+
if (y > maxy) maxy = y;
107+
}
108+
if (maxy - miny < mHandleBarHeight) {
109+
if (getMeasuredHeight() < mHandleBarHeight) {
110+
mStatusBar.switchToSettings();
111+
} else {
112+
mStatusBar.flipToSettings();
113+
}
114+
mFlipped = true;
115+
}
116+
}
117+
break;
118+
}
119+
}
120+
return mHandleView.dispatchTouchEvent(event);
121+
}
82122
}

packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public boolean onTouchEvent(MotionEvent event) {
102102
startOpeningPanel(panel);
103103
}
104104
final boolean result = mTouchingPanel != null
105-
? mTouchingPanel.getHandle().dispatchTouchEvent(event)
105+
? mTouchingPanel.onTouchEvent(event)
106106
: true;
107107
return result;
108108
}

packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ public boolean onTouch(View v, MotionEvent event) {
250250
case MotionEvent.ACTION_DOWN:
251251
mTracking = true;
252252
mHandleView.setPressed(true);
253+
postInvalidate(); // catch the press state change
253254
mInitialTouchY = y;
254255
mVelocityTracker = VelocityTracker.obtain();
255256
trackMovement(event);
@@ -283,6 +284,7 @@ public boolean onTouch(View v, MotionEvent event) {
283284
mFinalTouchY = y;
284285
mTracking = false;
285286
mHandleView.setPressed(false);
287+
postInvalidate(); // catch the press state change
286288
mBar.onTrackingStopped(PanelView.this);
287289
trackMovement(event);
288290

packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java

Lines changed: 127 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ public class PhoneStatusBar extends BaseStatusBar {
110110

111111
public static final boolean ENABLE_NOTIFICATION_PANEL_CLING = false;
112112

113+
public static final boolean SETTINGS_DRAG_SHORTCUT = true;
114+
113115
// additional instrumentation for testing purposes; intended to be left on during development
114116
public static final boolean CHATTY = DEBUG;
115117

@@ -180,7 +182,7 @@ public class PhoneStatusBar extends BaseStatusBar {
180182
View mMoreIcon;
181183

182184
// expanded notifications
183-
PanelView mNotificationPanel; // the sliding/resizing panel within the notification window
185+
NotificationPanelView mNotificationPanel; // the sliding/resizing panel within the notification window
184186
ScrollView mScrollView;
185187
View mExpandedContents;
186188
int mNotificationPanelGravity;
@@ -363,7 +365,8 @@ public boolean onTouch(View v, MotionEvent event) {
363365
PanelHolder holder = (PanelHolder) mStatusBarWindow.findViewById(R.id.panel_holder);
364366
mStatusBarView.setPanelHolder(holder);
365367

366-
mNotificationPanel = (PanelView) mStatusBarWindow.findViewById(R.id.notification_panel);
368+
mNotificationPanel = (NotificationPanelView) mStatusBarWindow.findViewById(R.id.notification_panel);
369+
mNotificationPanel.setStatusBar(this);
367370
mNotificationPanelIsFullScreenWidth =
368371
(mNotificationPanel.getLayoutParams().width == ViewGroup.LayoutParams.MATCH_PARENT);
369372

@@ -1280,6 +1283,10 @@ public void handleMessage(Message m) {
12801283
}
12811284
}
12821285

1286+
public Handler getHandler() {
1287+
return mHandler;
1288+
}
1289+
12831290
View.OnFocusChangeListener mFocusChangeListener = new View.OnFocusChangeListener() {
12841291
public void onFocusChange(View v, boolean hasFocus) {
12851292
// Because 'v' is a ViewGroup, all its children will be (un)selected
@@ -1294,18 +1301,6 @@ void makeExpandedVisible(boolean revealAfterDraw) {
12941301
return;
12951302
}
12961303

1297-
if (mHasFlipSettings && !mExpandedVisible) {
1298-
// reset things to their proper state
1299-
mScrollView.setScaleX(1f);
1300-
mScrollView.setVisibility(View.VISIBLE);
1301-
mSettingsButton.setAlpha(1f);
1302-
mSettingsButton.setVisibility(View.VISIBLE);
1303-
mNotificationPanel.setVisibility(View.GONE);
1304-
mFlipSettingsView.setVisibility(View.GONE);
1305-
mNotificationButton.setVisibility(View.GONE);
1306-
setAreThereNotifications(); // show the clear button
1307-
}
1308-
13091304
mExpandedVisible = true;
13101305
mPile.setLayoutTransitionsEnabled(true);
13111306
if (mNavigationBarView != null)
@@ -1415,51 +1410,53 @@ public void animateExpandNotificationsPanel() {
14151410
}
14161411

14171412
mNotificationPanel.expand();
1418-
if (mHasFlipSettings) {
1419-
if (mScrollView.getVisibility() != View.VISIBLE) {
1420-
if (mFlipSettingsViewAnim != null) mFlipSettingsViewAnim.cancel();
1421-
if (mScrollViewAnim != null) mScrollViewAnim.cancel();
1422-
if (mSettingsButtonAnim != null) mSettingsButtonAnim.cancel();
1423-
if (mNotificationButtonAnim != null) mNotificationButtonAnim.cancel();
1424-
if (mClearButtonAnim != null) mClearButtonAnim.cancel();
1425-
1426-
mScrollView.setVisibility(View.VISIBLE);
1427-
mScrollViewAnim = start(
1428-
startDelay(FLIP_DURATION_OUT,
1429-
interpolator(mDecelerateInterpolator,
1430-
ObjectAnimator.ofFloat(mScrollView, View.SCALE_X, 0f, 1f)
1431-
.setDuration(FLIP_DURATION_IN)
1432-
)));
1433-
mFlipSettingsViewAnim = start(
1434-
setVisibilityWhenDone(
1435-
interpolator(mAccelerateInterpolator,
1436-
ObjectAnimator.ofFloat(mFlipSettingsView, View.SCALE_X, 1f, 0f)
1437-
)
1438-
.setDuration(FLIP_DURATION_OUT),
1439-
mFlipSettingsView, View.INVISIBLE));
1440-
mNotificationButtonAnim = start(
1441-
setVisibilityWhenDone(
1442-
ObjectAnimator.ofFloat(mNotificationButton, View.ALPHA, 0f)
1443-
.setDuration(FLIP_DURATION),
1444-
mNotificationButton, View.INVISIBLE));
1445-
mSettingsButton.setVisibility(View.VISIBLE);
1446-
mSettingsButtonAnim = start(
1447-
ObjectAnimator.ofFloat(mSettingsButton, View.ALPHA, 1f)
1448-
.setDuration(FLIP_DURATION));
1449-
mClearButton.setVisibility(View.VISIBLE);
1450-
mClearButton.setAlpha(0f);
1451-
setAreThereNotifications(); // this will show/hide the button as necessary
1452-
mNotificationPanel.postDelayed(new Runnable() {
1453-
public void run() {
1454-
updateCarrierLabelVisibility(false);
1455-
}
1456-
}, FLIP_DURATION - 150);
1457-
}
1413+
if (mHasFlipSettings && mScrollView.getVisibility() != View.VISIBLE) {
1414+
flipToNotifications();
14581415
}
14591416

14601417
if (false) postStartTracing();
14611418
}
14621419

1420+
public void flipToNotifications() {
1421+
if (mFlipSettingsViewAnim != null) mFlipSettingsViewAnim.cancel();
1422+
if (mScrollViewAnim != null) mScrollViewAnim.cancel();
1423+
if (mSettingsButtonAnim != null) mSettingsButtonAnim.cancel();
1424+
if (mNotificationButtonAnim != null) mNotificationButtonAnim.cancel();
1425+
if (mClearButtonAnim != null) mClearButtonAnim.cancel();
1426+
1427+
mScrollView.setVisibility(View.VISIBLE);
1428+
mScrollViewAnim = start(
1429+
startDelay(FLIP_DURATION_OUT,
1430+
interpolator(mDecelerateInterpolator,
1431+
ObjectAnimator.ofFloat(mScrollView, View.SCALE_X, 0f, 1f)
1432+
.setDuration(FLIP_DURATION_IN)
1433+
)));
1434+
mFlipSettingsViewAnim = start(
1435+
setVisibilityWhenDone(
1436+
interpolator(mAccelerateInterpolator,
1437+
ObjectAnimator.ofFloat(mFlipSettingsView, View.SCALE_X, 1f, 0f)
1438+
)
1439+
.setDuration(FLIP_DURATION_OUT),
1440+
mFlipSettingsView, View.INVISIBLE));
1441+
mNotificationButtonAnim = start(
1442+
setVisibilityWhenDone(
1443+
ObjectAnimator.ofFloat(mNotificationButton, View.ALPHA, 0f)
1444+
.setDuration(FLIP_DURATION),
1445+
mNotificationButton, View.INVISIBLE));
1446+
mSettingsButton.setVisibility(View.VISIBLE);
1447+
mSettingsButtonAnim = start(
1448+
ObjectAnimator.ofFloat(mSettingsButton, View.ALPHA, 1f)
1449+
.setDuration(FLIP_DURATION));
1450+
mClearButton.setVisibility(View.VISIBLE);
1451+
mClearButton.setAlpha(0f);
1452+
setAreThereNotifications(); // this will show/hide the button as necessary
1453+
mNotificationPanel.postDelayed(new Runnable() {
1454+
public void run() {
1455+
updateCarrierLabelVisibility(false);
1456+
}
1457+
}, FLIP_DURATION - 150);
1458+
}
1459+
14631460
@Override
14641461
public void animateExpandSettingsPanel() {
14651462
if (SPEW) Slog.d(TAG, "animateExpand: mExpandedVisible=" + mExpandedVisible);
@@ -1470,46 +1467,7 @@ public void animateExpandSettingsPanel() {
14701467
if (mHasFlipSettings) {
14711468
mNotificationPanel.expand();
14721469
if (mFlipSettingsView.getVisibility() != View.VISIBLE) {
1473-
if (mFlipSettingsViewAnim != null) mFlipSettingsViewAnim.cancel();
1474-
if (mScrollViewAnim != null) mScrollViewAnim.cancel();
1475-
if (mSettingsButtonAnim != null) mSettingsButtonAnim.cancel();
1476-
if (mNotificationButtonAnim != null) mNotificationButtonAnim.cancel();
1477-
if (mClearButtonAnim != null) mClearButtonAnim.cancel();
1478-
1479-
mFlipSettingsView.setVisibility(View.VISIBLE);
1480-
mFlipSettingsView.setScaleX(0f);
1481-
mFlipSettingsViewAnim = start(
1482-
startDelay(FLIP_DURATION_OUT,
1483-
interpolator(mDecelerateInterpolator,
1484-
ObjectAnimator.ofFloat(mFlipSettingsView, View.SCALE_X, 0f, 1f)
1485-
.setDuration(FLIP_DURATION_IN)
1486-
)));
1487-
mScrollViewAnim = start(
1488-
setVisibilityWhenDone(
1489-
interpolator(mAccelerateInterpolator,
1490-
ObjectAnimator.ofFloat(mScrollView, View.SCALE_X, 1f, 0f)
1491-
)
1492-
.setDuration(FLIP_DURATION_OUT),
1493-
mScrollView, View.INVISIBLE));
1494-
mSettingsButtonAnim = start(
1495-
setVisibilityWhenDone(
1496-
ObjectAnimator.ofFloat(mSettingsButton, View.ALPHA, 0f)
1497-
.setDuration(FLIP_DURATION),
1498-
mScrollView, View.INVISIBLE));
1499-
mNotificationButton.setVisibility(View.VISIBLE);
1500-
mNotificationButtonAnim = start(
1501-
ObjectAnimator.ofFloat(mNotificationButton, View.ALPHA, 1f)
1502-
.setDuration(FLIP_DURATION));
1503-
mClearButtonAnim = start(
1504-
setVisibilityWhenDone(
1505-
ObjectAnimator.ofFloat(mClearButton, View.ALPHA, 0f)
1506-
.setDuration(FLIP_DURATION),
1507-
mClearButton, View.INVISIBLE));
1508-
mNotificationPanel.postDelayed(new Runnable() {
1509-
public void run() {
1510-
updateCarrierLabelVisibility(false);
1511-
}
1512-
}, FLIP_DURATION - 150);
1470+
flipToSettings();
15131471
}
15141472
} else if (mSettingsPanel != null) {
15151473
mSettingsPanel.expand();
@@ -1518,6 +1476,69 @@ public void run() {
15181476
if (false) postStartTracing();
15191477
}
15201478

1479+
public void switchToSettings() {
1480+
mFlipSettingsView.setScaleX(1f);
1481+
mFlipSettingsView.setVisibility(View.VISIBLE);
1482+
mSettingsButton.setVisibility(View.GONE);
1483+
mScrollView.setVisibility(View.GONE);
1484+
mNotificationButton.setVisibility(View.VISIBLE);
1485+
mNotificationButton.setAlpha(1f);
1486+
mClearButton.setVisibility(View.GONE);
1487+
}
1488+
1489+
public void flipToSettings() {
1490+
if (mFlipSettingsViewAnim != null) mFlipSettingsViewAnim.cancel();
1491+
if (mScrollViewAnim != null) mScrollViewAnim.cancel();
1492+
if (mSettingsButtonAnim != null) mSettingsButtonAnim.cancel();
1493+
if (mNotificationButtonAnim != null) mNotificationButtonAnim.cancel();
1494+
if (mClearButtonAnim != null) mClearButtonAnim.cancel();
1495+
1496+
mFlipSettingsView.setVisibility(View.VISIBLE);
1497+
mFlipSettingsView.setScaleX(0f);
1498+
mFlipSettingsViewAnim = start(
1499+
startDelay(FLIP_DURATION_OUT,
1500+
interpolator(mDecelerateInterpolator,
1501+
ObjectAnimator.ofFloat(mFlipSettingsView, View.SCALE_X, 0f, 1f)
1502+
.setDuration(FLIP_DURATION_IN)
1503+
)));
1504+
mScrollViewAnim = start(
1505+
setVisibilityWhenDone(
1506+
interpolator(mAccelerateInterpolator,
1507+
ObjectAnimator.ofFloat(mScrollView, View.SCALE_X, 1f, 0f)
1508+
)
1509+
.setDuration(FLIP_DURATION_OUT),
1510+
mScrollView, View.INVISIBLE));
1511+
mSettingsButtonAnim = start(
1512+
setVisibilityWhenDone(
1513+
ObjectAnimator.ofFloat(mSettingsButton, View.ALPHA, 0f)
1514+
.setDuration(FLIP_DURATION),
1515+
mScrollView, View.INVISIBLE));
1516+
mNotificationButton.setVisibility(View.VISIBLE);
1517+
mNotificationButtonAnim = start(
1518+
ObjectAnimator.ofFloat(mNotificationButton, View.ALPHA, 1f)
1519+
.setDuration(FLIP_DURATION));
1520+
mClearButtonAnim = start(
1521+
setVisibilityWhenDone(
1522+
ObjectAnimator.ofFloat(mClearButton, View.ALPHA, 0f)
1523+
.setDuration(FLIP_DURATION),
1524+
mClearButton, View.INVISIBLE));
1525+
mNotificationPanel.postDelayed(new Runnable() {
1526+
public void run() {
1527+
updateCarrierLabelVisibility(false);
1528+
}
1529+
}, FLIP_DURATION - 150);
1530+
}
1531+
1532+
public void flipPanels() {
1533+
if (mHasFlipSettings) {
1534+
if (mFlipSettingsView.getVisibility() != View.VISIBLE) {
1535+
flipToSettings();
1536+
} else {
1537+
flipToNotifications();
1538+
}
1539+
}
1540+
}
1541+
15211542
public void animateCollapseQuickSettings() {
15221543
mStatusBarView.collapseAllPanels(true);
15231544
}
@@ -1533,6 +1554,18 @@ void makeExpandedInvisible() {
15331554
// Ensure the panel is fully collapsed (just in case; bug 6765842, 7260868)
15341555
mStatusBarView.collapseAllPanels(/*animate=*/ false);
15351556

1557+
if (mHasFlipSettings) {
1558+
// reset things to their proper state
1559+
mScrollView.setScaleX(1f);
1560+
mScrollView.setVisibility(View.VISIBLE);
1561+
mSettingsButton.setAlpha(1f);
1562+
mSettingsButton.setVisibility(View.VISIBLE);
1563+
mNotificationPanel.setVisibility(View.GONE);
1564+
mFlipSettingsView.setVisibility(View.GONE);
1565+
mNotificationButton.setVisibility(View.GONE);
1566+
setAreThereNotifications(); // show the clear button
1567+
}
1568+
15361569
mExpandedVisible = false;
15371570
mPile.setLayoutTransitionsEnabled(false);
15381571
if (mNavigationBarView != null)

0 commit comments

Comments
 (0)