diff options
4 files changed, 118 insertions, 5 deletions
diff --git a/api/current.xml b/api/current.xml index 86ed7b8..1ca51c2 100644 --- a/api/current.xml +++ b/api/current.xml @@ -218267,6 +218267,17 @@ <parameter name="completions" type="android.view.inputmethod.CompletionInfo[]"> </parameter> </method> +<method name="getCurrentInputMethodSubtype" + return="android.view.inputmethod.InputMethodSubtype" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> <method name="getEnabledInputMethodList" return="java.util.List<android.view.inputmethod.InputMethodInfo>" abstract="false" diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index 8e355d6..7cb6291 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -33,6 +33,7 @@ import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.ViewRoot; +import android.view.inputmethod.InputMethodSubtype; import com.android.internal.os.HandlerCaller; import com.android.internal.view.IInputConnectionWrapper; @@ -1411,6 +1412,17 @@ public final class InputMethodManager { } } + public InputMethodSubtype getCurrentInputMethodSubtype() { + synchronized (mH) { + try { + return mService.getCurrentInputMethodSubtype(); + } catch (RemoteException e) { + Log.w(TAG, "IME died: " + mCurId, e); + return null; + } + } + } + void doDump(FileDescriptor fd, PrintWriter fout, String[] args) { final Printer p = new PrintWriterPrinter(fout); p.println("Input method client state for " + this + ":"); diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl index bffec1d..49ae2bc 100644 --- a/core/java/com/android/internal/view/IInputMethodManager.aidl +++ b/core/java/com/android/internal/view/IInputMethodManager.aidl @@ -18,6 +18,7 @@ package com.android.internal.view; import android.os.ResultReceiver; import android.view.inputmethod.InputMethodInfo; +import android.view.inputmethod.InputMethodSubtype; import android.view.inputmethod.EditorInfo; import com.android.internal.view.InputBindResult; import com.android.internal.view.IInputContext; @@ -54,6 +55,7 @@ interface IInputMethodManager { void hideMySoftInput(in IBinder token, int flags); void showMySoftInput(in IBinder token, int flags); void updateStatusIcon(in IBinder token, String packageName, int iconId); + InputMethodSubtype getCurrentInputMethodSubtype(); boolean setInputMethodEnabled(String id, boolean enabled); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java index ba682b7..56b4f24 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodButton.java @@ -17,25 +17,38 @@ package com.android.systemui.statusbar.tablet; import android.content.Context; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.provider.Settings; +import android.util.Log; import android.util.Slog; -import android.view.View; import android.util.AttributeSet; -import android.widget.ImageView; +import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; +import android.view.inputmethod.InputMethodSubtype; +import android.view.View; +import android.widget.ImageView; import com.android.server.InputMethodManagerService; +import com.android.systemui.R; + +import java.util.List; public class InputMethodButton extends ImageView { + private static final String TAG = "StatusBar/InputMethodButton"; + + private boolean mKeyboardShown; + private ImageView mIcon; // other services we wish to talk to - InputMethodManager mImm; + private InputMethodManager mImm; public InputMethodButton(Context context, AttributeSet attrs) { super(context, attrs); + mKeyboardShown = false; // IME hookup mImm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - // TODO: read the current icon & visibility state directly from the service // TODO: register for notifications about changes to visibility & subtype from service @@ -47,5 +60,80 @@ public class InputMethodButton extends ImageView { } }); } -} + protected void onAttachedToWindow() { + mIcon = (ImageView) findViewById(R.id.imeButton); + refreshStatusIcon(mKeyboardShown); + } + + private InputMethodInfo getCurrentInputMethodInfo() { + String curInputMethodId = Settings.Secure.getString(getContext() + .getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD); + List<InputMethodInfo> imis = mImm.getEnabledInputMethodList(); + if (curInputMethodId != null) { + for (InputMethodInfo imi: imis) { + if (imi.getId().equals(curInputMethodId)) { + return imi; + } + } + } + return null; + } + + private Drawable getCurrentSubtypeIcon() { + final PackageManager pm = getContext().getPackageManager(); + InputMethodInfo imi = getCurrentInputMethodInfo(); + InputMethodSubtype subtype = mImm.getCurrentInputMethodSubtype(); + Drawable icon = null; + if (imi != null) { + if (subtype != null) { + return pm.getDrawable(imi.getPackageName(), subtype.getIconResId(), + imi.getServiceInfo().applicationInfo); + } else if (imi.getSubtypes().size() > 0) { + return pm.getDrawable(imi.getPackageName(), + imi.getSubtypes().get(0).getIconResId(), + imi.getServiceInfo().applicationInfo); + } else { + try { + return pm.getApplicationInfo(imi.getPackageName(), 0).loadIcon(pm); + } catch (PackageManager.NameNotFoundException e) { + Log.w(TAG, "Current IME cann't be found: " + imi.getPackageName()); + } + } + } + return null; + } + + private void refreshStatusIcon(boolean keyboardShown) { + if (!keyboardShown) { + setVisibility(View.INVISIBLE); + return; + } else { + setVisibility(View.VISIBLE); + } + Drawable icon = getCurrentSubtypeIcon(); + if (icon == null) { + mIcon.setImageResource(R.drawable.ic_sysbar_ime_default); + } else { + mIcon.setImageDrawable(icon); + } + } + + private void postRefreshStatusIcon() { + getHandler().post(new Runnable() { + public void run() { + refreshStatusIcon(mKeyboardShown); + } + }); + } + + public void showSoftInput() { + mKeyboardShown = true; + postRefreshStatusIcon(); + } + + public void hideSoftInput() { + mKeyboardShown = false; + postRefreshStatusIcon(); + } +} |