1 /*
2  * This file is part of Maliit Plugins
3  *
4  * Copyright (C) 2013 Canonical, Ltd.
5  *
6  * Redistribution and use in source and binary forms, with or without modification,
7  * are permitted provided that the following conditions are met:
8  *
9  * Redistributions of source code must retain the above copyright notice, this list
10  * of conditions and the following disclaimer.
11  * Redistributions in binary form must reproduce the above copyright notice, this list
12  * of conditions and the following disclaimer in the documentation and/or other materials
13  * provided with the distribution.
14  * Neither the name of Nokia Corporation nor the names of its contributors may be
15  * used to endorse or promote products derived from this software without specific
16  * prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
19  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
20  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21  * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  */
29 
30 #include "keyboardsettings.h"
31 
32 #include <QDebug>
33 #include <QGSettings/QGSettings>
34 
35 using namespace MaliitKeyboard;
36 
37 const QLatin1String ACTIVE_LANGUAGE_KEY = QLatin1String("activeLanguage");
38 const QLatin1String PREVIOUS_LANGUAGE_KEY = QLatin1String("previousLanguage");
39 const QLatin1String ENABLED_LANGUAGES_KEY = QLatin1String("enabledLanguages");
40 const QLatin1String AUTO_CAPITALIZATION_KEY = QLatin1String("autoCapitalization");
41 const QLatin1String AUTO_COMPLETION_KEY = QLatin1String("autoCompletion");
42 const QLatin1String PREDICTIVE_TEXT_KEY = QLatin1String("predictiveText");
43 const QLatin1String SPELL_CHECKING_KEY = QLatin1String("spellChecking");
44 const QLatin1String KEY_PRESS_AUDIO_FEEDBACK_KEY = QLatin1String("keyPressFeedback");
45 const QLatin1String KEY_PRESS_AUDIO_FEEDBACK_SOUND_KEY = QLatin1String("keyPressFeedbackSound");
46 const QLatin1String KEY_PRESS_HAPTIC_FEEDBACK_KEY = QLatin1String("keyPressHapticFeedback");
47 const QLatin1String DOUBLE_SPACE_FULL_STOP_KEY = QLatin1String("doubleSpaceFullStop");
48 const QLatin1String STAY_HIDDEN_KEY = QLatin1String("stayHidden");
49 const QLatin1String DISABLE_HEIGHT_KEY = QLatin1String("disableHeight");
50 const QLatin1String PLUGIN_PATHS_KEY = QLatin1String("pluginPaths");
51 const QLatin1String OPACITY_KEY = QLatin1String("opacity");
52 
53 /*!
54  * \brief KeyboardSettings::KeyboardSettings class to load the settings, and
55  * listens on runtime to changes of them
56  * \param parent
57  */
KeyboardSettings(QObject * parent)58 KeyboardSettings::KeyboardSettings(QObject *parent) :
59     QObject(parent)
60   , m_settings(new QGSettings("org.maliit.keyboard.maliit",
61                               "/org/maliit/keyboard/maliit/", this))
62 {
63     QObject::connect(m_settings, &QGSettings::changed,
64                      this, &KeyboardSettings::settingUpdated);
65 }
66 
67 /*!
68  * \brief KeyboardSettings::activeLanguage returns currently active language
69  * \return active language
70  */
71 
activeLanguage() const72 QString KeyboardSettings::activeLanguage() const
73 {
74     return m_settings->get(ACTIVE_LANGUAGE_KEY).toString();
75 }
76 
setActiveLanguage(const QString & id)77 void KeyboardSettings::setActiveLanguage(const QString& id)
78 {
79     m_settings->set(ACTIVE_LANGUAGE_KEY, QVariant(id));
80 }
81 
82 /*!
83  * \brief KeyboardSettings::previousLanguage returns the language that was
84  * active immediately before the current one.
85  * \return previously language
86  */
87 
previousLanguage() const88 QString KeyboardSettings::previousLanguage() const
89 {
90     return m_settings->get(PREVIOUS_LANGUAGE_KEY).toString();
91 }
92 
setPreviousLanguage(const QString & id)93 void KeyboardSettings::setPreviousLanguage(const QString& id)
94 {
95     m_settings->set(PREVIOUS_LANGUAGE_KEY, QVariant(id));
96 }
97 
98 /*!
99  * \brief KeyboardSettings::enabledLanguages returns a list of languages that are
100  * active
101  * \return
102  */
enabledLanguages() const103 QStringList KeyboardSettings::enabledLanguages() const
104 {
105     return m_settings->get(ENABLED_LANGUAGES_KEY).toStringList();
106 }
107 
108 /*!
109  * \brief KeyboardSettings::autoCapitalization returns true id the first letter
110  * of each sentence should be capitalized
111  * \return
112  */
autoCapitalization() const113 bool KeyboardSettings::autoCapitalization() const
114 {
115     return m_settings->get(AUTO_CAPITALIZATION_KEY).toBool();
116 }
117 
118 /*!
119  * \brief KeyboardSettings::autoCompletion returns true if the current word should
120  * be completed with first suggestion when hitting space
121  * \return
122  */
autoCompletion() const123 bool KeyboardSettings::autoCompletion() const
124 {
125     return m_settings->get(AUTO_COMPLETION_KEY).toBool();
126 }
127 
128 /*!
129  * \brief KeyboardSettings::predictiveText returns true, if potential words in the
130  * word ribbon should be suggested
131  * \return
132  */
predictiveText() const133 bool KeyboardSettings::predictiveText() const
134 {
135     return m_settings->get(PREDICTIVE_TEXT_KEY).toBool();
136 }
137 
138 /*!
139  * \brief KeyboardSettings::spellchecking returns true if spellchecking should be used
140  * \return
141  */
spellchecking() const142 bool KeyboardSettings::spellchecking() const
143 {
144     return m_settings->get(SPELL_CHECKING_KEY).toBool();
145 }
146 
147 /*!
148  * \brief KeyboardSettings::keyPressAudioFeedback returns true if audio feedback is enabled
149  * when the user presses a keyboad key
150  * \return
151  */
keyPressAudioFeedback() const152 bool KeyboardSettings::keyPressAudioFeedback() const
153 {
154     return m_settings->get(KEY_PRESS_AUDIO_FEEDBACK_KEY).toBool();
155 }
156 
157 /*!
158  * \brief KeyboardSettings::keyPressHapticFeedback returns true if haptic feedback is enabled
159  * when the user presses a keyboad key
160  * \return
161  */
keyPressHapticFeedback() const162 bool KeyboardSettings::keyPressHapticFeedback() const
163 {
164     return m_settings->get(KEY_PRESS_HAPTIC_FEEDBACK_KEY).toBool();
165 }
166 
167 /*!
168  * \brief KeyboardSettings::keyPressFeedbackSound returns the path to the current key
169  * feedback sound
170  * \return path to the feedback sound
171  */
keyPressAudioFeedbackSound() const172 QString KeyboardSettings::keyPressAudioFeedbackSound() const
173 {
174     return m_settings->get(KEY_PRESS_AUDIO_FEEDBACK_SOUND_KEY).toString();
175 }
176 
177 /*!
178  * \brief KeyboardSettings:doubleSpaceFullStop returns true if double space full-stops are
179  * enabled, which insert a full-stop when the space key is pressed twice.
180  */
doubleSpaceFullStop() const181 bool KeyboardSettings::doubleSpaceFullStop() const
182 {
183     return m_settings->get(DOUBLE_SPACE_FULL_STOP_KEY).toBool();
184 }
185 
186 /*!
187  * \brief KeyboardSettings:stayHidden returns true if the keyboard should
188  * always remain hidden (e.g. if a hardware keyboard has been connected).
189  */
stayHidden() const190 bool KeyboardSettings::stayHidden() const
191 {
192     return m_settings->get(STAY_HIDDEN_KEY).toBool();
193 }
194 
195 /*!
196  * \brief KeyboardSettings::pluginPaths returns a list of paths containing
197  * ubuntu-keyboard layout plugins
198  */
pluginPaths() const199 QStringList KeyboardSettings::pluginPaths() const
200 {
201     return m_settings->get(PLUGIN_PATHS_KEY).toStringList();
202 }
203 
disableHeight() const204 bool KeyboardSettings::disableHeight() const
205 {
206     return m_settings->get(DISABLE_HEIGHT_KEY).toBool();
207 }
208 
209 /*!
210  * \brief KeyboardSettings::opacity returns the transparency value for the
211  * keyboard between 0 and 1
212  */
opacity() const213 double KeyboardSettings::opacity() const
214 {
215     return m_settings->get(OPACITY_KEY).toDouble();
216 }
217 
218 /*!
219  * \brief KeyboardSettings::settingUpdated slot to handle changes in the settings backend
220  * A specialized signal is emitted for the affected setting
221  * \param key
222  */
settingUpdated(const QString & key)223 void KeyboardSettings::settingUpdated(const QString &key)
224 {
225     if (key == ACTIVE_LANGUAGE_KEY) {
226         Q_EMIT activeLanguageChanged(activeLanguage());
227         return;
228     } else if (key == PREVIOUS_LANGUAGE_KEY) {
229         Q_EMIT previousLanguageChanged(previousLanguage());
230         return;
231     } else if (key == ENABLED_LANGUAGES_KEY) {
232         Q_EMIT enabledLanguagesChanged(enabledLanguages());
233         return;
234     } else if (key == AUTO_CAPITALIZATION_KEY) {
235         Q_EMIT autoCapitalizationChanged(autoCapitalization());
236         return;
237     } else if (key == AUTO_COMPLETION_KEY) {
238         Q_EMIT autoCompletionChanged(autoCompletion());
239         return;
240     } else if (key == PREDICTIVE_TEXT_KEY) {
241         Q_EMIT predictiveTextChanged(predictiveText());
242         return;
243     } else if (key == SPELL_CHECKING_KEY) {
244         Q_EMIT spellCheckingChanged(spellchecking());
245         return;
246     } else if (key == KEY_PRESS_AUDIO_FEEDBACK_KEY) {
247         Q_EMIT keyPressAudioFeedbackChanged(keyPressAudioFeedback());
248         return;
249     } else if (key == KEY_PRESS_HAPTIC_FEEDBACK_KEY) {
250         Q_EMIT keyPressHapticFeedbackChanged(keyPressHapticFeedback());
251         return;
252     } else if (key == KEY_PRESS_AUDIO_FEEDBACK_SOUND_KEY) {
253         Q_EMIT keyPressAudioFeedbackSoundChanged(keyPressAudioFeedbackSound());
254         return;
255     } else if (key == DOUBLE_SPACE_FULL_STOP_KEY) {
256         Q_EMIT doubleSpaceFullStopChanged(doubleSpaceFullStop());
257         return;
258     } else if (key == STAY_HIDDEN_KEY) {
259         Q_EMIT stayHiddenChanged(stayHidden());
260         return;
261     } else if (key == DISABLE_HEIGHT_KEY) {
262         Q_EMIT disableHeightChanged(disableHeight());
263         return;
264     } else if (key == PLUGIN_PATHS_KEY) {
265         Q_EMIT pluginPathsChanged(pluginPaths());
266     } else if (key == OPACITY_KEY) {
267         Q_EMIT opacityChanged(opacity());
268     } else if (key == "theme")
269         Q_EMIT themeChanged(theme());
270     else if (key == "device")
271         Q_EMIT deviceChanged(device());
272 
273     qWarning() << Q_FUNC_INFO << "unknown settings key:" << key;
274 }
275 
theme() const276 QString KeyboardSettings::theme() const
277 {
278     return m_settings->get("theme").toString();
279 }
280 
device() const281 QString KeyboardSettings::device() const
282 {
283     return m_settings->get("device").toString();
284 }
285