The file containing the source code shown below is located in the corresponding directory in <sdk>/samples/android-<version>/...
/* * Copyright (C) 2011 The Android开源工程 * * 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. */ /** * This is a part of the inputmethod-common static Java library. * The original source code can be found at frameworks/opt/inputmethodcommon of Android Open Source * Project. */ package com.android.inputmethodcommon; import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; import android.preference.Preference; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceScreen; import android.provider.Settings; import android.text.TextUtils; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodSubtype; import java.util.List; /* package private */ class InputMethodSettingsImpl implements InputMethodSettingsInterface { private Preference mSubtypeEnablerPreference; private int mInputMethodSettingsCategoryTitleRes; private CharSequence mInputMethodSettingsCategoryTitle; private int mSubtypeEnablerTitleRes; private CharSequence mSubtypeEnablerTitle; private int mSubtypeEnablerIconRes; private Drawable mSubtypeEnablerIcon; private InputMethodManager mImm; private InputMethodInfo mImi; private Context mContext; /** * Initialize internal states of this object. * @param context the context for this application. * @param prefScreen a PreferenceScreen of PreferenceActivity or PreferenceFragment. * @return true if this application is an IME and has two or more subtypes, false otherwise. */ public boolean init(final Context context, final PreferenceScreen prefScreen) { mContext = context; mImm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); mImi = getMyImi(context, mImm); if (mImi == null || mImi.getSubtypeCount() <= 1) { return false; } mSubtypeEnablerPreference = new Preference(context); mSubtypeEnablerPreference .setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { final CharSequence title = getSubtypeEnablerTitle(context); final Intent intent = new Intent(Settings.ACTION_INPUT_METHOD_SUBTYPE_SETTINGS); intent.putExtra(Settings.EXTRA_INPUT_METHOD_ID, mImi.getId()); if (!TextUtils.isEmpty(title)) { intent.putExtra(Intent.EXTRA_TITLE, title); } intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | Intent.FLAG_ACTIVITY_CLEAR_TOP); context.startActivity(intent); return true; } }); prefScreen.addPreference(mSubtypeEnablerPreference); updateSubtypeEnabler(); return true; } private static InputMethodInfo getMyImi(Context context, InputMethodManager imm) { final List<InputMethodInfo> imis = imm.getInputMethodList(); for (int i = 0; i < imis.size(); ++i) { final InputMethodInfo imi = imis.get(i); if (imis.get(i).getPackageName().equals(context.getPackageName())) { return imi; } } return null; } private static String getEnabledSubtypesLabel( Context context, InputMethodManager imm, InputMethodInfo imi) { if (context == null || imm == null || imi == null) return null; final List<InputMethodSubtype> subtypes = imm.getEnabledInputMethodSubtypeList(imi, true); final StringBuilder sb = new StringBuilder(); final int N = subtypes.size(); for (int i = 0; i < N; ++i) { final InputMethodSubtype subtype = subtypes.get(i); if (sb.length() > 0) { sb.append(", "); } sb.append(subtype.getDisplayName(context, imi.getPackageName(), imi.getServiceInfo().applicationInfo)); } return sb.toString(); } /** * {@inheritDoc} */ @Override public void setInputMethodSettingsCategoryTitle(int resId) { mInputMethodSettingsCategoryTitleRes = resId; updateSubtypeEnabler(); } /** * {@inheritDoc} */ @Override public void setInputMethodSettingsCategoryTitle(CharSequence title) { mInputMethodSettingsCategoryTitleRes = 0; mInputMethodSettingsCategoryTitle = title; updateSubtypeEnabler(); } /** * {@inheritDoc} */ @Override public void setSubtypeEnablerTitle(int resId) { mSubtypeEnablerTitleRes = resId; updateSubtypeEnabler(); } /** * {@inheritDoc} */ @Override public void setSubtypeEnablerTitle(CharSequence title) { mSubtypeEnablerTitleRes = 0; mSubtypeEnablerTitle = title; updateSubtypeEnabler(); } /** * {@inheritDoc} */ @Override public void setSubtypeEnablerIcon(int resId) { mSubtypeEnablerIconRes = resId; updateSubtypeEnabler(); } /** * {@inheritDoc} */ @Override public void setSubtypeEnablerIcon(Drawable drawable) { mSubtypeEnablerIconRes = 0; mSubtypeEnablerIcon = drawable; updateSubtypeEnabler(); } private CharSequence getSubtypeEnablerTitle(Context context) { if (mSubtypeEnablerTitleRes != 0) { return context.getString(mSubtypeEnablerTitleRes); } else { return mSubtypeEnablerTitle; } } public void updateSubtypeEnabler() { if (mSubtypeEnablerPreference != null) { if (mSubtypeEnablerTitleRes != 0) { mSubtypeEnablerPreference.setTitle(mSubtypeEnablerTitleRes); } else if (!TextUtils.isEmpty(mSubtypeEnablerTitle)) { mSubtypeEnablerPreference.setTitle(mSubtypeEnablerTitle); } final String summary = getEnabledSubtypesLabel(mContext, mImm, mImi); if (!TextUtils.isEmpty(summary)) { mSubtypeEnablerPreference.setSummary(summary); } if (mSubtypeEnablerIconRes != 0) { mSubtypeEnablerPreference.setIcon(mSubtypeEnablerIconRes); } else if (mSubtypeEnablerIcon != null) { mSubtypeEnablerPreference.setIcon(mSubtypeEnablerIcon); } } } }