blob: a2c6c4524311b4e3190b68e0b53ee38f8c74d6b1 (
about) (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
/*
* Copyright (C) 2013 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.
*/
package com.android.inputmethod.latin.utils;
import android.inputmethodservice.InputMethodService;
import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.latin.Settings;
public final class UserLogRingCharBuffer {
public /* for test */ static final int BUFSIZE = 20;
public /* for test */ int mLength = 0;
private static UserLogRingCharBuffer sUserLogRingCharBuffer = new UserLogRingCharBuffer();
private static final char PLACEHOLDER_DELIMITER_CHAR = '\uFFFC';
private static final int INVALID_COORDINATE = -2;
private boolean mEnabled = false;
private int mEnd = 0;
private char[] mCharBuf = new char[BUFSIZE];
private int[] mXBuf = new int[BUFSIZE];
private int[] mYBuf = new int[BUFSIZE];
private UserLogRingCharBuffer() {
// Intentional empty constructor for singleton.
}
@UsedForTesting
public static UserLogRingCharBuffer getInstance() {
return sUserLogRingCharBuffer;
}
public static UserLogRingCharBuffer init(final InputMethodService context,
final boolean enabled, final boolean usabilityStudy) {
if (!(enabled || usabilityStudy)) {
return null;
}
sUserLogRingCharBuffer.mEnabled = true;
UsabilityStudyLogUtils.getInstance().init(context);
return sUserLogRingCharBuffer;
}
private static int normalize(final int in) {
int ret = in % BUFSIZE;
return ret < 0 ? ret + BUFSIZE : ret;
}
// TODO: accept code points
@UsedForTesting
public void push(final char c, final int x, final int y) {
if (!mEnabled) {
return;
}
mCharBuf[mEnd] = c;
mXBuf[mEnd] = x;
mYBuf[mEnd] = y;
mEnd = normalize(mEnd + 1);
if (mLength < BUFSIZE) {
++mLength;
}
}
public char pop() {
if (mLength < 1) {
return PLACEHOLDER_DELIMITER_CHAR;
}
mEnd = normalize(mEnd - 1);
--mLength;
return mCharBuf[mEnd];
}
public char getBackwardNthChar(final int n) {
if (mLength <= n || n < 0) {
return PLACEHOLDER_DELIMITER_CHAR;
}
return mCharBuf[normalize(mEnd - n - 1)];
}
public int getPreviousX(final char c, final int back) {
final int index = normalize(mEnd - 2 - back);
if (mLength <= back
|| Character.toLowerCase(c) != Character.toLowerCase(mCharBuf[index])) {
return INVALID_COORDINATE;
}
return mXBuf[index];
}
public int getPreviousY(final char c, final int back) {
int index = normalize(mEnd - 2 - back);
if (mLength <= back
|| Character.toLowerCase(c) != Character.toLowerCase(mCharBuf[index])) {
return INVALID_COORDINATE;
}
return mYBuf[index];
}
public String getLastWord(final int ignoreCharCount) {
final StringBuilder sb = new StringBuilder();
int i = ignoreCharCount;
for (; i < mLength; ++i) {
final char c = mCharBuf[normalize(mEnd - 1 - i)];
if (!Settings.getInstance().isWordSeparator(c)) {
break;
}
}
for (; i < mLength; ++i) {
char c = mCharBuf[normalize(mEnd - 1 - i)];
if (!Settings.getInstance().isWordSeparator(c)) {
sb.append(c);
} else {
break;
}
}
return sb.reverse().toString();
}
public void reset() {
mLength = 0;
}
}
|