微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > Android L屏幕固定功能ScreenPinning须知

Android L屏幕固定功能ScreenPinning须知

时间:10-02 整理:3721RD 点击:
[DESCRIPTION]
1. Google在android5.0上新增了一个屏幕固定功能(设置-->安全-->屏幕固定),屏幕固定后只能同时长按Navigation bar上 的“back”和“Recent”键才能解除。实体键无法解除屏幕固定,这是Google默认设计。因为android5.0开始Google Compatibility Definition Document建议手机设备配置navigation bar。CTSVerifier会测试屏幕固定功能,若设备没有navigation bar会导致该测项fail。
2. 没有配置navigationbar的Android 5.1设备需PASS CTS,有两种方案:
1)Screen pining时动态show/hide navigationbar方式,前提是设备屏幕支持多点触控,因为要同时按下back和recent键才能unpining。 如需要这种方案,请提e-service至mtk申请“Android5.1屏幕固定CTS temp patch".该patch会在测试screen pining时动态显示/隐藏navigationbar.
2)若设备屏幕是伪多点触控,也可以选择设备某个实体键长按或者短按来screen unpinning.请参考SOLUTION A实现.
3.没有配置navigationbar的Android 5.0设备需PASS CTS,可选择设备某个实体键长按或者短按来screen unpinning.请参考SOLUTION A实现.
4. 如不过CTS认证,仅需拿掉屏幕固定这一功能,请SOLUTION B.
[SOLUTION A]
以长按实体键HOME解除屏幕固定为例,分为三个步骤:
1).实体按键HOME,BACK,RECENT的touch事件会传递到PhoneWindowManager.java中
interceptKeyBeforeDispatching()方法。以长按HOME键为例,会调用handleLongPressOnHome()方
法,在此处解除即可。
2).解除屏幕固定调用activitymanger的stopLockTaskModeOnCurrent(),可参考PhoneStatusbar.java中handleLongPressBackRecents()方法。
3).CTS Verifier测试时Screen pinning Test界面用户无法修改,也不需要修改。
但终端用户使用手机Screen Pinning功能时的相关UE提示建议与实际unpinning按键保持一致(如下图)。


图中按键图标资源和提示字串资源请自行修改,提示字串参考如下:
For L0:
Hook File:
/php?mod=tag&id=6090" target="_blank" class="relatedlink">Frameworks/base/services/core/java/com/android/server/am/LockTaskNotify.java
Resource File: /frameworks/base/core/res/res/values/Strings.xml,及其他语言下的
Strings.xml
Resource ID: lock_to_app_toast,lock_to_app_toast_accessible,lock_to_app_description.
For L1:
Hook File:
/frameworks/base/packages/SystemUI/src/com/android/systemui/recent/ScreenPinningRequest
.java
Resource File: /frameworks/base/packages/SystemUI/res/values/Strings.xml及其他语言下的
Strings.xml
Resource ID: screen_pinning_description.
[SOLUTION B]
修改文件
alps\packages\apps\Settings\src\com\android\settings\SecuritySettings.java
1).import文件
import android.view.WindowManagerGlobal;
import android.os.RemoteException;
import android.view.IWindowManager;
2).新增mWindowManagerService变量并获得实例
IWindowManager mWindowManagerService;
public void onCreate(Bundle savedInstanceState) {
……
mWindowManagerService = WindowManagerGlobal.getWindowManagerService();
3).在createPreferenceHierarchy判断,如果没有Navigation bar就remove屏幕固定
private PreferenceScreen createPreferenceHierarchy() {
……
// Advanced Security features
PreferenceGroup advancedCategory =
(PreferenceGroup)root.findPreference(KEY_ADVANCED_SECURITY);
if (advancedCategory != null) {
Preference manageAgents = advancedCategory.findPreference(KEY_MANAGE_TRUST_AGENTS);
if (manageAgents != null && !mLockPatternUtils.isSecure()) {
manageAgents.setEnabled(false);
manageAgents.setSummary(R.string.disabled_because_no_backup_security);
}
}
////no navigation bar , hide pinng button
try {
boolean showNav = mWindowManagerService.hasNavigationBar();
if(!showNav){
advancedCategory.removePreference(advancedCategory.findPreference(KEY_SCREEN_PINNING));
}
}catch (RemoteException ex) {
// no window manager? good luck with that
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top