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