Android4.4之Keyguard--KeyguardHostView

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


}





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值