Merge "Offset animation layer for TaskFragment open/close" into sc-v2-dev
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user