Merge "Release leashes of insets controls if they are not needed" into sc-dev
This commit is contained in:
@@ -48,6 +48,7 @@ public class InsetsSourceControl implements Parcelable {
|
||||
private Insets mInsetsHint;
|
||||
|
||||
private boolean mSkipAnimationOnce;
|
||||
private int mParcelableFlags;
|
||||
|
||||
public InsetsSourceControl(@InternalInsetsType int type, @Nullable SurfaceControl leash,
|
||||
Point surfacePosition, Insets insetsHint) {
|
||||
@@ -132,6 +133,10 @@ public class InsetsSourceControl implements Parcelable {
|
||||
return result;
|
||||
}
|
||||
|
||||
public void setParcelableFlags(int parcelableFlags) {
|
||||
mParcelableFlags = parcelableFlags;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
@@ -140,9 +145,9 @@ public class InsetsSourceControl implements Parcelable {
|
||||
@Override
|
||||
public void writeToParcel(Parcel dest, int flags) {
|
||||
dest.writeInt(mType);
|
||||
dest.writeTypedObject(mLeash, 0 /* parcelableFlags */);
|
||||
dest.writeTypedObject(mSurfacePosition, 0 /* parcelableFlags */);
|
||||
dest.writeTypedObject(mInsetsHint, 0 /* parcelableFlags */);
|
||||
dest.writeTypedObject(mLeash, mParcelableFlags);
|
||||
dest.writeTypedObject(mSurfacePosition, mParcelableFlags);
|
||||
dest.writeTypedObject(mInsetsHint, mParcelableFlags);
|
||||
dest.writeBoolean(mSkipAnimationOnce);
|
||||
}
|
||||
|
||||
|
||||
@@ -5290,7 +5290,16 @@ public final class ViewRootImpl implements ViewParent,
|
||||
// b) When loosing control, controller can restore server state by taking last
|
||||
// dispatched state as truth.
|
||||
mInsetsController.onStateChanged((InsetsState) args.arg1);
|
||||
mInsetsController.onControlsChanged((InsetsSourceControl[]) args.arg2);
|
||||
InsetsSourceControl[] controls = (InsetsSourceControl[]) args.arg2;
|
||||
if (mAdded) {
|
||||
mInsetsController.onControlsChanged(controls);
|
||||
} else if (controls != null) {
|
||||
for (InsetsSourceControl control : controls) {
|
||||
if (control != null) {
|
||||
control.release(SurfaceControl::release);
|
||||
}
|
||||
}
|
||||
}
|
||||
args.recycle();
|
||||
break;
|
||||
}
|
||||
@@ -8136,6 +8145,10 @@ public final class ViewRootImpl implements ViewParent,
|
||||
}
|
||||
}
|
||||
|
||||
// If our window is removed, we might not get notified about losing control.
|
||||
// Invoking this can release the leashes as soon as possible instead of relying on GC.
|
||||
mInsetsController.onControlsChanged(null);
|
||||
|
||||
mAdded = false;
|
||||
}
|
||||
WindowManagerGlobal.getInstance().doRemoveView(this);
|
||||
|
||||
@@ -249,6 +249,7 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged
|
||||
!activeControl.getSurfacePosition().equals(lastSurfacePosition);
|
||||
final boolean leashChanged =
|
||||
!haveSameLeash(mImeSourceControl, activeControl);
|
||||
final InsetsSourceControl lastImeControl = mImeSourceControl;
|
||||
mImeSourceControl = activeControl;
|
||||
if (mAnimation != null) {
|
||||
if (positionChanged) {
|
||||
@@ -262,6 +263,9 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged
|
||||
removeImeSurface();
|
||||
}
|
||||
}
|
||||
if (lastImeControl != null) {
|
||||
lastImeControl.release(SurfaceControl::release);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEME
|
||||
import static android.content.pm.PackageManager.FEATURE_PC;
|
||||
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||
import static android.os.InputConstants.DEFAULT_DISPATCHING_TIMEOUT_MILLIS;
|
||||
import static android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE;
|
||||
import static android.os.Process.SYSTEM_UID;
|
||||
import static android.os.Process.myPid;
|
||||
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
|
||||
@@ -2545,12 +2546,13 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
// 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;
|
||||
if (controls[i] != null) {
|
||||
// This source control is an extra copy if the client is not local. By setting
|
||||
// PARCELABLE_WRITE_RETURN_VALUE, the leash will be released at the end of
|
||||
// SurfaceControl.writeToParcel.
|
||||
outControls[i] = new InsetsSourceControl(controls[i]);
|
||||
outControls[i].setParcelableFlags(PARCELABLE_WRITE_RETURN_VALUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user