Merge "Introduce a way to turn a fullscreen window into freeform"
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index e55c964..d29fedd 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -3783,14 +3783,14 @@
/**
- * 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 2b765b2..497d5ba 100644
--- a/core/java/android/app/IActivityTaskManager.aidl
+++ b/core/java/android/app/IActivityTaskManager.aidl
@@ -215,7 +215,7 @@
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 097f368..3544a87 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -622,11 +622,10 @@
/** @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 21558d3..e90a8d5 100644
--- a/core/java/com/android/internal/widget/DecorCaptionView.java
+++ b/core/java/com/android/internal/widget/DecorCaptionView.java
@@ -329,13 +329,13 @@
}
/**
- * 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 @@
@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 57dff89..df73d1d 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 @@
}
@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");
}
- stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+ if (!stack.inFreeformWindowingMode()
+ && stack.getWindowingMode() != WINDOWING_MODE_FULLSCREEN) {
+ throw new IllegalStateException("toggleFreeformWindowingMode: You can only "
+ + "toggle between fullscreen and freeform.");
+ }
+
+ if (stack.inFreeformWindowingMode()) {
+ stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+ } else {
+ stack.setWindowingMode(WINDOWING_MODE_FREEFORM);
+ }
} finally {
Binder.restoreCallingIdentity(ident);
}