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