2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.tizenopensource.org/license
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 * This file implements view of Wi-Fi direct UI Gadget.
21 * @author Gibyoung Kim (lastkgb.kim@samsung.com)
31 #include <Elementary.h>
33 #include <ui-gadget-module.h>
34 #include <wifi-direct.h>
37 #include "wfd_ug_view.h"
38 #include "wfd_client.h"
41 Elm_Gen_Item_Class sep_itc;
42 Elm_Gen_Item_Class head_itc;
43 Elm_Gen_Item_Class name_itc;
44 Elm_Gen_Item_Class title_itc;
45 Elm_Gen_Item_Class peer_itc;
46 Elm_Gen_Item_Class noitem_itc;
47 Elm_Gen_Item_Class help_itc;
50 void _back_btn_cb(void *data, Evas_Object * obj, void *event_info)
53 struct ug_data *ugd = (struct ug_data*) data;
57 DBG(LOG_ERROR, "The param is NULL\n");
61 wfd_ug_view_free_peers(ugd);
63 ug_destroy_me(ugd->ug);
69 void _scan_btn_cb(void *data, Evas_Object * obj, void *event_info)
72 struct ug_data *ugd = (struct ug_data*) data;
75 res = wfd_client_start_discovery(ugd);
81 Eina_Bool _is_wifi_on()
86 vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
88 if (wifi_state >= VCONFKEY_WIFI_CONNECTED)
99 static void _wfd_onoff_btn_cb(void *data, Evas_Object *obj, void *event_info)
102 struct ug_data *ugd = (struct ug_data*) data;
104 ugd->wfd_status = wfd_client_get_link_status();
105 DBG(LOG_VERBOSE, "WFD state is [%d]", ugd->wfd_status);
109 if(ugd->wfd_status < 0)
111 DBG(LOG_VERBOSE, "bad wfd status\n");
112 wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_ACTIVATE_FAIL"), POPUP_TYPE_TERMINATE);
114 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
115 wfd_ug_view_refresh_glitem(ugd->head);
119 ugd->head_text_mode = HEAD_TEXT_TYPE_ACTIVATING;
120 wfd_client_switch_on(ugd);
124 if(ugd->wfd_status < 0)
126 DBG(LOG_VERBOSE, "bad wfd status\n");
127 wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_DEACTIVATE_FAIL"), POPUP_TYPE_TERMINATE);
129 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
130 wfd_ug_view_refresh_glitem(ugd->head);
134 ugd->head_text_mode = HEAD_TEXT_TYPE_DEACTIVATING;
135 wfd_client_switch_off(ugd);
137 wfd_ug_view_refresh_glitem(ugd->head);
142 static void _gl_header_sel(void *data, Evas_Object *obj, void *event_info)
145 struct ug_data *ugd = (struct ug_data*) data;
146 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
151 DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
156 elm_genlist_item_selected_set(item, EINA_FALSE);
158 _wfd_onoff_btn_cb(ugd, NULL, NULL);
163 static char *_gl_header_label_get(void *data, Evas_Object * obj,
167 struct ug_data *ugd = (struct ug_data *) data;
168 DBG(LOG_VERBOSE, "%s", part);
172 DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
176 if (!strcmp(part, "elm.text"))
178 DBG(LOG_VERBOSE, "Current text mode [%d]\n", ugd->head_text_mode);
179 switch (ugd->head_text_mode)
181 case HEAD_TEXT_TYPE_DIRECT:
182 return strdup(dgettext("sys_string", "IDS_COM_OPT1_WI_FI_DIRECT"));
184 case HEAD_TEXT_TYPE_DEACTIVATING:
185 return strdup(_("IDS_WFD_BODY_DEACTIVATING"));
187 case HEAD_TEXT_TYPE_ACTIVATING:
188 return strdup(_("IDS_WFD_BODY_ACTIVATING"));
190 case HEAD_TEXT_TYPE_ACTIVATED:
191 return strdup(_("IDS_WFD_BODY_ACTIVATED"));
193 case HEAD_TEXT_TYPE_SCANING:
194 return strdup(_("IDS_WFD_BODY_SCANNING"));
205 static Evas_Object *_gl_header_icon_get(void *data, Evas_Object * obj,
209 struct ug_data *ugd = (struct ug_data *) data;
210 Evas_Object *onoff = NULL;
214 DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
218 if (ugd->head_text_mode == HEAD_TEXT_TYPE_ACTIVATING ||
219 ugd->head_text_mode == HEAD_TEXT_TYPE_DEACTIVATING)
222 DBG(LOG_VERBOSE, "%s", part);
223 onoff = elm_check_add(obj);
224 elm_object_style_set(onoff, "on&off");
225 elm_check_state_set(onoff, ugd->wfd_onoff);
226 evas_object_smart_callback_add(onoff, "changed", _wfd_onoff_btn_cb, ugd);
227 evas_object_show(onoff);
234 static char *_gl_name_label_get(void *data, Evas_Object * obj, const char *part)
237 struct ug_data *ugd = (struct ug_data *) data;
241 DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
245 DBG(LOG_VERBOSE, "%s", part);
247 if (!strcmp(part, "elm.text.1"))
249 return strdup(_("IDS_WFD_BODY_DEVICE_NAME"));
251 else if (!strcmp(part, "elm.text.2"))
253 return strdup(ugd->dev_name);
261 static char *_gl_title_label_get(void *data, Evas_Object * obj,
265 struct ug_data *ugd = (struct ug_data *) data;
269 DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
273 if (!strcmp(part, "elm.text"))
276 return strdup(_("IDS_WFD_BODY_AVAILABLE_DEVICES"));
278 return strdup(_("IDS_WFD_BODY_WIFI_DIRECT_DEVICES"));
286 static Evas_Object *_gl_noitem_icon_get(void *data, Evas_Object * obj,
290 Evas_Object *nocontent;
294 DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
298 nocontent = elm_layout_add(obj);
299 if (nocontent == NULL)
301 DBG(LOG_ERROR, "Failed to add nocontent");
304 elm_layout_theme_set(nocontent, "layout", "nocontents", "unnamed");
305 elm_object_part_text_set(nocontent, "elm.text",
306 _("IDS_WFD_BODY_NO_DEVICES"));
307 evas_object_size_hint_min_set(nocontent, 400, 200);
308 evas_object_size_hint_max_set(nocontent, 400, 200);
309 evas_object_resize(nocontent, 400, 200);
316 static void _gl_noitem_del(void *data, Evas_Object * obj)
324 static char *_gl_peer_label_get(void *data, Evas_Object * obj, const char *part)
327 assertm_if(NULL == obj, "NULL!!");
328 assertm_if(NULL == part, "NULL!!");
330 device_type_s *peer = (device_type_s *) data;
334 DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
339 return strdup(peer->ssid);
342 static Evas_Object *_gl_peer_icon_get(void *data, Evas_Object * obj,
346 assertm_if(NULL == obj, "NULL!!");
347 assertm_if(NULL == part, "NULL!!");
349 device_type_s *peer = (device_type_s *) data;
350 Evas_Object *icon = NULL;
354 DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
358 if (!strcmp(part, "elm.icon.2"))
360 DBG(LOG_VERBOSE, "elm.icon.2 - connection status [%d]\n",
362 if (peer->conn_status == PEER_CONN_STATUS_CONNECTING)
364 icon = elm_progressbar_add(obj);
365 elm_object_style_set(icon, "list_process");
366 elm_progressbar_pulse(icon, EINA_TRUE);
368 else if (peer->conn_status == PEER_CONN_STATUS_CONNECTED)
370 icon = elm_icon_add(obj);
371 elm_icon_file_set(icon, WFD_ICON_CONNECTED, NULL);
374 evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
375 elm_icon_resizable_set(icon, 1, 1);
376 evas_object_show(icon);
378 else if (!strcmp(part, "elm.icon.1"))
380 DBG(LOG_VERBOSE, "elm.icon.1 - category [%d]\n", peer->category);
381 char *img_path = NULL;
382 switch (peer->category)
384 case WFD_DEVICE_TYPE_COMPUTER:
385 img_path = WFD_ICON_DEVICE_PC;
387 case WFD_DEVICE_TYPE_INPUT_DEVICE:
388 img_path = WFD_ICON_DEVICE_KEYBOARD;
390 case WFD_DEVICE_TYPE_PRINTER:
391 img_path = WFD_ICON_DEVICE_PRINTER;
393 case WFD_DEVICE_TYPE_CAMERA:
394 img_path = WFD_ICON_DEVICE_UNKNOWN;
396 case WFD_DEVICE_TYPE_STORAGE:
397 case WFD_DEVICE_TYPE_NW_INFRA:
398 case WFD_DEVICE_TYPE_DISPLAYS:
399 case WFD_DEVICE_TYPE_MM_DEVICES:
400 case WFD_DEVICE_TYPE_GAME_DEVICES:
401 case WFD_DEVICE_TYPE_OTHER:
402 img_path = WFD_ICON_DEVICE_UNKNOWN;
404 case WFD_DEVICE_TYPE_TELEPHONE:
405 img_path = WFD_ICON_DEVICE_PHONE;
407 case WFD_DEVICE_TYPE_AUDIO:
408 img_path = WFD_ICON_DEVICE_HEADSET;
414 if (img_path != NULL)
416 icon = elm_icon_add(obj);
417 elm_icon_file_set(icon, img_path, NULL);
418 evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL,
420 elm_icon_resizable_set(icon, 1, 1);
421 evas_object_show(icon);
429 static void _gl_peer_del(void *data, Evas_Object * obj)
432 assertm_if(NULL == obj, "NULL!!");
433 assertm_if(NULL == data, "NULL!!");
439 static void _gl_peer_sel(void *data, Evas_Object * obj, void *event_info)
442 assertm_if(NULL == obj, "NULL!!");
443 assertm_if(NULL == data, "NULL!!");
444 device_type_s *peer = (device_type_s *) data;
445 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
450 DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
455 elm_genlist_item_selected_set(item, EINA_FALSE);
457 if (peer->conn_status == PEER_CONN_STATUS_DISCONNECTED)
459 DBG(LOG_VERBOSE, "Connect with peer [%s]\n", peer->mac_addr);
460 res = wfd_client_connect((const char *) peer->mac_addr);
463 DBG(LOG_ERROR, "Failed to send connection request. [%d]\n", res);
466 peer->conn_status = PEER_CONN_STATUS_CONNECTING;
470 res = wfd_client_disconnect((const char *) peer->mac_addr);
473 DBG(LOG_ERROR, "Failed to send disconnection request. [%d]\n", res);
476 peer->conn_status = PEER_CONN_STATUS_DISCONNECTED;
479 wfd_ug_view_refresh_glitem(peer->gl_item);
485 static char *_gl_help_label_get(void *data, Evas_Object * obj, const char *part)
488 DBG(LOG_VERBOSE, "%s", part);
490 return strdup("Help");
493 static Evas_Object *_create_basic_genlist(void *data)
497 struct ug_data *ugd = (struct ug_data *) data;
498 Evas_Object *genlist;
500 genlist = elm_genlist_add(ugd->naviframe);
502 sep_itc.item_style = "grouptitle.dialogue.seperator";
503 sep_itc.func.text_get = NULL;
504 sep_itc.func.content_get = NULL;
505 sep_itc.func.state_get = NULL;
506 sep_itc.func.del = NULL;
508 head_itc.item_style = "dialogue/1text.1icon";
509 head_itc.func.text_get = _gl_header_label_get;
510 head_itc.func.content_get = _gl_header_icon_get;
511 head_itc.func.state_get = NULL;
513 name_itc.item_style = "dialogue/2text.3";
514 name_itc.func.text_get = _gl_name_label_get;
515 name_itc.func.content_get = NULL;
516 name_itc.func.state_get = NULL;
517 name_itc.func.del = NULL;
519 Elm_Object_Item *item;
520 elm_genlist_item_append(genlist, &sep_itc, NULL, NULL,
521 ELM_GENLIST_ITEM_NONE, NULL, NULL);
523 elm_genlist_item_append(genlist, &head_itc, ugd, NULL,
524 ELM_GENLIST_ITEM_NONE, _gl_header_sel, (void*) ugd);
526 elm_genlist_item_append(genlist, &name_itc, ugd, NULL,
527 ELM_GENLIST_ITEM_NONE, NULL, NULL);
528 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
535 static int _create_device_genlist(void *data)
538 struct ug_data *ugd = (struct ug_data *) data;
540 title_itc.item_style = "dialogue/title";
541 title_itc.func.text_get = _gl_title_label_get;
542 title_itc.func.content_get = NULL;
543 title_itc.func.state_get = NULL;
544 title_itc.func.del = NULL;
546 peer_itc.item_style = "dialogue/1text.2icon.2";
547 peer_itc.func.text_get = _gl_peer_label_get;
548 peer_itc.func.content_get = _gl_peer_icon_get;
549 peer_itc.func.state_get = NULL;
550 peer_itc.func.del = _gl_peer_del;
552 noitem_itc.item_style = "dialogue/bg/1icon";
553 noitem_itc.func.text_get = NULL;
554 noitem_itc.func.content_get = _gl_noitem_icon_get;
555 noitem_itc.func.state_get = NULL;
556 noitem_itc.func.del = _gl_noitem_del;
558 sep_itc.item_style = "grouptitle.dialogue.seperator";
559 sep_itc.func.text_get = NULL;
560 sep_itc.func.content_get = NULL;
561 sep_itc.func.state_get = NULL;
562 sep_itc.func.del = NULL;
564 help_itc.item_style = "dialogue/1text";
565 help_itc.func.text_get = _gl_help_label_get;
566 help_itc.func.content_get = NULL;
567 help_itc.func.state_get = NULL;
568 help_itc.func.del = NULL;
570 Elm_Object_Item *item;
572 elm_genlist_item_append(ugd->genlist, &title_itc, (void *) ugd, NULL,
573 ELM_GENLIST_ITEM_NONE, NULL, NULL);
574 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
576 elm_genlist_item_append(ugd->genlist, &noitem_itc, (void *) ugd, NULL,
577 ELM_GENLIST_ITEM_NONE, NULL, NULL);
578 elm_genlist_item_select_mode_set(ugd->noitem,
579 ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
585 void create_wfd_ug_view(void *data)
589 struct ug_data *ugd = (struct ug_data *) data;
590 Evas_Object *back_btn = NULL;
591 Elm_Object_Item *navi_item = NULL;
592 Evas_Object *control_bar = NULL;
596 DBG(LOG_ERROR, "Incorrect parameter(NULL)");
600 ugd->naviframe = elm_naviframe_add(ugd->base);
601 elm_object_part_content_set(ugd->base, "elm.swallow.content",
603 evas_object_show(ugd->naviframe);
605 back_btn = elm_button_add(ugd->naviframe);
606 elm_object_style_set(back_btn, "naviframe/back_btn/default");
607 evas_object_smart_callback_add(back_btn, "clicked", _back_btn_cb,
609 elm_object_focus_allow_set(back_btn, EINA_FALSE);
611 ugd->genlist = _create_basic_genlist(ugd);
612 if (ugd->genlist == NULL)
614 DBG(LOG_ERROR, "Failed to create basic genlist");
617 evas_object_show(ugd->genlist);
618 _create_device_genlist(ugd);
620 back_btn = elm_button_add(ugd->naviframe);
621 elm_object_style_set(back_btn, "naviframe/back_btn/default");
622 evas_object_smart_callback_add(back_btn, "clicked", _back_btn_cb,
624 elm_object_focus_allow_set(back_btn, EINA_FALSE);
627 elm_naviframe_item_push(ugd->naviframe, _("IDS_WFD_HEADER_WIFI_DIRECT"),
628 back_btn, NULL, ugd->genlist, NULL);
630 control_bar = elm_toolbar_add(ugd->naviframe);
631 elm_toolbar_shrink_mode_set(control_bar, ELM_TOOLBAR_SHRINK_EXPAND);
632 evas_object_show(control_bar);
635 elm_toolbar_item_append(control_bar, NULL, _("IDS_WFD_BUTTON_SCAN"),
636 _scan_btn_cb, (void *) ugd);
637 elm_object_item_disabled_set(ugd->scan_btn, !ugd->wfd_onoff);
639 elm_object_item_part_content_set(navi_item, "controlbar", control_bar);
644 void destroy_wfd_ug_view(void *data)
648 struct ug_data *ugd = (struct ug_data *) data;
652 evas_object_del(ugd->genlist);
658 evas_object_del(ugd->naviframe);
659 ugd->naviframe = NULL;
665 void wfd_ug_view_refresh_glitem(void *obj)
668 elm_genlist_item_update(obj);
672 void wfd_ug_view_refresh_button(void *obj, int enable)
675 DBG(LOG_VERBOSE, "scan button is enabling. [%d]\n", enable);
676 elm_object_item_disabled_set(obj, !enable);
680 void wfd_ug_view_update_peers(void *data)
683 struct ug_data *ugd = (struct ug_data *) data;
686 DBG(LOG_VERBOSE, "peer count [%d], peer instance [%x]\n", ugd->peer_cnt,
689 if (ugd->peer_cnt == 0)
691 DBG(LOG_ERROR, "There are No peers\n");
692 if (ugd->noitem == NULL)
694 elm_genlist_item_append(ugd->genlist, &noitem_itc, (void *) ugd,
695 NULL, ELM_GENLIST_ITEM_NONE, NULL,
699 else if (ugd->peer_cnt > 0)
703 elm_object_item_del(ugd->noitem);
705 DBG(LOG_VERBOSE, "Noitem list is removed\n");
708 for (i = 0; i < ugd->peer_cnt; i++)
710 DBG(LOG_VERBOSE, "%dth peer being added on genlist\n", i);
711 ugd->peers[i].gl_item =
712 elm_genlist_item_append(ugd->genlist, &peer_itc,
713 (void *) &(ugd->peers[i]), NULL,
714 ELM_GENLIST_ITEM_NONE, _gl_peer_sel,
715 (void *) &(ugd->peers[i]));
722 void wfd_ug_view_free_peers(void *data)
725 struct ug_data *ugd = (struct ug_data *) data;
728 for (i = 0; i < ugd->peer_cnt; i++)
730 DBG(LOG_VERBOSE, "%dth peer is deleted\n", i);
731 elm_object_item_del(ugd->peers[i].gl_item);
734 if (ugd->peer_cnt > 0 && ugd->peers != NULL)
736 DBG(LOG_VERBOSE, "peers will be destroyed\n");
745 static void _wfd_ug_act_popup_wifi_ok_cb(void *data, Evas_Object * obj,
749 struct ug_data *ugd = (struct ug_data *) data;
751 ugd->wfd_status = WFD_LINK_STATUS_DEACTIVATED;
754 evas_object_del(ugd->act_popup);
755 ugd->act_popup = NULL;
759 static void _wfd_ug_act_popup_wifi_cancel_cb(void *data, Evas_Object * obj,
763 struct ug_data *ugd = (struct ug_data *) data;
765 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
766 wfd_ug_view_refresh_glitem(ugd->head);
768 evas_object_del(ugd->act_popup);
769 ugd->act_popup = NULL;
773 void wfd_ug_act_popup(void *data, const char *message, int popup_type)
776 struct ug_data *ugd = (struct ug_data *) data;
777 Evas_Object *popup = NULL;
778 Evas_Object *btn1 = NULL, *btn2 = NULL;
780 popup = elm_popup_add(ugd->base);
781 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
782 elm_object_text_set(popup, message);
784 btn1 = elm_button_add(popup);
785 elm_object_text_set(btn1, S_("IDS_COM_SK_YES"));
786 elm_object_part_content_set(popup, "button1", btn1);
787 evas_object_smart_callback_add(btn1, "clicked",
788 _wfd_ug_act_popup_wifi_ok_cb, (void *) ugd);
790 btn2 = elm_button_add(popup);
791 elm_object_text_set(btn2, S_("IDS_COM_SK_NO"));
792 elm_object_part_content_set(popup, "button2", btn2);
793 evas_object_smart_callback_add(btn2, "clicked",
794 _wfd_ug_act_popup_wifi_cancel_cb,
797 evas_object_show(popup);
798 ugd->act_popup = popup;
802 void wfg_ug_act_popup_remove(void *data)
805 struct ug_data *ugd = (struct ug_data *) data;
809 evas_object_del(ugd->act_popup);
810 ugd->act_popup = NULL;
815 static void _wfd_ug_terminate_popup_cb(void *data, Evas_Object *obj, void *event_info)
818 struct ug_data *ugd = (struct ug_data*) data;
820 evas_object_del(ugd->warn_popup);
821 ugd->warn_popup = NULL;
823 wfd_ug_view_free_peers(ugd);
825 ug_destroy_me(ugd->ug);
829 static void _wfd_ug_warn_popup_cb(void *data, Evas_Object *obj, void *event_info)
832 struct ug_data *ugd = (struct ug_data*) data;
834 evas_object_del(ugd->warn_popup);
835 ugd->warn_popup = NULL;
839 void wfd_ug_warn_popup(void *data, const char *message, int popup_type)
842 struct ug_data *ugd = (struct ug_data *) data;
843 Evas_Object *popup = NULL;
844 Evas_Object *btn = NULL;
846 popup = elm_popup_add(ugd->base);
847 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
848 elm_object_text_set(popup, message);
850 btn = elm_button_add(popup);
851 elm_object_text_set(btn, S_("IDS_COM_SK_OK"));
852 elm_object_part_content_set(popup, "button1", btn);
853 if(popup_type == POPUP_TYPE_TERMINATE)
854 evas_object_smart_callback_add(btn, "clicked", _wfd_ug_terminate_popup_cb, (void*) ugd);
856 evas_object_smart_callback_add(btn, "clicked", _wfd_ug_warn_popup_cb, (void*) ugd);
858 evas_object_show(popup);
859 ugd->warn_popup = popup;
863 void wfg_ug_warn_popup_remove(void *data)
866 struct ug_data *ugd = (struct ug_data *) data;
870 evas_object_del(ugd->warn_popup);
871 ugd->warn_popup = NULL;