Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 51fae816 authored by Tiger Huang's avatar Tiger Huang Committed by Automerger Merge Worker
Browse files

Merge "Release leashes of insets controls if they are not needed" into sc-dev...

Merge "Release leashes of insets controls if they are not needed" into sc-dev am: ef1bb2c9 am: c6d5475f

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15090014

Change-Id: I3352970fa11bd3be7a5cb21dd3ef5d5b062943cb
parents f7365d74 c6d5475f
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -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);
    }

+14 −1
Original line number Diff line number Diff line
@@ -5305,7 +5305,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;
                }
@@ -8151,6 +8160,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);
+4 −0
Original line number Diff line number Diff line
@@ -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);
                        }
                    }
                }
            }
+8 −6
Original line number Diff line number Diff line
@@ -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;
@@ -2548,12 +2549,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);
                }
            }
        }
    }