alps\frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.java
package com.android.internal.policy.impl; public class PhoneWindowManager implements WindowManagerPolicy { private static final int MSG_ENABLE_POINTER_LOCATION = 1; private static final int MSG_DISABLE_POINTER_LOCATION = 2; //Add nav down by cbk private static final int MSG_ENABLE_NAV_BAR_PULL_UP_GESTURE = 7; private static final int MSG_DISABLE_NAV_BAR_PULL_UP_GESTURE = 8; //end nav down by cbk private class PolicyHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_ENABLE_POINTER_LOCATION: enablePointerLocation(); break; case MSG_DISABLE_POINTER_LOCATION: disablePointerLocation(); break; //Add nav down by cbk case MSG_ENABLE_NAV_BAR_PULL_UP_GESTURE: enableNavBarPullupGesture(); break; case MSG_DISABLE_NAV_BAR_PULL_UP_GESTURE: disableNavBarPullupGesture(); break; //end nav down by cbk } } } class SettingsObserver extends ContentObserver { SettingsObserver(Handler handler) { super(handler); } void observe() { // Observe all users' changes ContentResolver resolver = mContext.getContentResolver(); //Add nav down by cbk resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.MULTI_TOUCH_GESTURE), false, this, UserHandle.USER_ALL); //end nav down by cbk updateSettings(); } @Override public void onChange(boolean selfChange) { updateSettings(); updateRotation(false); } } public void updateSettings() { ContentResolver resolver = mContext.getContentResolver(); boolean updateRotation = false; synchronized (mLock) { //Add nav down by cbk if (FeatureOption.K19_NCX_ASSISTIVE_TOUCH_NAV_BAR) { /*int NavBarPullupGesture = Settings.System.getIntForUser(resolver, Settings.System.MULTI_TOUCH_GESTURE, 0, UserHandle.USER_CURRENT); if (mNavBarPullupGestureMode != NavBarPullupGesture) { mNavBarPullupGestureMode = NavBarPullupGesture; mHandler.sendEmptyMessage(NavBarPullupGesture != 0 ? MSG_ENABLE_NAV_BAR_PULL_UP_GESTURE: MSG_DISABLE_NAV_BAR_PULL_UP_GESTURE); }*/ if (mNavBarPullupGestureMode != 1) { mNavBarPullupGestureMode = 1; mHandler.sendEmptyMessage(MSG_ENABLE_NAV_BAR_PULL_UP_GESTURE); } } //end nav down by cbk } } //Add nav down by cbk int mNavBarPullupGestureMode = 0; NavBarPullupGestureInputEventReceiver mNavBarPullupGestureInputEventReceiver; NavBarPullupGesturePanel mNavBarPullupGestureView; InputChannel mNavBarPullupGestureInputChannel; static final String TAG_NAV_BAR_PULL_UP_GESTURE = "NavBarPullupGesture"; static boolean DEBUG_NAV_BAR_PULL_UP_GESTURE = true; private int mPosX =0; private int mPosY =0; private int mCurrentPosX =0; private int mCurrentPosY =0; private boolean mNavBarPullUpValid = false; private static final class NavBarPullupGestureInputEventReceiver extends InputEventReceiver { private final NavBarPullupGesturePanel mView; public NavBarPullupGestureInputEventReceiver(InputChannel inputChannel, Looper looper, NavBarPullupGesturePanel view) { super(inputChannel, looper); mView = view; } @Override public void onInputEvent(InputEvent event) { boolean handled = false; try { if (event instanceof MotionEvent && (event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) { final MotionEvent motionEvent = (MotionEvent)event; mView.onTouchEvent(motionEvent); handled = true; } } finally { finishInputEvent(event, handled); } } } public void NavBarDisplayGesture() { IStatusBarService statusBarService = IStatusBarService.Stub.asInterface( ServiceManager.getService("statusbar")); try { if (DEBUG_NAV_BAR_PULL_UP_GESTURE) Log.d(TAG_NAV_BAR_PULL_UP_GESTURE,"NavBarDisplayGesture ()"); statusBarService.EnableNavBarDisplay();//toggleNavBarDisplay(); } catch (RemoteException e) { Log.e(TAG, "Error toggling recent apps."); } } public class NavBarPullupGesturePanel extends FrameLayout{ public NavBarPullupGesturePanel(Context context) { super(context); } @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub if (DEBUG_NAV_BAR_PULL_UP_GESTURE) Log.d(TAG_NAV_BAR_PULL_UP_GESTURE, "NavBarPullupGesturePanel event.getAction() =" +event.getAction() ); /*if(MotionEvent.ACTION_DOWN==event.getAction()){ mPosX = (int)event.getX(); mPosY = (int)event.getY(); if (DEBUG_NAV_BAR_PULL_UP_GESTURE) Log.d(TAG_NAV_BAR_PULL_UP_GESTURE, "NavBarPullupGesturePanel tp_down mPosX =" +mPosX +",mPosY ="+mPosY); }else if (MotionEvent.ACTION_MOVE == event.getAction()) { mCurrentPosX = (int)event.getX(); mCurrentPosY = (int)event.getY(); if (DEBUG_NAV_BAR_PULL_UP_GESTURE) Log.d(TAG_NAV_BAR_PULL_UP_GESTURE, "NavBarPullupGesturePanel tp_move mCurrentPosX =" +mCurrentPosX +",mCurrentPosY ="+mCurrentPosY); }else{ mCurrentPosX = 0; mCurrentPosY = 0; mPosX = 0; mPosY = 0; } if (DEBUG_NAV_BAR_PULL_UP_GESTURE) Log.d(TAG_NAV_BAR_PULL_UP_GESTURE, "NavBarPullupGesturePanel mPosX =" +mPosX + ",mPosY ="+mPosY + ",mCurrentPosX ="+mCurrentPosX + ",mCurrentPosY ="+mCurrentPosY ); if (mCurrentPosY - mPosY < -200 && Math.abs(mCurrentPosX - mPosX) < 300) { NavBarDisplayGesture(); Log.d(TAG_NAV_BAR_PULL_UP_GESTURE, "向上的按下位置"+mPosX+"移动位置"+mCurrentPosX); }*/ if(MotionEvent.ACTION_DOWN==event.getAction()){ mPosX = (int)event.getX(); mPosY = (int)event.getY(); int orientation = mContext.getResources().getConfiguration().orientation; Log.d(TAG,"current config orienation " + orientation); if (DEBUG_NAV_BAR_PULL_UP_GESTURE) Log.d(TAG_NAV_BAR_PULL_UP_GESTURE, "NavBarPullupGesturePanel tp_down mPosX =" +mPosX +",mPosY ="+mPosY +",orientation =" +orientation); if (orientation == Configuration.ORIENTATION_LANDSCAPE) { if(mPosY >=540 && mPosY <=600){ NavBarDisplayGesture(); } }else if(orientation == Configuration.ORIENTATION_PORTRAIT) { if(mPosY >=940 && mPosY <=1024){ NavBarDisplayGesture(); } } } return true; } @Override public boolean onGenericMotionEvent(MotionEvent event) { final int source = event.getSource(); /*if ((source & InputDevice.SOURCE_CLASS_POINTER) != 0) { mGestureRecognizer.onTouchEvent(event); }*/ return true; } } private void enableNavBarPullupGesture() { if (mNavBarPullupGestureView == null) { mNavBarPullupGestureView = new NavBarPullupGesturePanel(mContext); WindowManager.LayoutParams lp = new WindowManager.LayoutParams( WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); lp.type = WindowManager.LayoutParams.TYPE_SECURE_SYSTEM_OVERLAY; lp.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; lp.format = PixelFormat.TRANSLUCENT; lp.setTitle("NavBarPullupGesturePanel"); WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); wm.addView(mNavBarPullupGestureView, lp); if (DEBUG_NAV_BAR_PULL_UP_GESTURE) Log.d(TAG_NAV_BAR_PULL_UP_GESTURE,"enableNavBarPullupGesture"); mNavBarPullupGestureInputChannel = mWindowManagerFuncs.monitorInput("NavBarPullupGesture"); mNavBarPullupGestureInputEventReceiver = new NavBarPullupGestureInputEventReceiver(mNavBarPullupGestureInputChannel, Looper.myLooper(), mNavBarPullupGestureView); } } private void disableNavBarPullupGesture() { if (DEBUG_NAV_BAR_PULL_UP_GESTURE) Log.d(TAG_NAV_BAR_PULL_UP_GESTURE,"disableNavBarPullupGesture"); if (mNavBarPullupGestureInputEventReceiver != null) { mNavBarPullupGestureInputEventReceiver.dispose(); mNavBarPullupGestureInputEventReceiver = null; } if (mNavBarPullupGestureInputChannel != null) { mNavBarPullupGestureInputChannel.dispose(); mNavBarPullupGestureInputChannel = null; } if (mNavBarPullupGestureView != null) { WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); wm.removeView(mNavBarPullupGestureView); mNavBarPullupGestureView = null; } } //end nav down by cbk }