Android 长按电源键弹出的GlobalActions菜单

长按事件动作的配置

frameworks\base\core\res\res\values\config.xml     选择1会弹出Global actions menu

<!-- Control the behavior when the user long presses the power button.0 - Nothing1 - Global actions menu2 - Power off (with confirmation)3 - Power off (without confirmation)4 - Go to voice assist5 - Go to assistant (Settings.Secure.ASSISTANT)--><integer name="config_longPressOnPowerBehavior">1</integer>

frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java

对长按事件的处理

    private void powerLongPress(long eventTime) {final int behavior = getResolvedLongPressOnPowerBehavior();Slog.d(TAG, "powerLongPress: eventTime=" + eventTime+ " mLongPressOnPowerBehavior=" + mLongPressOnPowerBehavior);switch (behavior) {case LONG_PRESS_POWER_NOTHING:break;case LONG_PRESS_POWER_GLOBAL_ACTIONS:mPowerKeyHandled = true;performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false,"Power - Long Press - Global Actions");showGlobalActions();break;case LONG_PRESS_POWER_SHUT_OFF:case LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM:mPowerKeyHandled = true;performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false,"Power - Long Press - Shut Off");sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);mWindowManagerFuncs.shutdown(behavior == LONG_PRESS_POWER_SHUT_OFF);break;case LONG_PRESS_POWER_GO_TO_VOICE_ASSIST:mPowerKeyHandled = true;performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false,"Power - Long Press - Go To Voice Assist");// Some devices allow the voice assistant intent during setup (and use that intent// to launch something else, like Settings). So we explicitly allow that via the// config_allowStartActivityForLongPressOnPowerInSetup resource in config.xml.launchVoiceAssist(mAllowStartActivityForLongPressOnPowerDuringSetup);break;case LONG_PRESS_POWER_ASSISTANT:mPowerKeyHandled = true;performHapticFeedback(HapticFeedbackConstants.ASSISTANT_BUTTON, false,"Power - Long Press - Go To Assistant");final int powerKeyDeviceId = Integer.MIN_VALUE;launchAssistAction(null, powerKeyDeviceId, eventTime,AssistUtils.INVOCATION_TYPE_POWER_BUTTON_LONG_PRESS);break;}}
@Overridepublic void showGlobalActions() {mHandler.removeMessages(MSG_DISPATCH_SHOW_GLOBAL_ACTIONS);mHandler.sendEmptyMessage(MSG_DISPATCH_SHOW_GLOBAL_ACTIONS);}
public void handleMessage(Message msg) {switch (msg.what) {case MSG_DISPATCH_MEDIA_KEY_WITH_WAKE_LOCK:dispatchMediaKeyWithWakeLock((KeyEvent)msg.obj);break;case MSG_DISPATCH_MEDIA_KEY_REPEAT_WITH_WAKE_LOCK:dispatchMediaKeyRepeatWithWakeLock((KeyEvent)msg.obj);break;case MSG_DISPATCH_SHOW_RECENTS:showRecentApps(false);break;case MSG_DISPATCH_SHOW_GLOBAL_ACTIONS:showGlobalActionsInternal();break;
void showGlobalActionsInternal() {if (mGlobalActions == null) {mGlobalActions = new GlobalActions(mContext, mWindowManagerFuncs);}final boolean keyguardShowing = isKeyguardShowingAndNotOccluded();mGlobalActions.showDialog(keyguardShowing, isDeviceProvisioned());// since it took two seconds of long press to bring this up,// poke the wake lock so they have some time to see the dialog.mPowerManager.userActivity(SystemClock.uptimeMillis(), false);}

frameworks\base\services\core\java\com\android\server\policy\GlobalActions.java

private void ensureLegacyCreated() {if (mLegacyGlobalActions != null) return;mLegacyGlobalActions = new LegacyGlobalActions(mContext, mWindowManagerFuncs,this::onGlobalActionsDismissed);}public void showDialog(boolean keyguardShowing, boolean deviceProvisioned) {if (DEBUG) Slog.d(TAG, "showDialog " + keyguardShowing + " " + deviceProvisioned);if (mGlobalActionsProvider != null && mGlobalActionsProvider.isGlobalActionsDisabled()) {return;}mKeyguardShowing = keyguardShowing;mDeviceProvisioned = deviceProvisioned;mShowing = true;if (mGlobalActionsAvailable && !"box".equals(SystemProperties.get("ro.target.product","unkonw"))) {mHandler.postDelayed(mShowTimeout, 5000);mGlobalActionsProvider.showGlobalActions();} else {// SysUI isn't alive, show legacy menu.ensureLegacyCreated();mLegacyGlobalActions.showDialog(mKeyguardShowing, mDeviceProvisioned);}}

 item的创建在LegacyGlobalActions里

frameworks\base\services\core\java\com\android\server\policy\LegacyGlobalActions.java

/*** Create the global actions dialog.* @return A new dialog.*/private ActionsDialog createDialog() {// Simple toggle style if there's no vibrator, otherwise use a tri-stateif (!mHasVibrator) {mSilentModeAction = new SilentModeToggleAction();} else {mSilentModeAction = new SilentModeTriStateAction(mContext, mAudioManager, mHandler);}mAirplaneModeOn = new ToggleAction(R.drawable.ic_lock_airplane_mode,R.drawable.ic_lock_airplane_mode_off,R.string.global_actions_toggle_airplane_mode,R.string.global_actions_airplane_mode_on_status,R.string.global_actions_airplane_mode_off_status) {@Overridepublic void onToggle(boolean on) {if (mHasTelephony && TelephonyProperties.in_ecm_mode().orElse(false)) {mIsWaitingForEcmExit = true;// Launch ECM exit dialogIntent ecmDialogIntent =new Intent(TelephonyManager.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null);ecmDialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);mContext.startActivity(ecmDialogIntent);} else {changeAirplaneModeSystemSetting(on);}}@Overrideprotected void changeStateFromPress(boolean buttonOn) {if (!mHasTelephony) return;// In ECM mode airplane state cannot be changedif (!TelephonyProperties.in_ecm_mode().orElse(false)) {mState = buttonOn ? State.TurningOn : State.TurningOff;mAirplaneState = mState;}}@Overridepublic boolean showDuringKeyguard() {return true;}@Overridepublic boolean showBeforeProvisioning() {return false;}};onAirplaneModeChanged();mItems = new ArrayList<Action>();String[] defaultActions = mContext.getResources().getStringArray(com.android.internal.R.array.config_globalActionsList);ArraySet<String> addedKeys = new ArraySet<String>();for (int i = 0; i < defaultActions.length; i++) {String actionKey = defaultActions[i];if (addedKeys.contains(actionKey)) {// If we already have added this, don't add it again.continue;}if (GLOBAL_ACTION_KEY_POWER.equals(actionKey)) {mItems.add(new PowerAction(mContext, mWindowManagerFuncs));} else if (GLOBAL_ACTION_KEY_AIRPLANE.equals(actionKey)) {mItems.add(mAirplaneModeOn);} else if (GLOBAL_ACTION_KEY_BUGREPORT.equals(actionKey)) {if (Settings.Global.getInt(mContext.getContentResolver(),Settings.Global.BUGREPORT_IN_POWER_MENU, 0) != 0 && isCurrentUserOwner()) {mItems.add(new BugReportAction());}} else if (GLOBAL_ACTION_KEY_SILENT.equals(actionKey)) {if (mShowSilentToggle) {mItems.add(mSilentModeAction);}} else if (GLOBAL_ACTION_KEY_USERS.equals(actionKey)) {if (SystemProperties.getBoolean("fw.power_user_switcher", false)) {addUsersToMenu(mItems);}} else if (GLOBAL_ACTION_KEY_SETTINGS.equals(actionKey)) {mItems.add(getSettingsAction());} else if (GLOBAL_ACTION_KEY_LOCKDOWN.equals(actionKey)) {mItems.add(getLockdownAction());} else if (GLOBAL_ACTION_KEY_VOICEASSIST.equals(actionKey)) {mItems.add(getVoiceAssistAction());} else if (GLOBAL_ACTION_KEY_ASSIST.equals(actionKey)) {mItems.add(getAssistAction());} else if (GLOBAL_ACTION_KEY_RESTART.equals(actionKey)) {mItems.add(new RestartAction(mContext, mWindowManagerFuncs));} else {Log.e(TAG, "Invalid global action key " + actionKey);}// Add here so we don't add more than one.addedKeys.add(actionKey);}if (mEmergencyAffordanceManager.needsEmergencyAffordance()) {mItems.add(getEmergencyAction());}mAdapter = new ActionsAdapter(mContext, mItems,() -> mDeviceProvisioned, () -> mKeyguardShowing);AlertController.AlertParams params = new AlertController.AlertParams(mContext);params.mAdapter = mAdapter;params.mOnClickListener = this;params.mForceInverseBackground = true;ActionsDialog dialog = new ActionsDialog(mContext, params);dialog.setCanceledOnTouchOutside(false); // Handled by the custom class.dialog.getListView().setItemsCanFocus(true);dialog.getListView().setLongClickable(true);dialog.getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view, int position,long id) {final Action action = mAdapter.getItem(position);if (action instanceof LongPressAction) {return ((LongPressAction) action).onLongPress();}return false;}});dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);// Don't acquire soft keyboard focus, to avoid destroying state when capturing bugreportsdialog.getWindow().setFlags(FLAG_ALT_FOCUSABLE_IM, FLAG_ALT_FOCUSABLE_IM);dialog.setOnDismissListener(this);return dialog;}private class BugReportAction extends SinglePressAction implements LongPressAction {public BugReportAction() {super(com.android.internal.R.drawable.ic_lock_bugreport, R.string.bugreport_title);}@Overridepublic void onPress() {// don't actually trigger the bugreport if we are running stability// tests via monkeyif (ActivityManager.isUserAMonkey()) {return;}// Add a little delay before executing, to give the// dialog a chance to go away before it takes a// screenshot.mHandler.postDelayed(new Runnable() {@Overridepublic void run() {try {// Take an "interactive" bugreport.MetricsLogger.action(mContext,MetricsEvent.ACTION_BUGREPORT_FROM_POWER_MENU_INTERACTIVE);ActivityManager.getService().requestInteractiveBugReport();} catch (RemoteException e) {}}}, 500);}@Overridepublic boolean onLongPress() {// don't actually trigger the bugreport if we are running stability// tests via monkeyif (ActivityManager.isUserAMonkey()) {return false;}try {// Take a "full" bugreport.MetricsLogger.action(mContext, MetricsEvent.ACTION_BUGREPORT_FROM_POWER_MENU_FULL);ActivityManager.getService().requestFullBugReport();} catch (RemoteException e) {}return false;}@Overridepublic boolean showDuringKeyguard() {return true;}@Overridepublic boolean showBeforeProvisioning() {return false;}@Overridepublic String getStatus() {return mContext.getString(com.android.internal.R.string.bugreport_status,Build.VERSION.RELEASE_OR_CODENAME,Build.ID);}}

添加菜单可以参考 Android 6.0长按电源键添加重启菜单-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Flink on k8s】- 15 - 将 flink on yarn 迁移到 flink on k8s

目录 1、集群现状 2、与 Flink on yarn 对比 2.1 Flink on yarn 的一些痛点 2.2 Flink on k8s 的一些优点

uniApp 中实现一个骰子动效

代码如下 <template><!-- 骰子组件 --><view class"dice-wrap" tap"throwDice"><!-- 筛子运动时候的展示的图片 --><image v-if"isDicing" :src"diceAnimationImages[aniIndex]" class"dice-icon&qu…

mybatis-plus雪花算法自动生成ID到前端后精度丢失问题

问题发生 前端接收到后端的数据出现异常&#xff0c;异常如下&#xff1a; 如图这是后端正常返回的数据&#xff0c; 但是点击预览时发现这个id的数据被改变了 这就导致了我通过id去修改相关数据时无法成功 问题原因 id的长度过长&#xff08;19位&#xff09;&#xff0c;前…

前端(一):HTML+CSS

参考课程&#xff1a;23最新版web前端开发_哔哩哔哩_bilibili 文档&#xff1a;GitHub - codeNiuMa/HTML-md-file: 学习HTML课程时的资料 目录 1 HTML 1.1 骨架 DOCTYPE html标签 head标签 body标签 title标签 meta标签 1.2 标签标题h1 1.3 段落p 1.4 水平线 1.5 图片img 1.6 …

MacOS下载配置OpenCV

主要参考的是OpenCV官方的这篇文章&#xff1a;OpenCV: Installation in MacOS 安装OpenCV需要下载一些安装包&#xff1a;CMake3.9、Git、Python这些我之前已经下载好&#xff0c;这里就不过多阐述了&#xff0c;自行百度安装即可 1.从Git库获取OpenCV&#xff1a; git clon…

[NAND Flash] 3.3 Flash闪存工艺知识深度解析

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 全文 3800 字。 1. Wafer 1.1 什么是 Wafer Wafer即晶圆&#xff0c;是半导体组件“晶片”或“芯片”的基材&#xff0c;从沙子里面…

Java医院信息化建设云HIS系统源码

云HIS提供标准化、信息化、可共享的医疗信息管理系统&#xff0c;实现医患事务管理和临床诊疗管理等标准医疗管理信息系统的功能。优化就医、管理流程&#xff0c;提升患者满意度、基层首诊率&#xff0c;通过信息共享、辅助诊疗等手段&#xff0c;提高基层医生的服务能力构建和…

喜讯连连捷报传,文章累累创佳绩,平均IF 18分!!!

爱基百客专注于提供领先的表观组学服务&#xff0c;目前已在表观组学、单细胞时空组学和高通量测序等方向积累了大量的项目经验。近期&#xff08;11月23日-12月4日&#xff09;&#xff0c;高分项目文章频出&#xff0c;涉及物种有梨、腰果、蘑菇、青枯雷尔氏菌和心肌细胞&…

系统的安全性设计

要设计一个安全的系统&#xff0c;除了要了解一些前面讲到的常用的保护手段和技术措施外&#xff0c;还要对系统中可能出现的安全问题或存在的安全隐患有充分的认识&#xff0c;这样才能对系统的安全作有针对性的设计和强化&#xff0c;即“知己知彼&#xff0c;百战百胜”。 下…

【Oracle】创建表

目录 方法一&#xff1a;CREATE TABLE 语法 创建表示例1&#xff1a;创建stuinfo(学生信息表) 创建表示例2&#xff1a;添加stuinfo(学生信息表)约束 方法二&#xff1a;CREATE TABLE AS 语法 创建表示例3&#xff1a; 创建表示例4&#xff1a;实现对select查询的结果进行…

什么是数据可视化?数据可视化的优势、方法及示例

前言 在当今的数字时代&#xff0c;数据是企业和组织的命脉&#xff0c;生成的数据量呈指数级增长。这种被称为大数据的海量数据在洞察力和决策方面具有巨大的潜力。然而&#xff0c;如果没有一种有效的方法来分析和理解这些数据&#xff0c;它就会变得毫无意义和难以管理。这就…

四十六、Redis哨兵

目录 一、哨兵的作用及原理 1、哨兵的结构和作用如下&#xff1a; 2、服务状态监控 3、选举新的master 4、小结 二、RedisTemplate的哨兵模式 一、哨兵的作用及原理 Redis提供了哨兵&#xff08;Sentinel&#xff09;机制来实现主从集群的自动故障恢复。 1、哨兵的结构和作…

【电路笔记】-电容器

电容器 文章目录 电容器1、概述2、电容器的电容单位3、电容4、电容器示例15、电介质6、额定电压7、总结 电容器是简单的无源器件&#xff0c;当连接到电压源时&#xff0c;可以在极板上存储电荷。 1、概述 在本电容器简介文章中&#xff0c;我们将看到电容器是无源电子元件&am…

【Spring】Spring AOP

Spring AOP AOP概述什么是AOP Spring AOP快速入门1.引入AOP依赖2. 编写AOP程序 Spring AOP 详解Spring AOP 核心概念切点(Pointcut)连接点(Join Point)通知(Advice)切面(Aspect) 通知类型PointCut切面优先级Order切点表达式execution表达式annotation自定义注解切面类 AOP原理代…

Leetcode—896.单调数列【简单】

2023每日刷题&#xff08;五十九&#xff09; Leetcode—896.单调数列 实现代码 class Solution { public:bool isMonotonic(vector<int>& nums) {int up 0;int down 0;if(nums.size() 1) {return true;}for(int i 0; i < nums.size() - 1; i) {if(nums[i] …

前端自定义icon的方法(Vue项目)

第一步&#xff1a;进入在线的编辑器进行设计 好用&#xff1a;百度字体编辑器 比如先导入有个ttf文件 添加新字体 双击每个模块进入编辑区域 更改相应的信息&#xff0c;比如name 编辑完了进行导出文件(各种格式就行了)就行了 第二步&#xff1a;在项目中asset文件储存这些文…

【PS】修改 图片 文字

修改文字 1&#xff1a;框选要修改的文字 选择-色彩范围 调整色彩容差能看见字体的时候就OK&#xff08;记住用吸管吸取文字颜色&#xff09; 2&#xff1a;选择-修改-扩展-像素2 3&#xff1a;编辑-内容识别填充 现在文字去除了。 用污点画笔修复工具&#xff0c;对缺陷进行…

Meta 新推出的实时语音翻译模型 Seamless

项目简介 SeamlessM4T 是我们基础的一体式大规模多语言和多模式机器翻译模型&#xff0c;可为近 100 种语言的语音和文本提供高质量翻译。 SeamlessM4T 模型支持以下任务&#xff1a; 语音到语音翻译 (S2ST) 语音到文本翻译 (S2TT) 文本到语音翻译 (T2ST) 文本到文本翻译 (…

大语言模型:开启自然语言处理新纪元

导言 大语言模型&#xff0c;如GPT-3&#xff08;Generative Pre-trained Transformer 3&#xff09;&#xff0c;标志着自然语言处理领域取得的一项重大突破。本文将深入研究大语言模型的基本原理、应用领域以及对未来的影响。 1. 简介 大语言模型是基于深度学习和变压器&…

微信小程序代码包限制2M 怎么解决?

微信小程序代码包限制为2MB主要是为了保证小程序的加载速度和用户体验&#xff0c;但对于一些大型复杂的小程序来说&#xff0c;这个限制可能会成为开发的难点。以下是几种常见的解决方法&#xff1a; 代码压缩&#xff1a;可以通过使用webpack等工具进行代码压缩&#xff0c;从…