aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java
diff options
context:
space:
mode:
authorTadashi G. Takaoka <takaoka@google.com>2011-07-17 21:18:47 -0700
committerTadashi G. Takaoka <takaoka@google.com>2011-07-19 22:22:47 -0700
commitbf9d8348d89be257ccc3db75333bfd4cdf0a9b7e (patch)
tree8d385533c9f19024c9c8ad392245ee866ac7245f /java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java
parentfa9f4d1badee67ceb581391dfab2202e4ccb99c0 (diff)
downloadlatinime-bf9d8348d89be257ccc3db75333bfd4cdf0a9b7e.tar.gz
latinime-bf9d8348d89be257ccc3db75333bfd4cdf0a9b7e.tar.xz
latinime-bf9d8348d89be257ccc3db75333bfd4cdf0a9b7e.zip
Support select input method dialog on pre-HC platform
Bug: 4971680 Change-Id: I641b336da54813e13409bd7874aa22e51f790729
Diffstat (limited to 'java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java')
-rw-r--r--java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java130
1 files changed, 111 insertions, 19 deletions
diff --git a/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java b/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java
index 1cc13f249..51dc4cd37 100644
--- a/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java
+++ b/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java
@@ -16,21 +16,28 @@
package com.android.inputmethod.compat;
-import com.android.inputmethod.deprecated.LanguageSwitcherProxy;
-import com.android.inputmethod.latin.LatinIME;
-import com.android.inputmethod.latin.SubtypeSwitcher;
-import com.android.inputmethod.latin.Utils;
-
+import android.app.AlertDialog;
import android.content.Context;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
import android.os.IBinder;
import android.text.TextUtils;
import android.util.Log;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
+import com.android.inputmethod.deprecated.LanguageSwitcherProxy;
+import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.SubtypeSwitcher;
+import com.android.inputmethod.latin.Utils;
+
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
@@ -72,27 +79,27 @@ public class InputMethodManagerCompatWrapper {
private static final String VOICE_MODE = "voice";
private static final String KEYBOARD_MODE = "keyboard";
+ private InputMethodServiceCompatWrapper mService;
private InputMethodManager mImm;
+ private PackageManager mPackageManager;
+ private ApplicationInfo mApplicationInfo;
private LanguageSwitcherProxy mLanguageSwitcherProxy;
private String mLatinImePackageName;
- private InputMethodManagerCompatWrapper() {
- }
-
- public static InputMethodManagerCompatWrapper getInstance(Context context) {
- if (sInstance.mImm == null) {
- sInstance.init(context);
- }
+ public static InputMethodManagerCompatWrapper getInstance() {
+ if (sInstance.mImm == null)
+ Log.w(TAG, "getInstance() is called before initialization");
return sInstance;
}
- private synchronized void init(Context context) {
- mImm = (InputMethodManager) context.getSystemService(
+ public static void init(InputMethodServiceCompatWrapper service) {
+ sInstance.mService = service;
+ sInstance.mImm = (InputMethodManager) service.getSystemService(
Context.INPUT_METHOD_SERVICE);
- if (context instanceof LatinIME) {
- mLatinImePackageName = context.getPackageName();
- }
- mLanguageSwitcherProxy = LanguageSwitcherProxy.getInstance();
+ sInstance.mLatinImePackageName = service.getPackageName();
+ sInstance.mPackageManager = service.getPackageManager();
+ sInstance.mApplicationInfo = service.getApplicationInfo();
+ sInstance.mLanguageSwitcherProxy = LanguageSwitcherProxy.getInstance();
}
public InputMethodSubtypeCompatWrapper getCurrentInputMethodSubtype() {
@@ -196,11 +203,15 @@ public class InputMethodManagerCompatWrapper {
return shortcutMap;
}
+ // We don't call this method when we switch between subtypes within this IME.
public void setInputMethodAndSubtype(
IBinder token, String id, InputMethodSubtypeCompatWrapper subtype) {
+ // TODO: Support subtype change on non-subtype-supported platform.
if (subtype != null && subtype.hasOriginalObject()) {
CompatUtils.invoke(mImm, null, METHOD_setInputMethodAndSubtype,
token, id, subtype.getOriginalObject());
+ } else {
+ mImm.setInputMethod(token, id);
}
}
@@ -222,6 +233,87 @@ public class InputMethodManagerCompatWrapper {
public void showInputMethodPicker() {
if (mImm == null) return;
- mImm.showInputMethodPicker();
+ if (SUBTYPE_SUPPORTED) {
+ mImm.showInputMethodPicker();
+ return;
+ }
+
+ // The code below are based on {@link InputMethodManager#showInputMethodMenuInternal}.
+
+ final InputMethodInfoCompatWrapper myImi = Utils.getInputMethodInfo(
+ this, mLatinImePackageName);
+ final List<InputMethodSubtypeCompatWrapper> myImsList = getEnabledInputMethodSubtypeList(
+ myImi, true);
+ final InputMethodSubtypeCompatWrapper currentIms = getCurrentInputMethodSubtype();
+ final List<InputMethodInfoCompatWrapper> imiList = getEnabledInputMethodList();
+ imiList.remove(myImi);
+ Collections.sort(imiList, new Comparator<InputMethodInfoCompatWrapper>() {
+ @Override
+ public int compare(InputMethodInfoCompatWrapper imi1,
+ InputMethodInfoCompatWrapper imi2) {
+ final CharSequence imiId1 = imi1.loadLabel(mPackageManager) + "/" + imi1.getId();
+ final CharSequence imiId2 = imi2.loadLabel(mPackageManager) + "/" + imi2.getId();
+ return imiId1.toString().compareTo(imiId2.toString());
+ }
+ });
+
+ final int myImsCount = myImsList.size();
+ final int imiCount = imiList.size();
+ final CharSequence[] items = new CharSequence[myImsCount + imiCount];
+
+ int checkedItem = 0;
+ int index = 0;
+ final CharSequence myImiLabel = myImi.loadLabel(mPackageManager);
+ for (int i = 0; i < myImsCount; i++) {
+ InputMethodSubtypeCompatWrapper ims = myImsList.get(i);
+ if (currentIms.equals(ims))
+ checkedItem = index;
+ final CharSequence title = TextUtils.concat(
+ ims.getDisplayName(mService, mLatinImePackageName, mApplicationInfo),
+ " (" + myImiLabel, ")");
+ items[index] = title;
+ index++;
+ }
+
+ for (int i = 0; i < imiCount; i++) {
+ final InputMethodInfoCompatWrapper imi = imiList.get(i);
+ final CharSequence title = imi.loadLabel(mPackageManager);
+ items[index] = title;
+ index++;
+ }
+
+ final OnClickListener buttonListener = new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface di, int whichButton) {
+ final Intent intent = new Intent("android.settings.INPUT_METHOD_SETTINGS");
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
+ | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ mService.startActivity(intent);
+ }
+ };
+ final InputMethodServiceCompatWrapper service = mService;
+ final IBinder token = service.getWindow().getWindow().getAttributes().token;
+ final OnClickListener selectionListener = new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface di, int which) {
+ di.dismiss();
+ if (which < myImsCount) {
+ final int imsIndex = which;
+ final InputMethodSubtypeCompatWrapper ims = myImsList.get(imsIndex);
+ service.notifyOnCurrentInputMethodSubtypeChanged(ims);
+ } else {
+ final int imiIndex = which - myImsCount;
+ final InputMethodInfoCompatWrapper imi = imiList.get(imiIndex);
+ setInputMethodAndSubtype(token, imi.getId(), null);
+ }
+ }
+ };
+
+ final AlertDialog.Builder builder = new AlertDialog.Builder(mService)
+ .setTitle(mService.getString(R.string.selectInputMethod))
+ .setNeutralButton(R.string.configure_input_method, buttonListener)
+ .setSingleChoiceItems(items, checkedItem, selectionListener);
+ mService.showOptionDialogInternal(builder.create());
}
}