Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a72c7d90 authored by Josh Tsuji's avatar Josh Tsuji
Browse files

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
parent c503984e
Loading
Loading
Loading
Loading
+34 −9
Original line number Diff line number Diff line
@@ -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)

                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)

        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