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);
}
}
}