4 * Copyright 2012 Samsung Electronics Co., Ltd
6 * Licensed under the Flora License, Version 1.1 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
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>
28 #include "wfd_ug_view.h"
29 #include "wfd_client.h"
31 Elm_Gen_Item_Class device_itc;
34 * This function let the ug call it when click 'back' button in multi connect view
36 * @param[in] data the pointer to the main data structure
37 * @param[in] obj the pointer to the evas object
38 * @param[in] event_info the pointer to the event information
40 Eina_Bool _multiconnect_view_pop_cb(void *data, Elm_Object_Item *it)
43 struct ug_data *ugd = (struct ug_data *)data;
45 device_type_s *peer_for_free = NULL;
46 device_type_s *peer = NULL;
49 DBG(LOG_ERROR, "The param is NULL\n");
53 peer = ugd->multi_conn_dev_list_start;
55 while (peer != NULL) {
56 DBG(LOG_INFO, "Free peer, ssid:%s\n", peer->ssid);
63 ugd->multi_conn_dev_list_start = NULL;
64 ugd->multiconn_view_genlist = NULL;
65 ugd->mcview_title_item = NULL;
66 ugd->mcview_nodevice_item = NULL;
67 ugd->multi_navi_item = NULL;
68 ugd->multiconn_conn_btn = NULL;
69 ugd->multiconn_layout = NULL;
70 ugd->multiconn_scan_stop_btn = NULL;
72 DBG(LOG_INFO, "MultiConnectMode: %d\n", ugd->multi_connect_mode);
74 /* if pressing connect for multi-connecting, it should not start discovery again */
75 if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_NONE) {
76 if (ugd->view_type == NULL) {
77 ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
78 DBG(LOG_INFO, "Discovery started\n");
79 ret = wifi_direct_start_discovery_specific_channel(false, 1,
80 WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
81 if (ret != WIFI_DIRECT_ERROR_NONE) {
82 ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
83 DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", ret);
84 wifi_direct_cancel_discovery();
86 } else if (g_strcmp0(D_(ugd->view_type),
87 D_("IDS_WIFI_BUTTON_MULTI_CONNECT")) == 0) {
88 DBG(LOG_INFO, "Discovery not started\n");
89 ug_destroy_me(ugd->ug);
98 * This function let the ug reset the connected failed peers
100 * @param[in] event_info the pointer to the event information
102 gboolean __wfd_multi_connect_reset_cb(void *data)
107 DBG(LOG_ERROR, "The param is NULL\n");
111 device_type_s *peer = NULL;
112 struct ug_data *ugd = (struct ug_data *)data;
114 peer = ugd->gl_mul_conn_peers_start;
115 while (peer != NULL) {
116 elm_object_item_del(peer->gl_item);
117 peer->gl_item = NULL;
121 WFD_IF_DEL_ITEM(ugd->multi_connect_wfd_item);
122 WFD_IF_DEL_ITEM(ugd->multi_connect_sep_item);
124 wfd_ug_update_available_peers(ugd);
131 * This function let the ug free the selected peers in multi connect view
133 * @param[in] data the pointer to the main data structure
135 void wfd_free_multi_selected_peers(void *data)
140 struct ug_data *ugd = (struct ug_data *)data;
142 /* destroy the created group */
143 wifi_direct_destroy_group();
145 /* release the selected peers */
146 for (i = 0; i < ugd->raw_multi_selected_peer_cnt; i++)
147 memset(&ugd->raw_multi_selected_peers[i], 0x00, sizeof(device_type_s));
149 ugd->raw_multi_selected_peer_cnt = 0;
150 ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_NONE;
157 * This function let the ug stop to connect to selected peer
158 * @return If success, return 0, else return -1
159 * @param[in] data the pointer to the main data structure
161 int wfd_stop_multi_connect(void *data)
164 struct ug_data *ugd = (struct ug_data *)data;
166 if (ugd->act_popup) {
167 evas_object_del(ugd->act_popup);
168 ugd->act_popup = NULL;
171 /* change the title of failed peers */
172 ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_COMPLETED;
173 wfd_ug_view_refresh_glitem(ugd->multi_connect_wfd_item);
174 wfd_ug_update_toolbar(ugd);
176 if (ugd->gl_connected_peer_cnt > 0)
177 wfd_client_set_p2p_group_owner_intent(7);
179 wifi_direct_destroy_group();
181 if (ugd->timer_multi_reset > 0)
182 g_source_remove(ugd->timer_multi_reset);
184 /* after 30s, remove the failed peers */
185 ugd->timer_multi_reset = g_timeout_add(30000 /*ms*/,
186 __wfd_multi_connect_reset_cb, ugd);
188 if (ugd->g_source_multi_connect_next > 0)
189 g_source_remove(ugd->g_source_multi_connect_next);
191 ugd->g_source_multi_connect_next = 0;
193 /*when multi-connect end and auto_exit is true, exit UG*/
194 if (ugd->is_auto_exit)
195 _wfd_ug_auto_exit(ugd);
202 * This function let the ug start to connect the selected peers
203 * @return If success, return 0, else return -1
204 * @param[in] data the pointer to the main data structure
206 int wfd_start_multi_connect(void *data)
209 struct ug_data *ugd = (struct ug_data *)data;
212 if (ugd->raw_multi_selected_peer_cnt > 0) {
213 ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_IN_PROGRESS;
215 res = wfd_client_group_add();
217 DBG(LOG_ERROR, "Failed to add group");
218 wfd_free_multi_selected_peers(ugd);
224 DBG(LOG_INFO, "No selected peers.\n");
232 void wfd_sort_multi_selected_peers(struct ug_data *ugd)
239 for (i = 0; i < ugd->raw_multi_selected_peer_cnt; i++) {
240 for (j = 0; j < ugd->raw_multi_selected_peer_cnt-i-1; j++) {
241 if (strcasecmp(ugd->raw_multi_selected_peers[j].ssid, ugd->raw_multi_selected_peers[j + 1].ssid) > 0) {
242 peer = ugd->raw_multi_selected_peers[j];
243 ugd->raw_multi_selected_peers[j] = ugd->raw_multi_selected_peers[j + 1];
244 ugd->raw_multi_selected_peers[j + 1] = peer;
252 * This function let the ug connect to the next selected peer automatically
253 * @return If stop the timer, return false, else return true
254 * @param[in] data the pointer to the main data structure
256 gboolean wfd_multi_connect_next_cb(void *data)
259 struct ug_data *ugd = (struct ug_data *)data;
263 // Reset g_source handler..
264 if (ugd->g_source_multi_connect_next > 0)
265 g_source_remove(ugd->g_source_multi_connect_next);
267 ugd->g_source_multi_connect_next = 0;
269 if (ugd->raw_multi_selected_peer_cnt > 0) {
270 ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_IN_PROGRESS;
271 for (i = 0; i < ugd->raw_multi_selected_peer_cnt; i++) {
272 if (ugd->raw_multi_selected_peers[i].conn_status == PEER_CONN_STATUS_WAIT_FOR_CONNECT) {
273 ugd->mac_addr_connecting = ugd->raw_multi_selected_peers[i].mac_addr;
274 res = wfd_client_connect(ugd->raw_multi_selected_peers[i].mac_addr);
276 ugd->raw_multi_selected_peers[i].conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT;
278 ugd->raw_multi_selected_peers[i].conn_status = PEER_CONN_STATUS_CONNECTING;
284 if (i >= ugd->raw_multi_selected_peer_cnt) {
285 // All selected peers are touched.
286 DBG(LOG_INFO, "Stop Multi Connect...\n");
287 wfd_stop_multi_connect(ugd);
290 DBG(LOG_INFO, "No selected peers.\n");
298 * This function let the ug call it when click 'connect' button in multi connect view
300 * @param[in] data the pointer to the main data structure
301 * @param[in] obj the pointer to the evas object
302 * @param[in] event_info the pointer to the event information
304 void _connect_btn_cb(void *data, Evas_Object *obj, void *event_info)
307 struct ug_data *ugd = (struct ug_data *)data;
309 char popup_text[MAX_POPUP_TEXT_SIZE] = {0};
310 device_type_s *peer = NULL;
311 char *format_str = NULL;
313 peer = ugd->multi_conn_dev_list_start;
314 while (peer != NULL) {
315 if (peer->dev_sel_state)
320 DBG(LOG_INFO, "MultiSelected Peer Count: %d", count);
322 /* if more than 7 device selected, show the popup */
323 if (count > MAX_CONNECTED_PEER_NUM) {
324 format_str = D_("IDS_ST_POP_YOU_CAN_CONNECT_UP_TO_PD_DEVICES_AT_THE_SAME_TIME");
325 snprintf(popup_text, MAX_POPUP_TEXT_SIZE, format_str, MAX_CONNECTED_PEER_NUM);
326 wfd_ug_warn_popup(ugd, popup_text, POP_TYPE_MULTI_CONNECT_POPUP);
331 peer = ugd->multi_conn_dev_list_start;
333 while (peer != NULL) {
334 if (peer->dev_sel_state) {
335 DBG(LOG_INFO, "peer_name[%s] select state[%d]", peer->ssid, peer->dev_sel_state);
336 memcpy(&ugd->raw_multi_selected_peers[count], peer, sizeof(device_type_s));
337 ugd->raw_multi_selected_peers[count].conn_status = PEER_CONN_STATUS_WAIT_FOR_CONNECT;
343 DBG(LOG_INFO, "MultiSelected Peer Count2: %d", count);
344 ugd->raw_multi_selected_peer_cnt = count;
345 wfd_sort_multi_selected_peers(ugd);
346 wfd_cancel_progressbar_stop_timer(ugd);
347 wfd_cancel_not_alive_delete_timer(ugd);
349 /* start multi connection */
350 wfd_start_multi_connect(ugd);
352 elm_naviframe_item_pop(ugd->naviframe);
358 void wfd_naviframe_title_set(struct ug_data *ugd, const char *title)
360 if (!ugd || !ugd->multi_navi_item) {
361 DBG(LOG_ERROR, "The param is NULL\n");
365 elm_object_item_part_text_set(ugd->multi_navi_item, "default", title);
369 * This function let the ug call it when click the peer in multi connect view
371 * @param[in] data the pointer to the main data structure
372 * @param[in] obj the pointer to the evas object
373 * @param[in] event_info the pointer to the event information
375 static void _wfd_gl_multi_sel_cb(void *data, Evas_Object *obj, void *event_info)
382 Eina_Bool state = EINA_FALSE;
383 Evas_Object *chk_box = NULL;
384 const char *object_type = NULL;
385 struct ug_data *ugd = (struct ug_data *)wfd_get_ug_data();
386 device_type_s *peer = (device_type_s *)data;
387 char *format_str = NULL;
390 DBG(LOG_ERROR, "ugd is NULL\n");
394 ugd->is_multi_check_all_selected = TRUE;
396 if (event_info != NULL) {
397 Evas_Object *content = elm_object_item_part_content_get(event_info, "elm.icon.2");
398 chk_box = elm_object_part_content_get(content, "elm.swallow.content");
399 state = elm_check_state_get(chk_box);
400 DBG(LOG_INFO, "state = %d \n", state);
402 DBG(LOG_INFO, "Check box is null\n");
405 object_type = evas_object_type_get(obj);
406 if (g_strcmp0(object_type, "elm_genlist") == 0) {
407 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
409 elm_genlist_item_selected_set(item, EINA_FALSE);
411 DBG(LOG_INFO, "State elm_genlist %d\n", state);
412 elm_check_state_set(chk_box, !state);
413 peer->dev_sel_state = !state;
414 } else if (g_strcmp0(object_type, "elm_check") == 0) {
415 DBG(LOG_INFO, "elm_check state; %d\n", peer->dev_sel_state);
416 peer->dev_sel_state = !peer->dev_sel_state;
419 DBG(LOG_INFO, "ptr->dev_sel_state = %d \n", peer->dev_sel_state);
420 DBG_SECURE(LOG_INFO, "ptr->peer.mac_addr = ["MACSECSTR"]\n",
421 MAC2SECSTR(peer->mac_addr));
423 peer = ugd->multi_conn_dev_list_start;
424 while (peer != NULL) {
425 if (peer->dev_sel_state) {
429 ugd->is_multi_check_all_selected = FALSE;
435 char title[MAX_POPUP_TEXT_SIZE] = {0};
436 format_str = D_("IDS_ST_HEADER_PD_SELECTED");
437 snprintf(title, MAX_POPUP_TEXT_SIZE, format_str, sel_count);
438 wfd_naviframe_title_set(ugd, title);
440 wfd_naviframe_title_set(ugd, D_("IDS_DLNA_HEADER_SELECT_DEVICES_ABB"));
443 state = elm_check_state_get(ugd->select_all_icon);
444 if (ugd->multiconn_layout) {
445 if (state != EINA_TRUE && ugd->is_multi_check_all_selected == TRUE) {
446 elm_check_state_set(ugd->select_all_icon, TRUE);
447 ugd->is_select_all_checked = TRUE;
448 } else if (ugd->is_multi_check_all_selected == FALSE) {
449 elm_check_state_set(ugd->select_all_icon, FALSE);
450 ugd->is_select_all_checked = FALSE;
452 wfd_ug_view_refresh_button(ugd->multiconn_conn_btn,
453 "IDS_WIFI_SK_CONNECT", is_sel);
460 * This function let the ug get the label of peer
461 * @return the label of peer
462 * @param[in] data the pointer to the main data structure
463 * @param[in] obj the pointer to the evas object
464 * @param[in] part the pointer to the part of item
466 static char *_wfd_gl_device_label_get(void *data, Evas_Object *obj, const char *part)
469 DBG(LOG_INFO, "part %s", part);
470 device_type_s *peer = (device_type_s *)data;
476 if (!strcmp("elm.text", part)) {
477 if (strlen(peer->ssid) != 0) {
478 ssid = elm_entry_utf8_to_markup(peer->ssid);
480 DBG(LOG_ERROR, "elm_entry_utf8_to_markup failed.\n");
492 * This function let the ug get the icon path of peer
493 * @return the icon path of titile
494 * @param[in] peer the pointer to the peer
496 static char *__wfd_get_device_icon_path(device_type_s *peer)
499 char *img_name = NULL;
501 switch (peer->category) {
502 case WFD_DEVICE_TYPE_COMPUTER:
503 img_name = WFD_ICON_DEVICE_COMPUTER;
505 case WFD_DEVICE_TYPE_INPUT_DEVICE:
506 img_name = WFD_ICON_DEVICE_INPUT_DEVICE;
508 case WFD_DEVICE_TYPE_PRINTER:
509 img_name = WFD_ICON_DEVICE_PRINTER;
511 case WFD_DEVICE_TYPE_CAMERA:
512 img_name = WFD_ICON_DEVICE_CAMERA;
514 case WFD_DEVICE_TYPE_STORAGE:
515 img_name = WFD_ICON_DEVICE_STORAGE;
517 case WFD_DEVICE_TYPE_NW_INFRA:
518 img_name = WFD_ICON_DEVICE_NETWORK_INFRA;
520 case WFD_DEVICE_TYPE_DISPLAYS:
521 img_name = WFD_ICON_DEVICE_DISPLAY;
523 case WFD_DEVICE_TYPE_MM_DEVICES:
524 img_name = WFD_ICON_DEVICE_MULTIMEDIA;
526 case WFD_DEVICE_TYPE_GAME_DEVICES:
527 img_name = WFD_ICON_DEVICE_GAMING;
529 case WFD_DEVICE_TYPE_TELEPHONE:
530 img_name = WFD_ICON_DEVICE_TELEPHONE;
532 case WFD_DEVICE_TYPE_AUDIO:
533 img_name = WFD_ICON_DEVICE_HEADSET;
536 img_name = WFD_ICON_DEVICE_UNKNOWN;
543 * This function let the ug get the icon of peer
544 * @return the icon of peer
545 * @param[in] data the pointer to the main data structure
546 * @param[in] obj the pointer to the evas object
547 * @param[in] part the pointer to the part of item
549 static Evas_Object *_wfd_gl_device_icon_get(void *data, Evas_Object *obj, const char *part)
552 char *img_name = NULL;
553 device_type_s *peer = (device_type_s *) data;
554 Evas_Object *icon = NULL;
555 Evas_Object *icon_layout = NULL;
557 DBG(LOG_INFO, "Part %s", part);
559 if (!strcmp("elm.swallow.icon", part)) {
560 DBG(LOG_INFO, "Part %s", part);
561 icon_layout = elm_layout_add(obj);
562 elm_layout_theme_set(icon_layout, "layout", "list/B/type.3", "default");
563 img_name = __wfd_get_device_icon_path(peer);
564 icon = elm_image_add(icon_layout);
565 elm_image_file_set(icon, WFD_UG_EDJ_PATH, img_name);
566 evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
567 evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
568 evas_object_color_set(icon, 2, 61, 132, 204);
569 evas_object_show(icon);
570 evas_object_propagate_events_set(icon, EINA_FALSE);
571 elm_layout_content_set(icon_layout, "elm.swallow.content", icon);
572 } else if (!strcmp("elm.swallow.end", part)) {
573 icon_layout = elm_layout_add(obj);
574 elm_layout_theme_set(icon_layout, "layout", "list/C/type.2", "default");
575 DBG(LOG_INFO, "Part %s", part);
576 icon = elm_check_add(icon_layout);
577 elm_object_style_set(icon, "default/genlist");
578 evas_object_propagate_events_set(icon, EINA_FALSE);
579 if (peer->dev_sel_state == EINA_TRUE)
580 elm_check_state_set(icon, EINA_TRUE);
582 evas_object_smart_callback_add(icon,
583 "changed", _wfd_gl_multi_sel_cb, (void *)data);
584 elm_layout_content_set(icon_layout, "elm.swallow.content", icon);
588 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;
603 char *format_str = NULL;
605 if (!ugd->multiconn_conn_btn) {
606 DBG(LOG_INFO, "popup naviframe, no need to update UI\n");
610 if (ugd->gl_available_dev_cnt_at_multiconn_view > 0) {
611 peer = ugd->multi_conn_dev_list_start;
612 while (peer != NULL) {
613 if (peer->dev_sel_state) {
622 char title[MAX_POPUP_TEXT_SIZE] = {0};
623 format_str = D_("IDS_ST_HEADER_PD_SELECTED");
624 snprintf(title, MAX_POPUP_TEXT_SIZE, format_str, sel_count);
625 wfd_naviframe_title_set(ugd, title);
627 wfd_naviframe_title_set(ugd, D_("IDS_DLNA_HEADER_SELECT_DEVICES_ABB"));
630 if (ugd->multiconn_conn_btn) {
631 wfd_ug_view_refresh_button(ugd->multiconn_conn_btn,
632 "IDS_WIFI_SK_CONNECT", is_sel);
639 * This function let the ug free the multi connect devices
641 * @param[in] data the pointer to the main data structure
643 int wfd_free_multiconnect_device(struct ug_data *ugd)
647 if (ugd->multiconn_view_genlist == NULL)
650 ugd->gl_available_dev_cnt_at_multiconn_view = 0;
651 if (ugd->multi_conn_dev_list_start != NULL) {
652 wfd_ug_view_free_peer(ugd->multi_conn_dev_list_start);
653 ugd->multi_conn_dev_list_start = NULL;
661 * This function let the ug create "no device found" item
663 Evas_Object *_create_no_device_multiconnect_genlist(struct ug_data *ugd)
668 DBG(LOG_ERROR, "NULL parameters.\n");
672 if (!ugd->mcview_nodevice_item) {
673 ugd->mcview_nodevice_item = elm_genlist_item_append(ugd->multiconn_view_genlist, &noitem_itc, (void *)ugd, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
674 if (ugd->mcview_nodevice_item != NULL)
675 elm_genlist_item_select_mode_set(ugd->mcview_nodevice_item , ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
679 return ugd->multiconn_view_genlist;
683 * This function let the ug update the multi connect devices
685 * @param[in] data the pointer to the main data structure
687 int wfd_update_multiconnect_device(struct ug_data *ugd, bool is_free_all_peers)
692 device_type_s *device = NULL;
693 Evas_Object *genlist = NULL;
694 Elm_Object_Item *item = NULL;
697 genlist = ugd->multiconn_view_genlist;
698 if (ugd->multiconn_view_genlist == NULL)
701 if (is_free_all_peers)
702 wfd_free_multiconnect_device(ugd);
704 GList *iterator = NULL;
705 for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
706 device = (device_type_s *)iterator->data;
707 if (device->is_connected == FALSE && device->is_group_owner == FALSE)
712 DBG(LOG_INFO, "There are No peers\n");
713 if (!ugd->mcview_title_item) {
714 ugd->mcview_title_item = elm_genlist_item_append(genlist, &multi_view_title_itc, ugd, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
715 if (ugd->mcview_title_item != NULL)
716 elm_genlist_item_select_mode_set(ugd->mcview_title_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
718 wfd_ug_view_refresh_glitem(ugd->mcview_title_item);
720 elm_check_state_set(ugd->select_all_icon, EINA_FALSE);
721 ugd->is_select_all_checked = FALSE;
722 wfd_free_multiconnect_device(ugd);
723 wfd_naviframe_title_set(ugd, D_("IDS_DLNA_HEADER_SELECT_DEVICES_ABB"));
725 WFD_IF_DEL_ITEM(ugd->mcview_nodevice_item);
726 wfd_ug_view_refresh_glitem(ugd->mcview_title_item);
728 for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
729 device = (device_type_s *)iterator->data;
730 if (device->is_connected == FALSE && device->is_group_owner == FALSE) {
731 if (!find_peer_in_glist(ugd->multi_conn_dev_list_start, device->mac_addr)) {
732 item = get_insert_postion(device, ugd->mcview_title_item, ugd->gl_available_dev_cnt_at_multiconn_view);
733 res = insert_gl_item(genlist, item, &device_itc, &ugd->multi_conn_dev_list_start,
734 device, _wfd_gl_multi_sel_cb);
738 elm_check_state_set(ugd->select_all_icon, EINA_FALSE);
739 ugd->is_select_all_checked = FALSE;
741 ugd->gl_available_dev_cnt_at_multiconn_view++;
746 ugd->is_multi_check_all_selected = FALSE;
752 void wfd_genlist_select_all_check_changed_cb(void *data, Evas_Object * obj, void *event_info)
755 Elm_Object_Item *item = NULL;
756 Evas_Object *chk_box = NULL;
757 Evas_Object *content = NULL;
758 const char *object_type;
760 char *format_str = NULL;
763 struct ug_data *ugd = (struct ug_data *)data;
764 if (NULL == ugd || NULL == obj) {
765 DBG(LOG_ERROR, "NULL parameters.\n");
769 if (ugd->multi_conn_dev_list_start == NULL) {
770 elm_genlist_item_selected_set(ugd->select_all_view_genlist, EINA_FALSE);
771 elm_check_state_set(ugd->select_all_icon, EINA_FALSE);
772 ugd->is_select_all_checked = FALSE;
774 DBG(LOG_INFO, "No devices in multi-connect view.\n");
778 device_type_s *peer = ugd->multi_conn_dev_list_start;
779 elm_genlist_item_selected_set(ugd->select_all_view_genlist, EINA_FALSE);
782 object_type = evas_object_type_get(obj);
783 if (g_strcmp0(object_type, "elm_genlist") == 0) {
784 state = elm_check_state_get(ugd->select_all_icon);
785 elm_check_state_set(ugd->select_all_icon, !state);
786 ugd->is_select_all_checked = !state;
789 state = elm_check_state_get(ugd->select_all_icon);
790 DBG(LOG_INFO, "state = %d", state);
791 if (state == EINA_TRUE) {
792 if (ugd->is_multi_check_all_selected == FALSE) {
794 while (peer != NULL) {
795 peer->dev_sel_state = TRUE;
796 item = peer->gl_item;
797 content = elm_object_item_part_content_get(item, "elm.icon.2");
798 chk_box = elm_object_part_content_get(content, "elm.swallow.content");
799 elm_check_state_set(chk_box, TRUE);
803 ugd->is_multi_check_all_selected = TRUE;
805 char title[MAX_POPUP_TEXT_SIZE] = {0};
806 format_str = D_("IDS_ST_HEADER_PD_SELECTED");
807 snprintf(title, MAX_POPUP_TEXT_SIZE, format_str, sel_count);
808 wfd_naviframe_title_set(ugd, title);
810 if (ugd->multiconn_layout) {
811 wfd_ug_view_refresh_button(ugd->multiconn_conn_btn,
812 "IDS_WIFI_SK_CONNECT", TRUE);
816 while (peer != NULL) {
817 peer->dev_sel_state = FALSE;
818 item = peer->gl_item;
819 content = elm_object_item_part_content_get(item, "elm.icon.2");
820 chk_box = elm_object_part_content_get(content, "elm.swallow.content");
821 elm_check_state_set(chk_box, FALSE);
824 ugd->is_multi_check_all_selected = FALSE;
825 wfd_naviframe_title_set(ugd,
826 D_("IDS_DLNA_HEADER_SELECT_DEVICES_ABB"));
828 if (ugd->multiconn_layout) {
829 wfd_ug_view_refresh_button(ugd->multiconn_conn_btn,
830 "IDS_WIFI_SK_CONNECT", FALSE);
836 * This function let the ug call it when click 'scan' button
838 * @param[in] data the pointer to the main data structure
839 * @param[in] obj the pointer to the evas object
840 * @param[in] event_info the pointer to the event information
842 void _multi_scan_btn_cb(void *data, Evas_Object *obj, void *event_info)
846 const char *btn_text = NULL;
847 device_type_s *peer = NULL;
848 struct ug_data *ugd = (struct ug_data *) data;
851 DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
855 if (ugd->multiconn_conn_btn) {
856 peer = ugd->multi_conn_dev_list_start;
858 if (peer->dev_sel_state) {
859 wfd_ug_view_refresh_button(ugd->multiconn_conn_btn, "IDS_WIFI_SK_CONNECT", TRUE);
865 wfd_ug_view_refresh_button(ugd->multiconn_conn_btn, "IDS_WIFI_SK_CONNECT", FALSE);
868 btn_text = elm_object_text_get(ugd->multiconn_scan_stop_btn);
869 if (NULL == btn_text) {
870 DBG(LOG_ERROR, "Incorrect button text(NULL)\n");
874 if (0 == strcmp(btn_text, D_("IDS_WIFI_SK4_SCAN"))) {
875 wfd_refresh_wifi_direct_state(ugd);
876 DBG(LOG_INFO, "Start discovery again, status: %d\n", ugd->wfd_status);
878 /* if connected, show the popup*/
879 if (ugd->wfd_status >= WIFI_DIRECT_STATE_CONNECTED) {
880 wfd_ug_act_popup(ugd, D_("IDS_WIFI_BODY_CURRENT_CONNECTION_WILL_BE_DISCONNECTED_SO_THAT_SCANNING_CAN_START_CONTINUE_Q"), POP_TYPE_SCAN_AGAIN);
881 } else if (WIFI_DIRECT_STATE_DEACTIVATED == ugd->wfd_status) {
882 wfd_client_switch_on(ugd);
886 WFD_IF_DEL_ITEM(ugd->mcview_nodevice_item);
887 ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
888 ret = wifi_direct_start_discovery_specific_channel(false, 1, WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
889 if (ret != WIFI_DIRECT_ERROR_NONE) {
890 ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
891 DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", ret);
892 wifi_direct_cancel_discovery();
895 elm_object_domain_translatable_text_set(ugd->multiconn_scan_stop_btn,
896 PACKAGE, "IDS_WIFI_SK_STOP");
897 } else if (0 == strcmp(btn_text, D_("IDS_WIFI_SK_STOP"))) {
898 DBG(LOG_INFO, "Stop pressed.\n");
899 ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_STOPPED;
900 wfd_cancel_progressbar_stop_timer(ugd);
901 wfd_delete_progressbar_cb(ugd);
902 wfd_cancel_not_alive_delete_timer(ugd);
910 * This function let the ug create the view for multi connection
912 * @param[in] ugd the pointer to the main data structure
914 void wfd_create_multiconnect_view(struct ug_data *ugd)
918 Evas_Object *genlist = NULL;
919 Elm_Object_Item *navi_item = NULL;
920 Evas_Object *btn1 = NULL;
921 Evas_Object *btn2 = NULL;
922 Evas_Object *layout = NULL;
925 DBG(LOG_ERROR, "Incorrect parameter(NULL)");
929 device_itc.item_style = WFD_GENLIST_1LINE_TEXT_ICON_STYLE;
930 device_itc.func.text_get = _wfd_gl_device_label_get;
931 device_itc.func.content_get = _wfd_gl_device_icon_get;
932 device_itc.func.state_get = NULL;
933 device_itc.func.del = NULL;
936 layout = elm_layout_add(ugd->naviframe);
937 elm_layout_file_set(layout, WFD_UG_EDJ_PATH, "bottom_btn");
938 ugd->multiconn_layout = layout;
941 genlist = elm_genlist_add(ugd->multiconn_layout);
942 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
943 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
944 evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
945 evas_object_smart_callback_add(genlist, "unrealized", _gl_unrealized, ugd);
947 elm_object_part_content_set(layout, "elm.swallow.content", genlist);
948 elm_genlist_homogeneous_set(genlist, EINA_TRUE);
949 #if defined(GENLIST_REALIZATION_MOTE_SET)
950 elm_genlist_realization_mode_set(genlist, TRUE);
953 ugd->multiconn_view_genlist = genlist;
954 ugd->mcview_title_item = NULL;
955 ugd->mcview_nodevice_item = NULL;
956 ugd->gl_available_dev_cnt_at_multiconn_view = 0;
957 evas_object_show(genlist);
959 navi_item = elm_naviframe_item_push(ugd->naviframe,
960 "IDS_DLNA_HEADER_SELECT_DEVICES_ABB", NULL, NULL, layout, NULL);
961 elm_object_item_domain_text_translatable_set(navi_item, PACKAGE, EINA_TRUE);
963 elm_naviframe_item_pop_cb_set(navi_item, _multiconnect_view_pop_cb, (void *)ugd);
964 ugd->select_all_view_genlist = elm_genlist_item_append(genlist,
965 &select_all_multi_connect_itc, ugd, NULL, ELM_GENLIST_ITEM_NONE,
966 wfd_genlist_select_all_check_changed_cb, (void *)ugd);
969 btn1 = elm_button_add(ugd->multiconn_layout);
970 elm_object_style_set(btn1, "bottom");
971 if (ugd->view_type && g_strcmp0(D_(ugd->view_type),
972 D_("IDS_WIFI_BUTTON_MULTI_CONNECT")) == 0) {
973 elm_object_domain_translatable_text_set(btn1, PACKAGE,
974 "IDS_WIFI_SK4_SCAN");
976 elm_object_domain_translatable_text_set(btn1, PACKAGE,
979 elm_object_part_content_set(ugd->multiconn_layout, "button.prev", btn1);
980 evas_object_smart_callback_add(btn1, "clicked", _multi_scan_btn_cb, (void *)ugd);
981 evas_object_show(btn1);
982 ugd->multiconn_scan_stop_btn = btn1;
984 btn2 = elm_button_add(ugd->multiconn_layout);
985 elm_object_style_set(btn2, "bottom");
986 elm_object_domain_translatable_text_set(btn2, PACKAGE,
987 "IDS_WIFI_SK_CONNECT");
988 elm_object_part_content_set(ugd->multiconn_layout, "button.next", btn2);
989 evas_object_smart_callback_add(btn2, "clicked", _connect_btn_cb, (void *)ugd);
990 evas_object_show(btn2);
991 ugd->multiconn_conn_btn = btn2;
992 elm_object_disabled_set(ugd->multiconn_conn_btn, EINA_TRUE);
994 ugd->multi_navi_item = navi_item;
996 wfd_update_multiconnect_device(ugd, true);