chromium/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/KeyboardNavigationListener.java

// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.chrome.browser.toolbar;

import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnKeyListener;

/** This is an abstract class to override keyboard navigation behavior for views. */
public abstract class KeyboardNavigationListener implements OnKeyListener {
    public KeyboardNavigationListener() {
        super();
    }

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_TAB && event.getAction() == KeyEvent.ACTION_DOWN) {
            if (event.hasNoModifiers()) {
                View forward = getNextFocusForward();
                if (forward != null) return forward.requestFocus();
            } else if (event.isShiftPressed()) {
                View backward = getNextFocusBackward();
                if (backward != null) return backward.requestFocus();
            }
        } else if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) {
            return handleEnterKeyPress();
        }
        return false;
    }

    /**
     * Get the view to be focused on a TAB click. If you return null, the default key event
     * processing will occur instead of attempting to focus.
     * @return The view to gain focus.
     */
    public View getNextFocusForward() {
        return null;
    }

    /**
     * Get the view to be focused on a Shift + TAB click. If you return null, the default key event
     * processing will occur instead of attempting to focus.
     * @return The view to gain focus.
     */
    public View getNextFocusBackward() {
        return null;
    }

    /**
     * Allows the extending class to special case the enter key press handling.
     * @return Whether the enter key was handled
     */
    protected boolean handleEnterKeyPress() {
        return false;
    }
}