不积跬步无以至千里

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的加载相关推荐

  1. Android 4.0 ICS SystemUI浅析——StatusBar加载流程分析

    前面两篇文章< Android 4.0 ICS SystemUI浅析--SystemUI启动流程>.< Android 4.0 ICS SystemUI浅析--StatusBar结构 ...

  2. SystemUI之状态栏notification icon加载流程

    2019独角兽企业重金招聘Python工程师标准>>> 引言 今天我们主要讲的是SystemUI状态栏里面另一个常见的icons--notification icons,该icons ...

  3. Android 8.1 中Systemui中的常见修改(六)NavigationBar加载流程

    本文主要分为两个部分 一.NavigationBar的加载流程 二.Android P上如何去除NavigationBar 一 NavigationBar的加载流程 NavigationBar就是我们 ...

  4. SystemUI 下拉通知栏快捷键加载流程

    1.下拉通知栏简介 2.源码位置 SystemUIService.javaframeworks/base/packages/SystemUI/src/com/android/systemui/Syst ...

  5. Android6.0 keyguard锁屏加载流程分析

    锁屏界面的加载通常在android中有两种方式触发:android系统开机和screenOff(灭屏)后,再screenOn; 先来看 android系统开机时候的锁屏加载流程: 首先在系统启动过程中 ...

  6. 【Android】恢复出厂后静态壁纸加载流程

    Android静态壁纸功能实现参与的类 /frameworks/base/core/java/android/app/WallpaperManager.java 给开发者提供方法调用.例:setBit ...

  7. Android 13 平板Taskbar加载流程

    从 Android 12开始,如果是大屏底下导航栏会变成显示一个任务栏,从 NavigationBar 变成 Taskbar . 注:CentralSurfacesImpl.java 与 原来的 st ...

  8. android 进lanucher的广播,Android开机优化之调整Launcher的加载时间

    前言 如前面两篇文章所描述的, 我们对Android系统的开机时间优化有了一个比较全面的了解,以及一些常用的调试手段(bootchart等),在这篇文章中我们先来看看如下这个问题,首先看一张图: 如上 ...

  9. Launcher启动流程加载流程学习

     声明: 图片本来是有的 涉及到有些代码不能示人没有贴上,不过仅文字说也足够了,请广大老爷们自行下载源码参看流程分析阅读. 目录 一.认识Launcher: 1 1.功能 1 2.样式 2 3.And ...

  10. ArcEngine加载栅格数据

    一直以来对栅格数据接触较少,曾经大二的时候用ERDAS做过监督分类和蓝藻提取,后来接触了GIS开发也就没再做过了,不过现在还是准备探索一下ArcEngine针对栅格数据的相关操作.既然数据是GIS的血 ...

最新文章

  1. 排序算法7---快速排序算法
  2. VB课本基础知识总结
  3. [logstash-input-log4j]插件使用
  4. java set集合转数组_java set转list,数组与list的转换
  5. heap python_python topN max heap,使用heapq还是自实现?
  6. TCP的send与recv函数小结
  7. 高逼格!程序猿的表白也可以这么浪漫
  8. 在线office编辑 iWebOffice系列的交互操作
  9. printf()输出格式
  10. A64指令集如何将64位的数值写入通用寄存器
  11. FlashGot找不到FlashGet的原因之一
  12. java 调用 yed 绘制 流程图_用 yEd Graph Editor 绘制流程图(2)
  13. 学会查看tomcat的日志文件
  14. python简单应用!用爬虫来采集天猫所有优惠券信息,写入本地文件
  15. ACM入门攻略(紫书入门,不间断更新)
  16. rails 代码结构详解
  17. flex 居中并两端对齐
  18. [Luogu4169][Violet]天使玩偶/SJY摆棋子
  19. 【java程序员必备上班时长计算器】
  20. Eboot 软件框架

热门文章

  1. 美团外卖移动端性能监测体系实现
  2. 【蓝桥杯冲刺 day12】题目全解析
  3. 有实用简单的PS小技巧吗?下面几个小技巧你知道几个呢?
  4. White Sheet(面积法)
  5. 消息中间件(消息队列)介绍
  6. 小米路由r2d论坛_小米路由器R2D拆机换3T紫盘
  7. 使用SharePoint Framework开发webpart的一些技巧汇总
  8. 快速排序(填坑法的两种写法以及交换法)
  9. 相对标准偏差用计算机,公路工程用计算器计算相对标准偏差(RSD)
  10. AES前端flutter加密与后端java解密pad block corrupted问题