summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/inputmethod/SpellCheckerPreference.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/settings/inputmethod/SpellCheckerPreference.java')
-rw-r--r--src/com/android/settings/inputmethod/SpellCheckerPreference.java151
1 files changed, 151 insertions, 0 deletions
diff --git a/src/com/android/settings/inputmethod/SpellCheckerPreference.java b/src/com/android/settings/inputmethod/SpellCheckerPreference.java
new file mode 100644
index 0000000..3787803
--- /dev/null
+++ b/src/com/android/settings/inputmethod/SpellCheckerPreference.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.inputmethod;
+
+import android.content.ActivityNotFoundException;
+import android.content.Context;
+import android.content.Intent;
+import android.preference.Preference;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.textservice.SpellCheckerInfo;
+import android.widget.RadioButton;
+import android.widget.Toast;
+
+import com.android.settings.R;
+import com.android.settings.Utils;
+
+/**
+ * Spell checker service preference.
+ *
+ * This preference represents a spell checker service. It is used for two purposes. 1) A radio
+ * button on the left side is used to choose the current spell checker service. 2) A settings
+ * icon on the right side is used to invoke the setting activity of the spell checker service.
+ */
+class SpellCheckerPreference extends Preference implements OnClickListener {
+ interface OnRadioButtonPreferenceListener {
+ /**
+ * Called when this preference needs to be saved its state.
+ *
+ * Note that this preference is non-persistent and needs explicitly to be saved its state.
+ * Because changing one IME state may change other IMEs' state, this is a place to update
+ * other IMEs' state as well.
+ *
+ * @param pref This preference.
+ */
+ public void onRadioButtonClicked(SpellCheckerPreference pref);
+ }
+
+ private final SpellCheckerInfo mSci;
+ private final OnRadioButtonPreferenceListener mOnRadioButtonListener;
+
+ private RadioButton mRadioButton;
+ private View mPrefLeftButton;
+ private View mSettingsButton;
+ private boolean mSelected;
+
+ public SpellCheckerPreference(final Context context, final SpellCheckerInfo sci,
+ final OnRadioButtonPreferenceListener onRadioButtonListener) {
+ super(context, null, 0);
+ setPersistent(false);
+ setLayoutResource(R.layout.preference_spellchecker);
+ setWidgetLayoutResource(R.layout.preference_spellchecker_widget);
+ mSci = sci;
+ mOnRadioButtonListener = onRadioButtonListener;
+ setKey(sci.getId());
+ setTitle(sci.loadLabel(context.getPackageManager()));
+ final String settingsActivity = mSci.getSettingsActivity();
+ if (TextUtils.isEmpty(settingsActivity)) {
+ setIntent(null);
+ } else {
+ final Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.setClassName(mSci.getPackageName(), settingsActivity);
+ setIntent(intent);
+ }
+ }
+
+ @Override
+ protected void onBindView(View view) {
+ super.onBindView(view);
+ mRadioButton = (RadioButton)view.findViewById(R.id.pref_radio);
+ mPrefLeftButton = view.findViewById(R.id.pref_left_button);
+ mPrefLeftButton.setOnClickListener(this);
+ mSettingsButton = view.findViewById(R.id.pref_right_button);
+ mSettingsButton.setOnClickListener(this);
+ updateSelectedState(mSelected);
+ }
+
+ @Override
+ public void onClick(final View v) {
+ if (v == mPrefLeftButton) {
+ mOnRadioButtonListener.onRadioButtonClicked(this);
+ return;
+ }
+ if (v == mSettingsButton) {
+ onSettingsButtonClicked();
+ return;
+ }
+ }
+
+ private void onSettingsButtonClicked() {
+ final Context context = getContext();
+ try {
+ final Intent intent = getIntent();
+ if (intent != null) {
+ // Invoke a settings activity of an spell checker.
+ context.startActivity(intent);
+ }
+ } catch (final ActivityNotFoundException e) {
+ final String message = context.getString(R.string.failed_to_open_app_settings_toast,
+ mSci.loadLabel(context.getPackageManager()));
+ Toast.makeText(context, message, Toast.LENGTH_LONG).show();
+ }
+ }
+
+ public SpellCheckerInfo getSpellCheckerInfo() {
+ return mSci;
+ }
+
+ public void setSelected(final boolean selected) {
+ mSelected = selected;
+ updateSelectedState(selected);
+ }
+
+ private void updateSelectedState(final boolean selected) {
+ if (mRadioButton != null) {
+ mRadioButton.setChecked(selected);
+ enableSettingsButton(isEnabled() && selected);
+ }
+ }
+
+ private void enableSettingsButton(final boolean enabled) {
+ if (mSettingsButton == null) {
+ return;
+ }
+ if (getIntent() == null) {
+ mSettingsButton.setVisibility(View.GONE);
+ } else {
+ mSettingsButton.setEnabled(enabled);
+ mSettingsButton.setClickable(enabled);
+ mSettingsButton.setFocusable(enabled);
+ if (!enabled) {
+ mSettingsButton.setAlpha(Utils.DISABLED_ALPHA);
+ }
+ }
+ }
+}