Make UserLogRingCharBuffer an external class

Change-Id: I9d506995337d64ec11c72939a8d739423ee46efa
main
Ken Wakasa 2013-06-25 17:45:26 +09:00
parent 12ef7d3702
commit 9419e02fd9
4 changed files with 140 additions and 125 deletions

View File

@ -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

View File

@ -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;
} }

View File

@ -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;
}
}

View File

@ -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();
} }