2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.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
8 * http://www.tizenopensource.org/license
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.
17 #include "cst-common.h"
18 #include "cst-common-string.h"
19 #include "cst-call-setting.h"
20 #include "cst-widget.h"
21 #include "cst-tapi-request.h"
22 #include "cst-status-tone.h"
23 #include "cst-forwarding.h"
24 #include "cst-barring.h"
25 #include "cst-prefix-dial.h"
26 #include "cst-waiting.h"
28 #include <ui-gadget-module.h>
29 #include <Elementary.h>
32 static Elm_Genlist_Item_Class *itc_1text = NULL;
33 static Elm_Genlist_Item_Class *itc_1text_1icon = NULL;
34 static Elm_Genlist_Item_Class *itc_2text_expand = NULL;
35 static Elm_Genlist_Item_Class *itc_title = NULL;
36 static Elm_Genlist_Item_Class *itc_sub_expand = NULL;
37 static Elm_Genlist_Item_Class *itc_help = NULL;
38 static void __cst_on_click_expanded(void *data, Evas *evas, Evas_Object *obj, void *event_info);
39 static void __cst_on_click_auto_redial(void *data, Evas *evas, Evas_Object *obj, void *event_info);
41 static CstGlItemDisplayInfo_t list_dep1[] = {
42 {1, CST_STR_SHOW_MY_NUMBER, ELM_GENLIST_ITEM_TREE, CST_GL_ITEM_EXPANDABLE, __cst_on_click_expanded},
43 {1, CST_STR_PREFIX_DIALLING, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_TEXT, _cst_on_click_prefix_dialling},
44 {1, CST_STR_CALL_STATUS_TONES, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_TEXT, _cst_on_click_call_status_tone},
45 {1, CST_STR_EDIT_SOUND_SETTINGS_DURING_CALL, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_HELP_TEXT, NULL},
46 {1, CST_STR_ALERTS_ON_CALL, ELM_GENLIST_ITEM_TREE, CST_GL_ITEM_EXPANDABLE, __cst_on_click_expanded},
48 {1, CST_STR_CALL, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_DG_TITLE, NULL},
49 /* {1, CST_STR_CALL_FORWARDING, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_TEXT, _cst_on_click_call_forwarding},
50 {1, CST_STR_CALL_BARRING, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_TEXT, _cst_on_click_call_barring},
51 */ {1, CST_STR_CALL_WAITING, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_TEXT, _cst_on_click_call_waiting},
52 /* {1, CST_STR_AUTO_REDIAL, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_1TEXT_ONOFF, __cst_on_click_auto_redial},
53 {1, CST_STR_DO_NOT_REDIAL_IF_CALL_IS_UNABLE, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_HELP_TEXT, NULL},
56 {1, -1, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_NONE, NULL},
59 static CstGlItemDisplayInfo_t list_dep2_show_my_number[] = {
60 {2, CST_STR_BY_NETWORK, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_RADIO_1TEXT, (void *)CST_CLI_BY_NETWORK},
61 {2, CST_STR_SHOW, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_RADIO_1TEXT, (void *)CST_CLI_SHOW},
62 {2, CST_STR_HIDE, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_RADIO_1TEXT, (void *)CST_CLI_HIDE},
63 {2, -1, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_NONE, NULL},
66 static CstGlItemDisplayInfo_t list_dep2_alerts_on_call[] = {
67 {2, CST_STR_OFF, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_RADIO_1TEXT, (void *)CST_ALERTS_ON_CALL_OFF},
68 {2, CST_STR_SOUND, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_RADIO_1TEXT, (void *)CST_ALERTS_ON_CALL_SOUND},
69 {2, CST_STR_VIBRATION, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_RADIO_1TEXT, (void *)CST_ALERTS_ON_CALL_VIBRATION},
70 {2, -1, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_NONE, NULL},
73 static char *__cst_gl_label_get_phone(void *data, Evas_Object *obj, const char *part)
75 retv_if(NULL == data, NULL);
76 CstGlItemData_t *item_data = (CstGlItemData_t *)data;
78 if ((strcmp(part, "elm.text") == 0) ||
79 (strcmp(part, "elm.text.1") == 0)) {
80 return strdup(T_(list_dep1[item_data->index].str_id));
85 static char *__cst_gl_label_get_expandable(void *data, Evas_Object *obj, const char *part)
87 retv_if(NULL == data, NULL);
88 CstGlItemData_t *item_data = (CstGlItemData_t *)data;
89 if (!strcmp(part, "elm.text.1")) {
90 return strdup(T_(list_dep1[item_data->index].str_id));
91 } else if (!strcmp(part, "elm.text.2")) {
93 if (CST_STR_SHOW_MY_NUMBER == list_dep1[item_data->index].str_id) {
94 _cst_vconf_get_int(VCONFKEY_CISSAPPL_SHOW_MY_NUMBER_INT, &value);
95 return strdup(T_(list_dep2_show_my_number[value].str_id));
97 _cst_vconf_get_int(VCONFKEY_CISSAPPL_ALERT_ON_CALL_INT, &value);
98 return strdup(T_(list_dep2_alerts_on_call[value].str_id));
104 static void __cst_gl_del_phone(void *data, Evas_Object *obj)
106 CstGlItemData_t *item_data = (CstGlItemData_t *)data;
112 static void __cst_on_click_auto_redial(void *data, Evas *evas, Evas_Object *obj, void *event_info)
114 ret_if(NULL == data);
115 CstGlItemData_t *item_data = (CstGlItemData_t *)data;
116 Eina_Bool check_state = elm_check_state_get(item_data->eo_check);
117 _cst_vconf_set_bool(VCONFKEY_CISSAPPL_VOICE_AUTO_REDIAL_BOOL, !check_state);
118 _cst_vconf_set_bool(VCONFKEY_CISSAPPL_VIDEO_AUTO_REDIAL_BOOL, !check_state);
119 elm_genlist_item_update(item_data->gl_item);
122 static void __cst_gl_sel_phone(void *data, Evas_Object *obj, void *event_info)
124 elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
125 Elm_Object_Item *it = (Elm_Object_Item *)event_info;
126 CstGlItemData_t *item_data = (CstGlItemData_t *)elm_object_item_data_get(it);
127 CstUgData_t *ugd = (CstUgData_t *)item_data->ugd;
129 if (list_dep1[item_data->index].func)
130 if (list_dep1[item_data->index].style == CST_GL_ITEM_1TEXT_ONOFF ||
131 list_dep1[item_data->index].style == CST_GL_ITEM_1TEXT_ONOFF_PROGRESS)
132 list_dep1[item_data->index].func((void *)item_data, NULL, obj, event_info);
134 list_dep1[item_data->index].func((void *)ugd, NULL, obj, event_info);
138 static void __cst_on_changed_auto_redial_check(void *data, Evas_Object *obj, void *event_info)
140 ENTER(__cst_on_changed_auto_redial_check);
141 Eina_Bool check_state = elm_check_state_get(obj);
143 _cst_vconf_set_bool(VCONFKEY_CISSAPPL_VOICE_AUTO_REDIAL_BOOL, check_state);
144 _cst_vconf_set_bool(VCONFKEY_CISSAPPL_VIDEO_AUTO_REDIAL_BOOL, check_state);
147 static Evas_Object *__cst_gl_icon_get_phone(void *data, Evas_Object *obj, const char *part)
149 retv_if(NULL == data, NULL);
150 CstGlItemData_t *item_data = (CstGlItemData_t *)data;
152 if (!strcmp(part, "elm.icon")) {
153 if (list_dep1[item_data->index].style == CST_GL_ITEM_1TEXT_ONOFF) {
154 if (CST_STR_AUTO_REDIAL == list_dep1[item_data->index].str_id) {
156 _cst_vconf_get_bool(VCONFKEY_CISSAPPL_VOICE_AUTO_REDIAL_BOOL, &value);
157 item_data->eo_check = _cst_create_onoff_button(obj, value,
158 __cst_on_changed_auto_redial_check, item_data);
161 return item_data->eo_check;
166 static void __cst_gl_sel_show_my_number(void *data, Evas_Object *obj, void *event_info)
168 elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
169 ret_if(NULL == data);
170 CstGlItemData_t *item_data = (CstGlItemData_t *)data;
171 CstUgData_t *ugd = (CstUgData_t *)item_data->ugd;
172 _cst_vconf_set_int(VCONFKEY_CISSAPPL_SHOW_MY_NUMBER_INT,
173 (int)list_dep2_show_my_number[item_data->index].func);
174 if (ugd->rdg_show_my_number) {
175 elm_radio_value_set(ugd->rdg_show_my_number,
176 (int)list_dep2_show_my_number[item_data->index].func);
177 elm_genlist_item_update(item_data->parent_gl_item);
182 static char *__cst_gl_label_get_sub_exp(void *data, Evas_Object *obj, const char *part)
184 retv_if(NULL == data, NULL);
185 CstGlItemData_t *item_data = (CstGlItemData_t *)data;
186 CstGlItemData_t *parent_item_data = (CstGlItemData_t *)elm_object_item_data_get(item_data->parent_gl_item);
188 if (strcmp(part, "elm.text") == 0) {
189 if (CST_STR_SHOW_MY_NUMBER == list_dep1[parent_item_data->index].str_id) {
190 return strdup(T_(list_dep2_show_my_number[item_data->index].str_id));
191 } else if (CST_STR_ALERTS_ON_CALL == list_dep1[parent_item_data->index].str_id) {
192 return strdup(T_(list_dep2_alerts_on_call[item_data->index].str_id));
194 DBG("Unknown parent");
201 static Evas_Object *__cst_gl_icon_get_sub_exp(void *data, Evas_Object *obj, const char *part)
203 retv_if(NULL == data, NULL);
204 CstGlItemData_t *item_data = (CstGlItemData_t *)data;
205 CstUgData_t *ugd = (CstUgData_t *)item_data->ugd;
206 retv_if(NULL == ugd, NULL);
207 CstGlItemData_t *parent_item_data = (CstGlItemData_t *)elm_object_item_data_get(item_data->parent_gl_item);
209 if (!strcmp(part, "elm.icon")) {
211 if (CST_STR_SHOW_MY_NUMBER == list_dep1[parent_item_data->index].str_id) {
212 if (NULL == ugd->rdg_show_my_number) {
213 ugd->rdg_show_my_number = elm_radio_add(obj);
214 elm_radio_value_set(ugd->rdg_show_my_number, - 1);
217 radio = _cst_create_radio_icon(obj, ugd->rdg_show_my_number,
218 (int)list_dep2_show_my_number[item_data->index].func, 0,
219 VCONFKEY_CISSAPPL_SHOW_MY_NUMBER_INT);
220 } else if (CST_STR_ALERTS_ON_CALL == list_dep1[parent_item_data->index].str_id) {
221 if (NULL == ugd->rdg_alerts_on_call) {
222 ugd->rdg_show_my_number = elm_radio_add(obj);
223 elm_radio_value_set(ugd->rdg_alerts_on_call, - 1);
226 radio = _cst_create_radio_icon(obj, ugd->rdg_alerts_on_call,
227 (int)list_dep2_alerts_on_call[item_data->index].func, 0,
228 VCONFKEY_CISSAPPL_ALERT_ON_CALL_INT);
230 DBG("Unknown parent");
238 static void __cst_gl_sel_alerts_on_call(void *data, Evas_Object *obj, void *event_info)
240 elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
241 ret_if(NULL == data);
242 CstGlItemData_t *item_data = (CstGlItemData_t *)data;
243 CstUgData_t *ugd = (CstUgData_t *)item_data->ugd;
245 _cst_vconf_set_int(VCONFKEY_CISSAPPL_ALERT_ON_CALL_INT,
246 (int)list_dep2_alerts_on_call[item_data->index].func);
247 if (ugd->rdg_alerts_on_call) {
248 elm_radio_value_set(ugd->rdg_alerts_on_call,
249 (int)list_dep2_alerts_on_call[item_data->index].func);
250 elm_genlist_item_update(item_data->parent_gl_item);
255 static void __cst_gl_con(void *data, Evas_Object *obj, void *event_info)
258 Elm_Object_Item *item = event_info;
259 elm_genlist_item_subitems_clear(item);
262 static void __cst_gl_exp_req(void *data, Evas_Object *obj, void *event_info)
264 ENTER(__cst_gl_exp_req);
266 ret_if(NULL == data);
267 CstUgData_t *ugd = (CstUgData_t *)data;
269 Elm_Object_Item *item = event_info;
270 elm_genlist_item_expanded_set(item, 1);
273 static void __cst_gl_con_req(void *data, Evas_Object *obj, void *event_info)
275 ENTER(__cst_gl_con_req);
276 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
277 elm_genlist_item_expanded_set(item, 0);
280 static void __cst_gl_exp(void *data, Evas_Object *obj, void *event_info)
283 ret_if(NULL == data);
284 CstUgData_t *ugd = (CstUgData_t *)data;
285 Elm_Object_Item *it = (Elm_Object_Item *)event_info;
287 CstGlItemData_t *parent_item_data1 = (CstGlItemData_t *)elm_object_item_data_get(it);
288 Evas_Object *genlist = elm_object_item_widget_get(it);
289 ret_if(NULL == parent_item_data1);
290 ret_if(NULL == genlist);
292 CstGlItemData_t *sub_item_data;
296 if (CST_STR_SHOW_MY_NUMBER == list_dep1[parent_item_data1->index].str_id) {
297 ugd->rdg_show_my_number = NULL;
298 ugd->rdg_show_my_number = elm_radio_add(genlist);
299 elm_radio_value_set(ugd->rdg_show_my_number, -1);
300 for (i = 0; list_dep2_show_my_number[i].style != CST_GL_ITEM_NONE; ++i) {
301 sub_item_data = (CstGlItemData_t *)calloc(1, sizeof(CstGlItemData_t));
302 ret_if(sub_item_data == NULL);
303 sub_item_data->index = i;
304 sub_item_data->ugd = ugd;
305 sub_item_data->parent_gl_item = it;
306 elm_genlist_item_append(genlist, itc_sub_expand,
307 (void *)sub_item_data, it,
308 list_dep2_show_my_number[i].flags,
309 __cst_gl_sel_show_my_number, sub_item_data);
311 } else if (CST_STR_ALERTS_ON_CALL == list_dep1[parent_item_data1->index].str_id) {
312 ugd->rdg_alerts_on_call = NULL;
313 ugd->rdg_alerts_on_call = elm_radio_add(genlist);
314 elm_radio_value_set(ugd->rdg_alerts_on_call, -1);
315 for (i = 0; list_dep2_alerts_on_call[i].style != CST_GL_ITEM_NONE; ++i) {
316 sub_item_data = (CstGlItemData_t *)calloc(1, sizeof(CstGlItemData_t));
317 ret_if(sub_item_data == NULL);
318 sub_item_data->index = i;
319 sub_item_data->ugd = ugd;
320 sub_item_data->parent_gl_item = it;
321 elm_genlist_item_append(genlist, itc_sub_expand,
322 (void *)sub_item_data, it, list_dep2_alerts_on_call[i].flags,
323 __cst_gl_sel_alerts_on_call, sub_item_data);
328 static void __cst_on_click_expanded(void *data, Evas *evas, Evas_Object *obj, void *event_info)
330 ENTER(__cst_on_click_expanded);
331 ret_if(NULL == data);
332 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
333 if (elm_genlist_item_expanded_get(item)) {
334 __cst_gl_con_req(data, obj, event_info);
335 __cst_gl_con(data, obj, event_info);
337 __cst_gl_exp_req(data, obj, event_info);
338 __cst_gl_exp(data, obj, event_info);
342 static void __cst_on_clicked_back_btn(void *data, Evas_Object *obj, void *event_info)
344 ENTER(__cst_on_clicked_back_btn);
345 CstUgData_t *ugd = (CstUgData_t *)data;
347 ug_destroy_me(ugd->ug);
350 static void __cst_navifr_updated_cb(void *data, Evas_Object *obj, void *event_info)
352 ret_if(NULL == data);
353 Elm_Object_Item *item = (Elm_Object_Item *)data;
354 elm_genlist_item_expanded_set(item, 0);
355 elm_genlist_item_subitems_clear(item);
358 static void __cst_set_genlist_item_styles_phone(void)
360 ENTER(__cst_set_genlist_item_styles_phone);
363 itc_1text = elm_genlist_item_class_new();
364 if (!itc_1text_1icon)
365 itc_1text_1icon = elm_genlist_item_class_new();
366 if (!itc_2text_expand)
367 itc_2text_expand = elm_genlist_item_class_new();
369 itc_title = elm_genlist_item_class_new();
371 itc_help = elm_genlist_item_class_new();
373 itc_sub_expand = elm_genlist_item_class_new();
375 itc_1text->item_style = "dialogue/1text";
376 itc_1text->func.text_get = __cst_gl_label_get_phone;
377 itc_1text->func.content_get = NULL;
378 itc_1text->func.state_get = NULL;
379 itc_1text->func.del = __cst_gl_del_phone;
381 itc_1text_1icon->item_style = "dialogue/1text.1icon";
382 itc_1text_1icon->func.text_get = __cst_gl_label_get_phone;
383 itc_1text_1icon->func.content_get = __cst_gl_icon_get_phone;
384 itc_1text_1icon->func.state_get = NULL;
385 itc_1text_1icon->func.del = __cst_gl_del_phone;
387 itc_2text_expand->item_style = "dialogue/2text.3/expandable";
388 itc_2text_expand->func.text_get = __cst_gl_label_get_expandable;
389 itc_2text_expand->func.content_get = NULL;
390 itc_2text_expand->func.state_get = NULL;
391 itc_2text_expand->func.del = __cst_gl_del_phone;
393 itc_title->item_style = "dialogue/title";
394 itc_title->func.text_get = __cst_gl_label_get_phone;
395 itc_title->func.content_get = NULL;
396 itc_title->func.state_get = NULL;
397 itc_title->func.del = __cst_gl_del_phone;
399 itc_help->item_style = "multiline/1text";
400 itc_help->func.text_get = __cst_gl_label_get_phone;
401 itc_help->func.content_get = NULL;
402 itc_help->func.state_get = NULL;
403 itc_help->func.del = __cst_gl_del_phone;
405 itc_sub_expand->item_style = "dialogue/1text.1icon/expandable2";
406 itc_sub_expand->func.text_get = __cst_gl_label_get_sub_exp;
407 itc_sub_expand->func.content_get = __cst_gl_icon_get_sub_exp;
408 itc_sub_expand->func.state_get = NULL;
409 itc_sub_expand->func.del = __cst_gl_del_phone;
412 static Evas_Object *__cst_create_genlist_phone(void *data)
414 ENTER(__cst_create_genlist_phone);
415 ret_if(NULL == data);
416 CstUgData_t *ugd = (CstUgData_t *)data;
417 CstGlItemData_t *item_data;
418 Evas_Object *genlist;
421 genlist = elm_genlist_add(ugd->nf);
422 ret_if(NULL == genlist);
423 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
425 _cst_create_genlist_seperator(genlist, EINA_FALSE);
426 for (i = 0; list_dep1[i].style != CST_GL_ITEM_NONE; ++i) {
427 item_data = (CstGlItemData_t *)calloc(1, sizeof(CstGlItemData_t));
428 ret_if(item_data == NULL);
430 item_data->index = i;
431 item_data->ugd = ugd;
432 if (list_dep1[i].style == CST_GL_ITEM_TEXT) {
433 item_data->gl_item = elm_genlist_item_append(genlist, itc_1text,
434 (void *)item_data, NULL, list_dep1[i].flags,
435 __cst_gl_sel_phone, ugd);
436 } else if (list_dep1[i].style == CST_GL_ITEM_IMG_1TEXT) {
437 item_data->gl_item = elm_genlist_item_append(genlist, itc_1text_1icon,
438 (void *)item_data, NULL, list_dep1[i].flags,
439 __cst_gl_sel_phone, ugd);
440 } else if (list_dep1[i].style == CST_GL_ITEM_1TEXT_ONOFF) {
441 item_data->gl_item = elm_genlist_item_append(genlist, itc_1text_1icon,
442 (void *)item_data, NULL, list_dep1[i].flags,
443 __cst_gl_sel_phone, ugd);
444 } else if (list_dep1[i].style == CST_GL_ITEM_RADIO_1TEXT) {
445 item_data->gl_item = elm_genlist_item_append(genlist, itc_1text_1icon,
446 (void *)item_data, NULL, list_dep1[i].flags,
447 __cst_gl_sel_phone, ugd);
448 } else if (list_dep1[i].style == CST_GL_ITEM_EXPANDABLE) {
449 item_data->gl_item = elm_genlist_item_append(genlist, itc_2text_expand,
450 (void *)item_data, NULL, list_dep1[i].flags,
451 __cst_gl_sel_phone, ugd);
452 evas_object_smart_callback_add(ugd->nf, "transition,finished",
453 __cst_navifr_updated_cb, item_data->gl_item);
454 } else if (list_dep1[i].style == CST_GL_ITEM_DG_TITLE) {
455 item_data->gl_item = elm_genlist_item_append(genlist, itc_title,
456 (void *)item_data, NULL, list_dep1[i].flags,
458 elm_genlist_item_select_mode_set(item_data->gl_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
459 } else if (list_dep1[i].style == CST_GL_ITEM_HELP_TEXT) {
460 item_data->gl_item = elm_genlist_item_append(genlist, itc_help,
461 (void *)item_data, NULL, list_dep1[i].flags,
463 elm_genlist_item_select_mode_set(item_data->gl_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
464 _cst_create_genlist_underline(genlist);
474 void _cst_create_call_setting(void *data)
476 ENTER(_cst_create_call_setting);
477 ret_if(NULL == data);
478 CstUgData_t *ugd = (CstUgData_t *)data;
480 __cst_set_genlist_item_styles_phone();
481 Evas_Object *genlist = __cst_create_genlist_phone(ugd);
482 Evas_Object *back_btn = elm_button_add(ugd->nf);
483 evas_object_smart_callback_add(back_btn, "clicked",
484 __cst_on_clicked_back_btn, ugd);
486 elm_naviframe_item_push(ugd->nf, T_(CST_STR_PHONE),
487 back_btn, NULL, genlist, NULL);
488 elm_object_style_set(back_btn, "naviframe/back_btn/default");