Android源码分析(十三)----SystemUI下拉状态栏如何添加快捷开关
一:如何添加快捷开关
源码路径:frameworks/base/packages/SystemUI/res/values/config.xml
添加headset快捷开关,参考如下修改。
Index: res/values/config.xml
===================================================================
--- res/values/config.xml (版本 6870)
+++ res/values/config.xml (工作副本)
@@ -101,7 +101,7 @@
<!-- The default tiles to display in QuickSettings -->
<!-- M: add hotknot tile -->
<string name="quick_settings_tiles_default" translatable="false">
- wifi,cell,battery,autobringht,custom(com.bullitt_group.night/nightsight.bullitt_group.com.night.quicksettings.QuickSettingsService),flashlight,dnd,rotation,bt,airplane,hotknot,nfc,location
+ wifi,cell,battery,autobringht,custom(com.bullitt_group.night/nightsight.bullitt_group.com.night.quicksettings.QuickSettingsService),flashlight,dnd,rotation,bt,airplane,hotknot,nfc,location,headset
</string>
<!-- Tiles native to System UI. Order should match "quick_settings_tiles_default" -->
Android版本7.1修改方式
源码路径:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java
创建HeadsetTile 对象,实现快捷开关主要功能。
Index: src/com/android/systemui/statusbar/phone/QSTileHost.java
===================================================================
--- src/com/android/systemui/statusbar/phone/QSTileHost.java (版本 6870)
+++ src/com/android/systemui/statusbar/phone/QSTileHost.java (工作副本)
@@ -41,6 +41,7 @@
import com.android.systemui.qs.external.TileLifecycleManager;
import com.android.systemui.qs.external.TileServices;
import com.android.systemui.qs.tiles.AirplaneModeTile;
+import com.android.systemui.qs.tiles.HeadsetTile;
import com.android.systemui.qs.tiles.BatteryTile;
import com.android.systemui.qs.tiles.BluetoothTile;
import com.android.systemui.qs.tiles.CastTile;
@@ -501,6 +502,7 @@
else if (tileSpec.equals("battery")) return new BatteryTile(this);
else if (tileSpec.equals("saver")) return new DataSaverTile(this);
else if (tileSpec.equals("night")) return new NightDisplayTile(this);
+ else if (tileSpec.equals("headset")) return new HeadsetTile(this);
/// M: Add extra tiles in quicksetting @{
else if (tileSpec.equals("hotknot") && SIMHelper.isMtkHotKnotSupport())
Android8.0修改方式,原理一样,只是代码路径不同,这里不做过多介绍。
源码路径:frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java
public class QSFactoryImpl implements QSFactory {
private static final String TAG = "QSFactory";
private final QSTileHost mHost;
public QSFactoryImpl(QSTileHost host) {
mHost = host;
}
public QSTile createTile(String tileSpec) {
if (tileSpec.equals("wifi")) return new WifiTile(mHost);
else if (tileSpec.equals("bt")) return new BluetoothTile(mHost);
else if (tileSpec.equals("cell")) return new CellularTile(mHost);
else if (tileSpec.equals("dnd")) return new DndTile(mHost);
else if (tileSpec.equals("inversion")) return new ColorInversionTile(mHost);
else if (tileSpec.equals("airplane")) return new AirplaneModeTile(mHost);
else if (tileSpec.equals("work")) return new WorkModeTile(mHost);
else if (tileSpec.equals("rotation")) return new RotationLockTile(mHost);
else if (tileSpec.equals("flashlight")) return new FlashlightTile(mHost);
else if (tileSpec.equals("location")) return new LocationTile(mHost);
else if (tileSpec.equals("cast")) return new CastTile(mHost);
else if (tileSpec.equals("hotspot")) return new HotspotTile(mHost);
else if (tileSpec.equals("user")) return new UserTile(mHost);
else if (tileSpec.equals("battery")) return new BatterySaverTile(mHost);
else if (tileSpec.equals("saver")) return new DataSaverTile(mHost);
else if (tileSpec.equals("night")) return new NightDisplayTile(mHost);
else if (tileSpec.equals("nfc")) return new NfcTile(mHost);
// Intent tiles.
else if (tileSpec.startsWith(IntentTile.PREFIX)) return IntentTile.create(mHost, tileSpec);
else if (tileSpec.startsWith(CustomTile.PREFIX)) return CustomTile.create(mHost, tileSpec);
else {
Log.w(TAG, "Bad tile spec: " + tileSpec);
return null;
}
}
二:快捷开关功能实现
这里主要实现,打开开关弹出Notification(不可删除通知),关闭开关才能关闭通知。
源码路径:frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/HeadsetTile.java
- 继承
QSTile<QSTile.BooleanState> - newTileState方法中
return new BooleanState() - handleClick方法处理点击事件
- handleUpdateState方法更新状态信息
/*
* Copyright (c) 2016, The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.qs.tiles;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.provider.Settings;
import android.util.Log;
import android.widget.Switch;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.systemui.R;
import com.android.systemui.SystemUI;
import com.android.systemui.qs.QSTile;
public class HeadsetTile extends QSTile<QSTile.BooleanState> {
private Notification notification = new Notification();
private NotificationManager mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
private boolean headsetState;
public boolean isHeadsetState() {
return headsetState;
}
public void setHeadsetState(boolean headsetState) {
this.headsetState = headsetState;
}
public HeadsetTile(Host host) {
super(host);
}
@Override
public BooleanState newTileState() {
return new BooleanState();
}
@Override
protected void handleClick() {
//default mState.value is false
final boolean activated = !mState.value;
Log.d("jasun", "========activated========" + activated);
MetricsLogger.action(mContext, getMetricsCategory(), activated);
if (activated == true) {
SendNotification("Disable the headphone jack.");
setHeadsetState(activated);
} else {
mNotificationManager.cancel(1);
setHeadsetState(activated);
}
refreshState();
}
@Override
protected void handleUpdateState(BooleanState state, Object arg) {
final boolean isActivated = isHeadsetState();
state.value = isActivated;
state.label = mContext.getString(R.string.quick_settings_headset_label);
state.icon = ResourceIcon.get(isActivated ? R.drawable.ic_qs_headset_on
: R.drawable.ic_qs_headset_off);
state.contentDescription = mContext.getString(isActivated
? R.string.quick_settings_headset_summary_on
: R.string.quick_settings_headset_summary_off);
state.minimalAccessibilityClassName = state.expandedAccessibilityClassName
= Switch.class.getName();
}
@Override
public int getMetricsCategory() {
return MetricsEvent.QS_headset;
}
@Override
public Intent getLongClickIntent() {
return new Intent(Settings.ACTION_headset_SETTINGS);
}
@Override
protected void setListening(boolean listening) {
}
private void sendNotification(String message) {
Intent intent = new Intent(mContext, SystemUI.class);
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0,
intent, 0);
notification.icon = R.drawable.ic_qs_headset_on;
notification.tickerText = "HeadSet can not used";
notification.when = System.currentTimeMillis();
notification.defaults = Notification.DEFAULT_SOUND
| Notification.DEFAULT_VIBRATE;// set default sound
// notification.flags = Notification.FLAG_AUTO_CANCEL;// click auto disappeared
notification.flags = Notification.FLAG_NO_CLEAR;
notification.setLatestEventInfo(mContext, "Headset can not used", message, pendingIntent);
mNotificationManager.notify(1, notification);
}
@Override
public CharSequence getTileLabel() {
return mContext.getString(R.string.quick_settings_headset_label);
}
}
喜欢源码分析系列可参考其他文章:
Android源码分析(一)-----如何快速掌握Android编译文件
Android源码分析(二)-----如何编译修改后的framework资源文件
Android源码分析(三)-----系统框架设计思想
Android源码分析(四)-----Android源码编译及刷机步骤
Android源码分析(五)-----如何从架构师的角度去设计Framework框架
Android源码分析(十三)----SystemUI下拉状态栏如何添加快捷开关的更多相关文章
- Android源码分析(十七)----init.rc文件添加脚本代码
一:init.rc文件修改 开机后运行一次: chmod 777 /system/bin/bt_config.sh service bt_config /system/bin/bt_config.sh ...
- Android源码分析(八)-----系统启动流程&IPC简述
一 :系统启动流程图 从下往上依次启动linux kernel -->zygote-->SystemServer-->NativeService-->AndroidServic ...
- Android源码分析-全面理解Context
前言 Context在android中的作用不言而喻,当我们访问当前应用的资源,启动一个新的activity的时候都需要提供Context,而这个Context到底是什么呢,这个问题好像很好回答又好像 ...
- Android源码分析(十)-----关机菜单中如何添加飞行模式选项
一:关机菜单添加飞行模式选项 源码路径:frameworks/base/core/res/res/values/config.xml 增加<item>airplane</item&g ...
- Android源码分析(二)-----如何编译修改后的framework资源文件
一 : 编译framework资源文件 如果修改android framework资源文件,需要先编译资源文件,然后再编译framework才可以正常引用, 进入项目目录 cd work/source ...
- QTimer源码分析(以Windows下实现为例)
QTimer源码分析(以Windows下实现为例) 分类: Qt2011-04-13 21:32 5026人阅读 评论(0) 收藏 举报 windowstimerqtoptimizationcallb ...
- Android源码分析(六)-----蓝牙Bluetooth源码目录分析
一 :Bluetooth 的设置应用 packages\apps\Settings\src\com\android\settings\bluetooth* 蓝牙设置应用及设置参数,蓝牙状态,蓝牙设备等 ...
- Android源码分析(十六)----adb shell 命令进行OTA升级
一: 进入shell命令界面 adb shell 二:创建目录/cache/recovery mkdir /cache/recovery 如果系统中已有此目录,则会提示已存在. 三: 修改文件夹权限 ...
- Android源码分析(十五)----GPS冷启动实现原理分析
一:原理分析 主要sendExtraCommand方法中传递两个参数, 根据如下源码可以知道第一个参数传递delete_aiding_data,第二个参数传递null即可. @Override pub ...
随机推荐
- 201871010128-杨丽霞《面向对象程序设计(java)》第十周学习总结
201871010128-杨丽霞<面向对象程序设计(java)>第十周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这 ...
- destoon漏洞修复关于 $do->add($post); SQL注入修改
在阿里云漏洞提示查看发现destoon有关于mobile/guestbook.php $do->add($post); SQL注入修改 漏洞名称:Destoon SQL注入 补丁文件:/mobi ...
- 【Spring AOP】AOP的实现(三)
一.Spring 对AOP的支持 Spring中AOP代理由Spring的IOC容器负责生成.管理,其依赖关系也由IOC容器负责管理.因此,AOP代理可以直接使用容器中的其它bean实例作为目标,这种 ...
- BIO/NIO/AIO的区分(十四)
BIO:同步阻塞IO(平常说的IO指的是BIO)NIO:同步非阻塞IOAIO:异步非阻塞IO io操作分为两部分,发起io请求,和io数据读写. 阻塞.非阻塞主要是针对线程发起io请求后,是否立即返回 ...
- 为什么说要搞定微服务架构,先搞定RPC框架
今天开始聊一些微服务的实践,第一块,RPC框架的原理及实践,为什么说要搞定微服务架构,先搞定RPC框架呢? 一.需求缘起 服务化的一个好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队 ...
- Spring Data JPA整合REST客户端Feign时: 分页查询的反序列化报错的问题
Type definition error: [simple type, class org.springframework.data.domain.Page]; nested exception i ...
- F5 开发
产品试用申请 https://www.f5.com/trials 默认终端登录密码 root/default 默认网页登录信息 admin/admin logstash添加user agent插件 h ...
- [RN] React-Native中Array渲染的优化
React-Native中Array渲染的优化 例如用Push加进去的数据: constructor(props){ super(props); this.state = { b ...
- 8.5 NOIP模拟测试13 矩阵游戏+跳房子+优美序列
T1矩阵游戏 数学题.首先这一列这一行先乘还是后乘对最后答案没有影响.a[i][j]表示矩阵中原始的值,h[i]表示i行的累乘,l[i]表示i列的累乘.易得ans=Σa[i][j]*h[i]*l[i] ...
- Oracle--缓冲区忙等待事件
一,缓冲区等待事件 缓冲区忙等待是I/O-bound Oracle系统中比较常见的现象,特别是在Oracle STATSPACK报告的前五个忙等待的读(顺序/分散)系统中,如前5个定时事件: % 总和 ...