diff options
14 files changed, 119 insertions, 77 deletions
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 12c3a5d8cb50..3d5c606189ed 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -307,6 +307,9 @@ <!-- The padding between freeform workspace tasks --> <dimen name="recents_freeform_workspace_task_padding">8dp</dimen> + <!-- The offsets the tasks animate from when recents is launched while docking --> + <dimen name="recents_task_view_launched_while_docking_offset">144dp</dimen> + <!-- Space reserved for the cards behind the top card in the bottom stack --> <dimen name="bottom_stack_peek_amount">12dp</dimen> diff --git a/packages/SystemUI/src/com/android/systemui/recents/IRecentsSystemUserCallbacks.aidl b/packages/SystemUI/src/com/android/systemui/recents/IRecentsSystemUserCallbacks.aidl index cb8f0e7e91de..9a00d95d6060 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/IRecentsSystemUserCallbacks.aidl +++ b/packages/SystemUI/src/com/android/systemui/recents/IRecentsSystemUserCallbacks.aidl @@ -16,6 +16,8 @@ package com.android.systemui.recents; +import android.graphics.Rect; + /** * Due to the fact that RecentsActivity is per-user, we need to establish an * interface (this) for the non-system user to register itself for callbacks and to @@ -27,6 +29,6 @@ oneway interface IRecentsSystemUserCallbacks { void updateRecentsVisibility(boolean visible); void startScreenPinning(); void sendRecentsDrawnEvent(); - void sendDockingTopTaskEvent(int dragMode); + void sendDockingTopTaskEvent(int dragMode, in Rect initialRect); void sendLaunchRecentsEvent(); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java index efac0fb3d90a..da77dfd8d539 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java +++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java @@ -43,7 +43,7 @@ import com.android.systemui.R; import com.android.systemui.RecentsComponent; import com.android.systemui.SystemUI; import com.android.systemui.recents.events.EventBus; -import com.android.systemui.recents.events.activity.DockingTopTaskEvent; +import com.android.systemui.recents.events.activity.DockedTopTaskEvent; import com.android.systemui.recents.events.activity.RecentsActivityStartingEvent; import com.android.systemui.recents.events.component.RecentsVisibilityChangedEvent; import com.android.systemui.recents.events.component.ScreenPinningRequestEvent; @@ -577,14 +577,15 @@ public class Recents extends SystemUI } } - public final void onBusEvent(final DockingTopTaskEvent event) { + public final void onBusEvent(final DockedTopTaskEvent event) { int processUser = sSystemServicesProxy.getProcessUser(); if (!sSystemServicesProxy.isSystemUser(processUser)) { postToSystemUser(new Runnable() { @Override public void run() { try { - mUserToSystemCallbacks.sendDockingTopTaskEvent(event.dragMode); + mUserToSystemCallbacks.sendDockingTopTaskEvent(event.dragMode, + event.initialRect); } catch (RemoteException e) { Log.e(TAG, "Callback failed", e); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java index ac23f446cdc4..a25b399dbbbb 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java @@ -47,7 +47,7 @@ import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.SystemUIApplication; import com.android.systemui.recents.events.EventBus; -import com.android.systemui.recents.events.activity.DockingTopTaskEvent; +import com.android.systemui.recents.events.activity.DockedTopTaskEvent; import com.android.systemui.recents.events.activity.EnterRecentsWindowLastAnimationFrameEvent; import com.android.systemui.recents.events.activity.HideRecentsEvent; import com.android.systemui.recents.events.activity.IterateRecentsEvent; @@ -66,7 +66,6 @@ import com.android.systemui.recents.model.RecentsTaskLoader; import com.android.systemui.recents.model.Task; import com.android.systemui.recents.model.TaskGrouping; import com.android.systemui.recents.model.TaskStack; -import com.android.systemui.recents.tv.views.TaskStackHorizontalGridView; import com.android.systemui.recents.views.TaskStackLayoutAlgorithm; import com.android.systemui.recents.views.TaskStackView; import com.android.systemui.recents.views.TaskStackViewScroller; @@ -569,7 +568,7 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener // Make sure we inform DividerView before we actually start the activity so we can change // the resize mode already. if (ssp.moveTaskToDockedStack(topTaskId, stackCreateMode, initialBounds)) { - EventBus.getDefault().send(new DockingTopTaskEvent(dragMode)); + EventBus.getDefault().send(new DockedTopTaskEvent(dragMode, initialBounds)); showRecents( false /* triggeredFromAltTab */, dragMode == NavigationBarGestureHelper.DRAG_MODE_RECENTS, diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsSystemUser.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsSystemUser.java index f8000b8990bf..ffeb4a10b050 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsSystemUser.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsSystemUser.java @@ -17,6 +17,7 @@ package com.android.systemui.recents; import android.content.Context; +import android.graphics.Rect; import android.os.IBinder; import android.os.RemoteException; import android.util.EventLog; @@ -26,7 +27,7 @@ import android.util.SparseArray; import com.android.systemui.EventLogConstants; import com.android.systemui.EventLogTags; import com.android.systemui.recents.events.EventBus; -import com.android.systemui.recents.events.activity.DockingTopTaskEvent; +import com.android.systemui.recents.events.activity.DockedTopTaskEvent; import com.android.systemui.recents.events.activity.RecentsActivityStartingEvent; import com.android.systemui.recents.events.ui.RecentsDrawnEvent; @@ -91,8 +92,8 @@ public class RecentsSystemUser extends IRecentsSystemUserCallbacks.Stub { } @Override - public void sendDockingTopTaskEvent(int dragMode) throws RemoteException { - EventBus.getDefault().post(new DockingTopTaskEvent(dragMode)); + public void sendDockingTopTaskEvent(int dragMode, Rect initialRect) throws RemoteException { + EventBus.getDefault().post(new DockedTopTaskEvent(dragMode, initialRect)); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/recents/events/activity/DockingTopTaskEvent.java b/packages/SystemUI/src/com/android/systemui/recents/events/activity/DockedTopTaskEvent.java index 264c2c43bd2e..f1bc214670f5 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/events/activity/DockingTopTaskEvent.java +++ b/packages/SystemUI/src/com/android/systemui/recents/events/activity/DockedTopTaskEvent.java @@ -16,16 +16,21 @@ package com.android.systemui.recents.events.activity; +import android.graphics.Rect; + import com.android.systemui.recents.events.EventBus; /** - * Fires when the user invoked the gesture to dock the top/left task. + * Fires when the user invoked the gesture to dock the top/left task after we called into window + * manager and before we start recents. */ -public class DockingTopTaskEvent extends EventBus.Event { +public class DockedTopTaskEvent extends EventBus.Event { public int dragMode; + public Rect initialRect; - public DockingTopTaskEvent(int dragMode) { + public DockedTopTaskEvent(int dragMode, Rect initialRect) { this.dragMode = dragMode; + this.initialRect = initialRect; } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java index 758f4d82336b..b36d5d195138 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java @@ -71,6 +71,8 @@ public class TaskStackAnimationHelper { public static final int ENTER_FROM_HOME_ALPHA_DURATION = 100; public static final int ENTER_FROM_HOME_TRANSLATION_DURATION = 333; + public static final int ENTER_WHILE_DOCKING_DURATION = 150; + private static final PathInterpolator ENTER_FROM_HOME_TRANSLATION_INTERPOLATOR = new PathInterpolator(0, 0, 0, 1f); private static final PathInterpolator ENTER_FROM_HOME_ALPHA_INTERPOLATOR = @@ -90,6 +92,9 @@ public class TaskStackAnimationHelper { private static final PathInterpolator FOCUS_BEHIND_NEXT_TASK_INTERPOLATOR = new PathInterpolator(0.4f, 0, 0.2f, 1f); + private static final PathInterpolator ENTER_WHILE_DOCKING_INTERPOLATOR = + new PathInterpolator(0, 0, 0.2f, 1f); + private TaskStackView mStackView; private TaskViewTransform mTmpTransform = new TaskViewTransform(); @@ -122,6 +127,8 @@ public class TaskStackAnimationHelper { int offscreenYOffset = stackLayout.mStackRect.height(); int taskViewAffiliateGroupEnterOffset = res.getDimensionPixelSize( R.dimen.recents_task_view_affiliate_group_enter_offset); + int launchedWhileDockingOffset = res.getDimensionPixelSize( + R.dimen.recents_task_view_launched_while_docking_offset); // Prepare each of the task views for their enter animation from front to back List<TaskView> taskViews = mStackView.getTaskViews(); @@ -141,7 +148,7 @@ public class TaskStackAnimationHelper { tv.setVisibility(View.INVISIBLE); } else if (launchState.launchedHasConfigurationChanged) { // Just load the views as-is - } else if (launchState.launchedFromApp) { + } else if (launchState.launchedFromApp && !launchState.launchedWhileDocking) { if (task.isLaunchTarget) { tv.onPrepareLaunchTargetForEnterAnimation(); } else if (currentTaskOccludesLaunchTarget) { @@ -159,6 +166,11 @@ public class TaskStackAnimationHelper { bounds.offset(0, offscreenYOffset); tv.setLeftTopRightBottom((int) bounds.left, (int) bounds.top, (int) bounds.right, (int) bounds.bottom); + } else if (launchState.launchedWhileDocking) { + RectF bounds = new RectF(mTmpTransform.rect); + bounds.offset(0, launchedWhileDockingOffset); + tv.setLeftTopRightBottom((int) bounds.left, (int) bounds.top, (int) bounds.right, + (int) bounds.bottom); } } } @@ -192,6 +204,7 @@ public class TaskStackAnimationHelper { int taskViewCount = taskViews.size(); for (int i = taskViewCount - 1; i >= 0; i--) { int taskIndexFromFront = taskViewCount - i - 1; + int taskIndexFromBack = i; final TaskView tv = taskViews.get(i); Task task = tv.getTask(); boolean currentTaskOccludesLaunchTarget = false; @@ -205,7 +218,7 @@ public class TaskStackAnimationHelper { stackLayout.getStackTransform(task, stackScroller.getStackScroll(), mTmpTransform, null); - if (launchState.launchedFromApp) { + if (launchState.launchedFromApp && !launchState.launchedWhileDocking) { if (task.isLaunchTarget) { tv.onStartLaunchTargetEnterAnimation(mTmpTransform, taskViewEnterFromAppDuration, mStackView.mScreenPinningEnabled, @@ -241,6 +254,16 @@ public class TaskStackAnimationHelper { .setListener(postAnimationTrigger.decrementOnAnimationEnd()); postAnimationTrigger.increment(); mStackView.updateTaskViewToTransform(tv, mTmpTransform, taskAnimation); + } else if (launchState.launchedWhileDocking) { + // Animate the tasks up + AnimationProps taskAnimation = new AnimationProps() + .setDuration(AnimationProps.BOUNDS, (int) (ENTER_WHILE_DOCKING_DURATION + + (taskIndexFromBack * 2f * FRAME_OFFSET_MS))) + .setInterpolator(AnimationProps.BOUNDS, + ENTER_WHILE_DOCKING_INTERPOLATOR) + .setListener(postAnimationTrigger.decrementOnAnimationEnd()); + postAnimationTrigger.increment(); + mStackView.updateTaskViewToTransform(tv, mTmpTransform, taskAnimation); } } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java index 9da8fee137a6..e6ab46e6164a 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java @@ -638,9 +638,6 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal // If we had a deferred animation, cancel that mDeferredTaskViewLayoutAnimation = null; - // Cancel all task view animations - cancelAllTaskViewAnimations(); - // Synchronize the current set of TaskViews bindVisibleTaskViews(mStackScroller.getStackScroll(), ignoreTasksSet, false /* ignoreTaskOverrides */); @@ -675,6 +672,10 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal */ public void updateTaskViewToTransform(TaskView taskView, TaskViewTransform transform, AnimationProps animation) { + if (taskView.isAnimatingTo(transform)) { + return; + } + taskView.cancelTransformAnimation(); taskView.updateViewPropertiesToTaskTransform(transform, animation, mRequestUpdateClippingListener); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java index 0bc7f8927a9c..7584a2e08f85 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java @@ -147,6 +147,7 @@ public class TaskView extends FixedSizeFrameLayout implements Task.TaskCallbacks AnimateableViewBounds mViewBounds; private AnimatorSet mTransformAnimation; + private final TaskViewTransform mTargetAnimationTransform = new TaskViewTransform(); private ArrayList<Animator> mTmpAnimators = new ArrayList<>(); View mContent; @@ -319,6 +320,7 @@ public class TaskView extends FixedSizeFrameLayout implements Task.TaskCallbacks // Create the animator mTransformAnimation = toAnimation.createAnimator(mTmpAnimators); mTransformAnimation.start(); + mTargetAnimationTransform.copyFrom(toTransform); } } @@ -338,6 +340,14 @@ public class TaskView extends FixedSizeFrameLayout implements Task.TaskCallbacks } /** + * @return whether we are animating towards {@param transform} + */ + boolean isAnimatingTo(TaskViewTransform transform) { + return mTransformAnimation != null && mTransformAnimation.isStarted() + && mTargetAnimationTransform.isSame(transform); + } + + /** * Cancels any current transform animations. */ public void cancelTransformAnimation() { diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java index 0d16a79735fd..dc76e61c0d1e 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java @@ -121,6 +121,18 @@ public class TaskViewTransform { } /** + * @return whether {@param other} is the same transform as this + */ + public boolean isSame(TaskViewTransform other) { + return translationZ == other.translationZ + && scale == other.scale + && other.alpha == alpha + && dimAlpha == other.dimAlpha + && visible == other.visible + && rect.equals(other.rect); + } + + /** * Resets the current transform. */ public void reset() { diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java index da5cbe7a9003..7cb1f241af4c 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java @@ -53,7 +53,7 @@ import com.android.internal.policy.DockedDividerUtils; import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.recents.events.EventBus; -import com.android.systemui.recents.events.activity.DockingTopTaskEvent; +import com.android.systemui.recents.events.activity.DockedTopTaskEvent; import com.android.systemui.recents.events.activity.RecentsActivityStartingEvent; import com.android.systemui.recents.events.activity.UndockingTaskEvent; import com.android.systemui.recents.events.ui.RecentsDrawnEvent; @@ -123,6 +123,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, private final Rect mDockedInsetRect = new Rect(); private final Rect mOtherInsetRect = new Rect(); private final Rect mLastResizeRect = new Rect(); + private final Rect mDisplayRect = new Rect(); private final WindowManagerProxy mWindowManagerProxy = WindowManagerProxy.getInstance(); private DividerWindowManager mWindowManager; private VelocityTracker mVelocityTracker; @@ -133,7 +134,8 @@ public class DividerView extends FrameLayout implements OnTouchListener, private boolean mAnimateAfterRecentsDrawn; private boolean mGrowAfterRecentsDrawn; private boolean mGrowRecents; - private Animator mCurrentAnimator; + private ValueAnimator mCurrentAnimator; + private boolean mEntranceAnimationRunning; private final AccessibilityDelegate mHandleDelegate = new AccessibilityDelegate() { @Override @@ -411,6 +413,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, mWindowManagerProxy.setResizing(false); mDockSide = WindowManager.DOCKED_INVALID; mCurrentAnimator = null; + mEntranceAnimationRunning = false; } }); mCurrentAnimator = anim; @@ -594,7 +597,18 @@ public class DividerView extends FrameLayout implements OnTouchListener, } mLastResizeRect.set(mDockedRect); - if (taskPosition != TASK_POSITION_SAME) { + if (mEntranceAnimationRunning && taskPosition != TASK_POSITION_SAME) { + if (mCurrentAnimator != null) { + calculateBoundsForPosition(taskPosition, mDockSide, mDockedTaskRect); + } else { + calculateBoundsForPosition(isHorizontalDivision() ? mDisplayHeight : mDisplayWidth, + mDockSide, mDockedTaskRect); + } + calculateBoundsForPosition(taskPosition, DockedDividerUtils.invertDockSide(mDockSide), + mOtherTaskRect); + mWindowManagerProxy.resizeDockedStack(mDockedRect, mDockedTaskRect, null, + mOtherTaskRect, null); + } else if (taskPosition != TASK_POSITION_SAME) { calculateBoundsForPosition(position, DockedDividerUtils.invertDockSide(mDockSide), mOtherRect); int dockSideInverted = DockedDividerUtils.invertDockSide(mDockSide); @@ -610,16 +624,17 @@ public class DividerView extends FrameLayout implements OnTouchListener, calculateBoundsForPosition(taskPositionDocked, mDockSide, mDockedTaskRect); calculateBoundsForPosition(taskPositionOther, dockSideInverted, mOtherTaskRect); + mDisplayRect.set(0, 0, mDisplayWidth, mDisplayHeight); alignTopLeft(mDockedRect, mDockedTaskRect); alignTopLeft(mOtherRect, mOtherTaskRect); mDockedInsetRect.set(mDockedTaskRect); mOtherInsetRect.set(mOtherTaskRect); if (dockSideTopLeft(mDockSide)) { - alignTopLeft(mDockedRect, mDockedInsetRect); - alignBottomRight(mOtherRect, mOtherInsetRect); + alignTopLeft(mDisplayRect, mDockedInsetRect); + alignBottomRight(mDisplayRect, mOtherInsetRect); } else { - alignBottomRight(mDockedRect, mDockedInsetRect); - alignTopLeft(mOtherRect, mOtherInsetRect); + alignBottomRight(mDisplayRect, mDockedInsetRect); + alignTopLeft(mDisplayRect, mOtherInsetRect); } applyDismissingParallax(mDockedTaskRect, mDockSide, taskSnapTarget, position, taskPositionDocked); @@ -638,6 +653,9 @@ public class DividerView extends FrameLayout implements OnTouchListener, } private float getDimFraction(int position, SnapTarget dismissTarget) { + if (mEntranceAnimationRunning) { + return 0f; + } float fraction = mSnapAlgorithm.calculateDismissingFraction(position); fraction = Math.max(0, Math.min(fraction, 1f)); fraction = DIM_INTERPOLATOR.getInterpolation(fraction); @@ -839,12 +857,18 @@ public class DividerView extends FrameLayout implements OnTouchListener, } } - public final void onBusEvent(DockingTopTaskEvent dockingEvent) { - if (dockingEvent.dragMode == NavigationBarGestureHelper.DRAG_MODE_NONE) { + public final void onBusEvent(DockedTopTaskEvent event) { + if (event.dragMode == NavigationBarGestureHelper.DRAG_MODE_NONE) { mGrowAfterRecentsDrawn = false; mAnimateAfterRecentsDrawn = true; startDragging(false /* animate */, false /* touching */); } + updateDockSide(); + int position = DockedDividerUtils.calculatePositionForBounds(event.initialRect, + mDockSide, mDividerSize); + mEntranceAnimationRunning = true; + resizeStack(position, mSnapAlgorithm.getMiddleTarget().position, + mSnapAlgorithm.getMiddleTarget()); } public final void onBusEvent(RecentsDrawnEvent drawnEvent) { diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index e50722ac04d8..2f5018d86732 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -414,6 +414,12 @@ final class ActivityStack { mTaskPositioner.reset(); } mWindowManager.detachStack(mStackId); + if (mStackId == DOCKED_STACK_ID) { + // If we removed a docked stack we want to resize it so it resizes all other stacks + // in the system to fullscreen. + mStackSupervisor.resizeDockedStackLocked( + null, null, null, null, null, PRESERVE_WINDOWS); + } } public void getDisplaySize(Point out) { diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index 676b90fd4d38..60b2e4a68f6d 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -148,9 +148,7 @@ public class TaskStack implements DimLayer.DimLayerUser, boolean setBounds( Rect stackBounds, SparseArray<Configuration> configs, SparseArray<Rect> taskBounds, SparseArray<Rect> taskTempInsetBounds) { - if (!setBounds(stackBounds)) { - return false; - } + setBounds(stackBounds); // Update bounds of containing tasks. for (int taskNdx = mTasks.size() - 1; taskNdx >= 0; --taskNdx) { @@ -608,13 +606,6 @@ public class TaskStack implements DimLayer.DimLayerUser, } updateDisplayInfo(bounds); - - if (mStackId == DOCKED_STACK_ID) { - // Attaching a docked stack to the display affects the size of all other static - // stacks since the docked stack occupies a dedicated region on screen. - // Resize existing static stacks so they are pushed to the side of the docked stack. - resizeNonDockedStacks(!FULLSCREEN, mBounds); - } } void getStackDockedModeBoundsLocked(Rect outBounds, boolean ignoreVisibility) { @@ -723,36 +714,6 @@ public class TaskStack implements DimLayer.DimLayerUser, DockedDividerUtils.sanitizeStackBounds(outBounds, !dockOnTopOrLeft); } - /** Resizes all non-docked stacks in the system to either fullscreen or the appropriate size - * based on the presence of a docked stack. - * @param fullscreen If true the stacks will be resized to fullscreen, else they will be - * resized to the appropriate size based on the presence of a docked stack. - * @param dockedBounds Bounds of the docked stack. - */ - private void resizeNonDockedStacks(boolean fullscreen, Rect dockedBounds) { - // Not using mTmpRect because we are posting the object in a message. - final Rect bounds = new Rect(); - mDisplayContent.getLogicalDisplayRect(bounds); - if (!fullscreen) { - final boolean dockedOnTopOrLeft = mService.mDockedStackCreateMode - == DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT; - getStackDockedModeBounds(bounds, bounds, FULLSCREEN_WORKSPACE_STACK_ID, dockedBounds, - mDisplayContent.mDividerControllerLocked.getContentWidth(), dockedOnTopOrLeft); - } - - final int count = mService.mStackIdToStack.size(); - for (int i = 0; i < count; i++) { - final TaskStack otherStack = mService.mStackIdToStack.valueAt(i); - final int otherStackId = otherStack.mStackId; - if (StackId.isResizeableByDockedStack(otherStackId) - && !otherStack.mBounds.equals(bounds)) { - mService.mH.sendMessage( - mService.mH.obtainMessage(RESIZE_STACK, otherStackId, - 1 /*allowResizeInDockedMode*/, fullscreen ? null : bounds)); - } - } - } - void resetDockedStackToMiddle() { if (mStackId != DOCKED_STACK_ID) { throw new IllegalStateException("Not a docked stack=" + this); @@ -786,12 +747,6 @@ public class TaskStack implements DimLayer.DimLayerUser, mService.mWindowPlacerLocked.requestTraversal(); } - if (mStackId == DOCKED_STACK_ID) { - // Docked stack was detached from the display, so we no longer need to restrict the - // region of the screen other static stacks occupy. Go ahead and make them fullscreen. - resizeNonDockedStacks(FULLSCREEN, null); - } - close(); } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 617d2b4d28e3..910788ea8b91 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -780,9 +780,9 @@ final class WindowState implements WindowManagerPolicy.WindowState { Math.min(mStableFrame.bottom, frame.bottom)); } - if (!windowsAreFloating) { - // Windows from floating tasks (e.g. freeform, pinned) may be positioned outside - // of the display frame, but that is not a reason to provide them with overscan insets. + if (fullscreenTask && !windowsAreFloating) { + // Windows that are not fullscreen can be positioned outside of the display frame, + // but that is not a reason to provide them with overscan insets. mOverscanInsets.set(Math.max(mOverscanFrame.left - frame.left, 0), Math.max(mOverscanFrame.top - frame.top, 0), Math.max(frame.right - mOverscanFrame.right, 0), @@ -2257,7 +2257,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { // background. return (mDisplayContent.mDividerControllerLocked.isResizing() || mAppToken != null && !mAppToken.mFrozenBounds.isEmpty()) && - !task.inFreeformWorkspace() && isVisibleLw(); + !task.inFreeformWorkspace() && !isGoneForLayoutLw(); } |