Android frameworks 开发总结之八

Quick Settings增加一項

XXX device要求在quick settings中增加一項touch panel.

  • 在/frameworks/base/packages/SystemUI/res/values/config.xml文件中的quick_settings_tiles_default string 中增加touch panel。並在String resource文件中增加顯示的title

<!-- The default tiles to display in QuickSettings --><string name="quick_settings_tiles_default" translatable="false">wifi,bt,dnd,touchpanel,flashlight,rotation,battery,cell,airplane,cast</string>
  • 在frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles 下增加TouchPanelTile.java文件.

package com.android.systemui.qs.tiles;import android.content.Intent;
import android.provider.Settings;
import android.util.Log;
import android.os.SystemProperties;import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.R;
import com.android.systemui.qs.QSHost;
import com.android.systemui.plugins.qs.QSTile;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.plugins.qs.QSTile.BooleanState;import javax.inject.Inject;/**/** Quick settings tile: Touch Panel **/
public class TouchPanelTile extends QSTileImpl<BooleanState> {private static final String PERSIST_KEY_PROP_TOUCH_MODE = "persist.sys.touch_mode";private static final int TOUCH_MODE_PROPERTY_FINGER = 0;private static final int TOUCH_MODE_PROPERTY_STYLUS = 1;private static final int TOUCH_MODE_PROPERTY_GLOVE = 2;private static final String TOUCH_MODE_FINGER = "finger";private static final String TOUCH_MODE_STYLUS = "stylus";private static final String TOUCH_MODE_GLOVE = "glove";private int mTouchPanelMode = 0;private QSHost qsHost;private boolean isHandleClick = false;@Injectpublic TouchPanelTile(QSHost host) {super(host);qsHost = host;}@Overridepublic BooleanState newTileState() {return new BooleanState();}@Overrideprotected void handleClick() {mTouchPanelMode ++;   //在quick setting中點擊時調用if(mTouchPanelMode > TOUCH_MODE_PROPERTY_GLOVE){mTouchPanelMode = TOUCH_MODE_PROPERTY_FINGER;}updateTouchMode(mTouchPanelMode);isHandleClick = true;refreshState();Log.i("WKS1","TouchPanelTile -> handleClick: mTouchPanelMode = " + mTouchPanelMode);}@Overrideprotected void handleUpdateState(BooleanState state, Object arg) { //下拉quick setting時調用if (isHandleClick) {…..} else {try {String mode = SystemProperties.get(PERSIST_KEY_PROP_TOUCH_MODE);……//state.labe 設置顯示titlestate.label = mContext.getString(R.string.quick_settings_touch_panel_stylus);}Log.i("WKS1", "TouchPanelTile -> handleUpdateState: mode = " + mode);} catch (NumberFormatException e) {Log.e(TAG, "could not get touch mode", e);}}isHandleClick = false;state.icon = ResourceIcon.get(R.drawable.ic_qs_bluetooth_on);Log.i("WKS1","TouchPanelTile -> handleUpdateState: state.value = " + state.value);Log.i("WKS1","TouchPanelTile -> handleUpdateState: mTouchPanelMode = " + mTouchPanelMode);}@Overridepublic int getMetricsCategory() {return MetricsEvent.QS_TOUCHPANEL;}@Overridepublic Intent getLongClickIntent() { //長按顯示界面return new Intent(Settings.ACTION_DISPLAY_SETTINGS);}...@Overridepublic CharSequence getTileLabel() {if (mTouchPanelMode == TOUCH_MODE_PROPERTY_FINGER) {return mContext.getString(R.string.quick_settings_touch_panel_finger);} else if (mTouchPanelMode == TOUCH_MODE_PROPERTY_GLOVE) {return mContext.getString(R.string.quick_settings_touch_panel_glove);} else {return mContext.getString(R.string.quick_settings_touch_panel_stylus);}}private void updateTouchMode(int mode){//SystemUI 中使用SystemProperties.set提示設置失敗,使用settings數據監聽方式 Settings.System.putInt(qsHost.getContext().getContentResolver(),Settings.System.TOUCH_PANEL_MODE,mode);}
}
  • frameworks/base/proto/src/metrics_constants/metrics_constants.proto 文件中增加 MetricsEvent.QS_TOUCHPANEL

// OPEN: QS Touch Panel tile shown// ACTION: QS Touch Panel tile tapped//  SUBTYPE: 0 is off, 1 is finger, 2 is glove, 3 is stylus// CATEGORY: QUICK_SETTINGSQS_TOUCHPANEL = 1751;
  • 在frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java 文件中實現

@@ -46,6 +46,7 @@ import com.android.systemui.qs.tiles.UserTile;import com.android.systemui.qs.tiles.WifiTile;import com.android.systemui.qs.tiles.WorkModeTile;import com.android.systemui.util.leak.GarbageMonitor;
+import com.android.systemui.qs.tiles.TouchPanelTile;import javax.inject.Inject;import javax.inject.Provider;
@@ -75,6 +76,7 @@ public class QSFactoryImpl implements QSFactory {private final Provider<NfcTile> mNfcTileProvider;private final Provider<GarbageMonitor.MemoryTile> mMemoryTileProvider;private final Provider<UiModeNightTile> mUiModeNightTileProvider;
+    private final Provider<TouchPanelTile> mTouchPanelProvider;private QSTileHost mHost;@@ -97,7 +99,8 @@ public class QSFactoryImpl implements QSFactory {Provider<NightDisplayTile> nightDisplayTileProvider,Provider<NfcTile> nfcTileProvider,Provider<GarbageMonitor.MemoryTile> memoryTileProvider,
-            Provider<UiModeNightTile> uiModeNightTileProvider) {
+            Provider<UiModeNightTile> uiModeNightTileProvider,
+            Provider<TouchPanelTile> TouchPanelTileProvider) {mWifiTileProvider = wifiTileProvider;mBluetoothTileProvider = bluetoothTileProvider;mCellularTileProvider = cellularTileProvider;
@@ -117,6 +120,7 @@ public class QSFactoryImpl implements QSFactory {mNfcTileProvider = nfcTileProvider;mMemoryTileProvider = memoryTileProvider;mUiModeNightTileProvider = uiModeNightTileProvider;
+        mTouchPanelProvider = TouchPanelTileProvider;}public void setHost(QSTileHost host) {
@@ -170,6 +174,8 @@ public class QSFactoryImpl implements QSFactory {return mNfcTileProvider.get();case "dark":return mUiModeNightTileProvider.get();
+            case "touchpanel":
+                return mTouchPanelProvider.get();}

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

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

相关文章

网络数据结构skb_buff原理

skb_buff基本原理 内核中sk_buff结构体在各层协议之间传输不是用拷贝sk_buff结构体&#xff0c;而是通过增加协议头和移动指针来操作的。如果是从L4传输到L2&#xff0c;则是通过往sk_buff结构体中增加该层协议头来操作&#xff1b;如果是从L4到L2&#xff0c;则是通过移动sk_…

Kafka(五)消费者回调 +定时重试 + 理解Rebalance

文章目录 消费者回调如何抽象callBack消息&#xff1f;为什么要设置serverId?如何消费callBack消息&#xff1f; 定时重试消息失败表的设计重试逻辑设计 理解Rabalance通过日志来理解rebalance 参考资料结语示例源码仓库 消费者回调 有些邮件发送成功之后&#xff0c;需要执行…

【Linux】fork()

文章目录 一、fork()是什么&#xff1f;二、fork()干了什么&#xff1f;三、fork()怎么用&#xff1f; 一、fork()是什么&#xff1f; fork()函数其实是在Linux系统中用于创建一个新的进程。让我们看看Linux中是怎么描述的&#xff1f;运行man fork。 RETURN VALUE On success…

php站点伪静态配置(Apache+Linux)

404报错&#xff1a; 404 Not Found nginx/1.15.11 问题解决&#xff1a; 1、Linux location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s/$1 last; } } 2、Apache <IfModule mod_rewrite.c> RewriteEngine on RewriteBase / RewriteCond %{REQU…

英特尔和 ARM 将合作开发移动芯片技术,如何看待双方合作?

英特尔和 ARM 将合作开发移动芯片技术&#xff0c;如何看待双方合作&#xff1f; 最近市场传出Arm要自产芯片&#xff0c;供智能手机与笔电等使用后&#xff0c;外媒指Arm自产芯片将由英特尔晶圆代工部门打造&#xff0c;变成英特尔晶圆代工客户。将采用英特尔18A工艺&#xff…

利用Nginx与php处理方式不同绕过Nginx_host实现SQL注入

目录 首先需要搭建环境 nginxphpmysql环境&#xff1a; 搭建网站 FILTER_VALIDATE_EMAIL 绕过 方法1&#xff1a;冒号号分割host字段 方法2&#xff1a;冒号号分割host字段 方法3&#xff1a;SNI扩展绕过 首先需要搭建环境 nginxphpmysql环境&#xff1a; php安装包&a…

深入了解Spring Cloud中的分布式事务解决方案

引言 介绍分布式系统中事务管理的重要性&#xff0c;以及在云计算环境下分布式事务所面临的挑战。 传统事务和分布式事务 解释本地事务与分布式事务的区别&#xff0c;以及为什么在分布式环境中需要特殊的事务管理机制。 分布式事务的挑战 探讨在分布式系统中实现事务一致性所…

vite和webpack的区别和练习

Vite和Webpack都是现代化的前端构建工具&#xff0c;但它们之间存在一些区别&#xff1a; 构建性能&#xff1a;Vite使用ES Modules提高了构建性能&#xff0c;可以在构建时只构建需要的部分&#xff0c;而Webpack则需要在构建时处理整个应用程序。 开发体验&#xff1a;Vite具…

vue一个页面左边是el-table表格 当点击每条数据时可以在右边界面编辑表格参数,右边保存更新左边表格数据

实现思路&#xff1a; 1.点击当前行通过row拿到当前行数据。 2.将当前行数据传给子组件。 3.子组件监听父组件传过来的数据并映射在界面。 4.点击保存将修改的值传给父组件更新表格。 5.父组件收到修改过后的值&#xff0c;可以通过字段判断比如id&#xff0c;通过 findIn…

VR Interaction Framework2.0使用

1 按键 &#xff0c;比如按压下手柄的B键 if (InputBridge.Instance.BButtonDown){print("kkkkkkbbbbb456");} 2抓取某个物体&#xff0c;那么就在要抓取的那个物体上加一些组件&#xff0c;特别是Grabble Unity Events

cocos2dx DrawNode

cocos2dx 两种绘图方式 DrawPrimitivesDrawNode DrawPrimitives 3.x 已经弃用 绘制的图形可以是实心的&#xff0c;也可以是空心的。 DrawNode 在一个单独的批处理中绘制了所以元素&#xff0c;因此它绘制点、线段、多边形都要比“drawing primitives”快。 绘制的图形都…

【基础知识】AB软件RSLinx如何实现OPC通讯组态

哈喽&#xff0c;大家好&#xff0c;我是雷工。 在上一节了解了什么是RSLinx&#xff1f;以及RSLinx Lite、RSLinx Classice、RSLinx Professional、RSLinx Gateway几个版本的特点。 本节了解AB的RSLinx如何实现OPC组态。 一、创建RSLinx通讯&#xff1a; 1.1、【Communicati…

excel自己记录

1、清除换行符号 2、添加特殊符号&并清除换行符号 7日&15日&30日&60日 3、判断单元格最后一个字符是不是数字&#xff0c;不是就删掉 IF(ISNUMBER(--RIGHT(B2,1)),B2,SUBSTITUTE(B2,RIGHT(B2,1),"")) ISNUMBER(--RIGHT(B2,1))判断最右边的一个数是否…

Wireshark的捕获过滤器

Wireshark的过滤器&#xff0c;顾名思义&#xff0c;作用是对数据包进行过滤处理。具体过滤器包括捕获过滤器和显示过滤器。本文对捕获过滤器进行分析。 捕获过滤器&#xff1a;当进行数据包捕获时&#xff0c;只有那些满足给定的包含/排除表达式的数据包会被捕获。 捕获过滤器…

一起学docker系列之九docker运行mysql 碰到的各种坑及解决方法

目录 前言1 Docker 运行mysql命令2 坑一&#xff1a;无法读取/etc/mysql/conf.d目录的问题3 坑二&#xff1a;/tmp/ibnr0mis 文件无法创建/写入的问题4 坑三&#xff1a;Navicat 连接错误&#xff08;1045-access denied&#xff09;5 坑四&#xff1a;MySQL 登录失败问题结语 …

ros2文件package.xml与cmakelists.txt比较

每次在ros2里面添加文件以后&#xff0c;都要修改packages.xml,与cmakelists.txt文件。

Vue服务端渲染——同构渲染

Vue.js 可以用于构建客户端应用程序&#xff0c;组件的代码在浏览器中运行&#xff0c;并输出 DOM 元素。同时&#xff0c;Vue.js 还可以在 Node.js 环境中运行&#xff0c;它可以将同样的组件渲染为字符串并发送给浏览器。这实际上描述了 Vue.js 的两种渲染方式&#xff0c;即…

爬虫项目实战:利用基于selenium框架的爬虫模板爬取豆瓣电影Top250

&#x1f44b; Hi, I’m 货又星&#x1f440; I’m interested in …&#x1f331; I’m currently learning …&#x1f49e; I’m looking to collaborate on …&#x1f4eb; How to reach me … README 目录&#xff08;持续更新中&#xff09; 各种错误处理、爬虫实战及模…

Lua实现面向对象三大特性

面向对象是基于table实现的 封装 :(冒号) 自动将调用该函数的对象作为第一个参数传入 --Object就是第一参数 function Object:new() self&#xff1a;代表默认传入的第一个参数 _index&#xff1a;当自己的变量中找不到时&#xff0c;会默认找原表中_index指向的内容 Obj…

AD9361快速开发指南

AD9361是ADI&#xff08;Analog Devices&#xff09;公司推出的一款全集成的RF收发器芯片&#xff0c;广泛应用于无线通信系统&#xff0c;包括基于FPGA和ARM处理器的数码电视&#xff0c;卫星通信&#xff0c;雷达通信&#xff0c;军事通信和工业控制等领域。AD9361提供了广泛…