diff options
5 files changed, 29 insertions, 19 deletions
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index e55c96443198..d29feddc0963 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -3783,14 +3783,14 @@ public class Activity extends ContextThemeWrapper /** - * Moves the activity from {@link WindowConfiguration#WINDOWING_MODE_FREEFORM} windowing mode to - * {@link WindowConfiguration#WINDOWING_MODE_FULLSCREEN}. + * Moves the activity between {@link WindowConfiguration#WINDOWING_MODE_FREEFORM} windowing mode + * and {@link WindowConfiguration#WINDOWING_MODE_FULLSCREEN}. * * @hide */ @Override - public void exitFreeformMode() throws RemoteException { - ActivityTaskManager.getService().exitFreeformMode(mToken); + public void toggleFreeformWindowingMode() throws RemoteException { + ActivityTaskManager.getService().toggleFreeformWindowingMode(mToken); } /** diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl index 2b765b2284e7..497d5ba5fd93 100644 --- a/core/java/android/app/IActivityTaskManager.aidl +++ b/core/java/android/app/IActivityTaskManager.aidl @@ -215,7 +215,7 @@ interface IActivityTaskManager { void registerTaskStackListener(in ITaskStackListener listener); void unregisterTaskStackListener(in ITaskStackListener listener); void setTaskResizeable(int taskId, int resizeableMode); - void exitFreeformMode(in IBinder token); + void toggleFreeformWindowingMode(in IBinder token); void resizeTask(int taskId, in Rect bounds, int resizeMode); void moveStackToDisplay(int stackId, int displayId); void removeStack(int stackId); diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java index 097f368ac2a8..3544a8733c68 100644 --- a/core/java/android/view/Window.java +++ b/core/java/android/view/Window.java @@ -622,11 +622,10 @@ public abstract class Window { /** @hide */ public interface WindowControllerCallback { /** - * Moves the activity from - * Moves the activity from {@link WindowConfiguration#WINDOWING_MODE_FREEFORM} windowing - * mode to {@link WindowConfiguration#WINDOWING_MODE_FULLSCREEN}. + * Moves the activity between {@link WindowConfiguration#WINDOWING_MODE_FREEFORM} windowing + * mode and {@link WindowConfiguration#WINDOWING_MODE_FULLSCREEN}. */ - void exitFreeformMode() throws RemoteException; + void toggleFreeformWindowingMode() throws RemoteException; /** * Puts the activity in picture-in-picture mode if the activity supports. diff --git a/core/java/com/android/internal/widget/DecorCaptionView.java b/core/java/com/android/internal/widget/DecorCaptionView.java index 21558d3d3518..e90a8d5826f2 100644 --- a/core/java/com/android/internal/widget/DecorCaptionView.java +++ b/core/java/com/android/internal/widget/DecorCaptionView.java @@ -329,13 +329,13 @@ public class DecorCaptionView extends ViewGroup implements View.OnTouchListener, } /** - * Maximize the window by moving it to the maximized workspace stack. + * Maximize or restore the window by moving it to the maximized or freeform workspace stack. **/ - private void maximizeWindow() { + private void toggleFreeformWindowingMode() { Window.WindowControllerCallback callback = mOwner.getWindowControllerCallback(); if (callback != null) { try { - callback.exitFreeformMode(); + callback.toggleFreeformWindowingMode(); } catch (RemoteException ex) { Log.e(TAG, "Cannot change task workspace."); } @@ -395,7 +395,7 @@ public class DecorCaptionView extends ViewGroup implements View.OnTouchListener, @Override public boolean onSingleTapUp(MotionEvent e) { if (mClickTarget == mMaximize) { - maximizeWindow(); + toggleFreeformWindowingMode(); } else if (mClickTarget == mClose) { mOwner.dispatchOnWindowDismissed( true /*finishTask*/, false /*suppressWindowTransition*/); diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 258819fdece9..05aef68d7b22 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -3202,23 +3202,34 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } @Override - public void exitFreeformMode(IBinder token) { + public void toggleFreeformWindowingMode(IBinder token) { synchronized (mGlobalLock) { long ident = Binder.clearCallingIdentity(); try { final ActivityRecord r = ActivityRecord.forTokenLocked(token); if (r == null) { throw new IllegalArgumentException( - "exitFreeformMode: No activity record matching token=" + token); + "toggleFreeformWindowingMode: No activity record matching token=" + + token); } final ActivityStack stack = r.getActivityStack(); - if (stack == null || !stack.inFreeformWindowingMode()) { - throw new IllegalStateException( - "exitFreeformMode: You can only go fullscreen from freeform."); + if (stack == null) { + throw new IllegalStateException("toggleFreeformWindowingMode: the activity " + + "doesn't have a stack"); + } + + if (!stack.inFreeformWindowingMode() + && stack.getWindowingMode() != WINDOWING_MODE_FULLSCREEN) { + throw new IllegalStateException("toggleFreeformWindowingMode: You can only " + + "toggle between fullscreen and freeform."); } - stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN); + if (stack.inFreeformWindowingMode()) { + stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN); + } else { + stack.setWindowingMode(WINDOWING_MODE_FREEFORM); + } } finally { Binder.restoreCallingIdentity(ident); } |