diff options
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityStackSupervisor.java | 62 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/TaskRecord.java | 52 |
2 files changed, 60 insertions, 54 deletions
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index dd9b6f13869d..8ab4ae59a201 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -205,6 +205,13 @@ public final class ActivityStackSupervisor implements DisplayListener { /** Action restriction: launching the activity is restricted by an app op. */ private static final int ACTIVITY_RESTRICTION_APPOP = 2; + // The height/width divide used when fitting a task within a bounds with method + // {@link #fitWithinBounds}. + // We always want the task to to be visible in the bounds without affecting its size when + // fitting. To make sure this is the case, we don't adjust the task left or top side pass + // the input bounds right or bottom side minus the width or height divided by this value. + private static final int FIT_WITHIN_BOUNDS_DIVIDER = 3; + /** Status Bar Service **/ private IBinder mToken = new Binder(); private IStatusBarService mStatusBarService; @@ -330,8 +337,9 @@ public final class ActivityStackSupervisor implements DisplayListener { /** Used to keep resumeTopActivityLocked() from being entered recursively */ boolean inResumeTopActivity; - // temp. rect used during resize calculation so we don't need to create a new object each time. + // temp. rects used during resize calculation so we don't need to create a new object each time. private final Rect tempRect = new Rect(); + private final Rect tempRect2 = new Rect(); private final SparseArray<Configuration> mTmpConfigs = new SparseArray<>(); private final SparseArray<Rect> mTmpBounds = new SparseArray<>(); @@ -2970,7 +2978,17 @@ public final class ActivityStackSupervisor implements DisplayListener { ArrayList<TaskRecord> tasks = stack.getAllTasks(); for (int i = tasks.size() - 1; i >= 0; i--) { TaskRecord task = tasks.get(i); - task.updateOverrideConfiguration(bounds); + if (stack.mStackId == FREEFORM_WORKSPACE_STACK_ID) { + // For freeform stack we don't adjust the size of the tasks to match that of + // the stack, but we do try to make sure the tasks are still contained with the + // bounds of the stack. + tempRect2.set(task.mBounds); + fitWithinBounds(tempRect2, bounds); + task.updateOverrideConfiguration(tempRect2); + } else { + task.updateOverrideConfiguration(bounds); + } + mTmpConfigs.put(task.taskId, task.mOverrideConfig); mTmpBounds.put(task.taskId, task.mBounds); } @@ -4839,4 +4857,44 @@ public final class ActivityStackSupervisor implements DisplayListener { return onLeanbackOnly; } + + /** + * Adjust bounds to stay within stack bounds. + * + * Since bounds might be outside of stack bounds, this method tries to move the bounds in a way + * that keep them unchanged, but be contained within the stack bounds. + * + * @param bounds Bounds to be adjusted. + * @param stackBounds Bounds within which the other bounds should remain. + */ + private static void fitWithinBounds(Rect bounds, Rect stackBounds) { + if (stackBounds == null || stackBounds.contains(bounds)) { + return; + } + + if (bounds.left < stackBounds.left || bounds.right > stackBounds.right) { + final int maxRight = stackBounds.right + - (stackBounds.width() / FIT_WITHIN_BOUNDS_DIVIDER); + int horizontalDiff = stackBounds.left - bounds.left; + if ((horizontalDiff < 0 && bounds.left >= maxRight) + || (bounds.left + horizontalDiff >= maxRight)) { + horizontalDiff = maxRight - bounds.left; + } + bounds.left += horizontalDiff; + bounds.right += horizontalDiff; + } + + if (bounds.top < stackBounds.top || bounds.bottom > stackBounds.bottom) { + final int maxBottom = stackBounds.bottom + - (stackBounds.height() / FIT_WITHIN_BOUNDS_DIVIDER); + int verticalDiff = stackBounds.top - bounds.top; + if ((verticalDiff < 0 && bounds.top >= maxBottom) + || (bounds.top + verticalDiff >= maxBottom)) { + verticalDiff = maxBottom - bounds.top; + } + bounds.top += verticalDiff; + bounds.bottom += verticalDiff; + } + } + } diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index 5694e7046888..8f10f083c0ff 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -108,13 +108,6 @@ final class TaskRecord { static final int INVALID_TASK_ID = -1; - // The height/width divide used when fitting a task within a bounds with method - // {@link #fitWithinBounds}. - // We always want the task to to be visible in the bounds without affecting its size when - // fitting. To make sure this is the case, we don't adjust the task left or top side pass - // the input bounds right or bottom side minus the width or height divided by this value. - private static final int FIT_WITHIN_BOUNDS_DIVIDER = 3; - final int taskId; // Unique identifier for this task. String affinity; // The affinity name for this task, or null; may change identity. String rootAffinity; // Initial base affinity, or null; does not change from initial root. @@ -1186,12 +1179,6 @@ final class TaskRecord { * @return Update configuration or null if there is no change. */ Configuration updateOverrideConfiguration(Rect bounds) { - if (stack.mStackId == FREEFORM_WORKSPACE_STACK_ID) { - // For freeform stack we don't adjust the size of the tasks to match that of the - // stack, but we do try to make sure the tasks are still contained with the - // bounds of the stack. - fitWithinBounds(bounds, stack.mBounds); - } if (Objects.equals(mBounds, bounds)) { return null; } @@ -1255,45 +1242,6 @@ final class TaskRecord { return mLastNonFullscreenBounds; } - /** - * Adjust bounds to stay within stack bounds. - * - * Since bounds might be outside of stack bounds, this method tries to move the bounds in a way - * that keep them unchanged, but be contained within the stack bounds. - * - * @param bounds Bounds to be adjusted. - * @param stackBounds Bounds within which the other bounds should remain. - */ - private static void fitWithinBounds(Rect bounds, Rect stackBounds) { - if (stackBounds == null || stackBounds.contains(bounds)) { - return; - } - - if (bounds.left < stackBounds.left || bounds.right > stackBounds.right) { - final int maxRight = stackBounds.right - - (stackBounds.width() / FIT_WITHIN_BOUNDS_DIVIDER); - int horizontalDiff = stackBounds.left - bounds.left; - if ((horizontalDiff < 0 && bounds.left >= maxRight) - || (bounds.left + horizontalDiff >= maxRight)) { - horizontalDiff = maxRight - bounds.left; - } - bounds.left += horizontalDiff; - bounds.right += horizontalDiff; - } - - if (bounds.top < stackBounds.top || bounds.bottom > stackBounds.bottom) { - final int maxBottom = stackBounds.bottom - - (stackBounds.height() / FIT_WITHIN_BOUNDS_DIVIDER); - int verticalDiff = stackBounds.top - bounds.top; - if ((verticalDiff < 0 && bounds.top >= maxBottom) - || (bounds.top + verticalDiff >= maxBottom)) { - verticalDiff = maxBottom - bounds.top; - } - bounds.top += verticalDiff; - bounds.bottom += verticalDiff; - } - } - void dump(PrintWriter pw, String prefix) { pw.print(prefix); pw.print("userId="); pw.print(userId); pw.print(" effectiveUid="); UserHandle.formatUid(pw, effectiveUid); |