Make UserLogRingCharBuffer an external class
Change-Id: I9d506995337d64ec11c72939a8d739423ee46efamain
parent
12ef7d3702
commit
9419e02fd9
|
@ -2652,11 +2652,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Used by the RingCharBuffer
|
|
||||||
public boolean isWordSeparator(final int code) {
|
|
||||||
return mSettings.getCurrent().isWordSeparator(code);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Make this private
|
// TODO: Make this private
|
||||||
// Outside LatinIME, only used by the {@link InputTestsBase} test suite.
|
// Outside LatinIME, only used by the {@link InputTestsBase} test suite.
|
||||||
@UsedForTesting
|
@UsedForTesting
|
||||||
|
|
|
@ -152,6 +152,10 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang
|
||||||
return mSettingsValues.mWordSeparators;
|
return mSettingsValues.mWordSeparators;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isWordSeparator(final int code) {
|
||||||
|
return mSettingsValues.isWordSeparator(code);
|
||||||
|
}
|
||||||
|
|
||||||
public Locale getCurrentLocale() {
|
public Locale getCurrentLocale() {
|
||||||
return mCurrentLocale;
|
return mCurrentLocale;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,134 @@
|
||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
import com.android.inputmethod.latin.utils.Utils.UsabilityStudyLogUtils;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -26,7 +26,6 @@ import android.content.pm.PackageManager;
|
||||||
import android.content.pm.PackageManager.NameNotFoundException;
|
import android.content.pm.PackageManager.NameNotFoundException;
|
||||||
import android.inputmethodservice.InputMethodService;
|
import android.inputmethodservice.InputMethodService;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.AsyncTask;
|
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.HandlerThread;
|
import android.os.HandlerThread;
|
||||||
|
@ -34,9 +33,7 @@ import android.os.Process;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.android.inputmethod.annotations.UsedForTesting;
|
|
||||||
import com.android.inputmethod.latin.Constants;
|
import com.android.inputmethod.latin.Constants;
|
||||||
import com.android.inputmethod.latin.LatinIME;
|
|
||||||
import com.android.inputmethod.latin.LatinImeLogger;
|
import com.android.inputmethod.latin.LatinImeLogger;
|
||||||
import com.android.inputmethod.latin.SuggestedWords;
|
import com.android.inputmethod.latin.SuggestedWords;
|
||||||
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
|
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
|
||||||
|
@ -63,121 +60,6 @@ public final class Utils {
|
||||||
// This utility class is not publicly instantiable.
|
// This utility class is not publicly instantiable.
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Make this an external class
|
|
||||||
public /* for test */ static final class RingCharBuffer {
|
|
||||||
public /* for test */ static final int BUFSIZE = 20;
|
|
||||||
public /* for test */ int mLength = 0;
|
|
||||||
|
|
||||||
private static RingCharBuffer sRingCharBuffer = new RingCharBuffer();
|
|
||||||
private static final char PLACEHOLDER_DELIMITER_CHAR = '\uFFFC';
|
|
||||||
private static final int INVALID_COORDINATE = -2;
|
|
||||||
private InputMethodService mContext;
|
|
||||||
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 RingCharBuffer() {
|
|
||||||
// Intentional empty constructor for singleton.
|
|
||||||
}
|
|
||||||
|
|
||||||
@UsedForTesting
|
|
||||||
public static RingCharBuffer getInstance() {
|
|
||||||
return sRingCharBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static RingCharBuffer init(final InputMethodService context, final boolean enabled,
|
|
||||||
final boolean usabilityStudy) {
|
|
||||||
if (!(enabled || usabilityStudy)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
sRingCharBuffer.mContext = context;
|
|
||||||
sRingCharBuffer.mEnabled = true;
|
|
||||||
UsabilityStudyLogUtils.getInstance().init(context);
|
|
||||||
return sRingCharBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
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();
|
|
||||||
final LatinIME latinIme = (LatinIME)mContext;
|
|
||||||
int i = ignoreCharCount;
|
|
||||||
for (; i < mLength; ++i) {
|
|
||||||
final char c = mCharBuf[normalize(mEnd - 1 - i)];
|
|
||||||
if (!latinIme.isWordSeparator(c)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (; i < mLength; ++i) {
|
|
||||||
char c = mCharBuf[normalize(mEnd - 1 - i)];
|
|
||||||
if (!latinIme.isWordSeparator(c)) {
|
|
||||||
sb.append(c);
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sb.reverse().toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void reset() {
|
|
||||||
mLength = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Make this an external class
|
// TODO: Make this an external class
|
||||||
public static final class UsabilityStudyLogUtils {
|
public static final class UsabilityStudyLogUtils {
|
||||||
// TODO: remove code duplication with ResearchLog class
|
// TODO: remove code duplication with ResearchLog class
|
||||||
|
@ -395,7 +277,7 @@ public final class Utils {
|
||||||
// TODO: Make this an external class
|
// TODO: Make this an external class
|
||||||
public static final class Stats {
|
public static final class Stats {
|
||||||
public static void onNonSeparator(final char code, final int x, final int y) {
|
public static void onNonSeparator(final char code, final int x, final int y) {
|
||||||
RingCharBuffer.getInstance().push(code, x, y);
|
UserLogRingCharBuffer.getInstance().push(code, x, y);
|
||||||
LatinImeLogger.logOnInputChar();
|
LatinImeLogger.logOnInputChar();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -410,7 +292,7 @@ public final class Utils {
|
||||||
for (int i = 0; i < length; i = Character.offsetByCodePoints(separator, i, 1)) {
|
for (int i = 0; i < length; i = Character.offsetByCodePoints(separator, i, 1)) {
|
||||||
int codePoint = Character.codePointAt(separator, i);
|
int codePoint = Character.codePointAt(separator, i);
|
||||||
// TODO: accept code points
|
// TODO: accept code points
|
||||||
RingCharBuffer.getInstance().push((char)codePoint, x, y);
|
UserLogRingCharBuffer.getInstance().push((char)codePoint, x, y);
|
||||||
}
|
}
|
||||||
LatinImeLogger.logOnInputSeparator();
|
LatinImeLogger.logOnInputSeparator();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue