From ecc50c6d7c7d77801389ebe2ce768fc2c084c519 Mon Sep 17 00:00:00 2001 From: Wen-Chien Wang Date: Thu, 21 Nov 2024 21:44:59 +0000 Subject: [PATCH] Register back action to close the KQS view As the KQS view is not extending the floating view, we have to explicitly register the back action to close the KQS view. Bug: 379778483 Test: open KQS via alt-tab/overflow button and tap the back button Flag: com.android.launcher3.taskbar_overflow Change-Id: I140813d1792f0c17aee5f9f8dd9fa3ed8b40ba6c --- .../taskbar/KeyboardQuickSwitchView.java | 36 +++++++++++++++++++ .../KeyboardQuickSwitchViewController.java | 2 ++ 2 files changed, 38 insertions(+) diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java index 1967dfd980..306443ea31 100644 --- a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java +++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java @@ -35,6 +35,8 @@ import android.view.ViewTreeObserver; import android.view.animation.Interpolator; import android.widget.HorizontalScrollView; import android.widget.TextView; +import android.window.OnBackInvokedDispatcher; +import android.window.WindowOnBackInvokedDispatcher; import androidx.annotation.LayoutRes; import androidx.annotation.NonNull; @@ -109,6 +111,8 @@ public class KeyboardQuickSwitchView extends ConstraintLayout { @Nullable private AnimatorSet mOpenAnimation; + private boolean mIsBackCallbackRegistered = false; + @Nullable private KeyboardQuickSwitchViewController.ViewCallbacks mViewCallbacks; public KeyboardQuickSwitchView(@NonNull Context context) { @@ -158,6 +162,34 @@ public class KeyboardQuickSwitchView extends ConstraintLayout { mIsRtl = Utilities.isRtl(resources); } + private void registerOnBackInvokedCallback() { + OnBackInvokedDispatcher dispatcher = findOnBackInvokedDispatcher(); + + if (isOnBackInvokedCallbackEnabled(dispatcher) + && !mIsBackCallbackRegistered) { + dispatcher.registerOnBackInvokedCallback( + OnBackInvokedDispatcher.PRIORITY_OVERLAY, mViewCallbacks.onBackInvokedCallback); + mIsBackCallbackRegistered = true; + } + } + + private void unregisterOnBackInvokedCallback() { + OnBackInvokedDispatcher dispatcher = findOnBackInvokedDispatcher(); + + if (isOnBackInvokedCallbackEnabled(dispatcher) + && mIsBackCallbackRegistered) { + dispatcher.unregisterOnBackInvokedCallback( + mViewCallbacks.onBackInvokedCallback); + mIsBackCallbackRegistered = false; + } + } + + private boolean isOnBackInvokedCallbackEnabled(OnBackInvokedDispatcher dispatcher) { + return dispatcher instanceof WindowOnBackInvokedDispatcher + && ((WindowOnBackInvokedDispatcher) dispatcher).isOnBackInvokedCallbackEnabled() + && mViewCallbacks != null; + } + private KeyboardQuickSwitchTaskView createAndAddTaskView( int index, boolean isFinalView, @@ -277,6 +309,7 @@ public class KeyboardQuickSwitchView extends ConstraintLayout { new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { + registerOnBackInvokedCallback(); animateOpen(currentFocusIndexOverride); getViewTreeObserver().removeOnGlobalLayoutListener(this); @@ -293,6 +326,9 @@ public class KeyboardQuickSwitchView extends ConstraintLayout { } void resetViewCallbacks() { + // Unregister the back invoked callback after the view is closed and before the + // mViewCallbacks is reset. + unregisterOnBackInvokedCallback(); mViewCallbacks = null; } diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java index 985cc26d8e..3016b859a6 100644 --- a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java @@ -25,6 +25,7 @@ import android.view.Gravity; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.animation.AnimationUtils; +import android.window.OnBackInvokedCallback; import android.window.RemoteTransition; import androidx.annotation.NonNull; @@ -330,6 +331,7 @@ public class KeyboardQuickSwitchViewController { } class ViewCallbacks { + public final OnBackInvokedCallback onBackInvokedCallback = () -> closeQuickSwitchView(true); boolean onKeyUp(int keyCode, KeyEvent event, boolean isRTL, boolean allowTraversal) { if (keyCode != KeyEvent.KEYCODE_TAB