diff --git a/java/src/com/android/inputmethod/latin/KeyDetector.java b/java/src/com/android/inputmethod/latin/KeyDetector.java
new file mode 100644
index 0000000..11d5f86
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/KeyDetector.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.latin;
+
+import android.inputmethodservice.Keyboard;
+import android.inputmethodservice.Keyboard.Key;
+
+import java.util.List;
+
+abstract class KeyDetector {
+    protected Keyboard mKeyboard;
+    protected Key[] mKeys;
+
+    protected boolean mProximityCorrectOn;
+    protected int mProximityThresholdSquare;
+
+    public Key[] setKeyboard(Keyboard keyboard) {
+        if (keyboard == null)
+            throw new NullPointerException();
+        mKeyboard = keyboard;
+        List<Key> keys = mKeyboard.getKeys();
+        Key[] array = keys.toArray(new Key[keys.size()]);
+        mKeys = array;
+        return array;
+    }
+
+    public void setProximityCorrectionEnabled(boolean enabled) {
+        mProximityCorrectOn = enabled;
+    }
+
+    public boolean isProximityCorrectionEnabled() {
+        return mProximityCorrectOn;
+    }
+
+    public void setProximityThreshold(int threshold) {
+        mProximityThresholdSquare = threshold * threshold;
+    }
+
+    abstract public int[] newCodeArray();
+
+    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/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
index d1a5cd8..9ebab25 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
+++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
@@ -45,7 +45,6 @@
 
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -202,7 +201,7 @@
     private final ArrayList<PointerTracker> mPointerTrackers = new ArrayList<PointerTracker>();
     private final float mDebounceHysteresis;
 
-    private final ProximityKeyDetector mProximityKeyDetector = new ProximityKeyDetector();
+    protected KeyDetector mKeyDetector = new ProximityKeyDetector();
 
     // Swipe gesture detector
     private final GestureDetector mGestureDetector;
@@ -473,8 +472,7 @@
     public void setOnKeyboardActionListener(OnKeyboardActionListener listener) {
         mKeyboardActionListener = listener;
         for (PointerTracker tracker : mPointerTrackers) {
-            if (tracker != null)
-                tracker.setOnKeyboardActionListener(listener);
+            tracker.setOnKeyboardActionListener(listener);
         }
     }
 
@@ -501,13 +499,10 @@
         mHandler.cancelKeyTimers();
         mHandler.cancelPopupPreview();
         mKeyboard = keyboard;
-        LatinImeLogger.onSetKeyboard(mKeyboard);
-        List<Key> keys = mKeyboard.getKeys();
-        mKeys = keys.toArray(new Key[keys.size()]);
-        mProximityKeyDetector.setKeyboard(keyboard, mKeys);
+        LatinImeLogger.onSetKeyboard(keyboard);
+        mKeys = mKeyDetector.setKeyboard(keyboard);
         for (PointerTracker tracker : mPointerTrackers) {
-            if (tracker != null)
-                tracker.setKeyboard(mKeys, mDebounceHysteresis);
+            tracker.setKeyboard(mKeys, mDebounceHysteresis);
         }
         requestLayout();
         // Hint to reallocate the buffer if the size changed
@@ -599,14 +594,14 @@
      * @param enabled whether or not the proximity correction is enabled
      */
     public void setProximityCorrectionEnabled(boolean enabled) {
-        mProximityKeyDetector.setProximityCorrectionEnabled(enabled);
+        mKeyDetector.setProximityCorrectionEnabled(enabled);
     }
 
     /**
      * Returns true if proximity correction is enabled.
      */
     public boolean isProximityCorrectionEnabled() {
-        return mProximityKeyDetector.isProximityCorrectionEnabled();
+        return mKeyDetector.isProximityCorrectionEnabled();
     }
 
     /**
@@ -658,7 +653,7 @@
             dimensionSum += Math.min(key.width, key.height) + key.gap;
         }
         if (dimensionSum < 0 || length == 0) return;
-        mProximityKeyDetector.setProximityThreshold((int) (dimensionSum * 1.4f / length));
+        mKeyDetector.setProximityThreshold((int) (dimensionSum * 1.4f / length));
     }
 
     @Override
@@ -1052,7 +1047,7 @@
         // Create pointer trackers until we can get 'id+1'-th tracker, if needed.
         for (int i = pointers.size(); i <= id; i++) {
             final PointerTracker tracker =
-                new PointerTracker(mHandler, mProximityKeyDetector, this);
+                new PointerTracker(mHandler, mKeyDetector, this);
             if (keys != null)
                 tracker.setKeyboard(keys, mDebounceHysteresis);
             if (listener != null)
diff --git a/java/src/com/android/inputmethod/latin/PointerTracker.java b/java/src/com/android/inputmethod/latin/PointerTracker.java
index 3c67ebe..8c85e97 100644
--- a/java/src/com/android/inputmethod/latin/PointerTracker.java
+++ b/java/src/com/android/inputmethod/latin/PointerTracker.java
@@ -45,7 +45,7 @@
 
     private final UIProxy mProxy;
     private final UIHandler mHandler;
-    private final ProximityKeyDetector mKeyDetector;
+    private final KeyDetector mKeyDetector;
     private OnKeyboardActionListener mListener;
 
     private Key[] mKeys;
@@ -77,7 +77,7 @@
     // pressed key
     private int mPreviousKey = NOT_A_KEY;
 
-    public PointerTracker(UIHandler handler, ProximityKeyDetector keyDetector, UIProxy proxy) {
+    public PointerTracker(UIHandler handler, KeyDetector keyDetector, UIProxy proxy) {
         if (proxy == null || handler == null || keyDetector == null)
             throw new NullPointerException();
         mProxy = proxy;
diff --git a/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java b/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java
index eae2d7f..6ee0055 100644
--- a/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java
+++ b/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java
@@ -16,48 +16,24 @@
 
 package com.android.inputmethod.latin;
 
-import android.inputmethodservice.Keyboard;
 import android.inputmethodservice.Keyboard.Key;
 
 import java.util.Arrays;
 
-class ProximityKeyDetector {
+class ProximityKeyDetector extends KeyDetector {
     private static final int MAX_NEARBY_KEYS = 12;
 
-    private Keyboard mKeyboard;
-    private Key[] mKeys;
-
-    private boolean mProximityCorrectOn;
-    private int mProximityThresholdSquare;
-
     // working area
     private int[] mDistances = new int[MAX_NEARBY_KEYS];
 
-    public void setKeyboard(Keyboard keyboard, Key[] keys) {
-        if (keyboard == null || keys == null)
-            throw new NullPointerException();
-        mKeyboard = keyboard;
-        mKeys = keys;
-    }
-
-    public void setProximityCorrectionEnabled(boolean enabled) {
-        mProximityCorrectOn = enabled;
-    }
-
-    public boolean isProximityCorrectionEnabled() {
-        return mProximityCorrectOn;
-    }
-
-    public void setProximityThreshold(int threshold) {
-        mProximityThresholdSquare = threshold * threshold;
-    }
-
+    @Override
     public int[] newCodeArray() {
         int[] codes = new int[MAX_NEARBY_KEYS];
         Arrays.fill(codes, LatinKeyboardBaseView.NOT_A_KEY);
         return codes;
     }
 
+    @Override
     public int getKeyIndexAndNearbyCodes(int x, int y, int[] allKeys) {
         final Key[] keys = mKeys;
         if (keys == null)
