# SingleHandMode(单手模式)
基于Android M,修改系统源码实现单手模式。
--------------------------------------------------------------------------------------------------------------------------------------
ANDROID从版本4.2开始提供了一个显示管理服务DisplayManagerService,支持多种显示类型的多个显示器的镜像显示,包括内建的显示类型(本地)、HDMI显示类型以及支持WIFI Display 协议( MIRACAST),实现本地设备在远程显示器上的镜像显示。
--------------------------------------------------------------------------------------------------------------------------------------
修改DMS,在其中添加一个触发单手模式的方法 void singleHandModeChange(boolean change,boolean left).
diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java
index 80f8fd3..6a49816 100644
--- a/core/java/android/hardware/display/DisplayManager.java
+++ b/core/java/android/hardware/display/DisplayManager.java
@@ -543,6 +543,13 @@ public final class DisplayManager {
name, width, height, densityDpi, surface, flags, callback, handler);
}
+ // single hand mode
+ /** @hide */
+ public void singleHandModeChange(boolean change, boolean left) {
+ mGlobal.singleHandModeChange(change, left);
+ }
/**
* Get the plug status of SmartBook
*
diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java
index 3869992..62a98e9 100644
--- a/core/java/android/hardware/display/DisplayManagerGlobal.java
+++ b/core/java/android/hardware/display/DisplayManagerGlobal.java
@@ -427,6 +427,17 @@ public final class DisplayManagerGlobal {
}
}
+ // single hand mode
+ public void singleHandModeChange(boolean change, boolean left) {
+ try {
+ mDm.singleHandModeChange(change, left);
+ } catch (RemoteException ex) {
+ Log.w("SingleHandMode", "SingleHandMode Failed to singleHandChange error:" + ex.toString());
+ }
+ }
+
public boolean isSinkEnabled() {
boolean enabled = false;
try {
diff --git a/core/java/android/hardware/display/IDisplayManager.aidl b/core/java/android/hardware/display/IDisplayManager.aidl
index 89e386d..afe90f2 100644
--- a/core/java/android/hardware/display/IDisplayManager.aidl
+++ b/core/java/android/hardware/display/IDisplayManager.aidl
@@ -84,4 +84,9 @@ interface IDisplayManager {
void suspendWifiDisplay(boolean suspend, in Surface surface);
void sendUibcInputEvent(String input);
+
+ // single hand mode
+ void singleHandModeChange(boolean change,boolean left);
}
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 81e8c54..7371d6f 100755
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -155,6 +155,12 @@ public final class DisplayManagerService extends SystemService {
// services should be started. This option may disable certain display adapters.
public boolean mOnlyCore;
+ // single hand mode
+ private boolean mSingleHandModeState = false;
+ private boolean mSingleHandModeLeft = true;
+
// True if the display manager service should pretend there is only one display
// and only tell applications about the existence of the default logical display.
// The display manager can still mirror content to secondary displays but applications
@@ -944,6 +950,13 @@ public final class DisplayManagerService extends SystemService {
+ device.getDisplayDeviceInfoLocked());
return;
}
+
+ // single hand mode
+ display.mSingleHandModeState = mSingleHandModeState;
+ display.mSingleHandModeLeft = mSingleHandModeLeft;
+
display.configureDisplayInTransactionLocked(device, info.state == Display.STATE_OFF);
// Update the viewports if needed.
@@ -1255,6 +1268,17 @@ public final class DisplayManagerService extends SystemService {
}
}
+ // single hand mode
+ public void singleHandModeChange(boolean change, boolean left) {
+ mSingleHandModeState = change;
+ mSingleHandModeLeft = left;
+ Slog.d("SingleHandMode", "singleHandMode singleHandMode singleHandModeState=" + mSingleHandModeState + " left " + mSingleHandModeLeft);
+ scheduleTraversalLocked(false);
+ performTraversalInTransactionFromWindowManagerInternal();
+ }
+
/**
* Returns the list of all display ids.
*/
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index c42b8fb..63a5fd3 100755
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -704,6 +704,14 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
state = Display.STATE_OFF;
}
+ // single hand mode
+ if (state == Display.STATE_OFF) {
+ mWindowManagerPolicy.closeSingleHandMode();
+ Slog.d("SingleHandMode", "DisplayPowerController---closeSingleHandMode---state : " + state);
+ }
+
/// M: dismiss ColorFade when IPO boot up
final boolean ipoShutdown = mIPOShutDown;
diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java
index 4b89ef5..14e9d7b 100644
--- a/services/core/java/com/android/server/display/LogicalDisplay.java
+++ b/services/core/java/com/android/server/display/LogicalDisplay.java
@@ -22,6 +22,7 @@
package com.android.server.display;
import android.graphics.Rect;
+import android.os.SystemProperties;
import android.view.Display;
import android.view.DisplayInfo;
import android.view.Surface;
@@ -77,6 +78,13 @@ final class LogicalDisplay {
private DisplayDevice mPrimaryDisplayDevice;
private DisplayDeviceInfo mPrimaryDisplayDeviceInfo;
+ // single hand mode
+ private static final String SINGLE_HAND_MODE_SUPPORTED = "ro.android.singlehandmode";
+ public boolean mSingleHandModeState = false;
+ public boolean mSingleHandModeLeft = true;
+
// True if the logical display has unique content.
private boolean mHasContent;
@@ -349,8 +357,45 @@ final class LogicalDisplay {
int displayRectTop = (physHeight - displayRectHeight) / 2;
int displayRectLeft = (physWidth - displayRectWidth) / 2;
- mTempDisplayRect.set(displayRectLeft, displayRectTop,
- displayRectLeft + displayRectWidth, displayRectTop + displayRectHeight);
+ /*mTempDisplayRect.set(displayRectLeft, displayRectTop,
+ displayRectLeft + displayRectWidth, displayRectTop + displayRectHeight);*/
+ // single hand mode
+ final boolean singleHandModeSupported = SystemProperties.get(SINGLE_HAND_MODE_SUPPORTED, "false").equals("true");
+ if (singleHandModeSupported) {
+ int displayRectRight = displayRectLeft + displayRectWidth;
+ int displayRectBottom = displayRectTop + displayRectHeight;
+
+ if ((mSingleHandModeState == true) && (!isBlanked)) {
+ if (mSingleHandModeLeft == true) {
+ displayRectTop = displayRectTop + displayRectHeight / 4;
+ displayRectRight = displayRectLeft + displayRectWidth * 3 / 4;
+ } else {
+ displayRectLeft = displayRectLeft + displayRectWidth / 4;
+ displayRectTop = displayRectTop + d
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
软件开发设计:PHP、QT、应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、存储设备、移动设备等 操作系统:LInux、IOS、树莓派、安卓开发、微机操作系统、网络操作系统、分布式操作系统等。此外,还有嵌入式操作系统、智能操作系统等。 网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络与通信是一个非常广泛的领域,它涉及到计算机科学、电子工程、数学等多个学科的知识。 云计算与大数据:数据集、包括云计算平台、大数据分析、人工智能、机器学习等,云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。
资源推荐
资源详情
资源评论
收起资源包目录
基于Android M,修改系统源码实现单手模式。.zip (3个子文件)
cm
LICENSE 11KB
.gitignore 465B
README.md 9KB
共 3 条
- 1
资源评论
妄北y
- 粉丝: 9828
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功