我们理解Keyguard的解锁流程主要从锁屏的界面Layout结构、touchEvent事件分发、解锁动作逻辑几个方面进行源码的分析
锁屏的界面Layout结构分析
StatusbarWindowView
整个锁屏界面的顶级View就是mStatusBarWindow
src/com/android/systemui/statusbar/phone/StatusBar.java
public void createAndAddWindows() {
addStatusBarWindow();
}
private void addStatusBarWindow() {
makeStatusBarView();
mStatusBarWindowManager = Dependency.get(StatusBarWindowManager.class);
mRemoteInputController = new RemoteInputController(mHeadsUpManager);
mStatusBarWindowManager.add(mStatusBarWindow, getStatusBarHeight());
// add by hai.qin for story lock
if (mLockScreenManager != null) {
mLockScreenManager.setStatusBarWindowManager(mStatusBarWindowManager);
}
//
}
src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
/**
* Adds the status bar view to the window manager.
*
* @param statusBarView The view to add.
* @param barHeight The height of the status bar in collapsed state.
*/
public void add(View statusBarView, int barHeight) {
// Now that the status bar window encompasses the sliding panel and its
// translucent backdrop, the entire thing is made TRANSLUCENT and is
// hardware-accelerated.
mLp = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
barHeight,
WindowManager.LayoutParams.TYPE_STATUS_BAR,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
| WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
| WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
PixelFormat.TRANSLUCENT);
mLp.token = new Binder();
mLp.gravity = Gravity.TOP;
mLp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
mLp.setTitle("StatusBar");
mLp.packageName = mContext.getPackageName();
mStatusBarView = statusBarView;
mBarHeight = barHeight;
mWindowManager.addView(mStatusBarView, mLp);
mLpChanged = new WindowManager.LayoutParams();
mLpChanged.copyFrom(mLp);
}
mStatusBarWindow是在StatusBar的create流程中调用WindowManager.addView()添加到窗口上的, type为WindowManager.LayoutParams.TYPE_STATUS_BAR
Layout结构
锁屏界面的Layout结构可以简单概括为以下结构:
mStatusBarWindow--> R.layout.super_status_bar
notification_panel--> R.layout.status_bar_expanded
keyguardBouncer-->R.layout.keyguard_bouncer
mStatusBarWindow-->notification_panel-->notification_container_parent-->keyguard_header(锁屏状态栏)
| |
| -->keyguard_bottom_area (lock_icon和充电状态等)
| |
| -->keyguard_status_view (锁屏时钟日期)
| |
| -->keyguard_up_slide (箭头提示动画)
|
-->keyguardBouncer(安全锁界面)
上划后显示的安全锁界面是KeyguardBouncer,但keyguardbouncer并没有写在super_status_bar的layout文件里面,那么他是在什么时候添加的呢?
KeyguarBouncer何时创建
src/com/android/systemui/statusbar/phone/StatusBar.java
-->start()-->startKeyguard()
protected void startKeyguard() {
...
mStatusBarKeyguardViewManager = keyguardViewMediator.registerStatusBar(this,
getBouncerContainer(), mScrimController,
mFingerprintUnlockController);
...
}
src/com/android/systemui/keyguard/KeyguardViewMediator.java
-->registerStatusBar()
src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
-->registerStatusBar()
public void registerStatusBar(StatusBar statusBar,
ViewGrou