| Index: remoting/android/java/src/org/chromium/chromoting/Desktop.java
 | 
| diff --git a/remoting/android/java/src/org/chromium/chromoting/Desktop.java b/remoting/android/java/src/org/chromium/chromoting/Desktop.java
 | 
| index 7c8bb1141e858c8e2420deea72990f18d49c3879..1377b333875d04d4d66c793e4d0f90de8fbf8983 100644
 | 
| --- a/remoting/android/java/src/org/chromium/chromoting/Desktop.java
 | 
| +++ b/remoting/android/java/src/org/chromium/chromoting/Desktop.java
 | 
| @@ -67,14 +67,41 @@ public class Desktop extends Activity {
 | 
|          }
 | 
|      }
 | 
|  
 | 
| -    /** Called when a hardware key is pressed, and usually when a software key is pressed. */
 | 
| +    /**
 | 
| +     * Called once when a keyboard key is pressed, then again when that same key is released. This
 | 
| +     * is not guaranteed to be notified of all soft keyboard events: certian keyboards might not
 | 
| +     * call it at all, while others might skip it in certain situations (e.g. swipe input).
 | 
| +     */
 | 
|      @Override
 | 
|      public boolean dispatchKeyEvent(KeyEvent event) {
 | 
| -        JniInterface.keyboardAction(event.getKeyCode(), event.getAction() == KeyEvent.ACTION_DOWN);
 | 
| +        boolean depressed = event.getAction() == KeyEvent.ACTION_DOWN;
 | 
|  
 | 
| -        if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
 | 
| -            // We stop this event from propagating further to prevent the keyboard from closing.
 | 
| -            return true;
 | 
| +        switch (event.getKeyCode()) {
 | 
| +            case KeyEvent.KEYCODE_AT:
 | 
| +                JniInterface.keyboardAction(KeyEvent.KEYCODE_SHIFT_LEFT, depressed);
 | 
| +                JniInterface.keyboardAction(KeyEvent.KEYCODE_2, depressed);
 | 
| +                break;
 | 
| +            case KeyEvent.KEYCODE_POUND:
 | 
| +                JniInterface.keyboardAction(KeyEvent.KEYCODE_SHIFT_LEFT, depressed);
 | 
| +                JniInterface.keyboardAction(KeyEvent.KEYCODE_3, depressed);
 | 
| +                break;
 | 
| +            case KeyEvent.KEYCODE_STAR:
 | 
| +                JniInterface.keyboardAction(KeyEvent.KEYCODE_SHIFT_LEFT, depressed);
 | 
| +                JniInterface.keyboardAction(KeyEvent.KEYCODE_8, depressed);
 | 
| +                break;
 | 
| +            case KeyEvent.KEYCODE_PLUS:
 | 
| +                JniInterface.keyboardAction(KeyEvent.KEYCODE_SHIFT_LEFT, depressed);
 | 
| +                JniInterface.keyboardAction(KeyEvent.KEYCODE_EQUALS, depressed);
 | 
| +                break;
 | 
| +            default:
 | 
| +                // We try to send all other key codes to the host directly.
 | 
| +                JniInterface.keyboardAction(event.getKeyCode(), depressed);
 | 
| +
 | 
| +                if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER ||
 | 
| +                        event.getKeyCode() == KeyEvent.KEYCODE_NUMPAD_ENTER) {
 | 
| +                    // We stop this key from propagating to prevent the keyboard from closing.
 | 
| +                    return true;
 | 
| +                }
 | 
|          }
 | 
|  
 | 
|          return super.dispatchKeyEvent(event);
 | 
| 
 |