一起看看StatusBarManagerService(三)

写在前面

StatusBarManagerService中API涉及systemui的多个模块;本篇主要介绍StatusBarManagerService中与通知栏相关的API和几个通用API。
因为我对系统UI了解的不全,其他API暂不整理,怕误人子弟。。


通知栏相关函数解析

1.展开通知栏

void animateExpandNotificationsPanel()

// CentralSurfacesCommandQueueCallbacks@Override
public void animateExpandNotificationsPanel() {if (CentralSurfaces.SPEW) {Log.d(CentralSurfaces.TAG,"animateExpand: mExpandedVisible=" + mShadeController.isExpandedVisible());}if (!mCommandQueue.panelsEnabled()) {return;}mShadeViewController.expandToNotifications();
}// NotificationPanelViewController@Override
public void expandToNotifications() {if (mSplitShadeEnabled && (isShadeFullyExpanded() || isExpandingOrCollapsing())) {return;}if (mQsController.getExpanded()) {mQsController.flingQs(0, FLING_COLLAPSE);} else {expand(true /* animate */);}
}
2.关闭通知栏

void animateCollapsePanels(int flags, boolean force)

// CentralSurfacesCommandQueueCallbacks@Override
public void animateCollapsePanels(int flags, boolean force) {mShadeController.animateCollapsePanels(flags, force, false /* delayed */,1.0f /* speedUpFactor */);
}// ShadeControllerImpl@Override
public void animateCollapsePanels(int flags, boolean force, boolean delayed,float speedUpFactor) {if (!force && mStatusBarStateController.getState() != StatusBarState.SHADE) {runPostCollapseRunnables();return;}if (SPEW) {Log.d(TAG,"animateCollapse(): mExpandedVisible=" + mExpandedVisible + "flags=" + flags);}if (getNotificationShadeWindowView() != null&& mNotificationPanelViewController.canBeCollapsed()&& (flags & CommandQueue.FLAG_EXCLUDE_NOTIFICATION_PANEL) == 0) {// release focus immediately to kick off focus change transitionmNotificationShadeWindowController.setNotificationShadeFocusable(false);mNotificationShadeWindowViewController.cancelExpandHelper();mNotificationPanelViewController.collapse(true, delayed, speedUpFactor);}
}
3.togglePanel

void togglePanel() 如果板子展开,就关闭;如果板子关闭,就展开

@Override
public void togglePanel() {if (mCentralSurfaces.isPanelExpanded()) {mShadeController.animateCollapseShade();} else {animateExpandNotificationsPanel();}
}
4.展开QS

原生通知栏上方区域有header和QS区域,QS(quick settings)区域提供了多个系统设置的快捷开关;
QS区域也可以进行展开和关闭,touch事件在NotificationShadeWindow中统一进行分发。
void animateExpandSettingsPanel(String obj)

@Override
public void animateExpandSettingsPanel(@Nullable String subPanel) {if (CentralSurfaces.SPEW) {Log.d(CentralSurfaces.TAG,"animateExpand: mExpandedVisible=" + mShadeController.isExpandedVisible());}if (!mCommandQueue.panelsEnabled()) {return;}// Settings are not available in setupif (!mDeviceProvisionedController.isCurrentUserSetup()) return;mShadeViewController.expandToQs();
}
5.addQsTile/remQsTile/clickTile

void addQsTile(ComponentName tile)
void remQsTile(ComponentName tile)
void clickTile(ComponentName tile)
Tile为quick settings区域的单个操作按钮;系统提供了三方增加/移除/点击对应tile的API。

@Override
public void addQsTile(ComponentName tile) {mQSHost.addTile(tile);
}// 触发点击tile@Override
public void clickTile(ComponentName tile) {// Can't inject this because it changes with the QS fragmentQSPanelController qsPanelController = mCentralSurfaces.getQSPanelController();if (qsPanelController != null) {qsPanelController.clickTile(tile);}
}

通用相关函数解析

1.setImeWindowStatus

void setImeWindowStatus(int displayId, IBinder token, int vis,@BackDispositionMode int backDisposition, boolean showImeSwitcher)
当前输入法界面是否调起

// NavigationBar@Override
public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition,boolean showImeSwitcher) {if (displayId != mDisplayId) {return;}boolean imeShown = mNavBarHelper.isImeShown(vis);showImeSwitcher = imeShown && showImeSwitcher;int hints = Utilities.calculateBackDispositionHints(mNavigationIconHints, backDisposition,imeShown, showImeSwitcher);if (hints == mNavigationIconHints) return;setNavigationIconHints(hints);checkBarModes();updateSystemUiStateFlags();
}
2.showToast/hideToast

通过systemui展示toast,供无界面的系统应用使用;弹toast需要context
void showToast(int uid, String packageName, IBinder token, CharSequence text,IBinder windowToken, int duration,@Nullable ITransientNotificationCallback callback, int displayId)
void hideToast(String packageName, IBinder token)

@Override
@MainThread
public void showToast(int uid, String packageName, IBinder token, CharSequence text,IBinder windowToken, int duration, @Nullable ITransientNotificationCallback callback,int displayId) {Runnable showToastRunnable = () -> {UserHandle userHandle = UserHandle.getUserHandleForUid(uid);Context context = mContext.createContextAsUser(userHandle, 0);DisplayManager mDisplayManager = mContext.getSystemService(DisplayManager.class);Display display = mDisplayManager.getDisplay(displayId);Context displayContext = context.createDisplayContext(mDisplayManager.getDisplay(displayId));mToast = mToastFactory.createToast(mContext /* sysuiContext */, text, packageName,userHandle.getIdentifier(), mOrientation);if (mToast.getInAnimation() != null) {mToast.getInAnimation().start();}mCallback = callback;mPresenter = new ToastPresenter(displayContext, mIAccessibilityManager,mNotificationManager, packageName);// Set as trusted overlay so touches can pass through toastsmPresenter.getLayoutParams().setTrustedOverlay();mToastLogger.logOnShowToast(uid, packageName, text.toString(), token.toString());mPresenter.show(mToast.getView(), token, tempWindowToken, duration, mToast.getGravity(),mToast.getXOffset(), mToast.getYOffset(), mToast.getHorizontalMargin(),mToast.getVerticalMargin(), mCallback, mToast.hasCustomAnimation());};if (mToastOutAnimatorListener != null) {// if we're currently animating out a toast, show new toast after prev toast is hiddenmToastOutAnimatorListener.setShowNextToastRunnable(showToastRunnable);} else if (mPresenter != null) {// if there's a toast already showing that we haven't tried hiding yet, hide it and// then show the next toast after its hidden animation is donehideCurrentToast(showToastRunnable);} else {// else, show this next toast immediatelyshowToastRunnable.run();}
}@Override
@MainThread
public void hideToast(String packageName, IBinder token) {if (mPresenter == null || !Objects.equals(mPresenter.getPackageName(), packageName)|| !Objects.equals(mPresenter.getToken(), token)) {Log.w(TAG, "Attempt to hide non-current toast from package " + packageName);return;}mToastLogger.logOnHideToast(packageName, token.toString());hideCurrentToast(null);
}

写在后面

如果文章中有错误的地方,希望各位大佬们批评指正~

If you like this article, it is written by Johnny Deng.
If not, I don’t know who wrote it.

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

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

相关文章

智慧灯杆技术应用分析

智慧灯杆是指在传统灯杆的基础上,通过集成多种先进技术实现城市智能化管理的灯杆。智慧灯杆技术应用的分析如下: 照明功能:智慧灯杆可以实现智能调光、时段控制等功能,根据不同的需求自动调节照明亮度,提高照明效果&am…

如何测试Nginx防盗链是否生效?

1、查看Nginx防盗链规则是否正确 打开Nginx的配置文件,找到防盗链规则。一般Nginx防盗链的规则内容大致如下: location ~* \.(jpg|jpeg|png|gif)$ {valid_referers none blocked example.com;if ($invalid_referer) {return 403;}} 上述配置会拦截所…

利用Pytorch预训练模型进行图像分类

Use Pre-trained models for Image Classification. # This post is rectified on the base of https://learnopencv.com/pytorch-for-beginners-image-classification-using-pre-trained-models/# And we have re-orginaized the code script.预训练模型(Pre-trained models)…

c++标识线程

c标识线程 线程ID类型为std::thread::id,它有两种方式获取。 直接通过std::thread对象的成员函数get_id()来获取。如果thread对象没有与任何执行线程相关联,get_id()将返回std::thread::id对象,它按照默认的构造方式生成,表示线程…

大型科技公司与初创公司:选择哪一个?

你有没有想过,特别是在你职业生涯的开始,选择什么类型的公司?它应该是一家像谷歌、亚马逊、Meta 这样的大型科技公司,还是为一家小型初创公司工作。在本文中,我们将讨论实际差异是什么,并帮助你选择最适合你…

『OPEN3D』1.8.3 多份点云配准

多份点云配准是将多份点云数据在全局空间中对齐的过程。通常,输入是一组数据(例如点云或RGBD图像){Pi}。输出是一组刚性变换{Ti},使得经过变换的点云在全局空间中对齐。 NNNNNathan 本专栏地址: https://blog.csdn.net/qq_41366026/category_12186023.html 此处是…

orcad(Cadence)常用库olb介绍

基础库: CAPSYM.OLB capsym 共35个零件,存放电源,地,输入输出口,标题栏等。DISCRETE.OLB 共872个零件,存放分立式元件,如电阻,电容,电感,开关,变…

DHCP—动态主机配置协议

动态主机配置协议DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是RFC 1541(已被RFC 2131取代)定义的标准协议,该协议允许服务器向客户端动态分配IP地址和配置信息。 DHCP协议支持C/S&#x…

pom配置文件重要标签探究

文章目录 dependencies标签dependencyManagement标签两者辨析repositories标签properties标签 dependencies标签 <dependencies>标签用于指定项目的依赖项列表。这些依赖项可以是应用程序代码所需的库&#xff0c;也可以是Spring Boot和其他第三方库。<dependencies&…

RocketMQ 总体概括

目录 概述RocketMQ 领域模型MQ 解决的问题电商平台案例初步设计引入中间件设计 MQ 选型结束 概述 官网地址 RocketMQ 领域模型 官方领域模型概述 下面图&#xff0c;是在自己理解的基础上&#xff0c;对官方的模型图添加了一些。 Topic&#xff1a;主题&#xff0c;可以理解…

打家劫舍Ⅱ java

题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 &#xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#xff0c;相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的…

深入解析MySQL中内连接、外连接的区别及实践应用

​嗨&#xff0c;大家好&#xff0c;欢迎来到程序猿漠然公众号&#xff0c;我是漠然。在数据库查询中&#xff0c;连接是一种常用的操作&#xff0c;用于从两个或多个表中获取数据。本文将详细介绍MySQL中的内连接、外连接的概念、区别以及实践应用&#xff0c;帮助大家更好地理…

Java网络编程——基于UDP的数据报和套接字

java.net.ServerSocket与java.net.Socket建立在TCP的基础上。TCP是网络传输层的一种可靠的数据传输协议。如果数据在传输途中被丢失或损坏&#xff0c;那么TCP会保证再次发送数据&#xff1b;如果数据到达接收方的顺序被打乱&#xff0c;那么TCP会在接收方重新恢复数据的正确顺…

vscode报错Pylance client: couldn‘t create connection to server.

问题描述&#xff1a; 一打开vscode&#xff0c;右下角就弹报错&#xff0c;Pylance client: couldn’t create connection to server.&#xff0c;让我打开output&#xff0c;打开后似乎是在说连不上server 因为连不上server&#xff0c;所以我的python代码没法解析&#xff0…

2.4 C语言之运算符

2.4 C语言之运算符 一、算术运算符二、关系运算符三、逻辑运算符四、自增自减运算符五、按位运算符六、赋值运算符七、条件表达式八、运算符优先级与求值次序 一、算术运算符 二元算术运算符包括&#xff1a;(加)、-(减)、*(乘)、/(除)、%(取模) 整数除法会截断结果中的小数部…

扬声器(喇叭)

扬声器(喇叭) 电子元器件百科 文章目录 扬声器(喇叭)前言一、扬声器(喇叭)是什么二、扬声器(喇叭)的类别三、扬声器(喇叭)的应用场景四、扬声器(喇叭)的作用原理总结前言 扬声器广泛应用于音响系统、公共广播系统、汽车音响、电视、电脑和移动设备等各种电子设备…

Linux基本开发工具

编译器和自动化构建工具 一、编译器——gcc、g1. 安装 gcc/g2. 使用3. 链接库4. 拓展命令&#xff1a;od/file/ldd/readelf 二、自动化构建项目——make、makefile1. 介绍2. 使用例子touch——change file timestampsstat——display file or file system status修改时间 .PHON…

Qt 文字描边(基础篇)

项目中有时需要文字描边的功能 1.基础的绘制文字 使用drawtext处理 void MainWindow::paintEvent(QPaintEvent *event) {QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);painter.setRenderHint(QPainter::SmoothPixmapTransform, true);painte…

ceph的osd盘删除操作和iscsi扩展

ceph的osd盘删除操作 拓展:osd磁盘的删除(这里以删除node1上的osd.0磁盘为例) 1, 查看osd磁盘状态 [rootnode1 ceph]# ceph osd tree ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF -1 0.00298 root default -3 0.00099 host node10 hdd 0.00…

【Vins轨迹】pose_graph位姿图加载EVO精度评定

1. Vins的位姿图加载功能 如果想要对slam运行后的位姿轨迹进行评定&#xff0c;需要将数据保存到output文件夹中。 其中pose_graph.txt含有的信息&#xff1a;关键帧id、时间戳、vio的xyz、优化后的xyz、vio的四元数、优化后的四元数、回环到的关键帧id、回环信息&#xff08…