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 e623b21bb9..3114bc8276 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; @@ -331,6 +332,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