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