调用栈log
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: tryKeyguardDone:
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: java.lang.Exception
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at com.android.systemui.keyguard.KeyguardViewMediator.tryKeyguardDone(KeyguardViewMediator.java:1959)
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at com.android.systemui.keyguard.KeyguardViewMediator.access$1700(KeyguardViewMediator.java:185)
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at com.android.systemui.keyguard.KeyguardViewMediator$3.keyguardDone(KeyguardViewMediator.java:731)
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at com.android.keyguard.KeyguardHostViewController$2.finish(KeyguardHostViewController.java:146)
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at com.android.keyguard.KeyguardSecurityContainerController.showNextSecurityScreenOrFinish(KeyguardSecurityContainerController.java:426)
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at com.android.keyguard.KeyguardHostViewController$2.dismiss(KeyguardHostViewController.java:109)
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at com.android.keyguard.KeyguardSecurityContainerController$2.dismiss(KeyguardSecurityContainerController.java:139)
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at com.android.keyguard.KeyguardSecurityContainerController$2.dismiss(KeyguardSecurityContainerController.java:133)
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at com.android.keyguard.KeyguardPatternViewController$UnlockPatternListener.onPatternChecked(KeyguardPatternViewController.java:173)
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at com.android.keyguard.KeyguardPatternViewController$UnlockPatternListener.access$800(KeyguardPatternViewController.java:87)
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at com.android.keyguard.KeyguardPatternViewController$UnlockPatternListener$1.onEarlyMatched(KeyguardPatternViewController.java:136)
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at com.android.internal.widget.LockPatternChecker$2$$ExternalSyntheticLambda0.onEarlyMatched(Unknown Source:2)
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at com.android.internal.widget.LockPatternUtils$WrappedCallback.lambda$onCredentialVerified$0$LockPatternUtils$WrappedCallback(LockPatternUtils.java:1323)
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at com.android.internal.widget.LockPatternUtils$WrappedCallback$$ExternalSyntheticLambda0.run(Unknown Source:2)
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at android.os.Handler.handleCallback(Handler.java:938)
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at android.os.Handler.dispatchMessage(Handler.java:99)
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at android.os.Looper.loopOnce(Looper.java:356)
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at android.os.Looper.loop(Looper.java:475)
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at android.app.ActivityThread.main(ActivityThread.java:7889)
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at java.lang.reflect.Method.invoke(Native Method)
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
05-17 13:45:16.111 25580 25580 E KeyguardViewMediator: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1009)
05-17 13:45:16.335 25580 25580 E KeyguardViewMediator: mHideAnimationFinishedRunnable#run
05-17 13:45:16.336 25580 25580 E KeyguardViewMediator: tryKeyguardDone:
05-17 13:45:16.336 25580 25580 E KeyguardViewMediator: java.lang.Exception
05-17 13:45:16.336 25580 25580 E KeyguardViewMediator: at com.android.systemui.keyguard.KeyguardViewMediator.tryKeyguardDone(KeyguardViewMediator.java:1959)
05-17 13:45:16.336 25580 25580 E KeyguardViewMediator: at com.android.systemui.keyguard.KeyguardViewMediator.lambda$new$5(KeyguardViewMediator.java:2202)
05-17 13:45:16.336 25580 25580 E KeyguardViewMediator: at com.android.systemui.keyguard.KeyguardViewMediator.$r8$lambda$UUYKe9T2h39WDF0SXTBkvczZjVw(Unknown Source:0)
05-17 13:45:16.336 25580 25580 E KeyguardViewMediator: at com.android.systemui.keyguard.KeyguardViewMediator$$ExternalSyntheticLambda3.run(Unknown Source:2)
05-17 13:45:16.336 25580 25580 E KeyguardViewMediator: at com.android.keyguard.KeyguardPatternView.lambda$startDisappearAnimation$1(KeyguardPatternView.java:206)
05-17 13:45:16.336 25580 25580 E KeyguardViewMediator: at com.android.keyguard.KeyguardPatternView.$r8$lambda$Sz_3IRlQouOrbmx4V9rQ2s0DkzU(Unknown Source:0)
05-17 13:45:16.336 25580 25580 E KeyguardViewMediator: at com.android.keyguard.KeyguardPatternView$$ExternalSyntheticLambda1.run(Unknown Source:4)
05-17 13:45:16.336 25580 25580 E KeyguardViewMediator: at com.android.internal.widget.LockPatternView$3.onAnimationEnd(LockPatternView.java:541)
05-17 13:45:16.336 25580 25580 E KeyguardViewMediator: at android.graphics.animation.RenderNodeAnimator.onFinished(RenderNodeAnimator.java:370)
05-17 13:45:16.336 25580 25580 E KeyguardViewMediator: at android.graphics.animation.RenderNodeAnimator$$ExternalSyntheticLambda0.run(Unknown Source:2)
05-17 13:45:16.336 25580 25580 E KeyguardViewMediator: at android.os.Handler.handleCallback(Handler.java:938)
05-17 13:45:16.336 25580 25580 E KeyguardViewMediator: at android.os.Handler.dispatchMessage(Handler.java:99)
05-17 13:45:16.336 25580 25580 E KeyguardViewMediator: at android.os.Looper.loopOnce(Looper.java:356)
05-17 13:45:16.336 25580 25580 E KeyguardViewMediator: at android.os.Looper.loop(Looper.java:475)
05-17 13:45:16.336 25580 25580 E KeyguardViewMediator: at android.app.ActivityThread.main(ActivityThread.java:7889)
05-17 13:45:16.336 25580 25580 E KeyguardViewMediator: at java.lang.reflect.Method.invoke(Native Method)
05-17 13:45:16.336 25580 25580 E KeyguardViewMediator: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
05-17 13:45:16.336 25580 25580 E KeyguardViewMediator: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1009)
@startuml
[-> LockPatternChecker.OnCheckCallback: onEarlyMatched()
LockPatternChecker.OnCheckCallback -> KeyguardPatternViewController: onPatternChecked()
KeyguardPatternViewController -> KeyguardSecurityCallback:dismiss()
KeyguardSecurityCallback ->SecurityCallback:dismiss()
SecurityCallback -> KeyguardSecurityContainerController:showNextSecurityScreenOrFinish()
KeyguardSecurityContainerController->SecurityCallback:finish()
SecurityCallback->ViewMediatorCallback:keyguardDone(strongAuth, targetUserId)
ViewMediatorCallback->KeyguardViewMediator: tryKeyguardDone()
KeyguardViewMediator->StatusBarKeyguardViewManager:startPreHideAnimation(mHideAnimationFinishedRunnable)
StatusBarKeyguardViewManager->KeyguardViewMediator:mHideAnimationFinishedRunnable.run()
KeyguardViewMediator->KeyguardViewMediator:tryKeyguardDone()
KeyguardViewMediator->KeyguardViewMediator:handleKeyguardDone()
KeyguardViewMediator->KeyguardViewMediator:handleHide()
KeyguardViewMediator->KeyguardViewMediator: mKeyguardGoingAwayRunnable.run()
note over KeyguardViewMediator : PhoneWindowManager 将会在 AppTransition 执行结束后通知 KeyguardService
KeyguardViewMediator->KeyguardViewMediator:handleStartKeyguardExitAnimation()
KeyguardViewMediator->StatusBarKeyguardViewManager:hide()
@enduml
packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java:134
//LockPatternChecker.OnCheckCallback
@Override
public void onEarlyMatched() {
mLatencyTracker.onActionEnd(ACTION_CHECK_CREDENTIAL);
onPatternChecked(userId, true /* matched */, 0 /* timeoutMs */,
true /* isValidPattern */);
}
com.android.keyguard.KeyguardPatternViewController.UnlockPatternListener#onPatternChecked
private void onPatternChecked(int userId, boolean matched, int timeoutMs,
boolean isValidPattern) {
boolean dismissKeyguard = KeyguardUpdateMonitor.getCurrentUser() == userId;
if (matched) {
mLockPatternUtils.sanitizePassword();
getKeyguardSecurityCallback().reportUnlockAttempt(userId, true, 0);
if (dismissKeyguard) {
mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Correct);
mLatencyTracker.onActionStart(LatencyTracker.ACTION_LOCKSCREEN_UNLOCK);
getKeyguardSecurityCallback().dismiss(true, userId);
}
} else {
mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Wrong);
if (isValidPattern) {
getKeyguardSecurityCallback().reportUnlockAttempt(userId, false, timeoutMs);
if (timeoutMs > 0) {
long deadline = mLockPatternUtils.setLockoutAttemptDeadline(
userId, timeoutMs);
handleAttemptLockout(deadline);
}
}
if (timeoutMs == 0) {
mMessageAreaController.setMessage(R.string.kg_wrong_pattern);
mLockPatternView.postDelayed(mCancelPatternRunnable, PATTERN_CLEAR_TIMEOUT_MS);
Handler handler = new Handler();
handler.postDelayed(
new Runnable() {
@Override
public void run() {
mMessageAreaController.setMessage("");
}
}, PATTERN_CLEAR_TIMEOUT_MS);
}
}
}
packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java:132
@Override
public void dismiss(boolean authenticated, int targetId) {
dismiss(authenticated, targetId, /* bypassSecondaryLockScreen */ false);
}
@Override
public void dismiss(boolean authenticated, int targetId,
boolean bypassSecondaryLockScreen) {
mSecurityCallback.dismiss(authenticated, targetId, bypassSecondaryLockScreen);
}
后续与 PIN 码解锁一样