Merge "Revert "Deprecate getSfInstance usage in PiP component"" into tm-dev
This commit is contained in:
@@ -19,6 +19,7 @@ package com.android.wm.shell.animation
|
||||
import android.util.ArrayMap
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import androidx.dynamicanimation.animation.AnimationHandler
|
||||
import androidx.dynamicanimation.animation.DynamicAnimation
|
||||
import androidx.dynamicanimation.animation.FlingAnimation
|
||||
import androidx.dynamicanimation.animation.FloatPropertyCompat
|
||||
@@ -122,6 +123,12 @@ class PhysicsAnimator<T> private constructor (target: T) {
|
||||
/** FlingConfig to use by default for properties whose fling configs were not provided. */
|
||||
private var defaultFling: FlingConfig = globalDefaultFling
|
||||
|
||||
/**
|
||||
* AnimationHandler to use if it need custom AnimationHandler, if this is null, it will use
|
||||
* the default AnimationHandler in the DynamicAnimation.
|
||||
*/
|
||||
private var customAnimationHandler: AnimationHandler? = null
|
||||
|
||||
/**
|
||||
* Internal listeners that respond to DynamicAnimations updating and ending, and dispatch to
|
||||
* the listeners provided via [addUpdateListener] and [addEndListener]. This allows us to add
|
||||
@@ -446,6 +453,14 @@ class PhysicsAnimator<T> private constructor (target: T) {
|
||||
this.defaultFling = defaultFling
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the custom AnimationHandler for all aniatmion in this animator. Set this with null for
|
||||
* restoring to default AnimationHandler.
|
||||
*/
|
||||
fun setCustomAnimationHandler(handler: AnimationHandler) {
|
||||
this.customAnimationHandler = handler
|
||||
}
|
||||
|
||||
/** Starts the animations! */
|
||||
fun start() {
|
||||
startAction()
|
||||
@@ -495,10 +510,13 @@ class PhysicsAnimator<T> private constructor (target: T) {
|
||||
// springs) on this property before flinging.
|
||||
cancel(animatedProperty)
|
||||
|
||||
// Apply the custom animation handler if it not null
|
||||
val flingAnim = getFlingAnimation(animatedProperty, target)
|
||||
flingAnim.animationHandler =
|
||||
customAnimationHandler ?: flingAnim.animationHandler
|
||||
|
||||
// Apply the configuration and start the animation.
|
||||
getFlingAnimation(animatedProperty, target)
|
||||
.also { flingConfig.applyToAnimation(it) }
|
||||
.start()
|
||||
flingAnim.also { flingConfig.applyToAnimation(it) }.start()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -510,6 +528,21 @@ class PhysicsAnimator<T> private constructor (target: T) {
|
||||
if (flingConfig == null) {
|
||||
// Apply the configuration and start the animation.
|
||||
val springAnim = getSpringAnimation(animatedProperty, target)
|
||||
|
||||
// If customAnimationHander is exist and has not been set to the animation,
|
||||
// it should set here.
|
||||
if (customAnimationHandler != null &&
|
||||
springAnim.animationHandler != customAnimationHandler) {
|
||||
// Cancel the animation before set animation handler
|
||||
if (springAnim.isRunning) {
|
||||
cancel(animatedProperty)
|
||||
}
|
||||
// Apply the custom animation handler if it not null
|
||||
springAnim.animationHandler =
|
||||
customAnimationHandler ?: springAnim.animationHandler
|
||||
}
|
||||
|
||||
// Apply the configuration and start the animation.
|
||||
springConfig.applyToAnimation(springAnim)
|
||||
animationStartActions.add(springAnim::start)
|
||||
} else {
|
||||
@@ -564,10 +597,13 @@ class PhysicsAnimator<T> private constructor (target: T) {
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the custom animation handler if it not null
|
||||
val springAnim = getSpringAnimation(animatedProperty, target)
|
||||
springAnim.animationHandler =
|
||||
customAnimationHandler ?: springAnim.animationHandler
|
||||
|
||||
// Apply the configuration and start the spring animation.
|
||||
getSpringAnimation(animatedProperty, target)
|
||||
.also { springConfig.applyToAnimation(it) }
|
||||
.start()
|
||||
springAnim.also { springConfig.applyToAnimation(it) }.start()
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
@@ -30,6 +30,7 @@ import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Rect;
|
||||
import android.view.Choreographer;
|
||||
import android.view.Surface;
|
||||
import android.view.SurfaceControl;
|
||||
import android.view.SurfaceSession;
|
||||
@@ -270,15 +271,14 @@ public class PipAnimationController {
|
||||
mEndValue = endValue;
|
||||
addListener(this);
|
||||
addUpdateListener(this);
|
||||
mSurfaceControlTransactionFactory =
|
||||
new PipSurfaceTransactionHelper.VsyncSurfaceControlTransactionFactory();
|
||||
mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;
|
||||
mTransitionDirection = TRANSITION_DIRECTION_NONE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationStart(Animator animation) {
|
||||
mCurrentValue = mStartValue;
|
||||
onStartTransaction(mLeash, mSurfaceControlTransactionFactory.getTransaction());
|
||||
onStartTransaction(mLeash, newSurfaceControlTransaction());
|
||||
if (mPipAnimationCallback != null) {
|
||||
mPipAnimationCallback.onPipAnimationStart(mTaskInfo, this);
|
||||
}
|
||||
@@ -286,16 +286,14 @@ public class PipAnimationController {
|
||||
|
||||
@Override
|
||||
public void onAnimationUpdate(ValueAnimator animation) {
|
||||
applySurfaceControlTransaction(mLeash,
|
||||
mSurfaceControlTransactionFactory.getTransaction(),
|
||||
applySurfaceControlTransaction(mLeash, newSurfaceControlTransaction(),
|
||||
animation.getAnimatedFraction());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
mCurrentValue = mEndValue;
|
||||
final SurfaceControl.Transaction tx =
|
||||
mSurfaceControlTransactionFactory.getTransaction();
|
||||
final SurfaceControl.Transaction tx = newSurfaceControlTransaction();
|
||||
onEndTransaction(mLeash, tx, mTransitionDirection);
|
||||
if (mPipAnimationCallback != null) {
|
||||
mPipAnimationCallback.onPipAnimationEnd(mTaskInfo, tx, this);
|
||||
@@ -342,8 +340,7 @@ public class PipAnimationController {
|
||||
}
|
||||
|
||||
PipTransitionAnimator<T> setUseContentOverlay(Context context) {
|
||||
final SurfaceControl.Transaction tx =
|
||||
mSurfaceControlTransactionFactory.getTransaction();
|
||||
final SurfaceControl.Transaction tx = newSurfaceControlTransaction();
|
||||
if (mContentOverlay != null) {
|
||||
// remove existing content overlay if there is any.
|
||||
tx.remove(mContentOverlay);
|
||||
@@ -418,7 +415,7 @@ public class PipAnimationController {
|
||||
void setDestinationBounds(Rect destinationBounds) {
|
||||
mDestinationBounds.set(destinationBounds);
|
||||
if (mAnimationType == ANIM_TYPE_ALPHA) {
|
||||
onStartTransaction(mLeash, mSurfaceControlTransactionFactory.getTransaction());
|
||||
onStartTransaction(mLeash, newSurfaceControlTransaction());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -453,6 +450,16 @@ public class PipAnimationController {
|
||||
mEndValue = endValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {@link SurfaceControl.Transaction} instance with vsync-id.
|
||||
*/
|
||||
protected SurfaceControl.Transaction newSurfaceControlTransaction() {
|
||||
final SurfaceControl.Transaction tx =
|
||||
mSurfaceControlTransactionFactory.getTransaction();
|
||||
tx.setFrameTimelineVsync(Choreographer.getSfInstance().getVsyncId());
|
||||
return tx;
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
public void setSurfaceControlTransactionFactory(
|
||||
PipSurfaceTransactionHelper.SurfaceControlTransactionFactory factory) {
|
||||
|
||||
@@ -20,7 +20,6 @@ import android.content.Context;
|
||||
import android.graphics.Matrix;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.RectF;
|
||||
import android.view.Choreographer;
|
||||
import android.view.SurfaceControl;
|
||||
|
||||
import com.android.wm.shell.R;
|
||||
@@ -225,18 +224,4 @@ public class PipSurfaceTransactionHelper {
|
||||
public interface SurfaceControlTransactionFactory {
|
||||
SurfaceControl.Transaction getTransaction();
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of {@link SurfaceControlTransactionFactory} that returns
|
||||
* {@link SurfaceControl.Transaction} with VsyncId being set.
|
||||
*/
|
||||
public static class VsyncSurfaceControlTransactionFactory
|
||||
implements SurfaceControlTransactionFactory {
|
||||
@Override
|
||||
public SurfaceControl.Transaction getTransaction() {
|
||||
final SurfaceControl.Transaction tx = new SurfaceControl.Transaction();
|
||||
tx.setFrameTimelineVsync(Choreographer.getInstance().getVsyncId());
|
||||
return tx;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -280,8 +280,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
||||
mSurfaceTransactionHelper = surfaceTransactionHelper;
|
||||
mPipAnimationController = pipAnimationController;
|
||||
mPipUiEventLoggerLogger = pipUiEventLogger;
|
||||
mSurfaceControlTransactionFactory =
|
||||
new PipSurfaceTransactionHelper.VsyncSurfaceControlTransactionFactory();
|
||||
mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;
|
||||
mSplitScreenOptional = splitScreenOptional;
|
||||
mTaskOrganizer = shellTaskOrganizer;
|
||||
mMainExecutor = mainExecutor;
|
||||
|
||||
@@ -146,10 +146,11 @@ public class PipInputConsumer {
|
||||
"%s: Failed to create input consumer, %s", TAG, e);
|
||||
}
|
||||
mMainExecutor.execute(() -> {
|
||||
// Choreographer.getInstance() must be called on the thread that the input event
|
||||
// Choreographer.getSfInstance() must be called on the thread that the input event
|
||||
// receiver should be receiving events
|
||||
// TODO(b/222697646): remove getSfInstance usage and use vsyncId for transactions
|
||||
mInputEventReceiver = new InputEventReceiver(inputChannel,
|
||||
Looper.myLooper(), Choreographer.getInstance());
|
||||
Looper.myLooper(), Choreographer.getSfInstance());
|
||||
if (mRegistrationListener != null) {
|
||||
mRegistrationListener.onRegistrationChanged(true /* isRegistered */);
|
||||
}
|
||||
|
||||
@@ -33,6 +33,11 @@ import android.content.Context;
|
||||
import android.graphics.PointF;
|
||||
import android.graphics.Rect;
|
||||
import android.os.Debug;
|
||||
import android.os.Looper;
|
||||
import android.view.Choreographer;
|
||||
|
||||
import androidx.dynamicanimation.animation.AnimationHandler;
|
||||
import androidx.dynamicanimation.animation.AnimationHandler.FrameCallbackScheduler;
|
||||
|
||||
import com.android.internal.protolog.common.ProtoLog;
|
||||
import com.android.wm.shell.R;
|
||||
@@ -84,6 +89,26 @@ public class PipMotionHelper implements PipAppOpsListener.Callback,
|
||||
/** Coordinator instance for resolving conflicts with other floating content. */
|
||||
private FloatingContentCoordinator mFloatingContentCoordinator;
|
||||
|
||||
private ThreadLocal<AnimationHandler> mSfAnimationHandlerThreadLocal =
|
||||
ThreadLocal.withInitial(() -> {
|
||||
final Looper initialLooper = Looper.myLooper();
|
||||
final FrameCallbackScheduler scheduler = new FrameCallbackScheduler() {
|
||||
@Override
|
||||
public void postFrameCallback(@androidx.annotation.NonNull Runnable runnable) {
|
||||
// TODO(b/222697646): remove getSfInstance usage and use vsyncId for
|
||||
// transactions
|
||||
Choreographer.getSfInstance().postFrameCallback(t -> runnable.run());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCurrentThread() {
|
||||
return Looper.myLooper() == initialLooper;
|
||||
}
|
||||
};
|
||||
AnimationHandler handler = new AnimationHandler(scheduler);
|
||||
return handler;
|
||||
});
|
||||
|
||||
/**
|
||||
* PhysicsAnimator instance for animating {@link PipBoundsState#getMotionBoundsState()}
|
||||
* using physics animations.
|
||||
@@ -186,8 +211,11 @@ public class PipMotionHelper implements PipAppOpsListener.Callback,
|
||||
}
|
||||
|
||||
public void init() {
|
||||
// Note: Needs to get the shell main thread sf vsync animation handler
|
||||
mTemporaryBoundsPhysicsAnimator = PhysicsAnimator.getInstance(
|
||||
mPipBoundsState.getMotionBoundsState().getBoundsInMotion());
|
||||
mTemporaryBoundsPhysicsAnimator.setCustomAnimationHandler(
|
||||
mSfAnimationHandlerThreadLocal.get());
|
||||
}
|
||||
|
||||
@NonNull
|
||||
|
||||
@@ -625,7 +625,8 @@ public class PipResizeGestureHandler {
|
||||
|
||||
class PipResizeInputEventReceiver extends BatchedInputEventReceiver {
|
||||
PipResizeInputEventReceiver(InputChannel channel, Looper looper) {
|
||||
super(channel, looper, Choreographer.getInstance());
|
||||
// TODO(b/222697646): remove getSfInstance usage and use vsyncId for transactions
|
||||
super(channel, looper, Choreographer.getSfInstance());
|
||||
}
|
||||
|
||||
public void onInputEvent(InputEvent event) {
|
||||
|
||||
@@ -165,7 +165,7 @@ public class PipSurfaceTransactionHelper {
|
||||
/** @return {@link SurfaceControl.Transaction} instance with vsync-id */
|
||||
public static SurfaceControl.Transaction newSurfaceControlTransaction() {
|
||||
final SurfaceControl.Transaction tx = new SurfaceControl.Transaction();
|
||||
tx.setFrameTimelineVsync(Choreographer.getInstance().getVsyncId());
|
||||
tx.setFrameTimelineVsync(Choreographer.getSfInstance().getVsyncId());
|
||||
return tx;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user