Merge "Account for content insets in source rect hint for transition into PiP" into oc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
eef5d285f9
@@ -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);
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user