diff --git a/java/src/com/android/inputmethod/latin/KeyDetector.java b/java/src/com/android/inputmethod/latin/KeyDetector.java
index 5583e3275..e443f272b 100644
--- a/java/src/com/android/inputmethod/latin/KeyDetector.java
+++ b/java/src/com/android/inputmethod/latin/KeyDetector.java
@@ -19,11 +19,12 @@ package com.android.inputmethod.latin;
 import android.inputmethodservice.Keyboard;
 import android.inputmethodservice.Keyboard.Key;
 
+import java.util.Arrays;
 import java.util.List;
 
 abstract class KeyDetector {
     protected Keyboard mKeyboard;
-    protected Key[] mKeys;
+    private Key[] mKeys;
 
     protected int mCorrectionX;
     protected int mCorrectionY;
@@ -50,6 +51,13 @@ abstract class KeyDetector {
         return y + mCorrectionY;
     }
 
+    protected Key[] getKeys() {
+        if (mKeys == null)
+            throw new IllegalStateException("keyboard isn't set");
+        // mKeyboard is guaranteed not null at setKeybaord() method
+        return mKeys;
+    }
+
     public void setProximityCorrectionEnabled(boolean enabled) {
         mProximityCorrectOn = enabled;
     }
@@ -62,7 +70,13 @@ abstract class KeyDetector {
         mProximityThresholdSquare = threshold * threshold;
     }
 
-    abstract public int[] newCodeArray();
+    public int[] newCodeArray() {
+        int[] codes = new int[getMaxNearbyKeys()];
+        Arrays.fill(codes, LatinKeyboardBaseView.NOT_A_KEY);
+        return codes;
+    }
+
+    abstract protected int getMaxNearbyKeys();
 
     abstract public int getKeyIndexAndNearbyCodes(int x, int y, int[] allKeys);
 }
\ No newline at end of file
diff --git a/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java b/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java
index 408e4e147..d17bedb56 100644
--- a/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java
+++ b/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java
@@ -27,20 +27,15 @@ class ProximityKeyDetector extends KeyDetector {
     private int[] mDistances = new int[MAX_NEARBY_KEYS];
 
     @Override
-    public int[] newCodeArray() {
-        int[] codes = new int[MAX_NEARBY_KEYS];
-        Arrays.fill(codes, LatinKeyboardBaseView.NOT_A_KEY);
-        return codes;
+    protected int getMaxNearbyKeys() {
+        return MAX_NEARBY_KEYS;
     }
 
     @Override
     public int getKeyIndexAndNearbyCodes(int x, int y, int[] allKeys) {
+        final Key[] keys = getKeys();
         final int touchX = getTouchX(x);
         final int touchY = getTouchY(y);
-        final Key[] keys = mKeys;
-        if (keys == null)
-            throw new IllegalStateException("keyboard isn't set");
-        // mKeyboard is guaranteed not null at setKeybaord() method
         int primaryIndex = LatinKeyboardBaseView.NOT_A_KEY;
         int closestKey = LatinKeyboardBaseView.NOT_A_KEY;
         int closestKeyDist = mProximityThresholdSquare + 1;