Fix unintended recording cancel by changing language
[platform/core/uifw/voice-control.git] / client / vc_setting.c
1 /*
2 * Copyright (c) 2011-2015 Samsung Electronics Co., Ltd All Rights Reserved
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
18 #include "vc_config_mgr.h"
19 #include "vc_main.h"
20 #include "vc_setting_dbus.h"
21 #include "voice_control_common.h"
22 #include "voice_control_setting.h"
23
24 /**
25 * @brief Enumerations of mode.
26 */
27 typedef enum {
28         VC_SETTING_STATE_NONE = 0,
29         VC_SETTING_STATE_READY
30 } vc_setting_state_e;
31
32 #define VC_SETTING_CONFIG_HANDLE        300000
33
34 static vc_setting_state_e g_state = VC_SETTING_STATE_NONE;
35
36 static vc_setting_enabled_changed_cb g_callback = NULL;
37
38 static void* g_user_data = NULL;
39
40 static vc_setting_current_language_changed_cb g_lang_callback = NULL;
41
42 static void* g_lang_user_data = NULL;
43
44 const char* vc_tag()
45 {
46         return TAG_VCS;
47 }
48
49 void __config_lang_changed_cb(const char* before_lang, const char* current_lang)
50 {
51         SLOG(LOG_DEBUG, TAG_VCS, "Lang changed : before(%s) current(%s)", before_lang, current_lang);
52
53         if (NULL != g_lang_callback) {
54                 g_lang_callback(before_lang, current_lang, g_lang_user_data);
55         }
56 }
57
58 void __vc_setting_state_changed_cb(int before_state, int current_state, void* user_data)
59 {
60         SLOG(LOG_DEBUG, TAG_VCS, "Service State changed : Before(%d) Current(%d)",
61                  before_state, current_state);
62         return;
63 }
64
65 void __vc_setting_enabled_changed_cb(bool enabled)
66 {
67         SLOG(LOG_DEBUG, TAG_VCS, "Service enabled changed : %s", enabled ? "on" : "off");
68
69         if (NULL != g_callback) {
70                 g_callback(enabled, g_user_data);
71         }
72
73         return;
74 }
75
76 int vc_setting_initialize(void)
77 {
78         SLOG(LOG_DEBUG, TAG_VCS, "@@@ Initialize VC Setting");
79
80         if (VC_SETTING_STATE_READY == g_state) {
81                 SLOG(LOG_WARN, TAG_VCS, "[WARNING] VC Setting has already been initialized.");
82                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
83                 return VC_ERROR_NONE;
84         }
85
86         int ret = vc_config_mgr_initialize(getpid() + VC_SETTING_CONFIG_HANDLE);
87         if (0 != ret) {
88                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Fail to initialize config manager");
89                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
90                 return VC_ERROR_OPERATION_FAILED;
91         }
92
93         ret = vc_config_mgr_set_lang_cb(getpid() + VC_SETTING_CONFIG_HANDLE, __config_lang_changed_cb);
94         if (0 != ret) {
95                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Fail to initialize config manager");
96                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
97                 vc_config_mgr_finalize(getpid() + VC_SETTING_CONFIG_HANDLE);
98                 return VC_ERROR_OPERATION_FAILED;
99         }
100
101         ret = vc_config_mgr_set_enabled_cb(getpid() + VC_SETTING_CONFIG_HANDLE, __vc_setting_enabled_changed_cb);
102
103         g_state = VC_SETTING_STATE_READY;
104
105         SLOG(LOG_DEBUG, TAG_VCS, "@@@");
106
107         return VC_ERROR_NONE;
108 }
109
110 int vc_setting_deinitialize()
111 {
112         SLOG(LOG_DEBUG, TAG_VCS, "@@@ Deinitialize VC Setting");
113
114         if (VC_SETTING_STATE_READY != g_state) {
115                 SLOG(LOG_WARN, TAG_VCS, "[WARNING] VC Setting is not initialized");
116                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
117                 return VC_ERROR_INVALID_STATE;
118         }
119
120         vc_config_mgr_unset_lang_cb(getpid() + VC_SETTING_CONFIG_HANDLE);
121         vc_config_mgr_finalize(getpid() + VC_SETTING_CONFIG_HANDLE);
122
123         g_state = VC_SETTING_STATE_NONE;
124
125         SLOG(LOG_DEBUG, TAG_VCS, "@@@");
126
127         return VC_ERROR_NONE;
128 }
129
130 int vc_setting_foreach_supported_languages(vc_setting_supported_language_cb callback, void* user_data)
131 {
132         SLOG(LOG_DEBUG, TAG_VCS, "@@@ Foreach supported languages");
133
134         if (VC_SETTING_STATE_NONE == g_state) {
135                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Not initialized");
136                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
137                 return VC_ERROR_INVALID_STATE;
138         }
139
140         if (NULL == callback) {
141                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Param is NULL");
142                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
143                 return VC_ERROR_INVALID_PARAMETER;
144         }
145
146         int ret = vc_config_mgr_get_language_list((vc_supported_language_cb)callback, user_data);
147         if (0 != ret) {
148                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Result : %d", ret);
149         } else {
150                 SLOG(LOG_DEBUG, TAG_VCS, "[SUCCESS] Foreach supported languages");
151         }
152
153         SLOG(LOG_DEBUG, TAG_VCS, "@@@");
154
155         return ret;
156 }
157
158 int vc_setting_get_language(char** language)
159 {
160         SLOG(LOG_DEBUG, TAG_VCS, "@@@ Get default language");
161
162         if (VC_SETTING_STATE_NONE == g_state) {
163                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Not initialized");
164                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
165                 return VC_ERROR_INVALID_STATE;
166         }
167
168         if (NULL == language) {
169                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Input parameter is NULL");
170                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
171                 return VC_ERROR_INVALID_PARAMETER;
172         }
173
174         int ret = vc_config_mgr_get_default_language(language);
175         if (0 != ret) {
176                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Result : %d", ret);
177         } else {
178                 SLOG(LOG_DEBUG, TAG_VCS, "[SUCCESS] Get default language");
179         }
180
181         SLOG(LOG_DEBUG, TAG_VCS, "@@@");
182
183         return ret;
184 }
185
186 int vc_setting_set_language(const char* language)
187 {
188         SLOG(LOG_DEBUG, TAG_VCS, "@@@ Set default language");
189
190         if (VC_SETTING_STATE_NONE == g_state) {
191                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Not initialized");
192                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
193                 return VC_ERROR_INVALID_STATE;
194         }
195
196         if (NULL == language) {
197                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Input parameter is NULL");
198                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
199                 return VC_ERROR_INVALID_PARAMETER;
200         }
201
202         int ret = vc_config_mgr_set_default_language(language);
203         if (0 != ret) {
204                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Result : %d", ret);
205         } else {
206                 if (0 != vc_setting_dbus_open_connection()) {
207                         SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Fail to open connection");
208                         return VC_ERROR_OPERATION_FAILED;
209                 }
210
211                 if (0 != vc_setting_dbus_request_hello()) {
212                         SLOG(LOG_DEBUG, TAG_VCS, "[DEBUG] Daemon is not available");
213                 } else {
214                         ret = vc_setting_dbus_request_set_language(getpid(), language);
215                         SLOG(LOG_DEBUG, TAG_VCS, "[DEBUG] Set default language (%d)", ret);
216                 }
217
218                 if (0 != vc_setting_dbus_close_connection()) {
219                         SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Fail to close connection");
220                         return VC_ERROR_OPERATION_FAILED;
221                 }
222         }
223
224         SLOG(LOG_DEBUG, TAG_VCS, "@@@");
225
226         return ret;
227 }
228
229 int vc_setting_set_auto_language(bool value)
230 {
231         SLOG(LOG_DEBUG, TAG_VCS, "@@@ Set auto voice");
232
233         if (VC_SETTING_STATE_NONE == g_state) {
234                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Not initialized");
235                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
236                 return VC_ERROR_INVALID_STATE;
237         }
238
239         if (value != true && value != false) {
240                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Invalid value");
241                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
242                 return VC_ERROR_INVALID_PARAMETER;
243         }
244
245         int ret = vc_config_mgr_set_auto_language(value);
246         if (0 != ret) {
247                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Result : %d", ret);
248         } else {
249                 SLOG(LOG_DEBUG, TAG_VCS, "[SUCCESS] Set auto language (%s)", value ? "on" : "off");
250         }
251
252         SLOG(LOG_DEBUG, TAG_VCS, "@@@");
253
254         return ret;
255 }
256
257 int vc_setting_get_auto_language(bool* value)
258 {
259         SLOG(LOG_DEBUG, TAG_VCS, "@@@ Get auto language");
260
261         if (VC_SETTING_STATE_NONE == g_state) {
262                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Not initialized");
263                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
264                 return VC_ERROR_INVALID_STATE;
265         }
266
267         if (NULL == value) {
268                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Param is NULL");
269                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
270                 return VC_ERROR_INVALID_PARAMETER;
271         }
272
273         int ret = vc_config_mgr_get_auto_language(value);
274         if (0 != ret) {
275                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Result : %d", ret);
276         } else {
277                 SLOG(LOG_DEBUG, TAG_VCS, "[SUCCESS] Get auto language (%s)", *value ? "true" : "false");
278         }
279
280         SLOG(LOG_DEBUG, TAG_VCS, "@@@");
281
282         return 0;
283 }
284
285 int vc_setting_set_enabled(bool value)
286 {
287         SLOG(LOG_DEBUG, TAG_VCS, "@@@ Set service enabled");
288
289         if (VC_SETTING_STATE_NONE == g_state) {
290                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Not initialized");
291                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
292                 return VC_ERROR_INVALID_STATE;
293         }
294
295         if (value != true && value != false) {
296                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Invalid value");
297                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
298                 return VC_ERROR_INVALID_PARAMETER;
299         }
300
301         int ret = vc_config_mgr_set_enabled(value);
302         if (0 != ret) {
303                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Result : %d", ret);
304         } else {
305                 SLOG(LOG_DEBUG, TAG_VCS, "[SUCCESS] Set service enabled (%s)", value ? "on" : "off");
306         }
307
308         SLOG(LOG_DEBUG, TAG_VCS, "@@@");
309
310         return ret;
311 }
312
313 int vc_setting_get_enabled(bool* value)
314 {
315         SLOG(LOG_DEBUG, TAG_VCS, "@@@ Get service enabled");
316
317         if (VC_SETTING_STATE_NONE == g_state) {
318                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Not initialized");
319                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
320                 return VC_ERROR_INVALID_STATE;
321         }
322
323         if (NULL == value) {
324                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Param is NULL");
325                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
326                 return VC_ERROR_INVALID_PARAMETER;
327         }
328
329         int ret = vc_config_mgr_get_enabled(value);
330         if (0 != ret) {
331                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Result : %d", ret);
332         } else {
333                 /* Copy value */
334                 SLOG(LOG_DEBUG, TAG_VCS, "[SUCCESS] Get service enabled (%s)", *value ? "on" : "off");
335         }
336
337         SLOG(LOG_DEBUG, TAG_VCS, "@@@");
338
339         return ret;
340 }
341
342 int vc_setting_set_enabled_changed_cb(vc_setting_enabled_changed_cb callback, void* user_data)
343 {
344         SLOG(LOG_DEBUG, TAG_VCS, "@@@ Set service enabled callback");
345
346         if (VC_SETTING_STATE_NONE == g_state) {
347                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Not initialized");
348                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
349                 return VC_ERROR_INVALID_STATE;
350         }
351
352         if (NULL == callback) {
353                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Param is NULL");
354                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
355                 return VC_ERROR_INVALID_PARAMETER;
356         }
357
358         g_callback = callback;
359         g_user_data = user_data;
360
361         SLOG(LOG_DEBUG, TAG_VCS, "@@@");
362
363         return 0;
364 }
365
366 int vc_setting_unset_enabled_changed_cb()
367 {
368         SLOG(LOG_DEBUG, TAG_VCS, "@@@ Unset service enabled callback");
369
370         if (VC_SETTING_STATE_NONE == g_state) {
371                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Not initialized");
372                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
373                 return VC_ERROR_INVALID_STATE;
374         }
375
376         g_callback = NULL;
377         g_user_data = NULL;
378
379         SLOG(LOG_DEBUG, TAG_VCS, "@@@");
380
381         return 0;
382 }
383
384 int vc_setting_set_current_language_changed_cb(vc_setting_current_language_changed_cb callback, void* user_data)
385 {
386         SLOG(LOG_DEBUG, TAG_VCS, "@@@ Set current language changed callback");
387
388         if (VC_SETTING_STATE_NONE == g_state) {
389                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Not initialized");
390                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
391                 return VC_ERROR_INVALID_STATE;
392         }
393
394         if (NULL == callback) {
395                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Param is NULL");
396                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
397                 return VC_ERROR_INVALID_PARAMETER;
398         }
399
400         g_lang_callback = callback;
401         g_lang_user_data = user_data;
402
403         SLOG(LOG_DEBUG, TAG_VCS, "@@@");
404
405         return 0;
406 }
407
408 int vc_setting_unset_current_language_changed_cb()
409 {
410         SLOG(LOG_DEBUG, TAG_VCS, "@@@ Unset current language changed callback");
411
412         if (VC_SETTING_STATE_NONE == g_state) {
413                 SLOG(LOG_ERROR, TAG_VCS, "[ERROR] Not initialized");
414                 SLOG(LOG_DEBUG, TAG_VCS, "@@@");
415                 return VC_ERROR_INVALID_STATE;
416         }
417
418         g_lang_callback = NULL;
419         g_lang_user_data = NULL;
420
421         SLOG(LOG_DEBUG, TAG_VCS, "@@@");
422
423         return 0;
424 }
425