summaryrefslogtreecommitdiffstats
path: root/packages/SystemUI/src/com/android/systemui/ExpandHelper.java
diff options
context:
space:
mode:
authorChris Wren <cwren@android.com>2012-06-19 13:10:25 -0400
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-06-19 15:58:41 -0700
commit3c148f106f6625ce247a2c7211682c3a1df89bc9 (patch)
treeb8426075501aeab965cad5b624f04fca86063be1 /packages/SystemUI/src/com/android/systemui/ExpandHelper.java
parenta129a3b0caeb1c9c789b53dbe3af4dd9aad6d583 (diff)
downloadframeworks_base-3c148f106f6625ce247a2c7211682c3a1df89bc9.zip
frameworks_base-3c148f106f6625ce247a2c7211682c3a1df89bc9.tar.gz
frameworks_base-3c148f106f6625ce247a2c7211682c3a1df89bc9.tar.bz2
One-finger notificaiton open: pop the next item too.
Bug: 6538918 Change-Id: I957b6d50220c57b588b43825767f24ecee862754
Diffstat (limited to 'packages/SystemUI/src/com/android/systemui/ExpandHelper.java')
-rw-r--r--packages/SystemUI/src/com/android/systemui/ExpandHelper.java123
1 files changed, 96 insertions, 27 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java
index 575697b..d43af7b 100644
--- a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java
@@ -32,16 +32,21 @@ import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
+import java.util.Stack;
+
public class ExpandHelper implements Gefingerpoken, OnClickListener {
public interface Callback {
View getChildAtRawPosition(float x, float y);
View getChildAtPosition(float x, float y);
+ View getPreviousChild(View currentChild);
boolean canChildBeExpanded(View v);
boolean setUserExpandedChild(View v, boolean userxpanded);
}
private static final String TAG = "ExpandHelper";
- protected static final boolean DEBUG = false;
+ protected static final boolean DEBUG = true;
+ protected static final boolean DEBUG_SCALE = false;
+ protected static final boolean DEBUG_GLOW = true;
private static final long EXPAND_DURATION = 250;
private static final long GLOW_DURATION = 150;
@@ -106,7 +111,7 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener {
mView = v;
}
public void setHeight(float h) {
- if (DEBUG) Slog.v(TAG, "SetHeight: setting to " + h);
+ if (DEBUG_SCALE) Slog.v(TAG, "SetHeight: setting to " + h);
ViewGroup.LayoutParams lp = mView.getLayoutParams();
lp.height = (int)h;
mView.setLayoutParams(lp);
@@ -121,7 +126,8 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener {
}
public int getNaturalHeight(int maximum) {
ViewGroup.LayoutParams lp = mView.getLayoutParams();
- if (DEBUG) Slog.v(TAG, "Inspecting a child of type: " + mView.getClass().getName());
+ if (DEBUG_SCALE) Slog.v(TAG, "Inspecting a child of type: " +
+ mView.getClass().getName());
int oldHeight = lp.height;
lp.height = ViewGroup.LayoutParams.WRAP_CONTENT;
mView.setLayoutParams(lp);
@@ -136,6 +142,17 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener {
}
}
+ class PopState {
+ View mCurrView;
+ View mCurrViewTopGlow;
+ View mCurrViewBottomGlow;
+ float mOldHeight;
+ float mNaturalHeight;
+ float mInitialTouchY;
+ }
+
+ private Stack<PopState> popStack;
+
/**
* Handle expansion gestures to expand and contract children of the callback.
*
@@ -151,6 +168,7 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener {
mLargeSize = large;
mContext = context;
mCallback = callback;
+ popStack = new Stack<PopState>();
mScaler = new ViewScaler();
mGravity = Gravity.TOP;
mScaleAnimation = ObjectAnimator.ofFloat(mScaler, "height", 0f);
@@ -192,14 +210,14 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener {
new ScaleGestureDetector.SimpleOnScaleGestureListener() {
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
- if (DEBUG) Slog.v(TAG, "onscalebegin()");
+ if (DEBUG_SCALE) Slog.v(TAG, "onscalebegin()");
float x = detector.getFocusX();
float y = detector.getFocusY();
// your fingers have to be somewhat close to the bounds of the view in question
mInitialTouchFocusY = detector.getFocusY();
mInitialTouchSpan = Math.abs(detector.getCurrentSpan());
- if (DEBUG) Slog.d(TAG, "got mInitialTouchSpan: (" + mInitialTouchSpan + ")");
+ if (DEBUG_SCALE) Slog.d(TAG, "got mInitialTouchSpan: (" + mInitialTouchSpan + ")");
mStretching = initScale(findView(x, y));
return mStretching;
@@ -207,7 +225,7 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
- if (DEBUG) Slog.v(TAG, "onscale() on " + mCurrView);
+ if (DEBUG_SCALE) Slog.v(TAG, "onscale() on " + mCurrView);
// are we scaling or dragging?
float span = Math.abs(detector.getCurrentSpan()) - mInitialTouchSpan;
@@ -227,10 +245,11 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener {
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
- if (DEBUG) Slog.v(TAG, "onscaleend()");
+ if (DEBUG_SCALE) Slog.v(TAG, "onscaleend()");
// I guess we're alone now
- if (DEBUG) Slog.d(TAG, "scale end");
+ if (DEBUG_SCALE) Slog.d(TAG, "scale end");
finishScale(false);
+ clearView();
mStretching = false;
}
});
@@ -295,16 +314,17 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener {
private float calculateGlow(float target, float actual) {
// glow if overscale
+ if (DEBUG_GLOW) Slog.d(TAG, "target: " + target + " actual: " + actual);
float stretch = (float) Math.abs((target - actual) / mMaximumStretch);
float strength = 1f / (1f + (float) Math.pow(Math.E, -1 * ((8f * stretch) - 5f)));
- if (DEBUG) Slog.d(TAG, "stretch: " + stretch + " strength: " + strength);
+ if (DEBUG_GLOW) Slog.d(TAG, "stretch: " + stretch + " strength: " + strength);
return (GLOW_BASE + strength * (1f - GLOW_BASE));
}
public void setGlow(float glow) {
if (!mGlowAnimationSet.isRunning() || glow == 0f) {
if (mGlowAnimationSet.isRunning()) {
- mGlowAnimationSet.cancel();
+ mGlowAnimationSet.end();
}
if (mCurrViewTopGlow != null && mCurrViewBottomGlow != null) {
if (glow == 0f || mCurrViewTopGlow.getAlpha() == 0f) {
@@ -358,13 +378,10 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener {
mLastMotionY = y;
mPullingWithOneFinger = initScale(findView(x, y));
if (mPullingWithOneFinger) {
- mInitialTouchFocusY = mLastMotionY;
+ mInitialTouchY = mLastMotionY;
mHasPopped = false;
}
}
- if (DEBUG) Slog.d(TAG, "examining move: " + yDiff);
- } else {
- if (DEBUG) Slog.d(TAG, "uninteresting move");
}
break;
}
@@ -372,17 +389,16 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener {
case MotionEvent.ACTION_DOWN:
mWatchingForPull = isInside(mScrollView, ev.getX(), ev.getY());
mLastMotionY = (int) ev.getY();
- if (DEBUG) Slog.d(TAG, "action down: " + mWatchingForPull);
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
if (mPullingWithOneFinger) {
finishScale(false);
+ clearView();
}
mPullingWithOneFinger = false;
mWatchingForPull = false;
- if (DEBUG) Slog.d(TAG, "action up: " + mWatchingForPull);
break;
}
return mPullingWithOneFinger;
@@ -391,30 +407,54 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener {
public boolean onTouchEvent(MotionEvent ev) {
final int action = ev.getAction();
- if (DEBUG) Slog.d(TAG, "touch: act=" + (action) +
+ if (DEBUG_SCALE) Slog.d(TAG, "touch: act=" + (action) +
" stretching=" + mStretching +
" onefinger=" + mPullingWithOneFinger);
if (mStretching) {
- if (DEBUG) Slog.d(TAG, "detector ontouch");
mDetector.onTouchEvent(ev);
}
switch (action) {
case MotionEvent.ACTION_MOVE: {
if (mPullingWithOneFinger) {
- float hand = ev.getY() - mInitialTouchFocusY;
- if (mHasPopped || hand > mPopLimit) {
+ float target = ev.getY() - mInitialTouchY + mOldHeight;
+ float newHeight = clamp(target);
+ if (mHasPopped || target > mPopLimit) {
if (!mHasPopped) {
vibrate(mPopDuration);
mHasPopped = true;
}
- hand = hand + mOldHeight;
- float target = hand;
- float newHeight = clamp(target);
mScaler.setHeight(newHeight);
// glow if overscale
- setGlow(calculateGlow(target, newHeight));
+ if (target > mNaturalHeight) {
+ View previous = mCallback.getPreviousChild(mCurrView);
+ if (previous != null) {
+ setGlow(0f);
+ pushView(previous);
+ initScale(previous);
+ mInitialTouchY = ev.getY();
+ target = mOldHeight;
+ newHeight = clamp(target);
+ mHasPopped = false;
+ } else {
+ setGlow(calculateGlow(target, newHeight));
+ }
+ } else if (target < mSmallSize && !popStack.empty()) {
+ setGlow(0f);
+ initScale(popView());
+ mInitialTouchY = ev.getY();
+ setGlow(GLOW_BASE);
+ } else {
+ setGlow(calculateGlow(target, newHeight));
+ }
} else {
- setGlow(calculateGlow(4f * hand, 0f));
+ if (target < mSmallSize && !popStack.empty()) {
+ setGlow(0f);
+ initScale(popView());
+ mInitialTouchY = ev.getY();
+ setGlow(GLOW_BASE);
+ } else {
+ setGlow(calculateGlow(4f * target, mSmallSize));
+ }
}
return true;
}
@@ -464,7 +504,6 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener {
} else {
h = (force || h < mNaturalHeight) ? mSmallSize : mNaturalHeight;
}
- if (DEBUG && mCurrView != null) mCurrView.setBackgroundColor(0);
if (mScaleAnimation.isRunning()) {
mScaleAnimation.cancel();
}
@@ -474,10 +513,12 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener {
setGlow(0f);
mCallback.setUserExpandedChild(mCurrView, h == mNaturalHeight);
if (DEBUG) Slog.d(TAG, "scale was finished on view: " + mCurrView);
- clearView();
}
private void clearView() {
+ while (!popStack.empty()) {
+ popStack.pop();
+ }
mCurrView = null;
mCurrViewTopGlow = null;
mCurrViewBottomGlow = null;
@@ -498,10 +539,38 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener {
}
}
+ private void pushView(View v) {
+ PopState state = new PopState();
+ state.mCurrView = mCurrView;
+ state.mCurrViewTopGlow = mCurrViewTopGlow;
+ state.mCurrViewBottomGlow = mCurrViewBottomGlow;
+ state.mOldHeight = mOldHeight;
+ state.mNaturalHeight = mNaturalHeight;
+ state.mInitialTouchY = mInitialTouchY;
+ popStack.push(state);
+ }
+
+ private View popView() {
+ if (popStack.empty()) {
+ return null;
+ }
+
+ PopState state = popStack.pop();
+ mCurrView = state.mCurrView;
+ mCurrViewTopGlow = state.mCurrViewTopGlow;
+ mCurrViewBottomGlow = state.mCurrViewBottomGlow;
+ mOldHeight = state.mOldHeight;
+ mNaturalHeight = state.mNaturalHeight;
+ mInitialTouchY = state.mInitialTouchY;
+
+ return mCurrView;
+ }
+
@Override
public void onClick(View v) {
initScale(v);
finishScale(true);
+ clearView();
}
/**