Merge "Introduce RemoteAnimationDelegate." into tm-qpr-dev

This commit is contained in:
Luca Zuccarini
2023-01-10 13:50:49 +00:00
committed by Android (Google) Code Review
2 changed files with 81 additions and 10 deletions

View File

@@ -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
@@ -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) {
@@ -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 =
@@ -419,6 +458,7 @@ class ActivityLaunchAnimator(
// posting it.
private var onTimeout = Runnable { onAnimationTimedOut() }
@UiThread
internal fun postTimeout() {
launchContainer.postDelayed(onTimeout, LAUNCH_TIMEOUT)
}
@@ -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
}
@@ -449,7 +490,7 @@ class ActivityLaunchAnimator(
return
}
context.mainExecutor.execute { startAnimation(apps, nonApps, iCallback) }
startAnimation(apps, nonApps, callback)
}
private fun startAnimation(
@@ -687,6 +728,7 @@ class ActivityLaunchAnimator(
controller.onLaunchAnimationCancelled()
}
@UiThread
override fun onAnimationCancelled(isKeyguardOccluded: Boolean) {
if (timedOut) {
return
@@ -695,10 +737,9 @@ class ActivityLaunchAnimator(
Log.i(TAG, "Remote animation was cancelled")
cancelled = true
removeTimeout()
context.mainExecutor.execute {
animation?.cancel()
controller.onLaunchAnimationCancelled(newKeyguardOccludedState = isKeyguardOccluded)
}
animation?.cancel()
controller.onLaunchAnimationCancelled(newKeyguardOccludedState = isKeyguardOccluded)
}
private fun IRemoteAnimationFinishedCallback.invoke() {

View File

@@ -0,0 +1,30 @@
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)
}