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
This commit is contained in:
Wen-Chien Wang
2024-11-21 21:44:59 +00:00
committed by Wen-chien Wang
parent d091b42778
commit ecc50c6d7c
2 changed files with 38 additions and 0 deletions
@@ -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;
}
@@ -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