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