summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/IWindowManager.aidl3
-rw-r--r--services/core/java/com/android/server/am/ActivityStack.java2
-rw-r--r--services/core/java/com/android/server/wm/AppWindowToken.java3
-rw-r--r--services/core/java/com/android/server/wm/DragState.java2
-rw-r--r--services/core/java/com/android/server/wm/InputMonitor.java2
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java5
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java37
-rw-r--r--services/core/java/com/android/server/wm/WindowStateAnimator.java3
-rw-r--r--tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java2
-rw-r--r--tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java2
10 files changed, 39 insertions, 22 deletions
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 33c51ff367c9..32ef99582ac9 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -98,11 +98,12 @@ interface IWindowManager
* @param taskBounds Bounds to use when creating a new Task with the input task Id if
* the task doesn't exist yet.
* @param configuration Configuration that is being used with this task.
+ * @param cropWindowsToStack True if the app windows should be cropped to the stack bounds.
*/
void addAppToken(int addPos, IApplicationToken token, int taskId, int stackId,
int requestedOrientation, boolean fullscreen, boolean showWhenLocked, int userId,
int configChanges, boolean voiceInteraction, boolean launchTaskBehind,
- in Rect taskBounds, in Configuration configuration);
+ in Rect taskBounds, in Configuration configuration, boolean cropWindowsToStack);
/**
*
* @param token The token we are adding to the input task Id.
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index b6f3dc8fe138..3fcffd78d049 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -4606,7 +4606,7 @@ final class ActivityStack {
r.task.taskId, mStackId, r.info.screenOrientation, r.fullscreen,
(r.info.flags & ActivityInfo.FLAG_SHOW_FOR_ALL_USERS) != 0, r.userId,
r.info.configChanges, task.voiceSession != null, r.mLaunchTaskBehind,
- bounds, task.mOverrideConfig);
+ bounds, task.mOverrideConfig, !r.isHomeActivity());
r.taskConfigOverride = task.mOverrideConfig;
}
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index 4f62909c061a..ff216c5c763d 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -112,6 +112,9 @@ class AppWindowToken extends WindowToken {
boolean mLaunchTaskBehind;
boolean mEnteringAnimation;
+ // True if the windows associated with this token should be cropped to their stack bounds.
+ boolean mCropWindowsToStack;
+
// This application will have its window replaced due to relaunch. This allows window manager
// to differentiate between simple removal of a window and replacement. In the latter case it
// will preserve the old window until the new one is drawn.
diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java
index f9809b161144..1e628ffb102c 100644
--- a/services/core/java/com/android/server/wm/DragState.java
+++ b/services/core/java/com/android/server/wm/DragState.java
@@ -415,7 +415,7 @@ class DragState {
continue;
}
- child.getStackBounds(mTmpRect, !BOUNDS_FOR_TOUCH);
+ child.getVisibleBounds(mTmpRect, !BOUNDS_FOR_TOUCH);
if (!mTmpRect.contains(x, y)) {
// outside of this window's activity stack == don't tell about drags
continue;
diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java
index 38988b922c73..4244205aabf8 100644
--- a/services/core/java/com/android/server/wm/InputMonitor.java
+++ b/services/core/java/com/android/server/wm/InputMonitor.java
@@ -178,7 +178,7 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks {
if (modal && child.mAppToken != null) {
// Limit the outer touch to the activity stack region.
flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
- child.getStackBounds(mTmpRect, BOUNDS_FOR_TOUCH);
+ child.getVisibleBounds(mTmpRect, BOUNDS_FOR_TOUCH);
inputWindowHandle.touchableRegion.set(mTmpRect);
} else {
// Not modal or full screen modal
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 7f5e752a6c9c..9608a999cb01 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -3058,7 +3058,7 @@ public class WindowManagerService extends IWindowManager.Stub
public void addAppToken(int addPos, IApplicationToken token, int taskId, int stackId,
int requestedOrientation, boolean fullscreen, boolean showForAllUsers, int userId,
int configChanges, boolean voiceInteraction, boolean launchTaskBehind,
- Rect taskBounds, Configuration config) {
+ Rect taskBounds, Configuration config, boolean cropWindowsToStack) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"addAppToken()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
@@ -3092,6 +3092,7 @@ public class WindowManagerService extends IWindowManager.Stub
atoken.layoutConfigChanges = (configChanges &
(ActivityInfo.CONFIG_SCREEN_SIZE | ActivityInfo.CONFIG_ORIENTATION)) != 0;
atoken.mLaunchTaskBehind = launchTaskBehind;
+ atoken.mCropWindowsToStack = cropWindowsToStack;
if (DEBUG_TOKEN_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG, "addAppToken: " + atoken
+ " to stack=" + stackId + " task=" + taskId + " at " + addPos);
@@ -5634,7 +5635,7 @@ public class WindowManagerService extends IWindowManager.Stub
int right = wf.right - cr.right;
int bottom = wf.bottom - cr.bottom;
frame.union(left, top, right, bottom);
- ws.getStackBounds(stackBounds, !BOUNDS_FOR_TOUCH);
+ ws.getVisibleBounds(stackBounds, !BOUNDS_FOR_TOUCH);
if (!frame.intersect(stackBounds)) {
// Set frame empty if there's no intersection.
frame.setEmpty();
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index d48ba5716f94..94bc8d75829c 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -935,26 +935,37 @@ final class WindowState implements WindowManagerPolicy.WindowState {
}
/**
- * Retrieves the bounds of the window stack.
+ * Retrieves the visible bounds of the window.
* @param bounds The rect which gets the bounds.
* @param forTouch Pass in BOUNDS_FOR_TOUCH to get touch related bounds, otherwise visible
* bounds will be returned.
*/
- void getStackBounds(Rect bounds, boolean forTouch) {
- final TaskStack stack = getStack();
- if (stack != null) {
- stack.getBounds(bounds);
- if (forTouch == BOUNDS_FOR_TOUCH) {
- if (stack.mStackId == FREEFORM_WORKSPACE_STACK_ID) {
- final DisplayMetrics displayMetrics = getDisplayContent().getDisplayMetrics();
- final int delta =
- mService.dipToPixel(RESIZE_HANDLE_WIDTH_IN_DP, displayMetrics);
- bounds.inset(-delta, -delta);
- }
+ void getVisibleBounds(Rect bounds, boolean forTouch) {
+ final boolean useStackBounds = mAppToken != null && mAppToken.mCropWindowsToStack;
+ boolean isFreeform = false;
+ bounds.setEmpty();
+ if (useStackBounds) {
+ final TaskStack stack = getStack();
+ if (stack != null) {
+ stack.getBounds(bounds);
+ isFreeform = stack.mStackId == FREEFORM_WORKSPACE_STACK_ID;
+ }
+ } else {
+ final Task task = getTask();
+ if (task != null) {
+ task.getBounds(bounds);
+ isFreeform = task.inFreeformWorkspace();
}
+ }
+ if (bounds.isEmpty()) {
+ bounds.set(mFrame);
return;
}
- bounds.set(mFrame);
+ if (forTouch && isFreeform) {
+ final DisplayMetrics displayMetrics = getDisplayContent().getDisplayMetrics();
+ final int delta = mService.dipToPixel(RESIZE_HANDLE_WIDTH_IN_DP, displayMetrics);
+ bounds.inset(-delta, -delta);
+ }
}
public long getInputDispatchingTimeoutNanos() {
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index dfc9784249a9..2fe7fd658243 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -1377,7 +1377,8 @@ class WindowStateAnimator {
}
private void adjustCropToStackBounds(WindowState w, Rect clipRect) {
- if (w.getAttrs().type == LayoutParams.TYPE_BASE_APPLICATION) {
+ final AppWindowToken appToken = w.mAppToken;
+ if (appToken != null && appToken.mCropWindowsToStack) {
TaskStack stack = w.getTask().mStack;
stack.getBounds(mTmpStackBounds);
final int surfaceX = (int) mSurfaceX;
diff --git a/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java b/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java
index 95f676e08895..b9e7500598d1 100644
--- a/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java
+++ b/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java
@@ -94,7 +94,7 @@ public class WindowManagerPermissionTests extends TestCase {
try {
mWm.addAppToken(0, null, 0, 0, 0, false, false, 0, 0, false, false, null,
- Configuration.EMPTY);
+ Configuration.EMPTY, false);
fail("IWindowManager.addAppToken did not throw SecurityException as"
+ " expected");
} catch (SecurityException e) {
diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
index ed8b56e1e601..778d1a5e51ac 100644
--- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
+++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
@@ -76,7 +76,7 @@ public class IWindowManagerImpl implements IWindowManager {
@Override
public void addAppToken(int arg0, IApplicationToken arg1, int arg2, int arg3, int arg4,
boolean arg5, boolean arg6, int arg7, int arg8, boolean arg9, boolean arg10,
- Rect arg11, Configuration arg12) throws RemoteException {
+ Rect arg11, Configuration arg12, boolean arg13) throws RemoteException {
// TODO Auto-generated method stub
}