Merge "Preserve non-floating state when entering pinned stack." into oc-dev

am: f5b6818009

Change-Id: I22f408fef8007cb5c1266a7115da01c07b4f0eb4
This commit is contained in:
Rob Carr
2017-05-15 23:38:21 +00:00
committed by android-build-merger
10 changed files with 81 additions and 103 deletions

View File

@@ -2092,7 +2092,6 @@ public class Activity extends ContextThemeWrapper
if (params == null) {
throw new IllegalArgumentException("Expected non-null picture-in-picture params");
}
updatePictureInPictureParamsForContentInsets(params);
return ActivityManagerNative.getDefault().enterPictureInPictureMode(mToken, params);
} catch (RemoteException e) {
return false;
@@ -2116,7 +2115,6 @@ public class Activity extends ContextThemeWrapper
if (params == null) {
throw new IllegalArgumentException("Expected non-null picture-in-picture params");
}
updatePictureInPictureParamsForContentInsets(params);
ActivityManagerNative.getDefault().setPictureInPictureParams(mToken, params);
} catch (RemoteException e) {
}
@@ -2136,21 +2134,6 @@ public class Activity extends ContextThemeWrapper
}
}
/**
* Updates the provided {@param params} with the last known content insets for this activity, to
* be used with the source hint rect for the transition into PiP.
*/
private void updatePictureInPictureParamsForContentInsets(PictureInPictureParams params) {
if (params != null && params.hasSourceBoundsHint() && getWindow() != null &&
getWindow().peekDecorView() != null &&
getWindow().peekDecorView().getViewRootImpl() != null) {
params.setSourceRectHintInsets(
getWindow().peekDecorView().getViewRootImpl().getLastContentInsets());
} else {
params.setSourceRectHintInsets(null);
}
}
void dispatchMovedToDisplay(int displayId, Configuration config) {
updateDisplay(displayId);
onMovedToDisplay(displayId, config);

View File

@@ -160,9 +160,6 @@ public final class PictureInPictureArgs implements Parcelable {
if (in.readInt() != 0) {
mSourceRectHint = Rect.CREATOR.createFromParcel(in);
}
if (in.readInt() != 0) {
mSourceRectHintInsets = Rect.CREATOR.createFromParcel(in);
}
}
private PictureInPictureArgs(Rational aspectRatio, List<RemoteAction> actions,
@@ -220,9 +217,6 @@ public final class PictureInPictureArgs implements Parcelable {
if (otherArgs.hasSourceBoundsHint()) {
mSourceRectHint = new Rect(otherArgs.getSourceRectHint());
}
if (otherArgs.hasSourceBoundsHintInsets()) {
mSourceRectHintInsets = new Rect(otherArgs.getSourceRectHintInsets());
}
}
/**
@@ -346,12 +340,6 @@ public final class PictureInPictureArgs implements Parcelable {
} else {
out.writeInt(0);
}
if (mSourceRectHintInsets != null) {
out.writeInt(1);
mSourceRectHintInsets.writeToParcel(out, 0);
} else {
out.writeInt(0);
}
}
public static final Creator<PictureInPictureArgs> CREATOR =

View File

@@ -135,13 +135,6 @@ public final class PictureInPictureParams implements Parcelable {
@Nullable
private Rect mSourceRectHint;
/**
* The content insets that are used with the source hint rect for the transition into PiP where
* the insets are removed at the beginning of the transition.
*/
@Nullable
private Rect mSourceRectHintInsets;
/** {@hide} */
PictureInPictureParams() {
}
@@ -158,9 +151,6 @@ public final class PictureInPictureParams implements Parcelable {
if (in.readInt() != 0) {
mSourceRectHint = Rect.CREATOR.createFromParcel(in);
}
if (in.readInt() != 0) {
mSourceRectHintInsets = Rect.CREATOR.createFromParcel(in);
}
}
/** {@hide} */
@@ -185,9 +175,6 @@ public final class PictureInPictureParams implements Parcelable {
if (otherArgs.hasSourceBoundsHint()) {
mSourceRectHint = new Rect(otherArgs.getSourceRectHint());
}
if (otherArgs.hasSourceBoundsHintInsets()) {
mSourceRectHintInsets = new Rect(otherArgs.getSourceRectHintInsets());
}
}
/**
@@ -240,19 +227,6 @@ public final class PictureInPictureParams implements Parcelable {
}
}
/**
* Sets the insets to be used with the source rect hint bounds.
* @hide
*/
@Deprecated
public void setSourceRectHintInsets(Rect insets) {
if (insets == null) {
mSourceRectHintInsets = null;
} else {
mSourceRectHintInsets = new Rect(insets);
}
}
/**
* @return the source rect hint
* @hide
@@ -261,14 +235,6 @@ public final class PictureInPictureParams implements Parcelable {
return mSourceRectHint;
}
/**
* @return the source rect hint insets.
* @hide
*/
public Rect getSourceRectHintInsets() {
return mSourceRectHintInsets;
}
/**
* @return whether there are launch bounds set
* @hide
@@ -277,14 +243,6 @@ public final class PictureInPictureParams implements Parcelable {
return mSourceRectHint != null && !mSourceRectHint.isEmpty();
}
/**
* @return whether there are source rect hint insets set
* @hide
*/
public boolean hasSourceBoundsHintInsets() {
return mSourceRectHintInsets != null;
}
@Override
public int describeContents() {
return 0;
@@ -311,12 +269,6 @@ public final class PictureInPictureParams implements Parcelable {
} else {
out.writeInt(0);
}
if (mSourceRectHintInsets != null) {
out.writeInt(1);
mSourceRectHintInsets.writeToParcel(out, 0);
} else {
out.writeInt(0);
}
}
public static final Creator<PictureInPictureParams> CREATOR =
@@ -328,4 +280,4 @@ public final class PictureInPictureParams implements Parcelable {
return new PictureInPictureParams[size];
}
};
}
}

View File

@@ -1561,16 +1561,6 @@ public final class ViewRootImpl implements ViewParent,
host.dispatchApplyWindowInsets(getWindowInsets(true /* forceConstruct */));
}
/**
* @return the last content insets for use in adjusting the source hint rect for the
* picture-in-picture transition.
*
* @hide
*/
public Rect getLastContentInsets() {
return mAttachInfo.mContentInsets;
}
private static boolean shouldUseDisplaySize(final WindowManager.LayoutParams lp) {
return lp.type == TYPE_STATUS_BAR_PANEL
|| lp.type == TYPE_INPUT_METHOD

View File

@@ -7914,12 +7914,6 @@ public class ActivityManagerService extends IActivityManager.Stub
final List<RemoteAction> actions = r.pictureInPictureArgs.getActions();
// Adjust the source bounds by the insets for the transition down
final Rect sourceBounds = new Rect(r.pictureInPictureArgs.getSourceRectHint());
final Rect insets = r.pictureInPictureArgs.getSourceRectHintInsets();
if (insets != null) {
sourceBounds.offsetTo(Math.max(0, sourceBounds.left - insets.left),
Math.max(0, sourceBounds.top - insets.top));
}
mStackSupervisor.moveActivityToPinnedStackLocked(r, sourceBounds, aspectRatio,
true /* moveHomeStackToFront */, "enterPictureInPictureMode");
final PinnedActivityStack stack = mStackSupervisor.getStack(PINNED_STACK_ID);

View File

@@ -92,6 +92,12 @@ class Task extends WindowContainer<AppWindowToken> implements DimLayer.DimLayerU
private TaskDescription mTaskDescription;
// If set to true, the task will report that it is not in the floating
// state regardless of it's stack affilation. As the floating state drives
// production of content insets this can be used to preserve them across
// stack moves and we in fact do so when moving from full screen to pinned.
private boolean mPreserveNonFloatingState = false;
Task(int taskId, TaskStack stack, int userId, WindowManagerService service, Rect bounds,
Configuration overrideConfig, int resizeMode, boolean supportsPictureInPicture,
boolean homeTask, TaskDescription taskDescription,
@@ -194,6 +200,16 @@ class Task extends WindowContainer<AppWindowToken> implements DimLayer.DimLayerU
EventLog.writeEvent(WM_TASK_REMOVED, mTaskId, "reParentTask");
final DisplayContent prevDisplayContent = getDisplayContent();
// If we are moving from the fullscreen stack to the pinned stack
// then we want to preserve our insets so that there will not
// be a jump in the area covered by system decorations. We rely
// on the pinned animation to later unset this value.
if (stack.mStackId == PINNED_STACK_ID) {
mPreserveNonFloatingState = true;
} else {
mPreserveNonFloatingState = false;
}
getParent().removeChild(this);
stack.addTask(this, position, showForAllUsers(), moveParents);
@@ -593,7 +609,8 @@ class Task extends WindowContainer<AppWindowToken> implements DimLayer.DimLayerU
* we will have a jump at the end.
*/
boolean isFloating() {
return StackId.tasksAreFloating(mStack.mStackId) && !mStack.isAnimatingBoundsToFullscreen();
return StackId.tasksAreFloating(mStack.mStackId)
&& !mStack.isAnimatingBoundsToFullscreen() && !mPreserveNonFloatingState;
}
WindowState getTopVisibleAppMainWindow() {
@@ -675,6 +692,10 @@ class Task extends WindowContainer<AppWindowToken> implements DimLayer.DimLayerU
return toShortString();
}
void clearPreserveNonFloatingState() {
mPreserveNonFloatingState = false;
}
@Override
public String toShortString() {
return "Task=" + mTaskId;

View File

@@ -139,6 +139,8 @@ public class TaskStack extends WindowContainer<Task> implements DimLayer.DimLaye
// Will be cleared once the client retrieves the new bounds via getBoundsForNewConfiguration().
private final Rect mBoundsAfterRotation = new Rect();
Rect mPreAnimationBounds = new Rect();
TaskStack(WindowManagerService service, int stackId) {
mService = service;
mStackId = stackId;
@@ -336,6 +338,8 @@ public class TaskStack extends WindowContainer<Task> implements DimLayer.DimLaye
} else {
mBoundsAnimationSourceHintBounds.setEmpty();
}
mPreAnimationBounds.set(mBounds);
}
/**
@@ -1530,10 +1534,17 @@ public class TaskStack extends WindowContainer<Task> implements DimLayer.DimLaye
// Hold the lock since this is called from the BoundsAnimator running on the UiThread
synchronized (mService.mWindowMap) {
mBoundsAnimating = false;
for (int i = 0; i < mChildren.size(); i++) {
final Task t = mChildren.get(i);
t.clearPreserveNonFloatingState();
}
mService.requestTraversal();
}
if (mStackId == PINNED_STACK_ID) {
// Update to the final bounds if requested. This is done here instead of in the bounds
// animator to allow us to coordinate this after we notify the PiP mode changed
final PinnedStackWindowController controller =
(PinnedStackWindowController) getController();
if (schedulePipModeChangedCallback && controller != null) {
@@ -1543,8 +1554,6 @@ public class TaskStack extends WindowContainer<Task> implements DimLayer.DimLaye
mBoundsAnimationTarget);
}
// Update to the final bounds if requested. This is done here instead of in the bounds
// animator to allow us to coordinate this after we notify the PiP mode changed
if (finalStackSize != null) {
setPinnedStackSize(finalStackSize, null);
}
@@ -1584,8 +1593,12 @@ public class TaskStack extends WindowContainer<Task> implements DimLayer.DimLaye
return mBoundsAnimating;
}
public boolean lastAnimatingBoundsWasToFullscreen() {
return mBoundsAnimatingToFullscreen;
}
public boolean isAnimatingBoundsToFullscreen() {
return mBoundsAnimating && mBoundsAnimatingToFullscreen;
return isAnimatingBounds() && lastAnimatingBoundsWasToFullscreen();
}
public boolean pinnedStackResizeDisallowed() {

View File

@@ -2093,6 +2093,7 @@ public class WindowManagerService extends IWindowManager.Stub
outFrame.set(win.mCompatFrame);
outOverscanInsets.set(win.mOverscanInsets);
outContentInsets.set(win.mContentInsets);
win.mLastRelayoutContentInsets.set(win.mContentInsets);
outVisibleInsets.set(win.mVisibleInsets);
outStableInsets.set(win.mStableInsets);
outOutsets.set(win.mOutsets);

View File

@@ -257,6 +257,16 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
*/
final Rect mContentInsets = new Rect();
final Rect mLastContentInsets = new Rect();
/**
* The last content insets returned to the client in relayout. We use
* these in the bounds animation to ensure we only observe inset changes
* at the same time that a client resizes it's surface so that we may use
* the geometryAppliesWithResize synchronization mechanism to keep
* the contents in place.
*/
final Rect mLastRelayoutContentInsets = new Rect();
private boolean mContentInsetsChanged;
/**

View File

@@ -1374,7 +1374,23 @@ class WindowStateAnimator {
int posX = mTmpSize.left;
int posY = mTmpSize.top;
task.mStack.getDimBounds(mTmpStackBounds);
boolean allowStretching = false;
task.mStack.getFinalAnimationSourceHintBounds(mTmpSourceBounds);
// If we don't have source bounds, we can attempt to use the content insets
// in the following scenario:
// 1. We have content insets.
// 2. We are not transitioning to full screen
// We have to be careful to check "lastAnimatingBoundsWasToFullscreen" rather than
// the mBoundsAnimating state, as we may have already left it and only be here
// because of the force-scale until resize state.
if (mTmpSourceBounds.isEmpty() && (mWin.mLastRelayoutContentInsets.width() > 0
|| mWin.mLastRelayoutContentInsets.height() > 0)
&& !task.mStack.lastAnimatingBoundsWasToFullscreen()) {
mTmpSourceBounds.set(task.mStack.mPreAnimationBounds);
mTmpSourceBounds.inset(mWin.mLastRelayoutContentInsets);
allowStretching = true;
}
if (!mTmpSourceBounds.isEmpty()) {
// Get the final target stack bounds, if we are not animating, this is just the
// current stack bounds
@@ -1384,14 +1400,24 @@ class WindowStateAnimator {
// and source bounds
float finalWidth = mTmpAnimatingBounds.width();
float initialWidth = mTmpSourceBounds.width();
float t = (surfaceContentWidth - mTmpStackBounds.width())
float tw = (surfaceContentWidth - mTmpStackBounds.width())
/ (surfaceContentWidth - mTmpAnimatingBounds.width());
mExtraHScale = (initialWidth + t * (finalWidth - initialWidth)) / initialWidth;
mExtraVScale = mExtraHScale;
float th = tw;
mExtraHScale = (initialWidth + tw * (finalWidth - initialWidth)) / initialWidth;
if (allowStretching) {
float finalHeight = mTmpAnimatingBounds.height();
float initialHeight = mTmpSourceBounds.height();
th = (surfaceContentHeight - mTmpStackBounds.height())
/ (surfaceContentHeight - mTmpAnimatingBounds.height());
mExtraVScale = (initialHeight + tw * (finalHeight - initialHeight))
/ initialHeight;
} else {
mExtraVScale = mExtraHScale;
}
// Adjust the position to account for the inset bounds
posX -= (int) (t * mExtraHScale * mTmpSourceBounds.left);
posY -= (int) (t * mExtraVScale * mTmpSourceBounds.top);
posX -= (int) (tw * mExtraHScale * mTmpSourceBounds.left);
posY -= (int) (th * mExtraVScale * mTmpSourceBounds.top);
// Always clip to the stack bounds since the surface can be larger with the current
// scale