Loading packages/SystemUI/shared/src/com/android/systemui/shared/system/smartspace/ILauncherUnlockAnimationController.aidl +1 −1 Original line number Diff line number Diff line Loading @@ -30,7 +30,7 @@ interface ILauncherUnlockAnimationController { // Play a full unlock animation from 0f to 1f. This is used when System UI is unlocking from a // single action, such as biometric auth, and doesn't need to control individual frames. oneway void playUnlockAnimation(boolean unlocked, long duration); oneway void playUnlockAnimation(boolean unlocked, long duration, long startDelay); // Set the selected page on Launcher's smartspace. oneway void setSmartspaceSelectedPage(int selectedPage); Loading packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt +67 −25 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.content.Context import android.graphics.Matrix import android.graphics.Rect import android.os.Handler import android.provider.Settings import android.util.Log import android.view.RemoteAnimationTarget import android.view.SyncRtSurfaceTransactionApplier Loading Loading @@ -93,6 +94,20 @@ const val DISMISS_AMOUNT_EXIT_KEYGUARD_THRESHOLD = 0.4f */ const val UNLOCK_ANIMATION_DURATION_MS = 200L /** * How long the in-window launcher icon animation takes. This is used if the launcher is underneath * the lock screen and supports in-window animations. * * This animation will take place entirely within the Launcher window. We can safely unlock the * device, end remote animations, etc. even if this is still running. */ const val LAUNCHER_ICONS_ANIMATION_DURATION_MS = 633L /** * How long to wait for the shade to get out of the way before starting the canned unlock animation. */ const val CANNED_UNLOCK_START_DELAY = 100L /** * Duration for the alpha animation on the surface behind. This plays to fade in the surface during * a swipe to unlock (and to fade it back out if the swipe is cancelled). Loading @@ -119,7 +134,7 @@ const val UNLOCK_ANIMATION_SURFACE_BEHIND_START_DELAY_MS = 75L */ @SysUISingleton class KeyguardUnlockAnimationController @Inject constructor( context: Context, private val context: Context, private val keyguardStateController: KeyguardStateController, private val keyguardViewMediator: Lazy<KeyguardViewMediator>, Loading Loading @@ -483,23 +498,34 @@ class KeyguardUnlockAnimationController @Inject constructor( * transition if possible. */ private fun unlockToLauncherWithInWindowAnimations() { unlockingToLauncherWithInWindowAnimations = true // See if we can do the smartspace transition, and if so, do it! if (prepareForSmartspaceTransition()) { animateSmartspaceToDestination() listeners.forEach { it.onSmartspaceSharedElementTransitionStarted() } } // Tell the launcher to prepare for the animation by setting its views invisible and // syncing the selected smartspace pages. launcherUnlockController?.prepareForUnlock( unlockingWithSmartspaceTransition /* willAnimateSmartspace */, (lockscreenSmartspace as BcSmartspaceDataPlugin.SmartspaceView?)?.selectedPage ?: -1) val startDelay = Settings.Secure.getLong( context.contentResolver, "unlock_start_delay", CANNED_UNLOCK_START_DELAY) val duration = Settings.Secure.getLong( context.contentResolver, "unlock_duration", LAUNCHER_ICONS_ANIMATION_DURATION_MS) unlockingToLauncherWithInWindowAnimations = true prepareLauncherWorkspaceForUnlockAnimation() // Begin the animation. // Begin the animation, waiting for the shade to animate out. launcherUnlockController?.playUnlockAnimation( true /* unlocked */, UNLOCK_ANIMATION_DURATION_MS) true /* unlocked */, duration /* duration */, startDelay /* startDelay */) handler.postDelayed({ applyParamsToSurface( SyncRtSurfaceTransactionApplier.SurfaceParams.Builder( surfaceBehindRemoteAnimationTarget!!.leash) .withAlpha(1f) .build()) }, startDelay) if (!unlockingWithSmartspaceTransition) { // If we are not unlocking with the smartspace transition, wait for the unlock animation // to end and then finish the remote animation. If we are using the smartspace Loading @@ -509,9 +535,18 @@ class KeyguardUnlockAnimationController @Inject constructor( false /* cancelled */) }, UNLOCK_ANIMATION_DURATION_MS) } } // Wait a moment, then show the launcher surface. setSurfaceBehindAppearAmount(1f) /** * Asks Launcher to prepare the workspace to be unlocked. This sets up the animation and makes * the page invisible. */ private fun prepareLauncherWorkspaceForUnlockAnimation() { // Tell the launcher to prepare for the animation by setting its views invisible and // syncing the selected smartspace pages. launcherUnlockController?.prepareForUnlock( unlockingWithSmartspaceTransition /* willAnimateSmartspace */, (lockscreenSmartspace as BcSmartspaceDataPlugin.SmartspaceView?)?.selectedPage ?: -1) } /** Loading Loading @@ -615,8 +650,11 @@ class KeyguardUnlockAnimationController @Inject constructor( } if (unlockingToLauncherWithInWindowAnimations) { // If we're using the in-window launcher animations, and haven't yet applied alpha = 1f // to the launcher surface, do that now so we can see the launcher animations. // If we aren't using the canned unlock animation (which would be setting the unlock // amount in its update listener), do it here. if (!isPlayingCannedUnlockAnimation()) { launcherUnlockController?.setUnlockAmount(amount) if (surfaceBehindParams?.alpha?.let { it < 1f } != false) { applyParamsToSurface( SyncRtSurfaceTransactionApplier.SurfaceParams.Builder( Loading @@ -624,11 +662,6 @@ class KeyguardUnlockAnimationController @Inject constructor( .withAlpha(1f) .build()) } // If we aren't using the canned unlock animation (which would be setting the unlock // amount in its update listener), do it here. if (!isPlayingCannedUnlockAnimation()) { launcherUnlockController?.setUnlockAmount(amount) } } else { // Otherwise, animate in the surface's scale/transltion. Loading Loading @@ -743,9 +776,10 @@ class KeyguardUnlockAnimationController @Inject constructor( !keyguardViewMediator.get().requestedShowSurfaceBehindKeyguard()) { // We passed the threshold, and we're not yet showing the surface behind the // keyguard. Animate it in. if (canPerformInWindowLauncherAnimations()) { launcherUnlockController?.setUnlockAmount(0f) if (!unlockingToLauncherWithInWindowAnimations && canPerformInWindowLauncherAnimations()) { unlockingToLauncherWithInWindowAnimations = true prepareLauncherWorkspaceForUnlockAnimation() } keyguardViewMediator.get().showSurfaceBehindKeyguard() fadeInSurfaceBehind() Loading Loading @@ -928,7 +962,11 @@ class KeyguardUnlockAnimationController @Inject constructor( * the device. */ fun canPerformInWindowLauncherAnimations(): Boolean { return isNexusLauncherUnderneath() && launcherUnlockController != null return isNexusLauncherUnderneath() && launcherUnlockController != null && // Temporarily disable for foldables since foldable launcher has two first pages, // which breaks the in-window animation. !isFoldable(context) } /** Loading Loading @@ -969,5 +1007,9 @@ class KeyguardUnlockAnimationController @Inject constructor( .runningTask?.topActivity?.className?.equals( QuickStepContract.LAUNCHER_ACTIVITY_CLASS_NAME) ?: false } fun isFoldable(context: Context): Boolean { return context.resources.getIntArray(R.array.config_foldedDeviceStates).isNotEmpty() } } } No newline at end of file packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +1 −1 Original line number Diff line number Diff line Loading @@ -901,7 +901,7 @@ public class NotificationPanelViewController extends PanelViewController { onTrackingStopped(false); instantCollapse(); } else { fling(0f, false, 0.7f, false); fling(0f, false, 1f, false); } } } Loading Loading
packages/SystemUI/shared/src/com/android/systemui/shared/system/smartspace/ILauncherUnlockAnimationController.aidl +1 −1 Original line number Diff line number Diff line Loading @@ -30,7 +30,7 @@ interface ILauncherUnlockAnimationController { // Play a full unlock animation from 0f to 1f. This is used when System UI is unlocking from a // single action, such as biometric auth, and doesn't need to control individual frames. oneway void playUnlockAnimation(boolean unlocked, long duration); oneway void playUnlockAnimation(boolean unlocked, long duration, long startDelay); // Set the selected page on Launcher's smartspace. oneway void setSmartspaceSelectedPage(int selectedPage); Loading
packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt +67 −25 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.content.Context import android.graphics.Matrix import android.graphics.Rect import android.os.Handler import android.provider.Settings import android.util.Log import android.view.RemoteAnimationTarget import android.view.SyncRtSurfaceTransactionApplier Loading Loading @@ -93,6 +94,20 @@ const val DISMISS_AMOUNT_EXIT_KEYGUARD_THRESHOLD = 0.4f */ const val UNLOCK_ANIMATION_DURATION_MS = 200L /** * How long the in-window launcher icon animation takes. This is used if the launcher is underneath * the lock screen and supports in-window animations. * * This animation will take place entirely within the Launcher window. We can safely unlock the * device, end remote animations, etc. even if this is still running. */ const val LAUNCHER_ICONS_ANIMATION_DURATION_MS = 633L /** * How long to wait for the shade to get out of the way before starting the canned unlock animation. */ const val CANNED_UNLOCK_START_DELAY = 100L /** * Duration for the alpha animation on the surface behind. This plays to fade in the surface during * a swipe to unlock (and to fade it back out if the swipe is cancelled). Loading @@ -119,7 +134,7 @@ const val UNLOCK_ANIMATION_SURFACE_BEHIND_START_DELAY_MS = 75L */ @SysUISingleton class KeyguardUnlockAnimationController @Inject constructor( context: Context, private val context: Context, private val keyguardStateController: KeyguardStateController, private val keyguardViewMediator: Lazy<KeyguardViewMediator>, Loading Loading @@ -483,23 +498,34 @@ class KeyguardUnlockAnimationController @Inject constructor( * transition if possible. */ private fun unlockToLauncherWithInWindowAnimations() { unlockingToLauncherWithInWindowAnimations = true // See if we can do the smartspace transition, and if so, do it! if (prepareForSmartspaceTransition()) { animateSmartspaceToDestination() listeners.forEach { it.onSmartspaceSharedElementTransitionStarted() } } // Tell the launcher to prepare for the animation by setting its views invisible and // syncing the selected smartspace pages. launcherUnlockController?.prepareForUnlock( unlockingWithSmartspaceTransition /* willAnimateSmartspace */, (lockscreenSmartspace as BcSmartspaceDataPlugin.SmartspaceView?)?.selectedPage ?: -1) val startDelay = Settings.Secure.getLong( context.contentResolver, "unlock_start_delay", CANNED_UNLOCK_START_DELAY) val duration = Settings.Secure.getLong( context.contentResolver, "unlock_duration", LAUNCHER_ICONS_ANIMATION_DURATION_MS) unlockingToLauncherWithInWindowAnimations = true prepareLauncherWorkspaceForUnlockAnimation() // Begin the animation. // Begin the animation, waiting for the shade to animate out. launcherUnlockController?.playUnlockAnimation( true /* unlocked */, UNLOCK_ANIMATION_DURATION_MS) true /* unlocked */, duration /* duration */, startDelay /* startDelay */) handler.postDelayed({ applyParamsToSurface( SyncRtSurfaceTransactionApplier.SurfaceParams.Builder( surfaceBehindRemoteAnimationTarget!!.leash) .withAlpha(1f) .build()) }, startDelay) if (!unlockingWithSmartspaceTransition) { // If we are not unlocking with the smartspace transition, wait for the unlock animation // to end and then finish the remote animation. If we are using the smartspace Loading @@ -509,9 +535,18 @@ class KeyguardUnlockAnimationController @Inject constructor( false /* cancelled */) }, UNLOCK_ANIMATION_DURATION_MS) } } // Wait a moment, then show the launcher surface. setSurfaceBehindAppearAmount(1f) /** * Asks Launcher to prepare the workspace to be unlocked. This sets up the animation and makes * the page invisible. */ private fun prepareLauncherWorkspaceForUnlockAnimation() { // Tell the launcher to prepare for the animation by setting its views invisible and // syncing the selected smartspace pages. launcherUnlockController?.prepareForUnlock( unlockingWithSmartspaceTransition /* willAnimateSmartspace */, (lockscreenSmartspace as BcSmartspaceDataPlugin.SmartspaceView?)?.selectedPage ?: -1) } /** Loading Loading @@ -615,8 +650,11 @@ class KeyguardUnlockAnimationController @Inject constructor( } if (unlockingToLauncherWithInWindowAnimations) { // If we're using the in-window launcher animations, and haven't yet applied alpha = 1f // to the launcher surface, do that now so we can see the launcher animations. // If we aren't using the canned unlock animation (which would be setting the unlock // amount in its update listener), do it here. if (!isPlayingCannedUnlockAnimation()) { launcherUnlockController?.setUnlockAmount(amount) if (surfaceBehindParams?.alpha?.let { it < 1f } != false) { applyParamsToSurface( SyncRtSurfaceTransactionApplier.SurfaceParams.Builder( Loading @@ -624,11 +662,6 @@ class KeyguardUnlockAnimationController @Inject constructor( .withAlpha(1f) .build()) } // If we aren't using the canned unlock animation (which would be setting the unlock // amount in its update listener), do it here. if (!isPlayingCannedUnlockAnimation()) { launcherUnlockController?.setUnlockAmount(amount) } } else { // Otherwise, animate in the surface's scale/transltion. Loading Loading @@ -743,9 +776,10 @@ class KeyguardUnlockAnimationController @Inject constructor( !keyguardViewMediator.get().requestedShowSurfaceBehindKeyguard()) { // We passed the threshold, and we're not yet showing the surface behind the // keyguard. Animate it in. if (canPerformInWindowLauncherAnimations()) { launcherUnlockController?.setUnlockAmount(0f) if (!unlockingToLauncherWithInWindowAnimations && canPerformInWindowLauncherAnimations()) { unlockingToLauncherWithInWindowAnimations = true prepareLauncherWorkspaceForUnlockAnimation() } keyguardViewMediator.get().showSurfaceBehindKeyguard() fadeInSurfaceBehind() Loading Loading @@ -928,7 +962,11 @@ class KeyguardUnlockAnimationController @Inject constructor( * the device. */ fun canPerformInWindowLauncherAnimations(): Boolean { return isNexusLauncherUnderneath() && launcherUnlockController != null return isNexusLauncherUnderneath() && launcherUnlockController != null && // Temporarily disable for foldables since foldable launcher has two first pages, // which breaks the in-window animation. !isFoldable(context) } /** Loading Loading @@ -969,5 +1007,9 @@ class KeyguardUnlockAnimationController @Inject constructor( .runningTask?.topActivity?.className?.equals( QuickStepContract.LAUNCHER_ACTIVITY_CLASS_NAME) ?: false } fun isFoldable(context: Context): Boolean { return context.resources.getIntArray(R.array.config_foldedDeviceStates).isNotEmpty() } } } No newline at end of file
packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +1 −1 Original line number Diff line number Diff line Loading @@ -901,7 +901,7 @@ public class NotificationPanelViewController extends PanelViewController { onTrackingStopped(false); instantCollapse(); } else { fling(0f, false, 0.7f, false); fling(0f, false, 1f, false); } } } Loading