Loading java/proguard.flags +4 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,10 @@ <init>(...); } -keep class com.android.inputmethod.latin.ResearchLogger { void setLogFileManager(...); } # The support library contains references to newer platform versions. # Don't warn about those in case this app is linking against an older # platform version. We know about them, and they are safe. Loading java/src/com/android/inputmethod/latin/ResearchLogger.java +9 −7 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.inputmethodservice.InputMethodService; import android.os.Handler; import android.os.HandlerThread; import android.os.Process; import android.os.SystemClock; import android.text.TextUtils; import android.util.Log; import android.view.MotionEvent; Loading Loading @@ -48,7 +49,7 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang private static final ResearchLogger sInstance = new ResearchLogger(new LogFileManager()); public static boolean sIsLogging = false; private final Handler mLoggingHandler; /* package */ final Handler mLoggingHandler; private InputMethodService mIms; private final Date mDate; private final SimpleDateFormat mDateFormat; Loading Loading @@ -182,11 +183,13 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang } /** * Change to a different logFileManager. Will not allow it to be set to null. * Change to a different logFileManager. * * @throws IllegalArgumentException if logFileManager is null */ /* package */ void setLogFileManager(ResearchLogger.LogFileManager manager) { void setLogFileManager(LogFileManager manager) { if (manager == null) { Log.w(TAG, "warning: trying to set null logFileManager. ignoring."); throw new IllegalArgumentException("warning: trying to set null logFileManager"); } else { mLogFileManager = manager; } Loading Loading @@ -240,8 +243,6 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang sb.append('\t'); sb.append(x); sb.append('\t'); sb.append(y); write(LogGroup.KEY, sb.toString()); LatinImeLogger.onPrintAllUsabilityStudyLogs(); } public void logCorrection(String subgroup, String before, String after, int position) { Loading @@ -263,9 +264,10 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang public void run() { final long currentTime = System.currentTimeMillis(); mDate.setTime(currentTime); final long upTime = SystemClock.uptimeMillis(); final String printString = String.format("%s\t%d\t%s\t%s\n", mDateFormat.format(mDate), currentTime, logGroup.mLogString, log); mDateFormat.format(mDate), upTime, logGroup.mLogString, log); if (LatinImeLogger.sDBG) { Log.d(TAG, "Write: " + '[' + logGroup.mLogString + ']' + log); } Loading tests/src/com/android/inputmethod/latin/ResearchLoggerTests.java 0 → 100644 +156 −0 Original line number Diff line number Diff line /* * Copyright (C) 2012 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; import android.inputmethodservice.InputMethodService; import android.os.Handler; import android.util.Log; import android.view.MotionEvent; import com.android.inputmethod.latin.ResearchLogger.LogFileManager; import java.io.FileNotFoundException; public class ResearchLoggerTests extends InputTestsBase { private static final String TAG = ResearchLoggerTests.class.getSimpleName(); private static final int TEST_INT = 0x12345678; private static final long TEST_LONG = 0x1234567812345678L; private static ResearchLogger sLogger; private MockLogFileManager mMockLogFileManager; @Override protected void setUp() { super.setUp(); sLogger = ResearchLogger.getInstance(); mMockLogFileManager = new MockLogFileManager(); sLogger.setLogFileManager(mMockLogFileManager); ResearchLogger.sIsLogging = true; } public static class MockLogFileManager extends LogFileManager { private final StringBuilder mContents = new StringBuilder(); @Override public void init(InputMethodService ims) { } @Override public synchronized void createLogFile() { mContents.setLength(0); } @Override public synchronized void createLogFile(String dir, String filename) throws FileNotFoundException { mContents.setLength(0); } @Override public synchronized boolean append(String s) { mContents.append(s); return true; } @Override public synchronized void reset() { mContents.setLength(0); } @Override public synchronized void close() { mContents.setLength(0); } private String getAppendedString() { return mContents.toString(); } } private void waitOnResearchLogger() { // post another Runnable that notify()'s the test that it may proceed. // assumes that the MessageQueue is processed in-order Handler handler = sLogger.mLoggingHandler; handler.post(new Runnable() { @Override public void run() { synchronized (ResearchLoggerTests.this) { ResearchLoggerTests.this.notify(); } } }); synchronized (this) { try { wait(); } catch (InterruptedException e) { Log.i(TAG, "interrupted when waiting for handler to finish.", e); } } } /*********************** Tests *********************/ public void testLogStartsEmpty() { waitOnResearchLogger(); String result = mMockLogFileManager.getAppendedString(); assertEquals(result, ""); } public void testMotionEvent() { // verify that input values appear somewhere in output sLogger.logMotionEvent(MotionEvent.ACTION_CANCEL, TEST_LONG, TEST_INT, 1111, 3333, 5555, 7777); waitOnResearchLogger(); String output = mMockLogFileManager.getAppendedString(); assertTrue(output.matches("(?sui).*\\bcancel\\b.*")); assertFalse(output.matches("(?sui).*\\bdown\\b.*")); assertTrue(output.matches("(?s).*\\b" + TEST_LONG + "\\b.*")); assertTrue(output.matches("(?s).*\\b" + TEST_INT + "\\b.*")); assertTrue(output.matches("(?s).*\\b1111\\b.*")); assertTrue(output.matches("(?s).*\\b3333\\b.*")); assertTrue(output.matches("(?s).*\\b5555\\b.*")); assertTrue(output.matches("(?s).*\\b7777\\b.*")); } public void testKeyEvent() { type("abc"); waitOnResearchLogger(); String output = mMockLogFileManager.getAppendedString(); assertTrue(output.matches("(?s).*\\ba\\b.*")); assertTrue(output.matches("(?s).*\\bb\\b.*")); assertTrue(output.matches("(?s).*\\bc\\b.*")); } public void testCorrection() { sLogger.logCorrection("aaaa", "thos", "this", 1); waitOnResearchLogger(); String output = mMockLogFileManager.getAppendedString(); assertTrue(output.matches("(?sui).*\\baaaa\\b.*")); assertTrue(output.matches("(?sui).*\\bthos\\b.*")); assertTrue(output.matches("(?sui).*\\bthis\\b.*")); } public void testStateChange() { sLogger.logStateChange("aaaa", "bbbb"); waitOnResearchLogger(); String output = mMockLogFileManager.getAppendedString(); assertTrue(output.matches("(?sui).*\\baaaa\\b.*")); assertTrue(output.matches("(?sui).*\\bbbbb\\b.*")); } // TODO: add integration tests that start at point of event generation. } Loading
java/proguard.flags +4 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,10 @@ <init>(...); } -keep class com.android.inputmethod.latin.ResearchLogger { void setLogFileManager(...); } # The support library contains references to newer platform versions. # Don't warn about those in case this app is linking against an older # platform version. We know about them, and they are safe. Loading
java/src/com/android/inputmethod/latin/ResearchLogger.java +9 −7 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.inputmethodservice.InputMethodService; import android.os.Handler; import android.os.HandlerThread; import android.os.Process; import android.os.SystemClock; import android.text.TextUtils; import android.util.Log; import android.view.MotionEvent; Loading Loading @@ -48,7 +49,7 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang private static final ResearchLogger sInstance = new ResearchLogger(new LogFileManager()); public static boolean sIsLogging = false; private final Handler mLoggingHandler; /* package */ final Handler mLoggingHandler; private InputMethodService mIms; private final Date mDate; private final SimpleDateFormat mDateFormat; Loading Loading @@ -182,11 +183,13 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang } /** * Change to a different logFileManager. Will not allow it to be set to null. * Change to a different logFileManager. * * @throws IllegalArgumentException if logFileManager is null */ /* package */ void setLogFileManager(ResearchLogger.LogFileManager manager) { void setLogFileManager(LogFileManager manager) { if (manager == null) { Log.w(TAG, "warning: trying to set null logFileManager. ignoring."); throw new IllegalArgumentException("warning: trying to set null logFileManager"); } else { mLogFileManager = manager; } Loading Loading @@ -240,8 +243,6 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang sb.append('\t'); sb.append(x); sb.append('\t'); sb.append(y); write(LogGroup.KEY, sb.toString()); LatinImeLogger.onPrintAllUsabilityStudyLogs(); } public void logCorrection(String subgroup, String before, String after, int position) { Loading @@ -263,9 +264,10 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang public void run() { final long currentTime = System.currentTimeMillis(); mDate.setTime(currentTime); final long upTime = SystemClock.uptimeMillis(); final String printString = String.format("%s\t%d\t%s\t%s\n", mDateFormat.format(mDate), currentTime, logGroup.mLogString, log); mDateFormat.format(mDate), upTime, logGroup.mLogString, log); if (LatinImeLogger.sDBG) { Log.d(TAG, "Write: " + '[' + logGroup.mLogString + ']' + log); } Loading
tests/src/com/android/inputmethod/latin/ResearchLoggerTests.java 0 → 100644 +156 −0 Original line number Diff line number Diff line /* * Copyright (C) 2012 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; import android.inputmethodservice.InputMethodService; import android.os.Handler; import android.util.Log; import android.view.MotionEvent; import com.android.inputmethod.latin.ResearchLogger.LogFileManager; import java.io.FileNotFoundException; public class ResearchLoggerTests extends InputTestsBase { private static final String TAG = ResearchLoggerTests.class.getSimpleName(); private static final int TEST_INT = 0x12345678; private static final long TEST_LONG = 0x1234567812345678L; private static ResearchLogger sLogger; private MockLogFileManager mMockLogFileManager; @Override protected void setUp() { super.setUp(); sLogger = ResearchLogger.getInstance(); mMockLogFileManager = new MockLogFileManager(); sLogger.setLogFileManager(mMockLogFileManager); ResearchLogger.sIsLogging = true; } public static class MockLogFileManager extends LogFileManager { private final StringBuilder mContents = new StringBuilder(); @Override public void init(InputMethodService ims) { } @Override public synchronized void createLogFile() { mContents.setLength(0); } @Override public synchronized void createLogFile(String dir, String filename) throws FileNotFoundException { mContents.setLength(0); } @Override public synchronized boolean append(String s) { mContents.append(s); return true; } @Override public synchronized void reset() { mContents.setLength(0); } @Override public synchronized void close() { mContents.setLength(0); } private String getAppendedString() { return mContents.toString(); } } private void waitOnResearchLogger() { // post another Runnable that notify()'s the test that it may proceed. // assumes that the MessageQueue is processed in-order Handler handler = sLogger.mLoggingHandler; handler.post(new Runnable() { @Override public void run() { synchronized (ResearchLoggerTests.this) { ResearchLoggerTests.this.notify(); } } }); synchronized (this) { try { wait(); } catch (InterruptedException e) { Log.i(TAG, "interrupted when waiting for handler to finish.", e); } } } /*********************** Tests *********************/ public void testLogStartsEmpty() { waitOnResearchLogger(); String result = mMockLogFileManager.getAppendedString(); assertEquals(result, ""); } public void testMotionEvent() { // verify that input values appear somewhere in output sLogger.logMotionEvent(MotionEvent.ACTION_CANCEL, TEST_LONG, TEST_INT, 1111, 3333, 5555, 7777); waitOnResearchLogger(); String output = mMockLogFileManager.getAppendedString(); assertTrue(output.matches("(?sui).*\\bcancel\\b.*")); assertFalse(output.matches("(?sui).*\\bdown\\b.*")); assertTrue(output.matches("(?s).*\\b" + TEST_LONG + "\\b.*")); assertTrue(output.matches("(?s).*\\b" + TEST_INT + "\\b.*")); assertTrue(output.matches("(?s).*\\b1111\\b.*")); assertTrue(output.matches("(?s).*\\b3333\\b.*")); assertTrue(output.matches("(?s).*\\b5555\\b.*")); assertTrue(output.matches("(?s).*\\b7777\\b.*")); } public void testKeyEvent() { type("abc"); waitOnResearchLogger(); String output = mMockLogFileManager.getAppendedString(); assertTrue(output.matches("(?s).*\\ba\\b.*")); assertTrue(output.matches("(?s).*\\bb\\b.*")); assertTrue(output.matches("(?s).*\\bc\\b.*")); } public void testCorrection() { sLogger.logCorrection("aaaa", "thos", "this", 1); waitOnResearchLogger(); String output = mMockLogFileManager.getAppendedString(); assertTrue(output.matches("(?sui).*\\baaaa\\b.*")); assertTrue(output.matches("(?sui).*\\bthos\\b.*")); assertTrue(output.matches("(?sui).*\\bthis\\b.*")); } public void testStateChange() { sLogger.logStateChange("aaaa", "bbbb"); waitOnResearchLogger(); String output = mMockLogFileManager.getAppendedString(); assertTrue(output.matches("(?sui).*\\baaaa\\b.*")); assertTrue(output.matches("(?sui).*\\bbbbb\\b.*")); } // TODO: add integration tests that start at point of event generation. }