change ResearchLoggerTests to check file

multi-project commit with I587003f2

Bug: 6188932
Change-Id: I3d3f0c9d011301489473dc330338ea4a7ba61e9e
diff --git a/java/proguard.flags b/java/proguard.flags
index 44f8581..6cc3342 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 08c26a5..2d9f3ce 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.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 @@
      * 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 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 @@
                 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 @@
                     }
                 }
             }
-            mPrintWriter.print(s);
-            return !mPrintWriter.checkError();
+            printWriter.print(s);
+            printWriter.flush();
+            return !printWriter.checkError();
         }
 
         public synchronized void reset() {
@@ -149,7 +162,7 @@
                 mPrintWriter.close();
                 mPrintWriter = null;
             }
-            if (mFile != null && mFile.exists()) {
+            if (mFile != null) {
                 mFile.delete();
                 mFile = null;
             }
@@ -162,6 +175,53 @@
                 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 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 @@
         });
     }
 
+    /* package */ LogFileManager getLogFileManager() {
+        return mLogFileManager;
+    }
+
     @Override
     public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
         if (key == null || prefs == null) {
@@ -644,7 +709,7 @@
         }
     }
 
-    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 4dfe228..9276b40 100644
--- a/tests/src/com/android/inputmethod/latin/InputTestsBase.java
+++ b/tests/src/com/android/inputmethod/latin/InputTestsBase.java
@@ -100,6 +100,17 @@
         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 @@
         setupService();
         mLatinIME = getService();
         final boolean previousDebugSetting = setDebugMode(true);
+        configurePreferences();
         mLatinIME.onCreate();
         setDebugMode(previousDebugSetting);
         initSubtypeMap();
@@ -134,6 +146,12 @@
         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);