Tizen 2.0 Release
[apps/home/settings.git] / setting-network / src / setting-network-select-network.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-select-network.h>
18
19 static int setting_network_select_network_create(void *cb);
20 static int setting_network_select_network_destroy(void *cb);
21 static int setting_network_select_network_update(void *cb);
22 static int setting_network_select_network_cleanup(void *cb);
23
24 setting_view setting_view_network_select_network = {
25         .create = setting_network_select_network_create,
26         .destroy = setting_network_select_network_destroy,
27         .update = setting_network_select_network_update,
28         .cleanup = setting_network_select_network_cleanup,
29 };
30
31 /* ***************************************************
32  *
33  *basic func
34  *
35  ***************************************************/
36
37 static int setting_network_select_network_create(void *cb)
38 {
39         SETTING_TRACE_BEGIN;
40         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
41
42         SettingNetworkUG *ad = (SettingNetworkUG *) cb;
43         ad->net_restore = NET_RESTORE_NONE;
44
45         setting_push_layout_navi_bar_genlist(ad->win_main_layout, ad->win_get,
46                                              _("IDS_ST_BODY_SELECT_NETWORK"),
47                                              _("IDS_COM_BODY_BACK"),
48                                              NULL,
49                                              setting_network_select_network_click_softkey_cancel_cb,
50                                              NULL,
51                                              ad, &ad->genlist_sel_network, ad->navi_bar);
52
53         Elm_Object_Item *item = elm_genlist_item_append(ad->genlist_sel_network,
54                                     &(itc_seperator), NULL, NULL,
55                                     ELM_GENLIST_ITEM_NONE, NULL, NULL);
56         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
57
58         /* scroller is a genlist */
59         ad->chk_sel = elm_radio_add(ad->genlist_sel_network);
60         elm_radio_state_value_set(ad->chk_sel, -1);
61         vconf_get_int(VCONFKEY_SETAPPL_SELECT_NETWORK_INT, &ad->sel_net);//retrieve here
62         SETTING_TRACE("ad->sel_net:%d", ad->sel_net);
63
64         vconf_get_int(VCONFKEY_SETAPPL_SELECT_OLD_NT_ACT, &ad->sel_act);//retrieve here
65         SETTING_TRACE("ad->sel_act:%d", ad->sel_act);
66
67         FREE(ad->sel_network);
68         //ad->sel_network = vconf_get_str(VCONFKEY_TELEPHONY_NWNAME);
69         ad->sel_network = get_pa_select_network();
70         SETTING_TRACE("pa_sel_net_name:%s", ad->sel_network);
71         if (isEmptyStr(ad->sel_network)) {
72             ad->sel_network = strndup(Keystr_UNKNOWN_NETWORK, strlen(Keystr_UNKNOWN_NETWORK)+1);
73         }
74
75         if (TAPI_NETWORK_SELECTIONMODE_AUTOMATIC == ad->sel_net) {
76                 ad->data_auto_network_item = setting_create_Gendial_field_1radio(
77                                             ad->genlist_sel_network,
78                                             &(itc_2text_1icon_7),
79                                             setting_network_Gendial_select_plmn_cb,
80                                             ad, SWALLOW_Type_1TOGGLE,
81                                             NULL, TRUE,
82                                             "IDS_COM_BODY_AUTOMATIC",
83                                             setting_network_select_network_chk_changed);
84                 setting_retvm_if(NULL == ad->data_auto_network_item,
85                                  SETTING_RETURN_FAIL, "Failed to calloc memory");
86                 char *sub_text = setting_customize_text(_(ad->sel_network), 0, BLUE_COLOR, NULL);
87                 ad->data_auto_network_item->sub_desc = (char *)g_strdup(sub_text);
88                 FREE(sub_text);
89                 ad->data_auto_network_item->userdata = ad;
90
91         } else if(TAPI_NETWORK_SELECTIONMODE_MANUAL == ad->sel_net) {
92                 int tapi_ret;
93
94                 //new PDP concept:
95                 //when user select network manully, it should disable 3g service, or it will no network to be found.
96                 int err;
97                 int old_pdp_value = 0;
98                 int old_roaming_value = 0;
99                 setting_get_bool_slp_key(BOOL_SLP_SETTING_USE_PACKET_DATA, &old_pdp_value, &err);
100                 setting_get_bool_slp_key(BOOL_SLP_SETTING_DATA_ROAMING, &old_roaming_value, &err);
101                 if (old_pdp_value)
102                 {
103                         SETTING_TRACE("Disable user packet data");
104                         setting_set_bool_slp_key(BOOL_SLP_SETTING_USE_PACKET_DATA, FALSE, &err);
105                         ad->net_restore++;
106                         if (old_roaming_value)
107                         {
108                                 SETTING_TRACE("Disable data roaming");
109                                 setting_set_bool_slp_key(BOOL_SLP_SETTING_DATA_ROAMING, FALSE, &err);
110                                 ad->net_restore++;
111                         }
112                         #ifdef FUTURE_FEATURE //feature in the future.
113                         setting_create_popup_without_btn(ad, ad->win_get, NULL, _(NotifyStr_PDP_OFF), NULL, POPUP_INTERVAL, FALSE, FALSE);
114                         #endif
115                 }
116
117                 //searching list
118                 tapi_ret = tel_search_network(ad->handle, setting_tapi_search_network_cb, ad); //ASYNC API - TAPI_EVENT_NETWORK_SEARCH_CNF
119                 if(tapi_ret != TAPI_API_SUCCESS) { // error handling..
120                         SETTING_TRACE_DEBUG("%s*** [ERR] tel_search_network. tapi_ret=%d ***%s", SETTING_FONT_RED, tapi_ret, SETTING_FONT_BLACK);
121                         setting_create_popup_without_btn(ad, ad->win_get, NULL, _(STR_SETTING_OPERATION_FAILED), NULL, POPUP_INTERVAL, FALSE, FALSE);
122                         // put error handler on the end of this function.
123                         goto err_handle;
124                 }
125                 ad->b_searching_network = TRUE;
126
127                 ad->data_auto_network_item  = setting_create_Gendial_field_1radio(
128                                             ad->genlist_sel_network,
129                                             &(itc_2text_1icon_7),
130                                             setting_network_Gendial_select_plmn_cb,
131                                             ad, SWALLOW_Type_1TOGGLE,
132                                             NULL, FALSE, "IDS_COM_BODY_AUTOMATIC",
133                                             setting_network_select_network_chk_changed);
134
135                 setting_retvm_if(NULL == ad->data_auto_network_item,
136                                  SETTING_RETURN_FAIL, "Failed to calloc memory");
137                 //ad->data_auto_network_item->sub_desc = (char *)g_strdup(ad->sel_network);//just a simple display
138                 char *sub_text = setting_customize_text(_(ad->sel_network), 0, GRAY_COLOR, NULL);
139                 ad->data_auto_network_item->sub_desc = (char *)g_strdup(sub_text);
140                 FREE(sub_text);
141                 ad->data_auto_network_item->userdata = ad;
142                 if (0 != safeStrCmp("IDS_ST_BODY_NOSERVICE", ad->sel_network)
143                     && 0 != safeStrCmp("EMERGENCY", ad->sel_network))
144                 {
145                         //normal case:
146                         Setting_GenGroupItem_Data *item_Data = NULL;
147
148                         char sel_network_desc[MAX_COMMON_BUFFER_LEN] = { 0, };
149                         snprintf(sel_network_desc, MAX_COMMON_BUFFER_LEN, "%s (%s)",
150                                  _(ad->sel_network),setting_network_get_act_str(ad->sel_act));
151
152                         item_Data = setting_create_Gendial_field_1radio(
153                                                         ad->genlist_sel_network,
154                                                         &itc_1text_2icon_2,
155                                                         setting_network_Gendial_select_plmn_cb, ad,
156                                                         SWALLOW_Type_1RADIO,
157                                                         ad->chk_sel, TAPI_NETWORK_SELECTIONMODE_MANUAL,
158                                                         sel_network_desc,
159                                                         setting_network_select_network_chk_changed);
160                         setting_retvm_if(NULL == item_Data, SETTING_RETURN_FAIL, "Failed to calloc memory");
161                         item_Data->userdata = ad;
162
163                         ad->data_search_network_item = setting_create_Gendial_field_1radio(
164                                                         ad->genlist_sel_network,
165                                                         &itc_1text_2icon_2,
166                                                         NULL, NULL,
167                                                         SWALLOW_Type_1RADIO_1SEARCH,
168                                                         ad->chk_sel, -1, NULL, NULL);
169
170                         elm_radio_value_set(ad->chk_sel, TAPI_NETWORK_SELECTIONMODE_MANUAL);
171
172                 }
173                 else
174                 {
175                         //no service case:
176                         ad->data_search_network_item = setting_create_Gendial_field_1radio(
177                                                         ad->genlist_sel_network,
178                                                         &itc_1text_2icon_2,
179                                                         NULL, NULL,
180                                                         SWALLOW_Type_1RADIO_1SEARCH,
181                                                         ad->chk_sel, -1, NULL, NULL);
182
183                 }
184         }
185
186         setting_view_network_select_network.is_create = TRUE;
187         return SETTING_RETURN_SUCCESS;
188
189 err_handle:
190         setting_view_network_select_network.is_create = TRUE;
191         return SETTING_RETURN_FAIL;
192 }
193
194 static int setting_network_select_network_destroy(void *cb)
195 {
196         SETTING_TRACE_BEGIN;
197         /* error check */
198         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
199
200         SettingNetworkUG *ad = (SettingNetworkUG *) cb;
201         int err;
202         switch (ad->net_restore) {
203         case NET_RESTORE_PDP:
204                 //restore the pdp vconf to be true
205                 setting_set_bool_slp_key(BOOL_SLP_SETTING_USE_PACKET_DATA, TRUE, &err);
206                 break;
207         case NET_RESTORE_PDP_ROAM:
208                 //restore the pdp and roaming vconfs to be true
209                 setting_set_bool_slp_key(BOOL_SLP_SETTING_USE_PACKET_DATA, TRUE, &err);
210                 setting_set_bool_slp_key(BOOL_SLP_SETTING_DATA_ROAMING, TRUE, &err);
211                 break;
212         case NET_RESTORE_NONE:
213         default:
214                 SETTING_TRACE("Do need restore any vconf");
215                 break;
216         }
217         ad->net_restore = NET_RESTORE_NONE;//reset the value
218
219         //cancel the searching operation
220         if (ad->b_searching_network) {
221                 int tapi_ret;
222                 tapi_ret = tel_cancel_network_manual_search(ad->handle, setting_tapi_cancel_manual_search_cb, ad);
223                 if (tapi_ret != TAPI_API_SUCCESS) {
224                         SETTING_TRACE_ERROR("*** [ERR] tel_cancel_network_manual_search. "\
225                                             "tapi_ret=%d ***", tapi_ret);
226                 }
227                 ad->b_searching_network = FALSE;
228         }
229         /*roolback..*/
230         if (0 != vconf_get_int(VCONFKEY_SETAPPL_SELECT_NETWORK_INT, &ad->sel_net)) {
231                 SETTING_TRACE_ERROR("vconf get failed");
232         }
233
234         if (0 != vconf_get_int(VCONFKEY_SETAPPL_SELECT_OLD_NT_ACT, &ad->sel_act)) {
235                 SETTING_TRACE_ERROR("vconf get failed");
236         }
237
238         FREE(ad->sel_network);
239         //ad->sel_network = vconf_get_str(VCONFKEY_TELEPHONY_NWNAME);
240         ad->sel_network = get_pa_select_network();
241         if (isEmptyStr(ad->sel_network)) {
242             ad->sel_network = strndup(Keystr_UNKNOWN_NETWORK, strlen(Keystr_UNKNOWN_NETWORK)+1);
243         }
244
245         /*reset..*/
246         ad->b_set_manul_network = FALSE;
247         ad->b_set_auto_network = FALSE;
248         setting_network_update_sel_network(ad);
249
250         elm_naviframe_item_pop(ad->navi_bar);
251
252         //Following handlers will be used by async listening callback. They must be reset after genlist is 'popuped'.
253         ad->data_auto_network_item = NULL;
254         //data_sel_net was created in main view, it won't be destoryed.
255         //ad->data_sel_net = NULL;
256         setting_view_network_select_network.is_create = FALSE;
257
258         return SETTING_RETURN_SUCCESS;
259 }
260
261 static int setting_network_select_network_update(void *cb)
262 {
263         SETTING_TRACE_BEGIN;
264         /* error check */
265         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
266
267         //SettingNetworkUG *ad = (SettingNetworkUG *) cb;
268         //elm_radio_value_set(ad->chk_sel, ad->sel_net);
269
270         return SETTING_RETURN_SUCCESS;
271 }
272
273 static int setting_network_select_network_cleanup(void *cb)
274 {
275         SETTING_TRACE_BEGIN;
276         return setting_network_select_network_destroy(cb);
277 }
278
279 /* ***************************************************
280  *
281  *general func
282  *
283  ***************************************************/
284
285 /* ***************************************************
286  *
287  *call back func
288  *
289  ***************************************************/
290
291 static void
292 setting_network_select_network_click_softkey_cancel_cb(void *data,
293                                                        Evas_Object *obj,
294                                                        void *event_info)
295 {
296         /* error check */
297         retm_if(data == NULL,
298                 "[Setting > Network > Select] Data parameter is NULL");
299
300         SettingNetworkUG *ad = (SettingNetworkUG *) data;
301
302         setting_view_change(&setting_view_network_select_network,
303                             &setting_view_network_main, ad);
304 }
305