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

This commit is contained in:
Chris Li
2022-03-17 07:09:34 +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. * The base adapter can be used for {@link RemoteAnimationTarget} that is simple open/close.
*/ */
class TaskFragmentAnimationAdapter { 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 Animation mAnimation;
final RemoteAnimationTarget mTarget; final RemoteAnimationTarget mTarget;
final SurfaceControl mLeash; final SurfaceControl mLeash;
@@ -42,6 +48,7 @@ class TaskFragmentAnimationAdapter {
final float[] mVecs = new float[4]; final float[] mVecs = new float[4];
final Rect mRect = new Rect(); final Rect mRect = new Rect();
private boolean mIsFirstFrame = true; private boolean mIsFirstFrame = true;
private int mOverrideLayer = LAYER_NO_OVERRIDE;
TaskFragmentAnimationAdapter(@NonNull Animation animation, TaskFragmentAnimationAdapter(@NonNull Animation animation,
@NonNull RemoteAnimationTarget target) { @NonNull RemoteAnimationTarget target) {
@@ -58,10 +65,21 @@ class TaskFragmentAnimationAdapter {
mLeash = leash; 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. */ /** Called on frame update. */
final void onAnimationUpdate(@NonNull SurfaceControl.Transaction t, long currentPlayTime) { final void onAnimationUpdate(@NonNull SurfaceControl.Transaction t, long currentPlayTime) {
if (mIsFirstFrame) { if (mIsFirstFrame) {
t.show(mLeash); t.show(mLeash);
if (mOverrideLayer != LAYER_NO_OVERRIDE) {
t.setLayer(mLeash, mOverrideLayer);
}
mIsFirstFrame = false; 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_CLOSE;
import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_OPEN; import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_OPEN;
import static android.view.WindowManager.TRANSIT_OLD_TASK_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.Animator;
import android.animation.ValueAnimator; import android.animation.ValueAnimator;
@@ -181,18 +182,22 @@ class TaskFragmentAnimationRunner extends IRemoteAnimationRunner.Stub {
private List<TaskFragmentAnimationAdapter> createOpenAnimationAdapters( private List<TaskFragmentAnimationAdapter> createOpenAnimationAdapters(
@NonNull RemoteAnimationTarget[] targets) { @NonNull RemoteAnimationTarget[] targets) {
return createOpenCloseAnimationAdapters(targets, return createOpenCloseAnimationAdapters(targets, true /* isOpening */,
mAnimationSpec::loadOpenAnimation); mAnimationSpec::loadOpenAnimation);
} }
private List<TaskFragmentAnimationAdapter> createCloseAnimationAdapters( private List<TaskFragmentAnimationAdapter> createCloseAnimationAdapters(
@NonNull RemoteAnimationTarget[] targets) { @NonNull RemoteAnimationTarget[] targets) {
return createOpenCloseAnimationAdapters(targets, return createOpenCloseAnimationAdapters(targets, false /* isOpening */,
mAnimationSpec::loadCloseAnimation); 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( private List<TaskFragmentAnimationAdapter> createOpenCloseAnimationAdapters(
@NonNull RemoteAnimationTarget[] targets, @NonNull RemoteAnimationTarget[] targets, boolean isOpening,
@NonNull BiFunction<RemoteAnimationTarget, Rect, Animation> animationProvider) { @NonNull BiFunction<RemoteAnimationTarget, Rect, Animation> animationProvider) {
// We need to know if the target window is only a partial of the whole animation screen. // 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. // 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<>(); final List<TaskFragmentAnimationAdapter> adapters = new ArrayList<>();
for (RemoteAnimationTarget target : openingTargets) { for (RemoteAnimationTarget target : openingTargets) {
adapters.add(createOpenCloseAnimationAdapter(target, animationProvider, final TaskFragmentAnimationAdapter adapter = createOpenCloseAnimationAdapter(target,
openingWholeScreenBounds)); animationProvider, openingWholeScreenBounds);
if (isOpening) {
adapter.overrideLayer(offsetLayer++);
}
adapters.add(adapter);
} }
for (RemoteAnimationTarget target : closingTargets) { for (RemoteAnimationTarget target : closingTargets) {
adapters.add(createOpenCloseAnimationAdapter(target, animationProvider, final TaskFragmentAnimationAdapter adapter = createOpenCloseAnimationAdapter(target,
closingWholeScreenBounds)); animationProvider, closingWholeScreenBounds);
if (!isOpening) {
adapter.overrideLayer(offsetLayer++);
}
adapters.add(adapter);
} }
return adapters; return adapters;
} }