1 /*
2  * Copyright (C) 2014 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 
17 package com.android.settings.inputmethod;
18 
19 import android.content.ActivityNotFoundException;
20 import android.content.Context;
21 import android.content.Intent;
22 import android.preference.Preference;
23 import android.text.TextUtils;
24 import android.view.View;
25 import android.view.View.OnClickListener;
26 import android.view.textservice.SpellCheckerInfo;
27 import android.widget.RadioButton;
28 import android.widget.Toast;
29 
30 import com.android.settings.R;
31 import com.android.settings.Utils;
32 
33 /**
34  * Spell checker service preference.
35  *
36  * This preference represents a spell checker service. It is used for two purposes. 1) A radio
37  * button on the left side is used to choose the current spell checker service. 2) A settings
38  * icon on the right side is used to invoke the setting activity of the spell checker service.
39  */
40 class SpellCheckerPreference extends Preference implements OnClickListener {
41     interface OnRadioButtonPreferenceListener {
42         /**
43          * Called when this preference needs to be saved its state.
44          *
45          * Note that this preference is non-persistent and needs explicitly to be saved its state.
46          * Because changing one IME state may change other IMEs' state, this is a place to update
47          * other IMEs' state as well.
48          *
49          * @param pref This preference.
50          */
onRadioButtonClicked(SpellCheckerPreference pref)51         public void onRadioButtonClicked(SpellCheckerPreference pref);
52     }
53 
54     private final SpellCheckerInfo mSci;
55     private final OnRadioButtonPreferenceListener mOnRadioButtonListener;
56 
57     private RadioButton mRadioButton;
58     private View mPrefLeftButton;
59     private View mSettingsButton;
60     private boolean mSelected;
61 
SpellCheckerPreference(final Context context, final SpellCheckerInfo sci, final OnRadioButtonPreferenceListener onRadioButtonListener)62     public SpellCheckerPreference(final Context context, final SpellCheckerInfo sci,
63             final OnRadioButtonPreferenceListener onRadioButtonListener) {
64         super(context, null, 0);
65         setPersistent(false);
66         setLayoutResource(R.layout.preference_spellchecker);
67         setWidgetLayoutResource(R.layout.preference_spellchecker_widget);
68         mSci = sci;
69         mOnRadioButtonListener = onRadioButtonListener;
70         setKey(sci.getId());
71         setTitle(sci.loadLabel(context.getPackageManager()));
72         final String settingsActivity = mSci.getSettingsActivity();
73         if (TextUtils.isEmpty(settingsActivity)) {
74             setIntent(null);
75         } else {
76             final Intent intent = new Intent(Intent.ACTION_MAIN);
77             intent.setClassName(mSci.getPackageName(), settingsActivity);
78             setIntent(intent);
79         }
80     }
81 
82     @Override
onBindView(View view)83     protected void onBindView(View view) {
84         super.onBindView(view);
85         mRadioButton = (RadioButton)view.findViewById(R.id.pref_radio);
86         mPrefLeftButton = view.findViewById(R.id.pref_left_button);
87         mPrefLeftButton.setOnClickListener(this);
88         mSettingsButton = view.findViewById(R.id.pref_right_button);
89         mSettingsButton.setOnClickListener(this);
90         updateSelectedState(mSelected);
91     }
92 
93     @Override
onClick(final View v)94     public void onClick(final View v) {
95         if (v == mPrefLeftButton) {
96             mOnRadioButtonListener.onRadioButtonClicked(this);
97             return;
98         }
99         if (v == mSettingsButton) {
100             onSettingsButtonClicked();
101             return;
102         }
103     }
104 
onSettingsButtonClicked()105     private void onSettingsButtonClicked() {
106         final Context context = getContext();
107         try {
108             final Intent intent = getIntent();
109             if (intent != null) {
110                 // Invoke a settings activity of an spell checker.
111                 context.startActivity(intent);
112             }
113         } catch (final ActivityNotFoundException e) {
114             final String message = context.getString(R.string.failed_to_open_app_settings_toast,
115                     mSci.loadLabel(context.getPackageManager()));
116             Toast.makeText(context, message, Toast.LENGTH_LONG).show();
117         }
118     }
119 
getSpellCheckerInfo()120     public SpellCheckerInfo getSpellCheckerInfo() {
121         return mSci;
122     }
123 
setSelected(final boolean selected)124     public void setSelected(final boolean selected) {
125         mSelected = selected;
126         updateSelectedState(selected);
127     }
128 
updateSelectedState(final boolean selected)129     private void updateSelectedState(final boolean selected) {
130         if (mRadioButton != null) {
131             mRadioButton.setChecked(selected);
132             enableSettingsButton(isEnabled() && selected);
133         }
134     }
135 
enableSettingsButton(final boolean enabled)136     private void enableSettingsButton(final boolean enabled) {
137         if (mSettingsButton == null) {
138             return;
139         }
140         if (getIntent() == null) {
141             mSettingsButton.setVisibility(View.GONE);
142         } else {
143             mSettingsButton.setEnabled(enabled);
144             mSettingsButton.setClickable(enabled);
145             mSettingsButton.setFocusable(enabled);
146             if (!enabled) {
147                 mSettingsButton.setAlpha(Utils.DISABLED_ALPHA);
148             }
149         }
150     }
151 }
152