apply FSL(Flora Software License)
[apps/home/ug-wifi-efl.git] / sources / wifi-syspopup / viewer-popups / view-main.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
19 #include "common.h"
20 #include "view-main.h"
21 #include "wifi-syspopup.h"
22 #include "view-password.h"
23
24 extern wifi_object* app_state;
25
26 static Evas_Object* list = NULL;
27 static Elm_Genlist_Item_Class itc;
28
29 int view_main_item_connection_mode_set(genlist_data *data, ITEM_CONNECTION_MODES mode)
30 {
31         __COMMON_FUNC_ENTER__;
32
33         if (data == NULL) {
34                 WARN_LOG(SP_NAME_NORMAL, "NULL == data");
35                 __COMMON_FUNC_EXIT__;
36                 return FALSE;
37         }
38
39         if (ITEM_CONNECTION_MODE_NULL >= mode || ITEM_CONNECTION_MODE_MAX <= mode) {
40                 ERROR_LOG(SP_NAME_NORMAL, "mode[%d] is not valid", mode);
41                 __COMMON_FUNC_EXIT__;
42                 return FALSE;
43         }
44
45         /* mode set */
46         data->connection_mode = mode;
47         INFO_LOG(SP_NAME_NORMAL, "mode: [%d]", data->connection_mode);
48
49         elm_genlist_item_update(data->it);
50
51         __COMMON_FUNC_EXIT__;
52
53         return TRUE;
54 }
55
56 static ITEM_CONNECTION_MODES view_main_state_get(Evas_Object *glist)
57 {
58         __COMMON_FUNC_ENTER__;
59
60         if (glist == NULL)
61                 return ITEM_CONNECTION_MODE_NULL;
62
63         Elm_Object_Item* it = NULL;
64         it = elm_genlist_first_item_get(glist);
65         while (it) {
66                 genlist_data *gdata = (genlist_data *)elm_object_item_data_get(it);
67                 if (gdata->connection_mode == ITEM_CONNECTION_MODE_CONNECTING) {
68                         return ITEM_CONNECTION_MODE_CONNECTING;
69                 }
70
71                 it = elm_genlist_item_next_get(it);
72         }
73
74         __COMMON_FUNC_EXIT__;
75         return ITEM_CONNECTION_MODE_OFF;
76 }
77
78 static void _gl_sel(void *data, Evas_Object *obj, void *event_info)
79 {
80         __COMMON_FUNC_ENTER__;
81         if (view_main_state_get(obj) != ITEM_CONNECTION_MODE_OFF) {
82                 INFO_LOG(SP_NAME_NORMAL, "In connecting state, nothing can do" );
83                 __COMMON_FUNC_EXIT__;
84                 return;
85         }
86
87         Elm_Object_Item *item = (Elm_Object_Item *)event_info;
88
89         assertm_if(NULL == data, "data is NULL!!");
90         assertm_if(NULL == obj, "obj is NULL!!");
91         genlist_data *gdata = (genlist_data*) data;
92
93         int ret = WLAN_MANAGER_ERR_UNKNOWN;
94
95         switch (gdata->connection_mode) {
96         case ITEM_CONNECTION_MODE_OFF:
97                 INFO_LOG( SP_NAME_NORMAL, "item state: off");
98                 ret = wlan_manager_request_connection(gdata->dev_info);
99
100                 break;
101         case ITEM_CONNECTION_MODE_CONNECTING:
102                 INFO_LOG( SP_NAME_NORMAL, "item state: connecting");
103                 break;
104         default:
105                 ERROR_LOG( SP_NAME_NORMAL, "item state: etc [%d]", gdata->connection_mode);
106                 break;
107         }
108
109         switch (ret) {
110         case WLAN_MANAGER_ERR_NONE:
111                 INFO_LOG( SP_NAME_NORMAL, "ERROR_NONE");
112                 view_main_item_connection_mode_set(gdata, ITEM_CONNECTION_MODE_CONNECTING);
113                 break;
114         case WLAN_MANAGER_ERR_CONNECT_PASSWORD_NEEDED:
115                 INFO_LOG( SP_NAME_NORMAL, "Password view will show up");
116                 view_password_show(gdata);
117                 break;
118         default:
119                 view_main_item_connection_mode_set(gdata, ITEM_CONNECTION_MODE_OFF);
120                 view_main_refresh();
121                 ERROR_LOG( SP_NAME_NORMAL, "errro code [%d]", ret);
122                 break;
123         }
124
125         elm_genlist_item_selected_set(item, 0);
126         elm_genlist_item_update(item);
127
128         __COMMON_FUNC_EXIT__;
129 }
130
131 static char *_gl_text_get(void *data, Evas_Object *obj, const char *part)
132 {
133         __COMMON_FUNC_ENTER__;
134         assertm_if(NULL == data, "data param is NULL!!");
135         assertm_if(NULL == obj, "obj param is NULL!!");
136         assertm_if(NULL == part, "part param is NULL!!");
137
138         genlist_data *gdata = (genlist_data *) data;
139         const char* ssid_name = gdata->dev_info->ssid;
140
141         if (ssid_name == NULL) {
142                 __COMMON_FUNC_EXIT__;
143                 ERROR_LOG(SP_NAME_NORMAL, "ssid name is NULL!!");
144                 return NULL;
145         }
146         __COMMON_FUNC_EXIT__;
147
148         return strdup(ssid_name);
149 }
150
151 static char *wifi_get_device_icon(wifi_device_info_t *device_info)
152 {
153         __COMMON_FUNC_ENTER__;
154         assertm_if(NULL == device_info, "device param is NULL!!");
155
156         char tmp_str[128] = {0,};
157         char* ret;
158
159         sprintf(tmp_str, "%s/37_wifi_icon", WIFI_SP_ICON_PATH);
160
161         if (device_info->security_mode != WLAN_SEC_MODE_NONE) {
162                 sprintf(tmp_str,"%s_lock", tmp_str);
163         }
164
165         switch (wlan_manager_get_signal_strength(device_info->rssi)) {
166         case SIGNAL_STRENGTH_TYPE_EXCELLENT:
167                 sprintf(tmp_str,"%s_03", tmp_str);
168                 break;
169         case SIGNAL_STRENGTH_TYPE_GOOD:
170                 sprintf(tmp_str,"%s_02", tmp_str);
171                 break;
172         case SIGNAL_STRENGTH_TYPE_WEAK:
173                 sprintf(tmp_str,"%s_01", tmp_str);
174                 break;
175         case SIGNAL_STRENGTH_TYPE_VERY_WEAK:
176         case SIGNAL_STRENGTH_TYPE_NULL:
177                 sprintf(tmp_str,"%s_00", tmp_str);
178                 break;
179         }
180
181         sprintf(tmp_str, "%s.png", tmp_str);
182
183         ret = strdup(tmp_str);
184         __COMMON_FUNC_EXIT__;
185
186         return ret;
187 }
188
189 static Evas_Object *_gl_content_get(void *data, Evas_Object *obj, const char *part)
190 {
191         __COMMON_FUNC_ENTER__;
192         if (data == NULL)
193                 return NULL;
194
195         genlist_data *gdata = (genlist_data *) data;
196
197         const char* ssid_name = gdata->dev_info->ssid;
198         INFO_LOG(SP_NAME_NORMAL, "ssid name [%s]", ssid_name);
199
200         char*dev_icon_file = NULL;
201         Evas_Object* icon = NULL;
202
203         if (!strncmp(part, "elm.icon.1", strlen(part))) {
204                 switch (gdata->connection_mode) {
205                 case ITEM_CONNECTION_MODE_OFF:
206                         if (gdata->progressbar != NULL) {
207                                 elm_progressbar_pulse(gdata->progressbar, EINA_FALSE);
208                                 evas_object_del(gdata->progressbar);
209                                 gdata->progressbar = NULL;
210                         }
211
212                         icon = elm_icon_add(obj);
213                         dev_icon_file = wifi_get_device_icon(gdata->dev_info);
214                         INFO_LOG(SP_NAME_NORMAL, "icon name [%s]", dev_icon_file);
215                         elm_icon_file_set(icon, dev_icon_file, NULL);
216                         g_free(dev_icon_file);
217                         evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 5, 5);
218                         return icon;
219
220                 case ITEM_CONNECTION_MODE_CONNECTING:
221                         gdata->progressbar = elm_progressbar_add(obj);
222                         if (gdata->progressbar == NULL)
223                                 return NULL;
224
225                         elm_object_style_set(gdata->progressbar, "list_process");
226                         evas_object_size_hint_align_set(gdata->progressbar, EVAS_HINT_FILL, 0.5);
227                         evas_object_size_hint_weight_set(gdata->progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
228                         elm_progressbar_pulse(gdata->progressbar, TRUE);
229                         return gdata->progressbar;
230                 default:
231                         break;
232                 }
233         }
234
235         __COMMON_FUNC_EXIT__;
236         return NULL;
237 }
238
239 Evas_Object *view_main_create(Evas_Object* parent)
240 {
241         __COMMON_FUNC_ENTER__;
242         assertm_if(NULL == parent, "parent is NULL!!");
243
244         list = elm_genlist_add(parent); //app_state->win_main);
245         assertm_if(NULL == list, "list allocation fail!!");
246
247         elm_genlist_mode_set(list, ELM_LIST_LIMIT);
248         evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
249         evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
250
251         __COMMON_FUNC_EXIT__;
252
253         return list;
254 }
255
256 int view_main_destroy(void)
257 {
258         __COMMON_FUNC_ENTER__;
259         if(NULL != list) {
260                 evas_object_del(list);
261                 list = NULL;
262         }
263
264         __COMMON_FUNC_EXIT__;
265         return TRUE;
266 }
267
268 static void view_main_scan_ui_clear(void)
269 {
270         __COMMON_FUNC_ENTER__;
271
272         if (list == NULL)
273                 return;
274
275         Elm_Object_Item* it = NULL;
276         it = elm_genlist_first_item_get(list);
277         while (it) {
278                 genlist_data *gdata = (genlist_data *)elm_object_item_data_get(it);
279                 if (gdata)
280                         g_free(gdata);
281
282                 it = elm_genlist_item_next_get(it);
283         }
284
285         elm_genlist_clear(list);
286
287         __COMMON_FUNC_EXIT__;
288 }
289
290 void *view_main_item_set(net_profile_info_t *profile_info)
291 {
292         __COMMON_FUNC_ENTER__;
293
294         wifi_device_info_t *wifi_device = (wifi_device_info_t*)malloc(sizeof(wifi_device_info_t));
295         memset(wifi_device, 0, sizeof(wifi_device_info_t));
296
297         wifi_device->profile_name = strdup(profile_info->ProfileName);
298         wifi_device->ssid = strdup(profile_info->ProfileInfo.Wlan.essid);
299         wifi_device->rssi = (int)profile_info->ProfileInfo.Wlan.Strength;
300         wifi_device->security_mode = (int)profile_info->ProfileInfo.Wlan.security_info.sec_mode;
301         wifi_device->wps_mode = (int)profile_info->ProfileInfo.Wlan.security_info.wps_support;
302
303         __COMMON_FUNC_EXIT__;
304         return wifi_device;
305 }
306
307 int view_main_refresh()
308 {
309         view_main_scan_ui_clear();
310         view_main_show();
311         return TRUE;
312 }
313
314 int view_main_show(void)
315 {
316         __COMMON_FUNC_ENTER__;
317
318         if (list == NULL) {
319                 ERROR_LOG( SP_NAME_NORMAL, "list is NULL!!" );
320                 return FALSE;
321         }
322
323         char profile_name[NET_PROFILE_NAME_LEN_MAX+1] = "";
324         int state = wlan_manager_state_get(profile_name);
325         switch (state) {
326         case WLAN_MANAGER_ERROR:
327         case WLAN_MANAGER_OFF:
328                 return FALSE;
329         case WLAN_MANAGER_UNCONNECTED:
330         case WLAN_MANAGER_CONNECTED:
331         case WLAN_MANAGER_DISCONNECTING:
332                 profile_name[0] = '\0';
333                 break;
334         case WLAN_MANAGER_CONNECTING:
335                 break;
336         }
337
338         view_main_scan_ui_clear();
339
340         net_profile_info_t *profiles_list = wlan_manager_profile_table_get();
341         if (profiles_list == NULL)
342                 return FALSE;
343
344         int profiles_list_size = wlan_manager_profile_scanned_length_get();
345         INFO_LOG(SP_NAME_NORMAL, "profiles list count [%d]\n", profiles_list_size);
346
347         itc.item_style = "1text.1icon.4";
348         itc.func.text_get = _gl_text_get;
349         itc.func.content_get = _gl_content_get;
350         itc.func.state_get = NULL;
351         itc.func.del = NULL;
352
353         int i = 0;
354         wifi_device_info_t *device_info = NULL;
355         if (profiles_list_size > 0) {
356         if (profile_name[0] == '\0') {
357                     for (i = 0; i < profiles_list_size; i++) {
358                                 device_info = (wifi_device_info_t *)view_main_item_set(profiles_list+i);
359
360                                 genlist_data *gdata = (genlist_data *) malloc(sizeof(genlist_data));
361                                 gdata->dev_info = device_info;
362                                 gdata->connection_mode = ITEM_CONNECTION_MODE_OFF;
363                                 gdata->progressbar = NULL;
364
365                                 gdata->it = elm_genlist_item_append(list, &itc, gdata, NULL, ELM_GENLIST_ITEM_NONE, _gl_sel, gdata);
366                                 elm_object_item_data_set(gdata->it, gdata);
367                 }
368         } else {
369                         for (i = 0; i < profiles_list_size; i++) {
370                                 device_info = (wifi_device_info_t *)view_main_item_set(profiles_list+i);
371
372                                 genlist_data *gdata = (genlist_data *) malloc(sizeof(genlist_data));
373                                 gdata->dev_info = device_info;
374                                 gdata->progressbar = NULL;
375                                 if (!strcmp((profiles_list+i)->ProfileName, profile_name)) {
376                                         gdata->connection_mode = ITEM_CONNECTION_MODE_CONNECTING;
377                                 } else {
378                                         gdata->connection_mode = ITEM_CONNECTION_MODE_OFF;
379                                 }
380
381                                 gdata->it = elm_genlist_item_append(list, &itc, gdata, NULL, ELM_GENLIST_ITEM_NONE, _gl_sel, gdata);
382                                 elm_object_item_data_set(gdata->it, gdata);
383                         }
384         }
385         } else if (profiles_list_size == 0) {
386                 WARN_LOG(SP_NAME_NORMAL, "scan size is ZERO");
387         }
388
389         evas_object_show(list);
390         __COMMON_FUNC_EXIT__;
391
392         return TRUE;
393 }