Merge "Ensure addWindow/relayoutWindow won't return stale controls" into rvc-dev

This commit is contained in:
TreeHugger Robot
2020-05-14 19:12:50 +00:00
committed by Android (Google) Code Review
2 changed files with 18 additions and 18 deletions

View File

@@ -91,6 +91,7 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
private float mLastReportedAnimatorScale;
private String mPackageName;
private String mRelayoutTag;
private final InsetsSourceControl[] mDummyControls = new InsetsSourceControl[0];
public Session(WindowManagerService service, IWindowSessionCallback callback) {
mService = service;
@@ -184,7 +185,7 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
new Rect() /* outFrame */, outContentInsets, outStableInsets,
new DisplayCutout.ParcelableWrapper() /* cutout */, null /* outInputChannel */,
outInsetsState, null, UserHandle.getUserId(mUid));
outInsetsState, mDummyControls, UserHandle.getUserId(mUid));
}
@Override

View File

@@ -1387,6 +1387,7 @@ public class WindowManagerService extends IWindowManager.Stub
DisplayCutout.ParcelableWrapper outDisplayCutout, InputChannel outInputChannel,
InsetsState outInsetsState, InsetsSourceControl[] outActiveControls,
int requestUserId) {
Arrays.fill(outActiveControls, null);
int[] appOp = new int[1];
final boolean isRoundedCornerOverlay = (attrs.privateFlags
& PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY) != 0;
@@ -2133,6 +2134,7 @@ public class WindowManagerService extends IWindowManager.Stub
SurfaceControl outSurfaceControl, InsetsState outInsetsState,
InsetsSourceControl[] outActiveControls, Point outSurfaceSize,
SurfaceControl outBLASTSurfaceControl) {
Arrays.fill(outActiveControls, null);
int result = 0;
boolean configChanged;
final int pid = Binder.getCallingPid();
@@ -2470,23 +2472,20 @@ public class WindowManagerService extends IWindowManager.Stub
}
private void getInsetsSourceControls(WindowState win, InsetsSourceControl[] outControls) {
if (outControls != null) {
final InsetsSourceControl[] controls =
win.getDisplayContent().getInsetsStateController().getControlsForDispatch(win);
Arrays.fill(outControls, null);
if (controls != null) {
final int length = Math.min(controls.length, outControls.length);
for (int i = 0; i < length; i++) {
// We will leave the critical section before returning the leash to the client,
// so we need to copy the leash to prevent others release the one that we are
// about to return.
// TODO: We will have an extra copy if the client is not local.
// For now, we rely on GC to release it.
// Maybe we can modify InsetsSourceControl.writeToParcel so it can release
// the extra leash as soon as possible.
outControls[i] = controls[i] != null
? new InsetsSourceControl(controls[i]) : null;
}
final InsetsSourceControl[] controls =
win.getDisplayContent().getInsetsStateController().getControlsForDispatch(win);
if (controls != null) {
final int length = Math.min(controls.length, outControls.length);
for (int i = 0; i < length; i++) {
// We will leave the critical section before returning the leash to the client,
// so we need to copy the leash to prevent others release the one that we are
// about to return.
// TODO: We will have an extra copy if the client is not local.
// For now, we rely on GC to release it.
// Maybe we can modify InsetsSourceControl.writeToParcel so it can release
// the extra leash as soon as possible.
outControls[i] = controls[i] != null
? new InsetsSourceControl(controls[i]) : null;
}
}
}