Reset ExpandHelper when the panel is collapsed.

Fixes a rather unpleasant bug in which the ExpandHelper
could get locked in "expanding" mode if the panel was closed
(for example, with the back button) while you were in the
middle of an expand gesture. In this situation ExpandHelper
would hungrily eat all future touch events destined for the
notification panel, making it impossible to click or even
clear any notifications.

Bug: 7330828
Change-Id: I9c493db5e8fd8ef1aca53f77820780d60fa4e5a7
This commit is contained in:
Daniel Sandler
2012-10-23 10:41:44 -04:00
parent 36425d19fc
commit ac47ff70c3
3 changed files with 44 additions and 27 deletions

View File

@@ -27,13 +27,12 @@ import android.util.Slog;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.ScaleGestureDetector.OnScaleGestureListener;
import android.view.View;
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);
@@ -110,6 +109,32 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener {
private View mScrollView;
private OnScaleGestureListener mScaleGestureListener
= new ScaleGestureDetector.SimpleOnScaleGestureListener() {
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
if (DEBUG_SCALE) Slog.v(TAG, "onscalebegin()");
float focusX = detector.getFocusX();
float focusY = detector.getFocusY();
final View underFocus = findView(focusX, focusY);
if (underFocus != null) {
startExpanding(underFocus, STRETCH);
}
return mExpanding;
}
@Override
public boolean onScale(ScaleGestureDetector detector) {
if (DEBUG_SCALE) Slog.v(TAG, "onscale() on " + mCurrView);
return true;
}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
}
};
private class ViewScaler {
View mView;
@@ -201,31 +226,7 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener {
final ViewConfiguration configuration = ViewConfiguration.get(mContext);
mTouchSlop = configuration.getScaledTouchSlop();
mSGD = new ScaleGestureDetector(context,
new ScaleGestureDetector.SimpleOnScaleGestureListener() {
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
if (DEBUG_SCALE) Slog.v(TAG, "onscalebegin()");
float focusX = detector.getFocusX();
float focusY = detector.getFocusY();
final View underFocus = findView(focusX, focusY);
if (underFocus != null) {
startExpanding(underFocus, STRETCH);
}
return mExpanding;
}
@Override
public boolean onScale(ScaleGestureDetector detector) {
if (DEBUG_SCALE) Slog.v(TAG, "onscale() on " + mCurrView);
return true;
}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
}
});
mSGD = new ScaleGestureDetector(context, mScaleGestureListener);
}
private void updateExpansion() {
@@ -586,6 +587,17 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener {
clearView();
}
/**
* Use this to abort any pending expansions in progress.
*/
public void cancel() {
finishExpanding(true);
clearView();
// reset the gesture detector
mSGD = new ScaleGestureDetector(mContext, mScaleGestureListener);
}
/**
* Triggers haptic feedback.
*/

View File

@@ -1368,6 +1368,7 @@ public class PhoneStatusBar extends BaseStatusBar {
mHandler.sendEmptyMessage(MSG_CLOSE_SEARCH_PANEL);
}
mStatusBarWindow.cancelExpandHelper();
mStatusBarView.collapseAllPanels(true);
}

View File

@@ -119,5 +119,9 @@ public class StatusBarWindowView extends FrameLayout
canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), pt);
}
}
public void cancelExpandHelper() {
mExpandHelper.cancel();
}
}