Merge "Some refactoring"
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index 6c597cf..efc32a7 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -25,6 +25,9 @@
     <!-- Title for Latin keyboard input options dialog [CHAR LIMIT=25] -->
     <string name="english_ime_input_options">Input options</string>
 
+    <!-- Title for Latin Keyboard spell checker service -->
+    <string name="spell_checker_service_name">Android correction</string>
+
     <!-- Option to provide vibrate/haptic feedback on keypress -->
     <string name="vibrate_on_keypress">Vibrate on keypress</string>
 
diff --git a/java/res/xml-ar/kbd_qwerty.xml b/java/res/xml-ar/kbd_qwerty.xml
index 57a6d2c..b26a938 100644
--- a/java/res/xml-ar/kbd_qwerty.xml
+++ b/java/res/xml-ar/kbd_qwerty.xml
@@ -21,6 +21,7 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardLocale="ar"
+    latin:isRtlKeyboard="true"
 >
     <include
         latin:keyboardLayout="@xml/kbd_rows_arabic" />
diff --git a/java/res/xml-iw/kbd_qwerty.xml b/java/res/xml-iw/kbd_qwerty.xml
index dc2c5d3..54cd4b5 100644
--- a/java/res/xml-iw/kbd_qwerty.xml
+++ b/java/res/xml-iw/kbd_qwerty.xml
@@ -21,6 +21,7 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyboardLocale="iw"
+    latin:isRtlKeyboard="true"
 >
     <include
         latin:keyboardLayout="@xml/kbd_rows_hebrew" />
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index 8b8930a..0ee8d71 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -159,6 +159,8 @@
     private static final Map<Integer, Integer> sRtlParenthesisMap = new HashMap<Integer, Integer>();
 
     static {
+        // The all letters need to be mirrored are found at
+        // http://www.unicode.org/Public/6.0.0/ucd/extracted/DerivedBinaryProperties.txt
         addRtlParenthesisPair('(', ')');
         addRtlParenthesisPair('[', ']');
         addRtlParenthesisPair('{', '}');
@@ -179,7 +181,7 @@
         sRtlParenthesisMap.put(right, left);
     }
 
-    private static int getRtlParenthesisCode(int code) {
+    public static int getRtlParenthesisCode(int code) {
         if (sRtlParenthesisMap.containsKey(code)) {
             return sRtlParenthesisMap.get(code);
         } else {
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 3457ac9..a8118e5 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -60,6 +60,7 @@
 import com.android.inputmethod.deprecated.LanguageSwitcherProxy;
 import com.android.inputmethod.deprecated.VoiceProxy;
 import com.android.inputmethod.deprecated.recorrection.Recorrection;
+import com.android.inputmethod.keyboard.Key;
 import com.android.inputmethod.keyboard.Keyboard;
 import com.android.inputmethod.keyboard.KeyboardActionListener;
 import com.android.inputmethod.keyboard.KeyboardSwitcher;
@@ -1695,7 +1696,12 @@
             // for punctuation entered through the suggestion strip, it should be considered
             // a magic space even if it was a normal space. This is meant to help in case the user
             // pressed space on purpose of displaying the suggestion strip punctuation.
-            final char primaryCode = suggestion.charAt(0);
+            final int rawPrimaryCode = suggestion.charAt(0);
+            // Maybe apply the "bidi mirrored" conversions for parentheses
+            final LatinKeyboard keyboard = mKeyboardSwitcher.getLatinKeyboard();
+            final int primaryCode = keyboard.isRtlKeyboard()
+                    ? Key.getRtlParenthesisCode(rawPrimaryCode) : rawPrimaryCode;
+
             final CharSequence beforeText = ic != null ? ic.getTextBeforeCursor(1, 0) : "";
             final int toLeft = (ic == null || TextUtils.isEmpty(beforeText))
                     ? 0 : beforeText.charAt(0);
diff --git a/java/src/com/android/inputmethod/latin/Settings.java b/java/src/com/android/inputmethod/latin/Settings.java
index b6171d2..6a48371 100644
--- a/java/src/com/android/inputmethod/latin/Settings.java
+++ b/java/src/com/android/inputmethod/latin/Settings.java
@@ -183,11 +183,11 @@
 
             mUseContactsDict = prefs.getBoolean(Settings.PREF_KEY_USE_CONTACTS_DICT, true);
 
-            final String voiceMode = prefs.getString(PREF_VOICE_SETTINGS_KEY, null);
-            mVoiceButtonEnabled = voiceMode != null && !voiceMode.equals(
-                    res.getString(R.string.voice_mode_off));
-            mVoiceButtonOnPrimary = voiceMode != null && voiceMode.equals(
-                    res.getString(R.string.voice_mode_main));
+            final String voiceModeMain = res.getString(R.string.voice_mode_main);
+            final String voiceModeOff = res.getString(R.string.voice_mode_off);
+            final String voiceMode = prefs.getString(PREF_VOICE_SETTINGS_KEY, voiceModeMain);
+            mVoiceButtonEnabled = voiceMode != null && !voiceMode.equals(voiceModeOff);
+            mVoiceButtonOnPrimary = voiceMode != null && voiceMode.equals(voiceModeMain);
 
             Utils.setSystemLocale(res, savedLocale);
         }
diff --git a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
index 6580cbc..f10b1b8 100644
--- a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
@@ -361,13 +361,17 @@
     }
 
     public boolean isShortcutImeEnabled() {
-        if (mShortcutInputMethodInfo == null)
+        if (mShortcutInputMethodInfo == null) {
             return false;
-        if (mShortcutSubtype == null)
+        }
+        if (mShortcutSubtype == null) {
             return true;
+        }
         // For compatibility, if the shortcut subtype is dummy, we assume the shortcut IME
         // (built-in voice dummy subtype) is available.
-        if (!mShortcutSubtype.hasOriginalObject()) return true;
+        if (!mShortcutSubtype.hasOriginalObject()) {
+            return true;
+        }
         final boolean allowsImplicitlySelectedSubtypes = true;
         for (final InputMethodSubtypeCompatWrapper enabledSubtype :
                 mImm.getEnabledInputMethodSubtypeList(
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
new file mode 100644
index 0000000..156510b
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2011 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.spellcheck;
+
+import android.service.textservice.SpellCheckerService;
+import android.view.textservice.SuggestionsInfo;
+import android.view.textservice.TextInfo;
+
+/**
+ * Service for spell checking, using LatinIME's dictionaries and mechanisms.
+ */
+public class AndroidSpellCheckerService extends SpellCheckerService {
+    @Override
+    public SuggestionsInfo getSuggestions(TextInfo textInfo, int suggestionsLimit,
+            String locale) {
+        // TODO: implement this
+        String[] candidates = new String[] {"candidate1", "candidate2", "candidate3"};
+        return new SuggestionsInfo(0, candidates);
+    }
+}