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.text.TextUtils;
27import android.util.Log;
28import android.view.View;
29import android.view.View.OnClickListener;
30import android.view.textservice.SpellCheckerInfo;
31import android.view.textservice.SpellCheckerSubtype;
32import android.view.textservice.TextServicesManager;
33import android.widget.ImageView;
34import android.widget.RadioButton;
35import android.widget.TextView;
36
37public class SingleSpellCheckerPreference extends Preference {
38    private static final float DISABLED_ALPHA = 0.4f;
39    private static final String TAG = SingleSpellCheckerPreference.class.getSimpleName();
40    private static final boolean DBG = false;
41
42    private final SpellCheckerInfo mSpellCheckerInfo;
43
44    private final SpellCheckersSettings mFragment;
45    private final Resources mRes;
46    private final TextServicesManager mTsm;
47    private AlertDialog mDialog = null;
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        if (mDialog != null && mDialog.isShowing()) {
132            mDialog.dismiss();
133        }
134        final AlertDialog.Builder builder = new AlertDialog.Builder(mFragment.getActivity());
135        builder.setTitle(R.string.phone_language);
136        final int size = mSpellCheckerInfo.getSubtypeCount();
137        final CharSequence[] items = new CharSequence[size + 1];
138        items[0] = mRes.getString(R.string.use_system_language_to_select_input_method_subtypes);
139        for (int i = 0; i < size; ++i) {
140            final SpellCheckerSubtype subtype = mSpellCheckerInfo.getSubtypeAt(i);
141            final CharSequence label = subtype.getDisplayName(
142                    mFragment.getActivity(), mSpellCheckerInfo.getPackageName(),
143                    mSpellCheckerInfo.getServiceInfo().applicationInfo);
144            items[i + 1] = label;
145        }
146        // default: "Use system language"
147        int checkedItem = 0;
148        // Allow no implicitly selected subtypes
149        final SpellCheckerSubtype currentScs = mTsm.getCurrentSpellCheckerSubtype(false);
150        if (currentScs != null) {
151            for (int i = 0; i < size; ++i) {
152                if (mSpellCheckerInfo.getSubtypeAt(i).equals(currentScs)) {
153                    checkedItem = i + 1;
154                    break;
155                }
156            }
157        }
158        builder.setSingleChoiceItems(items, checkedItem, new AlertDialog.OnClickListener() {
159            @Override
160            public void onClick(DialogInterface dialog, int which) {
161                if (which == 0) {
162                    mTsm.setSpellCheckerSubtype(null);
163                } else {
164                    mTsm.setSpellCheckerSubtype(mSpellCheckerInfo.getSubtypeAt(which - 1));
165                }
166                if (DBG) {
167                    final SpellCheckerSubtype subtype = mTsm.getCurrentSpellCheckerSubtype(true);
168                    Log.d(TAG, "Current spell check locale is "
169                            + subtype == null ? "null" : subtype.getLocale());
170                }
171                dialog.dismiss();
172            }
173        });
174        mDialog = builder.create();
175        mDialog.show();
176    }
177
178    private void onSettingsButtonClicked(View arg0) {
179        if (mFragment != null && mSettingsIntent != null) {
180            mFragment.startActivity(mSettingsIntent);
181        }
182    }
183
184    private void enableButtons(boolean enabled) {
185        if (mSettingsButton != null) {
186            if (mSettingsIntent == null) {
187                mSettingsButton.setVisibility(View.GONE);
188            } else {
189                mSettingsButton.setEnabled(enabled);
190                mSettingsButton.setClickable(enabled);
191                mSettingsButton.setFocusable(enabled);
192                if (!enabled) {
193                    mSettingsButton.setAlpha(DISABLED_ALPHA);
194                }
195            }
196        }
197        if (mSubtypeButton != null) {
198            if (mSpellCheckerInfo.getSubtypeCount() <= 0) {
199                mSubtypeButton.setVisibility(View.GONE);
200            } else {
201                mSubtypeButton.setEnabled(enabled);
202                mSubtypeButton.setClickable(enabled);
203                mSubtypeButton.setFocusable(enabled);
204                if (!enabled) {
205                    mSubtypeButton.setAlpha(DISABLED_ALPHA);
206                }
207            }
208        }
209    }
210}
211