Clean up a11y overlays after service exits or crashes.

Fix: 271490102
Test: atest AccessibilityOverlayTest
Change-Id: I1443d2c98c6ba4801a2e71b247fac7d662173bdf
diff --git a/services/accessibility/accessibility.aconfig b/services/accessibility/accessibility.aconfig
index 75ecdb7..a19920f 100644
--- a/services/accessibility/accessibility.aconfig
+++ b/services/accessibility/accessibility.aconfig
@@ -10,6 +10,13 @@
 }
 
 flag {
+    name: "cleanup_a11y_overlays"
+    namespace: "accessibility"
+    description: "Removes all attached accessibility overlays when a service is removed."
+    bug: "271490102"
+}
+
+flag {
     name: "deprecate_package_list_observer"
     namespace: "accessibility"
     description: "Stops using the deprecated PackageListObserver."
diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
index fa73cff..6d82b74 100644
--- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
@@ -224,6 +224,9 @@
 
     final SparseArray<IBinder> mOverlayWindowTokens = new SparseArray();
 
+    // All the embedded accessibility overlays that have been added by this service.
+    private List<SurfaceControl> mOverlays = new ArrayList<>();
+
     /** The timestamp of requesting to take screenshot in milliseconds */
     private long mRequestTakeScreenshotTimestampMs;
     /**
@@ -1554,6 +1557,9 @@
             final int displayId = displays[i].getDisplayId();
             onDisplayRemoved(displayId);
         }
+        if (Flags.cleanupA11yOverlays()) {
+            detachAllOverlays();
+        }
     }
 
     /**
@@ -2677,6 +2683,7 @@
         try {
             mSystemSupport.attachAccessibilityOverlayToDisplay(
                     interactionId, displayId, sc, callback);
+            mOverlays.add(sc);
         } finally {
             Binder.restoreCallingIdentity(identity);
         }
@@ -2707,10 +2714,23 @@
                 connection
                         .getRemote()
                         .attachAccessibilityOverlayToWindow(sc, interactionId, callback);
+                mOverlays.add(sc);
             }
 
         } finally {
             Binder.restoreCallingIdentity(identity);
         }
     }
+
+    protected void detachAllOverlays() {
+        SurfaceControl.Transaction t = new SurfaceControl.Transaction();
+        for (SurfaceControl sc : mOverlays) {
+            if (sc.isValid()) {
+                t.reparent(sc, null);
+            }
+        }
+        t.apply();
+        t.close();
+        mOverlays.clear();
+    }
 }