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 <Elementary.h>
19 #include "cst-common-string.h"
20 #include "cst-call-setting.h"
22 #include "cst-barring.h"
23 #include "cst-barring-ime.h"
24 #include "cst-widget.h"
25 #include "cst-common.h"
26 #include "cst-tapi-request.h"
29 static void __cst_on_click_cb_onoff(void *data, Evas *evas, Evas_Object *obj, void *event_info);
30 static void __cst_on_click_voice_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info);
31 static void __cst_on_click_video_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info);
33 static Elm_Genlist_Item_Class *itc_1text_1icon = NULL;
34 static Elm_Genlist_Item_Class *itc_1text = NULL;
35 static Elm_Object_Item *ec_item[3];
37 static CstGlItemDisplayInfo_t list_call_type[] = {
38 {1, CST_STR_VOICECALL, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_TEXT, __cst_on_click_voice_cb},
39 {1, CST_STR_VIDEOCALL, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_TEXT, __cst_on_click_video_cb},
41 {1, -1, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_NONE, NULL},
44 static CstGlItemDisplayInfo_t list_call_barring[] = {
45 {1, CST_STR_CALL_ALL_OUTGOING_CALLS, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_1TEXT_ONOFF_PROGRESS, __cst_on_click_cb_onoff},
46 {1, CST_STR_INTL_CALLS, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_1TEXT_ONOFF_PROGRESS, __cst_on_click_cb_onoff},
47 {1, CST_STR_CALL_INTL_EXCEPT_HOME, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_1TEXT_ONOFF_PROGRESS, __cst_on_click_cb_onoff},
48 {1, CST_STR_ALL_INCOMING_CALLS, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_1TEXT_ONOFF_PROGRESS, __cst_on_click_cb_onoff},
49 {1, CST_STR_CALL_INCOMING_WHEN_ROAMING, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_1TEXT_ONOFF_PROGRESS, __cst_on_click_cb_onoff},
51 {1, -1, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_NONE, NULL},
54 static void __cst_on_click_cb_back_button(void *data, Evas_Object *obj, void *event_info)
56 ENTER(__cst_on_click_cb_back_button);
57 retm_if(data == NULL, "NULL UgData");
59 CstUgData_t *ugd = (CstUgData_t *)data;
60 _cst_cancel_all_ss_request(ugd);
62 ugd->back_button = _cst_get_navifr_prev_btn(ugd->nf);
65 static void __cst_disable_cb_glitem(CstGlItemData_t *item_data)
67 ENTER(__cst_disable_cb_glitem);
68 CstUgData_t *ugd = (CstUgData_t *)item_data->ugd;
69 ugd->cb_state[item_data->index] = CST_SS_STATE_OFF;
70 elm_genlist_item_update(item_data->gl_item);
71 elm_object_item_disabled_set(item_data->gl_item, EINA_TRUE);
73 elm_object_item_disabled_set(ec_item[0], EINA_FALSE);
76 static int __cst_update_cb_state(int call_type, int cb_flavour,
77 Eina_Bool cb_state, char *number,
78 int error, int req_action, void *data)
81 CstGlItemData_t *item_data = (CstGlItemData_t *)data;
82 CstUgData_t *ugd = item_data->ugd;
83 DBG("call_type=%d (0:voice 1:video)", call_type);
84 DBG("cb_flavour=%d (6:BAOC 7:BAOIC 8:BAOIC exc home 9:BAIC 10:BAIC roaming)", cb_flavour);
85 DBG("cb_state=%d (1:on 0:off), error=%d", cb_state, error);
86 DBG("req_action=%d(0: Activate, 1:Deactivate, 2:Query)", req_action);
87 retv_if((call_type != ugd->call_type && call_type != CST_CALLTYPE_ALL), -1);
89 if (error == CST_ERROR_NONE) {
90 if (cb_state == EINA_TRUE)
91 ugd->cb_state[item_data->index] = CST_SS_STATE_ON;
93 ugd->cb_state[item_data->index] = CST_SS_STATE_OFF;
94 elm_genlist_item_update(item_data->gl_item);
96 if (req_action != CST_ACTION_QUERY) {
97 if (error != CST_ERROR_SERVICE_UNAVAILABLE &&
98 error != CST_ERROR_REJECTED_BY_NETWORK &&
99 error != CST_ERROR_UNKNOWN) {
100 if (req_action == CST_ACTION_DEACTIVATE)
101 ugd->cb_state[item_data->index] = CST_SS_STATE_ON;
103 ugd->cb_state[item_data->index] = CST_SS_STATE_OFF;
105 ugd->cb_state[item_data->index] = CST_SS_STATE_OFF;
107 elm_genlist_item_update(item_data->gl_item);
108 ugd->popup = (Evas_Object *)_cst_create_error_popup(ugd->nf, error);
109 evas_object_show(ugd->popup);
111 __cst_disable_cb_glitem(item_data);
116 static void __cst_query_cb_status(CstGlItemData_t *item_data)
118 ENTER(__cst_query_cb_status);
119 ret_if(NULL == item_data);
120 CstUgData_t *ugd = (CstUgData_t *)item_data->ugd;
123 ugd->original_state = EINA_FALSE;
124 switch (item_data->index) {
126 cb_flavour = CST_SSTYPE_CB_OC;
127 DBG("CST_SSTYPE_CB_OC");
130 cb_flavour = CST_SSTYPE_CB_OIC;
131 DBG("CST_SSTYPE_CB_OIC");
134 cb_flavour = CST_SSTYPE_CB_OICEH;
135 DBG("CST_SSTYPE_CB_OICEH");
138 cb_flavour = CST_SSTYPE_CB_IC;
139 DBG("CST_SSTYPE_CB_IC");
142 cb_flavour = CST_SSTYPE_CB_ICR;
143 DBG("CST_SSTYPE_CB_ICR");
150 _cst_add_ss_request(&ugd->req_queue,
151 CST_ACTION_QUERY, ugd->call_type, cb_flavour,
152 NULL, __cst_update_cb_state, item_data);
155 static void __cst_on_click_cb_check_status_btn(void *data, Evas_Object *obj, void *event_info)
157 ENTER(__cst_on_click_cb_check_status_btn);
160 Evas_Object *genlist = (Evas_Object *)data;
161 CstGlItemData_t *item_data;
163 Eina_List *realized_list;
167 realized_list = elm_genlist_realized_items_get(genlist);
168 EINA_LIST_FOREACH(realized_list, l, it) {
169 item_data = (CstGlItemData_t *)elm_object_item_data_get(it);
170 if (elm_object_item_disabled_get(it) == EINA_TRUE) {
171 ugd = item_data->ugd;
172 ugd->cb_state[item_data->index] = CST_SS_STATE_PROGRESS;
173 __cst_query_cb_status(item_data);
174 elm_object_item_disabled_set(it, EINA_FALSE);
175 elm_genlist_item_update(it);
178 elm_object_item_disabled_set(ec_item[0], EINA_TRUE);
181 static void __cst_on_click_cb_ime_done_btn(void *data, Evas_Object *obj, void *event_info)
183 ENTER(__cst_on_click_cb_ime_done_btn);
186 CallSettingReq_t *req = (CallSettingReq_t *)data;
188 CstGlItemData_t *item_data = (CstGlItemData_t *)req->data;
189 CstUgData_t *ugd = item_data->ugd;
191 char buffer[CST_MAX_PHONE_NUMBER_LEN];
193 if (_cst_get_cb_input_password(buffer, ugd) > 0) {
194 ugd->cb_state[item_data->index] = CST_SS_STATE_PROGRESS;
195 elm_genlist_item_update(item_data->gl_item);
197 DBG("activate CB pwd=%s", buffer);
198 snprintf(req->number, CST_MAX_PHONE_NUMBER_LEN, "%s", buffer);
199 _cst_add_ss_request(&ugd->req_queue,
200 req->action, req->call_type, req->flavour,
201 req->number, __cst_update_cb_state, item_data);
203 memset(ugd->c_item, 0, sizeof(ugd->c_item));
204 elm_naviframe_item_pop(ugd->nf);
205 ugd->back_button = _cst_get_navifr_prev_btn(ugd->nf);
209 static void __cst_on_click_cb_ime_cancel_btn(void *data, Evas_Object *obj, void *event_info)
211 ENTER(__cst_on_click_cb_ime_cancel_btn);
214 CallSettingReq_t *req = (CallSettingReq_t *)data;
215 CstGlItemData_t *item_data = (CstGlItemData_t *)req->data;
216 CstUgData_t *ugd = item_data->ugd;
218 DBG("original state : %d", req->original_state);
219 if (req->original_state == CST_SS_STATE_ON)
220 ugd->cb_state[item_data->index] = CST_SS_STATE_ON;
222 ugd->cb_state[item_data->index] = CST_SS_STATE_OFF;
223 elm_genlist_item_update(item_data->gl_item);
225 memset(ugd->c_item, 0, sizeof(ugd->c_item));
226 elm_naviframe_item_pop(ugd->nf);
227 ugd->back_button = _cst_get_navifr_prev_btn(ugd->nf);
232 static char *__cst_gl_label_get_cb(void *data, Evas_Object *obj, const char *part)
234 retv_if(NULL == data, NULL);
235 CstGlItemData_t *item_data = (CstGlItemData_t *)data;
237 if (strcmp(part, "elm.text") == 0) {
238 return strdup(T_(list_call_barring[item_data->index].str_id));
243 static void __cst_gl_del_cb(void *data, Evas_Object *obj)
245 CstGlItemData_t *item_data = (CstGlItemData_t *)data;
251 static void __cst_update_change_cb_req(CstGlItemData_t *item_data, Eina_Bool req_state)
253 ret_if(item_data == NULL);
256 CallSettingReq_t *req = NULL;
257 CstUgData_t *ugd = item_data->ugd;
258 Elm_Object_Item *navi_it;
261 req = (CallSettingReq_t *)calloc(1, sizeof(CallSettingReq_t));
265 req->data = item_data;
266 req->call_type = ugd->call_type;
269 DBG("req_state = %d", req_state);
270 switch (item_data->index) {
272 req->flavour = CST_SSTYPE_CB_OC;
273 DBG("CST_SSTYPE_CB_OC");
276 req->flavour = CST_SSTYPE_CB_OIC;
277 DBG("CST_SSTYPE_CB_OIC");
280 req->flavour = CST_SSTYPE_CB_OICEH;
281 DBG("CST_SSTYPE_CB_OICEH");
284 req->flavour = CST_SSTYPE_CB_IC;
285 DBG("CST_SSTYPE_CB_IC");
288 req->flavour = CST_SSTYPE_CB_ICR;
289 DBG("CST_SSTYPE_CB_ICR");
296 ugd->original_state = !req_state;
297 if (req_state == EINA_TRUE) {
298 req->original_state = CST_SS_STATE_OFF;
299 req->action = CST_ACTION_ACTIVATE;
301 req->original_state = CST_SS_STATE_ON;
302 req->action = CST_ACTION_DEACTIVATE;
305 eo = _cst_create_cb_ime(ugd->nf, NULL, ugd);
306 _cst_remove_naviframe(ugd->nf);
307 navi_it = elm_naviframe_item_push(ugd->nf,
308 T_(CST_STR_PASSWORD), NULL, NULL, eo, "1line");
310 btn = _cst_create_title_btn(ugd->nf, (char *)T_(CST_STR_CANCEL),
311 __cst_on_click_cb_ime_cancel_btn, (void *)req);
312 elm_object_item_part_content_set(navi_it, "title_left_btn", btn);
314 btn = _cst_create_title_btn(ugd->nf, (char *)T_(CST_STR_DONE),
315 __cst_on_click_cb_ime_done_btn, (void *)req);
316 elm_object_item_part_content_set(navi_it, "title_right_btn", btn);
317 elm_object_disabled_set(btn, EINA_TRUE);
320 static void __cst_on_click_cb_onoff(void *data, Evas *evas, Evas_Object *obj, void *event_info)
322 ret_if(NULL == data);
323 CstGlItemData_t *item_data = (CstGlItemData_t *)data;
324 CstUgData_t *ugd = item_data->ugd;
325 if (ugd->cb_state[item_data->index] == CST_SS_STATE_PROGRESS)
328 Eina_Bool check_state = elm_check_state_get(item_data->eo_check);
330 __cst_update_change_cb_req(item_data, !check_state);
331 elm_genlist_item_update(item_data->gl_item);
334 static void __cst_gl_sel_cb(void *data, Evas_Object *obj, void *event_info)
336 ret_if(data == NULL);
337 CstGlItemData_t *item_data = (CstGlItemData_t *)data;
338 elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
339 if (list_call_barring[item_data->index].func)
340 list_call_barring[item_data->index].func((void *)item_data, NULL, obj, event_info);
344 static void __cst_on_changed_cb_check(void *data, Evas_Object *obj, void *event_info)
346 CstGlItemData_t *item_data = (CstGlItemData_t *)data;
347 Eina_Bool check_state = elm_check_state_get(obj);
349 if (elm_object_item_disabled_get(item_data->gl_item) == EINA_TRUE) {
350 elm_check_state_set(obj, EINA_FALSE);
354 __cst_update_change_cb_req(item_data, check_state);
357 static Evas_Object *__cst_gl_icon_get_cb(void *data, Evas_Object *obj, const char *part)
359 retv_if(NULL == data, NULL);
360 Evas_Object *icon = NULL;
361 CstGlItemData_t *item_data = (CstGlItemData_t *)data;
362 CstUgData_t *ugd = (CstUgData_t *)item_data->ugd;
363 Eina_Bool check_state = EINA_FALSE;
365 if (!strcmp(part, "elm.icon")) {
366 switch (ugd->cb_state[item_data->index]) {
367 case CST_SS_STATE_ON:
368 case CST_SS_STATE_OFF:
369 DBG("ugd->cb_state : %d(%d)",
370 ugd->cb_state[item_data->index], item_data->index);
371 if (ugd->cb_state[item_data->index] == CST_SS_STATE_ON)
372 check_state = EINA_TRUE;
373 item_data->eo_check = icon = _cst_create_onoff_button(obj, check_state,
374 __cst_on_changed_cb_check, item_data);
376 case CST_SS_STATE_PROGRESS:
377 icon = _cst_create_progressbar(obj);
386 static Evas_Object *__cst_create_genlist_cb(void *data)
388 ENTER(__cst_create_genlist_cb);
389 retv_if(NULL == data, NULL);
390 CstUgData_t *ugd = (CstUgData_t *)data;
392 Evas_Object *genlist;
393 CstGlItemData_t *item_data;
395 itc_1text_1icon->item_style = "dialogue/1text.1icon";
396 itc_1text_1icon->func.text_get = __cst_gl_label_get_cb;
397 itc_1text_1icon->func.content_get = __cst_gl_icon_get_cb;
398 itc_1text_1icon->func.state_get = NULL;
399 itc_1text_1icon->func.del = __cst_gl_del_cb;
401 genlist = elm_genlist_add(ugd->nf);
403 _cst_create_genlist_seperator(genlist, EINA_FALSE);
404 for (index = 0; list_call_barring[index].style != CST_GL_ITEM_NONE; ++index) {
405 item_data = (CstGlItemData_t *)calloc(1, sizeof(CstGlItemData_t));
406 retv_if(item_data == NULL, NULL);
407 item_data->index = index;
408 item_data->ugd = ugd;
409 if (list_call_barring[index].style == CST_GL_ITEM_1TEXT_ONOFF_PROGRESS) {
410 ugd->cb_state[index] = CST_SS_STATE_PROGRESS;
411 item_data->gl_item = elm_genlist_item_append(genlist, itc_1text_1icon,
412 (void *)item_data, NULL, list_call_barring[index].flags,
413 __cst_gl_sel_cb, item_data);
414 __cst_query_cb_status(item_data);
426 static void __cst_on_click_voice_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
428 ENTER(__cst_on_click_voice_cb);
429 ret_if(NULL == data);
430 CstUgData_t *ugd = (CstUgData_t *)data;
431 Evas_Event_Mouse_Up *ev = (Evas_Event_Mouse_Up *)event_info;
432 Evas_Object *back_btn = NULL;
433 Evas_Object *layout, *cbar;
434 Elm_Object_Item *navi_it;
436 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) {
440 ugd->call_type = CST_CALLTYPE_VOICE;
443 Evas_Object *genlist = __cst_create_genlist_cb(ugd);
445 layout = elm_layout_add(ugd->nf);
446 elm_layout_file_set(layout, EDJ_NAME, "toolbar");
447 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
448 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
449 elm_object_part_content_set(layout, "elm.swallow.contents", genlist);
450 navi_it = elm_naviframe_item_push(ugd->nf, T_(CST_STR_VOICECALL),
451 NULL, NULL, layout, "1line");
452 back_btn = elm_object_item_part_content_get(navi_it, "prev_btn");
453 evas_object_smart_callback_add(back_btn, "clicked",
454 __cst_on_click_cb_back_button, ugd);
456 cbar = _cst_create_navi_control_bar(ugd->nf,
457 (char *)T_(CST_STR_CHECK_STATUS), CST_CTRL_ICON_UPDATE,
458 __cst_on_click_cb_check_status_btn,
460 (void *)genlist, navi_it,
462 ret_if((NULL == cbar) || (NULL == ec_item[0]));
463 elm_object_item_disabled_set(ec_item[0], EINA_TRUE);
466 static void __cst_on_click_video_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
468 ENTER(__cst_on_click_video_cb);
469 ret_if(NULL == data);
470 CstUgData_t *ugd = (CstUgData_t *)data;
471 Evas_Event_Mouse_Up *ev = (Evas_Event_Mouse_Up *)event_info;
472 Evas_Object *back_btn = NULL;
473 Evas_Object *layout, *cbar;
474 Elm_Object_Item *navi_it;
476 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) {
480 ugd->call_type = CST_CALLTYPE_VIDEO;
483 Evas_Object *genlist = __cst_create_genlist_cb(ugd);
485 layout = elm_layout_add(ugd->nf);
486 elm_layout_file_set(layout, EDJ_NAME, "toolbar");
487 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
488 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
489 elm_object_part_content_set(layout, "elm.swallow.contents", genlist);
490 navi_it = elm_naviframe_item_push(ugd->nf, T_(CST_STR_VIDEOCALL),
491 NULL, NULL, layout, "1line");
492 back_btn = elm_object_item_part_content_get(navi_it, "prev_btn");
493 evas_object_smart_callback_add(back_btn, "clicked",
494 __cst_on_click_cb_back_button, ugd);
496 cbar = _cst_create_navi_control_bar(ugd->nf,
497 (char *)T_(CST_STR_CHECK_STATUS), CST_CTRL_ICON_UPDATE,
498 __cst_on_click_cb_check_status_btn,
500 (void *)genlist, navi_it,
502 ret_if((NULL == cbar) || (NULL == ec_item[0]));
503 elm_object_item_disabled_set(ec_item[0], EINA_TRUE);
506 static void __cst_gl_sel_call_type(void *data, Evas_Object *obj, void *event_info)
508 ret_if(data == NULL);
509 CstUgData_t *ugd = (CstUgData_t *)data;
510 Elm_Object_Item *item= (Elm_Object_Item *)event_info;
511 int index = (int)elm_object_item_data_get(item);
512 elm_genlist_item_selected_set(item, EINA_FALSE);
514 if (list_call_type[index].func)
515 list_call_type[index].func((void *)ugd, NULL, obj, event_info);
519 static char *__cst_gl_label_get_call_type(void *data, Evas_Object *obj, const char *part)
521 int index = (int)data;
523 if (strcmp(part, "elm.text") == 0)
524 return strdup(T_(list_call_type[index].str_id));
528 static Evas_Object *__cst_create_genlist_call_type(void *data)
530 ENTER(__cst_create_genlist_call_type);
531 retv_if(NULL == data, NULL);
532 CstUgData_t *ugd = (CstUgData_t *)data;
533 Evas_Object *genlist;
534 Elm_Object_Item *git;
537 if (!itc_1text_1icon)
538 itc_1text_1icon = elm_genlist_item_class_new();
541 itc_1text = elm_genlist_item_class_new();
543 itc_1text->item_style = "dialogue/1text";
544 itc_1text->func.text_get = __cst_gl_label_get_call_type;
545 itc_1text->func.content_get = NULL;
546 itc_1text->func.state_get = NULL;
547 itc_1text->func.del = NULL;
549 genlist = elm_genlist_add(ugd->nf);
551 _cst_create_genlist_seperator(genlist, EINA_FALSE);
552 for (index = 0; list_call_type[index].style != CST_GL_ITEM_NONE; index++) {
553 git = elm_genlist_item_append(genlist, itc_1text,
554 (void *)index, NULL, ELM_GENLIST_ITEM_NONE,
555 __cst_gl_sel_call_type, (void *)ugd);
561 void _cst_on_click_call_barring(void *data, Evas *evas, Evas_Object *obj, void *event_info)
563 ENTER(_cst_on_click_call_barring);
564 ret_if(NULL == data);
565 CstUgData_t *ugd = (CstUgData_t *)data;
566 Evas_Event_Mouse_Up *ev = (Evas_Event_Mouse_Up *)event_info;
567 Evas_Object *back_btn = NULL;
568 Elm_Object_Item *navi_it;
570 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) {
574 if (_cst_check_flight_mode()) {
575 ugd->popup = _cst_create_error_popup(ugd->nf,
576 CST_ERROR_CHANGE_FLIGHT_MODE);
577 evas_object_show(ugd->popup);
581 if (!_cst_check_sim_status()) {
582 ugd->popup = _cst_create_error_popup(ugd->nf,
583 CST_ERROR_INSERT_SIM_CARD);
584 evas_object_show(ugd->popup);
588 Evas_Object *genlist = __cst_create_genlist_call_type(ugd);
589 navi_it = elm_naviframe_item_push(ugd->nf, T_(CST_STR_CALL_BARRING),
590 back_btn, NULL, genlist, NULL);
591 back_btn = elm_object_item_part_content_get(navi_it, "prev_btn");
592 evas_object_smart_callback_add(back_btn, "clicked",
593 __cst_on_click_cb_back_button, ugd);