KeyguardHostView
//Input--SecurityMode //Output--int value means which sim id //default is sim1 unless the SecurityMode is SimPinPukMe2、SimPinPukMe3、SimPinPukMe4 private int getSimIdFromSecurityMode(SecurityMode securityMode) { int simId = PhoneConstants.GEMINI_SIM_1; if (securityMode == SecurityMode.SimPinPukMe2) { simId = PhoneConstants.GEMINI_SIM_2; } else if (securityMode == SecurityMode.SimPinPukMe3) { simId = PhoneConstants.GEMINI_SIM_3; } else if (securityMode == SecurityMode.SimPinPukMe4) { simId = PhoneConstants.GEMINI_SIM_4; } else { simId = PhoneConstants.GEMINI_SIM_1; } return simId; } //just return the view id and layout id according to the SecurityMode private int getSecurityViewIdForMode(SecurityMode securityMode) private int getLayoutIdFor(SecurityMode securityMode) private KeyguardSecurityView getSecurityView(SecurityMode securityMode) { //1st get view id according the securityMode final int securityViewIdForMode = getSecurityViewIdForMode(securityMode); final int children = mSecurityViewContainer.getChildCount(); for (int child = 0; child < children; child++) { if (mSecurityViewContainer.getChildAt(child).getId() == securityViewIdForMode) { //find the view which has same id from the KeyguardSecurityViewFlipper view = ((KeyguardSecurityView)mSecurityViewContainer.getChildAt(child)); break; } } //if view is null, it means this view is not in the KeyguardSecurityViewFlipper, we need to inflate this view int layoutId = getLayoutIdFor(securityMode); if (view == null && layoutId != 0) { final LayoutInflater inflater = LayoutInflater.from(mContext); //inflate this view with its layoutId, and father is KeyguardSecurityViewFlipper View v = inflater.inflate(layoutId, mSecurityViewContainer, false); view = (KeyguardSecurityView)v; } return view; } private void showSecurityScreen(SecurityMode securityMode) { //if the view is already shown, do nothing if (securityMode == mCurrentSecuritySelection) return; //get old and new view KeyguardSecurityView oldView = getSecurityView(mCurrentSecuritySelection); KeyguardSecurityView newView = getSecurityView(securityMode); //Emulate activity life: onPause old view and set null callback to it if (oldView != null) { oldView.onPause(); oldView.setKeyguardCallback(mNullCallback); // ignore requests from old view } //Emulate activity life; onResume new view and set valid callback to it newView.onResume(KeyguardSecurityView.VIEW_REVEALED); newView.setKeyguardCallback(mCallback); //setNeedInput final boolean needsInput = newView.needsInput(); if (mViewMediatorCallback != null) { mViewMediatorCallback.setNeedsInput(needsInput); } // Find and show this child. final int childCount = mSecurityViewContainer.getChildCount(); final int securityViewIdForMode = getSecurityViewIdForMode(securityMode); for (int i = 0; i < childCount; i++) { if (mSecurityViewContainer.getChildAt(i).getId() == securityViewIdForMode) { //only one view can be shown in ViewFlipper, this new view should be shown mSecurityViewContainer.setDisplayedChild(i); break; } } //save the current view and its mode mCurrentSecuritySelection = securityMode; mCurrentKeyguardSecurityView = newView; } void showPrimarySecurityScreen(boolean turningOff) { //getSecurityMode,we can't get face lock or voice lock SecurityMode securityMode = mSecurityModel.getSecurityMode(); if (KeyguardUpdateMonitor.getInstance(mContext).isAlternateUnlockEnabled()) { //maybe the alternate mode is face or voice lock SecurityMode alternateMode = mSecurityModel.getAlternateFor(securityMode); //when turning on, set it to alternateMode if (!turningOff) { securityMode = alternateMode; } else { //when turing off and alternateMode is face or voice lock, we return if (securityMode != alternateMode) { return; } } } //if current is simpinpuk and the mode is simpinpuk, return if(isCurrentSimPinPukView() && (securityMode == SecurityMode.SimPinPukMe1 || securityMode == SecurityMode.SimPinPukMe2 || securityMode == SecurityMode.SimPinPukMe3 || securityMode == SecurityMode.SimPinPukMe4)) { Log.d(TAG, "Skip showSecurityScreen() while currently SimPinPukViews is showing"); return; } //show the screen showSecurityScreen(securityMode); }
private void showNextSecurityScreenOrFinish(boolean authenticated, boolean showBouncer) { //case 1: mCurrentSecuritySelection is None(slide lock) //getSecurityMode getAlternateFor if still None, finish it; else show it and return if (SecurityMode.None == mCurrentSecuritySelection) { SecurityMode securityMode = mSecurityModel.getSecurityMode(); // Allow an alternate, such as biometric unlock securityMode = mSecurityModel.getAlternateFor(securityMode); if (SecurityMode.None == securityMode) { finish = true; // no security required } else { showSecurityScreen(securityMode); // switch to the alternate security view } //case 2: authenticated is true, finish it. } else if (authenticated) { switch (mCurrentSecuritySelection) { case Pattern: case Password: case PIN: case Account: case Biometric: case Voice: finish = true; break; } case 3: authenticated is false, if isLockScreenDisabled then finish it, else showPrimarySecurityScreen } else { if(mLockPatternUtils.isLockScreenDisabled() && mSecurityModel.getSecurityMode() == SecurityMode.None) { finish = true; } else { showPrimarySecurityScreen(false); bShowBouncer = true; } } //lastly, finish it: iewMediatorCallback.keyguardDone if (finish) { KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(true); boolean deferKeyguardDone = false; if (mDismissAction != null) { deferKeyguardDone = mDismissAction.onDismiss(); mDismissAction = null; } if (mViewMediatorCallback != null) { if (deferKeyguardDone) { mViewMediatorCallback.keyguardDonePending(); } else { mViewMediatorCallback.keyguardDone(true); } } } else { if (bShowBouncer) { mViewStateManager.showBouncer(true); } } }