summaryrefslogtreecommitdiff
path: root/ug-wifidirect/src/wfd_ug_main_view.c
diff options
context:
space:
mode:
authorsungsik jang <sungsik.jang@samsung.com>2012-08-22 15:04:19 +0900
committersungsik jang <sungsik.jang@samsung.com>2012-08-22 15:48:27 +0900
commit2862180e1407377dd19d90f46291e95fa57b5979 (patch)
tree3880a2ce0ac3aca1c01fa7d98d66764a6f1bc1d1 /ug-wifidirect/src/wfd_ug_main_view.c
parentd78b6a702fb987794bfb8e272e58e423ae584300 (diff)
downloadug-wifi-direct-2862180e1407377dd19d90f46291e95fa57b5979.tar.gz
ug-wifi-direct-2862180e1407377dd19d90f46291e95fa57b5979.tar.bz2
ug-wifi-direct-2862180e1407377dd19d90f46291e95fa57b5979.zip
tizen 2.0beta
Change-Id: Ibd5455c39cb9f809e0518f481c13356d1a4ea37e
Diffstat (limited to 'ug-wifidirect/src/wfd_ug_main_view.c')
-rwxr-xr-xug-wifidirect/src/wfd_ug_main_view.c1153
1 files changed, 1153 insertions, 0 deletions
diff --git a/ug-wifidirect/src/wfd_ug_main_view.c b/ug-wifidirect/src/wfd_ug_main_view.c
new file mode 100755
index 0000000..e502ad6
--- /dev/null
+++ b/ug-wifidirect/src/wfd_ug_main_view.c
@@ -0,0 +1,1153 @@
+/*
+* WiFi-Direct UG
+*
+* Copyright 2012 Samsung Electronics Co., Ltd
+
+* Licensed under the Flora License, Version 1.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+
+* http://www.tizenopensource.org/license
+
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+*/
+
+
+#include <libintl.h>
+
+#include <assert.h>
+#include <glib.h>
+
+#include <Elementary.h>
+#include <vconf.h>
+#include <ui-gadget-module.h>
+#include <wifi-direct.h>
+
+#include "wfd_ug.h"
+#include "wfd_ug_view.h"
+#include "wfd_client.h"
+
+void _wfd_onoff_btn_cb(void *data, Evas_Object *obj, void *event_info);
+
+
+void _back_btn_cb(void *data, Evas_Object * obj, void *event_info)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data*) data;
+
+ if(!ugd)
+ {
+ DBG(LOG_ERROR, "The param is NULL\n");
+ return;
+ }
+
+ wfd_ug_view_free_peers(ugd);
+#if 0
+ bundle *b;
+ b = bundle_create();
+ if(!b)
+ {
+ DBG(LOG_ERROR, "Failed to create bundle");
+ return;
+ }
+
+ wfd_refresh_wifi_direct_state(ugd);
+ if (ugd->wfd_status > WIFI_DIRECT_STATE_CONNECTING)
+ bundle_add(b, "Connection", "TRUE");
+ else
+ bundle_add(b, "Connection", "FALSE");
+
+ ug_send_result(ugd->ug, b);
+
+ bundle_free(b);
+#else
+ int ret = -1;
+ service_h service = NULL;
+ ret = service_create(&service);
+ if(ret)
+ {
+ DBG(LOG_ERROR, "Failed to create service");
+ return;
+ }
+
+ wfd_refresh_wifi_direct_state(ugd);
+ if (ugd->wfd_status > WIFI_DIRECT_STATE_CONNECTING)
+ service_add_extra_data(service, "Connection", "TRUE");
+ else
+ service_add_extra_data(service, "Connection", "FALSE");
+
+ ug_send_result(ugd->ug, service);
+ service_destroy(service);
+#endif
+ ug_destroy_me(ugd->ug);
+
+ __FUNC_EXIT__;
+ return;
+}
+
+void _scan_btn_cb(void *data, Evas_Object * obj, void *event_info)
+{
+ __FUNC_ENTER__;
+
+ struct ug_data *ugd = (struct ug_data*) data;
+ Elm_Object_Item *btn = event_info;
+ char *btn_text = NULL;
+
+ if (NULL == ugd || NULL == btn) {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return;
+ }
+
+ btn_text = elm_object_item_text_get(btn);
+ if (0 == strcmp(btn_text, _("IDS_WFD_BUTTON_SCAN"))) {
+ wfd_refresh_wifi_direct_state(ugd);
+ DBG(LOG_VERBOSE, "Start discovery again, status: %d\n", ugd->wfd_status);
+
+ /* if connected, show the popup*/
+ if (ugd->wfd_status >= WIFI_DIRECT_STATE_CONNECTED) {
+ wfd_ug_act_popup(ugd, _("IDS_WFD_POP_SCAN_AGAIN"), POP_TYPE_SCAN_AGAIN);
+ } else if (WIFI_DIRECT_STATE_ACTIVATED == ugd->wfd_status) {
+ wfd_client_start_discovery(ugd);
+ } else if (WIFI_DIRECT_STATE_DEACTIVATED == ugd->wfd_status) {
+ _wfd_onoff_btn_cb(ugd, NULL, NULL);
+ __FUNC_EXIT__;
+ return;
+ }
+
+ if (ugd->scan_btn) {
+ wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_STOPSCAN"), TRUE);
+ }
+
+ if (ugd->multi_scan_btn) {
+ wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_STOPSCAN"), TRUE);
+ }
+ } else if (0 == strcmp(btn_text, _("IDS_WFD_BUTTON_STOPSCAN"))) {
+ DBG(LOG_VERBOSE, "Stop discoverying.\n");
+ ugd->wfd_status = WIFI_DIRECT_STATE_ACTIVATED;
+ wfd_refresh_wifi_direct_state(ugd);
+ ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
+ wfd_ug_view_refresh_glitem(ugd->head);
+ wifi_direct_cancel_discovery();
+ }
+
+ __FUNC_EXIT__;
+ return;
+}
+
+Eina_Bool _is_wifi_on()
+{
+ __FUNC_ENTER__;
+ int wifi_state;
+
+ vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
+
+ if (wifi_state >= VCONFKEY_WIFI_CONNECTED)
+ {
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+ __FUNC_EXIT__;
+}
+
+void _wfd_onoff_btn_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data*) data;
+
+ wfd_refresh_wifi_direct_state(ugd);
+
+ if(!ugd->wfd_onoff)
+ {
+ if(ugd->wfd_status < 0)
+ {
+ DBG(LOG_VERBOSE, "bad wfd status\n");
+ wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_ACTIVATE_FAIL"), POPUP_TYPE_TERMINATE);
+
+ ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
+ wfd_ug_view_refresh_glitem(ugd->head);
+ return;
+ }
+ DBG(LOG_VERBOSE, "wifi-direct switch on\n");
+ ugd->head_text_mode = HEAD_TEXT_TYPE_ACTIVATING;
+ wfd_client_switch_on(ugd);
+ }
+ else
+ {
+ if(ugd->wfd_status < 0)
+ {
+ DBG(LOG_VERBOSE, "bad wfd status\n");
+ wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_DEACTIVATE_FAIL"), POPUP_TYPE_TERMINATE);
+
+ ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
+ wfd_ug_view_refresh_glitem(ugd->head);
+ return;
+ }
+ DBG(LOG_VERBOSE, "wifi-direct switch off\n");
+ ugd->head_text_mode = HEAD_TEXT_TYPE_DEACTIVATING;
+ wfd_client_switch_off(ugd);
+ }
+
+ wfd_ug_view_refresh_glitem(ugd->head);
+
+ if (ugd->scan_btn) {
+ wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE);
+ }
+
+ if (ugd->multi_scan_btn) {
+ wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE);
+ }
+
+
+ __FUNC_EXIT__;
+}
+
+
+static void _gl_header_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data*) data;
+ Elm_Object_Item *item = (Elm_Object_Item *)event_info;
+
+ if(data == NULL)
+ {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return;
+ }
+
+ if(item != NULL)
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+
+ _wfd_onoff_btn_cb(ugd, NULL, NULL);
+
+ __FUNC_EXIT__;
+}
+
+#if 0
+static Evas_Object *_gl_noitem_icon_get(void *data, Evas_Object * obj,
+ const char *part)
+{
+ __FUNC_ENTER__;
+ Evas_Object *nocontent;
+
+ if(data == NULL)
+ {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return NULL;
+ }
+
+#if 1 // use nocontent
+ nocontent = elm_layout_add(obj);
+ if(nocontent == NULL)
+ {
+ DBG(LOG_ERROR, "Failed to add nocontent");
+ return NULL;
+ }
+ elm_layout_theme_set(nocontent, "layout", "nocontents", "unnamed");
+ elm_object_part_text_set(nocontent, "elm.text", _("IDS_WFD_BODY_NO_DEVICES"));
+ evas_object_size_hint_min_set(nocontent, 400, 200);
+ evas_object_size_hint_max_set(nocontent, 400, 200);
+ evas_object_resize(nocontent, 400, 200);
+
+ __FUNC_EXIT__;
+
+ return nocontent;
+#else // use image
+ Evas_Object *icon;
+ icon = elm_icon_add(obj);
+ elm_icon_file_set(icon, "/opt/ug/res/images/ug-wifi-direct/A09_NoDevice.png", NULL);
+ evas_object_size_hint_min_set(icon, 400, 200);
+ evas_object_size_hint_max_set(icon, 400, 200);
+ evas_object_resize(icon, 400, 200);
+
+ return icon;
+#endif
+}
+#endif
+
+static void _gl_peer_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ __FUNC_ENTER__;
+ assertm_if(NULL == obj, "NULL!!");
+ assertm_if(NULL == data, "NULL!!");
+ device_type_s *peer = (device_type_s*) data;
+ Elm_Object_Item *item = (Elm_Object_Item *)event_info;
+ struct ug_data* ugd = wfd_get_ug_data();
+ int res;
+
+ if(data == NULL)
+ {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return;
+ }
+
+ if(item != NULL)
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+
+ if(peer->conn_status == PEER_CONN_STATUS_DISCONNECTED)
+ {
+#if 0 // for new connection during link_status is CONNECTING
+ wfd_refresh_wifi_direct_state(ugd);
+ if(ugd->wfd_status == WFD_LINK_STATUS_CONNECTING)
+ {
+ res = wfd_client_disconnect(NULL);
+ if(res != 0)
+ {
+ DBG(LOG_ERROR, "Failed to send disconnection request. [%d]\n", res);
+ return;
+ }
+ }
+#endif
+ DBG(LOG_VERBOSE, "Connect with peer [%s]\n", peer->mac_addr);
+ res = wfd_client_connect((const char*) peer->mac_addr);
+ if(res != 0)
+ {
+ DBG(LOG_ERROR, "Failed to send connection request. [%d]\n", res);
+ return;
+ }
+ peer->conn_status = PEER_CONN_STATUS_CONNECTING;
+ }
+ else // PEER_CONN_STATUS_CONNECTED or PEER_CONN_STATUS_CONNECTING)
+ {
+ res = wfd_client_disconnect((const char*) peer->mac_addr);
+ if(res != 0)
+ {
+ DBG(LOG_ERROR, "Failed to send disconnection request. [%d]\n", res);
+ return;
+ }
+ peer->conn_status = PEER_CONN_STATUS_DISCONNECTED;
+ }
+
+ wfd_ug_view_refresh_glitem(peer->gl_item);
+ wfd_ug_view_refresh_glitem(ugd->multi_button_item);
+
+ __FUNC_EXIT__;
+ return;
+}
+
+static void _gl_busy_peer_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ __FUNC_ENTER__;
+
+ struct ug_data *ugd = (struct ug_data*) data;
+
+ elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
+
+ DBG(LOG_VERBOSE, "Busy device is clicked");
+
+ wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_WARN_BUSY_DEVICE"), POP_TYPE_BUSY_DEVICE_POPUP);
+
+ __FUNC_EXIT__;
+}
+
+static void _gl_about_wifi_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ struct ug_data *ugd = (struct ug_data*) data;
+
+ DBG(LOG_VERBOSE, "About wifi clicked");
+
+ _wifid_create_about_view(ugd);
+ elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
+}
+
+void _wifid_create_multibutton_cb(void *data, Evas_Object * obj, void *event_info)
+{
+ struct ug_data *ugd = (struct ug_data*) data;
+ const char *text_lbl = NULL;
+
+ text_lbl = elm_object_text_get(ugd->multi_btn);
+ DBG(LOG_VERBOSE, "text_lbl = %s", text_lbl);
+
+ if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_IN_PROGRESS)
+ {
+ ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_NONE;
+ if (0 == strcmp(IDS_WFD_BUTTON_CANCEL, text_lbl))
+ {
+ wfd_ug_act_popup(ugd, _("IDS_WFD_POP_CANCEL_CONNECT"), POP_TYPE_DISCONNECT_ALL);
+ }
+ else
+ {
+ DBG(LOG_VERBOSE, "Invalid Case\n");
+ }
+ }
+ else
+ {
+ if (0 == strcmp(IDS_WFD_BUTTON_MULTI, text_lbl))
+ {
+ _wifid_create_multiconnect_view(ugd);
+ }
+ else if (0 == strcmp(IDS_WFD_BUTTON_CANCEL, text_lbl))
+ {
+ wfd_ug_act_popup(ugd, _("IDS_WFD_POP_CANCEL_CONNECT"), POP_TYPE_DISCONNECT_ALL);
+ }
+ else if (0 == strcmp(IDS_WFD_BUTTON_DISCONNECT_ALL, text_lbl))
+ {
+ wfd_ug_act_popup(ugd, _("IDS_WFD_POP_DISCONNECT"), POP_TYPE_DISCONNECT_ALL);
+ }
+ else if (0 == strcmp(IDS_WFD_BUTTON_DISCONNECT, text_lbl))
+ {
+ wfd_ug_act_popup(ugd, _("IDS_WFD_POP_DISCONNECT"), POP_TYPE_DISCONNECT);
+ }
+ else
+ {
+ DBG(LOG_VERBOSE, "Invalid Case\n");
+ }
+ }
+}
+
+
+int _change_multi_button_title(void *data)
+{
+ struct ug_data *ugd = (struct ug_data*) data;
+
+ if(ugd->multi_button_item == NULL) /*Needs to be check as the peer count is not getting updated*/
+ {
+ return -1;
+ }
+
+ wfd_refresh_wifi_direct_state(ugd);
+ if (ugd->wfd_status == WFD_LINK_STATUS_CONNECTING)
+ {
+ //if (conn_prog_count > 0)
+ elm_object_text_set(ugd->multi_btn, IDS_WFD_BUTTON_CANCEL);
+ }
+ else if (ugd->wfd_status > WFD_LINK_STATUS_CONNECTING)
+ {
+ if (ugd->gl_connected_peer_cnt > 1)
+ elm_object_text_set(ugd->multi_btn, IDS_WFD_BUTTON_DISCONNECT_ALL);
+ else
+ elm_object_text_set(ugd->multi_btn, IDS_WFD_BUTTON_DISCONNECT);
+ }
+ else
+ {
+ elm_object_text_set(ugd->multi_btn, IDS_WFD_BUTTON_MULTI);
+ }
+
+ evas_object_show(ugd->multi_btn);
+
+ return 0;
+}
+
+
+void wfd_ug_view_refresh_glitem(void *obj)
+{
+ __FUNC_ENTER__;
+ elm_genlist_item_update(obj);
+ __FUNC_EXIT__;
+}
+
+void wfd_ug_view_refresh_button(void *obj, const char *text, int enable)
+{
+ __FUNC_ENTER__;
+
+ if (NULL == obj || NULL == text) {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return;
+ }
+
+ DBG(LOG_VERBOSE, "Set the attributes of button: text[%s], enabled[%d]\n", text, enable);
+ elm_object_item_text_set(obj, text);
+ elm_object_item_disabled_set(obj, !enable);
+
+ __FUNC_EXIT__;
+}
+
+static bool __wfd_is_device_connected_with_me(struct ug_data *ugd, device_type_s *dev)
+{
+ int i;
+
+ for(i=0; i<ugd->raw_connected_peer_cnt; i++)
+ {
+ if (strncmp(ugd->raw_connected_peers[i].mac_addr, dev->mac_addr, strlen(ugd->raw_connected_peers[i].mac_addr)) == 0)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool __wfd_is_device_busy(struct ug_data *ugd, device_type_s *dev)
+{
+ if (__wfd_is_device_connected_with_me(ugd, dev) == TRUE)
+ return FALSE;
+
+ if (ugd->I_am_group_owner == TRUE)
+ {
+ if (dev->is_connected || dev->is_group_owner)
+ return TRUE;
+ else
+ return FALSE;
+ }
+ else
+ {
+ if (dev->is_connected == TRUE && dev->is_group_owner == TRUE)
+ return FALSE;
+ if (dev->is_connected == TRUE && dev->is_group_owner == FALSE)
+ return TRUE;
+ if (dev->is_connected == FALSE)
+ return FALSE;
+ }
+
+ return FALSE;
+}
+
+static bool __wfd_is_any_device_available(struct ug_data *ugd, int* no_of_available_dev)
+{
+ int i =0 ;
+ for (i = 0; i < ugd->raw_discovered_peer_cnt; i++)
+ {
+ if (!__wfd_is_device_busy(ugd, &ugd->raw_discovered_peers[i]) &&
+ ugd->raw_discovered_peers[i].conn_status == PEER_CONN_STATUS_DISCONNECTED)
+ (*no_of_available_dev)++;
+ }
+ return TRUE;
+}
+
+static bool __wfd_is_any_device_busy(struct ug_data *ugd, int* no_of_busy_dev)
+{
+ int i =0 ;
+ for (i = 0; i < ugd->raw_discovered_peer_cnt; i++)
+ {
+ if (__wfd_is_device_busy(ugd, &ugd->raw_discovered_peers[i]))
+ (*no_of_busy_dev)++;
+ }
+ return TRUE;
+}
+
+static bool __wfd_is_any_device_connect_failed(struct ug_data *ugd, int* no_of_connect_failed_dev)
+{
+ int i =0 ;
+ for (i = 0; i < ugd->raw_discovered_peer_cnt; i++)
+ {
+ if (!__wfd_is_device_busy(ugd, &ugd->raw_discovered_peers[i]) &&
+ ugd->raw_discovered_peers[i].conn_status == PEER_CONN_STATUS_FAILED_TO_CONNECT)
+ (*no_of_connect_failed_dev)++;
+
+ }
+ return TRUE;
+}
+
+static Evas_Object *_create_basic_genlist(void *data)
+{
+ __FUNC_ENTER__;
+
+ struct ug_data *ugd = (struct ug_data*) data;
+ Evas_Object *genlist;
+ Elm_Object_Item *separator_item;
+
+
+ genlist = elm_genlist_add(ugd->naviframe);
+
+
+ separator_item = elm_genlist_item_append(genlist, &sep_itc, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ elm_genlist_item_select_mode_set(separator_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+
+ ugd->head = elm_genlist_item_append(genlist, &head_itc, ugd, NULL, ELM_GENLIST_ITEM_NONE, _gl_header_sel, (void*) ugd);
+
+ //elm_genlist_item_select_mode_set(ugd->head, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+
+ __FUNC_EXIT__;
+
+ return genlist;
+}
+
+static Evas_Object *_create_about_genlist(void *data)
+{
+ __FUNC_ENTER__;
+
+ struct ug_data *ugd = (struct ug_data*) data;
+
+ ugd->about_wfd_item = elm_genlist_item_append(ugd->genlist, &name_itc, ugd, NULL, ELM_GENLIST_ITEM_NONE, _gl_about_wifi_sel, (void*) ugd);
+
+ /* add end separator */
+ ugd->about_wfdsp_sep_end_item = elm_genlist_item_append(ugd->genlist, &sep_itc_end, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ elm_genlist_item_select_mode_set(ugd->about_wfdsp_sep_end_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+
+ __FUNC_EXIT__;
+
+ return ugd->genlist;
+}
+
+static Evas_Object *_create_no_device_genlist(void *data)
+{
+ __FUNC_ENTER__;
+
+ struct ug_data *ugd = (struct ug_data*) data;
+
+ ugd->nodevice_title_item = elm_genlist_item_append(ugd->genlist, &title_itc, (void*)ugd, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+ ugd->nodevice_item = elm_genlist_item_append(ugd->genlist, &noitem_itc, (void*)ugd, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+ ugd->nodevice_sep_low_item = elm_genlist_item_append(ugd->genlist, &sep_itc, NULL, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+ elm_genlist_item_select_mode_set(ugd->nodevice_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+
+ __FUNC_EXIT__;
+ return ugd->genlist;
+}
+
+int _create_multi_button_genlist(void *data)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data*) data;
+
+ ugd->multi_button_sep_high_item = elm_genlist_item_append(ugd->genlist, &sep_itc, NULL, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+ /* if not connected and number of devices is less than 2, don't show the button */
+ if (ugd->raw_multi_selected_peer_cnt > 1 ||
+ ugd->gl_available_peer_cnt > 1 ||
+ ugd->gl_connected_peer_cnt > 0) {
+ ugd->multi_button_item = elm_genlist_item_append(ugd->genlist, &button_itc, ugd, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ ugd->multi_button_sep_low_item = elm_genlist_item_append(ugd->genlist, &sep_itc, NULL, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ }
+
+ evas_object_show(ugd->multi_btn);
+ __FUNC_EXIT__;
+ return 0;
+}
+
+
+int _create_busy_dev_list(void *data)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data*) data;
+
+ ugd->busy_wfd_item = elm_genlist_item_append(ugd->genlist, &title_busy_itc, (void*)ugd, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+ elm_genlist_item_select_mode_set(ugd->busy_wfd_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+
+
+ __FUNC_EXIT__;
+ return 0;
+}
+
+static int _create_available_dev_genlist(void *data)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data*) data;
+
+ ugd->avlbl_wfd_item = elm_genlist_item_append(ugd->genlist, &title_itc, (void*)ugd, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+ // elm_genlist_item_select_mode_set(ugd->avlbl_wfd_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+
+ __FUNC_EXIT__;
+ return 0;
+}
+
+static int _create_multi_connect_dev_genlist(void *data)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data*) data;
+
+ ugd->multi_connect_wfd_item = elm_genlist_item_append(ugd->genlist, &title_multi_connect_itc, (void*)ugd, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+ // elm_genlist_item_select_mode_set(ugd->avlbl_wfd_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+
+ __FUNC_EXIT__;
+ return 0;
+}
+
+int _create_connected_dev_genlist(void *data)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data*) data;
+
+ ugd->conn_wfd_item = elm_genlist_item_append(ugd->genlist, &title_conn_itc, (void*)ugd, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+ elm_genlist_item_select_mode_set(ugd->conn_wfd_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ __FUNC_EXIT__;
+ return 0;
+}
+
+int _create_connected_failed_dev_genlist(void *data)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data*) data;
+
+ ugd->conn_failed_wfd_item = elm_genlist_item_append(ugd->genlist, &title_conn_failed_itc, (void*)ugd, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+ elm_genlist_item_select_mode_set(ugd->conn_failed_wfd_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ __FUNC_EXIT__;
+ return 0;
+}
+
+static Eina_Bool _connect_failed_peers_display_cb(void *user_data)
+{
+ int interval = 0;
+ struct ug_data *ugd = (struct ug_data*) user_data;
+
+ if (NULL == ugd) {
+ DBG(LOG_ERROR, "NULL parameters.\n");
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ /* check the timeout, if not timeout, keep the cb */
+ interval = time(NULL) - ugd->last_display_time;
+ if (interval < MAX_DISPLAY_TIME_OUT) {
+ return ECORE_CALLBACK_RENEW;
+ }
+
+ /* re-discovery */
+ wfd_client_start_discovery(ugd);
+
+ /* get peers and update the view */
+ wfd_ug_get_discovered_peers(ugd);
+ wfd_ug_get_connected_peers(ugd);
+ wfd_ug_view_update_peers(ugd);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+void wfd_ug_view_free_peers(void *data)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data*) data;
+ int i;
+
+ for(i = 0; i < ugd->gl_connected_peer_cnt; i++)
+ {
+ DBG(LOG_VERBOSE, "%dth connected peer = %x is deleted\n", i, ugd->gl_connected_peers[i]);
+ if (ugd->gl_connected_peers[i].gl_item != NULL)
+ {
+ elm_object_item_del(ugd->gl_connected_peers[i].gl_item);
+ ugd->gl_connected_peers[i].gl_item = NULL;
+ DBG(LOG_VERBOSE, "Deleted item\n");
+ }
+ }
+ ugd->gl_connected_peer_cnt = 0;
+
+ for(i = 0; i < ugd->gl_connected_failed_peer_cnt; i++)
+ {
+ DBG(LOG_VERBOSE, "%dth connected failed peer = %x is deleted\n", i, ugd->gl_connected_failed_peers[i]);
+ if (ugd->gl_connected_failed_peers[i].gl_item != NULL)
+ {
+ elm_object_item_del(ugd->gl_connected_failed_peers[i].gl_item);
+ ugd->gl_connected_failed_peers[i].gl_item = NULL;
+ DBG(LOG_VERBOSE, "Deleted item\n");
+ }
+ }
+
+ ugd->gl_connected_failed_peer_cnt = 0;
+
+ for(i = 0; i < ugd->gl_available_peer_cnt; i++)
+ {
+ DBG(LOG_VERBOSE, "%dth discovered peer = %x is deleted\n", i, ugd->gl_available_peers[i]);
+ if (ugd->gl_available_peers[i].gl_item != NULL)
+ {
+ elm_object_item_del(ugd->gl_available_peers[i].gl_item);
+ ugd->gl_available_peers[i].gl_item = NULL;
+ DBG(LOG_VERBOSE, "Deleted item\n");
+ }
+ }
+ ugd->gl_available_peer_cnt = 0;
+
+ for(i = 0; i < ugd->gl_busy_peer_cnt; i++)
+ {
+ DBG(LOG_VERBOSE, "%dth busy peer = %x is deleted\n", i, ugd->gl_busy_peers[i]);
+ if (ugd->gl_busy_peers[i].gl_item != NULL)
+ {
+ elm_object_item_del(ugd->gl_busy_peers[i].gl_item);
+ ugd->gl_busy_peers[i].gl_item = NULL;
+ DBG(LOG_VERBOSE, "Deleted item\n");
+ }
+ }
+ ugd->gl_busy_peer_cnt = 0;
+
+ for(i = 0; i < ugd->gl_multi_connect_peer_cnt; i++)
+ {
+ DBG(LOG_VERBOSE, "%dth busy peer = %x is deleted\n", i, ugd->gl_multi_connect_peers[i]);
+ if (ugd->gl_multi_connect_peers[i].gl_item != NULL)
+ {
+ elm_object_item_del(ugd->gl_multi_connect_peers[i].gl_item);
+ ugd->gl_multi_connect_peers[i].gl_item = NULL;
+ DBG(LOG_VERBOSE, "Deleted item\n");
+ }
+ }
+ ugd->gl_multi_connect_peer_cnt = 0;
+
+ if(ugd->nodevice_title_item != NULL)
+ {
+ elm_object_item_del(ugd->nodevice_title_item);
+ ugd->nodevice_title_item = NULL;
+ }
+ if(ugd->nodevice_item != NULL)
+ {
+ elm_object_item_del(ugd->nodevice_item);
+ ugd->nodevice_item = NULL;
+ }
+ if(ugd->nodevice_sep_low_item != NULL)
+ {
+ elm_object_item_del(ugd->nodevice_sep_low_item);
+ ugd->nodevice_sep_low_item = NULL;
+ }
+ if(ugd->about_wfd_item != NULL)
+ {
+ elm_object_item_del(ugd->about_wfd_item);
+ ugd->about_wfd_item = NULL;
+ }
+
+ if(ugd->conn_wfd_item != NULL)
+ {
+ elm_object_item_del(ugd->conn_wfd_item);
+ ugd->conn_wfd_item = NULL;
+ }
+ if(ugd->conn_failed_wfd_item != NULL)
+ {
+ elm_object_item_del(ugd->conn_failed_wfd_item);
+ ugd->conn_failed_wfd_item = NULL;
+ }
+ if(ugd->conn_failed_wfd_sep_item != NULL)
+ {
+ elm_object_item_del(ugd->conn_failed_wfd_sep_item);
+ ugd->conn_failed_wfd_sep_item = NULL;
+ }
+ if(ugd->display_timer != NULL)
+ {
+ elm_object_item_del(ugd->display_timer);
+ ugd->display_timer = NULL;
+ }
+ if(ugd->multi_connect_wfd_item != NULL)
+ {
+ elm_object_item_del(ugd->multi_connect_wfd_item);
+ ugd->multi_connect_wfd_item = NULL;
+ }
+ if(ugd->avlbl_wfd_item != NULL)
+ {
+ elm_object_item_del(ugd->avlbl_wfd_item);
+ ugd->avlbl_wfd_item = NULL;
+ }
+ if(ugd->busy_wfd_item != NULL)
+ {
+ elm_object_item_del(ugd->busy_wfd_item);
+ ugd->busy_wfd_item = NULL;
+ }
+ if(ugd->busy_wfd_sep_item != NULL)
+ {
+ elm_object_item_del(ugd->busy_wfd_sep_item);
+ ugd->busy_wfd_sep_item = NULL;
+ }
+
+ if(ugd->multi_button_item != NULL)
+ {
+ elm_object_item_del(ugd->multi_button_item);
+ ugd->multi_button_item = NULL;
+ }
+ if(ugd->multi_button_sep_high_item != NULL)
+ {
+ elm_object_item_del(ugd->multi_button_sep_high_item);
+ ugd->multi_button_sep_high_item = NULL;
+ }
+ if(ugd->multi_button_sep_low_item != NULL)
+ {
+ elm_object_item_del(ugd->multi_button_sep_low_item);
+ ugd->multi_button_sep_low_item = NULL;
+ }
+ if(ugd->about_wfdsp_sep_end_item != NULL)
+ {
+ elm_object_item_del(ugd->about_wfdsp_sep_end_item);
+ ugd->about_wfdsp_sep_end_item = NULL;
+ }
+
+ __FUNC_EXIT__;
+}
+
+
+void wfd_ug_view_update_peers(void *data)
+{
+ __FUNC_ENTER__;
+
+ struct ug_data *ugd = (struct ug_data*) data;
+ int no_of_busy_dev = 0;
+ int no_of_available_dev = 0;
+ int no_of_conn_dev = 0;
+ int no_of_conn_failed_dev = 0;
+ int i = 0 ;
+ int res = 0;
+ bool is_group_owner = FALSE;
+ int count = 0;
+
+ wfd_ug_view_free_peers(ugd);
+
+ if(ugd->wfd_status == WFD_LINK_STATUS_DEACTIVATED)
+ {
+ DBG(LOG_VERBOSE, "Device is deactivated, no need to update UI.");
+ // Add seperator...
+ ugd->multi_button_sep_high_item = elm_genlist_item_append(ugd->genlist, &sep_itc, NULL, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ _create_about_genlist(ugd);
+ return;
+ }
+
+ res = wifi_direct_is_group_owner(&is_group_owner);
+ if (res != WIFI_DIRECT_ERROR_NONE)
+ {
+ DBG(LOG_VERBOSE, "Fail to get group_owner_state. ret=[%d]", res);
+ ugd->I_am_group_owner = FALSE;
+ // continue...
+ }
+ else
+ {
+ ugd->I_am_group_owner = is_group_owner;
+ }
+
+ __wfd_is_any_device_busy(ugd, &no_of_busy_dev);
+ __wfd_is_any_device_available(ugd, &no_of_available_dev);
+ __wfd_is_any_device_connect_failed(ugd, &no_of_conn_failed_dev);
+ no_of_conn_dev = ugd->raw_connected_peer_cnt;
+
+ ugd->gl_available_peer_cnt = no_of_available_dev;
+ ugd->gl_connected_peer_cnt = no_of_conn_dev;
+ ugd->gl_connected_failed_peer_cnt = no_of_conn_failed_dev;
+ ugd->gl_busy_peer_cnt = no_of_busy_dev;
+
+ DBG(LOG_VERBOSE, "conn_dev=[%d], conn_failed_dev=[%d], avail_dev=[%d], busy_dev=[%d], GO=[%d]\n",
+ no_of_conn_dev, no_of_conn_failed_dev, no_of_available_dev, no_of_busy_dev, is_group_owner);
+
+ if (no_of_conn_dev == 0 && no_of_conn_failed_dev == 0 &&
+ no_of_available_dev == 0 && no_of_busy_dev == 0)
+ {
+ DBG(LOG_ERROR, "There are No peers\n");
+ _create_no_device_genlist(ugd);
+ _create_about_genlist(ugd);
+ return;
+ }
+
+ if (no_of_conn_dev > 0)
+ {
+ if (!ugd->conn_wfd_item)
+ _create_connected_dev_genlist(ugd);
+
+ count = 0;
+ for(i = 0; i < ugd->raw_connected_peer_cnt; i++)
+ {
+ if (ugd->gl_connected_peers[count].gl_item)
+ elm_object_item_del(ugd->gl_connected_peers[count].gl_item);
+
+ memcpy(&ugd->gl_connected_peers[count], &ugd->raw_connected_peers[i], sizeof(device_type_s));
+
+ ugd->gl_connected_peers[count].gl_item =
+ elm_genlist_item_append(ugd->genlist, &peer_conn_itc, (void*) &(ugd->gl_connected_peers[i]), NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ elm_genlist_item_select_mode_set(ugd->gl_connected_peers[count].gl_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ count++;
+ }
+ }
+
+ if (ugd->multi_connect_mode != WFD_MULTI_CONNECT_MODE_NONE)
+ {
+ if (ugd->raw_multi_selected_peer_cnt > 0)
+ {
+ if (ugd->avlbl_wfd_item == NULL)
+ _create_multi_connect_dev_genlist(ugd);
+
+ count = 0;
+ for (i = 0; i < ugd->raw_multi_selected_peer_cnt; i++)
+ {
+ if (ugd->raw_multi_selected_peers[i].conn_status != PEER_CONN_STATUS_CONNECTED)
+ {
+ if (ugd->gl_multi_connect_peers[count].gl_item)
+ elm_object_item_del(ugd->gl_multi_connect_peers[count].gl_item);
+
+ memcpy(&ugd->gl_multi_connect_peers[count], &ugd->raw_multi_selected_peers[i], sizeof(device_type_s));
+
+ ugd->gl_multi_connect_peers[count].gl_item =
+ elm_genlist_item_append(ugd->genlist, &peer_itc, (void*) &(ugd->gl_multi_connect_peers[count]), NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ count++;
+ }
+ else
+ {
+ // device is connected..
+ // skip it...
+ }
+ }
+ ugd->gl_multi_connect_peer_cnt = count;
+ }
+
+ _create_multi_button_genlist(ugd);
+ }
+ else
+ {
+ // Note that
+ // If GC, no display available peers
+ // Otherwise, display available peers
+#if 0
+ if (no_of_available_dev > 0 && (no_of_conn_dev == 0 || is_group_owner==TRUE))
+#else
+ // display available peers
+ if (no_of_available_dev > 0)
+#endif
+ {
+ if (ugd->avlbl_wfd_item == NULL)
+ _create_available_dev_genlist(ugd);
+
+ count = 0;
+ for (i = 0; i < ugd->raw_discovered_peer_cnt; i++)
+ {
+ if (!__wfd_is_device_busy(ugd, &ugd->raw_discovered_peers[i]) &&
+ ugd->raw_discovered_peers[i].conn_status == PEER_CONN_STATUS_DISCONNECTED)
+ {
+ if (ugd->gl_available_peers[count].gl_item)
+ elm_object_item_del(ugd->gl_available_peers[count].gl_item);
+
+ memcpy(&ugd->gl_available_peers[count], &ugd->raw_discovered_peers[i], sizeof(device_type_s));
+
+ ugd->gl_available_peers[count].gl_item =
+ elm_genlist_item_append(ugd->genlist, &peer_itc, (void*) &(ugd->gl_available_peers[count]), NULL,
+ ELM_GENLIST_ITEM_NONE, _gl_peer_sel, (void*) &(ugd->gl_available_peers[count]));
+ count++;
+ }
+ else
+ {
+ // device is busy or connected..
+ // skip it...
+ }
+ }
+ }
+
+ _create_multi_button_genlist(ugd);
+
+ // If connected, not display busy device...
+ if (no_of_conn_dev == 0 && no_of_busy_dev > 0)
+ {
+ if (ugd->busy_wfd_item == NULL)
+ _create_busy_dev_list(ugd);
+
+ count = 0;
+ for (i = 0; i < ugd->raw_discovered_peer_cnt; i++)
+ {
+ if (__wfd_is_device_busy(ugd, &ugd->raw_discovered_peers[i]) == TRUE)
+ {
+ if (ugd->gl_busy_peers[count].gl_item)
+ elm_object_item_del(ugd->gl_busy_peers[count].gl_item);
+
+ memcpy(&ugd->gl_busy_peers[count], &ugd->raw_discovered_peers[i], sizeof(device_type_s));
+
+ ugd->gl_busy_peers[count].gl_item =
+ elm_genlist_item_append(ugd->genlist, &peer_busy_itc, (void*) &(ugd->gl_busy_peers[count]), NULL,
+ ELM_GENLIST_ITEM_NONE, _gl_busy_peer_sel, ugd);
+ //elm_genlist_item_select_mode_set(ugd->gl_busy_peers[count].gl_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ count++;
+ }
+ else
+ {
+ // device is available or connected..
+ // skip it...
+ }
+ }
+ ugd->busy_wfd_sep_item = elm_genlist_item_append(ugd->genlist, &sep_itc, NULL, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ }
+
+ /* display connect failed peers */
+ if (no_of_conn_failed_dev > 0)
+ {
+ if (!ugd->conn_failed_wfd_item)
+ _create_connected_failed_dev_genlist(ugd);
+
+ /* add timer for disappearing failed peers after N secs */
+ if (NULL == ugd->display_timer) {
+ ugd->last_display_time = time(NULL);
+ ugd->display_timer = ecore_timer_add(5.0, (Ecore_Task_Cb)_connect_failed_peers_display_cb, ugd);
+ }
+
+ count = 0;
+ for (i = 0; i < ugd->raw_discovered_peer_cnt; i++)
+ {
+ if (!__wfd_is_device_busy(ugd, &ugd->raw_discovered_peers[i]) &&
+ ugd->raw_discovered_peers[i].conn_status == PEER_CONN_STATUS_FAILED_TO_CONNECT)
+ {
+ if (ugd->gl_connected_failed_peers[count].gl_item)
+ elm_object_item_del(ugd->gl_connected_failed_peers[count].gl_item);
+
+ memcpy(&ugd->gl_connected_failed_peers[count], &ugd->raw_discovered_peers[i], sizeof(device_type_s));
+
+ ugd->gl_connected_failed_peers[count].gl_item =
+ elm_genlist_item_append(ugd->genlist, &peer_conn_failed_itc, (void*) &(ugd->gl_connected_failed_peers[count]), NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, ugd);
+ elm_genlist_item_select_mode_set(ugd->gl_connected_failed_peers[count].gl_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ count++;
+ }
+ }
+
+ ugd->conn_failed_wfd_sep_item = elm_genlist_item_append(ugd->genlist, &sep_itc, NULL, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+ }
+ }
+ _create_about_genlist(ugd);
+
+ __FUNC_EXIT__;
+}
+
+
+void create_wfd_ug_view(void *data)
+{
+ __FUNC_ENTER__;
+
+ struct ug_data *ugd = (struct ug_data*) data;
+ Evas_Object *back_btn = NULL;
+ Elm_Object_Item *navi_item = NULL;
+ Evas_Object *control_bar = NULL;
+ Elm_Object_Item *item = NULL;
+
+ if(ugd == NULL)
+ {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)");
+ return;
+ }
+
+ ugd->naviframe = elm_naviframe_add(ugd->base);
+ elm_object_part_content_set(ugd->base, "elm.swallow.content", ugd->naviframe);
+ evas_object_show(ugd->naviframe);
+
+ back_btn = elm_button_add(ugd->naviframe);
+ elm_object_style_set(back_btn, "naviframe/back_btn/default");
+ evas_object_smart_callback_add(back_btn, "clicked", _back_btn_cb, (void*) ugd);
+ elm_object_focus_allow_set(back_btn, EINA_FALSE);
+
+
+ ugd->genlist = _create_basic_genlist(ugd);
+ if(ugd->genlist == NULL)
+ {
+ DBG(LOG_ERROR, "Failed to create basic genlist");
+ return;
+ }
+ elm_object_style_set (ugd->genlist, "dialogue");
+ evas_object_show(ugd->genlist);
+ wfd_refresh_wifi_direct_state(ugd);
+ if (ugd->wfd_status > WIFI_DIRECT_STATE_ACTIVATING)
+ ugd->wfd_onoff = TRUE;
+
+ navi_item = elm_naviframe_item_push(ugd->naviframe, _("IDS_WFD_HEADER_WIFI_DIRECT"), back_btn, NULL, ugd->genlist, NULL); // dgettext("sys_string", "IDS_COM_OPT1_WI_FI_DIRECT")
+
+ control_bar = elm_toolbar_add(ugd->naviframe);
+ elm_toolbar_shrink_mode_set(control_bar, ELM_TOOLBAR_SHRINK_EXPAND);
+ evas_object_show(control_bar);
+
+ ugd->scan_btn = elm_toolbar_item_append(control_bar, NULL, _("IDS_WFD_BUTTON_SCAN"), _scan_btn_cb, (void*) ugd);
+ item = elm_toolbar_item_append(control_bar, NULL, NULL, NULL, NULL);
+ elm_object_item_disabled_set(item, EINA_TRUE);
+
+ elm_object_item_disabled_set(ugd->scan_btn, !ugd->wfd_onoff);
+
+ elm_object_item_part_content_set(navi_item, "controlbar", control_bar);
+
+ __FUNC_EXIT__;
+}