tizen 2.4 release
[apps/home/settings.git] / setting-accessibility / setting-accessibility-screen-reader-settings.c
1 /*
2  * accessibility
3  *
4  * Copyright (c) 2015 Samsung Electronics Co., Ltd.
5  *
6  * Contact: Tomasz Olszak <t.olszak@samsung.com>
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  */
21
22 #include <vconf.h>
23 #include <vconf-internal-keys.h>
24 #include <efl_extension.h>
25
26 #include "setting-accessibility-screen-reader-settings.h"
27
28 #define POPUP_CONTENT_BASE_SIZE 126
29
30 typedef struct {
31         char *label;
32         char *vconf_key;
33         int  *status;
34 } vconf_check_data_s;
35
36
37
38 vconf_check_data_s vconf_check_data[] = {
39         {
40                 .label     = DEVOPTION_STR_ACCESSIBILITY_INDICATOR_TIME,
41                 .vconf_key = VCONFKEY_SETAPPL_ACCESSIBILITY_TTS_INDICATOR_INFORMATION_TIME,
42                 .status    = NULL
43         },
44         {
45                 .label     = DEVOPTION_STR_ACCESSIBILITY_INDICATOR_BATTERY,
46                 .vconf_key = VCONFKEY_SETAPPL_ACCESSIBILITY_TTS_INDICATOR_INFORMATION_BATTERY,
47                 .status    = NULL
48         },
49         {
50                 .label     = DEVOPTION_STR_ACCESSIBILITY_INDICATOR_BLUETOOTH,
51                 .vconf_key = VCONFKEY_SETAPPL_ACCESSIBILITY_TTS_INDICATOR_INFORMATION_BLUETOOTH,
52                 .status    = NULL
53         },
54         {
55                 .label     = DEVOPTION_STR_ACCESSIBILITY_INDICATOR_SIGNAL_STRENGTH,
56                 .vconf_key = VCONFKEY_SETAPPL_ACCESSIBILITY_TTS_INDICATOR_INFORMATION_SIGNAL_STRENGHT,
57                 .status    = NULL
58         },
59         {
60                 .label     = DEVOPTION_STR_ACCESSIBILITY_INDICATOR_DATE,
61                 .vconf_key = VCONFKEY_SETAPPL_ACCESSIBILITY_TTS_INDICATOR_INFORMATION_DATE,
62                 .status    = NULL
63         },
64         {
65                 .label     = DEVOPTION_STR_ACCESSIBILITY_INDICATOR_UNREAD_NOTIFICATIONS,
66                 .vconf_key = VCONFKEY_SETAPPL_ACCESSIBILITY_TTS_INDICATOR_INFORMATION_MISSED_EVENTS,
67                 .status    = NULL
68         }
69 };
70 static Eina_List *items = NULL;
71
72
73
74
75
76 static Eina_Bool __setting_accessibility_screen_reader_settings_page_hide(void *data, Elm_Object_Item *it)
77 {
78         SETTING_TRACE_BEGIN;
79         /* error check */
80         retv_if(data == NULL, EINA_TRUE);
81         SettingAccessibilityUG *ad = (SettingAccessibilityUG *) data;
82         elm_naviframe_item_pop(ad->navi_bar);
83         SETTING_TRACE_END;
84         return EINA_TRUE;
85 }
86
87 static Eina_Bool _vconf_key_value_get(char *key)
88 {
89         retvm_if(!key, EINA_FALSE, "Key is NULL");
90         int value = 0;
91         int ret = vconf_get_bool(key, &value);
92         /*      retvm_if(ret != 0, false, "Invalid argument: data is NULL"); */
93         return (value != 0);
94 }
95
96 static void _vconf_key_value_set(char *key, int value)
97 {
98         retm_if(!key, "key == NULL");
99
100         int ret = vconf_set_bool(key, value);
101
102
103         if (ret != 0) {
104                 LOGE("Failed to set vconf key %s. Error: %d", key, ret);
105                 return;
106         }
107 }
108
109 static void _vconf_key_foreach_check_set(void)
110 {
111         int i;
112         int size = sizeof(vconf_check_data) / sizeof(vconf_check_data[0]);
113         int status = 0;
114         char *key = NULL;
115
116         for (i = 0; i < size; ++i) {
117                 key    = vconf_check_data[i].vconf_key;
118                 status = *(vconf_check_data[i].status);
119                 _vconf_key_value_set(key, status);
120         }
121 }
122
123 static void _cancel_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
124 {
125         SETTING_TRACE_BEGIN
126         Evas_Object *popup = (Evas_Object *)data;
127         retm_if(!popup, "popup == NULL");
128         evas_object_del(popup);
129         SETTING_TRACE_END
130 }
131
132 static void _done_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
133 {
134         SETTING_TRACE_BEGIN
135         Evas_Object *popup = (Evas_Object *)data;
136         retm_if(!popup, "popup == NULL");
137         evas_object_del(popup);
138
139
140         _vconf_key_foreach_check_set();
141         SETTING_TRACE_END
142 }
143
144 static void _check_state_changed_cb(void *data, Evas_Object *obj, void *event_info)
145 {
146         SETTING_TRACE_BEGIN
147         if (!data) {
148                 LOGD("data == NULL");
149                 return;
150         }
151
152         Setting_GenGroupItem_Data *item_data = (Setting_GenGroupItem_Data *)data;
153         item_data->chk_status = elm_check_state_get(obj);
154         LOGE("Check changed: %s; status: %d, %p", item_data->keyStr, item_data->chk_status, &item_data->chk_status);
155
156         SETTING_TRACE_END
157 }
158
159
160 static void _list_item_clicked_cb(void *data, Evas_Object *obj, void *event_info)
161 {
162         SETTING_TRACE_BEGIN
163
164         Elm_Object_Item *item = (Elm_Object_Item *)event_info;
165         retm_if(!item, "item == NULL");
166
167         elm_genlist_item_selected_set(item, EINA_FALSE);
168
169         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
170         retm_if(!list_item, "list_item == NULL");
171
172         LOGI("ITEM SELECTED: %s", list_item->keyStr);
173         setting_update_gl_item_chk_status(list_item, !list_item->chk_status);
174
175         SETTING_TRACE_END
176 }
177
178 static void setting_accessibility_screen_reader_settings_status_bar_info_mouse_up_Gendial_list_cb(void *data,
179                 Evas_Object *obj, void *event_info)
180 {
181         SETTING_TRACE_BEGIN;
182         retm_if(data == NULL, "Invalid argument: data is NULL");
183         retm_if(event_info == NULL, "Invalid argument: event_info is NULL");
184         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
185         SettingAccessibilityUG *ad = (SettingAccessibilityUG *)data;
186         Evas_Object *popup;
187         Evas_Object *box;
188         Evas_Object *genlist;
189         Setting_GenGroupItem_Data *screenreader_checkbox = NULL;
190         int i;
191         int size = sizeof(vconf_check_data) / sizeof(vconf_check_data[0]);
192         int status;
193
194         elm_genlist_item_selected_set(item, EINA_FALSE);
195
196         popup = elm_popup_add(ad->win_main_layout);
197         elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
198         /*      eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, eext_popup_back_cb, NULL); */
199         elm_object_part_text_set(popup, "title,text", _(DEVOPTION_STR_ACCESSIBILITY_SCREEN_READER_SETTINGS_STATUS_BAR_INFORMATION));
200         evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
201
202         /* box */
203         box = elm_box_add(popup);
204         evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
205
206         /* genlist */
207         genlist = elm_genlist_add(box);
208         evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
209         evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
210
211         for (i = 0; i < size; ++i) {
212                 status = _vconf_key_value_get(vconf_check_data[i].vconf_key);
213
214                 screenreader_checkbox = setting_create_Gendial_field_def(genlist, &itc_1text_1icon,
215                                                                                                                                  _list_item_clicked_cb,
216                                                                                                                                  ad, SWALLOW_Type_1ICON_1RADIO, NULL,
217                                                                                                                                  NULL, status, _(vconf_check_data[i].label),
218                                                                                                                                  NULL, _check_state_changed_cb);
219
220                 vconf_check_data[i].status = &screenreader_checkbox->chk_status;
221                 items = eina_list_append(items, screenreader_checkbox);
222         }
223
224         elm_scroller_movement_block_set(genlist, ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL | ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL);
225         elm_scroller_policy_set(genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
226
227         evas_object_show(genlist);
228         elm_box_pack_end(box, genlist);
229         evas_object_size_hint_min_set(box, -1, ELM_SCALE_SIZE(POPUP_CONTENT_BASE_SIZE) * size);
230         evas_object_size_hint_max_set(box, -1, ELM_SCALE_SIZE(POPUP_CONTENT_BASE_SIZE) * size);
231         elm_object_content_set(popup, box);
232
233         const char *btnCancelText = "Cancel";
234         const char *btnDoneText = "Done";
235
236         Evas_Object *btnCancel = setting_create_button(popup, btnCancelText, NULL, _cancel_button_clicked_cb, popup);
237         elm_object_style_set(btnCancel, "popup");
238         elm_object_part_content_set(popup, _("button1"), btnCancel);
239         evas_object_data_set(popup, _("button1"), btnCancelText);
240
241         Evas_Object *btnDone = setting_create_button(popup, btnDoneText, NULL, _done_button_clicked_cb, popup);
242         elm_object_style_set(btnDone, "popup");
243
244         elm_object_part_content_set(popup, _("button2"), btnDone);
245         evas_object_data_set(popup, _("button2"), btnDoneText);
246
247         eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, _cancel_button_clicked_cb, popup);
248
249         evas_object_show(popup);
250
251         SETTING_TRACE_END;
252 }
253
254 void setting_accessibility_screen_reader_settings_page_create(SettingAccessibilityUG *data)
255 {
256         SettingAccessibilityUG *ad = (SettingAccessibilityUG *) data;
257         Evas_Object *genlist = elm_genlist_add(ad->navi_bar);
258         retvm_if(genlist == NULL, NULL, "Cannot set genlist object as content of layout");
259         elm_genlist_realization_mode_set(genlist, EINA_TRUE);
260         elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
261         elm_object_style_set(genlist, "dialogue");
262         elm_genlist_clear(genlist);
263
264
265         (void)setting_create_Gendial_field_titleItem(genlist, &(itc_group_item), _(DEVOPTION_STR_ACCESSIBILITY_SCREEN_READER_SETTINGS_SPEECH), NULL);
266         (void)setting_create_Gendial_field_titleItem(genlist, &(itc_group_item), _(DEVOPTION_STR_ACCESSIBILITY_SCREEN_READER_SETTINGS_OTHER_FEEDBACK), NULL);
267
268         Setting_GenGroupItem_Data *status_bar_information_item =
269                 setting_create_Gendial_field_def(genlist, &itc_1text,
270                                                                                  setting_accessibility_screen_reader_settings_status_bar_info_mouse_up_Gendial_list_cb,
271                                                                                  ad, SWALLOW_Type_INVALID, NULL,
272                                                                                  NULL, 1, _(DEVOPTION_STR_ACCESSIBILITY_SCREEN_READER_SETTINGS_STATUS_BAR_INFORMATION),
273                                                                                  NULL,
274                                                                                  NULL);
275
276         status_bar_information_item->userdata = ad;
277         __BACK_POINTER_SET(status_bar_information_item);
278
279
280         Setting_GenGroupItem_Data *multiline_status_bar_information_description =
281                 setting_create_Gendial_field_def(genlist, &itc_multiline_text,
282                                                                                  NULL,
283                                                                                  ad, SWALLOW_Type_INVALID, NULL,
284                                                                                  NULL, 0,
285                                                                                  _(DEVOPTION_STR_ACCESSIBILITY_SCREEN_READER_SETTINGS_STATUS_BAR_INFORMATION_DESCRIPTION), NULL, NULL);
286         multiline_status_bar_information_description->userdata = ad;
287         __BACK_POINTER_SET(multiline_status_bar_information_description);
288
289
290         Elm_Object_Item *navi_it = elm_naviframe_item_push(ad->navi_bar, _(DEVOPTION_STR_ACCESSIBILITY_SCREEN_READER_SETTINGS), NULL, NULL, genlist, NULL);
291         elm_object_item_domain_text_translatable_set(navi_it, SETTING_PACKAGE, EINA_TRUE);
292
293         elm_naviframe_item_pop_cb_set(navi_it, (Elm_Naviframe_Item_Pop_Cb)__setting_accessibility_screen_reader_settings_page_hide, ad);
294 }