| /* |
| * 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. |
| */ |
| |
| /** |
| * 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); |
| } |
| } |
| } |
| } |