diff options
Diffstat (limited to 'ug-wifidirect')
46 files changed, 4445 insertions, 1527 deletions
diff --git a/ug-wifidirect/CMakeLists.txt b/ug-wifidirect/CMakeLists.txt index 5f901e3..e10920f 100644..100755 --- a/ug-wifidirect/CMakeLists.txt +++ b/ug-wifidirect/CMakeLists.txt @@ -1,5 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6) PROJECT(ug-setting-wifidirect-efl C) +SET(PACKAGE_NAME ug-setting-wifidirect-efl) SET(PREFIX "/opt/ug") SET(LIBDIR "${PREFIX}/lib") @@ -9,8 +10,12 @@ SET(IMGDIR "${RESDIR}/images/${PROJECT_NAME}") SET(SRCS src/wfd_ug.c - src/wfd_ug_view.c src/wfd_client.c + src/wfd_ug_popup.c + src/wfd_ug_genlist.c + src/wfd_ug_main_view.c + src/wfd_ug_multiconnect_view.c + src/wfd_ug_about_view.c ) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) diff --git a/ug-wifidirect/include/wfd_client.h b/ug-wifidirect/include/wfd_client.h index fb7bf72..59eed60 100644 --- a/ug-wifidirect/include/wfd_client.h +++ b/ug-wifidirect/include/wfd_client.h @@ -1,26 +1,21 @@ /* - * 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. - */ +* WiFi-Direct UG +* +* Copyright 2012 Samsung Electronics Co., Ltd -/* - * This file declares Wi-Fi direct client functions. - * - * @file wfd_client.h - * @author Gibyoung Kim (lastkgb.kim@samsung.com) - * @version 0.1 - */ +* 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. +* +*/ #ifndef __WFD_CLIENT_H__ @@ -29,52 +24,43 @@ typedef enum { - WFD_DEVICE_TYPE_COMPUTER = WIFI_DIRECT_PRIMARY_DEVICE_TYPE_COMPUTER, - WFD_DEVICE_TYPE_INPUT_DEVICE = WIFI_DIRECT_PRIMARY_DEVICE_TYPE_INPUT_DEVICE, + WFD_DEVICE_TYPE_COMPUTER = WIFI_DIRECT_PRIMARY_DEVICE_TYPE_COMPUTER, // 1 + WFD_DEVICE_TYPE_INPUT_DEVICE= WIFI_DIRECT_PRIMARY_DEVICE_TYPE_INPUT_DEVICE, WFD_DEVICE_TYPE_PRINTER = WIFI_DIRECT_PRIMARY_DEVICE_TYPE_PRINTER, WFD_DEVICE_TYPE_CAMERA = WIFI_DIRECT_PRIMARY_DEVICE_TYPE_CAMERA, - WFD_DEVICE_TYPE_STORAGE = WIFI_DIRECT_PRIMARY_DEVICE_TYPE_STORAGE, + WFD_DEVICE_TYPE_STORAGE = WIFI_DIRECT_PRIMARY_DEVICE_TYPE_STORAGE, // 5 WFD_DEVICE_TYPE_NW_INFRA = WIFI_DIRECT_PRIMARY_DEVICE_TYPE_NETWORK_INFRA, WFD_DEVICE_TYPE_DISPLAYS = WIFI_DIRECT_PRIMARY_DEVICE_TYPE_DISPLAY, - WFD_DEVICE_TYPE_MM_DEVICES = - WIFI_DIRECT_PRIMARY_DEVICE_TYPE_MULTIMEDIA_DEVICE, + WFD_DEVICE_TYPE_MM_DEVICES = WIFI_DIRECT_PRIMARY_DEVICE_TYPE_MULTIMEDIA_DEVICE, WFD_DEVICE_TYPE_GAME_DEVICES = WIFI_DIRECT_PRIMARY_DEVICE_TYPE_GAME_DEVICE, - WFD_DEVICE_TYPE_TELEPHONE = WIFI_DIRECT_PRIMARY_DEVICE_TYPE_TELEPHONE, + WFD_DEVICE_TYPE_TELEPHONE = WIFI_DIRECT_PRIMARY_DEVICE_TYPE_TELEPHONE, // 10 WFD_DEVICE_TYPE_AUDIO = WIFI_DIRECT_PRIMARY_DEVICE_TYPE_AUDIO, - WFD_DEVICE_TYPE_OTHER = WIFI_DIRECT_PRIMARY_DEVICE_TYPE_OTHER, + WFD_DEVICE_TYPE_OTHER = WIFI_DIRECT_PRIMARY_DEVICE_TYPE_OTHER, // 255 } device_type_e; -typedef enum -{ - WFD_LINK_STATUS_DEACTIVATED = WIFI_DIRECT_STATE_DEACTIVATED, +typedef enum { + WFD_LINK_STATUS_DEACTIVATED = WIFI_DIRECT_STATE_DEACTIVATED, // 0 WFD_LINK_STATUS_DEACTIVATING = WIFI_DIRECT_STATE_DEACTIVATING, WFD_LINK_STATUS_ACTIVATING = WIFI_DIRECT_STATE_ACTIVATING, WFD_LINK_STATUS_ACTIVATED = WIFI_DIRECT_STATE_ACTIVATED, WFD_LINK_STATUS_DISCOVERING = WIFI_DIRECT_STATE_DISCOVERING, - WFD_LINK_STATUS_CONNECTING = WIFI_DIRECT_STATE_CONNECTING, + WFD_LINK_STATUS_CONNECTING = WIFI_DIRECT_STATE_CONNECTING, // 5 WFD_LINK_STATUS_DISCONNECTING = WIFI_DIRECT_STATE_DISCONNECTING, WFD_LINK_STATUS_CONNECTED = WIFI_DIRECT_STATE_CONNECTED, WFD_LINK_STATUS_GROUP_OWNER = WIFI_DIRECT_STATE_GROUP_OWNER, } link_status_e; -typedef enum -{ - PEER_CONN_STATUS_DISCONNECTED, - PEER_CONN_STATUS_DISCONNECTING, - PEER_CONN_STATUS_CONNECTING = PEER_CONN_STATUS_DISCONNECTING, - PEER_CONN_STATUS_CONNECTED, -} conn_status_e; - int wfd_get_vconf_status(void *data); -int wfd_wifi_off(); +int wfd_wifi_off(void *data); +int wfd_mobile_ap_off(void *data); int init_wfd_client(void *data); int deinit_wfd_client(void *data); -int wfd_client_get_link_status(void); int wfd_client_start_discovery(void *data); int wfd_client_switch_on(void *data); int wfd_client_switch_off(void *data); int wfd_client_swtch_force(void *data, int onoff); int wfd_client_connect(const char *mac_addr); int wfd_client_disconnect(const char *mac_addr); +int wfd_client_set_p2p_group_owner_intent(int go_intent); -#endif /* __WFD_CLIENT_H__ */ +#endif /* __WFD_CLIENT_H__ */ diff --git a/ug-wifidirect/include/wfd_ug.h b/ug-wifidirect/include/wfd_ug.h index 8918654..ba26de9 100644..100755 --- a/ug-wifidirect/include/wfd_ug.h +++ b/ug-wifidirect/include/wfd_ug.h @@ -1,32 +1,29 @@ /* - * 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. - */ +* WiFi-Direct UG +* +* Copyright 2012 Samsung Electronics Co., Ltd -/* - * This file declares structure for Wi-Fi direct UI Gadget. - * - * @file wfd_ug.h - * @author Gibyoung Kim (lastkgb.kim@samsung.com) - * @version 0.1 - */ +* 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. +* +*/ #ifndef __WFD_UG_H__ #define __WFD_UG_H__ #include <dlog.h> +#include <ui-gadget-module.h> +#include <tethering.h> #define PACKAGE "ug-setting-wifidirect-efl" #define LOCALEDIR "/opt/ug/res/locale" @@ -38,73 +35,216 @@ #define __FUNC_ENTER__ DBG(LOG_VERBOSE, "+\n") #define __FUNC_EXIT__ DBG(LOG_VERBOSE, "-\n") -#define VCONF_WFD_ONOFF "db/wifi_direct/onoff" -#define VCONF_WFD_CONNECTION_STATUS "db/wifi_direct/connection_status" #define VCONF_WFD_APNAME "db/setting/device_name" -#define VCONF_WFD_PASSWORD "db/mobile_hotspot/wifi_key" -#define VCONF_WFD_PREV_STATUS "db/wifi_direct/prev_status" #define assertm_if(expr, fmt, arg...) do { \ if(expr) { \ DBG(LOG_VERBOSE, " ##(%s) -> %s() assert!!## "fmt, #expr, __FUNCTION__, ##arg); \ assert(1); \ } \ -} while (0) +} while (0) // retvm if #define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] #define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x" -#define AP_NAME_LENGTH_MAX 32 -#define AP_PASSWORD_LENGTH_MAX 64 -#define AP_PASSWORD_LENGTH_MIN 8 +#define AP_NAME_LENGTH_MAX 32 //allowed lenght is 31 + '\0' +#define AP_PASSWORD_LENGTH_MAX 64 //allowed lenght is 63 + '\0' +#define AP_PASSWORD_LENGTH_MIN 8 //min limit #define AP_REJECT_CHAR_LIST "=," -#define DEFAULT_DEV_NAME "Tizen" +#define DEFAULT_DEV_NAME "GT_I9500" #define MAC_LENGTH 18 #define SSID_LENGTH 32 #define MAX_PEER_NUM 10 +#define MAX_POPUP_PEER_NUM 7 +#define MAX_POPUP_TEXT_SIZE 256 +#define MAX_DISPLAY_TIME_OUT 30 #define _(s) dgettext(PACKAGE, s) #define N_(s) dgettext_noop(s) #define S_(s) dgettext("sys_string", s) +#define IDS_WFD_TITLE_ABOUT_WIFI "About Wi-Fi Direct" +#define IDS_WFD_BODY_ABOUT_WIFI "Wi-Fi Direct enables Wi-Fi devices to<br>connect directly, making printing,"\ + " file<br>sharing, synchronising, and screen<br>sharing much simpler and more<br>convenient.<br>"\ + "Connecting to devices that support<br>Wi-Fi Direct makes it possible to share<br>your content,"\ + " synchronise your data,<br>socialise with friends, play games,<br>audio, videos, and more, using various<br>applications." +#define IDS_WFD_BODY_CONNECTED_DEVICES "Connected Devices" +#define IDS_WFD_BODY_BUSY_DEVICES "Busy Devices" +#define IDS_WFD_BODY_FAILED_DEVICES "Failed Devices" +#define IDS_WFD_TAP_TO_CONNECT "Tap to connect" +#define IDS_WFD_CONNECTED_WITH_OTHER_DEVICE "Connected with another device" +#define IDS_WFD_CONNECTED "Connected" +#define IDS_WFD_CONNECTING "Connecting ..." +#define IDS_WFD_WAITING_FOR_CONNECT "Waiting for connect" +#define IDS_WFD_FAILED_TO_CONNECT "Failed to connect" +#define IDS_WFD_DISCONNECTING "Disconnecting ..." +#define IDS_WFD_NOCONTENT "No device found" +#define IDS_WFD_BUTTON_MULTI "Multi connect" +#define IDS_WFD_BUTTON_CANCEL "Cancel connect" +#define IDS_WFD_BUTTON_DISCONNECT_ALL "Disconnect all" +#define IDS_WFD_BUTTON_DISCONNECT "Disconnect" + +#define WFD_GLOBALIZATION_STR_LENGTH 256 + +typedef enum { + WFD_MULTI_CONNECT_MODE_NONE, + WFD_MULTI_CONNECT_MODE_IN_PROGRESS, + WFD_MULTI_CONNECT_MODE_COMPLETED, +} wfd_multi_connect_mode_e; + +typedef enum +{ + PEER_CONN_STATUS_DISCONNECTED, + PEER_CONN_STATUS_DISCONNECTING, + PEER_CONN_STATUS_CONNECTING = PEER_CONN_STATUS_DISCONNECTING, + PEER_CONN_STATUS_CONNECTED, + PEER_CONN_STATUS_FAILED_TO_CONNECT, + PEER_CONN_STATUS_WAIT_FOR_CONNECT, +} conn_status_e; + typedef struct { - char ssid[SSID_LENGTH]; + char ssid[SSID_LENGTH]; // 31 + 1('\0') unsigned int category; char mac_addr[MAC_LENGTH]; char if_addr[MAC_LENGTH]; - int conn_status; + conn_status_e conn_status; + bool is_group_owner; /** Is an active P2P Group Owner */ + bool is_persistent_group_owner; /** Is a stored Persistent GO */ + bool is_connected; /** Is peer connected*/ Elm_Object_Item *gl_item; } device_type_s; +typedef struct +{ + bool dev_sel_state; + device_type_s peer; +} wfd_multi_sel_data_s; + struct ug_data { Evas_Object *base; - struct ui_gadget *ug; + ui_gadget_h ug; Evas_Object *win; Evas_Object *bg; Evas_Object *naviframe; Evas_Object *genlist; - Elm_Object_Item *head; - Elm_Object_Item *noitem; - Elm_Object_Item *scan_btn; + Evas_Object *multiconn_view_genlist; Evas_Object *popup; Evas_Object *act_popup; Evas_Object *warn_popup; + Elm_Object_Item *head; + Elm_Object_Item *scan_btn; + Elm_Object_Item *multi_scan_btn; + Elm_Object_Item *multi_connect_btn; + + Elm_Object_Item *nodevice_title_item; + Elm_Object_Item *nodevice_item; + Elm_Object_Item *nodevice_sep_low_item; + + Elm_Object_Item *about_wfd_item; + Elm_Object_Item *about_wfdsp_sep_end_item; + + Elm_Object_Item *conn_wfd_item; + + Elm_Object_Item *conn_failed_wfd_item; + Elm_Object_Item *conn_failed_wfd_sep_item; + + Elm_Object_Item *avlbl_wfd_item; + + Elm_Object_Item *busy_wfd_item; + Elm_Object_Item *busy_wfd_sep_item; + + Elm_Object_Item *multi_connect_wfd_item; + + Elm_Object_Item *multi_button_item; + Elm_Object_Item *multi_button_sep_high_item; + Elm_Object_Item *multi_button_sep_low_item; + + + Elm_Object_Item *mcview_select_all_item; + Elm_Object_Item *mcview_title_item; + Elm_Object_Item *mcview_nodevice_item; + + + Evas_Object *multi_btn; + int head_text_mode; - device_type_s *peers; - int peer_cnt; + // Raw peer data + device_type_s raw_connected_peers[MAX_PEER_NUM]; + int raw_connected_peer_cnt; + device_type_s raw_discovered_peers[MAX_PEER_NUM]; + int raw_discovered_peer_cnt; + + // Peer data in the Genlist + device_type_s gl_connected_peers[MAX_PEER_NUM]; + int gl_connected_peer_cnt; + + device_type_s gl_connected_failed_peers[MAX_PEER_NUM]; + int gl_connected_failed_peer_cnt; + + device_type_s gl_available_peers[MAX_PEER_NUM]; + int gl_available_peer_cnt; + + device_type_s gl_busy_peers[MAX_PEER_NUM]; + int gl_busy_peer_cnt; + + device_type_s raw_multi_selected_peers[MAX_PEER_NUM]; + int raw_multi_selected_peer_cnt; + + device_type_s gl_multi_connect_peers[MAX_PEER_NUM]; + int gl_multi_connect_peer_cnt; + + // My status + bool I_am_group_owner; + bool I_am_connected; + + // Following variables are used at the Multi connect view. + wfd_multi_connect_mode_e multi_connect_mode; + wfd_multi_sel_data_s multi_conn_dev_list[MAX_PEER_NUM]; + int gl_available_dev_cnt_at_multiconn_view; + int g_source_multi_connect_next; int wfd_onoff; int wfd_status; char *dev_name; char *dev_pass; + + // For connect failed peers + int last_display_time; + Ecore_Timer *display_timer; + + //tethering + tethering_h hotspot_handle; + }; +extern Elm_Gen_Item_Class sep_itc; +extern Elm_Gen_Item_Class sep_itc_end; +extern Elm_Gen_Item_Class head_itc; +extern Elm_Gen_Item_Class name_itc; +extern Elm_Gen_Item_Class title_itc; +extern Elm_Gen_Item_Class peer_itc; +extern Elm_Gen_Item_Class noitem_itc; +extern Elm_Gen_Item_Class help_itc; +extern Elm_Gen_Item_Class button_itc; + +extern Elm_Gen_Item_Class title_conn_itc; +extern Elm_Gen_Item_Class peer_conn_itc; + +extern Elm_Gen_Item_Class title_busy_itc; +extern Elm_Gen_Item_Class peer_busy_itc; + +extern Elm_Gen_Item_Class title_multi_connect_itc; +extern Elm_Gen_Item_Class peer_multi_connect_itc; + +extern Elm_Gen_Item_Class title_conn_failed_itc; +extern Elm_Gen_Item_Class peer_conn_failed_itc; + -#endif /* __WFD_UG_H__ */ +#endif /* __WFD_UG_H__ */ diff --git a/ug-wifidirect/include/wfd_ug_view.h b/ug-wifidirect/include/wfd_ug_view.h index 755dd37..2a35949 100644..100755 --- a/ug-wifidirect/include/wfd_ug_view.h +++ b/ug-wifidirect/include/wfd_ug_view.h @@ -1,45 +1,61 @@ /* - * 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. - */ +* WiFi-Direct UG +* +* Copyright 2012 Samsung Electronics Co., Ltd -/* - * This file declares functions for view of Wi-Fi direct UI Gadget. - * - * @file wfd_ug_view.h - * @author Gibyoung Kim (lastkgb.kim@samsung.com) - * @version 0.1 - */ +* 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. +* +*/ #ifndef __WFD_UG_VIEW_H__ #define __WFD_UG_VIEW_H__ +#include <glib.h> +#include <syspopup_caller.h> + #define EDJDIR "/opt/ug/res/edje/ug-setting-wifidirect-efl" #define WFD_UG_EDJ_PATH EDJDIR"/wfd_ug.edj" #define WFD_IMG_DIR "/opt/ug/res/images/ug-setting-wifidirect-efl" +#define TICKERNOTI_SYSPOPUP "tickernoti-syspopup" + + +/* Define icons */ -#define WFD_ICON_DEVICE_PC WFD_IMG_DIR"/A09_device_computer.png" -#define WFD_ICON_DEVICE_KEYBOARD WFD_IMG_DIR"/31_BT_device_keyboard.png" -#define WFD_ICON_DEVICE_PRINTER WFD_IMG_DIR"/31_BT_device_printer.png" -#define WFD_ICON_DEVICE_UNKNOWN WFD_IMG_DIR"/31_BT_device_unknown.png" -#define WFD_ICON_DEVICE_PHONE WFD_IMG_DIR"/A09_device_mobile.png" -#define WFD_ICON_DEVICE_HEADSET WFD_IMG_DIR"/31_BT_device_headset.png" +#define WFD_ICON_DEVICE_COMPUTER WFD_IMG_DIR"/A09_device_computer.png" +#define WFD_ICON_DEVICE_INPUT_DEVICE WFD_IMG_DIR"/A09_device_input_device.png" +#define WFD_ICON_DEVICE_PRINTER WFD_IMG_DIR"/A09_device_printer.png" +#define WFD_ICON_DEVICE_CAMERA WFD_IMG_DIR"/A09_device_camera.png" +#define WFD_ICON_DEVICE_STORAGE WFD_IMG_DIR"/A09_device_storage.png" +#define WFD_ICON_DEVICE_NETWORK_INFRA WFD_IMG_DIR"/A09_device_network_infrastructure.png" +#define WFD_ICON_DEVICE_DISPLAY WFD_IMG_DIR"/A09_device_display.png" +#define WFD_ICON_DEVICE_MULTIMEDIA_DEVICE WFD_IMG_DIR"/A09_device_multimedia_devices.png" +#define WFD_ICON_DEVICE_GAMING_DEVICE WFD_IMG_DIR"/A09_device_gaming_devices.png" +#define WFD_ICON_DEVICE_TELEPHONE WFD_IMG_DIR"/A09_device_telephone.png" +#define WFD_ICON_DEVICE_AUDIO_DEVICE WFD_IMG_DIR"/A09_device_audio_devices.png" -#define WFD_ICON_DEVICE_MOUSE WFD_IMG_DIR"/31_BT_device_mouse.png" +#define WFD_ICON_DEVICE_COMPUTER_CONNECT WFD_IMG_DIR"/A09_device_computer_connect.png" +#define WFD_ICON_DEVICE_INPUT_DEVICE_CONNECT WFD_IMG_DIR"/A09_device_input_device_connect.png" +#define WFD_ICON_DEVICE_PRINTER_CONNECT WFD_IMG_DIR"/A09_device_printer_connect.png" +#define WFD_ICON_DEVICE_CAMERA_CONNECT WFD_IMG_DIR"/A09_device_camera_connect.png" +#define WFD_ICON_DEVICE_STORAGE_CONNECT WFD_IMG_DIR"/A09_device_storage_connect.png" +#define WFD_ICON_DEVICE_NETWORK_INFRA_CONNECT WFD_IMG_DIR"/A09_device_network_infrastructure_connect.png" +#define WFD_ICON_DEVICE_DISPLAY_CONNECT WFD_IMG_DIR"/A09_device_display_connect.png" +#define WFD_ICON_DEVICE_MULTIMEDIA_DEVICE_CONNECT WFD_IMG_DIR"/A09_device_multimedia_devices_connect.png" +#define WFD_ICON_DEVICE_GAMING_DEVICE_CONNECT WFD_IMG_DIR"/A09_device_gaming_devices_connect.png" +#define WFD_ICON_DEVICE_TELEPHONE_CONNECT WFD_IMG_DIR"/A09_device_telephone_connect.png" +#define WFD_ICON_DEVICE_AUDIO_DEVICE_CONNECT WFD_IMG_DIR"/A09_device_audio_devices_connect.png" -#define WFD_ICON_CONNECTED WFD_IMG_DIR"/A09_Connect.png" +#define WFD_ICON_CONNECTED WFD_IMG_DIR"/A09_Connect.png" enum @@ -53,29 +69,71 @@ enum enum { + /* User confirm */ POPUP_TYPE_WIFI_OFF, POPUP_TYPE_HOTSPOT_OFF, + /* Activation */ POPUP_TYPE_ACTIVATE_FAIL, POPUP_TYPE_DEACTIVATE_FAIL, + /* Connection */ POPUP_TYPE_LINK_TIMEOUT, POPUP_TYPE_AUTH_FAIL, POPUP_TYPE_LINK_FAIL, POPUP_TYPE_UNKNOWN_ERROR, POPUP_TYPE_TERMINATE, + + /* Disconnect */ + POP_TYPE_DISCONNECT, + + /* Disconnect All*/ + POP_TYPE_DISCONNECT_ALL, + + /* Scan again */ + POP_TYPE_SCAN_AGAIN, + + /* multi connect */ + POP_TYPE_MULTI_CONNECT_POPUP, + + /* Busy device */ + POP_TYPE_BUSY_DEVICE_POPUP, }; +struct ug_data *wfd_get_ug_data(); void create_wfd_ug_view(void *data); void destroy_wfd_ug_view(void *data); void wfd_ug_view_refresh_glitem(void *obj); -void wfd_ug_view_refresh_button(void *obj, int enable); +void wfd_ug_view_refresh_button(void *obj, const char *text, int enable); void wfd_ug_view_update_peers(void *data); void wfd_ug_view_free_peers(void *data); void wfd_ug_act_popup(void *data, const char *message, int popup_type); void wfg_ug_act_popup_remove(void *data); void wfd_ug_warn_popup(void *data, const char *message, int popup_type); void wfg_ug_warn_popup_remove(void *data); +int _create_connected_dev_list(void *data); +int _change_multi_button_title(void *data); + +void _wifid_create_about_view(struct ug_data *ugd); +void _wifid_create_multiconnect_view(struct ug_data *ugd); + +void _sub_view_back_btn_cb(void *data, Evas_Object * obj, void *event_info); +void _back_btn_cb(void *data, Evas_Object * obj, void *event_info); +void _scan_btn_cb(void *data, Evas_Object * obj, void *event_info); + +void _wfd_onoff_btn_cb(void *data, Evas_Object *obj, void *event_info); +void _wifid_create_multibutton_cb(void *data, Evas_Object * obj, void *event_info); + +int wfd_ug_get_discovered_peers(struct ug_data *ugd); +int wfd_ug_get_connected_peers(struct ug_data *ugd); +int wfd_refresh_wifi_direct_state(void* data); + +int wfd_multi_connect_next(void* data); +int wfd_stop_multi_connect(void *data); + +gboolean wfd_multi_connect_next_cb(void* data); + +void wfd_ug_tickernoti_popup(char *msg); -#endif /* __WFD_UG_VIEW_H__ */ +#endif /* __WFD_UG_VIEW_H__ */ diff --git a/ug-wifidirect/po/en.po b/ug-wifidirect/po/en.po index 2dbaeb8..a7b10da 100644..100755 --- a/ug-wifidirect/po/en.po +++ b/ug-wifidirect/po/en.po @@ -7,15 +7,6 @@ msgstr "Deactivating Wi-Fi Direct..." msgid "IDS_WFD_BODY_ACTIVATING" msgstr "Activating Wi-Fi Direct..." -msgid "IDS_WFD_BODY_SCANNING" -msgstr "Scanning..." - -msgid "IDS_WFD_BODY_ACTIVATED" -msgstr "Wi-Fi Direct activated" - -msgid "IDS_WFD_BODY_DEVICE_NAME" -msgstr "Device name" - msgid "IDS_WFD_BODY_AVAILABLE_DEVICES" msgstr "Available Devices" @@ -34,6 +25,9 @@ msgstr "Connecting..." msgid "IDS_WFD_POP_CONNECTED" msgstr "Connected" +msgid "IDS_WFD_BUTTON_CONNECT" +msgstr "Connect" + msgid "IDS_WFD_BUTTON_SCAN" msgstr "Scan" @@ -59,13 +53,31 @@ msgid "IDS_WFD_POP_UNKNOWN_ERROR" msgstr "Unknown error" msgid "IDS_WFD_POP_WIFI_OFF" -msgstr "This will turn off Wi-Fi client operation.<br>Continue?" +msgstr "Enabling Wi-Fi Direct will disable Wi-Fi.<br>Continue?" msgid "IDS_WFD_POP_HOTSPOT_OFF" -msgstr "This will turn off Portable Wi-Fi hotspots operation.<br>Continue?" +msgstr "Enabling Wi-Fi Direct will disable Wi-Fi tethering.<br>Continue?" msgid "IDS_WFD_POP_NOT_SUPPORTED_DEVICE" msgstr "This device do not support<br>Wi-Fi Direct Service" msgid "IDS_WFD_POP_PROBLEM_WITH_WFD" msgstr "This device have some problem with<br>Wi-Fi Direct Service" + +msgid "IDS_WFD_POP_CANCEL_CONNECT" +msgstr "Cancel Wi-Fi direct connection.<br>Continue?" + +msgid "IDS_WFD_POP_DISCONNECT" +msgstr "Current connect will be disconnected." + +msgid "IDS_WFD_POP_SCAN_AGAIN" +msgstr "To start new scanning,<br>current connection will be<br>ended.Continue?" + +msgid "IDS_WFD_POP_MULTI_CONNECT" +msgstr "You can connect up to<br>%d devices at the same time." + +msgid "IDS_WFD_POP_WARN_BUSY_DEVICE" +msgstr "Unavailable device. Device is connected to another device." + +msgid "IDS_WFD_POP_SELECTED_DEVICE_NUM" +msgstr "Selected(%d)"
\ No newline at end of file diff --git a/ug-wifidirect/po/en_GB.po b/ug-wifidirect/po/en_GB.po index 2dbaeb8..d214083 100644..100755 --- a/ug-wifidirect/po/en_GB.po +++ b/ug-wifidirect/po/en_GB.po @@ -34,6 +34,9 @@ msgstr "Connecting..." msgid "IDS_WFD_POP_CONNECTED" msgstr "Connected" +msgid "IDS_WFD_BUTTON_CONNECT" +msgstr "Connect" + msgid "IDS_WFD_BUTTON_SCAN" msgstr "Scan" @@ -59,7 +62,7 @@ msgid "IDS_WFD_POP_UNKNOWN_ERROR" msgstr "Unknown error" msgid "IDS_WFD_POP_WIFI_OFF" -msgstr "This will turn off Wi-Fi client operation.<br>Continue?" +msgstr "Enabling Wi-Fi Direct will disable Wi-Fi.<br>Continue?" msgid "IDS_WFD_POP_HOTSPOT_OFF" msgstr "This will turn off Portable Wi-Fi hotspots operation.<br>Continue?" @@ -69,3 +72,18 @@ msgstr "This device do not support<br>Wi-Fi Direct Service" msgid "IDS_WFD_POP_PROBLEM_WITH_WFD" msgstr "This device have some problem with<br>Wi-Fi Direct Service" + +msgid "IDS_WFD_POP_CANCEL_CONNECT" +msgstr "Cancel Wi-Fi direct connection.<br>Continue?" + +msgid "IDS_WFD_POP_DISCONNECT" +msgstr "Current connect wil be disconnected." + +msgid "IDS_WFD_POP_SCAN_AGAIN" +msgstr "To start new scanning,<br>current connection will be<br>ended.Continue?" + +msgid "IDS_WFD_POP_MULTI_CONNECT" +msgstr "You can connect up to<br>%d devices at the same time." + +msgid "IDS_WFD_POP_WARN_BUSY_DEVICE" +msgstr "Unavailable device. Device is connected to another device."
\ No newline at end of file diff --git a/ug-wifidirect/po/en_US.po b/ug-wifidirect/po/en_US.po index 2dbaeb8..d214083 100644..100755 --- a/ug-wifidirect/po/en_US.po +++ b/ug-wifidirect/po/en_US.po @@ -34,6 +34,9 @@ msgstr "Connecting..." msgid "IDS_WFD_POP_CONNECTED" msgstr "Connected" +msgid "IDS_WFD_BUTTON_CONNECT" +msgstr "Connect" + msgid "IDS_WFD_BUTTON_SCAN" msgstr "Scan" @@ -59,7 +62,7 @@ msgid "IDS_WFD_POP_UNKNOWN_ERROR" msgstr "Unknown error" msgid "IDS_WFD_POP_WIFI_OFF" -msgstr "This will turn off Wi-Fi client operation.<br>Continue?" +msgstr "Enabling Wi-Fi Direct will disable Wi-Fi.<br>Continue?" msgid "IDS_WFD_POP_HOTSPOT_OFF" msgstr "This will turn off Portable Wi-Fi hotspots operation.<br>Continue?" @@ -69,3 +72,18 @@ msgstr "This device do not support<br>Wi-Fi Direct Service" msgid "IDS_WFD_POP_PROBLEM_WITH_WFD" msgstr "This device have some problem with<br>Wi-Fi Direct Service" + +msgid "IDS_WFD_POP_CANCEL_CONNECT" +msgstr "Cancel Wi-Fi direct connection.<br>Continue?" + +msgid "IDS_WFD_POP_DISCONNECT" +msgstr "Current connect wil be disconnected." + +msgid "IDS_WFD_POP_SCAN_AGAIN" +msgstr "To start new scanning,<br>current connection will be<br>ended.Continue?" + +msgid "IDS_WFD_POP_MULTI_CONNECT" +msgstr "You can connect up to<br>%d devices at the same time." + +msgid "IDS_WFD_POP_WARN_BUSY_DEVICE" +msgstr "Unavailable device. Device is connected to another device."
\ No newline at end of file diff --git a/ug-wifidirect/po/ja.po b/ug-wifidirect/po/ja.po index 2dbaeb8..d214083 100644..100755 --- a/ug-wifidirect/po/ja.po +++ b/ug-wifidirect/po/ja.po @@ -34,6 +34,9 @@ msgstr "Connecting..." msgid "IDS_WFD_POP_CONNECTED" msgstr "Connected" +msgid "IDS_WFD_BUTTON_CONNECT" +msgstr "Connect" + msgid "IDS_WFD_BUTTON_SCAN" msgstr "Scan" @@ -59,7 +62,7 @@ msgid "IDS_WFD_POP_UNKNOWN_ERROR" msgstr "Unknown error" msgid "IDS_WFD_POP_WIFI_OFF" -msgstr "This will turn off Wi-Fi client operation.<br>Continue?" +msgstr "Enabling Wi-Fi Direct will disable Wi-Fi.<br>Continue?" msgid "IDS_WFD_POP_HOTSPOT_OFF" msgstr "This will turn off Portable Wi-Fi hotspots operation.<br>Continue?" @@ -69,3 +72,18 @@ msgstr "This device do not support<br>Wi-Fi Direct Service" msgid "IDS_WFD_POP_PROBLEM_WITH_WFD" msgstr "This device have some problem with<br>Wi-Fi Direct Service" + +msgid "IDS_WFD_POP_CANCEL_CONNECT" +msgstr "Cancel Wi-Fi direct connection.<br>Continue?" + +msgid "IDS_WFD_POP_DISCONNECT" +msgstr "Current connect wil be disconnected." + +msgid "IDS_WFD_POP_SCAN_AGAIN" +msgstr "To start new scanning,<br>current connection will be<br>ended.Continue?" + +msgid "IDS_WFD_POP_MULTI_CONNECT" +msgstr "You can connect up to<br>%d devices at the same time." + +msgid "IDS_WFD_POP_WARN_BUSY_DEVICE" +msgstr "Unavailable device. Device is connected to another device."
\ No newline at end of file diff --git a/ug-wifidirect/po/ko_KR.po b/ug-wifidirect/po/ko_KR.po index f4525a2..147a5fb 100644..100755 --- a/ug-wifidirect/po/ko_KR.po +++ b/ug-wifidirect/po/ko_KR.po @@ -34,6 +34,9 @@ msgstr "연결중..." msgid "IDS_WFD_POP_CONNECTED" msgstr "ì—°ê²°ë˜ì—ˆìŠµë‹ˆë‹¤." +msgid "IDS_WFD_BUTTON_CONNECT" +msgstr "Connect" + msgid "IDS_WFD_BUTTON_SCAN" msgstr "검색" @@ -69,3 +72,18 @@ msgstr "Wi-Fi Direct Service를 지ì›í•˜ì§€ 않는 장치입니다." msgid "IDS_WFD_POP_PROBLEM_WITH_WFD" msgstr "Wi-Fi Direct Serviceì— ë¬¸ì œê°€ 있습니다." + +msgid "IDS_WFD_POP_CANCEL_CONNECT" +msgstr "Cancel Wi-Fi direct connection.<br>Continue?" + +msgid "IDS_WFD_POP_DISCONNECT" +msgstr "Current connect wil be disconnected." + +msgid "IDS_WFD_POP_SCAN_AGAIN" +msgstr "To start new scanning,<br>current connection will be<br>ended.Continue?" + +msgid "IDS_WFD_POP_MULTI_CONNECT" +msgstr "You can connect up to<br>%d devices at the same time." + +msgid "IDS_WFD_POP_WARN_BUSY_DEVICE" +msgstr "Unavailable device. Device is connected to another device."
\ No newline at end of file diff --git a/ug-wifidirect/po/zh_CN.po b/ug-wifidirect/po/zh_CN.po index 2dbaeb8..2a0de42 100644..100755 --- a/ug-wifidirect/po/zh_CN.po +++ b/ug-wifidirect/po/zh_CN.po @@ -2,70 +2,88 @@ msgid "IDS_WFD_HEADER_WIFI_DIRECT" msgstr "Wi-Fi Direct" msgid "IDS_WFD_BODY_DEACTIVATING" -msgstr "Deactivating Wi-Fi Direct..." +msgstr "ÕýÔڹرÕWi-Fi Direct..." msgid "IDS_WFD_BODY_ACTIVATING" -msgstr "Activating Wi-Fi Direct..." +msgstr "ÕýÔÚ´ò¿ªWi-Fi Direct..." msgid "IDS_WFD_BODY_SCANNING" -msgstr "Scanning..." +msgstr "ɨÃèÖÐ..." msgid "IDS_WFD_BODY_ACTIVATED" -msgstr "Wi-Fi Direct activated" +msgstr "ÒѹرÕWi-Fi Direct" msgid "IDS_WFD_BODY_DEVICE_NAME" -msgstr "Device name" +msgstr "É豸Ãû" msgid "IDS_WFD_BODY_AVAILABLE_DEVICES" -msgstr "Available Devices" +msgstr "ÓÐЧÉ豸" msgid "IDS_WFD_BODY_WIFI_DIRECT_DEVICES" -msgstr "Wi-Fi Direct Devices" +msgstr "Wi-Fi DirectÉ豸" msgid "IDS_WFD_BODY_NO_DEVICES" -msgstr "No devices" +msgstr "ûÓÐÉ豸" msgid "IDS_WFD_BODY_HELP" -msgstr "HELP" +msgstr "°ïÖú" msgid "IDS_WFD_POP_CONNECTING" -msgstr "Connecting..." +msgstr "Á¬½ÓÖÐ..." msgid "IDS_WFD_POP_CONNECTED" -msgstr "Connected" +msgstr "ÒÑÁ¬½Ó" + +msgid "IDS_WFD_BUTTON_CONNECT" +msgstr "Á¬½Ó" msgid "IDS_WFD_BUTTON_SCAN" -msgstr "Scan" +msgstr "ɨÃè" msgid "IDS_WFD_BUTTON_STOPSCAN" -msgstr "Stop" +msgstr "Í£Ö¹" msgid "IDS_WFD_POP_ACTIVATE_FAIL" -msgstr "Failed to activate Wi-Fi Direct" +msgstr "´ò¿ªWi-Fi Directʧ°Ü" msgid "IDS_WFD_POP_DEACTIVATE_FAIL" -msgstr "Failed to deactivate Wi-Fi Direct" +msgstr "¹Ø±ÕWi-Fi Directʧ°Ü" msgid "IDS_WFD_POP_CONNECTING_TIMEOUT" -msgstr "Connecting is timeout" +msgstr "Á¬½Ó³¬Ê±" msgid "IDS_WFD_POP_AUTH_FAIL" -msgstr "Authentication failure" +msgstr "ÈÏ֤ʧ°Ü" msgid "IDS_WFD_POP_LINK_FAIL" -msgstr "Link creation failure" +msgstr "´´½¨Á¬½Óʧ°Ü" msgid "IDS_WFD_POP_UNKNOWN_ERROR" -msgstr "Unknown error" +msgstr "δ֪´íÎó" msgid "IDS_WFD_POP_WIFI_OFF" -msgstr "This will turn off Wi-Fi client operation.<br>Continue?" +msgstr "´ò¿ªWi-Fi Direct½«¹Ø±ÕWi-Fi.<br>ÊÇ·ñ¼ÌÐø?" msgid "IDS_WFD_POP_HOTSPOT_OFF" -msgstr "This will turn off Portable Wi-Fi hotspots operation.<br>Continue?" +msgstr "Õ⽫¹Ø±Õ¶ÔWi-FiÈȵãµÄ²Ù×÷.<br>ÊÇ·ñ¼ÌÐø?" msgid "IDS_WFD_POP_NOT_SUPPORTED_DEVICE" -msgstr "This device do not support<br>Wi-Fi Direct Service" +msgstr "¸ÃÉ豸²»Ö§³Ö<br>Wi-Fi Direct·þÎñ" msgid "IDS_WFD_POP_PROBLEM_WITH_WFD" -msgstr "This device have some problem with<br>Wi-Fi Direct Service" +msgstr "¸ÃÉ豸<br>Wi-Fi Direct Service" + +msgid "IDS_WFD_POP_CANCEL_CONNECT" +msgstr "È¡ÏûWi-Fi directÁ¬½Ó.<br>ÊÇ·ñ¼ÌÐø?" + +msgid "IDS_WFD_POP_DISCONNECT" +msgstr "µ±Ç°Á¬½Ó½«±»¹Ø±Õ." + +msgid "IDS_WFD_POP_SCAN_AGAIN" +msgstr "½«¿ªÊ¼ÖØÐÂɨÃè,<br>µ±Ç°Á¬½Ó½«±»<br>¹Ø±Õ.ÊÇ·ñ¼ÌÐø?" + +msgid "IDS_WFD_POP_MULTI_CONNECT" +msgstr "Ä㽫ͬʱÁ¬½Ó<br>%d̨É豸." + +msgid "IDS_WFD_POP_WARN_BUSY_DEVICE" +msgstr "ÎÞЧµÄÉ豸. ¸ÃÉ豸Òѱ»ÆäËüÉ豸Á¬½Ó."
\ No newline at end of file diff --git a/ug-wifidirect/resources/images/31_BT_device_headset.png b/ug-wifidirect/resources/images/31_BT_device_headset.png Binary files differdeleted file mode 100755 index 0150a55..0000000 --- a/ug-wifidirect/resources/images/31_BT_device_headset.png +++ /dev/null diff --git a/ug-wifidirect/resources/images/31_BT_device_keyboard.png b/ug-wifidirect/resources/images/31_BT_device_keyboard.png Binary files differdeleted file mode 100755 index 8d16510..0000000 --- a/ug-wifidirect/resources/images/31_BT_device_keyboard.png +++ /dev/null diff --git a/ug-wifidirect/resources/images/31_BT_device_mouse.png b/ug-wifidirect/resources/images/31_BT_device_mouse.png Binary files differdeleted file mode 100755 index a994030..0000000 --- a/ug-wifidirect/resources/images/31_BT_device_mouse.png +++ /dev/null diff --git a/ug-wifidirect/resources/images/31_BT_device_printer.png b/ug-wifidirect/resources/images/31_BT_device_printer.png Binary files differdeleted file mode 100755 index ea025b1..0000000 --- a/ug-wifidirect/resources/images/31_BT_device_printer.png +++ /dev/null diff --git a/ug-wifidirect/resources/images/31_BT_device_unknown.png b/ug-wifidirect/resources/images/31_BT_device_unknown.png Binary files differdeleted file mode 100755 index 70699f1..0000000 --- a/ug-wifidirect/resources/images/31_BT_device_unknown.png +++ /dev/null diff --git a/ug-wifidirect/resources/images/A09_device_My_laptop.png b/ug-wifidirect/resources/images/A09_device_My_laptop.png Binary files differdeleted file mode 100755 index 5e2f10a..0000000 --- a/ug-wifidirect/resources/images/A09_device_My_laptop.png +++ /dev/null diff --git a/ug-wifidirect/resources/images/A09_device_audio_devices.png b/ug-wifidirect/resources/images/A09_device_audio_devices.png Binary files differnew file mode 100755 index 0000000..a9eddde --- /dev/null +++ b/ug-wifidirect/resources/images/A09_device_audio_devices.png diff --git a/ug-wifidirect/resources/images/A09_device_audio_devices_connect.png b/ug-wifidirect/resources/images/A09_device_audio_devices_connect.png Binary files differnew file mode 100644 index 0000000..afc8967 --- /dev/null +++ b/ug-wifidirect/resources/images/A09_device_audio_devices_connect.png diff --git a/ug-wifidirect/resources/images/A09_device_camera.png b/ug-wifidirect/resources/images/A09_device_camera.png Binary files differnew file mode 100755 index 0000000..ee1cc73 --- /dev/null +++ b/ug-wifidirect/resources/images/A09_device_camera.png diff --git a/ug-wifidirect/resources/images/A09_device_camera_connect.png b/ug-wifidirect/resources/images/A09_device_camera_connect.png Binary files differnew file mode 100644 index 0000000..623056a --- /dev/null +++ b/ug-wifidirect/resources/images/A09_device_camera_connect.png diff --git a/ug-wifidirect/resources/images/A09_device_computer.png b/ug-wifidirect/resources/images/A09_device_computer.png Binary files differindex 6c4a633..293deb7 100755 --- a/ug-wifidirect/resources/images/A09_device_computer.png +++ b/ug-wifidirect/resources/images/A09_device_computer.png diff --git a/ug-wifidirect/resources/images/A09_device_computer_connect.png b/ug-wifidirect/resources/images/A09_device_computer_connect.png Binary files differnew file mode 100644 index 0000000..8968996 --- /dev/null +++ b/ug-wifidirect/resources/images/A09_device_computer_connect.png diff --git a/ug-wifidirect/resources/images/A09_device_display.png b/ug-wifidirect/resources/images/A09_device_display.png Binary files differnew file mode 100755 index 0000000..87aa317 --- /dev/null +++ b/ug-wifidirect/resources/images/A09_device_display.png diff --git a/ug-wifidirect/resources/images/A09_device_display_connect.png b/ug-wifidirect/resources/images/A09_device_display_connect.png Binary files differnew file mode 100644 index 0000000..361009a --- /dev/null +++ b/ug-wifidirect/resources/images/A09_device_display_connect.png diff --git a/ug-wifidirect/resources/images/A09_device_gaming_devices.png b/ug-wifidirect/resources/images/A09_device_gaming_devices.png Binary files differnew file mode 100755 index 0000000..8672a46 --- /dev/null +++ b/ug-wifidirect/resources/images/A09_device_gaming_devices.png diff --git a/ug-wifidirect/resources/images/A09_device_input_device.png b/ug-wifidirect/resources/images/A09_device_input_device.png Binary files differnew file mode 100755 index 0000000..4130993 --- /dev/null +++ b/ug-wifidirect/resources/images/A09_device_input_device.png diff --git a/ug-wifidirect/resources/images/A09_device_input_device_connect.png b/ug-wifidirect/resources/images/A09_device_input_device_connect.png Binary files differnew file mode 100644 index 0000000..5de49c3 --- /dev/null +++ b/ug-wifidirect/resources/images/A09_device_input_device_connect.png diff --git a/ug-wifidirect/resources/images/A09_device_mobile.png b/ug-wifidirect/resources/images/A09_device_mobile.png Binary files differdeleted file mode 100755 index a671a84..0000000 --- a/ug-wifidirect/resources/images/A09_device_mobile.png +++ /dev/null diff --git a/ug-wifidirect/resources/images/A09_device_multimedia_devices.png b/ug-wifidirect/resources/images/A09_device_multimedia_devices.png Binary files differnew file mode 100755 index 0000000..0d10f38 --- /dev/null +++ b/ug-wifidirect/resources/images/A09_device_multimedia_devices.png diff --git a/ug-wifidirect/resources/images/A09_device_multimedia_devices_connect.png b/ug-wifidirect/resources/images/A09_device_multimedia_devices_connect.png Binary files differnew file mode 100644 index 0000000..367209f --- /dev/null +++ b/ug-wifidirect/resources/images/A09_device_multimedia_devices_connect.png diff --git a/ug-wifidirect/resources/images/A09_device_network_infrastructure.png b/ug-wifidirect/resources/images/A09_device_network_infrastructure.png Binary files differnew file mode 100755 index 0000000..f0ef92c --- /dev/null +++ b/ug-wifidirect/resources/images/A09_device_network_infrastructure.png diff --git a/ug-wifidirect/resources/images/A09_device_network_infrastructure_connect.png b/ug-wifidirect/resources/images/A09_device_network_infrastructure_connect.png Binary files differnew file mode 100644 index 0000000..8699a57 --- /dev/null +++ b/ug-wifidirect/resources/images/A09_device_network_infrastructure_connect.png diff --git a/ug-wifidirect/resources/images/A09_device_printer.png b/ug-wifidirect/resources/images/A09_device_printer.png Binary files differnew file mode 100755 index 0000000..3b36c01 --- /dev/null +++ b/ug-wifidirect/resources/images/A09_device_printer.png diff --git a/ug-wifidirect/resources/images/A09_device_printer_connect.png b/ug-wifidirect/resources/images/A09_device_printer_connect.png Binary files differnew file mode 100644 index 0000000..13d860f --- /dev/null +++ b/ug-wifidirect/resources/images/A09_device_printer_connect.png diff --git a/ug-wifidirect/resources/images/A09_device_storage.png b/ug-wifidirect/resources/images/A09_device_storage.png Binary files differnew file mode 100755 index 0000000..d0d94e9 --- /dev/null +++ b/ug-wifidirect/resources/images/A09_device_storage.png diff --git a/ug-wifidirect/resources/images/A09_device_storage_connect.png b/ug-wifidirect/resources/images/A09_device_storage_connect.png Binary files differnew file mode 100644 index 0000000..c63de69 --- /dev/null +++ b/ug-wifidirect/resources/images/A09_device_storage_connect.png diff --git a/ug-wifidirect/resources/images/A09_device_telephone.png b/ug-wifidirect/resources/images/A09_device_telephone.png Binary files differnew file mode 100755 index 0000000..83d7507 --- /dev/null +++ b/ug-wifidirect/resources/images/A09_device_telephone.png diff --git a/ug-wifidirect/resources/images/A09_device_telephone_connect.png b/ug-wifidirect/resources/images/A09_device_telephone_connect.png Binary files differnew file mode 100644 index 0000000..b6a7e14 --- /dev/null +++ b/ug-wifidirect/resources/images/A09_device_telephone_connect.png diff --git a/ug-wifidirect/src/wfd_client.c b/ug-wifidirect/src/wfd_client.c index 255baa9..e565b52 100644..100755 --- a/ug-wifidirect/src/wfd_client.c +++ b/ug-wifidirect/src/wfd_client.c @@ -1,26 +1,21 @@ /* - * 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. - */ +* WiFi-Direct UG +* +* Copyright 2012 Samsung Electronics Co., Ltd -/* - * This file implements Wi-Fi direct client functions. - * - * @file wfd_client.c - * @author Gibyoung Kim (lastkgb.kim@samsung.com) - * @version 0.1 - */ +* 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 <stdio.h> #include <stdbool.h> @@ -29,6 +24,8 @@ #include <Elementary.h> #include <pmapi.h> #include <vconf.h> +//#include <vconf-keys.h> +#include <tethering.h> #include <network-cm-intf.h> #include <network-wifi-intf.h> #include <wifi-direct.h> @@ -37,9 +34,6 @@ #include "wfd_ug_view.h" #include "wfd_client.h" - - - static void _wifi_state_cb(keynode_t *key, void *data) { __FUNC_ENTER__; @@ -51,10 +45,11 @@ static void _wifi_state_cb(keynode_t *key, void *data) if (res != 0) { DBG(LOG_ERROR, "Failed to get wifi state from vconf. [%d]\n", res); + // TODO: set genlist head item as "WiFi Direct" return; } - if (wifi_state == VCONFKEY_WIFI_OFF) + if(wifi_state == VCONFKEY_WIFI_OFF) { DBG(LOG_VERBOSE, "WiFi is turned off\n"); wfd_client_swtch_force(ugd, TRUE); @@ -65,7 +60,7 @@ static void _wifi_state_cb(keynode_t *key, void *data) } res = net_deregister_client(); - if (res != NET_ERR_NONE) + if(res != NET_ERR_NONE) { DBG(LOG_ERROR, "Failed to deregister network client. [%d]\n", res); } @@ -94,14 +89,14 @@ int wfd_wifi_off(void *data) } DBG(LOG_VERBOSE, "Vconf key callback is registered\n"); res = net_register_client((net_event_cb_t) _network_event_cb, NULL); - if (res != NET_ERR_NONE) + if(res != NET_ERR_NONE) { DBG(LOG_ERROR, "Failed to register network client. [%d]\n", res); return -1; } DBG(LOG_VERBOSE, "Network client is registered\n"); res = net_wifi_power_off(); - if (res != NET_ERR_NONE) + if(res != NET_ERR_NONE) { DBG(LOG_ERROR, "Failed to turn off wifi. [%d]\n", res); return -1; @@ -111,194 +106,350 @@ int wfd_wifi_off(void *data) return 0; } +static void _hotspot_state_cb(keynode_t *key, void *data) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + int res; + int hotspot_mode; + tethering_error_e ret = TETHERING_ERROR_NONE; + tethering_h th = NULL; + + res = vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &hotspot_mode); + if (res != 0) + { + DBG(LOG_ERROR, "Failed to get mobile hotspot state from vconf. [%d]\n", res); + // TODO: set genlist head item as "WiFi Direct" + return; + } + + if(hotspot_mode & VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI) + { + DBG(LOG_VERBOSE, " Mobile hotspot is activated\n"); + } + else + { + DBG(LOG_VERBOSE, " Mobile hotspot is deactivated\n"); + wfd_client_swtch_force(ugd, TRUE); + } + + th = ugd->hotspot_handle; + + if(th != NULL) + { + /* Deregister cbs */ + ret = tethering_unset_disabled_cb(th, TETHERING_TYPE_WIFI); + if(ret != TETHERING_ERROR_NONE) + DBG(LOG_ERROR, "tethering_unset_disabled_cb is failed(%d)\n", ret); + + /* Destroy tethering handle */ + ret = tethering_destroy(th); + if(ret != TETHERING_ERROR_NONE) + DBG(LOG_ERROR, "tethering_destroy is failed(%d)\n", ret); + + ugd->hotspot_handle = NULL; + } + + __FUNC_EXIT__; +} + +static void __disabled_cb(tethering_error_e error, tethering_type_e type, tethering_disabled_cause_e code, void *data) +{ + __FUNC_ENTER__; + + if (error != TETHERING_ERROR_NONE) { + + if (code != TETHERING_DISABLED_BY_REQUEST) { + return; + } + DBG(LOG_ERROR, "error !!! TETHERING is not disabled.\n"); + return; + } + + DBG(LOG_VERBOSE, "TETHERING is disabled.\n"); + + __FUNC_EXIT__; + + return; +} + + +int wfd_mobile_ap_off(void *data) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + int res; + tethering_error_e ret = TETHERING_ERROR_NONE; + tethering_h th = NULL; + + res = vconf_notify_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE, _hotspot_state_cb, ugd); + if (res == -1) + { + DBG(LOG_ERROR, "Failed to register vconf callback\n"); + return -1; + } + + /* Create tethering handle */ + ret = tethering_create(&th); + if(ret != TETHERING_ERROR_NONE) + { + DBG(LOG_ERROR, "Failed to tethering_create() [%d]\n", ret); + return -1; + } + else + { + DBG(LOG_VERBOSE, "Succeeded to tethering_create()\n"); + } + + /* Register cbs */ + ret = tethering_set_disabled_cb(th, TETHERING_TYPE_WIFI, + __disabled_cb, NULL); + if(ret != TETHERING_ERROR_NONE) + { + DBG(LOG_ERROR, "tethering_set_disabled_cb is failed\n", ret); + return -1; + } + + /* Disable tethering */ + ret = tethering_disable(th, TETHERING_TYPE_WIFI); + if(ret != TETHERING_ERROR_NONE) + { + DBG(LOG_ERROR, "Failed to turn off mobile hotspot. [%d]\n", ret); + return -1; + } + else + { + DBG(LOG_VERBOSE, "Succeeded to turn off mobile hotspot\n"); + } + + ugd->hotspot_handle = th; + + + __FUNC_EXIT__; + return 0; +} + +#if 0 static device_type_s *wfd_client_find_peer_by_ssid(void *data, const char *ssid) { __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data *) data; + struct ug_data *ugd = (struct ug_data*) data; int i; - if (ugd == NULL) + if(ugd == NULL) { DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); return NULL; } - for (i = 0; i < ugd->peer_cnt; i++) + for(i=0; i<ugd->gl_available_peer_cnt; i++) { DBG(LOG_VERBOSE, "check %dth peer\n", i); - if (!strcmp(ugd->peers[i].ssid, ssid)) + if(!strcmp(ugd->gl_available_peers[i].ssid, ssid)) { DBG(LOG_VERBOSE, "found peer. [%d]\n", i); __FUNC_EXIT__; - return &ugd->peers[i]; + return &ugd->gl_available_peers[i]; } } __FUNC_EXIT__; return NULL; } +#endif -static device_type_s *wfd_client_find_peer_by_mac(void *data, - const char *mac_addr) +static device_type_s *wfd_client_find_peer_by_mac(void *data, const char *mac_addr) { __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data *) data; + struct ug_data *ugd = (struct ug_data*) data; int i; - if (ugd == NULL) + if(ugd == NULL) { DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); return NULL; } - for (i = 0; i < ugd->peer_cnt; i++) + if (ugd->multi_connect_mode != WFD_MULTI_CONNECT_MODE_NONE) { - DBG(LOG_VERBOSE, "check %dth peer\n", i); - if (!strncmp - (mac_addr, (const char *) ugd->peers[i].mac_addr, MAC_LENGTH)) - { - DBG(LOG_VERBOSE, "found peer. [%d]\n", i); - __FUNC_EXIT__; - return &ugd->peers[i]; - } + for(i=0; i<ugd->raw_multi_selected_peer_cnt; i++) + { + DBG(LOG_VERBOSE, "[Multi Connect] check %dth peer\n", i); + if(!strncmp(mac_addr, (const char*) ugd->raw_multi_selected_peers[i].mac_addr, MAC_LENGTH)) + { + DBG(LOG_VERBOSE, "selected found peer. [%d]\n", i); + __FUNC_EXIT__; + return &ugd->raw_multi_selected_peers[i]; + } + } + } + else + { + for(i=0; i<ugd->raw_discovered_peer_cnt; i++) + { + DBG(LOG_VERBOSE, "check %dth peer\n", i); + if(!strncmp(mac_addr, (const char*) ugd->raw_discovered_peers[i].mac_addr, MAC_LENGTH)) + { + DBG(LOG_VERBOSE, "found peer. [%d]\n", i); + __FUNC_EXIT__; + return &ugd->raw_discovered_peers[i]; + } + } + } __FUNC_EXIT__; return NULL; } -void _activation_cb(int error_code, wifi_direct_device_state_e device_state, - void *user_data) +int _wfd_ug_view_clean_on_off(struct ug_data *ugd) +{ + wfd_ug_view_update_peers(ugd); + return 0; +} + +void _activation_cb(int error_code, wifi_direct_device_state_e device_state, void *user_data) { __FUNC_ENTER__; int res; - wifi_direct_state_e wfd_status; - struct ug_data *ugd = (struct ug_data *) user_data; + struct ug_data *ugd = (struct ug_data*) user_data; - wifi_direct_get_state(&wfd_status); - DBG(LOG_VERBOSE, "WFD status [%d]", wfd_status); - ugd->wfd_status = wfd_status; + wfd_refresh_wifi_direct_state(ugd); - switch (device_state) + switch(device_state) { - case WIFI_DIRECT_DEVICE_STATE_ACTIVATED: - DBG(LOG_VERBOSE, "WIFI_DIRECT_DEVICE_STATE_ACTIVATED\n"); - if(error_code != WIFI_DIRECT_ERROR_NONE) - { - DBG(LOG_ERROR, "Error in Activation/Deactivation [%d]\n", error_code); - wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_ACTIVATE_FAIL"), POPUP_TYPE_ACTIVATE_FAIL); + case WIFI_DIRECT_DEVICE_STATE_ACTIVATED: + DBG(LOG_VERBOSE, "WIFI_DIRECT_DEVICE_STATE_ACTIVATED\n"); + if(error_code != WIFI_DIRECT_ERROR_NONE) + { + DBG(LOG_ERROR, "Error in Activation/Deactivation [%d]\n", error_code); + wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_ACTIVATE_FAIL"), POPUP_TYPE_ACTIVATE_FAIL); - ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT; - ugd->wfd_onoff = 0; + ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT; + ugd->wfd_onoff = 0; + wfd_ug_view_refresh_glitem(ugd->head); + return; + } + + ugd->head_text_mode = HEAD_TEXT_TYPE_ACTIVATED; + ugd->wfd_onoff = 1; wfd_ug_view_refresh_glitem(ugd->head); - return; - } - ugd->head_text_mode = HEAD_TEXT_TYPE_ACTIVATED; - ugd->wfd_onoff = 1; - wfd_ug_view_refresh_glitem(ugd->head); - res = vconf_set_int("db/wifi_direct/onoff", ugd->wfd_onoff); - if (res != 0) - { - DBG(LOG_ERROR, "Failed to set vconf value for WFD onoff status\n"); - } - wfg_ug_act_popup_remove(ugd); + wfg_ug_act_popup_remove(ugd); - res = vconf_ignore_key_changed(VCONFKEY_WIFI_STATE, _wifi_state_cb); - if (res == -1) - { - DBG(LOG_ERROR, - "Failed to ignore vconf key callback for wifi state\n"); - } + res = vconf_ignore_key_changed(VCONFKEY_WIFI_STATE, _wifi_state_cb); + if(res == -1) + { + DBG(LOG_ERROR, "Failed to ignore vconf key callback for wifi state\n"); + } + + res = vconf_ignore_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE, _hotspot_state_cb); + if(res == -1) + { + DBG(LOG_ERROR, "Failed to ignore vconf key callback for hotspot state\n"); + } + + res = wifi_direct_start_discovery(FALSE, 0); + if(res != WIFI_DIRECT_ERROR_NONE) + { + DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", res); + } + DBG(LOG_VERBOSE, "Discovery is started\n"); + break; + + case WIFI_DIRECT_DEVICE_STATE_DEACTIVATED: + DBG(LOG_VERBOSE, "WIFI_DIRECT_DEVICE_STATE_DEACTIVATED\n"); + if(error_code != WIFI_DIRECT_ERROR_NONE) + { + DBG(LOG_ERROR, "Error in Activation/Deactivation [%d]\n", error_code); + wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_DEACTIVATE_FAIL"), POPUP_TYPE_DEACTIVATE_FAIL); + ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT; + ugd->wfd_onoff = 1; + wfd_ug_view_refresh_glitem(ugd->head); + return; + } - res = wifi_direct_start_discovery(FALSE, 0); - if (res != WIFI_DIRECT_ERROR_NONE) - { - DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", res); - } - break; - DBG(LOG_VERBOSE, "Discovery is started\n"); - case WIFI_DIRECT_DEVICE_STATE_DEACTIVATED: - DBG(LOG_VERBOSE, "WIFI_DIRECT_DEVICE_STATE_DEACTIVATED\n"); - if(error_code != WIFI_DIRECT_ERROR_NONE) - { - DBG(LOG_ERROR, "Error in Activation/Deactivation [%d]\n", error_code); - wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_DEACTIVATE_FAIL"), POPUP_TYPE_DEACTIVATE_FAIL); ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT; - ugd->wfd_onoff = 1; - wfd_ug_view_refresh_glitem(ugd->head); - return; - } + ugd->wfd_onoff = 0; - ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT; - ugd->wfd_onoff = 0; - wfd_ug_view_refresh_glitem(ugd->head); - res = vconf_set_int("db/wifi_direct/onoff", ugd->wfd_onoff); - if (res != 0) - { - DBG(LOG_ERROR, "Failed to set vconf value for WFD onoff status\n"); - } - wfd_ug_view_free_peers(ugd); - wfd_ug_view_update_peers(ugd); - break; - default: - break; + wfd_ug_view_update_peers(ugd); + + break; + default: + break; + } + + wfd_ug_view_refresh_glitem(ugd->head); + + if (ugd->scan_btn) { + wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE); + } + + if (ugd->multi_connect_btn) { + wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE); } - wfd_ug_view_refresh_button(ugd->scan_btn, ugd->wfd_onoff); __FUNC_EXIT__; return; } -static int peer_cnt; -static int connected_cnt; -static int discovered_cnt; - -bool _wfd_discoverd_peer_cb(wifi_direct_discovered_peer_info_s * peer, - void *user_data) +bool _wfd_discoverd_peer_cb(wifi_direct_discovered_peer_info_s* peer, void *user_data) { __FUNC_ENTER__; - device_type_s *peers = (device_type_s *) user_data; - - DBG(LOG_VERBOSE, "%dth discovered peer. [%s]\n", peer_cnt, peer->ssid); - if (peer->is_connected == TRUE) - return FALSE; - memcpy(peers[peer_cnt].ssid, peer->ssid, SSID_LENGTH); - peers[peer_cnt].ssid[31] = '\0'; - DBG(LOG_VERBOSE, "\tSSID: [%s]\n", peers[peer_cnt].ssid); - peers[peer_cnt].category = peer->primary_device_type; - DBG(LOG_VERBOSE, "\tPeer category [%d] -> [%d]\n", peer->primary_device_type, peers[peer_cnt].category); - strncpy(peers[peer_cnt].mac_addr, peer->mac_address, MAC_LENGTH); - strncpy(peers[peer_cnt].if_addr, peer->interface_address, MAC_LENGTH); - peers[peer_cnt].conn_status = PEER_CONN_STATUS_DISCONNECTED; - DBG(LOG_VERBOSE, "\tStatus: [%d]\n", peers[peer_cnt].conn_status); - peer_cnt++; + + struct ug_data *ugd = (struct ug_data*) user_data; + int peer_cnt = ugd->raw_discovered_peer_cnt; + + DBG(LOG_VERBOSE, "%dth discovered peer. [%s] [%s]\n", peer_cnt, peer->ssid, peer->mac_address); + + strncpy(ugd->raw_discovered_peers[peer_cnt].ssid, peer->ssid, sizeof(ugd->raw_discovered_peers[peer_cnt].ssid)); + ugd->raw_discovered_peers[peer_cnt].category = peer->primary_device_type; + strncpy(ugd->raw_discovered_peers[peer_cnt].mac_addr, peer->mac_address, MAC_LENGTH); + strncpy(ugd->raw_discovered_peers[peer_cnt].if_addr, peer->interface_address, MAC_LENGTH); + ugd->raw_discovered_peers[peer_cnt].is_group_owner = peer->is_group_owner; + ugd->raw_discovered_peers[peer_cnt].is_persistent_group_owner = peer->is_persistent_group_owner; + ugd->raw_discovered_peers[peer_cnt].is_connected = peer->is_connected; + + if (TRUE == peer->is_connected) { + ugd->raw_discovered_peers[peer_cnt].conn_status = PEER_CONN_STATUS_CONNECTED; + } else { + ugd->raw_discovered_peers[peer_cnt].conn_status = PEER_CONN_STATUS_DISCONNECTED; + } + + DBG(LOG_VERBOSE, "\tSSID: [%s]\n", ugd->raw_discovered_peers[peer_cnt].ssid); + DBG(LOG_VERBOSE, "\tPeer category [%d] -> [%d]\n", peer->primary_device_type, ugd->raw_discovered_peers[peer_cnt].category); + DBG(LOG_VERBOSE, "\tStatus: [%d]\n", ugd->raw_discovered_peers[peer_cnt].conn_status); + + ugd->raw_discovered_peer_cnt ++; free(peer->ssid); free(peer->mac_address); free(peer->interface_address); free(peer); + __FUNC_EXIT__; return TRUE; } -bool _wfd_connected_peer_cb(wifi_direct_connected_peer_info_s * peer, - void *user_data) +bool _wfd_connected_peer_cb(wifi_direct_connected_peer_info_s* peer, void *user_data) { __FUNC_ENTER__; - device_type_s *peers = (device_type_s *) user_data; - - DBG(LOG_VERBOSE, "%dth connected peer. [%s]\n", peer_cnt, peer->ssid); - memcpy(peers[peer_cnt].ssid, peer->ssid, SSID_LENGTH); - peers[peer_cnt].ssid[31] = '\0'; - DBG(LOG_VERBOSE, "\tSSID: [%s]\n", peers[peer_cnt].ssid); - peers[peer_cnt].category = peer->primary_device_type; - DBG(LOG_VERBOSE, "\tCategory: [%d]\n", peers[peer_cnt].category); - strncpy(peers[peer_cnt].mac_addr, peer->mac_address, MAC_LENGTH); - strncpy(peers[peer_cnt].if_addr, peer->interface_address, MAC_LENGTH); - peers[peer_cnt].conn_status = PEER_CONN_STATUS_CONNECTED; - DBG(LOG_VERBOSE, "\tStatus: [%d]\n", peers[peer_cnt].conn_status); - peer_cnt++; + struct ug_data *ugd = (struct ug_data*) user_data; + int peer_cnt = ugd->raw_connected_peer_cnt; + + DBG(LOG_VERBOSE, "%dth connected peer. [%s] [%s]\n", peer_cnt, peer->ssid, peer->mac_address); + + strncpy(ugd->raw_connected_peers[peer_cnt].ssid, peer->ssid, sizeof(ugd->raw_connected_peers[peer_cnt].ssid)); + ugd->raw_connected_peers[peer_cnt].category = peer->primary_device_type; + strncpy(ugd->raw_connected_peers[peer_cnt].mac_addr, peer->mac_address, MAC_LENGTH); + strncpy(ugd->raw_connected_peers[peer_cnt].if_addr, peer->interface_address, MAC_LENGTH); + ugd->raw_connected_peers[peer_cnt].conn_status = PEER_CONN_STATUS_CONNECTED; + + DBG(LOG_VERBOSE, "\tStatus: [%d]\n", ugd->raw_connected_peers[peer_cnt].conn_status); + DBG(LOG_VERBOSE, "\tCategory: [%d]\n", ugd->raw_connected_peers[peer_cnt].category); + DBG(LOG_VERBOSE, "\tSSID: [%s]\n", ugd->raw_connected_peers[peer_cnt].ssid); + + ugd->raw_connected_peer_cnt++; free(peer->ssid); free(peer->mac_address); @@ -308,175 +459,250 @@ bool _wfd_connected_peer_cb(wifi_direct_connected_peer_info_s * peer, return TRUE; } -void _discover_cb(int error_code, wifi_direct_discovery_state_e discovery_state, - void *user_data) +int wfd_ug_get_discovered_peers(struct ug_data *ugd) +{ + int res = 0; + + if (ugd==NULL) + return -1; + + ugd->raw_discovered_peer_cnt = 0; + res = wifi_direct_foreach_discovered_peers(_wfd_discoverd_peer_cb, (void*) ugd); + if (res != WIFI_DIRECT_ERROR_NONE) + { + ugd->raw_discovered_peer_cnt = 0; + DBG(LOG_ERROR, "Get discovery result failed: %d\n", res); + } + + return 0; +} + + +int wfd_ug_get_connected_peers(struct ug_data *ugd) +{ + int res = 0; + + if (ugd==NULL) + return -1; + + ugd->raw_connected_peer_cnt = 0; + res = wifi_direct_foreach_connected_peers(_wfd_connected_peer_cb, (void*) ugd); + if(res != WIFI_DIRECT_ERROR_NONE) + { + ugd->raw_connected_peer_cnt = 0; + DBG(LOG_ERROR, "Get connected peer failed: %d\n", res); + } + return 0; +} + +void _discover_cb(int error_code, wifi_direct_discovery_state_e discovery_state, void *user_data) { __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data *) user_data; - int res; - device_type_s *peers = NULL; + struct ug_data *ugd = (struct ug_data*) user_data; - if (ugd == NULL) + if(ugd == NULL) { DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); return; } - peers = calloc(MAX_PEER_NUM, sizeof(device_type_s)); - - if (discovery_state == WIFI_DIRECT_ONLY_LISTEN_STARTED) + if(discovery_state == WIFI_DIRECT_ONLY_LISTEN_STARTED) { ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT; } - else if (discovery_state == WIFI_DIRECT_DISCOVERY_STARTED) + else if(discovery_state == WIFI_DIRECT_DISCOVERY_STARTED) { ugd->head_text_mode = HEAD_TEXT_TYPE_SCANING; } - wfd_ug_view_refresh_glitem(ugd->head); - - if (ugd->wfd_status < WFD_LINK_STATUS_ACTIVATED - || ugd->wfd_status > WFD_LINK_STATUS_GROUP_OWNER) - { - return; - } - else - { - peer_cnt = 0; - } - - if (ugd->wfd_status >= WFD_LINK_STATUS_CONNECTED) + else if(discovery_state == WIFI_DIRECT_DISCOVERY_FOUND) { - DBG(LOG_VERBOSE, "getting connected peer..\n"); - res = - wifi_direct_foreach_connected_peers(_wfd_connected_peer_cb, - (void *) peers); - if (res != WIFI_DIRECT_ERROR_NONE) - { - connected_cnt = 0; - DBG(LOG_ERROR, "get discovery result failed: %d\n", res); - } + ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT; } - if (discovery_state == WIFI_DIRECT_DISCOVERY_FOUND) - { - DBG(LOG_VERBOSE, "Peer is found\n"); - ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT; - wfd_ug_view_refresh_glitem(ugd->head); + wfd_ug_view_refresh_glitem(ugd->head); - if (ugd->wfd_status >= WFD_LINK_STATUS_ACTIVATED) - { - DBG(LOG_VERBOSE, "getting discovered peer..\n"); - res = - wifi_direct_foreach_discovered_peers(_wfd_discoverd_peer_cb, - (void *) peers); - if (res != WIFI_DIRECT_ERROR_NONE) - { - discovered_cnt = 0; - DBG(LOG_ERROR, "get discovery result failed: %d\n", res); - } - } + if (WIFI_DIRECT_DISCOVERY_STARTED == discovery_state) { + if (ugd->scan_btn) { + wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_STOPSCAN"), TRUE); + } + + if (ugd->multi_connect_btn) { + wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_STOPSCAN"), TRUE); + } + } else { + if (ugd->scan_btn) { + wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE); + } + + if (ugd->multi_connect_btn) { + wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE); + } } - wfd_ug_view_free_peers(ugd); - - ugd->peers = peers; - ugd->peer_cnt = peer_cnt; + wfd_ug_get_discovered_peers(ugd); + wfd_ug_get_connected_peers(ugd); wfd_ug_view_update_peers(ugd); - DBG(LOG_VERBOSE, "%d peers are updated\n", peer_cnt); + + _wfd_free_multiconnect_device(ugd); + _wfd_update_multiconnect_device(ugd); + //_change_multi_button_title(ugd); __FUNC_EXIT__; return; } -void _connection_cb(int error_code, - wifi_direct_connection_state_e connection_state, - const char *mac_address, void *user_data) +void _connection_cb(int error_code, wifi_direct_connection_state_e connection_state, const char *mac_address, void *user_data) { __FUNC_ENTER__; - DBG(LOG_VERBOSE, "Connection event [%d], error_code [%d]\n", - connection_state, error_code); - struct ug_data *ugd = (struct ug_data *) user_data; + + struct ug_data *ugd = (struct ug_data*) user_data; device_type_s *peer = NULL; bool owner = FALSE; int res = 0; - if (mac_address == NULL) + DBG(LOG_VERBOSE, "Connection event [%d], error_code [%d]\n", connection_state, error_code); + + if(mac_address == NULL) { DBG(LOG_ERROR, "Incorrect parameter(peer mac is NULL)\n"); return; } DBG(LOG_VERBOSE, "Connection event from %s", mac_address); - peer = wfd_client_find_peer_by_mac(ugd, mac_address); - if (peer == NULL) + if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_IN_PROGRESS) { - DBG(LOG_ERROR, "Failed to find peer [mac: %s]\n", mac_address); - return; + peer = wfd_client_find_peer_by_mac(ugd, mac_address); + if (peer != NULL) + { + switch(connection_state) + { + case WIFI_DIRECT_CONNECTION_RSP: + if(error_code == WIFI_DIRECT_ERROR_NONE) + { + ugd->wfd_status = WFD_LINK_STATUS_CONNECTED; + peer->conn_status = PEER_CONN_STATUS_CONNECTED; + } + else + { + peer->conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT; + } + ugd->g_source_multi_connect_next = g_timeout_add(1000, wfd_multi_connect_next_cb, ugd); + break; + default: + break; + } + wfd_ug_get_connected_peers(ugd); + wfd_ug_view_update_peers(ugd); + } + else + { + DBG(LOG_VERBOSE, "peer is not found [%s]", mac_address); + } + goto refresh_button; + } + + + peer = wfd_client_find_peer_by_mac(ugd, mac_address); + + if (NULL == peer || NULL == peer->ssid) { + DBG(LOG_ERROR, "SSID from connection is NULL !!\n"); + goto refresh_button; } - switch (connection_state) + switch(connection_state) { - case WIFI_DIRECT_CONNECTION_RSP: - DBG(LOG_VERBOSE, "WIFI_DIRECT_CONNECTION_RSP\n"); + case WIFI_DIRECT_CONNECTION_RSP: + DBG(LOG_VERBOSE, "WIFI_DIRECT_CONNECTION_RSP\n"); - if (error_code == WIFI_DIRECT_ERROR_NONE) - { - ugd->wfd_status = WFD_LINK_STATUS_CONNECTED; - peer->conn_status = PEER_CONN_STATUS_CONNECTED; - res = wifi_direct_is_group_owner(&owner); - if (res == WIFI_DIRECT_ERROR_NONE) + if(error_code == WIFI_DIRECT_ERROR_NONE) { - if (!owner) - wfd_ug_view_refresh_button(ugd->scan_btn, FALSE); + ugd->wfd_status = WFD_LINK_STATUS_CONNECTED; + peer->conn_status = PEER_CONN_STATUS_CONNECTED; } else { - DBG(LOG_ERROR, - "Failed to get whether client is group owner. [%d]\n", res); + peer->conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT; } - } - else - { - peer->conn_status = PEER_CONN_STATUS_DISCONNECTED; + + wfd_ug_get_connected_peers(ugd); + wfd_ug_view_update_peers(ugd); + break; + case WIFI_DIRECT_DISCONNECTION_RSP: + case WIFI_DIRECT_DISCONNECTION_IND: + case WIFI_DIRECT_DISASSOCIATION_IND: + DBG(LOG_VERBOSE, "WIFI_DIRECT_DISCONNECTION_X\n"); + if(error_code != WIFI_DIRECT_ERROR_NONE) + { + // TODO: show disconnection error popup + return; + } + + if (peer!=NULL) + peer->conn_status = PEER_CONN_STATUS_DISCONNECTED; + else + { + // In case of disconnect_all(), no specific peer is found. + } + wifi_direct_start_discovery(FALSE, 0); - } - break; - case WIFI_DIRECT_DISCONNECTION_RSP: - case WIFI_DIRECT_DISCONNECTION_IND: - case WIFI_DIRECT_DISASSOCIATION_IND: - DBG(LOG_VERBOSE, "WIFI_DIRECT_DISCONNECTION_X\n"); - if (error_code != WIFI_DIRECT_ERROR_NONE) - { - return; - } + ugd->wfd_status = WFD_LINK_STATUS_DISCOVERING; + ugd->head_text_mode = HEAD_TEXT_TYPE_SCANING; - peer->conn_status = PEER_CONN_STATUS_DISCONNECTED; + wfd_ug_view_refresh_glitem(ugd->head); - ugd->wfd_status = WFD_LINK_STATUS_ACTIVATED; - ugd->head_text_mode = HEAD_TEXT_TYPE_ACTIVATED; + wfd_ug_get_discovered_peers(ugd); + wfd_ug_get_connected_peers(ugd); + wfd_ug_view_update_peers(ugd); + break; + + case WIFI_DIRECT_CONNECTION_IN_PROGRESS: + DBG(LOG_VERBOSE, "WIFI_DIRECT_CONNECTION_IN_PROGRESS\n"); + peer->conn_status = PEER_CONN_STATUS_CONNECTING; + break; + case WIFI_DIRECT_CONNECTION_REQ: + case WIFI_DIRECT_CONNECTION_WPS_REQ: + DBG(LOG_VERBOSE, "WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ\n"); + break; + default: + break; + } - wfd_ug_view_refresh_button(ugd->scan_btn, TRUE); - wifi_direct_start_discovery(FALSE, 0); - ugd->wfd_status = WFD_LINK_STATUS_DISCOVERING; - ugd->head_text_mode = HEAD_TEXT_TYPE_SCANING; - wfd_ug_view_refresh_glitem(ugd->head); - break; - case WIFI_DIRECT_CONNECTION_IN_PROGRESS: - DBG(LOG_VERBOSE, "WIFI_DIRECT_CONNECTION_IN_PROGRESS\n"); - peer->conn_status = PEER_CONN_STATUS_CONNECTING; - break; - case WIFI_DIRECT_CONNECTION_REQ: - case WIFI_DIRECT_CONNECTION_WPS_REQ: - DBG(LOG_VERBOSE, "WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ\n"); - break; - default: - break; - } - - if (peer != NULL) + if(peer != NULL) wfd_ug_view_refresh_glitem(peer->gl_item); + _change_multi_button_title(ugd); + +refresh_button: + /* refresh the scan button */ + wfd_refresh_wifi_direct_state(ugd); + if (WIFI_DIRECT_STATE_CONNECTING == ugd->wfd_status || + WIFI_DIRECT_STATE_DISCONNECTING == ugd->wfd_status) { + + res = wifi_direct_is_group_owner(&owner); + if (res == WIFI_DIRECT_ERROR_NONE) { + if (!owner) { + if (ugd->scan_btn) { + wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE); + } + + if (ugd->multi_connect_btn) { + wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE); + } + } + } else { + DBG(LOG_ERROR, "Failed to get whether client is group owner. [%d]\n", res); + } + } else { + if (ugd->scan_btn) { + wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE); + } + + if (ugd->multi_connect_btn) { + wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE); + } + } + __FUNC_EXIT__; return; } @@ -484,18 +710,13 @@ void _connection_cb(int error_code, int wfd_get_vconf_status(void *data) { __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data *) data; - int res; + struct ug_data *ugd = (struct ug_data*) data; char *dev_name; - res = vconf_get_int("db/wifi_direct/onoff", &ugd->wfd_onoff); - if (res != 0) - { - DBG(LOG_ERROR, "vconf_get_int is failed\n"); - } - DBG(LOG_VERBOSE, "VCONF_WFD_ONOFF : %d\n", ugd->wfd_onoff); + // TODO: get wifi direct status from vconf + // db/mobile_hotspot/wifi_key (string) - dev_name = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR); + dev_name = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR); // "db/setting/device_name" (VCONF_WFD_APNAME) if (dev_name == NULL) { ugd->dev_name = strdup(DEFAULT_DEV_NAME); @@ -512,159 +733,125 @@ int wfd_get_vconf_status(void *data) return 0; } -int init_wfd_client(void *data) +int wfd_refresh_wifi_direct_state(void *data) { - __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data *) data; - int res = 0; - wifi_direct_state_e wfd_status; - - res = wifi_direct_initialize(); - if (res != WIFI_DIRECT_ERROR_NONE) - { - DBG(LOG_ERROR, "Failed to initialize wifi direct. [%d]\n", res); - return -1; - } - - res = wifi_direct_set_device_state_changed_cb(_activation_cb, (void *) ugd); - res = - wifi_direct_set_discovery_state_changed_cb(_discover_cb, (void *) ugd); - res = - wifi_direct_set_connection_state_changed_cb(_connection_cb, - (void *) ugd); - + struct ug_data *ugd = (struct ug_data*) data; + int res; + wifi_direct_state_e wfd_status; res = wifi_direct_get_state(&wfd_status); - if (res != WIFI_DIRECT_ERROR_NONE) + if(res != WIFI_DIRECT_ERROR_NONE) { DBG(LOG_ERROR, "Failed to get link status. [%d]\n", res); return -1; } + DBG(LOG_VERBOSE, "WFD status [%d]", wfd_status); ugd->wfd_status = wfd_status; - DBG(LOG_VERBOSE, "WFD link status. [%d]\n", wfd_status); - - if (wfd_status > WIFI_DIRECT_STATE_ACTIVATING) - { - vconf_set_int("db/wifi_direct/onoff", 1); - ugd->wfd_onoff = 1; - } - else - { - vconf_set_int("db/wifi_direct/onoff", 0); - ugd->wfd_onoff = 0; - } - wfd_ug_view_refresh_glitem(ugd->head); - wfd_ug_view_refresh_button(ugd->scan_btn, ugd->wfd_onoff); - - if(wfd_status >= WIFI_DIRECT_STATE_CONNECTED) - { - device_type_s *peers = NULL; - - peers = calloc(MAX_PEER_NUM, sizeof(device_type_s)); - res = wifi_direct_foreach_connected_peers(_wfd_connected_peer_cb, (void*) peers); - if(res != WIFI_DIRECT_ERROR_NONE) - { - connected_cnt = 0; - DBG(LOG_ERROR, "get discovery result failed: %d\n", res); - } - wfd_ug_view_free_peers(ugd); - - ugd->peers = peers; - ugd->peer_cnt = peer_cnt; - - wfd_ug_view_update_peers(ugd); - DBG(LOG_VERBOSE, "%d peers are updated\n", peer_cnt); - } - - if (wfd_status > WIFI_DIRECT_STATE_ACTIVATING) - { - int wifi_state; - vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state); - - if (wifi_state < VCONFKEY_WIFI_CONNECTED) - { - res = wifi_direct_start_discovery(FALSE, 0); - if (res != WIFI_DIRECT_ERROR_NONE) - { - DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", res); - } - DBG(LOG_VERBOSE, "Discovery is started\n"); - } - else - { - wfd_ug_act_popup(ugd, _("IDS_WFD_POP_WIFI_OFF"), - POPUP_TYPE_WIFI_OFF); - } - } - - __FUNC_EXIT__; - return 0; } -int deinit_wfd_client(void *data) +int init_wfd_client(void *data) { __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; int res = 0; - wifi_direct_state_e status = 0; - - wifi_direct_get_state(&status); - if (status == WIFI_DIRECT_STATE_DISCOVERING) - { - DBG(LOG_VERBOSE, "Stop discovery before deregister client\n"); - wifi_direct_cancel_discovery(); - } - - res = wifi_direct_deinitialize(); - if (res != WIFI_DIRECT_ERROR_NONE) + res = wifi_direct_initialize(); + if(res != WIFI_DIRECT_ERROR_NONE) { - DBG(LOG_ERROR, "Failed to deregister client. [%d]\n", res); + DBG(LOG_ERROR, "Failed to initialize wifi direct. [%d]\n", res); + return -1; } - res = vconf_ignore_key_changed(VCONFKEY_WIFI_STATE, _wifi_state_cb); - if (res == -1) - { - DBG(LOG_ERROR, "Failed to ignore vconf key callback for wifi state\n"); - } + res = wifi_direct_set_device_state_changed_cb(_activation_cb, (void*) ugd); + res = wifi_direct_set_discovery_state_changed_cb(_discover_cb, (void*) ugd); + res = wifi_direct_set_connection_state_changed_cb(_connection_cb, (void*) ugd); - res = net_deregister_client(); - if (res != NET_ERR_NONE) - { - DBG(LOG_ERROR, "Failed to deregister network client. [%d]\n", res); - } + /* update WFD status */ + wfd_refresh_wifi_direct_state(ugd); + if (ugd->wfd_status > WIFI_DIRECT_STATE_ACTIVATING) + ugd->wfd_onoff = 1; + else + ugd->wfd_onoff = 0; + DBG(LOG_VERBOSE, "WFD link status. [%d]\n", ugd->wfd_status); __FUNC_EXIT__; return 0; } -int wfd_client_get_link_status() +int deinit_wfd_client(void *data) { - __FUNC_ENTER__; - wifi_direct_state_e status; - int res; - - res = wifi_direct_get_state(&status); - if (res != WIFI_DIRECT_ERROR_NONE) - { - DBG(LOG_ERROR, "Failed to get link status from wfd-server. [%d]", res); - return -1; - } - - __FUNC_EXIT__; - return status; + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + int res = 0; + tethering_error_e ret = TETHERING_ERROR_NONE; + tethering_h th = NULL; + + wfd_refresh_wifi_direct_state(ugd); + + if(ugd->wfd_status == WIFI_DIRECT_STATE_DISCOVERING) + { + DBG(LOG_VERBOSE, "Stop discovery before deregister client\n"); + wifi_direct_cancel_discovery(); + } + + res = wifi_direct_deinitialize(); + if(res != WIFI_DIRECT_ERROR_NONE) + { + DBG(LOG_ERROR, "Failed to deregister client. [%d]\n", res); + } + + res = vconf_ignore_key_changed(VCONFKEY_WIFI_STATE, _wifi_state_cb); + if(res == -1) + { + DBG(LOG_ERROR, "Failed to ignore vconf key callback for wifi state\n"); + } + + res = net_deregister_client(); + if(res != NET_ERR_NONE) + { + DBG(LOG_ERROR, "Failed to deregister network client. [%d]\n", res); + } + + res = vconf_ignore_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE, _hotspot_state_cb); + if(res == -1) + { + DBG(LOG_ERROR, "Failed to ignore vconf key callback for hotspot state\n"); + } + + th = ugd->hotspot_handle; + + if(th != NULL) + { + /* Deregister cbs */ + ret = tethering_unset_disabled_cb(th, TETHERING_TYPE_WIFI); + if(ret != TETHERING_ERROR_NONE) + DBG(LOG_ERROR, "tethering_unset_disabled_cb is failed(%d)\n", ret); + + /* Destroy tethering handle */ + ret = tethering_destroy(th); + if(ret != TETHERING_ERROR_NONE) + DBG(LOG_ERROR, "tethering_destroy is failed(%d)\n", ret); + + ugd->hotspot_handle = NULL; + + } + + __FUNC_EXIT__; + + return 0; } int wfd_client_switch_on(void *data) { __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data *) data; + struct ug_data *ugd = (struct ug_data*) data; int res; DBG(LOG_VERBOSE, "WFD status [%d]\n", ugd->wfd_status); - if (ugd->wfd_status < WFD_LINK_STATUS_ACTIVATING) + if(ugd->wfd_status < WFD_LINK_STATUS_ACTIVATING) { ugd->wfd_status = WFD_LINK_STATUS_ACTIVATING; @@ -673,23 +860,35 @@ int wfd_client_switch_on(void *data) if (res != 0) { DBG(LOG_ERROR, "Failed to get wifi state from vconf. [%d]\n", res); + // TODO: set genlist head item as "WiFi Direct" + return -1; + } + + int hotspot_mode; + res = vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &hotspot_mode); + if (res != 0) + { + DBG(LOG_ERROR, "Failed to get mobile hotspot state from vconf. [%d]\n", res); + // TODO: set genlist head item as "WiFi Direct" return -1; } - if (wifi_state > VCONFKEY_WIFI_OFF) + if(wifi_state > VCONFKEY_WIFI_OFF) { DBG(LOG_VERBOSE, "WiFi is connected, so have to turn off WiFi"); - wfd_ug_act_popup(ugd, _("IDS_WFD_POP_WIFI_OFF"), - POPUP_TYPE_WIFI_OFF); + wfd_ug_act_popup(ugd, _("IDS_WFD_POP_WIFI_OFF"), POPUP_TYPE_WIFI_OFF); // "This will turn off Wi-Fi client operation.<br>Continue?" } - else + else if(hotspot_mode & VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI) + { + DBG(LOG_VERBOSE, "WiFi is connected, so have to turn off WiFi"); + wfd_ug_act_popup(ugd, _("IDS_WFD_POP_HOTSPOT_OFF"), POPUP_TYPE_HOTSPOT_OFF); // "This will turn off Portable Wi-Fi hotspots operation.<br>Continue?" + } + else // (wifi_state < VCONFKEY_WIFI_CONNECTED && !(hotspot_mode & VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI)) { res = wifi_direct_activate(); - if (res != WIFI_DIRECT_ERROR_NONE) + if(res != WIFI_DIRECT_ERROR_NONE) { - DBG(LOG_ERROR, - "Failed to activate Wi-Fi Direct. error code = [%d]\n", - res); + DBG(LOG_ERROR, "Failed to activate Wi-Fi Direct. error code = [%d]\n", res); wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_ACTIVATE_FAIL"), POPUP_TYPE_TERMINATE); ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT; @@ -710,12 +909,12 @@ int wfd_client_switch_on(void *data) int wfd_client_switch_off(void *data) { __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data *) data; + struct ug_data *ugd = (struct ug_data*) data; int res; DBG(LOG_VERBOSE, "WFD status [%d]\n", ugd->wfd_status); - if (ugd->wfd_status < WFD_LINK_STATUS_ACTIVATING) + if(ugd->wfd_status < WFD_LINK_STATUS_ACTIVATING) { DBG(LOG_VERBOSE, "Wi-Fi Direct is already deactivated\n"); } @@ -724,10 +923,9 @@ int wfd_client_switch_off(void *data) ugd->wfd_status = WFD_LINK_STATUS_DEACTIVATING; res = wifi_direct_deactivate(); - if (res != WIFI_DIRECT_ERROR_NONE) + if(res != WIFI_DIRECT_ERROR_NONE) { - DBG(LOG_ERROR, - "Failed to deactivate Wi-Fi Direct. error code = [%d]\n", res); + DBG(LOG_ERROR, "Failed to deactivate Wi-Fi Direct. error code = [%d]\n", res); wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_DEACTIVATE_FAIL"), POPUP_TYPE_TERMINATE); ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT; @@ -746,13 +944,12 @@ int wfd_client_swtch_force(void *data, int onoff) struct ug_data *ugd = (struct ug_data*) data; int res; - if (onoff) + if(onoff) { res = wifi_direct_activate(); - if (res != WIFI_DIRECT_ERROR_NONE) + if(res != WIFI_DIRECT_ERROR_NONE) { - DBG(LOG_ERROR, - "Failed to activate Wi-Fi Direct. error code = [%d]\n", res); + DBG(LOG_ERROR, "Failed to activate Wi-Fi Direct. error code = [%d]\n", res); wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_ACTIVATE_FAIL"), POPUP_TYPE_TERMINATE); ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT; @@ -763,10 +960,9 @@ int wfd_client_swtch_force(void *data, int onoff) else { res = wifi_direct_deactivate(); - if (res != WIFI_DIRECT_ERROR_NONE) + if(res != WIFI_DIRECT_ERROR_NONE) { - DBG(LOG_ERROR, - "Failed to deactivate Wi-Fi Direct. error code = [%d]\n", res); + DBG(LOG_ERROR, "Failed to deactivate Wi-Fi Direct. error code = [%d]\n", res); wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_DEACTIVATE_FAIL"), POPUP_TYPE_TERMINATE); ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT; @@ -781,20 +977,45 @@ int wfd_client_swtch_force(void *data, int onoff) int wfd_client_start_discovery(void *data) { __FUNC_ENTER__; - int res; - wifi_direct_state_e status; + struct ug_data *ugd = (struct ug_data*) data; + int res = -1; + +#if 0 + ret = wifi_direct_cancel_discovery(); +// ret = wifi_direct_cancel_discovery(); + if (ret != WIFI_DIRECT_ERROR_NONE) { + DBG(LOG_ERROR, "Failed wfd discover() : %d", ret); + return FALSE; + } + - wifi_direct_get_state(&status); - if (status >= WIFI_DIRECT_STATE_ACTIVATED) + if(ugd->wfd_status >= WIFI_DIRECT_STATE_ACTIVATED) { - res = wifi_direct_start_discovery(FALSE, 0); + res = wifi_direct_start_discovery(FALSE, 30); if (res != WIFI_DIRECT_ERROR_NONE) { DBG(LOG_ERROR, "Failed to start wfd discovery. [%d]", res); + return -1; } } - __FUNC_EXIT__; +#endif + + ugd->wfd_status = WIFI_DIRECT_DISCOVERY_STARTED; + wfd_refresh_wifi_direct_state(ugd); + ugd->head_text_mode = HEAD_TEXT_TYPE_SCANING; + wfd_ug_view_refresh_glitem(ugd->head); + wifi_direct_cancel_discovery(); + + res = wifi_direct_start_discovery(FALSE, 0); + if (res != WIFI_DIRECT_ERROR_NONE) { + DBG(LOG_ERROR, "Fail to restart scanning. %d\n", res); + return -1; + } + + ugd->wfd_status = WIFI_DIRECT_DISCOVERY_FOUND; + wfd_refresh_wifi_direct_state(ugd); + __FUNC_EXIT__; return 0; } @@ -803,8 +1024,9 @@ int wfd_client_connect(const char *mac_addr) __FUNC_ENTER__; int res; + DBG(LOG_ERROR, "connect to peer=[%s]\n", mac_addr); res = wifi_direct_connect(mac_addr); - if (res != WIFI_DIRECT_ERROR_NONE) + if(res != WIFI_DIRECT_ERROR_NONE) { DBG(LOG_ERROR, "Failed to send connection request. [%d]\n", res); return -1; @@ -818,20 +1040,19 @@ int wfd_client_disconnect(const char *mac_addr) __FUNC_ENTER__; int res; - if (mac_addr == NULL) + if(mac_addr == NULL) { res = wifi_direct_disconnect_all(); - if (res != WIFI_DIRECT_ERROR_NONE) + if(res != WIFI_DIRECT_ERROR_NONE) { - DBG(LOG_ERROR, - "Failed to send disconnection request to all. [%d]\n", res); + DBG(LOG_ERROR, "Failed to send disconnection request to all. [%d]\n", res); return -1; } } else { res = wifi_direct_disconnect(mac_addr); - if (res != WIFI_DIRECT_ERROR_NONE) + if(res != WIFI_DIRECT_ERROR_NONE) { DBG(LOG_ERROR, "Failed to send disconnection request. [%d]\n", res); return -1; @@ -840,3 +1061,43 @@ int wfd_client_disconnect(const char *mac_addr) __FUNC_EXIT__; return 0; } + +int wfd_client_set_p2p_group_owner_intent(int go_intent) +{ + __FUNC_ENTER__; + int res; + + res = wifi_direct_set_group_owner_intent(go_intent); + if(res != WIFI_DIRECT_ERROR_NONE) + { + DBG(LOG_ERROR, "Failed to wifi_direct_set_go_intent(%d). [%d]\n", go_intent, res); + return -1; + } + __FUNC_EXIT__; + return 0; +} + +int wfd_client_get_peers(struct ug_data *ugd) +{ + + if(ugd->wfd_status < WFD_LINK_STATUS_ACTIVATED) + { + ugd->raw_discovered_peer_cnt = 0; + ugd->raw_connected_peer_cnt = 0; + return 0; + } + + if(ugd->wfd_status > WIFI_DIRECT_STATE_ACTIVATING) + { + wfd_ug_get_discovered_peers(ugd); + } + + if(ugd->wfd_status >= WIFI_DIRECT_STATE_CONNECTED) + { + wfd_ug_get_connected_peers(ugd); + } + + wfd_ug_view_update_peers(ugd); + _change_multi_button_title(ugd); + return 0; +} diff --git a/ug-wifidirect/src/wfd_ug.c b/ug-wifidirect/src/wfd_ug.c index cfbbf49..9c43fca 100644..100755 --- a/ug-wifidirect/src/wfd_ug.c +++ b/ug-wifidirect/src/wfd_ug.c @@ -1,26 +1,21 @@ /* - * 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. - */ +* WiFi-Direct UG +* +* Copyright 2012 Samsung Electronics Co., Ltd -/* - * This file implements Wi-Fi direct UI Gadget. - * - * @file wfd_ug.c - * @author Gibyoung Kim (lastkgb.kim@samsung.com) - * @version 0.1 - */ +* 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. +* +*/ #ifndef UG_MODULE_API @@ -40,6 +35,15 @@ #include "wfd_ug_view.h" #include "wfd_client.h" +void initialize_gen_item_class(); + +struct ug_data *global_ugd = NULL; + +struct ug_data *wfd_get_ug_data() +{ + return global_ugd; +} + static Evas_Object *_create_bg(Evas_Object *parent, char *style) { @@ -61,14 +65,15 @@ static Evas_Object *_create_fullview(Evas_Object *parent, struct ug_data *ugd) __FUNC_ENTER__; Evas_Object *base; - if (parent == NULL) + if(parent == NULL) { DBG(LOG_ERROR, "Incorrenct parameter"); return NULL; } + /* Create Full view */ base = elm_layout_add(parent); - if (!base) + if(!base) { DBG(LOG_ERROR, "Failed to add layout"); return NULL; @@ -82,19 +87,20 @@ static Evas_Object *_create_fullview(Evas_Object *parent, struct ug_data *ugd) return base; } -static Evas_Object *_create_frameview(Evas_Object * parent, struct ug_data *ugd) +static Evas_Object *_create_frameview(Evas_Object *parent, struct ug_data *ugd) { __FUNC_ENTER__; Evas_Object *base; - if (parent == NULL) + if(parent == NULL) { DBG(LOG_ERROR, "Incorrenct parameter"); return NULL; } + /* Create Frame view */ base = elm_layout_add(parent); - if (!base) + if(!base) { DBG(LOG_ERROR, "Failed to add layout"); return NULL; @@ -108,11 +114,34 @@ static Evas_Object *_create_frameview(Evas_Object * parent, struct ug_data *ugd) return base; } -static void *on_create(struct ui_gadget *ug, enum ug_mode mode, bundle * data, - void *priv) + +void destroy_wfd_ug_view(void *data) +{ + __FUNC_ENTER__; + + struct ug_data *ugd = (struct ug_data*) data; + + if(ugd->genlist) + { + evas_object_del(ugd->genlist); + ugd->genlist = NULL; + } + + if(ugd->naviframe) + { + evas_object_del(ugd->naviframe); + ugd->naviframe = NULL; + } + + __FUNC_EXIT__; +} + +static void *on_create(ui_gadget_h ug, enum ug_mode mode, service_h service, + void *priv) { __FUNC_ENTER__; struct ug_data *ugd; + int res = 0; if (!ug || !priv) return NULL; @@ -122,7 +151,7 @@ static void *on_create(struct ui_gadget *ug, enum ug_mode mode, bundle * data, bindtextdomain(PACKAGE, LOCALEDIR); - ugd->win = ug_get_parent_layout(ug); + ugd->win = ug_get_window(); if (!ugd->win) return NULL; @@ -131,7 +160,7 @@ static void *on_create(struct ui_gadget *ug, enum ug_mode mode, bundle * data, else ugd->base = _create_frameview(ugd->win, ugd); - if (ugd->base) + if(ugd->base) { ugd->bg = _create_bg(ugd->win, "group_list"); elm_object_part_content_set(ugd->base, "elm.swallow.bg", ugd->bg); @@ -144,18 +173,55 @@ static void *on_create(struct ui_gadget *ug, enum ug_mode mode, bundle * data, wfd_get_vconf_status(ugd); + initialize_gen_item_class(); + + res = init_wfd_client(ugd); + if(res != 0) + { + DBG(LOG_ERROR, "Failed to initialize WFD client library\n"); + wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_PROBLEM_WITH_WFD"), POPUP_TYPE_TERMINATE); + } + create_wfd_ug_view(ugd); + + wfd_ug_view_refresh_glitem(ugd->head); + if (ugd->scan_btn) { + wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE); + } + + if(ugd->wfd_status > WIFI_DIRECT_STATE_ACTIVATING) + { + wfd_ug_get_discovered_peers(ugd); + } + + if(ugd->wfd_status >= WIFI_DIRECT_STATE_CONNECTED) + { + wfd_ug_get_connected_peers(ugd); + } + + wfd_ug_view_update_peers(ugd); + + if (ugd->wfd_status == WIFI_DIRECT_STATE_ACTIVATED) + { + res = wifi_direct_start_discovery(FALSE, 0); + if(res != WIFI_DIRECT_ERROR_NONE) + { + DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", res); + } + DBG(LOG_VERBOSE, "Discovery is started\n"); + } + evas_object_show(ugd->base); __FUNC_EXIT__; return ugd->base; } -static void on_start(struct ui_gadget *ug, bundle * data, void *priv) +static void on_start(ui_gadget_h ug, service_h service, void *priv) { __FUNC_ENTER__; struct ug_data *ugd; - int res; + int res; if (!ug || !priv) return; @@ -170,39 +236,29 @@ static void on_start(struct ui_gadget *ug, bundle * data, void *priv) } else { - DBG(LOG_VERBOSE, "Node name of this device [%s]\n", kernel_info.nodename); DBG(LOG_VERBOSE, "HW ID of this device [%s]\n", kernel_info.machine); - if(strcmp(kernel_info.nodename, "SLP_PQ") == 0 || - strncmp(kernel_info.machine, "arm", 3) != 0) + if(strncmp(kernel_info.machine, "arm", 3) != 0) { wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_NOT_SUPPORTED_DEVICE"), POPUP_TYPE_TERMINATE); return; } } - - res = init_wfd_client(ugd); - if(res != 0) - { - DBG(LOG_ERROR, "Failed to initialize WFD client library\n"); - wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_PROBLEM_WITH_WFD"), POPUP_TYPE_TERMINATE); - } - __FUNC_EXIT__; } -static void on_pause(struct ui_gadget *ug, bundle * data, void *priv) +static void on_pause(ui_gadget_h ug, service_h service, void *priv) { __FUNC_ENTER__; __FUNC_EXIT__; } -static void on_resume(struct ui_gadget *ug, bundle * data, void *priv) +static void on_resume(ui_gadget_h ug, service_h service, void *priv) { __FUNC_ENTER__; __FUNC_EXIT__; } -static void on_destroy(struct ui_gadget *ug, bundle * data, void *priv) +static void on_destroy(ui_gadget_h ug, service_h service, void *priv) { __FUNC_ENTER__; @@ -223,14 +279,19 @@ static void on_destroy(struct ui_gadget *ug, bundle * data, void *priv) DBG(LOG_VERBOSE, "WFD client deregistered"); destroy_wfd_ug_view(ugd); + DBG(LOG_VERBOSE, "Destroying About item"); + + wfd_ug_view_free_peers(ugd); - if (ugd->bg) + DBG(LOG_VERBOSE, "WFD client deregistered"); + if(ugd->bg) { evas_object_del(ugd->bg); ugd->bg = NULL; } + DBG(LOG_VERBOSE, "WFD client deregistered"); - if (ugd->base) + if(ugd->base) { evas_object_del(ugd->base); ugd->base = NULL; @@ -240,15 +301,15 @@ static void on_destroy(struct ui_gadget *ug, bundle * data, void *priv) return; } -static void on_message(struct ui_gadget *ug, bundle * msg, bundle * data, - void *priv) +static void on_message(ui_gadget_h ug, service_h msg, service_h service, + void *priv) { __FUNC_ENTER__; __FUNC_EXIT__; } -static void on_event(struct ui_gadget *ug, enum ug_event event, bundle * data, - void *priv) +static void on_event(ui_gadget_h ug, enum ug_event event, service_h service, + void *priv) { __FUNC_ENTER__; @@ -260,37 +321,37 @@ static void on_event(struct ui_gadget *ug, enum ug_event event, bundle * data, switch (event) { - case UG_EVENT_LOW_MEMORY: - DBG(LOG_VERBOSE, "UG_EVENT_LOW_MEMORY\n"); - break; - case UG_EVENT_LOW_BATTERY: - DBG(LOG_VERBOSE, "UG_EVENT_LOW_BATTERY\n"); - break; - case UG_EVENT_LANG_CHANGE: - DBG(LOG_VERBOSE, "UG_EVENT_LANG_CHANGE\n"); - break; - case UG_EVENT_ROTATE_PORTRAIT: - DBG(LOG_VERBOSE, "UG_EVENT_ROTATE_PORTRAIT\n"); - break; - case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN: - DBG(LOG_VERBOSE, "UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN\n"); - break; - case UG_EVENT_ROTATE_LANDSCAPE: - DBG(LOG_VERBOSE, "UG_EVENT_ROTATE_LANDSCAPE\n"); - break; - case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN: - DBG(LOG_VERBOSE, "UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN\n"); - break; - default: - DBG(LOG_VERBOSE, "default\n"); - break; + case UG_EVENT_LOW_MEMORY: + DBG(LOG_VERBOSE, "UG_EVENT_LOW_MEMORY\n"); + break; + case UG_EVENT_LOW_BATTERY: + DBG(LOG_VERBOSE, "UG_EVENT_LOW_BATTERY\n"); + break; + case UG_EVENT_LANG_CHANGE: + DBG(LOG_VERBOSE, "UG_EVENT_LANG_CHANGE\n"); + break; + case UG_EVENT_ROTATE_PORTRAIT: + DBG(LOG_VERBOSE, "UG_EVENT_ROTATE_PORTRAIT\n"); + break; + case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN: + DBG(LOG_VERBOSE, "UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN\n"); + break; + case UG_EVENT_ROTATE_LANDSCAPE: + DBG(LOG_VERBOSE, "UG_EVENT_ROTATE_LANDSCAPE\n"); + break; + case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN: + DBG(LOG_VERBOSE, "UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN\n"); + break; + default: + DBG(LOG_VERBOSE, "default\n"); + break; } __FUNC_EXIT__; } -static void on_key_event(struct ui_gadget *ug, enum ug_key_event event, - bundle * data, void *priv) +static void on_key_event(ui_gadget_h ug, enum ug_key_event event, + service_h service, void *priv) { __FUNC_ENTER__; @@ -302,11 +363,11 @@ static void on_key_event(struct ui_gadget *ug, enum ug_key_event event, switch (event) { - case UG_KEY_EVENT_END: - DBG(LOG_VERBOSE, "UG_KEY_EVENT_END\n"); - break; - default: - break; + case UG_KEY_EVENT_END: + DBG(LOG_VERBOSE, "UG_KEY_EVENT_END\n"); + break; + default: + break; } __FUNC_EXIT__; @@ -330,6 +391,8 @@ UG_MODULE_API int UG_MODULE_INIT(struct ug_module_ops *ops) return -1; } + global_ugd = ugd; + ops->create = on_create; ops->start = on_start; ops->pause = on_pause; diff --git a/ug-wifidirect/src/wfd_ug_about_view.c b/ug-wifidirect/src/wfd_ug_about_view.c new file mode 100644 index 0000000..5139920 --- /dev/null +++ b/ug-wifidirect/src/wfd_ug_about_view.c @@ -0,0 +1,128 @@ +/* +* 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" + +static Elm_Genlist_Item_Class itc; + +static char *_wfd_gl_label_help_dialogue_get(void *data, Evas_Object *obj, const char *part) +{ + DBG(LOG_VERBOSE, "Adding text"); + + if (!strcmp(part, "elm.text.2")) { + return strdup(IDS_WFD_BODY_ABOUT_WIFI); + } + return NULL; +} + +static Evas_Object *_wfd_gl_help_icon_get(void *data, Evas_Object * obj, const char *part) +{ + __FUNC_ENTER__; + + DBG(LOG_VERBOSE, "Current part: %s\n", part); + Evas_Object *label = NULL; + char content[1024] = {0}; + + label = elm_label_add(obj); + snprintf(content, 1024, "<color=#7C7C7CFF><font_size=32>%s</font_size></color>", IDS_WFD_BODY_ABOUT_WIFI); + elm_label_line_wrap_set(label, ELM_WRAP_WORD); + elm_object_text_set(label, content); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, 0.0); + evas_object_show(label); + + __FUNC_EXIT__; + return label; +} + +void _about_view_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; + } + + elm_naviframe_item_pop(ugd->naviframe); + + __FUNC_EXIT__; + return; +} + +void _wifid_create_about_view(struct ug_data *ugd) +{ + + Evas_Object *back_btn = NULL; + Elm_Object_Item *navi_item = NULL; + Evas_Object *control_bar = NULL; + Elm_Object_Item *item = NULL; + Evas_Object *genlist = NULL; + if(ugd == NULL) + { + DBG(LOG_ERROR, "Incorrect parameter(NULL)"); + return; + } + + genlist = elm_genlist_add(ugd->naviframe); + elm_object_style_set(genlist, "dialogue"); + + DBG(LOG_VERBOSE, "creating about view"); + elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS); +#if 0 + itc.item_style = "multiline/1text"; + itc.func.text_get = _wfd_gl_label_help_dialogue_get; + itc.func.content_get = NULL; +#else + itc.item_style = "1icon"; + itc.func.text_get = NULL; + itc.func.content_get = _wfd_gl_help_icon_get; +#endif + itc.func.state_get = NULL; + itc.func.del = NULL; + 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", _about_view_back_btn_cb, (void*) ugd); + elm_object_focus_allow_set(back_btn, EINA_FALSE); + + item = elm_genlist_item_append(genlist, &itc, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + evas_object_show(genlist); + navi_item = elm_naviframe_item_push(ugd->naviframe, IDS_WFD_TITLE_ABOUT_WIFI, back_btn, NULL, genlist, NULL); + + control_bar = elm_toolbar_add(ugd->naviframe); + elm_toolbar_shrink_mode_set(control_bar, ELM_TOOLBAR_SHRINK_EXPAND); + evas_object_show(control_bar); + elm_object_item_part_content_set(navi_item, "controlbar", control_bar); + +} diff --git a/ug-wifidirect/src/wfd_ug_genlist.c b/ug-wifidirect/src/wfd_ug_genlist.c new file mode 100755 index 0000000..fc5aa93 --- /dev/null +++ b/ug-wifidirect/src/wfd_ug_genlist.c @@ -0,0 +1,802 @@ +/* +* 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" + +Elm_Gen_Item_Class sep_itc; +Elm_Gen_Item_Class sep_itc_end; +Elm_Gen_Item_Class head_itc; +Elm_Gen_Item_Class name_itc; +Elm_Gen_Item_Class title_itc; +Elm_Gen_Item_Class peer_itc; +Elm_Gen_Item_Class noitem_itc; +Elm_Gen_Item_Class help_itc; +Elm_Gen_Item_Class button_itc; + +Elm_Gen_Item_Class title_conn_itc; +Elm_Gen_Item_Class peer_conn_itc; + +Elm_Gen_Item_Class title_busy_itc; +Elm_Gen_Item_Class peer_busy_itc; + +Elm_Gen_Item_Class title_multi_connect_itc; +Elm_Gen_Item_Class peer_multi_connect_itc; + +Elm_Gen_Item_Class title_conn_failed_itc; +Elm_Gen_Item_Class peer_conn_failed_itc; + + +static char *_gl_header_label_get(void *data, Evas_Object * obj, const char *part) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + DBG(LOG_VERBOSE, "%s", part); + + if(data == NULL) + { + DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); + return NULL; + } + + if(!strcmp(part, "elm.text.1")) + { + DBG(LOG_VERBOSE, "Current text mode [%d]\n", ugd->head_text_mode); + switch(ugd->head_text_mode) + { + case HEAD_TEXT_TYPE_DIRECT: + case HEAD_TEXT_TYPE_ACTIVATED: + case HEAD_TEXT_TYPE_SCANING: + return strdup(dgettext("sys_string", "IDS_COM_OPT1_WI_FI_DIRECT")); + break; + case HEAD_TEXT_TYPE_DEACTIVATING: + return strdup(_("IDS_WFD_BODY_DEACTIVATING")); // "Deactivating Wi-Fi Direct..." + break; + case HEAD_TEXT_TYPE_ACTIVATING: + return strdup(_("IDS_WFD_BODY_ACTIVATING")); //"Activating Wi-Fi Direct..." + break; + default: + break; + } + } + else if(!strcmp(part, "elm.text.1")) + { + return strdup(dgettext("sys_string", "IDS_COM_OPT1_WI_FI_DIRECT")); + } else if(!strcmp(part, "elm.text.2")) + { + return strdup(ugd->dev_name); + } + + __FUNC_EXIT__; + return NULL; +} + +static Evas_Object *_gl_header_icon_get(void *data, Evas_Object * obj, const char *part) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + Evas_Object *onoff = NULL; + + if(data == NULL) + { + DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); + return NULL; + } + + if(ugd->head_text_mode == HEAD_TEXT_TYPE_ACTIVATING || + ugd->head_text_mode == HEAD_TEXT_TYPE_DEACTIVATING) + return NULL; + + DBG(LOG_VERBOSE, "%s", part); + onoff = elm_check_add(obj); + elm_object_style_set(onoff, "on&off"); + elm_check_state_set(onoff, ugd->wfd_onoff); + evas_object_smart_callback_add(onoff, "changed", _wfd_onoff_btn_cb, ugd); + evas_object_show(onoff); + + __FUNC_EXIT__; + + return onoff; +} + + +static char *_gl_name_label_get(void *data, Evas_Object *obj, const char *part) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + + if(data == NULL) + { + DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); + return NULL; + } + + DBG(LOG_VERBOSE, "%s", part); + + if(!strcmp(part, "elm.text")) + { + return strdup(IDS_WFD_TITLE_ABOUT_WIFI); // "Device name" + } + else if(!strcmp(part, "elm.text.2")) + { + return strdup(ugd->dev_name); + } + + __FUNC_EXIT__; + + return NULL; +} + + +static char *_gl_title_label_get(void *data, Evas_Object *obj, + const char *part) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + + if(data == NULL) + { + DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); + return NULL; + } + + if (!strcmp(part, "elm.text")) + { + if (ugd->multiconn_view_genlist != NULL) + { + // It's called at Multi connect view... + if(ugd->gl_available_dev_cnt_at_multiconn_view > 0) + return strdup(_("IDS_WFD_BODY_AVAILABLE_DEVICES")); // "Available devices" + else + return strdup(_("IDS_WFD_BODY_WIFI_DIRECT_DEVICES")); // "Wi-Fi Direct devices" + } + else + { + // It's called at Main View + if(ugd->gl_available_peer_cnt > 0) + return strdup(_("IDS_WFD_BODY_AVAILABLE_DEVICES")); // "Available devices" + else + return strdup(_("IDS_WFD_BODY_WIFI_DIRECT_DEVICES")); // "Wi-Fi Direct devices" + } + } + + __FUNC_EXIT__; + + return NULL; +} + +static Evas_Object *_gl_title_content_get(void *data, Evas_Object *obj, const char *part) +{ + Evas_Object *progressbar = NULL; + struct ug_data *ugd = (struct ug_data*) data; + + if (data == NULL) { + DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); + return NULL; + } + + if (!strcmp(part, "elm.icon")) { + if (HEAD_TEXT_TYPE_SCANING == ugd->head_text_mode) { + progressbar = elm_progressbar_add(obj); + elm_object_style_set(progressbar, "list_process_small"); + elm_progressbar_horizontal_set(progressbar, EINA_TRUE); + elm_progressbar_pulse(progressbar, EINA_TRUE); + evas_object_show(progressbar); + } else { + return NULL; + } + } + + return progressbar; +} + +static char *_gl_peer_label_get(void *data, Evas_Object * obj, const char *part) +{ + __FUNC_ENTER__; + assertm_if(NULL == obj, "NULL!!"); + assertm_if(NULL == part, "NULL!!"); + + device_type_s *peer = (device_type_s*) data; + char buf[WFD_GLOBALIZATION_STR_LENGTH] = { 0, }; + DBG(LOG_VERBOSE, "%s", part); + if(data == NULL) + { + DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); + return NULL; + } + + if (!strcmp(part, "elm.text.1")) + { + __FUNC_EXIT__; + return strdup(peer->ssid); + } + else if (!strcmp(part, "elm.text.2")) + { + switch (peer->conn_status) { + case PEER_CONN_STATUS_DISCONNECTED: + g_strlcpy(buf, IDS_WFD_TAP_TO_CONNECT, + WFD_GLOBALIZATION_STR_LENGTH); + break; + + case PEER_CONN_STATUS_CONNECTING: + g_strlcpy(buf, IDS_WFD_CONNECTING, + WFD_GLOBALIZATION_STR_LENGTH); + break; + + case PEER_CONN_STATUS_CONNECTED: + g_strlcpy(buf, IDS_WFD_CONNECTED, + WFD_GLOBALIZATION_STR_LENGTH); + break; + + case PEER_CONN_STATUS_FAILED_TO_CONNECT: + g_strlcpy(buf, IDS_WFD_FAILED_TO_CONNECT, + WFD_GLOBALIZATION_STR_LENGTH); + break; + + case PEER_CONN_STATUS_WAIT_FOR_CONNECT: + g_strlcpy(buf, IDS_WFD_WAITING_FOR_CONNECT, + WFD_GLOBALIZATION_STR_LENGTH); + break; + + default: + g_strlcpy(buf, IDS_WFD_TAP_TO_CONNECT, + WFD_GLOBALIZATION_STR_LENGTH); + break; + } + } + else + { + __FUNC_EXIT__; + return NULL; + } + + __FUNC_EXIT__; + return strdup(buf); +} + +static Evas_Object *_gl_peer_icon_get(void *data, Evas_Object * obj, const char *part) +{ + __FUNC_ENTER__; + assertm_if(NULL == obj, "NULL!!"); + assertm_if(NULL == part, "NULL!!"); + + device_type_s *peer = (device_type_s*) data; + Evas_Object *icon = NULL; + + if(data == NULL) + { + DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); + return NULL; + } + + if(!strcmp(part, "elm.icon.2")) + { + DBG(LOG_VERBOSE, "elm.icon.2 - connection status [%d]\n", peer->conn_status); + if(peer->conn_status == PEER_CONN_STATUS_CONNECTING) + { + icon = elm_progressbar_add(obj); + elm_object_style_set(icon, "list_process"); + elm_progressbar_pulse(icon, EINA_TRUE); + } + else if(peer->conn_status == PEER_CONN_STATUS_CONNECTED) + { +#if 0 + icon = elm_icon_add(obj); + elm_icon_file_set(icon, WFD_ICON_CONNECTED, NULL); +#endif + return NULL; + } + + evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_icon_resizable_set(icon, 1, 1); + evas_object_show(icon); + } + else if(!strcmp(part, "elm.icon.1")) + { + DBG(LOG_VERBOSE, "elm.icon.1 - category [%d]\n", peer->category); + char *img_path = NULL; + switch(peer->category) + { + case WFD_DEVICE_TYPE_COMPUTER: + if (peer->conn_status == PEER_CONN_STATUS_CONNECTED) { + img_path = WFD_ICON_DEVICE_COMPUTER_CONNECT; + } else { + img_path = WFD_ICON_DEVICE_COMPUTER; + } + break; + case WFD_DEVICE_TYPE_INPUT_DEVICE: + if (peer->conn_status == PEER_CONN_STATUS_CONNECTED) { + img_path = WFD_ICON_DEVICE_INPUT_DEVICE_CONNECT; + } else { + img_path = WFD_ICON_DEVICE_INPUT_DEVICE; + } + break; + case WFD_DEVICE_TYPE_PRINTER: + if (peer->conn_status == PEER_CONN_STATUS_CONNECTED) { + img_path = WFD_ICON_DEVICE_PRINTER_CONNECT; + } else { + img_path = WFD_ICON_DEVICE_PRINTER; + } + break; + case WFD_DEVICE_TYPE_CAMERA: + if (peer->conn_status == PEER_CONN_STATUS_CONNECTED) { + img_path = WFD_ICON_DEVICE_CAMERA_CONNECT; + } else { + img_path = WFD_ICON_DEVICE_CAMERA; + } + break; + case WFD_DEVICE_TYPE_STORAGE: + if (peer->conn_status == PEER_CONN_STATUS_CONNECTED) { + img_path = WFD_ICON_DEVICE_STORAGE_CONNECT; + } else { + img_path = WFD_ICON_DEVICE_STORAGE; + } + break; + case WFD_DEVICE_TYPE_NW_INFRA: + if (peer->conn_status == PEER_CONN_STATUS_CONNECTED) { + img_path = WFD_ICON_DEVICE_NETWORK_INFRA_CONNECT; + } else { + img_path = WFD_ICON_DEVICE_NETWORK_INFRA; + } + break; + case WFD_DEVICE_TYPE_DISPLAYS: + if (peer->conn_status == PEER_CONN_STATUS_CONNECTED) { + img_path = WFD_ICON_DEVICE_DISPLAY_CONNECT; + } else { + img_path = WFD_ICON_DEVICE_DISPLAY; + } + break; + case WFD_DEVICE_TYPE_MM_DEVICES: + if (peer->conn_status == PEER_CONN_STATUS_CONNECTED) { + img_path = WFD_ICON_DEVICE_MULTIMEDIA_DEVICE_CONNECT; + } else { + img_path = WFD_ICON_DEVICE_MULTIMEDIA_DEVICE; + } + break; + case WFD_DEVICE_TYPE_GAME_DEVICES: + if (peer->conn_status == PEER_CONN_STATUS_CONNECTED) { + img_path = WFD_ICON_DEVICE_GAMING_DEVICE_CONNECT; + } else { + img_path = WFD_ICON_DEVICE_GAMING_DEVICE; + } + break; + case WFD_DEVICE_TYPE_TELEPHONE: + if (peer->conn_status == PEER_CONN_STATUS_CONNECTED) { + img_path = WFD_ICON_DEVICE_TELEPHONE_CONNECT; + } else { + img_path = WFD_ICON_DEVICE_TELEPHONE; + } + break; + case WFD_DEVICE_TYPE_AUDIO: + if (peer->conn_status == PEER_CONN_STATUS_CONNECTED) { + img_path = WFD_ICON_DEVICE_AUDIO_DEVICE_CONNECT; + } else { + img_path = WFD_ICON_DEVICE_AUDIO_DEVICE; + } + break; + default: + if (peer->conn_status == PEER_CONN_STATUS_CONNECTED) { + img_path = WFD_ICON_DEVICE_COMPUTER_CONNECT; + } else { + img_path = WFD_ICON_DEVICE_COMPUTER; + } + break; + } + + if(img_path != NULL) + { + icon = elm_icon_add(obj); + elm_icon_file_set(icon, img_path, NULL); + evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_icon_resizable_set(icon, 1, 1); + evas_object_show(icon); + } + else + { + return NULL; + } + } + + __FUNC_EXIT__; + return icon; +} + + +static char *_gl_noitem_text_get(void *data, Evas_Object * obj, + const char *part) +{ + __FUNC_ENTER__; + + if(data == NULL) + { + DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); + return NULL; + } + + __FUNC_EXIT__; + return strdup(IDS_WFD_NOCONTENT); +} + + +static char *_gl_help_label_get(void *data, Evas_Object * obj, const char *part) +{ + __FUNC_ENTER__; + DBG(LOG_VERBOSE, "%s", part); + __FUNC_EXIT__; + return strdup("Help"); +} + + +static Evas_Object *_gl_button_get(void *data, Evas_Object * obj, const char *part) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + + + DBG(LOG_VERBOSE, "%s", part); + + ugd->multi_btn = elm_button_add(obj); + + wfd_refresh_wifi_direct_state(ugd); + + if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_COMPLETED) + { + elm_object_text_set(ugd->multi_btn, IDS_WFD_BUTTON_DISCONNECT); + DBG(LOG_VERBOSE, "button: Disconnect\n"); + + // Don't connect "clicked" callback. + return ugd->multi_btn; + } + + if (ugd->wfd_status == WFD_LINK_STATUS_CONNECTING) + { + elm_object_text_set(ugd->multi_btn, IDS_WFD_BUTTON_CANCEL); + DBG(LOG_VERBOSE, "button: Cancel connect\n"); + } + else if (ugd->wfd_status >= WFD_LINK_STATUS_CONNECTED) + { + if (ugd->gl_connected_peer_cnt > 1) + { + elm_object_text_set(ugd->multi_btn, IDS_WFD_BUTTON_DISCONNECT_ALL); + DBG(LOG_VERBOSE, "button: Disconnect All\n"); + } + else + { + elm_object_text_set(ugd->multi_btn, IDS_WFD_BUTTON_DISCONNECT); + DBG(LOG_VERBOSE, "button: Disconnect\n"); + } + } + else + { + elm_object_text_set(ugd->multi_btn, IDS_WFD_BUTTON_MULTI); + DBG(LOG_VERBOSE, "button: Multi connect\n"); + } + + evas_object_smart_callback_add(ugd->multi_btn, "clicked", _wifid_create_multibutton_cb, ugd); + evas_object_show(ugd->multi_btn); + + __FUNC_EXIT__; + + return ugd->multi_btn; +} + + +static char *_gl_conn_dev_title_label_get(void *data, Evas_Object *obj, + const char *part) +{ + __FUNC_ENTER__; + + if(data == NULL) + { + DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); + return NULL; + } + + if (!strcmp(part, "elm.text")) + { + return strdup(IDS_WFD_BODY_CONNECTED_DEVICES); + } + + __FUNC_EXIT__; + + return NULL; +} + + +static char *_gl_peer_conn_dev_label_get(void *data, Evas_Object * obj, const char *part) +{ + __FUNC_ENTER__; + assertm_if(NULL == obj, "NULL!!"); + assertm_if(NULL == part, "NULL!!"); + + device_type_s *peer = (device_type_s*) data; + + char buf[WFD_GLOBALIZATION_STR_LENGTH] = { 0, }; + DBG(LOG_VERBOSE, "%s", part); + if(data == NULL) + { + DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); + return NULL; + } + + if (!strcmp(part, "elm.text.1")) + { + return strdup(peer->ssid); + } + else + { + g_strlcpy(buf, IDS_WFD_CONNECTED, + WFD_GLOBALIZATION_STR_LENGTH); + __FUNC_EXIT__; + return strdup(buf); + } +} + +static char *_gl_conn_failed_dev_title_label_get(void *data, Evas_Object *obj, + const char *part) +{ + __FUNC_ENTER__; + + if(data == NULL) + { + DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); + return NULL; + } + + if (!strcmp(part, "elm.text")) + { + return strdup(IDS_WFD_BODY_FAILED_DEVICES); + } + + __FUNC_EXIT__; + + return NULL; +} + + +static char *_gl_peer_conn_failed_dev_label_get(void *data, Evas_Object * obj, const char *part) +{ + __FUNC_ENTER__; + assertm_if(NULL == obj, "NULL!!"); + assertm_if(NULL == part, "NULL!!"); + + device_type_s *peer = (device_type_s*) data; + + char buf[WFD_GLOBALIZATION_STR_LENGTH] = { 0, }; + DBG(LOG_VERBOSE, "%s", part); + if(data == NULL) + { + DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); + return NULL; + } + + if (!strcmp(part, "elm.text.1")) + { + return strdup(peer->ssid); + } + else + { + g_strlcpy(buf, IDS_WFD_FAILED_TO_CONNECT, + WFD_GLOBALIZATION_STR_LENGTH); + __FUNC_EXIT__; + return strdup(buf); + } +} + +static char *_gl_multi_connect_dev_title_label_get(void *data, Evas_Object *obj, + const char *part) +{ + __FUNC_ENTER__; + struct ug_data *ugd = wfd_get_ug_data(); + + if(data == NULL) + { + DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); + return NULL; + } + + if (!strcmp(part, "elm.text")) + { + if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_IN_PROGRESS) + return strdup(_("IDS_WFD_BODY_AVAILABLE_DEVICES")); // "Available devices" + else if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_COMPLETED) + return strdup(IDS_WFD_BODY_FAILED_DEVICES); // "Available devices" + } + + __FUNC_EXIT__; + + return NULL; +} + + +static char *_gl_busy_dev_title_label_get(void *data, Evas_Object *obj, + const char *part) +{ + __FUNC_ENTER__; + + if(data == NULL) + { + DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); + return NULL; + } + + if (!strcmp(part, "elm.text")) + { + return strdup(IDS_WFD_BODY_BUSY_DEVICES); + } + + __FUNC_EXIT__; + + return NULL; +} + + +static char *_gl_peer_busy_dev_label_get(void *data, Evas_Object * obj, const char *part) +{ + __FUNC_ENTER__; + assertm_if(NULL == obj, "NULL!!"); + assertm_if(NULL == part, "NULL!!"); + device_type_s *peer = (device_type_s*) data; + char buf[WFD_GLOBALIZATION_STR_LENGTH] = { 0, }; + DBG(LOG_VERBOSE, "%s", part); + if(data == NULL) + { + DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); + return NULL; + } + DBG(LOG_VERBOSE, "peer->ssid = %s", peer->ssid); + if (!strcmp(part, "elm.text.1")) + { + return strdup(peer->ssid); + } + else + { + g_strlcpy(buf, IDS_WFD_CONNECTED_WITH_OTHER_DEVICE, + WFD_GLOBALIZATION_STR_LENGTH); + __FUNC_EXIT__; + return strdup(buf); + } +} + +static void _gl_peer_del(void *data, Evas_Object * obj) +{ + __FUNC_ENTER__; + assertm_if(NULL == obj, "NULL!!"); + assertm_if(NULL == data, "NULL!!"); + + __FUNC_EXIT__; + return; +} + +void initialize_gen_item_class() +{ + sep_itc.item_style = "dialogue/separator"; + sep_itc.func.text_get = NULL; + sep_itc.func.content_get = NULL; + sep_itc.func.state_get = NULL; + sep_itc.func.del = NULL; + + sep_itc_end.item_style = "dialogue/separator/end"; + sep_itc_end.func.text_get = NULL; + sep_itc_end.func.content_get = NULL; + sep_itc_end.func.state_get = NULL; + sep_itc_end.func.del = NULL; + + head_itc.item_style = "dialogue/2text.1icon.6"; + head_itc.func.text_get = _gl_header_label_get; + head_itc.func.content_get = _gl_header_icon_get; + head_itc.func.state_get = NULL; + + name_itc.item_style = "dialogue/1text"; + name_itc.func.text_get = _gl_name_label_get; + name_itc.func.content_get = NULL; + name_itc.func.state_get = NULL; + name_itc.func.del = NULL; + + title_itc.item_style = "dialogue/title"; + title_itc.func.text_get = _gl_title_label_get; + title_itc.func.content_get = _gl_title_content_get; + title_itc.func.state_get = NULL; + title_itc.func.del = NULL; + + peer_itc.item_style = "dialogue/2text.2icon.3"; + peer_itc.func.text_get = _gl_peer_label_get; + peer_itc.func.content_get = _gl_peer_icon_get; + peer_itc.func.state_get = NULL; + peer_itc.func.del = _gl_peer_del; + + noitem_itc.item_style ="dialogue/1text"; + noitem_itc.func.text_get = _gl_noitem_text_get; + noitem_itc.func.content_get = NULL; + noitem_itc.func.state_get = NULL; + noitem_itc.func.del = NULL; + + help_itc.item_style = "dialogue/1text"; + help_itc.func.text_get = _gl_help_label_get; + help_itc.func.content_get = NULL; + help_itc.func.state_get = NULL; + help_itc.func.del = NULL; + + button_itc.item_style = "1icon"; + button_itc.func.text_get = NULL; + button_itc.func.content_get = _gl_button_get; + button_itc.func.state_get = NULL; + button_itc.func.del = NULL; + + title_conn_itc.item_style = "dialogue/title"; + title_conn_itc.func.text_get = _gl_conn_dev_title_label_get; + title_conn_itc.func.content_get = NULL; + title_conn_itc.func.state_get = NULL; + title_conn_itc.func.del = NULL; + + peer_conn_itc.item_style = "dialogue/2text.2icon.3"; + peer_conn_itc.func.text_get = _gl_peer_conn_dev_label_get; + peer_conn_itc.func.content_get = _gl_peer_icon_get; + peer_conn_itc.func.state_get = NULL; + peer_conn_itc.func.del = _gl_peer_del; + + title_conn_failed_itc.item_style = "dialogue/title"; + title_conn_failed_itc.func.text_get = _gl_conn_failed_dev_title_label_get; + title_conn_failed_itc.func.content_get = NULL; + title_conn_failed_itc.func.state_get = NULL; + title_conn_failed_itc.func.del = NULL; + + peer_conn_failed_itc.item_style = "dialogue/2text.2icon.3"; + peer_conn_failed_itc.func.text_get = _gl_peer_conn_failed_dev_label_get; + peer_conn_failed_itc.func.content_get = _gl_peer_icon_get; + peer_conn_failed_itc.func.state_get = NULL; + peer_conn_failed_itc.func.del = _gl_peer_del; + + title_busy_itc.item_style = "dialogue/title"; + title_busy_itc.func.text_get = _gl_busy_dev_title_label_get; + title_busy_itc.func.content_get = NULL; + title_busy_itc.func.state_get = NULL; + title_busy_itc.func.del = NULL; + + peer_busy_itc.item_style = "dialogue/2text.2icon.3"; + peer_busy_itc.func.text_get = _gl_peer_busy_dev_label_get; + peer_busy_itc.func.content_get = _gl_peer_icon_get; + peer_busy_itc.func.state_get = NULL; + peer_busy_itc.func.del = _gl_peer_del; + + title_multi_connect_itc.item_style = "dialogue/title"; + title_multi_connect_itc.func.text_get = _gl_multi_connect_dev_title_label_get; + title_multi_connect_itc.func.content_get = NULL; + title_multi_connect_itc.func.state_get = NULL; + title_multi_connect_itc.func.del = NULL; + +#if 0 + peer_multi_connect_itc.item_style = "dialogue/2text.2icon.3"; + peer_multi_connect_itc.func.text_get = _gl_peer_label_get; + peer_multi_connect_itc.func.content_get = _gl_peer_icon_get; + peer_multi_connect_itc.func.state_get = NULL; + peer_multi_connect_itc.func.del = _gl_peer_del; +#endif +} 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__; +} diff --git a/ug-wifidirect/src/wfd_ug_multiconnect_view.c b/ug-wifidirect/src/wfd_ug_multiconnect_view.c new file mode 100755 index 0000000..aea5ce5 --- /dev/null +++ b/ug-wifidirect/src/wfd_ug_multiconnect_view.c @@ -0,0 +1,695 @@ +/* +* 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" + +Elm_Gen_Item_Class select_all_itc; +Elm_Gen_Item_Class device_itc; + + +void _multiconnect_view_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; + } + + ugd->multiconn_view_genlist = NULL; + elm_naviframe_item_pop(ugd->naviframe); + + __FUNC_EXIT__; + return; +} + +void reset_multi_conn_dev_list(void *data) +{ + struct ug_data *ugd = (struct ug_data*) data; + int i; + for (i = 0; i < MAX_PEER_NUM; i++) + { + ugd->multi_conn_dev_list[i].dev_sel_state = FALSE; + ugd->multi_conn_dev_list[i].peer.gl_item = NULL; + } + ugd->gl_available_dev_cnt_at_multiconn_view = 0; +} + +gboolean __wfd_multi_connect_reset_cb(void *data) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + + ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_NONE; + ugd->raw_multi_selected_peer_cnt = 0; + wfd_ug_view_update_peers(ugd); + + __FUNC_EXIT__; + return false; +} + +int wfd_stop_multi_connect(void *data) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + + ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_COMPLETED; + wfd_client_set_p2p_group_owner_intent(7); + + g_timeout_add(1000 /*ms*/, __wfd_multi_connect_reset_cb, ugd); + + __FUNC_EXIT__; + return 0; +} + +int wfd_start_multi_connect(void* data) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + int i; + int res; + + if (ugd->raw_multi_selected_peer_cnt > 0) + { + ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_IN_PROGRESS; + if (wfd_client_set_p2p_group_owner_intent(15) == WIFI_DIRECT_ERROR_NONE) + { + for (i=0;i<ugd->raw_multi_selected_peer_cnt; i++) + { + res = wfd_client_connect(ugd->raw_multi_selected_peers[i].mac_addr); + if (res == -1) + { + DBG(LOG_VERBOSE, "Failed to connect [%s].\n", ugd->raw_multi_selected_peers[i].ssid); + ugd->raw_multi_selected_peers[i].conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT; + } + else + { + ugd->raw_multi_selected_peers[i].conn_status = PEER_CONN_STATUS_CONNECTING; + break; + } + } + + if (i >= ugd->raw_multi_selected_peer_cnt) + { + wfd_client_set_p2p_group_owner_intent(7); + + DBG(LOG_VERBOSE, "All connect trails are failed.\n"); + return -1; + } + } + else + { + // error popup... + DBG(LOG_VERBOSE, "Setting GO intent is failed.\n"); + return -1; + } + + } + else + { + DBG(LOG_VERBOSE, "No selected peers.\n"); + return -1; + } + + __FUNC_EXIT__; + return 0; +} + +gboolean wfd_multi_connect_next_cb(void* data) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + int i; + int res; + + // Reset g_source handler.. + ugd->g_source_multi_connect_next = 0; + + if (ugd->raw_multi_selected_peer_cnt > 0) + { + ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_IN_PROGRESS; + for (i=0;i<ugd->raw_multi_selected_peer_cnt; i++) + { + if (ugd->raw_multi_selected_peers[i].conn_status == PEER_CONN_STATUS_WAIT_FOR_CONNECT) + { + res = wfd_client_connect(ugd->raw_multi_selected_peers[i].mac_addr); + if (res == -1) + { + DBG(LOG_VERBOSE, "Failed to connect [%s].\n", ugd->raw_multi_selected_peers[i].ssid); + ugd->raw_multi_selected_peers[i].conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT; + } + else + { + ugd->raw_multi_selected_peers[i].conn_status = PEER_CONN_STATUS_CONNECTING; + break; + } + } + } + + if (i >= ugd->raw_multi_selected_peer_cnt) + { + // All selected peers are touched. + DBG(LOG_VERBOSE, "Stop Multi Connect...\n"); + wfd_stop_multi_connect(ugd); + } + } + else + { + DBG(LOG_VERBOSE, "No selected peers.\n"); + return -1; + } + + __FUNC_EXIT__; + return false; +} + + +void _connect_btn_cb(void *data, Evas_Object * obj, void *event_info) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + int i = 0; + int count = 0; + char popup_text[MAX_POPUP_TEXT_SIZE] = {0}; + DBG(LOG_VERBOSE, "_connect_btn_cb \n"); + + for (i = 0; i < ugd->gl_available_peer_cnt ; i++) + { + if (TRUE == ugd->multi_conn_dev_list[i].dev_sel_state) + { + DBG(LOG_VERBOSE, "ugd->peers[i].mac_addr = %s, i = %d\n", ugd->multi_conn_dev_list[i].peer.mac_addr, i); + + memcpy(&ugd->raw_multi_selected_peers[count], &ugd->multi_conn_dev_list[i].peer,sizeof(device_type_s)); + ugd->raw_multi_selected_peers[count].conn_status = PEER_CONN_STATUS_WAIT_FOR_CONNECT; + count++; + } + } + + ugd->raw_multi_selected_peer_cnt = count; + + /* if more than 7 device selected, show the popup */ + if (count > MAX_POPUP_PEER_NUM) { + snprintf(popup_text, MAX_POPUP_TEXT_SIZE, _("IDS_WFD_POP_MULTI_CONNECT"), count); + wfd_ug_warn_popup(ugd, popup_text, POP_TYPE_MULTI_CONNECT_POPUP); + } + + if (wfd_start_multi_connect(ugd) != -1) + { + wfd_ug_view_update_peers(ugd); + } + + elm_naviframe_item_pop(ugd->naviframe); + + //ToDo: Do we need to free multiconn_view_genlist? + ugd->multiconn_view_genlist = NULL; + _change_multi_button_title(ugd); + + __FUNC_EXIT__; + return; +} + + + +static void _wfd_gl_multi_sel_cb(void *data, Evas_Object *obj, void *event_info) +{ + __FUNC_ENTER__; + + int i = 0; + int index = 0; + int sel_count = 0; + bool is_sel = FALSE; + bool is_selct_all = TRUE; + Eina_Bool state = 0; + Evas_Object *chk_box = NULL; + char msg[MAX_POPUP_TEXT_SIZE] = {0}; + struct ug_data *ugd = (struct ug_data*) data; + Elm_Object_Item *item = (Elm_Object_Item *)event_info; + + if (NULL == ugd || NULL == item) { + DBG(LOG_ERROR, "The param is NULL\n"); + return; + } + + elm_genlist_item_selected_set(item, EINA_FALSE); + index = elm_genlist_item_index_get(item) - 3; /* subtract the previous items */ + DBG(LOG_VERBOSE, "selected index = %d \n", index); + if (index < 0) { + DBG(LOG_ERROR, "The index is invalid.\n"); + return; + } + + chk_box = elm_object_item_part_content_get((Elm_Object_Item *)event_info, "elm.icon.1"); + state = elm_check_state_get(chk_box); + DBG(LOG_VERBOSE, "state = %d \n", state); + elm_check_state_set(chk_box, !state); + + ugd->multi_conn_dev_list[index].dev_sel_state = !state; + DBG(LOG_VERBOSE, "ptr->dev_sel_state = %d \n", ugd->multi_conn_dev_list[index].dev_sel_state); + DBG(LOG_VERBOSE, "ptr->peer.mac_addr = %s \n", ugd->multi_conn_dev_list[index].peer.mac_addr); + + /* update the checkbox and button */ + for (; i < ugd->gl_available_dev_cnt_at_multiconn_view; i++) { + if (ugd->multi_conn_dev_list[i].dev_sel_state) { + is_sel = TRUE; + sel_count++; + } else { + is_selct_all = FALSE; + } + } + + chk_box = elm_object_item_part_content_get(ugd->mcview_select_all_item, "elm.icon"); + elm_check_state_set(chk_box, is_selct_all); + + if (ugd->multi_connect_btn) { + wfd_ug_view_refresh_button(ugd->multi_connect_btn, _("IDS_WFD_BUTTON_CONNECT"), is_sel); + } + + if (sel_count > 0) { + snprintf(msg, MAX_POPUP_TEXT_SIZE, _("IDS_WFD_POP_SELECTED_DEVICE_NUM"), sel_count); + wfd_ug_tickernoti_popup(msg); + } + + __FUNC_EXIT__; +} + +static void _wfd_gl_sel_cb(void *data, Evas_Object *obj, void *event_info) +{ + int sel_count = 0; + char msg[MAX_POPUP_TEXT_SIZE] = {0}; + struct ug_data *ugd = (struct ug_data*) data; + + elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE); + + if (NULL == ugd || NULL == obj) { + DBG(LOG_ERROR, "NULL parameters.\n"); + return; + } + + Evas_Object *sel_chkbox = elm_object_item_part_content_get(ugd->mcview_select_all_item, "elm.icon"); + if (sel_chkbox==NULL) + { + DBG(LOG_VERBOSE, "select-all chkbox is NULL\n"); + return; + } + Eina_Bool state = elm_check_state_get(sel_chkbox); + + if (state==TRUE) + state = FALSE; + else + state = TRUE; + elm_check_state_set(sel_chkbox, state); + + DBG(LOG_VERBOSE, "state = %d \n", state); + + int i = 0; + bool is_sel = FALSE; + Elm_Object_Item *item = NULL; + Evas_Object *chk_box = NULL; + + /* set the state of all the available devices */ + for (i = 0; i < ugd->gl_available_dev_cnt_at_multiconn_view; i++) { + is_sel = state; + ugd->multi_conn_dev_list[i].dev_sel_state = state; + item = ugd->multi_conn_dev_list[i].peer.gl_item; + chk_box = elm_object_item_part_content_get(item, "elm.icon.1"); + elm_check_state_set(chk_box, state); + + if (state) { + sel_count++; + } + } + + /* update the connect button */ + if (ugd->multi_connect_btn) { + wfd_ug_view_refresh_button(ugd->multi_connect_btn, _("IDS_WFD_BUTTON_CONNECT"), is_sel); + } + + /* tickernoti popup */ + if (sel_count > 0) { + snprintf(msg, MAX_POPUP_TEXT_SIZE, _("IDS_WFD_POP_SELECTED_DEVICE_NUM"), sel_count); + wfd_ug_tickernoti_popup(msg); + } + + //elm_check_state_set(ugd->mcview_select_all_icon, EINA_FALSE); +} + + +static char *_wfd_gl_device_label_get(void *data, Evas_Object *obj, const char *part) +{ + DBG(LOG_VERBOSE, "part %s", part); + device_type_s *peer = (device_type_s*) data; + + if (NULL == peer) + return NULL; + + if (!strcmp(part, "elm.text")) { + return strdup(peer->ssid); + } + return NULL; +} + + +static char *__wfd_get_device_icon_path(device_type_s *peer) +{ + char *img_path = NULL; + + switch(peer->category) + { + case WFD_DEVICE_TYPE_COMPUTER: + img_path = WFD_ICON_DEVICE_COMPUTER; + break; + case WFD_DEVICE_TYPE_INPUT_DEVICE: + img_path = WFD_ICON_DEVICE_INPUT_DEVICE; + break; + case WFD_DEVICE_TYPE_PRINTER: + img_path = WFD_ICON_DEVICE_PRINTER; + break; + case WFD_DEVICE_TYPE_CAMERA: + img_path = WFD_ICON_DEVICE_CAMERA; + break; + case WFD_DEVICE_TYPE_STORAGE: + img_path = WFD_ICON_DEVICE_STORAGE; + break; + case WFD_DEVICE_TYPE_NW_INFRA: + img_path = WFD_ICON_DEVICE_NETWORK_INFRA; + break; + case WFD_DEVICE_TYPE_DISPLAYS: + img_path = WFD_ICON_DEVICE_DISPLAY; + break; + case WFD_DEVICE_TYPE_MM_DEVICES: + img_path = WFD_ICON_DEVICE_MULTIMEDIA_DEVICE; + break; + case WFD_DEVICE_TYPE_GAME_DEVICES: + img_path = WFD_ICON_DEVICE_GAMING_DEVICE; + break; + case WFD_DEVICE_TYPE_TELEPHONE: + img_path = WFD_ICON_DEVICE_TELEPHONE; + break; + case WFD_DEVICE_TYPE_AUDIO: + img_path = WFD_ICON_DEVICE_AUDIO_DEVICE; + break; + default: + img_path = WFD_ICON_DEVICE_COMPUTER; + break; + } + + return img_path; +} + + + +static void _wfd_check_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + struct ug_data *ugd = (struct ug_data*) data; + if (NULL == ugd || NULL == obj) { + DBG(LOG_ERROR, "NULL parameters.\n"); + return; + } + + int i = 0; + bool is_sel = FALSE; + Elm_Object_Item *item = NULL; + Evas_Object *chk_box = NULL; + Eina_Bool state = elm_check_state_get(obj); + elm_check_state_set(obj, !state); + + DBG(LOG_VERBOSE, "state = %d \n", state); + +#if 0 + /* set the state of all the available devices */ + for (i = 0; i < ugd->gl_available_dev_cnt_at_multiconn_view; i++) { + is_sel = state; + ugd->multi_conn_dev_list[i].dev_sel_state = state; + item = ugd->multi_conn_dev_list[i].peer.gl_item; + chk_box = elm_object_item_part_content_get(item, "elm.icon.1"); + elm_check_state_set(chk_box, state); + } + + /* update the connect button */ + wfd_ug_view_refresh_button(ugd->multi_connect_btn, _("IDS_WFD_BUTTON_CONNECT"), is_sel); +#endif +} + + +static Evas_Object *_wfd_gl_device_icon_get(void *data, Evas_Object *obj, const char *part) +{ + char *img_path = NULL; + device_type_s *peer = (device_type_s*) data; + Evas_Object* icon = NULL; + + DBG(LOG_VERBOSE, "Part %s", part); + + if (!strcmp(part, "elm.icon.1")) { + DBG(LOG_VERBOSE, "Part %s", part); + icon = elm_check_add(obj); + elm_check_state_set(icon, EINA_FALSE); + evas_object_smart_callback_add(icon, "changed", _wfd_check_clicked_cb, (void *)data); + } else if (!strcmp(part, "elm.icon.2")) { + img_path = __wfd_get_device_icon_path(peer); + icon = elm_icon_add(obj); + elm_icon_file_set(icon, img_path, NULL); + evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_icon_resizable_set(icon, 1, 1); + evas_object_show(icon); + } + + return icon; +} + + +static char *_wfd_gl_select_all_label_get(void *data, Evas_Object *obj, const char *part) +{ + if (!strcmp(part, "elm.text")) { + DBG(LOG_VERBOSE, "Adding text %s", part); + return strdup("Select all"); + } + return NULL; +} + +static Evas_Object *_wfd_gl_select_all_icon_get(void *data, Evas_Object *obj, const char *part) +{ + struct ug_data *ugd = (struct ug_data*) data; + Evas_Object* icon = NULL; + + if (!strcmp(part, "elm.icon")) { + DBG(LOG_VERBOSE, "Part %s", part); + icon = elm_check_add(obj); + elm_check_state_set(icon, EINA_FALSE); + evas_object_smart_callback_add(icon, "changed", _wfd_check_clicked_cb, (void *)data); + } + + return icon; +} + + + + +int _wfd_free_multiconnect_device(struct ug_data *ugd) +{ + __FUNC_ENTER__; + + int count = 0; + int i = 0; + + if (ugd->multiconn_view_genlist == NULL) + { + return 0; + } + + if (ugd->mcview_title_item != NULL) + { + elm_object_item_del(ugd->mcview_title_item); + ugd->mcview_title_item = NULL; + } + + if (ugd->mcview_select_all_item != NULL) + { + elm_object_item_del(ugd->mcview_select_all_item); + ugd->mcview_select_all_item = NULL; + } + + if (ugd->mcview_nodevice_item != NULL) + { + elm_object_item_del(ugd->mcview_nodevice_item); + ugd->mcview_nodevice_item = NULL; + } + + for(i = 0; i < ugd->gl_available_dev_cnt_at_multiconn_view; i++) + { + if (ugd->multi_conn_dev_list[i].peer.gl_item != NULL) + { + elm_object_item_del(ugd->multi_conn_dev_list[i].peer.gl_item); + ugd->multi_conn_dev_list[i].peer.gl_item = NULL; + } + } + ugd->gl_available_dev_cnt_at_multiconn_view = 0; + + __FUNC_EXIT__; + return 0; +} + +int _wfd_update_multiconnect_device(struct ug_data *ugd) +{ + __FUNC_ENTER__; + + int count = 0; + device_type_s *device = NULL; + Evas_Object *genlist = NULL; + int i = 0; + + genlist = ugd->multiconn_view_genlist; + if (ugd->multiconn_view_genlist == NULL) + { + return 0; + } + + _wfd_free_multiconnect_device(ugd); + + count = 0; + for(i = 0; i < ugd->raw_discovered_peer_cnt; i++) + { + device = &ugd->raw_discovered_peers[i]; + if (device->is_connected == FALSE) + { + count++; + } + } + ugd->gl_available_dev_cnt_at_multiconn_view = count; + + if (ugd->gl_available_dev_cnt_at_multiconn_view == 0) + { + DBG(LOG_ERROR, "There are No peers\n"); + ugd->mcview_title_item = elm_genlist_item_append(genlist, &title_itc, ugd, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_genlist_item_select_mode_set(ugd->mcview_title_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + ugd->mcview_nodevice_item = elm_genlist_item_append(genlist, &noitem_itc, (void*)ugd, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_genlist_item_select_mode_set(ugd->mcview_nodevice_item , ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + } + else + { + ugd->mcview_title_item = elm_genlist_item_append(genlist, &title_itc, ugd, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_genlist_item_select_mode_set(ugd->mcview_title_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + ugd->mcview_select_all_item = elm_genlist_item_append(genlist, &select_all_itc, ugd, NULL, ELM_GENLIST_ITEM_NONE, _wfd_gl_sel_cb, ugd); + + count = 0; + for(i = 0; i < ugd->raw_discovered_peer_cnt; i++) + { + device = &ugd->raw_discovered_peers[i]; + if (device->is_connected == FALSE) + { + DBG(LOG_VERBOSE, "%dth peer being added on genlist\n", i); + + if (ugd->multi_conn_dev_list[count].peer.gl_item != NULL) + elm_object_item_del(ugd->multi_conn_dev_list[count].peer.gl_item); + ugd->multi_conn_dev_list[count].peer.gl_item = NULL; + + memcpy(&ugd->multi_conn_dev_list[count].peer, device, sizeof(device_type_s)); + + ugd->multi_conn_dev_list[count].dev_sel_state = FALSE; + ugd->multi_conn_dev_list[count].peer.gl_item = + elm_genlist_item_append(genlist, &device_itc, (void*) &ugd->multi_conn_dev_list[count].peer, + NULL, ELM_GENLIST_ITEM_NONE, _wfd_gl_multi_sel_cb, ugd); + count++; + } + } + } + + __FUNC_EXIT__; + return 0; +} + +void _wifid_create_multiconnect_view(struct ug_data *ugd) +{ + __FUNC_ENTER__; + + Evas_Object *back_btn = NULL; + Evas_Object *control_bar = NULL; + Evas_Object *genlist = NULL; + + Elm_Object_Item *navi_item = NULL; + Elm_Object_Item *item = NULL; + + if(ugd == NULL) + { + DBG(LOG_ERROR, "Incorrect parameter(NULL)"); + return; + } + + select_all_itc.item_style = "1text.1icon.3"; + select_all_itc.func.text_get = _wfd_gl_select_all_label_get; + select_all_itc.func.content_get = _wfd_gl_select_all_icon_get; + select_all_itc.func.state_get = NULL; + select_all_itc.func.del = NULL; + + device_itc.item_style = "1text.2icon.2"; + device_itc.func.text_get = _wfd_gl_device_label_get; + device_itc.func.content_get = _wfd_gl_device_icon_get; + device_itc.func.state_get = NULL; + device_itc.func.del = NULL; + + DBG(LOG_VERBOSE, "_wifid_create_multiconnect_view"); + 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", _multiconnect_view_back_btn_cb, (void*) ugd); + elm_object_focus_allow_set(back_btn, EINA_FALSE); + + genlist = elm_genlist_add(ugd->naviframe); + ugd->multiconn_view_genlist = genlist; + elm_object_style_set(ugd->multiconn_view_genlist, "dialogue"); + + ugd->mcview_title_item = NULL; + + _wfd_update_multiconnect_device(ugd); + + evas_object_show(genlist); + + navi_item = elm_naviframe_item_push(ugd->naviframe, _("Multi connect"), back_btn, NULL, genlist, NULL); + + control_bar = elm_toolbar_add(ugd->naviframe); + elm_toolbar_shrink_mode_set(control_bar, ELM_TOOLBAR_SHRINK_EXPAND); + evas_object_show(control_bar); + + ugd->multi_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); + ugd->multi_connect_btn = elm_toolbar_item_append(control_bar, NULL, _("IDS_WFD_BUTTON_CONNECT"), _connect_btn_cb, (void*) ugd); + + if (ugd->multi_connect_btn) { + wfd_ug_view_refresh_button(ugd->multi_connect_btn, _("IDS_WFD_BUTTON_CONNECT"), FALSE); + } + + item = elm_toolbar_item_append(control_bar, NULL, NULL, NULL, NULL); + elm_object_item_disabled_set(item, EINA_TRUE); + elm_object_item_part_content_set(navi_item, "controlbar", control_bar); + + __FUNC_EXIT__; +} diff --git a/ug-wifidirect/src/wfd_ug_popup.c b/ug-wifidirect/src/wfd_ug_popup.c new file mode 100755 index 0000000..0c20c0f --- /dev/null +++ b/ug-wifidirect/src/wfd_ug_popup.c @@ -0,0 +1,399 @@ +/* +* 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" + +static void _wfd_ug_act_popup_hotspot_ok_cb(void *data, Evas_Object *obj, void *event_info) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + + // TODO: Turn off Hotspot + ugd->wfd_status = WFD_LINK_STATUS_DEACTIVATED; + wfd_mobile_ap_off(ugd); + + evas_object_del(ugd->act_popup); + ugd->act_popup = NULL; + __FUNC_EXIT__; +} + +static void _wfd_ug_act_popup_hotspot_cancel_cb(void *data, Evas_Object *obj, void *event_info) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + + // TODO: set genlist head item as "WiFi Direct" + ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT; + wfd_ug_view_refresh_glitem(ugd->head); + + evas_object_del(ugd->act_popup); + ugd->act_popup = NULL; + __FUNC_EXIT__; +} + +static void _wfd_ug_act_popup_wifi_ok_cb(void *data, Evas_Object *obj, void *event_info) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + + // TODO: Turn off WiFi + ugd->wfd_status = WFD_LINK_STATUS_DEACTIVATED; + wfd_wifi_off(ugd); + + evas_object_del(ugd->act_popup); + ugd->act_popup = NULL; + __FUNC_EXIT__; +} + +static void _wfd_ug_act_popup_wifi_cancel_cb(void *data, Evas_Object *obj, void *event_info) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + + // TODO: set genlist head item as "WiFi Direct" + ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT; + wfd_ug_view_refresh_glitem(ugd->head); + + evas_object_del(ugd->act_popup); + ugd->act_popup = NULL; + __FUNC_EXIT__; +} + +static void _wfd_ug_act_popup_disconnect_ok_cb(void *data, Evas_Object *obj, void *event_info) +{ + __FUNC_ENTER__; + + char *mac_addr = NULL; + struct ug_data *ugd = (struct ug_data*) data; + + if (NULL == ugd) { + DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); + return; + } + + if (ugd->gl_connected_peer_cnt < 1) { + DBG(LOG_ERROR, "No connected peer\n"); + evas_object_del(ugd->act_popup); + ugd->act_popup = NULL; + return; + } + + /* just one peer */ + mac_addr = ugd->gl_connected_peers[0].mac_addr; + wfd_client_disconnect(mac_addr); + if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_IN_PROGRESS) { + wfd_stop_multi_connect(ugd); + } + + evas_object_del(ugd->act_popup); + ugd->act_popup = NULL; + + __FUNC_EXIT__; +} + +static void _wfd_ug_act_popup_disconnect_cancel_cb(void *data, Evas_Object *obj, void *event_info) +{ + __FUNC_ENTER__; + + struct ug_data *ugd = (struct ug_data*) data; + if (NULL == ugd) { + DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); + return; + } + + evas_object_del(ugd->act_popup); + ugd->act_popup = NULL; + + __FUNC_EXIT__; +} + +static void _wfd_ug_act_popup_disconnect_all_ok_cb(void *data, Evas_Object *obj, void *event_info) +{ + __FUNC_ENTER__; + + struct ug_data *ugd = (struct ug_data*) data; + if (NULL == ugd) { + DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); + return; + } + + wfd_client_disconnect(NULL); + if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_IN_PROGRESS) { + wfd_stop_multi_connect(ugd); + } + + evas_object_del(ugd->act_popup); + ugd->act_popup = NULL; + + __FUNC_EXIT__; +} + +static void _wfd_ug_act_popup_disconnect_all_cancel_cb(void *data, Evas_Object *obj, void *event_info) +{ + __FUNC_ENTER__; + + struct ug_data *ugd = (struct ug_data*) data; + if (NULL == ugd) { + DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); + return; + } + + evas_object_del(ugd->act_popup); + ugd->act_popup = NULL; + + __FUNC_EXIT__; +} + +static void _wfd_ug_act_popup_scan_again_ok_cb(void *data, Evas_Object *obj, void *event_info) +{ + __FUNC_ENTER__; + + struct ug_data *ugd = (struct ug_data*) data; + if (NULL == ugd) { + DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); + return; + } + + if (ugd->conn_wfd_item != NULL) { + elm_object_item_del(ugd->conn_wfd_item); + ugd->conn_wfd_item = NULL; + } + + /* cancel the current connection */ + wfd_client_disconnect(NULL); + if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_IN_PROGRESS) { + wfd_stop_multi_connect(ugd); + } + + /* start discovery again */ + wfd_client_start_discovery(ugd); + evas_object_del(ugd->act_popup); + ugd->act_popup = NULL; + + __FUNC_EXIT__; +} + +static void _wfd_ug_act_popup_scan_again_cancel_cb(void *data, Evas_Object *obj, void *event_info) +{ + __FUNC_ENTER__; + + struct ug_data *ugd = (struct ug_data*) data; + + evas_object_del(ugd->act_popup); + ugd->act_popup = NULL; + + __FUNC_EXIT__; +} + +void wfd_ug_act_popup(void *data, const char *message, int popup_type) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + Evas_Object *popup = NULL; + Evas_Object *btn1 = NULL, *btn2 = NULL; + + popup = elm_popup_add(ugd->base); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(popup, message); + + btn1 = elm_button_add(popup); + btn2 = elm_button_add(popup); + elm_object_style_set(btn1, "popup_button/default"); + elm_object_style_set(btn2, "popup_button/default"); + + /* set the different text by type */ + if (popup_type == POPUP_TYPE_WIFI_OFF || popup_type == POPUP_TYPE_HOTSPOT_OFF) { + elm_object_text_set(btn1, S_("IDS_COM_SK_YES")); + elm_object_text_set(btn2, S_("IDS_COM_SK_NO")); + } else { + elm_object_text_set(btn1, S_("IDS_COM_SK_OK")); + elm_object_text_set(btn2, S_("IDS_COM_SK_CANCEL")); + } + + elm_object_part_content_set(popup, "button1", btn1); + elm_object_part_content_set(popup, "button2", btn2); + + /* set the different callback by type */ + if (popup_type == POPUP_TYPE_WIFI_OFF) { + evas_object_smart_callback_add(btn1, "clicked", _wfd_ug_act_popup_wifi_ok_cb, (void*) ugd); + evas_object_smart_callback_add(btn2, "clicked", _wfd_ug_act_popup_wifi_cancel_cb, (void*) ugd); + } else if (popup_type == POPUP_TYPE_HOTSPOT_OFF) { + evas_object_smart_callback_add(btn1, "clicked", _wfd_ug_act_popup_hotspot_ok_cb, (void*) ugd); + evas_object_smart_callback_add(btn2, "clicked", _wfd_ug_act_popup_hotspot_cancel_cb, (void*) ugd); + } else if (popup_type == POP_TYPE_DISCONNECT) { + //evas_object_smart_callback_add(btn1, "clicked", _wfd_ug_act_popup_disconnect_ok_cb, (void*) ugd); + evas_object_smart_callback_add(btn1, "clicked", _wfd_ug_act_popup_disconnect_all_ok_cb, (void*) ugd); + evas_object_smart_callback_add(btn2, "clicked", _wfd_ug_act_popup_disconnect_cancel_cb, (void*) ugd); + } else if (popup_type == POP_TYPE_DISCONNECT_ALL) { + evas_object_smart_callback_add(btn1, "clicked", _wfd_ug_act_popup_disconnect_all_ok_cb, (void*) ugd); + evas_object_smart_callback_add(btn2, "clicked", _wfd_ug_act_popup_disconnect_all_cancel_cb, (void*) ugd); + } else if (popup_type == POP_TYPE_SCAN_AGAIN) { + evas_object_smart_callback_add(btn1, "clicked", _wfd_ug_act_popup_scan_again_ok_cb, (void*) ugd); + evas_object_smart_callback_add(btn2, "clicked", _wfd_ug_act_popup_scan_again_cancel_cb, (void*) ugd); + } + + evas_object_show(popup); + ugd->act_popup = popup; + __FUNC_EXIT__; +} + +void wfg_ug_act_popup_remove(void *data) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + + if(ugd->act_popup) + { + evas_object_del(ugd->act_popup); + ugd->act_popup = NULL; + } + __FUNC_EXIT__; +} + +static void _wfd_ug_terminate_popup_cb(void *data, Evas_Object *obj, void *event_info) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + + evas_object_del(ugd->warn_popup); + ugd->warn_popup = NULL; + + wfd_ug_view_free_peers(ugd); + + ug_destroy_me(ugd->ug); + __FUNC_EXIT__; +} + +static void _wfd_ug_warn_popup_cb(void *data, Evas_Object *obj, void *event_info) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + + evas_object_del(ugd->warn_popup); + ugd->warn_popup = NULL; + + __FUNC_EXIT__; +} + +void wfd_ug_warn_popup(void *data, const char *message, int popup_type) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + Evas_Object *popup = NULL; + Evas_Object *btn = NULL; + + popup = elm_popup_add(ugd->base); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(popup, message); + + btn = elm_button_add(popup); + elm_object_style_set(btn, "popup_button/default"); + elm_object_text_set(btn, S_("IDS_COM_SK_OK")); + elm_object_part_content_set(popup, "button1", btn); + if(popup_type == POPUP_TYPE_TERMINATE) + evas_object_smart_callback_add(btn, "clicked", _wfd_ug_terminate_popup_cb, (void*) ugd); + else + evas_object_smart_callback_add(btn, "clicked", _wfd_ug_warn_popup_cb, (void*) ugd); + + evas_object_show(popup); + ugd->warn_popup = popup; + __FUNC_EXIT__; +} + +void wfg_ug_warn_popup_remove(void *data) +{ + __FUNC_ENTER__; + struct ug_data *ugd = (struct ug_data*) data; + + if(ugd->warn_popup) + { + evas_object_del(ugd->warn_popup); + ugd->warn_popup = NULL; + } + __FUNC_EXIT__; +} + + +void wfd_ug_tickernoti_popup(char *msg) +{ + __FUNC_ENTER__; + + int ret = -1; + bundle *b = NULL; + + b = bundle_create(); + if (!b) { + DBG(LOG_ERROR, "FAIL: bundle_create()\n"); + return; + } + + /* tickernoti style */ + ret = bundle_add(b, "0", "info"); + if (ret) { + DBG(LOG_ERROR, "Fail to add tickernoti style\n"); + bundle_free(b); + return; + } + + /* popup text */ + ret = bundle_add(b, "1", msg); + if (ret) { + DBG(LOG_ERROR, "Fail to add popup text\n"); + bundle_free(b); + return; + } + + /* orientation of tickernoti */ + ret = bundle_add(b, "2", "1"); + if (ret) { + DBG(LOG_ERROR, "Fail to add orientation of tickernoti\n"); + bundle_free(b); + return; + } + + /* timeout(second) of tickernoti */ + ret = bundle_add(b, "3", "3"); + if (ret) { + DBG(LOG_ERROR, "Fail to add timeout of tickernoti\n"); + bundle_free(b); + return; + } + + /* launch tickernoti */ + ret = syspopup_launch(TICKERNOTI_SYSPOPUP, b); + if (ret) { + DBG(LOG_ERROR, "Fail to launch syspopup\n"); + } + + bundle_free(b); + __FUNC_EXIT__; +} + diff --git a/ug-wifidirect/src/wfd_ug_view.c b/ug-wifidirect/src/wfd_ug_view.c deleted file mode 100644 index 7322477..0000000 --- a/ug-wifidirect/src/wfd_ug_view.c +++ /dev/null @@ -1,874 +0,0 @@ -/* - * 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. - */ - -/* - * This file implements view of Wi-Fi direct UI Gadget. - * - * @file wfd_ug_view.c - * @author Gibyoung Kim (lastkgb.kim@samsung.com) - * @version 0.1 - */ - - -#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" - - -Elm_Gen_Item_Class sep_itc; -Elm_Gen_Item_Class head_itc; -Elm_Gen_Item_Class name_itc; -Elm_Gen_Item_Class title_itc; -Elm_Gen_Item_Class peer_itc; -Elm_Gen_Item_Class noitem_itc; -Elm_Gen_Item_Class help_itc; - - -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); - - 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; - int res; - - res = wfd_client_start_discovery(ugd); - - __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__; -} - -static void _wfd_onoff_btn_cb(void *data, Evas_Object *obj, void *event_info) -{ - __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data*) data; - - ugd->wfd_status = wfd_client_get_link_status(); - DBG(LOG_VERBOSE, "WFD state is [%d]", ugd->wfd_status); - - 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; - } - - 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; - } - - ugd->head_text_mode = HEAD_TEXT_TYPE_DEACTIVATING; - wfd_client_switch_off(ugd); - } - wfd_ug_view_refresh_glitem(ugd->head); - - __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; - int res; - - 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__; -} - -static char *_gl_header_label_get(void *data, Evas_Object * obj, - const char *part) -{ - __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data *) data; - DBG(LOG_VERBOSE, "%s", part); - - if (data == NULL) - { - DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); - return NULL; - } - - if (!strcmp(part, "elm.text")) - { - DBG(LOG_VERBOSE, "Current text mode [%d]\n", ugd->head_text_mode); - switch (ugd->head_text_mode) - { - case HEAD_TEXT_TYPE_DIRECT: - return strdup(dgettext("sys_string", "IDS_COM_OPT1_WI_FI_DIRECT")); - break; - case HEAD_TEXT_TYPE_DEACTIVATING: - return strdup(_("IDS_WFD_BODY_DEACTIVATING")); - break; - case HEAD_TEXT_TYPE_ACTIVATING: - return strdup(_("IDS_WFD_BODY_ACTIVATING")); - break; - case HEAD_TEXT_TYPE_ACTIVATED: - return strdup(_("IDS_WFD_BODY_ACTIVATED")); - break; - case HEAD_TEXT_TYPE_SCANING: - return strdup(_("IDS_WFD_BODY_SCANNING")); - break; - default: - break; - } - } - - __FUNC_EXIT__; - return NULL; -} - -static Evas_Object *_gl_header_icon_get(void *data, Evas_Object * obj, - const char *part) -{ - __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data *) data; - Evas_Object *onoff = NULL; - - if (data == NULL) - { - DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); - return NULL; - } - - if (ugd->head_text_mode == HEAD_TEXT_TYPE_ACTIVATING || - ugd->head_text_mode == HEAD_TEXT_TYPE_DEACTIVATING) - return NULL; - - DBG(LOG_VERBOSE, "%s", part); - onoff = elm_check_add(obj); - elm_object_style_set(onoff, "on&off"); - elm_check_state_set(onoff, ugd->wfd_onoff); - evas_object_smart_callback_add(onoff, "changed", _wfd_onoff_btn_cb, ugd); - evas_object_show(onoff); - - __FUNC_EXIT__; - - return onoff; -} - -static char *_gl_name_label_get(void *data, Evas_Object * obj, const char *part) -{ - __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data *) data; - - if (data == NULL) - { - DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); - return NULL; - } - - DBG(LOG_VERBOSE, "%s", part); - - if (!strcmp(part, "elm.text.1")) - { - return strdup(_("IDS_WFD_BODY_DEVICE_NAME")); - } - else if (!strcmp(part, "elm.text.2")) - { - return strdup(ugd->dev_name); - } - - __FUNC_EXIT__; - - return NULL; -} - -static char *_gl_title_label_get(void *data, Evas_Object * obj, - const char *part) -{ - __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data *) data; - - if (data == NULL) - { - DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); - return NULL; - } - - if (!strcmp(part, "elm.text")) - { - if (ugd->peer_cnt) - return strdup(_("IDS_WFD_BODY_AVAILABLE_DEVICES")); - else - return strdup(_("IDS_WFD_BODY_WIFI_DIRECT_DEVICES")); - } - - __FUNC_EXIT__; - - return NULL; -} - -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; - } - - 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; -} - -static void _gl_noitem_del(void *data, Evas_Object * obj) -{ - __FUNC_ENTER__; - - __FUNC_EXIT__; - return; -} - -static char *_gl_peer_label_get(void *data, Evas_Object * obj, const char *part) -{ - __FUNC_ENTER__; - assertm_if(NULL == obj, "NULL!!"); - assertm_if(NULL == part, "NULL!!"); - - device_type_s *peer = (device_type_s *) data; - - if (data == NULL) - { - DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); - return NULL; - } - - __FUNC_EXIT__; - return strdup(peer->ssid); -} - -static Evas_Object *_gl_peer_icon_get(void *data, Evas_Object * obj, - const char *part) -{ - __FUNC_ENTER__; - assertm_if(NULL == obj, "NULL!!"); - assertm_if(NULL == part, "NULL!!"); - - device_type_s *peer = (device_type_s *) data; - Evas_Object *icon = NULL; - - if (data == NULL) - { - DBG(LOG_ERROR, "Incorrect parameter(NULL)\n"); - return NULL; - } - - if (!strcmp(part, "elm.icon.2")) - { - DBG(LOG_VERBOSE, "elm.icon.2 - connection status [%d]\n", - peer->conn_status); - if (peer->conn_status == PEER_CONN_STATUS_CONNECTING) - { - icon = elm_progressbar_add(obj); - elm_object_style_set(icon, "list_process"); - elm_progressbar_pulse(icon, EINA_TRUE); - } - else if (peer->conn_status == PEER_CONN_STATUS_CONNECTED) - { - icon = elm_icon_add(obj); - elm_icon_file_set(icon, WFD_ICON_CONNECTED, NULL); - } - - evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); - elm_icon_resizable_set(icon, 1, 1); - evas_object_show(icon); - } - else if (!strcmp(part, "elm.icon.1")) - { - DBG(LOG_VERBOSE, "elm.icon.1 - category [%d]\n", peer->category); - char *img_path = NULL; - switch (peer->category) - { - case WFD_DEVICE_TYPE_COMPUTER: - img_path = WFD_ICON_DEVICE_PC; - break; - case WFD_DEVICE_TYPE_INPUT_DEVICE: - img_path = WFD_ICON_DEVICE_KEYBOARD; - break; - case WFD_DEVICE_TYPE_PRINTER: - img_path = WFD_ICON_DEVICE_PRINTER; - break; - case WFD_DEVICE_TYPE_CAMERA: - img_path = WFD_ICON_DEVICE_UNKNOWN; - break; - case WFD_DEVICE_TYPE_STORAGE: - case WFD_DEVICE_TYPE_NW_INFRA: - case WFD_DEVICE_TYPE_DISPLAYS: - case WFD_DEVICE_TYPE_MM_DEVICES: - case WFD_DEVICE_TYPE_GAME_DEVICES: - case WFD_DEVICE_TYPE_OTHER: - img_path = WFD_ICON_DEVICE_UNKNOWN; - break; - case WFD_DEVICE_TYPE_TELEPHONE: - img_path = WFD_ICON_DEVICE_PHONE; - break; - case WFD_DEVICE_TYPE_AUDIO: - img_path = WFD_ICON_DEVICE_HEADSET; - break; - default: - break; - } - - if (img_path != NULL) - { - icon = elm_icon_add(obj); - elm_icon_file_set(icon, img_path, NULL); - evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, - 1, 1); - elm_icon_resizable_set(icon, 1, 1); - evas_object_show(icon); - } - } - - __FUNC_EXIT__; - return icon; -} - -static void _gl_peer_del(void *data, Evas_Object * obj) -{ - __FUNC_ENTER__; - assertm_if(NULL == obj, "NULL!!"); - assertm_if(NULL == data, "NULL!!"); - - __FUNC_EXIT__; - return; -} - -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; - 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) - { - 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 - { - 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); - - __FUNC_EXIT__; - return; -} - -static char *_gl_help_label_get(void *data, Evas_Object * obj, const char *part) -{ - __FUNC_ENTER__; - DBG(LOG_VERBOSE, "%s", part); - __FUNC_ENTER__; - return strdup("Help"); -} - -static Evas_Object *_create_basic_genlist(void *data) -{ - __FUNC_ENTER__; - - struct ug_data *ugd = (struct ug_data *) data; - Evas_Object *genlist; - - genlist = elm_genlist_add(ugd->naviframe); - - sep_itc.item_style = "grouptitle.dialogue.seperator"; - sep_itc.func.text_get = NULL; - sep_itc.func.content_get = NULL; - sep_itc.func.state_get = NULL; - sep_itc.func.del = NULL; - - head_itc.item_style = "dialogue/1text.1icon"; - head_itc.func.text_get = _gl_header_label_get; - head_itc.func.content_get = _gl_header_icon_get; - head_itc.func.state_get = NULL; - - name_itc.item_style = "dialogue/2text.3"; - name_itc.func.text_get = _gl_name_label_get; - name_itc.func.content_get = NULL; - name_itc.func.state_get = NULL; - name_itc.func.del = NULL; - - Elm_Object_Item *item; - elm_genlist_item_append(genlist, &sep_itc, NULL, NULL, - ELM_GENLIST_ITEM_NONE, NULL, NULL); - ugd->head = - elm_genlist_item_append(genlist, &head_itc, ugd, NULL, - ELM_GENLIST_ITEM_NONE, _gl_header_sel, (void*) ugd); - item = - elm_genlist_item_append(genlist, &name_itc, ugd, NULL, - ELM_GENLIST_ITEM_NONE, NULL, NULL); - elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); - - __FUNC_EXIT__; - - return genlist; -} - -static int _create_device_genlist(void *data) -{ - __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data *) data; - - title_itc.item_style = "dialogue/title"; - title_itc.func.text_get = _gl_title_label_get; - title_itc.func.content_get = NULL; - title_itc.func.state_get = NULL; - title_itc.func.del = NULL; - - peer_itc.item_style = "dialogue/1text.2icon.2"; - peer_itc.func.text_get = _gl_peer_label_get; - peer_itc.func.content_get = _gl_peer_icon_get; - peer_itc.func.state_get = NULL; - peer_itc.func.del = _gl_peer_del; - - noitem_itc.item_style = "dialogue/bg/1icon"; - noitem_itc.func.text_get = NULL; - noitem_itc.func.content_get = _gl_noitem_icon_get; - noitem_itc.func.state_get = NULL; - noitem_itc.func.del = _gl_noitem_del; - - sep_itc.item_style = "grouptitle.dialogue.seperator"; - sep_itc.func.text_get = NULL; - sep_itc.func.content_get = NULL; - sep_itc.func.state_get = NULL; - sep_itc.func.del = NULL; - - help_itc.item_style = "dialogue/1text"; - help_itc.func.text_get = _gl_help_label_get; - help_itc.func.content_get = NULL; - help_itc.func.state_get = NULL; - help_itc.func.del = NULL; - - Elm_Object_Item *item; - item = - elm_genlist_item_append(ugd->genlist, &title_itc, (void *) ugd, NULL, - ELM_GENLIST_ITEM_NONE, NULL, NULL); - elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); - ugd->noitem = - elm_genlist_item_append(ugd->genlist, &noitem_itc, (void *) ugd, NULL, - ELM_GENLIST_ITEM_NONE, NULL, NULL); - elm_genlist_item_select_mode_set(ugd->noitem, - ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); - - __FUNC_EXIT__; - return 0; -} - -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; - - 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; - } - evas_object_show(ugd->genlist); - _create_device_genlist(ugd); - - 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); - - navi_item = - elm_naviframe_item_push(ugd->naviframe, _("IDS_WFD_HEADER_WIFI_DIRECT"), - back_btn, NULL, ugd->genlist, NULL); - - 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); - elm_object_item_disabled_set(ugd->scan_btn, !ugd->wfd_onoff); - - elm_object_item_part_content_set(navi_item, "controlbar", control_bar); - - __FUNC_EXIT__; -} - -void destroy_wfd_ug_view(void *data) -{ - __FUNC_ENTER__; - - struct ug_data *ugd = (struct ug_data *) data; - - if (ugd->genlist) - { - evas_object_del(ugd->genlist); - ugd->genlist = NULL; - } - - if (ugd->naviframe) - { - evas_object_del(ugd->naviframe); - ugd->naviframe = NULL; - } - - __FUNC_EXIT__; -} - -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, int enable) -{ - __FUNC_ENTER__; - DBG(LOG_VERBOSE, "scan button is enabling. [%d]\n", enable); - elm_object_item_disabled_set(obj, !enable); - __FUNC_EXIT__; -} - -void wfd_ug_view_update_peers(void *data) -{ - __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data *) data; - int i; - - DBG(LOG_VERBOSE, "peer count [%d], peer instance [%x]\n", ugd->peer_cnt, - ugd->peers); - - if (ugd->peer_cnt == 0) - { - DBG(LOG_ERROR, "There are No peers\n"); - if (ugd->noitem == NULL) - ugd->noitem = - elm_genlist_item_append(ugd->genlist, &noitem_itc, (void *) ugd, - NULL, ELM_GENLIST_ITEM_NONE, NULL, - NULL); - return; - } - else if (ugd->peer_cnt > 0) - { - if (ugd->noitem) - { - elm_object_item_del(ugd->noitem); - ugd->noitem = NULL; - DBG(LOG_VERBOSE, "Noitem list is removed\n"); - } - - for (i = 0; i < ugd->peer_cnt; i++) - { - DBG(LOG_VERBOSE, "%dth peer being added on genlist\n", i); - ugd->peers[i].gl_item = - elm_genlist_item_append(ugd->genlist, &peer_itc, - (void *) &(ugd->peers[i]), NULL, - ELM_GENLIST_ITEM_NONE, _gl_peer_sel, - (void *) &(ugd->peers[i])); - } - } - - __FUNC_EXIT__; -} - -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->peer_cnt; i++) - { - DBG(LOG_VERBOSE, "%dth peer is deleted\n", i); - elm_object_item_del(ugd->peers[i].gl_item); - } - - if (ugd->peer_cnt > 0 && ugd->peers != NULL) - { - DBG(LOG_VERBOSE, "peers will be destroyed\n"); - free(ugd->peers); - ugd->peers = NULL; - ugd->peer_cnt = 0; - } - - __FUNC_EXIT__; -} - -static void _wfd_ug_act_popup_wifi_ok_cb(void *data, Evas_Object * obj, - void *event_info) -{ - __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data *) data; - - ugd->wfd_status = WFD_LINK_STATUS_DEACTIVATED; - wfd_wifi_off(); - - evas_object_del(ugd->act_popup); - ugd->act_popup = NULL; - __FUNC_EXIT__; -} - -static void _wfd_ug_act_popup_wifi_cancel_cb(void *data, Evas_Object * obj, - void *event_info) -{ - __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data *) data; - - ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT; - wfd_ug_view_refresh_glitem(ugd->head); - - evas_object_del(ugd->act_popup); - ugd->act_popup = NULL; - __FUNC_EXIT__; -} - -void wfd_ug_act_popup(void *data, const char *message, int popup_type) -{ - __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data *) data; - Evas_Object *popup = NULL; - Evas_Object *btn1 = NULL, *btn2 = NULL; - - popup = elm_popup_add(ugd->base); - evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_object_text_set(popup, message); - - btn1 = elm_button_add(popup); - elm_object_text_set(btn1, S_("IDS_COM_SK_YES")); - elm_object_part_content_set(popup, "button1", btn1); - evas_object_smart_callback_add(btn1, "clicked", - _wfd_ug_act_popup_wifi_ok_cb, (void *) ugd); - - btn2 = elm_button_add(popup); - elm_object_text_set(btn2, S_("IDS_COM_SK_NO")); - elm_object_part_content_set(popup, "button2", btn2); - evas_object_smart_callback_add(btn2, "clicked", - _wfd_ug_act_popup_wifi_cancel_cb, - (void *) ugd); - - evas_object_show(popup); - ugd->act_popup = popup; - __FUNC_EXIT__; -} - -void wfg_ug_act_popup_remove(void *data) -{ - __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data *) data; - - if (ugd->act_popup) - { - evas_object_del(ugd->act_popup); - ugd->act_popup = NULL; - } - __FUNC_EXIT__; -} - -static void _wfd_ug_terminate_popup_cb(void *data, Evas_Object *obj, void *event_info) -{ - __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data*) data; - - evas_object_del(ugd->warn_popup); - ugd->warn_popup = NULL; - - wfd_ug_view_free_peers(ugd); - - ug_destroy_me(ugd->ug); - __FUNC_EXIT__; -} - -static void _wfd_ug_warn_popup_cb(void *data, Evas_Object *obj, void *event_info) -{ - __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data*) data; - - evas_object_del(ugd->warn_popup); - ugd->warn_popup = NULL; - __FUNC_EXIT__; -} - -void wfd_ug_warn_popup(void *data, const char *message, int popup_type) -{ - __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data *) data; - Evas_Object *popup = NULL; - Evas_Object *btn = NULL; - - popup = elm_popup_add(ugd->base); - evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_object_text_set(popup, message); - - btn = elm_button_add(popup); - elm_object_text_set(btn, S_("IDS_COM_SK_OK")); - elm_object_part_content_set(popup, "button1", btn); - if(popup_type == POPUP_TYPE_TERMINATE) - evas_object_smart_callback_add(btn, "clicked", _wfd_ug_terminate_popup_cb, (void*) ugd); - else - evas_object_smart_callback_add(btn, "clicked", _wfd_ug_warn_popup_cb, (void*) ugd); - - evas_object_show(popup); - ugd->warn_popup = popup; - __FUNC_EXIT__; -} - -void wfg_ug_warn_popup_remove(void *data) -{ - __FUNC_ENTER__; - struct ug_data *ugd = (struct ug_data *) data; - - if (ugd->warn_popup) - { - evas_object_del(ugd->warn_popup); - ugd->warn_popup = NULL; - } - __FUNC_EXIT__; -} |