Home | History | Annotate | Download | only in phototable
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package com.android.dreams.phototable;
     17 
     18 import android.util.Log;
     19 import android.view.KeyEvent;
     20 import android.view.View;
     21 
     22 /**
     23  * Keyboard event dispatcher for Photo Table.
     24  */
     25 public class KeyboardInterpreter {
     26     private static final String TAG = "DPadInterpreter";
     27     private static final boolean DEBUG = false;
     28 
     29     private final PhotoTable mTable;
     30     private final long mBounce;
     31     private long mLastDeckNavigation;
     32 
     33     public KeyboardInterpreter(PhotoTable table) {
     34         mBounce = 2000; // TODO: remove this once latencies in lower layers are removed.
     35         mTable = table;
     36     }
     37     public boolean onKeyDown(int keyCode, KeyEvent event) {
     38         final View focus = mTable.getFocus();
     39         boolean consumed = true;
     40         if (mTable.hasSelection()) {
     41             switch (keyCode) {
     42             case KeyEvent.KEYCODE_ENTER:
     43             case KeyEvent.KEYCODE_DPAD_CENTER:
     44             case KeyEvent.KEYCODE_ESCAPE:
     45                 mTable.setFocus(mTable.getSelection());
     46                 mTable.clearSelection();
     47                 break;
     48 
     49             case KeyEvent.KEYCODE_DPAD_RIGHT:
     50             case KeyEvent.KEYCODE_L:
     51                 if ((System.currentTimeMillis() - mLastDeckNavigation) > mBounce) {
     52                     mLastDeckNavigation = System.currentTimeMillis();
     53                     mTable.selectPrevious();
     54                 }
     55                 break;
     56 
     57             case KeyEvent.KEYCODE_DPAD_LEFT:
     58             case KeyEvent.KEYCODE_H:
     59                 if ((System.currentTimeMillis() - mLastDeckNavigation) > mBounce) {
     60                     mLastDeckNavigation = System.currentTimeMillis();
     61                     mTable.selectNext();
     62                 }
     63                 break;
     64 
     65             default:
     66                 if (DEBUG) Log.d(TAG, "dropped unexpected: " + keyCode);
     67                 consumed = false;
     68                 // give the user some more time to figure it out
     69                 mTable.refreshSelection();
     70                 break;
     71             }
     72         } else {
     73             switch (keyCode) {
     74             case KeyEvent.KEYCODE_ENTER:
     75             case KeyEvent.KEYCODE_DPAD_CENTER:
     76                 if (mTable.hasFocus()) {
     77                     mTable.setSelection(mTable.getFocus());
     78                     mTable.clearFocus();
     79                 } else {
     80                     mTable.setDefaultFocus();
     81                 }
     82                 break;
     83 
     84             case KeyEvent.KEYCODE_DEL:
     85             case KeyEvent.KEYCODE_X:
     86                 if (mTable.hasFocus()) {
     87                     mTable.fling(mTable.getFocus());
     88                 }
     89                 break;
     90 
     91             case KeyEvent.KEYCODE_DPAD_UP:
     92             case KeyEvent.KEYCODE_K:
     93                 mTable.moveFocus(focus, 0f);
     94                 break;
     95 
     96             case KeyEvent.KEYCODE_DPAD_RIGHT:
     97             case KeyEvent.KEYCODE_L:
     98                 mTable.moveFocus(focus, 90f);
     99                 break;
    100 
    101             case KeyEvent.KEYCODE_DPAD_DOWN:
    102             case KeyEvent.KEYCODE_J:
    103                 mTable.moveFocus(focus, 180f);
    104                 break;
    105 
    106             case KeyEvent.KEYCODE_DPAD_LEFT:
    107             case KeyEvent.KEYCODE_H:
    108                 mTable.moveFocus(focus, 270f);
    109                 break;
    110 
    111             default:
    112                 if (DEBUG) Log.d(TAG, "dropped unexpected: " + keyCode);
    113                 consumed = false;
    114                 // give the user some more time to figure it out
    115                 mTable.refreshFocus();
    116                 break;
    117             }
    118         }
    119 
    120         return consumed;
    121     }
    122 }
    123