diff options
author | Jim Miller <jaggies@google.com> | 2012-05-24 17:51:10 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-05-24 17:51:10 -0700 |
commit | 73bde11e624c44620819e9c93a61ca6be6e96997 (patch) | |
tree | 622e89faaa825a39acb21410cf31f11d63ce6cbe /packages | |
parent | 2af7b9151f8df3581e38847ac711185426df5dea (diff) | |
parent | 960892c0afa7f2b91236928e29e3987ed35b2077 (diff) | |
download | frameworks_base-73bde11e624c44620819e9c93a61ca6be6e96997.zip frameworks_base-73bde11e624c44620819e9c93a61ca6be6e96997.tar.gz frameworks_base-73bde11e624c44620819e9c93a61ca6be6e96997.tar.bz2 |
Merge "Fix 6547012: ignore events outside the home/back/recent navigation area" into jb-dev
Diffstat (limited to 'packages')
4 files changed, 106 insertions, 44 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java index 28283ef..90f94fc 100644 --- a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java @@ -129,7 +129,7 @@ public class SearchPanelView extends FrameLayout implements } public void onGrabbedStateChange(View v, int handle) { - if (OnTriggerListener.NO_HANDLE == handle) { + if (mTarget == -1 && OnTriggerListener.NO_HANDLE == handle) { mBar.hideSearchPanel(); } } @@ -147,8 +147,8 @@ public class SearchPanelView extends FrameLayout implements startAssistActivity(); break; } + mBar.hideSearchPanel(); } - mBar.hideSearchPanel(); } }; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java index a90192e..96afbb6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java @@ -16,9 +16,8 @@ package com.android.systemui.statusbar; -import android.util.Slog; +import android.graphics.RectF; import android.view.MotionEvent; -import android.view.Surface; import android.view.View; import com.android.systemui.R; @@ -29,8 +28,12 @@ public class DelegateViewHelper { private BaseStatusBar mBar; private int[] mTempPoint = new int[2]; private float[] mDownPoint = new float[2]; - private int mOrientation; private float mTriggerThreshhold; + private boolean mPanelShowing; + + RectF mInitialTouch = new RectF(); + private boolean mStarted; + private boolean mSwapXY = false; public DelegateViewHelper(View sourceView) { setSourceView(sourceView); @@ -44,49 +47,53 @@ public class DelegateViewHelper { mBar = phoneStatusBar; } - public void setOrientation(int orientation) { - mOrientation = orientation; - } - public boolean onInterceptTouchEvent(MotionEvent event) { - if (mBar.shouldDisableNavbarGestures()) { + if (mSourceView == null || mDelegateView == null || mBar.shouldDisableNavbarGestures()) { return false; } + + mSourceView.getLocationOnScreen(mTempPoint); + final float sourceX = mTempPoint[0]; + final float sourceY = mTempPoint[1]; + + switch (event.getAction()) { case MotionEvent.ACTION_DOWN: + mPanelShowing = mDelegateView.getVisibility() == View.VISIBLE; mDownPoint[0] = event.getX(); mDownPoint[1] = event.getY(); + mStarted = mInitialTouch.contains(mDownPoint[0] + sourceX, mDownPoint[1] + sourceY); break; } - if (mDelegateView != null) { - if (mDelegateView.getVisibility() != View.VISIBLE - && event.getAction() != MotionEvent.ACTION_CANCEL) { - final boolean isVertical = (mOrientation == Surface.ROTATION_90 - || mOrientation == Surface.ROTATION_270); - final int historySize = event.getHistorySize(); - for (int k = 0; k < historySize + 1; k++) { - float x = k < historySize ? event.getHistoricalX(k) : event.getX(); - float y = k < historySize ? event.getHistoricalY(k) : event.getY(); - final float distance = isVertical ? (mDownPoint[0] - x) : (mDownPoint[1] - y); - if (distance > mTriggerThreshhold) { - mBar.showSearchPanel(); - break; - } + + if (!mStarted) { + return false; + } + + if (!mPanelShowing && event.getAction() == MotionEvent.ACTION_MOVE) { + final int historySize = event.getHistorySize(); + for (int k = 0; k < historySize + 1; k++) { + float x = k < historySize ? event.getHistoricalX(k) : event.getX(); + float y = k < historySize ? event.getHistoricalY(k) : event.getY(); + final float distance = mSwapXY ? (mDownPoint[0] - x) : (mDownPoint[1] - y); + if (distance > mTriggerThreshhold) { + mBar.showSearchPanel(); + mPanelShowing = true; + break; } } - mSourceView.getLocationOnScreen(mTempPoint); - float deltaX = mTempPoint[0]; - float deltaY = mTempPoint[1]; + } - mDelegateView.getLocationOnScreen(mTempPoint); - deltaX -= mTempPoint[0]; - deltaY -= mTempPoint[1]; + mDelegateView.getLocationOnScreen(mTempPoint); + final float delegateX = mTempPoint[0]; + final float delegateY = mTempPoint[1]; - event.offsetLocation(deltaX, deltaY); - mDelegateView.dispatchTouchEvent(event); - event.offsetLocation(-deltaX, -deltaY); - } - return false; + float deltaX = sourceX - delegateX; + float deltaY = sourceY - delegateY; + event.offsetLocation(deltaX, deltaY); + mDelegateView.dispatchTouchEvent(event); + event.offsetLocation(-deltaX, -deltaY); + return mPanelShowing; } public void setSourceView(View view) { @@ -96,4 +103,35 @@ public class DelegateViewHelper { .getDimension(R.dimen.navbar_search_up_threshhold); } } + + /** + * Selects the initial touch region based on a list of views. This is meant to be called by + * a container widget on children over which the initial touch should be detected. Note this + * will compute a minimum bound that contains all specified views. + * + * @param views + */ + public void setInitialTouchRegion(View ... views) { + RectF bounds = new RectF(); + int p[] = new int[2]; + for (int i = 0; i < views.length; i++) { + View view = views[i]; + if (view == null) continue; + view.getLocationOnScreen(p); + if (i == 0) { + bounds.set(p[0], p[1], p[0] + view.getWidth(), p[1] + view.getHeight()); + } else { + bounds.union(p[0], p[1], p[0] + view.getWidth(), p[1] + view.getHeight()); + } + } + mInitialTouch.set(bounds); + } + + /** + * When rotation is set to NO_SENSOR, then this allows swapping x/y for gesture detection + * @param swap + */ + public void setSwapXY(boolean swap) { + mSwapXY = swap; + } }
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 4bb2d1d..9c773a5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -23,6 +23,7 @@ import android.app.StatusBarManager; import android.content.Context; import android.content.res.Resources; import android.graphics.Rect; +import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; @@ -113,6 +114,14 @@ public class NavigationBarView extends LinearLayout { } @Override + public boolean onTouchEvent(MotionEvent event) { + if (mDelegateHelper != null) { + mDelegateHelper.onInterceptTouchEvent(event); + } + return true; + } + + @Override public boolean onInterceptTouchEvent(MotionEvent event) { return mDelegateHelper.onInterceptTouchEvent(event); } @@ -292,6 +301,7 @@ public class NavigationBarView extends LinearLayout { setLowProfile(false); } + @Override public void onFinishInflate() { mRotatedViews[Surface.ROTATION_0] = mRotatedViews[Surface.ROTATION_180] = findViewById(R.id.rot0); @@ -330,6 +340,12 @@ public class NavigationBarView extends LinearLayout { } @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + mDelegateHelper.setInitialTouchRegion(getHomeButton(), getBackButton(), getRecentsButton()); + } + + @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { if (DEBUG) Slog.d(TAG, String.format( "onSizeChanged: (%dx%d) old: (%dx%d)", w, h, oldw, oldh)); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java index 25fdf07..30d49ca 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java @@ -55,17 +55,25 @@ public class TabletStatusBarView extends FrameLayout { } @Override - protected void onFinishInflate() { - super.onFinishInflate(); + public boolean onTouchEvent(MotionEvent event) { + if (mDelegateHelper != null) { + mDelegateHelper.onInterceptTouchEvent(event); + } + return true; + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); // Find the view we wish to grab events from in order to detect search gesture. // Depending on the device, this will be one of the id's listed below. // If we don't find one, we'll use the view provided in the constructor above (this view). - View view = null; - if ((view = findViewById(R.id.navigationArea)) != null) { - mDelegateHelper.setSourceView(view); - } else if ((view = findViewById(R.id.nav_buttons)) != null) { - mDelegateHelper.setSourceView(view); + View view = findViewById(R.id.navigationArea); + if (view == null) { + view = findViewById(R.id.nav_buttons); } + mDelegateHelper.setSourceView(view); + mDelegateHelper.setInitialTouchRegion(view); } @Override @@ -100,8 +108,8 @@ public class TabletStatusBarView extends FrameLayout { if (TabletStatusBar.DEBUG) { Slog.d(TabletStatusBar.TAG, "TabletStatusBarView not intercepting event"); } - if (mDelegateHelper != null) { - return mDelegateHelper.onInterceptTouchEvent(ev); + if (mDelegateHelper != null && mDelegateHelper.onInterceptTouchEvent(ev)) { + return true; } return super.onInterceptTouchEvent(ev); } |