Add padding to pw editfield to display straight away
[apps/native/ug-mobile-ap.git] / src / mh_view_wifi_setup.c
1 /*
2 * ug-mobile-ap
3 *
4 * Copyright 2012  Samsung Electronics Co., Ltd
5
6 * Licensed under the Flora License, Version 1.0 (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://www.tizenopensource.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 <efl_extension.h>
20
21 #include "mh_popup.h"
22 #include "mh_view_wifi_setup.h"
23 #include "mh_string.h"
24
25 static void __gl_realized(void *data, Evas_Object *obj, void *event_info);
26 static void __cancel_btn_cb(void *data, Evas_Object *object, void *event_info);
27 static void __save_btn_cb(void *data, Evas_Object *object, void *event_info);
28
29 static void __hide_btn_changed_cb(void *data, Evas_Object *obj, void *event_info)
30 {
31         __MOBILE_AP_FUNC_ENTER__;
32
33         if (data == NULL || obj == NULL) {
34                 ERR("Invalid param\n");
35                 return;
36         }
37
38         mh_appdata_t *ad = (mh_appdata_t *)data;
39
40         ad->setup.visibility_new = !ad->setup.visibility_new;
41
42         __MOBILE_AP_FUNC_EXIT__;
43 }
44
45 static bool __save_hide_btn_change(mh_appdata_t *ad)
46 {
47         __MOBILE_AP_FUNC_ENTER__;
48
49         if (ad == NULL) {
50                 ERR("Invalid param\n");
51                 return false;
52         }
53
54         int ret = 0;
55
56         ret = tethering_wifi_set_ssid_visibility(ad->handle,
57                         ad->setup.visibility_new);
58         if (ret != TETHERING_ERROR_NONE) {
59                 ERR("tethering_wifi_set_ssid_visibility is failed : %d\n", ret);
60                 return false;
61         }
62
63         __MOBILE_AP_FUNC_EXIT__;
64         return true;
65 }
66
67 static void __security_btn_changed_cb(void *data, Evas_Object *obj, void *event_info)
68 {
69         __MOBILE_AP_FUNC_ENTER__;
70
71         if (data == NULL || obj == NULL) {
72                 ERR("Invalid param\n");
73                 return;
74         }
75
76         mh_appdata_t *ad = (mh_appdata_t *)data;
77         mh_wifi_setting_view_t *st = &ad->setup;
78
79         if (st->security_type_new == TETHERING_WIFI_SECURITY_TYPE_NONE)
80                 st->security_type_new = TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK;
81         else
82                 st->security_type_new = TETHERING_WIFI_SECURITY_TYPE_NONE;
83
84         /* update wifi passphrase item */
85         if (st->security_type_new == TETHERING_WIFI_SECURITY_TYPE_NONE) {
86                 elm_object_item_disabled_set(st->pw_item, EINA_TRUE);
87                 elm_object_disabled_set(st->save_button, EINA_FALSE);
88         } else {
89                 elm_object_item_disabled_set(st->pw_item, EINA_FALSE);
90                 if (st->pw_entry == NULL || elm_entry_entry_get(st->pw_entry) == NULL ||
91                     strlen(elm_entry_entry_get(st->pw_entry)) == 0)
92                         elm_object_disabled_set(st->save_button, EINA_TRUE);
93         }
94
95         if (st->pw_item)
96                 elm_genlist_item_update(st->pw_item);
97
98         __MOBILE_AP_FUNC_EXIT__;
99 }
100
101 static bool __save_security_btn_change(mh_appdata_t *ad)
102 {
103         __MOBILE_AP_FUNC_ENTER__;
104
105         if (ad == NULL) {
106                 ERR("Invalid param\n");
107                 return false;
108         }
109
110         int ret = 0;
111
112         ret = tethering_wifi_set_security_type(ad->handle, ad->setup.security_type_new);
113         if (ret != TETHERING_ERROR_NONE) {
114                 ERR("tethering_wifi_set_security_type is failed : %d\n", ret);
115                 return false;
116         }
117
118         __MOBILE_AP_FUNC_EXIT__;
119         return true;
120 }
121
122 static char *__gl_device_name_title_label_get(void *data, Evas_Object *obj, const char *part)
123 {
124         __MOBILE_AP_FUNC_ENTER__;
125         mh_appdata_t *ad = (mh_appdata_t *)data;
126         char *device_name_utf = NULL;
127         char *ptr = NULL;
128         char buf[MH_LABEL_LENGTH_MAX] = {0, };
129
130         if (data == NULL || obj == NULL || part == NULL) {
131                 ERR("Invalid param\n");
132                 return NULL;
133         }
134
135         if (!strcmp("elm.text.multiline", part)) {
136                 device_name_utf = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
137                 if (device_name_utf == NULL) {
138                         ERR("vconf_get_str failed \n");
139                 }
140
141                 ptr = elm_entry_utf8_to_markup(device_name_utf);
142                 if (ptr == NULL) {
143                         ERR("elm_entry_utf8_to_markup is failed\n");
144                         free(device_name_utf);
145                         return NULL;
146                 }
147
148                 g_strlcpy(ad->setup.device_name, ptr,
149                                 sizeof(ad->setup.device_name));
150
151                 snprintf(buf, MH_LABEL_LENGTH_MAX, "<font_size=30>%s</font_size><br>%s", STR_MY_DEVICE_NAME, ptr);
152
153                 free(device_name_utf);
154                 free(ptr);
155
156                 return strdup(buf);
157         }
158
159         __MOBILE_AP_FUNC_EXIT__;
160         return NULL;
161 }
162
163 static char *__gl_hide_label_get(void *data, Evas_Object *obj, const char *part)
164 {
165         __MOBILE_AP_FUNC_ENTER__;
166
167         if (data == NULL || obj == NULL || part == NULL) {
168                 ERR("Invalid param\n");
169                 return NULL;
170         }
171
172         if (!strcmp("elm.text", part)) {
173                 return strdup(STR_HIDE_MY_DEV);
174         }
175
176         __MOBILE_AP_FUNC_EXIT__;
177         return NULL;
178 }
179
180 static char *__gl_security_label_get(void *data, Evas_Object *obj, const char *part)
181 {
182         __MOBILE_AP_FUNC_ENTER__;
183
184         if (data == NULL || obj == NULL || part == NULL) {
185                 ERR("Invalid param\n");
186                 return NULL;
187         }
188
189         if (!strcmp("elm.text", part)) {
190                 return strdup(STR_SECURITY_TYPE);
191         }
192
193         __MOBILE_AP_FUNC_EXIT__;
194         return NULL;
195 }
196
197 static Evas_Object *__gl_hide_icon_get(void *data, Evas_Object *obj,
198                 const char *part)
199 {
200         __MOBILE_AP_FUNC_ENTER__;
201
202         mh_appdata_t *ad = (mh_appdata_t *)data;
203         Evas_Object *btn = NULL;
204
205         if (data == NULL || obj == NULL || part == NULL) {
206                 ERR("Invalid param\n");
207                 return NULL;
208         }
209
210         if (!strcmp("elm.swallow.end", part)) {
211                 btn = elm_check_add(obj);
212                 if (btn == NULL) {
213                         ERR("btn is NULL\n");
214                         return NULL;
215                 }
216
217                 elm_object_style_set(btn, "on&off");
218                 evas_object_show(btn);
219                 evas_object_pass_events_set(btn, EINA_TRUE);
220                 evas_object_propagate_events_set(btn, EINA_FALSE);
221                 elm_object_focus_allow_set(btn, EINA_FALSE);
222                 elm_check_state_set(btn, ad->setup.visibility_new ? EINA_FALSE : EINA_TRUE);
223                 evas_object_smart_callback_add(btn, "changed",
224                                 __hide_btn_changed_cb, (void *)ad);
225                 ad->setup.hide_btn = btn;
226         }
227
228         __MOBILE_AP_FUNC_EXIT__;
229         return btn;
230 }
231
232 static Evas_Object *__gl_security_icon_get(void *data, Evas_Object *obj,
233                 const char *part)
234 {
235         __MOBILE_AP_FUNC_ENTER__;
236
237         mh_appdata_t *ad = (mh_appdata_t *)data;
238         Evas_Object *btn = NULL;
239
240         if (data == NULL || obj == NULL || part == NULL) {
241                 ERR("Invalid param\n");
242                 return NULL;
243         }
244
245         if (!strcmp("elm.swallow.end", part)) {
246                 btn = elm_check_add(obj);
247                 elm_object_style_set(btn, "on&off");
248                 evas_object_show(btn);
249                 evas_object_pass_events_set(btn, EINA_TRUE);
250                 evas_object_propagate_events_set(btn, EINA_FALSE);
251                 elm_check_state_set(btn, ad->setup.security_type_new ==
252                                 TETHERING_WIFI_SECURITY_TYPE_NONE ?
253                                 EINA_FALSE : EINA_TRUE);
254                 evas_object_smart_callback_add(btn, "changed",
255                                 __security_btn_changed_cb, (void *)ad);
256                 ad->setup.security_btn = btn;
257         }
258
259         __MOBILE_AP_FUNC_EXIT__;
260         return btn;
261 }
262
263 static bool __save_wifi_passphrase(mh_appdata_t *ad)
264 {
265         __MOBILE_AP_FUNC_ENTER__;
266
267         if (ad == NULL) {
268                 ERR("Invalid param\n");
269                 return false;
270         }
271
272         mh_wifi_setting_view_t *st = &ad->setup;
273         int ret = 0;
274
275         ret = tethering_wifi_set_passphrase(ad->handle, st->wifi_passphrase_new);
276         if (ret != TETHERING_ERROR_NONE) {
277                 ERR("tethering_wifi_set_passphrase is failed : %d\n", ret);
278                 return false;
279         }
280
281         __MOBILE_AP_FUNC_EXIT__;
282         return true;
283 }
284
285 static void __pw_entry_changed_cb(void *data, Evas_Object *obj,
286                                 void *event_info)
287 {
288         __MOBILE_AP_FUNC_ENTER__;
289
290         mh_appdata_t *ad = (mh_appdata_t *)data;
291         mh_wifi_setting_view_t *st = &ad->setup;
292         const char *changed_text;
293         char *utf8_string;
294         int len = 0;
295
296         changed_text = elm_entry_entry_get(obj);
297         if (changed_text == NULL) {
298                 ERR("elm_entry_entry_get is failed\n");
299                 return;
300         }
301
302         utf8_string = elm_entry_markup_to_utf8(changed_text);
303
304         if (utf8_string == NULL) {
305                 ERR("elm_entry_markup_to_utf8() Failed!!!\n");
306         } else {
307                 len = strlen(utf8_string);
308                 if (WIFI_PASSPHRASE_LENGTH_MIN <= len) {
309                         elm_object_disabled_set(st->save_button, EINA_FALSE);
310                         elm_entry_input_panel_return_key_disabled_set(obj, FALSE);
311                 } else {
312                         elm_object_disabled_set(st->save_button, EINA_TRUE);
313                         elm_entry_input_panel_return_key_disabled_set(obj, TRUE);
314                 }
315                 g_strlcpy(st->wifi_passphrase_new, utf8_string,
316                                                 sizeof(st->wifi_passphrase_new));
317                 free(utf8_string);
318                 utf8_string = NULL;
319         }
320
321         if (elm_object_part_content_get(obj, "elm.swallow.clear")) {
322                 if (elm_object_focus_get(obj)) {
323                         if (elm_entry_is_empty(obj))
324                                 elm_object_signal_emit(obj, "elm,state,clear,hidden", "");
325                         else
326                                 elm_object_signal_emit(obj, "elm,state,clear,visible", "");
327                 }
328         }
329
330         __MOBILE_AP_FUNC_EXIT__;
331         return;
332 }
333
334 static void __pw_entry_maxlength_reached_cb(void *data, Evas_Object *obj,
335                 void *event_info)
336 {
337         __MOBILE_AP_FUNC_ENTER__;
338
339         if (obj == NULL) {
340                 ERR("The param is NULL\n");
341                 __MOBILE_AP_FUNC_EXIT__;
342                 return;
343         }
344         char buf[MH_LABEL_LENGTH_MAX] = { 0, };
345         char *fmt = STR_PASSWORD_MIN_MAX;
346         notification_error_e ret;
347
348         snprintf(buf, sizeof(buf), fmt,
349                         WIFI_PASSPHRASE_LENGTH_MIN, WIFI_PASSPHRASE_LENGTH_MAX);
350
351         ret = notification_status_message_post(buf);
352         if (ret != NOTIFICATION_ERROR_NONE) {
353                 ERR("notification_status_message_post() is failed : %d\n", ret);
354         }
355
356         __MOBILE_AP_FUNC_EXIT__;
357 }
358
359 static void __pw_entry_activated_cb(void *data, Evas_Object *obj, void *event_info)
360 {
361         __MOBILE_AP_FUNC_ENTER__;
362
363         if (obj == NULL) {
364                 ERR("Invalid parameter");
365                 return;
366         }
367
368         elm_object_focus_set(obj, EINA_FALSE);
369         __MOBILE_AP_FUNC_EXIT__;
370         return;
371 }
372
373 static void __pw_entry_focused_cb(void *data, Evas_Object *obj, void *event_info)
374 {
375         __MOBILE_AP_FUNC_ENTER__;
376         evas_object_smart_callback_del(obj, "focused", __pw_entry_focused_cb);
377
378          elm_object_focus_set(obj, EINA_TRUE);
379          elm_entry_cursor_end_set(obj);
380          __MOBILE_AP_FUNC_EXIT__;
381 }
382
383 static void __pw_entry_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
384 {
385         __MOBILE_AP_FUNC_ENTER__;
386         if (elm_object_part_content_get(obj, "elm.swallow.clear"))
387                 elm_object_signal_emit(obj, "elm,state,clear,hidden", "");
388         elm_object_signal_emit(obj, "elm,state,focus,off", "");
389         __MOBILE_AP_FUNC_EXIT__;
390 }
391
392 static void __pw_entry_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
393 {
394         __MOBILE_AP_FUNC_ENTER__;
395          evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, __pw_entry_show_cb);
396
397          elm_object_focus_set(obj, EINA_TRUE);
398          elm_entry_cursor_end_set(obj);
399          __MOBILE_AP_FUNC_EXIT__;
400 }
401
402 static void __eraser_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
403 {
404         __MOBILE_AP_FUNC_ENTER__;
405
406         elm_object_text_set(data, "");
407         elm_entry_input_panel_return_key_disabled_set(data, TRUE);
408
409         __MOBILE_AP_FUNC_EXIT__;
410 }
411
412 static void __pw_entry_language_changed_cb(void *data, Evas_Object *obj, void *event_info)
413 {
414         __MOBILE_AP_FUNC_ENTER__;
415
416         if (obj == NULL || data == NULL) {
417                 ERR("NULL param\n");
418                 return;
419         }
420         mh_appdata_t *ad = (mh_appdata_t *)data;
421         mh_wifi_setting_view_t *st = &ad->setup;
422         char buf[MH_LABEL_LENGTH_MAX];
423         char *fmt = STR_PW_GUIDE_TEXT;
424
425         snprintf(buf, sizeof(buf), fmt, WIFI_PASSPHRASE_LENGTH_MIN);
426
427         if (st->security_type_new == TETHERING_WIFI_SECURITY_TYPE_NONE) {
428                 if (st->pw_item)
429                         elm_genlist_item_update(st->pw_item);
430         } else {
431                 elm_object_part_text_set(obj, "elm.guide", buf);
432         }
433         __MOBILE_AP_FUNC_EXIT__;
434 }
435
436 static Evas_Object *__get_pw_entry(void *data, Evas_Object *parent)
437 {
438         __MOBILE_AP_FUNC_ENTER__;
439
440         static Elm_Entry_Filter_Limit_Size limit_filter_data;
441         Evas_Object *entry = NULL;
442         char *fmt = STR_PW_GUIDE_TEXT;
443         char *ptr = NULL;
444         Evas_Object * clr_btn = NULL;
445         char buf[MH_LABEL_LENGTH_MAX];
446
447         if (parent == NULL || data == NULL) {
448                 ERR("null param \n");
449                 return NULL;
450         }
451
452         mh_appdata_t *ad = (mh_appdata_t *)data;
453         mh_wifi_setting_view_t *st = &ad->setup;
454
455         entry = elm_entry_add(parent);
456
457         if (entry == NULL) {
458                 ERR("elm_entry_add returns NULL\n");
459                 st->pw_entry = NULL;
460                 return NULL;
461         }
462
463         elm_entry_single_line_set(entry, EINA_TRUE);
464         elm_entry_scrollable_set(entry, EINA_TRUE);
465         elm_entry_password_set(entry, EINA_FALSE);
466
467         evas_object_smart_callback_add(entry, "language,changed",
468                         __pw_entry_language_changed_cb, ad);
469
470         eext_entry_selection_back_event_allow_set(entry, EINA_TRUE);
471         elm_entry_prediction_allow_set(entry, EINA_FALSE);
472         elm_object_signal_emit(entry, "elm,action,hide,search_icon", "");
473         elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_PASSWORD);
474         snprintf(buf, sizeof(buf), fmt, WIFI_PASSPHRASE_LENGTH_MIN);
475         elm_object_part_text_set(entry, "guide", buf);
476         elm_entry_cnp_mode_set(entry, ELM_CNP_MODE_PLAINTEXT);
477
478         limit_filter_data.max_char_count = 0;
479         limit_filter_data.max_byte_count = WIFI_PASSPHRASE_LENGTH_MAX;
480         elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, &limit_filter_data);
481
482         if (st->security_type_new == TETHERING_WIFI_SECURITY_TYPE_NONE) {
483                 elm_object_part_text_set(entry, "default", buf);
484                 elm_entry_input_panel_enabled_set(entry, EINA_FALSE);
485                 elm_object_disabled_set(entry, EINA_TRUE);
486                 if (st->pw_item)
487                         elm_object_item_signal_emit(st->pw_item, "elm,state,rename,hide", "");
488                 return entry;
489         } else {
490                 elm_object_disabled_set(entry, EINA_FALSE);
491                 elm_entry_input_panel_enabled_set(entry, EINA_TRUE);
492                 ptr = elm_entry_utf8_to_markup(st->wifi_passphrase_new);
493                 if (ptr != NULL) {
494                         elm_object_text_set(entry, ptr);
495                         free(ptr);
496                 } else {
497                         ERR("elm_entry_utf8_to_markup is failed\n");
498                 }
499         }
500
501         elm_entry_input_panel_return_key_type_set(entry,
502                         ELM_INPUT_PANEL_RETURN_KEY_TYPE_DONE);
503
504         clr_btn = elm_button_add(entry);
505         elm_object_style_set(clr_btn, "search_clear");
506         elm_object_focus_allow_set(clr_btn, EINA_FALSE);
507         elm_object_part_content_set(entry, "elm.swallow.clear", clr_btn);
508         evas_object_smart_callback_add(clr_btn, "clicked", __eraser_btn_clicked_cb, entry);
509         evas_object_show(clr_btn);
510
511         evas_object_smart_callback_add(entry, "changed",
512                         __pw_entry_changed_cb, ad);
513         evas_object_smart_callback_add(entry, "maxlength,reached",
514                         __pw_entry_maxlength_reached_cb, ad);
515         evas_object_smart_callback_add(entry, "activated",
516                         __pw_entry_activated_cb, NULL);
517         evas_object_smart_callback_add(entry, "focused",
518                         __pw_entry_focused_cb, NULL);
519         evas_object_smart_callback_add(entry, "unfocused",
520                         __pw_entry_unfocused_cb, NULL);
521         evas_object_event_callback_add(entry, EVAS_CALLBACK_SHOW,
522                         __pw_entry_show_cb, NULL);
523
524         elm_object_focus_set(entry, EINA_TRUE);
525         elm_entry_input_panel_show(entry);
526         elm_object_part_content_set(parent, "elm.swallow.content", entry);
527
528         st->pw_entry = entry;
529
530         __MOBILE_AP_FUNC_EXIT__;
531         return st->pw_entry;
532 }
533
534 static Evas_Object *__gl_pw_content_get(void *data, Evas_Object *obj, const char *part)
535 {
536         __MOBILE_AP_FUNC_ENTER__;
537
538         int w = 720;
539         int h = 60;
540
541         if (data == NULL) {
542                 ERR("data is null \n");
543                 return NULL;
544         }
545
546         if (!strcmp(part, "elm.swallow.content")) {
547                 Evas_Object *box = elm_box_add(obj);
548                 Evas_Object *ibox = elm_box_add(box);
549                 Evas_Object *tpadding = evas_object_rectangle_add(box);
550                 Evas_Object *lpadding = evas_object_rectangle_add(ibox);
551                 Evas_Object *label = elm_label_add(ibox);
552                 Evas_Object *layout = elm_layout_add(box);
553                 char buf[MH_LABEL_LENGTH_MAX] = {0, };
554
555                 elm_box_align_set(box, 0.0, 0.0);
556
557                 /* Set rectangle for top padding */
558                 evas_object_size_hint_min_set(tpadding, 0, ELM_SCALE_SIZE(10));
559                 evas_object_size_hint_padding_set(tpadding, ELM_SCALE_SIZE(10), ELM_SCALE_SIZE(10), ELM_SCALE_SIZE(10), ELM_SCALE_SIZE(10));
560                 evas_object_color_set(tpadding, 255, 255, 255, 0);
561                 evas_object_show(tpadding);
562                 elm_box_pack_end(box, tpadding);
563
564                 /* Set internal box */
565                 evas_object_size_hint_align_set(ibox, 0.0, 0.0);
566                 evas_object_size_hint_padding_set(ibox, ELM_SCALE_SIZE(10), ELM_SCALE_SIZE(10), ELM_SCALE_SIZE(20), 0);
567                 elm_box_horizontal_set(ibox, EINA_TRUE);
568                 elm_box_pack_end(box, ibox);
569
570                 /* Set rectangle for left padding */
571                 evas_object_size_hint_min_set(lpadding, ELM_SCALE_SIZE(15), ELM_SCALE_SIZE(10));
572                 evas_object_size_hint_padding_set(lpadding, ELM_SCALE_SIZE(10), ELM_SCALE_SIZE(10), ELM_SCALE_SIZE(10), ELM_SCALE_SIZE(10));
573                 evas_object_color_set(lpadding, 255, 255, 255, 0);
574                 evas_object_show(lpadding);
575                 elm_box_pack_end(ibox, lpadding);
576                 evas_object_show(ibox);
577
578                 /* Set label for name field */
579                 snprintf(buf, MH_LABEL_LENGTH_MAX, "<text align=left><font_size=30>%s</font_size></text>", STR_PASSWORD);
580                 elm_object_text_set(label, buf);
581                 evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
582                 evas_object_size_hint_weight_set(label, 0.9, EVAS_HINT_EXPAND);
583                 evas_object_size_hint_padding_set(label, ELM_SCALE_SIZE(10), ELM_SCALE_SIZE(10), 0, 0);
584                 elm_box_pack_end(ibox, label);
585                 evas_object_show(label);
586
587                 /* Set layout for entry field */
588                 elm_layout_theme_set(layout, "layout", "editfield", "singleline");
589                 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
590                 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
591
592                 __get_pw_entry(data, layout);
593                 evas_object_show(layout);
594                 elm_box_pack_end(box, layout);
595
596                 evas_object_size_hint_min_set(box, ELM_SCALE_SIZE(w), ELM_SCALE_SIZE(h));
597                 evas_object_show(box);
598
599         return box;
600         }
601
602         __MOBILE_AP_FUNC_EXIT__;
603         return NULL;
604 }
605
606 static void __gl_hide_item_sel(void *data, Evas_Object *obj, void *event_info)
607 {
608         __MOBILE_AP_FUNC_ENTER__;
609
610         if (data == NULL || obj == NULL || event_info == NULL) {
611                 ERR("param is NULL\n");
612                 return;
613         }
614
615         mh_appdata_t *ad = (mh_appdata_t *)data;
616
617         elm_genlist_item_selected_set((Elm_Object_Item*)event_info, EINA_FALSE);
618         __hide_btn_changed_cb(ad, obj, NULL);
619
620         elm_check_state_set(ad->setup.hide_btn, ad->setup.visibility_new ?
621                         EINA_FALSE : EINA_TRUE);
622
623         __MOBILE_AP_FUNC_EXIT__;
624 }
625
626 static void __gl_security_item_sel(void *data, Evas_Object *obj, void *event_info)
627 {
628         __MOBILE_AP_FUNC_ENTER__;
629
630         if (data == NULL || obj == NULL || event_info == NULL) {
631                 ERR("param is NULL\n");
632                 return;
633         }
634
635         mh_appdata_t *ad = (mh_appdata_t *)data;
636
637         elm_genlist_item_selected_set((Elm_Object_Item*)event_info, EINA_FALSE);
638         __security_btn_changed_cb(data, obj, NULL);
639         elm_check_state_set(ad->setup.security_btn, ad->setup.security_type_new ==
640                         TETHERING_WIFI_SECURITY_TYPE_NONE ? EINA_FALSE : EINA_TRUE);
641
642         __MOBILE_AP_FUNC_EXIT__;
643 }
644
645 static void __set_genlist_itc(mh_appdata_t *ad)
646 {
647         __MOBILE_AP_FUNC_ENTER__;
648
649 #if 0 /* not used */
650         ad->setup.sp_itc = elm_genlist_item_class_new();
651         if (ad->setup.sp_itc == NULL) {
652                 ERR("elm_genlist_item_class_new failed\n");
653                 __MOBILE_AP_FUNC_EXIT__;
654                 return;
655         }
656         ad->setup.sp_itc->item_style = "dialogue/separator";
657         ad->setup.sp_itc->func.text_get = NULL;
658         ad->setup.sp_itc->func.content_get = NULL;
659         ad->setup.sp_itc->func.state_get = NULL;
660         ad->setup.sp_itc->func.del = NULL;
661 #endif
662         ad->setup.name_itc = elm_genlist_item_class_new();
663         if (ad->setup.name_itc == NULL) {
664                 ERR("elm_genlist_item_class_new failed\n");
665                 __MOBILE_AP_FUNC_EXIT__;
666                 return;
667         }
668         ad->setup.name_itc->item_style = MH_GENLIST_MULTILINE_TEXT_STYLE;
669         ad->setup.name_itc->func.text_get = __gl_device_name_title_label_get;
670         ad->setup.name_itc->func.content_get = NULL;
671         ad->setup.name_itc->func.state_get = NULL;
672         ad->setup.name_itc->func.del = NULL;
673
674         ad->setup.hide_itc = elm_genlist_item_class_new();
675         if (ad->setup.hide_itc == NULL) {
676                 ERR("elm_genlist_item_class_new failed\n");
677                 __MOBILE_AP_FUNC_EXIT__;
678                 return;
679         }
680         ad->setup.hide_itc->item_style = MH_GENLIST_1LINE_TEXT_ICON_STYLE;
681         ad->setup.hide_itc->func.text_get = __gl_hide_label_get;
682         ad->setup.hide_itc->func.content_get = __gl_hide_icon_get;
683         ad->setup.hide_itc->func.state_get = NULL;
684         ad->setup.hide_itc->func.del = NULL;
685
686         ad->setup.security_itc = elm_genlist_item_class_new();
687         if (ad->setup.security_itc == NULL) {
688                 ERR("elm_genlist_item_class_new failed\n");
689                 __MOBILE_AP_FUNC_EXIT__;
690                 return;
691         }
692         ad->setup.security_itc->item_style = MH_GENLIST_1LINE_TEXT_ICON_STYLE;
693         ad->setup.security_itc->func.text_get = __gl_security_label_get;
694         ad->setup.security_itc->func.content_get = __gl_security_icon_get;
695         ad->setup.security_itc->func.state_get = NULL;
696         ad->setup.security_itc->func.del = NULL;
697
698         ad->setup.pw_itc = elm_genlist_item_class_new();
699         if (ad->setup.pw_itc == NULL) {
700                 ERR("elm_genlist_item_class_new failed\n");
701                 __MOBILE_AP_FUNC_EXIT__;
702                 return;
703         }
704         ad->setup.pw_itc->item_style = MH_GENLIST_FULL_CONTENT_STYLE;
705         ad->setup.pw_itc->func.text_get = NULL;
706         ad->setup.pw_itc->func.content_get = __gl_pw_content_get;
707         ad->setup.pw_itc->func.state_get = NULL;
708         ad->setup.pw_itc->func.del = NULL;
709
710 #if 0 /* not used */
711         ad->setup.sp2_itc = elm_genlist_item_class_new();
712         if (ad->setup.sp2_itc == NULL) {
713                 ERR("elm_genlist_item_class_new failed\n");
714                 __MOBILE_AP_FUNC_EXIT__;
715                 return;
716         }
717         ad->setup.sp2_itc->item_style = "dialogue/separator.2";
718         ad->setup.sp2_itc->func.text_get = NULL;
719         ad->setup.sp2_itc->func.content_get = NULL;
720         ad->setup.sp2_itc->func.state_get = NULL;
721         ad->setup.sp2_itc->func.del = NULL;
722 #endif
723         __MOBILE_AP_FUNC_EXIT__;
724         return;
725 }
726
727 static void __deconstruct_wifi_setup_view(mh_wifi_setting_view_t *st)
728 {
729         __MOBILE_AP_FUNC_ENTER__;
730
731         if (st == NULL) {
732                 ERR("st is NULL\n");
733                 return;
734         }
735
736         evas_object_smart_callback_del(st->hide_btn, "changed",
737                         __hide_btn_changed_cb);
738         evas_object_smart_callback_del(st->security_btn, "changed",
739                         __security_btn_changed_cb);
740         evas_object_smart_callback_del(st->cancel_button, "clicked",
741                         __cancel_btn_cb);
742         evas_object_smart_callback_del(st->save_button, "clicked",
743                         __save_btn_cb);
744         evas_object_smart_callback_del(st->genlist, "realized",
745                         __gl_realized);
746
747         __MOBILE_AP_FUNC_EXIT__;
748 }
749
750 static void __settings_reloaded_cb(tethering_error_e result, void *user_data)
751 {
752         if (user_data == NULL) {
753                 ERR("Invalid parameter\n");
754                 return;
755         }
756
757         __MOBILE_AP_FUNC_ENTER__;
758
759         mh_appdata_t *ad = (mh_appdata_t *)user_data;
760
761         if (result != TETHERING_ERROR_NONE)
762                 ERR("tethering_wifi_reload_settings is failed [0x%X]\n", result);
763         _update_wifi_item(ad, MH_STATE_NONE);
764
765         __MOBILE_AP_FUNC_EXIT__;
766
767         return;
768 }
769
770 static void __save_btn_cb(void *data, Evas_Object *object, void *event_info)
771 {
772         DBG("+\n");
773         if (data == NULL) {
774                 ERR("data is NULL\n");
775                 return;
776         }
777
778         mh_appdata_t *ad = (mh_appdata_t *)data;
779         mh_wifi_setting_view_t *st = &ad->setup;
780         bool ret = false;
781         bool is_setting_changed = false;
782
783         /* handle hide button change */
784         if (st->visibility != st->visibility_new) {
785                 ret = __save_hide_btn_change(ad);
786                 if (ret == false) {
787                         elm_check_state_set(st->hide_btn, st->visibility ?
788                                         EINA_FALSE : EINA_TRUE);
789                 } else {
790                         st->visibility = st->visibility_new;
791                         is_setting_changed = true;
792                 }
793         }
794         /* handle security button change */
795         if (st->security_type != st->security_type_new) {
796                 ret = __save_security_btn_change(ad);
797                 if (ret == false) {
798                         elm_check_state_set(st->security_btn, st->security_type ==
799                                         TETHERING_WIFI_SECURITY_TYPE_NONE ? EINA_FALSE : EINA_TRUE);
800                 } else {
801                                 st->security_type = st->security_type_new;
802                                 is_setting_changed = true;
803                 }
804         }
805
806         /* handle wifi passphrase change */
807         if (strcmp(st->wifi_passphrase, st->wifi_passphrase_new)) {
808                 ret = __save_wifi_passphrase(ad);
809                 if (ret == false) {
810                         g_strlcpy(st->wifi_passphrase_new, st->wifi_passphrase,
811                                         sizeof(st->wifi_passphrase_new));
812                         if(st->pw_item)
813                                 elm_genlist_item_update(st->pw_item);
814                 } else {
815                         g_strlcpy(st->wifi_passphrase, st->wifi_passphrase_new,
816                                         sizeof(st->wifi_passphrase));
817                         is_setting_changed = true;
818                         if (ad->main.help_item) {
819                                 if (ad->main.help_item)
820                                         elm_genlist_item_update(ad->main.help_item);
821                         }
822                 }
823         }
824
825         if (is_setting_changed) {
826                 _update_wifi_item(ad, MH_STATE_PROCESS);
827
828                 if (ad->main.help_item)
829                         elm_genlist_item_update(ad->main.help_item);
830
831                 /* reload wifi settings */
832                 ret = tethering_wifi_reload_settings(ad->handle, __settings_reloaded_cb,
833                                 (void *)ad);
834                 if (ret != TETHERING_ERROR_NONE)
835                         ERR("reload_configuration is failed : %d\n", ret);
836         }
837
838         elm_naviframe_item_pop(ad->naviframe);
839
840         DBG("-\n");
841         return;
842 }
843
844 static void __cancel_btn_cb(void *data, Evas_Object *object, void *event_info)
845 {
846         DBG("+\n");
847
848         if (data == NULL) {
849                 ERR("The param is NULL\n");
850                 return;
851         }
852
853         mh_appdata_t *ad = (mh_appdata_t *)data;
854
855         elm_naviframe_item_pop(ad->naviframe);
856         DBG("-\n");
857         return;
858 }
859
860 Eina_Bool _setting_back_btn_cb(void *data, Elm_Object_Item *navi_item)
861 {
862         DBG("+\n");
863
864         if (data == NULL) {
865                 ERR("The param is NULL\n");
866                 return EINA_FALSE;
867         }
868
869         mh_appdata_t *ad = (mh_appdata_t *)data;
870         mh_wifi_setting_view_t *st = &ad->setup;
871
872         if (st->visibility != st->visibility_new) {
873                 st->visibility_new = st->visibility;
874         }
875
876         if (st->security_type != st->security_type_new) {
877                 st->security_type_new = st->security_type;
878         }
879
880         if (strcmp(st->wifi_passphrase_new, st->wifi_passphrase)) {
881                 g_strlcpy(st->wifi_passphrase_new, st->wifi_passphrase,
882                                         sizeof(st->wifi_passphrase_new));
883         }
884         st->pw_entry = NULL;
885         __deconstruct_wifi_setup_view(st);
886
887         if (ad->rename_popup != NULL) {
888                 evas_object_del(ad->rename_popup);
889                 ad->rename_popup = NULL;
890         }
891         ad->setup.navi_it = NULL;
892
893         DBG("-\n");
894         return EINA_TRUE;
895 }
896
897 static void __gl_realized(void *data, Evas_Object *obj, void *event_info)
898 {
899         __MOBILE_AP_FUNC_ENTER__;
900
901         mh_appdata_t *ad = (mh_appdata_t *)data;
902         mh_wifi_setting_view_t *st = &(ad->setup);
903         Elm_Object_Item *item = (Elm_Object_Item *)event_info;
904         Evas_Object *ao;
905         Evas_Object *btn;
906         char str[MH_LABEL_LENGTH_MAX] = {0, };
907         int no_of_sp;
908         int i;
909
910         if (item == st->hide_item) {
911                 elm_object_item_signal_emit(item, "elm,state,top", "");
912         } else if (item == st->security_item) {
913                 elm_object_item_signal_emit(item, "elm,state,center", "");
914         } else if (item == st->pw_item) {
915                 elm_object_item_signal_emit(item, "elm,state,bottom", "");
916         } else if (item == st->name_item) {
917         }
918
919         no_of_sp = sizeof(st->sp_item) / sizeof(st->sp_item[0]);
920         for (i = 0; i < no_of_sp; i++) {
921                 if (item == st->sp_item[i])
922                         elm_object_item_access_unregister(item);
923         }
924
925         if (item == st->hide_item || item == st->security_item) {
926                 ao = elm_object_item_access_object_get(item);
927                 btn = elm_object_item_part_content_get(item, "on&off");
928                 snprintf(str, sizeof(str), "%s, %s", "On/off button",
929                                 (elm_check_state_get(btn) ? "On" : "Off"));
930                 elm_access_info_set(ao, ELM_ACCESS_CONTEXT_INFO, str);
931         }
932
933         if (item == st->pw_item) {
934                 elm_object_item_access_unregister(item);
935                 ao = elm_object_item_access_register(item);
936                 snprintf(str, sizeof(str), "%s, %s", STR_PASSWORD, st->wifi_passphrase_new);
937                 elm_access_info_set(ao, ELM_ACCESS_CONTEXT_INFO, str);
938         }
939
940         __MOBILE_AP_FUNC_EXIT__;
941
942         return;
943 }
944
945 static void __select_passphrase_item(void *data, Evas_Object *obj, void *event_info)
946 {
947         __MOBILE_AP_FUNC_ENTER__;
948
949         if (data == NULL) {
950                 ERR("The param is NULL\n");
951                 return;
952         }
953
954         mh_appdata_t *ad = (mh_appdata_t *)data;
955         mh_wifi_setting_view_t *st = &ad->setup;
956
957         elm_object_focus_set(st->pw_entry, EINA_TRUE);
958
959         __MOBILE_AP_FUNC_EXIT__;
960         return;
961 }
962
963 Evas_Object *__create_genlist(mh_appdata_t *ad)
964 {
965         __MOBILE_AP_FUNC_ENTER__;
966
967         if (ad == NULL) {
968                 ERR("ad is NULL\n");
969                 return NULL;
970         }
971
972         void *data = (void *)ad;
973         mh_wifi_setting_view_t *st = &ad->setup;
974         Evas_Object *genlist;
975
976         genlist = elm_genlist_add(ad->naviframe);
977         if (genlist == NULL) {
978                 ERR("genlist is NULL\n");
979                 return NULL;
980         }
981
982         elm_object_style_set(genlist, "dialogue");
983         elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
984         evas_object_smart_callback_add(genlist, "realized", __gl_realized, ad);
985         //elm_genlist_realization_mode_set(genlist, EINA_TRUE);
986
987         __set_genlist_itc(ad);
988
989         st->name_item = elm_genlist_item_append(genlist, st->name_itc, data, NULL,
990                         ELM_GENLIST_ITEM_NONE, NULL, NULL);
991         elm_genlist_item_select_mode_set(st->name_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
992
993         if (st->name_item)
994                 elm_object_item_disabled_set(st->name_item, EINA_TRUE);
995
996         st->hide_item = elm_genlist_item_append(genlist, st->hide_itc, data, NULL,
997                         ELM_GENLIST_ITEM_NONE, __gl_hide_item_sel, data);
998
999         st->security_item = elm_genlist_item_append(genlist, st->security_itc, data, NULL,
1000                         ELM_GENLIST_ITEM_NONE, __gl_security_item_sel, data);
1001
1002         st->pw_item = elm_genlist_item_append(genlist, st->pw_itc, data, NULL,
1003                         ELM_GENLIST_ITEM_NONE, __select_passphrase_item, ad);
1004         if (st->security_type == TETHERING_WIFI_SECURITY_TYPE_NONE)
1005                 elm_object_item_disabled_set(st->pw_item, EINA_TRUE);
1006         else
1007                 elm_object_item_disabled_set(st->pw_item, EINA_FALSE);
1008
1009 /* End separator is removed because of P131104-03336. It is confirmed by UX team for this case.
1010         item = elm_genlist_item_append(genlist, st->sp_itc, NULL, NULL,
1011                         ELM_GENLIST_ITEM_NONE, NULL, NULL);
1012         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1013         st->sp_item[i++] = item;
1014 */
1015
1016         __MOBILE_AP_FUNC_EXIT__;
1017
1018         return genlist;
1019 }
1020
1021 void mh_draw_wifi_setup_view(mh_appdata_t *ad)
1022 {
1023         DBG("+\n");
1024
1025         if (ad == NULL) {
1026                 ERR("ad is NULL\n");
1027                 DBG("-\n");
1028                 return;
1029         }
1030         Evas_Object *btn;
1031         mh_wifi_setting_view_t *st = &ad->setup;
1032
1033         if (ad->setup.navi_it != NULL) {
1034                 ERR("Wi-Fi setup view already exists\n");
1035                 DBG("-\n");
1036                 return;
1037         }
1038
1039         st->genlist = __create_genlist(ad);
1040         if (st->genlist == NULL) {
1041                 ERR("__create_genlist returns NULL\n");
1042                 DBG("-\n");
1043                 return;
1044         }
1045
1046         st->navi_it = elm_naviframe_item_push(ad->naviframe, "IDS_MOBILEAP_MBODY_WI_FI_TETHERING",
1047                         NULL, NULL, st->genlist, NULL);
1048         elm_object_item_domain_text_translatable_set(st->navi_it, PKGNAME, EINA_TRUE);
1049
1050         elm_naviframe_item_pop_cb_set(st->navi_it, _setting_back_btn_cb, (void *)ad);
1051
1052         btn = elm_button_add(ad->naviframe);
1053         elm_object_style_set(btn, "naviframe/title_cancel");
1054         evas_object_smart_callback_add(btn, "clicked", __cancel_btn_cb, ad);
1055         elm_object_item_part_content_set(st->navi_it, "title_left_btn", btn);
1056         st->cancel_button = btn;
1057
1058         btn = elm_button_add(ad->naviframe);
1059         elm_object_style_set(btn, "naviframe/title_done");
1060         evas_object_smart_callback_add(btn, "clicked", __save_btn_cb, ad);
1061         elm_object_item_part_content_set(st->navi_it, "title_right_btn", btn);
1062         st->save_button = btn;
1063         DBG("-\n");
1064 }