Merge changes from topic "presubmit-am-0ceaf5de4b364feeaa00d2d1e8e8414b" into tm-dev
* changes: Revert "Revert "Use new T activity transitions in legacy"" Remove edge extension surface onAnimationLeashLost
This commit is contained in:
@@ -101,10 +101,6 @@ public class TransitionAnimation {
|
|||||||
|
|
||||||
private static final String DEFAULT_PACKAGE = "android";
|
private static final String DEFAULT_PACKAGE = "android";
|
||||||
|
|
||||||
// TODO (b/215515255): remove once we full migrate to shell transitions
|
|
||||||
private static final boolean SHELL_TRANSITIONS_ENABLED =
|
|
||||||
SystemProperties.getBoolean("persist.wm.debug.shell_transit", false);
|
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final String mTag;
|
private final String mTag;
|
||||||
|
|
||||||
@@ -259,9 +255,6 @@ public class TransitionAnimation {
|
|||||||
resId = ent.array.getResourceId(animAttr, 0);
|
resId = ent.array.getResourceId(animAttr, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!SHELL_TRANSITIONS_ENABLED) {
|
|
||||||
resId = updateToLegacyIfNeeded(resId);
|
|
||||||
}
|
|
||||||
resId = updateToTranslucentAnimIfNeeded(resId, transit);
|
resId = updateToTranslucentAnimIfNeeded(resId, transit);
|
||||||
if (ResourceId.isValid(resId)) {
|
if (ResourceId.isValid(resId)) {
|
||||||
return loadAnimationSafely(context, resId, mTag);
|
return loadAnimationSafely(context, resId, mTag);
|
||||||
@@ -269,24 +262,6 @@ public class TransitionAnimation {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Replace animations that are not compatible with the legacy transition system with ones that
|
|
||||||
* are compatible with it.
|
|
||||||
* TODO (b/215515255): remove once we full migrate to shell transitions
|
|
||||||
*/
|
|
||||||
private int updateToLegacyIfNeeded(int anim) {
|
|
||||||
if (anim == R.anim.activity_open_enter) {
|
|
||||||
return R.anim.activity_open_enter_legacy;
|
|
||||||
} else if (anim == R.anim.activity_open_exit) {
|
|
||||||
return R.anim.activity_open_exit_legacy;
|
|
||||||
} else if (anim == R.anim.activity_close_enter) {
|
|
||||||
return R.anim.activity_close_enter_legacy;
|
|
||||||
} else if (anim == R.anim.activity_close_exit) {
|
|
||||||
return R.anim.activity_close_exit_legacy;
|
|
||||||
}
|
|
||||||
return anim;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Load animation by attribute Id from a specific AnimationStyle resource. */
|
/** Load animation by attribute Id from a specific AnimationStyle resource. */
|
||||||
@Nullable
|
@Nullable
|
||||||
public Animation loadAnimationAttr(String packageName, int animStyleResId, int animAttr,
|
public Animation loadAnimationAttr(String packageName, int animStyleResId, int animAttr,
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--
|
|
||||||
/*
|
|
||||||
** Copyright 2009, The Android Open Source Project
|
|
||||||
**
|
|
||||||
** Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
** you may not use this file except in compliance with the License.
|
|
||||||
** You may obtain a copy of the License at
|
|
||||||
**
|
|
||||||
** http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
**
|
|
||||||
** Unless required by applicable law or agreed to in writing, software
|
|
||||||
** distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
** See the License for the specific language governing permissions and
|
|
||||||
** limitations under the License.
|
|
||||||
*/
|
|
||||||
-->
|
|
||||||
|
|
||||||
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:shareInterpolator="false">
|
|
||||||
<scale
|
|
||||||
android:fromXScale="1.1"
|
|
||||||
android:toXScale="1"
|
|
||||||
android:fromYScale="1.1"
|
|
||||||
android:toYScale="1"
|
|
||||||
android:pivotX="50%"
|
|
||||||
android:pivotY="50%"
|
|
||||||
android:fillEnabled="true"
|
|
||||||
android:fillBefore="true"
|
|
||||||
android:fillAfter="true"
|
|
||||||
android:interpolator="@interpolator/fast_out_extra_slow_in"
|
|
||||||
android:duration="400"/>
|
|
||||||
</set>
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--
|
|
||||||
/*
|
|
||||||
** Copyright 2009, The Android Open Source Project
|
|
||||||
**
|
|
||||||
** Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
** you may not use this file except in compliance with the License.
|
|
||||||
** You may obtain a copy of the License at
|
|
||||||
**
|
|
||||||
** http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
**
|
|
||||||
** Unless required by applicable law or agreed to in writing, software
|
|
||||||
** distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
** See the License for the specific language governing permissions and
|
|
||||||
** limitations under the License.
|
|
||||||
*/
|
|
||||||
-->
|
|
||||||
|
|
||||||
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:shareInterpolator="false"
|
|
||||||
android:zAdjustment="top">
|
|
||||||
<alpha
|
|
||||||
android:fromAlpha="1"
|
|
||||||
android:toAlpha="0.0"
|
|
||||||
android:fillEnabled="true"
|
|
||||||
android:fillBefore="true"
|
|
||||||
android:fillAfter="true"
|
|
||||||
android:interpolator="@interpolator/linear"
|
|
||||||
android:startOffset="33"
|
|
||||||
android:duration="50"/>
|
|
||||||
<scale
|
|
||||||
android:fromXScale="1"
|
|
||||||
android:toXScale="0.9"
|
|
||||||
android:fromYScale="1"
|
|
||||||
android:toYScale="0.9"
|
|
||||||
android:pivotX="50%"
|
|
||||||
android:pivotY="50%"
|
|
||||||
android:fillEnabled="true"
|
|
||||||
android:fillBefore="true"
|
|
||||||
android:fillAfter="true"
|
|
||||||
android:interpolator="@interpolator/fast_out_extra_slow_in"
|
|
||||||
android:duration="400"/>
|
|
||||||
</set>
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?><!--
|
|
||||||
/*
|
|
||||||
** Copyright 2009, The Android Open Source Project
|
|
||||||
**
|
|
||||||
** Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
** you may not use this file except in compliance with the License.
|
|
||||||
** You may obtain a copy of the License at
|
|
||||||
**
|
|
||||||
** http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
**
|
|
||||||
** Unless required by applicable law or agreed to in writing, software
|
|
||||||
** distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
** See the License for the specific language governing permissions and
|
|
||||||
** limitations under the License.
|
|
||||||
*/
|
|
||||||
-->
|
|
||||||
|
|
||||||
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:shareInterpolator="false">
|
|
||||||
<alpha
|
|
||||||
android:fromAlpha="0"
|
|
||||||
android:toAlpha="1.0"
|
|
||||||
android:fillEnabled="true"
|
|
||||||
android:fillBefore="true"
|
|
||||||
android:fillAfter="true"
|
|
||||||
android:interpolator="@interpolator/linear"
|
|
||||||
android:startOffset="50"
|
|
||||||
android:duration="50"/>
|
|
||||||
<scale
|
|
||||||
android:fromXScale="0.85"
|
|
||||||
android:toXScale="1"
|
|
||||||
android:fromYScale="0.85"
|
|
||||||
android:toYScale="1"
|
|
||||||
android:pivotX="50%"
|
|
||||||
android:pivotY="50%"
|
|
||||||
android:fillEnabled="true"
|
|
||||||
android:fillBefore="true"
|
|
||||||
android:fillAfter="true"
|
|
||||||
android:interpolator="@interpolator/fast_out_extra_slow_in"
|
|
||||||
android:duration="400"/>
|
|
||||||
</set>
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?><!--
|
|
||||||
/*
|
|
||||||
** Copyright 2009, The Android Open Source Project
|
|
||||||
**
|
|
||||||
** Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
** you may not use this file except in compliance with the License.
|
|
||||||
** You may obtain a copy of the License at
|
|
||||||
**
|
|
||||||
** http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
**
|
|
||||||
** Unless required by applicable law or agreed to in writing, software
|
|
||||||
** distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
** See the License for the specific language governing permissions and
|
|
||||||
** limitations under the License.
|
|
||||||
*/
|
|
||||||
-->
|
|
||||||
|
|
||||||
<set xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:shareInterpolator="false">
|
|
||||||
|
|
||||||
<!-- Fade out, over a black surface, which simulates a black scrim -->
|
|
||||||
<alpha
|
|
||||||
android:fromAlpha="1"
|
|
||||||
android:toAlpha="0.4"
|
|
||||||
android:fillEnabled="true"
|
|
||||||
android:fillBefore="true"
|
|
||||||
android:fillAfter="true"
|
|
||||||
android:interpolator="@interpolator/linear"
|
|
||||||
android:startOffset="83"
|
|
||||||
android:duration="167"/>
|
|
||||||
|
|
||||||
<scale
|
|
||||||
android:fromXScale="1"
|
|
||||||
android:toXScale="1.05"
|
|
||||||
android:fromYScale="1"
|
|
||||||
android:toYScale="1.05"
|
|
||||||
android:pivotX="50%"
|
|
||||||
android:pivotY="50%"
|
|
||||||
android:fillEnabled="true"
|
|
||||||
android:fillBefore="true"
|
|
||||||
android:fillAfter="true"
|
|
||||||
android:interpolator="@interpolator/fast_out_extra_slow_in"
|
|
||||||
android:duration="400"/>
|
|
||||||
</set>
|
|
||||||
@@ -1716,10 +1716,6 @@
|
|||||||
<java-symbol type="anim" name="activity_open_exit" />
|
<java-symbol type="anim" name="activity_open_exit" />
|
||||||
<java-symbol type="anim" name="activity_close_enter" />
|
<java-symbol type="anim" name="activity_close_enter" />
|
||||||
<java-symbol type="anim" name="activity_close_exit" />
|
<java-symbol type="anim" name="activity_close_exit" />
|
||||||
<java-symbol type="anim" name="activity_open_enter_legacy" />
|
|
||||||
<java-symbol type="anim" name="activity_open_exit_legacy" />
|
|
||||||
<java-symbol type="anim" name="activity_close_enter_legacy" />
|
|
||||||
<java-symbol type="anim" name="activity_close_exit_legacy" />
|
|
||||||
<java-symbol type="anim" name="task_fragment_close_enter" />
|
<java-symbol type="anim" name="task_fragment_close_enter" />
|
||||||
<java-symbol type="anim" name="task_fragment_close_exit" />
|
<java-symbol type="anim" name="task_fragment_close_exit" />
|
||||||
<java-symbol type="anim" name="task_fragment_open_enter" />
|
<java-symbol type="anim" name="task_fragment_open_enter" />
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ import com.android.server.AnimationThread;
|
|||||||
import com.android.server.wm.LocalAnimationAdapter.AnimationSpec;
|
import com.android.server.wm.LocalAnimationAdapter.AnimationSpec;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -66,6 +65,12 @@ class SurfaceAnimationRunner {
|
|||||||
*/
|
*/
|
||||||
private final Object mCancelLock = new Object();
|
private final Object mCancelLock = new Object();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lock for synchronizing {@link #mEdgeExtensions} to prevent race conditions when managing
|
||||||
|
* created edge extension surfaces.
|
||||||
|
*/
|
||||||
|
private final Object mEdgeExtensionLock = new Object();
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
Choreographer mChoreographer;
|
Choreographer mChoreographer;
|
||||||
|
|
||||||
@@ -93,6 +98,11 @@ class SurfaceAnimationRunner {
|
|||||||
@GuardedBy("mLock")
|
@GuardedBy("mLock")
|
||||||
private boolean mAnimationStartDeferred;
|
private boolean mAnimationStartDeferred;
|
||||||
|
|
||||||
|
// Mapping animation leashes to a list of edge extension surfaces associated with them
|
||||||
|
@GuardedBy("mEdgeExtensionLock")
|
||||||
|
private final ArrayMap<SurfaceControl, ArrayList<SurfaceControl>> mEdgeExtensions =
|
||||||
|
new ArrayMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* There should only ever be one instance of this class. Usual spot for it is with
|
* There should only ever be one instance of this class. Usual spot for it is with
|
||||||
* {@link WindowManagerService}
|
* {@link WindowManagerService}
|
||||||
@@ -154,21 +164,22 @@ class SurfaceAnimationRunner {
|
|||||||
boolean requiresEdgeExtension = requiresEdgeExtension(a);
|
boolean requiresEdgeExtension = requiresEdgeExtension(a);
|
||||||
|
|
||||||
if (requiresEdgeExtension) {
|
if (requiresEdgeExtension) {
|
||||||
|
final ArrayList<SurfaceControl> extensionSurfaces = new ArrayList<>();
|
||||||
|
synchronized (mEdgeExtensionLock) {
|
||||||
|
mEdgeExtensions.put(animationLeash, extensionSurfaces);
|
||||||
|
}
|
||||||
|
|
||||||
mPreProcessingAnimations.put(animationLeash, runningAnim);
|
mPreProcessingAnimations.put(animationLeash, runningAnim);
|
||||||
|
|
||||||
// We must wait for t to be committed since otherwise the leash doesn't have the
|
// We must wait for t to be committed since otherwise the leash doesn't have the
|
||||||
// windows we want to screenshot and extend as children.
|
// windows we want to screenshot and extend as children.
|
||||||
t.addTransactionCommittedListener(Runnable::run, () -> {
|
t.addTransactionCommittedListener(Runnable::run, () -> {
|
||||||
final WindowAnimationSpec animationSpec = a.asWindowAnimationSpec();
|
final WindowAnimationSpec animationSpec = a.asWindowAnimationSpec();
|
||||||
final Runnable cleanUpEdgeExtension = edgeExtendWindow(animationLeash,
|
|
||||||
|
edgeExtendWindow(animationLeash,
|
||||||
animationSpec.getRootTaskBounds(), animationSpec.getAnimation(),
|
animationSpec.getRootTaskBounds(), animationSpec.getAnimation(),
|
||||||
mFrameTransaction);
|
mFrameTransaction);
|
||||||
|
|
||||||
runningAnim.mFinishCallback = () -> {
|
|
||||||
cleanUpEdgeExtension.run();
|
|
||||||
finishCallback.run();
|
|
||||||
};
|
|
||||||
|
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
// only run if animation is not yet canceled by this point
|
// only run if animation is not yet canceled by this point
|
||||||
if (mPreProcessingAnimations.get(animationLeash) == runningAnim) {
|
if (mPreProcessingAnimations.get(animationLeash) == runningAnim) {
|
||||||
@@ -320,7 +331,7 @@ class SurfaceAnimationRunner {
|
|||||||
mApplyScheduled = false;
|
mApplyScheduled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Runnable edgeExtendWindow(SurfaceControl leash, Rect bounds, Animation a,
|
private void edgeExtendWindow(SurfaceControl leash, Rect bounds, Animation a,
|
||||||
Transaction transaction) {
|
Transaction transaction) {
|
||||||
final Transformation transformationAtStart = new Transformation();
|
final Transformation transformationAtStart = new Transformation();
|
||||||
a.getTransformationAt(0, transformationAtStart);
|
a.getTransformationAt(0, transformationAtStart);
|
||||||
@@ -335,17 +346,14 @@ class SurfaceAnimationRunner {
|
|||||||
final int targetSurfaceHeight = bounds.height();
|
final int targetSurfaceHeight = bounds.height();
|
||||||
final int targetSurfaceWidth = bounds.width();
|
final int targetSurfaceWidth = bounds.width();
|
||||||
|
|
||||||
final List<SurfaceControl> extensionSurfaces = new ArrayList<>();
|
|
||||||
|
|
||||||
if (maxExtensionInsets.left < 0) {
|
if (maxExtensionInsets.left < 0) {
|
||||||
final Rect edgeBounds = new Rect(0, 0, 1, targetSurfaceHeight);
|
final Rect edgeBounds = new Rect(0, 0, 1, targetSurfaceHeight);
|
||||||
final Rect extensionRect = new Rect(0, 0,
|
final Rect extensionRect = new Rect(0, 0,
|
||||||
-maxExtensionInsets.left, targetSurfaceHeight);
|
-maxExtensionInsets.left, targetSurfaceHeight);
|
||||||
final int xPos = maxExtensionInsets.left;
|
final int xPos = maxExtensionInsets.left;
|
||||||
final int yPos = 0;
|
final int yPos = 0;
|
||||||
final SurfaceControl extensionSurface = createExtensionSurface(leash, edgeBounds,
|
createExtensionSurface(leash, edgeBounds,
|
||||||
extensionRect, xPos, yPos, "Left Edge Extension", transaction);
|
extensionRect, xPos, yPos, "Left Edge Extension", transaction);
|
||||||
extensionSurfaces.add(extensionSurface);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maxExtensionInsets.top < 0) {
|
if (maxExtensionInsets.top < 0) {
|
||||||
@@ -354,9 +362,8 @@ class SurfaceAnimationRunner {
|
|||||||
targetSurfaceWidth, -maxExtensionInsets.top);
|
targetSurfaceWidth, -maxExtensionInsets.top);
|
||||||
final int xPos = 0;
|
final int xPos = 0;
|
||||||
final int yPos = maxExtensionInsets.top;
|
final int yPos = maxExtensionInsets.top;
|
||||||
final SurfaceControl extensionSurface = createExtensionSurface(leash, edgeBounds,
|
createExtensionSurface(leash, edgeBounds,
|
||||||
extensionRect, xPos, yPos, "Top Edge Extension", transaction);
|
extensionRect, xPos, yPos, "Top Edge Extension", transaction);
|
||||||
extensionSurfaces.add(extensionSurface);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maxExtensionInsets.right < 0) {
|
if (maxExtensionInsets.right < 0) {
|
||||||
@@ -366,9 +373,8 @@ class SurfaceAnimationRunner {
|
|||||||
-maxExtensionInsets.right, targetSurfaceHeight);
|
-maxExtensionInsets.right, targetSurfaceHeight);
|
||||||
final int xPos = targetSurfaceWidth;
|
final int xPos = targetSurfaceWidth;
|
||||||
final int yPos = 0;
|
final int yPos = 0;
|
||||||
final SurfaceControl extensionSurface = createExtensionSurface(leash, edgeBounds,
|
createExtensionSurface(leash, edgeBounds,
|
||||||
extensionRect, xPos, yPos, "Right Edge Extension", transaction);
|
extensionRect, xPos, yPos, "Right Edge Extension", transaction);
|
||||||
extensionSurfaces.add(extensionSurface);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maxExtensionInsets.bottom < 0) {
|
if (maxExtensionInsets.bottom < 0) {
|
||||||
@@ -378,23 +384,25 @@ class SurfaceAnimationRunner {
|
|||||||
targetSurfaceWidth, -maxExtensionInsets.bottom);
|
targetSurfaceWidth, -maxExtensionInsets.bottom);
|
||||||
final int xPos = maxExtensionInsets.left;
|
final int xPos = maxExtensionInsets.left;
|
||||||
final int yPos = targetSurfaceHeight;
|
final int yPos = targetSurfaceHeight;
|
||||||
final SurfaceControl extensionSurface = createExtensionSurface(leash, edgeBounds,
|
createExtensionSurface(leash, edgeBounds,
|
||||||
extensionRect, xPos, yPos, "Bottom Edge Extension", transaction);
|
extensionRect, xPos, yPos, "Bottom Edge Extension", transaction);
|
||||||
extensionSurfaces.add(extensionSurface);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Runnable cleanUp = () -> {
|
private void createExtensionSurface(SurfaceControl leash, Rect edgeBounds,
|
||||||
for (final SurfaceControl extensionSurface : extensionSurfaces) {
|
Rect extensionRect, int xPos, int yPos, String layerName,
|
||||||
if (extensionSurface != null) {
|
Transaction startTransaction) {
|
||||||
transaction.remove(extensionSurface);
|
synchronized (mEdgeExtensionLock) {
|
||||||
|
if (!mEdgeExtensions.containsKey(leash)) {
|
||||||
|
// Animation leash has already been removed so we shouldn't perform any extension
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
createExtensionSurfaceLocked(leash, edgeBounds, extensionRect, xPos, yPos, layerName,
|
||||||
|
startTransaction);
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
return cleanUp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private SurfaceControl createExtensionSurface(SurfaceControl surfaceToExtend, Rect edgeBounds,
|
private void createExtensionSurfaceLocked(SurfaceControl surfaceToExtend, Rect edgeBounds,
|
||||||
Rect extensionRect, int xPos, int yPos, String layerName,
|
Rect extensionRect, int xPos, int yPos, String layerName,
|
||||||
Transaction startTransaction) {
|
Transaction startTransaction) {
|
||||||
final SurfaceControl edgeExtensionLayer = new SurfaceControl.Builder()
|
final SurfaceControl edgeExtensionLayer = new SurfaceControl.Builder()
|
||||||
@@ -420,7 +428,7 @@ class SurfaceAnimationRunner {
|
|||||||
if (edgeBuffer == null) {
|
if (edgeBuffer == null) {
|
||||||
Log.e("SurfaceAnimationRunner", "Failed to create edge extension - "
|
Log.e("SurfaceAnimationRunner", "Failed to create edge extension - "
|
||||||
+ "edge buffer is null");
|
+ "edge buffer is null");
|
||||||
return null;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
android.graphics.BitmapShader shader =
|
android.graphics.BitmapShader shader =
|
||||||
@@ -440,13 +448,13 @@ class SurfaceAnimationRunner {
|
|||||||
startTransaction.setPosition(edgeExtensionLayer, xPos, yPos);
|
startTransaction.setPosition(edgeExtensionLayer, xPos, yPos);
|
||||||
startTransaction.setVisibility(edgeExtensionLayer, true);
|
startTransaction.setVisibility(edgeExtensionLayer, true);
|
||||||
|
|
||||||
return edgeExtensionLayer;
|
mEdgeExtensions.get(surfaceToExtend).add(edgeExtensionLayer);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class RunningAnimation {
|
private static final class RunningAnimation {
|
||||||
final AnimationSpec mAnimSpec;
|
final AnimationSpec mAnimSpec;
|
||||||
final SurfaceControl mLeash;
|
final SurfaceControl mLeash;
|
||||||
Runnable mFinishCallback;
|
final Runnable mFinishCallback;
|
||||||
ValueAnimator mAnim;
|
ValueAnimator mAnim;
|
||||||
|
|
||||||
@GuardedBy("mCancelLock")
|
@GuardedBy("mCancelLock")
|
||||||
@@ -459,6 +467,22 @@ class SurfaceAnimationRunner {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void onAnimationLeashLost(SurfaceControl animationLeash,
|
||||||
|
Transaction t) {
|
||||||
|
synchronized (mEdgeExtensionLock) {
|
||||||
|
if (!mEdgeExtensions.containsKey(animationLeash)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final ArrayList<SurfaceControl> edgeExtensions = mEdgeExtensions.get(animationLeash);
|
||||||
|
for (int i = 0; i < edgeExtensions.size(); i++) {
|
||||||
|
final SurfaceControl extension = edgeExtensions.get(i);
|
||||||
|
t.remove(extension);
|
||||||
|
}
|
||||||
|
mEdgeExtensions.remove(animationLeash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
interface AnimatorFactory {
|
interface AnimatorFactory {
|
||||||
ValueAnimator makeAnimator();
|
ValueAnimator makeAnimator();
|
||||||
|
|||||||
@@ -3179,6 +3179,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
|
|||||||
@Override
|
@Override
|
||||||
public void onAnimationLeashLost(Transaction t) {
|
public void onAnimationLeashLost(Transaction t) {
|
||||||
mLastLayer = -1;
|
mLastLayer = -1;
|
||||||
|
mWmService.mSurfaceAnimationRunner.onAnimationLeashLost(mAnimationLeash, t);
|
||||||
mAnimationLeash = null;
|
mAnimationLeash = null;
|
||||||
reassignLayer(t);
|
reassignLayer(t);
|
||||||
updateSurfacePosition(t);
|
updateSurfacePosition(t);
|
||||||
|
|||||||
Reference in New Issue
Block a user