Merge "Fixing exception when applying transaction while the surface is released" into ub-launcher3-rvc-dev
This commit is contained in:
commit
19fc8b6a83
|
@ -33,11 +33,11 @@ import com.android.launcher3.anim.PendingAnimation;
|
||||||
import com.android.launcher3.statehandlers.DepthController;
|
import com.android.launcher3.statehandlers.DepthController;
|
||||||
import com.android.launcher3.statemanager.StatefulActivity;
|
import com.android.launcher3.statemanager.StatefulActivity;
|
||||||
import com.android.quickstep.util.RemoteAnimationProvider;
|
import com.android.quickstep.util.RemoteAnimationProvider;
|
||||||
|
import com.android.quickstep.util.SurfaceTransactionApplier;
|
||||||
import com.android.quickstep.util.TaskViewSimulator;
|
import com.android.quickstep.util.TaskViewSimulator;
|
||||||
import com.android.quickstep.util.TransformParams;
|
import com.android.quickstep.util.TransformParams;
|
||||||
import com.android.quickstep.views.RecentsView;
|
import com.android.quickstep.views.RecentsView;
|
||||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provider for the atomic (for 3-button mode) remote window animation from the app to the overview.
|
* Provider for the atomic (for 3-button mode) remote window animation from the app to the overview.
|
||||||
|
@ -132,8 +132,7 @@ final class AppToOverviewAnimationProvider<T extends StatefulActivity<?>> extend
|
||||||
|
|
||||||
TransformParams params = new TransformParams()
|
TransformParams params = new TransformParams()
|
||||||
.setTargetSet(targets)
|
.setTargetSet(targets)
|
||||||
.setSyncTransactionApplier(
|
.setSyncTransactionApplier(new SurfaceTransactionApplier(mActivity.getRootView()));
|
||||||
new SyncRtSurfaceTransactionApplierCompat(mActivity.getRootView()));
|
|
||||||
|
|
||||||
AnimatedFloat recentsAlpha = new AnimatedFloat(() -> { });
|
AnimatedFloat recentsAlpha = new AnimatedFloat(() -> { });
|
||||||
params.setBaseBuilderProxy((builder, app, p)
|
params.setBaseBuilderProxy((builder, app, p)
|
||||||
|
|
|
@ -40,13 +40,14 @@ import com.android.launcher3.util.WindowBounds;
|
||||||
import com.android.quickstep.RecentsAnimationCallbacks.RecentsAnimationListener;
|
import com.android.quickstep.RecentsAnimationCallbacks.RecentsAnimationListener;
|
||||||
import com.android.quickstep.util.ActiveGestureLog;
|
import com.android.quickstep.util.ActiveGestureLog;
|
||||||
import com.android.quickstep.util.ActivityInitListener;
|
import com.android.quickstep.util.ActivityInitListener;
|
||||||
|
import com.android.quickstep.util.RectFSpringAnim;
|
||||||
|
import com.android.quickstep.util.SurfaceTransactionApplier;
|
||||||
import com.android.quickstep.util.TransformParams;
|
import com.android.quickstep.util.TransformParams;
|
||||||
import com.android.quickstep.views.RecentsView;
|
import com.android.quickstep.views.RecentsView;
|
||||||
import com.android.quickstep.views.TaskView;
|
import com.android.quickstep.views.TaskView;
|
||||||
import com.android.systemui.shared.recents.model.ThumbnailData;
|
import com.android.systemui.shared.recents.model.ThumbnailData;
|
||||||
import com.android.systemui.shared.system.InputConsumerController;
|
import com.android.systemui.shared.system.InputConsumerController;
|
||||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
@ -114,10 +115,10 @@ public abstract class BaseSwipeUpHandler<T extends StatefulActivity<?>, Q extend
|
||||||
public abstract Intent getLaunchIntent();
|
public abstract Intent getLaunchIntent();
|
||||||
|
|
||||||
protected void linkRecentsViewScroll() {
|
protected void linkRecentsViewScroll() {
|
||||||
SyncRtSurfaceTransactionApplierCompat.create(mRecentsView, applier -> {
|
SurfaceTransactionApplier.create(mRecentsView, applier -> {
|
||||||
mTransformParams.setSyncTransactionApplier(applier);
|
mTransformParams.setSyncTransactionApplier(applier);
|
||||||
runOnRecentsAnimationStart(() ->
|
runOnRecentsAnimationStart(() ->
|
||||||
mRecentsAnimationTargets.addDependentTransactionApplier(applier));
|
mRecentsAnimationTargets.addReleaseCheck(applier));
|
||||||
});
|
});
|
||||||
|
|
||||||
mRecentsView.setOnScrollChangeListener((v, scrollX, scrollY, oldScrollX, oldScrollY) -> {
|
mRecentsView.setOnScrollChangeListener((v, scrollX, scrollY, oldScrollX, oldScrollY) -> {
|
||||||
|
@ -365,6 +366,17 @@ public abstract class BaseSwipeUpHandler<T extends StatefulActivity<?>, Q extend
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected RectFSpringAnim createWindowAnimationToHome(float startProgress,
|
||||||
|
HomeAnimationFactory homeAnimationFactory) {
|
||||||
|
RectFSpringAnim anim =
|
||||||
|
super.createWindowAnimationToHome(startProgress, homeAnimationFactory);
|
||||||
|
if (mRecentsAnimationTargets != null) {
|
||||||
|
mRecentsAnimationTargets.addReleaseCheck(anim);
|
||||||
|
}
|
||||||
|
return anim;
|
||||||
|
}
|
||||||
|
|
||||||
public interface Factory {
|
public interface Factory {
|
||||||
|
|
||||||
BaseSwipeUpHandler newHandler(
|
BaseSwipeUpHandler newHandler(
|
||||||
|
|
|
@ -42,6 +42,7 @@ import com.android.launcher3.anim.PendingAnimation;
|
||||||
import com.android.launcher3.model.data.ItemInfo;
|
import com.android.launcher3.model.data.ItemInfo;
|
||||||
import com.android.launcher3.statehandlers.DepthController;
|
import com.android.launcher3.statehandlers.DepthController;
|
||||||
import com.android.launcher3.util.DefaultDisplay;
|
import com.android.launcher3.util.DefaultDisplay;
|
||||||
|
import com.android.quickstep.util.SurfaceTransactionApplier;
|
||||||
import com.android.quickstep.util.TaskViewSimulator;
|
import com.android.quickstep.util.TaskViewSimulator;
|
||||||
import com.android.quickstep.util.TransformParams;
|
import com.android.quickstep.util.TransformParams;
|
||||||
import com.android.quickstep.views.RecentsView;
|
import com.android.quickstep.views.RecentsView;
|
||||||
|
@ -49,7 +50,6 @@ import com.android.quickstep.views.TaskThumbnailView;
|
||||||
import com.android.quickstep.views.TaskView;
|
import com.android.quickstep.views.TaskView;
|
||||||
import com.android.systemui.shared.recents.model.Task;
|
import com.android.systemui.shared.recents.model.Task;
|
||||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility class for helpful methods related to {@link TaskView} objects and their tasks.
|
* Utility class for helpful methods related to {@link TaskView} objects and their tasks.
|
||||||
|
@ -128,11 +128,10 @@ public final class TaskViewUtils {
|
||||||
RemoteAnimationTargetCompat[] wallpaperTargets, DepthController depthController,
|
RemoteAnimationTargetCompat[] wallpaperTargets, DepthController depthController,
|
||||||
PendingAnimation out) {
|
PendingAnimation out) {
|
||||||
|
|
||||||
SyncRtSurfaceTransactionApplierCompat applier =
|
SurfaceTransactionApplier applier = new SurfaceTransactionApplier(v);
|
||||||
new SyncRtSurfaceTransactionApplierCompat(v);
|
|
||||||
final RemoteAnimationTargets targets =
|
final RemoteAnimationTargets targets =
|
||||||
new RemoteAnimationTargets(appTargets, wallpaperTargets, MODE_OPENING);
|
new RemoteAnimationTargets(appTargets, wallpaperTargets, MODE_OPENING);
|
||||||
targets.addDependentTransactionApplier(applier);
|
targets.addReleaseCheck(applier);
|
||||||
|
|
||||||
TransformParams params = new TransformParams()
|
TransformParams params = new TransformParams()
|
||||||
.setSyncTransactionApplier(applier)
|
.setSyncTransactionApplier(applier)
|
||||||
|
|
|
@ -29,6 +29,7 @@ import com.android.launcher3.R;
|
||||||
import com.android.launcher3.Utilities;
|
import com.android.launcher3.Utilities;
|
||||||
import com.android.launcher3.anim.FlingSpringAnim;
|
import com.android.launcher3.anim.FlingSpringAnim;
|
||||||
import com.android.launcher3.util.DynamicResource;
|
import com.android.launcher3.util.DynamicResource;
|
||||||
|
import com.android.quickstep.RemoteAnimationTargets.ReleaseCheck;
|
||||||
import com.android.systemui.plugins.ResourceProvider;
|
import com.android.systemui.plugins.ResourceProvider;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -39,7 +40,7 @@ import java.util.List;
|
||||||
* Applies spring forces to animate from a starting rect to a target rect,
|
* Applies spring forces to animate from a starting rect to a target rect,
|
||||||
* while providing update callbacks to the caller.
|
* while providing update callbacks to the caller.
|
||||||
*/
|
*/
|
||||||
public class RectFSpringAnim {
|
public class RectFSpringAnim extends ReleaseCheck {
|
||||||
|
|
||||||
private static final FloatPropertyCompat<RectFSpringAnim> RECT_CENTER_X =
|
private static final FloatPropertyCompat<RectFSpringAnim> RECT_CENTER_X =
|
||||||
new FloatPropertyCompat<RectFSpringAnim>("rectCenterXSpring") {
|
new FloatPropertyCompat<RectFSpringAnim>("rectCenterXSpring") {
|
||||||
|
@ -116,6 +117,7 @@ public class RectFSpringAnim {
|
||||||
ResourceProvider rp = DynamicResource.provider(context);
|
ResourceProvider rp = DynamicResource.provider(context);
|
||||||
mMinVisChange = rp.getDimension(R.dimen.swipe_up_fling_min_visible_change);
|
mMinVisChange = rp.getDimension(R.dimen.swipe_up_fling_min_visible_change);
|
||||||
mYOvershoot = rp.getDimension(R.dimen.swipe_up_y_overshoot);
|
mYOvershoot = rp.getDimension(R.dimen.swipe_up_y_overshoot);
|
||||||
|
setCanRelease(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onTargetPositionChanged() {
|
public void onTargetPositionChanged() {
|
||||||
|
@ -190,10 +192,12 @@ public class RectFSpringAnim {
|
||||||
maybeOnEnd();
|
maybeOnEnd();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
setCanRelease(false);
|
||||||
|
mAnimsStarted = true;
|
||||||
|
|
||||||
mRectXAnim.start();
|
mRectXAnim.start();
|
||||||
mRectYAnim.start();
|
mRectYAnim.start();
|
||||||
mRectScaleAnim.start();
|
mRectScaleAnim.start();
|
||||||
mAnimsStarted = true;
|
|
||||||
for (Animator.AnimatorListener animatorListener : mAnimatorListeners) {
|
for (Animator.AnimatorListener animatorListener : mAnimatorListeners) {
|
||||||
animatorListener.onAnimationStart(null);
|
animatorListener.onAnimationStart(null);
|
||||||
}
|
}
|
||||||
|
@ -245,6 +249,7 @@ public class RectFSpringAnim {
|
||||||
private void maybeOnEnd() {
|
private void maybeOnEnd() {
|
||||||
if (mAnimsStarted && isEnded()) {
|
if (mAnimsStarted && isEnded()) {
|
||||||
mAnimsStarted = false;
|
mAnimsStarted = false;
|
||||||
|
setCanRelease(true);
|
||||||
for (Animator.AnimatorListener animatorListener : mAnimatorListeners) {
|
for (Animator.AnimatorListener animatorListener : mAnimatorListeners) {
|
||||||
animatorListener.onAnimationEnd(null);
|
animatorListener.onAnimationEnd(null);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,136 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2020 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.
|
||||||
|
*/
|
||||||
|
package com.android.quickstep.util;
|
||||||
|
|
||||||
|
import static com.android.systemui.shared.system.TransactionCompat.deferTransactionUntil;
|
||||||
|
import static com.android.systemui.shared.system.TransactionCompat.setEarlyWakeup;
|
||||||
|
|
||||||
|
import android.annotation.TargetApi;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Message;
|
||||||
|
import android.view.SurfaceControl;
|
||||||
|
import android.view.SurfaceControl.Transaction;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
import com.android.quickstep.RemoteAnimationTargets.ReleaseCheck;
|
||||||
|
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
|
||||||
|
import com.android.systemui.shared.system.ViewRootImplCompat;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper class to apply surface transactions in sync with RenderThread similar to
|
||||||
|
* android.view.SyncRtSurfaceTransactionApplier
|
||||||
|
* with some Launcher specific utility methods
|
||||||
|
*/
|
||||||
|
@TargetApi(Build.VERSION_CODES.R)
|
||||||
|
public class SurfaceTransactionApplier extends ReleaseCheck {
|
||||||
|
|
||||||
|
private static final int MSG_UPDATE_SEQUENCE_NUMBER = 0;
|
||||||
|
|
||||||
|
private final SurfaceControl mBarrierSurfaceControl;
|
||||||
|
private final ViewRootImplCompat mTargetViewRootImpl;
|
||||||
|
private final Handler mApplyHandler;
|
||||||
|
|
||||||
|
private int mLastSequenceNumber = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param targetView The view in the surface that acts as synchronization anchor.
|
||||||
|
*/
|
||||||
|
public SurfaceTransactionApplier(View targetView) {
|
||||||
|
mTargetViewRootImpl = new ViewRootImplCompat(targetView);
|
||||||
|
mBarrierSurfaceControl = mTargetViewRootImpl.getRenderSurfaceControl();
|
||||||
|
mApplyHandler = new Handler(this::onApplyMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean onApplyMessage(Message msg) {
|
||||||
|
if (msg.what == MSG_UPDATE_SEQUENCE_NUMBER) {
|
||||||
|
setCanRelease(msg.arg1 == mLastSequenceNumber);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schedules applying surface parameters on the next frame.
|
||||||
|
*
|
||||||
|
* @param params The surface parameters to apply. DO NOT MODIFY the list after passing into
|
||||||
|
* this method to avoid synchronization issues.
|
||||||
|
*/
|
||||||
|
public void scheduleApply(final SurfaceParams... params) {
|
||||||
|
View view = mTargetViewRootImpl.getView();
|
||||||
|
if (view == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mLastSequenceNumber++;
|
||||||
|
final int toApplySeqNo = mLastSequenceNumber;
|
||||||
|
setCanRelease(false);
|
||||||
|
mTargetViewRootImpl.registerRtFrameCallback(frame -> {
|
||||||
|
if (mBarrierSurfaceControl == null || !mBarrierSurfaceControl.isValid()) {
|
||||||
|
Message.obtain(mApplyHandler, MSG_UPDATE_SEQUENCE_NUMBER, toApplySeqNo, 0)
|
||||||
|
.sendToTarget();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Transaction t = new Transaction();
|
||||||
|
for (int i = params.length - 1; i >= 0; i--) {
|
||||||
|
SurfaceParams surfaceParams = params[i];
|
||||||
|
if (surfaceParams.surface.isValid()) {
|
||||||
|
deferTransactionUntil(t, surfaceParams.surface, mBarrierSurfaceControl, frame);
|
||||||
|
surfaceParams.applyTo(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setEarlyWakeup(t);
|
||||||
|
t.apply();
|
||||||
|
Message.obtain(mApplyHandler, MSG_UPDATE_SEQUENCE_NUMBER, toApplySeqNo, 0)
|
||||||
|
.sendToTarget();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Make sure a frame gets scheduled.
|
||||||
|
view.invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an instance of SyncRtSurfaceTransactionApplier, deferring until the target view is
|
||||||
|
* attached if necessary.
|
||||||
|
*/
|
||||||
|
public static void create(
|
||||||
|
final View targetView, final Consumer<SurfaceTransactionApplier> callback) {
|
||||||
|
if (targetView == null) {
|
||||||
|
// No target view, no applier
|
||||||
|
callback.accept(null);
|
||||||
|
} else if (new ViewRootImplCompat(targetView).isValid()) {
|
||||||
|
// Already attached, we're good to go
|
||||||
|
callback.accept(new SurfaceTransactionApplier(targetView));
|
||||||
|
} else {
|
||||||
|
// Haven't been attached before we can get the view root
|
||||||
|
targetView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
|
||||||
|
@Override
|
||||||
|
public void onViewAttachedToWindow(View v) {
|
||||||
|
targetView.removeOnAttachStateChangeListener(this);
|
||||||
|
callback.accept(new SurfaceTransactionApplier(targetView));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onViewDetachedFromWindow(View v) {
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -57,7 +57,7 @@ public class TransformParams {
|
||||||
private float mTargetAlpha;
|
private float mTargetAlpha;
|
||||||
private float mCornerRadius;
|
private float mCornerRadius;
|
||||||
private RemoteAnimationTargets mTargetSet;
|
private RemoteAnimationTargets mTargetSet;
|
||||||
private SyncRtSurfaceTransactionApplierCompat mSyncTransactionApplier;
|
private SurfaceTransactionApplier mSyncTransactionApplier;
|
||||||
|
|
||||||
private BuilderProxy mHomeBuilderProxy = BuilderProxy.ALWAYS_VISIBLE;
|
private BuilderProxy mHomeBuilderProxy = BuilderProxy.ALWAYS_VISIBLE;
|
||||||
private BuilderProxy mBaseBuilderProxy = BuilderProxy.ALWAYS_VISIBLE;
|
private BuilderProxy mBaseBuilderProxy = BuilderProxy.ALWAYS_VISIBLE;
|
||||||
|
@ -112,7 +112,7 @@ public class TransformParams {
|
||||||
* are computed based on these TransformParams.
|
* are computed based on these TransformParams.
|
||||||
*/
|
*/
|
||||||
public TransformParams setSyncTransactionApplier(
|
public TransformParams setSyncTransactionApplier(
|
||||||
SyncRtSurfaceTransactionApplierCompat applier) {
|
SurfaceTransactionApplier applier) {
|
||||||
mSyncTransactionApplier = applier;
|
mSyncTransactionApplier = applier;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
|
@ -127,6 +127,7 @@ import com.android.quickstep.ViewUtils;
|
||||||
import com.android.quickstep.util.LayoutUtils;
|
import com.android.quickstep.util.LayoutUtils;
|
||||||
import com.android.quickstep.util.RecentsOrientedState;
|
import com.android.quickstep.util.RecentsOrientedState;
|
||||||
import com.android.quickstep.util.SplitScreenBounds;
|
import com.android.quickstep.util.SplitScreenBounds;
|
||||||
|
import com.android.quickstep.util.SurfaceTransactionApplier;
|
||||||
import com.android.quickstep.util.TransformParams;
|
import com.android.quickstep.util.TransformParams;
|
||||||
import com.android.systemui.plugins.ResourceProvider;
|
import com.android.systemui.plugins.ResourceProvider;
|
||||||
import com.android.systemui.shared.recents.IPinnedStackAnimationListener;
|
import com.android.systemui.shared.recents.IPinnedStackAnimationListener;
|
||||||
|
@ -135,7 +136,6 @@ import com.android.systemui.shared.recents.model.ThumbnailData;
|
||||||
import com.android.systemui.shared.system.ActivityManagerWrapper;
|
import com.android.systemui.shared.system.ActivityManagerWrapper;
|
||||||
import com.android.systemui.shared.system.LauncherEventUtil;
|
import com.android.systemui.shared.system.LauncherEventUtil;
|
||||||
import com.android.systemui.shared.system.PackageManagerWrapper;
|
import com.android.systemui.shared.system.PackageManagerWrapper;
|
||||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat;
|
|
||||||
import com.android.systemui.shared.system.TaskStackChangeListener;
|
import com.android.systemui.shared.system.TaskStackChangeListener;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -211,7 +211,7 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
|
||||||
protected final BaseActivityInterface mSizeStrategy;
|
protected final BaseActivityInterface mSizeStrategy;
|
||||||
protected RecentsAnimationController mRecentsAnimationController;
|
protected RecentsAnimationController mRecentsAnimationController;
|
||||||
protected RecentsAnimationTargets mRecentsAnimationTargets;
|
protected RecentsAnimationTargets mRecentsAnimationTargets;
|
||||||
protected SyncRtSurfaceTransactionApplierCompat mSyncTransactionApplier;
|
protected SurfaceTransactionApplier mSyncTransactionApplier;
|
||||||
protected int mTaskWidth;
|
protected int mTaskWidth;
|
||||||
protected int mTaskHeight;
|
protected int mTaskHeight;
|
||||||
protected boolean mEnableDrawingLiveTile = false;
|
protected boolean mEnableDrawingLiveTile = false;
|
||||||
|
@ -502,7 +502,7 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
|
||||||
mModel.getThumbnailCache().getHighResLoadingState().addCallback(this);
|
mModel.getThumbnailCache().getHighResLoadingState().addCallback(this);
|
||||||
mActivity.addMultiWindowModeChangedListener(mMultiWindowModeChangedListener);
|
mActivity.addMultiWindowModeChangedListener(mMultiWindowModeChangedListener);
|
||||||
ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskStackListener);
|
ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskStackListener);
|
||||||
mSyncTransactionApplier = new SyncRtSurfaceTransactionApplierCompat(this);
|
mSyncTransactionApplier = new SurfaceTransactionApplier(this);
|
||||||
RecentsModel.INSTANCE.get(getContext()).addThumbnailChangeListener(this);
|
RecentsModel.INSTANCE.get(getContext()).addThumbnailChangeListener(this);
|
||||||
mIdp.addOnChangeListener(this);
|
mIdp.addOnChangeListener(this);
|
||||||
mIPinnedStackAnimationListener.setActivity(mActivity);
|
mIPinnedStackAnimationListener.setActivity(mActivity);
|
||||||
|
|
|
@ -82,6 +82,7 @@ import com.android.quickstep.RemoteAnimationTargets;
|
||||||
import com.android.quickstep.util.MultiValueUpdateListener;
|
import com.android.quickstep.util.MultiValueUpdateListener;
|
||||||
import com.android.quickstep.util.RemoteAnimationProvider;
|
import com.android.quickstep.util.RemoteAnimationProvider;
|
||||||
import com.android.quickstep.util.StaggeredWorkspaceAnim;
|
import com.android.quickstep.util.StaggeredWorkspaceAnim;
|
||||||
|
import com.android.quickstep.util.SurfaceTransactionApplier;
|
||||||
import com.android.systemui.shared.system.ActivityCompat;
|
import com.android.systemui.shared.system.ActivityCompat;
|
||||||
import com.android.systemui.shared.system.ActivityOptionsCompat;
|
import com.android.systemui.shared.system.ActivityOptionsCompat;
|
||||||
import com.android.systemui.shared.system.QuickStepContract;
|
import com.android.systemui.shared.system.QuickStepContract;
|
||||||
|
@ -89,7 +90,6 @@ import com.android.systemui.shared.system.RemoteAnimationAdapterCompat;
|
||||||
import com.android.systemui.shared.system.RemoteAnimationDefinitionCompat;
|
import com.android.systemui.shared.system.RemoteAnimationDefinitionCompat;
|
||||||
import com.android.systemui.shared.system.RemoteAnimationRunnerCompat;
|
import com.android.systemui.shared.system.RemoteAnimationRunnerCompat;
|
||||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat;
|
|
||||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
|
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
|
||||||
import com.android.systemui.shared.system.WindowManagerWrapper;
|
import com.android.systemui.shared.system.WindowManagerWrapper;
|
||||||
|
|
||||||
|
@ -455,9 +455,9 @@ public abstract class QuickstepAppTransitionManagerImpl extends LauncherAppTrans
|
||||||
|
|
||||||
RemoteAnimationTargets openingTargets = new RemoteAnimationTargets(appTargets,
|
RemoteAnimationTargets openingTargets = new RemoteAnimationTargets(appTargets,
|
||||||
wallpaperTargets, MODE_OPENING);
|
wallpaperTargets, MODE_OPENING);
|
||||||
SyncRtSurfaceTransactionApplierCompat surfaceApplier =
|
SurfaceTransactionApplier surfaceApplier =
|
||||||
new SyncRtSurfaceTransactionApplierCompat(floatingView);
|
new SurfaceTransactionApplier(floatingView);
|
||||||
openingTargets.addDependentTransactionApplier(surfaceApplier);
|
openingTargets.addReleaseCheck(surfaceApplier);
|
||||||
|
|
||||||
// Scale the app icon to take up the entire screen. This simplifies the math when
|
// Scale the app icon to take up the entire screen. This simplifies the math when
|
||||||
// animating the app window position / scale.
|
// animating the app window position / scale.
|
||||||
|
@ -712,8 +712,7 @@ public abstract class QuickstepAppTransitionManagerImpl extends LauncherAppTrans
|
||||||
*/
|
*/
|
||||||
private Animator getUnlockWindowAnimator(RemoteAnimationTargetCompat[] appTargets,
|
private Animator getUnlockWindowAnimator(RemoteAnimationTargetCompat[] appTargets,
|
||||||
RemoteAnimationTargetCompat[] wallpaperTargets) {
|
RemoteAnimationTargetCompat[] wallpaperTargets) {
|
||||||
SyncRtSurfaceTransactionApplierCompat surfaceApplier =
|
SurfaceTransactionApplier surfaceApplier = new SurfaceTransactionApplier(mDragLayer);
|
||||||
new SyncRtSurfaceTransactionApplierCompat(mDragLayer);
|
|
||||||
ValueAnimator unlockAnimator = ValueAnimator.ofFloat(0, 1);
|
ValueAnimator unlockAnimator = ValueAnimator.ofFloat(0, 1);
|
||||||
unlockAnimator.setDuration(CLOSING_TRANSITION_DURATION_MS);
|
unlockAnimator.setDuration(CLOSING_TRANSITION_DURATION_MS);
|
||||||
float cornerRadius = mDeviceProfile.isMultiWindowMode ? 0 :
|
float cornerRadius = mDeviceProfile.isMultiWindowMode ? 0 :
|
||||||
|
@ -741,8 +740,7 @@ public abstract class QuickstepAppTransitionManagerImpl extends LauncherAppTrans
|
||||||
*/
|
*/
|
||||||
private Animator getClosingWindowAnimators(RemoteAnimationTargetCompat[] appTargets,
|
private Animator getClosingWindowAnimators(RemoteAnimationTargetCompat[] appTargets,
|
||||||
RemoteAnimationTargetCompat[] wallpaperTargets) {
|
RemoteAnimationTargetCompat[] wallpaperTargets) {
|
||||||
SyncRtSurfaceTransactionApplierCompat surfaceApplier =
|
SurfaceTransactionApplier surfaceApplier = new SurfaceTransactionApplier(mDragLayer);
|
||||||
new SyncRtSurfaceTransactionApplierCompat(mDragLayer);
|
|
||||||
Matrix matrix = new Matrix();
|
Matrix matrix = new Matrix();
|
||||||
Point tmpPos = new Point();
|
Point tmpPos = new Point();
|
||||||
ValueAnimator closingAnimator = ValueAnimator.ofFloat(0, 1);
|
ValueAnimator closingAnimator = ValueAnimator.ofFloat(0, 1);
|
||||||
|
|
|
@ -16,19 +16,16 @@
|
||||||
package com.android.quickstep;
|
package com.android.quickstep;
|
||||||
|
|
||||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat;
|
|
||||||
|
|
||||||
import java.util.ArrayDeque;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Queue;
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Holds a collection of RemoteAnimationTargets, filtered by different properties.
|
* Holds a collection of RemoteAnimationTargets, filtered by different properties.
|
||||||
*/
|
*/
|
||||||
public class RemoteAnimationTargets {
|
public class RemoteAnimationTargets {
|
||||||
|
|
||||||
private final Queue<SyncRtSurfaceTransactionApplierCompat> mDependentTransactionAppliers =
|
private final CopyOnWriteArrayList<ReleaseCheck> mReleaseChecks = new CopyOnWriteArrayList<>();
|
||||||
new ArrayDeque<>(1);
|
|
||||||
|
|
||||||
public final RemoteAnimationTargetCompat[] unfilteredApps;
|
public final RemoteAnimationTargetCompat[] unfilteredApps;
|
||||||
public final RemoteAnimationTargetCompat[] apps;
|
public final RemoteAnimationTargetCompat[] apps;
|
||||||
|
@ -36,6 +33,8 @@ public class RemoteAnimationTargets {
|
||||||
public final int targetMode;
|
public final int targetMode;
|
||||||
public final boolean hasRecents;
|
public final boolean hasRecents;
|
||||||
|
|
||||||
|
private boolean mReleased = false;
|
||||||
|
|
||||||
public RemoteAnimationTargets(RemoteAnimationTargetCompat[] apps,
|
public RemoteAnimationTargets(RemoteAnimationTargetCompat[] apps,
|
||||||
RemoteAnimationTargetCompat[] wallpapers, int targetMode) {
|
RemoteAnimationTargetCompat[] wallpapers, int targetMode) {
|
||||||
ArrayList<RemoteAnimationTargetCompat> filteredApps = new ArrayList<>();
|
ArrayList<RemoteAnimationTargetCompat> filteredApps = new ArrayList<>();
|
||||||
|
@ -76,21 +75,65 @@ public class RemoteAnimationTargets {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addDependentTransactionApplier(SyncRtSurfaceTransactionApplierCompat delay) {
|
public void addReleaseCheck(ReleaseCheck check) {
|
||||||
mDependentTransactionAppliers.add(delay);
|
mReleaseChecks.add(check);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void release() {
|
public void release() {
|
||||||
SyncRtSurfaceTransactionApplierCompat applier = mDependentTransactionAppliers.poll();
|
if (mReleased) {
|
||||||
if (applier == null) {
|
return;
|
||||||
for (RemoteAnimationTargetCompat target : unfilteredApps) {
|
}
|
||||||
target.release();
|
for (ReleaseCheck check : mReleaseChecks) {
|
||||||
|
if (!check.mCanRelease) {
|
||||||
|
check.addOnSafeToReleaseCallback(this::release);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
for (RemoteAnimationTargetCompat target : wallpapers) {
|
}
|
||||||
target.release();
|
mReleaseChecks.clear();
|
||||||
|
mReleased = true;
|
||||||
|
|
||||||
|
for (RemoteAnimationTargetCompat target : unfilteredApps) {
|
||||||
|
target.release();
|
||||||
|
}
|
||||||
|
for (RemoteAnimationTargetCompat target : wallpapers) {
|
||||||
|
target.release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface for intercepting surface release method
|
||||||
|
*/
|
||||||
|
public static class ReleaseCheck {
|
||||||
|
|
||||||
|
boolean mCanRelease = false;
|
||||||
|
private Runnable mAfterApplyCallback;
|
||||||
|
|
||||||
|
protected void setCanRelease(boolean canRelease) {
|
||||||
|
mCanRelease = canRelease;
|
||||||
|
if (mCanRelease && mAfterApplyCallback != null) {
|
||||||
|
Runnable r = mAfterApplyCallback;
|
||||||
|
mAfterApplyCallback = null;
|
||||||
|
r.run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a callback to notify when the surface can safely be released
|
||||||
|
*/
|
||||||
|
void addOnSafeToReleaseCallback(Runnable callback) {
|
||||||
|
if (mCanRelease) {
|
||||||
|
callback.run();
|
||||||
|
} else {
|
||||||
|
if (mAfterApplyCallback == null) {
|
||||||
|
mAfterApplyCallback = callback;
|
||||||
|
} else {
|
||||||
|
final Runnable oldCallback = mAfterApplyCallback;
|
||||||
|
mAfterApplyCallback = () -> {
|
||||||
|
callback.run();
|
||||||
|
oldCallback.run();
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
applier.addAfterApplyCallback(this::release);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,6 @@ shadows= \
|
||||||
com.android.launcher3.shadows.ShadowLooperExecutor \
|
com.android.launcher3.shadows.ShadowLooperExecutor \
|
||||||
com.android.launcher3.shadows.ShadowMainThreadInitializedObject \
|
com.android.launcher3.shadows.ShadowMainThreadInitializedObject \
|
||||||
com.android.launcher3.shadows.ShadowOverrides \
|
com.android.launcher3.shadows.ShadowOverrides \
|
||||||
com.android.launcher3.shadows.ShadowSyncRtSurfaceTransactionApplierCompat \
|
com.android.launcher3.shadows.ShadowSurfaceTransactionApplier \
|
||||||
|
|
||||||
application=com.android.launcher3.util.LauncherTestApplication
|
application=com.android.launcher3.util.LauncherTestApplication
|
|
@ -26,11 +26,11 @@ import org.robolectric.annotation.Implements;
|
||||||
import org.robolectric.annotation.RealObject;
|
import org.robolectric.annotation.RealObject;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shadow for SyncRtSurfaceTransactionApplierCompat to override default functionality
|
* Shadow for SurfaceTransactionApplier to override default functionality
|
||||||
*/
|
*/
|
||||||
@Implements(className = "com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat",
|
@Implements(className = "com.android.quickstep.util.SurfaceTransactionApplier",
|
||||||
isInAndroidSdk = false)
|
isInAndroidSdk = false)
|
||||||
public class ShadowSyncRtSurfaceTransactionApplierCompat {
|
public class ShadowSurfaceTransactionApplier {
|
||||||
|
|
||||||
@RealObject
|
@RealObject
|
||||||
private Object mRealObject;
|
private Object mRealObject;
|
Loading…
Reference in New Issue