Fix back gesture send to wrong focus window

Ensure we could get the proper focused window token what it's during
updating the focus if user touched down on another non-focused window.

It also called `startBackNavigation` when received first move that next
to down event to ensure the `WMS.onPointerDownOutsideFocus` could be
processed first.

Test: atest BackAnimationControllerTest BackNavigationControllerTests
Test: enabled split-screen, trigger back gesture on non-focused window
Bug: 230442550
Bug: 227724016
Change-Id: I81c4f02d43299c03f94dc295bb23ba80d46bded8
Merged-In: I81c4f02d43299c03f94dc295bb23ba80d46bded8
This commit is contained in:
Arthur Hung
2022-04-28 04:52:44 +00:00
parent 55dd1c3792
commit 7d870f9ec2
4 changed files with 11 additions and 14 deletions

View File

@@ -246,9 +246,13 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
* {@link BackAnimationController}
*/
public void onMotionEvent(MotionEvent event, int action, @BackEvent.SwipeEdge int swipeEdge) {
if (action == MotionEvent.ACTION_DOWN) {
initAnimation(event);
} else if (action == MotionEvent.ACTION_MOVE) {
if (action == MotionEvent.ACTION_MOVE) {
if (!mBackGestureStarted) {
// Let the animation initialized here to make sure the onPointerDownOutsideFocus
// could be happened when ACTION_DOWN, it may change the current focus that we
// would access it when startBackNavigation.
initAnimation(event);
}
onMove(event, swipeEdge);
} else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
ProtoLog.d(WM_SHELL_BACK_PREVIEW,

View File

@@ -209,12 +209,11 @@ public class BackAnimationControllerTest {
createNavigationInfo(animationTarget, null, null,
BackNavigationInfo.TYPE_RETURN_TO_HOME, null);
// Check that back start is dispatched.
doMotionEvent(MotionEvent.ACTION_DOWN, 0);
verify(mIOnBackInvokedCallback).onBackStarted();
// Check that back progress is dispatched.
// Check that back start and progress is dispatched when first move.
doMotionEvent(MotionEvent.ACTION_MOVE, 100);
verify(mIOnBackInvokedCallback).onBackStarted();
ArgumentCaptor<BackEvent> backEventCaptor = ArgumentCaptor.forClass(BackEvent.class);
verify(mIOnBackInvokedCallback).onBackProgressed(backEventCaptor.capture());
assertEquals(animationTarget, backEventCaptor.getValue().getDepartingAnimationTarget());

View File

@@ -124,8 +124,7 @@ class BackNavigationController {
LocalServices.getService(WindowManagerInternal.class);
IBinder focusedWindowToken = windowManagerInternal.getFocusedWindowToken();
window = wmService.windowForClientLocked(null, focusedWindowToken,
false /* throwOnError */);
window = wmService.getFocusedWindowLocked();
if (window == null) {
EmbeddedWindowController.EmbeddedWindow embeddedWindow =
@@ -146,12 +145,6 @@ class BackNavigationController {
"Focused window found using getFocusedWindowToken");
}
if (window == null) {
window = wmService.getFocusedWindowLocked();
ProtoLog.d(WM_DEBUG_BACK_PREVIEW,
"Focused window found using wmService.getFocusedWindowLocked()");
}
if (window == null) {
// We don't have any focused window, fallback ont the top currentTask of the focused
// display.

View File

@@ -306,6 +306,7 @@ public class BackNavigationControllerTests extends WindowTestsBase {
if (focus) {
doReturn(window.getWindowInfo().token)
.when(mWindowManagerInternal).getFocusedWindowToken();
doReturn(window).when(mWm).getFocusedWindowLocked();
}
}
}