Merge "Ensure TouchSessions are always removed." into tm-qpr-dev

This commit is contained in:
Bryce Lee
2023-01-25 20:40:04 +00:00
committed by Android (Google) Code Review
2 changed files with 35 additions and 0 deletions

View File

@@ -226,6 +226,15 @@ public class DreamOverlayTouchMonitor {
return;
}
// When we stop monitoring touches, we must ensure that all active touch sessions and
// descendants informed of the removal so any cleanup for active tracking can proceed.
mExecutor.execute(() -> mActiveTouchSessions.forEach(touchSession -> {
while (touchSession != null) {
touchSession.onRemoved();
touchSession = touchSession.getPredecessor();
}
}));
mCurrentInputSession.dispose();
mCurrentInputSession = null;
}

View File

@@ -424,6 +424,32 @@ public class DreamOverlayTouchMonitorTest extends SysuiTestCase {
verify(gestureListener2).onDown(eq(followupEvent));
}
@Test
public void testOnRemovedCallbackOnStopMonitoring() {
final DreamTouchHandler touchHandler = Mockito.mock(DreamTouchHandler.class);
final DreamTouchHandler.TouchSession.Callback callback =
Mockito.mock(DreamTouchHandler.TouchSession.Callback.class);
final Environment environment = new Environment(Stream.of(touchHandler)
.collect(Collectors.toCollection(HashSet::new)));
final InputEvent initialEvent = Mockito.mock(InputEvent.class);
environment.publishInputEvent(initialEvent);
final DreamTouchHandler.TouchSession session = captureSession(touchHandler);
session.registerCallback(callback);
environment.executeAll();
environment.updateLifecycle(observerOwnerPair -> {
observerOwnerPair.first.onPause(observerOwnerPair.second);
});
environment.executeAll();
verify(callback).onRemoved();
}
public GestureDetector.OnGestureListener registerGestureListener(DreamTouchHandler handler) {
final GestureDetector.OnGestureListener gestureListener = Mockito.mock(
GestureDetector.OnGestureListener.class);