aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android/inputmethod/latin/LatinIME.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/src/com/android/inputmethod/latin/LatinIME.java')
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIME.java56
1 files changed, 54 insertions, 2 deletions
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 25a5de250..1764ded8c 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -30,8 +30,10 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Configuration;
import android.content.res.Resources;
+import android.graphics.Color;
import android.inputmethodservice.InputMethodService;
import android.media.AudioManager;
+import android.os.Build;
import android.os.Debug;
import android.os.IBinder;
import android.os.Message;
@@ -53,7 +55,10 @@ import android.view.inputmethod.InputMethodSubtype;
import com.android.inputmethod.accessibility.AccessibilityUtils;
import com.android.inputmethod.annotations.UsedForTesting;
+import com.android.inputmethod.compat.BuildCompatUtils;
+import com.android.inputmethod.compat.EditorInfoCompatUtils;
import com.android.inputmethod.compat.InputMethodServiceCompatUtils;
+import com.android.inputmethod.compat.InputMethodSubtypeCompatUtils;
import com.android.inputmethod.compat.ViewOutlineProviderCompatUtils;
import com.android.inputmethod.compat.ViewOutlineProviderCompatUtils.InsetsUpdater;
import com.android.inputmethod.dictionarypack.DictionaryPackConstants;
@@ -175,8 +180,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
private static final int MSG_WAIT_FOR_DICTIONARY_LOAD = 8;
private static final int MSG_DEALLOCATE_MEMORY = 9;
private static final int MSG_RESUME_SUGGESTIONS_FOR_START_INPUT = 10;
+ private static final int MSG_SWITCH_LANGUAGE_AUTOMATICALLY = 11;
// Update this when adding new messages
- private static final int MSG_LAST = MSG_RESUME_SUGGESTIONS_FOR_START_INPUT;
+ private static final int MSG_LAST = MSG_SWITCH_LANGUAGE_AUTOMATICALLY;
private static final int ARG1_NOT_GESTURE_INPUT = 0;
private static final int ARG1_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT = 1;
@@ -270,6 +276,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
case MSG_DEALLOCATE_MEMORY:
latinIme.deallocateMemory();
break;
+ case MSG_SWITCH_LANGUAGE_AUTOMATICALLY:
+ latinIme.switchLanguage((InputMethodSubtype)msg.obj);
+ break;
}
}
@@ -388,6 +397,10 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
obtainMessage(MSG_UPDATE_TAIL_BATCH_INPUT_COMPLETED, suggestedWords).sendToTarget();
}
+ public void postSwitchLanguage(final InputMethodSubtype subtype) {
+ obtainMessage(MSG_SWITCH_LANGUAGE_AUTOMATICALLY, subtype).sendToTarget();
+ }
+
// Working variables for the following methods.
private boolean mIsOrientationChanging;
private boolean mPendingSuccessiveImsCallback;
@@ -703,7 +716,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
private boolean isImeSuppressedByHardwareKeyboard() {
final KeyboardSwitcher switcher = KeyboardSwitcher.getInstance();
- return switcher.isImeSuppressedByHardwareKeyboard(
+ return !onEvaluateInputViewShown() && switcher.isImeSuppressedByHardwareKeyboard(
mSettings.getCurrent(), switcher.getKeyboardSwitchState());
}
@@ -794,6 +807,19 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
void onStartInputInternal(final EditorInfo editorInfo, final boolean restarting) {
super.onStartInput(editorInfo, restarting);
+
+ // If the primary hint language does not match the current subtype language, then try
+ // to switch to the primary hint language.
+ // TODO: Support all the locales in EditorInfo#hintLocales.
+ final Locale primaryHintLocale = EditorInfoCompatUtils.getPrimaryHintLocale(editorInfo);
+ if (primaryHintLocale == null) {
+ return;
+ }
+ final InputMethodSubtype newSubtype = mRichImm.findSubtypeByLocale(primaryHintLocale);
+ if (newSubtype == null || newSubtype.equals(mRichImm.getCurrentSubtype().getRawSubtype())) {
+ return;
+ }
+ mHandler.postSwitchLanguage(newSubtype);
}
@SuppressWarnings("deprecation")
@@ -968,12 +994,19 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
}
@Override
+ public void onWindowShown() {
+ super.onWindowShown();
+ setNavigationBarVisibility(isInputViewShown());
+ }
+
+ @Override
public void onWindowHidden() {
super.onWindowHidden();
final MainKeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView();
if (mainKeyboardView != null) {
mainKeyboardView.closing();
}
+ setNavigationBarVisibility(false);
}
void onFinishInputInternal() {
@@ -1293,6 +1326,11 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
return mOptionsDialog != null && mOptionsDialog.isShowing();
}
+ public void switchLanguage(final InputMethodSubtype subtype) {
+ final IBinder token = getWindow().getWindow().getAttributes().token;
+ mRichImm.setInputMethodAndSubtype(token, subtype);
+ }
+
// TODO: Revise the language switch key behavior to make it much smarter and more reasonable.
public void switchToNextSubtype() {
final IBinder token = getWindow().getWindow().getAttributes().token;
@@ -1650,6 +1688,11 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
// Hooks for hardware keyboard
@Override
public boolean onKeyDown(final int keyCode, final KeyEvent keyEvent) {
+ if (mEmojiAltPhysicalKeyDetector == null) {
+ mEmojiAltPhysicalKeyDetector = new EmojiAltPhysicalKeyDetector(
+ getApplicationContext().getResources());
+ }
+ mEmojiAltPhysicalKeyDetector.onKeyDown(keyEvent);
if (!ProductionFlags.IS_HARDWARE_KEYBOARD_SUPPORTED) {
return super.onKeyDown(keyCode, keyEvent);
}
@@ -1865,4 +1908,13 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
}
return mRichImm.shouldOfferSwitchingToNextInputMethod(token, fallbackValue);
}
+
+ private void setNavigationBarVisibility(final boolean visible) {
+ if (BuildCompatUtils.EFFECTIVE_SDK_INT > Build.VERSION_CODES.M) {
+ // For N and later, IMEs can specify Color.TRANSPARENT to make the navigation bar
+ // transparent. For other colors the system uses the default color.
+ getWindow().getWindow().setNavigationBarColor(
+ visible ? Color.BLACK : Color.TRANSPARENT);
+ }
+ }
}