Loading quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.java +51 −0 Original line number Diff line number Diff line Loading @@ -15,14 +15,22 @@ */ package com.android.launcher3.statehandlers; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import android.os.RemoteException; import android.os.SystemProperties; import android.util.Log; import android.view.View; import android.widget.Toast; import androidx.annotation.Nullable; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; import com.android.launcher3.statemanager.StatefulActivity; import com.android.launcher3.uioverrides.QuickstepLauncher; import com.android.quickstep.SystemUiProxy; import com.android.wm.shell.desktopmode.IDesktopTaskListener; /** * Controls the visibility of the workspace and the resumed / paused state when desktop mode Loading @@ -39,10 +47,44 @@ public class DesktopVisibilityController { private boolean mInOverviewState; private boolean mGestureInProgress; @Nullable private IDesktopTaskListener mDesktopTaskListener; public DesktopVisibilityController(Launcher launcher) { mLauncher = launcher; } /** * Register a listener with System UI to receive updates about desktop tasks state */ public void registerSystemUiListener() { mDesktopTaskListener = new IDesktopTaskListener.Stub() { @Override public void onVisibilityChanged(int displayId, boolean visible) throws RemoteException { // TODO(b/261234402): move visibility from sysui state to listener } @Override public void onStashedChanged(int displayId, boolean stashed) throws RemoteException { // TODO(b/261234402): show a persistent toast MAIN_EXECUTOR.execute(() -> { if (stashed && displayId == mLauncher.getDisplayId()) { Toast.makeText(mLauncher, "Adding app to Desktop", Toast.LENGTH_SHORT).show(); } }); } }; SystemUiProxy.INSTANCE.get(mLauncher).setDesktopTaskListener(mDesktopTaskListener); } /** * Clear listener from System UI that was set with {@link #registerSystemUiListener()} */ public void unregisterSystemUiListener() { SystemUiProxy.INSTANCE.get(mLauncher).setDesktopTaskListener(null); } /** * Whether desktop mode is supported. */ Loading Loading @@ -130,6 +172,15 @@ public class DesktopVisibilityController { } } /** * Handle launcher moving to home due to home gesture or home button press. */ public void onHomeActionTriggered() { if (areFreeformTasksVisible()) { SystemUiProxy.INSTANCE.get(mLauncher).stashDesktopApps(mLauncher.getDisplayId()); } } private void setLauncherViewsVisibility(int visibility) { if (DEBUG) { Log.d(TAG, "setLauncherViewsVisibility: visibility=" + visibility); Loading quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java +12 −0 Original line number Diff line number Diff line Loading @@ -43,12 +43,15 @@ import androidx.annotation.StringRes; import com.android.launcher3.R; import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.statehandlers.DesktopVisibilityController; import com.android.launcher3.testing.TestLogging; import com.android.launcher3.testing.shared.TestProtocol; import com.android.quickstep.LauncherActivityInterface; import com.android.quickstep.OverviewCommandHelper; import com.android.quickstep.SystemUiProxy; import com.android.quickstep.TaskUtils; import com.android.quickstep.TouchInteractionService; import com.android.quickstep.views.DesktopTaskView; import java.io.PrintWriter; import java.lang.annotation.Retention; Loading Loading @@ -267,6 +270,15 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa private void navigateHome() { TaskUtils.closeSystemWindowsAsync(CLOSE_SYSTEM_WINDOWS_REASON_HOME_KEY); if (DesktopTaskView.DESKTOP_IS_PROTO2_ENABLED) { DesktopVisibilityController desktopVisibilityController = LauncherActivityInterface.INSTANCE.getDesktopVisibilityController(); if (desktopVisibilityController != null) { desktopVisibilityController.onHomeActionTriggered(); } } mService.getOverviewCommandHelper().addCommand(OverviewCommandHelper.TYPE_HOME); } Loading quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +7 −0 Original line number Diff line number Diff line Loading @@ -259,6 +259,9 @@ public class QuickstepLauncher extends Launcher { mTISBindHelper = new TISBindHelper(this, this::onTISConnected); mDepthController = new DepthController(this); mDesktopVisibilityController = new DesktopVisibilityController(this); if (DesktopTaskView.DESKTOP_MODE_SUPPORTED) { mDesktopVisibilityController.registerSystemUiListener(); } mHotseatPredictionController = new HotseatPredictionController(this); mEnableWidgetDepth = SystemProperties.getBoolean("ro.launcher.depth.widget", true); Loading Loading @@ -483,6 +486,10 @@ public class QuickstepLauncher extends Launcher { mLauncherUnfoldAnimationController.onDestroy(); } if (mDesktopVisibilityController != null) { mDesktopVisibilityController.unregisterSystemUiListener(); } super.onDestroy(); mHotseatPredictionController.destroy(); mSplitWithKeyboardShortcutController.onDestroy(); Loading quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +9 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,7 @@ import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.dragndrop.DragView; import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.logging.StatsLogManager.StatsLogger; import com.android.launcher3.statehandlers.DesktopVisibilityController; import com.android.launcher3.statemanager.BaseState; import com.android.launcher3.statemanager.StatefulActivity; import com.android.launcher3.taskbar.TaskbarUIController; Loading Loading @@ -1133,6 +1134,14 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>, mStateCallback.setState(STATE_SCALED_CONTROLLER_HOME | STATE_CAPTURE_SCREENSHOT); // Notify the SysUI to use fade-in animation when entering PiP SystemUiProxy.INSTANCE.get(mContext).setPipAnimationTypeToAlpha(); if (DesktopTaskView.DESKTOP_IS_PROTO2_ENABLED) { // Notify the SysUI to stash desktop apps if they are visible DesktopVisibilityController desktopVisibilityController = mActivityInterface.getDesktopVisibilityController(); if (desktopVisibilityController != null) { desktopVisibilityController.onHomeActionTriggered(); } } break; case RECENTS: mStateCallback.setState(STATE_SCALED_CONTROLLER_RECENTS | STATE_CAPTURE_SCREENSHOT Loading quickstep/src/com/android/quickstep/SystemUiProxy.java +26 −0 Original line number Diff line number Diff line Loading @@ -74,6 +74,7 @@ import com.android.wm.shell.back.IBackAnimation; import com.android.wm.shell.bubbles.IBubbles; import com.android.wm.shell.bubbles.IBubblesListener; import com.android.wm.shell.desktopmode.IDesktopMode; import com.android.wm.shell.desktopmode.IDesktopTaskListener; import com.android.wm.shell.draganddrop.IDragAndDrop; import com.android.wm.shell.onehanded.IOneHanded; import com.android.wm.shell.pip.IPip; Loading Loading @@ -130,6 +131,7 @@ public class SystemUiProxy implements ISystemUiProxy { private ILauncherUnlockAnimationController mLauncherUnlockAnimationController; private IRecentTasksListener mRecentTasksListener; private IUnfoldTransitionListener mUnfoldAnimationListener; private IDesktopTaskListener mDesktopTaskListener; private final LinkedHashMap<RemoteTransition, TransitionFilter> mRemoteTransitions = new LinkedHashMap<>(); private IBinder mOriginalTransactionToken = null; Loading Loading @@ -243,6 +245,7 @@ public class SystemUiProxy implements ISystemUiProxy { registerRecentTasksListener(mRecentTasksListener); setBackToLauncherCallback(mBackToLauncherCallback, mBackToLauncherRunner); setUnfoldAnimationListener(mUnfoldAnimationListener); setDesktopTaskListener(mDesktopTaskListener); } /** Loading Loading @@ -1147,6 +1150,17 @@ public class SystemUiProxy implements ISystemUiProxy { } } /** Call shell to stash desktop apps */ public void stashDesktopApps(int displayId) { if (mDesktopMode != null) { try { mDesktopMode.stashDesktopApps(displayId); } catch (RemoteException e) { Log.w(TAG, "Failed call stashDesktopApps", e); } } } /** Call shell to get number of visible freeform tasks */ public int getVisibleDesktopTaskCount(int displayId) { if (mDesktopMode != null) { Loading @@ -1159,6 +1173,18 @@ public class SystemUiProxy implements ISystemUiProxy { return 0; } /** Set a listener on shell to get updates about desktop task state */ public void setDesktopTaskListener(@Nullable IDesktopTaskListener listener) { mDesktopTaskListener = listener; if (mDesktopMode != null) { try { mDesktopMode.setTaskListener(listener); } catch (RemoteException e) { Log.w(TAG, "Failed call setDesktopTaskListener", e); } } } // // Unfold transition // Loading Loading
quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.java +51 −0 Original line number Diff line number Diff line Loading @@ -15,14 +15,22 @@ */ package com.android.launcher3.statehandlers; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import android.os.RemoteException; import android.os.SystemProperties; import android.util.Log; import android.view.View; import android.widget.Toast; import androidx.annotation.Nullable; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; import com.android.launcher3.statemanager.StatefulActivity; import com.android.launcher3.uioverrides.QuickstepLauncher; import com.android.quickstep.SystemUiProxy; import com.android.wm.shell.desktopmode.IDesktopTaskListener; /** * Controls the visibility of the workspace and the resumed / paused state when desktop mode Loading @@ -39,10 +47,44 @@ public class DesktopVisibilityController { private boolean mInOverviewState; private boolean mGestureInProgress; @Nullable private IDesktopTaskListener mDesktopTaskListener; public DesktopVisibilityController(Launcher launcher) { mLauncher = launcher; } /** * Register a listener with System UI to receive updates about desktop tasks state */ public void registerSystemUiListener() { mDesktopTaskListener = new IDesktopTaskListener.Stub() { @Override public void onVisibilityChanged(int displayId, boolean visible) throws RemoteException { // TODO(b/261234402): move visibility from sysui state to listener } @Override public void onStashedChanged(int displayId, boolean stashed) throws RemoteException { // TODO(b/261234402): show a persistent toast MAIN_EXECUTOR.execute(() -> { if (stashed && displayId == mLauncher.getDisplayId()) { Toast.makeText(mLauncher, "Adding app to Desktop", Toast.LENGTH_SHORT).show(); } }); } }; SystemUiProxy.INSTANCE.get(mLauncher).setDesktopTaskListener(mDesktopTaskListener); } /** * Clear listener from System UI that was set with {@link #registerSystemUiListener()} */ public void unregisterSystemUiListener() { SystemUiProxy.INSTANCE.get(mLauncher).setDesktopTaskListener(null); } /** * Whether desktop mode is supported. */ Loading Loading @@ -130,6 +172,15 @@ public class DesktopVisibilityController { } } /** * Handle launcher moving to home due to home gesture or home button press. */ public void onHomeActionTriggered() { if (areFreeformTasksVisible()) { SystemUiProxy.INSTANCE.get(mLauncher).stashDesktopApps(mLauncher.getDisplayId()); } } private void setLauncherViewsVisibility(int visibility) { if (DEBUG) { Log.d(TAG, "setLauncherViewsVisibility: visibility=" + visibility); Loading
quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java +12 −0 Original line number Diff line number Diff line Loading @@ -43,12 +43,15 @@ import androidx.annotation.StringRes; import com.android.launcher3.R; import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.statehandlers.DesktopVisibilityController; import com.android.launcher3.testing.TestLogging; import com.android.launcher3.testing.shared.TestProtocol; import com.android.quickstep.LauncherActivityInterface; import com.android.quickstep.OverviewCommandHelper; import com.android.quickstep.SystemUiProxy; import com.android.quickstep.TaskUtils; import com.android.quickstep.TouchInteractionService; import com.android.quickstep.views.DesktopTaskView; import java.io.PrintWriter; import java.lang.annotation.Retention; Loading Loading @@ -267,6 +270,15 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa private void navigateHome() { TaskUtils.closeSystemWindowsAsync(CLOSE_SYSTEM_WINDOWS_REASON_HOME_KEY); if (DesktopTaskView.DESKTOP_IS_PROTO2_ENABLED) { DesktopVisibilityController desktopVisibilityController = LauncherActivityInterface.INSTANCE.getDesktopVisibilityController(); if (desktopVisibilityController != null) { desktopVisibilityController.onHomeActionTriggered(); } } mService.getOverviewCommandHelper().addCommand(OverviewCommandHelper.TYPE_HOME); } Loading
quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +7 −0 Original line number Diff line number Diff line Loading @@ -259,6 +259,9 @@ public class QuickstepLauncher extends Launcher { mTISBindHelper = new TISBindHelper(this, this::onTISConnected); mDepthController = new DepthController(this); mDesktopVisibilityController = new DesktopVisibilityController(this); if (DesktopTaskView.DESKTOP_MODE_SUPPORTED) { mDesktopVisibilityController.registerSystemUiListener(); } mHotseatPredictionController = new HotseatPredictionController(this); mEnableWidgetDepth = SystemProperties.getBoolean("ro.launcher.depth.widget", true); Loading Loading @@ -483,6 +486,10 @@ public class QuickstepLauncher extends Launcher { mLauncherUnfoldAnimationController.onDestroy(); } if (mDesktopVisibilityController != null) { mDesktopVisibilityController.unregisterSystemUiListener(); } super.onDestroy(); mHotseatPredictionController.destroy(); mSplitWithKeyboardShortcutController.onDestroy(); Loading
quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +9 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,7 @@ import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.dragndrop.DragView; import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.logging.StatsLogManager.StatsLogger; import com.android.launcher3.statehandlers.DesktopVisibilityController; import com.android.launcher3.statemanager.BaseState; import com.android.launcher3.statemanager.StatefulActivity; import com.android.launcher3.taskbar.TaskbarUIController; Loading Loading @@ -1133,6 +1134,14 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>, mStateCallback.setState(STATE_SCALED_CONTROLLER_HOME | STATE_CAPTURE_SCREENSHOT); // Notify the SysUI to use fade-in animation when entering PiP SystemUiProxy.INSTANCE.get(mContext).setPipAnimationTypeToAlpha(); if (DesktopTaskView.DESKTOP_IS_PROTO2_ENABLED) { // Notify the SysUI to stash desktop apps if they are visible DesktopVisibilityController desktopVisibilityController = mActivityInterface.getDesktopVisibilityController(); if (desktopVisibilityController != null) { desktopVisibilityController.onHomeActionTriggered(); } } break; case RECENTS: mStateCallback.setState(STATE_SCALED_CONTROLLER_RECENTS | STATE_CAPTURE_SCREENSHOT Loading
quickstep/src/com/android/quickstep/SystemUiProxy.java +26 −0 Original line number Diff line number Diff line Loading @@ -74,6 +74,7 @@ import com.android.wm.shell.back.IBackAnimation; import com.android.wm.shell.bubbles.IBubbles; import com.android.wm.shell.bubbles.IBubblesListener; import com.android.wm.shell.desktopmode.IDesktopMode; import com.android.wm.shell.desktopmode.IDesktopTaskListener; import com.android.wm.shell.draganddrop.IDragAndDrop; import com.android.wm.shell.onehanded.IOneHanded; import com.android.wm.shell.pip.IPip; Loading Loading @@ -130,6 +131,7 @@ public class SystemUiProxy implements ISystemUiProxy { private ILauncherUnlockAnimationController mLauncherUnlockAnimationController; private IRecentTasksListener mRecentTasksListener; private IUnfoldTransitionListener mUnfoldAnimationListener; private IDesktopTaskListener mDesktopTaskListener; private final LinkedHashMap<RemoteTransition, TransitionFilter> mRemoteTransitions = new LinkedHashMap<>(); private IBinder mOriginalTransactionToken = null; Loading Loading @@ -243,6 +245,7 @@ public class SystemUiProxy implements ISystemUiProxy { registerRecentTasksListener(mRecentTasksListener); setBackToLauncherCallback(mBackToLauncherCallback, mBackToLauncherRunner); setUnfoldAnimationListener(mUnfoldAnimationListener); setDesktopTaskListener(mDesktopTaskListener); } /** Loading Loading @@ -1147,6 +1150,17 @@ public class SystemUiProxy implements ISystemUiProxy { } } /** Call shell to stash desktop apps */ public void stashDesktopApps(int displayId) { if (mDesktopMode != null) { try { mDesktopMode.stashDesktopApps(displayId); } catch (RemoteException e) { Log.w(TAG, "Failed call stashDesktopApps", e); } } } /** Call shell to get number of visible freeform tasks */ public int getVisibleDesktopTaskCount(int displayId) { if (mDesktopMode != null) { Loading @@ -1159,6 +1173,18 @@ public class SystemUiProxy implements ISystemUiProxy { return 0; } /** Set a listener on shell to get updates about desktop task state */ public void setDesktopTaskListener(@Nullable IDesktopTaskListener listener) { mDesktopTaskListener = listener; if (mDesktopMode != null) { try { mDesktopMode.setTaskListener(listener); } catch (RemoteException e) { Log.w(TAG, "Failed call setDesktopTaskListener", e); } } } // // Unfold transition // Loading