KeyguardViewManager
private ViewManagerHost mKeyguardHost;//Keyguard's root view private KeyguardHostView mKeyguardView; public ViewManagerHost(Context context) { super(context); setBackground(mBackgroundDrawable); //save Orientation、ScreenWidth and ScreenHeight mCreateOrientation = context.getResources().getConfiguration().orientation; mCreateScreenWidthDp = context.getResources().getConfiguration().screenWidthDp; mCreateScreenHeightDp = context.getResources().getConfiguration().screenHeightDp; } //only when Orientation、ScreenWidth or ScreenHeight changed and ViewManagerHost is VISIBLE, force to recreate view protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (mCreateOrientation != newConfig.orientation || mCreateScreenWidthDp != newConfig.screenWidthDp || mCreateScreenHeightDp != newConfig.screenHeightDp) { if (mKeyguardHost.getVisibility() == View.VISIBLE) { maybeCreateKeyguardLocked(KeyguardUtils.shouldEnableScreenRotation(mContext), true, null); } } } //KeyguardHostView will handle back and menu event and then dispatchKeyEvent public boolean dispatchKeyEvent(KeyEvent event) { if (mKeyguardView != null) { if (event.getAction() == KeyEvent.ACTION_DOWN) { int keyCode = event.getKeyCode(); if (keyCode == KeyEvent.KEYCODE_BACK && mKeyguardView.handleBackKey()) { return true; } else if (keyCode == KeyEvent.KEYCODE_MENU && mKeyguardView.handleMenuKey()) { return true; } } return mKeyguardView.dispatchKeyEvent(event); } return super.dispatchKeyEvent(event); } private void maybeCreateKeyguardLocked(boolean enableScreenRotation, boolean force, Bundle options) { if (mKeyguardHost == null) { //create ViewManagerHost and add it mKeyguardHost = new ViewManagerHost(mContext); //WindowManager.LayoutParams lp mViewManager is WindowManager (acturally is WindowManagerGlobal) mViewManager.addView(mKeyguardHost, lp); KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mBackgroundChanger); } if (force && mKeyguardView != null) { mKeyguardView.cleanUp(); } if (force || mKeyguardView == null) { mKeyguardHost.setCustomBackground(null); mKeyguardHost.removeAllViews(); //create KeyguardHostView inflateKeyguardView(options); mKeyguardView.requestFocus(); } } private void inflateKeyguardView(Bundle options) { //KeyguardHostView's view id and layout id int resId = R.id.keyguard_host_view; int layoutId = R.layout.keyguard_host_view; View v = mKeyguardHost.findViewById(resId); //if there is KeyguardHostView, remove it if (v != null) { mKeyguardHost.removeView(v); } //save Orientation,ScreenWidth and ScreenHeight mCreateOrientation = mContext.getResources().getConfiguration().orientation; mCreateScreenWidthDp = mContext.getResources().getConfiguration().screenWidthDp; mCreateScreenHeightDp = mContext.getResources().getConfiguration().screenHeightDp; //inflate KeyguardHostView and ViewGroup is ViewManagerHost, and attachToRoot is true final LayoutInflater inflater = LayoutInflater.from(mContext); View view = inflater.inflate(layoutId, mKeyguardHost, true); mKeyguardView = (KeyguardHostView) view.findViewById(resId); //set LockPatternUtils and ViewMediatorCallback mKeyguardView.setLockPatternUtils(mLockPatternUtils); mKeyguardView.setViewMediatorCallback(mViewMediatorCallback); } //Only ViewManagerHost is VISIBLE means is showing public synchronized boolean isShowing() { return (mKeyguardHost != null && mKeyguardHost.getVisibility() == View.VISIBLE); }
//KeyguardViewManager.java //when screen is on, just call KeyguardHostView's dismiss public synchronized void dismiss() { if (mScreenOn) { mKeyguardView.dismiss(); } }
//KeyguardHostView.java
public void dismiss() { showNextSecurityScreenOrFinish(false, true);}public synchronized void hide() { // 1st: set ViewManagerHost GONE if (mKeyguardHost != null) { mKeyguardHost.setVisibility(View.GONE); // Don't do this right away, so we can let the view continue to animate as it goes away. if (mKeyguardView != null) { final KeyguardViewBase lastView = mKeyguardView; mKeyguardView = null; mKeyguardHost.postDelayed(new Runnable() { @Override public void run() { synchronized (KeyguardViewManager.this) { //2nd: KeyguardHostView cleanUp lastView.cleanUp(); mKeyguardHost.setCustomBackground(null); updateShowWallpaper(true); //3nd: remove KeyguardHostView from ViewManagerHost mKeyguardHost.removeView(lastView); mViewMediatorCallback.keyguardGone(); } } }, HIDE_KEYGUARD_DELAY); } } }
// public synchronized void show(Bundle options) { maybeCreateKeyguardLocked(enableScreenRotation, false, options); mKeyguardHost.setVisibility(View.VISIBLE); mKeyguardView.show(); mKeyguardView.requestFocus(); } //KeyguardHostView.java public void show() { showPrimarySecurityScreen(false); } public synchronized void verifyUnlock() { show(null); mKeyguardView.verifyUnlock(); }
public synchronized void onScreenTurnedOff() { mScreenOn = false; if (mKeyguardView != null) { mKeyguardView.onScreenTurnedOff(); } } public synchronized void onScreenTurnedOn(final IKeyguardShowCallback callback) { mScreenOn = true; if (mKeyguardView != null) { mKeyguardView.onScreenTurnedOn(); } else if (callback != null) { //this callback seems has empty implement callback.onShown(token); } } //KeyguardHostView.java public void onScreenTurnedOn() { mScreenOn = true; showPrimarySecurityScreen(false); getSecurityView(mCurrentSecuritySelection).onResume(KeyguardSecurityView.SCREEN_ON); } public void onScreenTurnedOff() { mScreenOn = false; showPrimarySecurityScreen(true); getSecurityView(mCurrentSecuritySelection).onPause(); }