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;
20import com.android.settings.Utils;
21
22import android.app.AlertDialog;
23import android.content.ActivityNotFoundException;
24import android.content.DialogInterface;
25import android.content.Intent;
26import android.content.res.Resources;
27import android.preference.Preference;
28import android.text.TextUtils;
29import android.util.Log;
30import android.view.View;
31import android.view.View.OnClickListener;
32import android.view.textservice.SpellCheckerInfo;
33import android.view.textservice.SpellCheckerSubtype;
34import android.view.textservice.TextServicesManager;
35import android.widget.ImageView;
36import android.widget.RadioButton;
37import android.widget.TextView;
38import android.widget.Toast;
39
40public class SingleSpellCheckerPreference extends Preference {
41    private static final String TAG = SingleSpellCheckerPreference.class.getSimpleName();
42    private static final boolean DBG = false;
43
44    private final SpellCheckerInfo mSpellCheckerInfo;
45
46    private final SpellCheckersSettings mFragment;
47    private final Resources mRes;
48    private final TextServicesManager mTsm;
49    private AlertDialog mDialog = null;
50    private TextView mTitleText;
51    private TextView mSummaryText;
52    private View mPrefAll;
53    private RadioButton mRadioButton;
54    private View mPrefLeftButton;
55    private View mSettingsButton;
56    private ImageView mSubtypeButton;
57    private Intent mSettingsIntent;
58    private boolean mSelected;
59
60    public SingleSpellCheckerPreference(SpellCheckersSettings fragment, Intent settingsIntent,
61            SpellCheckerInfo sci, TextServicesManager tsm) {
62        super(fragment.getActivity(), null, 0);
63        mFragment = fragment;
64        mRes = fragment.getActivity().getResources();
65        mTsm = tsm;
66        setLayoutResource(R.layout.preference_spellchecker);
67        mSpellCheckerInfo = sci;
68        mSelected = false;
69        final String settingsActivity = mSpellCheckerInfo.getSettingsActivity();
70        if (!TextUtils.isEmpty(settingsActivity)) {
71            mSettingsIntent = new Intent(Intent.ACTION_MAIN);
72            mSettingsIntent.setClassName(mSpellCheckerInfo.getPackageName(), settingsActivity);
73        } else {
74            mSettingsIntent = null;
75        }
76    }
77
78    @Override
79    protected void onBindView(View view) {
80        super.onBindView(view);
81        mPrefAll = view.findViewById(R.id.pref_all);
82        mRadioButton = (RadioButton)view.findViewById(R.id.pref_radio);
83        mPrefLeftButton = view.findViewById(R.id.pref_left_button);
84        mPrefLeftButton.setOnClickListener(
85                new OnClickListener() {
86                    @Override
87                    public void onClick(View arg0) {
88                        onLeftButtonClicked(arg0);
89                    }
90                });
91        mTitleText = (TextView)view.findViewById(android.R.id.title);
92        mSummaryText = (TextView)view.findViewById(android.R.id.summary);
93        mSubtypeButton = (ImageView)view.findViewById(R.id.pref_right_button2);
94        mSubtypeButton.setOnClickListener(
95                new OnClickListener() {
96                    @Override
97                    public void onClick(View arg0) {
98                        onSubtypeButtonClicked(arg0);
99                    }
100                });
101        mSettingsButton = view.findViewById(R.id.pref_right_button1);
102        mSettingsButton.setOnClickListener(
103                new OnClickListener() {
104                    @Override
105                    public void onClick(View arg0) {
106                        onSettingsButtonClicked(arg0);
107                    }
108                });
109        updateSelectedState(mSelected);
110    }
111
112    private void onLeftButtonClicked(View arg0) {
113        mFragment.onPreferenceClick(this);
114    }
115
116    public SpellCheckerInfo getSpellCheckerInfo() {
117        return mSpellCheckerInfo;
118    }
119
120    private void updateSelectedState(boolean selected) {
121        if (mPrefAll != null) {
122            mRadioButton.setChecked(selected);
123            enableButtons(selected);
124        }
125    }
126
127    public void setSelected(boolean selected) {
128        mSelected = selected;
129        updateSelectedState(selected);
130    }
131
132    private void onSubtypeButtonClicked(View arg0) {
133        if (mDialog != null && mDialog.isShowing()) {
134            mDialog.dismiss();
135        }
136        final AlertDialog.Builder builder = new AlertDialog.Builder(mFragment.getActivity());
137        builder.setTitle(R.string.phone_language);
138        final int size = mSpellCheckerInfo.getSubtypeCount();
139        final CharSequence[] items = new CharSequence[size + 1];
140        items[0] = mRes.getString(R.string.use_system_language_to_select_input_method_subtypes);
141        for (int i = 0; i < size; ++i) {
142            final SpellCheckerSubtype subtype = mSpellCheckerInfo.getSubtypeAt(i);
143            final CharSequence label = subtype.getDisplayName(
144                    mFragment.getActivity(), mSpellCheckerInfo.getPackageName(),
145                    mSpellCheckerInfo.getServiceInfo().applicationInfo);
146            items[i + 1] = label;
147        }
148        // default: "Use system language"
149        int checkedItem = 0;
150        // Allow no implicitly selected subtypes
151        final SpellCheckerSubtype currentScs = mTsm.getCurrentSpellCheckerSubtype(false);
152        if (currentScs != null) {
153            for (int i = 0; i < size; ++i) {
154                if (mSpellCheckerInfo.getSubtypeAt(i).equals(currentScs)) {
155                    checkedItem = i + 1;
156                    break;
157                }
158            }
159        }
160        builder.setSingleChoiceItems(items, checkedItem, new AlertDialog.OnClickListener() {
161            @Override
162            public void onClick(DialogInterface dialog, int which) {
163                if (which == 0) {
164                    mTsm.setSpellCheckerSubtype(null);
165                } else {
166                    mTsm.setSpellCheckerSubtype(mSpellCheckerInfo.getSubtypeAt(which - 1));
167                }
168                if (DBG) {
169                    final SpellCheckerSubtype subtype = mTsm.getCurrentSpellCheckerSubtype(true);
170                    Log.d(TAG, "Current spell check locale is "
171                            + subtype == null ? "null" : subtype.getLocale());
172                }
173                dialog.dismiss();
174            }
175        });
176        mDialog = builder.create();
177        mDialog.show();
178    }
179
180    private void onSettingsButtonClicked(View arg0) {
181        if (mFragment != null && mSettingsIntent != null) {
182            try {
183                mFragment.startActivity(mSettingsIntent);
184            } catch (ActivityNotFoundException e) {
185                final String msg = mFragment.getString(R.string.failed_to_open_app_settings_toast,
186                        mSpellCheckerInfo.loadLabel(mFragment.getActivity().getPackageManager()));
187                Toast.makeText(mFragment.getActivity(), msg, Toast.LENGTH_LONG).show();
188            }
189        }
190    }
191
192    private void enableButtons(boolean enabled) {
193        if (mSettingsButton != null) {
194            if (mSettingsIntent == null) {
195                mSettingsButton.setVisibility(View.GONE);
196            } else {
197                mSettingsButton.setEnabled(enabled);
198                mSettingsButton.setClickable(enabled);
199                mSettingsButton.setFocusable(enabled);
200                if (!enabled) {
201                    mSettingsButton.setAlpha(Utils.DISABLED_ALPHA);
202                }
203            }
204        }
205        if (mSubtypeButton != null) {
206            if (mSpellCheckerInfo.getSubtypeCount() <= 0) {
207                mSubtypeButton.setVisibility(View.GONE);
208            } else {
209                mSubtypeButton.setEnabled(enabled);
210                mSubtypeButton.setClickable(enabled);
211                mSubtypeButton.setFocusable(enabled);
212                if (!enabled) {
213                    mSubtypeButton.setAlpha(Utils.DISABLED_ALPHA);
214                }
215            }
216        }
217    }
218}
219