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