4 * Copyright 2012 Samsung Electronics Co., Ltd
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
10 * http://www.tizenopensource.org/license
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.
19 #include <efl_extension.h>
22 #include "view_detail.h"
23 #include "i18nmanager.h"
24 #include "viewer_manager.h"
25 #include "viewer_list.h"
26 #include "winset_popup.h"
27 #include "common_utils.h"
28 #include "common_ip_info.h"
29 #include "common_eap_connect.h"
31 typedef struct _view_detail_data {
36 eap_info_list_t *eap_info_list;
37 full_ip_info_t *ip_info;
38 Evas_Object *forget_confirm_popup;
39 Evas_Object *view_detail_list;
41 Evas_Object *ctxpopup;
44 static int view_detail_end = TRUE;
45 extern wifi_appdata *ug_app_state;
46 static view_detail_data *_detail_data = NULL;
47 static Eina_Bool rotate_flag = EINA_FALSE;
48 static int pos_changed = 0;
50 static Eina_Bool detailview_sk_cb(void *data, Elm_Object_Item *it);
51 static void forget_sk_cb(void *data, Evas_Object *obj, void *event_info);
52 static void _transition_finished_sub_cb(void *data, Evas_Object *obj, void *event_info);
53 static void _create_ctxpopup_forget_btn_cb(void *data, Evas_Object *obj, void *event_info);
54 static void _ctxpopup_del_cb(void *data, Evas_Object *obj, void *event_info);
55 static void _ctxpopup_move(Evas_Object *parent);
56 static void _ctxpopup_dismissed_cb(void *data, Evas_Object *obj, void *event_info);
57 static void _ctxpopup_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
58 static void _ctxpopup_rotate_cb(void *data, Evas_Object *obj, void *event_info);
59 static void _ctxpopup_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
61 static void _create_ctxpopup_forget_btn_cb(void *data, Evas_Object *obj, void *event_info)
63 struct ug_data *ugd = NULL;
64 Evas_Object *parent = NULL;
65 Elm_Object_Item *item = NULL;
67 ugd = (struct ug_data *)ug_app_state->gadget;
70 parent = ugd->win_main;
71 if (!parent || !_detail_data) {
75 if (_detail_data->ctxpopup) {
76 evas_object_del(_detail_data->ctxpopup);
79 _detail_data->ctxpopup = elm_ctxpopup_add(parent);
81 elm_ctxpopup_auto_hide_disabled_set(_detail_data->ctxpopup, EINA_TRUE);
82 elm_object_style_set(_detail_data->ctxpopup, "more/default");
83 eext_object_event_callback_add(_detail_data->ctxpopup, EEXT_CALLBACK_BACK,
84 _ctxpopup_del_cb, NULL);
85 eext_object_event_callback_add(_detail_data->ctxpopup, EEXT_CALLBACK_MORE,
86 _ctxpopup_del_cb, NULL);
87 evas_object_smart_callback_add(_detail_data->ctxpopup, "dismissed",
88 _ctxpopup_dismissed_cb, NULL);
89 evas_object_event_callback_add(_detail_data->ctxpopup, EVAS_CALLBACK_DEL,
90 _ctxpopup_delete_cb, parent);
91 evas_object_event_callback_add(parent, EVAS_CALLBACK_RESIZE,
92 _ctxpopup_resize_cb, _detail_data->ctxpopup);
94 evas_object_smart_callback_add(elm_object_top_widget_get(_detail_data->ctxpopup),
95 "rotation,changed", _ctxpopup_rotate_cb, _detail_data->ctxpopup);
97 item = elm_ctxpopup_item_append(_detail_data->ctxpopup,
98 "IDS_WIFI_SK_FORGET", NULL, forget_sk_cb, _detail_data);
99 elm_object_item_domain_text_translatable_set(item, PACKAGE, EINA_TRUE);
101 elm_ctxpopup_direction_priority_set(_detail_data->ctxpopup,
102 ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_UNKNOWN,
103 ELM_CTXPOPUP_DIRECTION_UNKNOWN, ELM_CTXPOPUP_DIRECTION_UNKNOWN);
105 _ctxpopup_move(_detail_data->ctxpopup);
106 evas_object_show(_detail_data->ctxpopup);
109 static void _ctxpopup_del_cb(void *data, Evas_Object *obj, void *event_info)
111 __COMMON_FUNC_ENTER__;
116 evas_object_del(_detail_data->ctxpopup);
117 _detail_data->ctxpopup = NULL;
119 __COMMON_FUNC_EXIT__;
122 static void _ctxpopup_move(Evas_Object *parent)
124 __COMMON_FUNC_ENTER__;
133 win = elm_object_top_widget_get(_detail_data->ctxpopup);
134 elm_win_screen_size_get(win, NULL, NULL, &w, &h);
135 pos = elm_win_rotation_get(win);
136 if (pos == 0 || pos == 180) {
138 } else if (pos == 90 || pos == 270) {
145 evas_object_move(_detail_data->ctxpopup, (w/2), h);
148 evas_object_move(_detail_data->ctxpopup, (h/2), w);
151 evas_object_move(_detail_data->ctxpopup, (h/2), w);
154 __COMMON_FUNC_EXIT__;
157 static void _ctxpopup_dismissed_cb(void *data, Evas_Object *obj, void *event_info)
159 __COMMON_FUNC_ENTER__;
164 Evas_Object *_win_main = data;
167 evas_object_del(_detail_data->ctxpopup);
168 _detail_data->ctxpopup = NULL;
170 _ctxpopup_move(_win_main);
171 evas_object_show(_detail_data->ctxpopup);
172 rotate_flag = EINA_FALSE;
175 __COMMON_FUNC_EXIT__;
178 static void _ctxpopup_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
180 __COMMON_FUNC_ENTER__;
182 Evas_Object *navi = (Evas_Object *)data;
183 Evas_Object *ctx = obj;
191 evas_object_smart_callback_del(ctx, "dismissed",
192 _ctxpopup_dismissed_cb);
193 evas_object_event_callback_del(navi, EVAS_CALLBACK_RESIZE,
194 _ctxpopup_resize_cb);
195 evas_object_smart_callback_del(elm_object_top_widget_get(ctx),
196 "rotation,changed", _ctxpopup_rotate_cb);
197 evas_object_event_callback_del_full(ctx, EVAS_CALLBACK_DEL,
198 _ctxpopup_delete_cb, navi);
200 __COMMON_FUNC_EXIT__;
204 static void _ctxpopup_rotate_cb(void *data, Evas_Object *obj, void *event_info)
207 __COMMON_FUNC_ENTER__;
212 Evas_Object *_win_main = data;
214 _ctxpopup_move(_win_main);
215 evas_object_show(_detail_data->ctxpopup);
217 __COMMON_FUNC_EXIT__;
220 static void _ctxpopup_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
222 __COMMON_FUNC_ENTER__;
224 if (_detail_data->ctxpopup) {
229 win = elm_object_top_widget_get(_detail_data->ctxpopup);
230 elm_win_screen_size_get(win, NULL, NULL, &w, &h);
231 pos = elm_win_rotation_get(win);
232 if (pos == 0 || pos == 180) {
234 } else if (pos == 90 || pos == 270) {
237 if (pos_changed != pos) {
238 rotate_flag = EINA_TRUE;
240 rotate_flag = EINA_FALSE;
243 rotate_flag = EINA_FALSE;
245 __COMMON_FUNC_EXIT__;
248 static char *_view_detail_grouptitle_text_get(void *data,
249 Evas_Object *obj, const char *part)
251 __COMMON_FUNC_ENTER__;
253 retvm_if(NULL == part, NULL);
259 if (!strcmp("elm.text", part)) {
260 _detail_data = (view_detail_data *)data;
261 retvm_if(NULL == _detail_data, NULL);
263 if (wifi_ap_get_essid(_detail_data->ap, &tmp) != WIFI_ERROR_NONE) {
267 txt = evas_textblock_text_utf8_to_markup(NULL, tmp);
273 __COMMON_FUNC_EXIT__;
277 static Evas_Object *_view_detail_grouptitle_content_get(void *data, Evas_Object *obj, const char *part)
279 retvm_if(NULL == data || NULL == part, NULL);
281 view_detail_data *_detail_data = (view_detail_data *)data;
282 _detail_data = (view_detail_data *)data;
283 Evas_Object* icon = NULL;
285 if (!strcmp("elm.swallow.end", part)) {
286 char *temp_str = NULL;
289 icon = elm_image_add(obj);
290 retvm_if(NULL == icon, NULL);
292 if (_detail_data->ap_image_path != NULL) {
293 temp_str = g_strdup_printf("%s.png", _detail_data->ap_image_path);
295 /* if there is no ap_image_path (NO AP Found situation)
296 * So use a default image */
297 temp_str = g_strdup_printf("%s.png", "A01-3_icon_lock_00");
299 evas_object_color_set(icon, 2, 61, 132, 204);
301 elm_image_file_set(icon, CUSTOM_EDITFIELD_PATH, temp_str);
304 evas_object_size_hint_min_set(icon, ELM_SCALE_SIZE(DEFAULT_BUTTON_CIRCLE_SIZE), ELM_SCALE_SIZE(DEFAULT_BUTTON_CIRCLE_SIZE));
310 static void _remove_all(view_detail_data *_detail_data)
312 __COMMON_FUNC_ENTER__;
316 if (_detail_data->forget_confirm_popup != NULL) {
317 evas_object_del(_detail_data->forget_confirm_popup);
318 _detail_data->forget_confirm_popup = NULL;
321 if (_detail_data->ctxpopup) {
322 evas_object_del(_detail_data->ctxpopup);
323 _detail_data->ctxpopup = NULL;
326 if (_detail_data->eap_info_list) {
327 eap_info_remove(_detail_data->eap_info_list);
330 ip_info_remove(_detail_data->ip_info->ip_info_list);
331 ip_info_delete_prev(_detail_data->ip_info->prev_ip_info);
332 _detail_data->ip_info->ip_info_list = NULL;
333 _detail_data->eap_info_list = NULL;
335 g_free(_detail_data->ap_image_path);
336 _detail_data->ap_image_path = NULL;
337 g_free(_detail_data);
342 __COMMON_FUNC_EXIT__;
345 static gboolean __forget_wifi_ap(gpointer data)
347 __COMMON_FUNC_ENTER__;
349 wifi_ap_h ap = (wifi_ap_h)data;
351 wlan_manager_forget(ap);
353 viewer_manager_update_item_favorite_status(ap);
356 __COMMON_FUNC_EXIT__;
360 static void ok_cb(void *data, Evas_Object *obj, void *event_info)
362 __COMMON_FUNC_ENTER__;
366 //view_detail_data *_detail_data;
368 if (view_detail_end == TRUE) {
372 view_detail_end = TRUE;
373 _detail_data = (view_detail_data *)data;
374 retm_if(NULL == _detail_data);
376 wifi_ap_clone(&ap, _detail_data->ap);
378 if (_detail_data->forget_confirm_popup != NULL) {
379 evas_object_del(_detail_data->forget_confirm_popup);
380 _detail_data->forget_confirm_popup = NULL;
383 _remove_all(_detail_data);
385 elm_naviframe_item_pop(viewer_manager_get_naviframe());
387 id = common_util_managed_idle_add(__forget_wifi_ap, (gpointer)ap);
392 __COMMON_FUNC_EXIT__;
395 static void cancel_cb(void *data, Evas_Object *obj, void *event_info)
397 __COMMON_FUNC_ENTER__;
399 // view_detail_data *_detail_data = (view_detail_data *)data;
400 _detail_data = (view_detail_data *)data;
401 retm_if(NULL == _detail_data);
403 if (_detail_data->forget_confirm_popup != NULL) {
404 evas_object_del(_detail_data->forget_confirm_popup);
405 _detail_data->forget_confirm_popup = NULL;
408 __COMMON_FUNC_EXIT__;
411 static void forget_sk_cb(void *data, Evas_Object *obj, void *event_info)
413 __COMMON_FUNC_ENTER__;
415 // view_detail_data *_detail_data = (view_detail_data *)data;
416 _detail_data = (view_detail_data *)data;
417 retm_if(NULL == _detail_data);
419 if (!_detail_data->forget_confirm_popup) {
420 popup_btn_info_t popup_data;
421 memset(&popup_data, 0, sizeof(popup_data));
423 popup_data.title_txt = "IDS_WIFI_OPT_FORGET_NETWORK";
424 popup_data.info_txt = "IDS_WIFI_POP_CURRENT_NETWORK_WILL_BE_DISCONNECTED";
425 popup_data.btn1_cb = cancel_cb;
426 popup_data.btn1_txt = "IDS_WIFI_SK_CANCEL";
427 popup_data.btn1_data = _detail_data;
428 popup_data.btn2_cb = ok_cb;
429 popup_data.btn2_txt = "IDS_WIFI_SK_FORGET";
430 popup_data.btn2_data = _detail_data;
432 _detail_data->forget_confirm_popup = common_utils_show_info_popup(_detail_data->win, &popup_data);
435 if (_detail_data->ctxpopup != NULL) {
436 evas_object_del(_detail_data->ctxpopup);
437 _detail_data->ctxpopup = NULL;
440 __COMMON_FUNC_EXIT__;
443 static Eina_Bool detailview_sk_cb(void *data, Elm_Object_Item *it)
445 __COMMON_FUNC_ENTER__;
447 Evas_Object *navi_frame = NULL;
449 if (view_detail_end == TRUE) {
453 view_detail_end = TRUE;
455 // view_detail_data *_detail_data = (view_detail_data *)data;
456 _detail_data = (view_detail_data *)data;
457 retvm_if(NULL == _detail_data, EINA_TRUE);
459 /* Delete context popup */
460 if (_detail_data->ctxpopup) {
461 evas_object_del(_detail_data->ctxpopup);
462 _detail_data->ctxpopup = NULL;
465 navi_frame = viewer_manager_get_naviframe();
466 retvm_if(NULL == navi_frame, EINA_TRUE);
468 evas_object_smart_callback_add(navi_frame, "transition,finished",
469 _transition_finished_sub_cb, _detail_data);
471 __COMMON_FUNC_EXIT__;
476 static void __view_detail_imf_ctxt_evnt_cb(void *data, Ecore_IMF_Context *ctx, int value)
481 if (value == ECORE_IMF_INPUT_PANEL_STATE_SHOW) {
482 DEBUG_LOG(UG_NAME_NORMAL, "Key pad is now open");
483 elm_object_item_signal_emit(data, "elm,state,sip,shown", "");
484 } else if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
485 DEBUG_LOG(UG_NAME_NORMAL, "Key pad is now closed");
486 elm_object_item_signal_emit(data, "elm,state,sip,hidden", "");
491 static gboolean __view_detail_load_ip_info_list_cb(void *data)
493 __COMMON_FUNC_ENTER__;
494 Elm_Object_Item *navi_it = NULL;
495 Evas_Object *list = NULL;
497 _detail_data = (view_detail_data *)data;
503 navi_it = elm_naviframe_top_item_get(viewer_manager_get_naviframe());
504 layout = elm_object_item_part_content_get(navi_it, "elm.swallow.content");
506 /* Create an EAP connect view list */
507 list = elm_object_part_content_get(layout, "elm.swallow.content");
509 /* Append ip info list */
510 _detail_data->ip_info = ip_info_append_items(_detail_data->ap,
511 PACKAGE, list, __view_detail_imf_ctxt_evnt_cb, navi_it);
512 if (_detail_data && _detail_data->btn) {
513 elm_object_disabled_set(_detail_data->btn, EINA_FALSE);
515 __COMMON_FUNC_EXIT__;
519 static void _transition_finished_sub_cb(void *data, Evas_Object *obj, void *event_info)
521 __COMMON_FUNC_ENTER__;
523 Evas_Object *navi = NULL;
524 Elm_Object_Item *target_item = NULL;
525 wifi_connection_state_e connection_state;
527 _detail_data = (view_detail_data *)data;
529 __COMMON_FUNC_EXIT__;
534 if (_detail_data->eap_info_list) {
535 eap_info_save_data(_detail_data->eap_info_list);
539 navi = (Evas_Object *)viewer_manager_get_naviframe();
541 __COMMON_FUNC_EXIT__;
544 ip_info_save_data(_detail_data->ip_info);
546 evas_object_smart_callback_del(navi, "transition,finished",
547 _transition_finished_sub_cb);
549 if (_detail_data->ip_info->is_info_changed == TRUE &&
550 _detail_data->ap != NULL) {
551 wifi_ap_get_connection_state(_detail_data->ap, &connection_state);
552 if (WIFI_CONNECTION_STATE_CONNECTED == connection_state) {
553 target_item = item_get_for_ap(_detail_data->ap);
554 viewer_list_item_radio_mode_set(target_item,
555 VIEWER_ITEM_RADIO_MODE_CONNECTING);
559 _remove_all(_detail_data);
562 __COMMON_FUNC_EXIT__;
565 static void gl_lang_changed(void *data, Evas_Object *obj, void *event_info)
567 elm_genlist_realized_items_update(obj);
570 void view_detail(wifi_device_info_t *device_info, Evas_Object *win_main,
573 __COMMON_FUNC_ENTER__;
577 static Elm_Genlist_Item_Class grouptitle_itc;
578 Evas_Object *layout = NULL;
579 Evas_Object *navi_frame = NULL;
580 Evas_Object *detailview_list = NULL;
581 Elm_Object_Item *title = NULL;
582 Elm_Object_Item *navi_it = NULL;
583 Evas_Object *more_btn = NULL;
585 if (device_info == NULL) {
586 ERROR_LOG(UG_NAME_NORMAL, "Failed: device_info is NULL");
590 navi_frame = viewer_manager_get_naviframe();
591 if (navi_frame == NULL) {
592 ERROR_LOG(UG_NAME_NORMAL, "Failed to get naviframe");
595 ecore_imf_input_panel_hide();
596 view_detail_end = FALSE;
598 _detail_data = g_try_new0(view_detail_data, 1);
599 retm_if(NULL == _detail_data);
601 _detail_data->win = win_main;
602 _detail_data->nav = navi_frame;
603 _detail_data->ap = ap = device_info->ap;
604 wifi_ap_is_favorite(ap, &favorite);
606 if (device_info->ap_image_path) {
607 _detail_data->ap_image_path = g_strdup(device_info->ap_image_path);
609 _detail_data->btn = btn;
610 if (ug_app_state->ug_type == UG_VIEW_SETUP_WIZARD) {
611 layout = elm_layout_add(navi_frame);
613 elm_layout_file_set(layout, SETUP_WIZARD_EDJ_PATH, "detail_pwlock");
614 elm_object_domain_translatable_part_text_set(layout,
615 "text.title", PACKAGE, "IDS_WIFI_HEADER_WI_FI_NETWORK_INFO_ABB");
617 navi_it = elm_naviframe_item_push(navi_frame,
618 NULL, NULL, NULL, layout, NULL);
619 elm_naviframe_item_title_enabled_set(navi_it, EINA_FALSE, EINA_FALSE);
621 struct ug_data *ugd = (struct ug_data *)ug_app_state->gadget;
622 int change_ang = elm_win_rotation_get(ugd->win_main);
623 if (change_ang == 0 || change_ang == 180) {
624 common_utils_contents_rotation_adjust(UG_EVENT_ROTATE_PORTRAIT);
625 edje_object_signal_emit((Evas_Object *)elm_layout_edje_get(layout)
626 ,"location,vertical", "elm");
628 common_utils_contents_rotation_adjust(UG_EVENT_ROTATE_LANDSCAPE);
629 edje_object_signal_emit((Evas_Object *)elm_layout_edje_get(layout),
630 "location,horizontal", "elm");
633 layout = common_utils_create_layout(navi_frame);
635 navi_it = elm_naviframe_item_push(navi_frame,
636 "IDS_WIFI_HEADER_WI_FI_NETWORK_INFO_ABB",
637 NULL, NULL, layout, NULL);
638 elm_object_item_domain_text_translatable_set(navi_it,
642 evas_object_show(layout);
644 detailview_list = elm_genlist_add(layout);
645 assertm_if(NULL == detailview_list, "NULL!!");
647 elm_object_style_set(detailview_list, "dialogue");
648 _detail_data->view_detail_list = detailview_list;
650 evas_object_smart_callback_add(detailview_list, "language,changed",
651 gl_lang_changed, NULL);
653 grouptitle_itc.item_style = WIFI_GENLIST_2LINE_BOTTOM_TEXT_ICON_STYLE;
654 grouptitle_itc.func.text_get = _view_detail_grouptitle_text_get;
655 grouptitle_itc.func.content_get = _view_detail_grouptitle_content_get;
656 grouptitle_itc.func.state_get = NULL;
657 grouptitle_itc.func.del = NULL;
659 /* AP name and signal strength icon */
660 title = elm_genlist_item_append(detailview_list,
661 &grouptitle_itc, _detail_data, NULL, ELM_GENLIST_ITEM_GROUP,
663 elm_genlist_item_select_mode_set(title, ELM_OBJECT_SELECT_MODE_NONE);
665 elm_object_part_content_set(layout, "elm.swallow.content", detailview_list);
667 evas_object_data_set(navi_frame, SCREEN_TYPE_ID_KEY,
668 (void *)VIEW_MANAGER_VIEW_TYPE_DETAIL);
670 /* Set pop callback */
671 elm_naviframe_item_pop_cb_set(navi_it, detailview_sk_cb, _detail_data);
674 /* Toolbar Forget button */
676 Evas_Object *toolbar = NULL;
678 toolbar = elm_toolbar_add(navi_frame);
679 elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND);
680 elm_toolbar_transverse_expanded_set(toolbar, EINA_TRUE);
681 elm_toolbar_select_mode_set(toolbar, ELM_OBJECT_SELECT_MODE_NONE);
683 elm_toolbar_item_append(toolbar, NULL,
684 sc(PACKAGE, I18N_TYPE_Forget),
685 forget_sk_cb, _detail_data);
687 elm_object_item_part_content_set(navi_it, "toolbar", toolbar);
690 more_btn = elm_button_add(_detail_data->nav);
691 elm_object_style_set(more_btn, "naviframe/more/default");
692 evas_object_smart_callback_add(more_btn, "clicked",
693 _create_ctxpopup_forget_btn_cb, win_main);
694 elm_object_item_part_content_set(navi_it, "toolbar_more_btn", more_btn);
697 wifi_security_type_e type = WIFI_SECURITY_TYPE_NONE;
698 wifi_ap_get_security_type(ap, &type);
699 if (WIFI_SECURITY_TYPE_EAP == type) {
700 wifi_connection_state_e connection_state;
701 wifi_ap_get_connection_state(ap, &connection_state);
702 if (favorite || WIFI_CONNECTION_STATE_CONNECTED == connection_state) {
703 _detail_data->eap_info_list = eap_info_append_items(ap,
704 detailview_list, PACKAGE, __view_detail_imf_ctxt_evnt_cb,
709 /* Append the ip info details */
710 id = common_util_managed_idle_add(__view_detail_load_ip_info_list_cb, _detail_data);
712 g_free(_detail_data);
715 __COMMON_FUNC_EXIT__;