84819b5430d15ae33c121d58ab1788f3006a297b
[apps/core/preloaded/settings.git] / setting-network / src / setting-network-preferred-network-list.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-preferred-network-list.h>
22
23 static int setting_network_preferred_network_list_create(void *cb);
24 static int setting_network_preferred_network_list_destroy(void *cb);
25 static int setting_network_preferred_network_list_update(void *cb);
26 static int setting_network_preferred_network_list_cleanup(void *cb);
27
28 static Evas_Object *__gl_network_radio_group = NULL;
29
30 setting_view setting_view_network_preferred_network_list = {
31         .create = setting_network_preferred_network_list_create,
32         .destroy = setting_network_preferred_network_list_destroy,
33         .update = setting_network_preferred_network_list_update,
34         .cleanup = setting_network_preferred_network_list_cleanup,
35 };
36
37 #define LIST_COUNT 100
38 #define MAX_PLMN_LEN 6
39
40 /* ***************************************************
41  *
42  *basic func
43  *
44  ***************************************************/
45
46 static int gl_network_genlist_label_initialize(SettingNetworkUG *ad)
47 {
48         Elm_Object_Item *gl_item = NULL;
49         char *sel_mem = NULL;
50
51         if (ad->gl_network) {
52                 gl_item = elm_genlist_first_item_get(ad->gl_network);
53                 while (gl_item) {
54                         sel_mem = (char *)elm_object_item_data_get(gl_item);
55                         if (sel_mem) {
56                                 FREE(sel_mem);
57                         }
58                         gl_item = elm_genlist_item_next_get(gl_item);
59                 }
60                 elm_genlist_clear(ad->gl_network);
61
62                 return 0;
63         }
64
65         return SETTING_RETURN_FAIL;
66 }
67
68 static char *gl_network_genlist_text_get(void *data, Evas_Object *obj,
69                                           const char *part)
70 {
71         char buf[PATH_MAX];
72
73         struct gl_network_data *sel_mem = (struct gl_network_data *)data;
74
75         if (safeStrCmp(part, "elm.text") == 0) {
76                 /* strcpy(buf, data); */
77                 /* sprintf(buf, "<font color=#000000>%s</font>", sel_mem->name); */
78                 snprintf(buf, sizeof(buf), "%s", sel_mem->name);
79                 return strdup(buf);
80         } else {
81                 safeCopyStr(buf, "", strlen(""));
82                 return strdup(buf);
83         }
84 }
85
86 static void gl_network_genlist_delete(void *data, Evas_Object *obj)
87 {
88         struct gl_network_data *one_item = (struct gl_network_data *)data;
89         if (data) {
90                 FREE(one_item);
91         }
92         return;
93 }
94
95 static Evas_Object *gl_network_getlist_content_get(void *data, Evas_Object *obj,
96                                                 const char *part)
97 {
98         Evas_Object *radio = NULL;
99         struct gl_network_data *sel_mem = (struct gl_network_data *)data;
100
101         if (safeStrCmp(part, "elm.swallow.end") == 0
102             || safeStrCmp(part, "elm.icon") == 0) {
103                 radio = elm_radio_add(obj);
104                 retv_if(radio == NULL, NULL);
105                 elm_radio_state_value_set(radio, sel_mem->index);
106                 elm_radio_group_add(radio, __gl_network_radio_group);
107         }
108         return radio;
109 }
110
111 static void gl_network_genlist_select(void *data, Evas_Object *obj,
112                                       void *event_info)
113 {
114         SettingNetworkUG *ad = (SettingNetworkUG *) data;
115         Elm_Object_Item *item = NULL;
116         retm_if(event_info == NULL, "Invalid argument: event info is NULL");
117         item = (Elm_Object_Item *) event_info;
118         elm_genlist_item_selected_set(item, 0);
119
120         ad->cur_sel_mem =
121             (struct gl_network_data *)elm_object_item_data_get(item);
122
123         if (ad->cur_sel_mem == NULL) {
124                 return;
125         }
126
127         ad->cur_sel_index = ad->cur_sel_mem->index;
128         elm_radio_value_set(__gl_network_radio_group, ad->cur_sel_index);
129         /* SETTING_TRACE_WARNING("******sel_mem->index = %d, elm_radio_value_get = %d", ad->cur_sel_index, elm_radio_value_get(__gl_network_radio_group)); */
130         return;
131 }
132
133 static void __get_preferred_network_list_item_name(char *name,
134                                                    settings_preferred_network_table
135                                                    network)
136 {
137         setting_retm_if(NULL == name, "NULL == name")
138         const char *nw_type_str = NULL;
139         switch (network.nw_type) {
140         case SETTING_PREFERRED_NETWORK_TYPE_GSM_900:
141                 {
142                         nw_type_str = "GSM900";
143                         break;
144                 }
145         case SETTING_PREFERRED_NETWORK_TYPE_DCS_1800:
146                 {
147                         nw_type_str = "DCS";
148                         break;
149                 }
150         case SETTING_PREFERRED_NETWORK_TYPE_PCS_1900:
151                 {
152                         nw_type_str = "PCS";
153                         break;
154                 }
155         case SETTING_PREFERRED_NETWORK_TYPE_GSM_SAT:
156                 {
157                         nw_type_str = "GSMSAT";
158                         break;
159                 }
160         case SETTING_PREFERRED_NETWORK_TYPE_GSM_850:
161                 {
162                         nw_type_str = "GSM850";
163                         break;
164                 }
165         case SETTING_PREFERRED_NETWORK_TYPE_UMTS:
166                 {
167                         nw_type_str = "UMTS";
168                         break;
169                 }
170         default:
171                 {
172                         nw_type_str = NULL;
173                         break;
174                 }
175         }
176         snprintf(name, 255, "%s (%s)", network.short_name_ptr, nw_type_str);
177 }
178
179 static Eina_Bool __genlist_update(void *data)
180 {
181         SETTING_TRACE_BEGIN;
182         setting_retvm_if(NULL == data, 0, "NULL == data")
183
184         SettingNetworkUG *ad = (SettingNetworkUG *) data;
185         Elm_Object_Item *gl_item = NULL;
186         const char *match_str = NULL;
187
188         SETTING_TRACE("match_str:%s", match_str);
189
190         struct gl_network_data *one_item;
191         elm_genlist_clear(ad->gl_network);
192         int i;
193         int items = (sizeof(network_table) / sizeof(network_table[0]));
194         for (i = 0; i < items; i++) {
195                 one_item =
196                     (struct gl_network_data *)calloc(1,
197                                                      sizeof(struct
198                                                             gl_network_data));
199                 setting_retvm_if(!one_item, FALSE, "calloc failed");
200                 one_item->index = i;
201                 /* one_item->name = __get_preferred_network_list_item_name(network_table[i]); */
202                 __get_preferred_network_list_item_name(one_item->name,
203                                                        network_table[i]);
204
205                 if ('\0' == ad->search_text[0]
206                     || (one_item->name && is_substr_ncase(one_item->name, ad->search_text))) {  /*  is substring */
207                         /* SETTING_TRACE("Adding item[%s]", one_item->name); */
208                         /* SETTING_TRACE("ad->gl_network:%p", ad->gl_network); */
209                         gl_item =
210                             elm_genlist_item_append(ad->gl_network, &ad->itc,
211                                                     one_item, NULL,
212                                                     ELM_GENLIST_ITEM_NONE,
213                                                     gl_network_genlist_select,
214                                                     ad);
215                 } else {
216                         FREE(one_item);
217                 }
218         }
219         ad->add_view_timer = NULL;
220         return FALSE;
221 }
222
223 /* ***search bar****/
224 static void __searchbar_changed_cb(void *data, Evas_Object *obj,
225                                    void *event_info)
226 {
227         SETTING_TRACE_BEGIN;
228         setting_retm_if(NULL == data, "NULL == data")
229
230         SettingNetworkUG *ad = (SettingNetworkUG *) data;
231
232         if (elm_object_focus_get(ad->nw_search_bar)) {
233                 if (elm_entry_is_empty(obj))
234                         elm_object_signal_emit(ad->nw_search_bar, "elm,state,eraser,hide", "elm");
235                 else
236                         elm_object_signal_emit(ad->nw_search_bar, "elm,state,eraser,show", "elm");
237         }
238
239         const char *str = elm_object_text_get(obj);
240         /* SETTING_TRACE("the string in searchbar:%s, len(str):%d", str, strlen(str)); */
241         /* SETTING_TRACE("ad->search_text: %s", ad->search_text); */
242
243         if (str == NULL) {
244                 SETTING_TRACE_ERROR("Searchbar text is NULL!");
245                 return;
246         }
247         /* if(!safeStrCmp(str, dgettext("sys_string", "IDS_COM_SK_SEARCH")))  return; */
248         if (!safeStrCmp(str, ad->search_text)) {
249                 return;
250         }
251         /* Evas_Object *entry = elm_searchbar_entry_get(ad->nw_search_bar); */
252
253         if (strlen(str) > MAX_SEARCH_STR_LEN) {
254                 /* the content of entry won't change if enter too many characters */
255                 elm_object_text_set(obj, ad->search_text);
256                 /* elm_entry_cursor_end_set(entry); */
257                 /*  if input too long, show popup */
258                 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("Input too long!"), NULL, POPUP_INTERVAL, FALSE, FALSE);
259
260                 return;
261         }
262
263         memset(ad->search_text, '\0', MAX_SEARCH_STR_LEN + 1);
264         safeCopyStr(ad->search_text, str, MAX_SEARCH_STR_LEN);
265
266         /* SETTING_TRACE("ad->search_text:%s", ad->search_text); */
267         /* if(safeStrCmp(ad->search_text, dgettext("sys_string", "IDS_COM_SK_SEARCH"))) */
268         /* { */
269         SETTING_TRACE("Update the search view text, search_text=%s",
270                       ad->search_text);
271
272         if (ad->add_view_timer) {
273                 /* ecore_idler_del(ad->add_view_timer); */
274                 /* ad->add_view_timer = NULL; */
275         }
276
277         ad->add_view_timer = ecore_idler_add(__genlist_update, ad);
278         /* } */
279
280 }
281
282 static void __searchbar_cancel_clicked_cb(void *data, Evas_Object *obj,
283                                           void *event_info)
284 {
285         SETTING_TRACE_BEGIN;
286         SettingNetworkUG *ad = (SettingNetworkUG *) data;
287
288         /* memset(ad->search_text, '\0', MAX_SEARCH_STR_LEN + 1); */
289         /* safeCopyStr(ad->search_text, dgettext("sys_string", "IDS_COM_SK_SEARCH"), MAX_SEARCH_STR_LEN); */
290         /* elm_searchbar_text_set(ad->nw_search_bar, dgettext("sys_string", "IDS_COM_SK_SEARCH")); */
291
292         Evas_Object *entry = elm_object_part_content_get(ad->nw_search_bar, "elm.swallow.content");
293         Ecore_IMF_Context *imf_context = (Ecore_IMF_Context*)elm_entry_imf_context_get(entry);
294         if (imf_context) {
295                 ecore_imf_context_input_panel_hide(imf_context);
296         }
297         /* ad->add_view_timer = ecore_idler_add(__genlist_update, ad); */
298
299 }
300
301 static void __searchbar_focused_cb(void *data, Evas_Object *obj,
302                                    void *event_info)
303 {
304         SETTING_TRACE_BEGIN;
305         setting_retm_if(NULL == data, "NULL == data");
306         SettingNetworkUG *ad = (SettingNetworkUG *) data;
307
308         if (!elm_entry_is_empty(obj))
309                 elm_object_signal_emit(ad->nw_search_bar, "elm,state,eraser,show", "elm");
310         elm_object_signal_emit(ad->nw_search_bar, "elm,state,guidetext,hide", "elm");
311         elm_object_signal_emit(ad->nw_search_bar, "cancel,in", "");
312 }
313
314 static Evas_Object *__add_searchbar_add(Evas_Object *parent, void *data)
315 {
316         SETTING_TRACE_BEGIN;
317         setting_retvm_if(NULL == data, NULL, "NULL == data");
318
319         Evas_Object *searchbar_layout = elm_layout_add(parent);
320         elm_layout_theme_set(searchbar_layout, "layout", "searchbar", "cancel_button");
321
322         Evas_Object *entry = elm_entry_add(searchbar_layout);
323         elm_entry_scrollable_set(entry, EINA_TRUE);
324         elm_entry_single_line_set(entry, EINA_TRUE);
325         elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NORMAL);
326         elm_object_part_content_set(searchbar_layout, "elm.swallow.content", entry);
327         elm_object_part_text_set(searchbar_layout, "elm.guidetext", dgettext("sys_string", "IDS_COM_SK_SEARCH"));
328
329         evas_object_size_hint_weight_set(searchbar_layout, EVAS_HINT_EXPAND, 0);
330         evas_object_size_hint_align_set(searchbar_layout, EVAS_HINT_FILL, 0.0);
331         evas_object_size_hint_min_set(searchbar_layout, 480, 66);
332
333         evas_object_smart_callback_add(entry, "changed", __searchbar_changed_cb, data);
334         evas_object_smart_callback_add(entry, "focused", __searchbar_focused_cb, data);
335
336         Evas_Object *cancel_btn = elm_button_add(searchbar_layout);
337         elm_object_part_content_set(searchbar_layout, "button_cancel", cancel_btn);
338         elm_object_style_set(cancel_btn, "searchbar/default");
339         //elm_object_text_set(cancel_btn, "Cancel");
340
341         evas_object_smart_callback_add(cancel_btn, "clicked",
342                                        __searchbar_cancel_clicked_cb, data);
343
344         edje_object_part_swallow(_EDJ(parent), "search_bar", searchbar_layout);
345
346         return searchbar_layout;
347 }
348
349 static int setting_network_preferred_network_list_create(void *cb)
350 {
351         SETTING_TRACE_BEGIN;
352         /* error check */
353         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
354
355         SettingNetworkUG *ad = (SettingNetworkUG *) cb;
356
357         Evas_Object *sub_layout = elm_layout_add(ad->win_main_layout);
358         elm_layout_file_set(sub_layout, SETTING_THEME_EDJ_NAME,
359                             "search_layout");
360         evas_object_size_hint_weight_set(sub_layout, EVAS_HINT_EXPAND, 0.0);
361         evas_object_show(sub_layout);
362
363         /* add basic layout */
364         setting_push_layout_navi_bar(_(STR_SETTING_NETWORK_LIST),
365                                      dgettext("sys_string", "IDS_COM_SK_CANCEL"),
366                                      dgettext("sys_string", "IDS_COM_ADD"),
367                                      NULL,
368                                      setting_network_preferred_network_list_click_softkey_cancel,
369                                      setting_network_preferred_network_list_click_softkey_add,
370                                      NULL, ad, sub_layout, ad->navi_bar, NULL);
371
372         Evas_Object *gl_network = NULL;
373         gl_network_genlist_label_initialize(ad);
374
375         ad->cur_sel_index = -1;
376         ad->itc.item_style = "1text.1icon.2";
377         ad->itc.func.text_get = gl_network_genlist_text_get;
378         ad->itc.func.content_get = gl_network_getlist_content_get;
379         ad->itc.func.state_get = NULL;
380         ad->itc.func.del = gl_network_genlist_delete;
381
382         ad->gl_network = gl_network = elm_genlist_add(ad->win_main_layout);
383         elm_object_style_set(ad->gl_network, "dialogue");
384         elm_genlist_clear(gl_network);
385         evas_object_show(gl_network);
386
387         __gl_network_radio_group = elm_radio_add(ad->win_main_layout);
388         elm_radio_state_value_set(__gl_network_radio_group, -1);
389
390         ad->nw_search_bar = __add_searchbar_add(sub_layout, ad);
391         edje_object_part_swallow(_EDJ(sub_layout), "search_list",
392                                  ad->gl_network);
393         __genlist_update(ad);
394
395         elm_radio_value_set(__gl_network_radio_group, -100);
396         setting_view_network_preferred_network_list.is_create = 1;
397
398         return SETTING_RETURN_SUCCESS;
399 }
400
401 static int setting_network_preferred_network_list_destroy(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         if (__gl_network_radio_group != NULL) {
409                 evas_object_del(__gl_network_radio_group);
410         }
411         if (ad->gl_network != NULL) {
412                 elm_genlist_clear(ad->gl_network);
413                 evas_object_del(ad->gl_network);
414                 ad->gl_network = NULL;
415         }
416         if (ad->add_view_timer) {
417                 ecore_idler_del(ad->add_view_timer);
418                 ad->add_view_timer = NULL;
419         }
420         elm_naviframe_item_pop(ad->navi_bar);
421         setting_view_network_preferred_network_list.is_create = 0;
422
423         return SETTING_RETURN_SUCCESS;
424 }
425
426 static int setting_network_preferred_network_list_update(void *cb)
427 {
428         SETTING_TRACE_BEGIN;
429         /* error check */
430         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
431
432         /* SettingNetworkUG *ad = (SettingNetworkUG*)cb; */
433
434         /*  change background style */
435         /* if (ad->bg) */
436         /*         elm_object_style_set(ad->bg, "list"); */
437
438         return SETTING_RETURN_SUCCESS;
439 }
440
441 static int setting_network_preferred_network_list_cleanup(void *cb)
442 {
443         return setting_network_preferred_network_list_destroy(cb);
444 }
445
446 /* ***************************************************
447  *
448  *general func
449  *
450  ***************************************************/
451
452 /* ***************************************************
453  *
454  *call back func
455  *
456  ***************************************************/
457
458 static void
459 setting_network_preferred_network_list_click_softkey_cancel(void *data,
460                                                             Evas_Object *obj,
461                                                             void *event_info)
462 {
463         SETTING_TRACE_BEGIN;
464         /* error check */
465         retm_if(data == NULL,
466                 "[Setting > Network > Preferred list] Data parameter is NULL");
467
468         SettingNetworkUG *ad = (SettingNetworkUG *) data;
469
470         setting_view_change(&setting_view_network_preferred_network_list,
471                             &setting_view_network_preferred_network, ad);
472 }
473
474 static void
475 setting_network_preferred_network_list_click_softkey_add(void *data,
476                                                          Evas_Object *obj,
477                                                          void *event_info)
478 {
479         SETTING_TRACE_BEGIN;
480         /* error check */
481         retm_if(data == NULL,
482                 "[Setting > Network > Preferred list] Data parameter is NULL");
483
484         SettingNetworkUG *ad = (SettingNetworkUG *) data;
485
486         int sel = 0;
487         int tapi_ret = TAPI_API_SUCCESS;
488         TelNetworkPreferredPlmnInfo_t pref_plmn_info = { 0, };
489
490         /* sel = ad->cur_sel_index; */
491         sel = elm_radio_value_get(__gl_network_radio_group);
492         SETTING_TRACE
493             ("setting_network_preferred_network_list_click_softkey_add: sel = %d",
494              sel);
495
496         if (sel < 0) {
497                 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("Please select item(s) to process!"), NULL, POPUP_INTERVAL, FALSE, FALSE);
498
499                 return;
500         }
501
502         /* sprintf((char *)pref_plmn_info.Plmn, "%d", network_table[sel].mcc); */
503         /* sprintf((char *)pref_plmn_info.Plmn+3, "%d", network_table[sel].mnc); */
504         int ret = 0;
505         ret = snprintf((char *)pref_plmn_info.Plmn, MAX_PLMN_LEN / 2, "%d",
506                      network_table[sel].mcc);
507         ret_if(ret < 0);
508
509         ret = snprintf((char *)pref_plmn_info.Plmn + (MAX_PLMN_LEN / 2),
510                      MAX_PLMN_LEN / 2, "%d", network_table[sel].mnc);
511         ret_if(ret < 0);
512
513         SETTING_TRACE("selected item is:%s", network_table[sel].short_name_ptr);
514
515         switch (network_table[sel].nw_type) {
516         case SETTING_PREFERRED_NETWORK_TYPE_GSM_900:
517         case SETTING_PREFERRED_NETWORK_TYPE_DCS_1800:
518         case SETTING_PREFERRED_NETWORK_TYPE_PCS_1900:
519         case SETTING_PREFERRED_NETWORK_TYPE_GSM_SAT:
520         case SETTING_PREFERRED_NETWORK_TYPE_GSM_850:
521                 pref_plmn_info.SystemType = TAPI_NETWORK_SYSTEM_GSM;
522                 break;
523
524         case SETTING_PREFERRED_NETWORK_TYPE_UMTS:
525                 pref_plmn_info.SystemType = TAPI_NETWORK_SYSTEM_UMTS;
526                 break;
527         default:
528                 break;
529         }
530
531         pref_plmn_info.Index =
532             ad->pref_list.PrefPlmnRecord[ad->pref_list.NumOfPrefPlmns -
533                                           1].Index + 1;
534
535         ad->network_ug_pop =
536             setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_ST_POP_SAVING"),
537                                              NULL, 0.0, TRUE, TRUE);
538         SETTING_TRACE_DEBUG("%s*** plmn=%s, index=%d ***%s",
539                             SETTING_FONT_BGREEN, pref_plmn_info.Plmn,
540                             (int)(pref_plmn_info.Index), SETTING_FONT_BLACK);
541
542         tapi_ret =
543             tel_set_network_preferred_plmn(ad->handle, TAPI_NETWORK_PREF_PLMN_ADD,
544                                            &pref_plmn_info, setting_tapi_set_preferred_plmn_cb, ad);
545         if (tapi_ret != TAPI_API_SUCCESS) {
546                 SETTING_TRACE_DEBUG
547                     ("%s*** [ERR] tel_set_network_preferred_plmn(PLMN_ADD) err=%d ***%s",
548                      SETTING_FONT_RED, tapi_ret, SETTING_FONT_BLACK);
549                 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("Save Failed!"), NULL, POPUP_INTERVAL, FALSE, FALSE);
550         }
551
552         ad->op_type = SETTING_NETWORK_PREFERRED_NETWORK_LIST;
553 }