Do not process root surface control of detached views.

This changelist ensures that TouchInsetManager does not attempt to
process the root surface control of detached views, which will be
null.

Test: TouchInsetManagerTest#testViewOnDetachedHandling
Fixes: 276012096
Change-Id: I8d2953263925a6068100305272f9ea7be7c5c49d
This commit is contained in:
Bryce Lee
2023-03-29 19:37:33 -07:00
parent d5678fa6df
commit 871cd8fca4
2 changed files with 11 additions and 4 deletions

View File

@@ -108,13 +108,18 @@ public class TouchInsetManager {
private void updateTouchRegions() {
mExecutor.execute(() -> {
final HashMap<AttachedSurfaceControl, Region> affectedSurfaces = new HashMap<>();
if (mTrackedViews.isEmpty()) {
return;
}
mTrackedViews.stream().forEach(view -> {
if (!view.isAttachedToWindow()) {
final AttachedSurfaceControl surface = view.getRootSurfaceControl();
// Detached views will not have a surface control.
if (surface == null) {
return;
}
final AttachedSurfaceControl surface = view.getRootSurfaceControl();
if (!affectedSurfaces.containsKey(surface)) {
affectedSurfaces.put(surface, Region.obtain());
}
@@ -179,6 +184,7 @@ public class TouchInsetManager {
mSessionRegions.values().stream().forEach(regionMapping -> {
regionMapping.entrySet().stream().forEach(entry -> {
final AttachedSurfaceControl surface = entry.getKey();
if (!affectedSurfaces.containsKey(surface)) {
affectedSurfaces.put(surface, Region.obtain());
}

View File

@@ -110,13 +110,14 @@ public class TouchInsetManagerTest extends SysuiTestCase {
clearInvocations(mAttachedSurfaceControl);
when(view.isAttachedToWindow()).thenReturn(false);
when(view.getRootSurfaceControl()).thenReturn(null);
// Trigger detachment and verify touchable region is set.
listener.getValue().onViewDetachedFromWindow(view);
mFakeExecutor.runAllReady();
verify(mAttachedSurfaceControl).setTouchableRegion(any());
verify(mAttachedSurfaceControl).setTouchableRegion(eq(null));
}
@Test