Fixing task window is not getting alpha set properly when long-swiping

We were setting the alpha of the target window to 0 on the UI thread, and setting it
back to 1, through ClipAnimationHelper on background thread

Bug:109701914
Change-Id: I4abb73298b5e957a66f91c5654b184cdd398724b
This commit is contained in:
Sunny Goyal 2018-06-04 17:35:29 -07:00
parent af19ffff62
commit d01a28758d
2 changed files with 20 additions and 32 deletions

View File

@ -20,11 +20,8 @@ import static com.android.launcher3.LauncherState.ALL_APPS;
import static com.android.launcher3.LauncherState.OVERVIEW;
import static com.android.launcher3.anim.Interpolators.DEACCEL;
import static com.android.quickstep.WindowTransformSwipeHandler.MAX_SWIPE_DURATION;
import static com.android.systemui.shared.recents.utilities.Utilities.getNextFrameNumber;
import static com.android.systemui.shared.recents.utilities.Utilities.getSurface;
import android.animation.ValueAnimator;
import android.view.Surface;
import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherAnimUtils;
@ -39,7 +36,6 @@ import com.android.launcher3.util.FlingBlockCheck;
import com.android.quickstep.util.RemoteAnimationTargetSet;
import com.android.quickstep.views.RecentsView;
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
import com.android.systemui.shared.system.TransactionCompat;
/**
* Utility class to handle long swipe from an app.
@ -65,7 +61,6 @@ public class LongSwipeHelper {
}
private void init() {
setTargetAlpha(0, true);
mFlingBlockCheck.blockFling();
// Init animations
@ -83,8 +78,7 @@ public class LongSwipeHelper {
}
public void destroy() {
// TODO: We can probably also hide the task view
setTargetAlpha(1, false);
// TODO: We can probably also show the task view
mLauncher.getStateManager().goToState(OVERVIEW, false);
}
@ -136,31 +130,6 @@ public class LongSwipeHelper {
animator.start();
}
private void setTargetAlpha(float alpha, boolean defer) {
final Surface surface = getSurface(mLauncher.getDragLayer());
final long frameNumber = defer && surface != null ? getNextFrameNumber(surface) : -1;
if (defer) {
if (frameNumber == -1) {
defer = false;
} else {
mLauncher.getDragLayer().invalidate();
}
}
TransactionCompat transaction = new TransactionCompat();
for (RemoteAnimationTargetCompat app : mTargetSet.apps) {
if (!(app.isNotInRecents
|| app.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME)) {
transaction.setAlpha(app.leash, alpha);
if (defer) {
transaction.deferTransactionUntil(app.leash, surface, frameNumber);
}
}
}
transaction.setEarlyWakeup();
transaction.apply();
}
private void onSwipeAnimationComplete(boolean toAllApps, boolean isFling, Runnable callback) {
mLauncher.getStateManager().goToState(toAllApps ? ALL_APPS : OVERVIEW, false);
if (!toAllApps) {
@ -176,4 +145,12 @@ public class LongSwipeHelper {
callback.run();
}
public float getTargetAlpha(RemoteAnimationTargetCompat app, Float expectedAlpha) {
if (!(app.isNotInRecents
|| app.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME)) {
return 0;
}
return expectedAlpha;
}
}

View File

@ -85,6 +85,7 @@ import com.android.systemui.shared.system.WindowCallbacksCompat;
import com.android.systemui.shared.system.WindowManagerWrapper;
import java.util.StringJoiner;
import java.util.function.BiFunction;
@TargetApi(Build.VERSION_CODES.O)
public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> {
@ -927,6 +928,7 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> {
if (mLongSwipeController != null) {
mLongSwipeController.destroy();
setTargetAlphaProvider((t, a1) -> a1);
// Rebuild animations
buildAnimationController();
@ -968,6 +970,7 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> {
mLongSwipeController = mActivityControlHelper.getLongSwipeController(
mActivity, mRecentsAnimationWrapper.targetSet);
onLongSwipeDisplacementUpdated();
setTargetAlphaProvider(mLongSwipeController::getTargetAlpha);
}
private void onLongSwipeGestureFinishUi(float velocity, boolean isFling) {
@ -982,4 +985,12 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> {
() -> setStateOnUiThread(STATE_HANDLER_INVALIDATED));
}
private void setTargetAlphaProvider(
BiFunction<RemoteAnimationTargetCompat, Float, Float> provider) {
mClipAnimationHelper.setTaskAlphaCallback(provider);
// TODO: For some reason, when calling updateFinalShift multiple times on the same frame,
// only the first callback is executed.
Utilities.postAsyncCallback(mMainThreadHandler, this::updateFinalShift);
}
}