fa8ed8381a434c508b7e3d05b119e52f7de6b6a0
[apps/native/ug-mobile-ap.git] / src / mh_view_wifi_setup.c
1 /*
2 * ug-mobile-ap
3 *
4 * Copyright 2012-2013  Samsung Electronics Co., Ltd
5
6 * Licensed under the Flora License, Version 1.1 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9
10 * http://floralicense.org/license
11
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 */
19 #include <notification.h>
20 #include "mh_view_wifi_setup.h"
21
22 static void __back_btn_cb(void *data, Evas_Object *obj, void *event_info);
23 static void __gl_realized(void *data, Evas_Object *obj, void *event_info);
24
25 static void __input_panel_event_cb(void *data, Ecore_IMF_Context *ctx, int value)
26 {
27         if (data == NULL) {
28                 ERR("data is NULL\n");
29                 return;
30         }
31
32         mh_appdata_t *ad = (mh_appdata_t *)data;
33         mh_wifi_setting_view_t *st = &ad->setup;
34
35         ad->imf_state = value;
36
37         if (st->navi_it == NULL) {
38                 DBG("naviframe item is not pushed yet\n");
39                 return;
40         }
41
42         if (value == ECORE_IMF_INPUT_PANEL_STATE_SHOW &&
43                         (ad->rotate_state == UG_EVENT_ROTATE_LANDSCAPE ||
44                          ad->rotate_state == UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN)) {
45                 DBG("ECORE_IMF_INPUT_PANEL_STATE_SHOW and Landscape mode\n");
46                 elm_naviframe_item_title_visible_set(st->navi_it, EINA_FALSE);
47         } else if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
48                 DBG("ECORE_IMF_INPUT_PANEL_STATE_HIDE\n");
49                 elm_naviframe_item_title_visible_set(st->navi_it, EINA_TRUE);
50         }
51
52         return;
53 }
54
55 static void __hide_btn_changed_cb(void *data, Evas_Object *obj, void *event_info)
56 {
57         __MOBILE_AP_FUNC_ENTER__;
58
59         if (data == NULL || obj == NULL) {
60                 ERR("Invalid param\n");
61                 return;
62         }
63
64         mh_appdata_t *ad = (mh_appdata_t *)data;
65         int ret = 0;
66
67         ret = tethering_wifi_set_ssid_visibility(ad->handle,
68                         !ad->setup.visibility);
69         if (ret != TETHERING_ERROR_NONE) {
70                 ERR("tethering_wifi_set_ssid_visibility is failed : %d\n", ret);
71                 return;
72         }
73
74         ad->setup.visibility = !ad->setup.visibility;
75
76         __MOBILE_AP_FUNC_EXIT__;
77 }
78
79 static void __security_btn_changed_cb(void *data, Evas_Object *obj, void *event_info)
80 {
81         __MOBILE_AP_FUNC_ENTER__;
82
83         if (data == NULL || obj == NULL) {
84                 ERR("Invalid param\n");
85                 return;
86         }
87
88         mh_appdata_t *ad = (mh_appdata_t *)data;
89         int ret = 0;
90
91         if (ad->setup.security_type == TETHERING_WIFI_SECURITY_TYPE_NONE)
92                 ad->setup.security_type = TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK;
93         else
94                 ad->setup.security_type = TETHERING_WIFI_SECURITY_TYPE_NONE;
95
96         ret = tethering_wifi_set_security_type(ad->handle, ad->setup.security_type);
97         if (ret != TETHERING_ERROR_NONE) {
98                 ERR("tethering_wifi_set_security_type is failed : %d\n", ret);
99                 return;
100         }
101
102         elm_genlist_item_update(ad->setup.pw_item);
103
104         __MOBILE_AP_FUNC_EXIT__;
105 }
106
107 static char *__gl_hide_label_get(void *data, Evas_Object *obj, const char *part)
108 {
109         __MOBILE_AP_FUNC_ENTER__;
110
111         if (data == NULL || obj == NULL || part == NULL) {
112                 ERR("Invalid param\n");
113                 return NULL;
114         }
115
116         if (strcmp(part, "elm.text") != 0) {
117                 DBG("Unknown part : %s\n", part);
118                 return NULL;
119         }
120
121         __MOBILE_AP_FUNC_EXIT__;
122         return strdup(_("IDS_MOBILEAP_BODY_HIDE_MY_DEVICE"));
123 }
124
125 static char *__gl_security_label_get(void *data, Evas_Object *obj, const char *part)
126 {
127         __MOBILE_AP_FUNC_ENTER__;
128
129         if (data == NULL || obj == NULL || part == NULL) {
130                 ERR("Invalid param\n");
131                 return NULL;
132         }
133
134         if (strcmp(part, "elm.text") != 0) {
135                 DBG("Unknown part : %s\n", part);
136                 return NULL;
137         }
138
139         __MOBILE_AP_FUNC_EXIT__;
140         return strdup(_("IDS_MOBILEAP_BODY_SECURITY"));
141 }
142
143 static char *__gl_name_label_get(void *data, Evas_Object *obj, const char *part)
144 {
145         __MOBILE_AP_FUNC_ENTER__;
146
147         if (data == NULL || obj == NULL || part == NULL) {
148                 ERR("Invalid param\n");
149                 return NULL;
150         }
151
152         if (strcmp(part, "elm.text") != 0) {
153                 DBG("Unknown part : %s\n", part);
154                 return NULL;
155         }
156
157         mh_appdata_t *ad = (mh_appdata_t *)data;
158         char label[MH_LABEL_LENGTH_MAX] = {0, };
159         char name_change_label[MH_LABEL_LENGTH_MAX] = {0, };
160         char path[MH_LABEL_LENGTH_MAX] = {0, };
161         char *device_name = NULL;
162
163         DBG("Device name : %s\n", ad->setup.device_name);
164
165         device_name = elm_entry_utf8_to_markup(ad->setup.device_name);
166         if (device_name == NULL) {
167                 ERR("elm_entry_utf8_to_markup is failed\n");
168                 return NULL;
169         }
170
171         snprintf(path, sizeof(path), "%s > %s",
172                         S_("IDS_COM_BODY_SETTINGS"),
173                         _("IDS_ST_BODY_ABOUT_PHONE"));
174         snprintf(name_change_label, sizeof(name_change_label),
175                         _("IDS_MOBILEAP_BODY_DEVICE_NAME_CAN_BE_CHANGED_IN_PS"),
176                         path);
177         snprintf(label, sizeof(label), "%s: %s<br>%s",
178                         _("IDS_MOBILEAP_BODY_DEVICE_NAME"),
179                         device_name,
180                         name_change_label);
181         free(device_name);
182
183         __MOBILE_AP_FUNC_EXIT__;
184
185         return strdup(label);
186 }
187
188 static Evas_Object *__gl_hide_icon_get(void *data, Evas_Object *obj,
189                 const char *part)
190 {
191         __MOBILE_AP_FUNC_ENTER__;
192
193         if (data == NULL || obj == NULL || part == NULL) {
194                 ERR("Invalid param\n");
195                 return NULL;
196         }
197
198         if (strcmp(part, "elm.icon") != 0) {
199                 DBG("Unknown part : %s\n", part);
200                 return NULL;
201         }
202
203         mh_appdata_t *ad = (mh_appdata_t *)data;
204         Evas_Object *btn = NULL;
205
206         btn = elm_check_add(obj);
207         if (btn == NULL) {
208                 ERR("btn is NULL\n");
209                 return NULL;
210         }
211         elm_object_style_set(btn, "on&off");
212         evas_object_show(btn);
213         evas_object_pass_events_set(btn, EINA_TRUE);
214         evas_object_propagate_events_set(btn, EINA_FALSE);
215         elm_check_state_set(btn, ad->setup.visibility ? EINA_FALSE : EINA_TRUE);
216         evas_object_smart_callback_add(btn, "changed",
217                         __hide_btn_changed_cb, (void *)ad);
218         ad->setup.hide_btn = btn;
219
220         __MOBILE_AP_FUNC_EXIT__;
221         return btn;
222 }
223
224 static Evas_Object *__gl_security_icon_get(void *data, Evas_Object *obj,
225                 const char *part)
226 {
227         __MOBILE_AP_FUNC_ENTER__;
228
229         if (data == NULL || obj == NULL || part == NULL) {
230                 ERR("Invalid param\n");
231                 return NULL;
232         }
233
234         if (strcmp(part, "elm.icon") != 0) {
235                 DBG("Unknown part : %s\n", part);
236                 return NULL;
237         }
238
239         mh_appdata_t *ad = (mh_appdata_t *)data;
240         Evas_Object *btn = NULL;
241
242         btn = elm_check_add(obj);
243
244         elm_object_style_set(btn, "on&off");
245         evas_object_show(btn);
246         evas_object_pass_events_set(btn, EINA_TRUE);
247         evas_object_propagate_events_set(btn, EINA_FALSE);
248         elm_check_state_set(btn, ad->setup.security_type ==
249                         TETHERING_WIFI_SECURITY_TYPE_NONE ?
250                         EINA_FALSE : EINA_TRUE);
251         evas_object_smart_callback_add(btn, "changed",
252                         __security_btn_changed_cb, (void *)ad);
253         ad->setup.security_btn = btn;
254
255         __MOBILE_AP_FUNC_EXIT__;
256         return btn;
257 }
258
259 static Eina_Bool __save_wifi_passphrase(mh_appdata_t *ad)
260 {
261         __MOBILE_AP_FUNC_ENTER__;
262
263         if (ad == NULL) {
264                 ERR("Invalid param\n");
265                 return EINA_FALSE;
266         }
267
268         mh_wifi_setting_view_t *st = &ad->setup;
269         int ret = 0;
270
271         ret = tethering_wifi_set_passphrase(ad->handle, st->wifi_passphrase_new);
272         if (ret != TETHERING_ERROR_NONE) {
273                 ERR("tethering_wifi_set_passphrase is failed : %d\n", ret);
274                 return EINA_FALSE;
275         }
276
277         g_strlcpy(st->wifi_passphrase, st->wifi_passphrase_new, sizeof(st->wifi_passphrase));
278
279         __MOBILE_AP_FUNC_EXIT__;
280
281         return EINA_TRUE;
282 }
283
284 static void __passphrase_maxlength_reached_cb(void *data, Evas_Object *obj,
285                 void *event_info)
286 {
287         __MOBILE_AP_FUNC_ENTER__;
288
289         if (data == NULL || obj == NULL) {
290                 ERR("The param is NULL\n");
291                 return;
292         }
293
294         mh_appdata_t *ad = (mh_appdata_t *)data;
295         char buf[MH_LABEL_LENGTH_MAX] = {0, };
296         int ret;
297
298         ecore_imf_input_panel_hide();
299         elm_object_focus_set(ad->setup.pw_entry, EINA_FALSE);
300
301         if (__save_wifi_passphrase(ad) == EINA_FALSE) {
302                 ERR("__save_wifi_passphrase is failed\n");
303         }
304
305         snprintf(buf, sizeof(buf),
306                         _("IDS_MOBILEAP_POP_PASSWORD_MUST_CONTAIN_AT_LEAST_PD_CHARACTERS_AND_NOT_EXCEED_PD_CHARACTERS"),
307                         WIFI_PASSPHRASE_LENGTH_MIN, WIFI_PASSPHRASE_LENGTH_MAX);
308
309         ret = notification_status_message_post(buf);
310         if (ret != NOTIFICATION_ERROR_NONE)
311                 ERR("notification_status_message_post() is failed : %d\n", ret);
312
313         __MOBILE_AP_FUNC_EXIT__;
314 }
315
316 static void __passphrase_activated_cb(void *data, Evas_Object *obj,
317                 void *event_info)
318 {
319         __MOBILE_AP_FUNC_ENTER__;
320
321         if (data == NULL || obj == NULL) {
322                 ERR("Invalid param\n");
323                 return;
324         }
325
326         mh_appdata_t *ad = (mh_appdata_t *)data;
327         int ret;
328         char *ptr;
329
330         ecore_imf_input_panel_hide();
331         elm_object_focus_set(ad->setup.pw_entry, EINA_FALSE);
332
333         if (strlen(ad->setup.wifi_passphrase_new) < WIFI_PASSPHRASE_LENGTH_MIN) {
334                 DBG("Password is shorter than %d\n", WIFI_PASSPHRASE_LENGTH_MIN);
335                 ret = notification_status_message_post(_("IDS_ST_BODY_ENTER_PASSWORD_OF_AT_LEAST_8_CHARACTERS"));
336                 if (ret != NOTIFICATION_ERROR_NONE)
337                         ERR("notification_status_message_post() is failed : %d\n", ret);
338
339                 ptr = elm_entry_utf8_to_markup(ad->setup.wifi_passphrase);
340                 if (ptr != NULL) {
341                         elm_entry_entry_set(ad->setup.pw_entry, ptr);
342                         free(ptr);
343                 } else {
344                         ERR("elm_entry_utf8_to_markup is failed\n");
345                 }
346
347                 return;
348         }
349
350         if (__save_wifi_passphrase(ad) == EINA_FALSE) {
351                 ERR("__save_wifi_passphrase is failed\n");
352         }
353
354         __MOBILE_AP_FUNC_EXIT__;
355
356         return;
357 }
358
359 static void __pw_entry_changed_cb(void *data, Evas_Object *obj,
360                 void *event_info)
361 {
362         __MOBILE_AP_FUNC_ENTER__;
363
364         if (data == NULL || obj == NULL) {
365                 ERR("Invalid param\n");
366                 return;
367         }
368
369         mh_appdata_t *ad = (mh_appdata_t *)data;
370         mh_wifi_setting_view_t *st = &ad->setup;
371         const char *changed_text;
372         char *utf8_string;
373
374         changed_text = elm_entry_entry_get(st->pw_entry);
375         if (changed_text == NULL) {
376                 ERR("elm_entry_entry_get is failed\n");
377                 return;
378         }
379
380         utf8_string = elm_entry_markup_to_utf8(changed_text);
381         if (utf8_string == NULL) {
382                 ERR("elm_entry_markup_to_utf8() Failed!!!\n");
383         } else {
384                 g_strlcpy(st->wifi_passphrase_new, utf8_string,
385                                 sizeof(st->wifi_passphrase_new));
386                 free(utf8_string);
387         }
388
389         if (!elm_object_focus_get(st->pw_entry)) {
390                 return;
391         }
392
393         if (elm_entry_is_empty(st->pw_entry)) {
394                 elm_object_item_signal_emit(st->pw_item,
395                                 "elm,state,eraser,hide", "");
396         } else {
397                 elm_object_item_signal_emit(st->pw_item,
398                                 "elm,state,eraser,show", "");
399         }
400
401         __MOBILE_AP_FUNC_EXIT__;
402
403         return;
404
405 }
406
407 static void __pw_entry_focused_cb(void *data, Evas_Object *obj,
408                 void *event_info)
409 {
410         __MOBILE_AP_FUNC_ENTER__;
411
412         if (data == NULL || obj == NULL) {
413                 ERR("Invalid param\n");
414                 return;
415         }
416
417         mh_appdata_t *ad = (mh_appdata_t *)data;
418         mh_wifi_setting_view_t *st = &ad->setup;
419
420         if (!elm_entry_is_empty(st->pw_entry)) {
421                 elm_entry_cursor_end_set(st->pw_entry);
422                 elm_object_item_signal_emit(st->pw_item,
423                                 "elm,state,eraser,show", "");
424         }
425
426         __MOBILE_AP_FUNC_EXIT__;
427
428         return;
429
430 }
431
432 static void __pw_entry_unfocused_cb(void *data, Evas_Object *obj,
433                 void *event_info)
434 {
435         __MOBILE_AP_FUNC_ENTER__;
436
437         if (data == NULL || obj == NULL) {
438                 ERR("Invalid param\n");
439                 return;
440         }
441
442         mh_appdata_t *ad = (mh_appdata_t *)data;
443         mh_wifi_setting_view_t *st = &ad->setup;
444
445         elm_object_item_signal_emit(st->pw_item,
446                         "elm,state,eraser,hide", "");
447
448         __MOBILE_AP_FUNC_EXIT__;
449
450         return;
451
452 }
453
454 static void __pw_layout_eraser_clicked_cb(void *data, Evas_Object *obj, void *event_info)
455 {
456         __MOBILE_AP_FUNC_ENTER__;
457
458         if (data == NULL || obj == NULL) {
459                 ERR("Invalid param\n");
460                 return;
461         }
462
463         mh_appdata_t *ad = (mh_appdata_t *)data;
464         mh_wifi_setting_view_t *st = &ad->setup;
465
466         elm_entry_entry_set(st->pw_entry, "");
467
468         __MOBILE_AP_FUNC_EXIT__;
469
470         return;
471
472 }
473
474 static char *__gl_pw_text_get(void *data, Evas_Object *obj, const char *part)
475 {
476         __MOBILE_AP_FUNC_ENTER__;
477
478         if (data == NULL || obj == NULL || part == NULL) {
479                 ERR("Invalid parameter\n");
480                 return NULL;
481         }
482
483         if (g_strcmp0(part, "elm.text") != 0) {
484                 ERR("Invalid part : %s\n", part);
485                 return NULL;
486         }
487
488         __MOBILE_AP_FUNC_EXIT__;
489         return strdup(_("IDS_MOBILEAP_BODY_PASSWORD"));
490 }
491
492 static Evas_Object *__gl_pw_icon_get(void *data, Evas_Object *obj,
493                 const char *part)
494 {
495         __MOBILE_AP_FUNC_ENTER__;
496
497         if (data == NULL || obj == NULL || part == NULL) {
498                 ERR("Invalid param\n");
499                 return NULL;
500         }
501
502         if (g_strcmp0(part, "elm.icon.entry") == 0) {
503                 static Elm_Entry_Filter_Limit_Size limit_filter_data;
504
505                 mh_appdata_t *ad = (mh_appdata_t *)data;
506                 mh_wifi_setting_view_t *st = &ad->setup;
507                 Evas_Object *entry = NULL;
508                 char *ptr = NULL;
509                 Ecore_IMF_Context *imf_context;
510
511                 entry = elm_entry_add(obj);
512                 if (entry == NULL) {
513                         ERR("elm_entry_add returns NULL\n");
514                         st->pw_entry = NULL;
515                         return NULL;
516                 }
517
518                 /* Set single line of entry */
519                 elm_entry_scrollable_set(entry, EINA_TRUE);
520                 elm_entry_single_line_set(entry, EINA_TRUE);
521                 elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_PASSWORD);
522                 elm_entry_select_allow_set(entry, EINA_FALSE);
523                 elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
524
525                 /* Set the maximum length filter for passphrase entry */
526                 limit_filter_data.max_char_count = 0;
527                 limit_filter_data.max_byte_count = WIFI_PASSPHRASE_LENGTH_MAX;
528                 elm_entry_markup_filter_append(entry,
529                                 elm_entry_filter_limit_size, &limit_filter_data);
530
531                 DBG("security_type : %d\n", st->security_type);
532                 if (st->security_type == TETHERING_WIFI_SECURITY_TYPE_NONE) {
533                         ptr = elm_entry_utf8_to_markup(st->wifi_passphrase);
534                         if (ptr != NULL) {
535                                 elm_entry_entry_set(entry, ptr);
536                                 free(ptr);
537                         } else {
538                                 ERR("elm_entry_utf8_to_markup is failed\n");
539                         }
540
541                         /* Set editable mode */
542                         elm_entry_input_panel_enabled_set(entry, EINA_FALSE);
543                         elm_object_disabled_set(entry, EINA_TRUE);
544                 } else {
545                         ptr = elm_entry_utf8_to_markup(st->wifi_passphrase_new);
546                         if (ptr != NULL) {
547                                 elm_entry_entry_set(entry, ptr);
548                                 free(ptr);
549                         } else {
550                                 ERR("elm_entry_utf8_to_markup is failed\n");
551                         }
552                 }
553
554                 evas_object_smart_callback_add(entry, "maxlength,reached",
555                                 __passphrase_maxlength_reached_cb, data);
556                 evas_object_smart_callback_add(entry, "activated",
557                                 __passphrase_activated_cb, data);
558                 evas_object_smart_callback_add(entry, "changed",
559                                 __pw_entry_changed_cb, data);
560                 evas_object_smart_callback_add(entry, "focused",
561                                 __pw_entry_focused_cb, data);
562                 evas_object_smart_callback_add(entry, "unfocused",
563                                 __pw_entry_unfocused_cb, data);
564
565                 imf_context = (Ecore_IMF_Context *)elm_entry_imf_context_get(entry);
566                 if (imf_context == NULL) {
567                         ERR("elm_entry_imf_context_get() is failed\n");
568                 } else {
569                         ecore_imf_context_input_panel_event_callback_add(imf_context,
570                                         ECORE_IMF_INPUT_PANEL_STATE_EVENT,
571                                         __input_panel_event_cb, (void *)ad);
572                 }
573
574                 elm_object_item_signal_emit(st->pw_item,
575                                 "elm,state,rename,hide", "");
576                 if (!elm_entry_is_empty(entry)) {
577                         elm_object_item_signal_emit(st->pw_item,
578                                         "elm,state,eraser,hide", "");
579                 }
580
581                 elm_object_part_text_set(entry, "elm.guide",
582                                 S_("IDS_COM_BODY_ENTER_PASSWORD"));
583
584                 evas_object_show(entry);
585                 st->pw_entry = entry;
586
587                 __MOBILE_AP_FUNC_EXIT__;
588                 return st->pw_entry;
589         } else if (g_strcmp0(part, "elm.icon.eraser") == 0) {
590                 Evas_Object *btn = elm_button_add(obj);
591                 elm_object_style_set(btn, "editfield_clear");
592                 evas_object_smart_callback_add(btn, "clicked", __pw_layout_eraser_clicked_cb, data);
593                 return btn;
594         } else {
595                 DBG("Unknown part : %s\n", part);
596         }
597
598         return NULL;
599 }
600
601 static void __gl_hide_item_sel(void *data, Evas_Object *obj, void *event_info)
602 {
603         __MOBILE_AP_FUNC_ENTER__;
604
605         if (data == NULL || obj == NULL || event_info == NULL) {
606                 ERR("param is NULL\n");
607                 return;
608         }
609
610         mh_appdata_t *ad = (mh_appdata_t *)data;
611
612         elm_genlist_item_selected_set((Elm_Object_Item*)event_info, EINA_FALSE);
613
614         __hide_btn_changed_cb(data, obj, NULL);
615         elm_check_state_set(ad->setup.hide_btn, ad->setup.visibility ?
616                         EINA_FALSE : EINA_TRUE);
617
618         __MOBILE_AP_FUNC_EXIT__;
619 }
620
621 static void __gl_security_item_sel(void *data, Evas_Object *obj, void *event_info)
622 {
623         __MOBILE_AP_FUNC_ENTER__;
624
625         if (data == NULL || obj == NULL || event_info == NULL) {
626                 ERR("param is NULL\n");
627                 return;
628         }
629
630         mh_appdata_t *ad = (mh_appdata_t *)data;
631
632         elm_genlist_item_selected_set((Elm_Object_Item*)event_info, EINA_FALSE);
633
634         __security_btn_changed_cb(data, obj, NULL);
635         elm_check_state_set(ad->setup.security_btn, ad->setup.security_type ==
636                         TETHERING_WIFI_SECURITY_TYPE_NONE ? EINA_FALSE : EINA_TRUE);
637
638         __MOBILE_AP_FUNC_EXIT__;
639 }
640
641 static void __free_genlist_itc(mh_appdata_t *ad)
642 {
643         __MOBILE_AP_FUNC_ENTER__;
644
645         elm_genlist_item_class_free(ad->setup.sp_itc);
646         elm_genlist_item_class_free(ad->setup.hide_itc);
647         elm_genlist_item_class_free(ad->setup.security_itc);
648         elm_genlist_item_class_free(ad->setup.pw_itc);
649         elm_genlist_item_class_free(ad->setup.name_itc);
650
651         __MOBILE_AP_FUNC_EXIT__;
652         return;
653 }
654
655 static void __set_genlist_itc(mh_appdata_t *ad)
656 {
657         __MOBILE_AP_FUNC_ENTER__;
658
659         ad->setup.sp_itc = elm_genlist_item_class_new();
660         ad->setup.sp_itc->item_style = "dialogue/separator";
661         ad->setup.sp_itc->func.text_get = NULL;
662         ad->setup.sp_itc->func.content_get = NULL;
663         ad->setup.sp_itc->func.state_get = NULL;
664         ad->setup.sp_itc->func.del = NULL;
665
666         ad->setup.hide_itc = elm_genlist_item_class_new();
667         ad->setup.hide_itc->item_style = "dialogue/1text.1icon";
668         ad->setup.hide_itc->func.text_get = __gl_hide_label_get;
669         ad->setup.hide_itc->func.content_get = __gl_hide_icon_get;
670         ad->setup.hide_itc->func.state_get = NULL;
671         ad->setup.hide_itc->func.del = NULL;
672
673         ad->setup.security_itc = elm_genlist_item_class_new();
674         ad->setup.security_itc->item_style = "dialogue/1text.1icon";
675         ad->setup.security_itc->func.text_get = __gl_security_label_get;
676         ad->setup.security_itc->func.content_get = __gl_security_icon_get;
677         ad->setup.security_itc->func.state_get = NULL;
678         ad->setup.security_itc->func.del = NULL;
679
680         ad->setup.pw_itc = elm_genlist_item_class_new();
681         ad->setup.pw_itc->item_style = "dialogue/editfield/title";
682         ad->setup.pw_itc->func.text_get = __gl_pw_text_get;
683         ad->setup.pw_itc->func.content_get = __gl_pw_icon_get;
684         ad->setup.pw_itc->func.state_get = NULL;
685         ad->setup.pw_itc->func.del = NULL;
686
687         ad->setup.name_itc = elm_genlist_item_class_new();
688         ad->setup.name_itc->item_style = "multiline/1text";
689         ad->setup.name_itc->func.text_get = __gl_name_label_get;
690         ad->setup.name_itc->func.content_get = NULL;
691         ad->setup.name_itc->func.state_get = NULL;
692         ad->setup.name_itc->func.del = NULL;
693
694         ad->setup.end_sp_itc = elm_genlist_item_class_new();
695         ad->setup.end_sp_itc->item_style = "dialogue/separator";
696         ad->setup.end_sp_itc->func.text_get = NULL;
697         ad->setup.end_sp_itc->func.content_get = NULL;
698         ad->setup.end_sp_itc->func.state_get = NULL;
699         ad->setup.end_sp_itc->func.del = NULL;
700
701         __MOBILE_AP_FUNC_EXIT__;
702         return;
703 }
704
705 static void __deconstruct_wifi_setup_view(mh_wifi_setting_view_t *st)
706 {
707         __MOBILE_AP_FUNC_ENTER__;
708
709         if (st == NULL) {
710                 ERR("st is NULL\n");
711                 return;
712         }
713
714         if (st->pw_entry == NULL) {
715                 ERR("pw_entry is NULL");
716                 return;
717         }
718
719         evas_object_smart_callback_del(st->hide_btn, "changed",
720                         __hide_btn_changed_cb);
721         evas_object_smart_callback_del(st->security_btn, "changed",
722                         __security_btn_changed_cb);
723         if (st->pw_entry) {
724                 evas_object_smart_callback_del(st->pw_entry,
725                                 "maxlength,reached",
726                                 __passphrase_maxlength_reached_cb);
727                 evas_object_smart_callback_del(st->pw_entry,
728                                 "activated",
729                                 __passphrase_activated_cb);
730         }
731         evas_object_smart_callback_del(st->back_btn, "clicked",
732                         __back_btn_cb);
733         evas_object_smart_callback_del(st->genlist, "realized",
734                         __gl_realized);
735
736         st->hide_btn = NULL;
737         st->security_btn = NULL;
738         st->pw_entry = NULL;
739         st->back_btn = NULL;
740         st->genlist = NULL;
741
742         __MOBILE_AP_FUNC_EXIT__;
743 }
744
745 static void __back_btn_cb(void *data, Evas_Object *obj, void *event_info)
746 {
747         __MOBILE_AP_FUNC_ENTER__;
748
749         if (data == NULL) {
750                 ERR("The param is NULL\n");
751                 return;
752         }
753
754         mh_appdata_t *ad = (mh_appdata_t *)data;
755         mh_wifi_setting_view_t *st = &ad->setup;
756         Eina_Bool imf_state;
757         int ret;
758         char *ptr = NULL;
759
760         imf_state = ecore_imf_input_panel_hide();
761         elm_object_focus_set(st->pw_entry, EINA_FALSE);
762
763         if (strlen(st->wifi_passphrase_new) < WIFI_PASSPHRASE_LENGTH_MIN) {
764                 DBG("Password is shorter than %d\n", WIFI_PASSPHRASE_LENGTH_MIN);
765                 ret = notification_status_message_post(_("IDS_ST_BODY_ENTER_PASSWORD_OF_AT_LEAST_8_CHARACTERS"));
766                 if (ret != NOTIFICATION_ERROR_NONE)
767                         ERR("notification_status_message_post() is failed : %d\n", ret);
768
769                 ptr = elm_entry_utf8_to_markup(st->wifi_passphrase);
770                 if (ptr != NULL) {
771                         elm_entry_entry_set(st->pw_entry, ptr);
772                         free(ptr);
773                 } else {
774                         ERR("elm_entry_utf8_to_markup is failed\n");
775                 }
776
777                 return;
778         }
779
780         if (g_strcmp0(st->wifi_passphrase, st->wifi_passphrase_new) != 0) {
781                 if (__save_wifi_passphrase(ad) == EINA_FALSE) {
782                         ERR("__save_wifi_passphrase is failed\n");
783                 }
784         }
785
786         if (imf_state == EINA_TRUE) {
787                 DBG("IMF is hided\n");
788                 return;
789         }
790
791         if (ad->main.need_recover_wifi_tethering == true) {
792                 DBG("Turn on Wi-Fi tethering again\n");
793                 _update_wifi_item(ad, MH_STATE_PROCESS);
794                 if (ad->main.help_item)
795                         elm_genlist_item_update(ad->main.help_item);
796
797                 ret = tethering_enable(ad->handle, TETHERING_TYPE_WIFI);
798                 if (ret != TETHERING_ERROR_NONE) {
799                         ERR("Wi-Fi tethering on is failed : %d\n", ret);
800                         _update_wifi_item(ad, MH_STATE_NONE);
801                         ad->main.need_recover_wifi_tethering = false;
802                 }
803         }
804
805         __deconstruct_wifi_setup_view(st);
806
807         evas_object_del(ad->setup.genlist);
808         __free_genlist_itc(ad);
809
810         elm_naviframe_item_pop(ad->naviframe);
811
812         __MOBILE_AP_FUNC_EXIT__;
813 }
814
815 static void __gl_realized(void *data, Evas_Object *obj, void *event_info)
816 {
817         __MOBILE_AP_FUNC_ENTER__;
818
819         mh_appdata_t *ad = (mh_appdata_t *)data;
820         mh_wifi_setting_view_t *st = &(ad->setup);
821         Elm_Object_Item *item = (Elm_Object_Item *)event_info;
822         Evas_Object *ao;
823         Evas_Object *btn;
824         char str[MH_LABEL_LENGTH_MAX] = {0, };
825         int i = 0;
826
827         if (item == st->hide_item) {
828                 DBG("Hide item is realized\n");
829                 elm_object_item_signal_emit(item, "elm,state,top", "");
830         } else if (item == st->security_item) {
831                 DBG("Security item is realized\n");
832                 elm_object_item_signal_emit(item, "elm,state,center", "");
833         } else if (item == st->pw_item) {
834                 DBG("Password item is realized\n");
835                 elm_object_item_signal_emit(item, "elm,state,bottom", "");
836         } else if (item == st->name_item) {
837                 DBG("Name item is realized\n");
838         }
839
840         for (i = 0; i < 2; i++) {
841                 if (item == st->sp_item[i])
842                         elm_object_item_access_unregister(item);
843         }
844
845         if (item == st->hide_item || item == st->security_item) {
846                 ao = elm_object_item_access_object_get(item);
847                 btn = elm_object_item_part_content_get(item, "on&off");
848                 snprintf(str, sizeof(str), "%s, %s", "On/off button",
849                                 (elm_check_state_get(btn) ? "On" : "Off"));
850                 elm_access_info_set(ao, ELM_ACCESS_CONTEXT_INFO, str);
851         }
852
853         __MOBILE_AP_FUNC_EXIT__;
854
855         return;
856 }
857
858 Evas_Object *__create_genlist(mh_appdata_t *ad)
859 {
860         __MOBILE_AP_FUNC_ENTER__;
861
862         if (ad == NULL) {
863                 ERR("ad is NULL\n");
864                 return NULL;
865         }
866
867         void *data = (void *)ad;
868         mh_wifi_setting_view_t *st = &ad->setup;
869         Evas_Object *genlist;
870         Elm_Object_Item *item;
871         int i = 0;
872
873         genlist = elm_genlist_add(ad->naviframe);
874         if (genlist == NULL) {
875                 ERR("genlist is NULL\n");
876                 return NULL;
877         }
878
879         elm_object_style_set(genlist, "dialogue");
880         elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
881         evas_object_smart_callback_add(genlist, "realized", __gl_realized, ad);
882
883         __set_genlist_itc(ad);
884         item = elm_genlist_item_append(genlist, st->sp_itc, NULL, NULL,
885                         ELM_GENLIST_ITEM_NONE, NULL, NULL);
886         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
887         st->sp_item[i++] = item;
888
889         st->hide_item = elm_genlist_item_append(genlist, st->hide_itc, data, NULL,
890                         ELM_GENLIST_ITEM_NONE, __gl_hide_item_sel, data);
891
892         st->security_item = elm_genlist_item_append(genlist, st->security_itc, data, NULL,
893                         ELM_GENLIST_ITEM_NONE, __gl_security_item_sel, data);
894
895         st->pw_item = elm_genlist_item_append(genlist, st->pw_itc, data, NULL,
896                         ELM_GENLIST_ITEM_NONE, NULL, NULL);
897         elm_genlist_item_select_mode_set(st->pw_item, ELM_OBJECT_SELECT_MODE_NONE);
898
899         st->name_item = elm_genlist_item_append(genlist, st->name_itc, data, NULL,
900                         ELM_GENLIST_ITEM_NONE, NULL, NULL);
901         elm_genlist_item_select_mode_set(st->name_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
902
903         item = elm_genlist_item_append(genlist, st->end_sp_itc, NULL, NULL,
904                         ELM_GENLIST_ITEM_NONE, NULL, NULL);
905         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
906         st->sp_item[i++] = item;
907
908
909         __MOBILE_AP_FUNC_EXIT__;
910
911         return genlist;
912 }
913
914 char *__slide_title_access_info_cb(void *data, Evas_Object *obj)
915 {
916         Evas_Object *label;
917         Elm_Object_Item *navi_it;
918         Eina_Strbuf *buf;
919         const char *info;
920         char *ret;
921
922         navi_it = (Elm_Object_Item *) data;
923         label = elm_object_item_part_content_get(navi_it, "elm.swallow.title");
924         if (label == NULL)
925                 return NULL;
926
927         info = elm_object_text_get(label);
928         if (info == NULL)
929                 return NULL;
930
931         buf = eina_strbuf_new();
932         eina_strbuf_append(buf, info);
933
934         ret = eina_strbuf_string_steal(buf);
935         eina_strbuf_free(buf);
936         return ret;
937 }
938
939 static void __title_clicked_cb(void *data, Evas_Object *obj, void *event_info)
940 {
941         Evas_Object *label;
942         Elm_Object_Item *navi_it = event_info;
943         if (navi_it == NULL)
944                 return;
945
946         label = elm_object_item_part_content_get(navi_it, "elm.swallow.title");
947         if (label == NULL)
948                 return;
949
950         elm_label_slide_go(label);
951 }
952
953 void mh_draw_wifi_setup_view(mh_appdata_t *ad)
954 {
955         __MOBILE_AP_FUNC_ENTER__;
956
957         if (ad == NULL) {
958                 ERR("ad is NULL\n");
959                 return;
960         }
961
962         mh_wifi_setting_view_t *st = &ad->setup;
963         Evas_Object *ao;
964         Evas_Object *label;
965
966
967         if (st->genlist != NULL) {
968                 ERR("Wi-Fi setup view already exists\n");
969                 return;
970         }
971
972         st->genlist = __create_genlist(ad);
973         if (st->genlist == NULL) {
974                 ERR("__create_genlist returns NULL\n");
975                 goto FAIL;
976         }
977
978         st->back_btn = elm_button_add(ad->naviframe);
979         if (st->back_btn == NULL) {
980                 ERR("elm_button_add returns NULL\n");
981                 goto FAIL;
982         }
983         elm_object_style_set(st->back_btn, "naviframe/back_btn/default");
984         evas_object_smart_callback_add(st->back_btn, "clicked",
985                         __back_btn_cb, ad);
986         elm_object_focus_allow_set(st->back_btn, EINA_FALSE);
987
988         st->navi_it = elm_naviframe_item_push(ad->naviframe,
989                         NULL,
990                         st->back_btn, NULL, st->genlist, NULL);
991
992         /* Slide title */
993         label = _create_slide_title(ad->naviframe, _("IDS_MOBILEAP_MBODY_WI_FI_TETHERING_SETTINGS"));
994         elm_object_item_part_content_set(st->navi_it, "elm.swallow.title", label);
995         evas_object_smart_callback_add(ad->naviframe, "title,clicked", __title_clicked_cb, NULL);
996
997         ao = elm_object_item_access_object_get(st->navi_it);
998         if (ao) {
999                 elm_access_info_set(ao, ELM_ACCESS_TYPE, "title");
1000                 elm_access_info_cb_set(ao, ELM_ACCESS_INFO,
1001                                 __slide_title_access_info_cb, st->navi_it);
1002                 elm_object_focus_set(ao, EINA_TRUE);
1003         }
1004
1005         /* Realize genlist item forcely since UIFW doesn't make realize to avoid crash on landscape mode*/
1006         elm_genlist_item_update(st->pw_item);
1007
1008         __MOBILE_AP_FUNC_EXIT__;
1009
1010         return;
1011
1012 FAIL:
1013         if (st->back_btn)
1014                 evas_object_del(st->back_btn);
1015         if (st->genlist)
1016                 evas_object_del(st->genlist);
1017
1018         st->back_btn = NULL;
1019         st->genlist = NULL;
1020 }