From 5e02930a7f40b704f357f127d3d38fbdc193ffa1 Mon Sep 17 00:00:00 2001
From: "Tadashi G. Takaoka" <takaoka@google.com>
Date: Fri, 8 Oct 2010 12:51:15 +0900
Subject: [PATCH] Reduce delay before mini popup keyboard is shown

Before this change, the delay was 500 ms that came from
ViewConfiguration.getLongPressTimeout().  This change reduces the
delay to 400 ms.

Bug: 3074984
Change-Id: Ia5af5e877a3c4bb29211ef4040c728ac09a9fe85
---
 java/res/layout/input_trans.xml               | 32 -------------------
 java/res/values/config.xml                    |  4 +++
 .../latin/LatinKeyboardBaseView.java          |  7 ++--
 .../inputmethod/latin/PointerTracker.java     | 27 +++++++++-------
 4 files changed, 23 insertions(+), 47 deletions(-)
 delete mode 100644 java/res/layout/input_trans.xml

diff --git a/java/res/layout/input_trans.xml b/java/res/layout/input_trans.xml
deleted file mode 100644
index 4c0979c04..000000000
--- a/java/res/layout/input_trans.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* 
-**
-** Copyright 2010, The Android Open Source Project
-**
-** 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.
-*/
--->
-
-<com.android.inputmethod.latin.LatinKeyboardView
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-        android:id="@android:id/keyboardView"
-        android:layout_alignParentBottom="true"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="@color/latinkeyboard_extension_background"
-        android:verticalCorrection="0dip"
-
-        latin:keyBackground="@drawable/btn_keyboard_key_fulltrans"
-        />
diff --git a/java/res/values/config.xml b/java/res/values/config.xml
index 6e941baaf..b11236a23 100644
--- a/java/res/values/config.xml
+++ b/java/res/values/config.xml
@@ -25,4 +25,8 @@
     <integer name="config_preview_fadeout_anim_time">90</integer>
     <integer name="config_mini_keyboard_fadein_anim_time">0</integer>
     <integer name="config_mini_keyboard_fadeout_anim_time">100</integer>
+    <integer name="config_delay_before_key_repeat_start">400</integer>
+    <integer name="config_key_repeat_interval">50</integer>
+    <integer name="config_long_press_key_timeout">400</integer>
+    <integer name="config_multi_tap_key_timeout">800</integer>
 </resources>
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
index 75ef691c8..bcd1bb056 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
+++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
@@ -154,7 +154,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
     }
 
     // Timing constants
-    private static final int REPEAT_INTERVAL = PointerTracker.REPEAT_INTERVAL;
+    private final int mKeyRepeatInterval;
 
     // Miscellaneous constants
     /* package */ static final int NOT_A_KEY = -1;
@@ -261,7 +261,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
                 case MSG_REPEAT_KEY: {
                     final PointerTracker tracker = (PointerTracker)msg.obj;
                     tracker.repeatKey(msg.arg1);
-                    startKeyRepeatTimer(REPEAT_INTERVAL, msg.arg1, tracker);
+                    startKeyRepeatTimer(mKeyRepeatInterval, msg.arg1, tracker);
                     break;
                 }
                 case MSG_LONGPRESS_KEY: {
@@ -542,6 +542,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
 
         mHasDistinctMultitouch = context.getPackageManager()
                 .hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT);
+        mKeyRepeatInterval = res.getInteger(R.integer.config_key_repeat_interval);
     }
 
     public void setOnKeyboardActionListener(OnKeyboardActionListener listener) {
@@ -1218,7 +1219,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
         // 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(i, mHandler, mKeyDetector, this, mHasDistinctMultitouch);
+                new PointerTracker(i, mHandler, mKeyDetector, this, getResources());
             if (keys != null)
                 tracker.setKeyboard(keys, mKeyHysteresisDistance);
             if (listener != null)
diff --git a/java/src/com/android/inputmethod/latin/PointerTracker.java b/java/src/com/android/inputmethod/latin/PointerTracker.java
index b416a984c..448e27910 100644
--- a/java/src/com/android/inputmethod/latin/PointerTracker.java
+++ b/java/src/com/android/inputmethod/latin/PointerTracker.java
@@ -19,11 +19,11 @@ package com.android.inputmethod.latin;
 import com.android.inputmethod.latin.LatinKeyboardBaseView.OnKeyboardActionListener;
 import com.android.inputmethod.latin.LatinKeyboardBaseView.UIHandler;
 
+import android.content.res.Resources;
 import android.inputmethodservice.Keyboard;
 import android.inputmethodservice.Keyboard.Key;
 import android.util.Log;
 import android.view.MotionEvent;
-import android.view.ViewConfiguration;
 
 public class PointerTracker {
     private static final String TAG = "PointerTracker";
@@ -33,15 +33,15 @@ public class PointerTracker {
     public interface UIProxy {
         public void invalidateKey(Key key);
         public void showPreview(int keyIndex, PointerTracker tracker);
+        public boolean hasDistinctMultitouch();
     }
 
     public final int mPointerId;
 
     // Timing constants
-    private static final int REPEAT_START_DELAY = 400;
-    /* package */  static final int REPEAT_INTERVAL = 50; // ~20 keys per second
-    private static final int LONGPRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout();
-    private static final int MULTITAP_INTERVAL = 800; // milliseconds
+    private final int mDelayBeforeKeyRepeatStart;
+    private final int mLongPressKeyTimeout;
+    private final int mMultiTapKeyTimeout;
 
     // Miscellaneous constants
     private static final int NOT_A_KEY = LatinKeyboardBaseView.NOT_A_KEY;
@@ -164,7 +164,7 @@ public class PointerTracker {
     }
 
     public PointerTracker(int id, UIHandler handler, KeyDetector keyDetector, UIProxy proxy,
-            boolean hasDistinctMultitouch) {
+            Resources res) {
         if (proxy == null || handler == null || keyDetector == null)
             throw new NullPointerException();
         mPointerId = id;
@@ -172,7 +172,10 @@ public class PointerTracker {
         mHandler = handler;
         mKeyDetector = keyDetector;
         mKeyState = new KeyState(keyDetector);
-        mHasDistinctMultitouch = hasDistinctMultitouch;
+        mHasDistinctMultitouch = proxy.hasDistinctMultitouch();
+        mDelayBeforeKeyRepeatStart = res.getInteger(R.integer.config_delay_before_key_repeat_start);
+        mLongPressKeyTimeout = res.getInteger(R.integer.config_long_press_key_timeout);
+        mMultiTapKeyTimeout = res.getInteger(R.integer.config_multi_tap_key_timeout);
         resetMultiTap();
     }
 
@@ -278,10 +281,10 @@ public class PointerTracker {
         if (isValidKeyIndex(keyIndex)) {
             if (mKeys[keyIndex].repeatable) {
                 repeatKey(keyIndex);
-                mHandler.startKeyRepeatTimer(REPEAT_START_DELAY, keyIndex, this);
+                mHandler.startKeyRepeatTimer(mDelayBeforeKeyRepeatStart, keyIndex, this);
                 mIsRepeatableKey = true;
             }
-            mHandler.startLongPressTimer(LONGPRESS_TIMEOUT, keyIndex, this);
+            mHandler.startLongPressTimer(mLongPressKeyTimeout, keyIndex, this);
         }
         showKeyPreviewAndUpdateKey(keyIndex);
     }
@@ -296,11 +299,11 @@ public class PointerTracker {
         if (isValidKeyIndex(keyIndex)) {
             if (keyState.getKeyIndex() == NOT_A_KEY) {
                 keyState.onMoveToNewKey(keyIndex, x, y);
-                mHandler.startLongPressTimer(LONGPRESS_TIMEOUT, keyIndex, this);
+                mHandler.startLongPressTimer(mLongPressKeyTimeout, keyIndex, this);
             } else if (!isMinorMoveBounce(x, y, keyIndex)) {
                 resetMultiTap();
                 keyState.onMoveToNewKey(keyIndex, x, y);
-                mHandler.startLongPressTimer(LONGPRESS_TIMEOUT, keyIndex, this);
+                mHandler.startLongPressTimer(mLongPressKeyTimeout, keyIndex, this);
             }
         } else {
             if (keyState.getKeyIndex() != NOT_A_KEY) {
@@ -489,7 +492,7 @@ public class PointerTracker {
             return;
 
         final boolean isMultiTap =
-                (eventTime < mLastTapTime + MULTITAP_INTERVAL && keyIndex == mLastSentIndex);
+                (eventTime < mLastTapTime + mMultiTapKeyTimeout && keyIndex == mLastSentIndex);
         if (key.codes.length > 1) {
             mInMultiTap = true;
             if (isMultiTap) {