diff --git a/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java b/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java index 880aa6f97b..95a94ec149 100644 --- a/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java +++ b/quickstep/src/com/android/launcher3/LauncherAnimationRunner.java @@ -55,7 +55,7 @@ import java.lang.ref.WeakReference; * reference to the runner, leaving only the weak ref from the runner. */ @TargetApi(Build.VERSION_CODES.P) -public class LauncherAnimationRunner implements RemoteAnimationRunnerCompat { +public class LauncherAnimationRunner extends RemoteAnimationRunnerCompat { private static final RemoteAnimationFactory DEFAULT_FACTORY = (transit, appTargets, wallpaperTargets, nonAppTargets, result) -> @@ -99,22 +99,6 @@ public class LauncherAnimationRunner implements RemoteAnimationRunnerCompat { } } - // Called only in R platform - @BinderThread - public void onAnimationStart(RemoteAnimationTarget[] appTargets, - RemoteAnimationTarget[] wallpaperTargets, Runnable runnable) { - onAnimationStart(0 /* transit */, appTargets, wallpaperTargets, - new RemoteAnimationTarget[0], runnable); - } - - // Called only in Q platform - @BinderThread - @Deprecated - public void onAnimationStart(RemoteAnimationTarget[] appTargets, Runnable runnable) { - onAnimationStart(appTargets, new RemoteAnimationTarget[0], runnable); - } - - private RemoteAnimationFactory getFactory() { RemoteAnimationFactory factory = mFactory.get(); return factory != null ? factory : DEFAULT_FACTORY; @@ -133,7 +117,7 @@ public class LauncherAnimationRunner implements RemoteAnimationRunnerCompat { */ @BinderThread @Override - public void onAnimationCancelled() { + public void onAnimationCancelled(boolean isKeyguardOccluded) { postAsyncCallback(mHandler, () -> { finishExistingAnimation(); getFactory().onAnimationCancelled(); diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java index 938aa5e834..018a32fd9a 100644 --- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java +++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java @@ -16,11 +16,19 @@ package com.android.launcher3; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.provider.Settings.Secure.LAUNCHER_TASKBAR_EDUCATION_SHOWING; import static android.view.RemoteAnimationTarget.MODE_CLOSING; import static android.view.RemoteAnimationTarget.MODE_OPENING; +import static android.view.WindowManager.TRANSIT_CLOSE; +import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY; +import static android.view.WindowManager.TRANSIT_OPEN; +import static android.view.WindowManager.TRANSIT_TO_BACK; +import static android.view.WindowManager.TRANSIT_TO_FRONT; import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_NONE; import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_SPLASH_SCREEN; +import static android.window.TransitionFilter.CONTAINER_ORDER_TOP; import static com.android.launcher3.BaseActivity.INVISIBLE_ALL; import static com.android.launcher3.BaseActivity.INVISIBLE_BY_APP_TRANSITIONS; @@ -81,6 +89,8 @@ import android.provider.Settings; import android.util.Pair; import android.util.Size; import android.view.CrossWindowBlurListeners; +import android.view.RemoteAnimationAdapter; +import android.view.RemoteAnimationDefinition; import android.view.RemoteAnimationTarget; import android.view.SurfaceControl; import android.view.View; @@ -90,6 +100,8 @@ import android.view.WindowManager; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; import android.view.animation.PathInterpolator; +import android.window.RemoteTransition; +import android.window.TransitionFilter; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -134,10 +146,7 @@ import com.android.quickstep.views.RecentsView; import com.android.systemui.shared.system.BlurUtils; import com.android.systemui.shared.system.InteractionJankMonitorWrapper; import com.android.systemui.shared.system.QuickStepContract; -import com.android.systemui.shared.system.RemoteAnimationAdapterCompat; -import com.android.systemui.shared.system.RemoteAnimationDefinitionCompat; import com.android.systemui.shared.system.RemoteAnimationRunnerCompat; -import com.android.systemui.shared.system.RemoteTransitionCompat; import com.android.wm.shell.startingsurface.IStartingWindowListener; import java.util.ArrayList; @@ -216,7 +225,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener private RemoteAnimationFactory mKeyguardGoingAwayRunner; private RemoteAnimationFactory mWallpaperOpenTransitionRunner; - private RemoteTransitionCompat mLauncherOpenTransition; + private RemoteTransition mLauncherOpenTransition; private LauncherBackAnimationController mBackAnimationController; private final AnimatorListenerAdapter mForceInvisibleListener = new AnimatorListenerAdapter() { @@ -293,12 +302,10 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener long statusBarTransitionDelay = duration - STATUS_BAR_TRANSITION_DURATION - STATUS_BAR_TRANSITION_PRE_DELAY; - RemoteAnimationAdapterCompat adapterCompat = - new RemoteAnimationAdapterCompat(runner, duration, statusBarTransitionDelay, - mLauncher.getIApplicationThread()); ActivityOptions options = ActivityOptions.makeRemoteAnimation( - adapterCompat.getWrapped(), - adapterCompat.getRemoteTransition().getTransition()); + new RemoteAnimationAdapter(runner, duration, statusBarTransitionDelay), + new RemoteTransition(runner.toRemoteTransition(), + mLauncher.getIApplicationThread())); return new ActivityOptionsWrapper(options, onEndCallback); } @@ -1095,28 +1102,26 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener if (hasControlRemoteAppTransitionPermission()) { mWallpaperOpenRunner = createWallpaperOpenRunner(false /* fromUnlock */); - RemoteAnimationDefinitionCompat definition = new RemoteAnimationDefinitionCompat(); + RemoteAnimationDefinition definition = new RemoteAnimationDefinition(); definition.addRemoteAnimation(WindowManager.TRANSIT_OLD_WALLPAPER_OPEN, WindowConfiguration.ACTIVITY_TYPE_STANDARD, - new RemoteAnimationAdapterCompat( + new RemoteAnimationAdapter( new LauncherAnimationRunner(mHandler, mWallpaperOpenRunner, false /* startAtFrontOfQueue */), - CLOSING_TRANSITION_DURATION_MS, 0 /* statusBarTransitionDelay */, - mLauncher.getIApplicationThread())); + CLOSING_TRANSITION_DURATION_MS, 0 /* statusBarTransitionDelay */)); if (KEYGUARD_ANIMATION.get()) { mKeyguardGoingAwayRunner = createWallpaperOpenRunner(true /* fromUnlock */); definition.addRemoteAnimation( WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER, - new RemoteAnimationAdapterCompat( + new RemoteAnimationAdapter( new LauncherAnimationRunner( mHandler, mKeyguardGoingAwayRunner, true /* startAtFrontOfQueue */), - CLOSING_TRANSITION_DURATION_MS, 0 /* statusBarTransitionDelay */, - mLauncher.getIApplicationThread())); + CLOSING_TRANSITION_DURATION_MS, 0 /* statusBarTransitionDelay */)); } - mLauncher.registerRemoteAnimations(definition.getWrapped()); + mLauncher.registerRemoteAnimations(definition); } } @@ -1129,11 +1134,25 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener } if (hasControlRemoteAppTransitionPermission()) { mWallpaperOpenTransitionRunner = createWallpaperOpenRunner(false /* fromUnlock */); - mLauncherOpenTransition = RemoteAnimationAdapterCompat.buildRemoteTransition( + mLauncherOpenTransition = new RemoteTransition( new LauncherAnimationRunner(mHandler, mWallpaperOpenTransitionRunner, - false /* startAtFrontOfQueue */), mLauncher.getIApplicationThread()); - mLauncherOpenTransition.addHomeOpenCheck(mLauncher.getComponentName()); - SystemUiProxy.INSTANCE.get(mLauncher).registerRemoteTransition(mLauncherOpenTransition); + false /* startAtFrontOfQueue */).toRemoteTransition(), + mLauncher.getIApplicationThread()); + + TransitionFilter homeCheck = new TransitionFilter(); + // No need to handle the transition that also dismisses keyguard. + homeCheck.mNotFlags = TRANSIT_FLAG_KEYGUARD_GOING_AWAY; + homeCheck.mRequirements = + new TransitionFilter.Requirement[]{new TransitionFilter.Requirement(), + new TransitionFilter.Requirement()}; + homeCheck.mRequirements[0].mActivityType = ACTIVITY_TYPE_HOME; + homeCheck.mRequirements[0].mTopActivity = mLauncher.getComponentName(); + homeCheck.mRequirements[0].mModes = new int[]{TRANSIT_OPEN, TRANSIT_TO_FRONT}; + homeCheck.mRequirements[0].mOrder = CONTAINER_ORDER_TOP; + homeCheck.mRequirements[1].mActivityType = ACTIVITY_TYPE_STANDARD; + homeCheck.mRequirements[1].mModes = new int[]{TRANSIT_CLOSE, TRANSIT_TO_BACK}; + SystemUiProxy.INSTANCE.get(mLauncher) + .registerRemoteTransition(mLauncherOpenTransition, homeCheck); } if (mBackAnimationController != null) { mBackAnimationController.registerBackCallbacks(mHandler); diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index 97ce30fda7..dc405ff8ba 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -37,9 +37,11 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.view.Display; +import android.view.RemoteAnimationAdapter; import android.view.RemoteAnimationTarget; import android.view.SurfaceControl.Transaction; import android.view.View; +import android.window.RemoteTransition; import android.window.SplashScreen; import androidx.annotation.Nullable; @@ -79,7 +81,6 @@ import com.android.quickstep.util.TISBindHelper; import com.android.quickstep.views.OverviewActionsView; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; -import com.android.systemui.shared.system.RemoteAnimationAdapterCompat; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -259,13 +260,11 @@ public final class RecentsActivity extends StatefulActivity { final LauncherAnimationRunner wrapper = new LauncherAnimationRunner( mUiHandler, mActivityLaunchAnimationRunner, true /* startAtFrontOfQueue */); - RemoteAnimationAdapterCompat adapterCompat = new RemoteAnimationAdapterCompat( - wrapper, RECENTS_LAUNCH_DURATION, - RECENTS_LAUNCH_DURATION - STATUS_BAR_TRANSITION_DURATION - - STATUS_BAR_TRANSITION_PRE_DELAY, getIApplicationThread()); final ActivityOptions options = ActivityOptions.makeRemoteAnimation( - adapterCompat.getWrapped(), - adapterCompat.getRemoteTransition().getTransition()); + new RemoteAnimationAdapter(wrapper, RECENTS_LAUNCH_DURATION, + RECENTS_LAUNCH_DURATION - STATUS_BAR_TRANSITION_DURATION + - STATUS_BAR_TRANSITION_PRE_DELAY), + new RemoteTransition(wrapper.toRemoteTransition(), getIApplicationThread())); final ActivityOptionsWrapper activityOptions = new ActivityOptionsWrapper(options, onEndCallback); activityOptions.options.setSplashScreenStyle(SplashScreen.SPLASH_SCREEN_STYLE_ICON); @@ -401,12 +400,9 @@ public final class RecentsActivity extends StatefulActivity { private void startHomeInternal() { LauncherAnimationRunner runner = new LauncherAnimationRunner( getMainThreadHandler(), mAnimationToHomeFactory, true); - RemoteAnimationAdapterCompat adapterCompat = - new RemoteAnimationAdapterCompat(runner, HOME_APPEAR_DURATION, 0, - getIApplicationThread()); ActivityOptions options = ActivityOptions.makeRemoteAnimation( - adapterCompat.getWrapped(), - adapterCompat.getRemoteTransition().getTransition()); + new RemoteAnimationAdapter(runner, HOME_APPEAR_DURATION, 0), + new RemoteTransition(runner.toRemoteTransition(), getIApplicationThread())); startHomeIntentSafely(this, options.toBundle()); } diff --git a/quickstep/src/com/android/quickstep/SystemUiProxy.java b/quickstep/src/com/android/quickstep/SystemUiProxy.java index 8d9f11db8c..4b87d577ea 100644 --- a/quickstep/src/com/android/quickstep/SystemUiProxy.java +++ b/quickstep/src/com/android/quickstep/SystemUiProxy.java @@ -44,6 +44,8 @@ import android.view.RemoteAnimationAdapter; import android.view.RemoteAnimationTarget; import android.view.SurfaceControl; import android.window.IOnBackInvokedCallback; +import android.window.RemoteTransition; +import android.window.TransitionFilter; import androidx.annotation.Nullable; import androidx.annotation.WorkerThread; @@ -53,7 +55,6 @@ import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.util.SplitConfigurationOptions; import com.android.systemui.shared.recents.ISystemUiProxy; import com.android.systemui.shared.recents.model.Task; -import com.android.systemui.shared.system.RemoteTransitionCompat; import com.android.systemui.shared.system.smartspace.ILauncherUnlockAnimationController; import com.android.systemui.shared.system.smartspace.ISysuiUnlockAnimationController; import com.android.systemui.shared.system.smartspace.SmartspaceState; @@ -73,6 +74,7 @@ import com.android.wm.shell.util.GroupedRecentTaskInfo; import java.util.ArrayList; import java.util.Arrays; +import java.util.LinkedHashMap; /** * Holds the reference to SystemUI. @@ -108,7 +110,8 @@ public class SystemUiProxy implements ISystemUiProxy { private IStartingWindowListener mStartingWindowListener; private ILauncherUnlockAnimationController mLauncherUnlockAnimationController; private IRecentTasksListener mRecentTasksListener; - private final ArrayList mRemoteTransitions = new ArrayList<>(); + private final LinkedHashMap mRemoteTransitions = + new LinkedHashMap<>(); private IOnBackInvokedCallback mBackToLauncherCallback; // Used to dedupe calls to SystemUI @@ -195,9 +198,7 @@ public class SystemUiProxy implements ISystemUiProxy { if (mSysuiUnlockAnimationController != null && mLauncherUnlockAnimationController != null) { setLauncherUnlockAnimationController(mLauncherUnlockAnimationController); } - for (int i = mRemoteTransitions.size() - 1; i >= 0; --i) { - registerRemoteTransition(mRemoteTransitions.get(i)); - } + new LinkedHashMap<>(mRemoteTransitions).forEach(this::registerRemoteTransition); if (mRecentTasksListener != null && mRecentTasks != null) { registerRecentTasksListener(mRecentTasksListener); } @@ -547,11 +548,11 @@ public class SystemUiProxy implements ISystemUiProxy { /** Start multiple tasks in split-screen simultaneously. */ public void startTasks(int taskId1, Bundle options1, int taskId2, Bundle options2, @SplitConfigurationOptions.StagePosition int splitPosition, float splitRatio, - RemoteTransitionCompat remoteTransition, InstanceId instanceId) { + RemoteTransition remoteTransition, InstanceId instanceId) { if (mSystemUiProxy != null) { try { mSplitScreen.startTasks(taskId1, options1, taskId2, options2, splitPosition, - splitRatio, remoteTransition.getTransition(), instanceId); + splitRatio, remoteTransition, instanceId); } catch (RemoteException e) { Log.w(TAG, "Failed call startTasks"); } @@ -561,12 +562,12 @@ public class SystemUiProxy implements ISystemUiProxy { public void startIntentAndTask(PendingIntent pendingIntent, Intent fillInIntent, Bundle options1, int taskId, Bundle options2, @SplitConfigurationOptions.StagePosition int splitPosition, float splitRatio, - RemoteTransitionCompat remoteTransition, InstanceId instanceId) { + RemoteTransition remoteTransition, InstanceId instanceId) { if (mSystemUiProxy != null) { try { mSplitScreen.startIntentAndTask(pendingIntent, fillInIntent, options1, taskId, options2, splitPosition, splitRatio, - remoteTransition.getTransition(), instanceId); + remoteTransition, instanceId); } catch (RemoteException e) { Log.w(TAG, "Failed call startIntentAndTask"); } @@ -575,11 +576,11 @@ public class SystemUiProxy implements ISystemUiProxy { public void startShortcutAndTask(ShortcutInfo shortcutInfo, Bundle options1, int taskId, Bundle options2, @SplitConfigurationOptions.StagePosition int splitPosition, - float splitRatio, RemoteTransitionCompat remoteTransition, InstanceId instanceId) { + float splitRatio, RemoteTransition remoteTransition, InstanceId instanceId) { if (mSystemUiProxy != null) { try { mSplitScreen.startShortcutAndTask(shortcutInfo, options1, taskId, options2, - splitPosition, splitRatio, remoteTransition.getTransition(), instanceId); + splitPosition, splitRatio, remoteTransition, instanceId); } catch (RemoteException e) { Log.w(TAG, "Failed call startShortcutAndTask"); } @@ -720,24 +721,24 @@ public class SystemUiProxy implements ISystemUiProxy { // Remote transitions // - public void registerRemoteTransition(RemoteTransitionCompat remoteTransition) { + public void registerRemoteTransition( + RemoteTransition remoteTransition, TransitionFilter filter) { if (mShellTransitions != null) { try { - mShellTransitions.registerRemote(remoteTransition.getFilter(), - remoteTransition.getTransition()); + mShellTransitions.registerRemote(filter, remoteTransition); } catch (RemoteException e) { Log.w(TAG, "Failed call registerRemoteTransition"); } } - if (!mRemoteTransitions.contains(remoteTransition)) { - mRemoteTransitions.add(remoteTransition); + if (!mRemoteTransitions.containsKey(remoteTransition)) { + mRemoteTransitions.put(remoteTransition, filter); } } - public void unregisterRemoteTransition(RemoteTransitionCompat remoteTransition) { + public void unregisterRemoteTransition(RemoteTransition remoteTransition) { if (mShellTransitions != null) { try { - mShellTransitions.unregisterRemote(remoteTransition.getTransition()); + mShellTransitions.unregisterRemote(remoteTransition); } catch (RemoteException e) { Log.w(TAG, "Failed call registerRemoteTransition"); } diff --git a/quickstep/src/com/android/quickstep/TaskAnimationManager.java b/quickstep/src/com/android/quickstep/TaskAnimationManager.java index 30d445fc31..90e80916eb 100644 --- a/quickstep/src/com/android/quickstep/TaskAnimationManager.java +++ b/quickstep/src/com/android/quickstep/TaskAnimationManager.java @@ -21,6 +21,7 @@ import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; import static com.android.quickstep.GestureState.STATE_RECENTS_ANIMATION_INITIALIZED; import static com.android.quickstep.GestureState.STATE_RECENTS_ANIMATION_STARTED; +import static com.android.systemui.shared.system.RemoteTransitionCompat.newRemoteTransition; import android.app.ActivityManager; import android.app.ActivityOptions; @@ -29,6 +30,7 @@ import android.content.Intent; import android.os.SystemProperties; import android.util.Log; import android.view.RemoteAnimationTarget; +import android.window.RemoteTransition; import androidx.annotation.Nullable; import androidx.annotation.UiThread; @@ -39,7 +41,6 @@ import com.android.quickstep.TopTaskTracker.CachedTaskInfo; import com.android.quickstep.views.RecentsView; import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.ActivityManagerWrapper; -import com.android.systemui.shared.system.RemoteTransitionCompat; import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.shared.system.TaskStackChangeListeners; @@ -223,11 +224,10 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn mCallbacks.addListener(listener); if (ENABLE_SHELL_TRANSITIONS) { - RemoteTransitionCompat transition = new RemoteTransitionCompat(mCallbacks, + RemoteTransition transition = newRemoteTransition(mCallbacks, mController != null ? mController.getController() : null, mCtx.getIApplicationThread()); - final ActivityOptions options = ActivityOptions.makeRemoteTransition( - transition.getTransition()); + final ActivityOptions options = ActivityOptions.makeRemoteTransition(transition); // Allowing to pause Home if Home is top activity and Recents is not Home. So when user // start home when recents animation is playing, the home activity can be resumed again // to let the transition controller collect Home activity. diff --git a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java index 825c721961..08f9fa699f 100644 --- a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java +++ b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java @@ -35,6 +35,7 @@ import android.content.pm.PackageManager; import android.content.pm.ShortcutInfo; import android.os.Handler; import android.os.IBinder; +import android.os.RemoteException; import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; @@ -42,6 +43,9 @@ import android.util.Pair; import android.view.RemoteAnimationAdapter; import android.view.RemoteAnimationTarget; import android.view.SurfaceControl; +import android.window.IRemoteTransition; +import android.window.IRemoteTransitionFinishedCallback; +import android.window.RemoteTransition; import android.window.TransitionInfo; import androidx.annotation.Nullable; @@ -63,10 +67,7 @@ import com.android.quickstep.views.FloatingTaskView; import com.android.quickstep.views.GroupedTaskView; import com.android.quickstep.views.TaskView; import com.android.systemui.shared.recents.model.Task; -import com.android.systemui.shared.system.RemoteAnimationAdapterCompat; import com.android.systemui.shared.system.RemoteAnimationRunnerCompat; -import com.android.systemui.shared.system.RemoteTransitionCompat; -import com.android.systemui.shared.system.RemoteTransitionRunner; import java.util.function.Consumer; @@ -232,8 +233,7 @@ public class SplitSelectStateController { if (TaskAnimationManager.ENABLE_SHELL_TRANSITIONS) { final RemoteSplitLaunchTransitionRunner animationRunner = new RemoteSplitLaunchTransitionRunner(taskId1, taskId2, callback); - final RemoteTransitionCompat remoteTransition = new RemoteTransitionCompat( - animationRunner, MAIN_EXECUTOR, + final RemoteTransition remoteTransition = new RemoteTransition(animationRunner, ActivityThread.currentActivityThread().getApplicationThread()); if (intent1 == null && intent2 == null) { mSystemUiProxy.startTasks(taskId1, options1.toBundle(), taskId2, @@ -253,8 +253,7 @@ public class SplitSelectStateController { final RemoteSplitLaunchAnimationRunner animationRunner = new RemoteSplitLaunchAnimationRunner(taskId1, taskId2, callback); final RemoteAnimationAdapter adapter = new RemoteAnimationAdapter( - RemoteAnimationAdapterCompat.wrapRemoteAnimationRunner(animationRunner), - 300, 150, + animationRunner, 300, 150, ActivityThread.currentActivityThread().getApplicationThread()); if (intent1 == null && intent2 == null) { @@ -276,7 +275,7 @@ public class SplitSelectStateController { private void launchIntentOrShortcut(Intent intent, String otherTaskPackageName, ActivityOptions options1, int taskId, @StagePosition int stagePosition, - float splitRatio, RemoteTransitionCompat remoteTransition, + float splitRatio, RemoteTransition remoteTransition, @Nullable InstanceId shellInstanceId) { PendingIntent pendingIntent = getPendingIntent(intent); final ShortcutInfo shortcutInfo = getShortcutInfo(intent, @@ -369,7 +368,7 @@ public class SplitSelectStateController { /** * Requires Shell Transitions */ - private class RemoteSplitLaunchTransitionRunner implements RemoteTransitionRunner { + private class RemoteSplitLaunchTransitionRunner extends IRemoteTransition.Stub { private final int mInitialTaskId; private final int mSecondTaskId; @@ -383,25 +382,41 @@ public class SplitSelectStateController { } @Override - public void startAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info, - @NonNull SurfaceControl.Transaction t, @NonNull Runnable finishCallback) { - TaskViewUtils.composeRecentsSplitLaunchAnimator(mLaunchingTaskView, mStateManager, - mDepthController, mInitialTaskId, mSecondTaskId, info, t, () -> { - finishCallback.run(); - if (mSuccessCallback != null) { - mSuccessCallback.accept(true); - } - }); - // After successful launch, call resetState - resetState(); + public void startAnimation(IBinder transition, TransitionInfo info, + SurfaceControl.Transaction t, + IRemoteTransitionFinishedCallback finishedCallback) { + final Runnable finishAdapter = () -> { + try { + finishedCallback.onTransitionFinished(null /* wct */, null /* sct */); + } catch (RemoteException e) { + Log.e(TAG, "Failed to call transition finished callback", e); + } + }; + + MAIN_EXECUTOR.execute(() -> { + TaskViewUtils.composeRecentsSplitLaunchAnimator(mLaunchingTaskView, mStateManager, + mDepthController, mInitialTaskId, mSecondTaskId, info, t, () -> { + finishAdapter.run(); + if (mSuccessCallback != null) { + mSuccessCallback.accept(true); + } + }); + // After successful launch, call resetState + resetState(); + }); } + + @Override + public void mergeAnimation(IBinder transition, TransitionInfo info, + SurfaceControl.Transaction t, IBinder mergeTarget, + IRemoteTransitionFinishedCallback finishedCallback) { } } /** * LEGACY * Remote animation runner for animation to launch an app. */ - private class RemoteSplitLaunchAnimationRunner implements RemoteAnimationRunnerCompat { + private class RemoteSplitLaunchAnimationRunner extends RemoteAnimationRunnerCompat { private final int mInitialTaskId; private final int mSecondTaskId; @@ -431,7 +446,7 @@ public class SplitSelectStateController { } @Override - public void onAnimationCancelled() { + public void onAnimationCancelled(boolean isKeyguardOccluded) { postAsyncCallback(mHandler, () -> { if (mSuccessCallback != null) { // Launching legacy tasks while recents animation is running will always cause