Track handled events to consistently return handled status (C1)

Bug: 5037589
Change-Id: I92d5be669420f0b2fdeb8fcf85aefd3961bf84b4
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 4f8852b..9529530 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -82,6 +82,7 @@
 import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.Locale;
+import java.util.TreeSet;
 
 /**
  * Input method implementation for Qwerty'ish keyboard.
@@ -167,6 +168,7 @@
     private int mDeleteCount;
     private long mLastKeyTime;
     private int mActionId;
+    private TreeSet<Long> mCurrentlyPressedHardwareKeys = CollectionUtils.newTreeSet();
 
     // Member variables for remembering the current device orientation.
     private int mDisplayOrientation;
@@ -721,6 +723,7 @@
         resetComposingState(true /* alsoResetLastComposedWord */);
         mDeleteCount = 0;
         mSpaceState = SPACE_STATE_NONE;
+        mCurrentlyPressedHardwareKeys.clear();
 
         if (mSuggestionStripView != null) {
             // This will set the punctuation suggestions if next word suggestion is off;
@@ -2420,12 +2423,20 @@
         // onHardwareKeyEvent, like onKeyDown returns true if it handled the event, false if
         // it doesn't know what to do with it and leave it to the application. For example,
         // hardware key events for adjusting the screen's brightness are passed as is.
-        if (mEventInterpreter.onHardwareKeyEvent(event)) return true;
+        if (mEventInterpreter.onHardwareKeyEvent(event)) {
+            final long keyIdentifier = event.getDeviceId() << 32 + event.getKeyCode();
+            mCurrentlyPressedHardwareKeys.add(keyIdentifier);
+            return true;
+        }
         return super.onKeyDown(keyCode, event);
     }
 
     @Override
     public boolean onKeyUp(final int keyCode, final KeyEvent event) {
+        final long keyIdentifier = event.getDeviceId() << 32 + event.getKeyCode();
+        if (mCurrentlyPressedHardwareKeys.remove(keyIdentifier)) {
+            return true;
+        }
         return super.onKeyUp(keyCode, event);
     }