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