Merge "Offset animation layer for TaskFragment open/close" into tm-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.
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user