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