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