783f58e5dd6e282a20fe7adc5384da22ef9cb84e
[apps/home/call-setting.git] / src / cst-waiting.c
1 /*
2   * Copyright 2012  Samsung Electronics Co., Ltd
3   *
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
7   *
8   * http://www.tizenopensource.org/license
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 #include <Elementary.h>
18
19 #include "cst-common-string.h"
20 #include "cst-call-setting.h"
21
22 #include "cst-waiting.h"
23 #include "cst-widget.h"
24 #include "cst-common.h"
25 #include "cst-tapi-request.h"
26 #include "cst-util.h"
27
28 static Elm_Genlist_Item_Class *itc_1text_1icon = NULL;
29 static Elm_Genlist_Item_Class *itc_help = NULL;
30 static Elm_Object_Item *ec_item[3];
31
32 static CstGlItemDisplayInfo_t list_call_waiting[] = {
33         {1, CST_STR_CALL_WAITING, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_1TEXT_ONOFF_PROGRESS, NULL},
34         {1, CST_STR_DURING_CALL_NOTIFY_ME, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_HELP_TEXT, NULL},
35
36         {1, -1, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_NONE, NULL},
37 };
38
39 static void __cst_on_update_cw_state(int call_type, int flavour,
40                         Eina_Bool cw_state, char *number, int error, int req_action, void *data)
41 {
42         ENTER(__cst_on_update_cw_state);
43         ret_if(NULL == data);
44         CstGlItemData_t *item_data = (CstGlItemData_t *)data;
45         ret_if(NULL == item_data->ugd);
46         CstUgData_t *ugd = (CstUgData_t *)item_data->ugd;
47         ret_if(NULL == item_data->gl_item);
48         DBG("req_action=%d(0: Activate, 1:Deactivate, 2:Query)", req_action);
49         DBG("cw_state=%d(0: off, 1:on), error=%d", cw_state, error);
50
51         if (error == CST_ERROR_NONE) {
52                 if (cw_state == EINA_TRUE)
53                         ugd->cw_state = CST_SS_STATE_ON;
54                 else
55                         ugd->cw_state = CST_SS_STATE_OFF;
56                 elm_genlist_item_update(item_data->gl_item);
57                 elm_object_item_disabled_set(ec_item[0], EINA_TRUE);
58         } else {
59                 ugd->cw_state = CST_SS_STATE_OFF;
60                 elm_genlist_item_update(item_data->gl_item);
61                 if (req_action != CST_ACTION_QUERY) {
62                         ugd->popup = (Evas_Object *)_cst_create_error_popup(ugd->nf, error);
63                         evas_object_show(ugd->popup);
64                 } else {
65                         ugd->cw_state = CST_SS_STATE_OFF;
66                         elm_genlist_item_update(item_data->gl_item);
67                         elm_object_item_disabled_set(item_data->gl_item, EINA_TRUE);
68                         elm_object_item_disabled_set(ec_item[0], EINA_FALSE);
69                 }
70         }
71 }
72
73 static void __cst_gl_sel_cw(void *data, Evas_Object *obj, void *event_info)
74 {
75         elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
76         Elm_Object_Item *it = (Elm_Object_Item *)event_info;
77         CstGlItemData_t *item_data = (CstGlItemData_t *)elm_object_item_data_get(it);
78         CstUgData_t *ugd = (CstUgData_t *)item_data->ugd;
79
80         if (ugd->cw_state == CST_SS_STATE_PROGRESS)
81                 return;
82
83         Eina_Bool check_state = elm_check_state_get(item_data->eo_check);
84
85         int action = check_state ? CST_ACTION_DEACTIVATE : CST_ACTION_ACTIVATE;
86         ugd->cw_state = CST_SS_STATE_PROGRESS;
87         elm_genlist_item_update(item_data->gl_item);
88         _cst_add_ss_request(&ugd->req_queue, action,
89                 CST_CALLTYPE_ALL, CST_SSTYPE_CW, NULL,
90                 __cst_on_update_cw_state, item_data);
91 }
92
93 static void __cst_on_changed_cw_check(void *data, Evas_Object *obj, void *event_info)
94 {
95         Evas_Object *eo;
96
97         CstGlItemData_t *item_data = (CstGlItemData_t *)data;
98         CstUgData_t *ugd = (CstUgData_t *)item_data->ugd;
99         int check_state = elm_check_state_get(obj);
100
101         if (elm_object_item_disabled_get(item_data->gl_item) == EINA_TRUE) {
102                 elm_check_state_set(obj, EINA_FALSE);
103                 return;
104         }
105
106         int action = check_state ? CST_ACTION_ACTIVATE : CST_ACTION_DEACTIVATE;
107         ugd->cw_state = CST_SS_STATE_PROGRESS;
108         elm_genlist_item_update(item_data->gl_item);
109         _cst_add_ss_request(&ugd->req_queue, action,
110                 CST_CALLTYPE_ALL, CST_SSTYPE_CW, NULL,
111                 __cst_on_update_cw_state, item_data);
112
113 }
114
115 static char *__cst_gl_label_get_cw(void *data, Evas_Object *obj, const char *part)
116 {
117         retv_if(NULL == data, NULL);
118         CstGlItemData_t *item_data = (CstGlItemData_t *)data;
119
120         if ((strcmp(part, "elm.text") == 0) ||
121                 (strcmp(part, "elm.text.1") == 0)) {
122                 return strdup(T_(list_call_waiting[item_data->index].str_id));
123         }
124         return NULL;
125 }
126
127 static Evas_Object *__cst_gl_icon_get_cw(void *data, Evas_Object *obj, const char *part)
128 {
129         retv_if(NULL == data, NULL);
130         Evas_Object *icon = NULL;
131         CstGlItemData_t *item_data = (CstGlItemData_t *)data;
132         CstUgData_t *ugd = (CstUgData_t *)item_data->ugd;
133         Eina_Bool check_state = EINA_FALSE;
134
135         if (!strcmp(part, "elm.icon")) {
136                 switch (ugd->cw_state) {
137                 case CST_SS_STATE_ON:
138                 case CST_SS_STATE_OFF:
139                         if (ugd->cw_state == CST_SS_STATE_ON)
140                                 check_state = EINA_TRUE;
141                         item_data->eo_check = icon = _cst_create_onoff_button(obj, check_state,
142                                 __cst_on_changed_cw_check, item_data);
143                         break;
144                 case CST_SS_STATE_PROGRESS:
145                         icon = _cst_create_progressbar(obj);
146                         break;
147                 default:
148                         return NULL;
149                 }
150         }
151         return icon;
152 }
153
154 static void __cst_gl_del_cw(void *data, Evas_Object *obj)
155 {
156         CstGlItemData_t *item_data = (CstGlItemData_t *)data;
157         if (item_data)
158                 free(item_data);
159         return;
160 }
161
162 static Evas_Object *__cst_create_genlist_cw(void *data)
163 {
164         ENTER(__cst_create_genlist_cw);
165         retv_if(NULL == data, NULL);
166         CstUgData_t *ugd = (CstUgData_t *)data;
167         int index = 0;
168         Evas_Object *genlist;
169         CstGlItemData_t *item_data;
170
171         genlist = elm_genlist_add(ugd->nf);
172
173         elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
174         _cst_create_genlist_seperator(genlist, EINA_FALSE);
175
176         if (!itc_1text_1icon)
177                 itc_1text_1icon = elm_genlist_item_class_new();
178         if (!itc_help)
179                 itc_help = elm_genlist_item_class_new();
180
181         itc_1text_1icon->item_style = "dialogue/1text.1icon";
182         itc_1text_1icon->func.text_get = __cst_gl_label_get_cw;
183         itc_1text_1icon->func.content_get = __cst_gl_icon_get_cw;
184         itc_1text_1icon->func.state_get = NULL;
185         itc_1text_1icon->func.del = __cst_gl_del_cw;
186
187         itc_help->item_style = "multiline/1text";
188         itc_help->func.text_get = __cst_gl_label_get_cw;
189         itc_help->func.content_get = NULL;
190         itc_help->func.state_get = NULL;
191         itc_help->func.del = __cst_gl_del_cw;
192                 
193         for (index = 0; list_call_waiting[index].style != CST_GL_ITEM_NONE; ++index) {
194                 item_data = (CstGlItemData_t *)calloc(1, sizeof(CstGlItemData_t));
195                 ret_if(item_data == NULL);
196                 item_data->index = index;
197                 item_data->ugd = ugd;
198
199                 if (list_call_waiting[index].style == CST_GL_ITEM_1TEXT_ONOFF_PROGRESS) {
200                         item_data->gl_item = elm_genlist_item_append(genlist, itc_1text_1icon,
201                                 (void *)item_data, NULL, list_call_waiting[index].flags,
202                                 __cst_gl_sel_cw, item_data);
203                         ugd->cw_state = CST_SS_STATE_PROGRESS;
204                         _cst_add_ss_request(&ugd->req_queue, CST_ACTION_QUERY,
205                                 CST_CALLTYPE_ALL, CST_SSTYPE_CW, NULL,
206                                 __cst_on_update_cw_state, item_data);
207                 } else if (list_call_waiting[index].style == CST_GL_ITEM_HELP_TEXT) {
208                         item_data->gl_item = elm_genlist_item_append(genlist, itc_help,
209                                 (void *)item_data, NULL, list_call_waiting[index].flags,
210                                 NULL, NULL);
211                         elm_genlist_item_select_mode_set(item_data->gl_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
212                         _cst_create_genlist_underline(genlist);
213                 } else {
214                         DBG("No style");
215                         free(item_data);
216                         item_data = NULL;
217                         return;
218                 }
219         }
220         return genlist;
221 }
222
223 static void __cst_on_click_cw_check_status_btn(void *data, Evas_Object *obj, void *event_info)
224 {
225         ENTER(__cst_on_click_cw_check_status_btn);
226         ret_if(!data);
227
228         Evas_Object *genlist = (Evas_Object *)data;
229         CstGlItemData_t *item_data;
230         CstUgData_t *ugd;
231         Eina_List *realized_list;
232         Elm_Object_Item *it;
233         Eina_List *l;
234
235         realized_list = elm_genlist_realized_items_get(genlist);
236         EINA_LIST_FOREACH(realized_list, l, it) {
237                 item_data = (CstGlItemData_t *)elm_object_item_data_get(it);
238                 if (elm_object_item_disabled_get(it) == EINA_TRUE) {
239                         ugd = item_data->ugd;
240                         ugd->cw_state = CST_SS_STATE_PROGRESS;
241                         _cst_add_ss_request(&ugd->req_queue, CST_ACTION_QUERY,
242                                 CST_CALLTYPE_ALL, CST_SSTYPE_CW, NULL,
243                                 __cst_on_update_cw_state, item_data);
244                         elm_object_item_disabled_set(it, EINA_FALSE);
245                         elm_genlist_item_update(it);
246                 }
247         }
248         elm_object_item_disabled_set(ec_item[0], EINA_TRUE);
249 }
250
251 static void __cst_on_click_cw_back_button(void *data, Evas_Object *obj, void *event_info)
252 {
253         ENTER(__cst_on_click_cw_back_button);
254         retm_if(data == NULL, "NULL UgData");
255
256         CstUgData_t *ugd = (CstUgData_t *)data;
257         _cst_cancel_all_ss_request(ugd);
258
259         ugd->back_button = _cst_get_navifr_prev_btn(ugd->nf);
260 }
261
262 void _cst_on_click_call_waiting(void *data, Evas *evas, Evas_Object *obj, void *event_info)
263 {
264         ENTER(_cst_on_click_call_waiting);
265         CstUgData_t *ugd = (CstUgData_t *)data;
266         Evas_Event_Mouse_Up *ev = (Evas_Event_Mouse_Up *)event_info;
267         Evas_Object *back_btn = NULL;
268         Evas_Object *layout;
269         Evas_Object *cbar;
270         Elm_Object_Item *navi_it;
271
272         if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) {
273                 return;
274         }
275
276         if (_cst_check_flight_mode()) {
277                 ugd->popup = _cst_create_error_popup(ugd->nf,
278                         CST_ERROR_CHANGE_FLIGHT_MODE);
279                 evas_object_show(ugd->popup);
280                 return;
281         }
282
283         if (!_cst_check_sim_status()) {
284                 ugd->popup = _cst_create_error_popup(ugd->nf,
285                         CST_ERROR_INSERT_SIM_CARD);
286                 evas_object_show(ugd->popup);
287                 return;
288         }
289
290         Evas_Object *genlist = __cst_create_genlist_cw(ugd);
291
292         /*Create layout */
293         layout = elm_layout_add(ugd->nf);
294         elm_layout_file_set(layout, EDJ_NAME, "toolbar");
295         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
296         evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
297         elm_object_part_content_set(layout, "elm.swallow.contents", genlist);
298         navi_it = elm_naviframe_item_push(ugd->nf, T_(CST_STR_CALL_WAITING),
299                 back_btn, NULL, layout, "1line");
300         back_btn = elm_object_item_part_content_get(navi_it, "prev_btn");
301         evas_object_smart_callback_add(back_btn, "clicked",
302                 __cst_on_click_cw_back_button, ugd);
303         cbar = _cst_create_navi_control_bar(ugd->nf,
304                         (char *)T_(CST_STR_CHECK_STATUS), CST_CTRL_ICON_UPDATE,
305                         __cst_on_click_cw_check_status_btn,
306                         NULL, NULL, NULL,
307                         (void *)genlist, navi_it,
308                         ec_item);
309         ret_if((NULL == cbar) || (NULL == ec_item[0]));
310         elm_object_item_disabled_set(ec_item[0], EINA_TRUE);
311 }