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.
23 #include <Elementary.h>
25 #include <ui-gadget-module.h>
26 #include <wifi-direct.h>
29 #include "wfd_ug_view.h"
30 #include "wfd_client.h"
32 Elm_Gen_Item_Class device_itc;
35 * This function let the ug call it when click 'back' button in multi connect view
37 * @param[in] data the pointer to the main data structure
38 * @param[in] obj the pointer to the evas object
39 * @param[in] event_info the pointer to the event information
41 Eina_Bool _multiconnect_view_pop_cb(void *data, Elm_Object_Item *it)
44 struct ug_data *ugd = (struct ug_data *)data;
46 device_type_s *peer_for_free = NULL;
47 device_type_s *peer = NULL;
50 DBG(LOG_ERROR, "The param is NULL\n");
54 peer = ugd->multi_conn_dev_list_start;
56 while (peer != NULL) {
57 DBG(LOG_INFO, "Free peer, ssid:%s\n", peer->ssid);
64 ugd->multi_conn_dev_list_start = NULL;
65 ugd->multiconn_view_genlist = NULL;
66 ugd->mcview_title_item = NULL;
67 ugd->mcview_nodevice_item = NULL;
68 ugd->multi_navi_item = NULL;
69 ugd->multiconn_conn_btn = NULL;
70 ugd->multiconn_layout = NULL;
71 ugd->multiconn_scan_stop_btn = NULL;
73 DBG(LOG_INFO, "MultiConnectMode: %d\n", ugd->multi_connect_mode);
75 /* if pressing connect for multi-connecting, it should not start discovery again */
76 if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_NONE) {
77 if (ugd->view_type == NULL) {
78 ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
79 DBG(LOG_INFO, "Discovery started\n");
80 ret = wifi_direct_start_discovery_specific_channel(false, 1,
81 WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
82 if (ret != WIFI_DIRECT_ERROR_NONE) {
83 ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
84 DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", ret);
85 wifi_direct_cancel_discovery();
87 } else if (g_strcmp0(_(ugd->view_type),
88 _("IDS_WIFI_BUTTON_MULTI_CONNECT")) == 0) {
89 DBG(LOG_INFO, "Discovery not started\n");
90 ug_destroy_me(ugd->ug);
99 * This function let the ug reset the connected failed peers
101 * @param[in] event_info the pointer to the event information
103 gboolean __wfd_multi_connect_reset_cb(void *data)
108 DBG(LOG_ERROR, "The param is NULL\n");
112 device_type_s *peer = NULL;
113 struct ug_data *ugd = (struct ug_data *)data;
115 peer = ugd->gl_mul_conn_peers_start;
116 while (peer != NULL) {
117 elm_object_item_del(peer->gl_item);
118 peer->gl_item = NULL;
122 WFD_IF_DEL_ITEM(ugd->multi_connect_wfd_item);
123 WFD_IF_DEL_ITEM(ugd->multi_connect_sep_item);
125 wfd_ug_update_available_peers(ugd);
132 * This function let the ug free the selected peers in multi connect view
134 * @param[in] data the pointer to the main data structure
136 void wfd_free_multi_selected_peers(void *data)
141 struct ug_data *ugd = (struct ug_data *)data;
143 /* destroy the created group */
144 wifi_direct_destroy_group();
146 /* release the selected peers */
147 for (i = 0; i < ugd->raw_multi_selected_peer_cnt; i++) {
148 memset(&ugd->raw_multi_selected_peers[i], 0x00, sizeof(device_type_s));
151 ugd->raw_multi_selected_peer_cnt = 0;
152 ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_NONE;
159 * This function let the ug stop to connect to selected peer
160 * @return If success, return 0, else return -1
161 * @param[in] data the pointer to the main data structure
163 int wfd_stop_multi_connect(void *data)
166 struct ug_data *ugd = (struct ug_data *)data;
168 if (ugd->act_popup) {
169 evas_object_del(ugd->act_popup);
170 ugd->act_popup = NULL;
173 /* change the title of failed peers */
174 ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_COMPLETED;
175 wfd_ug_view_refresh_glitem(ugd->multi_connect_wfd_item);
176 wfd_ug_update_toolbar(ugd);
178 if (ugd->gl_connected_peer_cnt > 0) {
179 wfd_client_set_p2p_group_owner_intent(7);
181 wifi_direct_destroy_group();
184 if(ugd->timer_multi_reset > 0) {
185 g_source_remove(ugd->timer_multi_reset);
187 /* after 30s, remove the failed peers */
188 ugd->timer_multi_reset = g_timeout_add(30000 /*ms*/,
189 __wfd_multi_connect_reset_cb, ugd);
191 if (ugd->g_source_multi_connect_next > 0) {
192 g_source_remove(ugd->g_source_multi_connect_next);
194 ugd->g_source_multi_connect_next = 0;
196 /*when multi-connect end and auto_exit is true, exit UG*/
197 if (ugd->is_auto_exit) {
198 _wfd_ug_auto_exit(ugd);
206 * This function let the ug start to connect the selected peers
207 * @return If success, return 0, else return -1
208 * @param[in] data the pointer to the main data structure
210 int wfd_start_multi_connect(void *data)
213 struct ug_data *ugd = (struct ug_data *)data;
216 if (ugd->raw_multi_selected_peer_cnt > 0) {
217 ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_IN_PROGRESS;
219 res = wfd_client_group_add();
221 DBG(LOG_ERROR, "Failed to add group");
222 wfd_free_multi_selected_peers(ugd);
228 DBG(LOG_INFO, "No selected peers.\n");
236 void wfd_sort_multi_selected_peers(struct ug_data *ugd)
243 for(i = 0; i < ugd->raw_multi_selected_peer_cnt; i++) {
244 for(j = 0; j < ugd->raw_multi_selected_peer_cnt-i-1; j++) {
245 if (strcasecmp(ugd->raw_multi_selected_peers[j].ssid, ugd->raw_multi_selected_peers[j + 1].ssid) > 0) {
246 peer = ugd->raw_multi_selected_peers[j];
247 ugd->raw_multi_selected_peers[j] = ugd->raw_multi_selected_peers[j + 1];
248 ugd->raw_multi_selected_peers[j + 1] = peer;
256 * This function let the ug connect to the next selected peer automatically
257 * @return If stop the timer, return false, else return true
258 * @param[in] data the pointer to the main data structure
260 gboolean wfd_multi_connect_next_cb(void *data)
263 struct ug_data *ugd = (struct ug_data *)data;
267 // Reset g_source handler..
268 if (ugd->g_source_multi_connect_next > 0) {
269 g_source_remove(ugd->g_source_multi_connect_next);
271 ugd->g_source_multi_connect_next = 0;
273 if (ugd->raw_multi_selected_peer_cnt > 0) {
274 ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_IN_PROGRESS;
275 for (i = 0; i < ugd->raw_multi_selected_peer_cnt; i++) {
276 if (ugd->raw_multi_selected_peers[i].conn_status == PEER_CONN_STATUS_WAIT_FOR_CONNECT) {
277 ugd->mac_addr_connecting = ugd->raw_multi_selected_peers[i].mac_addr;
278 res = wfd_client_connect(ugd->raw_multi_selected_peers[i].mac_addr);
280 ugd->raw_multi_selected_peers[i].conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT;
282 ugd->raw_multi_selected_peers[i].conn_status = PEER_CONN_STATUS_CONNECTING;
288 if (i >= ugd->raw_multi_selected_peer_cnt) {
289 // All selected peers are touched.
290 DBG(LOG_INFO, "Stop Multi Connect...\n");
291 wfd_stop_multi_connect(ugd);
294 DBG(LOG_INFO, "No selected peers.\n");
302 * This function let the ug call it when click 'connect' button in multi connect view
304 * @param[in] data the pointer to the main data structure
305 * @param[in] obj the pointer to the evas object
306 * @param[in] event_info the pointer to the event information
308 void _connect_btn_cb(void *data, Evas_Object *obj, void *event_info)
311 struct ug_data *ugd = (struct ug_data *)data;
313 char popup_text[MAX_POPUP_TEXT_SIZE] = {0};
314 device_type_s *peer = NULL;
316 peer = ugd->multi_conn_dev_list_start;
317 while (peer != NULL) {
318 if(peer->dev_sel_state) {
323 DBG(LOG_INFO, "MultiSelected Peer Count: %d", count);
325 /* if more than 7 device selected, show the popup */
326 if (count > MAX_CONNECTED_PEER_NUM) {
327 snprintf(popup_text, MAX_POPUP_TEXT_SIZE, _("IDS_ST_POP_YOU_CAN_CONNECT_UP_TO_PD_DEVICES_AT_THE_SAME_TIME"), MAX_CONNECTED_PEER_NUM);
328 wfd_ug_warn_popup(ugd, popup_text, POP_TYPE_MULTI_CONNECT_POPUP);
333 peer = ugd->multi_conn_dev_list_start;
335 while (peer != NULL) {
336 if(peer->dev_sel_state) {
337 DBG(LOG_INFO, "peer_name[%s] select state[%d]", peer->ssid, peer->dev_sel_state);
338 memcpy(&ugd->raw_multi_selected_peers[count], peer, sizeof(device_type_s));
339 ugd->raw_multi_selected_peers[count].conn_status = PEER_CONN_STATUS_WAIT_FOR_CONNECT;
345 DBG(LOG_INFO, "MultiSelected Peer Count2: %d", count);
346 ugd->raw_multi_selected_peer_cnt = count;
347 wfd_sort_multi_selected_peers(ugd);
348 wfd_cancel_progressbar_stop_timer(ugd);
349 wfd_cancel_not_alive_delete_timer(ugd);
351 /* start multi connection */
352 wfd_start_multi_connect(ugd);
354 elm_naviframe_item_pop(ugd->naviframe);
360 void wfd_naviframe_title_set(struct ug_data *ugd, const char *title)
362 if (!ugd || !ugd->multi_navi_item) {
363 DBG(LOG_ERROR, "The param is NULL\n");
367 elm_object_item_part_text_set(ugd->multi_navi_item, "default", title);
371 * This function let the ug call it when click the peer in multi connect view
373 * @param[in] data the pointer to the main data structure
374 * @param[in] obj the pointer to the evas object
375 * @param[in] event_info the pointer to the event information
377 static void _wfd_gl_multi_sel_cb(void *data, Evas_Object *obj, void *event_info)
384 Eina_Bool state = EINA_FALSE;
385 Evas_Object *chk_box = NULL;
386 const char *object_type = NULL;
387 struct ug_data *ugd = (struct ug_data *)wfd_get_ug_data();
388 device_type_s *peer = (device_type_s *)data;
391 DBG(LOG_ERROR, "ugd is NULL\n");
395 ugd->is_multi_check_all_selected = TRUE;
397 if(event_info != NULL) {
398 Evas_Object *content = elm_object_item_part_content_get(event_info, "elm.icon.2");
399 chk_box = elm_object_part_content_get(content, "elm.swallow.content");
400 state = elm_check_state_get(chk_box);
401 DBG(LOG_INFO, "state = %d \n", state);
402 if (chk_box == NULL) {
403 DBG(LOG_INFO, "Check box is null\n");
407 object_type = evas_object_type_get(obj);
408 if (g_strcmp0(object_type, "elm_genlist") == 0) {
409 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
411 elm_genlist_item_selected_set(item, EINA_FALSE);
413 DBG(LOG_INFO, "State elm_genlist %d\n", state);
414 elm_check_state_set(chk_box, !state);
415 peer->dev_sel_state = !state;
416 } else if (g_strcmp0(object_type, "elm_check") == 0){
417 DBG(LOG_INFO, "elm_check state; %d\n", peer->dev_sel_state);
418 peer->dev_sel_state = !peer->dev_sel_state;
421 DBG(LOG_INFO, "ptr->dev_sel_state = %d \n", peer->dev_sel_state);
422 DBG_SECURE(LOG_INFO, "ptr->peer.mac_addr = ["MACSECSTR"]\n",
423 MAC2SECSTR(peer->mac_addr));
425 peer = ugd->multi_conn_dev_list_start;
426 while (peer != NULL) {
427 if(peer->dev_sel_state) {
431 ugd->is_multi_check_all_selected = FALSE;
437 char title[MAX_POPUP_TEXT_SIZE] = {0};
438 snprintf(title, MAX_POPUP_TEXT_SIZE, _("IDS_ST_HEADER_PD_SELECTED"), sel_count);
439 wfd_naviframe_title_set(ugd, title);
441 wfd_naviframe_title_set(ugd, _("IDS_DLNA_HEADER_SELECT_DEVICES_ABB"));
444 state = elm_check_state_get(ugd->select_all_icon);
445 if (ugd->multiconn_layout) {
446 if (state != EINA_TRUE && ugd->is_multi_check_all_selected == TRUE) {
447 elm_check_state_set(ugd->select_all_icon, TRUE);
448 ugd->is_select_all_checked = TRUE;
449 } else if (ugd->is_multi_check_all_selected == FALSE) {
450 elm_check_state_set(ugd->select_all_icon, FALSE);
451 ugd->is_select_all_checked = FALSE;
453 wfd_ug_view_refresh_button(ugd->multiconn_conn_btn,
454 "IDS_WIFI_SK_CONNECT", is_sel);
461 * This function let the ug get the label of peer
462 * @return the label of peer
463 * @param[in] data the pointer to the main data structure
464 * @param[in] obj the pointer to the evas object
465 * @param[in] part the pointer to the part of item
467 static char *_wfd_gl_device_label_get(void *data, Evas_Object *obj, const char *part)
470 DBG(LOG_INFO, "part %s", part);
471 device_type_s *peer = (device_type_s *)data;
478 if (!g_strcmp0(part, "elm.text.main.left")) {
479 if (strlen(peer->ssid) != 0) {
480 ssid = elm_entry_utf8_to_markup(peer->ssid);
482 DBG(LOG_ERROR, "elm_entry_utf8_to_markup failed.\n");
494 * This function let the ug get the icon path of peer
495 * @return the icon path of titile
496 * @param[in] peer the pointer to the peer
498 static char *__wfd_get_device_icon_path(device_type_s *peer)
501 char *img_name = NULL;
503 switch (peer->category) {
504 case WFD_DEVICE_TYPE_COMPUTER:
505 img_name = WFD_ICON_DEVICE_COMPUTER;
507 case WFD_DEVICE_TYPE_INPUT_DEVICE:
508 img_name = WFD_ICON_DEVICE_INPUT_DEVICE;
510 case WFD_DEVICE_TYPE_PRINTER:
511 img_name = WFD_ICON_DEVICE_PRINTER;
513 case WFD_DEVICE_TYPE_CAMERA:
514 img_name = WFD_ICON_DEVICE_CAMERA;
516 case WFD_DEVICE_TYPE_STORAGE:
517 img_name = WFD_ICON_DEVICE_STORAGE;
519 case WFD_DEVICE_TYPE_NW_INFRA:
520 img_name = WFD_ICON_DEVICE_NETWORK_INFRA;
522 case WFD_DEVICE_TYPE_DISPLAYS:
523 img_name = WFD_ICON_DEVICE_DISPLAY;
525 case WFD_DEVICE_TYPE_MM_DEVICES:
526 img_name = WFD_ICON_DEVICE_MULTIMEDIA;
528 case WFD_DEVICE_TYPE_GAME_DEVICES:
529 img_name = WFD_ICON_DEVICE_GAMING;
531 case WFD_DEVICE_TYPE_TELEPHONE:
532 img_name = WFD_ICON_DEVICE_TELEPHONE;
534 case WFD_DEVICE_TYPE_AUDIO:
535 img_name = WFD_ICON_DEVICE_HEADSET;
538 img_name = WFD_ICON_DEVICE_UNKNOWN;
545 * This function let the ug get the icon of peer
546 * @return the icon of peer
547 * @param[in] data the pointer to the main data structure
548 * @param[in] obj the pointer to the evas object
549 * @param[in] part the pointer to the part of item
551 static Evas_Object *_wfd_gl_device_icon_get(void *data, Evas_Object *obj, const char *part)
554 char *img_name = NULL;
555 device_type_s *peer = (device_type_s *) data;
556 Evas_Object *icon = NULL;
557 Evas_Object *icon_layout = NULL;
560 DBG(LOG_INFO, "Part %s", part);
562 if (!g_strcmp0(part, "elm.icon.2")) {
563 icon_layout = elm_layout_add(obj);
564 elm_layout_theme_set(icon_layout, "layout", "list/C/type.2", "default");
565 DBG(LOG_INFO, "Part %s", part);
566 icon = elm_check_add(icon_layout);
567 elm_object_style_set(icon, "default/genlist");
568 evas_object_propagate_events_set(icon, EINA_FALSE);
569 if (peer->dev_sel_state == EINA_TRUE) {
570 elm_check_state_set(icon, EINA_TRUE);
572 evas_object_smart_callback_add(icon,
573 "changed", _wfd_gl_multi_sel_cb, (void *)data);
574 elm_layout_content_set(icon_layout, "elm.swallow.content", icon);
575 }else if (!g_strcmp0(part, "elm.icon.1")) {
576 DBG(LOG_INFO, "Part %s", part);
577 icon_layout = elm_layout_add(obj);
578 elm_layout_theme_set(icon_layout, "layout", "list/B/type.3", "default");
579 img_name = __wfd_get_device_icon_path(peer);
580 icon = elm_image_add(icon_layout);
581 elm_image_file_set(icon, WFD_UG_EDJ_PATH, img_name);
582 evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
583 evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
584 evas_object_color_set(icon, 2, 61, 132, 204);
585 evas_object_show(icon);
586 evas_object_propagate_events_set(icon, EINA_FALSE);
587 elm_layout_content_set(icon_layout, "elm.swallow.content", icon);
589 evas_object_show(icon_layout);
594 * This function let the ug call it when unresized event is received
596 static void _gl_unrealized(void *data, Evas_Object *obj, void *event_info)
599 struct ug_data *ugd = (struct ug_data *)data;
602 device_type_s *peer = NULL;
604 if (!ugd->multiconn_conn_btn) {
605 DBG(LOG_INFO, "popup naviframe, no need to update UI\n");
609 if (ugd->gl_available_dev_cnt_at_multiconn_view > 0) {
610 peer = ugd->multi_conn_dev_list_start;
611 while (peer != NULL) {
612 if(peer->dev_sel_state) {
621 char title[MAX_POPUP_TEXT_SIZE] = {0};
622 snprintf(title, MAX_POPUP_TEXT_SIZE, _("IDS_ST_HEADER_PD_SELECTED"), sel_count);
623 wfd_naviframe_title_set(ugd, title);
625 wfd_naviframe_title_set(ugd, _("IDS_DLNA_HEADER_SELECT_DEVICES_ABB"));
628 if (ugd->multiconn_conn_btn) {
629 wfd_ug_view_refresh_button(ugd->multiconn_conn_btn,
630 "IDS_WIFI_SK_CONNECT", is_sel);
637 * This function let the ug free the multi connect devices
639 * @param[in] data the pointer to the main data structure
641 int wfd_free_multiconnect_device(struct ug_data *ugd)
645 if (ugd->multiconn_view_genlist == NULL) {
649 ugd->gl_available_dev_cnt_at_multiconn_view = 0;
650 if (ugd->multi_conn_dev_list_start != NULL) {
651 wfd_ug_view_free_peer(ugd->multi_conn_dev_list_start);
652 ugd->multi_conn_dev_list_start = NULL;
660 * This function let the ug create "no device found" item
662 Evas_Object *_create_no_device_multiconnect_genlist(struct ug_data *ugd)
667 DBG(LOG_ERROR, "NULL parameters.\n");
671 if (!ugd->mcview_nodevice_item) {
672 ugd->mcview_nodevice_item = elm_genlist_item_append(ugd->multiconn_view_genlist, &noitem_itc, (void *)ugd, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
673 if(ugd->mcview_nodevice_item != NULL)
674 elm_genlist_item_select_mode_set(ugd->mcview_nodevice_item , ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
678 return ugd->multiconn_view_genlist;
682 * This function let the ug update the multi connect devices
684 * @param[in] data the pointer to the main data structure
686 int wfd_update_multiconnect_device(struct ug_data *ugd, bool is_free_all_peers)
691 device_type_s *device = NULL;
692 Evas_Object *genlist = NULL;
693 Elm_Object_Item *item = NULL;
696 genlist = ugd->multiconn_view_genlist;
697 if (ugd->multiconn_view_genlist == NULL) {
701 if (is_free_all_peers) {
702 wfd_free_multiconnect_device(ugd);
705 GList *iterator = NULL;
706 for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
707 device = (device_type_s *)iterator->data;
708 if (device->is_connected == FALSE && device->is_group_owner == FALSE) {
714 DBG(LOG_INFO, "There are No peers\n");
715 if (!ugd->mcview_title_item) {
716 ugd->mcview_title_item = elm_genlist_item_append(genlist, &multi_view_title_itc, ugd, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
717 if(ugd->mcview_title_item != NULL)
718 elm_genlist_item_select_mode_set(ugd->mcview_title_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
720 wfd_ug_view_refresh_glitem(ugd->mcview_title_item);
722 elm_check_state_set(ugd->select_all_icon, EINA_FALSE);
723 ugd->is_select_all_checked = FALSE;
724 wfd_free_multiconnect_device(ugd);
725 wfd_naviframe_title_set(ugd, _("IDS_DLNA_HEADER_SELECT_DEVICES_ABB"));
727 WFD_IF_DEL_ITEM(ugd->mcview_nodevice_item);
728 wfd_ug_view_refresh_glitem(ugd->mcview_title_item);
730 for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
731 device = (device_type_s *)iterator->data;
732 if (device->is_connected == FALSE && device->is_group_owner == FALSE) {
733 if (!find_peer_in_glist(ugd->multi_conn_dev_list_start, device->mac_addr)) {
734 item = get_insert_postion(device, ugd->mcview_title_item, ugd->gl_available_dev_cnt_at_multiconn_view);
735 res = insert_gl_item(genlist, item, &device_itc, &ugd->multi_conn_dev_list_start,
736 device, _wfd_gl_multi_sel_cb);
740 elm_check_state_set(ugd->select_all_icon, EINA_FALSE);
741 ugd->is_select_all_checked = FALSE;
743 ugd->gl_available_dev_cnt_at_multiconn_view++;
748 ugd->is_multi_check_all_selected = FALSE;
754 void wfd_genlist_select_all_check_changed_cb(void *data, Evas_Object * obj, void *event_info)
757 Elm_Object_Item *item = NULL;
758 Evas_Object *chk_box = NULL;
759 Evas_Object *content = NULL;
760 const char *object_type;
764 struct ug_data *ugd = (struct ug_data *)data;
765 if (NULL == ugd || NULL == obj) {
766 DBG(LOG_ERROR, "NULL parameters.\n");
770 if (ugd->multi_conn_dev_list_start == NULL) {
771 elm_genlist_item_selected_set(ugd->select_all_view_genlist, EINA_FALSE);
772 elm_check_state_set(ugd->select_all_icon, EINA_FALSE);
773 ugd->is_select_all_checked = FALSE;
775 DBG(LOG_INFO, "No devices in multi-connect view.\n");
779 device_type_s *peer = ugd->multi_conn_dev_list_start;
780 elm_genlist_item_selected_set(ugd->select_all_view_genlist, EINA_FALSE);
783 object_type = evas_object_type_get(obj);
784 if (g_strcmp0(object_type, "elm_genlist") == 0) {
785 state = elm_check_state_get(ugd->select_all_icon);
786 elm_check_state_set(ugd->select_all_icon, !state);
787 ugd->is_select_all_checked = !state;
790 state = elm_check_state_get(ugd->select_all_icon);
791 DBG(LOG_INFO, "state = %d",state);
792 if (state == EINA_TRUE) {
793 if (ugd->is_multi_check_all_selected == FALSE) {
795 while (peer != NULL) {
796 peer->dev_sel_state = TRUE;
797 item = peer->gl_item;
798 content = elm_object_item_part_content_get(item, "elm.icon.2");
799 chk_box = elm_object_part_content_get(content, "elm.swallow.content");
800 elm_check_state_set(chk_box, TRUE);
804 ugd->is_multi_check_all_selected = TRUE;
806 char title[MAX_POPUP_TEXT_SIZE] = {0};
807 snprintf(title, MAX_POPUP_TEXT_SIZE,
808 _("IDS_ST_HEADER_PD_SELECTED"), sel_count);
809 wfd_naviframe_title_set(ugd, title);
811 if (ugd->multiconn_layout) {
812 wfd_ug_view_refresh_button(ugd->multiconn_conn_btn,
813 "IDS_WIFI_SK_CONNECT", TRUE);
817 while (peer != NULL) {
818 peer->dev_sel_state = FALSE;
819 item = peer->gl_item;
820 content = elm_object_item_part_content_get(item, "elm.icon.2");
821 chk_box = elm_object_part_content_get(content, "elm.swallow.content");
822 elm_check_state_set(chk_box, FALSE);
825 ugd->is_multi_check_all_selected = FALSE;
826 wfd_naviframe_title_set(ugd,
827 _("IDS_DLNA_HEADER_SELECT_DEVICES_ABB"));
829 if (ugd->multiconn_layout) {
830 wfd_ug_view_refresh_button(ugd->multiconn_conn_btn,
831 "IDS_WIFI_SK_CONNECT", FALSE);
837 * This function let the ug call it when click 'scan' button
839 * @param[in] data the pointer to the main data structure
840 * @param[in] obj the pointer to the evas object
841 * @param[in] event_info the pointer to the event information
843 void _multi_scan_btn_cb(void *data, Evas_Object *obj, void *event_info)
847 const char *btn_text = NULL;
848 device_type_s *peer = NULL;
849 struct ug_data *ugd = (struct ug_data *) data;
852 DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
856 if (ugd->multiconn_conn_btn) {
857 peer = ugd->multi_conn_dev_list_start;
859 if(peer->dev_sel_state) {
860 wfd_ug_view_refresh_button(ugd->multiconn_conn_btn, "IDS_WIFI_SK_CONNECT", TRUE);
866 wfd_ug_view_refresh_button(ugd->multiconn_conn_btn, "IDS_WIFI_SK_CONNECT", FALSE);
870 btn_text = elm_object_text_get(ugd->multiconn_scan_stop_btn);
871 if (NULL == btn_text) {
872 DBG(LOG_ERROR, "Incorrect button text(NULL)\n");
876 if (0 == strcmp(btn_text, _("IDS_WIFI_SK4_SCAN"))) {
877 wfd_refresh_wifi_direct_state(ugd);
878 DBG(LOG_INFO, "Start discovery again, status: %d\n", ugd->wfd_status);
880 /* if connected, show the popup*/
881 if (ugd->wfd_status >= WIFI_DIRECT_STATE_CONNECTED) {
882 wfd_ug_act_popup(ugd, _("IDS_WIFI_BODY_CURRENT_CONNECTION_WILL_BE_DISCONNECTED_SO_THAT_SCANNING_CAN_START_CONTINUE_Q"), POP_TYPE_SCAN_AGAIN);
883 } else if (WIFI_DIRECT_STATE_DEACTIVATED == ugd->wfd_status) {
884 wfd_client_switch_on(ugd);
888 WFD_IF_DEL_ITEM(ugd->mcview_nodevice_item);
889 ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
890 ret = wifi_direct_start_discovery_specific_channel(false, 1, WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
891 if (ret != WIFI_DIRECT_ERROR_NONE) {
892 ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
893 DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", ret);
894 wifi_direct_cancel_discovery();
897 elm_object_domain_translatable_text_set(ugd->multiconn_scan_stop_btn,
898 PACKAGE, "IDS_WIFI_SK_STOP");
899 } else if (0 == strcmp(btn_text, _("IDS_WIFI_SK_STOP"))) {
900 DBG(LOG_INFO, "Stop pressed.\n");
901 ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_STOPPED;
902 wfd_cancel_progressbar_stop_timer(ugd);
903 wfd_delete_progressbar_cb(ugd);
904 wfd_cancel_not_alive_delete_timer(ugd);
912 * This function let the ug create the view for multi connection
914 * @param[in] ugd the pointer to the main data structure
916 void wfd_create_multiconnect_view(struct ug_data *ugd)
920 Evas_Object *genlist = NULL;
921 Elm_Object_Item *navi_item = NULL;
922 Evas_Object *btn1 = NULL;
923 Evas_Object *btn2 = NULL;
924 Evas_Object *layout = NULL;
927 DBG(LOG_ERROR, "Incorrect parameter(NULL)");
931 device_itc.item_style = "1line";
932 device_itc.func.text_get = _wfd_gl_device_label_get;
933 device_itc.func.content_get = _wfd_gl_device_icon_get;
934 device_itc.func.state_get = NULL;
935 device_itc.func.del = NULL;
938 layout = elm_layout_add(ugd->naviframe);
939 elm_layout_file_set(layout, WFD_UG_EDJ_PATH, "main_layout");
940 ugd->multiconn_layout = layout;
943 genlist = elm_genlist_add(ugd->multiconn_layout);
944 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
945 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
946 evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
947 evas_object_smart_callback_add(genlist, "unrealized", _gl_unrealized, ugd);
949 elm_object_part_content_set(layout, "elm.swallow.content", genlist);
950 elm_genlist_fx_mode_set(genlist, EINA_FALSE);
951 elm_genlist_homogeneous_set(genlist, EINA_TRUE);
952 #if defined(GENLIST_REALIZATION_MOTE_SET)
953 elm_genlist_realization_mode_set(genlist, TRUE);
956 ugd->multiconn_view_genlist = genlist;
957 ugd->mcview_title_item = NULL;
958 ugd->mcview_nodevice_item = NULL;
959 ugd->gl_available_dev_cnt_at_multiconn_view = 0;
960 evas_object_show(genlist);
962 navi_item = elm_naviframe_item_push(ugd->naviframe,
963 "IDS_DLNA_HEADER_SELECT_DEVICES_ABB", NULL, NULL, layout, NULL);
964 elm_object_item_domain_text_translatable_set(navi_item, PACKAGE, EINA_TRUE);
966 elm_naviframe_item_pop_cb_set(navi_item, _multiconnect_view_pop_cb, (void *)ugd);
967 ugd->select_all_view_genlist = elm_genlist_item_append(genlist,
968 &select_all_multi_connect_itc, ugd, NULL, ELM_GENLIST_ITEM_NONE,
969 wfd_genlist_select_all_check_changed_cb, (void *)ugd );
972 btn1 = elm_button_add(ugd->multiconn_layout);
973 elm_object_style_set(btn1, "bottom");
974 if (ugd->view_type && g_strcmp0(_(ugd->view_type),
975 _("IDS_WIFI_BUTTON_MULTI_CONNECT")) == 0) {
976 elm_object_domain_translatable_text_set(btn1, PACKAGE,
977 "IDS_WIFI_SK4_SCAN");
979 elm_object_domain_translatable_text_set(btn1, PACKAGE,
982 elm_object_part_content_set(ugd->multiconn_layout, "button.prev", btn1);
983 evas_object_smart_callback_add(btn1, "clicked",_multi_scan_btn_cb, (void *)ugd);
984 evas_object_show(btn1);
985 ugd->multiconn_scan_stop_btn = btn1;
987 btn2 = elm_button_add(ugd->multiconn_layout);
988 elm_object_style_set(btn2, "bottom");
989 elm_object_domain_translatable_text_set(btn2, PACKAGE,
990 "IDS_WIFI_SK_CONNECT");
991 elm_object_part_content_set(ugd->multiconn_layout, "button.next", btn2);
992 evas_object_smart_callback_add(btn2, "clicked",_connect_btn_cb, (void *)ugd);
993 evas_object_show(btn2);
994 ugd->multiconn_conn_btn = btn2;
995 elm_object_disabled_set(ugd->multiconn_conn_btn, EINA_TRUE);
997 ugd->multi_navi_item = navi_item;
999 wfd_update_multiconnect_device(ugd, true);