Loading packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt +51 −10 Original line number Diff line number Diff line Loading @@ -37,6 +37,8 @@ import android.view.ViewGroup import android.view.WindowManager import android.view.animation.Interpolator import android.view.animation.PathInterpolator import androidx.annotation.BinderThread import androidx.annotation.UiThread import com.android.internal.annotations.VisibleForTesting import com.android.internal.policy.ScreenDecorationsUtils import kotlin.math.roundToInt Loading Loading @@ -226,7 +228,7 @@ class ActivityLaunchAnimator( // If we expect an animation, post a timeout to cancel it in case the remote animation is // never started. if (willAnimate) { runner.postTimeout() runner.delegate.postTimeout() // Hide the keyguard using the launch animation instead of the default unlock animation. if (hideKeyguardWithAnimation) { Loading Loading @@ -389,14 +391,51 @@ class ActivityLaunchAnimator( fun onLaunchAnimationCancelled(newKeyguardOccludedState: Boolean? = null) {} } class Runner( @VisibleForTesting inner class Runner( controller: Controller, callback: Callback, /** The animator to use to animate the window launch. */ launchAnimator: LaunchAnimator = DEFAULT_LAUNCH_ANIMATOR, /** Listener for animation lifecycle events. */ listener: Listener? = null ) : IRemoteAnimationRunner.Stub() { private val context = controller.launchContainer.context internal val delegate: AnimationDelegate init { delegate = AnimationDelegate(controller, callback, launchAnimator, listener) } @BinderThread override fun onAnimationStart( transit: Int, apps: Array<out RemoteAnimationTarget>?, wallpapers: Array<out RemoteAnimationTarget>?, nonApps: Array<out RemoteAnimationTarget>?, finishedCallback: IRemoteAnimationFinishedCallback? ) { context.mainExecutor.execute { delegate.onAnimationStart(transit, apps, wallpapers, nonApps, finishedCallback) } } @BinderThread override fun onAnimationCancelled(isKeyguardOccluded: Boolean) { context.mainExecutor.execute { delegate.onAnimationCancelled(isKeyguardOccluded) } } } class AnimationDelegate @JvmOverloads constructor( private val controller: Controller, private val callback: Callback, /** The animator to use to animate the window launch. */ private val launchAnimator: LaunchAnimator = DEFAULT_LAUNCH_ANIMATOR, /** Listener for animation lifecycle events. */ private val listener: Listener? = null ) : IRemoteAnimationRunner.Stub() { ) : RemoteAnimationDelegate<IRemoteAnimationFinishedCallback> { private val launchContainer = controller.launchContainer private val context = launchContainer.context private val transactionApplierView = Loading @@ -419,6 +458,7 @@ class ActivityLaunchAnimator( // posting it. private var onTimeout = Runnable { onAnimationTimedOut() } @UiThread internal fun postTimeout() { launchContainer.postDelayed(onTimeout, LAUNCH_TIMEOUT) } Loading @@ -427,19 +467,20 @@ class ActivityLaunchAnimator( launchContainer.removeCallbacks(onTimeout) } @UiThread override fun onAnimationStart( @WindowManager.TransitionOldType transit: Int, apps: Array<out RemoteAnimationTarget>?, wallpapers: Array<out RemoteAnimationTarget>?, nonApps: Array<out RemoteAnimationTarget>?, iCallback: IRemoteAnimationFinishedCallback? callback: IRemoteAnimationFinishedCallback? ) { removeTimeout() // The animation was started too late and we already notified the controller that it // timed out. if (timedOut) { iCallback?.invoke() callback?.invoke() return } Loading @@ -449,7 +490,7 @@ class ActivityLaunchAnimator( return } context.mainExecutor.execute { startAnimation(apps, nonApps, iCallback) } startAnimation(apps, nonApps, callback) } private fun startAnimation( Loading Loading @@ -687,6 +728,7 @@ class ActivityLaunchAnimator( controller.onLaunchAnimationCancelled() } @UiThread override fun onAnimationCancelled(isKeyguardOccluded: Boolean) { if (timedOut) { return Loading @@ -695,11 +737,10 @@ class ActivityLaunchAnimator( Log.i(TAG, "Remote animation was cancelled") cancelled = true removeTimeout() context.mainExecutor.execute { animation?.cancel() controller.onLaunchAnimationCancelled(newKeyguardOccludedState = isKeyguardOccluded) } } private fun IRemoteAnimationFinishedCallback.invoke() { try { Loading packages/SystemUI/animation/src/com/android/systemui/animation/RemoteAnimationDelegate.kt 0 → 100644 +30 −0 Original line number Diff line number Diff line package com.android.systemui.animation import android.annotation.UiThread import android.view.IRemoteAnimationFinishedCallback import android.view.RemoteAnimationTarget import android.view.WindowManager /** * A component capable of running remote animations. * * Expands the IRemoteAnimationRunner API by allowing for different types of more specialized * callbacks. */ interface RemoteAnimationDelegate<in T : IRemoteAnimationFinishedCallback> { /** * Called on the UI thread when the animation targets are received. Sets up and kicks off the * animation. */ @UiThread fun onAnimationStart( @WindowManager.TransitionOldType transit: Int, apps: Array<out RemoteAnimationTarget>?, wallpapers: Array<out RemoteAnimationTarget>?, nonApps: Array<out RemoteAnimationTarget>?, callback: T? ) /** Called on the UI thread when a signal is received to cancel the animation. */ @UiThread fun onAnimationCancelled(isKeyguardOccluded: Boolean) } Loading
packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt +51 −10 Original line number Diff line number Diff line Loading @@ -37,6 +37,8 @@ import android.view.ViewGroup import android.view.WindowManager import android.view.animation.Interpolator import android.view.animation.PathInterpolator import androidx.annotation.BinderThread import androidx.annotation.UiThread import com.android.internal.annotations.VisibleForTesting import com.android.internal.policy.ScreenDecorationsUtils import kotlin.math.roundToInt Loading Loading @@ -226,7 +228,7 @@ class ActivityLaunchAnimator( // If we expect an animation, post a timeout to cancel it in case the remote animation is // never started. if (willAnimate) { runner.postTimeout() runner.delegate.postTimeout() // Hide the keyguard using the launch animation instead of the default unlock animation. if (hideKeyguardWithAnimation) { Loading Loading @@ -389,14 +391,51 @@ class ActivityLaunchAnimator( fun onLaunchAnimationCancelled(newKeyguardOccludedState: Boolean? = null) {} } class Runner( @VisibleForTesting inner class Runner( controller: Controller, callback: Callback, /** The animator to use to animate the window launch. */ launchAnimator: LaunchAnimator = DEFAULT_LAUNCH_ANIMATOR, /** Listener for animation lifecycle events. */ listener: Listener? = null ) : IRemoteAnimationRunner.Stub() { private val context = controller.launchContainer.context internal val delegate: AnimationDelegate init { delegate = AnimationDelegate(controller, callback, launchAnimator, listener) } @BinderThread override fun onAnimationStart( transit: Int, apps: Array<out RemoteAnimationTarget>?, wallpapers: Array<out RemoteAnimationTarget>?, nonApps: Array<out RemoteAnimationTarget>?, finishedCallback: IRemoteAnimationFinishedCallback? ) { context.mainExecutor.execute { delegate.onAnimationStart(transit, apps, wallpapers, nonApps, finishedCallback) } } @BinderThread override fun onAnimationCancelled(isKeyguardOccluded: Boolean) { context.mainExecutor.execute { delegate.onAnimationCancelled(isKeyguardOccluded) } } } class AnimationDelegate @JvmOverloads constructor( private val controller: Controller, private val callback: Callback, /** The animator to use to animate the window launch. */ private val launchAnimator: LaunchAnimator = DEFAULT_LAUNCH_ANIMATOR, /** Listener for animation lifecycle events. */ private val listener: Listener? = null ) : IRemoteAnimationRunner.Stub() { ) : RemoteAnimationDelegate<IRemoteAnimationFinishedCallback> { private val launchContainer = controller.launchContainer private val context = launchContainer.context private val transactionApplierView = Loading @@ -419,6 +458,7 @@ class ActivityLaunchAnimator( // posting it. private var onTimeout = Runnable { onAnimationTimedOut() } @UiThread internal fun postTimeout() { launchContainer.postDelayed(onTimeout, LAUNCH_TIMEOUT) } Loading @@ -427,19 +467,20 @@ class ActivityLaunchAnimator( launchContainer.removeCallbacks(onTimeout) } @UiThread override fun onAnimationStart( @WindowManager.TransitionOldType transit: Int, apps: Array<out RemoteAnimationTarget>?, wallpapers: Array<out RemoteAnimationTarget>?, nonApps: Array<out RemoteAnimationTarget>?, iCallback: IRemoteAnimationFinishedCallback? callback: IRemoteAnimationFinishedCallback? ) { removeTimeout() // The animation was started too late and we already notified the controller that it // timed out. if (timedOut) { iCallback?.invoke() callback?.invoke() return } Loading @@ -449,7 +490,7 @@ class ActivityLaunchAnimator( return } context.mainExecutor.execute { startAnimation(apps, nonApps, iCallback) } startAnimation(apps, nonApps, callback) } private fun startAnimation( Loading Loading @@ -687,6 +728,7 @@ class ActivityLaunchAnimator( controller.onLaunchAnimationCancelled() } @UiThread override fun onAnimationCancelled(isKeyguardOccluded: Boolean) { if (timedOut) { return Loading @@ -695,11 +737,10 @@ class ActivityLaunchAnimator( Log.i(TAG, "Remote animation was cancelled") cancelled = true removeTimeout() context.mainExecutor.execute { animation?.cancel() controller.onLaunchAnimationCancelled(newKeyguardOccludedState = isKeyguardOccluded) } } private fun IRemoteAnimationFinishedCallback.invoke() { try { Loading
packages/SystemUI/animation/src/com/android/systemui/animation/RemoteAnimationDelegate.kt 0 → 100644 +30 −0 Original line number Diff line number Diff line package com.android.systemui.animation import android.annotation.UiThread import android.view.IRemoteAnimationFinishedCallback import android.view.RemoteAnimationTarget import android.view.WindowManager /** * A component capable of running remote animations. * * Expands the IRemoteAnimationRunner API by allowing for different types of more specialized * callbacks. */ interface RemoteAnimationDelegate<in T : IRemoteAnimationFinishedCallback> { /** * Called on the UI thread when the animation targets are received. Sets up and kicks off the * animation. */ @UiThread fun onAnimationStart( @WindowManager.TransitionOldType transit: Int, apps: Array<out RemoteAnimationTarget>?, wallpapers: Array<out RemoteAnimationTarget>?, nonApps: Array<out RemoteAnimationTarget>?, callback: T? ) /** Called on the UI thread when a signal is received to cancel the animation. */ @UiThread fun onAnimationCancelled(isKeyguardOccluded: Boolean) }