Wait for the Launcher activity to bind to TIS before animating
- Mainly a test issue where we destroy the activity and immediately enter overview without preloading launcher. In this case, the task bar does not animate due to the delayed cycled of activity create -> bind service -> service connected -> taskbar ui controller init. As a result, the bar can occlude content from Launcher preventing the test from finding the overview actions. Instead, in cases where we need to animate with launcher, we wait for Launcher to be created (generally already the case) and the service has bound before proceeding. Bug: 189807374 Bug: 204891006 Test: atest NexusLauncherTests:com.android.quickstep.StartLauncherViaGestureTests Change-Id: I2cfccae67ac0e5a591639c6c99df032451dae16d
This commit is contained in:
parent
be0360c6d8
commit
8581dfc218
|
@ -320,6 +320,11 @@ public abstract class BaseQuickstepLauncher extends Launcher
|
|||
mOverviewCommandHelper = binder.getOverviewCommandHelper();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void runOnBindToTouchInteractionService(Runnable r) {
|
||||
mTISBindHelper.runOnBindToTouchInteractionService(r);
|
||||
}
|
||||
|
||||
private void initUnfoldTransitionProgressProvider() {
|
||||
final UnfoldTransitionConfig config = UnfoldTransitionFactory.createConfig(this);
|
||||
if (config.isEnabled()) {
|
||||
|
|
|
@ -180,45 +180,51 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
|
|||
getFlagForIndex(0, "STATE_LAUNCHER_PRESENT");
|
||||
protected static final int STATE_LAUNCHER_STARTED =
|
||||
getFlagForIndex(1, "STATE_LAUNCHER_STARTED");
|
||||
protected static final int STATE_LAUNCHER_DRAWN = getFlagForIndex(2, "STATE_LAUNCHER_DRAWN");
|
||||
protected static final int STATE_LAUNCHER_DRAWN =
|
||||
getFlagForIndex(2, "STATE_LAUNCHER_DRAWN");
|
||||
// Called when the Launcher has connected to the touch interaction service (and the taskbar
|
||||
// ui controller is initialized)
|
||||
protected static final int STATE_LAUNCHER_BIND_TO_SERVICE =
|
||||
getFlagForIndex(3, "STATE_LAUNCHER_BIND_TO_SERVICE");
|
||||
|
||||
// Internal initialization states
|
||||
private static final int STATE_APP_CONTROLLER_RECEIVED =
|
||||
getFlagForIndex(3, "STATE_APP_CONTROLLER_RECEIVED");
|
||||
getFlagForIndex(4, "STATE_APP_CONTROLLER_RECEIVED");
|
||||
|
||||
// Interaction finish states
|
||||
private static final int STATE_SCALED_CONTROLLER_HOME =
|
||||
getFlagForIndex(4, "STATE_SCALED_CONTROLLER_HOME");
|
||||
getFlagForIndex(5, "STATE_SCALED_CONTROLLER_HOME");
|
||||
private static final int STATE_SCALED_CONTROLLER_RECENTS =
|
||||
getFlagForIndex(5, "STATE_SCALED_CONTROLLER_RECENTS");
|
||||
getFlagForIndex(6, "STATE_SCALED_CONTROLLER_RECENTS");
|
||||
|
||||
protected static final int STATE_HANDLER_INVALIDATED =
|
||||
getFlagForIndex(6, "STATE_HANDLER_INVALIDATED");
|
||||
getFlagForIndex(7, "STATE_HANDLER_INVALIDATED");
|
||||
private static final int STATE_GESTURE_STARTED =
|
||||
getFlagForIndex(7, "STATE_GESTURE_STARTED");
|
||||
getFlagForIndex(8, "STATE_GESTURE_STARTED");
|
||||
private static final int STATE_GESTURE_CANCELLED =
|
||||
getFlagForIndex(8, "STATE_GESTURE_CANCELLED");
|
||||
getFlagForIndex(9, "STATE_GESTURE_CANCELLED");
|
||||
private static final int STATE_GESTURE_COMPLETED =
|
||||
getFlagForIndex(9, "STATE_GESTURE_COMPLETED");
|
||||
getFlagForIndex(10, "STATE_GESTURE_COMPLETED");
|
||||
|
||||
private static final int STATE_CAPTURE_SCREENSHOT =
|
||||
getFlagForIndex(10, "STATE_CAPTURE_SCREENSHOT");
|
||||
getFlagForIndex(11, "STATE_CAPTURE_SCREENSHOT");
|
||||
protected static final int STATE_SCREENSHOT_CAPTURED =
|
||||
getFlagForIndex(11, "STATE_SCREENSHOT_CAPTURED");
|
||||
getFlagForIndex(12, "STATE_SCREENSHOT_CAPTURED");
|
||||
private static final int STATE_SCREENSHOT_VIEW_SHOWN =
|
||||
getFlagForIndex(12, "STATE_SCREENSHOT_VIEW_SHOWN");
|
||||
getFlagForIndex(13, "STATE_SCREENSHOT_VIEW_SHOWN");
|
||||
|
||||
private static final int STATE_RESUME_LAST_TASK =
|
||||
getFlagForIndex(13, "STATE_RESUME_LAST_TASK");
|
||||
getFlagForIndex(14, "STATE_RESUME_LAST_TASK");
|
||||
private static final int STATE_START_NEW_TASK =
|
||||
getFlagForIndex(14, "STATE_START_NEW_TASK");
|
||||
getFlagForIndex(15, "STATE_START_NEW_TASK");
|
||||
private static final int STATE_CURRENT_TASK_FINISHED =
|
||||
getFlagForIndex(15, "STATE_CURRENT_TASK_FINISHED");
|
||||
getFlagForIndex(16, "STATE_CURRENT_TASK_FINISHED");
|
||||
private static final int STATE_FINISH_WITH_NO_END =
|
||||
getFlagForIndex(16, "STATE_FINISH_WITH_NO_END");
|
||||
getFlagForIndex(17, "STATE_FINISH_WITH_NO_END");
|
||||
|
||||
private static final int LAUNCHER_UI_STATES =
|
||||
STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_DRAWN | STATE_LAUNCHER_STARTED;
|
||||
STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_DRAWN | STATE_LAUNCHER_STARTED |
|
||||
STATE_LAUNCHER_BIND_TO_SERVICE;
|
||||
|
||||
public static final long MAX_SWIPE_DURATION = 350;
|
||||
public static final long HOME_DURATION = StaggeredWorkspaceAnim.DURATION_MS;
|
||||
|
@ -429,6 +435,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
|
|||
|
||||
setupRecentsViewUi();
|
||||
linkRecentsViewScroll();
|
||||
activity.runOnBindToTouchInteractionService(this::onLauncherBindToService);
|
||||
|
||||
mActivity.registerActivityLifecycleCallbacks(mLifecycleCallbacks);
|
||||
return true;
|
||||
|
@ -510,6 +517,11 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
|
|||
mStateCallback.setState(STATE_LAUNCHER_STARTED);
|
||||
}
|
||||
|
||||
private void onLauncherBindToService() {
|
||||
mStateCallback.setState(STATE_LAUNCHER_BIND_TO_SERVICE);
|
||||
flushOnRecentsAnimationAndLauncherBound();
|
||||
}
|
||||
|
||||
private void onLauncherPresentAndGestureStarted() {
|
||||
// Re-setup the recents UI when gesture starts, as the state could have been changed during
|
||||
// that time by a previous window transition.
|
||||
|
@ -812,12 +824,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
|
|||
}
|
||||
|
||||
// Notify when the animation starts
|
||||
if (!mRecentsAnimationStartCallbacks.isEmpty()) {
|
||||
for (Runnable action : new ArrayList<>(mRecentsAnimationStartCallbacks)) {
|
||||
action.run();
|
||||
}
|
||||
mRecentsAnimationStartCallbacks.clear();
|
||||
}
|
||||
flushOnRecentsAnimationAndLauncherBound();
|
||||
|
||||
TaskViewUtils.setSplitAuxiliarySurfacesShown(mRecentsAnimationTargets.nonApps, false);
|
||||
|
||||
|
@ -1195,7 +1202,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
|
|||
@UiThread
|
||||
private void animateToProgress(float start, float end, long duration, Interpolator interpolator,
|
||||
GestureEndTarget target, PointF velocityPxPerMs) {
|
||||
runOnRecentsAnimationStart(() -> animateToProgressInternal(start, end, duration,
|
||||
runOnRecentsAnimationAndLauncherBound(() -> animateToProgressInternal(start, end, duration,
|
||||
interpolator, target, velocityPxPerMs));
|
||||
}
|
||||
|
||||
|
@ -1820,12 +1827,12 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
|
|||
SurfaceTransactionApplier.create(mRecentsView, applier -> {
|
||||
runActionOnRemoteHandles(remoteTargetHandle -> remoteTargetHandle.getTransformParams()
|
||||
.setSyncTransactionApplier(applier));
|
||||
runOnRecentsAnimationStart(() ->
|
||||
runOnRecentsAnimationAndLauncherBound(() ->
|
||||
mRecentsAnimationTargets.addReleaseCheck(applier));
|
||||
});
|
||||
|
||||
mRecentsView.addOnScrollChangedListener(mOnRecentsScrollListener);
|
||||
runOnRecentsAnimationStart(() ->
|
||||
runOnRecentsAnimationAndLauncherBound(() ->
|
||||
mRecentsView.setRecentsAnimationTargets(mRecentsAnimationController,
|
||||
mRecentsAnimationTargets));
|
||||
mRecentsViewScrollLinked = true;
|
||||
|
@ -1871,14 +1878,26 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
|
|||
}
|
||||
|
||||
/**
|
||||
* Runs the given {@param action} if the recents animation has already started, or queues it to
|
||||
* be run when it is next started.
|
||||
* Runs the given {@param action} if the recents animation has already started and Launcher has
|
||||
* been created and bound to the TouchInteractionService, or queues it to be run when it this
|
||||
* next happens.
|
||||
*/
|
||||
protected void runOnRecentsAnimationStart(Runnable action) {
|
||||
if (mRecentsAnimationTargets == null) {
|
||||
mRecentsAnimationStartCallbacks.add(action);
|
||||
} else {
|
||||
action.run();
|
||||
private void runOnRecentsAnimationAndLauncherBound(Runnable action) {
|
||||
mRecentsAnimationStartCallbacks.add(action);
|
||||
flushOnRecentsAnimationAndLauncherBound();
|
||||
}
|
||||
|
||||
private void flushOnRecentsAnimationAndLauncherBound() {
|
||||
if (mRecentsAnimationTargets == null ||
|
||||
!mStateCallback.hasStates(STATE_LAUNCHER_BIND_TO_SERVICE)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!mRecentsAnimationStartCallbacks.isEmpty()) {
|
||||
for (Runnable action : new ArrayList<>(mRecentsAnimationStartCallbacks)) {
|
||||
action.run();
|
||||
}
|
||||
mRecentsAnimationStartCallbacks.clear();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -141,6 +141,11 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> {
|
|||
mTaskbarManager.setActivity(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void runOnBindToTouchInteractionService(Runnable r) {
|
||||
mTISBindHelper.runOnBindToTouchInteractionService(r);
|
||||
}
|
||||
|
||||
public void setTaskbarUIController(FallbackTaskbarUIController taskbarUIController) {
|
||||
mTaskbarUIController = taskbarUIController;
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@ import android.util.Log;
|
|||
import com.android.quickstep.TouchInteractionService;
|
||||
import com.android.quickstep.TouchInteractionService.TISBinder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
|
@ -44,9 +45,11 @@ public class TISBindHelper implements ServiceConnection {
|
|||
private final Runnable mConnectionRunnable = this::internalBindToTIS;
|
||||
private final Context mContext;
|
||||
private final Consumer<TISBinder> mConnectionCallback;
|
||||
private final ArrayList<Runnable> mPendingConnectedCallbacks = new ArrayList<>();
|
||||
|
||||
private short mConnectionAttempts;
|
||||
private boolean mTisServiceBound;
|
||||
private boolean mIsConnected;
|
||||
|
||||
public TISBindHelper(Context context, Consumer<TISBinder> connectionCallback) {
|
||||
mContext = context;
|
||||
|
@ -66,7 +69,13 @@ public class TISBindHelper implements ServiceConnection {
|
|||
}
|
||||
|
||||
Log.d(TAG, "TIS service connected");
|
||||
mIsConnected = true;
|
||||
mConnectionCallback.accept((TISBinder) iBinder);
|
||||
// Flush the pending callbacks
|
||||
for (Runnable r : mPendingConnectedCallbacks) {
|
||||
r.run();
|
||||
}
|
||||
mPendingConnectedCallbacks.clear();
|
||||
resetServiceBindRetryState();
|
||||
}
|
||||
|
||||
|
@ -79,6 +88,16 @@ public class TISBindHelper implements ServiceConnection {
|
|||
internalBindToTIS();
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs the given {@param r} runnable when the service is connected.
|
||||
*/
|
||||
public void runOnBindToTouchInteractionService(Runnable r) {
|
||||
if (mIsConnected) {
|
||||
r.run();
|
||||
} else {
|
||||
mPendingConnectedCallbacks.add(r);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Binds to {@link TouchInteractionService}. If the binding fails, attempts to retry via
|
||||
|
@ -120,5 +139,7 @@ public class TISBindHelper implements ServiceConnection {
|
|||
public void onDestroy() {
|
||||
internalUnbindToTIS();
|
||||
resetServiceBindRetryState();
|
||||
mIsConnected = false;
|
||||
mPendingConnectedCallbacks.clear();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -185,4 +185,11 @@ public abstract class StatefulActivity<STATE_TYPE extends BaseState<STATE_TYPE>>
|
|||
@RequiresApi(api = Build.VERSION_CODES.R)
|
||||
public void updateWindowInsets(WindowInsets.Builder updatedInsetsBuilder,
|
||||
WindowInsets oldInsets) { }
|
||||
|
||||
/**
|
||||
* Runs the given {@param r} runnable when this activity binds to the touch interaction service.
|
||||
*/
|
||||
public void runOnBindToTouchInteractionService(Runnable r) {
|
||||
r.run();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue