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

Commit 0902f07d authored by Ben Lin's avatar Ben Lin
Browse files

Moving back button behavior to SharedInputHandler, and now handling ESC keys.

Bug: 35674183
Change-Id: Ia6a5eb78f89ed1346aec81455dd6a721861bc6fa
parent 390cd78b
Loading
Loading
Loading
Loading
+0 −19
Original line number Diff line number Diff line
@@ -545,25 +545,6 @@ public abstract class BaseActivity
        return mState.stack.peek();
    }

    @Override
    public void onBackPressed() {
        // While action bar is expanded, the state stack UI is hidden.
        if (mSearchManager.cancelSearch()) {
            return;
        }

        DirectoryFragment dir = getDirectoryFragment();
        if (dir != null && dir.onBackPressed()) {
            return;
        }

        if (popDir()) {
            return;
        }

        super.onBackPressed();
    }

    @VisibleForTesting
    public void addEventListener(EventListener listener) {
        mEventListeners.add(listener);
+86 −15
Original line number Diff line number Diff line
@@ -15,43 +15,114 @@
 */
package com.android.documentsui;

import static com.android.documentsui.base.Shared.DEBUG;

import android.util.Log;
import android.view.KeyEvent;

import com.android.documentsui.base.Events;
import com.android.documentsui.base.Features;
import com.android.documentsui.base.Procedure;
import com.android.documentsui.dirlist.FocusHandler;
import com.android.documentsui.selection.SelectionManager;

public class SharedInputHandler {

    private final FocusManager mFocusManager;
    private static final String TAG = "SharedInputHandler";

    private final FocusHandler mFocusManager;
    private final Procedure mSearchCanceler;
    private final Procedure mDirPopper;
    private final Features mFeatures;
    private final SelectionManager mSelectionMgr;

    public SharedInputHandler(FocusManager focusManager, Procedure dirPopper, Features features) {
        mFocusManager = focusManager;
    public SharedInputHandler(
            FocusHandler focusHandler,
            SelectionManager selectionMgr,
            Procedure searchCanceler,
            Procedure dirPopper,
            Features features) {
        mFocusManager = focusHandler;
        mSearchCanceler = searchCanceler;
        mSelectionMgr = selectionMgr;
        mDirPopper = dirPopper;
        mFeatures = features;
    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            // Unhandled ESC keys end up being rethrown back at us as BACK keys. So by returning
            // true, we make sure it always does no-op.
            case KeyEvent.KEYCODE_ESCAPE:
                return onEscape();

            case KeyEvent.KEYCODE_DEL:
                return onDelete();

            // This is the Android back button, not backspace.
            case KeyEvent.KEYCODE_BACK:
                return onBack();

            case KeyEvent.KEYCODE_TAB:
                return onTab();

            default:
                // Instead of duplicating the switch-case in #isNavigationKeyCode, best just to
                // leave it here.
                if (Events.isNavigationKeyCode(keyCode)) {
                    // Forward all unclaimed navigation keystrokes to the directory list.
                    // This causes any stray navigation keystrokes to focus the content pane,
                    // which is probably what the user is trying to do.
                    mFocusManager.focusDirectoryList();
                    return true;
        } else if (keyCode == KeyEvent.KEYCODE_TAB
                && !mFeatures.isSystemKeyboardNavigationEnabled()) {
                }
                return false;
        }
    }

    private boolean onTab() {
        if (!mFeatures.isSystemKeyboardNavigationEnabled()) {
            // Tab toggles focus on the navigation drawer.
            // This should only be called in pre-O devices, since O has built-in keyboard navigation
            // This should only be called in pre-O devices, since O has built-in keyboard
            // navigation
            // support.
            mFocusManager.advanceFocusArea();
            return true;
        } else if (keyCode == KeyEvent.KEYCODE_DEL) {
        }

        return false;
    }

    private boolean onDelete() {
        mDirPopper.run();
        return true;
    }

        return false;
    private boolean onBack() {
        if (mSearchCanceler.run()) {
            return true;
        }

        if (mSelectionMgr.hasSelection()) {
            if (DEBUG) Log.d(TAG, "Back pressed. Clearing existing selection.");
            mSelectionMgr.clearSelection();
            return true;
        }

        return mDirPopper.run();
    }

    private boolean onEscape() {
        if (mSearchCanceler.run()) {
            return true;
        }

        if (mSelectionMgr.hasSelection()) {
            if (DEBUG) Log.d(TAG, "ESC pressed. Clearing existing selection.");
            mSelectionMgr.clearSelection();
            return true;
        }

        return true;
    }
}
+0 −9
Original line number Diff line number Diff line
@@ -692,15 +692,6 @@ public class DirectoryFragment extends Fragment
        }
    }

    public final boolean onBackPressed() {
        if (mSelectionMgr.hasSelection()) {
            if (DEBUG) Log.d(TAG, "Clearing selection on selection manager.");
            mSelectionMgr.clearSelection();
            return true;
        }
        return false;
    }

    private boolean onAccessibilityClick(View child) {
        DocumentDetails doc = getDocumentHolder(child);
        mActions.openDocument(doc);
+13 −6
Original line number Diff line number Diff line
@@ -30,11 +30,18 @@ final class ActivityInputHandler {
    }

    boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_DEL && event.isAltPressed())
                || keyCode == KeyEvent.KEYCODE_FORWARD_DEL) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_FORWARD_DEL:
                mDeleteHandler.run();
                return true;
            case KeyEvent.KEYCODE_DEL:
                if (event.isAltPressed()) {
                    mDeleteHandler.run();
                    return true;
                }
                return false;
            default:
                return false;
        }
    }
}
+9 −2
Original line number Diff line number Diff line
@@ -132,7 +132,12 @@ public class FilesActivity extends BaseActivity implements ActionHandler.Addons
        mActivityInputHandler =
                new ActivityInputHandler(mInjector.actions::deleteSelectedDocuments);
        mSharedInputHandler =
                new SharedInputHandler(mInjector.focusManager, this::popDir, mInjector.features);
                new SharedInputHandler(
                        mInjector.focusManager,
                        mInjector.selectionMgr,
                        mInjector.searchManager::cancelSearch,
                        this::popDir,
                        mInjector.features);

        RootsFragment.show(getFragmentManager(), null);

@@ -302,7 +307,9 @@ public class FilesActivity extends BaseActivity implements ActionHandler.Addons
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        return mActivityInputHandler.onKeyDown(keyCode, event)
                || mSharedInputHandler.onKeyDown(keyCode, event)
                || mSharedInputHandler.onKeyDown(
                        keyCode,
                        event)
                || super.onKeyDown(keyCode, event);
    }

Loading