Hide debug mode

- Tap feedback option 10 times, then debug mode will be enabled.
- Change default value of KeyboardMode to avoid NPE
- Update version code

Change-Id: I3a4e64db0d3aa9a08f0e3b3ad1669e728e32cddf
diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml
index 53044fc..105eb04 100755
--- a/java/AndroidManifest.xml
+++ b/java/AndroidManifest.xml
@@ -1,7 +1,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.google.android.inputmethod.latin"
         android:versionCode="9"
-        android:versionName="0.14">
+        android:versionName="0.15">
 
     <uses-sdk android:minSdkVersion="8"></uses-sdk>
 
diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml
index 0984a36..b50588a 100644
--- a/java/res/xml/prefs.xml
+++ b/java/res/xml/prefs.xml
@@ -107,5 +107,4 @@
             android:persistent="true"
             android:defaultValue="false"
             />
-
 </PreferenceScreen>
diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
index 948fe5a..5634293 100644
--- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
@@ -74,7 +74,7 @@
     private KeyboardId mCurrentId;
     private Map<KeyboardId, LatinKeyboard> mKeyboards;
 
-    private int mMode; /** One of the MODE_XXX values */
+    private int mMode = MODE_TEXT; /** One of the MODE_XXX values */
     private int mImeOptions;
     private int mTextMode = MODE_TEXT_QWERTY;
     private boolean mIsSymbols;
diff --git a/java/src/com/android/inputmethod/latin/LatinIMESettings.java b/java/src/com/android/inputmethod/latin/LatinIMESettings.java
index 21b9674..806ef00 100644
--- a/java/src/com/android/inputmethod/latin/LatinIMESettings.java
+++ b/java/src/com/android/inputmethod/latin/LatinIMESettings.java
@@ -24,13 +24,13 @@
 import android.app.backup.BackupManager;
 import android.content.DialogInterface;
 import android.content.SharedPreferences;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
 import android.os.Bundle;
 import android.preference.CheckBoxPreference;
 import android.preference.ListPreference;
-import android.preference.Preference;
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceGroup;
-import android.preference.Preference.OnPreferenceClickListener;
 import android.speech.SpeechRecognizer;
 import android.text.AutoText;
 import android.util.Log;
@@ -43,11 +43,9 @@
         DialogInterface.OnDismissListener {
 
     private static final String QUICK_FIXES_KEY = "quick_fixes";
-    private static final String SHOW_SUGGESTIONS_KEY = "show_suggestions";
     private static final String PREDICTION_SETTINGS_KEY = "prediction_settings";
     private static final String VOICE_SETTINGS_KEY = "voice_mode";
-    private static final String VOICE_ON_PRIMARY_KEY = "voice_on_main";
-    private static final String VOICE_SERVER_KEY = "voice_server_url";
+    private static final String DEBUG_MODE_KEY = "debug_mode";
 
     private static final String TAG = "LatinIMESettings";
 
@@ -55,7 +53,7 @@
     private static final int VOICE_INPUT_CONFIRM_DIALOG = 0;
 
     private CheckBoxPreference mQuickFixes;
-    private CheckBoxPreference mShowSuggestions;
+    private CheckBoxPreference mDebugMode;
     private ListPreference mVoicePreference;
     private boolean mVoiceOn;
 
@@ -69,7 +67,6 @@
         super.onCreate(icicle);
         addPreferencesFromResource(R.xml.prefs);
         mQuickFixes = (CheckBoxPreference) findPreference(QUICK_FIXES_KEY);
-        mShowSuggestions = (CheckBoxPreference) findPreference(SHOW_SUGGESTIONS_KEY);
         mVoicePreference = (ListPreference) findPreference(VOICE_SETTINGS_KEY);
         SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
         prefs.registerOnSharedPreferenceChangeListener(this);
@@ -77,6 +74,9 @@
         mVoiceModeOff = getString(R.string.voice_mode_off);
         mVoiceOn = !(prefs.getString(VOICE_SETTINGS_KEY, mVoiceModeOff).equals(mVoiceModeOff));
         mLogger = VoiceInputLogger.getLogger(this);
+
+        mDebugMode = (CheckBoxPreference) findPreference(DEBUG_MODE_KEY);
+        updateDebugMode(mDebugMode.isChecked());
     }
 
     @Override
@@ -110,11 +110,35 @@
                     .equals(mVoiceModeOff)) {
                 showVoiceConfirmation();
             }
+        } else if (key.equals(DEBUG_MODE_KEY)) {
+            updateDebugMode(prefs.getBoolean(DEBUG_MODE_KEY, false));
         }
         mVoiceOn = !(prefs.getString(VOICE_SETTINGS_KEY, mVoiceModeOff).equals(mVoiceModeOff));
         updateVoiceModeSummary();
     }
 
+    private void updateDebugMode(boolean isDebugMode) {
+        if (mDebugMode == null) {
+            return;
+        }
+        String version = "";
+        try {
+            PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), 0);
+            version = "Version " + info.versionName;
+        } catch (NameNotFoundException e) {
+            Log.e(TAG, "Could not find version info.");
+        }
+        if (!isDebugMode) {
+            mDebugMode.setEnabled(false);
+            mDebugMode.setTitle(version);
+            mDebugMode.setSummary("");
+        } else {
+            mDebugMode.setEnabled(true);
+            mDebugMode.setTitle(getResources().getString(R.string.prefs_debug_mode));
+            mDebugMode.setSummary(version);
+        }
+    }
+
     private void showVoiceConfirmation() {
         mOkClicked = false;
         showDialog(VOICE_INPUT_CONFIRM_DIALOG);
diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java
index c81da55..9a02eb1 100644
--- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java
+++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java
@@ -36,7 +36,7 @@
 
 public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChangeListener {
     private static final String TAG = "LatinIMELogs";
-    private static final boolean DBG = true;
+    private static boolean sDBG = false;
     private static boolean sLOGPRINT = false;
     // SUPPRESS_EXCEPTION should be true when released to public.
     private static final boolean SUPPRESS_EXCEPTION = true;
@@ -77,6 +77,7 @@
     /* package */ static String sLastAutoSuggestAfter;
     /* package */ static String sLastAutoSuggestSeparator;
     private static HashMap<String, Integer> sSuggestDicMap = new HashMap<String, Integer>();
+    private static DebugKeyEnabler sDebugKeyEnabler = new DebugKeyEnabler();
 
     private ArrayList<LogEntry> mLogBuffer = null;
     private ArrayList<LogEntry> mPrivacyLogBuffer = null;
@@ -142,6 +143,7 @@
         mThemeId = prefs.getString(KeyboardSwitcher.PREF_KEYBOARD_LAYOUT,
                 KeyboardSwitcher.DEFAULT_LAYOUT_ID);
         sLOGPRINT = prefs.getBoolean(PREF_DEBUG_MODE, sLOGPRINT);
+        sDBG = sLOGPRINT;
         prefs.registerOnSharedPreferenceChangeListener(this);
     }
 
@@ -165,7 +167,7 @@
      * Check if the input string is safe as an entry or not.
      */
     private static boolean checkStringDataSafe(String s) {
-        if (DBG) {
+        if (sDBG) {
             Log.d(TAG, "Check String safety: " + s);
         }
         for (int i = 0; i < s.length(); ++i) {
@@ -295,7 +297,7 @@
                 ++mWordCount;
                 String[] dataStrings = (String[]) data;
                 if (dataStrings.length < 2) {
-                    if (DBG) {
+                    if (sDBG) {
                         Log.e(TAG, "The length of logged string array is invalid.");
                     }
                     break;
@@ -305,7 +307,7 @@
                     mPrivacyLogBuffer.add(
                             new LogEntry (System.currentTimeMillis(), tag, dataStrings));
                 } else {
-                    if (DBG) {
+                    if (sDBG) {
                         Log.d(TAG, "Skipped to add an entry because data is unsafe.");
                     }
                 }
@@ -314,7 +316,7 @@
                 --mWordCount;
                 dataStrings = (String[]) data;
                 if (dataStrings.length < 2) {
-                    if (DBG) {
+                    if (sDBG) {
                         Log.e(TAG, "The length of logged string array is invalid.");
                     }
                     break;
@@ -324,7 +326,7 @@
                     mPrivacyLogBuffer.add(
                             new LogEntry (System.currentTimeMillis(), tag, dataStrings));
                 } else {
-                    if (DBG) {
+                    if (sDBG) {
                         Log.d(TAG, "Skipped to add an entry because data is unsafe.");
                     }
                 }
@@ -332,7 +334,7 @@
             case ID_EXCEPTION:
                 dataStrings = (String[]) data;
                 if (dataStrings.length < 2) {
-                    if (DBG) {
+                    if (sDBG) {
                         Log.e(TAG, "The length of logged string array is invalid.");
                     }
                     break;
@@ -340,7 +342,7 @@
                 addExceptionEntry(System.currentTimeMillis(), dataStrings);
                 break;
             default:
-                if (DBG) {
+                if (sDBG) {
                     Log.e(TAG, "Log Tag is not entried.");
                 }
                 break;
@@ -370,7 +372,7 @@
     }
 
     private void commitInternalAndStopSelf() {
-        if (DBG) {
+        if (sDBG) {
             Log.e(TAG, "Exception was thrown and let's die.");
         }
         commitInternal();
@@ -381,7 +383,7 @@
 
     private synchronized void sendLogToDropBox(int tag, Object s) {
         long now = System.currentTimeMillis();
-        if (DBG) {
+        if (sDBG) {
             String out = "";
             if (s instanceof String[]) {
                 for (String str: ((String[]) s)) {
@@ -414,12 +416,16 @@
             } else {
                 sLogEnabled = false;
             }
+            if (sDebugKeyEnabler.check()) {
+                sharedPreferences.edit().putBoolean(PREF_DEBUG_MODE, true).commit();
+            }
         } else if (KeyboardSwitcher.PREF_KEYBOARD_LAYOUT.equals(key)) {
             mThemeId = sharedPreferences.getString(KeyboardSwitcher.PREF_KEYBOARD_LAYOUT,
                     KeyboardSwitcher.DEFAULT_LAYOUT_ID);
             addThemeIdEntry(mLastTimeActive);
         } else if (PREF_DEBUG_MODE.equals(key)) {
             sLOGPRINT = sharedPreferences.getBoolean(PREF_DEBUG_MODE, sLOGPRINT);
+            sDBG = sLOGPRINT;
         }
     }
 
@@ -446,14 +452,14 @@
                 sLatinImeLogger.sendLogToDropBox(ID_MANUALSUGGESTION, new String[] {
                         before, after, String.valueOf(position), ""});
             } else if (!sSuggestDicMap.containsKey(after)) {
-                if (DBG) {
+                if (sDBG) {
                     Log.e(TAG, "logOnManualSuggestion was cancelled: came from unknown source.");
                 }
             } else {
                 int dicTypeId = sSuggestDicMap.get(after);
                 sLatinImeLogger.mManualSuggestCountPerDic[dicTypeId]++;
                 if (dicTypeId != Suggest.DIC_MAIN) {
-                    if (DBG) {
+                    if (sDBG) {
                         Log.d(TAG, "logOnManualSuggestion was cancelled: didn't come from main dic.");
                     }
                 } else {
@@ -479,7 +485,7 @@
     public static void logOnAutoSuggestion(String before, String after) {
         if (sLogEnabled) {
             if (!sSuggestDicMap.containsKey(after)) {
-                if (DBG) {
+                if (sDBG) {
                     Log.e(TAG, "logOnAutoSuggestion was cancelled: came from unknown source.");
                 }
                 return;
@@ -488,7 +494,7 @@
             sLatinImeLogger.mAutoSuggestCountPerDic[dicId]++;
             sSuggestDicMap.clear();
             if (dicId != Suggest.DIC_MAIN) {
-                if (DBG) {
+                if (sDBG) {
                     Log.d(TAG, "logOnAutoSuggestion was cancelled: didn't come from main dic.");
                 }
                 return;
@@ -552,7 +558,7 @@
                     Math.min(EXCEPTION_MAX_LENGTH, baos.size()));
             sLatinImeLogger.sendLogToDropBox(
                     ID_EXCEPTION, new String[] {metaData, exceptionString});
-            if (DBG) {
+            if (sDBG) {
                 Log.e(TAG, "Exception: " + new String(baos.toByteArray()));
             }
             if (SUPPRESS_EXCEPTION) {
@@ -659,4 +665,18 @@
             length = 0;
         }
     }
+
+    private static class DebugKeyEnabler {
+        private int mCounter = 0;
+        private long mLastTime = 0;
+        public boolean check() {
+            if (System.currentTimeMillis() - mLastTime > 10 * 1000) {
+                mCounter = 0;
+                mLastTime = System.currentTimeMillis();
+            } else if (++mCounter >= 10) {
+                return true;
+            }
+            return false;
+        }
+    }
 }