diff options
| author | 2022-06-14 17:03:39 +0800 | |
|---|---|---|
| committer | 2022-06-22 13:05:14 +0800 | |
| commit | dda8d6c1cfe20a7b9ff1165d226589060aa97727 (patch) | |
| tree | e3a6b9e9d2ca56b4107b009406f2dc8c8d6ed902 | |
| parent | b692b421455073345cf917f07905b8474764929d (diff) | |
Attemp to fix Launcher stay invisible after keyguard unlock.
For the keyguard exit animation end up in a fully/semi transparent
case, because the timing of keyguard exit animation may not match to
panel fling status, so no matter it's playing fadeInSurfaceBehind or
surfaceBehindEntry, there should always cancel the animation when
received notifyFinishedKeyguardExitAnimation.
Another case is that the Notification shade become invisible while
animating, in this case the SyncRtSurfaceTransactionApplier won't apply
next transaction because there won't draw any frame for that view.
For Launcher re-show case, because the transaction cannot be applied
synchronized at KeyguardViewMediator#handleStartKeyguardExitAnimation,
so we should initialize the alpha to zero for the opening app.
Test: enable shell transition, then scroll up to unlock device,
a. verify the launcher won't stay in a fully/semi transparent.
b. verify the launcher won't reshow when scrolling on keyguard.
Also verify above cases via fingerprint unlock.
Also verify when unlock to split screen.
Also verify nothing change for legacy transition.
Bug: 232852578
Change-Id: I520102f476a417b66822d44f8effb905da4ff943
3 files changed, 68 insertions, 16 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java index b96eee717260..1aed7fee9d2b 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java @@ -157,7 +157,7 @@ public class KeyguardService extends Service { Rect localBounds = new Rect(change.getEndAbsBounds()); localBounds.offsetTo(change.getEndRelOffset().x, change.getEndRelOffset().y); - out.add(new RemoteAnimationTarget( + final RemoteAnimationTarget target = new RemoteAnimationTarget( taskId, newModeToLegacyMode(change.getMode()), change.getLeash(), @@ -168,7 +168,15 @@ public class KeyguardService extends Service { info.getChanges().size() - i, new Point(), localBounds, new Rect(change.getEndAbsBounds()), windowConfiguration, isNotInRecents, null /* startLeash */, - change.getStartAbsBounds(), taskInfo, false /* allowEnterPip */)); + change.getStartAbsBounds(), taskInfo, false /* allowEnterPip */); + // Use hasAnimatingParent to mark the anything below root task + if (taskId != -1 && change.getParent() != null) { + final TransitionInfo.Change parentChange = info.getChange(change.getParent()); + if (parentChange != null && parentChange.getTaskInfo() != null) { + target.hasAnimatingParent = true; + } + } + out.add(target); } return out.toArray(new RemoteAnimationTarget[out.size()]); } @@ -189,6 +197,7 @@ public class KeyguardService extends Service { } } + // Wrap Keyguard going away animation private static IRemoteTransition wrap(IRemoteAnimationRunner runner) { return new IRemoteTransition.Stub() { @Override @@ -200,9 +209,24 @@ public class KeyguardService extends Service { final RemoteAnimationTarget[] wallpapers = wrap(info, true /* wallpapers */); final RemoteAnimationTarget[] nonApps = new RemoteAnimationTarget[0]; - // TODO: Remove this, and update alpha value in the IAnimationRunner. - for (TransitionInfo.Change change : info.getChanges()) { - t.setAlpha(change.getLeash(), 1.0f); + // Sets the alpha to 0 for the opening root task for fade in animation. And since + // the fade in animation can only apply on the first opening app, so set alpha to 1 + // for anything else. + boolean foundOpening = false; + for (RemoteAnimationTarget target : apps) { + if (target.taskId != -1 + && target.mode == RemoteAnimationTarget.MODE_OPENING + && !target.hasAnimatingParent) { + if (foundOpening) { + Log.w(TAG, "More than one opening target"); + t.setAlpha(target.leash, 1.0f); + continue; + } + t.setAlpha(target.leash, 0.0f); + foundOpening = true; + } else { + t.setAlpha(target.leash, 1.0f); + } } t.apply(); runner.onAnimationStart(getTransitionOldType(info.getType(), info.getFlags(), apps), diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt index 99b57200a397..382323f3aed9 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt @@ -26,6 +26,7 @@ import android.os.Handler import android.os.RemoteException import android.util.Log import android.view.RemoteAnimationTarget +import android.view.SurfaceControl import android.view.SyncRtSurfaceTransactionApplier import android.view.View import androidx.annotation.VisibleForTesting @@ -293,6 +294,8 @@ class KeyguardUnlockAnimationController @Inject constructor( private val handler = Handler() + private val tmpFloat = FloatArray(9) + init { with(surfaceBehindAlphaAnimator) { duration = SURFACE_BEHIND_SWIPE_FADE_DURATION_MS @@ -723,13 +726,27 @@ class KeyguardUnlockAnimationController @Inject constructor( if (keyguardStateController.isSnappingKeyguardBackAfterSwipe) amount else surfaceBehindAlpha - applyParamsToSurface( - SyncRtSurfaceTransactionApplier.SurfaceParams.Builder( - surfaceBehindRemoteAnimationTarget!!.leash) - .withMatrix(surfaceBehindMatrix) - .withCornerRadius(roundedCornerRadius) - .withAlpha(animationAlpha) - .build()) + // SyncRtSurfaceTransactionApplier cannot apply transaction when the target view is unable + // to draw + val sc: SurfaceControl? = surfaceBehindRemoteAnimationTarget?.leash + if (keyguardViewController.viewRootImpl.view?.visibility != View.VISIBLE && + sc?.isValid == true) { + with(SurfaceControl.Transaction()) { + setMatrix(sc, surfaceBehindMatrix, tmpFloat) + setCornerRadius(sc, roundedCornerRadius) + setAlpha(sc, animationAlpha) + apply() + } + } else { + applyParamsToSurface( + SyncRtSurfaceTransactionApplier.SurfaceParams.Builder( + surfaceBehindRemoteAnimationTarget!!.leash) + .withMatrix(surfaceBehindMatrix) + .withCornerRadius(roundedCornerRadius) + .withAlpha(animationAlpha) + .build() + ) + } } /** @@ -744,8 +761,11 @@ class KeyguardUnlockAnimationController @Inject constructor( handler.removeCallbacksAndMessages(null) // Make sure we made the surface behind fully visible, just in case. It should already be - // fully visible. If the launcher is doing its own animation, let it continue without - // forcing it to 1f. + // fully visible. The exit animation is finished, and we should not hold the leash anymore, + // so forcing it to 1f. + surfaceBehindAlphaAnimator.cancel() + surfaceBehindEntryAnimator.cancel() + surfaceBehindAlpha = 1f setSurfaceBehindAppearAmount(1f) launcherUnlockController?.setUnlockAmount(1f, false /* forceIfAnimating */) @@ -910,4 +930,4 @@ class KeyguardUnlockAnimationController @Inject constructor( return context.resources.getIntArray(R.array.config_foldedDeviceStates).isNotEmpty() } } -}
\ No newline at end of file +} diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index f9a1c66af41d..be1725b798e2 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -2503,10 +2503,18 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable, mInteractionJankMonitor.begin( createInteractionJankMonitorConf("DismissPanel")); + // Apply the opening animation on root task if exists + RemoteAnimationTarget aniTarget = apps[0]; + for (RemoteAnimationTarget tmpTarget : apps) { + if (tmpTarget.taskId != -1 && !tmpTarget.hasAnimatingParent) { + aniTarget = tmpTarget; + break; + } + } // Pass the surface and metadata to the unlock animation controller. mKeyguardUnlockAnimationControllerLazy.get() .notifyStartSurfaceBehindRemoteAnimation( - apps[0], startTime, mSurfaceBehindRemoteAnimationRequested); + aniTarget, startTime, mSurfaceBehindRemoteAnimationRequested); } else { mInteractionJankMonitor.begin( createInteractionJankMonitorConf("RemoteAnimationDisabled")); |