Merge "Offset animation layer for TaskFragment open/close" into tm-dev

This commit is contained in:
Chris Li
2022-03-10 01:04:33 +00:00
committed by Android (Google) Code Review
2 changed files with 41 additions and 7 deletions

View File

@@ -33,6 +33,12 @@ import androidx.annotation.NonNull;
* The base adapter can be used for {@link RemoteAnimationTarget} that is simple open/close.
*/
class TaskFragmentAnimationAdapter {
/**
* If {@link #mOverrideLayer} is set to this value, we don't want to override the surface layer.
*/
private static final int LAYER_NO_OVERRIDE = -1;
final Animation mAnimation;
final RemoteAnimationTarget mTarget;
final SurfaceControl mLeash;
@@ -42,6 +48,7 @@ class TaskFragmentAnimationAdapter {
final float[] mVecs = new float[4];
final Rect mRect = new Rect();
private boolean mIsFirstFrame = true;
private int mOverrideLayer = LAYER_NO_OVERRIDE;
TaskFragmentAnimationAdapter(@NonNull Animation animation,
@NonNull RemoteAnimationTarget target) {
@@ -58,10 +65,21 @@ class TaskFragmentAnimationAdapter {
mLeash = leash;
}
/**
* Surface layer to be set at the first frame of the animation. We will not set the layer if it
* is set to {@link #LAYER_NO_OVERRIDE}.
*/
final void overrideLayer(int layer) {
mOverrideLayer = layer;
}
/** Called on frame update. */
final void onAnimationUpdate(@NonNull SurfaceControl.Transaction t, long currentPlayTime) {
if (mIsFirstFrame) {
t.show(mLeash);
if (mOverrideLayer != LAYER_NO_OVERRIDE) {
t.setLayer(mLeash, mOverrideLayer);
}
mIsFirstFrame = false;
}

View File

@@ -25,6 +25,7 @@ import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_CHANGE;
import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_CLOSE;
import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_OPEN;
import static android.view.WindowManager.TRANSIT_OLD_TASK_OPEN;
import static android.view.WindowManagerPolicyConstants.TYPE_LAYER_OFFSET;
import android.animation.Animator;
import android.animation.ValueAnimator;
@@ -181,18 +182,22 @@ class TaskFragmentAnimationRunner extends IRemoteAnimationRunner.Stub {
private List<TaskFragmentAnimationAdapter> createOpenAnimationAdapters(
@NonNull RemoteAnimationTarget[] targets) {
return createOpenCloseAnimationAdapters(targets,
return createOpenCloseAnimationAdapters(targets, true /* isOpening */,
mAnimationSpec::loadOpenAnimation);
}
private List<TaskFragmentAnimationAdapter> createCloseAnimationAdapters(
@NonNull RemoteAnimationTarget[] targets) {
return createOpenCloseAnimationAdapters(targets,
return createOpenCloseAnimationAdapters(targets, false /* isOpening */,
mAnimationSpec::loadCloseAnimation);
}
/**
* Creates {@link TaskFragmentAnimationAdapter} for OPEN and CLOSE types of transition.
* @param isOpening {@code true} for OPEN type, {@code false} for CLOSE type.
*/
private List<TaskFragmentAnimationAdapter> createOpenCloseAnimationAdapters(
@NonNull RemoteAnimationTarget[] targets,
@NonNull RemoteAnimationTarget[] targets, boolean isOpening,
@NonNull BiFunction<RemoteAnimationTarget, Rect, Animation> animationProvider) {
// We need to know if the target window is only a partial of the whole animation screen.
// If so, we will need to adjust it to make the whole animation screen looks like one.
@@ -210,14 +215,25 @@ class TaskFragmentAnimationRunner extends IRemoteAnimationRunner.Stub {
}
}
// For OPEN transition, open windows should be above close windows.
// For CLOSE transition, open windows should be below close windows.
int offsetLayer = TYPE_LAYER_OFFSET;
final List<TaskFragmentAnimationAdapter> adapters = new ArrayList<>();
for (RemoteAnimationTarget target : openingTargets) {
adapters.add(createOpenCloseAnimationAdapter(target, animationProvider,
openingWholeScreenBounds));
final TaskFragmentAnimationAdapter adapter = createOpenCloseAnimationAdapter(target,
animationProvider, openingWholeScreenBounds);
if (isOpening) {
adapter.overrideLayer(offsetLayer++);
}
adapters.add(adapter);
}
for (RemoteAnimationTarget target : closingTargets) {
adapters.add(createOpenCloseAnimationAdapter(target, animationProvider,
closingWholeScreenBounds));
final TaskFragmentAnimationAdapter adapter = createOpenCloseAnimationAdapter(target,
animationProvider, closingWholeScreenBounds);
if (!isOpening) {
adapter.overrideLayer(offsetLayer++);
}
adapters.add(adapter);
}
return adapters;
}