Android 12系统上滑手势增加home的功能
创始人
2024-05-25 14:27:06

需求:在11.0 12.0的定制化开发系统手势功能的时候,客户需求要求在上滑手势的时候,在底部上滑时候进入系统桌面,也就是增加 home键功能 就可以实现这个功能了

  1. 系统上滑手势增加home的功能的核心类

frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java
  1. 系统上滑手势增加home的功能的核心功能分析和实现

首选在找到11.0的系统手势具体处理类DisplayPolicy.java 就是系统处理手势的

而主要是靠mSystemGestures 来负责监听手势事件,然后处理上滑下滑左右滑事件

路径为:frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java

2.1DisplayPolicy.java关于手势事件分析

mSystemGestures = new SystemGesturesPointerEventListener(mContext, mHandler,new SystemGesturesPointerEventListener.Callbacks() {@Overridepublic void onSwipeFromTop() {if (mStatusBar != null) {requestTransientBars(mStatusBar);}}@Overridepublic void onSwipeFromBottom() {if (mNavigationBar != null && mNavigationBarPosition == NAV_BAR_BOTTOM) {requestTransientBars(mNavigationBar);}}@Overridepublic void onSwipeFromRight() {final Region excludedRegion = Region.obtain();synchronized (mLock) {mDisplayContent.calculateSystemGestureExclusion(excludedRegion, null /* outUnrestricted */);}final boolean sideAllowed = mNavigationBarAlwaysShowOnSideGesture|| mNavigationBarPosition == NAV_BAR_RIGHT;if (mNavigationBar != null && sideAllowed&& !mSystemGestures.currentGestureStartedInRegion(excludedRegion)) {requestTransientBars(mNavigationBar);}excludedRegion.recycle();}@Overridepublic void onSwipeFromLeft() {final Region excludedRegion = Region.obtain();synchronized (mLock) {mDisplayContent.calculateSystemGestureExclusion(excludedRegion, null /* outUnrestricted */);}final boolean sideAllowed = mNavigationBarAlwaysShowOnSideGesture|| mNavigationBarPosition == NAV_BAR_LEFT;if (mNavigationBar != null && sideAllowed&& !mSystemGestures.currentGestureStartedInRegion(excludedRegion)) {requestTransientBars(mNavigationBar);}excludedRegion.recycle();}@Overridepublic void onFling(int duration) {if (mService.mPowerManagerInternal != null) {mService.mPowerManagerInternal.powerHint(PowerHint.INTERACTION, duration);}}@Overridepublic void onDebug() {// no-op}private WindowOrientationListener getOrientationListener() {final DisplayRotation rotation = mDisplayContent.getDisplayRotation();return rotation != null ? rotation.getOrientationListener() : null;}@Overridepublic void onDown() {final WindowOrientationListener listener = getOrientationListener();if (listener != null) {listener.onTouchStart();}}@Overridepublic void onUpOrCancel() {final WindowOrientationListener listener = getOrientationListener();if (listener != null) {listener.onTouchEnd();}}@Overridepublic void onMouseHoverAtTop() {mHandler.removeMessages(MSG_REQUEST_TRANSIENT_BARS);Message msg = mHandler.obtainMessage(MSG_REQUEST_TRANSIENT_BARS);msg.arg1 = MSG_REQUEST_TRANSIENT_BARS_ARG_STATUS;mHandler.sendMessageDelayed(msg, 500 /* delayMillis */);}@Overridepublic void onMouseHoverAtBottom() {mHandler.removeMessages(MSG_REQUEST_TRANSIENT_BARS);Message msg = mHandler.obtainMessage(MSG_REQUEST_TRANSIENT_BARS);msg.arg1 = MSG_REQUEST_TRANSIENT_BARS_ARG_NAVIGATION;mHandler.sendMessageDelayed(msg, 500 /* delayMillis */);}@Overridepublic void onMouseLeaveFromEdge() {mHandler.removeMessages(MSG_REQUEST_TRANSIENT_BARS);}});displayContent.registerPointerEventListener(mSystemGestures);displayContent.mAppTransition.registerListenerLocked(mStatusBarController.getAppTransitionListener());mImmersiveModeConfirmation = new ImmersiveModeConfirmation(mContext, looper,mService.mVrModeEnabled);mAcquireSleepTokenRunnable = () -> {if (mWindowSleepToken != null) {return;}mWindowSleepToken = service.mAtmInternal.acquireSleepToken("WindowSleepTokenOnDisplay" + displayId, displayId);};mReleaseSleepTokenRunnable = () -> {if (mWindowSleepToken == null) {return;}mWindowSleepToken.release();mWindowSleepToken = null;};// TODO: Make it can take screenshot on external displaymScreenshotHelper = displayContent.isDefaultDisplay? new ScreenshotHelper(mContext) : null;if (mDisplayContent.isDefaultDisplay) {mHasStatusBar = true;mHasNavigationBar = mContext.getResources().getBoolean(R.bool.config_showNavigationBar);// Allow a system property to override this. Used by the emulator.// See also hasNavigationBar().String navBarOverride = SystemProperties.get("qemu.hw.mainkeys");if ("1".equals(navBarOverride)) {mHasNavigationBar = false;} else if ("0".equals(navBarOverride)) {mHasNavigationBar = true;}} else {mHasStatusBar = false;mHasNavigationBar = mDisplayContent.supportsSystemDecorations();}mRefreshRatePolicy = new RefreshRatePolicy(mService,mDisplayContent.getDisplayInfo(),mService.mHighRefreshRateBlacklist);}

在上面代码发现DisplayPolicy中的

SystemGesturesPointerEventListener就是具体处理系统手势的 onSwipeFromBottom()、

就是上滑事件的处理 所以就在这里增加Home事件就可以了,就可以模拟home功能

具体修改如下:

--- a/frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java+++ b/frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java@@ -178,11 +178,11 @@ import com.android.server.policy.WindowOrientationListener;import com.android.server.statusbar.StatusBarManagerInternal;import com.android.server.wallpaper.WallpaperManagerInternal;import com.android.server.wm.utils.InsetUtils;-+import android.view.KeyEvent;import java.io.PrintWriter;//unisoc: For Power Hintimport android.os.PowerHintVendorSprd;-+import android.provider.Settings;/*** The policy that provides the basic behaviors and states of a display to show UI.*/@@ -472,6 +472,7 @@ public class DisplayPolicy extends AbsDisplayPolicy {if (mStatusBar != null) {requestTransientBars(mStatusBar);}+}@Override@@ -488,6 +489,17 @@ public class DisplayPolicy extends AbsDisplayPolicy {updateShowHideNavSettings(true);}}+                                          //add code start+                                                 long now = SystemClock.uptimeMillis();+                          KeyEvent down =  new KeyEvent(now, now,KeyEvent.ACTION_DOWN, 3, 0);+                          KeyEvent up = new KeyEvent(now, now,KeyEvent.ACTION_UP, 3, 0);+                          InputManager.getInstance().injectInputEvent(down, InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);+                                                 InputManager.getInstance().injectInputEvent(up, InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);+                                           //add code end}

然后编译services.jar 替换就可以了

相关内容

热门资讯

猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...