rk3568开启双屏异显异触摸时键盘焦点及分发事件固定在主屏

news/2024/9/24 10:10:26

OS:Android11

 

需求描述:当app启用双屏异显双触摸,物理键盘只能固定在主屏有作用。

 

问题现象:双屏异显异触,带物理键盘输入。打开异显app,物理键盘的按键事件分发到主屏。 当触摸副屏的时候,物理键盘事件分发到副屏。当现再次触摸主屏,物理键盘的键事件分发到主屏。

 

问题分析:在之前3288 Android7上,没有该问题的。经了解是Android只支持一个屏的焦点事件,即默认是在主屏这边。Android10以后,支持多屏显示焦点事件,比如多个屏单独使用输入法等,这就导致触摸哪个屏,焦点事件就随着哪个屏走。

 

该需求最终实现是RK原厂提供的path:

涉及修改文件:frameworks/base
core/java/android/view/IWindowManager.aidl
core/res/res/values/config.xml
services/core/java/com/android/server/policy/PhoneWindowManager.java
services/core/java/com/android/server/wm/RootWindowContainer.java
services/core/java/com/android/server/wm/WindowManagerService.javadiff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 5a32d283b17d..da90b9ca35e6 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -766,4 +766,10 @@ interface IWindowManager*/void requestScrollCapture(int displayId, IBinder behindClient, int taskId,IScrollCaptureController controller);
+
+    /**
+     * Switch focus at defautl/external display.
+     * @hide
+     */
+    void switchFocusedScreen();}
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 2ebd8bb36a03..f8ccec591465 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2025,7 +2025,7 @@<!-- Whether the system enables per-display focus. If the system has the input method for eachdisplay, this value should be true. -->
-    <bool name="config_perDisplayFocusEnabled">false</bool>
+    <bool name="config_perDisplayFocusEnabled">true</bool><!-- Whether a software navigation bar should be shown. NOTE: in the future this may beautodetected from the Configuration. -->
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 5003fca4bada..a5a1d5bc702b 100755
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -2859,6 +2859,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {mScreenshotRunnable.setScreenshotSource(SCREENSHOT_KEY_OTHER);mHandler.post(mScreenshotRunnable);}
+            if(down){
+                try{
+                    mWindowManager.switchFocusedScreen();
+                } catch(RemoteException e){
+                    e.printStackTrace();
+                }
+            }return -1;} else if (keyCode == KeyEvent.KEYCODE_BRIGHTNESS_UP|| keyCode == KeyEvent.KEYCODE_BRIGHTNESS_DOWN) {
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/andr
oid/server/wm/RootWindowContainer.java
index 197e2188c346..d41cd367b1b5 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -457,6 +457,12 @@ class RootWindowContainer extends WindowContainer<DisplayContent>int topFocusedDisplayId = INVALID_DISPLAY;for (int i = mChildren.size() - 1; i >= 0; --i) {final DisplayContent dc = mChildren.get(i);
+            if(mWindowManager.mFocusedInSecondDisplay&&dc.isDefaultDisplay){
+                continue;
+            }
+            if(!mWindowManager.mFocusedInSecondDisplay&&!dc.isDefaultDisplay){
+                continue;
+            }changed |= dc.updateFocusedWindowLocked(mode, updateInputWindows, topFocusedDisplayId);final WindowState newFocus = dc.mCurrentFocus;if (newFocus != null) {
@@ -467,7 +473,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent>if (topFocusedDisplayId == INVALID_DISPLAY) {topFocusedDisplayId = dc.getDisplayId();}
-            } else if (topFocusedDisplayId == INVALID_DISPLAY && dc.mFocusedApp != null) {
+            } else if ((topFocusedDisplayId == INVALID_DISPLAY) && dc.mFocusedApp != null) {// The top-most display that has a focused app should still be the top focused// display even when the app window is not ready yet (process not attached or// window not added yet).
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/and
roid/server/wm/WindowManagerService.java
index 1ae8e783e21b..deb2a2cfe9db 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -754,6 +754,8 @@ public class WindowManagerService extends IWindowManager.StubSettingsObserver mSettingsObserver;final EmbeddedWindowController mEmbeddedWindowController;+    boolean mFocusedInSecondDisplay = false;
+@VisibleForTestingfinal class SettingsObserver extends ContentObserver {private final Uri mDisplayInversionEnabledUri =
@@ -8337,4 +8339,26 @@ public class WindowManagerService extends IWindowManager.StubBinder.restoreCallingIdentity(origId);}}
+
+    /**
+     * Switch focus at default/second screen.
+     */
+    public void switchFocusedScreen(){
+            if (mFocusedInSecondDisplay){
+                setFocusedInSecondDisplay(false);
+            }
+            else{
+                setFocusedInSecondDisplay(true);
+            }
+        }
+    
+        /**
+         * if flag is equal to true, Focused would be at second screen.
+         * @param flag isFocusedInSecondScreen
+         */
+        private void setFocusedInSecondDisplay(boolean flag){
+            mFocusedInSecondDisplay = flag;
+            //refresh surface right now.
+            updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true);
+        }}
PhoneWindowManager.java中的path主要是可以通过按键事件input keyevent 120灵活切换主副屏的焦点,由于此补丁默认是在主屏的,使用不加也可满足需求。
frameworks/base/core/java/android/view/KeyEvent.java

 



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/64066.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

第三周作业(海报)

我所选的主题是数字。运用数字王国的标题,吸引小学生的注意。学生们可以在数字王国中探索,从低年级的认识数字开始培养起对数学的兴趣,为以后的数学学习铺垫好坚实的基础。在本张海报中,我运用了文字、图片、插画、数字这三种素材,并且插画颜色丰富、且进校园生活和数字,…

解决pyinstaller打包后的程序有时卡住按回车才动

当CMD命令提示符出现卡住现象,只需通过鼠标操作解决:点击标题栏,右键选择属性,取消勾选快速编辑模式,即可避免输入回车才能继续的问题。 原因 快速编辑模式阻塞控制台输出 解决 鼠标移动至标题栏->单击鼠标右键->属性->取消勾选快速编辑模式

别再吹牛逼说什么零延迟了,不可能的事

关于流媒体推拉流延时的几点说明。经常看到一些流媒体相关的程序,号称零延迟,不用怀疑,这肯定吹牛逼的。 搞音视频开发,有个核心的指标就是实时性,也就是延迟多少毫秒,这个问题问的也是最多的。 音视频文件几乎不存在实时性问题,只有音视频流才有实时性的指标。 延迟多久…

css的属性选择器使用

感谢 https://www.runoob.com/css/css-attribute-selectors.html 的底部评论 https://www.runoob.com/cssref/css-selectors.html 虽然一直有用到属性选择器,但是缺乏全面的了解,都是用到了就百度,看到一个大佬的总结评论,做个记录 CSS 属性选择器 ~=, |=, ^=, $=, *= 的区别 …

AdEMAMix: 一种创新的神经网络优化器

这是9月发布的一篇论文,Pagliardini等人在其论文中提出了一种新的优化算法——AdEMAMix。这种算法旨在解决当前广泛使用的Adam及其变体(如AdamW)在利用长期梯度信息方面的局限性。研究者们通过巧妙地结合两个不同衰减率的指数移动平均(EMA),设计出了这种新的优化器,以更…

Vue 基本使用

基本使用,组件使用❗必须要会! 高级特性 不常用,但可以体现你的知识深度 Vuex 和 Vue router❗重要 考察频率高面试题👇1. 指令 插值computed和watchcomputed的值没变,会缓存起来 watch 深度监听: deep: true,有子属性会遍历下去。 class和style 动态属性、驼峰写法条件…

绘制印章的开源工具DrawStampUtils使用

最近写了一个绘制印章的工具DrawStampUtils,具有比较完整的印章修改效果,定制化度较高,git地址(https://github.com/xxss0903/drawstamputils),也可以在npmjs中搜索DrawStampUtils即可// 将要绘制的canvas组件的引用传入,还有就是对应的毫米转像素的大小传入即可const sta…

从零开始学机器学习——什么是机器学习

机器学习作为人工智能的重要组成部分,通过算法自动发现数据中的模式和规律,从而使我们能够做出预测和决策。在学习过程中,我们强调了重要的关键词汇和步骤,包括训练数据集、模型、训练方法和调优过程。这个系列的文章旨在为初学者提供机器学习知识,避免使用专业术语和复杂…