2 * Copyright 2012 Samsung Electronics Co., Ltd
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
8 * http://www.tizenopensource.org/license
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.
18 #include <setting-network-preferred-network-list.h>
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);
25 static Evas_Object *__gl_network_radio_group = NULL;
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,
34 #define LIST_COUNT 100
35 #define MAX_PLMN_LEN 6
37 /* ***************************************************
41 ***************************************************/
43 static int gl_network_genlist_label_initialize(SettingNetworkUG *ad)
45 Elm_Object_Item *gl_item = NULL;
49 gl_item = elm_genlist_first_item_get(ad->gl_network);
51 sel_mem = (char *)elm_object_item_data_get(gl_item);
55 gl_item = elm_genlist_item_next_get(gl_item);
57 elm_genlist_clear(ad->gl_network);
62 return SETTING_RETURN_FAIL;
65 static char *gl_network_genlist_text_get(void *data, Evas_Object *obj,
70 struct gl_network_data *sel_mem = (struct gl_network_data *)data;
72 if (safeStrCmp(part, "elm.text") == 0) {
73 snprintf(buf, sizeof(buf), "%s", sel_mem->name);
76 safeCopyStr(buf, "", strlen(""));
81 static void gl_network_genlist_delete(void *data, Evas_Object *obj)
83 struct gl_network_data *one_item = (struct gl_network_data *)data;
90 static Evas_Object *gl_network_getlist_content_get(void *data, Evas_Object *obj,
93 Evas_Object *radio = NULL;
94 struct gl_network_data *sel_mem = (struct gl_network_data *)data;
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);
106 static void gl_network_genlist_select(void *data, Evas_Object *obj,
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);
116 (struct gl_network_data *)elm_object_item_data_get(item);
118 if (ad->cur_sel_mem == NULL) {
122 ad->cur_sel_index = ad->cur_sel_mem->index;
123 elm_radio_value_set(__gl_network_radio_group, ad->cur_sel_index);
127 static void __get_preferred_network_list_item_name(char *name,
128 settings_preferred_network_table
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:
136 nw_type_str = "GSM900";
139 case SETTING_PREFERRED_NETWORK_TYPE_DCS_1800:
144 case SETTING_PREFERRED_NETWORK_TYPE_PCS_1900:
149 case SETTING_PREFERRED_NETWORK_TYPE_GSM_SAT:
151 nw_type_str = "GSMSAT";
154 case SETTING_PREFERRED_NETWORK_TYPE_GSM_850:
156 nw_type_str = "GSM850";
159 case SETTING_PREFERRED_NETWORK_TYPE_UMTS:
161 nw_type_str = "UMTS";
170 snprintf(name, 255, "%s (%s)", network.short_name_ptr, nw_type_str);
173 static Eina_Bool __genlist_update(void *data)
176 setting_retvm_if(NULL == data, 0, "NULL == data")
178 SettingNetworkUG *ad = (SettingNetworkUG *) data;
179 Elm_Object_Item *gl_item = NULL;
180 const char *match_str = NULL;
182 SETTING_TRACE("match_str:%s", match_str);
184 struct gl_network_data *one_item;
185 elm_genlist_clear(ad->gl_network);
187 int items = (sizeof(network_table) / sizeof(network_table[0]));
188 for (i = 0; i < items; i++) {
190 (struct gl_network_data *)calloc(1,
193 setting_retvm_if(!one_item, FALSE, "calloc failed");
195 __get_preferred_network_list_item_name(one_item->name,
198 if ('\0' == ad->search_text[0]
199 || (one_item->name && is_substr_ncase(one_item->name, ad->search_text))) { /* is substring */
201 elm_genlist_item_append(ad->gl_network, &ad->itc,
203 ELM_GENLIST_ITEM_NONE,
204 gl_network_genlist_select,
210 ad->add_view_timer = NULL;
214 /* ***search bar****/
215 static void __searchbar_changed_cb(void *data, Evas_Object *obj,
219 setting_retm_if(NULL == data, "NULL == data")
221 SettingNetworkUG *ad = (SettingNetworkUG *) data;
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");
227 elm_object_signal_emit(ad->nw_search_bar, "elm,state,eraser,show", "elm");
230 const char *str = elm_object_text_get(obj);
232 SETTING_TRACE_ERROR("Searchbar text is NULL!");
235 if (!safeStrCmp(str, ad->search_text)) {
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);
248 memset(ad->search_text, '\0', MAX_SEARCH_STR_LEN + 1);
249 safeCopyStr(ad->search_text, str, MAX_SEARCH_STR_LEN);
251 SETTING_TRACE("Update the search view text, search_text=%s",
254 ad->add_view_timer = ecore_idler_add(__genlist_update, ad);
257 static void __searchbar_cancel_clicked_cb(void *data, Evas_Object *obj,
261 SettingNetworkUG *ad = (SettingNetworkUG *) data;
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);
266 ecore_imf_context_input_panel_hide(imf_context);
270 static void __searchbar_focused_cb(void *data, Evas_Object *obj,
274 setting_retm_if(NULL == data, "NULL == data");
275 SettingNetworkUG *ad = (SettingNetworkUG *) data;
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", "");
283 static Evas_Object *__add_searchbar_add(Evas_Object *parent, void *data)
286 setting_retvm_if(NULL == data, NULL, "NULL == data");
288 Evas_Object *searchbar_layout = elm_layout_add(parent);
289 elm_layout_theme_set(searchbar_layout, "layout", "searchbar", "cancel_button");
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"));
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);
302 evas_object_smart_callback_add(entry, "changed", __searchbar_changed_cb, data);
303 evas_object_smart_callback_add(entry, "focused", __searchbar_focused_cb, data);
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");
310 evas_object_smart_callback_add(cancel_btn, "clicked",
311 __searchbar_cancel_clicked_cb, data);
313 edje_object_part_swallow(_EDJ(parent), "search_bar", searchbar_layout);
315 return searchbar_layout;
318 static int setting_network_preferred_network_list_create(void *cb)
322 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
324 SettingNetworkUG *ad = (SettingNetworkUG *) cb;
326 Evas_Object *sub_layout = elm_layout_add(ad->win_main_layout);
327 elm_layout_file_set(sub_layout, SETTING_THEME_EDJ_NAME,
329 evas_object_size_hint_weight_set(sub_layout, EVAS_HINT_EXPAND, 0.0);
330 evas_object_show(sub_layout);
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"),
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);
341 Evas_Object *gl_network = NULL;
342 gl_network_genlist_label_initialize(ad);
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;
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);
355 __gl_network_radio_group = elm_radio_add(ad->win_main_layout);
356 elm_radio_state_value_set(__gl_network_radio_group, -1);
358 ad->nw_search_bar = __add_searchbar_add(sub_layout, ad);
359 edje_object_part_swallow(_EDJ(sub_layout), "search_list",
361 __genlist_update(ad);
363 elm_radio_value_set(__gl_network_radio_group, -100);
364 setting_view_network_preferred_network_list.is_create = 1;
366 return SETTING_RETURN_SUCCESS;
369 static int setting_network_preferred_network_list_destroy(void *cb)
373 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
375 SettingNetworkUG *ad = (SettingNetworkUG *) cb;
376 if (__gl_network_radio_group != NULL) {
377 evas_object_del(__gl_network_radio_group);
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;
384 if (ad->add_view_timer) {
385 ecore_idler_del(ad->add_view_timer);
386 ad->add_view_timer = NULL;
388 elm_naviframe_item_pop(ad->navi_bar);
389 setting_view_network_preferred_network_list.is_create = 0;
391 return SETTING_RETURN_SUCCESS;
394 static int setting_network_preferred_network_list_update(void *cb)
398 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
400 return SETTING_RETURN_SUCCESS;
403 static int setting_network_preferred_network_list_cleanup(void *cb)
405 return setting_network_preferred_network_list_destroy(cb);
408 /* ***************************************************
412 ***************************************************/
414 /* ***************************************************
418 ***************************************************/
421 setting_network_preferred_network_list_click_softkey_cancel(void *data,
427 retm_if(data == NULL,
428 "[Setting > Network > Preferred list] Data parameter is NULL");
430 SettingNetworkUG *ad = (SettingNetworkUG *) data;
432 setting_view_change(&setting_view_network_preferred_network_list,
433 &setting_view_network_preferred_network, ad);
437 setting_network_preferred_network_list_click_softkey_add(void *data,
443 retm_if(data == NULL,
444 "[Setting > Network > Preferred list] Data parameter is NULL");
446 SettingNetworkUG *ad = (SettingNetworkUG *) data;
450 int tapi_ret = TAPI_API_SUCCESS;
451 TelNetworkPrefferedPlmnInfo_t pref_plmn_info = { 0, };
453 /* sel = ad->cur_sel_index; */
454 sel = elm_radio_value_get(__gl_network_radio_group);
456 ("setting_network_preferred_network_list_click_softkey_add: sel = %d",
460 setting_network_popup_create(ad,
461 _("Please select item(s) to process!"),
467 ret = snprintf((char *)pref_plmn_info.Plmn, MAX_PLMN_LEN / 2, "%d",
468 network_table[sel].mcc);
471 ret = snprintf((char *)pref_plmn_info.Plmn + (MAX_PLMN_LEN / 2),
472 MAX_PLMN_LEN / 2, "%d", network_table[sel].mnc);
475 SETTING_TRACE("selected item is:%s", network_table[sel].short_name_ptr);
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;
486 case SETTING_PREFERRED_NETWORK_TYPE_UMTS:
487 pref_plmn_info.SystemType = TAPI_NETWORK_SYSTEM_UMTS;
493 pref_plmn_info.Index =
494 ad->pref_list.PreffPlmnRecord[ad->pref_list.NumOfPreffPlmns -
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);
503 tel_set_network_preferred_plmn(TAPI_NETWORK_PREF_PLMN_ADD,
504 &pref_plmn_info, &request_id);
505 if (tapi_ret != TAPI_API_SUCCESS) {
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);
512 ad->op_type = SETTING_NETWORK_PREFERRED_NETWORK_LIST;