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

Commit 39534b94 authored by Vishnu Nair's avatar Vishnu Nair
Browse files

Allow extending the SurfacePackage lifetime

Caller may need to keep the SurfacePackage alive after attaching it
to a SurfaceView. We allow this by creating a copy of the
SurfaceControl inside the SurfacePackage. Since the native layer
handle is ref counted, this will keep the encapsulated Surface hierarchy
alive after it has been released by SurfaceView.

Bug: 182838860
Test: atest SurfaceControlViewHostTests
Change-Id: I49e228b561d7aca23691d683747edc5365fc4206
parent ca921e36
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -48064,6 +48064,7 @@ package android.view {
  }
  public static final class SurfaceControlViewHost.SurfacePackage implements android.os.Parcelable {
    ctor public SurfaceControlViewHost.SurfacePackage(@NonNull android.view.SurfaceControlViewHost.SurfacePackage);
    method public int describeContents();
    method public void release();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
+20 −0
Original line number Diff line number Diff line
@@ -79,6 +79,26 @@ public class SurfaceControlViewHost {
            mInputToken = inputToken;
        }

        /**
         * Constructs a copy of {@code SurfacePackage} with an independent lifetime.
         *
         * The caller can use this to create an independent copy in situations where ownership of
         * the {@code SurfacePackage} would be transferred elsewhere, such as attaching to a
         * {@code SurfaceView}, returning as {@code Binder} result value, etc. The caller is
         * responsible for releasing this copy when its done.
         *
         * @param other {@code SurfacePackage} to create a copy of.
         */
        public SurfacePackage(@NonNull SurfacePackage other) {
            SurfaceControl otherSurfaceControl = other.mSurfaceControl;
            if (otherSurfaceControl != null && otherSurfaceControl.isValid()) {
                mSurfaceControl = new SurfaceControl();
                mSurfaceControl.copyFrom(otherSurfaceControl, "SurfacePackage");
            }
            mAccessibilityEmbeddedConnection = other.mAccessibilityEmbeddedConnection;
            mInputToken = other.mInputToken;
        }

        private SurfacePackage(Parcel in) {
            mSurfaceControl = new SurfaceControl();
            mSurfaceControl.readFromParcel(in);