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.
25 #include <Elementary.h>
27 #include <ui-gadget-module.h>
28 #include <wifi-direct.h>
31 #include "wfd_ug_view.h"
32 #include "wfd_client.h"
34 Elm_Gen_Item_Class select_all_itc;
35 Elm_Gen_Item_Class device_itc;
38 void _multiconnect_view_back_btn_cb(void *data, Evas_Object * obj, void *event_info)
41 struct ug_data *ugd = (struct ug_data*) data;
45 DBG(LOG_ERROR, "The param is NULL\n");
49 ugd->multiconn_view_genlist = NULL;
50 elm_naviframe_item_pop(ugd->naviframe);
56 void reset_multi_conn_dev_list(void *data)
58 struct ug_data *ugd = (struct ug_data*) data;
60 for (i = 0; i < MAX_PEER_NUM; i++)
62 ugd->multi_conn_dev_list[i].dev_sel_state = FALSE;
63 ugd->multi_conn_dev_list[i].peer.gl_item = NULL;
65 ugd->gl_available_dev_cnt_at_multiconn_view = 0;
68 gboolean __wfd_multi_connect_reset_cb(void *data)
71 struct ug_data *ugd = (struct ug_data*) data;
73 ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_NONE;
74 ugd->raw_multi_selected_peer_cnt = 0;
75 wfd_ug_view_update_peers(ugd);
81 int wfd_stop_multi_connect(void *data)
84 struct ug_data *ugd = (struct ug_data*) data;
86 ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_COMPLETED;
87 wfd_client_set_p2p_group_owner_intent(7);
89 g_timeout_add(1000 /*ms*/, __wfd_multi_connect_reset_cb, ugd);
95 int wfd_start_multi_connect(void* data)
98 struct ug_data *ugd = (struct ug_data*) data;
102 if (ugd->raw_multi_selected_peer_cnt > 0)
104 ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_IN_PROGRESS;
105 if (wfd_client_set_p2p_group_owner_intent(15) == WIFI_DIRECT_ERROR_NONE)
107 for (i=0;i<ugd->raw_multi_selected_peer_cnt; i++)
109 res = wfd_client_connect(ugd->raw_multi_selected_peers[i].mac_addr);
112 DBG(LOG_VERBOSE, "Failed to connect [%s].\n", ugd->raw_multi_selected_peers[i].ssid);
113 ugd->raw_multi_selected_peers[i].conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT;
117 ugd->raw_multi_selected_peers[i].conn_status = PEER_CONN_STATUS_CONNECTING;
122 if (i >= ugd->raw_multi_selected_peer_cnt)
124 wfd_client_set_p2p_group_owner_intent(7);
126 DBG(LOG_VERBOSE, "All connect trails are failed.\n");
133 DBG(LOG_VERBOSE, "Setting GO intent is failed.\n");
140 DBG(LOG_VERBOSE, "No selected peers.\n");
148 gboolean wfd_multi_connect_next_cb(void* data)
151 struct ug_data *ugd = (struct ug_data*) data;
155 // Reset g_source handler..
156 ugd->g_source_multi_connect_next = 0;
158 if (ugd->raw_multi_selected_peer_cnt > 0)
160 ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_IN_PROGRESS;
161 for (i=0;i<ugd->raw_multi_selected_peer_cnt; i++)
163 if (ugd->raw_multi_selected_peers[i].conn_status == PEER_CONN_STATUS_WAIT_FOR_CONNECT)
165 res = wfd_client_connect(ugd->raw_multi_selected_peers[i].mac_addr);
168 DBG(LOG_VERBOSE, "Failed to connect [%s].\n", ugd->raw_multi_selected_peers[i].ssid);
169 ugd->raw_multi_selected_peers[i].conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT;
173 ugd->raw_multi_selected_peers[i].conn_status = PEER_CONN_STATUS_CONNECTING;
179 if (i >= ugd->raw_multi_selected_peer_cnt)
181 // All selected peers are touched.
182 DBG(LOG_VERBOSE, "Stop Multi Connect...\n");
183 wfd_stop_multi_connect(ugd);
188 DBG(LOG_VERBOSE, "No selected peers.\n");
197 void _connect_btn_cb(void *data, Evas_Object * obj, void *event_info)
200 struct ug_data *ugd = (struct ug_data*) data;
203 char popup_text[MAX_POPUP_TEXT_SIZE] = {0};
204 DBG(LOG_VERBOSE, "_connect_btn_cb \n");
206 for (i = 0; i < ugd->gl_available_peer_cnt ; i++)
208 if (TRUE == ugd->multi_conn_dev_list[i].dev_sel_state)
210 DBG(LOG_VERBOSE, "ugd->peers[i].mac_addr = %s, i = %d\n", ugd->multi_conn_dev_list[i].peer.mac_addr, i);
212 memcpy(&ugd->raw_multi_selected_peers[count], &ugd->multi_conn_dev_list[i].peer,sizeof(device_type_s));
213 ugd->raw_multi_selected_peers[count].conn_status = PEER_CONN_STATUS_WAIT_FOR_CONNECT;
218 ugd->raw_multi_selected_peer_cnt = count;
220 /* if more than 7 device selected, show the popup */
221 if (count > MAX_POPUP_PEER_NUM) {
222 snprintf(popup_text, MAX_POPUP_TEXT_SIZE, _("IDS_WFD_POP_MULTI_CONNECT"), count);
223 wfd_ug_warn_popup(ugd, popup_text, POP_TYPE_MULTI_CONNECT_POPUP);
226 if (wfd_start_multi_connect(ugd) != -1)
228 wfd_ug_view_update_peers(ugd);
231 elm_naviframe_item_pop(ugd->naviframe);
233 //ToDo: Do we need to free multiconn_view_genlist?
234 ugd->multiconn_view_genlist = NULL;
235 _change_multi_button_title(ugd);
243 static void _wfd_gl_multi_sel_cb(void *data, Evas_Object *obj, void *event_info)
251 bool is_selct_all = TRUE;
253 Evas_Object *chk_box = NULL;
254 char msg[MAX_POPUP_TEXT_SIZE] = {0};
255 struct ug_data *ugd = (struct ug_data*) data;
256 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
258 if (NULL == ugd || NULL == item) {
259 DBG(LOG_ERROR, "The param is NULL\n");
263 elm_genlist_item_selected_set(item, EINA_FALSE);
264 index = elm_genlist_item_index_get(item) - 3; /* subtract the previous items */
265 DBG(LOG_VERBOSE, "selected index = %d \n", index);
267 DBG(LOG_ERROR, "The index is invalid.\n");
271 chk_box = elm_object_item_part_content_get((Elm_Object_Item *)event_info, "elm.icon.1");
272 state = elm_check_state_get(chk_box);
273 DBG(LOG_VERBOSE, "state = %d \n", state);
274 elm_check_state_set(chk_box, !state);
276 ugd->multi_conn_dev_list[index].dev_sel_state = !state;
277 DBG(LOG_VERBOSE, "ptr->dev_sel_state = %d \n", ugd->multi_conn_dev_list[index].dev_sel_state);
278 DBG(LOG_VERBOSE, "ptr->peer.mac_addr = %s \n", ugd->multi_conn_dev_list[index].peer.mac_addr);
280 /* update the checkbox and button */
281 for (; i < ugd->gl_available_dev_cnt_at_multiconn_view; i++) {
282 if (ugd->multi_conn_dev_list[i].dev_sel_state) {
286 is_selct_all = FALSE;
290 chk_box = elm_object_item_part_content_get(ugd->mcview_select_all_item, "elm.icon");
291 elm_check_state_set(chk_box, is_selct_all);
293 if (ugd->multi_connect_btn) {
294 wfd_ug_view_refresh_button(ugd->multi_connect_btn, _("IDS_WFD_BUTTON_CONNECT"), is_sel);
298 snprintf(msg, MAX_POPUP_TEXT_SIZE, _("IDS_WFD_POP_SELECTED_DEVICE_NUM"), sel_count);
299 wfd_ug_tickernoti_popup(msg);
305 static void _wfd_gl_sel_cb(void *data, Evas_Object *obj, void *event_info)
308 char msg[MAX_POPUP_TEXT_SIZE] = {0};
309 struct ug_data *ugd = (struct ug_data*) data;
311 elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
313 if (NULL == ugd || NULL == obj) {
314 DBG(LOG_ERROR, "NULL parameters.\n");
318 Evas_Object *sel_chkbox = elm_object_item_part_content_get(ugd->mcview_select_all_item, "elm.icon");
319 if (sel_chkbox==NULL)
321 DBG(LOG_VERBOSE, "select-all chkbox is NULL\n");
324 Eina_Bool state = elm_check_state_get(sel_chkbox);
330 elm_check_state_set(sel_chkbox, state);
332 DBG(LOG_VERBOSE, "state = %d \n", state);
336 Elm_Object_Item *item = NULL;
337 Evas_Object *chk_box = NULL;
339 /* set the state of all the available devices */
340 for (i = 0; i < ugd->gl_available_dev_cnt_at_multiconn_view; i++) {
342 ugd->multi_conn_dev_list[i].dev_sel_state = state;
343 item = ugd->multi_conn_dev_list[i].peer.gl_item;
344 chk_box = elm_object_item_part_content_get(item, "elm.icon.1");
345 elm_check_state_set(chk_box, state);
352 /* update the connect button */
353 if (ugd->multi_connect_btn) {
354 wfd_ug_view_refresh_button(ugd->multi_connect_btn, _("IDS_WFD_BUTTON_CONNECT"), is_sel);
357 /* tickernoti popup */
359 snprintf(msg, MAX_POPUP_TEXT_SIZE, _("IDS_WFD_POP_SELECTED_DEVICE_NUM"), sel_count);
360 wfd_ug_tickernoti_popup(msg);
363 //elm_check_state_set(ugd->mcview_select_all_icon, EINA_FALSE);
367 static char *_wfd_gl_device_label_get(void *data, Evas_Object *obj, const char *part)
369 DBG(LOG_VERBOSE, "part %s", part);
370 device_type_s *peer = (device_type_s*) data;
375 if (!strcmp(part, "elm.text")) {
376 return strdup(peer->ssid);
382 static char *__wfd_get_device_icon_path(device_type_s *peer)
384 char *img_path = NULL;
386 switch(peer->category)
388 case WFD_DEVICE_TYPE_COMPUTER:
389 img_path = WFD_ICON_DEVICE_COMPUTER;
391 case WFD_DEVICE_TYPE_INPUT_DEVICE:
392 img_path = WFD_ICON_DEVICE_INPUT_DEVICE;
394 case WFD_DEVICE_TYPE_PRINTER:
395 img_path = WFD_ICON_DEVICE_PRINTER;
397 case WFD_DEVICE_TYPE_CAMERA:
398 img_path = WFD_ICON_DEVICE_CAMERA;
400 case WFD_DEVICE_TYPE_STORAGE:
401 img_path = WFD_ICON_DEVICE_STORAGE;
403 case WFD_DEVICE_TYPE_NW_INFRA:
404 img_path = WFD_ICON_DEVICE_NETWORK_INFRA;
406 case WFD_DEVICE_TYPE_DISPLAYS:
407 img_path = WFD_ICON_DEVICE_DISPLAY;
409 case WFD_DEVICE_TYPE_MM_DEVICES:
410 img_path = WFD_ICON_DEVICE_MULTIMEDIA_DEVICE;
412 case WFD_DEVICE_TYPE_GAME_DEVICES:
413 img_path = WFD_ICON_DEVICE_GAMING_DEVICE;
415 case WFD_DEVICE_TYPE_TELEPHONE:
416 img_path = WFD_ICON_DEVICE_TELEPHONE;
418 case WFD_DEVICE_TYPE_AUDIO:
419 img_path = WFD_ICON_DEVICE_AUDIO_DEVICE;
422 img_path = WFD_ICON_DEVICE_COMPUTER;
431 static void _wfd_check_clicked_cb(void *data, Evas_Object *obj, void *event_info)
433 struct ug_data *ugd = (struct ug_data*) data;
434 if (NULL == ugd || NULL == obj) {
435 DBG(LOG_ERROR, "NULL parameters.\n");
441 Elm_Object_Item *item = NULL;
442 Evas_Object *chk_box = NULL;
443 Eina_Bool state = elm_check_state_get(obj);
444 elm_check_state_set(obj, !state);
446 DBG(LOG_VERBOSE, "state = %d \n", state);
449 /* set the state of all the available devices */
450 for (i = 0; i < ugd->gl_available_dev_cnt_at_multiconn_view; i++) {
452 ugd->multi_conn_dev_list[i].dev_sel_state = state;
453 item = ugd->multi_conn_dev_list[i].peer.gl_item;
454 chk_box = elm_object_item_part_content_get(item, "elm.icon.1");
455 elm_check_state_set(chk_box, state);
458 /* update the connect button */
459 wfd_ug_view_refresh_button(ugd->multi_connect_btn, _("IDS_WFD_BUTTON_CONNECT"), is_sel);
464 static Evas_Object *_wfd_gl_device_icon_get(void *data, Evas_Object *obj, const char *part)
466 char *img_path = NULL;
467 device_type_s *peer = (device_type_s*) data;
468 Evas_Object* icon = NULL;
470 DBG(LOG_VERBOSE, "Part %s", part);
472 if (!strcmp(part, "elm.icon.1")) {
473 DBG(LOG_VERBOSE, "Part %s", part);
474 icon = elm_check_add(obj);
475 elm_check_state_set(icon, EINA_FALSE);
476 evas_object_smart_callback_add(icon, "changed", _wfd_check_clicked_cb, (void *)data);
477 } else if (!strcmp(part, "elm.icon.2")) {
478 img_path = __wfd_get_device_icon_path(peer);
479 icon = elm_icon_add(obj);
480 elm_icon_file_set(icon, img_path, NULL);
481 evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
482 elm_icon_resizable_set(icon, 1, 1);
483 evas_object_show(icon);
490 static char *_wfd_gl_select_all_label_get(void *data, Evas_Object *obj, const char *part)
492 if (!strcmp(part, "elm.text")) {
493 DBG(LOG_VERBOSE, "Adding text %s", part);
494 return strdup("Select all");
499 static Evas_Object *_wfd_gl_select_all_icon_get(void *data, Evas_Object *obj, const char *part)
501 struct ug_data *ugd = (struct ug_data*) data;
502 Evas_Object* icon = NULL;
504 if (!strcmp(part, "elm.icon")) {
505 DBG(LOG_VERBOSE, "Part %s", part);
506 icon = elm_check_add(obj);
507 elm_check_state_set(icon, EINA_FALSE);
508 evas_object_smart_callback_add(icon, "changed", _wfd_check_clicked_cb, (void *)data);
517 int _wfd_free_multiconnect_device(struct ug_data *ugd)
524 if (ugd->multiconn_view_genlist == NULL)
529 if (ugd->mcview_title_item != NULL)
531 elm_object_item_del(ugd->mcview_title_item);
532 ugd->mcview_title_item = NULL;
535 if (ugd->mcview_select_all_item != NULL)
537 elm_object_item_del(ugd->mcview_select_all_item);
538 ugd->mcview_select_all_item = NULL;
541 if (ugd->mcview_nodevice_item != NULL)
543 elm_object_item_del(ugd->mcview_nodevice_item);
544 ugd->mcview_nodevice_item = NULL;
547 for(i = 0; i < ugd->gl_available_dev_cnt_at_multiconn_view; i++)
549 if (ugd->multi_conn_dev_list[i].peer.gl_item != NULL)
551 elm_object_item_del(ugd->multi_conn_dev_list[i].peer.gl_item);
552 ugd->multi_conn_dev_list[i].peer.gl_item = NULL;
555 ugd->gl_available_dev_cnt_at_multiconn_view = 0;
561 int _wfd_update_multiconnect_device(struct ug_data *ugd)
566 device_type_s *device = NULL;
567 Evas_Object *genlist = NULL;
570 genlist = ugd->multiconn_view_genlist;
571 if (ugd->multiconn_view_genlist == NULL)
576 _wfd_free_multiconnect_device(ugd);
579 for(i = 0; i < ugd->raw_discovered_peer_cnt; i++)
581 device = &ugd->raw_discovered_peers[i];
582 if (device->is_connected == FALSE)
587 ugd->gl_available_dev_cnt_at_multiconn_view = count;
589 if (ugd->gl_available_dev_cnt_at_multiconn_view == 0)
591 DBG(LOG_ERROR, "There are No peers\n");
592 ugd->mcview_title_item = elm_genlist_item_append(genlist, &title_itc, ugd, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
593 elm_genlist_item_select_mode_set(ugd->mcview_title_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
594 ugd->mcview_nodevice_item = elm_genlist_item_append(genlist, &noitem_itc, (void*)ugd, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
595 elm_genlist_item_select_mode_set(ugd->mcview_nodevice_item , ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
599 ugd->mcview_title_item = elm_genlist_item_append(genlist, &title_itc, ugd, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
600 elm_genlist_item_select_mode_set(ugd->mcview_title_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
601 ugd->mcview_select_all_item = elm_genlist_item_append(genlist, &select_all_itc, ugd, NULL, ELM_GENLIST_ITEM_NONE, _wfd_gl_sel_cb, ugd);
604 for(i = 0; i < ugd->raw_discovered_peer_cnt; i++)
606 device = &ugd->raw_discovered_peers[i];
607 if (device->is_connected == FALSE)
609 DBG(LOG_VERBOSE, "%dth peer being added on genlist\n", i);
611 if (ugd->multi_conn_dev_list[count].peer.gl_item != NULL)
612 elm_object_item_del(ugd->multi_conn_dev_list[count].peer.gl_item);
613 ugd->multi_conn_dev_list[count].peer.gl_item = NULL;
615 memcpy(&ugd->multi_conn_dev_list[count].peer, device, sizeof(device_type_s));
617 ugd->multi_conn_dev_list[count].dev_sel_state = FALSE;
618 ugd->multi_conn_dev_list[count].peer.gl_item =
619 elm_genlist_item_append(genlist, &device_itc, (void*) &ugd->multi_conn_dev_list[count].peer,
620 NULL, ELM_GENLIST_ITEM_NONE, _wfd_gl_multi_sel_cb, ugd);
630 void _wifid_create_multiconnect_view(struct ug_data *ugd)
634 Evas_Object *back_btn = NULL;
635 Evas_Object *control_bar = NULL;
636 Evas_Object *genlist = NULL;
638 Elm_Object_Item *navi_item = NULL;
639 Elm_Object_Item *item = NULL;
643 DBG(LOG_ERROR, "Incorrect parameter(NULL)");
647 select_all_itc.item_style = "1text.1icon.3";
648 select_all_itc.func.text_get = _wfd_gl_select_all_label_get;
649 select_all_itc.func.content_get = _wfd_gl_select_all_icon_get;
650 select_all_itc.func.state_get = NULL;
651 select_all_itc.func.del = NULL;
653 device_itc.item_style = "1text.2icon.2";
654 device_itc.func.text_get = _wfd_gl_device_label_get;
655 device_itc.func.content_get = _wfd_gl_device_icon_get;
656 device_itc.func.state_get = NULL;
657 device_itc.func.del = NULL;
659 DBG(LOG_VERBOSE, "_wifid_create_multiconnect_view");
660 back_btn = elm_button_add(ugd->naviframe);
661 elm_object_style_set(back_btn, "naviframe/back_btn/default");
662 evas_object_smart_callback_add(back_btn, "clicked", _multiconnect_view_back_btn_cb, (void*) ugd);
663 elm_object_focus_allow_set(back_btn, EINA_FALSE);
665 genlist = elm_genlist_add(ugd->naviframe);
666 ugd->multiconn_view_genlist = genlist;
667 elm_object_style_set(ugd->multiconn_view_genlist, "dialogue");
669 ugd->mcview_title_item = NULL;
671 _wfd_update_multiconnect_device(ugd);
673 evas_object_show(genlist);
675 navi_item = elm_naviframe_item_push(ugd->naviframe, _("Multi connect"), back_btn, NULL, genlist, NULL);
677 control_bar = elm_toolbar_add(ugd->naviframe);
678 elm_toolbar_shrink_mode_set(control_bar, ELM_TOOLBAR_SHRINK_EXPAND);
679 evas_object_show(control_bar);
681 ugd->multi_scan_btn = elm_toolbar_item_append(control_bar, NULL, _("IDS_WFD_BUTTON_SCAN"), _scan_btn_cb, (void*) ugd);
682 item = elm_toolbar_item_append(control_bar, NULL, NULL, NULL, NULL);
683 elm_object_item_disabled_set(item, EINA_TRUE);
684 ugd->multi_connect_btn = elm_toolbar_item_append(control_bar, NULL, _("IDS_WFD_BUTTON_CONNECT"), _connect_btn_cb, (void*) ugd);
686 if (ugd->multi_connect_btn) {
687 wfd_ug_view_refresh_button(ugd->multi_connect_btn, _("IDS_WFD_BUTTON_CONNECT"), FALSE);
690 item = elm_toolbar_item_append(control_bar, NULL, NULL, NULL, NULL);
691 elm_object_item_disabled_set(item, EINA_TRUE);
692 elm_object_item_part_content_set(navi_item, "controlbar", control_bar);