From 68f7fbfb8286d954045f1fc561051838f3bef7cd Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Tue, 2 Feb 2021 23:29:09 -0800 Subject: [PATCH] Update calls to go through the feature interface instead of sysui proxy Bug: 180074017 Test: atest PinnedStackTests Test: Verify Pip works w/ launcher (shelf offsets, autoenter, etc) Change-Id: Ie41b0b77a7d5a79288af91f862e2a2cdda85fb66 --- .../launcher3/QuickstepTransitionManager.java | 2 +- .../com/android/quickstep/SystemUiProxy.java | 258 ++++++++++-------- .../quickstep/TouchInteractionService.java | 24 +- .../android/quickstep/views/RecentsView.java | 23 +- 4 files changed, 178 insertions(+), 129 deletions(-) diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java index 343b87e735..f04c58d586 100644 --- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java +++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java @@ -86,7 +86,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; @@ -98,6 +97,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 5668817da8..f25c358fea 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. @@ -52,8 +57,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 @@ -75,12 +85,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; @@ -268,21 +289,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) { @@ -319,20 +325,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) { @@ -357,28 +349,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) { @@ -390,12 +360,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); @@ -404,111 +407,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"); @@ -516,38 +493,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 fc805d0794..1cb5f5d04e 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -24,6 +24,11 @@ import static com.android.launcher3.config.FeatureFlags.ASSISTANT_GIVES_LAUNCHER 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.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; @@ -101,6 +106,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; @@ -140,8 +150,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(() -> { @@ -421,7 +441,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 @@ -597,9 +598,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(); @@ -618,7 +619,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(); } @@ -2922,7 +2923,7 @@ public abstract class RecentsView extends PagedView } private static class PinnedStackAnimationListener extends - IPinnedStackAnimationListener.Stub { + IPipAnimationListener.Stub { private T mActivity; public void setActivity(T activity) { @@ -2930,10 +2931,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); + }); } } }