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

Commit 8a7d2015 authored by Patrick Williams's avatar Patrick Williams
Browse files

Fix SurfaceControl release on connection removed

Bug: 411115844
Flag: com.android.window.flags.scvh_surface_control_lifetime_fix
Test: AccessibilityOverlayTest
Change-Id: I8bc9c393154cdceb9642cefd765ec8f61b2ca62d
parent 1328c4a3
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLICK;
import static android.view.accessibility.AccessibilityNodeInfo.ACTION_LONG_CLICK;

import static com.android.server.pm.UserManagerService.enforceCurrentUserIfVisibleBackgroundEnabled;
import static com.android.window.flags.Flags.scvhSurfaceControlLifetimeFix;

import android.accessibilityservice.AccessibilityGestureEvent;
import android.accessibilityservice.AccessibilityService;
@@ -2809,7 +2810,15 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
        try {
            mSystemSupport.attachAccessibilityOverlayToDisplay(
                    interactionId, displayId, sc, callback);
            if (scvhSurfaceControlLifetimeFix()) {
                // AccessibilityManagerService#attachAccessibilityOverlayToDisplay releases the
                // SurfaceControl supplied to it. In order to reparent any attached overlays when
                // the session is removed, we need a not-released SurfaceControl. For this purpose,
                // we store a copy of the provided SurfaceControl in mOverlays.
                mOverlays.add(new SurfaceControl(sc, "attachAccessibilityOverlayToDisplay"));
            } else {
                mOverlays.add(sc);
            }
        } finally {
            Binder.restoreCallingIdentity(identity);
        }
@@ -2854,6 +2863,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
        for (SurfaceControl sc : mOverlays) {
            if (sc.isValid()) {
                t.reparent(sc, null);
                sc.release();
            }
        }
        t.apply();