Merge "Register back action to close the KQS view" into main
diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java
index 1967dfd..306443e 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.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 @@
@Nullable private AnimatorSet mOpenAnimation;
+ private boolean mIsBackCallbackRegistered = false;
+
@Nullable private KeyboardQuickSwitchViewController.ViewCallbacks mViewCallbacks;
public KeyboardQuickSwitchView(@NonNull Context context) {
@@ -158,6 +162,34 @@
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 @@
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
+ registerOnBackInvokedCallback();
animateOpen(currentFocusIndexOverride);
getViewTreeObserver().removeOnGlobalLayoutListener(this);
@@ -293,6 +326,9 @@
}
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 e623b21..3114bc8 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.KeyEvent;
import android.view.MotionEvent;
import android.view.animation.AnimationUtils;
+import android.window.OnBackInvokedCallback;
import android.window.RemoteTransition;
import androidx.annotation.NonNull;
@@ -331,6 +332,7 @@
}
class ViewCallbacks {
+ public final OnBackInvokedCallback onBackInvokedCallback = () -> closeQuickSwitchView(true);
boolean onKeyUp(int keyCode, KeyEvent event, boolean isRTL, boolean allowTraversal) {
if (keyCode != KeyEvent.KEYCODE_TAB