188d80f4471c900628e2cb6eef23029b99af48e09Chris Wren/*
288d80f4471c900628e2cb6eef23029b99af48e09Chris Wren * Copyright (C) 2013 The Android Open Source Project
388d80f4471c900628e2cb6eef23029b99af48e09Chris Wren *
488d80f4471c900628e2cb6eef23029b99af48e09Chris Wren * Licensed under the Apache License, Version 2.0 (the "License");
588d80f4471c900628e2cb6eef23029b99af48e09Chris Wren * you may not use this file except in compliance with the License.
688d80f4471c900628e2cb6eef23029b99af48e09Chris Wren * You may obtain a copy of the License at
788d80f4471c900628e2cb6eef23029b99af48e09Chris Wren *
888d80f4471c900628e2cb6eef23029b99af48e09Chris Wren *      http://www.apache.org/licenses/LICENSE-2.0
988d80f4471c900628e2cb6eef23029b99af48e09Chris Wren *
1088d80f4471c900628e2cb6eef23029b99af48e09Chris Wren * Unless required by applicable law or agreed to in writing, software
1188d80f4471c900628e2cb6eef23029b99af48e09Chris Wren * distributed under the License is distributed on an "AS IS" BASIS,
1288d80f4471c900628e2cb6eef23029b99af48e09Chris Wren * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1388d80f4471c900628e2cb6eef23029b99af48e09Chris Wren * See the License for the specific language governing permissions and
1488d80f4471c900628e2cb6eef23029b99af48e09Chris Wren * limitations under the License.
1588d80f4471c900628e2cb6eef23029b99af48e09Chris Wren */
1688d80f4471c900628e2cb6eef23029b99af48e09Chris Wrenpackage com.android.dreams.phototable;
1788d80f4471c900628e2cb6eef23029b99af48e09Chris Wren
1888d80f4471c900628e2cb6eef23029b99af48e09Chris Wrenimport android.util.Log;
1988d80f4471c900628e2cb6eef23029b99af48e09Chris Wrenimport android.view.KeyEvent;
2088d80f4471c900628e2cb6eef23029b99af48e09Chris Wrenimport android.view.View;
2188d80f4471c900628e2cb6eef23029b99af48e09Chris Wren
2288d80f4471c900628e2cb6eef23029b99af48e09Chris Wren/**
2388d80f4471c900628e2cb6eef23029b99af48e09Chris Wren * Keyboard event dispatcher for Photo Table.
2488d80f4471c900628e2cb6eef23029b99af48e09Chris Wren */
2588d80f4471c900628e2cb6eef23029b99af48e09Chris Wrenpublic class KeyboardInterpreter {
2688d80f4471c900628e2cb6eef23029b99af48e09Chris Wren    private static final String TAG = "DPadInterpreter";
2788d80f4471c900628e2cb6eef23029b99af48e09Chris Wren    private static final boolean DEBUG = false;
2888d80f4471c900628e2cb6eef23029b99af48e09Chris Wren
2988d80f4471c900628e2cb6eef23029b99af48e09Chris Wren    private final PhotoTable mTable;
30a924553fc2a5bf5ab88ac031adf154480b970bd9Chris Wren    private final long mBounce;
31a924553fc2a5bf5ab88ac031adf154480b970bd9Chris Wren    private long mLastDeckNavigation;
3288d80f4471c900628e2cb6eef23029b99af48e09Chris Wren
3388d80f4471c900628e2cb6eef23029b99af48e09Chris Wren    public KeyboardInterpreter(PhotoTable table) {
34a924553fc2a5bf5ab88ac031adf154480b970bd9Chris Wren        mBounce = 2000; // TODO: remove this once latencies in lower layers are removed.
3588d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        mTable = table;
3688d80f4471c900628e2cb6eef23029b99af48e09Chris Wren    }
3788d80f4471c900628e2cb6eef23029b99af48e09Chris Wren    public boolean onKeyDown(int keyCode, KeyEvent event) {
3888d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        final View focus = mTable.getFocus();
3988d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        boolean consumed = true;
4088d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        if (mTable.hasSelection()) {
4188d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            switch (keyCode) {
4288d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            case KeyEvent.KEYCODE_ENTER:
4388d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            case KeyEvent.KEYCODE_DPAD_CENTER:
4488d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            case KeyEvent.KEYCODE_ESCAPE:
4588d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                mTable.setFocus(mTable.getSelection());
4688d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                mTable.clearSelection();
4788d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                break;
48a924553fc2a5bf5ab88ac031adf154480b970bd9Chris Wren
49a924553fc2a5bf5ab88ac031adf154480b970bd9Chris Wren            case KeyEvent.KEYCODE_DPAD_RIGHT:
50a924553fc2a5bf5ab88ac031adf154480b970bd9Chris Wren            case KeyEvent.KEYCODE_L:
51a924553fc2a5bf5ab88ac031adf154480b970bd9Chris Wren                if ((System.currentTimeMillis() - mLastDeckNavigation) > mBounce) {
52a924553fc2a5bf5ab88ac031adf154480b970bd9Chris Wren                    mLastDeckNavigation = System.currentTimeMillis();
53a924553fc2a5bf5ab88ac031adf154480b970bd9Chris Wren                    mTable.selectPrevious();
54a924553fc2a5bf5ab88ac031adf154480b970bd9Chris Wren                }
55a924553fc2a5bf5ab88ac031adf154480b970bd9Chris Wren                break;
56a924553fc2a5bf5ab88ac031adf154480b970bd9Chris Wren
57a924553fc2a5bf5ab88ac031adf154480b970bd9Chris Wren            case KeyEvent.KEYCODE_DPAD_LEFT:
58a924553fc2a5bf5ab88ac031adf154480b970bd9Chris Wren            case KeyEvent.KEYCODE_H:
59a924553fc2a5bf5ab88ac031adf154480b970bd9Chris Wren                if ((System.currentTimeMillis() - mLastDeckNavigation) > mBounce) {
60a924553fc2a5bf5ab88ac031adf154480b970bd9Chris Wren                    mLastDeckNavigation = System.currentTimeMillis();
61a924553fc2a5bf5ab88ac031adf154480b970bd9Chris Wren                    mTable.selectNext();
62a924553fc2a5bf5ab88ac031adf154480b970bd9Chris Wren                }
63a924553fc2a5bf5ab88ac031adf154480b970bd9Chris Wren                break;
64a924553fc2a5bf5ab88ac031adf154480b970bd9Chris Wren
6588d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            default:
6688d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                if (DEBUG) Log.d(TAG, "dropped unexpected: " + keyCode);
6788d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                consumed = false;
6884c3d5580e7168d1d150c1dd24340b19eb501cd2Chris Wren                // give the user some more time to figure it out
6984c3d5580e7168d1d150c1dd24340b19eb501cd2Chris Wren                mTable.refreshSelection();
7088d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                break;
7188d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            }
7288d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        } else {
7388d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            switch (keyCode) {
7488d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            case KeyEvent.KEYCODE_ENTER:
7588d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            case KeyEvent.KEYCODE_DPAD_CENTER:
7688d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                if (mTable.hasFocus()) {
7788d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                    mTable.setSelection(mTable.getFocus());
7888d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                    mTable.clearFocus();
7988d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                } else {
8088d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                    mTable.setDefaultFocus();
8188d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                }
8288d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                break;
8388d80f4471c900628e2cb6eef23029b99af48e09Chris Wren
8488d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            case KeyEvent.KEYCODE_DEL:
8588d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            case KeyEvent.KEYCODE_X:
8688d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                if (mTable.hasFocus()) {
8788d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                    mTable.fling(mTable.getFocus());
8888d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                }
8988d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                break;
9088d80f4471c900628e2cb6eef23029b99af48e09Chris Wren
9188d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            case KeyEvent.KEYCODE_DPAD_UP:
9288d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            case KeyEvent.KEYCODE_K:
9388d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                mTable.moveFocus(focus, 0f);
9488d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                break;
9588d80f4471c900628e2cb6eef23029b99af48e09Chris Wren
9688d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            case KeyEvent.KEYCODE_DPAD_RIGHT:
9788d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            case KeyEvent.KEYCODE_L:
9888d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                mTable.moveFocus(focus, 90f);
9988d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                break;
10088d80f4471c900628e2cb6eef23029b99af48e09Chris Wren
10188d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            case KeyEvent.KEYCODE_DPAD_DOWN:
10288d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            case KeyEvent.KEYCODE_J:
10388d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                mTable.moveFocus(focus, 180f);
10488d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                break;
10588d80f4471c900628e2cb6eef23029b99af48e09Chris Wren
10688d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            case KeyEvent.KEYCODE_DPAD_LEFT:
10788d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            case KeyEvent.KEYCODE_H:
10888d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                mTable.moveFocus(focus, 270f);
10988d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                break;
11088d80f4471c900628e2cb6eef23029b99af48e09Chris Wren
11188d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            default:
11288d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                if (DEBUG) Log.d(TAG, "dropped unexpected: " + keyCode);
11388d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                consumed = false;
11484c3d5580e7168d1d150c1dd24340b19eb501cd2Chris Wren                // give the user some more time to figure it out
11584c3d5580e7168d1d150c1dd24340b19eb501cd2Chris Wren                mTable.refreshFocus();
11688d80f4471c900628e2cb6eef23029b99af48e09Chris Wren                break;
11788d80f4471c900628e2cb6eef23029b99af48e09Chris Wren            }
11888d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        }
11988d80f4471c900628e2cb6eef23029b99af48e09Chris Wren
12088d80f4471c900628e2cb6eef23029b99af48e09Chris Wren        return consumed;
12188d80f4471c900628e2cb6eef23029b99af48e09Chris Wren    }
12288d80f4471c900628e2cb6eef23029b99af48e09Chris Wren}
123