From cacfaa216a599522190545b27c54e44ec9533f05 Mon Sep 17 00:00:00 2001 From: Wale Ogunwale Date: Fri, 15 Jan 2016 11:26:08 -0800 Subject: [PATCH] Resize pinned stack with bounds in ActivityOptions. If an activity is been launched into the pinned stack and there is a bounds specified in the ActivityOptions, use it to resize the pinned stack. Bug: 26574470 Change-Id: I43c15069b8512ce54cfde6cc16f5caa2a70bd06a --- core/java/android/app/ActivityManager.java | 8 ++++++++ .../server/am/ActivityStackSupervisor.java | 16 +++++++++++----- .../com/android/server/am/ActivityStarter.java | 15 ++++++++++++++- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 2175a9eed90f7..2dc4fb9079388 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -600,6 +600,14 @@ public class ActivityManager { public static boolean allowTopTaskToReturnHome(int stackId) { return stackId != PINNED_STACK_ID; } + + /** + * Returns true if the stack should be resized to match the bounds specified by + * {@link ActivityOptions#setLaunchBounds} when launching an activity into the stack. + */ + public static boolean resizeStackWithLaunchBounds(int stackId) { + return stackId == PINNED_STACK_ID; + } } /** diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index e837d9a0a6104..b8803bd787db3 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -1689,11 +1689,17 @@ public final class ActivityStackSupervisor implements DisplayListener { // moveTaskToStackUncheckedLocked() should already placed the task on top, // still need moveTaskToFrontLocked() below for any transition settings. } - // WM resizeTask must be done after the task is moved to the correct stack, - // because Task's setBounds() also updates dim layer's bounds, but that has - // dependency on the stack. - mWindowManager.resizeTask(task.taskId, bounds, task.mOverrideConfig, - false /*relayout*/, false /*forced*/); + if (StackId.resizeStackWithLaunchBounds(stackId)) { + resizeStackLocked(stackId, bounds, + null /* tempTaskBounds */, null /* tempTaskInsetBounds */, + !PRESERVE_WINDOWS, true /* allowResizeInDockedMode */); + } else { + // WM resizeTask must be done after the task is moved to the correct stack, + // because Task's setBounds() also updates dim layer's bounds, but that has + // dependency on the stack. + mWindowManager.resizeTask(task.taskId, bounds, task.mOverrideConfig, + false /* relayout */, false /* forced */); + } } } diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index 6fa8950507611..e44cd22dd4137 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -63,6 +63,7 @@ import static com.android.server.am.ActivityStack.ActivityState.RESUMED; import static com.android.server.am.ActivityStackSupervisor.CREATE_IF_NEEDED; import static com.android.server.am.ActivityStackSupervisor.FORCE_FOCUS; import static com.android.server.am.ActivityStackSupervisor.ON_TOP; +import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS; import static com.android.server.am.ActivityStackSupervisor.TAG_TASKS; import static com.android.server.am.EventLogTags.AM_NEW_INTENT; @@ -1426,7 +1427,14 @@ class ActivityStarter { mVoiceSession, mVoiceInteractor, !mLaunchTaskBehind /* toTop */); mStartActivity.setTask(task, taskToAffiliate); if (mLaunchBounds != null) { - mStartActivity.task.updateOverrideConfiguration(mLaunchBounds); + final int stackId = mTargetStack.mStackId; + if (StackId.resizeStackWithLaunchBounds(stackId)) { + mSupervisor.resizeStackLocked(stackId, mLaunchBounds, + null /* tempTaskBounds */, null /* tempTaskInsetBounds */, + !PRESERVE_WINDOWS, true /* allowResizeInDockedMode */); + } else { + mStartActivity.task.updateOverrideConfiguration(mLaunchBounds); + } } if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + @@ -1509,6 +1517,11 @@ class ActivityStarter { mSupervisor.moveTaskToStackUncheckedLocked( mInTask, stackId, ON_TOP, !FORCE_FOCUS, "inTaskToFront"); } + if (StackId.resizeStackWithLaunchBounds(stackId)) { + mSupervisor.resizeStackLocked(stackId, mLaunchBounds, + null /* tempTaskBounds */, null /* tempTaskInsetBounds */, + !PRESERVE_WINDOWS, true /* allowResizeInDockedMode */); + } } mTargetStack = mInTask.stack; mTargetStack.moveTaskToFrontLocked(