SystemUI KeyguardBouncer的加载
不积跬步无以至千里
Bouncer界面就是安全解锁界面,绘制在statusbar的window上.
一.keyguardbouncer在statusbar布局上添加,移除:
1.code/app/src/com/android/systemui/statusbar/phone/StatusBar.java
protected void startKeyguard() {
...
mStatusBarKeyguardViewManager = keyguardViewMediator.registerStatusBar(this,getBouncerContainer(), mScrimController,mFingerprintUnlockController);
...
}
...
//StatusBar的布局
protected ViewGroup getBouncerContainer() {return mStatusBarWindow;}
2.code/app/src/com/android/systemui/keyguard/KeyguardViewMediator.java
public StatusBarKeyguardViewManager registerStatusBar(StatusBar statusBar,ViewGroup container,ScrimController scrimController,FingerprintUnlockController fingerprintUnlockController) {mStatusBarKeyguardViewManager.registerStatusBar(statusBar, container,scrimController, fingerprintUnlockController,mDismissCallbackRegistry);return mStatusBarKeyguardViewManager;}
code/app/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
public void registerStatusBar(StatusBar statusBar,ViewGroup container,ScrimController scrimController,FingerprintUnlockController fingerprintUnlockController,DismissCallbackRegistry dismissCallbackRegistry) {mStatusBar = statusBar;mContainer = container;mScrimController = scrimController;mFingerprintUnlockController = fingerprintUnlockController;mBouncer = SystemUIFactory.getInstance().createKeyguardBouncer(mContext,mViewMediatorCallback, mLockPatternUtils, container, dismissCallbackRegistry);}
code/app/src/com/android/systemui/SystemUIFactory.java
public KeyguardBouncer createKeyguardBouncer(Context context, ViewMediatorCallback callback,LockPatternUtils lockPatternUtils,ViewGroup container, DismissCallbackRegistry dismissCallbackRegistry) {return new KeyguardBouncer(context, callback, lockPatternUtils, container,dismissCallbackRegistry);}
code/app/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
mContainer就是传过来的mStatusBarWindow布局,通过addView与removeView添加与删除
//添加
protected void inflateView() {
...
mContainer.addView(mRoot, mContainer.getChildCount());
...
}
//移除
private final Runnable mRemoveViewRunnable = this::removeView;
protected void removeView() {if (mRoot != null && mRoot.getParent() == mContainer) {mContainer.removeView(mRoot);mRoot = null;}}
public void hide(boolean destroyView) {..mHandler.postDelayed(mRemoveViewRunnable, 50);...
}
二.其中布局整体加载如下:
super_status_bar 动态加载 keyguardbouncer > keyguard_host_view > view_flipper > 动态加载 > 5种不同密码盘布局
三.根据不同的安全模式加载不同的密码盘
1.初始化时
code/app/src/com/android/keyguardKeyguardHostView.java
@Overrideprotected void onFinishInflate() {...mSecurityContainer.showPrimarySecurityScreen(false);...}
2.获取当前用户的安全解锁的密码模式
code/app/src/com/android/keyguard/KeyguardSecurityContainer.java
void showPrimarySecurityScreen(boolean turningOff) {SecurityMode securityMode = mSecurityModel.getSecurityMode(KeyguardUpdateMonitor.getCurrentUser());if (DEBUG) Log.v(TAG, "showPrimarySecurityScreen(turningOff=" + turningOff + ")");showSecurityScreen(securityMode);}
3.获取到当前安全解锁的密码id并获取其布局,然后动态addView
code/app/src/com/android/keyguard/KeyguardSecurityContainer.java
private void showSecurityScreen(SecurityMode securityMode) {...KeyguardSecurityView oldView = getSecurityView(mCurrentSecuritySelection);KeyguardSecurityView newView = getSecurityView(securityMode);}private KeyguardSecurityView getSecurityView(SecurityMode securityMode) {final int securityViewIdForMode = getSecurityViewIdForMode(securityMode);KeyguardSecurityView view = null;final int children = mSecurityViewFlipper.getChildCount();for (int child = 0; child < children; child++) {if (mSecurityViewFlipper.getChildAt(child).getId() == securityViewIdForMode) {view = ((KeyguardSecurityView)mSecurityViewFlipper.getChildAt(child));break;}}int layoutId = getLayoutIdFor(securityMode);if (view == null && layoutId != 0) {final LayoutInflater inflater = LayoutInflater.from(mContext);if (DEBUG) Log.v(TAG, "inflating id = " + layoutId);View v = inflater.inflate(layoutId, mSecurityViewFlipper, false);mSecurityViewFlipper.addView(v);updateSecurityView(v);view = (KeyguardSecurityView)v;}return view;}private int getSecurityViewIdForMode(SecurityMode securityMode) {switch (securityMode) {case Pattern: return R.id.keyguard_pattern_view;//wangdy add for 4 or 6 num unlock_2019-07-19[start]case FourNum: return R.id.ssui_keyguard_four_num_pin_view;case SixNum: return R.id.ssui_keyguard_six_num_pin_view;//wangdy add for 4 or 6 num unlock_2019-07-19[end]case PIN: return R.id.keyguard_pin_view;case Password: return R.id.keyguard_password_view;case SimPin: return R.id.keyguard_sim_pin_view;case SimPuk: return R.id.keyguard_sim_puk_view;}return 0;}public int getLayoutIdFor(SecurityMode securityMode) {switch (securityMode) {case Pattern: return R.layout.keyguard_pattern_view;//wangdy add for 4 or 6 num unlock_2019-07-19[start]case SixNum: return R.layout.ssui_keyguard_six_num_pin_view;case FourNum: return R.layout.ssui_keyguard_four_num_pin_view;//wangdy add for 4 or 6 num unlock_2019-07-19[end]case PIN: return R.layout.keyguard_pin_view;case Password: return R.layout.keyguard_password_view;case SimPin: return R.layout.keyguard_sim_pin_view;case SimPuk: return R.layout.keyguard_sim_puk_view;default:return 0;}}
其它:
如果需要添加其它的解锁方式,需要平台或者设置配合联调,可以在这里进行添加并获取新的密码解锁模式
SecurityMode getSecurityMode(int userId) {KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext);if (SubscriptionManager.isValidSubscriptionId(monitor.getNextSubIdForState(IccCardConstants.State.PIN_REQUIRED))) {return SecurityMode.SimPin;}if (mIsPukScreenAvailable && SubscriptionManager.isValidSubscriptionId(monitor.getNextSubIdForState(IccCardConstants.State.PUK_REQUIRED))) {return SecurityMode.SimPuk;}final int security = mLockPatternUtils.getActivePasswordQuality(userId);switch (security) {case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX://wangdy modify for 4 or 6 num unlock_2019-07-19[start]/*return SecurityMode.PIN;*/
// final int fourandsixModel = SystemProperties.getInt("fourandsix", 0);final int fourandsixModel = Settings.Secure.getInt(mContext.getContentResolver(),"ss_lock_number_of_password", 0);android.util.Log.i("KeyguardSecurityModel", "fourandsix.type:" + fourandsixModel);if (fourandsixModel == 4) {return SecurityMode.FourNum;} else if (fourandsixModel == 6) {return SecurityMode.SixNum;} else {return SecurityMode.PIN;}//wangdy add for 4 or 6 num unlock_2019-07-19[end]case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:case DevicePolicyManager.PASSWORD_QUALITY_MANAGED:return SecurityMode.Password;case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:return SecurityMode.Pattern;case DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED:return SecurityMode.None;default:throw new IllegalStateException("Unknown security quality:" + security);}}
SystemUI KeyguardBouncer的加载相关推荐
- Android 4.0 ICS SystemUI浅析——StatusBar加载流程分析
前面两篇文章< Android 4.0 ICS SystemUI浅析--SystemUI启动流程>.< Android 4.0 ICS SystemUI浅析--StatusBar结构 ...
- SystemUI之状态栏notification icon加载流程
2019独角兽企业重金招聘Python工程师标准>>> 引言 今天我们主要讲的是SystemUI状态栏里面另一个常见的icons--notification icons,该icons ...
- Android 8.1 中Systemui中的常见修改(六)NavigationBar加载流程
本文主要分为两个部分 一.NavigationBar的加载流程 二.Android P上如何去除NavigationBar 一 NavigationBar的加载流程 NavigationBar就是我们 ...
- SystemUI 下拉通知栏快捷键加载流程
1.下拉通知栏简介 2.源码位置 SystemUIService.javaframeworks/base/packages/SystemUI/src/com/android/systemui/Syst ...
- Android6.0 keyguard锁屏加载流程分析
锁屏界面的加载通常在android中有两种方式触发:android系统开机和screenOff(灭屏)后,再screenOn; 先来看 android系统开机时候的锁屏加载流程: 首先在系统启动过程中 ...
- 【Android】恢复出厂后静态壁纸加载流程
Android静态壁纸功能实现参与的类 /frameworks/base/core/java/android/app/WallpaperManager.java 给开发者提供方法调用.例:setBit ...
- Android 13 平板Taskbar加载流程
从 Android 12开始,如果是大屏底下导航栏会变成显示一个任务栏,从 NavigationBar 变成 Taskbar . 注:CentralSurfacesImpl.java 与 原来的 st ...
- android 进lanucher的广播,Android开机优化之调整Launcher的加载时间
前言 如前面两篇文章所描述的, 我们对Android系统的开机时间优化有了一个比较全面的了解,以及一些常用的调试手段(bootchart等),在这篇文章中我们先来看看如下这个问题,首先看一张图: 如上 ...
- Launcher启动流程加载流程学习
声明: 图片本来是有的 涉及到有些代码不能示人没有贴上,不过仅文字说也足够了,请广大老爷们自行下载源码参看流程分析阅读. 目录 一.认识Launcher: 1 1.功能 1 2.样式 2 3.And ...
- ArcEngine加载栅格数据
一直以来对栅格数据接触较少,曾经大二的时候用ERDAS做过监督分类和蓝藻提取,后来接触了GIS开发也就没再做过了,不过现在还是准备探索一下ArcEngine针对栅格数据的相关操作.既然数据是GIS的血 ...
最新文章
- 排序算法7---快速排序算法
- VB课本基础知识总结
- [logstash-input-log4j]插件使用
- java set集合转数组_java set转list,数组与list的转换
- heap python_python topN max heap,使用heapq还是自实现?
- TCP的send与recv函数小结
- 高逼格!程序猿的表白也可以这么浪漫
- 在线office编辑 iWebOffice系列的交互操作
- printf()输出格式
- A64指令集如何将64位的数值写入通用寄存器
- FlashGot找不到FlashGet的原因之一
- java 调用 yed 绘制 流程图_用 yEd Graph Editor 绘制流程图(2)
- 学会查看tomcat的日志文件
- python简单应用!用爬虫来采集天猫所有优惠券信息,写入本地文件
- ACM入门攻略(紫书入门,不间断更新)
- rails 代码结构详解
- flex 居中并两端对齐
- [Luogu4169][Violet]天使玩偶/SJY摆棋子
- 【java程序员必备上班时长计算器】
- Eboot 软件框架