Merge "Account for content insets in source rect hint for transition into PiP" into oc-dev

This commit is contained in:
TreeHugger Robot
2017-04-18 01:33:23 +00:00
committed by Android (Google) Code Review
4 changed files with 86 additions and 2 deletions

View File

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

View File

@@ -49,6 +49,13 @@ public final class PictureInPictureArgs 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;
PictureInPictureArgs(Parcel in) {
if (in.readInt() != 0) {
mAspectRatio = in.readFloat();
@@ -60,6 +67,9 @@ public final class PictureInPictureArgs implements Parcelable {
if (in.readInt() != 0) {
mSourceRectHint = Rect.CREATOR.createFromParcel(in);
}
if (in.readInt() != 0) {
mSourceRectHintInsets = Rect.CREATOR.createFromParcel(in);
}
}
/**
@@ -94,6 +104,9 @@ public final class PictureInPictureArgs implements Parcelable {
if (otherArgs.hasSourceBoundsHint()) {
mSourceRectHint = new Rect(otherArgs.getSourceRectHint());
}
if (otherArgs.hasSourceBoundsHintInsets()) {
mSourceRectHintInsets = new Rect(otherArgs.getSourceRectHintInsets());
}
}
/**
@@ -167,13 +180,33 @@ public final class PictureInPictureArgs implements Parcelable {
}
/**
* @return the launch bounds
* Sets the insets to be used with the source rect hint bounds.
* @hide
*/
public void setSourceRectHintInsets(Rect insets) {
if (insets == null) {
mSourceRectHintInsets = null;
} else {
mSourceRectHintInsets = new Rect(insets);
}
}
/**
* @return the source rect hint
* @hide
*/
public Rect getSourceRectHint() {
return mSourceRectHint;
}
/**
* @return the source rect hint insets.
* @hide
*/
public Rect getSourceRectHintInsets() {
return mSourceRectHintInsets;
}
/**
* @return whether there are launch bounds set
* @hide
@@ -182,12 +215,23 @@ public final class PictureInPictureArgs 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 PictureInPictureArgs clone() {
PictureInPictureArgs args = new PictureInPictureArgs(mAspectRatio, mUserActions);
if (mSourceRectHint != null) {
args.setSourceRectHint(mSourceRectHint);
}
if (mSourceRectHintInsets != null) {
args.setSourceRectHintInsets(mSourceRectHintInsets);
}
return args;
}
@@ -216,6 +260,12 @@ 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

@@ -1561,6 +1561,16 @@ 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

@@ -7845,7 +7845,14 @@ public class ActivityManagerService extends IActivityManager.Stub
r.pictureInPictureArgs.copyOnlySet(args);
final float aspectRatio = r.pictureInPictureArgs.getAspectRatio();
final List<RemoteAction> actions = r.pictureInPictureArgs.getActions();
final Rect sourceBounds = r.pictureInPictureArgs.getSourceRectHint();
// 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);