From b8e2ae3bc312269897057fccc34cd736c05bcc90 Mon Sep 17 00:00:00 2001 From: Kurt Partridge Date: Mon, 9 Apr 2012 18:39:35 -0700 Subject: [PATCH] change ResearchLoggerTests to check file multi-project commit with I587003f2 Bug: 6188932 Change-Id: I3d3f0c9d011301489473dc330338ea4a7ba61e9e --- java/proguard.flags | 6 + .../inputmethod/latin/ResearchLogger.java | 131 +++++++++++++----- .../inputmethod/latin/InputTestsBase.java | 18 +++ 3 files changed, 122 insertions(+), 33 deletions(-) diff --git a/java/proguard.flags b/java/proguard.flags index 44f8581cc..6cc3342dc 100644 --- a/java/proguard.flags +++ b/java/proguard.flags @@ -38,6 +38,12 @@ -keep class com.android.inputmethod.latin.ResearchLogger { void setLogFileManager(...); + void clearAll(); + com.android.inputmethod.latin.ResearchLogger$LogFileManager getLogFileManager(); +} + +-keep class com.android.inputmethod.latin.ResearchLogger$LogFileManager { + java.lang.String getContents(); } -keep class com.android.inputmethod.keyboard.KeyboardLayoutSet$Builder { diff --git a/java/src/com/android/inputmethod/latin/ResearchLogger.java b/java/src/com/android/inputmethod/latin/ResearchLogger.java index 08c26a5df..2d9f3ceb6 100644 --- a/java/src/com/android/inputmethod/latin/ResearchLogger.java +++ b/java/src/com/android/inputmethod/latin/ResearchLogger.java @@ -35,10 +35,16 @@ import com.android.inputmethod.keyboard.internal.AlphabetShiftState; import com.android.inputmethod.keyboard.internal.KeyboardState; import com.android.inputmethod.latin.define.ProductionFlag; +import java.io.BufferedWriter; import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.IOException; import java.io.PrintWriter; +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.channels.FileChannel; +import java.nio.charset.Charset; /** * Logs the use of the LatinIME keyboard. @@ -70,15 +76,15 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang * Handles creation, deletion, and provides Readers, Writers, and InputStreams to access * the logs. */ - public static class LogFileManager { - private static final String DEFAULT_FILENAME = "log.txt"; - private static final String DEFAULT_LOG_DIRECTORY = "researchLogger"; + /* package */ static class LogFileManager { + public static final String RESEARCH_LOG_FILENAME_KEY = "RESEARCH_LOG_FILENAME"; + private static final String DEFAULT_FILENAME = "researchLog.txt"; private static final long LOGFILE_PURGE_INTERVAL = 1000 * 60 * 60 * 24; - private InputMethodService mIms; - private File mFile; - private PrintWriter mPrintWriter; + protected InputMethodService mIms; + protected File mFile; + protected PrintWriter mPrintWriter; /* package */ LogFileManager() { } @@ -89,15 +95,28 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang public synchronized boolean createLogFile() { try { - return createLogFile(DEFAULT_LOG_DIRECTORY, DEFAULT_FILENAME); - } catch (final FileNotFoundException e) { + return createLogFile(DEFAULT_FILENAME); + } catch (IOException e) { + e.printStackTrace(); Log.w(TAG, e); return false; } } - public synchronized boolean createLogFile(final String dir, final String filename) - throws FileNotFoundException { + public synchronized boolean createLogFile(final SharedPreferences prefs) { + try { + final String filename = + prefs.getString(RESEARCH_LOG_FILENAME_KEY, DEFAULT_FILENAME); + return createLogFile(filename); + } catch (IOException e) { + Log.w(TAG, e); + e.printStackTrace(); + } + return false; + } + + public synchronized boolean createLogFile(final String filename) + throws IOException { if (mIms == null) { Log.w(TAG, "InputMethodService is not configured. Logging is off."); return false; @@ -107,29 +126,22 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang Log.w(TAG, "Storage directory does not exist. Logging is off."); return false; } - final File directory = new File(filesDir, dir); - if (!directory.exists()) { - final boolean wasCreated = directory.mkdirs(); - if (!wasCreated) { - Log.w(TAG, "Log directory cannot be created. Logging is off."); - return false; - } - } - close(); - mFile = new File(directory, filename); - mFile.setReadable(false, false); + final File file = new File(filesDir, filename); + mFile = file; + file.setReadable(false, false); boolean append = true; - if (mFile.exists() && mFile.lastModified() + LOGFILE_PURGE_INTERVAL < + if (file.exists() && file.lastModified() + LOGFILE_PURGE_INTERVAL < System.currentTimeMillis()) { append = false; } - mPrintWriter = new PrintWriter(new FileOutputStream(mFile, append), true); + mPrintWriter = new PrintWriter(new BufferedWriter(new FileWriter(file, append)), true); return true; } public synchronized boolean append(final String s) { - if (mPrintWriter == null) { + final PrintWriter printWriter = mPrintWriter; + if (printWriter == null) { if (DEBUG) { Log.w(TAG, "PrintWriter is null... attempting to create default log file"); } @@ -140,8 +152,9 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang } } } - mPrintWriter.print(s); - return !mPrintWriter.checkError(); + printWriter.print(s); + printWriter.flush(); + return !printWriter.checkError(); } public synchronized void reset() { @@ -149,7 +162,7 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang mPrintWriter.close(); mPrintWriter = null; } - if (mFile != null && mFile.exists()) { + if (mFile != null) { mFile.delete(); mFile = null; } @@ -162,6 +175,53 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang mFile = null; } } + + /* package */ synchronized void flush() { + if (mPrintWriter != null) { + mPrintWriter.flush(); + } + } + + /* package */ synchronized String getContents() { + final File file = mFile; + if (file == null) { + return ""; + } + if (mPrintWriter != null) { + mPrintWriter.flush(); + } + FileInputStream stream = null; + FileChannel fileChannel = null; + String s = ""; + try { + stream = new FileInputStream(file); + fileChannel = stream.getChannel(); + final ByteBuffer byteBuffer = ByteBuffer.allocate((int) file.length()); + fileChannel.read(byteBuffer); + byteBuffer.rewind(); + CharBuffer charBuffer = Charset.defaultCharset().decode(byteBuffer); + s = charBuffer.toString(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (fileChannel != null) { + fileChannel.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (stream != null) { + stream.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return s; + } } private ResearchLogger(final LogFileManager logFileManager) { @@ -182,9 +242,10 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang public void initInternal(final InputMethodService ims, final SharedPreferences prefs) { mIms = ims; - if (mLogFileManager != null) { - mLogFileManager.init(ims); - mLogFileManager.createLogFile(); + final LogFileManager logFileManager = mLogFileManager; + if (logFileManager != null) { + logFileManager.init(ims); + logFileManager.createLogFile(prefs); } if (prefs != null) { sIsLogging = prefs.getBoolean(PREF_USABILITY_STUDY_MODE, false); @@ -359,6 +420,10 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang }); } + /* package */ LogFileManager getLogFileManager() { + return mLogFileManager; + } + @Override public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { if (key == null || prefs == null) { @@ -644,7 +709,7 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang } } - public static void suggestionsView_setSuggestions(SuggestedWords mSuggestedWords) { + public static void suggestionsView_setSuggestions(final SuggestedWords mSuggestedWords) { if (UnsLogGroup.SUGGESTIONSVIEW_SETSUGGESTIONS_ENABLED) { logUnstructured("SuggestionsView_setSuggestions", mSuggestedWords.toString()); } diff --git a/tests/src/com/android/inputmethod/latin/InputTestsBase.java b/tests/src/com/android/inputmethod/latin/InputTestsBase.java index 4dfe22800..9276b40df 100644 --- a/tests/src/com/android/inputmethod/latin/InputTestsBase.java +++ b/tests/src/com/android/inputmethod/latin/InputTestsBase.java @@ -100,6 +100,17 @@ public class InputTestsBase extends ServiceTestCase { return previousDebugSetting; } + // overload this to configure preferences in a way specific to a subclass's tests + protected void configurePreferences() { + // please avoid changing preferences any more than is necessary, as an interruption + // during a test will leave the user's preferences in a bad state. + } + + // restore any preferences set in configurePreferences() + protected void restorePreferences() { + // undo any effects from configurePreferences() + } + @Override protected void setUp() { try { @@ -113,6 +124,7 @@ public class InputTestsBase extends ServiceTestCase { setupService(); mLatinIME = getService(); final boolean previousDebugSetting = setDebugMode(true); + configurePreferences(); mLatinIME.onCreate(); setDebugMode(previousDebugSetting); initSubtypeMap(); @@ -134,6 +146,12 @@ public class InputTestsBase extends ServiceTestCase { changeLanguage("en_US"); } + @Override + protected void tearDown() throws Exception { + super.tearDown(); + restorePreferences(); + } + private void initSubtypeMap() { final InputMethodManager imm = (InputMethodManager)mLatinIME.getSystemService( Context.INPUT_METHOD_SERVICE);