1c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka/* 2c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka * Copyright (C) 2013 The Android Open Source Project 3c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka * 4c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License"); 5c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka * you may not use this file except in compliance with the License. 6c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka * You may obtain a copy of the License at 7c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka * 8c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka * http://www.apache.org/licenses/LICENSE-2.0 9c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka * 10c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software 11c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS, 12c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka * See the License for the specific language governing permissions and 14c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka * limitations under the License. 15c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka */ 16c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka 17c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaokapackage com.android.inputmethod.keyboard.internal; 18c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka 19c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaokaimport android.content.res.TypedArray; 20c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka 21c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaokaimport com.android.inputmethod.latin.R; 22c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaokaimport com.android.inputmethod.latin.utils.ResourceUtils; 23c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka 24e2a6253cb581f9ab70cfb723d32b14f9ac7d2ab7Tadashi G. Takaoka/** 25e2a6253cb581f9ab70cfb723d32b14f9ac7d2ab7Tadashi G. Takaoka * This class holds parameters to control how a gesture stroke is sampled and recognized. 26e2a6253cb581f9ab70cfb723d32b14f9ac7d2ab7Tadashi G. Takaoka * This class also has parameters to distinguish gesture input events from fast typing events. 27e2a6253cb581f9ab70cfb723d32b14f9ac7d2ab7Tadashi G. Takaoka * 28e2a6253cb581f9ab70cfb723d32b14f9ac7d2ab7Tadashi G. Takaoka * @attr ref R.styleable#MainKeyboardView_gestureStaticTimeThresholdAfterFastTyping 29e2a6253cb581f9ab70cfb723d32b14f9ac7d2ab7Tadashi G. Takaoka * @attr ref R.styleable#MainKeyboardView_gestureDetectFastMoveSpeedThreshold 30e2a6253cb581f9ab70cfb723d32b14f9ac7d2ab7Tadashi G. Takaoka * @attr ref R.styleable#MainKeyboardView_gestureDynamicThresholdDecayDuration 31e2a6253cb581f9ab70cfb723d32b14f9ac7d2ab7Tadashi G. Takaoka * @attr ref R.styleable#MainKeyboardView_gestureDynamicTimeThresholdFrom 32e2a6253cb581f9ab70cfb723d32b14f9ac7d2ab7Tadashi G. Takaoka * @attr ref R.styleable#MainKeyboardView_gestureDynamicTimeThresholdTo 33e2a6253cb581f9ab70cfb723d32b14f9ac7d2ab7Tadashi G. Takaoka * @attr ref R.styleable#MainKeyboardView_gestureDynamicDistanceThresholdFrom 34e2a6253cb581f9ab70cfb723d32b14f9ac7d2ab7Tadashi G. Takaoka * @attr ref R.styleable#MainKeyboardView_gestureDynamicDistanceThresholdTo 35e2a6253cb581f9ab70cfb723d32b14f9ac7d2ab7Tadashi G. Takaoka * @attr ref R.styleable#MainKeyboardView_gestureSamplingMinimumDistance 36e2a6253cb581f9ab70cfb723d32b14f9ac7d2ab7Tadashi G. Takaoka * @attr ref R.styleable#MainKeyboardView_gestureRecognitionMinimumTime 37e2a6253cb581f9ab70cfb723d32b14f9ac7d2ab7Tadashi G. Takaoka * @attr ref R.styleable#MainKeyboardView_gestureRecognitionSpeedThreshold 38e2a6253cb581f9ab70cfb723d32b14f9ac7d2ab7Tadashi G. Takaoka */ 39e2a6253cb581f9ab70cfb723d32b14f9ac7d2ab7Tadashi G. Takaokapublic final class GestureStrokeRecognitionParams { 40c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka // Static threshold for gesture after fast typing 41c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka public final int mStaticTimeThresholdAfterFastTyping; // msec 42c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka // Static threshold for starting gesture detection 43c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka public final float mDetectFastMoveSpeedThreshold; // keyWidth/sec 44c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka // Dynamic threshold for gesture after fast typing 45c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka public final int mDynamicThresholdDecayDuration; // msec 46c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka // Time based threshold values 47c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka public final int mDynamicTimeThresholdFrom; // msec 48c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka public final int mDynamicTimeThresholdTo; // msec 49c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka // Distance based threshold values 50c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka public final float mDynamicDistanceThresholdFrom; // keyWidth 51c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka public final float mDynamicDistanceThresholdTo; // keyWidth 52c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka // Parameters for gesture sampling 53c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka public final float mSamplingMinimumDistance; // keyWidth 54c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka // Parameters for gesture recognition 55c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka public final int mRecognitionMinimumTime; // msec 56c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka public final float mRecognitionSpeedThreshold; // keyWidth/sec 57c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka 58e2a6253cb581f9ab70cfb723d32b14f9ac7d2ab7Tadashi G. Takaoka // Default GestureStrokeRecognitionPoints parameters. 59e2a6253cb581f9ab70cfb723d32b14f9ac7d2ab7Tadashi G. Takaoka public static final GestureStrokeRecognitionParams DEFAULT = 60e2a6253cb581f9ab70cfb723d32b14f9ac7d2ab7Tadashi G. Takaoka new GestureStrokeRecognitionParams(); 61c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka 62e2a6253cb581f9ab70cfb723d32b14f9ac7d2ab7Tadashi G. Takaoka private GestureStrokeRecognitionParams() { 63c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka // These parameter values are default and intended for testing. 64c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka mStaticTimeThresholdAfterFastTyping = 350; // msec 65c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka mDetectFastMoveSpeedThreshold = 1.5f; // keyWidth/sec 66c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka mDynamicThresholdDecayDuration = 450; // msec 67c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka mDynamicTimeThresholdFrom = 300; // msec 68c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka mDynamicTimeThresholdTo = 20; // msec 69c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka mDynamicDistanceThresholdFrom = 6.0f; // keyWidth 70c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka mDynamicDistanceThresholdTo = 0.35f; // keyWidth 71c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka // The following parameters' change will affect the result of regression test. 72c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka mSamplingMinimumDistance = 1.0f / 6.0f; // keyWidth 73c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka mRecognitionMinimumTime = 100; // msec 74c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka mRecognitionSpeedThreshold = 5.5f; // keyWidth/sec 75c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka } 76c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka 77e2a6253cb581f9ab70cfb723d32b14f9ac7d2ab7Tadashi G. Takaoka public GestureStrokeRecognitionParams(final TypedArray mainKeyboardViewAttr) { 78c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka mStaticTimeThresholdAfterFastTyping = mainKeyboardViewAttr.getInt( 79c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka R.styleable.MainKeyboardView_gestureStaticTimeThresholdAfterFastTyping, 80c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka DEFAULT.mStaticTimeThresholdAfterFastTyping); 81c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka mDetectFastMoveSpeedThreshold = ResourceUtils.getFraction(mainKeyboardViewAttr, 82c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka R.styleable.MainKeyboardView_gestureDetectFastMoveSpeedThreshold, 83c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka DEFAULT.mDetectFastMoveSpeedThreshold); 84c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka mDynamicThresholdDecayDuration = mainKeyboardViewAttr.getInt( 85c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka R.styleable.MainKeyboardView_gestureDynamicThresholdDecayDuration, 86c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka DEFAULT.mDynamicThresholdDecayDuration); 87c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka mDynamicTimeThresholdFrom = mainKeyboardViewAttr.getInt( 88c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka R.styleable.MainKeyboardView_gestureDynamicTimeThresholdFrom, 89c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka DEFAULT.mDynamicTimeThresholdFrom); 90c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka mDynamicTimeThresholdTo = mainKeyboardViewAttr.getInt( 91c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka R.styleable.MainKeyboardView_gestureDynamicTimeThresholdTo, 92c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka DEFAULT.mDynamicTimeThresholdTo); 93c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka mDynamicDistanceThresholdFrom = ResourceUtils.getFraction(mainKeyboardViewAttr, 94c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka R.styleable.MainKeyboardView_gestureDynamicDistanceThresholdFrom, 95c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka DEFAULT.mDynamicDistanceThresholdFrom); 96c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka mDynamicDistanceThresholdTo = ResourceUtils.getFraction(mainKeyboardViewAttr, 97c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka R.styleable.MainKeyboardView_gestureDynamicDistanceThresholdTo, 98c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka DEFAULT.mDynamicDistanceThresholdTo); 99c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka mSamplingMinimumDistance = ResourceUtils.getFraction(mainKeyboardViewAttr, 100c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka R.styleable.MainKeyboardView_gestureSamplingMinimumDistance, 101c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka DEFAULT.mSamplingMinimumDistance); 102c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka mRecognitionMinimumTime = mainKeyboardViewAttr.getInt( 103c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka R.styleable.MainKeyboardView_gestureRecognitionMinimumTime, 104c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka DEFAULT.mRecognitionMinimumTime); 105c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka mRecognitionSpeedThreshold = ResourceUtils.getFraction(mainKeyboardViewAttr, 106c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka R.styleable.MainKeyboardView_gestureRecognitionSpeedThreshold, 107c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka DEFAULT.mRecognitionSpeedThreshold); 108c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka } 109c845d4c664e13bc30be7a017e6651f70656ea3a0Tadashi G. Takaoka} 110