Merge "Remove Session#getDisplayFrame"

This commit is contained in:
TreeHugger Robot
2020-09-10 05:29:20 +00:00
committed by Android (Google) Code Review
18 changed files with 370 additions and 324 deletions

View File

@@ -21,14 +21,12 @@ import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentat
import android.app.Activity;
import android.content.Context;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.RemoteException;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.PerfTestActivity;
import android.platform.test.annotations.Presubmit;
import android.util.MergedConfiguration;
import android.view.DisplayCutout;
import android.view.IWindow;
import android.view.IWindowSession;
import android.view.InsetsSourceControl;
@@ -38,6 +36,7 @@ import android.view.View;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
import android.widget.LinearLayout;
import android.window.ClientWindowFrames;
import androidx.test.filters.LargeTest;
import androidx.test.rule.ActivityTestRule;
@@ -125,13 +124,7 @@ public class RelayoutPerfTest extends WindowManagerPerfTestBase
}
private static class RelayoutRunner {
final Rect mOutFrame = new Rect();
final Rect mOutContentInsets = new Rect();
final Rect mOutVisibleInsets = new Rect();
final Rect mOutStableInsets = new Rect();
final Rect mOutBackDropFrame = new Rect();
final DisplayCutout.ParcelableWrapper mOutDisplayCutout =
new DisplayCutout.ParcelableWrapper(DisplayCutout.NO_CUTOUT);
final ClientWindowFrames mOutFrames = new ClientWindowFrames();
final MergedConfiguration mOutMergedConfiguration = new MergedConfiguration();
final InsetsState mOutInsetsState = new InsetsState();
final InsetsSourceControl[] mOutControls = new InsetsSourceControl[0];
@@ -164,11 +157,9 @@ public class RelayoutPerfTest extends WindowManagerPerfTestBase
final IWindowSession session = WindowManagerGlobal.getWindowSession();
while (state.keepRunning()) {
session.relayout(mWindow, mSeq, mParams, mWidth, mHeight,
mViewVisibility.getAsInt(), mFlags, mFrameNumber, mOutFrame,
mOutContentInsets, mOutVisibleInsets, mOutStableInsets,
mOutBackDropFrame, mOutDisplayCutout, mOutMergedConfiguration,
mOutSurfaceControl, mOutInsetsState, mOutControls, mOutSurfaceSize,
mOutBlastSurfaceControl);
mViewVisibility.getAsInt(), mFlags, mFrameNumber, mOutFrames,
mOutMergedConfiguration, mOutSurfaceControl, mOutInsetsState, mOutControls,
mOutSurfaceSize, mOutBlastSurfaceControl);
}
}
}

View File

@@ -71,6 +71,7 @@ import android.view.ViewGroup;
import android.view.WindowInsets;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
import android.window.ClientWindowFrames;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.HandlerCaller;
@@ -186,17 +187,11 @@ public abstract class WallpaperService extends Service {
int mCurWindowFlags = mWindowFlags;
int mCurWindowPrivateFlags = mWindowPrivateFlags;
Rect mPreviewSurfacePosition;
final Rect mVisibleInsets = new Rect();
final Rect mWinFrame = new Rect();
final Rect mContentInsets = new Rect();
final Rect mStableInsets = new Rect();
final ClientWindowFrames mWinFrames = new ClientWindowFrames();
final Rect mDispatchedContentInsets = new Rect();
final Rect mDispatchedStableInsets = new Rect();
final Rect mFinalSystemInsets = new Rect();
final Rect mFinalStableInsets = new Rect();
final Rect mBackdropFrame = new Rect();
final DisplayCutout.ParcelableWrapper mDisplayCutout =
new DisplayCutout.ParcelableWrapper();
DisplayCutout mDispatchedDisplayCutout = DisplayCutout.NO_CUTOUT;
final InsetsState mInsetsState = new InsetsState();
final InsetsSourceControl[] mTempControls = new InsetsSourceControl[0];
@@ -332,11 +327,9 @@ public abstract class WallpaperService extends Service {
final BaseIWindow mWindow = new BaseIWindow() {
@Override
public void resized(Rect frame, Rect contentInsets,
Rect visibleInsets, Rect stableInsets, boolean reportDraw,
MergedConfiguration mergedConfiguration, Rect backDropRect, boolean forceLayout,
boolean alwaysConsumeSystemBars, int displayId,
DisplayCutout.ParcelableWrapper displayCutout) {
public void resized(ClientWindowFrames frames, boolean reportDraw,
MergedConfiguration mergedConfiguration, boolean forceLayout,
boolean alwaysConsumeSystemBars, int displayId) {
Message msg = mCaller.obtainMessageI(MSG_WINDOW_RESIZED,
reportDraw ? 1 : 0);
mCaller.sendMessage(msg);
@@ -749,10 +742,7 @@ public abstract class WallpaperService extends Service {
out.print(" mCurWindowFlags="); out.println(mCurWindowFlags);
out.print(prefix); out.print("mWindowPrivateFlags="); out.print(mWindowPrivateFlags);
out.print(" mCurWindowPrivateFlags="); out.println(mCurWindowPrivateFlags);
out.print(prefix); out.print("mVisibleInsets=");
out.print(mVisibleInsets.toShortString());
out.print(" mWinFrame="); out.print(mWinFrame.toShortString());
out.print(" mContentInsets="); out.println(mContentInsets.toShortString());
out.print(prefix); out.println("mWinFrames="); out.println(mWinFrames);
out.print(prefix); out.print("mConfiguration=");
out.println(mMergedConfiguration.getMergedConfiguration());
out.print(prefix); out.print("mLayout="); out.println(mLayout);
@@ -890,8 +880,8 @@ public abstract class WallpaperService extends Service {
InputChannel inputChannel = new InputChannel();
if (mSession.addToDisplay(mWindow, mWindow.mSeq, mLayout, View.VISIBLE,
mDisplay.getDisplayId(), mWinFrame, mContentInsets, mStableInsets,
mDisplayCutout, inputChannel,
mDisplay.getDisplayId(), mWinFrames.frame, mWinFrames.contentInsets,
mWinFrames.stableInsets, mWinFrames.displayCutout, inputChannel,
mInsetsState, mTempControls) < 0) {
Log.w(TAG, "Failed to add window while updating wallpaper surface.");
return;
@@ -914,34 +904,32 @@ public abstract class WallpaperService extends Service {
final int relayoutResult = mSession.relayout(
mWindow, mWindow.mSeq, mLayout, mWidth, mHeight,
View.VISIBLE, 0, -1, mWinFrame, mContentInsets,
mVisibleInsets, mStableInsets, mBackdropFrame,
mDisplayCutout, mMergedConfiguration, mSurfaceControl,
View.VISIBLE, 0, -1, mWinFrames, mMergedConfiguration, mSurfaceControl,
mInsetsState, mTempControls, mSurfaceSize, mTmpSurfaceControl);
if (mSurfaceControl.isValid()) {
mSurfaceHolder.mSurface.copyFrom(mSurfaceControl);
}
if (DEBUG) Log.v(TAG, "New surface: " + mSurfaceHolder.mSurface
+ ", frame=" + mWinFrame);
+ ", frame=" + mWinFrames);
int w = mWinFrame.width();
int h = mWinFrame.height();
int w = mWinFrames.frame.width();
int h = mWinFrames.frame.height();
if (!fixedSize) {
final Rect padding = mIWallpaperEngine.mDisplayPadding;
w += padding.left + padding.right;
h += padding.top + padding.bottom;
mContentInsets.left += padding.left;
mContentInsets.top += padding.top;
mContentInsets.right += padding.right;
mContentInsets.bottom += padding.bottom;
mStableInsets.left += padding.left;
mStableInsets.top += padding.top;
mStableInsets.right += padding.right;
mStableInsets.bottom += padding.bottom;
mDisplayCutout.set(mDisplayCutout.get().inset(-padding.left, -padding.top,
-padding.right, -padding.bottom));
mWinFrames.contentInsets.left += padding.left;
mWinFrames.contentInsets.top += padding.top;
mWinFrames.contentInsets.right += padding.right;
mWinFrames.contentInsets.bottom += padding.bottom;
mWinFrames.stableInsets.left += padding.left;
mWinFrames.stableInsets.top += padding.top;
mWinFrames.stableInsets.right += padding.right;
mWinFrames.stableInsets.bottom += padding.bottom;
mWinFrames.displayCutout.set(mWinFrames.displayCutout.get().inset(
-padding.left, -padding.top, -padding.right, -padding.bottom));
} else {
w = myWidth;
h = myHeight;
@@ -960,9 +948,10 @@ public abstract class WallpaperService extends Service {
Log.v(TAG, "Wallpaper size has changed: (" + mCurWidth + ", " + mCurHeight);
}
insetsChanged |= !mDispatchedContentInsets.equals(mContentInsets);
insetsChanged |= !mDispatchedStableInsets.equals(mStableInsets);
insetsChanged |= !mDispatchedDisplayCutout.equals(mDisplayCutout.get());
final DisplayCutout displayCutout = mWinFrames.displayCutout.get();
insetsChanged |= !mDispatchedContentInsets.equals(mWinFrames.contentInsets);
insetsChanged |= !mDispatchedStableInsets.equals(mWinFrames.stableInsets);
insetsChanged |= !mDispatchedDisplayCutout.equals(displayCutout);
mSurfaceHolder.setSurfaceFrameSize(w, h);
mSurfaceHolder.mSurfaceLock.unlock();
@@ -1021,9 +1010,9 @@ public abstract class WallpaperService extends Service {
}
if (insetsChanged) {
mDispatchedContentInsets.set(mContentInsets);
mDispatchedStableInsets.set(mStableInsets);
mDispatchedDisplayCutout = mDisplayCutout.get();
mDispatchedContentInsets.set(mWinFrames.contentInsets);
mDispatchedStableInsets.set(mWinFrames.stableInsets);
mDispatchedDisplayCutout = displayCutout;
mFinalStableInsets.set(mDispatchedStableInsets);
WindowInsets insets = new WindowInsets(mFinalSystemInsets,
mFinalStableInsets,

View File

@@ -29,6 +29,7 @@ import android.view.InsetsState;
import android.view.IScrollCaptureController;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.window.ClientWindowFrames;
import com.android.internal.os.IResultReceiver;
@@ -52,11 +53,9 @@ oneway interface IWindow {
*/
void executeCommand(String command, String parameters, in ParcelFileDescriptor descriptor);
void resized(in Rect frame, in Rect contentInsets,
in Rect visibleInsets, in Rect stableInsets, boolean reportDraw,
in MergedConfiguration newMergedConfiguration, in Rect backDropFrame,
boolean forceLayout, boolean alwaysConsumeSystemBars, int displayId,
in DisplayCutout.ParcelableWrapper displayCutout);
void resized(in ClientWindowFrames frames, boolean reportDraw,
in MergedConfiguration newMergedConfiguration,
boolean forceLayout, boolean alwaysConsumeSystemBars, int displayId);
/**
* Called when the window location in parent display has changed. The offset will only be a

View File

@@ -34,6 +34,7 @@ import android.view.InsetsState;
import android.view.Surface;
import android.view.SurfaceControl;
import android.view.SurfaceControl.Transaction;
import android.window.ClientWindowFrames;
import java.util.List;
@@ -107,10 +108,7 @@ interface IWindowSession {
*/
int relayout(IWindow window, int seq, in WindowManager.LayoutParams attrs,
int requestedWidth, int requestedHeight, int viewVisibility,
int flags, long frameNumber, out Rect outFrame,
out Rect outContentInsets, out Rect outVisibleInsets, out Rect outStableInsets,
out Rect outBackdropFrame,
out DisplayCutout.ParcelableWrapper displayCutout,
int flags, long frameNumber, out ClientWindowFrames outFrames,
out MergedConfiguration outMergedConfiguration, out SurfaceControl outSurfaceControl,
out InsetsState insetsState, out InsetsSourceControl[] activeControls,
out Point outSurfaceSize, out SurfaceControl outBlastSurfaceControl);
@@ -151,12 +149,6 @@ interface IWindowSession {
void setInsets(IWindow window, int touchableInsets, in Rect contentInsets,
in Rect visibleInsets, in Region touchableRegion);
/**
* Return the current display size in which the window is being laid out,
* accounting for screen decorations around it.
*/
void getDisplayFrame(IWindow window, out Rect outDisplayFrame);
/**
* Called when the client has finished drawing the surface, if needed.
*

View File

@@ -14940,20 +14940,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* inside. In effect, this tells you the available area where content can
* be placed and remain visible to users.
*
* <p>This function requires an IPC back to the window manager to retrieve
* the requested information, so should not be used in performance critical
* code like drawing.
*
* @param outRect Filled in with the visible display frame. If the view
* is not attached to a window, this is simply the raw display size.
*/
public void getWindowVisibleDisplayFrame(Rect outRect) {
if (mAttachInfo != null) {
try {
mAttachInfo.mSession.getDisplayFrame(mAttachInfo.mWindow, outRect);
} catch (RemoteException e) {
return;
}
mAttachInfo.mViewRootImpl.getDisplayFrame(outRect);
// XXX This is really broken, and probably all needs to be done
// in the window manager, and we need to know more about whether
// we want the area behind or in front of the IME.
@@ -14979,11 +14971,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
@UnsupportedAppUsage
public void getWindowDisplayFrame(Rect outRect) {
if (mAttachInfo != null) {
try {
mAttachInfo.mSession.getDisplayFrame(mAttachInfo.mWindow, outRect);
} catch (RemoteException e) {
return;
}
mAttachInfo.mViewRootImpl.getDisplayFrame(outRect);
return;
}
// The view is not attached to a display so we don't have a context.

View File

@@ -33,7 +33,6 @@ import android.os.Debug;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
@@ -755,11 +754,7 @@ public class ViewDebug {
try {
Rect outRect = new Rect();
try {
root.mAttachInfo.mSession.getDisplayFrame(root.mAttachInfo.mWindow, outRect);
} catch (RemoteException e) {
// Ignore
}
root.mAttachInfo.mViewRootImpl.getDisplayFrame(outRect);
clientStream.writeInt(outRect.width());
clientStream.writeInt(outRect.height());

View File

@@ -137,7 +137,6 @@ import android.view.View.MeasureSpec;
import android.view.Window.OnContentApplyWindowInsetsListener;
import android.view.WindowInsets.Type;
import android.view.WindowInsets.Type.InsetsType;
import android.view.WindowManager.LayoutParams;
import android.view.WindowManager.LayoutParams.SoftInputModeFlags;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
@@ -160,6 +159,7 @@ import android.view.contentcapture.ContentCaptureSession;
import android.view.contentcapture.MainContentCaptureSession;
import android.view.inputmethod.InputMethodManager;
import android.widget.Scroller;
import android.window.ClientWindowFrames;
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
@@ -560,8 +560,11 @@ public final class ViewRootImpl implements ViewParent,
boolean mAdded;
boolean mAddedTouchMode;
final Rect mTmpFrame = new Rect();
final Rect mTmpRect = new Rect();
/**
* It usually keeps the latest layout result from {@link IWindow#resized} or
* {@link IWindowSession#relayout}.
*/
private final ClientWindowFrames mTmpFrames = new ClientWindowFrames();
// These are accessed by multiple threads.
final Rect mWinFrame; // frame given by window manager.
@@ -1033,11 +1036,11 @@ public final class ViewRootImpl implements ViewParent,
collectViewAttributes();
adjustLayoutParamsForCompatibility(mWindowAttributes);
res = mWindowSession.addToDisplayAsUser(mWindow, mSeq, mWindowAttributes,
getHostVisibility(), mDisplay.getDisplayId(), userId, mTmpFrame,
getHostVisibility(), mDisplay.getDisplayId(), userId, mTmpFrames.frame,
mAttachInfo.mContentInsets, mAttachInfo.mStableInsets,
mAttachInfo.mDisplayCutout, inputChannel,
mTempInsets, mTempControls);
setFrame(mTmpFrame);
setFrame(mTmpFrames.frame);
} catch (RemoteException e) {
mAdded = false;
mView = null;
@@ -1475,6 +1478,55 @@ public final class ViewRootImpl implements ViewParent,
scheduleTraversals();
}
/** Handles messages {@link #MSG_RESIZED} and {@link #MSG_RESIZED_REPORT}. */
private void handleResized(int msg, SomeArgs args) {
if (!mAdded) {
return;
}
final ClientWindowFrames frames = (ClientWindowFrames) args.arg1;
final MergedConfiguration mergedConfiguration = (MergedConfiguration) args.arg2;
final boolean forceNextWindowRelayout = args.argi1 != 0;
final int displayId = args.argi3;
final Rect backdropFrame = frames.backdropFrame;
final DisplayCutout displayCutout = frames.displayCutout.get();
final boolean frameChanged = !mWinFrame.equals(frames.frame);
final boolean cutoutChanged = !mPendingDisplayCutout.get().equals(displayCutout);
final boolean backdropFrameChanged = !mPendingBackDropFrame.equals(backdropFrame);
final boolean configChanged = !mLastReportedMergedConfiguration.equals(mergedConfiguration);
final boolean displayChanged = mDisplay.getDisplayId() != displayId;
if (msg == MSG_RESIZED && !frameChanged && !cutoutChanged && !backdropFrameChanged
&& !configChanged && !displayChanged && !forceNextWindowRelayout) {
return;
}
if (configChanged) {
// If configuration changed - notify about that and, maybe, about move to display.
performConfigurationChange(mergedConfiguration, false /* force */,
displayChanged ? displayId : INVALID_DISPLAY /* same display */);
} else if (displayChanged) {
// Moved to display without config change - report last applied one.
onMovedToDisplay(displayId, mLastConfigurationFromResources);
}
setFrame(frames.frame);
mTmpFrames.displayFrame.set(frames.displayFrame);
mPendingDisplayCutout.set(displayCutout);
mPendingBackDropFrame.set(backdropFrame);
mForceNextWindowRelayout = forceNextWindowRelayout;
mPendingAlwaysConsumeSystemBars = args.argi2 != 0;
if (msg == MSG_RESIZED_REPORT) {
reportNextDraw();
}
if (mView != null && (frameChanged || cutoutChanged || configChanged)) {
forceLayout(mView);
}
requestLayout();
}
private final DisplayListener mDisplayListener = new DisplayListener() {
@Override
public void onDisplayChanged(int displayId) {
@@ -4923,60 +4975,13 @@ public final class ViewRootImpl implements ViewParent,
case MSG_DISPATCH_GET_NEW_SURFACE:
handleGetNewSurface();
break;
case MSG_RESIZED: {
// Recycled in the fall through...
SomeArgs args = (SomeArgs) msg.obj;
if (mWinFrame.equals(args.arg1)
&& mPendingDisplayCutout.get().equals(args.arg9)
&& mPendingBackDropFrame.equals(args.arg8)
&& mLastReportedMergedConfiguration.equals(args.arg4)
&& args.argi1 == 0
&& mDisplay.getDisplayId() == args.argi3) {
break;
}
} // fall through...
case MSG_RESIZED_REPORT:
if (mAdded) {
SomeArgs args = (SomeArgs) msg.obj;
final int displayId = args.argi3;
MergedConfiguration mergedConfiguration = (MergedConfiguration) args.arg4;
final boolean displayChanged = mDisplay.getDisplayId() != displayId;
boolean configChanged = false;
if (!mLastReportedMergedConfiguration.equals(mergedConfiguration)) {
// If configuration changed - notify about that and, maybe,
// about move to display.
performConfigurationChange(mergedConfiguration, false /* force */,
displayChanged
? displayId : INVALID_DISPLAY /* same display */);
configChanged = true;
} else if (displayChanged) {
// Moved to display without config change - report last applied one.
onMovedToDisplay(displayId, mLastConfigurationFromResources);
}
final boolean framesChanged = !mWinFrame.equals(args.arg1)
|| !mPendingDisplayCutout.get().equals(args.arg9);
setFrame((Rect) args.arg1);
mPendingDisplayCutout.set((DisplayCutout) args.arg9);
mPendingBackDropFrame.set((Rect) args.arg8);
mForceNextWindowRelayout = args.argi1 != 0;
mPendingAlwaysConsumeSystemBars = args.argi2 != 0;
args.recycle();
if (msg.what == MSG_RESIZED_REPORT) {
reportNextDraw();
}
if (mView != null && (framesChanged || configChanged)) {
forceLayout(mView);
}
requestLayout();
}
case MSG_RESIZED:
case MSG_RESIZED_REPORT: {
final SomeArgs args = (SomeArgs) msg.obj;
handleResized(msg.what, args);
args.recycle();
break;
}
case MSG_INSETS_CHANGED:
mInsetsController.onStateChanged((InsetsState) msg.obj);
break;
@@ -5011,11 +5016,11 @@ public final class ViewRootImpl implements ViewParent,
final int h = mWinFrame.height();
final int l = msg.arg1;
final int t = msg.arg2;
mTmpFrame.left = l;
mTmpFrame.right = l + w;
mTmpFrame.top = t;
mTmpFrame.bottom = t + h;
setFrame(mTmpFrame);
mTmpFrames.frame.left = l;
mTmpFrames.frame.right = l + w;
mTmpFrames.frame.top = t;
mTmpFrames.frame.bottom = t + h;
setFrame(mTmpFrames.frame);
mPendingBackDropFrame.set(mWinFrame);
maybeHandleWindowMove(mWinFrame);
@@ -7422,9 +7427,10 @@ public final class ViewRootImpl implements ViewParent,
(int) (mView.getMeasuredWidth() * appScale + 0.5f),
(int) (mView.getMeasuredHeight() * appScale + 0.5f), viewVisibility,
insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0, frameNumber,
mTmpFrame, mTmpRect, mTmpRect, mTmpRect, mPendingBackDropFrame,
mPendingDisplayCutout, mPendingMergedConfiguration, mSurfaceControl, mTempInsets,
mTmpFrames, mPendingMergedConfiguration, mSurfaceControl, mTempInsets,
mTempControls, mSurfaceSize, mBlastSurfaceControl);
mPendingDisplayCutout.set(mTmpFrames.displayCutout);
mPendingBackDropFrame.set(mTmpFrames.backdropFrame);
if (mSurfaceControl.isValid()) {
if (!useBLAST()) {
mSurface.copyFrom(mSurfaceControl);
@@ -7450,9 +7456,9 @@ public final class ViewRootImpl implements ViewParent,
}
if (mTranslator != null) {
mTranslator.translateRectInScreenToAppWinFrame(mTmpFrame);
mTranslator.translateRectInScreenToAppWinFrame(mTmpFrames.frame);
}
setFrame(mTmpFrame);
setFrame(mTmpFrames.frame);
mInsetsController.onStateChanged(mTempInsets);
mInsetsController.onControlsChanged(mTempControls);
return relayoutResult;
@@ -7463,6 +7469,14 @@ public final class ViewRootImpl implements ViewParent,
mInsetsController.onFrameChanged(frame);
}
/**
* Gets the current display size in which the window is being laid out, accounting for screen
* decorations around it.
*/
void getDisplayFrame(Rect outFrame) {
outFrame.set(mTmpFrames.displayFrame);
}
/**
* {@inheritDoc}
*/
@@ -7746,11 +7760,14 @@ public final class ViewRootImpl implements ViewParent,
}
@UnsupportedAppUsage
private void dispatchResized(Rect frame, Rect contentInsets,
Rect visibleInsets, Rect stableInsets, boolean reportDraw,
MergedConfiguration mergedConfiguration, Rect backDropFrame, boolean forceLayout,
boolean alwaysConsumeSystemBars, int displayId,
DisplayCutout.ParcelableWrapper displayCutout) {
private void dispatchResized(ClientWindowFrames frames, boolean reportDraw,
MergedConfiguration mergedConfiguration, boolean forceLayout,
boolean alwaysConsumeSystemBars, int displayId) {
final Rect frame = frames.frame;
final Rect contentInsets = frames.contentInsets;
final Rect visibleInsets = frames.visibleInsets;
final Rect stableInsets = frames.stableInsets;
final Rect backDropFrame = frames.backdropFrame;
if (DEBUG_LAYOUT) Log.v(mTag, "Resizing " + this + ": frame=" + frame.toShortString()
+ " contentInsets=" + contentInsets.toShortString()
+ " visibleInsets=" + visibleInsets.toShortString()
@@ -7777,14 +7794,9 @@ public final class ViewRootImpl implements ViewParent,
}
SomeArgs args = SomeArgs.obtain();
final boolean sameProcessCall = (Binder.getCallingPid() == android.os.Process.myPid());
args.arg1 = sameProcessCall ? new Rect(frame) : frame;
args.arg2 = sameProcessCall ? new Rect(contentInsets) : contentInsets;
args.arg3 = sameProcessCall ? new Rect(visibleInsets) : visibleInsets;
args.arg4 = sameProcessCall && mergedConfiguration != null
args.arg1 = sameProcessCall ? new ClientWindowFrames(frames) : frames;
args.arg2 = sameProcessCall && mergedConfiguration != null
? new MergedConfiguration(mergedConfiguration) : mergedConfiguration;
args.arg6 = sameProcessCall ? new Rect(stableInsets) : stableInsets;
args.arg8 = sameProcessCall ? new Rect(backDropFrame) : backDropFrame;
args.arg9 = displayCutout.get(); // DisplayCutout is immutable.
args.argi1 = forceLayout ? 1 : 0;
args.argi2 = alwaysConsumeSystemBars ? 1 : 0;
args.argi3 = displayId;
@@ -9078,17 +9090,13 @@ public final class ViewRootImpl implements ViewParent,
}
@Override
public void resized(Rect frame, Rect contentInsets,
Rect visibleInsets, Rect stableInsets, boolean reportDraw,
MergedConfiguration mergedConfiguration, Rect backDropFrame, boolean forceLayout,
boolean alwaysConsumeSystemBars, int displayId,
DisplayCutout.ParcelableWrapper displayCutout) {
public void resized(ClientWindowFrames frames, boolean reportDraw,
MergedConfiguration mergedConfiguration, boolean forceLayout,
boolean alwaysConsumeSystemBars, int displayId) {
final ViewRootImpl viewAncestor = mViewAncestor.get();
if (viewAncestor != null) {
viewAncestor.dispatchResized(frame, contentInsets,
visibleInsets, stableInsets, reportDraw, mergedConfiguration,
backDropFrame, forceLayout, alwaysConsumeSystemBars, displayId,
displayCutout);
viewAncestor.dispatchResized(frames, reportDraw, mergedConfiguration, forceLayout,
alwaysConsumeSystemBars, displayId);
}
}

View File

@@ -26,6 +26,7 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.util.MergedConfiguration;
import android.window.ClientWindowFrames;
import java.util.HashMap;
import java.util.Objects;
@@ -224,9 +225,7 @@ public class WindowlessWindowManager implements IWindowSession {
@Override
public int relayout(IWindow window, int seq, WindowManager.LayoutParams inAttrs,
int requestedWidth, int requestedHeight, int viewFlags, int flags, long frameNumber,
Rect outFrame, Rect outContentInsets, Rect outVisibleInsets,
Rect outStableInsets, Rect outBackdropFrame,
DisplayCutout.ParcelableWrapper cutout, MergedConfiguration mergedConfiguration,
ClientWindowFrames outFrames, MergedConfiguration mergedConfiguration,
SurfaceControl outSurfaceControl, InsetsState outInsetsState,
InsetsSourceControl[] outActiveControls, Point outSurfaceSize,
SurfaceControl outBLASTSurfaceControl) {
@@ -255,7 +254,8 @@ public class WindowlessWindowManager implements IWindowSession {
t.hide(sc).apply();
outSurfaceControl.release();
}
outFrame.set(0, 0, attrs.width, attrs.height);
outFrames.frame.set(0, 0, attrs.width, attrs.height);
outFrames.displayFrame.set(outFrames.frame);
mergedConfiguration.setConfiguration(mConfiguration, mConfiguration);
@@ -291,11 +291,6 @@ public class WindowlessWindowManager implements IWindowSession {
android.graphics.Region touchableRegion) {
}
@Override
public void getDisplayFrame(android.view.IWindow window,
android.graphics.Rect outDisplayFrame) {
}
@Override
public void finishDrawing(android.view.IWindow window,
android.view.SurfaceControl.Transaction postDrawTransaction) {

View File

@@ -0,0 +1,19 @@
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.window;
parcelable ClientWindowFrames;

View File

@@ -0,0 +1,125 @@
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.window;
import android.annotation.NonNull;
import android.graphics.Rect;
import android.os.Parcel;
import android.os.Parcelable;
import android.view.DisplayCutout;
/**
* The window frame container class used by client side for layout.
* @hide
*/
public class ClientWindowFrames implements Parcelable {
/** The actual window bounds. */
public final @NonNull Rect frame;
/**
* The container frame that is usually the same as display size. It may exclude the area of
* insets if the window layout parameter has specified fit-insets-sides.
*/
public final @NonNull Rect displayFrame;
/** The background area while the window is resizing. */
public final @NonNull Rect backdropFrame;
/** The area cut from the display. */
public final @NonNull DisplayCutout.ParcelableWrapper displayCutout;
// TODO(b/149813814): Remove legacy insets.
public final Rect contentInsets;
public final Rect visibleInsets;
public final Rect stableInsets;
public ClientWindowFrames() {
frame = new Rect();
displayFrame = new Rect();
backdropFrame = new Rect();
displayCutout = new DisplayCutout.ParcelableWrapper();
contentInsets = new Rect();
visibleInsets = new Rect();
stableInsets = new Rect();
}
public ClientWindowFrames(ClientWindowFrames other) {
frame = new Rect(other.frame);
displayFrame = new Rect(other.displayFrame);
backdropFrame = new Rect(other.backdropFrame);
displayCutout = new DisplayCutout.ParcelableWrapper(other.displayCutout.get());
contentInsets = new Rect(other.contentInsets);
visibleInsets = new Rect(other.visibleInsets);
stableInsets = new Rect(other.stableInsets);
}
private ClientWindowFrames(Parcel in) {
frame = Rect.CREATOR.createFromParcel(in);
displayFrame = Rect.CREATOR.createFromParcel(in);
backdropFrame = Rect.CREATOR.createFromParcel(in);
displayCutout = DisplayCutout.ParcelableWrapper.CREATOR.createFromParcel(in);
contentInsets = Rect.CREATOR.createFromParcel(in);
visibleInsets = Rect.CREATOR.createFromParcel(in);
stableInsets = Rect.CREATOR.createFromParcel(in);
}
/** Needed for AIDL out parameters. */
public void readFromParcel(Parcel in) {
frame.set(Rect.CREATOR.createFromParcel(in));
displayFrame.set(Rect.CREATOR.createFromParcel(in));
backdropFrame.set(Rect.CREATOR.createFromParcel(in));
displayCutout.set(DisplayCutout.ParcelableWrapper.CREATOR.createFromParcel(in));
contentInsets.set(Rect.CREATOR.createFromParcel(in));
visibleInsets.set(Rect.CREATOR.createFromParcel(in));
stableInsets.set(Rect.CREATOR.createFromParcel(in));
}
@Override
public void writeToParcel(Parcel dest, int flags) {
frame.writeToParcel(dest, flags);
displayFrame.writeToParcel(dest, flags);
backdropFrame.writeToParcel(dest, flags);
displayCutout.writeToParcel(dest, flags);
contentInsets.writeToParcel(dest, flags);
visibleInsets.writeToParcel(dest, flags);
stableInsets.writeToParcel(dest, flags);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder(32);
return "ClientWindowFrames{frame=" + frame.toShortString(sb)
+ " display=" + displayFrame.toShortString(sb)
+ " backdrop=" + backdropFrame.toShortString(sb)
+ " cutout=" + displayCutout + "}";
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<ClientWindowFrames> CREATOR = new Creator<ClientWindowFrames>() {
public ClientWindowFrames createFromParcel(Parcel in) {
return new ClientWindowFrames(in);
}
public ClientWindowFrames[] newArray(int size) {
return new ClientWindowFrames[size];
}
};
}

View File

@@ -18,13 +18,11 @@ package com.android.internal.view;
import android.compat.annotation.UnsupportedAppUsage;
import android.graphics.Point;
import android.graphics.Rect;
import android.hardware.input.InputManager;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.util.MergedConfiguration;
import android.view.DisplayCutout;
import android.view.DragEvent;
import android.view.IScrollCaptureController;
import android.view.IWindow;
@@ -33,6 +31,7 @@ import android.view.InsetsSourceControl;
import android.view.InsetsState;
import android.view.PointerIcon;
import android.view.WindowInsets.Type.InsetsType;
import android.window.ClientWindowFrames;
import com.android.internal.os.IResultReceiver;
@@ -51,11 +50,9 @@ public class BaseIWindow extends IWindow.Stub {
}
@Override
public void resized(Rect frame, Rect contentInsets, Rect visibleInsets,
Rect stableInsets, boolean reportDraw,
MergedConfiguration mergedConfiguration, Rect backDropFrame, boolean forceLayout,
boolean alwaysConsumeSystemBars, int displayId,
DisplayCutout.ParcelableWrapper displayCutout) {
public void resized(ClientWindowFrames frames, boolean reportDraw,
MergedConfiguration mergedConfiguration, boolean forceLayout,
boolean alwaysConsumeSystemBars, int displayId) {
if (reportDraw) {
try {
mSession.finishDrawing(this, null /* postDrawTransaction */);

View File

@@ -22,7 +22,6 @@ import android.annotation.NonNull;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.Region;
import android.os.Bundle;
import android.os.IBinder;
@@ -32,7 +31,6 @@ import android.util.MergedConfiguration;
import android.util.Slog;
import android.util.SparseArray;
import android.view.Display;
import android.view.DisplayCutout;
import android.view.DragEvent;
import android.view.IScrollCaptureController;
import android.view.IWindow;
@@ -47,6 +45,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.WindowlessWindowManager;
import android.window.ClientWindowFrames;
import com.android.internal.os.IResultReceiver;
@@ -274,22 +273,20 @@ public class SystemWindows {
@Override
public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs,
int requestedWidth, int requestedHeight, int viewVisibility, int flags,
long frameNumber, Rect outFrame, Rect outOverscanInsets, Rect outContentInsets,
Rect outVisibleInsets, Rect outStableInsets,
DisplayCutout.ParcelableWrapper cutout, MergedConfiguration mergedConfiguration,
long frameNumber, ClientWindowFrames outFrames,
MergedConfiguration mergedConfiguration,
SurfaceControl outSurfaceControl, InsetsState outInsetsState,
InsetsSourceControl[] outActiveControls, Point outSurfaceSize,
SurfaceControl outBLASTSurfaceControl) {
int res = super.relayout(window, seq, attrs, requestedWidth, requestedHeight,
viewVisibility, flags, frameNumber, outFrame, outOverscanInsets,
outContentInsets, outVisibleInsets, outStableInsets,
cutout, mergedConfiguration, outSurfaceControl, outInsetsState,
viewVisibility, flags, frameNumber, outFrames,
mergedConfiguration, outSurfaceControl, outInsetsState,
outActiveControls, outSurfaceSize, outBLASTSurfaceControl);
if (res != 0) {
return res;
}
DisplayLayout dl = mDisplayController.getDisplayLayout(mDisplayId);
outStableInsets.set(dl.stableInsets());
outFrames.stableInsets.set(dl.stableInsets());
return 0;
}
@@ -314,10 +311,9 @@ public class SystemWindows {
ContainerWindow() {}
@Override
public void resized(Rect frame, Rect contentInsets, Rect visibleInsets, Rect stableInsets,
boolean reportDraw, MergedConfiguration newMergedConfiguration, Rect backDropFrame,
boolean forceLayout, boolean alwaysConsumeSystemBars, int displayId,
DisplayCutout.ParcelableWrapper displayCutout) {}
public void resized(ClientWindowFrames frames, boolean reportDraw,
MergedConfiguration newMergedConfiguration, boolean forceLayout,
boolean alwaysConsumeSystemBars, int displayId) {}
@Override
public void locationInParentDisplayChanged(Point offset) {}

View File

@@ -56,6 +56,7 @@ import android.view.InsetsState;
import android.view.SurfaceControl;
import android.view.SurfaceSession;
import android.view.WindowManager;
import android.window.ClientWindowFrames;
import com.android.internal.os.logging.MetricsLoggerWrapper;
import com.android.internal.protolog.common.ProtoLog;
@@ -201,9 +202,7 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
@Override
public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs,
int requestedWidth, int requestedHeight, int viewFlags, int flags, long frameNumber,
Rect outFrame, Rect outContentInsets, Rect outVisibleInsets,
Rect outStableInsets, Rect outBackdropFrame,
DisplayCutout.ParcelableWrapper cutout, MergedConfiguration mergedConfiguration,
ClientWindowFrames outFrames, MergedConfiguration mergedConfiguration,
SurfaceControl outSurfaceControl, InsetsState outInsetsState,
InsetsSourceControl[] outActiveControls, Point outSurfaceSize,
SurfaceControl outBLASTSurfaceControl) {
@@ -212,10 +211,8 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, mRelayoutTag);
int res = mService.relayoutWindow(this, window, seq, attrs,
requestedWidth, requestedHeight, viewFlags, flags, frameNumber,
outFrame, outContentInsets, outVisibleInsets,
outStableInsets, outBackdropFrame, cutout,
mergedConfiguration, outSurfaceControl, outInsetsState, outActiveControls,
outSurfaceSize, outBLASTSurfaceControl);
outFrames, mergedConfiguration, outSurfaceControl, outInsetsState,
outActiveControls, outSurfaceSize, outBLASTSurfaceControl);
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
if (false) Slog.d(TAG_WM, "<<<<<< EXITING relayout to "
+ Binder.getCallingPid());
@@ -239,11 +236,6 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
visibleInsets, touchableArea);
}
@Override
public void getDisplayFrame(IWindow window, Rect outDisplayFrame) {
mService.getWindowDisplayFrame(this, window, outDisplayFrame);
}
@Override
public void finishDrawing(IWindow window,
@Nullable SurfaceControl.Transaction postDrawTransaction) {

View File

@@ -67,7 +67,6 @@ import android.os.RemoteException;
import android.os.SystemClock;
import android.util.MergedConfiguration;
import android.util.Slog;
import android.view.DisplayCutout;
import android.view.IWindowSession;
import android.view.InsetsSourceControl;
import android.view.InsetsState;
@@ -79,6 +78,7 @@ import android.view.ViewGroup.LayoutParams;
import android.view.ViewRootImpl;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
import android.window.ClientWindowFrames;
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
@@ -159,12 +159,8 @@ class TaskSnapshotSurface implements StartingSurface {
final IWindowSession session = WindowManagerGlobal.getWindowSession();
window.setSession(session);
final SurfaceControl surfaceControl = new SurfaceControl();
final Rect tmpRect = new Rect();
final DisplayCutout.ParcelableWrapper tmpCutout = new DisplayCutout.ParcelableWrapper();
final Rect tmpFrame = new Rect();
final ClientWindowFrames tmpFrames = new ClientWindowFrames();
final Rect taskBounds;
final Rect tmpContentInsets = new Rect();
final Rect tmpStableInsets = new Rect();
final InsetsState mTmpInsetsState = new InsetsState();
final InsetsSourceControl[] mTempControls = new InsetsSourceControl[0];
final MergedConfiguration tmpMergedConfiguration = new MergedConfiguration();
@@ -254,8 +250,9 @@ class TaskSnapshotSurface implements StartingSurface {
}
try {
final int res = session.addToDisplay(window, window.mSeq, layoutParams,
View.GONE, activity.getDisplayContent().getDisplayId(), tmpFrame, tmpRect,
tmpRect, tmpCutout, null, mTmpInsetsState, mTempControls);
View.GONE, activity.getDisplayContent().getDisplayId(), tmpFrames.frame,
tmpFrames.contentInsets, tmpFrames.stableInsets, tmpFrames.displayCutout,
null /* outInputChannel */, mTmpInsetsState, mTempControls);
if (res < 0) {
Slog.w(TAG, "Failed to add snapshot starting window res=" + res);
return null;
@@ -270,15 +267,14 @@ class TaskSnapshotSurface implements StartingSurface {
window.setOuter(snapshotSurface);
try {
session.relayout(window, window.mSeq, layoutParams, -1, -1, View.VISIBLE, 0, -1,
tmpFrame, tmpContentInsets, tmpRect, tmpStableInsets, tmpRect,
tmpCutout, tmpMergedConfiguration, surfaceControl, mTmpInsetsState,
tmpFrames, tmpMergedConfiguration, surfaceControl, mTmpInsetsState,
mTempControls, sTmpSurfaceSize, sTmpSurfaceControl);
} catch (RemoteException e) {
// Local call.
}
final Rect systemBarInsets = getSystemBarInsets(tmpFrame, insetsState);
snapshotSurface.setFrames(tmpFrame, systemBarInsets);
final Rect systemBarInsets = getSystemBarInsets(tmpFrames.frame, insetsState);
snapshotSurface.setFrames(tmpFrames.frame, systemBarInsets);
snapshotSurface.drawSnapshot();
return snapshotSurface;
}
@@ -528,11 +524,9 @@ class TaskSnapshotSurface implements StartingSurface {
}
@Override
public void resized(Rect frame, Rect contentInsets, Rect visibleInsets,
Rect stableInsets, boolean reportDraw,
MergedConfiguration mergedConfiguration, Rect backDropFrame, boolean forceLayout,
boolean alwaysConsumeSystemBars, int displayId,
DisplayCutout.ParcelableWrapper displayCutout) {
public void resized(ClientWindowFrames frames, boolean reportDraw,
MergedConfiguration mergedConfiguration, boolean forceLayout,
boolean alwaysConsumeSystemBars, int displayId) {
if (mergedConfiguration != null && mOuter != null
&& mOuter.mOrientationOnCreation
!= mergedConfiguration.getMergedConfiguration().orientation) {

View File

@@ -258,6 +258,7 @@ import android.view.WindowManager.RemoveContentMode;
import android.view.WindowManager.TransitionType;
import android.view.WindowManagerGlobal;
import android.view.WindowManagerPolicyConstants.PointerEventListener;
import android.window.ClientWindowFrames;
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
@@ -2065,21 +2066,6 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
public void getWindowDisplayFrame(Session session, IWindow client,
Rect outDisplayFrame) {
synchronized (mGlobalLock) {
WindowState win = windowForClientLocked(session, client, false);
if (win == null) {
outDisplayFrame.setEmpty();
return;
}
outDisplayFrame.set(win.getDisplayFrame());
if (win.inSizeCompatMode()) {
outDisplayFrame.scale(win.mInvGlobalScale);
}
}
}
public void onRectangleOnScreenRequested(IBinder token, Rect rectangle) {
synchronized (mGlobalLock) {
if (mAccessibilityController != null) {
@@ -2115,9 +2101,7 @@ public class WindowManagerService extends IWindowManager.Stub
public int relayoutWindow(Session session, IWindow client, int seq, LayoutParams attrs,
int requestedWidth, int requestedHeight, int viewVisibility, int flags,
long frameNumber, Rect outFrame, Rect outContentInsets,
Rect outVisibleInsets, Rect outStableInsets, Rect outBackdropFrame,
DisplayCutout.ParcelableWrapper outCutout, MergedConfiguration mergedConfiguration,
long frameNumber, ClientWindowFrames outFrames, MergedConfiguration mergedConfiguration,
SurfaceControl outSurfaceControl, InsetsState outInsetsState,
InsetsSourceControl[] outActiveControls, Point outSurfaceSize,
SurfaceControl outBLASTSurfaceControl) {
@@ -2415,18 +2399,14 @@ public class WindowManagerService extends IWindowManager.Stub
// The last inset values represent the last client state
win.updateLastInsetValues();
win.getCompatFrame(outFrame);
win.getInsetsForRelayout(outContentInsets, outVisibleInsets,
outStableInsets);
outCutout.set(win.getWmDisplayCutout().getDisplayCutout());
outBackdropFrame.set(win.getBackdropFrame(win.getFrame()));
win.fillClientWindowFrames(outFrames);
outInsetsState.set(win.getInsetsState(), win.isClientLocal());
if (DEBUG) {
Slog.v(TAG_WM, "Relayout given client " + client.asBinder()
+ ", requestedWidth=" + requestedWidth
+ ", requestedHeight=" + requestedHeight
+ ", viewVisibility=" + viewVisibility
+ "\nRelayout returning frame=" + outFrame
+ "\nRelayout returning frame=" + outFrames.frame
+ ", surface=" + outSurfaceControl);
}
@@ -2436,8 +2416,7 @@ public class WindowManagerService extends IWindowManager.Stub
result |= mInTouchMode ? WindowManagerGlobal.RELAYOUT_RES_IN_TOUCH_MODE : 0;
if (DEBUG_LAYOUT) {
Slog.v(TAG_WM,
"Relayout complete " + win + ": outFrame=" + outFrame.toShortString());
Slog.v(TAG_WM, "Relayout complete " + win + ": outFrames=" + outFrames);
}
win.mInRelayout = false;

View File

@@ -209,7 +209,6 @@ import android.util.Slog;
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
import android.view.Display;
import android.view.DisplayCutout;
import android.view.DisplayInfo;
import android.view.Gravity;
import android.view.IApplicationToken;
@@ -233,6 +232,7 @@ import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
import android.window.ClientWindowFrames;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.policy.KeyInterceptionInfo;
@@ -387,15 +387,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
private final Configuration mTempConfiguration = new Configuration();
/**
* 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();
/**
* Set to true if we are waiting for this window to receive its
* given internal insets before laying out other windows based on it.
@@ -437,6 +428,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
private final WindowFrames mWindowFrames = new WindowFrames();
private final ClientWindowFrames mClientWindowFrames = new ClientWindowFrames();
/** The frames used to compute a temporal layout appearance. */
private WindowFrames mSimulatedWindowFrames;
@@ -1299,7 +1292,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
return mWindowFrames.mRelFrame;
}
/** Retrieves the frame of the display that this window was last laid out in. */
/**
* Gets the frame that excludes the area of side insets according to the layout parameter from
* {@link WindowManager.LayoutParams#setFitInsetsSides}.
*/
Rect getDisplayFrame() {
return mWindowFrames.mDisplayFrame;
}
@@ -3585,6 +3581,39 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
return wpc != null && wpc.registeredForDisplayConfigChanges();
}
void fillClientWindowFrames(ClientWindowFrames outFrames) {
outFrames.frame.set(mWindowFrames.mCompatFrame);
outFrames.displayFrame.set(mWindowFrames.mDisplayFrame);
if (mInvGlobalScale != 1.0f && inSizeCompatMode()) {
outFrames.displayFrame.scale(mInvGlobalScale);
}
final Rect backdropFrame = outFrames.backdropFrame;
// When the task is docked, we send fullscreen sized backdropFrame as soon as resizing
// start even if we haven't received the relayout window, so that the client requests
// the relayout sooner. When dragging stops, backdropFrame needs to stay fullscreen
// until the window to small size, otherwise the multithread renderer will shift last
// one or more frame to wrong offset. So here we send fullscreen backdrop if either
// isDragResizing() or isDragResizeChanged() is true.
final boolean resizing = isDragResizing() || isDragResizeChanged();
if (!resizing || getWindowConfiguration().useWindowFrameForBackdrop()) {
// Surface position is now inherited from parent, and BackdropFrameRenderer uses
// backdrop frame to position content. Thus we just keep the size of backdrop frame,
// and remove the offset to avoid double offset from display origin.
backdropFrame.set(outFrames.frame);
backdropFrame.offsetTo(0, 0);
} else {
final DisplayInfo displayInfo = getDisplayInfo();
backdropFrame.set(0, 0, displayInfo.logicalWidth, displayInfo.logicalHeight);
}
outFrames.displayCutout.set(mWindowFrames.mDisplayCutout.getDisplayCutout());
// TODO(b/149813814): Remove legacy insets.
outFrames.contentInsets.set(mWindowFrames.mLastContentInsets);
outFrames.visibleInsets.set(mWindowFrames.mLastVisibleInsets);
outFrames.stableInsets.set(mWindowFrames.mLastStableInsets);
}
void reportResized() {
// If the activity is scheduled to relaunch, skip sending the resized to ViewRootImpl now
// since it will be destroyed anyway. This also prevents the client from receiving
@@ -3616,23 +3645,18 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
mWinAnimator.mSurfaceResized = false;
mWindowFrames.resetInsetsChanged();
final Rect frame = mWindowFrames.mCompatFrame;
final Rect contentInsets = mWindowFrames.mLastContentInsets;
final Rect visibleInsets = mWindowFrames.mLastVisibleInsets;
final Rect stableInsets = mWindowFrames.mLastStableInsets;
final MergedConfiguration mergedConfiguration = mLastReportedConfiguration;
final boolean reportDraw = mWinAnimator.mDrawState == DRAW_PENDING || useBLASTSync() || !mRedrawForSyncReported;
final boolean forceRelayout = reportOrientation || isDragResizeChanged() || !mRedrawForSyncReported;
final int displayId = getDisplayId();
final DisplayCutout displayCutout = getWmDisplayCutout().getDisplayCutout();
fillClientWindowFrames(mClientWindowFrames);
mRedrawForSyncReported = true;
try {
mClient.resized(frame, contentInsets, visibleInsets, stableInsets, reportDraw,
mergedConfiguration, getBackdropFrame(frame), forceRelayout,
mClient.resized(mClientWindowFrames, reportDraw, mergedConfiguration, forceRelayout,
getDisplayContent().getDisplayPolicy().areSystemBarsForcedShownLw(this),
displayId, new DisplayCutout.ParcelableWrapper(displayCutout));
displayId);
if (mWmService.mAccessibilityController != null) {
mWmService.mAccessibilityController.onSomeWindowResizedOrMovedLocked(displayId);
@@ -3738,27 +3762,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
return (mAttrs.insetsFlags.behavior & BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE) != 0;
}
Rect getBackdropFrame(Rect frame) {
// When the task is docked, we send fullscreen sized backDropFrame as soon as resizing
// start even if we haven't received the relayout window, so that the client requests
// the relayout sooner. When dragging stops, backDropFrame needs to stay fullscreen
// until the window to small size, otherwise the multithread renderer will shift last
// one or more frame to wrong offset. So here we send fullscreen backdrop if either
// isDragResizing() or isDragResizeChanged() is true.
boolean resizing = isDragResizing() || isDragResizeChanged();
if (getWindowConfiguration().useWindowFrameForBackdrop() || !resizing) {
// Surface position is now inherited from parent, and BackdropFrameRenderer uses
// backdrop frame to position content. Thus we just keep the size of backdrop frame, and
// remove the offset to avoid double offset from display origin.
mTmpRect.set(frame);
mTmpRect.offsetTo(0, 0);
return mTmpRect;
}
final DisplayInfo displayInfo = getDisplayInfo();
mTmpRect.set(0, 0, displayInfo.logicalWidth, displayInfo.logicalHeight);
return mTmpRect;
}
private int getRootTaskId() {
final Task stack = getRootTask();
if (stack == null) {
@@ -5670,18 +5673,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
}
/**
* Copy the inset values over so they can be sent back to the client when a relayout occurs.
*/
void getInsetsForRelayout(Rect outContentInsets, Rect outVisibleInsets,
Rect outStableInsets) {
outContentInsets.set(mWindowFrames.mContentInsets);
outVisibleInsets.set(mWindowFrames.mVisibleInsets);
outStableInsets.set(mWindowFrames.mStableInsets);
mLastRelayoutContentInsets.set(mWindowFrames.mContentInsets);
}
void getContentInsets(Rect outContentInsets) {
outContentInsets.set(mWindowFrames.mContentInsets);
}

View File

@@ -17,17 +17,16 @@
package com.android.server.wm;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.util.MergedConfiguration;
import android.view.DisplayCutout;
import android.view.DragEvent;
import android.view.IScrollCaptureController;
import android.view.IWindow;
import android.view.InsetsSourceControl;
import android.view.InsetsState;
import android.window.ClientWindowFrames;
import com.android.internal.os.IResultReceiver;
@@ -38,10 +37,9 @@ public class TestIWindow extends IWindow.Stub {
}
@Override
public void resized(Rect frame, Rect contentInsets, Rect visibleInsets,
Rect stableInsets, boolean reportDraw, MergedConfiguration mergedConfig,
Rect backDropFrame, boolean forceLayout, boolean alwaysConsumeSystemBars, int displayId,
DisplayCutout.ParcelableWrapper displayCutout) throws RemoteException {
public void resized(ClientWindowFrames frames, boolean reportDraw,
MergedConfiguration mergedConfig, boolean forceLayout, boolean alwaysConsumeSystemBars,
int displayId) throws RemoteException {
}
@Override

View File

@@ -581,12 +581,10 @@ public class WindowStateTests extends WindowTestsBase {
mWm.mResizingWindows.remove(win);
spyOn(win.mClient);
try {
doThrow(new RemoteException("test")).when(win.mClient).resized(any() /* frame */,
any() /* contentInsets */, any() /* visibleInsets */, any() /* stableInsets */,
doThrow(new RemoteException("test")).when(win.mClient).resized(any() /* frames */,
anyBoolean() /* reportDraw */, any() /* mergedConfig */,
any() /* backDropFrame */, anyBoolean() /* forceLayout */,
anyBoolean() /* alwaysConsumeSystemBars */, anyInt() /* displayId */,
any() /* displayCutout */);
anyBoolean() /* forceLayout */, anyBoolean() /* alwaysConsumeSystemBars */,
anyInt() /* displayId */);
} catch (RemoteException ignored) {
}
win.reportResized();