diff options
3 files changed, 38 insertions, 5 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index e784261daa7e..9edace13634e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -188,14 +188,16 @@ public abstract class WMShellModule { @ShellMainThread Choreographer mainChoreographer, ShellTaskOrganizer taskOrganizer, DisplayController displayController, - SyncTransactionQueue syncQueue) { + SyncTransactionQueue syncQueue, + @DynamicOverride DesktopModeController desktopModeController) { return new CaptionWindowDecorViewModel( context, mainHandler, mainChoreographer, taskOrganizer, displayController, - syncQueue); + syncQueue, + desktopModeController); } // diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeController.java index 9474cfe916f0..99739c457aa6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeController.java @@ -177,6 +177,25 @@ public class DesktopModeController implements RemoteCallable<DesktopModeControll } /** + * Turn desktop mode on or off + * @param active the desired state for desktop mode setting + */ + public void setDesktopModeActive(boolean active) { + int value = active ? 1 : 0; + Settings.System.putInt(mContext.getContentResolver(), Settings.System.DESKTOP_MODE, value); + } + + /** + * Returns the windowing mode of the display area with the specified displayId. + * @param displayId + * @return + */ + public int getDisplayAreaWindowingMode(int displayId) { + return mRootTaskDisplayAreaOrganizer.getDisplayAreaInfo(displayId) + .configuration.windowConfiguration.getWindowingMode(); + } + + /** * A {@link ContentObserver} for listening to changes to {@link Settings.System#DESKTOP_MODE} */ private final class SettingsObserver extends ContentObserver { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java index 9c7131a9e02e..5b379453d7eb 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java @@ -36,6 +36,7 @@ import com.android.wm.shell.R; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.SyncTransactionQueue; +import com.android.wm.shell.desktopmode.DesktopModeController; import com.android.wm.shell.desktopmode.DesktopModeStatus; import com.android.wm.shell.freeform.FreeformTaskTransitionStarter; import com.android.wm.shell.transition.Transitions; @@ -53,6 +54,7 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel<Caption private final DisplayController mDisplayController; private final SyncTransactionQueue mSyncQueue; private FreeformTaskTransitionStarter mTransitionStarter; + private DesktopModeController mDesktopModeController; public CaptionWindowDecorViewModel( Context context, @@ -60,7 +62,8 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel<Caption Choreographer mainChoreographer, ShellTaskOrganizer taskOrganizer, DisplayController displayController, - SyncTransactionQueue syncQueue) { + SyncTransactionQueue syncQueue, + DesktopModeController desktopModeController) { mContext = context; mMainHandler = mainHandler; mMainChoreographer = mainChoreographer; @@ -68,6 +71,7 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel<Caption mTaskOrganizer = taskOrganizer; mDisplayController = displayController; mSyncQueue = syncQueue; + mDesktopModeController = desktopModeController; } @Override @@ -210,8 +214,10 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel<Caption } private void handleEventForMove(MotionEvent e) { - if (mTaskOrganizer.getRunningTaskInfo(mTaskId).getWindowingMode() - == WINDOWING_MODE_FULLSCREEN) { + RunningTaskInfo taskInfo = mTaskOrganizer.getRunningTaskInfo(mTaskId); + int windowingMode = mDesktopModeController + .getDisplayAreaWindowingMode(taskInfo.displayId); + if (windowingMode == WINDOWING_MODE_FULLSCREEN) { return; } switch (e.getActionMasked()) { @@ -229,8 +235,14 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel<Caption case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: { int dragPointerIdx = e.findPointerIndex(mDragPointerId); + int statusBarHeight = mDisplayController.getDisplayLayout(taskInfo.displayId) + .stableInsets().top; mDragResizeCallback.onDragResizeEnd( e.getRawX(dragPointerIdx), e.getRawY(dragPointerIdx)); + if (e.getRawY(dragPointerIdx) <= statusBarHeight + && windowingMode == WINDOWING_MODE_FREEFORM) { + mDesktopModeController.setDesktopModeActive(false); + } break; } } |