Merge "Animation for docking task gesture" into nyc-dev
This commit is contained in:
@@ -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>
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -641,9 +641,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 */);
|
||||
@@ -678,6 +675,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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -337,6 +339,14 @@ public class TaskView extends FixedSizeFrameLayout implements Task.TaskCallbacks
|
||||
mActionButtonView.setTranslationZ(mActionButtonTranslationZ);
|
||||
}
|
||||
|
||||
/**
|
||||
* @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.
|
||||
*/
|
||||
|
||||
@@ -120,6 +120,18 @@ public class TaskViewTransform {
|
||||
rect.set(other.rect);
|
||||
}
|
||||
|
||||
/**
|
||||
* @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.
|
||||
*/
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user