tizen 2.3 release
[apps/home/settings.git] / setting-network / src / setting-network-select-network.c
1 /*
2  * setting
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
5  *
6  * Contact: MyoungJune Park <mj2004.park@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 #include <setting-network-select-network.h>
22
23 static int setting_network_select_network_create(void *cb);
24 static int setting_network_select_network_destroy(void *cb);
25 static int setting_network_select_network_update(void *cb);
26 static int setting_network_select_network_cleanup(void *cb);
27
28 setting_view setting_view_network_select_network = {
29         .create = setting_network_select_network_create,
30         .destroy = setting_network_select_network_destroy,
31         .update = setting_network_select_network_update,
32         .cleanup = setting_network_select_network_cleanup,
33 };
34
35 /* ***************************************************
36  *
37  *basic func
38  *
39  ***************************************************/
40 static void
41 __network_main_gl_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info)
42 {
43         SETTING_TRACE_BEGIN;
44         ret_if(!data || !event_info);
45         SettingNetworkUG *ad = (SettingNetworkUG *) data;
46         Evas_Event_Mouse_Up *ev = (Evas_Event_Mouse_Up *)event_info;
47         Elm_Object_Item *selected_item = elm_genlist_at_xy_item_get(ad->genlist_sel_network, ev->output.x, ev->output.y, NULL);
48         ret_if(!selected_item);
49         Setting_GenGroupItem_Data *data_Item = elm_object_item_data_get(selected_item);
50         ret_if(!data_Item);
51         if (!safeStrCmp(data_Item->keyStr, "IDS_COM_BODY_SELECT_AUTOMATICALLY"))
52         {
53                 SETTING_TRACE("ev->output.x:%d, ev->output.y:%d", ev->output.x, ev->output.y);
54                 Evas_Coord x, y, w, h;
55                 evas_object_geometry_get(ad->data_auto_network_item->eo_check, &x, &y, &w, &h);
56                 SETTING_TRACE("x:%d, y:%d, w:%d, h:%d", x, y, w ,h);
57                 if (x <= ev->output.x && ev->output.x <= (x + w) && y <= ev->output.y && ev->output.y <= (y + h))
58                 {
59                         return;
60                 }
61                 if (ad->data_auto_network_item->chk_status)
62                 {
63                         char *sub_text = setting_customize_text(ad->data_auto_network_item->sub_desc, 0, BLUE_COLOR, NULL);
64                         FREE(ad->data_auto_network_item->sub_desc);
65                         ad->data_auto_network_item->sub_desc = (char *)g_strdup(sub_text);
66                         FREE(sub_text);
67                 }
68                 else
69                 {
70                         char *sub_text = setting_customize_text(ad->data_auto_network_item->sub_desc, 0, GRAY_COLOR, NULL);
71                         FREE(ad->data_auto_network_item->sub_desc);
72                         ad->data_auto_network_item->sub_desc = (char *)g_strdup(sub_text);
73                         FREE(sub_text);
74                 }
75
76                 elm_genlist_item_fields_update(ad->data_auto_network_item->item, "*", ELM_GENLIST_ITEM_FIELD_TEXT);
77         }
78 }
79 static void
80 __network_main_gl_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
81 {
82         SETTING_TRACE_BEGIN;
83         ret_if(!data || !event_info);
84         SettingNetworkUG *ad = (SettingNetworkUG *) data;
85         Evas_Event_Mouse_Down *ev = (Evas_Event_Mouse_Down*)event_info;
86         ad->point_down.x = ev->output.x;
87         ad->point_down.y = ev->output.y;
88         Elm_Object_Item *selected_item = elm_genlist_at_xy_item_get(ad->genlist_sel_network, ev->output.x, ev->output.y, NULL);
89         ret_if(!selected_item);
90         Setting_GenGroupItem_Data *data_Item = elm_object_item_data_get(selected_item);
91         ret_if(!data_Item);
92         if (!safeStrCmp(data_Item->keyStr, "IDS_COM_BODY_SELECT_AUTOMATICALLY"))
93         {
94                 SETTING_TRACE("ev->output.x:%d, ev->output.y:%d", ev->output.x, ev->output.y);
95                 Evas_Coord x, y, w, h;
96                 evas_object_geometry_get(ad->data_auto_network_item->eo_check, &x, &y, &w, &h);
97                 SETTING_TRACE("x:%d, y:%d, w:%d, h:%d", x, y, w ,h);
98                 if (x <= ev->output.x && ev->output.x <= (x + w) && y <= ev->output.y && ev->output.y <= (y + h))
99                 {
100                         return;
101                 }
102
103                 char *sub_text = setting_customize_text(ad->data_auto_network_item->sub_desc, 0, WHITE_COLOR, NULL);
104                 FREE(ad->data_auto_network_item->sub_desc);
105                 ad->data_auto_network_item->sub_desc = (char *)g_strdup(sub_text);
106                 FREE(sub_text);
107                 elm_genlist_item_fields_update(ad->data_auto_network_item->item, "*", ELM_GENLIST_ITEM_FIELD_TEXT);
108         }
109
110 }
111 static void
112 __network_main_gl_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info)
113 {
114         //SETTING_TRACE_BEGIN;
115         ret_if(!data || !event_info);
116         SettingNetworkUG *ad = (SettingNetworkUG *) data;
117         Evas_Event_Mouse_Move*ev = (Evas_Event_Mouse_Move*)event_info;
118         int x_offset = ev->cur.output.x - ad->point_down.x;
119         int y_offset = ev->cur.output.y - ad->point_down.y;
120         if(x_offset < 0) x_offset = -x_offset;
121         if(y_offset < 0) y_offset = -y_offset;
122         //SETTING_TRACE("x_offset:%d, y_offset:%d", x_offset, y_offset);
123         if (x_offset <= MIN_MOVE_DISTANCE && y_offset <= MIN_MOVE_DISTANCE)
124         {
125                 return;
126         }
127
128         //SETTING_TRACE("xxxxxxxxxx");
129         if (ad->data_auto_network_item->chk_status)
130         {
131                 char *sub_text = setting_customize_text(ad->data_auto_network_item->sub_desc, 0, BLUE_COLOR, NULL);
132                 FREE(ad->data_auto_network_item->sub_desc);
133                 ad->data_auto_network_item->sub_desc = (char *)g_strdup(sub_text);
134                 FREE(sub_text);
135         }
136         else
137         {
138                 char *sub_text = setting_customize_text(ad->data_auto_network_item->sub_desc, 0, GRAY_COLOR, NULL);
139                 FREE(ad->data_auto_network_item->sub_desc);
140                 ad->data_auto_network_item->sub_desc = (char *)g_strdup(sub_text);
141                 FREE(sub_text);
142         }
143
144         elm_genlist_item_fields_update(ad->data_auto_network_item->item, "*", ELM_GENLIST_ITEM_FIELD_TEXT);
145 }
146
147 static int setting_network_select_network_create(void *cb)
148 {
149         SETTING_TRACE_BEGIN;
150         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
151
152         SettingNetworkUG *ad = (SettingNetworkUG *) cb;
153         if (ad->view_to_load == &setting_view_network_select_network) {
154                 ad->ly_main = setting_create_layout_navi_bar_genlist(ad->win_main_layout,
155                                                          ad->win_get,
156                                                          "IDS_COM_BODY_NETWORK_OPERATORS",                                                       
157                                                          _("IDS_COM_BODY_BACK"), NULL,
158                                                          setting_network_select_network_click_softkey_cancel_cb, NULL,
159                                                          ad, &ad->genlist_sel_network, &ad->navi_bar);
160         } else {
161                 setting_push_layout_navi_bar_genlist(ad->win_main_layout, ad->win_get,
162                                                          "IDS_COM_BODY_NETWORK_OPERATORS",
163                                                          _("IDS_COM_BODY_BACK"),
164                                                          NULL,
165                                                          setting_network_select_network_click_softkey_cancel_cb,
166                                                          NULL,
167                                                          ad, &ad->genlist_sel_network, ad->navi_bar);
168         }
169         Elm_Object_Item *item = elm_genlist_item_append(ad->genlist_sel_network,
170                                     &(itc_seperator), NULL, NULL,
171                                     ELM_GENLIST_ITEM_NONE, NULL, NULL);
172         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
173
174         /* scroller is a genlist */
175         ad->chk_sel = elm_radio_add(ad->genlist_sel_network);
176         elm_radio_state_value_set(ad->chk_sel, -1);
177         vconf_get_int(VCONFKEY_SETAPPL_SELECT_NETWORK_INT, &ad->sel_net);//retrieve here
178         SETTING_TRACE("ad->sel_net:%d", ad->sel_net);
179
180         vconf_get_int(VCONFKEY_SETAPPL_SELECT_OLD_NT_ACT, &ad->sel_act);//retrieve here
181         SETTING_TRACE("ad->sel_act:%d", ad->sel_act);
182
183         FREE(ad->sel_network);
184         //ad->sel_network = vconf_get_str(VCONFKEY_TELEPHONY_NWNAME);
185         ad->sel_network = get_pa_select_network();
186         SETTING_TRACE("pa_sel_net_name:%s", ad->sel_network);
187         if (!ad->sel_network) {
188             ad->sel_network = strndup(Keystr_UNKNOWN_NETWORK, strlen(Keystr_UNKNOWN_NETWORK)+1);
189         }
190
191         elm_genlist_mode_set(ad->genlist_sel_network, ELM_LIST_COMPRESS);       /* resolve abnormal height issue */
192
193         evas_object_event_callback_add(ad->genlist_sel_network, EVAS_CALLBACK_MOUSE_UP, __network_main_gl_mouse_up, ad);
194         evas_object_event_callback_add(ad->genlist_sel_network, EVAS_CALLBACK_MOUSE_DOWN, __network_main_gl_mouse_down, ad);
195         evas_object_event_callback_add(ad->genlist_sel_network, EVAS_CALLBACK_MOUSE_MOVE, __network_main_gl_mouse_move, ad);
196
197         if (TAPI_NETWORK_SELECTIONMODE_AUTOMATIC == ad->sel_net) {
198                 ad->data_auto_network_item = setting_create_Gendial_field_1radio(
199                                             ad->genlist_sel_network,
200                                             //&(itc_2text_1icon_7),
201                                                 &(itc_1text_1icon),
202                                             setting_network_Gendial_select_plmn_cb,
203                                             ad, SWALLOW_Type_1TOGGLE,
204                                             NULL, TRUE,
205                                             "IDS_COM_BODY_SELECT_AUTOMATICALLY",
206                                             setting_network_select_network_chk_changed);
207                 setting_retvm_if(NULL == ad->data_auto_network_item,
208                                  SETTING_RETURN_FAIL, "Failed to calloc memory");
209                 char *sub_text = setting_customize_text(_(ad->sel_network), 0, BLUE_COLOR, NULL);
210                 ad->data_auto_network_item->sub_desc = (char *)g_strdup(sub_text);
211                 FREE(sub_text);
212                 ad->data_auto_network_item->userdata = ad;
213                 //setting_genlist_item_groupstyle_set(ad->data_auto_network_item, SETTING_GROUP_STYLE_TOP);
214
215         } else if(TAPI_NETWORK_SELECTIONMODE_MANUAL == ad->sel_net) {
216
217                 /* searching list
218                 int tapi_ret;
219                 
220                 tapi_ret = tel_search_network(ad->handle, setting_tapi_search_network_cb, ad); //ASYNC API - TAPI_EVENT_NETWORK_SEARCH_CNF
221                 if(tapi_ret != TAPI_API_SUCCESS) { // error handling..
222                         SETTING_TRACE_DEBUG("%s*** [ERR] tel_search_network. tapi_ret=%d ***%s", SETTING_FONT_RED, tapi_ret, SETTING_FONT_BLACK);
223                         setting_create_popup_without_btn(ad, ad->win_get, NULL, _(STR_SETTING_OPERATION_FAILED), NULL, POPUP_INTERVAL, FALSE, FALSE);
224                         // put error handler on the end of this function.
225                         goto err_handle;
226                 }
227                 ad->b_searching_network = TRUE;
228                 */
229
230                 ad->data_auto_network_item  = setting_create_Gendial_field_1radio(
231                                             ad->genlist_sel_network,
232                                             //&(itc_2text_1icon_7),
233                                                 &(itc_1text_1icon),
234                                             setting_network_Gendial_select_plmn_cb,
235                                             ad, SWALLOW_Type_1TOGGLE,
236                                             NULL, FALSE, "IDS_COM_BODY_SELECT_AUTOMATICALLY",
237                                             setting_network_select_network_chk_changed);
238
239                 setting_retvm_if(NULL == ad->data_auto_network_item, SETTING_RETURN_FAIL, "Failed to calloc memory");
240                 //ad->data_auto_network_item->sub_desc = (char *)g_strdup(ad->sel_network);//just a simple display
241                 char *sub_text = setting_customize_text(_(ad->sel_network), 0, GRAY_COLOR, NULL);
242                 ad->data_auto_network_item->sub_desc = (char *)g_strdup(sub_text);
243                 setting_genlist_item_groupstyle_set(ad->data_auto_network_item, SETTING_GROUP_STYLE_TOP);
244                 FREE(sub_text);
245                 ad->data_auto_network_item->userdata = ad;
246
247                 setting_view_network_select_network.is_create = TRUE;
248
249                 setting_network_searching_network( ad->data_auto_network_item );
250
251                 /* Searching icon appeared.
252                 ad->data_search_network_item = setting_create_Gendial_field_1radio(
253                                                 ad->genlist_sel_network,
254                                                 &itc_1icon,
255                                                 NULL, NULL,
256                                                 SWALLOW_Type_1RADIO_1SEARCH,
257                                                 ad->chk_sel, -1, NULL, NULL);
258                 __BACK_POINTER_SET(ad->data_search_network_item);
259                 elm_genlist_item_select_mode_set(ad->data_search_network_item->item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
260                 setting_genlist_item_groupstyle_set(ad->data_search_network_item, SETTING_GROUP_STYLE_BOTTOM);
261                 */
262
263                 /*
264                 if (0 == safeStrCmp("IDS_ST_BODY_NOSERVICE", ad->sel_network)
265                     || 0 == safeStrCmp(_("IDS_ST_BODY_NOSERVICE"), _(ad->sel_network))
266                     || 0 == safeStrCmp("EMERGENCY", ad->sel_network)
267                     || 0 == safeStrCmp(_("EMERGENCY"), ad->sel_network)
268                     || 0 == safeStrCmp("No service", ad->sel_network)
269                     || 0 == safeStrCmp("No service", _(ad->sel_network))
270                     || 0 == safeStrCmp(_("IDS_CALL_POP_CALLING_EMERG_ONLY"), _(ad->sel_network))
271                     || 0 == safeStrCmp("Emergency calls only", _(ad->sel_network))
272                     )
273                 {
274                         //no service case:
275                         ad->data_search_network_item = setting_create_Gendial_field_1radio(
276                                                         ad->genlist_sel_network,
277                                                         &itc_1icon,
278                                                         NULL, NULL,
279                                                         SWALLOW_Type_1RADIO_1SEARCH,
280                                                         ad->chk_sel, -1, NULL, NULL);
281                         __BACK_POINTER_SET(ad->data_search_network_item);
282                         elm_genlist_item_select_mode_set(ad->data_search_network_item->item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
283                         setting_genlist_item_groupstyle_set(ad->data_search_network_item, SETTING_GROUP_STYLE_BOTTOM);
284                 }
285                 else
286                 {
287                         //normal case:
288                         Setting_GenGroupItem_Data *item_Data = NULL;
289
290                         char sel_network_desc[MAX_COMMON_BUFFER_LEN] = { 0, };
291
292                         snprintf(sel_network_desc, MAX_COMMON_BUFFER_LEN, "%s",_(ad->sel_network));
293                         item_Data = setting_create_Gendial_field_1radio(
294                                                         ad->genlist_sel_network,
295                                                         &itc_multiline_1text_1icon,
296                                                         setting_network_Gendial_select_plmn_cb, ad,
297                                                         SWALLOW_Type_1RADIO,
298                                                         ad->chk_sel, TAPI_NETWORK_SELECTIONMODE_MANUAL,
299                                                         sel_network_desc,
300                                                         setting_network_select_network_chk_changed);
301                         setting_retvm_if(NULL == item_Data, SETTING_RETURN_FAIL, "Failed to calloc memory");
302                         item_Data->userdata = ad;
303                         setting_genlist_item_groupstyle_set(item_Data, SETTING_GROUP_STYLE_CENTER);
304
305                         ad->data_search_network_item = setting_create_Gendial_field_1radio(
306                                                         ad->genlist_sel_network,
307                                                         &itc_1icon,
308                                                         NULL, NULL,
309                                                         SWALLOW_Type_1RADIO_1SEARCH,
310                                                         ad->chk_sel, -1, NULL, NULL);
311                         __BACK_POINTER_SET(ad->data_search_network_item);
312                         elm_genlist_item_select_mode_set(ad->data_search_network_item->item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
313                         setting_genlist_item_groupstyle_set(ad->data_search_network_item, SETTING_GROUP_STYLE_BOTTOM);
314                         elm_radio_value_set(ad->chk_sel, TAPI_NETWORK_SELECTIONMODE_MANUAL);
315
316                 }
317                 */
318         }
319         //ADD_GL_SEPARATOR(ad->genlist_sel_network);
320
321         setting_view_network_select_network.is_create = TRUE;
322         return SETTING_RETURN_SUCCESS;
323 /*
324 err_handle:
325         setting_view_network_select_network.is_create = TRUE;
326         return SETTING_RETURN_FAIL;
327 */
328 }
329
330 static int setting_network_select_network_destroy(void *cb)
331 {
332         SETTING_TRACE_BEGIN;
333         /* error check */
334         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
335
336         SettingNetworkUG *ad = (SettingNetworkUG *) cb;
337
338         evas_object_event_callback_del(ad->genlist_sel_network, EVAS_CALLBACK_MOUSE_UP, __network_main_gl_mouse_up);
339         evas_object_event_callback_del(ad->genlist_sel_network, EVAS_CALLBACK_MOUSE_DOWN, __network_main_gl_mouse_down);
340         evas_object_event_callback_del(ad->genlist_sel_network, EVAS_CALLBACK_MOUSE_MOVE, __network_main_gl_mouse_move);
341
342         if (ad->timer) {
343                 ecore_timer_del(ad->timer);
344                 ad->timer = NULL;
345         }
346
347         if (ad->popup) {
348                 evas_object_del(ad->popup);
349                 ad->popup = NULL;
350         }
351
352         //cancel the searching operation
353         if (ad->b_searching_network) {
354                 int tapi_ret;
355                 tapi_ret = tel_cancel_network_manual_search(ad->handle, setting_tapi_cancel_manual_search_cb, ad);
356                 if (tapi_ret != TAPI_API_SUCCESS) {
357                         SETTING_TRACE_ERROR("*** [ERR] tel_cancel_network_manual_search. "\
358                                             "tapi_ret=%d ***", tapi_ret);
359                 }
360                 ad->b_searching_network = FALSE;
361         }
362         /*roolback..*/
363         if (0 != vconf_get_int(VCONFKEY_SETAPPL_SELECT_NETWORK_INT, &ad->sel_net)) {
364                 SETTING_TRACE_ERROR("vconf get failed");
365         }
366
367         if (0 != vconf_get_int(VCONFKEY_SETAPPL_SELECT_OLD_NT_ACT, &ad->sel_act)) {
368                 SETTING_TRACE_ERROR("vconf get failed");
369         }
370
371         FREE(ad->sel_network);
372         ad->sel_network = get_pa_select_network();
373         if (!ad->sel_network) {
374             ad->sel_network = strndup(Keystr_UNKNOWN_NETWORK, strlen(Keystr_UNKNOWN_NETWORK)+1);
375         }
376
377         /*reset..*/
378         ad->b_set_manul_network = FALSE;
379         ad->b_set_auto_network = FALSE;
380         setting_network_update_sel_network(ad);
381
382         if (ad->view_to_load == &setting_view_network_select_network) {
383                 if (ad->ly_main) {
384                         evas_object_del(ad->ly_main);
385                         ad->ly_main = NULL;
386                 }
387         } else {
388                 elm_naviframe_item_pop(ad->navi_bar);
389         }
390         // elm_naviframe_item_pop(ad->navi_bar);
391
392         //Following handlers will be used by async listening callback. They must be reset after genlist is 'popuped'.
393         ad->data_auto_network_item = NULL;
394         //data_sel_net was created in main view, it won't be destoryed.
395         //ad->data_sel_net = NULL;
396         setting_view_network_select_network.is_create = FALSE;
397
398         return SETTING_RETURN_SUCCESS;
399 }
400
401 static int setting_network_select_network_update(void *cb)
402 {
403         SETTING_TRACE_BEGIN;
404         /* error check */
405         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
406
407         //SettingNetworkUG *ad = (SettingNetworkUG *) cb;
408         //elm_radio_value_set(ad->chk_sel, ad->sel_net);
409
410         return SETTING_RETURN_SUCCESS;
411 }
412
413 static int setting_network_select_network_cleanup(void *cb)
414 {
415         SETTING_TRACE_BEGIN;
416         return setting_network_select_network_destroy(cb);
417 }
418
419 /* ***************************************************
420  *
421  *general func
422  *
423  ***************************************************/
424
425 /* ***************************************************
426  *
427  *call back func
428  *
429  ***************************************************/
430
431 static void
432 setting_network_select_network_click_softkey_cancel_cb(void *data,
433                                                        Evas_Object *obj,
434                                                        void *event_info)
435 {
436         SETTING_TRACE_BEGIN;
437         SettingNetworkUG *ad = (SettingNetworkUG *) data;
438
439         // If registering.. popup is displaying, Back must be ignored.
440         if ( ad->network_select_registering_pop )
441         {
442                 SETTING_TRACE("registering... popup is displaying. back key ignored");
443                 return;
444         }
445
446         /* error check */
447         retm_if(data == NULL, "[Setting > Network > Select] Data parameter is NULL");
448
449         if (ad->view_to_load == &setting_view_network_select_network) {
450                 // exit
451                 ug_destroy_me(ad->ug);
452                 return;
453         } else {
454                 setting_view_change(&setting_view_network_select_network,
455                             &setting_view_network_main, ad);
456         }
457         return;
458 }
459