Merge "Ensure addWindow/relayoutWindow won't return stale controls" into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
54c5cc1eee
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user