SingleSpellCheckerPreference.java revision ef283b41b09aaca9e1f5005133ecf317e37a4959
1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.settings.inputmethod;
18
19import com.android.settings.R;
20
21import android.app.AlertDialog;
22import android.content.DialogInterface;
23import android.content.Intent;
24import android.content.res.Resources;
25import android.preference.Preference;
26import android.provider.Settings;
27import android.text.TextUtils;
28import android.util.Log;
29import android.view.View;
30import android.view.View.OnClickListener;
31import android.view.textservice.SpellCheckerInfo;
32import android.view.textservice.SpellCheckerSubtype;
33import android.view.textservice.TextServicesManager;
34import android.widget.ImageView;
35import android.widget.RadioButton;
36import android.widget.TextView;
37
38public class SingleSpellCheckerPreference extends Preference {
39    private static final float DISABLED_ALPHA = 0.4f;
40    private static final String TAG = SingleSpellCheckerPreference.class.getSimpleName();
41    private static final boolean DBG = false;
42
43    private final SpellCheckerInfo mSpellCheckerInfo;
44
45    private final SpellCheckersSettings mFragment;
46    private final Resources mRes;
47    private final TextServicesManager mTsm;
48    private TextView mTitleText;
49    private TextView mSummaryText;
50    private View mPrefAll;
51    private RadioButton mRadioButton;
52    private View mPrefLeftButton;
53    private View mSettingsButton;
54    private ImageView mSubtypeButton;
55    private Intent mSettingsIntent;
56    private boolean mSelected;
57
58    public SingleSpellCheckerPreference(SpellCheckersSettings fragment, Intent settingsIntent,
59            SpellCheckerInfo sci, TextServicesManager tsm) {
60        super(fragment.getActivity(), null, 0);
61        mFragment = fragment;
62        mRes = fragment.getActivity().getResources();
63        mTsm = tsm;
64        setLayoutResource(R.layout.preference_spellchecker);
65        mSpellCheckerInfo = sci;
66        mSelected = false;
67        final String settingsActivity = mSpellCheckerInfo.getSettingsActivity();
68        if (!TextUtils.isEmpty(settingsActivity)) {
69            mSettingsIntent = new Intent(Intent.ACTION_MAIN);
70            mSettingsIntent.setClassName(mSpellCheckerInfo.getPackageName(), settingsActivity);
71        } else {
72            mSettingsIntent = null;
73        }
74    }
75
76    @Override
77    protected void onBindView(View view) {
78        super.onBindView(view);
79        mPrefAll = view.findViewById(R.id.pref_all);
80        mRadioButton = (RadioButton)view.findViewById(R.id.pref_radio);
81        mPrefLeftButton = view.findViewById(R.id.pref_left_button);
82        mPrefLeftButton.setOnClickListener(
83                new OnClickListener() {
84                    @Override
85                    public void onClick(View arg0) {
86                        onLeftButtonClicked(arg0);
87                    }
88                });
89        mTitleText = (TextView)view.findViewById(android.R.id.title);
90        mSummaryText = (TextView)view.findViewById(android.R.id.summary);
91        mSubtypeButton = (ImageView)view.findViewById(R.id.pref_right_button2);
92        mSubtypeButton.setOnClickListener(
93                new OnClickListener() {
94                    @Override
95                    public void onClick(View arg0) {
96                        onSubtypeButtonClicked(arg0);
97                    }
98                });
99        mSettingsButton = view.findViewById(R.id.pref_right_button1);
100        mSettingsButton.setOnClickListener(
101                new OnClickListener() {
102                    @Override
103                    public void onClick(View arg0) {
104                        onSettingsButtonClicked(arg0);
105                    }
106                });
107        updateSelectedState(mSelected);
108    }
109
110    private void onLeftButtonClicked(View arg0) {
111        mFragment.onPreferenceClick(this);
112    }
113
114    public SpellCheckerInfo getSpellCheckerInfo() {
115        return mSpellCheckerInfo;
116    }
117
118    private void updateSelectedState(boolean selected) {
119        if (mPrefAll != null) {
120            mRadioButton.setChecked(selected);
121            enableButtons(selected);
122        }
123    }
124
125    public void setSelected(boolean selected) {
126        mSelected = selected;
127        updateSelectedState(selected);
128    }
129
130    private void onSubtypeButtonClicked(View arg0) {
131        final AlertDialog.Builder builder = new AlertDialog.Builder(mFragment.getActivity());
132        builder.setTitle(R.string.phone_language);
133        final int size = mSpellCheckerInfo.getSubtypeCount();
134        final CharSequence[] items = new CharSequence[size + 1];
135        items[0] = mRes.getString(R.string.use_system_language_to_select_input_method_subtypes);
136        for (int i = 0; i < size; ++i) {
137            final SpellCheckerSubtype subtype = mSpellCheckerInfo.getSubtypeAt(i);
138            final CharSequence label = subtype.getDisplayName(
139                    mFragment.getActivity(), mSpellCheckerInfo.getPackageName(),
140                    mSpellCheckerInfo.getServiceInfo().applicationInfo);
141            items[i + 1] = label;
142        }
143        // default: "Use system language"
144        int checkedItem = 0;
145        // Allow no implicitly selected subtypes
146        final SpellCheckerSubtype currentScs = mTsm.getCurrentSpellCheckerSubtype(false);
147        if (currentScs != null) {
148            for (int i = 0; i < size; ++i) {
149                if (mSpellCheckerInfo.getSubtypeAt(i).equals(currentScs)) {
150                    checkedItem = i + 1;
151                    break;
152                }
153            }
154        }
155        builder.setSingleChoiceItems(items, checkedItem, new AlertDialog.OnClickListener() {
156            @Override
157            public void onClick(DialogInterface dialog, int which) {
158                if (which == 0) {
159                    mTsm.setSpellCheckerSubtype(null);
160                } else {
161                    mTsm.setSpellCheckerSubtype(mSpellCheckerInfo.getSubtypeAt(which - 1));
162                }
163                if (DBG) {
164                    final SpellCheckerSubtype subtype = mTsm.getCurrentSpellCheckerSubtype(true);
165                    Log.d(TAG, "Current spell check locale is "
166                            + subtype == null ? "null" : subtype.getLocale());
167                }
168                dialog.dismiss();
169            }
170        });
171        builder.show();
172    }
173
174    private void onSettingsButtonClicked(View arg0) {
175        if (mFragment != null && mSettingsIntent != null) {
176            mFragment.startActivity(mSettingsIntent);
177        }
178    }
179
180    private void enableButtons(boolean enabled) {
181        if (mSettingsButton != null) {
182            if (mSettingsIntent == null) {
183                mSettingsButton.setVisibility(View.GONE);
184            } else {
185                mSettingsButton.setEnabled(enabled);
186                mSettingsButton.setClickable(enabled);
187                mSettingsButton.setFocusable(enabled);
188                if (!enabled) {
189                    mSettingsButton.setAlpha(DISABLED_ALPHA);
190                }
191            }
192        }
193        if (mSubtypeButton != null) {
194            if (mSpellCheckerInfo.getSubtypeCount() <= 0) {
195                mSubtypeButton.setVisibility(View.GONE);
196            } else {
197                mSubtypeButton.setEnabled(enabled);
198                mSubtypeButton.setClickable(enabled);
199                mSubtypeButton.setFocusable(enabled);
200                if (!enabled) {
201                    mSubtypeButton.setAlpha(DISABLED_ALPHA);
202                }
203            }
204        }
205    }
206}
207