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