121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok/*
221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * Copyright (C) 2011 The Android Open Source Project
321f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok *
421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * Licensed under the Apache License, Version 2.0 (the "License");
521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * you may not use this file except in compliance with the License.
621f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * You may obtain a copy of the License at
721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok *
821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok *      http://www.apache.org/licenses/LICENSE-2.0
921f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok *
1021f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * Unless required by applicable law or agreed to in writing, software
1121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * distributed under the License is distributed on an "AS IS" BASIS,
1221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1321f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * See the License for the specific language governing permissions and
1421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok * limitations under the License.
1521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok */
16c9a877174c6ba3552c1a6e396509f8d08049a3f6satok
1721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokpackage com.android.inputmethodcommon;
1821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok
1921f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokimport android.content.Context;
207e44cbb2e86854abe3cf61adbef92363c98bebbasatokimport android.content.Intent;
2121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokimport android.graphics.drawable.Drawable;
2221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokimport android.preference.Preference;
2321f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokimport android.preference.Preference.OnPreferenceClickListener;
2421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokimport android.preference.PreferenceScreen;
2521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokimport android.provider.Settings;
2621f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokimport android.text.TextUtils;
2721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokimport android.view.inputmethod.InputMethodInfo;
2821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokimport android.view.inputmethod.InputMethodManager;
29f3320979f6d3b63686f15cedae65bba144643e25satokimport android.view.inputmethod.InputMethodSubtype;
3021f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok
3121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatokimport java.util.List;
3221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok
33c9a877174c6ba3552c1a6e396509f8d08049a3f6satok/* package private */ class InputMethodSettingsImpl implements InputMethodSettingsInterface {
3421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    private Preference mSubtypeEnablerPreference;
3521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    private int mInputMethodSettingsCategoryTitleRes;
3621f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    private CharSequence mInputMethodSettingsCategoryTitle;
3721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    private int mSubtypeEnablerTitleRes;
3821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    private CharSequence mSubtypeEnablerTitle;
3921f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    private int mSubtypeEnablerIconRes;
4021f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    private Drawable mSubtypeEnablerIcon;
41f3320979f6d3b63686f15cedae65bba144643e25satok    private InputMethodManager mImm;
42f3320979f6d3b63686f15cedae65bba144643e25satok    private InputMethodInfo mImi;
43f3320979f6d3b63686f15cedae65bba144643e25satok    private Context mContext;
4421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok
45c9a877174c6ba3552c1a6e396509f8d08049a3f6satok    /**
46c9a877174c6ba3552c1a6e396509f8d08049a3f6satok     * Initialize internal states of this object.
47c9a877174c6ba3552c1a6e396509f8d08049a3f6satok     * @param context the context for this application.
48c9a877174c6ba3552c1a6e396509f8d08049a3f6satok     * @param prefScreen a PreferenceScreen of PreferenceActivity or PreferenceFragment.
49c9a877174c6ba3552c1a6e396509f8d08049a3f6satok     * @return true if this application is an IME and has two or more subtypes, false otherwise.
50c9a877174c6ba3552c1a6e396509f8d08049a3f6satok     */
51c9a877174c6ba3552c1a6e396509f8d08049a3f6satok    public boolean init(final Context context, final PreferenceScreen prefScreen) {
52f3320979f6d3b63686f15cedae65bba144643e25satok        mContext = context;
53f3320979f6d3b63686f15cedae65bba144643e25satok        mImm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
54f3320979f6d3b63686f15cedae65bba144643e25satok        mImi = getMyImi(context, mImm);
55f3320979f6d3b63686f15cedae65bba144643e25satok        if (mImi == null || mImi.getSubtypeCount() <= 1) {
56c9a877174c6ba3552c1a6e396509f8d08049a3f6satok            return false;
5721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        }
58c9a877174c6ba3552c1a6e396509f8d08049a3f6satok        mSubtypeEnablerPreference = new Preference(context);
59c9a877174c6ba3552c1a6e396509f8d08049a3f6satok        mSubtypeEnablerPreference
60c9a877174c6ba3552c1a6e396509f8d08049a3f6satok                .setOnPreferenceClickListener(new OnPreferenceClickListener() {
61c9a877174c6ba3552c1a6e396509f8d08049a3f6satok                    @Override
62c9a877174c6ba3552c1a6e396509f8d08049a3f6satok                    public boolean onPreferenceClick(Preference preference) {
63010474f42b9b60af32f3f7ca0d34d34642f10f60satok                        final CharSequence title = getSubtypeEnablerTitle(context);
64c9a877174c6ba3552c1a6e396509f8d08049a3f6satok                        final Intent intent =
65c9a877174c6ba3552c1a6e396509f8d08049a3f6satok                                new Intent(Settings.ACTION_INPUT_METHOD_SUBTYPE_SETTINGS);
66f3320979f6d3b63686f15cedae65bba144643e25satok                        intent.putExtra(Settings.EXTRA_INPUT_METHOD_ID, mImi.getId());
67010474f42b9b60af32f3f7ca0d34d34642f10f60satok                        if (!TextUtils.isEmpty(title)) {
68010474f42b9b60af32f3f7ca0d34d34642f10f60satok                            intent.putExtra(Intent.EXTRA_TITLE, title);
69010474f42b9b60af32f3f7ca0d34d34642f10f60satok                        }
70c9a877174c6ba3552c1a6e396509f8d08049a3f6satok                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
71c9a877174c6ba3552c1a6e396509f8d08049a3f6satok                                | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
72c9a877174c6ba3552c1a6e396509f8d08049a3f6satok                                | Intent.FLAG_ACTIVITY_CLEAR_TOP);
73c9a877174c6ba3552c1a6e396509f8d08049a3f6satok                        context.startActivity(intent);
74c9a877174c6ba3552c1a6e396509f8d08049a3f6satok                        return true;
75c9a877174c6ba3552c1a6e396509f8d08049a3f6satok                    }
76c9a877174c6ba3552c1a6e396509f8d08049a3f6satok                });
779ce9a5482a8bcf542c5e81f50d385f707e7085d1satok        prefScreen.addPreference(mSubtypeEnablerPreference);
7821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        updateSubtypeEnabler();
79c9a877174c6ba3552c1a6e396509f8d08049a3f6satok        return true;
8021f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    }
8121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok
82c9a877174c6ba3552c1a6e396509f8d08049a3f6satok    private static InputMethodInfo getMyImi(Context context, InputMethodManager imm) {
8321f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        final List<InputMethodInfo> imis = imm.getInputMethodList();
8421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        for (int i = 0; i < imis.size(); ++i) {
8521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok            final InputMethodInfo imi = imis.get(i);
86c9a877174c6ba3552c1a6e396509f8d08049a3f6satok            if (imis.get(i).getPackageName().equals(context.getPackageName())) {
8721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok                return imi;
8821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok            }
8921f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        }
9021f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        return null;
9121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    }
9221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok
93f3320979f6d3b63686f15cedae65bba144643e25satok    private static String getEnabledSubtypesLabel(
94f3320979f6d3b63686f15cedae65bba144643e25satok            Context context, InputMethodManager imm, InputMethodInfo imi) {
95f3320979f6d3b63686f15cedae65bba144643e25satok        if (context == null || imm == null || imi == null) return null;
96f3320979f6d3b63686f15cedae65bba144643e25satok        final List<InputMethodSubtype> subtypes = imm.getEnabledInputMethodSubtypeList(imi, true);
97f3320979f6d3b63686f15cedae65bba144643e25satok        final StringBuilder sb = new StringBuilder();
98f3320979f6d3b63686f15cedae65bba144643e25satok        final int N = subtypes.size();
99f3320979f6d3b63686f15cedae65bba144643e25satok        for (int i = 0; i < N; ++i) {
100f3320979f6d3b63686f15cedae65bba144643e25satok            final InputMethodSubtype subtype = subtypes.get(i);
101f3320979f6d3b63686f15cedae65bba144643e25satok            if (sb.length() > 0) {
102f3320979f6d3b63686f15cedae65bba144643e25satok                sb.append(", ");
103f3320979f6d3b63686f15cedae65bba144643e25satok            }
104f3320979f6d3b63686f15cedae65bba144643e25satok            sb.append(subtype.getDisplayName(context, imi.getPackageName(),
105f3320979f6d3b63686f15cedae65bba144643e25satok                    imi.getServiceInfo().applicationInfo));
106f3320979f6d3b63686f15cedae65bba144643e25satok        }
107f3320979f6d3b63686f15cedae65bba144643e25satok        return sb.toString();
108f3320979f6d3b63686f15cedae65bba144643e25satok    }
10921f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    /**
110c9a877174c6ba3552c1a6e396509f8d08049a3f6satok     * {@inheritDoc}
11121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok     */
112c9a877174c6ba3552c1a6e396509f8d08049a3f6satok    @Override
11321f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    public void setInputMethodSettingsCategoryTitle(int resId) {
11421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        mInputMethodSettingsCategoryTitleRes = resId;
11521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        updateSubtypeEnabler();
11621f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    }
11721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok
11821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    /**
119c9a877174c6ba3552c1a6e396509f8d08049a3f6satok     * {@inheritDoc}
12021f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok     */
121c9a877174c6ba3552c1a6e396509f8d08049a3f6satok    @Override
12221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    public void setInputMethodSettingsCategoryTitle(CharSequence title) {
12321f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        mInputMethodSettingsCategoryTitleRes = 0;
12421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        mInputMethodSettingsCategoryTitle = title;
12521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        updateSubtypeEnabler();
12621f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    }
12721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok
12821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    /**
129c9a877174c6ba3552c1a6e396509f8d08049a3f6satok     * {@inheritDoc}
13021f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok     */
131c9a877174c6ba3552c1a6e396509f8d08049a3f6satok    @Override
13221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    public void setSubtypeEnablerTitle(int resId) {
13321f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        mSubtypeEnablerTitleRes = resId;
13421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        updateSubtypeEnabler();
13521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    }
13621f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok
13721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    /**
138c9a877174c6ba3552c1a6e396509f8d08049a3f6satok     * {@inheritDoc}
13921f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok     */
140c9a877174c6ba3552c1a6e396509f8d08049a3f6satok    @Override
14121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    public void setSubtypeEnablerTitle(CharSequence title) {
14221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        mSubtypeEnablerTitleRes = 0;
14321f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        mSubtypeEnablerTitle = title;
14421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        updateSubtypeEnabler();
14521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    }
14621f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok
14721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    /**
148c9a877174c6ba3552c1a6e396509f8d08049a3f6satok     * {@inheritDoc}
14921f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok     */
150c9a877174c6ba3552c1a6e396509f8d08049a3f6satok    @Override
15121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    public void setSubtypeEnablerIcon(int resId) {
15221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        mSubtypeEnablerIconRes = resId;
15321f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        updateSubtypeEnabler();
15421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    }
15521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok
15621f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    /**
157c9a877174c6ba3552c1a6e396509f8d08049a3f6satok     * {@inheritDoc}
15821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok     */
159c9a877174c6ba3552c1a6e396509f8d08049a3f6satok    @Override
16021f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    public void setSubtypeEnablerIcon(Drawable drawable) {
16121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        mSubtypeEnablerIconRes = 0;
16221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        mSubtypeEnablerIcon = drawable;
16321f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        updateSubtypeEnabler();
16421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    }
16521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok
166010474f42b9b60af32f3f7ca0d34d34642f10f60satok    private CharSequence getSubtypeEnablerTitle(Context context) {
167010474f42b9b60af32f3f7ca0d34d34642f10f60satok        if (mSubtypeEnablerTitleRes != 0) {
168010474f42b9b60af32f3f7ca0d34d34642f10f60satok            return context.getString(mSubtypeEnablerTitleRes);
169010474f42b9b60af32f3f7ca0d34d34642f10f60satok        } else {
170010474f42b9b60af32f3f7ca0d34d34642f10f60satok            return mSubtypeEnablerTitle;
171010474f42b9b60af32f3f7ca0d34d34642f10f60satok        }
172010474f42b9b60af32f3f7ca0d34d34642f10f60satok    }
173010474f42b9b60af32f3f7ca0d34d34642f10f60satok
174f3320979f6d3b63686f15cedae65bba144643e25satok    public void updateSubtypeEnabler() {
17521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        if (mSubtypeEnablerPreference != null) {
17621f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok            if (mSubtypeEnablerTitleRes != 0) {
17721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok                mSubtypeEnablerPreference.setTitle(mSubtypeEnablerTitleRes);
17821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok            } else if (!TextUtils.isEmpty(mSubtypeEnablerTitle)) {
17921f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok                mSubtypeEnablerPreference.setTitle(mSubtypeEnablerTitle);
18021f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok            }
181f3320979f6d3b63686f15cedae65bba144643e25satok            final String summary = getEnabledSubtypesLabel(mContext, mImm, mImi);
182f3320979f6d3b63686f15cedae65bba144643e25satok            if (!TextUtils.isEmpty(summary)) {
183f3320979f6d3b63686f15cedae65bba144643e25satok                mSubtypeEnablerPreference.setSummary(summary);
18421f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok            }
18521f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok            if (mSubtypeEnablerIconRes != 0) {
18621f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok                mSubtypeEnablerPreference.setIcon(mSubtypeEnablerIconRes);
18721f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok            } else if (mSubtypeEnablerIcon != null) {
18821f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok                mSubtypeEnablerPreference.setIcon(mSubtypeEnablerIcon);
18921f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok            }
19021f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok        }
19121f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok    }
19221f8ddba1e654caa5f565ade87da9fe2de0ff7dbsatok}
193