From a72c7d90a856af311da2b0c71eab1506d2968dd9 Mon Sep 17 00:00:00 2001 From: Josh Tsuji Date: Tue, 7 Mar 2023 17:05:27 -0500 Subject: Catch unusual DeadObjectExceptions. This appears to be possible but very rare (0.0002% of sessions). Launcher asks us to null out the LauncherUnlockAnimationController in onDestroy(), but that's an IPC so might be delayed. Safest to catch the exception here. It should be fine to fail to play the unlock animation on a Launcher that is being destroyed anyway. Bug: 245867371 Test: atest SystemUITests Change-Id: I96f14c2036daa945db324dc39b023a0facfb54dd --- .../keyguard/KeyguardUnlockAnimationController.kt | 43 +++++++++++++++++----- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt index 3e52ff2c2da0..9ab2e9922531 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt @@ -22,6 +22,7 @@ import android.animation.ValueAnimator import android.content.Context import android.graphics.Matrix import android.graphics.Rect +import android.os.DeadObjectException import android.os.Handler import android.os.PowerManager import android.os.RemoteException @@ -524,10 +525,22 @@ class KeyguardUnlockAnimationController @Inject constructor( surfaceBehindAlpha = 1f setSurfaceBehindAppearAmount(1f) - launcherUnlockController?.playUnlockAnimation( - true, - UNLOCK_ANIMATION_DURATION_MS + CANNED_UNLOCK_START_DELAY, - 0 /* startDelay */) + try { + launcherUnlockController?.playUnlockAnimation( + true, + UNLOCK_ANIMATION_DURATION_MS + CANNED_UNLOCK_START_DELAY, + 0 /* startDelay */) + } catch (e: DeadObjectException) { + // Hello! If you are here investigating a bug where Launcher is blank (no icons) + // then the below assumption about Launcher's destruction was incorrect. This + // would mean prepareToUnlock was called (blanking Launcher in preparation for + // the beginning of the unlock animation), but then somehow we were unable to + // call playUnlockAnimation to animate the icons back in. + Log.e(TAG, "launcherUnlockAnimationController was dead, but non-null. " + + "Catching exception as this should mean Launcher is in the process " + + "of being destroyed, but the IPC to System UI telling us hasn't " + + "arrived yet.") + } launcherPreparedForUnlock = false } else { @@ -604,11 +617,23 @@ class KeyguardUnlockAnimationController @Inject constructor( private fun unlockToLauncherWithInWindowAnimations() { setSurfaceBehindAppearAmount(1f) - // Begin the animation, waiting for the shade to animate out. - launcherUnlockController?.playUnlockAnimation( - true /* unlocked */, - LAUNCHER_ICONS_ANIMATION_DURATION_MS /* duration */, - CANNED_UNLOCK_START_DELAY /* startDelay */) + try { + // Begin the animation, waiting for the shade to animate out. + launcherUnlockController?.playUnlockAnimation( + true /* unlocked */, + LAUNCHER_ICONS_ANIMATION_DURATION_MS /* duration */, + CANNED_UNLOCK_START_DELAY /* startDelay */) + } catch (e: DeadObjectException) { + // Hello! If you are here investigating a bug where Launcher is blank (no icons) + // then the below assumption about Launcher's destruction was incorrect. This + // would mean prepareToUnlock was called (blanking Launcher in preparation for + // the beginning of the unlock animation), but then somehow we were unable to + // call playUnlockAnimation to animate the icons back in. + Log.e(TAG, "launcherUnlockAnimationController was dead, but non-null. " + + "Catching exception as this should mean Launcher is in the process " + + "of being destroyed, but the IPC to System UI telling us hasn't " + + "arrived yet.") + } launcherPreparedForUnlock = false -- cgit v1.2.3-59-g8ed1b