apply FSL(Flora Software License)
[apps/home/ug-wifi-efl.git] / sources / ui-gadget / viewers-layout / view_ime_password.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 "wifi.h"
20 #include "view_ime_password.h"
21 #include "i18nmanager.h"
22 #include "wlan_manager.h"
23 #include "viewer_manager.h"
24 #include "popup.h"
25
26
27 static Elm_Genlist_Item_Class itc;
28 static Elm_Genlist_Item_Class show_pw_itc;
29 static Elm_Genlist_Item_Class wps_itc;
30 static Elm_Genlist_Item_Class wps_sep_itc;
31
32 static Evas_Object* button_done = NULL;
33 static Evas_Object* _entry = NULL;
34 static int view_ime_password_end = TRUE;
35
36 typedef struct _view_ime_password_data {
37         char *profile_name;
38         int security_mode;
39         int wps_mode;
40 } view_ime_password_data;
41 view_ime_password_data *_password_data = NULL;
42
43
44 static void _entry_changed_cb(void* data, Evas_Object* obj, void* event_info)
45 {
46         __COMMON_FUNC_ENTER__;
47
48         if (elm_object_focus_get(data)) {
49                 if (elm_entry_is_empty(obj))
50                         elm_object_signal_emit(data, "elm,state,eraser,hide", "elm");
51                 else
52                         elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
53         }
54
55         const char* txt = elm_entry_markup_to_utf8(elm_entry_entry_get(obj));
56         int len = 0;
57
58         if (txt != NULL) {
59                 INFO_LOG(UG_NAME_NORMAL, "* text [%s]", txt);
60                 len = strlen(txt);
61
62                 if (_password_data->security_mode == WLAN_SEC_MODE_WEP) {
63                         if (len > 0) {
64                                 elm_object_disabled_set(button_done, EINA_FALSE);
65                         } else {
66                                 elm_object_disabled_set(button_done, EINA_TRUE);
67                         }
68                 } else {
69                         if (len > 7 && len < 64) {
70                                 elm_object_disabled_set(button_done, EINA_FALSE);
71                         } else {
72                                 elm_object_disabled_set(button_done, EINA_TRUE);
73                         }
74                 }
75         } else {
76                 ERROR_LOG(UG_NAME_NORMAL, "Err!");
77         }
78
79         __COMMON_FUNC_EXIT__;
80 }
81
82 static void _entry_focused_cb(void *data, Evas_Object *obj, void *event_info)
83 {
84         if (!elm_entry_is_empty(obj))
85                 elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
86         elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm");
87 }
88
89 static void _entry_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
90 {
91         if (elm_entry_is_empty(obj))
92                 elm_object_signal_emit(data, "elm,state,guidetext,show", "elm");
93         elm_object_signal_emit(data, "elm,state,eraser,hide", "elm");
94 }
95
96 static void _eraser_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
97 {
98         elm_entry_entry_set(data, "");
99 }
100
101 static int _genlist_item_disable_later(void* data)
102 {
103         if(NULL != data) {
104                 elm_genlist_item_selected_set((Elm_Object_Item*) data, FALSE);
105         }
106         return FALSE;
107 }
108
109 static void _wps_btn_cb(void* data, Evas_Object* obj, void* event_info)
110 {
111         __COMMON_FUNC_ENTER__;
112
113         if (_password_data == NULL)
114                 return;
115
116         int ret = wlan_manager_request_wps_connection(_password_data->profile_name);
117         if (ret == WLAN_MANAGER_ERR_NONE) {
118                 viewer_manager_header_mode_set(HEADER_MODE_CONNECTING);
119                 viewer_manager_item_radio_mode_set(NULL, viewer_manager_current_selected_item_get(), VIEWER_ITEM_RADIO_MODE_WPS_CONNECTING);
120                 winset_popup_mode_set((void *)_password_data->profile_name, POPUP_MODE_PBC, POPUP_OPTION_NONE);
121                 __COMMON_FUNC_EXIT__;
122         }
123
124         ecore_idler_add( (Ecore_Task_Cb) _genlist_item_disable_later, event_info);
125
126         __COMMON_FUNC_EXIT__;
127 }
128
129 static void _show_pw_changed_cb(void *data, Evas_Object *obj, void *event_info)
130 {
131         if (obj == NULL)
132                 return;
133
134         Eina_Bool state = elm_check_state_get(obj);
135         elm_entry_password_set(_entry, !state);
136 }
137
138 static Evas_Object *_content_get(void *data, Evas_Object *obj, const char *part)
139 {
140         Evas_Object *layout = NULL;
141         assertm_if(NULL == part, "NULL!!");
142
143         DEBUG_LOG(UG_NAME_NORMAL, "part [%s]", part);
144
145         if (!strncmp(part, "elm.icon", strlen(part))) {
146                 layout = elm_layout_add(obj);
147                 if (layout) {
148                         elm_layout_theme_set(layout, "layout", "editfield", "title");
149                         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
150                         evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
151                         _entry = elm_entry_add(obj);
152                         elm_object_part_content_set(layout, "elm.swallow.content", _entry);
153                         elm_object_part_text_set(layout, "elm.text", sc(PACKAGE, I18N_TYPE_Input_password));
154                         elm_entry_entry_set(_entry, "");
155
156                         evas_object_smart_callback_add(_entry, "changed", _entry_changed_cb, layout);
157                         evas_object_smart_callback_add(_entry, "focused", _entry_focused_cb, layout);
158                         evas_object_smart_callback_add(_entry, "unfocused", _entry_unfocused_cb, layout);
159                         elm_object_signal_callback_add(layout, "elm,eraser,clicked", "elm", _eraser_clicked_cb, _entry);
160
161                         elm_entry_password_set(_entry, TRUE);
162                         elm_entry_input_panel_layout_set(_entry, ELM_INPUT_PANEL_LAYOUT_URL);
163                         evas_object_show(_entry);
164                         evas_object_show(layout);
165                         elm_object_focus_set(layout, EINA_TRUE);
166                 }
167         }
168
169         return layout;
170 }
171
172 static Evas_Object *_show_pw_content_get(void *data, Evas_Object *obj, const char *part)
173 {
174         Evas_Object *check = NULL;
175
176         if (!strncmp(part, "elm.icon", strlen(part))) {
177                 check = elm_check_add(obj);
178                 elm_object_text_set(check, sc(PACKAGE, I18N_TYPE_Show_password));
179                 elm_object_focus_allow_set(check, EINA_FALSE);
180
181                 evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
182                 evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL);
183
184                 evas_object_smart_callback_add(check, "changed", _show_pw_changed_cb, obj);
185         }
186
187         return check;
188 }
189
190 static Evas_Object *_wps_content_get(void *data, Evas_Object *obj, const char *part)
191 {
192         if (obj == NULL)
193                 return NULL;
194
195         Evas_Object* btn = NULL;
196
197         if(!strncmp(part, "elm.icon", strlen(part))) {
198                 btn = elm_button_add(obj);
199                 elm_object_text_set(btn, "WPS connection");
200         }
201
202         return btn;
203 }
204
205 static Evas_Object* _create_list(Evas_Object* parent)
206 {
207         assertm_if(NULL == parent, "NULL!!");
208
209         Evas_Object *list = elm_genlist_add(parent);
210         elm_genlist_mode_set(list, ELM_LIST_LIMIT);
211         evas_object_size_hint_weight_set(list, 
212                         EVAS_HINT_EXPAND,
213                         EVAS_HINT_EXPAND);
214         evas_object_size_hint_align_set(list, 
215                         EVAS_HINT_FILL, 
216                         EVAS_HINT_FILL);
217
218         itc.item_style = "1icon";
219         itc.func.text_get = NULL;
220         itc.func.content_get = _content_get;
221         itc.func.state_get = NULL;
222         itc.func.del = NULL;
223
224         WLAN_MANAGER_EAP_TYPES det = WLAN_MANAGER_EAP_TYPE_NONE;
225
226         INFO_LOG(UG_NAME_SCAN, "WlanSecMode %d", _password_data->security_mode);
227         if (_password_data->security_mode == WLAN_SEC_MODE_IEEE8021X) {
228                 det =WLAN_MANAGER_EAP_TYPE_ERROR;
229         } else {
230                 det = WLAN_MANAGER_EAP_TYPE_NONE;
231         }
232
233         INFO_LOG(UG_NAME_SCAN, "EAP Type %d", det);
234         switch (det) {
235         case WLAN_MANAGER_EAP_TYPE_NONE:
236                 elm_genlist_item_append(list, &itc,     NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
237                 break;
238         case WLAN_MANAGER_EAP_TYPE_ERROR:
239                 break;
240         default:
241                 INFO_LOG(UG_NAME_SCAN, "EAP Type error");
242                 break;
243         }
244
245         show_pw_itc.item_style = "1text.1icon.2";
246         show_pw_itc.func.text_get = NULL;
247         show_pw_itc.func.content_get = _show_pw_content_get;
248         show_pw_itc.func.state_get = NULL;
249         show_pw_itc.func.del = NULL;
250         Elm_Object_Item *item = elm_genlist_item_append(list, &show_pw_itc, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
251         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
252         
253         if (_password_data->wps_mode) {
254                 wps_sep_itc.item_style = "dialogue/separator/20";
255                 wps_sep_itc.func.text_get = NULL;
256                 wps_sep_itc.func.content_get = NULL;
257                 wps_sep_itc.func.state_get = NULL;
258                 wps_sep_itc.func.del = NULL;
259                 elm_genlist_item_append(list, &wps_sep_itc, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
260
261                 wps_itc.item_style = "dialogue/bg/1icon";
262                 wps_itc.func.text_get = NULL;
263                 wps_itc.func.content_get = _wps_content_get;
264                 wps_itc.func.state_get = NULL;
265                 wps_itc.func.del = NULL;
266                 elm_genlist_item_append(list, &wps_itc, NULL, NULL, ELM_GENLIST_ITEM_NONE, _wps_btn_cb, NULL);
267         }
268
269         return list;
270 }
271
272 static void view_ime_password_back(void *data,  Evas_Object *obj, void *event_info)
273 {
274         __COMMON_FUNC_ENTER__;
275
276         if(view_ime_password_end == TRUE)
277                 return;
278
279         view_ime_password_end = TRUE;
280
281         viewer_manager_set_enabled_list_click(EINA_TRUE);
282         viewer_manager_set_enabled_list_update(EINA_TRUE);
283
284         view_ime_password_destroy();
285
286         __COMMON_FUNC_EXIT__;
287 }
288
289 static void view_ime_password_done(void *data,  Evas_Object *obj, void *event_info)
290 {
291         __COMMON_FUNC_ENTER__;
292         
293         if(view_ime_password_end == TRUE) {
294                 return;
295         } 
296         view_ime_password_end = TRUE;
297
298         int ret = WLAN_MANAGER_ERR_UNKNOWN;
299         wlan_manager_password_data* param = (wlan_manager_password_data*) g_malloc0(sizeof(wlan_manager_password_data));
300         param->wlan_eap_type = _password_data->security_mode;
301
302         int nLen = 0;
303         const char* szPassword = NULL;
304         switch (param->wlan_eap_type) {
305         case WLAN_SEC_MODE_WEP:
306                 szPassword = elm_entry_markup_to_utf8(elm_entry_entry_get(_entry));
307                 nLen = strlen(szPassword);
308
309                 if (nLen == 5 || nLen == 13 || nLen == 26 || nLen == 10) {
310                         INFO_LOG(UG_NAME_NORMAL, "password = [%s]", szPassword);
311                 } else {
312                         winset_popup_mode_set(NULL, POPUP_MODE_CONNECTING_FAILED, POPUP_OPTION_CONNECTIONG_PASSWORD_WEP_ERROR);
313                         view_ime_password_end = FALSE;
314                         return;
315                 }
316
317                 param->password = strdup(szPassword);
318                 viewer_manager_item_radio_mode_all_reset();
319                 viewer_manager_item_radio_mode_set(NULL, viewer_manager_current_selected_item_get(), VIEWER_ITEM_RADIO_MODE_CONNECTING);
320                 viewer_manager_header_mode_set(HEADER_MODE_CONNECTING);
321
322                 ret = wlan_manager_connect_with_password(_password_data->profile_name, _password_data->security_mode, param);
323                 break;
324         case WLAN_SEC_MODE_WPA_PSK:
325         case WLAN_SEC_MODE_WPA2_PSK:
326                 szPassword = elm_entry_markup_to_utf8(elm_entry_entry_get(_entry));
327                 nLen = strlen(szPassword);
328
329                 if (nLen < 8 || nLen > 63) {
330                         winset_popup_mode_set(NULL, POPUP_MODE_CONNECTING_FAILED, POPUP_OPTION_CONNECTIONG_PASSWORD_WPAPSK_ERROR);
331                         view_ime_password_end = FALSE;
332                         return;
333                 } else {
334                         INFO_LOG(UG_NAME_NORMAL, "password = [%s]", szPassword);
335                 }
336
337                 param->password = strdup(szPassword);                   
338                 viewer_manager_item_radio_mode_all_reset();
339                 viewer_manager_item_radio_mode_set(NULL, viewer_manager_current_selected_item_get(), VIEWER_ITEM_RADIO_MODE_CONNECTING);
340                 viewer_manager_header_mode_set(HEADER_MODE_CONNECTING);
341
342                 ret = wlan_manager_connect_with_password(_password_data->profile_name, _password_data->security_mode, param);
343                 break;
344         default:
345                 break;
346         }
347
348         switch (ret) {
349         case WLAN_MANAGER_ERR_NONE:
350                 INFO_LOG(UG_NAME_SCAN, "connect with password comp");
351                 break;
352         default:
353                 ERROR_LOG(UG_NAME_SCAN, "wlan error %d", ret);
354                 viewer_manager_refresh(TRUE);
355                 break;
356         }
357
358         view_ime_password_destroy();
359
360         __COMMON_FUNC_EXIT__;
361 }
362
363 void view_ime_password(wifi_device_info_t *device_info)
364 {
365         __COMMON_FUNC_ENTER__;
366         view_ime_password_end = FALSE;
367
368         Evas_Object *navi_frame = viewer_manager_get_naviframe();
369         if (navi_frame == NULL)
370                 return;
371
372         _password_data = (view_ime_password_data *) malloc(sizeof(view_ime_password_data));
373         if (_password_data == NULL)
374                 return;
375
376         memset(_password_data, 0, sizeof(view_ime_password_data));
377         _password_data->profile_name = strdup(device_info->profile_name);
378         _password_data->security_mode = device_info->security_mode;
379         _password_data->wps_mode = device_info->wps_mode;
380
381         Evas_Object* layout = elm_layout_add(navi_frame);
382         elm_layout_theme_set(layout, "standard", "window", "integration");
383         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
384         edje_object_signal_emit(elm_layout_edje_get(layout), "elm,state,show,content", "elm");
385         edje_object_signal_emit(elm_layout_edje_get(layout), "elm,bg,show,group_list", "elm");
386
387         Evas_Object* conform = elm_conformant_add(navi_frame);
388         elm_object_style_set(conform, "internal_layout");
389         elm_object_part_content_set(layout, "elm.swallow.content", conform);
390
391         Evas_Object* list = _create_list(navi_frame);
392         elm_object_content_set(conform, list);
393
394         elm_naviframe_prev_btn_auto_pushed_set(navi_frame, EINA_FALSE);
395         Elm_Object_Item *navi_it = elm_naviframe_item_push(navi_frame, sc(PACKAGE, I18N_TYPE_Password), NULL, NULL, layout, NULL);
396         elm_naviframe_prev_btn_auto_pushed_set(navi_frame, EINA_TRUE);
397
398         Evas_Object* button_back = elm_button_add(navi_frame);
399         elm_object_style_set(button_back, "naviframe/title/default");
400         elm_object_text_set(button_back, sc(PACKAGE, I18N_TYPE_Back));
401         evas_object_smart_callback_add(button_back, "clicked", view_ime_password_back, NULL);
402         elm_object_item_part_content_set(navi_it, "title_left_btn", button_back);
403
404         button_done = elm_button_add(navi_frame);
405         elm_object_style_set(button_done, "naviframe/title/default");
406         elm_object_text_set(button_done, sc(PACKAGE, I18N_TYPE_Done));
407         evas_object_smart_callback_add(button_done, "clicked", (Evas_Smart_Cb) view_ime_password_done, NULL);
408         elm_object_item_part_content_set(navi_it, "title_right_btn", button_done);
409
410         evas_object_show(layout);
411
412         __COMMON_FUNC_EXIT__;
413 }
414
415 void view_ime_password_destroy()
416 {
417         if (_entry) {
418                 evas_object_smart_callback_del(_entry, "changed", _entry_changed_cb);
419                 evas_object_smart_callback_del(_entry, "focused", _entry_focused_cb);
420                 evas_object_smart_callback_del(_entry, "unfocused", _entry_unfocused_cb);
421                 _entry = NULL;
422         }
423
424         if (_password_data) {
425                 g_free(_password_data);
426                 _password_data = NULL;
427         }
428
429         elm_naviframe_item_pop(viewer_manager_get_naviframe());
430 }