diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java index 2f8b79e319..64b22d439c 100644 --- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java +++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java @@ -84,7 +84,6 @@ import com.android.quickstep.util.RemoteAnimationProvider; import com.android.quickstep.util.StaggeredWorkspaceAnim; import com.android.quickstep.util.SurfaceTransactionApplier; import com.android.quickstep.views.RecentsView; -import com.android.systemui.shared.recents.IStartingWindowListener; import com.android.systemui.shared.system.ActivityCompat; import com.android.systemui.shared.system.ActivityOptionsCompat; import com.android.systemui.shared.system.InteractionJankMonitorWrapper; @@ -96,6 +95,7 @@ import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.RemoteTransitionCompat; import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams; import com.android.systemui.shared.system.WindowManagerWrapper; +import com.android.wm.shell.startingsurface.IStartingWindowListener; import java.util.LinkedHashMap; diff --git a/quickstep/src/com/android/quickstep/SystemUiProxy.java b/quickstep/src/com/android/quickstep/SystemUiProxy.java index a70cc4ccd2..cf71eaeeb8 100644 --- a/quickstep/src/com/android/quickstep/SystemUiProxy.java +++ b/quickstep/src/com/android/quickstep/SystemUiProxy.java @@ -35,12 +35,17 @@ import android.util.Log; import android.view.MotionEvent; import com.android.launcher3.util.MainThreadInitializedObject; -import com.android.systemui.shared.recents.IPinnedStackAnimationListener; -import com.android.systemui.shared.recents.ISplitScreenListener; -import com.android.systemui.shared.recents.IStartingWindowListener; 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.wm.shell.onehanded.IOneHanded; +import com.android.wm.shell.pip.IPip; +import com.android.wm.shell.pip.IPipAnimationListener; +import com.android.wm.shell.splitscreen.ISplitScreen; +import com.android.wm.shell.splitscreen.ISplitScreenListener; +import com.android.wm.shell.startingsurface.IStartingWindow; +import com.android.wm.shell.startingsurface.IStartingWindowListener; +import com.android.wm.shell.transition.IShellTransitions; /** * Holds the reference to SystemUI. @@ -53,8 +58,13 @@ public class SystemUiProxy implements ISystemUiProxy, new MainThreadInitializedObject<>(SystemUiProxy::new); private ISystemUiProxy mSystemUiProxy; + private IPip mPip; + private ISplitScreen mSplitScreen; + private IOneHanded mOneHanded; + private IShellTransitions mShellTransitions; + private IStartingWindow mStartingWindow; private final DeathRecipient mSystemUiProxyDeathRecipient = () -> { - MAIN_EXECUTOR.execute(() -> setProxy(null)); + MAIN_EXECUTOR.execute(() -> clearProxy()); }; // Used to dedupe calls to SystemUI @@ -83,12 +93,23 @@ public class SystemUiProxy implements ISystemUiProxy, return null; } - public void setProxy(ISystemUiProxy proxy) { + public void setProxy(ISystemUiProxy proxy, IPip pip, ISplitScreen splitScreen, + IOneHanded oneHanded, IShellTransitions shellTransitions, + IStartingWindow startingWindow) { unlinkToDeath(); mSystemUiProxy = proxy; + mPip = pip; + mSplitScreen = splitScreen; + mOneHanded = oneHanded; + mShellTransitions = shellTransitions; + mStartingWindow = startingWindow; linkToDeath(); } + public void clearProxy() { + setProxy(null, null, null, null, null, null); + } + // TODO(141886704): Find a way to remove this public void setLastSystemUiStateFlags(int stateFlags) { mLastSystemUiStateFlags = stateFlags; @@ -267,21 +288,6 @@ public class SystemUiProxy implements ISystemUiProxy, } } - @Override - public void setShelfHeight(boolean visible, int shelfHeight) { - boolean changed = visible != mLastShelfVisible || shelfHeight != mLastShelfHeight; - if (mSystemUiProxy != null && changed) { - mLastShelfVisible = visible; - mLastShelfHeight = shelfHeight; - try { - mSystemUiProxy.setShelfHeight(visible, shelfHeight); - } catch (RemoteException e) { - Log.w(TAG, "Failed call setShelfHeight visible: " + visible - + " height: " + shelfHeight, e); - } - } - } - @Override public void handleImageAsScreenshot(Bitmap bitmap, Rect rect, Insets insets, int i) { if (mSystemUiProxy != null) { @@ -318,20 +324,6 @@ public class SystemUiProxy implements ISystemUiProxy, } } - /** - * Sets listener to get pinned stack animation callbacks. - */ - @Override - public void setPinnedStackAnimationListener(IPinnedStackAnimationListener listener) { - if (mSystemUiProxy != null) { - try { - mSystemUiProxy.setPinnedStackAnimationListener(listener); - } catch (RemoteException e) { - Log.w(TAG, "Failed call setPinnedStackAnimationListener", e); - } - } - } - @Override public void onQuickSwitchToNewTask(int rotation) { if (mSystemUiProxy != null) { @@ -356,28 +348,6 @@ public class SystemUiProxy implements ISystemUiProxy, } } - @Override - public void startOneHandedMode() { - if (mSystemUiProxy != null) { - try { - mSystemUiProxy.startOneHandedMode(); - } catch (RemoteException e) { - Log.w(TAG, "Failed call startOneHandedMode", e); - } - } - } - - @Override - public void stopOneHandedMode() { - if (mSystemUiProxy != null) { - try { - mSystemUiProxy.stopOneHandedMode(); - } catch (RemoteException e) { - Log.w(TAG, "Failed call stopOneHandedMode", e); - } - } - } - @Override public void expandNotificationPanel() { if (mSystemUiProxy != null) { @@ -389,12 +359,45 @@ public class SystemUiProxy implements ISystemUiProxy, } } - @Override + // + // Pip + // + + /** + * Sets the shelf height. + */ + public void setShelfHeight(boolean visible, int shelfHeight) { + boolean changed = visible != mLastShelfVisible || shelfHeight != mLastShelfHeight; + if (mPip != null && changed) { + mLastShelfVisible = visible; + mLastShelfHeight = shelfHeight; + try { + mPip.setShelfHeight(visible, shelfHeight); + } catch (RemoteException e) { + Log.w(TAG, "Failed call setShelfHeight visible: " + visible + + " height: " + shelfHeight, e); + } + } + } + + /** + * Sets listener to get pinned stack animation callbacks. + */ + public void setPinnedStackAnimationListener(IPipAnimationListener listener) { + if (mPip != null) { + try { + mPip.setPinnedStackAnimationListener(listener); + } catch (RemoteException e) { + Log.w(TAG, "Failed call setPinnedStackAnimationListener", e); + } + } + } + public Rect startSwipePipToHome(ComponentName componentName, ActivityInfo activityInfo, PictureInPictureParams pictureInPictureParams, int launcherRotation, int shelfHeight) { - if (mSystemUiProxy != null) { + if (mPip != null) { try { - return mSystemUiProxy.startSwipePipToHome(componentName, activityInfo, + return mPip.startSwipePipToHome(componentName, activityInfo, pictureInPictureParams, launcherRotation, shelfHeight); } catch (RemoteException e) { Log.w(TAG, "Failed call startSwipePipToHome", e); @@ -403,111 +406,85 @@ public class SystemUiProxy implements ISystemUiProxy, return null; } - @Override public void stopSwipePipToHome(ComponentName componentName, Rect destinationBounds) { - if (mSystemUiProxy != null) { + if (mPip != null) { try { - mSystemUiProxy.stopSwipePipToHome(componentName, destinationBounds); + mPip.stopSwipePipToHome(componentName, destinationBounds); } catch (RemoteException e) { Log.w(TAG, "Failed call stopSwipePipToHome"); } } } - @Override - public void registerRemoteTransition(RemoteTransitionCompat remoteTransition) { - if (mSystemUiProxy != null) { - try { - mSystemUiProxy.registerRemoteTransition(remoteTransition); - } catch (RemoteException e) { - Log.w(TAG, "Failed call registerRemoteTransition"); - } - } - } + // + // Splitscreen + // - @Override - public void unregisterRemoteTransition(RemoteTransitionCompat remoteTransition) { - if (mSystemUiProxy != null) { - try { - mSystemUiProxy.unregisterRemoteTransition(remoteTransition); - } catch (RemoteException e) { - Log.w(TAG, "Failed call registerRemoteTransition"); - } - } - } - - @Override public void registerSplitScreenListener(ISplitScreenListener listener) { - if (mSystemUiProxy != null) { + if (mSplitScreen != null) { try { - mSystemUiProxy.registerSplitScreenListener(listener); + mSplitScreen.registerSplitScreenListener(listener); } catch (RemoteException e) { Log.w(TAG, "Failed call registerSplitScreenListener"); } } } - @Override public void unregisterSplitScreenListener(ISplitScreenListener listener) { - if (mSystemUiProxy != null) { + if (mSplitScreen != null) { try { - mSystemUiProxy.unregisterSplitScreenListener(listener); + mSplitScreen.unregisterSplitScreenListener(listener); } catch (RemoteException e) { Log.w(TAG, "Failed call unregisterSplitScreenListener"); } } } - @Override public void setSideStageVisibility(boolean visible) { - if (mSystemUiProxy != null) { + if (mSplitScreen != null) { try { - mSystemUiProxy.setSideStageVisibility(visible); + mSplitScreen.setSideStageVisibility(visible); } catch (RemoteException e) { Log.w(TAG, "Failed call setSideStageVisibility"); } } } - @Override public void exitSplitScreen() { - if (mSystemUiProxy != null) { + if (mSplitScreen != null) { try { - mSystemUiProxy.exitSplitScreen(); + mSplitScreen.exitSplitScreen(); } catch (RemoteException e) { Log.w(TAG, "Failed call exitSplitScreen"); } } } - @Override public void exitSplitScreenOnHide(boolean exitSplitScreenOnHide) { - if (mSystemUiProxy != null) { + if (mSplitScreen != null) { try { - mSystemUiProxy.exitSplitScreenOnHide(exitSplitScreenOnHide); + mSplitScreen.exitSplitScreenOnHide(exitSplitScreenOnHide); } catch (RemoteException e) { Log.w(TAG, "Failed call exitSplitScreen"); } } } - @Override public void startTask(int taskId, int stage, int position, Bundle options) { - if (mSystemUiProxy != null) { + if (mSplitScreen != null) { try { - mSystemUiProxy.startTask(taskId, stage, position, options); + mSplitScreen.startTask(taskId, stage, position, options); } catch (RemoteException e) { Log.w(TAG, "Failed call startTask"); } } } - @Override public void startShortcut(String packageName, String shortcutId, int stage, int position, Bundle options, UserHandle user) { - if (mSystemUiProxy != null) { + if (mSplitScreen != null) { try { - mSystemUiProxy.startShortcut(packageName, shortcutId, stage, position, options, + mSplitScreen.startShortcut(packageName, shortcutId, stage, position, options, user); } catch (RemoteException e) { Log.w(TAG, "Failed call startShortcut"); @@ -515,38 +492,87 @@ public class SystemUiProxy implements ISystemUiProxy, } } - @Override - public void startIntent(PendingIntent intent, Intent fillInIntent, int stage, - int position, Bundle options) { - if (mSystemUiProxy != null) { + public void startIntent(PendingIntent intent, Intent fillInIntent, int stage, int position, + Bundle options) { + if (mSplitScreen != null) { try { - mSystemUiProxy.startIntent(intent, fillInIntent, stage, position, - options); + mSplitScreen.startIntent(intent, fillInIntent, stage, position, options); } catch (RemoteException e) { Log.w(TAG, "Failed call startIntent"); } } } - @Override public void removeFromSideStage(int taskId) { - if (mSystemUiProxy != null) { + if (mSplitScreen != null) { try { - mSystemUiProxy.removeFromSideStage(taskId); + mSplitScreen.removeFromSideStage(taskId); } catch (RemoteException e) { Log.w(TAG, "Failed call removeFromSideStage"); } } } + // + // One handed + // + + public void startOneHandedMode() { + if (mOneHanded != null) { + try { + mOneHanded.startOneHanded(); + } catch (RemoteException e) { + Log.w(TAG, "Failed call startOneHandedMode", e); + } + } + } + + public void stopOneHandedMode() { + if (mOneHanded != null) { + try { + mOneHanded.stopOneHanded(); + } catch (RemoteException e) { + Log.w(TAG, "Failed call stopOneHandedMode", e); + } + } + } + + // + // Remote transitions + // + + public void registerRemoteTransition(RemoteTransitionCompat remoteTransition) { + if (mShellTransitions != null) { + try { + mShellTransitions.registerRemote(remoteTransition.getFilter(), + remoteTransition.getTransition()); + } catch (RemoteException e) { + Log.w(TAG, "Failed call registerRemoteTransition"); + } + } + } + + public void unregisterRemoteTransition(RemoteTransitionCompat remoteTransition) { + if (mShellTransitions != null) { + try { + mShellTransitions.unregisterRemote(remoteTransition.getTransition()); + } catch (RemoteException e) { + Log.w(TAG, "Failed call registerRemoteTransition"); + } + } + } + + // + // Starting window + // + /** * Sets listener to get callbacks when launching a task. */ - @Override public void setStartingWindowListener(IStartingWindowListener listener) { - if (mSystemUiProxy != null) { + if (mStartingWindow != null) { try { - mSystemUiProxy.setStartingWindowListener(listener); + mStartingWindow.setStartingWindowListener(listener); } catch (RemoteException e) { Log.w(TAG, "Failed call setStartingWindowListener", e); } diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 8e6f663bed..4747f1898d 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -25,6 +25,11 @@ import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.quickstep.GestureState.DEFAULT_STATE; import static com.android.quickstep.util.NavigationModeFeatureFlag.LIVE_TILE; import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; +import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SHELL_ONE_HANDED; +import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SHELL_PIP; +import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SHELL_SHELL_TRANSITIONS; +import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SHELL_SPLIT_SCREEN; +import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SHELL_STARTING_WINDOW; import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SYSUI_PROXY; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_TRACING_ENABLED; @@ -102,6 +107,11 @@ import com.android.systemui.shared.system.InputChannelCompat.InputEventReceiver; import com.android.systemui.shared.system.InputConsumerController; import com.android.systemui.shared.system.InputMonitorCompat; import com.android.systemui.shared.tracing.ProtoTraceable; +import com.android.wm.shell.onehanded.IOneHanded; +import com.android.wm.shell.pip.IPip; +import com.android.wm.shell.splitscreen.ISplitScreen; +import com.android.wm.shell.startingsurface.IStartingWindow; +import com.android.wm.shell.transition.IShellTransitions; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -141,8 +151,18 @@ public class TouchInteractionService extends Service implements PluginListener { - SystemUiProxy.INSTANCE.get(TouchInteractionService.this).setProxy(proxy); + SystemUiProxy.INSTANCE.get(TouchInteractionService.this).setProxy(proxy, pip, + splitscreen, onehanded, shellTransitions, startingWindow); TouchInteractionService.this.initInputMonitor(); preloadOverview(true /* fromInit */); mDeviceState.runOnUserUnlocked(() -> { @@ -432,7 +452,7 @@ public class TouchInteractionService extends Service implements PluginListener extends PagedView } }; - private final PinnedStackAnimationListener mIPinnedStackAnimationListener = + private final PinnedStackAnimationListener mIPipAnimationListener = new PinnedStackAnimationListener(); // Used to keep track of the last requested task list id, so that we do not request to load the @@ -653,9 +654,9 @@ public abstract class RecentsView extends PagedView mLiveTileParams.setSyncTransactionApplier(mSyncTransactionApplier); RecentsModel.INSTANCE.get(getContext()).addThumbnailChangeListener(this); mIdp.addOnChangeListener(this); - mIPinnedStackAnimationListener.setActivity(mActivity); + mIPipAnimationListener.setActivity(mActivity); SystemUiProxy.INSTANCE.get(getContext()).setPinnedStackAnimationListener( - mIPinnedStackAnimationListener); + mIPipAnimationListener); mOrientationState.initListeners(); SplitScreenBounds.INSTANCE.addOnChangeListener(this); mTaskOverlayFactory.initListeners(); @@ -674,7 +675,7 @@ public abstract class RecentsView extends PagedView mIdp.removeOnChangeListener(this); SystemUiProxy.INSTANCE.get(getContext()).setPinnedStackAnimationListener(null); SplitScreenBounds.INSTANCE.removeOnChangeListener(this); - mIPinnedStackAnimationListener.setActivity(null); + mIPipAnimationListener.setActivity(null); mOrientationState.destroyListeners(); mTaskOverlayFactory.removeListeners(); } @@ -3133,7 +3134,7 @@ public abstract class RecentsView extends PagedView } private static class PinnedStackAnimationListener extends - IPinnedStackAnimationListener.Stub { + IPipAnimationListener.Stub { private T mActivity; public void setActivity(T activity) { @@ -3141,10 +3142,12 @@ public abstract class RecentsView extends PagedView } @Override - public void onPinnedStackAnimationStarted() { - // Needed for activities that auto-enter PiP, which will not trigger a remote - // animation to be created - mActivity.clearForceInvisibleFlag(STATE_HANDLER_INVISIBILITY_FLAGS); + public void onPipAnimationStarted() { + MAIN_EXECUTOR.execute(() -> { + // Needed for activities that auto-enter PiP, which will not trigger a remote + // animation to be created + mActivity.clearForceInvisibleFlag(STATE_HANDLER_INVISIBILITY_FLAGS); + }); } } }