diff --git a/java/res/values-sw600dp/config.xml b/java/res/values-sw600dp/config.xml
index e296623..b47eacb 100644
--- a/java/res/values-sw600dp/config.xml
+++ b/java/res/values-sw600dp/config.xml
@@ -19,7 +19,7 @@
 -->
 
 <resources>
-    <!-- Device form factor. This value must be aligned with {@link KeyboardId.DEVICE_FORM_FACTOR_TABLET7} -->
+    <!-- Device form factor. This value must be aligned with {@link KeyboardId.FORM_FACTOR_TABLET7} -->
     <integer name="config_device_form_factor">1</integer>
     <bool name="config_enable_show_voice_key_option">false</bool>
     <bool name="config_enable_show_popup_on_keypress_option">false</bool>
diff --git a/java/res/values-sw768dp/config.xml b/java/res/values-sw768dp/config.xml
index 346fa99..5e79541 100644
--- a/java/res/values-sw768dp/config.xml
+++ b/java/res/values-sw768dp/config.xml
@@ -19,7 +19,7 @@
 -->
 
 <resources>
-    <!-- Device form factor. This value must be aligned with {@link KeyboardId.DEVICE_FORM_FACTOR_TABLET10} -->
+    <!-- Device form factor. This value must be aligned with {@link KeyboardId.FORM_FACTOR_TABLET10} -->
     <integer name="config_device_form_factor">2</integer>
     <bool name="config_enable_show_voice_key_option">false</bool>
     <bool name="config_enable_show_popup_on_keypress_option">false</bool>
diff --git a/java/res/values/config.xml b/java/res/values/config.xml
index dc5a3d1..dca370a 100644
--- a/java/res/values/config.xml
+++ b/java/res/values/config.xml
@@ -19,7 +19,7 @@
 -->
 
 <resources>
-    <!-- Device form factor. This value must be aligned with {@link KeyboardId.DEVICE_FORM_FACTOR_PHONE} -->
+    <!-- Device form factor. This value must be aligned with {@link KeyboardId.FORM_FACTOR_PHONE} -->
     <integer name="config_device_form_factor">0</integer>
     <bool name="config_use_fullscreen_mode">false</bool>
     <bool name="config_enable_show_voice_key_option">true</bool>
diff --git a/java/src/com/android/inputmethod/latin/DebugSettings.java b/java/src/com/android/inputmethod/latin/DebugSettings.java
index 989451b..f8aeb4e 100644
--- a/java/src/com/android/inputmethod/latin/DebugSettings.java
+++ b/java/src/com/android/inputmethod/latin/DebugSettings.java
@@ -16,7 +16,6 @@
 
 package com.android.inputmethod.latin;
 
-import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.content.pm.PackageInfo;
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 179b56b..3935f99 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1085,7 +1085,7 @@
     public boolean onEvaluateFullscreenMode() {
         // Reread resource value here, because this method is called by framework anytime as needed.
         final boolean isFullscreenModeAllowed =
-                mCurrentSettings.isFullscreenModeAllowed(getResources());
+                SettingsValues.isFullscreenModeAllowed(getResources());
         if (super.onEvaluateFullscreenMode() && isFullscreenModeAllowed) {
             // TODO: Remove this hack. Actually we should not really assume NO_EXTRACT_UI
             // implies NO_FULLSCREEN. However, the framework mistakenly does.  i.e. NO_EXTRACT_UI
diff --git a/java/src/com/android/inputmethod/latin/RichInputConnection.java b/java/src/com/android/inputmethod/latin/RichInputConnection.java
index 23887c4..8612746 100644
--- a/java/src/com/android/inputmethod/latin/RichInputConnection.java
+++ b/java/src/com/android/inputmethod/latin/RichInputConnection.java
@@ -65,12 +65,6 @@
      * This contains the currently composing text, as LatinIME thinks the TextView is seeing it.
      */
     private StringBuilder mComposingText = new StringBuilder();
-    /**
-     * This is a one-character string containing the character after the cursor. Since LatinIME
-     * never touches it directly, it's never modified by any means other than re-reading from the
-     * TextView when the cursor position is changed by the user.
-     */
-    private CharSequence mCharAfterTheCursor = "";
     // A hint on how many characters to cache from the TextView. A good value of this is given by
     // how many characters we need to be able to almost always find the caps mode.
     private static final int DEFAULT_TEXT_CACHE_SIZE = 100;
@@ -146,7 +140,6 @@
         mCommittedTextBeforeComposingText.setLength(0);
         final CharSequence textBeforeCursor = getTextBeforeCursor(DEFAULT_TEXT_CACHE_SIZE, 0);
         if (null != textBeforeCursor) mCommittedTextBeforeComposingText.append(textBeforeCursor);
-        mCharAfterTheCursor = getTextAfterCursor(1, 0);
         if (null != mIC) {
             mIC.finishComposingText();
             if (ProductionFlag.IS_EXPERIMENTAL) {
@@ -398,6 +391,7 @@
         if (DEBUG_PREVIOUS_TEXT) checkConsistencyForDebug();
     }
 
+    @SuppressWarnings("unused")
     public String getNthPreviousWord(final String sentenceSeperators, final int n) {
         mIC = mParent.getCurrentInputConnection();
         if (null == mIC) return null;
diff --git a/java/src/com/android/inputmethod/latin/UserHistoryDictIOUtils.java b/java/src/com/android/inputmethod/latin/UserHistoryDictIOUtils.java
index 7871977..100e377 100644
--- a/java/src/com/android/inputmethod/latin/UserHistoryDictIOUtils.java
+++ b/java/src/com/android/inputmethod/latin/UserHistoryDictIOUtils.java
@@ -63,7 +63,7 @@
 
         @Override
         public int readUnsignedByte() {
-            return ((int)mBuffer[mPosition++]) & 0xFF;
+            return mBuffer[mPosition++] & 0xFF;
         }
 
         @Override
diff --git a/java/src/com/android/inputmethod/latin/UserHistoryDictionary.java b/java/src/com/android/inputmethod/latin/UserHistoryDictionary.java
index 4fd9bfa..f30a60a 100644
--- a/java/src/com/android/inputmethod/latin/UserHistoryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/UserHistoryDictionary.java
@@ -376,10 +376,10 @@
                     final byte fc = fcp.getFc();
                     final boolean isValid = fcp.isValid();
                     if (prevFc > 0 && prevFc == fc) {
-                        freq = ((int)fc) & 0xFF;
+                        freq = fc & 0xFF;
                     } else if (UserHistoryForgettingCurveUtils.
                             needsToSave(fc, isValid, mAddLevel0Bigrams)) {
-                        freq = ((int)fc) & 0xFF;
+                        freq = fc & 0xFF;
                     } else {
                         // Delete this entry
                         freq = -1;
diff --git a/java/src/com/android/inputmethod/latin/Utils.java b/java/src/com/android/inputmethod/latin/Utils.java
index 876bc8e..3eac6a2 100644
--- a/java/src/com/android/inputmethod/latin/Utils.java
+++ b/java/src/com/android/inputmethod/latin/Utils.java
@@ -41,6 +41,7 @@
 import java.nio.channels.FileChannel;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.Locale;
 
 public final class Utils {
     private Utils() {
@@ -193,7 +194,7 @@
 
         private UsabilityStudyLogUtils() {
             mDate = new Date();
-            mDateFormat = new SimpleDateFormat("yyyyMMdd-HHmmss.SSSZ");
+            mDateFormat = new SimpleDateFormat("yyyyMMdd-HHmmss.SSSZ", Locale.US);
 
             HandlerThread handlerThread = new HandlerThread("UsabilityStudyLogUtils logging task",
                     Process.THREAD_PRIORITY_BACKGROUND);
@@ -255,7 +256,7 @@
                     final long currentTime = System.currentTimeMillis();
                     mDate.setTime(currentTime);
 
-                    final String printString = String.format("%s\t%d\t%s\n",
+                    final String printString = String.format(Locale.US, "%s\t%d\t%s\n",
                             mDateFormat.format(mDate), currentTime, log);
                     if (LatinImeLogger.sDBG) {
                         Log.d(USABILITY_TAG, "Write: " + log);
@@ -297,7 +298,7 @@
                     final Date date = new Date();
                     date.setTime(System.currentTimeMillis());
                     final String currentDateTimeString =
-                            new SimpleDateFormat("yyyyMMdd-HHmmssZ").format(date);
+                            new SimpleDateFormat("yyyyMMdd-HHmmssZ", Locale.US).format(date);
                     if (mFile == null) {
                         Log.w(USABILITY_TAG, "No internal log file found.");
                         return;
@@ -313,11 +314,15 @@
                             + "/research-" + currentDateTimeString + ".log";
                     final File destFile = new File(destPath);
                     try {
-                        final FileChannel src = (new FileInputStream(mFile)).getChannel();
-                        final FileChannel dest = (new FileOutputStream(destFile)).getChannel();
+                        final FileInputStream srcStream = new FileInputStream(mFile);
+                        final FileOutputStream destStream = new FileOutputStream(destFile);
+                        final FileChannel src = srcStream.getChannel();
+                        final FileChannel dest = destStream.getChannel();
                         src.transferTo(0, src.size(), dest);
                         src.close();
+                        srcStream.close();
                         dest.close();
+                        destStream.close();
                     } catch (FileNotFoundException e1) {
                         Log.w(USABILITY_TAG, e1);
                         return;
diff --git a/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java b/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java
index d1a3c7b..fb1eb27 100644
--- a/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java
+++ b/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java
@@ -921,6 +921,7 @@
      * @param formatOptions file format options.
      * @return the address of the END of the node.
      */
+    @SuppressWarnings("unused")
     private static int writePlacedNode(final FusionDictionary dict, byte[] buffer,
             final Node node, final FormatOptions formatOptions) {
         // TODO: Make the code in common with BinaryDictIOUtils#writeCharGroup
@@ -1407,6 +1408,7 @@
     // TODO: static!? This will behave erratically when used in multi-threaded code.
     // We need to fix this
     private static int[] sGetWordBuffer = new int[FormatSpec.MAX_WORD_LENGTH];
+    @SuppressWarnings("unused")
     private static WeightedString getWordAtAddressWithParentAddress(
             final FusionDictionaryBufferInterface buffer, final int headerSize, final int address,
             final FormatOptions options) {
diff --git a/java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java b/java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java
index b0b3777..ee647ab 100644
--- a/java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java
+++ b/java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java
@@ -617,6 +617,7 @@
     /**
      * Helper method to find a word in a given branch.
      */
+    @SuppressWarnings("unused")
     public static CharGroup findWordInTree(Node node, final String s) {
         int index = 0;
         final StringBuilder checker = DBG ? new StringBuilder() : null;
diff --git a/java/src/com/android/inputmethod/research/ResearchLogger.java b/java/src/com/android/inputmethod/research/ResearchLogger.java
index 3443b7a..982d104 100644
--- a/java/src/com/android/inputmethod/research/ResearchLogger.java
+++ b/java/src/com/android/inputmethod/research/ResearchLogger.java
@@ -57,7 +57,6 @@
 import com.android.inputmethod.keyboard.KeyboardId;
 import com.android.inputmethod.keyboard.KeyboardView;
 import com.android.inputmethod.keyboard.MainKeyboardView;
-import com.android.inputmethod.latin.CollectionUtils;
 import com.android.inputmethod.latin.Constants;
 import com.android.inputmethod.latin.Dictionary;
 import com.android.inputmethod.latin.InputTypeUtils;
@@ -144,7 +143,6 @@
     private final Statistics mStatistics;
 
     private Intent mUploadIntent;
-    private PendingIntent mUploadPendingIntent;
 
     private LogUnit mCurrentLogUnit = new LogUnit();
 
@@ -189,7 +187,6 @@
         mInputMethodService = ims;
         mPrefs = prefs;
         mUploadIntent = new Intent(mInputMethodService, UploaderService.class);
-        mUploadPendingIntent = PendingIntent.getService(mInputMethodService, 0, mUploadIntent, 0);
 
         if (ProductionFlag.IS_EXPERIMENTAL) {
             scheduleUploadingService(mInputMethodService);
@@ -428,21 +425,6 @@
     }
 
     private long mResumeTime = 0L;
-    private void suspendLoggingUntil(long time) {
-        mIsLoggingSuspended = true;
-        mResumeTime = time;
-        requestIndicatorRedraw();
-    }
-
-    private void resumeLogging() {
-        mResumeTime = 0L;
-        updateSuspendedState();
-        requestIndicatorRedraw();
-        if (isAllowedToLog()) {
-            restart();
-        }
-    }
-
     private void updateSuspendedState() {
         final long time = System.currentTimeMillis();
         if (time > mResumeTime) {
@@ -840,10 +822,6 @@
         stop();
     }
 
-    private static final String[] EVENTKEYS_USER_FEEDBACK = {
-        "UserFeedback", "FeedbackContents"
-    };
-
     private static final String[] EVENTKEYS_PREFS_CHANGED = {
         "PrefsChanged", "prefs"
     };
