Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ecc50c6d authored by Wen-Chien Wang's avatar Wen-Chien Wang Committed by Wen-chien Wang
Browse files

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
parent d091b427
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -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;
    }

+2 −0
Original line number Diff line number Diff line
@@ -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