summaryrefslogtreecommitdiff
path: root/ug-wifidirect/src
diff options
context:
space:
mode:
Diffstat (limited to 'ug-wifidirect/src')
-rw-r--r--[-rwxr-xr-x]ug-wifidirect/src/wfd_client.c2395
-rwxr-xr-xug-wifidirect/src/wfd_motion_control.c204
-rw-r--r--[-rwxr-xr-x]ug-wifidirect/src/wfd_ug.c1106
-rw-r--r--ug-wifidirect/src/wfd_ug_about_view.c128
-rwxr-xr-xug-wifidirect/src/wfd_ug_genlist.c1402
-rw-r--r--[-rwxr-xr-x]ug-wifidirect/src/wfd_ug_main_view.c2590
-rw-r--r--[-rwxr-xr-x]ug-wifidirect/src/wfd_ug_multiconnect_view.c1274
-rwxr-xr-xug-wifidirect/src/wfd_ug_popup.c809
-rw-r--r--ug-wifidirect/src/wfd_ug_rename_popup.c415
9 files changed, 7037 insertions, 3286 deletions
diff --git a/ug-wifidirect/src/wfd_client.c b/ug-wifidirect/src/wfd_client.c
index d0c3ae9..8bd357b 100755..100644
--- a/ug-wifidirect/src/wfd_client.c
+++ b/ug-wifidirect/src/wfd_client.c
@@ -22,936 +22,1941 @@
#include <libintl.h>
#include <Elementary.h>
-#include <pmapi.h>
#include <vconf.h>
-//#include <vconf-keys.h>
+#include <vconf-keys.h>
+
#include <tethering.h>
+
#include <network-cm-intf.h>
#include <network-wifi-intf.h>
+
#include <wifi-direct.h>
#include "wfd_ug.h"
#include "wfd_ug_view.h"
#include "wfd_client.h"
+bool _wfd_discoverd_peer_cb(wifi_direct_discovered_peer_info_s *peer, void *user_data);
+
+#ifndef MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE
+/**
+ * This function let the ug make a change callback for wifi state
+ * @return void
+ * @param[in] key the pointer to the key
+ * @param[in] data the pointer to the main data structure
+ */
static void _wifi_state_cb(keynode_t *key, void *data)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
- int res;
- int wifi_state;
-
- res = vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
- 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)
- {
- DBG(LOG_VERBOSE, "WiFi is turned off\n");
- wfd_client_swtch_force(ugd, TRUE);
- }
- else
- {
- DBG(LOG_VERBOSE, "WiFi is turned on\n");
- }
-
- res = net_deregister_client();
- if(res != NET_ERR_NONE)
- {
- DBG(LOG_ERROR, "Failed to deregister network client. [%d]\n", res);
- }
-
- __FUNC_EXIT__;
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)data;
+ int res;
+ int wifi_state;
+
+ res = vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
+ if (res != 0) {
+ DBG(LOG_ERROR, "Failed to get wifi state from vconf. [%d]\n", res);
+ return;
+ }
+
+ if (wifi_state == VCONFKEY_WIFI_OFF) {
+ DBG(LOG_INFO, "WiFi is turned off\n");
+ wfd_client_swtch_force(ugd, TRUE);
+ } else {
+ DBG(LOG_INFO, "WiFi is turned on\n");
+ }
+
+ res = net_deregister_client();
+ if (res != NET_ERR_NONE) {
+ DBG(LOG_ERROR, "Failed to deregister network client. [%d]\n", res);
+ }
+
+ __FUNC_EXIT__;
}
+/**
+ * This function let the ug make a event callback for network registering
+ * @return void
+ * @param[in] event_info the pointer to the information of network event
+ * @param[in] user_data the pointer to the user data
+ */
static void _network_event_cb(net_event_info_t *event_info, void *user_data)
{
- __FUNC_ENTER__;
- DBG(LOG_VERBOSE, "Event from network. [%d]\n", event_info->Event);
- __FUNC_EXIT__;
+ __FUNC_ENTER__;
+ DBG(LOG_INFO, "Event from network. [%d]\n", event_info->Event);
+ __FUNC_EXIT__;
}
+/**
+ * This function let the ug turn wifi off
+ * @return If success, return 0, else return -1
+ * @param[in] data the pointer to the main data structure
+ */
int wfd_wifi_off(void *data)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
- int res;
-
- res = vconf_notify_key_changed(VCONFKEY_WIFI_STATE, _wifi_state_cb, ugd);
- if (res == -1)
- {
- DBG(LOG_ERROR, "Failed to register vconf callback\n");
- return -1;
- }
- 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)
- {
- 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)
- {
- DBG(LOG_ERROR, "Failed to turn off wifi. [%d]\n", res);
- return -1;
- }
- DBG(LOG_VERBOSE, "WiFi power off\n");
- __FUNC_EXIT__;
- return 0;
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)data;
+ int res;
+
+ res = vconf_notify_key_changed(VCONFKEY_WIFI_STATE, _wifi_state_cb, ugd);
+ if (res == -1) {
+ DBG(LOG_ERROR, "Failed to register vconf callback\n");
+ return -1;
+ }
+
+ DBG(LOG_INFO, "Vconf key callback is registered\n");
+
+ res = net_register_client((net_event_cb_t) _network_event_cb, NULL);
+ if (res != NET_ERR_NONE) {
+ DBG(LOG_ERROR, "Failed to register network client. [%d]\n", res);
+ return -1;
+ }
+
+ DBG(LOG_INFO, "Network client is registered\n");
+
+ res = net_wifi_power_off();
+ if (res != NET_ERR_NONE) {
+ DBG(LOG_ERROR, "Failed to turn off wifi. [%d]\n", res);
+ return -1;
+ }
+
+ DBG(LOG_INFO, "WiFi power off\n");
+
+ __FUNC_EXIT__;
+ return 0;
+}
+#endif /* MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE */
+
+
+/**
+ * This function let the ug make a callback for setting tethering mode enabled
+ * @return void
+ * @param[in] error the returned error code
+ * @param[in] type the type of tethering
+ * @param[in] is_requested whether tethering mode is enabled
+ * @param[in] data the pointer to the user data
+ */
+static void __enabled_cb(tethering_error_e error, tethering_type_e type, bool is_requested, void *data)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)data;
+ tethering_error_e ret = TETHERING_ERROR_NONE;
+ tethering_h th = NULL;
+ bool is_wifi_enabled = false;
+
+ if (error != TETHERING_ERROR_NONE) {
+ if (is_requested != TRUE) {
+ return;
+ }
+
+ DBG(LOG_ERROR, "error !!! TETHERING is not enabled.\n");
+ return;
+ }
+
+ th = ugd->hotspot_handle;
+ if (th != NULL) {
+ is_wifi_enabled = tethering_is_enabled(th, TETHERING_TYPE_WIFI);
+ if (is_wifi_enabled) {
+ DBG(LOG_INFO, "Mobile hotspot is activated\n");
+ }
+
+ /* Deregister cbs */
+ ret = tethering_unset_enabled_cb(th, TETHERING_TYPE_WIFI);
+ if (ret != TETHERING_ERROR_NONE) {
+ DBG(LOG_ERROR, "tethering_unset_enabled_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;
+ }
+
+ DBG(LOG_INFO, "TETHERING is enabled.\n");
+
+ __FUNC_EXIT__;
+ return;
}
+/**
+ * This function let the ug make a callback for setting tethering mode disabled
+ * @return void
+ * @param[in] error the returned error code
+ * @param[in] type the type of tethering
+ * @param[in] code whether tethering mode is enabled
+ * @param[in] data the pointer to the user data
+ */
static void __disabled_cb(tethering_error_e error, tethering_type_e type, tethering_disabled_cause_e code, void *data)
{
__FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)data;
+ tethering_error_e ret = TETHERING_ERROR_NONE;
+ tethering_h th = NULL;
+ bool is_wifi_enabled = false;
+ bool is_wifi_ap_enabled = false;
+
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");
+ th = ugd->hotspot_handle;
+ if (th != NULL) {
+ is_wifi_enabled = tethering_is_enabled(th, TETHERING_TYPE_WIFI);
+ is_wifi_ap_enabled = tethering_is_enabled(th, TETHERING_TYPE_RESERVED);
+ if (is_wifi_enabled || is_wifi_ap_enabled) {
+ DBG(LOG_ERROR, "error !!! TETHERING is not disabled.\n");
+ DBG(LOG_ERROR, "is_wifi_enabled:%d is_wifi_ap_enabled:%d\n", is_wifi_enabled, is_wifi_ap_enabled);
+ return;
+ }
- __FUNC_EXIT__;
+ DBG(LOG_INFO, "Mobile hotspot is deactivated\n");
+ wfd_client_swtch_force(ugd, TRUE);
+
+ 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);
+ }
+
+ ret = tethering_unset_disabled_cb(th, TETHERING_TYPE_RESERVED);
+ 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;
+ }
+
+ DBG(LOG_INFO, "TETHERING is disabled.\n");
+
+ __FUNC_EXIT__;
return;
}
+/**
+ * This function let the ug turn AP on
+ * @return If success, return 0, else return -1
+ * @param[in] data the pointer to the main data structure
+ */
+int wfd_mobile_ap_on(void *data)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)data;
+ tethering_error_e ret = TETHERING_ERROR_NONE;
+ WFD_RETV_IF(ugd == NULL, -1, "Incorrect parameter(NULL)\n");
+
+ if (NULL == ugd->hotspot_handle) {
+ ret = tethering_create(&(ugd->hotspot_handle));
+ if (TETHERING_ERROR_NONE != ret) {
+ DBG(LOG_ERROR, "Failed to tethering_create() [%d]\n", ret);
+ ugd->hotspot_handle = NULL;
+ return -1;
+ }
+ DBG(LOG_INFO, "Succeeded to tethering_create()\n");
+ }
+ /* Register cbs */
+ ret = tethering_set_enabled_cb(ugd->hotspot_handle, TETHERING_TYPE_WIFI, __enabled_cb, ugd);
+ if (ret != TETHERING_ERROR_NONE) {
+ DBG(LOG_ERROR, "tethering_set_enabled_cb is failed\n", ret);
+ return -1;
+ }
+
+ /* Enable tethering */
+ ret = tethering_enable(ugd->hotspot_handle, TETHERING_TYPE_WIFI);
+ if (ret != TETHERING_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to turn on mobile hotspot. [%d]\n", ret);
+ return -1;
+ } else {
+ DBG(LOG_INFO, "Succeeded to turn on mobile hotspot\n");
+ }
+
+ ugd->is_hotspot_off = FALSE;
-#if 0
-static device_type_s *wfd_client_find_peer_by_ssid(void *data, const char *ssid)
+ __FUNC_EXIT__;
+ return 0;
+}
+
+/**
+ * This function let the ug turn AP off
+ * @return If success, return 0, else return -1
+ * @param[in] data the pointer to the main data structure
+ */
+int wfd_mobile_ap_off(void *data)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
- int i;
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)data;
+ WFD_RETV_IF(ugd == NULL || ugd->hotspot_handle == NULL, -1, "Incorrect parameter(NULL)\n");
+ tethering_error_e ret = TETHERING_ERROR_NONE;
+ bool is_wifi_enabled = false;
+ bool is_wifi_ap_enabled = false;
+
+ is_wifi_enabled = tethering_is_enabled(ugd->hotspot_handle, TETHERING_TYPE_WIFI);
+ is_wifi_ap_enabled = tethering_is_enabled(ugd->hotspot_handle, TETHERING_TYPE_RESERVED);
+
+ if (is_wifi_enabled) {
+ /* Register cbs */
+ ret = tethering_set_disabled_cb(ugd->hotspot_handle, TETHERING_TYPE_WIFI, __disabled_cb, ugd);
+ if (ret != TETHERING_ERROR_NONE) {
+ DBG(LOG_ERROR, "tethering_set_disabled_cb is failed\n", ret);
+ return -1;
+ }
+ /* Disable tethering */
+ ret = tethering_disable(ugd->hotspot_handle, TETHERING_TYPE_WIFI);
+ } else if (is_wifi_ap_enabled) {
+ ret = tethering_set_disabled_cb(ugd->hotspot_handle, TETHERING_TYPE_RESERVED, __disabled_cb, ugd);
+ if (ret != TETHERING_ERROR_NONE) {
+ DBG(LOG_ERROR, "tethering_set_disabled_cb is failed\n", ret);
+ return -1;
+ }
+ ret = tethering_disable(ugd->hotspot_handle, TETHERING_TYPE_RESERVED);
+ }
- if(ugd == NULL)
- {
- DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
- return NULL;
- }
+ if (ret != TETHERING_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to turn off mobile hotspot. [%d]\n", ret);
+ return -1;
+ } else {
+ DBG(LOG_INFO, "Succeeded to turn off mobile hotspot\n");
+ }
- for(i=0; i<ugd->gl_available_peer_cnt; i++)
- {
- DBG(LOG_VERBOSE, "check %dth peer\n", i);
- if(!strcmp(ugd->gl_available_peers[i].ssid, ssid))
- {
- DBG(LOG_VERBOSE, "found peer. [%d]\n", i);
- __FUNC_EXIT__;
- return &ugd->gl_available_peers[i];
- }
- }
- __FUNC_EXIT__;
+ ugd->is_hotspot_off = TRUE;
- return NULL;
+ __FUNC_EXIT__;
+ return 0;
}
-#endif
-static device_type_s *wfd_client_find_peer_by_mac(void *data, const char *mac_addr)
+void wfd_client_free_raw_discovered_peers(struct ug_data *ugd)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
- int i;
+ __FUNC_ENTER__;
+ WFD_RET_IF(ugd->raw_discovered_peer_list == NULL, "Incorrect parameter(NULL)\n");
- if(ugd == NULL)
- {
- DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
- return NULL;
- }
+ g_list_free(ugd->raw_discovered_peer_list);
+ ugd->raw_discovered_peer_list = NULL;
- if (ugd->multi_connect_mode != WFD_MULTI_CONNECT_MODE_NONE)
- {
- 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__;
+ __FUNC_EXIT__;
+}
+
+/**
+ * This function let the ug find the peer by mac address
+ * @return the found peer
+ * @param[in] data the pointer to the main data structure
+ * @param[in] mac_addr the pointer to mac address
+ */
+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;
+ wifi_direct_discovered_peer_info_s *peer_info = NULL;
+ GList *iterator = NULL;
+ int i;
+ WFD_RETV_IF(ugd == NULL, NULL, "Incorrect parameter(NULL)\n");
+
+ if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_IN_PROGRESS) {
+ for (i = 0; i < ugd->raw_multi_selected_peer_cnt; i++) {
+ if (!strncmp(mac_addr, (const char *)ugd->raw_multi_selected_peers[i].mac_addr, MAC_LENGTH)) {
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];
+ } else {
+ for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
+ if (!strncmp(mac_addr, ((device_type_s *)iterator->data)->mac_addr, MAC_LENGTH)) {
+ return (device_type_s *)iterator->data;
}
}
+ }
- }
- __FUNC_EXIT__;
+ /*
+ * In case, device is not in raw discovered list, then get peer info.
+ * There could be situation in which device is not yet discovered and
+ * connected process started.
+ */
+ if (WIFI_DIRECT_ERROR_NONE != wifi_direct_get_peer_info((char *)mac_addr, &peer_info) ||
+ NULL == peer_info) {
+ DBG(LOG_ERROR, "Peer Not Found !!!");
+ return NULL;
+ }
- return NULL;
-}
+ /* Update peer list */
+ DBG(LOG_INFO, "Update Peer info");
+ _wfd_discoverd_peer_cb(peer_info, (void *)ugd);
-int _wfd_ug_view_clean_on_off(struct ug_data *ugd)
-{
- wfd_ug_view_update_peers(ugd);
- return 0;
+ /* Get the device from peer list */
+ for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
+ if (!strncmp(mac_addr, ((device_type_s *)iterator->data)->mac_addr, MAC_LENGTH)) {
+ return (device_type_s *)iterator->data;
+ }
+ }
+
+ __FUNC_EXIT__;
+ return NULL;
}
+/**
+ * This function let the ug make a callback for registering activation event
+ * @return void
+ * @param[in] error_code the returned error code
+ * @param[in] device_state the state of device
+ * @param[in] user_data the pointer to the main data structure
+ */
void _activation_cb(int error_code, wifi_direct_device_state_e device_state, void *user_data)
{
- __FUNC_ENTER__;
- int res;
- struct ug_data *ugd = (struct ug_data*) user_data;
-
- wfd_refresh_wifi_direct_state(ugd);
+ __FUNC_ENTER__;
+ int res = -1;
+ struct ug_data *ugd = (struct ug_data *)user_data;
+ wfd_refresh_wifi_direct_state(ugd);
- 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);
+ switch (device_state) {
+ case WIFI_DIRECT_DEVICE_STATE_ACTIVATED:
+ DBG(LOG_INFO, "WIFI_DIRECT_DEVICE_STATE_ACTIVATED\n");
+ if(ugd->scan_toolbar == NULL) {
+ scan_button_create(ugd);
+ }
+ if (error_code != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Error in Activation/Deactivation [%d]\n", error_code);
+ if (WIFI_DIRECT_ERROR_AUTH_FAILED == error_code) {
+ wfd_ug_warn_popup(ugd, _("IDS_COM_POP_SECURITY_POLICY_RESTRICTS_USE_OF_WI_FI"), POPUP_TYPE_ACTIVATE_FAIL_POLICY_RESTRICTS);
+ } else {
+ wfd_ug_warn_popup(ugd, _("IDS_COM_POP_FAILED"), POPUP_TYPE_ACTIVATE_FAIL);
+ }
- ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
- ugd->wfd_onoff = 0;
- wfd_ug_view_refresh_glitem(ugd->head);
- return;
- }
+#ifdef WFD_ON_OFF_GENLIST
+ ugd->wfd_onoff = 0;
+ wfd_ug_refresh_on_off_check(ugd);
+#endif
+ return;
+ }
- ugd->head_text_mode = HEAD_TEXT_TYPE_ACTIVATED;
- ugd->wfd_onoff = 1;
- wfd_ug_view_refresh_glitem(ugd->head);
+ ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_NONE;
+#ifdef WFD_ON_OFF_GENLIST
+ ugd->wfd_onoff = 1;
+ wfd_ug_refresh_on_off_check(ugd);
+#endif
+ wfg_ug_act_popup_remove(ugd);
- wfg_ug_act_popup_remove(ugd);
+ if (ugd->wfd_discovery_status == WIFI_DIRECT_DISCOVERY_BACKGROUND) {
+ DBG(LOG_INFO, "Background mode\n");
+ return;
+ }
- 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");
- }
+#ifndef MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE
+ 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");
+ }
+#endif /* MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE */
+
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
+ res = wifi_direct_start_discovery_specific_channel(false, 1, WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
+ DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", res);
+ wifi_direct_cancel_discovery();
+ }
- 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;
+ break;
+ case WIFI_DIRECT_DEVICE_STATE_DEACTIVATED:
+ DBG(LOG_INFO, "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_WIFI_POP_DEACTIVATION_FAILED"), POPUP_TYPE_DEACTIVATE_FAIL);
+#ifdef WFD_ON_OFF_GENLIST
+ ugd->wfd_onoff = 1;
+ wfd_ug_refresh_on_off_check(ugd);
+#endif
+ return;
+ }
- 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;
- }
+ WFD_IF_DEL_ITEM(ugd->multi_connect_toolbar_item);
- ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
- ugd->wfd_onoff = 0;
+ if (ugd->ctxpopup) {
+ ctxpopup_dismissed_cb(ugd, NULL, NULL);
+ }
- wfd_ug_view_update_peers(ugd);
+ /*
+ * When multi-connect is on ongoing and deactivte happened destroy
+ * disconnect button.
+ */
+ if (ugd->disconnect_btn) {
+ Evas_Object *content;
+ content = elm_object_part_content_unset(ugd->layout, "button.next");
+ WFD_IF_DEL_OBJ(content);
+ ugd->disconnect_btn = NULL;
+ elm_object_part_content_set(ugd->layout, "button.big",
+ ugd->scan_toolbar);
+ }
- break;
- default:
- break;
- }
+ /* When connect is on ongoing and deactivte happened refresh scan */
+ if (ugd->scan_toolbar) {
+ wfd_ug_view_refresh_button(ugd->scan_toolbar,
+ "IDS_WIFI_SK4_SCAN", FALSE);
+ }
+ /* Delete pop-up when deactivate happens */
+ WFD_IF_DEL_OBJ(ugd->act_popup);
+ /* Remove timeout handlers */
+ if (ugd->timer_stop_progress_bar > 0)
+ g_source_remove(ugd->timer_stop_progress_bar);
- wfd_ug_view_refresh_glitem(ugd->head);
+ if (ugd->timer_delete_not_alive_peer > 0)
+ g_source_remove(ugd->timer_delete_not_alive_peer);
- if (ugd->scan_btn) {
- wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
- }
+ if (ugd->g_source_multi_connect_next > 0)
+ g_source_remove(ugd->g_source_multi_connect_next);
- if (ugd->multi_connect_btn) {
- wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
- }
+ if (ugd->timer_multi_reset > 0)
+ g_source_remove(ugd->timer_multi_reset);
- __FUNC_EXIT__;
- return;
-}
+ /* Delete warn popups for Airplane mode */
+ if (NULL != ugd->warn_popup) {
+ evas_object_del( ugd->warn_popup);
+ ugd->warn_popup = NULL;
+ }
-bool _wfd_discoverd_peer_cb(wifi_direct_discovered_peer_info_s* peer, void *user_data)
-{
- __FUNC_ENTER__;
+#ifdef WFD_ON_OFF_GENLIST
+ ugd->wfd_onoff = 0;
+ wfd_ug_refresh_on_off_check(ugd);
+#endif
+ /*
+ * when deactivated, clear all the
+ * discovered peers and connected peers
+ */
+ wfd_client_free_raw_discovered_peers(ugd);
+ if (ugd->raw_connected_peer_cnt > 0) {
+ memset(ugd->raw_connected_peers, 0x00, ugd->raw_connected_peer_cnt*sizeof(device_type_s));
+ }
+
+ ugd->raw_discovered_peer_cnt = 0;
+ ugd->raw_connected_peer_cnt = 0;
+
+ wfd_free_nodivice_item(ugd);
+ wfd_ug_view_init_genlist(ugd, true);
+
+ if (ugd->multi_navi_item != NULL) {
+ elm_naviframe_item_pop(ugd->naviframe);
+ }
+
+ if (TRUE == ugd->is_hotspot_off && TRUE == ugd->is_hotspot_locally_disabled) {
+ if (0 == wfd_mobile_ap_on(ugd)) {
+ ugd->is_hotspot_locally_disabled = FALSE;
+ }
+ }
+
+ if(ugd->scan_toolbar) {
+ evas_object_del(ugd->scan_toolbar);
+ ugd->scan_toolbar = NULL;
+ }
+ break;
+ default:
+ break;
+ }
+
+ /*if (ugd->scan_toolbar) {
+ wfd_ug_view_refresh_button(ugd->scan_toolbar, _("IDS_WIFI_SK4_SCAN"), TRUE);
+ }*/
+
+ if (ugd->multiconn_scan_stop_btn) {
+ wfd_ug_view_refresh_button(ugd->multiconn_scan_stop_btn, "IDS_WIFI_SK4_SCAN", TRUE);
+ }
- struct ug_data *ugd = (struct ug_data*) user_data;
- int peer_cnt = ugd->raw_discovered_peer_cnt;
+ if (ugd->back_btn) {
+ elm_object_disabled_set(ugd->back_btn, FALSE);
+ }
- DBG(LOG_VERBOSE, "%dth discovered peer. [%s] [%s]\n", peer_cnt, peer->ssid, peer->mac_address);
+ __FUNC_EXIT__;
+ return;
+}
- 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;
+/**
+ * This function let the ug make a callback for discovering peer
+ * @return TRUE
+ * @param[in] peer the pointer to the discovered peer
+ * @param[in] user_data the pointer to the main data structure
+ */
+bool _wfd_discoverd_peer_cb(wifi_direct_discovered_peer_info_s *peer, void *user_data)
+{
+ __FUNC_ENTER__;
+ WFD_RETV_IF(NULL == peer || NULL == user_data, FALSE, "Incorrect parameter(NULL)\n");
+
+ struct ug_data *ugd = (struct ug_data *)user_data;
+ int peer_cnt = ugd->raw_discovered_peer_cnt;
+ device_type_s *peer_tmp = g_new(device_type_s, 1);
+ int i;
+
+ DBG_SECURE(LOG_INFO, "%dth discovered peer. [%s] ["MACSECSTR"]\n", peer_cnt,
+ peer->device_name, MAC2SECSTR(peer->mac_address));
+
+ if (ugd->device_filter < 0 || peer->primary_device_type == ugd->device_filter) {
+ strncpy(peer_tmp->ssid, peer->device_name, sizeof(peer_tmp->ssid) - 1);
+ peer_tmp->ssid[SSID_LENGTH - 1] = '\0';
+ peer_tmp->category = peer->primary_device_type;
+ peer_tmp->sub_category = peer->secondary_device_type;
+ strncpy(peer_tmp->mac_addr, peer->mac_address, MAC_LENGTH - 1);
+ peer_tmp->mac_addr[MAC_LENGTH - 1] = '\0';
+ strncpy(peer_tmp->if_addr, peer->interface_address, MAC_LENGTH - 1);
+ peer_tmp->if_addr[MAC_LENGTH - 1] = '\0';
+ peer_tmp->is_group_owner = peer->is_group_owner;
+ peer_tmp->is_persistent_group_owner = peer->is_persistent_group_owner;
+ peer_tmp->is_connected = peer->is_connected;
+ peer_tmp->dev_sel_state = FALSE;
+
+ if (TRUE == peer->is_connected) {
+ peer_tmp->conn_status = PEER_CONN_STATUS_CONNECTED;
+ } else {
+ peer_tmp->conn_status = PEER_CONN_STATUS_DISCONNECTED;
+ }
- 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;
- }
+ ugd->raw_discovered_peer_list = g_list_append(ugd->raw_discovered_peer_list, peer_tmp);
+ DBG(LOG_INFO, "\tSSID: [%s]\n", peer_tmp->ssid);
+ DBG(LOG_INFO, "\tPeer category [%d] -> [%d]\n", peer->primary_device_type, peer_tmp->category);
+ DBG(LOG_INFO, "\tStatus: [%d]\n", peer_tmp->conn_status);
+ DBG(LOG_INFO, "\tservice_count: [%d]\n", peer->service_count);
+ ugd->raw_discovered_peer_cnt++;
+ } else {
+ DBG(LOG_INFO, "Unavailable WiFi-Direct Device\n");
+ }
- 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);
+ WFD_IF_FREE_MEM(peer->device_name);
+ WFD_IF_FREE_MEM(peer->mac_address);
+ WFD_IF_FREE_MEM(peer->interface_address);
- ugd->raw_discovered_peer_cnt ++;
+ if (NULL != peer->service_list)
+ {
+ for (i=0; i<peer->service_count && peer->service_list[i] != NULL; i++) {
+ free(peer->service_list[i]);
+ }
+ WFD_IF_FREE_MEM(peer->service_list);
+ }
- free(peer->ssid);
- free(peer->mac_address);
- free(peer->interface_address);
- free(peer);
+ WFD_IF_FREE_MEM(peer);
- __FUNC_EXIT__;
- return TRUE;
+ __FUNC_EXIT__;
+ return TRUE;
}
-bool _wfd_connected_peer_cb(wifi_direct_connected_peer_info_s* peer, void *user_data)
+/**
+ * This function let the ug make a callback for connected peer
+ * @return TRUE
+ * @param[in] peer the pointer to the connected peer
+ * @param[in] user_data the pointer to the main data structure
+ */
+bool _wfd_connected_peer_cb(wifi_direct_connected_peer_info_s *peer, void *user_data)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) user_data;
- int peer_cnt = ugd->raw_connected_peer_cnt;
+ __FUNC_ENTER__;
+ WFD_RETV_IF(NULL == peer || NULL == user_data, FALSE, "Incorrect parameter(NULL)\n");
+
+ struct ug_data *ugd = (struct ug_data *)user_data;
+ int peer_cnt = ugd->raw_connected_peer_cnt;
+ int i;
+
+ DBG_SECURE(LOG_INFO, "%dth connected peer. [%s] ["MACSECSTR"]\n", peer_cnt,
+ peer->device_name, MAC2SECSTR(peer->mac_address));
+
+ /*
+ * check wether ug needs to exit
+ * automatically after successed connection
+ */
+
+ char services[256] = {0,};
+ DBG(LOG_INFO, "\tservice_count: [%d]\n", peer->service_count);
+ if (peer->service_count>0) {
+ unsigned int len = 0;
+ for (i=0; i<peer->service_count && peer->service_list != NULL; i++) {
+ snprintf(services + len, 256-len, "%s ", peer->service_list[i]);
+ len = len + strlen(peer->service_list[i]) + 1;
+ }
+ DBG(LOG_INFO, "\tServices: [%s]\n", services);
+ }
+
+ strncpy(ugd->raw_connected_peers[peer_cnt].ssid, peer->device_name, sizeof(ugd->raw_connected_peers[peer_cnt].ssid) - 1);
+ ugd->raw_connected_peers[peer_cnt].category = peer->primary_device_type;
+ ugd->raw_connected_peers[peer_cnt].sub_category = peer->secondary_device_type;
+ strncpy(ugd->raw_connected_peers[peer_cnt].mac_addr, peer->mac_address, MAC_LENGTH - 1);
+ strncpy(ugd->raw_connected_peers[peer_cnt].if_addr, peer->interface_address, MAC_LENGTH - 1);
+ ugd->raw_connected_peers[peer_cnt].conn_status = PEER_CONN_STATUS_CONNECTED;
+
+ DBG(LOG_INFO, "\tStatus: [%d]\n", ugd->raw_connected_peers[peer_cnt].conn_status);
+ DBG(LOG_INFO, "\tCategory: [%d]\n", ugd->raw_connected_peers[peer_cnt].category);
+ DBG(LOG_INFO, "\tSSID: [%s]\n", ugd->raw_connected_peers[peer_cnt].ssid);
+
+ ugd->raw_connected_peer_cnt++;
+
+ int error = -1;
+ bool is_group_owner = FALSE;
+ error = wifi_direct_is_group_owner(&is_group_owner);
+ if (error != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Fail to get group_owner_state. ret=[%d]", error);
+ return FALSE;
+ }
- DBG(LOG_VERBOSE, "%dth connected peer. [%s] [%s]\n", peer_cnt, peer->ssid, peer->mac_address);
+ if (FALSE == is_group_owner) {
+ /* to send ip_addr*/
+ int ret = -1;
+ app_control_h control = NULL;
+ ret = app_control_create(&control);
+ if (ret) {
+ DBG(LOG_ERROR, "Failed to create control");
+ return FALSE;
+ }
- 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;
+ if(peer->ip_address != NULL && strlen(services) != 0 ) {
+ app_control_add_extra_data(control, "ip_address", peer->ip_address);
+ app_control_add_extra_data(control, "wfds", services);
+ ug_send_result(ugd->ug, control);
+ }
+ app_control_destroy(control);
+ }
- 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);
+ WFD_IF_FREE_MEM(peer->device_name);
+ WFD_IF_FREE_MEM(peer->mac_address);
+ WFD_IF_FREE_MEM(peer->interface_address);
- ugd->raw_connected_peer_cnt++;
+ if (NULL != peer->service_list)
+ {
+ for (i=0; i<peer->service_count && peer->service_list[i] != NULL; i++) {
+ free(peer->service_list[i]);
+ }
+ WFD_IF_FREE_MEM(peer->service_list);
+ }
- free(peer->ssid);
- free(peer->mac_address);
- free(peer->interface_address);
- free(peer);
- __FUNC_EXIT__;
- return TRUE;
+ WFD_IF_FREE_MEM(peer);
+
+ __FUNC_EXIT__;
+ return TRUE;
}
+/**
+ * This function let the ug get the found peers
+ * @return If success, return 0, else return -1
+ * @param[in] ugd the pointer to the main data structure
+ */
int wfd_ug_get_discovered_peers(struct ug_data *ugd)
{
+ __FUNC_ENTER__;
int res = 0;
+ WFD_RETV_IF(ugd == NULL, -1, "Incorrect parameter(NULL)\n");
+
+ ugd->raw_discovered_peer_cnt = 0;
+ wfd_client_free_raw_discovered_peers(ugd);
+ 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);
+ }
+
+ __FUNC_EXIT__;
+ return 0;
+}
- if (ugd==NULL)
+/**
+ * This function let the ug get the connecting peer
+ * @return If success, return 0, else return -1
+ * @param[in] ugd the pointer to the main data structure
+ */
+int wfd_ug_get_connecting_peer(struct ug_data *ugd)
+{
+ __FUNC_ENTER__;
+ int res = 0;
+ WFD_RETV_IF(ugd == NULL, -1, "Incorrect parameter(NULL)\n");
+ char *mac_addr = NULL;
+ GList *iterator = NULL;
+
+ ugd->mac_addr_connecting = NULL;
+ res = wifi_direct_get_connecting_peer(&mac_addr);
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Get connecting device mac failed: %d\n", res);
return -1;
+ }
+ DBG_SECURE(LOG_INFO, "Mac Addr Connecting: ["MACSECSTR"]\n",
+ MAC2SECSTR(mac_addr));
+ ugd->mac_addr_connecting = mac_addr;
- 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);
- }
+ for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
+ if (!strncmp(mac_addr, ((device_type_s *)iterator->data)->mac_addr, MAC_LENGTH)) {
+ ((device_type_s *)iterator->data)->conn_status = PEER_CONN_STATUS_CONNECTING;
+ }
+ }
+
+ __FUNC_EXIT__;
return 0;
}
+/**
+ * This function let the ug get the connected peers
+ * @return If success, return 0, else return -1
+ * @param[in] ugd the pointer to the main data structure
+ */
int wfd_ug_get_connected_peers(struct ug_data *ugd)
{
+ __FUNC_ENTER__;
int res = 0;
-
- if (ugd==NULL)
- return -1;
+ WFD_RETV_IF(ugd == NULL, -1, "Incorrect parameter(NULL)\n");
ugd->raw_connected_peer_cnt = 0;
- res = wifi_direct_foreach_connected_peers(_wfd_connected_peer_cb, (void*) ugd);
- if(res != WIFI_DIRECT_ERROR_NONE)
- {
+ 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);
}
+
+ __FUNC_EXIT__;
return 0;
}
-void _discover_cb(int error_code, wifi_direct_discovery_state_e discovery_state, void *user_data)
+/**
+ * This function let the ug exits automatically after successed connection
+ * @return void
+ * @param[in] user_data the pointer to the main data structure
+ */
+void _wfd_ug_auto_exit(void *user_data)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) user_data;
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)user_data;
+ WFD_RET_IF(ugd == NULL, "Incorrect parameter(NULL)\n");
- if(ugd == NULL)
- {
- DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
- return;
- }
+ usleep(1000);
+ deinit_wfd_client(ugd);
+ wfd_destroy_ug(ugd);
- if(discovery_state == WIFI_DIRECT_ONLY_LISTEN_STARTED)
- {
- ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
- }
- else if(discovery_state == WIFI_DIRECT_DISCOVERY_STARTED)
- {
- ugd->head_text_mode = HEAD_TEXT_TYPE_SCANING;
- }
- else if(discovery_state == WIFI_DIRECT_DISCOVERY_FOUND)
- {
- ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
- }
+ __FUNC_EXIT__;
+}
+
+gboolean wfd_delete_not_alive_peer_cb(void *user_data)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)user_data;
+ WFD_RETV_IF(ugd == NULL, FALSE, "Incorrect parameter(NULL)\n");
+
+ delete_not_alive_peers(ugd, &ugd->gl_avlb_peers_start, &ugd->gl_available_peer_cnt);
+ delete_not_alive_peers(ugd, &ugd->gl_busy_peers_start, &ugd->gl_busy_peer_cnt);
+ delete_not_alive_peers(ugd, &ugd->multi_conn_dev_list_start, &ugd->gl_available_dev_cnt_at_multiconn_view);
+ wfd_ug_view_init_genlist(ugd, false);
+ wfd_update_multiconnect_device(ugd, false);
+ __FUNC_EXIT__;
+ return FALSE;
+}
- wfd_ug_view_refresh_glitem(ugd->head);
- if (WIFI_DIRECT_DISCOVERY_STARTED == discovery_state) {
- if (ugd->scan_btn) {
- wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_STOPSCAN"), TRUE);
+gboolean wfd_delete_progressbar_cb(void *user_data)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)user_data;
+ WFD_RETV_IF(ugd == NULL, FALSE, "Incorrect parameter(NULL)\n");
+
+ ugd->title_content_mode = TITLE_CONTENT_TYPE_NONE;
+ if (ugd->raw_discovered_peer_cnt == 0 &&
+ ugd->nodevice_title_item == NULL &&
+ ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_NONE &&
+ ugd->gl_available_peer_cnt == 0) {
+ _create_no_device_genlist(ugd);
+ };
+
+ wfd_ug_view_refresh_glitem(ugd->mcview_title_item);
+ wfd_ug_view_refresh_glitem(ugd->avlbl_wfd_item);
+
+ if (0 == ugd->gl_available_dev_cnt_at_multiconn_view) {
+ _create_no_device_multiconnect_genlist(ugd);
}
- if (ugd->multi_connect_btn) {
- wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_STOPSCAN"), TRUE);
+ wfd_refresh_wifi_direct_state(ugd);
+ if (WIFI_DIRECT_STATE_CONNECTING != ugd->wfd_status &&
+ WIFI_DIRECT_STATE_DISCONNECTING != ugd->wfd_status) {
+ if (ugd->scan_toolbar) {
+ wfd_ug_view_refresh_button(ugd->scan_toolbar, "IDS_WIFI_SK4_SCAN", TRUE);
+ evas_object_data_set(ugd->toolbar, "scan", "scan");
+ }
+
+ if (ugd->multiconn_layout) {
+ wfd_ug_view_refresh_button(ugd->multiconn_scan_stop_btn, "IDS_WIFI_SK4_SCAN", TRUE);
+ DBG(LOG_INFO, "Multiconn button text IDS_WIFI_SK4_SCAN \n");
+
+ }
}
- } else {
- if (ugd->scan_btn) {
- wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
+
+ __FUNC_EXIT__;
+ return FALSE;
+}
+
+/**
+ * This function let the ug make a callback for registering discover event
+ * @return void
+ * @param[in] error_code the returned error code
+ * @param[in] discovery_state the state of discover
+ * @param[in] user_data the pointer to the main data structure
+ */
+void discover_cb(int error_code, wifi_direct_discovery_state_e discovery_state, void *user_data)
+{
+ __FUNC_ENTER__;
+ int ret;
+ struct ug_data *ugd = (struct ug_data *)user_data;
+
+ if (ugd == NULL) {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return;
}
- if (ugd->multi_connect_btn) {
- wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
+ if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_IN_PROGRESS) {
+ return;
}
- }
- wfd_ug_get_discovered_peers(ugd);
- wfd_ug_get_connected_peers(ugd);
+ DBG(LOG_INFO, "Discovery event [%d], error_code [%d]\n", discovery_state, error_code);
+
+ if (discovery_state == WIFI_DIRECT_DISCOVERY_STARTED) {
+ if (ugd->wfd_discovery_status == WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START) {
+ ugd->title_content_mode = TITLE_CONTENT_TYPE_SCANNING;
+ wfd_cancel_progressbar_stop_timer(ugd);
+ ugd->timer_stop_progress_bar = g_timeout_add(1000*30, wfd_delete_progressbar_cb, ugd);
+ /* clear all the previous discovered peers */
+ wfd_client_free_raw_discovered_peers(ugd);
+
+ ugd->raw_discovered_peer_cnt = 0;
+ wfd_ug_view_init_genlist(ugd, false);
- wfd_ug_view_update_peers(ugd);
+ if (ugd->avlbl_wfd_item == NULL) {
+ _create_available_dev_genlist(ugd);
+ }
+
+ wfd_ug_view_refresh_glitem(ugd->mcview_title_item);
+ /* clear not alive peers after 5 secs */
+ wfd_cancel_not_alive_delete_timer(ugd);
+ ugd->timer_delete_not_alive_peer = g_timeout_add(1000*5, wfd_delete_not_alive_peer_cb, ugd);
+ set_not_alive_peers(ugd->gl_avlb_peers_start);
+ set_not_alive_peers(ugd->gl_busy_peers_start);
+ set_not_alive_peers(ugd->multi_conn_dev_list_start);
+ }
+ } else if (discovery_state == WIFI_DIRECT_DISCOVERY_FOUND) {
+ if (ugd->wfd_discovery_status != WIFI_DIRECT_DISCOVERY_NONE) {
+ wfd_ug_get_discovered_peers(ugd);
+ wfd_ug_update_available_peers(ugd);
+ wfd_update_multiconnect_device(ugd, false);
+ }
+ } else if (discovery_state == WIFI_DIRECT_DISCOVERY_FINISHED) {
+ if (ugd->wfd_discovery_status == WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START) {
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_FULL_SCAN_START;
+ ret = wifi_direct_start_discovery_specific_channel(false, 0, WIFI_DIRECT_DISCOVERY_FULL_SCAN);
+ if (ret != WIFI_DIRECT_ERROR_NONE) {
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
+ DBG(LOG_ERROR, "Failed to start discovery with full scan. [%d]\n", ret);
+ wifi_direct_cancel_discovery();
+ }
+ }
+ }
- _wfd_free_multiconnect_device(ugd);
- _wfd_update_multiconnect_device(ugd);
- //_change_multi_button_title(ugd);
+ if (WIFI_DIRECT_DISCOVERY_STARTED == discovery_state &&
+ ugd->wfd_discovery_status == WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START) {
+ WFD_IF_DEL_ITEM(ugd->multi_connect_toolbar_item);
+ if (!ugd->conn_wfd_item) {
+ elm_object_part_content_set(ugd->layout, "button.big", ugd->scan_toolbar);
+ }
+ wfd_ug_view_refresh_button(ugd->scan_toolbar, "IDS_WIFI_SK_STOP", TRUE);
+ if (ugd->multiconn_scan_stop_btn) {
+ wfd_ug_view_refresh_button(ugd->multiconn_scan_stop_btn, "IDS_WIFI_SK_STOP", TRUE);
+ }
+ }
- __FUNC_EXIT__;
- return;
+ __FUNC_EXIT__;
+ return;
}
+/**
+ * This function let the ug make a callback for registering connection event
+ * @return void
+ * @param[in] error_code the returned error code
+ * @param[in] connection_state the state of connection
+ * @param[in] mac_address the mac address of peer
+ * @param[in] user_data the pointer to the main data structure
+ */
void _connection_cb(int error_code, wifi_direct_connection_state_e connection_state, const char *mac_address, void *user_data)
{
- __FUNC_ENTER__;
-
- struct ug_data *ugd = (struct ug_data*) user_data;
- device_type_s *peer = NULL;
- bool owner = FALSE;
- int res = 0;
-
- 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);
-
- if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_IN_PROGRESS)
- {
- 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
- {
+ __FUNC_ENTER__;
+ 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_ERROR, "Incorrect parameter(peer mac is NULL)\n");
+ return;
+ }
+
+ DBG_SECURE(LOG_INFO, "Connection event [%d], error_code [%d], multi_connect_mode [%d] mac ["MACSECSTR"]\n",
+ connection_state, error_code, ugd->multi_connect_mode, MAC2SECSTR(mac_address));
+
+ /* when not in connection, mac_address is empty */
+ if (connection_state <= WIFI_DIRECT_DISASSOCIATION_IND) {
+ peer = wfd_client_find_peer_by_mac(ugd, mac_address);
+
+ if (NULL == peer || '\0' == peer->ssid[0]) {
+ DBG(LOG_ERROR, "invalid peer from connection !!\n");
+ ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_NONE;
+ goto refresh_button;
+ }
+ }
+
+ if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_IN_PROGRESS) {
+ switch (connection_state) {
+ case WIFI_DIRECT_CONNECTION_RSP:
+ DBG(LOG_INFO, "MULTI: WIFI_DIRECT_CONNECTION_RSP\n");
+ ugd->mac_addr_connecting = NULL;
+ if (error_code == WIFI_DIRECT_ERROR_NONE) {
+ peer->conn_status = PEER_CONN_STATUS_CONNECTED;
+ wfd_ug_get_connected_peers(ugd);
+ wfd_ug_update_connected_peers(ugd);
+ } else {
+ peer->conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT;
+ peer = find_peer_in_glist(ugd->gl_mul_conn_peers_start, peer->mac_addr);
+ if ( peer != NULL) {
peer->conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT;
+ wfd_ug_view_refresh_glitem(peer->gl_item);
}
- ugd->g_source_multi_connect_next = g_timeout_add(1000, wfd_multi_connect_next_cb, ugd);
- break;
- default:
- break;
}
+ /* connect the next peer */
+ ugd->g_source_multi_connect_next = g_timeout_add(500, wfd_multi_connect_next_cb, ugd);
+ break;
+ case WIFI_DIRECT_CONNECTION_IN_PROGRESS:
+ DBG(LOG_INFO, "MULTI: WIFI_DIRECT_CONNECTION_IN_PROGRESS\n");
+ peer->conn_status = PEER_CONN_STATUS_CONNECTING;
+ peer = find_peer_in_glist(ugd->gl_mul_conn_peers_start, peer->mac_addr);
+
+ if ( peer != NULL) {
+ peer->conn_status = PEER_CONN_STATUS_CONNECTING;
+ wfd_ug_view_refresh_glitem(peer->gl_item);
+ }
+
+ wfd_ug_update_toolbar(ugd);
+ break;
+ case WIFI_DIRECT_GROUP_CREATED:
+ DBG(LOG_INFO, "MULTI: WIFI_DIRECT_GROUP_CREATED\n");
+ wfd_cancel_progressbar_stop_timer(ugd);
+ wfd_delete_progressbar_cb(ugd);
+
+ wfd_ug_view_init_genlist(ugd, true);
+ wfd_ug_view_update_multiconn_peers(ugd);
+ wfd_multi_connect_next_cb(ugd);
+ break;
+ default:
+ break;
+ }
+ } else {
+ switch (connection_state) {
+ case WIFI_DIRECT_CONNECTION_RSP:
+ DBG(LOG_INFO, "WIFI_DIRECT_CONNECTION_RSP\n");
+ wfd_delete_progressbar_cb(ugd);
+
+ if (ugd->act_popup) {
+ evas_object_del(ugd->act_popup);
+ ugd->act_popup = NULL;
+ }
+ ugd->mac_addr_connecting = NULL;
+
+ if (error_code == WIFI_DIRECT_ERROR_NONE) {
+ peer->conn_status = PEER_CONN_STATUS_CONNECTED;
+ wfd_ug_get_connected_peers(ugd);
+
+ /* when auto_exit and not multi-connect*/
+ if ((ugd->is_auto_exit)&&(ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_NONE)) {
+ _wfd_ug_auto_exit(ugd);
+ }
+
+ if(ugd->ctxpopup != NULL && ugd->more_btn_multiconnect_item) {
+ elm_object_item_disabled_set(ugd->more_btn_multiconnect_item, TRUE);
+ }
+
+ wfd_ug_update_connected_peers(ugd);
+ } else {
+ peer->conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT;
+ wfd_ug_update_failed_peers(ugd);
+ }
+
+ wfd_ug_update_toolbar(ugd);
+ break;
+ case WIFI_DIRECT_DISASSOCIATION_IND:
+ DBG(LOG_INFO, "WIFI_DIRECT_DISASSOCIATION_IND\n");
+ /* remove any possible popup */
+ WFD_IF_DEL_OBJ(ugd->act_popup);
+ wfd_ug_view_refresh_button(ugd->scan_toolbar, "IDS_WIFI_SK4_SCAN", TRUE);
+
+ /* change the multi connection mode, it can be connected now */
+ if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_COMPLETED) {
+ ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_NONE;
+ }
+
+ /* if other peer disconnected, get connected peers and update */
+ peer->conn_status = PEER_CONN_STATUS_DISCONNECTED;
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)
- {
- 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;
- }
- else
- {
- peer->conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT;
- }
-
- 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);
- ugd->wfd_status = WFD_LINK_STATUS_DISCOVERING;
- ugd->head_text_mode = HEAD_TEXT_TYPE_SCANING;
-
- wfd_ug_view_refresh_glitem(ugd->head);
-
- 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;
- }
-
- if(peer != NULL)
- wfd_ug_view_refresh_glitem(peer->gl_item);
-
- _change_multi_button_title(ugd);
+ wfd_ug_update_available_peers(ugd);
+ break;
+ case WIFI_DIRECT_DISCONNECTION_RSP:
+ case WIFI_DIRECT_DISCONNECTION_IND:
+ DBG(LOG_INFO, "WIFI_DIRECT_DISCONNECTION_X\n");
+ WFD_IF_DEL_OBJ(ugd->act_popup);
+
+ Evas_Object *content;
+ content = elm_object_part_content_unset(ugd->layout, "button.next");
+ WFD_IF_DEL_OBJ(content);
+ /* when disconnection, clear all the connected peers */
+ if (ugd->raw_connected_peer_cnt > 0) {
+ memset(ugd->raw_connected_peers, 0x00, ugd->raw_connected_peer_cnt*sizeof(device_type_s));
+ }
-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) {
+ ugd->raw_connected_peer_cnt = 0;
+ wfd_ug_view_init_genlist(ugd, true);
+ if (ugd->wfd_discovery_status == WIFI_DIRECT_DISCOVERY_BACKGROUND) {
+ DBG(LOG_INFO, "Background mode\n");
+ break;
+ }
+
+ if (ugd->is_paused == false) {
+ /* start discovery again */
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
+ res = wifi_direct_start_discovery_specific_channel(false, 1, WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
+ DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", res);
+ wifi_direct_cancel_discovery();
+ }
+ }
- 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);
+ break;
+ case WIFI_DIRECT_CONNECTION_IN_PROGRESS:
+ DBG(LOG_INFO, "WIFI_DIRECT_CONNECTION_IN_PROGRESS\n");
+ wfd_ug_update_toolbar(ugd);
+ wfd_cancel_progressbar_stop_timer(ugd);
+ wfd_delete_progressbar_cb(ugd);
+
+ if (ugd->multi_navi_item) {
+ elm_naviframe_item_pop(ugd->naviframe);
+ }
+
+ ugd->mac_addr_connecting = peer->mac_addr;
+ ugd->is_conn_incoming = FALSE;
+ peer->conn_status = PEER_CONN_STATUS_CONNECTING;
+ peer = find_peer_in_glist(ugd->gl_avlb_peers_start, peer->mac_addr);
+ if (peer != NULL) {
+ peer->conn_status = PEER_CONN_STATUS_CONNECTING;
+ wfd_ug_view_refresh_glitem(peer->gl_item);
+ } else {
+ wfd_ug_get_discovered_peers(ugd);
+ wfd_ug_update_available_peers(ugd);
+ }
+
+ break;
+ case WIFI_DIRECT_CONNECTION_REQ:
+ case WIFI_DIRECT_CONNECTION_WPS_REQ:
+ ugd->mac_addr_connecting = peer->mac_addr;
+ ugd->is_conn_incoming = TRUE;
+ DBG(LOG_INFO, "WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ\n");
+ break;
+ case WIFI_DIRECT_GROUP_DESTROYED:
+ wfd_ug_update_toolbar(ugd);
+ if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_COMPLETED) {
+ ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_NONE;
+ } else {
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
+ res = wifi_direct_start_discovery_specific_channel(false, 1, WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
+ DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", res);
+ wifi_direct_cancel_discovery();
+ }
+ }
+
+ break;
+ default:
+ break;
}
+ }
- if (ugd->multi_connect_btn) {
- wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE);
+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_toolbar) {
+ evas_object_data_set(ugd->toolbar, "scan", "scan");
+ }
+
+ if (ugd->multiconn_scan_stop_btn) {
+ wfd_ug_view_refresh_button(ugd->multiconn_scan_stop_btn, "IDS_WIFI_SK4_SCAN", FALSE);
+ }
+ }
+ } else {
+ DBG(LOG_ERROR, "Failed to get whether client is group owner. [%d]\n", res);
}
- }
} else {
- DBG(LOG_ERROR, "Failed to get whether client is group owner. [%d]\n", res);
+ if (ugd->scan_toolbar) {
+ evas_object_data_set(ugd->toolbar, "scan", "scan");
+ }
+
+ if (ugd->multiconn_scan_stop_btn) {
+ wfd_ug_view_refresh_button(ugd->multiconn_scan_stop_btn, "IDS_WIFI_SK4_SCAN", TRUE);
+ }
}
- } else {
- if (ugd->scan_btn) {
- wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
+
+ __FUNC_EXIT__;
+ return;
+}
+
+/**
+ * This function let the ug make a callback for registering ip assigned event
+ * @return void
+ * @param[in] mac_address the mac address of peer
+ * @param[in] ip_address the ip address of peer
+ * @param[in] interface_address the interface address
+ * @param[in] user_data the pointer to the main data structure
+ */
+void _ip_assigned_cb(const char *mac_address, const char *ip_address, const char *interface_address, void *user_data)
+{
+ __FUNC_ENTER__;
+
+ if (!user_data) {
+ DBG(LOG_ERROR, "The user_data is NULL\n");
+ return;
}
- if (ugd->multi_connect_btn) {
- wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
+ struct ug_data *ugd = (struct ug_data *)user_data;
+
+ if (!ip_address || 0 == strncmp(ip_address, "0.0.0.0", 7)) {
+ DBG(LOG_ERROR,"ip address is invalid.\n");
+ return;
}
- }
- __FUNC_EXIT__;
- return;
+ ugd->peer_ip_address = strdup(ip_address);
+
+
+ /* to send ip_addr*/
+ int ret = -1;
+ app_control_h control = NULL;
+ ret = app_control_create(&control);
+ if (ret) {
+ DBG(LOG_ERROR, "Failed to create control");
+ return;
+ }
+ app_control_add_extra_data(control, "ip_address", ugd->peer_ip_address);
+ app_control_add_extra_data(control, "wfds", ugd->service_name);
+ ug_send_result(ugd->ug, control);
+ app_control_destroy(control);
+
+ /* when auto_exit and not multi-connect*/
+ if ((ugd->is_auto_exit)&&(ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_NONE)) {
+ _wfd_ug_auto_exit(ugd);
+ }
+
+ __FUNC_EXIT__;
}
-int wfd_get_vconf_status(void *data)
+/**
+ * This function let the ug get wi-fi direct status from vconf
+ * @return If success, return the wfd status, else return -1
+ * @param[in] void
+ */
+int wfd_get_vconf_status()
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
- char *dev_name;
+ __FUNC_ENTER__;
+ int wifi_direct_state = 0;
- // TODO: get wifi direct status from vconf
- // db/mobile_hotspot/wifi_key (string)
+ /* get wifi direct status from vconf */
+ if (vconf_get_int(VCONFKEY_WIFI_DIRECT_STATE, &wifi_direct_state) < 0) {
+ DBG(LOG_ERROR, "Error reading vconf (%s)\n", VCONFKEY_WIFI_DIRECT_STATE);
+ return -1;
+ }
+ DBG(LOG_INFO, "WiFi Direct State [%d]", wifi_direct_state);
- 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);
- DBG(LOG_ERROR, "The AP name is NULL(setting default value)\n");
- }
- else
- {
- ugd->dev_name = strdup(dev_name);
- free(dev_name);
- }
+ __FUNC_EXIT__;
+ return wifi_direct_state;
+}
+
+/**
+ * This function let the ug get device name from vconf
+ * @return If success, return 0, else return -1
+ * @param[in] data the pointer to the main data structure
+ */
+int wfd_get_vconf_device_name(void *data)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)data;
+ char *dev_name = NULL;
+
+ /* get device name from vconf */
+ dev_name = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
+ if (dev_name == NULL) {
+ ugd->dev_name = strdup(DEFAULT_DEV_NAME);
+ DBG(LOG_ERROR, "The AP name is NULL(setting default value)\n");
+ return -1;
+ }
- __FUNC_EXIT__;
+ ugd->dev_name = strdup(dev_name);
+ WFD_IF_FREE_MEM(dev_name);
- return 0;
+ __FUNC_EXIT__;
+ return 0;
}
+/**
+ * This function let the ug refresh current status of wi-fi direct
+ * @return If success, return 0, else return -1
+ * @param[in] data the pointer to the main data structure
+ */
int wfd_refresh_wifi_direct_state(void *data)
{
- struct ug_data *ugd = (struct ug_data*) data;
+ __FUNC_ENTER__;
+ 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)
- {
- 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;
- return 0;
+
+ res = wifi_direct_get_state(&wfd_status);
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to get link status. [%d]\n", res);
+ return -1;
+ }
+
+ DBG(LOG_INFO, "WFD status [%d]", wfd_status);
+ ugd->wfd_status = wfd_status;
+
+ __FUNC_EXIT__;
+ return 0;
}
-int init_wfd_client(void *data)
+void wfd_init_ug_by_status(void *user_data)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
- int res = 0;
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)user_data;
+ int res = 0;
- res = wifi_direct_initialize();
- if(res != WIFI_DIRECT_ERROR_NONE)
- {
- DBG(LOG_ERROR, "Failed to initialize wifi direct. [%d]\n", res);
- return -1;
- }
+ if(ugd == NULL) {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return;
+ }
- 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);
+ if (ugd->wfd_status >= WIFI_DIRECT_STATE_ACTIVATED) {
+ //wfd_ug_get_discovered_peers(ugd);
+ ugd->title_content_mode = TITLE_CONTENT_TYPE_NONE;
+ }
- /* 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;
+ if (ugd->wfd_status >= WIFI_DIRECT_STATE_CONNECTED) {
+ wfd_ug_get_connected_peers(ugd);
+ wfd_ug_update_connected_peers(ugd);
+ ugd->title_content_mode = TITLE_CONTENT_TYPE_NONE;
+ wfd_ug_get_discovered_peers(ugd);
+ wfd_ug_update_available_peers(ugd);
+ wfd_ug_update_toolbar(ugd);
+ }
- DBG(LOG_VERBOSE, "WFD link status. [%d]\n", ugd->wfd_status);
+ if (ugd->wfd_status == WIFI_DIRECT_STATE_CONNECTING) {
+ ugd->title_content_mode = TITLE_CONTENT_TYPE_NONE;
+ wfd_ug_get_discovered_peers(ugd);
+ wfd_ug_get_connecting_peer(ugd);
+ wfd_ug_update_available_peers(ugd);
+ wfd_ug_update_toolbar(ugd);
+ }
- __FUNC_EXIT__;
+ if (ugd->wfd_status == WIFI_DIRECT_STATE_ACTIVATED ||
+ ugd->wfd_status == WIFI_DIRECT_STATE_DISCOVERING) {
+ /* start discovery */
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
+ res = wifi_direct_start_discovery_specific_channel(false, 1, WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
+ DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", res);
+ wifi_direct_cancel_discovery();
+ }
+ }
- return 0;
+ __FUNC_EXIT__;
}
-int deinit_wfd_client(void *data)
+/**
+ * This function let the ug do initialization
+ * @return If success, return 0, else return -1
+ * @param[in] data the pointer to the main data structure
+ */
+int init_wfd_client(void* data)
{
__FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
+ WFD_RETV_IF(data == NULL, -1, "Incorrect parameter(NULL)\n");
+ struct ug_data *ugd = (struct ug_data *)data;
int res = 0;
+
+ res = wifi_direct_initialize();
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ if (res != WIFI_DIRECT_ERROR_ALREADY_INITIALIZED) {
+ DBG(LOG_ERROR, "Failed to initialize wifi direct. [%d]\n", res);
+ return -1;
+ } else {
+ DBG(LOG_ERROR, "Already registered\n");
+ }
+ }
+
+ res = wifi_direct_set_device_state_changed_cb(_activation_cb, (void *)ugd);
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to register _cb_activation. error code = [%d]\n", res);
+ return -1;
+ }
+
+ res = wifi_direct_set_discovery_state_changed_cb(discover_cb, (void *)ugd);
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to register _cb_discover. error code = [%d]\n", res);
+ return -1;
+ }
+
+ res = wifi_direct_set_connection_state_changed_cb(_connection_cb, (void *)ugd);
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to register _cb_connection. error code = [%d]\n", res);
+ return -1;
+ }
+
+ res = wifi_direct_set_client_ip_address_assigned_cb(_ip_assigned_cb, (void *)ugd);
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to register _ip_assigned_cb. error code = [%d]\n", res);
+ return -1;
+ }
+
+ /* update WFD status */
+ wfd_refresh_wifi_direct_state(ugd);
+#ifdef WFD_ON_OFF_GENLIST
+ if (ugd->wfd_status > WIFI_DIRECT_STATE_ACTIVATING) {
+ ugd->wfd_onoff = 1;
+ wfd_ug_refresh_on_off_check(ugd);
+ } else {
+ ugd->wfd_onoff = 0;
+ }
+#endif
+
+ DBG(LOG_INFO, "WFD link status. [%d]\n", ugd->wfd_status);
+ ugd->is_init_ok = TRUE;
+ wfd_init_ug_by_status(ugd);
+
+ __FUNC_EXIT__;
+ return 0;
+}
+
+#ifdef WFD_DBUS_LAUNCH
+void wfd_gdbus_callback(GObject *source_object, GAsyncResult *result, gpointer user_data)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)user_data;
+ WFD_RET_IF(ugd == NULL, "Incorrect parameter(NULL)\n");
+ int res = -1;
+
+ GError *error = NULL;
+ GVariant *return_data;
+
+ g_object_unref(ugd->dbus_cancellable);
+ ugd->dbus_cancellable = NULL;
+ ugd->conn = G_DBUS_CONNECTION (source_object);
+ return_data = g_dbus_connection_call_finish(ugd->conn, result, &error);
+
+ if (error != NULL) {
+ DBG(LOG_ERROR,"DBus action failed. Error Msg [%s]\n", error->message);
+ g_clear_error(&error);
+ } else {
+ DBG(LOG_INFO, "error msg is NULL\n");
+ }
+
+ if (return_data)
+ g_variant_unref(return_data);
+
+ if (ugd->conn) {
+ g_object_unref(ugd->conn);
+ ugd->conn = NULL;
+ }
+
+ res = init_wfd_client(ugd);
+ WFD_RET_IF(res != 0, "Failed to initialize WFD client library\n");
+
+ /* Activate WiFi Direct */
+ /*
+ DBG(LOG_INFO, "Activating WiFi Direct...");
+ if (ugd->wfd_status <= WIFI_DIRECT_STATE_DEACTIVATING) {
+ res = wfd_client_switch_on(ugd);
+ WFD_RET_IF(res != 0, "Failed to activate WFD\n");
+ }
+ */
+
+ __FUNC_EXIT__;
+}
+
+int launch_wifi_direct_manager(void *data)
+{
+ __FUNC_ENTER__;
+
+ gchar *addr = NULL;
+ GError *error = NULL;
+
+ struct ug_data *ugd = (struct ug_data *)data;
+ WFD_RETV_IF(ugd == NULL, -1, "Incorrect parameter(NULL)\n");
+
+ ugd->dbus_cancellable = g_cancellable_new();
+
+ addr = g_dbus_address_get_for_bus_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+ WFD_RETV_IF(addr == NULL, -1, "Fail to get dbus addr.\n");
+
+ ugd->conn = g_dbus_connection_new_for_address_sync(addr,G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT |
+ G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION, NULL, NULL, NULL);
+
+ if(ugd->conn == NULL) {
+ DBG(LOG_ERROR,"g_dbus_conn is NULL\n");
+ return -1;
+ } else {
+ g_dbus_connection_call(ugd->conn, "net.netconfig", "/net/netconfig/wifi","net.netconfig.wifi",
+ "LaunchDirect", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, -1, ugd->dbus_cancellable, wfd_gdbus_callback, data);
+ }
+
+ __FUNC_EXIT__;
+ return 0;
+}
+#endif
+
+void wfd_client_destroy_tethering(struct ug_data *ugd)
+{
+ __FUNC_ENTER__;
+
tethering_error_e ret = TETHERING_ERROR_NONE;
- tethering_h th = NULL;
+
+ if (ugd->hotspot_handle != NULL) {
+ /* Deregister cbs */
+ ret = tethering_unset_enabled_cb(ugd->hotspot_handle, TETHERING_TYPE_WIFI);
+ if (ret != TETHERING_ERROR_NONE) {
+ DBG(LOG_ERROR, "tethering_unset_enabled_cb is failed(%d)\n", ret);
+ }
+
+ ret = tethering_unset_disabled_cb(ugd->hotspot_handle, TETHERING_TYPE_WIFI);
+ if (ret != TETHERING_ERROR_NONE) {
+ DBG(LOG_ERROR, "tethering_unset_disabled_cb is failed(%d)\n", ret);
+ }
+
+ ret = tethering_unset_disabled_cb(ugd->hotspot_handle, TETHERING_TYPE_RESERVED);
+ if (ret != TETHERING_ERROR_NONE) {
+ DBG(LOG_ERROR, "tethering_unset_disabled_cb is failed(%d)\n", ret);
+ }
+
+ /* Destroy tethering handle */
+ ret = tethering_destroy(ugd->hotspot_handle);
+ if (ret != TETHERING_ERROR_NONE) {
+ DBG(LOG_ERROR, "tethering_destroy is failed(%d)\n", ret);
+ }
+
+ ugd->hotspot_handle = NULL;
+ }
+
+ __FUNC_EXIT__;
+}
+
+/**
+ * This function let the ug do de-initialization
+ * @return If success, return 0, else return -1
+ * @param[in] data the pointer to the main data structure
+ */
+int deinit_wfd_client(void *data)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)data;
+ int res = 0;
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();
+ if ((WIFI_DIRECT_STATE_DISCOVERING == ugd->wfd_status) &&
+ (WIFI_DIRECT_ERROR_NONE != wifi_direct_cancel_discovery())) {
+ DBG(LOG_ERROR, "Failed to send cancel discovery state [%d]\n", ugd->wfd_status);
+ }
+
+ wfd_cancel_progressbar_stop_timer(ugd);
+ wfd_cancel_not_alive_delete_timer(ugd);
+
+ if(ugd->timer_multi_reset > 0) {
+ g_source_remove(ugd->timer_multi_reset);
+ }
+ ugd->timer_multi_reset = 0;
+
+ if (ugd->g_source_multi_connect_next > 0) {
+ g_source_remove(ugd->g_source_multi_connect_next);
+ }
+ ugd->g_source_multi_connect_next = 0;
+
+ res = wifi_direct_unset_discovery_state_changed_cb();
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to unset discovery state changed cb. [%d]\n", res);
+ }
+
+ wifi_direct_unset_device_state_changed_cb();
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to unset device state changed cb. [%d]\n", res);
+ }
+
+ wifi_direct_unset_connection_state_changed_cb();
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to unset connection state changed cb. [%d]\n", res);
+ }
+
+ wifi_direct_unset_client_ip_address_assigned_cb();
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to unset client ip address assigned cb. [%d]\n", res);
}
+ if (ugd->wfd_status == WIFI_DIRECT_STATE_CONNECTING &&
+ NULL != ugd->mac_addr_connecting) {
+ if (ugd->is_conn_incoming) {
+ DBG(LOG_INFO, "Reject the incoming connection before client deregister \n");
+ res = wifi_direct_reject_connection(ugd->mac_addr_connecting);
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to send reject request [%d]\n", res);
+ }
+ } else {
+ DBG(LOG_INFO, "Cancel the outgoing connection before client deregister \n");
+ res = wifi_direct_cancel_connection(ugd->mac_addr_connecting);
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to send cancel request [%d]\n", res);
+ }
+ }
+ ugd->mac_addr_connecting = NULL;
+ }
+
+
res = wifi_direct_deinitialize();
- if(res != WIFI_DIRECT_ERROR_NONE)
- {
+ if (res != WIFI_DIRECT_ERROR_NONE) {
DBG(LOG_ERROR, "Failed to deregister client. [%d]\n", res);
}
+ /* release vconf, hotspot.. */
+#ifndef MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE
res = vconf_ignore_key_changed(VCONFKEY_WIFI_STATE, _wifi_state_cb);
- if(res == -1)
- {
+ 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)
- {
+ if (res != NET_ERR_NONE) {
DBG(LOG_ERROR, "Failed to deregister network client. [%d]\n", res);
}
+#endif /* MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE */
- __FUNC_EXIT__;
+ wfd_client_destroy_tethering(ugd);
+
+ __FUNC_EXIT__;
return 0;
}
+/**
+ * This function let the ug turn wi-fi direct on
+ * @return If success, return 0, else return -1
+ * @param[in] data the pointer to the main data structure
+ */
int wfd_client_switch_on(void *data)
{
- __FUNC_ENTER__;
- 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)
- {
- ugd->wfd_status = WFD_LINK_STATUS_ACTIVATING;
-
- int wifi_state;
- res = vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
- 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;
- }
-
- 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); // "This will turn off Wi-Fi client 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)
- {
- 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;
- wfd_ug_view_refresh_glitem(ugd->head);
- return -1;
- }
- }
- }
- else
- {
- DBG(LOG_VERBOSE, "Wi-Fi Direct is already activated\n");
- }
-
- __FUNC_EXIT__;
- return 0;
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)data;
+ int res;
+
+ bool is_wifi_enabled = false;
+ bool is_wifi_ap_enabled = false;
+
+
+ if(!ugd->is_init_ok) {
+ DBG(LOG_ERROR, "device is initializing, please wait\n");
+ return -1;
+ }
+
+ wfd_refresh_wifi_direct_state(ugd);
+ DBG(LOG_INFO, "WFD status [%d]\n", ugd->wfd_status);
+
+ if (ugd->wfd_status < WIFI_DIRECT_STATE_ACTIVATING) {
+
+#ifndef MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE
+ int wifi_state;
+ res = vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
+ if (res != 0) {
+ DBG(LOG_ERROR, "Failed to get wifi state from vconf. [%d]\n", res);
+ return -1;
+ }
+#endif /* MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE */
+
+ ugd->hotspot_handle = NULL;
+ res = tethering_create(&(ugd->hotspot_handle));
+ if (res != TETHERING_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to tethering_create() [%d]\n", res);
+ return -1;
+ } else {
+ DBG(LOG_INFO, "Succeeded to tethering_create()\n");
+ }
+
+ is_wifi_enabled = tethering_is_enabled(ugd->hotspot_handle, TETHERING_TYPE_WIFI);
+ is_wifi_ap_enabled = tethering_is_enabled(ugd->hotspot_handle, TETHERING_TYPE_RESERVED);
+
+#ifndef MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE
+ if (wifi_state > VCONFKEY_WIFI_OFF) {
+ DBG(LOG_INFO, "WiFi is connected, so have to turn off WiFi");
+ wfd_ug_act_popup(ugd, _("IDS_WIFI_BODY_USING_WI_FI_DIRECT_WILL_DISCONNECT_CURRENT_WI_FI_CONNECTION_CONTINUE_Q"), POPUP_TYPE_WIFI_OFF);
+ } else
+#endif /* MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE */
+
+ if (is_wifi_enabled || is_wifi_ap_enabled) {
+ DBG(LOG_INFO, "WiFi is connected, so have to turn off WiFi");
+ wfd_ug_act_popup(ugd, _("IDS_WIFI_BODY_USING_WI_FI_DIRECT_WILL_DISCONNECT_CURRENT_WI_FI_TETHERING_CONTINUE_Q"), POPUP_TYPE_HOTSPOT_OFF);
+ } else
+
+ {
+ res = wifi_direct_activate();
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to activate Wi-Fi Direct. error code = [%d]\n", res);
+ wfd_ug_warn_popup(ugd, _("IDS_COM_POP_FAILED"), POPUP_TYPE_TERMINATE);
+#ifdef WFD_ON_OFF_GENLIST
+ wfd_ug_refresh_on_off_check(ugd);
+#endif
+ return -1;
+ }
+
+#ifdef WFD_ON_OFF_GENLIST
+ if (ugd->on_off_check) {
+ elm_check_state_set(ugd->on_off_check, TRUE);
+ elm_object_disabled_set(ugd->on_off_check, TRUE);
+ }
+#endif
+ /* while activating, disable the buttons */
+ if (ugd->scan_toolbar == NULL) {
+ scan_button_create(ugd);
+ }
+
+ if (ugd->scan_toolbar) {
+ wfd_ug_view_refresh_button(ugd->scan_toolbar, "IDS_WIFI_SK4_SCAN", FALSE);
+ }
+
+ if (ugd->multiconn_scan_stop_btn) {
+ wfd_ug_view_refresh_button(ugd->multiconn_scan_stop_btn, "IDS_WIFI_SK4_SCAN", FALSE);
+ }
+
+ if (ugd->back_btn) {
+ elm_object_disabled_set(ugd->back_btn, TRUE);
+ }
+ }
+ } else {
+ DBG(LOG_INFO, "Wi-Fi Direct is already activated\n");
+ }
+
+ __FUNC_EXIT__;
+ return 0;
}
+/**
+ * This function let the ug turn wi-fi direct off
+ * @return If success, return 0, else return -1
+ * @param[in] data the pointer to the main data structure
+ */
int wfd_client_switch_off(void *data)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
- int res;
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)data;
+ int res;
- DBG(LOG_VERBOSE, "WFD status [%d]\n", ugd->wfd_status);
+ wfd_ug_view_free_peers(ugd);
+ wfd_free_nodivice_item(ugd);
- if(ugd->wfd_status < WFD_LINK_STATUS_ACTIVATING)
- {
- DBG(LOG_VERBOSE, "Wi-Fi Direct is already deactivated\n");
- }
- else
- {
- ugd->wfd_status = WFD_LINK_STATUS_DEACTIVATING;
+ wfd_refresh_wifi_direct_state(ugd);
+ DBG(LOG_INFO, "WFD status [%d]\n", ugd->wfd_status);
- res = wifi_direct_deactivate();
- if(res != WIFI_DIRECT_ERROR_NONE)
- {
- 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);
+ if (ugd->wfd_status < WIFI_DIRECT_STATE_ACTIVATING) {
+ DBG(LOG_INFO, "Wi-Fi Direct is already deactivated\n");
+ } else {
- ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
- wfd_ug_view_refresh_glitem(ugd->head);
- return -1;
- }
- }
+ wfd_client_destroy_tethering(ugd);
- __FUNC_EXIT__;
- return 0;
-}
+ wfd_cancel_progressbar_stop_timer(ugd);
+ wfd_cancel_not_alive_delete_timer(ugd);
-int wfd_client_swtch_force(void *data, int onoff)
-{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
- int res;
-
- if(onoff)
- {
- res = wifi_direct_activate();
- if(res != WIFI_DIRECT_ERROR_NONE)
- {
- 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;
- wfd_ug_view_refresh_glitem(ugd->head);
- return -1;
- }
- }
- else
- {
- res = wifi_direct_deactivate();
- if(res != WIFI_DIRECT_ERROR_NONE)
- {
- 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;
- wfd_ug_view_refresh_glitem(ugd->head);
- return -1;
- }
- }
- __FUNC_EXIT__;
- return 0;
-}
-
-int wfd_client_start_discovery(void *data)
-{
- __FUNC_ENTER__;
- 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;
- }
-
-
- if(ugd->wfd_status >= WIFI_DIRECT_STATE_ACTIVATED)
- {
- 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;
- }
- }
+ if(ugd->timer_multi_reset > 0) {
+ g_source_remove(ugd->timer_multi_reset);
+ }
+ ugd->timer_multi_reset = 0;
+
+ if (ugd->g_source_multi_connect_next > 0) {
+ g_source_remove(ugd->g_source_multi_connect_next);
+ }
+ ugd->g_source_multi_connect_next = 0;
+
+ /*if connected, disconnect all devices*/
+ if (WIFI_DIRECT_STATE_CONNECTED == ugd->wfd_status) {
+ res = wifi_direct_disconnect_all();
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to send disconnection request to all. [%d]\n", res);
+ return -1;
+ }
+ }
+
+ res = wifi_direct_deactivate();
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to deactivate Wi-Fi Direct. error code = [%d]\n", res);
+ wfd_ug_warn_popup(ugd, _("IDS_WIFI_POP_DEACTIVATION_FAILED"), POPUP_TYPE_TERMINATE_DEACTIVATE_FAIL);
+#ifdef WFD_ON_OFF_GENLIST
+ wfd_ug_refresh_on_off_check(ugd);
#endif
+ return -1;
+ }
- 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();
+ /* while deactivating, disable the buttons */
+ if (ugd->scan_toolbar) {
+ wfd_ug_view_refresh_button(ugd->scan_toolbar, "IDS_WIFI_SK4_SCAN", FALSE);
+ evas_object_del(ugd->scan_toolbar);
+ ugd->scan_toolbar = NULL;
+ }
- 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;
- }
+ if (ugd->multiconn_scan_stop_btn) {
+ wfd_ug_view_refresh_button(ugd->multiconn_scan_stop_btn, "IDS_WIFI_SK4_SCAN", FALSE);
+ }
- ugd->wfd_status = WIFI_DIRECT_DISCOVERY_FOUND;
- wfd_refresh_wifi_direct_state(ugd);
+ if (ugd->multi_connect_toolbar_item) {
+ elm_object_item_disabled_set(ugd->multi_connect_toolbar_item, TRUE);
+ }
- __FUNC_EXIT__;
- return 0;
+ if (ugd->back_btn) {
+ elm_object_disabled_set(ugd->back_btn, TRUE);
+ }
+ }
+
+ __FUNC_EXIT__;
+ return 0;
}
-int wfd_client_connect(const char *mac_addr)
+#ifdef WFD_ON_OFF_GENLIST
+/**
+ * This function let the ug turn wi-fi direct on/off forcely
+ * @return If success, return 0, else return -1
+ * @param[in] data the pointer to the main data structure
+ * @param[in] onoff whether to turn on/off wi-fi direct
+ */
+int wfd_client_swtch_force(void *data, int onoff)
{
- __FUNC_ENTER__;
- int res;
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)data;
+ int res;
- DBG(LOG_ERROR, "connect to peer=[%s]\n", mac_addr);
- res = wifi_direct_connect(mac_addr);
- if(res != WIFI_DIRECT_ERROR_NONE)
- {
- DBG(LOG_ERROR, "Failed to send connection request. [%d]\n", res);
- return -1;
- }
- __FUNC_EXIT__;
- return 0;
+ if (onoff) {
+ res = wifi_direct_activate();
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to activate Wi-Fi Direct. error code = [%d]\n", res);
+ wfd_ug_warn_popup(ugd, _("IDS_COM_POP_FAILED"), POPUP_TYPE_TERMINATE);
+ wfd_ug_refresh_on_off_check(ugd);
+ return -1;
+ }
+ } else {
+ res = wifi_direct_deactivate();
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to deactivate Wi-Fi Direct. error code = [%d]\n", res);
+ wfd_ug_warn_popup(ugd, _("IDS_WIFI_POP_DEACTIVATION_FAILED"), POPUP_TYPE_TERMINATE);
+ wfd_ug_refresh_on_off_check(ugd);
+ return -1;
+ }
+ }
+
+ __FUNC_EXIT__;
+ return 0;
}
+#endif
-int wfd_client_disconnect(const char *mac_addr)
+/**
+ * This function let the ug create a group
+ * @return If success, return 0, else return -1
+ */
+int wfd_client_group_add()
{
- __FUNC_ENTER__;
- int res;
-
- if(mac_addr == NULL)
- {
- res = wifi_direct_disconnect_all();
- if(res != WIFI_DIRECT_ERROR_NONE)
- {
- 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)
- {
- DBG(LOG_ERROR, "Failed to send disconnection request. [%d]\n", res);
- return -1;
- }
- }
- __FUNC_EXIT__;
- return 0;
+ __FUNC_ENTER__;
+ int res;
+
+ res = wifi_direct_create_group();
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to add group");
+ __FUNC_EXIT__;
+ return -1;
+ }
+
+ __FUNC_EXIT__;
+ return 0;
}
-int wfd_client_set_p2p_group_owner_intent(int go_intent)
+/**
+ * This function let the ug connect to the device by mac address
+ * @return If success, return 0, else return -1
+ * @param[in] mac_addr the pointer to the mac address of device
+ */
+int wfd_client_connect(const char *mac_addr)
{
- __FUNC_ENTER__;
- int res;
+ __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);
+ DBG_SECURE(LOG_INFO, "connect to peer=["MACSECSTR"]\n", MAC2SECSTR(mac_addr));
+ res = wifi_direct_connect((char *)mac_addr);
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to send connection request. [%d]\n", res);
return -1;
}
- __FUNC_EXIT__;
- return 0;
+
+ __FUNC_EXIT__;
+ return 0;
}
-int wfd_client_get_peers(struct ug_data *ugd)
+/**
+ * This function let the ug disconnect to the device by mac address
+ * @return If success, return 0, else return -1
+ * @param[in] mac_addr the pointer to the mac address of device
+ */
+int wfd_client_disconnect(const char *mac_addr)
{
+ __FUNC_ENTER__;
+ int res;
- if(ugd->wfd_status < WFD_LINK_STATUS_ACTIVATED)
- {
- ugd->raw_discovered_peer_cnt = 0;
- ugd->raw_connected_peer_cnt = 0;
- return 0;
+ wifi_direct_cancel_discovery();
+ /*
+ * No need to handle return in cancel discovery as there maybe case
+ * when framework can return failure.
+ */
+
+ if (mac_addr == NULL) {
+ res = wifi_direct_disconnect_all();
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to send disconnection request to all. [%d]\n", res);
+ return -1;
+ }
+ } else {
+ res = wifi_direct_disconnect((char *)mac_addr);
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to send disconnection request. [%d]\n", res);
+ return -1;
+ }
}
- if(ugd->wfd_status > WIFI_DIRECT_STATE_ACTIVATING)
- {
- wfd_ug_get_discovered_peers(ugd);
- }
+ __FUNC_EXIT__;
+ return 0;
+}
- if(ugd->wfd_status >= WIFI_DIRECT_STATE_CONNECTED)
- {
- wfd_ug_get_connected_peers(ugd);
- }
+/**
+ * This function let the ug set the intent of a group owner
+ * @return If success, return 0, else return -1
+ * @param[in] go_intent the intent parameter
+ */
+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;
+ }
- wfd_ug_view_update_peers(ugd);
- _change_multi_button_title(ugd);
- return 0;
+ __FUNC_EXIT__;
+ return 0;
}
diff --git a/ug-wifidirect/src/wfd_motion_control.c b/ug-wifidirect/src/wfd_motion_control.c
new file mode 100755
index 0000000..385f557
--- /dev/null
+++ b/ug-wifidirect/src/wfd_motion_control.c
@@ -0,0 +1,204 @@
+/*
+ * Wi-Fi direct
+ *
+ * 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 <vconf.h>
+#include <sensor_internal.h>
+#include <vconf-keys.h>
+
+#include <libintl.h>
+#include <glib.h>
+
+#include <Elementary.h>
+#include <vconf.h>
+#include <ui-gadget-module.h>
+#include <wifi-direct.h>
+
+#include "wfd_motion_control.h"
+#include "wfd_ug_view.h"
+#include "wfd_client.h"
+
+
+static int motion_handle = -1;
+
+static TARGET_VIEW_FOCUS __motion_target_view_focus_get(void *data)
+{
+ struct ug_data *ugd = (struct ug_data *)data;
+
+ if ((ugd == NULL) || (ugd->naviframe == NULL)) {
+ return MOTION_TARGET_VIEW_FOCUS_OFF;
+ }
+
+ if (elm_object_focus_get(ugd->naviframe)) {
+ return MOTION_TARGET_VIEW_FOCUS_ON;
+ } else {
+ return MOTION_TARGET_VIEW_FOCUS_OFF;
+ }
+}
+
+
+static void __motion_shake_cb(unsigned int event_type, sensor_event_data_t *event_data, void *data)
+{
+ __FUNC_ENTER__;
+
+ gboolean motion_activated = FALSE;
+ struct ug_data *ugd = (struct ug_data *) data;
+ if (NULL == ugd) {
+ DBG(LOG_ERROR,"NULL pointer!");
+ return;
+ }
+ TARGET_VIEW_FOCUS focus_state = __motion_target_view_focus_get(ugd);
+
+ DBG(LOG_DEBUG, "event type: %d, focus state: %d\n", event_type, focus_state);
+
+ if (focus_state != MOTION_TARGET_VIEW_FOCUS_ON) {
+ return;
+ }
+
+ if (vconf_get_bool(VCONFKEY_SETAPPL_MOTION_ACTIVATION,
+ (void *)&motion_activated)) {
+ DBG(LOG_ERROR,"Get motion activation status fail");
+ return;
+ }
+
+ if (FALSE == motion_activated) {
+ DBG(LOG_INFO,"Motion value is false");
+ return;
+ }
+
+ if (vconf_get_bool(VCONFKEY_SETAPPL_USE_SHAKE,
+ (void *)&motion_activated)) {
+ DBG(LOG_ERROR, "Get use shake status fail");
+ return;
+ }
+
+ if (FALSE == motion_activated) {
+ DBG(LOG_INFO,"Shake status is false");
+ return;
+ }
+
+ int ret = -1;
+ const char *btn_text = NULL;
+
+ if (NULL == ugd) {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return;
+ }
+
+ wfd_refresh_wifi_direct_state(ugd);
+
+ if (NULL == ugd->scan_toolbar) {
+ DBG(LOG_ERROR, "NULL == ugd->scan_toolbar\n");
+ return;
+ }
+
+ btn_text = elm_object_part_text_get(ugd->scan_toolbar, "default");
+ if (NULL == btn_text) {
+ DBG(LOG_ERROR, "Incorrect button text(NULL)\n");
+ return;
+ }
+
+ GList *iterator = NULL;
+
+ if (0 == strcmp(btn_text, _("IDS_WIFI_SK4_SCAN"))) {
+ if (WIFI_DIRECT_STATE_CONNECTED == ugd->wfd_status) {
+ ret = wfd_client_disconnect(NULL);
+ if (ret != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed wfd_client_disconnect() [%d]\n", ret);
+ __FUNC_EXIT__;
+ return;
+ }
+
+ if (ugd->multi_connect_mode != WFD_MULTI_CONNECT_MODE_NONE) {
+ wfd_free_multi_selected_peers(ugd);
+ } else {
+ /* update the connecting icon */
+ for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
+ ((device_type_s *)iterator->data)->conn_status = PEER_CONN_STATUS_DISCONNECTED;
+ wfd_ug_view_refresh_glitem(((device_type_s *)iterator->data)->gl_item);
+ }
+ }
+ } else if (WIFI_DIRECT_STATE_DEACTIVATED == ugd->wfd_status) {
+ wfd_client_switch_on(ugd);
+ } else if ((WIFI_DIRECT_STATE_DISCOVERING == ugd->wfd_status) || (WIFI_DIRECT_STATE_ACTIVATED == ugd->wfd_status)) {
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
+ ret = wifi_direct_start_discovery_specific_channel(false, 1, WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
+ if (ret != WIFI_DIRECT_ERROR_NONE) {
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
+ DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", ret);
+ wifi_direct_cancel_discovery();
+ }
+ }
+ }
+
+ __FUNC_EXIT__;
+}
+
+void motion_create(struct ug_data *ugd)
+{
+ int ret = -1;
+
+ motion_handle = sf_connect(MOTION_SENSOR);
+ if (motion_handle < 0) {
+ DBG(LOG_ERROR, "Failed Operation sf_connect.\n");
+ return;
+ }
+ ret = sf_register_event(motion_handle, MOTION_ENGINE_EVENT_SHAKE, NULL,
+ __motion_shake_cb, ugd);
+ if (ret < 0) {
+ DBG(LOG_ERROR, "Failed Operation sf_register_event. [%d]\n", ret);
+ goto fail;
+ }
+ ret = sf_start(motion_handle, 0);
+ if (ret < 0) {
+ DBG(LOG_ERROR, "Failed Operation sf_start. [%d]\n", ret);
+ goto fail;
+ }
+
+ DBG(LOG_INFO, "Succesfully, Init Sensor Handle\n");
+ return;
+
+fail:
+ ret = sf_disconnect(motion_handle);
+ if (ret < 0) {
+ DBG(LOG_ERROR, "Failed Operation sf_disconnect. [%d]\n", ret);
+ }
+}
+
+void motion_destroy(void)
+{
+ int ret = -1;
+
+ if (motion_handle < 0) {
+ DBG(LOG_ERROR, "Motion Handle Not valid !!!");
+ return;
+ }
+
+ ret = sf_stop(motion_handle);
+ if (ret < 0) {
+ DBG(LOG_ERROR, "Failed Operation sf_stop. [%d]\n", ret);
+ }
+ ret = sf_unregister_event(motion_handle, MOTION_ENGINE_EVENT_SHAKE);
+ if (ret < 0) {
+ DBG(LOG_ERROR, "Failed Operation sf_unregister_event. [%d]\n", ret);
+ }
+ ret = sf_disconnect(motion_handle);
+ if (ret < 0) {
+ DBG(LOG_ERROR, "Failed Operation sf_disconnect. [%d]\n", ret);
+ }
+}
diff --git a/ug-wifidirect/src/wfd_ug.c b/ug-wifidirect/src/wfd_ug.c
index 9c43fca..de5db8c 100755..100644
--- a/ug-wifidirect/src/wfd_ug.c
+++ b/ug-wifidirect/src/wfd_ug.c
@@ -27,13 +27,18 @@
#include <libintl.h>
#include <sys/utsname.h>
+#include <vconf.h>
#include <Elementary.h>
#include <ui-gadget-module.h>
-#include <wifi-direct.h>
+#include <app_control.h>
+#include <wifi-direct.h>
#include "wfd_ug.h"
#include "wfd_ug_view.h"
#include "wfd_client.h"
+#ifdef MOTION_CONTROL_ENABLE
+#include "wfd_motion_control.h"
+#endif
void initialize_gen_item_class();
@@ -44,386 +49,837 @@ struct ug_data *wfd_get_ug_data()
return global_ugd;
}
+static void __wfd_main_vconf_change_cb(keynode_t *key, void *data)
+{
+ __FUNC_ENTER__;
+ WFD_RET_IF(NULL == key, "ERROR : key is NULL !!\n");
+ WFD_RET_IF(NULL == data, "ERROR : data is NULL");
+ struct ug_data *ugd = (struct ug_data *) data;
+
+ char *vconf_name = vconf_keynode_get_name(key);
+
+ if (!g_strcmp0(vconf_name, VCONFKEY_SETAPPL_DEVICE_NAME_STR)){
+ char *name_value = NULL;
+ name_value = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
+ WFD_RET_IF (!name_value, "Get string is failed");
+ DBG(LOG_INFO,"name : %s", name_value);
+
+ if (ugd->device_name_item && g_strcmp0(ugd->dev_name, name_value))
+ wfd_ug_view_refresh_glitem(ugd->device_name_item);
+
+ free(name_value);
+ } else {
+ DBG(LOG_ERROR, "vconf_name is error");
+ }
+ __FUNC_EXIT__;
+}
+
+#ifdef WIFI_STATE_CB
+static void _wifi_on_state_cb(keynode_t *key, void *data)
+{
+ WFD_RET_IF(NULL == key, "ERROR : key is NULL !!\n");
+ WFD_RET_IF(NULL == data, "ERROR : data is NULL");
+
+ struct ug_data *ugd = (struct ug_data *)data;
+ int wifi_state = 0;
+
+ if (vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state) < 0) {
+ DBG(LOG_ERROR, "Failed to get vconf VCONFKEY_WIFI_STATE\n");
+ return;
+ }
+
+ DBG(LOG_INFO, "WiFi State [%d]\n", wifi_state);
+ if (wifi_state > VCONFKEY_WIFI_OFF && wifi_state < VCONFKEY_WIFI_STATE_MAX) {
+ if (WIFI_DIRECT_ERROR_NONE != wifi_direct_get_state(&ugd->wfd_status)) {
+ DBG(LOG_ERROR, "Failed to Get WiFi Direct State");
+ return;
+ }
+ if (ugd->wfd_status <= WIFI_DIRECT_STATE_DEACTIVATING) {
+ DBG(LOG_INFO, "Activate WiFi Direct...");
+ if (FALSE != wfd_client_switch_on(ugd)) {
+ DBG(LOG_ERROR, "Failed to Activate WiFi Direct");
+ }
+ }
+ }
+}
+#endif
+
+
+static void __wfd_hotspot_mode_vconf_change_cb(keynode_t *key, void *data)
+{
+ DBG(LOG_INFO, "__wfd_hotspot_mode_vconf_change_cb");
+ if (NULL == key || NULL == data) {
+ DBG(LOG_INFO, "Invalid parameters \n");
+ return;
+ }
+ struct ug_data *ugd = (struct ug_data *) data;
+ int hotspot_mode = 0;
+ int res = 0;
+
+ res = vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &hotspot_mode);
+ if (res) {
+ WDS_LOGE("Failed to get vconf value for PLMN(%d)", res);
+ return;
+ }
+ DBG(LOG_INFO, "__wfd_hotspot_mode_vconf_change_cb mode %d", hotspot_mode);
+
+ if (VCONFKEY_MOBILE_HOTSPOT_MODE_NONE == hotspot_mode) {
+ if (NULL != ugd->act_popup) {
+ evas_object_del(ugd->act_popup);
+ }
+#ifdef WFD_ON_OFF_GENLIST
+ wfd_ug_refresh_on_off_check(ugd);
+#endif
+ } else if (hotspot_mode == VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI ||
+ hotspot_mode == VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI_AP) {
+ if (NULL != ugd->warn_popup) {
+ evas_object_del(ugd->warn_popup);
+ ugd->warn_popup = NULL;
+ }
+ }
+
+}
+
+Ea_Theme_Color_Table *_color_table_set(void)
+{
+ Ea_Theme_Color_Table *table;
+
+ table = ea_theme_color_table_new(COLOR_TABLE);
+ DBG(LOG_INFO, "Wi-Fi direct color table : %p", table);
+ ea_theme_colors_set(table, EA_THEME_STYLE_DEFAULT);
+ return table;
+}
+
+Ea_Theme_Font_Table *_font_table_set(void)
+{
+ Ea_Theme_Font_Table *table;
+
+ table = ea_theme_color_table_new(FONT_TABLE);
+ DBG(LOG_INFO, "Wi-Fi direct font table : %p", table);
+ ea_theme_fonts_set(table);
+
+ return table;
+}
+
+/**
+ * This function let the ug create backgroud
+ * @return backgroud
+ * @param[in] ugd the pointer to the parent object
+ * @param[in] ugd the pointer to the main data structure
+ */
static Evas_Object *_create_bg(Evas_Object *parent, char *style)
{
- __FUNC_ENTER__;
- Evas_Object *bg;
+ __FUNC_ENTER__;
+ Evas_Object *bg;
- bg = elm_bg_add(parent);
- evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
- elm_object_style_set(bg, style);
- elm_win_resize_object_add(parent, bg);
- evas_object_show(bg);
+ bg = elm_bg_add(parent);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_style_set(bg, style);
+ evas_object_show(bg);
- __FUNC_EXIT__;
- return bg;
+ __FUNC_EXIT__;
+ return bg;
}
+/**
+ * This function let the ug create full view
+ * @return full view
+ * @param[in] ugd the pointer to the parent object
+ * @param[in] ugd the pointer to the main data structure
+ */
static Evas_Object *_create_fullview(Evas_Object *parent, struct ug_data *ugd)
{
- __FUNC_ENTER__;
- Evas_Object *base;
-
- if(parent == NULL)
- {
- DBG(LOG_ERROR, "Incorrenct parameter");
- return NULL;
- }
-
- /* Create Full view */
- base = elm_layout_add(parent);
- if(!base)
- {
- DBG(LOG_ERROR, "Failed to add layout");
- return NULL;
- }
-
- elm_layout_theme_set(base, "layout", "application", "default");
- evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
- evas_object_size_hint_align_set(base, EVAS_HINT_FILL, EVAS_HINT_FILL);
-
- __FUNC_EXIT__;
- return base;
+ __FUNC_ENTER__;
+ Evas_Object *base;
+
+ if (parent == NULL) {
+ DBG(LOG_ERROR, "Incorrenct parameter");
+ return NULL;
+ }
+
+ /* Create Full view */
+ base = elm_layout_add(parent);
+ if (!base) {
+ DBG(LOG_ERROR, "Failed to add layout");
+ return NULL;
+ }
+
+ elm_layout_theme_set(base, "layout", "application", "default");
+ evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(base, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ __FUNC_EXIT__;
+ return base;
}
+/**
+ * This function let the ug create frame view
+ * @return frame view
+ * @param[in] ugd the pointer to the parent object
+ * @param[in] ugd the pointer to the main data structure
+ */
static Evas_Object *_create_frameview(Evas_Object *parent, struct ug_data *ugd)
{
- __FUNC_ENTER__;
- Evas_Object *base;
-
- if(parent == NULL)
- {
- DBG(LOG_ERROR, "Incorrenct parameter");
- return NULL;
- }
-
- /* Create Frame view */
- base = elm_layout_add(parent);
- if(!base)
- {
- DBG(LOG_ERROR, "Failed to add layout");
- return NULL;
- }
-
- elm_layout_theme_set(base, "layout", "application", "default");
- evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
- evas_object_size_hint_align_set(base, EVAS_HINT_FILL, EVAS_HINT_FILL);
-
- __FUNC_EXIT__;
- return base;
+ __FUNC_ENTER__;
+ Evas_Object *base;
+
+ if (parent == NULL) {
+ DBG(LOG_ERROR, "Incorrenct parameter");
+ return NULL;
+ }
+
+ /* Create Frame view */
+ base = elm_layout_add(parent);
+ if (!base) {
+ DBG(LOG_ERROR, "Failed to add layout");
+ return NULL;
+ }
+
+ elm_layout_theme_set(base, "layout", "application", "default");
+ evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(base, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ __FUNC_EXIT__;
+ return base;
}
+/**
+ * This function let the ug destroy the ug
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ */
+void wfd_destroy_ug(void *data)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *) data;
+
+#ifdef WFD_DBUS_LAUNCH
+ if (ugd->dbus_cancellable != NULL) {
+ g_cancellable_cancel(ugd->dbus_cancellable);
+ g_object_unref(ugd->dbus_cancellable);
+ ugd->dbus_cancellable = NULL;
+ if (ugd->conn) {
+ g_object_unref(ugd->conn);
+ ugd->conn = NULL;
+ }
+ DBG(LOG_INFO, "Cancelled dbus call");
+ return;
+ } else
+#endif
+ {
+ DBG(LOG_INFO, "dbus_cancellable is NULL");
+ ug_destroy_me(ugd->ug);
+ }
-void destroy_wfd_ug_view(void *data)
+ __FUNC_EXIT__;
+ return;
+}
+
+static void wfd_ug_layout_del_cb(void *data , Evas *e, Evas_Object *obj, void *event_info)
{
- __FUNC_ENTER__;
+ __FUNC_ENTER__;
+
+ struct ug_data *ugd = (struct ug_data *) data;
+ if (ugd == NULL) {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)");
+ return;
+ }
+
+ wfd_client_free_raw_discovered_peers(ugd);
+ wfd_ug_view_free_peers(ugd);
+ destroy_wfd_ug_view(ugd);
- struct ug_data *ugd = (struct ug_data*) data;
+ __FUNC_EXIT__;
+}
+
+#ifdef WFD_DBUS_LAUNCH
+/**
+ * This function let the ug initialize wfd
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] evas the pointer to the evas canvas
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
+static void _wfd_init_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
+{
+ __FUNC_ENTER__;
+ int res = -1;
+ struct ug_data *ugd = (struct ug_data *)data;
+ WFD_RET_IF(ugd == NULL || ugd->base == NULL, "Incorrect parameter(NULL)\n");
- if(ugd->genlist)
- {
- evas_object_del(ugd->genlist);
- ugd->genlist = NULL;
- }
+ evas_object_event_callback_del(ugd->base, EVAS_CALLBACK_SHOW, _wfd_init_cb);
- if(ugd->naviframe)
- {
- evas_object_del(ugd->naviframe);
- ugd->naviframe = NULL;
- }
+ res = launch_wifi_direct_manager(ugd);
+ if (res != 0) {
+ DBG(LOG_ERROR, "Failed to launch wifi direct manager\n");
+ }
- __FUNC_EXIT__;
+ __FUNC_EXIT__;
+ return;
}
+#endif
-static void *on_create(ui_gadget_h ug, enum ug_mode mode, service_h service,
- void *priv)
+static void *on_create(ui_gadget_h ug, enum ug_mode mode, app_control_h control, void *priv)
{
- __FUNC_ENTER__;
- struct ug_data *ugd;
- int res = 0;
-
- if (!ug || !priv)
- return NULL;
-
- ugd = priv;
- ugd->ug = ug;
-
- bindtextdomain(PACKAGE, LOCALEDIR);
-
- ugd->win = ug_get_window();
- if (!ugd->win)
- return NULL;
-
- if (mode == UG_MODE_FULLVIEW)
- ugd->base = _create_fullview(ugd->win, ugd);
- else
- ugd->base = _create_frameview(ugd->win, ugd);
-
- if(ugd->base)
- {
- ugd->bg = _create_bg(ugd->win, "group_list");
- elm_object_part_content_set(ugd->base, "elm.swallow.bg", ugd->bg);
- }
- else
- {
- DBG(LOG_ERROR, "Failed to create base layout\n");
- return NULL;
- }
-
- 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;
+ __FUNC_ENTER__;
+ struct ug_data *ugd;
+ int wfd_status = -1;
+ int rots[4] = { 0, 90, 180, 270 };
+ int ret;
+
+ if (!ug || !priv) {
+ return NULL;
+ }
+
+ ugd = priv;
+ ugd->ug = ug;
+
+ bindtextdomain(PACKAGE, LOCALEDIR);
+
+ ugd->win = ug_get_window();
+ if (!ugd->win) {
+ return NULL;
+ }
+
+ elm_win_wm_rotation_available_rotations_set(ugd->win, rots, 1);
+
+
+ /* check the input parameters from app at first */
+ ugd->wfds = NULL;
+ ugd->device_filter = -1; /* show all devices */
+ ugd->is_auto_exit = false;
+ ugd->is_multi_connect = true;
+ ugd->is_init_ok = false;
+ ugd->title = strdup(_("IDS_WIFI_BODY_WI_FI_DIRECT_ABB"));
+
+ if (control) {
+ char *wfds = NULL;
+ char *device_filter = NULL;
+ char *auto_exit = NULL;
+ char *multi_connect = NULL;
+ char *title = NULL;
+ char* viewtype = NULL;
+
+ /*
+ * get the control name
+ * default value: Wi-Fi Direct
+ */
+ ret = app_control_get_extra_data(control, "wfds", &wfds);
+ if (ret == APP_CONTROL_ERROR_NONE && wfds) {
+ DBG_SECURE(LOG_INFO, "Wfds name: %s", wfds);
+ ugd->wfds = strdup(wfds);
+ WFD_IF_FREE_MEM(wfds);
+ }
+
+ ret = app_control_get_extra_data(control, "viewtype", &viewtype);
+ if(ret == APP_CONTROL_ERROR_NONE && viewtype) {
+ DBG(LOG_INFO, "viewtype: %s\n", viewtype);
+ ugd->view_type = strdup(viewtype);
+ WFD_IF_FREE_MEM(viewtype);
+ }
+
+ /*
+ * get the device filter
+ * default value: NULL
+ */
+ ret = app_control_get_extra_data(control, "device_filter", &device_filter);
+ if (ret == APP_CONTROL_ERROR_NONE && device_filter) {
+ DBG(LOG_INFO, "Device filter: %s", device_filter);
+ if (0 == strncmp(device_filter, "computer", 8)) {
+ ugd->device_filter = WFD_DEVICE_TYPE_COMPUTER;
+ } else if (0 == strncmp(device_filter, "input_device", 12)) {
+ ugd->device_filter = WFD_DEVICE_TYPE_INPUT_DEVICE;
+ } else if (0 == strncmp(device_filter, "printer", 6)) {
+ ugd->device_filter = WFD_DEVICE_TYPE_PRINTER;
+ } else if (0 == strncmp(device_filter, "camera", 6)) {
+ ugd->device_filter = WFD_DEVICE_TYPE_CAMERA;
+ } else if (0 == strncmp(device_filter, "storage", 7)) {
+ ugd->device_filter = WFD_DEVICE_TYPE_STORAGE;
+ } else if (0 == strncmp(device_filter, "network_infra", 13)) {
+ ugd->device_filter = WFD_DEVICE_TYPE_NW_INFRA;
+ } else if (0 == strncmp(device_filter, "display", 7)) {
+ ugd->device_filter = WFD_DEVICE_TYPE_DISPLAYS;
+ } else if (0 == strncmp(device_filter, "multimedia_device", 17)) {
+ ugd->device_filter = WFD_DEVICE_TYPE_MM_DEVICES;
+ } else if (0 == strncmp(device_filter, "game_device", 11)) {
+ ugd->device_filter = WFD_DEVICE_TYPE_GAME_DEVICES;
+ } else if (0 == strncmp(device_filter, "telephone", 9)) {
+ ugd->device_filter = WFD_DEVICE_TYPE_TELEPHONE;
+ } else if (0 == strncmp(device_filter, "audio", 5)) {
+ ugd->device_filter = WFD_DEVICE_TYPE_AUDIO;
+ } else {
+ ugd->device_filter = WFD_DEVICE_TYPE_OTHER;
+ }
+ WFD_IF_FREE_MEM(device_filter);
+ }
+
+ /*
+ * get whether support auto exit after connection
+ * default value: false
+ */
+ ret = app_control_get_extra_data(control, "auto_exit", &auto_exit);
+ if (ret == APP_CONTROL_ERROR_NONE && auto_exit) {
+ DBG(LOG_INFO, "Auto exit: %s", auto_exit);
+ if (0 == strncmp(auto_exit, "on", 2)) {
+ ugd->is_auto_exit = true;
+ } else {
+ ugd->is_auto_exit = false;
+ }
+ WFD_IF_FREE_MEM(auto_exit);
+ }
+
+ /*
+ * get whether support multi connection,
+ * default value: true
+ */
+ ret = app_control_get_extra_data(control, "multi_connect", &multi_connect);
+ if (ret == APP_CONTROL_ERROR_NONE && multi_connect) {
+ DBG(LOG_INFO, "Multi connection: %s", multi_connect);
+ if (0 == strncmp(multi_connect, "off", 2)) {
+ ugd->is_multi_connect = false;
+ } else {
+ ugd->is_multi_connect = true;
+ }
+ WFD_IF_FREE_MEM(multi_connect);
+ }
+
+ /*
+ * get the title of UG
+ * default value: Wi-Fi Direct
+ */
+ ret = app_control_get_extra_data(control, "title_string", &title);
+ if (ret == APP_CONTROL_ERROR_NONE && title) {
+ DBG(LOG_INFO, "Title of UG: %s", title);
+ WFD_IF_FREE_MEM(ugd->title);
+ ugd->title = strdup(title);
+ WFD_IF_FREE_MEM(title);
+ }
+ }
+
+ if (mode == UG_MODE_FULLVIEW) {
+ ugd->base = _create_fullview(ugd->win, ugd);
+ } else {
+ ugd->base = _create_frameview(ugd->win, ugd);
+ }
+
+ if (ugd->base) {
+ evas_object_event_callback_add(ugd->base, EVAS_CALLBACK_DEL, wfd_ug_layout_del_cb, ugd);
+ ugd->bg = _create_bg(ugd->win, "group_list");
+ elm_object_part_content_set(ugd->base, "elm.swallow.bg", ugd->bg);
+ } else {
+ DBG(LOG_ERROR, "Failed to create base layout\n");
+ return NULL;
+ }
+
+ /* check status of wifi-direct from vconf */
+ wfd_status = wfd_get_vconf_status();
+ if (wfd_status < 0) {
+ return NULL;
+ }
+
+ /* Enablee Changeable UI feature */
+ ea_theme_changeable_ui_enabled_set(EINA_TRUE);
+
+ ugd->color_table = _color_table_set();
+ ugd->font_table = _font_table_set();
+
+ /* draw UI */
+ initialize_gen_item_class();
+ create_wfd_ug_view(ugd);
+ wfd_ug_view_init_genlist(ugd, true);
+#ifdef MOTION_CONTROL_ENABLE
+ motion_create(ugd);
+#endif
+
+ /*
+ * if not deactivated, do initialization at once;
+ * otherwise, do initialization later
+ */
+ if (wfd_status != VCONFKEY_WIFI_DIRECT_DEACTIVATED) {
+ init_wfd_client(ugd);
+ } else {
+ ugd->wfd_status = WIFI_DIRECT_STATE_DEACTIVATED;
+
+#ifdef WFD_DBUS_LAUNCH
+ evas_object_event_callback_add(ugd->base, EVAS_CALLBACK_SHOW, _wfd_init_cb, ugd);
+#else
+ ret = init_wfd_client(ugd);
+ WFD_RETV_IF(ret != 0, NULL, "Failed to initialize WFD client library\n");
+
+ /* Activate WiFi Direct */
+ DBG(LOG_INFO, "Activating WiFi Direct...");
+ if (ugd->wfd_status <= WIFI_DIRECT_STATE_DEACTIVATING) {
+ ret = wfd_client_switch_on(ugd);
+ WFD_RETV_IF(ret != 0, NULL, "Failed to activate WFD\n");
+ }
+#endif
+ }
+ ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_DEVICE_NAME_STR,
+ __wfd_main_vconf_change_cb, ugd);
+ if (ret) {
+ DBG(LOG_ERROR, "Failed to set vconf notification callback(VCONFKEY_SETAPPL_DEVICE_NAME_STR)");
+ }
+
+#ifdef WIFI_STATE_CB
+ ret = vconf_notify_key_changed(VCONFKEY_WIFI_STATE, _wifi_on_state_cb, ugd);
+ if (ret) {
+ DBG(LOG_ERROR, "Failed to set vconf notification callback(VCONFKEY_WIFI_STATE)");
+
+ }
+#endif
+
+ ret = vconf_notify_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE,
+ __wfd_hotspot_mode_vconf_change_cb, ugd);
+ if (ret) {
+ DBG(LOG_ERROR, "Failed to set vconf notification callback(MOBILE_HOTSPOT_MODE)");
+ }
+
+ __FUNC_EXIT__;
+ return ugd->base;
}
-static void on_start(ui_gadget_h ug, service_h service, void *priv)
+static void on_start(ui_gadget_h ug, app_control_h control, void *priv)
{
- __FUNC_ENTER__;
- struct ug_data *ugd;
- int res;
-
- if (!ug || !priv)
- return;
-
- ugd = priv;
-
- struct utsname kernel_info;
- res = uname(&kernel_info);
- if(res != 0)
- {
- DBG(LOG_ERROR, "Failed to detect target type\n");
- }
- else
- {
- DBG(LOG_VERBOSE, "HW ID of this device [%s]\n", kernel_info.machine);
- if(strncmp(kernel_info.machine, "arm", 3) != 0)
- {
- wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_NOT_SUPPORTED_DEVICE"), POPUP_TYPE_TERMINATE);
- return;
- }
- }
- __FUNC_EXIT__;
+ __FUNC_ENTER__;
+ struct ug_data *ugd;
+ int res;
+
+ if (!ug || !priv) {
+ return;
+ }
+
+ ugd = priv;
+
+ struct utsname kernel_info;
+ res = uname(&kernel_info);
+ if (res != 0) {
+ DBG(LOG_ERROR, "Failed to detect target type\n");
+ } else {
+ DBG_SECURE(LOG_INFO, "HW ID of this device [%s]\n", kernel_info.machine);
+ if (strncmp(kernel_info.machine, "arm", 3) != 0) {
+ wfd_ug_warn_popup(ugd, _("IDS_ST_POP_NOT_SUPPORTED"), POPUP_TYPE_TERMINATE_NOT_SUPPORT);
+ return;
+ }
+ }
+
+ __FUNC_EXIT__;
}
-static void on_pause(ui_gadget_h ug, service_h service, void *priv)
+static void on_pause(ui_gadget_h ug, app_control_h control, void *priv)
{
- __FUNC_ENTER__;
- __FUNC_EXIT__;
+ __FUNC_ENTER__;
+
+ WFD_RET_IF(ug == NULL || priv == NULL, "The param is NULL\n");
+ struct ug_data *ugd = priv;
+ ugd->is_paused = true;
+
+ wfd_refresh_wifi_direct_state(ugd);
+ DBG(LOG_INFO, "on pause, wfd status: %d\n", ugd->wfd_status);
+
+ if ((WIFI_DIRECT_STATE_DISCOVERING == ugd->wfd_status) &&
+ (WIFI_DIRECT_ERROR_NONE != wifi_direct_cancel_discovery())) {
+ DBG(LOG_ERROR, "Failed to send cancel discovery state [%d]\n", ugd->wfd_status);
+ __FUNC_EXIT__;
+ return;
+ }
+
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_STOPPED;
+
+ __FUNC_EXIT__;
}
-static void on_resume(ui_gadget_h ug, service_h service, void *priv)
+static void on_resume(ui_gadget_h ug, app_control_h control, void *priv)
{
- __FUNC_ENTER__;
- __FUNC_EXIT__;
+ __FUNC_ENTER__;
+
+ WFD_RET_IF(ug == NULL || priv == NULL, "The param is NULL\n");
+ struct ug_data *ugd = priv;
+ ugd->is_paused = false;
+ int ret;
+ wfd_refresh_wifi_direct_state(ugd);
+ DBG(LOG_INFO, "on resume, status: %d\n", ugd->wfd_status);
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_STOPPED;
+
+ elm_genlist_realized_items_update(ugd->genlist);
+
+ if (ugd->wfd_status > WIFI_DIRECT_STATE_DEACTIVATED && ugd->wfd_status < WIFI_DIRECT_STATE_CONNECTED) {
+ DBG(LOG_INFO, "Start discovery again\n");
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
+ ret = wifi_direct_start_discovery_specific_channel(false, 1, WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
+ if (ret != WIFI_DIRECT_ERROR_NONE) {
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
+ DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", ret);
+ wifi_direct_cancel_discovery();
+ }
+ }
+
+ __FUNC_EXIT__;
}
-static void on_destroy(ui_gadget_h ug, service_h service, void *priv)
+static void on_destroy(ui_gadget_h ug, app_control_h control, void *priv)
{
- __FUNC_ENTER__;
-
- if (!ug || !priv)
- {
- DBG(LOG_ERROR, "The param is NULL\n");
- return;
- }
-
- struct ug_data *ugd = priv;
- if (ugd == NULL || ugd->base == NULL)
- {
- DBG(LOG_ERROR, "The param is NULL\n");
- return;
- }
-
- deinit_wfd_client(ugd);
- DBG(LOG_VERBOSE, "WFD client deregistered");
-
- destroy_wfd_ug_view(ugd);
- DBG(LOG_VERBOSE, "Destroying About item");
-
- wfd_ug_view_free_peers(ugd);
-
- 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)
- {
- evas_object_del(ugd->base);
- ugd->base = NULL;
- }
-
- __FUNC_EXIT__;
- return;
+ __FUNC_ENTER__;
+
+ WFD_RET_IF(ug == NULL || priv == NULL, "The param is NULL\n");
+
+ struct ug_data *ugd = priv;
+ int ret;
+ WFD_RET_IF(ugd->base == NULL, "The param is NULL\n");
+
+#ifdef MOTION_CONTROL_ENABLE
+ motion_destroy();
+#endif
+
+ /* DeInit WiFi Direct */
+ ret = deinit_wfd_client(ugd);
+ if (ret) {
+ DBG(LOG_ERROR,"Failed to DeInit WiFi Direct");
+ }
+
+ if (ugd->scan_toolbar) {
+ wfd_ug_view_refresh_button(ugd->scan_toolbar,
+ _("IDS_WIFI_SK4_SCAN"), FALSE);
+ }
+
+ ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_DEVICE_NAME_STR,
+ __wfd_main_vconf_change_cb);
+ if (ret == -1) {
+ DBG(LOG_ERROR,"Failed to ignore vconf key callback\n");
+ }
+
+#ifdef WIFI_STATE_CB
+ ret = vconf_ignore_key_changed(VCONFKEY_WIFI_STATE, _wifi_on_state_cb);
+ if (ret == -1) {
+ DBG(LOG_ERROR,"Failed to ignore vconf key callback\n");
+ }
+#endif
+
+ ret = vconf_ignore_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE,
+ __wfd_hotspot_mode_vconf_change_cb);
+ if (ret == -1) {
+ DBG(LOG_ERROR,"Failed to ignore vconf key callback MOBILE_HOTSPOT_MODE\n");
+ }
+
+ wfd_ug_view_free_peers(ugd);
+ WFD_IF_FREE_MEM(ugd->title);
+ WFD_IF_FREE_MEM(ugd->wfds);
+ WFD_IF_FREE_MEM(ugd->view_type);
+
+ WFD_IF_DEL_OBJ(ugd->bg);
+
+#ifdef WFD_DBUS_LAUNCH
+ if (ugd->base)
+ evas_object_event_callback_del(ugd->base, EVAS_CALLBACK_SHOW, _wfd_init_cb);
+#endif
+ WFD_IF_DEL_OBJ(ugd->base);
+ DBG(LOG_INFO, "WFD client deregistered");
+
+ __FUNC_EXIT__;
+ return;
}
-static void on_message(ui_gadget_h ug, service_h msg, service_h service,
- void *priv)
+static void on_message(ui_gadget_h ug, app_control_h msg, app_control_h control, void *priv)
{
- __FUNC_ENTER__;
- __FUNC_EXIT__;
+ __FUNC_ENTER__;
+ char* app_msg = NULL;
+ struct ug_data *ugd = priv;
+
+ if (!ug || !priv) {
+ DBG(LOG_ERROR, "The param is NULL\n");
+ return;
+ }
+
+ if (msg) {
+ app_control_get_extra_data(msg, "msg", &app_msg);
+ DBG(LOG_DEBUG, "Msg from app: %s", app_msg);
+
+ if (!strcmp(app_msg, "destroy")) {
+ if(!ugd->rename_popup) {
+ DBG(LOG_INFO, "Destroying UG.");
+ wfd_ug_view_free_peers(ugd);
+ wfd_destroy_ug(ugd);
+ }
+ }
+ WFD_IF_FREE_MEM(app_msg);
+ }
+ __FUNC_EXIT__;
}
-static void on_event(ui_gadget_h ug, enum ug_event event, service_h service,
- void *priv)
+static void on_event(ui_gadget_h ug, enum ug_event event, app_control_h control, void *priv)
{
- __FUNC_ENTER__;
-
- if (!ug || !priv)
- {
- DBG(LOG_ERROR, "The param is NULL\n");
- return;
- }
-
- 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;
- }
-
- __FUNC_EXIT__;
+ __FUNC_ENTER__;
+
+ if (!ug || !priv) {
+ DBG(LOG_ERROR, "The param is NULL\n");
+ return;
+ }
+
+ switch (event) {
+ case UG_EVENT_LOW_MEMORY:
+ DBG(LOG_INFO, "UG_EVENT_LOW_MEMORY\n");
+ break;
+ case UG_EVENT_LOW_BATTERY:
+ DBG(LOG_INFO, "UG_EVENT_LOW_BATTERY\n");
+ break;
+ case UG_EVENT_LANG_CHANGE:
+ DBG(LOG_INFO, "UG_EVENT_LANG_CHANGE\n");
+ break;
+ case UG_EVENT_ROTATE_PORTRAIT:
+ _ctxpopup_move();
+ DBG(LOG_INFO, "UG_EVENT_ROTATE_PORTRAIT\n");
+ break;
+ case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN:
+ DBG(LOG_INFO, "UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN\n");
+ break;
+ case UG_EVENT_ROTATE_LANDSCAPE:
+ _ctxpopup_move();
+ DBG(LOG_INFO, "UG_EVENT_ROTATE_LANDSCAPE\n");
+ break;
+ case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN:
+ _ctxpopup_move();
+ DBG(LOG_INFO, "UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN\n");
+ break;
+ default:
+ DBG(LOG_INFO, "default\n");
+ break;
+ }
+
+ __FUNC_EXIT__;
}
-static void on_key_event(ui_gadget_h ug, enum ug_key_event event,
- service_h service, void *priv)
+static void on_key_event(ui_gadget_h ug, enum ug_key_event event, app_control_h control, void *priv)
{
- __FUNC_ENTER__;
-
- if (!ug || !priv)
- {
- DBG(LOG_ERROR, "The param is NULL\n");
- return;
- }
-
- switch (event)
- {
- case UG_KEY_EVENT_END:
- DBG(LOG_VERBOSE, "UG_KEY_EVENT_END\n");
- break;
- default:
- break;
- }
-
- __FUNC_EXIT__;
+ __FUNC_ENTER__;
+
+ if (!ug || !priv) {
+ DBG(LOG_ERROR, "The param is NULL\n");
+ return;
+ }
+
+ switch (event) {
+ case UG_KEY_EVENT_END:
+ DBG(LOG_INFO, "UG_KEY_EVENT_END\n");
+ break;
+ default:
+ break;
+ }
+
+ __FUNC_EXIT__;
}
UG_MODULE_API int UG_MODULE_INIT(struct ug_module_ops *ops)
{
- __FUNC_ENTER__;
- struct ug_data *ugd;
-
- if (!ops)
- {
- DBG(LOG_ERROR, "The param is NULL\n");
- return -1;
- }
-
- ugd = calloc(1, sizeof(struct ug_data));
- if (ugd == NULL)
- {
- DBG(LOG_ERROR, "Failed to allocate memory for UG data\n");
- return -1;
- }
-
- global_ugd = ugd;
-
- ops->create = on_create;
- ops->start = on_start;
- ops->pause = on_pause;
- ops->resume = on_resume;
- ops->destroy = on_destroy;
- ops->message = on_message;
- ops->event = on_event;
- ops->key_event = on_key_event;
- ops->priv = ugd;
- ops->opt = UG_OPT_INDICATOR_ENABLE;
-
- __FUNC_EXIT__;
- return 0;
+ __FUNC_ENTER__;
+ struct ug_data *ugd;
+
+ if (!ops) {
+ DBG(LOG_ERROR, "The param is NULL\n");
+ return -1;
+ }
+
+ ugd = calloc(1, sizeof(struct ug_data));
+ if (ugd == NULL) {
+ DBG(LOG_ERROR, "Failed to allocate memory for UG data\n");
+ return -1;
+ }
+
+ global_ugd = ugd;
+
+ ops->create = on_create;
+ ops->start = on_start;
+ ops->pause = on_pause;
+ ops->resume = on_resume;
+ ops->destroy = on_destroy;
+ ops->message = on_message;
+ ops->event = on_event;
+ ops->key_event = on_key_event;
+ ops->priv = ugd;
+ ops->opt = UG_OPT_INDICATOR_ENABLE;
+
+ __FUNC_EXIT__;
+ return 0;
}
UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops)
{
- __FUNC_ENTER__;
+ __FUNC_ENTER__;
+
+ struct ug_data *ugd;
- struct ug_data *ugd;
+ if (!ops) {
+ DBG(LOG_ERROR, "The param is NULL\n");
+ return;
+ }
- if (!ops)
- {
- DBG(LOG_ERROR, "The param is NULL\n");
- return;
- }
+ ugd = ops->priv;
- ugd = ops->priv;
+ WFD_IF_FREE_MEM(ugd);
- if (ugd)
- free(ugd);
+ __FUNC_EXIT__;
+}
- __FUNC_EXIT__;
+UG_MODULE_API int setting_plugin_reset(app_control_h control, void *priv)
+{
+ __FUNC_ENTER__;
+ int res = -1;
+ wifi_direct_state_e state;
+
+ 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_get_state(&state);
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to get link status. [%d]\n", res);
+ return -1;
+ }
+
+ if (state < WIFI_DIRECT_STATE_ACTIVATING) {
+ DBG(LOG_INFO, "No need to reset Wi-Fi Direct.\n");
+ } else {
+ /*if connected, disconnect all devices*/
+ if (WIFI_DIRECT_STATE_CONNECTED == state) {
+ res = wifi_direct_disconnect_all();
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to send disconnection request to all. [%d]\n", res);
+ return -1;
+ }
+ }
+
+ res = wifi_direct_deactivate();
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to reset Wi-Fi Direct. [%d]\n", res);
+ return -1;
+ }
+ }
+
+ res = wifi_direct_deinitialize();
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to deinitialize wifi direct. [%d]\n", res);
+ return -1;
+ }
+
+ __FUNC_EXIT__;
+ return 0;
}
+
+UG_MODULE_API int setting_plugin_search_init(app_control_h control, void *priv, char** applocale)
+{
+ __FUNC_ENTER__;
+
+ *applocale = strdup("ug-setting-wifidirect-efl");
+ void *node = NULL;
+
+ Eina_List **pplist = (Eina_List**)priv;
+
+ node = setting_plugin_search_item_add("IDS_WIFI_BUTTON_MULTI_CONNECT", "viewtype:IDS_WIFI_BUTTON_MULTI_CONNECT", NULL, 5, NULL);
+ *pplist = eina_list_append(*pplist, node);
+
+ __FUNC_EXIT__;
+ return 0;
+}
+
diff --git a/ug-wifidirect/src/wfd_ug_about_view.c b/ug-wifidirect/src/wfd_ug_about_view.c
deleted file mode 100644
index 5c1f7d2..0000000
--- a/ug-wifidirect/src/wfd_ug_about_view.c
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
-* 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
index 836c5b3..0a0a025 100755
--- a/ug-wifidirect/src/wfd_ug_genlist.c
+++ b/ug-wifidirect/src/wfd_ug_genlist.c
@@ -18,8 +18,6 @@
*/
#include <libintl.h>
-
-#include <assert.h>
#include <glib.h>
#include <Elementary.h>
@@ -31,15 +29,17 @@
#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 device_name_title_itc;
+#ifdef WFD_ON_OFF_GENLIST
+Elm_Gen_Item_Class wfd_onoff_itc;
+#endif
+Elm_Gen_Item_Class device_name_itc;
Elm_Gen_Item_Class title_itc;
+Elm_Gen_Item_Class multi_view_title_itc;
Elm_Gen_Item_Class peer_itc;
+Elm_Gen_Item_Class title_no_device_itc;
Elm_Gen_Item_Class noitem_itc;
-Elm_Gen_Item_Class help_itc;
-Elm_Gen_Item_Class button_itc;
+Elm_Gen_Item_Class title_available_itc;
Elm_Gen_Item_Class title_conn_itc;
Elm_Gen_Item_Class peer_conn_itc;
@@ -49,163 +49,226 @@ 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 select_all_multi_connect_itc;
Elm_Gen_Item_Class title_conn_failed_itc;
Elm_Gen_Item_Class peer_conn_failed_itc;
+#ifdef WFD_ON_OFF_GENLIST
+static char *_gl_wfd_onoff_text_get(void *data, Evas_Object *obj,
+ const char *part)
+{
+ __FUNC_ENTER__;
+
+ struct ug_data *ugd = (struct ug_data *) data;
+ DBG(LOG_INFO, "%s", part);
+ WFD_RETV_IF(ugd == NULL, NULL, "Incorrect parameter(NULL)\n");
+ wfd_get_vconf_device_name(ugd);
+ char *dev_name;
+
+ if (!g_strcmp0(part,"elm.text.main.left.bottom")) {
+ DBG(LOG_INFO, "%s", ugd->dev_name);
+ if (ugd->dev_name) {
+ dev_name = elm_entry_utf8_to_markup(ugd->dev_name);
+ if (NULL == dev_name) {
+ DBG(LOG_ERROR, "elm_entry_utf8_to_markup failed.\n");
+ __FUNC_EXIT__;
+ return NULL;
+ }
+ __FUNC_EXIT__;
+ return dev_name;
+ }
+ } else if (!g_strcmp0(part, "elm.text.sub.left.top")) {
+ return g_strdup(_("IDS_ST_HEADER_MY_DEVICE_NAME"));
+ }
+ __FUNC_EXIT__;
+ return NULL;
+}
-static char *_gl_header_label_get(void *data, Evas_Object * obj, const char *part)
+static Evas_Object *_gl_wfd_onoff_content_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;
+ __FUNC_ENTER__;
+
+ struct ug_data *ugd = (struct ug_data *) data;
+ WFD_RETV_IF(ugd == NULL, NULL, "Incorrect parameter(NULL)\n");
+ Evas_Object *btn = NULL;
+ Evas_Object *icon = NULL;
+ icon = elm_layout_add(obj);
+
+ if (g_strcmp0(part, "elm.icon.2")) {
+ return NULL;
+ }
+ elm_layout_theme_set(icon, "layout", "list/C/type.3", "default");
+ btn = elm_check_add(icon);
+ /* Wi-Fi on indication button */
+ btn= elm_check_add(icon);
+ elm_object_style_set(btn, "on&off");
+ evas_object_propagate_events_set(btn, EINA_FALSE);
+ elm_check_state_set(btn, ugd->wfd_onoff);
+ evas_object_propagate_events_set(btn, EINA_FALSE);
+ evas_object_smart_callback_add(btn, "changed",_onoff_changed_cb, ugd);
+ ugd->on_off_check = btn;
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ elm_layout_content_set(icon, "elm.swallow.content", btn);
+ __FUNC_EXIT__;
+ return icon;
}
+#endif
-static Evas_Object *_gl_header_icon_get(void *data, Evas_Object * obj, const char *part)
+/**
+ * This function let the ug get the label of header
+ * @return the label of header
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] part the pointer to the part of item
+ */
+static char *_gl_device_name_label_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;
+ __FUNC_ENTER__;
+
+ struct ug_data *ugd = (struct ug_data *) data;
+ DBG(LOG_INFO, "%s", part);
+ WFD_RETV_IF(ugd == NULL, NULL, "Incorrect parameter(NULL)\n");
+ wfd_get_vconf_device_name(ugd);
+ char *dev_name;
+
+ if (!g_strcmp0(part,"elm.text.main.left.bottom")) {
+ DBG(LOG_INFO, "%s", ugd->dev_name);
+ if (ugd->dev_name) {
+ dev_name = elm_entry_utf8_to_markup(ugd->dev_name);
+ if (NULL == dev_name) {
+ DBG(LOG_ERROR, "elm_entry_utf8_to_markup failed.\n");
+ __FUNC_EXIT__;
+ return NULL;
+ }
+ __FUNC_EXIT__;
+ return dev_name;
+ }
+ } else if (!g_strcmp0(part, "elm.text.sub.left.top")) {
+ return g_strdup(_("IDS_ST_HEADER_MY_DEVICE_NAME"));
+ }
+ __FUNC_EXIT__;
+ return NULL;
+}
+
+/**
+ * This function let the ug get the label of title
+ * @return the label of titile
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] part the pointer to the part of item
+ */
+static char *_gl_title_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ __FUNC_ENTER__;
+
+ WFD_RETV_IF(data == NULL, NULL, "Incorrect parameter(NULL)\n");
+ DBG(LOG_INFO, "%s", part);
+ if (!g_strcmp0(part, "elm.text.main")) {
+ return g_strdup(_("IDS_WIFI_HEADER_AVAILABLE_DEVICES_ABB"));
+ }
+ __FUNC_EXIT__;
+ return NULL;
}
-static char *_gl_name_label_get(void *data, Evas_Object *obj, const char *part)
+static char *_gl_title_no_device_label_get(void *data, Evas_Object *obj,
+ const char *part)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
+ __FUNC_ENTER__;
- if(data == NULL)
- {
- DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
- return NULL;
- }
+ WFD_RETV_IF(data == NULL, NULL, "Incorrect parameter(NULL)\n");
+ DBG(LOG_INFO, "%s", part);
+ if (!g_strcmp0(part, "elm.text.main")) {
+ return g_strdup(_("IDS_WIFI_HEADER_AVAILABLE_DEVICES_ABB"));
+ }
- DBG(LOG_VERBOSE, "%s", part);
+ __FUNC_EXIT__;
+ return NULL;
+}
- 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);
- }
+static char *_gl_multi_title_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ __FUNC_ENTER__;
- __FUNC_EXIT__;
+ WFD_RETV_IF(data == NULL, NULL, "Incorrect parameter(NULL)\n");
+ if (!g_strcmp0(part, "elm.text.main")) {
+ return g_strdup(_("IDS_WIFI_HEADER_AVAILABLE_DEVICES_ABB"));
+ }
- return NULL;
+ __FUNC_EXIT__;
+ return NULL;
}
+static Evas_Object *_gl_multi_title_content_get(void *data, Evas_Object *obj, const char *part)
+{
+ __FUNC_ENTER__;
+
+ Evas_Object *progressbar = NULL;
+ struct ug_data *ugd = (struct ug_data *) data;
+ WFD_RETV_IF(ugd == NULL, NULL, "Incorrect parameter(NULL)\n");
-static char *_gl_title_label_get(void *data, Evas_Object *obj,
- const char *part)
+ if (!g_strcmp0(part, "elm.icon")) {
+ if (TITLE_CONTENT_TYPE_SCANNING == ugd->title_content_mode) {
+ progressbar = elm_progressbar_add(obj);
+ elm_object_style_set(progressbar, "process_small");
+ elm_progressbar_horizontal_set(progressbar, EINA_TRUE);
+ elm_progressbar_pulse(progressbar, EINA_TRUE);
+ evas_object_show(progressbar);
+ return progressbar;
+ }
+ }
+
+ __FUNC_EXIT__;
+ return NULL;
+}
+
+static char *_gl_available_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;
+ __FUNC_ENTER__;
+
+ if (data == NULL) {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return NULL;
+ }
+ DBG(LOG_INFO, "available- %s", part);
+ if (!g_strcmp0(part, "elm.text.main")) {
+ return g_strdup(_("IDS_WIFI_HEADER_AVAILABLE_DEVICES_ABB"));
+ }
+
+ __FUNC_EXIT__;
+ return NULL;
}
+/**
+ * This function let the ug get the content of titile
+ * @return the content of titile
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] part the pointer to the part of item
+ */
static Evas_Object *_gl_title_content_get(void *data, Evas_Object *obj, const char *part)
{
+ __FUNC_ENTER__;
+
Evas_Object *progressbar = NULL;
- struct ug_data *ugd = (struct ug_data*) data;
+ 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) {
+ DBG(LOG_INFO, "Title content- %s", part);
+
+ if (!g_strcmp0(part, "elm.icon")) {
+ if (TITLE_CONTENT_TYPE_SCANNING == ugd->title_content_mode) {
progressbar = elm_progressbar_add(obj);
- elm_object_style_set(progressbar, "list_process_small");
+ elm_object_style_set(progressbar, "process_small");
elm_progressbar_horizontal_set(progressbar, EINA_TRUE);
elm_progressbar_pulse(progressbar, EINA_TRUE);
evas_object_show(progressbar);
@@ -214,589 +277,756 @@ static Evas_Object *_gl_title_content_get(void *data, Evas_Object *obj, const ch
}
}
+ __FUNC_EXIT__;
return progressbar;
}
-static char *_gl_peer_label_get(void *data, Evas_Object * obj, const char *part)
+/**
+ * This function let the ug get the label of peer item
+ * @return the label of peer item
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] part the pointer to the part of item
+ */
+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);
+ __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, };
+ char *ssid;
+
+ DBG(LOG_INFO, "%s", part);
+
+ if (data == NULL) {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return NULL;
+ }
+
+ if (!g_strcmp0(part, "elm.text.main.left.top")) {
+ if (strlen(peer->ssid) != 0) {
+ ssid = elm_entry_utf8_to_markup(peer->ssid);
+ if (NULL == ssid) {
+ DBG(LOG_ERROR, "elm_entry_utf8_to_markup failed.\n");
+ __FUNC_EXIT__;
+ return NULL;
+ }
+ __FUNC_EXIT__;
+ return ssid;
+ }
+ } else if (!g_strcmp0(part, "elm.text.sub.left.bottom")) {
+ switch (peer->conn_status) {
+ case PEER_CONN_STATUS_DISCONNECTED:
+ g_strlcpy(buf, _("IDS_CHATON_BODY_AVAILABLE"), WFD_GLOBALIZATION_STR_LENGTH);
+ break;
+ case PEER_CONN_STATUS_CONNECTING:
+ g_strlcpy(buf, _("IDS_WIFI_BODY_CONNECTING_ING"), WFD_GLOBALIZATION_STR_LENGTH);
+ break;
+ case PEER_CONN_STATUS_CONNECTED:
+ if (peer->is_group_owner == FALSE) {
+ g_strlcpy(buf, _("IDS_COM_BODY_CONNECTED_M_STATUS"), WFD_GLOBALIZATION_STR_LENGTH);
+ } else {
+ g_strlcpy(buf, _("IDS_CHATON_BODY_AVAILABLE"), WFD_GLOBALIZATION_STR_LENGTH);
+ }
+ break;
+ case PEER_CONN_STATUS_FAILED_TO_CONNECT:
+ g_strlcpy(buf, _("IDS_CHATON_HEADER_CONNECTION_FAILED_ABB2"), WFD_GLOBALIZATION_STR_LENGTH);
+ break;
+ case PEER_CONN_STATUS_WAIT_FOR_CONNECT:
+ g_strlcpy(buf, _("IDS_WIFI_BODY_WAITING_FOR_CONNECTION_M_STATUS_ABB"), WFD_GLOBALIZATION_STR_LENGTH);
+ break;
+ default:
+ g_strlcpy(buf, _("IDS_CHATON_BODY_AVAILABLE"), WFD_GLOBALIZATION_STR_LENGTH);
+ break;
+ }
+ } else {
+ __FUNC_EXIT__;
+ return NULL;
+ }
+
+ __FUNC_EXIT__;
+ return g_strdup(buf);
}
-static Evas_Object *_gl_peer_icon_get(void *data, Evas_Object * obj, const char *part)
+/**
+ * This function let the ug get the icon of peer item
+ * @return the icon of peer item
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] part the pointer to the part of item
+ */
+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)
- {
+ __FUNC_ENTER__;
+
+ assertm_if(NULL == obj, "NULL!!");
+ assertm_if(NULL == part, "NULL!!");
+ device_type_s *peer = (device_type_s *) data;
+ Evas_Object *icon = NULL;
+ Evas_Object *layout = NULL;
+
+ if (data == NULL) {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return NULL;
+ }
+ DBG(LOG_INFO, "part = %s", part);
+ if (!g_strcmp0(part, "elm.icon.2")) {
+ DBG(LOG_INFO, "elm.icon.2 - connection status [%d]\n", peer->conn_status);
+ if (peer->conn_status == PEER_CONN_STATUS_CONNECTING) {
+ layout = elm_layout_add(obj);
+ elm_layout_theme_set(layout, "layout", "list/C/type.2", "default");
+ icon = elm_progressbar_add(layout);
+ elm_object_style_set(icon, "process_medium");
+ elm_progressbar_pulse(icon, EINA_TRUE);
+ } else if (peer->conn_status == PEER_CONN_STATUS_CONNECTED) {
+ return NULL;
+ }
+ evas_object_show(icon);
+ elm_layout_content_set(layout, "elm.swallow.content", icon);
+ } else if (!g_strcmp0(part, "elm.icon.1")) {
+ DBG(LOG_INFO, "elm.icon.1 - category [%d]\n", peer->category);
+ char *img_name = NULL;
+ layout = elm_layout_add(obj);
+ elm_layout_theme_set(layout, "layout", "list/B/type.3", "default");
+ /*
+ * the icon of connected device is
+ * different from available and busy device
+ */
+ 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;
- }
+ img_name = 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;
- }
+ img_name = 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;
- }
+ img_name = 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;
- }
+ img_name = 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;
- }
+ img_name = 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;
- }
+ img_name = 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;
- }
+ img_name = 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;
+ if (peer->sub_category == WIFI_DIRECT_SECONDARY_DEVICE_TYPE_MULTIMEDIA_STB) {
+ img_name = WFD_ICON_DEVICE_STB;
+ } else if (peer->sub_category == WIFI_DIRECT_SECONDARY_DEVICE_TYPE_MULTIMEDIA_MS_MA_ME) {
+ img_name = WFD_ICON_DEVICE_DONGLE;
+ } else if (peer->sub_category == WIFI_DIRECT_SECONDARY_DEVICE_TYPE_MULTIMEDIA_PVP) {
+ img_name = WFD_ICON_DEVICE_BD;
} else {
- img_path = WFD_ICON_DEVICE_MULTIMEDIA_DEVICE;
+ img_name = WFD_ICON_DEVICE_MULTIMEDIA;
}
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;
- }
+ img_name = WFD_ICON_DEVICE_GAMING;
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;
- }
+ img_name = 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;
+ if (peer->sub_category == WIFI_DIRECT_SECONDARY_DEVICE_TYPE_AUDIO_TUNER) {
+ img_name = WFD_ICON_DEVICE_HOME_THEATER;
} else {
- img_path = WFD_ICON_DEVICE_AUDIO_DEVICE;
+ img_name = WFD_ICON_DEVICE_HEADSET;
}
break;
default:
- if (peer->conn_status == PEER_CONN_STATUS_CONNECTED) {
- img_path = WFD_ICON_DEVICE_COMPUTER_CONNECT;
- } else {
- img_path = WFD_ICON_DEVICE_COMPUTER;
- }
+ img_name = WFD_ICON_DEVICE_UNKNOWN;
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;
-}
+ }
+
+ icon = elm_image_add(layout);
+ elm_image_file_set(icon, WFD_UG_EDJ_PATH, img_name);
+ evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ ea_theme_object_color_set(icon, "AO001");
+ evas_object_show(icon);
+ evas_object_propagate_events_set(icon, EINA_FALSE);
+ elm_layout_content_set(layout, "elm.swallow.content", icon);
+ }
+ if (layout)
+ evas_object_show(layout);
+ __FUNC_EXIT__;
+ return layout;
+}
-static char *_gl_noitem_text_get(void *data, Evas_Object * obj,
- const char *part)
+/**
+ * This function let the ug get the icon of peer item
+ * @return the icon of peer item
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] part the pointer to the part of item
+ */
+static Evas_Object *_gl_conn_peer_icon_get(void *data, Evas_Object *obj, const char *part)
{
- __FUNC_ENTER__;
+ __FUNC_ENTER__;
+ assertm_if(NULL == obj, "NULL!!");
+ assertm_if(NULL == part, "NULL!!");
+ device_type_s *peer = (device_type_s *) data;
+ Evas_Object *icon = NULL;
+ Evas_Object *layout = NULL;
- if(data == NULL)
- {
+ if (data == NULL) {
DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
return NULL;
}
+ DBG(LOG_INFO, "part[%s]\n", part);
+ if (!g_strcmp0(part, "elm.icon.1")) {
+ DBG(LOG_INFO, "elm.icon.1 - category [%d]\n", peer->category);
+ char *img_name = NULL;
+ layout = elm_layout_add(obj);
+ elm_layout_theme_set(layout, "layout", "list/B/type.3", "default");
+ /*
+ * the icon of connected device is
+ * different from available and busy device
+ */
+ switch (peer->category) {
+ case WFD_DEVICE_TYPE_COMPUTER:
+ img_name = WFD_ICON_DEVICE_COMPUTER;
+ break;
+ case WFD_DEVICE_TYPE_INPUT_DEVICE:
+ img_name = WFD_ICON_DEVICE_INPUT_DEVICE;
+ break;
+ case WFD_DEVICE_TYPE_PRINTER:
+ img_name = WFD_ICON_DEVICE_PRINTER;
+ break;
+ case WFD_DEVICE_TYPE_CAMERA:
+ img_name = WFD_ICON_DEVICE_CAMERA;
+ break;
+ case WFD_DEVICE_TYPE_STORAGE:
+ img_name = WFD_ICON_DEVICE_STORAGE;
+ break;
+ case WFD_DEVICE_TYPE_NW_INFRA:
+ img_name = WFD_ICON_DEVICE_NETWORK_INFRA;
+ break;
+ case WFD_DEVICE_TYPE_DISPLAYS:
+ img_name = WFD_ICON_DEVICE_DISPLAY;
+ break;
+ case WFD_DEVICE_TYPE_MM_DEVICES:
+ if (peer->sub_category == WIFI_DIRECT_SECONDARY_DEVICE_TYPE_MULTIMEDIA_STB) {
+ img_name = WFD_ICON_DEVICE_STB;
+ } else if (peer->sub_category == WIFI_DIRECT_SECONDARY_DEVICE_TYPE_MULTIMEDIA_MS_MA_ME) {
+ img_name = WFD_ICON_DEVICE_DONGLE;
+ } else if (peer->sub_category == WIFI_DIRECT_SECONDARY_DEVICE_TYPE_MULTIMEDIA_PVP) {
+ img_name = WFD_ICON_DEVICE_BD;
+ } else {
+ img_name = WFD_ICON_DEVICE_MULTIMEDIA;
+ }
+ break;
+ case WFD_DEVICE_TYPE_GAME_DEVICES:
+ img_name = WFD_ICON_DEVICE_GAMING;
+ break;
+ case WFD_DEVICE_TYPE_TELEPHONE:
+ img_name = WFD_ICON_DEVICE_TELEPHONE;
+ break;
+ case WFD_DEVICE_TYPE_AUDIO:
+ if (peer->sub_category == WIFI_DIRECT_SECONDARY_DEVICE_TYPE_AUDIO_TUNER) {
+ img_name = WFD_ICON_DEVICE_HOME_THEATER;
+ } else {
+ img_name = WFD_ICON_DEVICE_HEADSET;
+ }
+ break;
+ default:
+ img_name = WFD_ICON_DEVICE_UNKNOWN;
+ break;
+ }
+ icon = elm_image_add(layout);
+ elm_image_file_set(icon, WFD_UG_EDJ_PATH, img_name);
+ evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ ea_theme_object_color_set(icon, "AO001");
+ evas_object_show(icon);
+ evas_object_propagate_events_set(icon, EINA_FALSE);
+ elm_layout_content_set(layout, "elm.swallow.content", icon);
+ }
+ if (layout)
+ evas_object_show(layout);
__FUNC_EXIT__;
- return strdup(_("IDS_WFD_NOCONTENT"));
+ return layout;
}
-
-static char *_gl_help_label_get(void *data, Evas_Object * obj, const char *part)
+/**
+ * This function let the ug get the text of no device item
+ * @return the text of no device item
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] part the pointer to the part of item
+ */
+static char *_gl_noitem_text_get(void *data, Evas_Object *obj, const char *part)
{
- __FUNC_ENTER__;
- DBG(LOG_VERBOSE, "%s", part);
- __FUNC_EXIT__;
- return strdup("Help");
-}
+ __FUNC_ENTER__;
+
+ if (data == NULL) {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return NULL;
+ }
+ DBG(LOG_INFO,"part = %s",part);
+ if (!g_strcmp0(part, "elm.text.main.left")) {
+ return g_strdup(_("IDS_BT_BODY_NO_DEVICES_FOUND_ABB"));
+ }
+ __FUNC_EXIT__;
+ return NULL;
+}
-static Evas_Object *_gl_button_get(void *data, Evas_Object * obj, const char *part)
+/**
+ * This function let the ug get the title label of connected device list
+ * @return the title label of connected device list
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] part the pointer to the part of item
+ */
+static char *_gl_conn_dev_title_label_get(void *data, Evas_Object *obj, const char *part)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
+ __FUNC_ENTER__;
+ if (data == NULL) {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return NULL;
+ }
+ DBG(LOG_INFO,"part = %s",part);
+ if (!g_strcmp0(part, "elm.text.main")) {
+ return g_strdup(_("IDS_ST_HEADER_CONNECTED_DEVICES"));
+ }
- DBG(LOG_VERBOSE, "%s", part);
+ __FUNC_EXIT__;
+ return NULL;
+}
- ugd->multi_btn = elm_button_add(obj);
+char* ConvertRGBAtoHex(int r, int g, int b, int a)
+{
+ int hexcolor = 0;
+ char *string = NULL;
+ string = g_try_malloc0(sizeof(char )* 255);
+ if (string == NULL) {
+ return string;
+ }
+ hexcolor = (r << 24) + (g << 16) + (b << 8) + a;
+ sprintf(string, "%08x", hexcolor );
+ return string;
+}
- wfd_refresh_wifi_direct_state(ugd);
+/**
+ * This function let the ug get the label of connected device
+ * @return the label of connected device
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] part the pointer to the part of item
+ */
+static char *_gl_peer_conn_dev_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ __FUNC_ENTER__;
- 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");
+ assertm_if(NULL == obj, "NULL!!");
+ assertm_if(NULL == part, "NULL!!");
+ device_type_s *peer = (device_type_s *) data;
+ DBG(LOG_INFO, "%s", part);
+ char *det = NULL;
+ char *buf = NULL;
+ char *str = NULL;
+ char *ssid;
+ int r = 0, g = 0, b = 0, a = 0;
- // Don't connect "clicked" callback.
- return ugd->multi_btn;
+ if (data == NULL) {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return NULL;
}
- 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");
+ if (!g_strcmp0(part, "elm.text.main.left.top")) {
+ if (strlen(peer->ssid) != 0) {
+ ssid = elm_entry_utf8_to_markup(peer->ssid);
+ if (NULL == ssid) {
+ DBG(LOG_ERROR, "elm_entry_utf8_to_markup failed.\n");
+ __FUNC_EXIT__;
+ return NULL;
+ }
+ __FUNC_EXIT__;
+ return ssid;
}
- else
- {
- elm_object_text_set(ugd->multi_btn, _("IDS_WFD_BUTTON_DISCONNECT"));
- DBG(LOG_VERBOSE, "button: Disconnect\n");
+ } else if(!g_strcmp0(part, "elm.text.sub.left.bottom")){
+ det = elm_entry_utf8_to_markup(_("IDS_COM_BODY_CONNECTED_M_STATUS"));
+ ea_theme_color_get("T024S",&r, &g, &b, &a,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL);
+ str = ConvertRGBAtoHex(r, g, b, a);
+ buf = g_strdup_printf("<color=#%s>%s</color>",
+ str, det);
+ if (det != NULL) {
+ g_free(det);
}
+ if (str != NULL) {
+ g_free(str);
+ }
+ __FUNC_EXIT__;
+ return buf;
}
- 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;
+ __FUNC_EXIT__;
+ return NULL;
}
-
-static char *_gl_conn_dev_title_label_get(void *data, Evas_Object *obj,
+/**
+ * This function let the ug get the title label of connected failed device list
+ * @return the label of connected device
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] part the pointer to the part of item
+ */
+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;
- }
+ __FUNC_ENTER__;
- if (!strcmp(part, "elm.text"))
- {
- return strdup(_("IDS_WFD_BODY_CONNECTED_DEVICES"));
- }
+ if (data == NULL) {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return NULL;
+ }
- __FUNC_EXIT__;
+ if (!g_strcmp0(part, "elm.text")) {
+ return g_strdup(_("IDS_WIFI_SBODY_NOT_CONNECTED_M_STATUS_ABB"));
+ }
- return NULL;
+ __FUNC_EXIT__;
+ return NULL;
}
-
-static char *_gl_peer_conn_dev_label_get(void *data, Evas_Object * obj, const char *part)
+/**
+ * This function let the ug get the label of connected failed device
+ * @return the label of connected device
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] part the pointer to the part of item
+ */
+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;
-
+ device_type_s *peer = (device_type_s *) data;
char buf[WFD_GLOBALIZATION_STR_LENGTH] = { 0, };
- DBG(LOG_VERBOSE, "%s", part);
- if(data == NULL)
- {
+ char *ssid;
+ DBG(LOG_INFO, "%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);
+ if (!g_strcmp0(part, "elm.text.1")) {
+ if (strlen(peer->ssid) != 0) {
+ ssid = elm_entry_utf8_to_markup(peer->ssid);
+ if (NULL == ssid) {
+ DBG(LOG_ERROR, "elm_entry_utf8_to_markup failed.\n");
+ __FUNC_EXIT__;
+ return NULL;
+ }
+ __FUNC_EXIT__;
+ return ssid;
+ }
+ } else {
+ g_strlcpy(buf, _("IDS_CHATON_HEADER_CONNECTION_FAILED_ABB2"),
+ WFD_GLOBALIZATION_STR_LENGTH);
__FUNC_EXIT__;
- return strdup(buf);
+ return g_strdup(buf);
}
+ return NULL;
}
-static char *_gl_conn_failed_dev_title_label_get(void *data, Evas_Object *obj,
- const char *part)
+/**
+ * This function let the ug get the title label of multi connect list
+ * @return the label of connected device
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] part the pointer to the part of item
+ */
+static char *_gl_multi_connect_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;
- }
+ __FUNC_ENTER__;
+ struct ug_data *ugd = wfd_get_ug_data();
- if (!strcmp(part, "elm.text"))
- {
- return strdup(IDS_WFD_BODY_FAILED_DEVICES);
- }
+ if (data == NULL) {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return NULL;
+ }
+ DBG(LOG_INFO, "%s", part);
- __FUNC_EXIT__;
+ if (!g_strcmp0(part, "elm.text.main")) {
+ if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_IN_PROGRESS) {
+ return g_strdup(_("IDS_WIFI_HEADER_AVAILABLE_DEVICES_ABB"));
+ } else if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_COMPLETED) {
+ return g_strdup(_("IDS_WIFI_SBODY_NOT_CONNECTED_M_STATUS_ABB"));
+ }
+ }
- return NULL;
+ __FUNC_EXIT__;
+ return NULL;
}
-
-static char *_gl_peer_conn_failed_dev_label_get(void *data, Evas_Object * obj, const char *part)
+/**
+ * This function let the ug get the title label of select all in multi connect
+ * @return the label of select all string
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] part the pointer to the part of item
+ */
+static char *_gl_multi_connect_select_all_title_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)
- {
+ if (data == NULL) {
DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
return NULL;
}
+ DBG(LOG_INFO, "%s", part);
- if (!strcmp(part, "elm.text.1"))
- {
- return strdup(peer->ssid);
- }
- else
- {
- g_strlcpy(buf, _("IDS_WFD_FAILED_TO_CONNECT"),
- WFD_GLOBALIZATION_STR_LENGTH);
+ if (!g_strcmp0(part, "elm.text.main.left")) {
__FUNC_EXIT__;
- return strdup(buf);
+ return g_strdup(_("IDS_WIFI_BODY_SELECT_ALL"));
}
+ __FUNC_EXIT__;
+ return NULL;
}
-static char *_gl_multi_connect_dev_title_label_get(void *data, Evas_Object *obj,
- const char *part)
+/**
+ * This function let the ug get the icon of select all genlist
+ * @return the icon of select all genlist
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] part the pointer to the part of item
+ */
+static Evas_Object *_wfd_gl_select_all_icon_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;
-}
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *) data;
+ Evas_Object *check = NULL;
+ Evas_Object *icon_layout = NULL;
+ DBG(LOG_INFO, "Part %s", part);
+
+ if (!g_strcmp0(part, "elm.icon.2")) {
+ icon_layout = elm_layout_add(obj);
+ elm_layout_theme_set(icon_layout, "layout", "list/C/type.2", "default");
+ DBG(LOG_INFO, "Part %s", part);
+ check = elm_check_add(icon_layout);
+ ugd->select_all_icon = check;
+ if (ugd->is_select_all_checked == EINA_TRUE) {
+ elm_check_state_set(ugd->select_all_icon, TRUE);
+ }
+ elm_object_style_set(check, "default/genlist");
+ evas_object_propagate_events_set(check, EINA_FALSE);
+ evas_object_smart_callback_add(check, "changed",
+ wfd_genlist_select_all_check_changed_cb, (void *)data);
+ elm_layout_content_set(icon_layout, "elm.swallow.content", check);
+ }
+ __FUNC_EXIT__;
+ return icon_layout;
+}
+
+/**
+ * This function let the ug get the title label of busy device list
+ * @return the label of connected device
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] part the pointer to the part of item
+ */
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;
- }
+ __FUNC_ENTER__;
- if (!strcmp(part, "elm.text"))
- {
- return strdup(_("IDS_WFD_BODY_BUSY_DEVICES"));
- }
+ if (data == NULL) {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return NULL;
+ }
+ DBG(LOG_INFO, "%s", part);
- __FUNC_EXIT__;
+ if (!g_strcmp0(part,"elm.text.main")) {
+ return g_strdup(_("IDS_ST_HEADER_BUSY_DEVICES"));
+ }
- return NULL;
+ __FUNC_EXIT__;
+ return NULL;
}
-
-static char *_gl_peer_busy_dev_label_get(void *data, Evas_Object * obj, const char *part)
+/**
+ * This function let the ug get the label of busy device
+ * @return the label of connected device
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] part the pointer to the part of item
+ */
+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;
+ device_type_s *peer = (device_type_s *) data;
char buf[WFD_GLOBALIZATION_STR_LENGTH] = { 0, };
- DBG(LOG_VERBOSE, "%s", part);
- if(data == NULL)
- {
+ char *ssid;
+ DBG(LOG_INFO, "%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);
+
+ DBG(LOG_INFO, "peer->ssid = %s", peer->ssid);
+
+ if (!g_strcmp0(part, "elm.text.main.left.top")) {
+ if (strlen(peer->ssid) != 0) {
+ ssid = elm_entry_utf8_to_markup(peer->ssid);
+ if (NULL == ssid) {
+ DBG(LOG_ERROR, "elm_entry_utf8_to_markup failed.\n");
+ __FUNC_EXIT__;
+ return NULL;
+ }
+ __FUNC_EXIT__;
+ return ssid;
+ }
+ } else if (!g_strcmp0(part, "elm.text.sub.left.bottom")) {
+ g_strlcpy(buf, _("IDS_ST_BODY_CONNECTED_WITH_ANOTHER_DEVICE_ABB"),
+ WFD_GLOBALIZATION_STR_LENGTH);
__FUNC_EXIT__;
- return strdup(buf);
+ return g_strdup(buf);
}
+ return NULL;
+
}
-static void _gl_peer_del(void *data, Evas_Object * obj)
+/**
+ * This function let the ug delete the peer item
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ */
+static void _gl_peer_del(void *data, Evas_Object *obj)
{
- __FUNC_ENTER__;
- assertm_if(NULL == obj, "NULL!!");
- assertm_if(NULL == data, "NULL!!");
+ __FUNC_ENTER__;
+
+ assertm_if(NULL == obj, "NULL!!");
+ assertm_if(NULL == data, "NULL!!");
- __FUNC_EXIT__;
- return;
+ __FUNC_EXIT__;
+ return;
}
+/**
+ * This function let the ug initialize the items of genlist
+ * @return void
+ */
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;
+ elm_theme_extension_add(NULL, WFD_UG_EDJ_PATH);
+
+ device_name_itc.item_style = "dialogue/2text.2";
+ device_name_itc.func.text_get = NULL;
+ device_name_itc.func.content_get = NULL;
+ device_name_itc.func.state_get = NULL;
+
+#ifdef WFD_ON_OFF_GENLIST
+ wfd_onoff_itc.item_style = "2line.bottom";
+ wfd_onoff_itc.func.text_get = _gl_wfd_onoff_text_get;
+ wfd_onoff_itc.func.content_get = _gl_wfd_onoff_content_get;
+ wfd_onoff_itc.func.state_get = NULL;
+ wfd_onoff_itc.func.del = NULL;
#endif
+
+
+ title_itc.item_style = "groupindex";
+ 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;
+
+ multi_view_title_itc.item_style = "groupindex";
+ multi_view_title_itc.func.text_get = _gl_multi_title_label_get;
+ multi_view_title_itc.func.content_get = _gl_multi_title_content_get;
+ multi_view_title_itc.func.state_get = NULL;
+ multi_view_title_itc.func.del = NULL;
+
+ title_no_device_itc.item_style = "groupindex";
+ title_no_device_itc.func.text_get = _gl_title_no_device_label_get;
+ title_no_device_itc.func.content_get = NULL;
+ title_no_device_itc.func.state_get = NULL;
+ title_no_device_itc.func.del = NULL;
+
+ title_available_itc.item_style = "groupindex";
+ title_available_itc.func.text_get = _gl_available_title_label_get;
+ title_available_itc.func.content_get = _gl_title_content_get;
+ title_available_itc.func.state_get = NULL;
+ title_available_itc.func.del = NULL;
+
+ peer_itc.item_style = "2line.top";
+ 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 = "1line";
+ 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;
+
+ title_conn_itc.item_style = "groupindex";
+ 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 = "2line.top";
+ peer_conn_itc.func.text_get = _gl_peer_conn_dev_label_get;
+ peer_conn_itc.func.content_get = _gl_conn_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 = "groupindex";
+ 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 = "2line.top";
+ 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 = "groupindex";
+ 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;
+
+ select_all_multi_connect_itc.item_style = "1line";
+ select_all_multi_connect_itc.func.text_get =
+ _gl_multi_connect_select_all_title_label_get;
+ select_all_multi_connect_itc.func.content_get = _wfd_gl_select_all_icon_get;
+ select_all_multi_connect_itc.func.state_get = NULL;
+ select_all_multi_connect_itc.func.del = NULL;
}
diff --git a/ug-wifidirect/src/wfd_ug_main_view.c b/ug-wifidirect/src/wfd_ug_main_view.c
index 1849e63..dfe5b73 100755..100644
--- a/ug-wifidirect/src/wfd_ug_main_view.c
+++ b/ug-wifidirect/src/wfd_ug_main_view.c
@@ -19,1135 +19,1955 @@
#include <libintl.h>
-
-#include <assert.h>
#include <glib.h>
#include <Elementary.h>
#include <vconf.h>
#include <ui-gadget-module.h>
+#include <app_control.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 scan_button_create(struct ug_data *ugd)
+{
+ __FUNC_ENTER__;
+ Evas_Object *btn;
+ btn = elm_button_add(ugd->layout);
+ /* Use "bottom" style button */
+ elm_object_style_set(btn, "bottom");
+ elm_object_domain_translatable_text_set(btn, PACKAGE, "IDS_WIFI_SK4_SCAN");
+ ugd->scan_toolbar = btn;
+ if (ugd->wfd_status <= WIFI_DIRECT_STATE_DEACTIVATING) {
+ wfd_ug_view_refresh_button(ugd->scan_toolbar, "IDS_WIFI_SK4_SCAN",
+ FALSE);
+ }
+ evas_object_smart_callback_add(btn, "clicked",_scan_btn_cb, (void *)ugd);
+ /* Set button into "toolbar" swallow part */
+ elm_object_part_content_set(ugd->layout, "button.big", btn);
+ evas_object_show(ugd->scan_toolbar);
-void _back_btn_cb(void *data, Evas_Object * obj, void *event_info)
+ __FUNC_EXIT__;
+}
+
+/**
+ * This function let the ug call it when click 'back' button
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
+Eina_Bool _back_btn_cb(void *data, Elm_Object_Item *it)
{
- __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
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *) data;
+ WFD_RETV_IF(ugd == NULL, FALSE, "The param is NULL\n");
int ret = -1;
- service_h service = NULL;
- ret = service_create(&service);
- if(ret)
- {
- DBG(LOG_ERROR, "Failed to create service");
- return;
+ bool owner = FALSE;
+ app_control_h control = NULL;
+
+#ifdef WFD_DBUS_LAUNCH
+ if (ugd->dbus_cancellable != NULL) {
+ g_cancellable_cancel(ugd->dbus_cancellable);
+ g_object_unref(ugd->dbus_cancellable);
+ ugd->dbus_cancellable = NULL;
+ if (ugd->conn) {
+ g_object_unref(ugd->conn);
+ ugd->conn = NULL;
+ }
+ DBG(LOG_INFO, "Cancel dbus call");
}
+#endif
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");
+ if (ugd->wfd_status <= WIFI_DIRECT_STATE_DEACTIVATING) {
+ DBG(LOG_INFO, "WiFi direct is already deactivated\n");
+ goto cleanup;
+ }
- ug_send_result(ugd->ug, service);
- service_destroy(service);
-#endif
- ug_destroy_me(ugd->ug);
+ if (NULL != ugd->mac_addr_connecting) {
+ if (ugd->is_conn_incoming) {
+ DBG(LOG_INFO, "Reject the incoming connection before client deregister \n");
+ ret = wifi_direct_reject_connection(ugd->mac_addr_connecting);
+ if (ret != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to send reject request [%d]\n", ret);
+ }
+ } else {
+ DBG(LOG_INFO, "Cancel the outgoing connection before client deregister \n");
+ ret = wifi_direct_cancel_connection(ugd->mac_addr_connecting);
+ if (ret != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed to send cancel request [%d]\n", ret);
+ }
+ }
+ ugd->mac_addr_connecting = NULL;
+ }
- __FUNC_EXIT__;
- return;
+ if (ugd->raw_connected_peer_cnt == 0) {
+ ret = wifi_direct_is_group_owner(&owner);
+ if (ret == WIFI_DIRECT_ERROR_NONE) {
+ if (owner) {
+ wifi_direct_destroy_group();
+ }
+ }
+ }
+
+cleanup:
+ wfd_ug_view_free_peers(ugd);
+ ret = app_control_create(&control);
+ if (ret) {
+ DBG(LOG_ERROR, "Failed to create control");
+ } else {
+ if (ugd->wfd_status > WIFI_DIRECT_STATE_CONNECTING) {
+ app_control_add_extra_data(control, "Connection", "TRUE");
+ } else {
+ app_control_add_extra_data(control, "Connection", "FALSE");
+ }
+
+ ug_send_result(ugd->ug, control);
+ app_control_destroy(control);
+ }
+
+ ug_destroy_me(ugd->ug);
+ __FUNC_EXIT__;
+ return FALSE;
}
-void _scan_btn_cb(void *data, Evas_Object * obj, void *event_info)
+void wfd_cancel_progressbar_stop_timer(struct ug_data *ugd)
{
- __FUNC_ENTER__;
+ __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
- Elm_Object_Item *btn = event_info;
- char *btn_text = NULL;
+ if(ugd->timer_stop_progress_bar > 0) {
+ g_source_remove(ugd->timer_stop_progress_bar);
+ }
+ ugd->timer_stop_progress_bar = 0;
- if (NULL == ugd || NULL == btn) {
- DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
- return;
- }
+ __FUNC_EXIT__;
+}
- 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);
+void wfd_cancel_not_alive_delete_timer(struct ug_data *ugd)
+{
+ __FUNC_ENTER__;
- /* 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->timer_delete_not_alive_peer > 0) {
+ g_source_remove(ugd->timer_delete_not_alive_peer);
}
+ ugd->timer_delete_not_alive_peer = 0;
+
+ __FUNC_EXIT__;
+}
+
+/**
+ * This function let the ug call it when click failed devices item
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
+void _gl_failed_peer_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ __FUNC_ENTER__;
- if (ugd->scan_btn) {
- wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_STOPSCAN"), TRUE);
+ struct ug_data *ugd = wfd_get_ug_data();
+ int ret = -1;
+
+ if (NULL == ugd) {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return;
}
- if (ugd->multi_scan_btn) {
- wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_STOPSCAN"), TRUE);
+ if (ugd->display_timer != NULL) {
+ ecore_timer_del(ugd->display_timer);
+ ugd->display_timer = NULL;
}
- } 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();
- }
+ DBG(LOG_INFO, "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_WIFI_BODY_CURRENT_CONNECTION_WILL_BE_DISCONNECTED_SO_THAT_SCANNING_CAN_START_CONTINUE_Q"), POP_TYPE_SCAN_AGAIN);
+ } else {
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
+ ret = wifi_direct_start_discovery_specific_channel(false, 1, WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
+ if (ret != WIFI_DIRECT_ERROR_NONE) {
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
+ DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", ret);
+ wifi_direct_cancel_discovery();
+ }
+ }
- __FUNC_EXIT__;
- return;
+ __FUNC_EXIT__;
+ return;
}
-Eina_Bool _is_wifi_on()
+/**
+ * This function let the ug call it when click 'scan' button
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
+void _scan_btn_cb(void *data, Evas_Object *obj, void *event_info)
{
- __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__;
+ __FUNC_ENTER__;
+
+ struct ug_data *ugd = (struct ug_data *) data;
+ if (NULL == ugd) {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return;
+ }
+ int ret = -1;
+ const char *btn_text = NULL;
+ btn_text = elm_object_part_text_get(ugd->scan_toolbar, "default");
+ WFD_RET_IF(btn_text == NULL, "The btn_text is NULL\n");
+ DBG(LOG_INFO, "Button text=%s",btn_text);
+
+ if (!g_strcmp0(elm_object_text_get(obj), _("IDS_WIFI_SK4_SCAN"))) {
+ wfd_refresh_wifi_direct_state(ugd);
+ DBG(LOG_INFO, "Start discovery again, status: %d\n", ugd->wfd_status);
+ /* if connected, show the popup*/
+ if (ugd->wfd_status >= WIFI_DIRECT_STATE_CONNECTED || ugd->raw_connected_peer_cnt > 0) {
+ wfd_ug_act_popup(ugd, _("IDS_WIFI_BODY_CURRENT_CONNECTION_WILL_BE_DISCONNECTED_SO_THAT_SCANNING_CAN_START_CONTINUE_Q"), POP_TYPE_SCAN_AGAIN);
+ } else if (WIFI_DIRECT_STATE_DEACTIVATED == ugd->wfd_status) {
+ wfd_client_switch_on(ugd);
+ __FUNC_EXIT__;
+ return;
+ } else {
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
+ ret = wifi_direct_start_discovery_specific_channel(false, 1, WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
+ if (ret != WIFI_DIRECT_ERROR_NONE) {
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
+ DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", ret);
+ wifi_direct_cancel_discovery();
+ }
+ }
+ } else if (!g_strcmp0(elm_object_text_get(obj), _("IDS_WIFI_SK_STOP"))) {
+ DBG(LOG_INFO, "Stop pressed.\n");
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_STOPPED;
+ wfd_cancel_progressbar_stop_timer(ugd);
+ wfd_delete_progressbar_cb(ugd);
+ wfd_cancel_not_alive_delete_timer(ugd);
+ } else if (0 == strcmp(_("IDS_WIFI_SK2_CANCEL_CONNECTION"), btn_text)) {
+ DBG(LOG_INFO, "Cancel Connection");
+ wfd_ug_act_popup(ugd, _("IDS_WIFI_POP_THIS_WI_FI_DIRECT_CONNECTION_WILL_BE_CANCELLED"), POP_TYPE_CANCEL_CONNECT);
+ } else {
+ DBG(LOG_INFO, "Invalid Case\n");
+ }
+ __FUNC_EXIT__;
+ return;
}
-void _wfd_onoff_btn_cb(void *data, Evas_Object *obj, void *event_info)
+void wfd_check_gl_busy_peers(struct ug_data *ugd)
{
- __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__;
+ __FUNC_ENTER__;
+ if (ugd->gl_busy_peer_cnt == 0) {
+ WFD_IF_DEL_ITEM(ugd->busy_wfd_item);
+ }
+ __FUNC_EXIT__;
}
-
-static void _gl_header_sel(void *data, Evas_Object *obj, void *event_info)
+void wfd_check_gl_available_peers(struct ug_data *ugd)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
- Elm_Object_Item *item = (Elm_Object_Item *)event_info;
+ __FUNC_ENTER__;
+ if (ugd->gl_available_peer_cnt == 0 && ugd->avlbl_wfd_item != NULL) {
+ WFD_IF_DEL_ITEM(ugd->avlbl_wfd_item);
+ }
+ __FUNC_EXIT__;
+}
- if(data == NULL)
- {
- DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
- return;
- }
+/**
+ * This function let the ug free some peer in genlist
+ * @return void
+ * @param[in] start_pos the start position of peers list
+ * @param[in] mac_addr the mac_addr of peer for free
+ * @param[in] cnt the count of gl peers in list
+ */
+void free_gl_peer(device_type_s **start_pos, const char *mac_addr, int *cnt)
+{
+ __FUNC_ENTER__;
+ device_type_s *peer = *start_pos;
+ device_type_s *peer_tmp = peer;
- if(item != NULL)
- elm_genlist_item_selected_set(item, EINA_FALSE);
+ if (peer == NULL) {
+ DBG(LOG_INFO, "no peer in genlist");
+ return;
+ }
- _wfd_onoff_btn_cb(ugd, NULL, NULL);
+ while (peer) {
+ if(strcmp(peer->mac_addr, mac_addr)) {
+ peer_tmp = peer;
+ peer = peer->next;
+ } else {
+ if(peer->next != NULL) {
+ peer_tmp->next = peer->next;
+ break;
+ } else {
+ peer_tmp->next = NULL;
+ break;
+ }
+ }
+ }
- __FUNC_EXIT__;
-}
+ if (peer == *start_pos) {
+ DBG(LOG_INFO, "the head is free");
+ *start_pos = peer->next;
+ }
-#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
+ (*cnt)--;
+ if (peer) {
+ WFD_IF_DEL_ITEM(peer->gl_item);
+ peer->next = NULL;
+ free(peer);
+ }
+ __FUNC_EXIT__;
}
-#endif
+/**
+ * This function let the ug call it when click avaliable peer to connect
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
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;
+ __FUNC_ENTER__;
+
+ int res = -1;
+ char txt[MAX_POPUP_TEXT_SIZE] = {0,};
+ char popup_text[MAX_POPUP_TEXT_SIZE] = {0, };
+ bool is_peer_alive = false;
+ struct ug_data *ugd = wfd_get_ug_data();
+ device_type_s *peer = (device_type_s *)data;
+ Elm_Object_Item *item = (Elm_Object_Item *)event_info;
+
+ if (!ugd || !peer) {
+ DBG(LOG_ERROR, "NULL parameters.\n");
+ return;
+ }
+
+ wfd_ug_get_connected_peers(ugd);
+ DBG(LOG_INFO, "No of connected peers= %d",ugd->raw_connected_peer_cnt);
+
+ if (ugd->raw_connected_peer_cnt >= MAX_CONNECTED_PEER_NUM) {
+ snprintf(popup_text, MAX_POPUP_TEXT_SIZE, _("IDS_ST_POP_YOU_CAN_CONNECT_UP_TO_PD_DEVICES_AT_THE_SAME_TIME"), MAX_CONNECTED_PEER_NUM);
+ wfd_ug_warn_popup(ugd, popup_text, POP_TYPE_MULTI_CONNECT_POPUP);
+ if (item) {
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+ }
+ return;
+ }
+
+ if (ugd->disconnect_btn) {
+ Evas_Object *content;
+ content = elm_object_part_content_unset(ugd->layout, "button.next");
+ WFD_IF_DEL_OBJ(content);
+ ugd->disconnect_btn = NULL;
+ elm_object_part_content_set(ugd->layout, "button.big",
+ ugd->scan_toolbar);
+ }
+
+ if (item) {
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+ }
+
+ GList *iterator = NULL;
+
+ for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
+ if (!strncmp(peer->mac_addr, (const char *)((device_type_s *)iterator->data)->mac_addr, MAC_LENGTH)) {
+ /* peer is found in last discovery */
+ is_peer_alive = true;
+ break;
+ }
+ }
+
+ if (!is_peer_alive) {
+ /* peer exists only in genlist, waiting to be deleted */
+ device_type_s *peer_start = ugd->gl_avlb_peers_start;
+ for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
+ if(!strncmp(peer_start->mac_addr, peer->mac_addr, MAC_LENGTH)) {
+ DBG(LOG_INFO, "Device [%s] found in genlist, but it is already lost", ((device_type_s *)iterator->data)->ssid);
+ sprintf(txt, "Cannot find device %s", ((device_type_s *)iterator->data)->ssid);
+ free_gl_peer(&ugd->gl_avlb_peers_start, ((device_type_s *)iterator->data)->mac_addr, &ugd->gl_available_peer_cnt);
+ wfd_check_gl_available_peers(ugd);
+ wfd_ug_warn_popup(ugd, txt, POPUP_TYPE_INFO);
+ return;
+ }
+ }
+ }
+
+ wfd_cancel_not_alive_delete_timer(ugd);
+
+ /* get WFD status */
+ wfd_refresh_wifi_direct_state(ugd);
+
+ if (PEER_CONN_STATUS_DISCONNECTED == peer->conn_status ||
+ peer->is_group_owner == TRUE) {
+ DBG_SECURE(LOG_DEBUG, "Connect with peer ["MACSECSTR"]\n",
+ MAC2SECSTR(peer->mac_addr));
+
+ if (WIFI_DIRECT_STATE_CONNECTING == ugd->wfd_status) {
+ DBG(LOG_DEBUG, "It's in connecting status now.\n");
+ return;
+ }
+
+ ugd->mac_addr_connecting = 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;
+ }
+ }
+
+ __FUNC_EXIT__;
+ return;
}
+/**
+ * This function let the ug call it when click busy peer
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
static void _gl_busy_peer_sel(void *data, Evas_Object *obj, void *event_info)
{
- __FUNC_ENTER__;
-
- struct ug_data *ugd = (struct ug_data*) data;
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)wfd_get_ug_data();
+ Elm_Object_Item *item = (Elm_Object_Item *)event_info;
- elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
+ if (item) {
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+ }
- DBG(LOG_VERBOSE, "Busy device is clicked");
+ if (NULL == ugd) {
+ DBG(LOG_ERROR, "Data is NULL\n");
+ return;
+ }
- wfd_ug_warn_popup(ugd, IDS_WFD_POP_WARN_BUSY_DEVICE, POP_TYPE_BUSY_DEVICE_POPUP);
+ wfd_ug_warn_popup(ugd, _("IDS_ST_POP_DEVICE_CONNECTED_TO_ANOTHER_DEVICE"), POP_TYPE_BUSY_DEVICE_POPUP);
- __FUNC_EXIT__;
+ __FUNC_EXIT__;
}
-static void _gl_about_wifi_sel(void *data, Evas_Object *obj, void *event_info)
+void ctxpopup_dismissed_cb(void *data, Evas_Object *obj, void *event_info)
{
- struct ug_data *ugd = (struct ug_data*) data;
+ struct ug_data *ugd = (struct ug_data *) data;
- DBG(LOG_VERBOSE, "About wifi clicked");
+ if (!ugd) {
+ DBG(LOG_ERROR, "The param is NULL\n");
+ return;
+ }
- _wifid_create_about_view(ugd);
- elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
+ if (ugd->ctxpopup) {
+ evas_object_del(ugd->ctxpopup);
+ ugd->ctxpopup = NULL;
+ }
}
-void _wifid_create_multibutton_cb(void *data, Evas_Object * obj, void *event_info)
+void _ctxpopup_move()
{
- 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");
- }
- }
+ __FUNC_ENTER__;
+
+ int win_w = 0, win_h = 0;
+ int move_x = 0, move_y = 0;
+ int changed_ang = 0;
+ struct ug_data *ugd = wfd_get_ug_data();
+
+ if (!ugd || !ugd->win) {
+ DBG(LOG_ERROR, "NULL parameters.\n");
+ return;
+ }
+
+ if (!ugd->ctxpopup) {
+ DBG(LOG_INFO, "NULL parameters.\n");
+ return;
+ }
+
+ elm_win_screen_size_get(ugd->win, NULL, NULL, &win_w, &win_h);
+ changed_ang = elm_win_rotation_get(ugd->win);
+
+ switch (changed_ang) {
+ case 0:
+ case 180:
+ move_x = win_w/2;
+ move_y = win_h;
+ break;
+
+ case 90:
+ move_x = win_h/2;
+ move_y = win_w;
+ break;
+
+ case 270:
+ move_x = win_h/2;
+ move_y = win_w;
+ break;
+
+ default:
+ move_x = 0;
+ move_y = 0;
+ break;
+ }
+
+ evas_object_move(ugd->ctxpopup, move_x, move_y);
+
+ __FUNC_EXIT__;
}
+void _create_mluti_connect_view(void *data, Evas_Object *obj, void *event_info)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *) data;
+ WFD_RET_IF(ugd == NULL, "The param is NULL\n");
+ WFD_IF_DEL_OBJ(ugd->ctxpopup);
+ int ret = 0;
+
+ wfd_client_free_raw_discovered_peers(ugd);
+ ugd->raw_discovered_peer_cnt = 0;
+ wfd_create_multiconnect_view(ugd);
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
+ ret = wifi_direct_start_discovery_specific_channel(false, 1, WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
+ if (ret != WIFI_DIRECT_ERROR_NONE) {
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
+ DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", ret);
+ wifi_direct_cancel_discovery();
+ }
-int _change_multi_button_title(void *data)
+ __FUNC_EXIT__;
+}
+
+void _more_button_cb(void *data, Evas_Object *obj, void *event_info)
{
- struct ug_data *ugd = (struct ug_data*) data;
+ __FUNC_ENTER__;
+
+ Evas_Object *naviframe = (Evas_Object *)data;
+ Elm_Object_Item *multi_connect_item = NULL;
+ Elm_Object_Item *rename_item = NULL;
+ struct ug_data *ugd = wfd_get_ug_data();
+
+ if (!naviframe || !ugd) {
+ DBG(LOG_ERROR, "NULL parameters.\n");
+ return;
+ }
+
+ ugd->more_btn_multiconnect_item = NULL;
+
+ if (ugd->ctxpopup) {
+ evas_object_del(ugd->ctxpopup);
+ }
- if(ugd->multi_button_item == NULL) /*Needs to be check as the peer count is not getting updated*/
- {
- return -1;
- }
+ ugd->ctxpopup = elm_ctxpopup_add(naviframe);
+ elm_object_style_set(ugd->ctxpopup, "more/default");
+ ea_object_event_callback_add(ugd->ctxpopup, EA_CALLBACK_BACK, ea_ctxpopup_back_cb, NULL);
+ ea_object_event_callback_add(ugd->ctxpopup, EA_CALLBACK_MORE, ea_ctxpopup_back_cb, NULL);
+ evas_object_smart_callback_add(ugd->ctxpopup, "dismissed", ctxpopup_dismissed_cb, ugd);
+ elm_ctxpopup_auto_hide_disabled_set(ugd->ctxpopup, EINA_TRUE);
+
+ elm_ctxpopup_direction_priority_set(ugd->ctxpopup, ELM_CTXPOPUP_DIRECTION_UP,
+ ELM_CTXPOPUP_DIRECTION_LEFT,
+ ELM_CTXPOPUP_DIRECTION_RIGHT,
+ ELM_CTXPOPUP_DIRECTION_DOWN);
+
+ _ctxpopup_move();
+
+ multi_connect_item = elm_ctxpopup_item_append(ugd->ctxpopup, "IDS_WIFI_BUTTON_MULTI_CONNECT", NULL, _create_mluti_connect_view, ugd);
+ elm_object_item_domain_text_translatable_set(multi_connect_item, PACKAGE, EINA_TRUE);
+ ugd->more_btn_multiconnect_item = multi_connect_item;
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"));
+ if (WIFI_DIRECT_STATE_CONNECTING == ugd->wfd_status ||
+ WIFI_DIRECT_STATE_CONNECTED == ugd->wfd_status ||
+ WIFI_DIRECT_STATE_DEACTIVATED == ugd->wfd_status ||
+ ugd->raw_connected_peer_cnt > 0) {
+ elm_object_item_disabled_set(multi_connect_item, TRUE);
+ }
+
+ rename_item = elm_ctxpopup_item_append(ugd->ctxpopup, "IDS_ST_BODY_RENAME_DEVICE_ABB", NULL, _gl_rename_device_sel, ugd);
+ elm_object_item_domain_text_translatable_set(rename_item, PACKAGE, EINA_TRUE);
+ evas_object_show(ugd->ctxpopup);
+
+ __FUNC_EXIT__;
+}
+
+/**
+ * This function make items into group
+*/
+void _wfd_realize_item(Elm_Object_Item *pre_item, int count)
+{
+ __FUNC_ENTER__;
+ int i = 0;
+ if (count < 1 || pre_item == NULL) {
+ return;
+ }
+
+ Elm_Object_Item *item = elm_genlist_item_next_get(pre_item);
+ if (item == NULL) {
+ return;
+ }
+
+ if (count == 1) {
+ elm_object_item_signal_emit(item, "elm,state,normal", "");
+ return;
}
- 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"));
+
+ for (i = 0; i < count; i++) {
+ if (i == 0) {
+ elm_object_item_signal_emit(item, "elm,state,top", "");
+ } else if (i == count - 1) {
+ elm_object_item_signal_emit(item, "elm,state,bottom", "");
+ } else {
+ elm_object_item_signal_emit(item, "elm,state,center", "");
+ }
+
+ item = elm_genlist_item_next_get(item);
+ }
+ __FUNC_EXIT__;
+}
+
+/**
+ * This function let the ug call it when unresized event is received
+*/
+static void _gl_unrealized(void *data, Evas_Object *obj, void *event_info)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)data;
+
+ _wfd_realize_item(ugd->avlbl_wfd_item, ugd->gl_available_peer_cnt);
+ _wfd_realize_item(ugd->conn_wfd_item, ugd->gl_connected_peer_cnt);
+ _wfd_realize_item(ugd->multi_connect_wfd_item, ugd->gl_multi_connect_peer_cnt);
+ _wfd_realize_item(ugd->busy_wfd_item, ugd->gl_busy_peer_cnt);
+ _wfd_realize_item(ugd->conn_failed_wfd_item, ugd->gl_connected_failed_peer_cnt);
+ __FUNC_EXIT__;
+}
+
+/**
+ * This function let the ug call it when resized event is received
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
+static void _gl_realized(void *data, Evas_Object *obj, void *event_info)
+{
+ __FUNC_ENTER__;
+
+ if (!data || !event_info) {
+ DBG(LOG_ERROR, "Invalid parameters");
+ return;
}
- else
- {
- elm_object_text_set(ugd->multi_btn, _("IDS_WFD_BUTTON_MULTI"));
+
+ struct ug_data *ugd = (struct ug_data *)data;
+#ifdef ACCESSIBILITY_FEATURE
+ Elm_Object_Item *item = (Elm_Object_Item *)event_info;
+ int index = elm_genlist_item_index_get(item);
+ char *sr_msg = NULL;
+#endif
+
+ _wfd_realize_item(ugd->avlbl_wfd_item, ugd->gl_available_peer_cnt);
+ _wfd_realize_item(ugd->conn_wfd_item, ugd->gl_connected_peer_cnt);
+ _wfd_realize_item(ugd->multi_connect_wfd_item, ugd->gl_multi_connect_peer_cnt);
+ _wfd_realize_item(ugd->busy_wfd_item, ugd->gl_busy_peer_cnt);
+ _wfd_realize_item(ugd->conn_failed_wfd_item, ugd->gl_connected_failed_peer_cnt);
+
+#ifdef ACCESSIBILITY_FEATURE
+ /* screen reader */
+ if (GENLIST_HEADER_POS == index && item != NULL) {
+ Evas_Object *check = elm_object_item_part_content_get(item, "elm.icon");
+ if (check) {
+ Eina_Bool state = elm_check_state_get(check);
+ if (state) {
+ sr_msg = strdup(SR_CHECKBOX_ON_MSG);
+ } else {
+ sr_msg = strdup(SR_CHECKBOX_OFF_MSG);
+ }
+
+ if (sr_msg) {
+ Evas_Object *ao = NULL;
+ ao = elm_object_item_access_object_get(item);
+ elm_access_info_set(ao, ELM_ACCESS_CONTEXT_INFO, sr_msg);
+ free(sr_msg);
+ } else {
+ DBG(LOG_ERROR, "index = %d, screen reader message create fail!", index);
+ }
+ } else {
+ DBG(LOG_ERROR, "index = %d, get check box fail!", index);
+ }
}
+#endif
+
+ __FUNC_EXIT__;
+}
+
+/**
+ * This function let the ug call it when click 'disconnect' button
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
+void _wfd_ug_disconnect_button_cb(void *data, Evas_Object * obj, void *event_info)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)data;
+ WFD_RET_IF(ugd == NULL, "Incorrect parameter(NULL)\n");
- evas_object_show(ugd->multi_btn);
+ wfd_ug_act_popup(ugd, _("IDS_WIFI_POP_CURRENT_CONNECTION_WILL_BE_DISCONNECTED_CONTINUE_Q"), POP_TYPE_DISCONNECT);
- return 0;
+ __FUNC_EXIT__;
}
+/**
+ * This function let the ug call it when click "cancel connection" button
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
+void _wfd_ug_cancel_connection_button_cb(void *data, Evas_Object * obj, void *event_info)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)data;
+ WFD_RET_IF(ugd == NULL, "Incorrect parameter(NULL)\n");
-void wfd_ug_view_refresh_glitem(void *obj)
+ wfd_ug_act_popup(ugd, _("IDS_WIFI_POP_THIS_WI_FI_DIRECT_CONNECTION_WILL_BE_CANCELLED"), POP_TYPE_CANCEL_CONNECT);
+
+ __FUNC_EXIT__;
+}
+
+
+/**
+ * This function let the ug update the genlist item
+ * @return void
+ * @param[in] gl_item the pointer to genlist item
+ */
+void wfd_ug_view_refresh_glitem(Elm_Object_Item *gl_item)
{
- __FUNC_ENTER__;
- elm_genlist_item_update(obj);
- __FUNC_EXIT__;
+ __FUNC_ENTER__;
+ if (gl_item != NULL) {
+ elm_genlist_item_update(gl_item);
+ }
+ __FUNC_EXIT__;
}
-void wfd_ug_view_refresh_button(void *obj, const char *text, int enable)
+/**
+ * This function let the ug refresh the attributes of button
+ * @return void
+ * @param[in] tb_item the pointer to the toolbar button
+ * @param[in] text the pointer to the text of button
+ * @param[in] enable whether the button is disabled
+ */
+void wfd_ug_view_refresh_button(Evas_Object *tb_item, const char *text,
+ int enable)
{
__FUNC_ENTER__;
- if (NULL == obj || NULL == text) {
+ if (NULL == tb_item || 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);
+ DBG(LOG_INFO, "Set the attributes of button: text[%s], enabled[%d]\n", text, enable);
+ elm_object_domain_translatable_part_text_set(tb_item, "default",
+ PACKAGE, text);
+ elm_object_disabled_set(tb_item, !enable);
__FUNC_EXIT__;
}
+/**
+ * This function let the ug know whether current device is connected by me
+ * @return If connected, return TRUE, else return FALSE
+ * @param[in] ugd the pointer to the main data structure
+ * @param[in] dev the pointer to the device
+ */
static bool __wfd_is_device_connected_with_me(struct ug_data *ugd, device_type_s *dev)
{
- int i;
+ __FUNC_ENTER__;
+ int i = 0;
- 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)
+ 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;
+ }
}
+
+ __FUNC_EXIT__;
return FALSE;
}
+/**
+ * This function let the ug know whether current device is connected by other peer
+ * @return If connected, return TRUE, else return FALSE
+ * @param[in] ugd the pointer to the main data structure
+ * @param[in] dev the pointer to the device
+ */
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;
+ __FUNC_ENTER__;
- if (ugd->I_am_group_owner == TRUE)
- {
- if (dev->is_connected || dev->is_group_owner)
+ if (ugd->I_am_group_owner == TRUE) {
+ if (dev->is_connected || dev->is_group_owner) {
return TRUE;
- else
+ } else {
return FALSE;
- }
- else
- {
- if (dev->is_connected == TRUE && dev->is_group_owner == TRUE)
+ }
+ } else {
+ if (dev->is_connected == TRUE && dev->is_group_owner == TRUE) {
return FALSE;
- if (dev->is_connected == TRUE && dev->is_group_owner == FALSE)
+ }
+
+ if (dev->is_connected == TRUE && dev->is_group_owner == FALSE) {
return TRUE;
- if (dev->is_connected == FALSE)
+ }
+
+ if (dev->is_connected == FALSE) {
return FALSE;
+ }
}
+ __FUNC_EXIT__;
return FALSE;
}
+/**
+ * This function let the ug calculate how many devices are avaliable
+ * @return TRUE
+ * @param[in] ugd the pointer to the main data structure
+ * @param[in] dev the pointer to the number of avaliable devices
+ */
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;
+ __FUNC_ENTER__;
+ GList *iterator = NULL;
+
+ for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
+ /* Not include the device which is connected with me */
+ if (__wfd_is_device_connected_with_me(ugd, (device_type_s *)iterator->data)) {
+ continue;
+ }
+ if (!__wfd_is_device_busy(ugd, (device_type_s *)iterator->data) &&
+ ((device_type_s *)iterator->data)->conn_status != PEER_CONN_STATUS_FAILED_TO_CONNECT) {
+ (*no_of_available_dev)++;
+ }
+ }
+
+ __FUNC_EXIT__;
+ return TRUE;
}
+/**
+ * This function let the ug calculate how many devices are busy
+ * @return TRUE
+ * @param[in] ugd the pointer to the main data structure
+ * @param[in] dev the pointer to the number of busy devices
+ */
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;
+ __FUNC_ENTER__;
+ GList *iterator = NULL;
+
+ for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
+ /* Not include the device which is connected with me */
+ if (__wfd_is_device_connected_with_me(ugd, (device_type_s *)iterator->data)) {
+ continue;
+ }
+ if (__wfd_is_device_busy(ugd, (device_type_s *)iterator->data)) {
+ (*no_of_busy_dev)++;
+ }
+ }
+
+ __FUNC_EXIT__;
+ return TRUE;
}
+/**
+ * This function let the ug calculate how many devices are connected failed
+ * @return TRUE
+ * @param[in] ugd the pointer to the main data structure
+ * @param[in] dev the pointer to the number of connected failed devices
+ */
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;
+ __FUNC_ENTER__;
+ GList *iterator = NULL;
+
+ for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
+ /* Not include the device which is connected with me */
+ if (__wfd_is_device_connected_with_me(ugd, (device_type_s *)iterator->data)) {
+ continue;
+ }
+ if (!__wfd_is_device_busy(ugd, (device_type_s *)iterator->data) &&
+ ((device_type_s *)iterator->data)->conn_status == PEER_CONN_STATUS_FAILED_TO_CONNECT) {
+ (*no_of_connect_failed_dev)++;
+ }
+ }
+
+ __FUNC_EXIT__;
+ return TRUE;
}
+/**
+ * This function let the ug create the main genlist
+ * @return the main genlist
+ * @param[in] data the pointer to the main data structure
+ */
static Evas_Object *_create_basic_genlist(void *data)
{
__FUNC_ENTER__;
-
- struct ug_data *ugd = (struct ug_data*) data;
+ struct ug_data *ugd = (struct ug_data *) data;
Evas_Object *genlist;
- Elm_Object_Item *separator_item;
+ genlist = elm_genlist_add(ugd->layout);
+ elm_genlist_homogeneous_set(genlist, EINA_TRUE);
+ elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
+ evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ /* Wifi ON/OFF toggle button */
+#ifdef WFD_ON_OFF_GENLIST
+ ugd->item_wifi_onoff = elm_genlist_item_append(genlist, &wfd_onoff_itc, ugd,
+ NULL, ELM_GENLIST_ITEM_NONE,_onoff_changed_cb, ugd);
+ elm_genlist_item_selected_set(ugd->item_wifi_onoff,
+ EINA_FALSE);
+#endif
+ evas_object_smart_callback_add(genlist, "realized", _gl_realized, ugd);
+ evas_object_smart_callback_add(genlist, "unrealized", _gl_unrealized, ugd);
+ ugd->device_name_item = elm_genlist_item_append(genlist, &device_name_itc, ugd, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ if(ugd->device_name_item != NULL)
+ elm_genlist_item_select_mode_set(ugd->device_name_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+
+ __FUNC_EXIT__;
+ return genlist;
+}
+
+/**
+ * This function let the ug create no device item to append the genlist
+ * @return the main item
+ * @param[in] data the pointer to the main data structure
+ */
+Evas_Object *_create_no_device_genlist(void *data)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *) data;
+ Elm_Object_Item *last_item = NULL;
+ int i = 0;
- genlist = elm_genlist_add(ugd->naviframe);
+ WFD_IF_DEL_ITEM(ugd->avlbl_wfd_item);
+ if (ugd->conn_wfd_item != NULL) {
+ last_item = ugd->conn_wfd_item;
+ for (i = 0; i < ugd->gl_connected_peer_cnt; i++) {
+ last_item = elm_genlist_item_next_get(last_item);
+ }
+ } else {
+ last_item = ugd->device_name_item;
+ }
- 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->nodevice_title_item = elm_genlist_item_insert_after(ugd->genlist,
+ &title_no_device_itc, (void *)ugd, NULL, last_item,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ if(ugd->nodevice_title_item != NULL)
+ elm_genlist_item_select_mode_set(ugd->nodevice_title_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);
+ ugd->nodevice_item = elm_genlist_item_insert_after(ugd->genlist, &noitem_itc, (void *)ugd, NULL,
+ ugd->nodevice_title_item, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ if(ugd->nodevice_item != NULL)
+ elm_genlist_item_select_mode_set(ugd->nodevice_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
- //elm_genlist_item_select_mode_set(ugd->head, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ __FUNC_EXIT__;
+ return ugd->genlist;
+}
+/**
+ * This function let the ug create busy device list
+ * @return 0
+ * @param[in] data the pointer to the main data structure
+ */
+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);
+ if(ugd->busy_wfd_item != NULL)
+ elm_genlist_item_select_mode_set(ugd->busy_wfd_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
__FUNC_EXIT__;
+ return 0;
+}
- return genlist;
+void wfd_free_nodivice_item(struct ug_data *ugd)
+{
+ __FUNC_ENTER__;
+ WFD_IF_DEL_ITEM(ugd->nodevice_title_item);
+ WFD_IF_DEL_ITEM(ugd->nodevice_item);
+ __FUNC_EXIT__;
}
-static Evas_Object *_create_about_genlist(void *data)
+/**
+ * This function let the ug create avaliable device list
+ * @return 0
+ * @param[in] data the pointer to the main data structure
+ */
+int _create_available_dev_genlist(void *data)
{
- __FUNC_ENTER__;
+ __FUNC_ENTER__;
+ int i = 0;
+ struct ug_data *ugd = (struct ug_data *) data;
+ Elm_Object_Item *last_item = NULL;
+
+ wfd_free_nodivice_item(ugd);
+
+ if (ugd->conn_wfd_item != NULL) {
+ last_item = ugd->conn_wfd_item;
+ for (i=0; i<ugd->gl_connected_peer_cnt; i++) {
+ last_item = elm_genlist_item_next_get(last_item);
+ }
+ } else {
+ last_item = ugd->device_name_item;
+ }
+
+ ugd->avlbl_wfd_item = elm_genlist_item_insert_after(ugd->genlist, &title_available_itc, (void *)ugd, NULL,
+ last_item, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ if(ugd->avlbl_wfd_item != NULL) {
+ elm_genlist_item_select_mode_set(ugd->avlbl_wfd_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ elm_genlist_item_update(ugd->avlbl_wfd_item);
+ }
+ __FUNC_EXIT__;
+ return 0;
+}
- struct ug_data *ugd = (struct ug_data*) data;
+/**
+ * This function let the ug create multi connect device list
+ * @return 0
+ * @param[in] data the pointer to the main data structure
+ */
+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_insert_after(ugd->genlist, &title_multi_connect_itc, (void *)ugd,
+ NULL, ugd->device_name_item, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ if(ugd->multi_connect_wfd_item != NULL)
+ elm_genlist_item_select_mode_set(ugd->multi_connect_wfd_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ __FUNC_EXIT__;
+ return 0;
+}
+
+/**
+ * This function let the ug create connected device list
+ * @return 0
+ * @param[in] data the pointer to the main data structure
+ */
+int _create_connected_dev_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);
+ ugd->conn_wfd_item = elm_genlist_item_insert_after(ugd->genlist, &title_conn_itc, (void *)ugd, NULL,
+ ugd->device_name_item, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ if(ugd->conn_wfd_item != NULL) {
+ elm_genlist_item_select_mode_set(ugd->conn_wfd_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ elm_genlist_item_update(ugd->conn_wfd_item);
+ }
- /* 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 0;
+}
- __FUNC_EXIT__;
+/**
+ * This function let the ug create connected falied device list
+ * @return 0
+ * @param[in] data the pointer to the main data structure
+ */
+int _create_connected_failed_dev_genlist(void *data)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *) data;
+ Elm_Object_Item *last_item = NULL;
+ int i = 0;
+
+ if (ugd->avlbl_wfd_item != NULL) {
+ last_item = ugd->avlbl_wfd_item;
+ for (i=0; i<ugd->gl_available_peer_cnt; i++) {
+ last_item = elm_genlist_item_next_get(last_item);
+ }
+ } else if (ugd->conn_wfd_item != NULL) {
+ last_item = ugd->conn_wfd_item;
+ for (i=0; i<ugd->gl_connected_peer_cnt; i++) {
+ last_item = elm_genlist_item_next_get(last_item);
+ }
+ } else {
+ last_item = ugd->device_name_item;
+ }
- return ugd->genlist;
+ ugd->conn_failed_wfd_item = elm_genlist_item_insert_after(ugd->genlist, &title_conn_failed_itc, (void *)ugd,
+ NULL, last_item, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ if(ugd->conn_failed_wfd_item != NULL)
+ elm_genlist_item_select_mode_set(ugd->conn_failed_wfd_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ __FUNC_EXIT__;
+ return 0;
}
-static Evas_Object *_create_no_device_genlist(void *data)
+/**
+ * This function let the ug make the display callback for connect failed peers
+ * @return if stop the timer, return ECORE_CALLBACK_CANCEL, else return ECORE_CALLBACK_RENEW
+ * @param[in] data the pointer to the user data
+ */
+static Eina_Bool _connect_failed_peers_display_cb(void *user_data)
{
- __FUNC_ENTER__;
+ __FUNC_ENTER__;
+ int interval = 0;
+ int res = -1;
+ struct ug_data *ugd = (struct ug_data *) user_data;
+
+ if (NULL == ugd) {
+ DBG(LOG_ERROR, "NULL parameters.\n");
+ return ECORE_CALLBACK_CANCEL;
+ }
- struct ug_data *ugd = (struct ug_data*) data;
+ if (ugd->avlbl_wfd_item == NULL) {
+ _create_available_dev_genlist(ugd);
+ }
- ugd->nodevice_title_item = elm_genlist_item_append(ugd->genlist, &title_itc, (void*)ugd, NULL,
- ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ if (ugd->wfd_discovery_status == WIFI_DIRECT_DISCOVERY_BACKGROUND) {
+ DBG(LOG_INFO, "Background mode\n");
+ ugd->display_timer = NULL;
+ return ECORE_CALLBACK_CANCEL;
+ }
- ugd->nodevice_item = elm_genlist_item_append(ugd->genlist, &noitem_itc, (void*)ugd, NULL,
- ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ /* 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;
+ }
+
+ if (ugd->is_paused == false) {
+ DBG(LOG_INFO, "Not Paused");
+ /* start discovery again */
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
+ res = wifi_direct_start_discovery_specific_channel(false, 1, WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
+ DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", res);
+ wifi_direct_cancel_discovery();
+ }
+ }
- ugd->nodevice_sep_low_item = elm_genlist_item_append(ugd->genlist, &sep_itc, NULL, NULL,
- ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ ugd->display_timer = NULL;
+ __FUNC_EXIT__;
+ return ECORE_CALLBACK_CANCEL;
+}
- elm_genlist_item_select_mode_set(ugd->nodevice_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+void wfd_ug_view_free_peer(device_type_s *gl_peers_start)
+{
+ __FUNC_ENTER__;
+ device_type_s *peer_for_free = NULL;
+ device_type_s *peer = gl_peers_start;
+
+ while (peer != NULL && peer->gl_item != NULL) {
+ DBG(LOG_INFO, "Deleted item, ssid:%s\n", peer->ssid);
+ elm_object_item_del(peer->gl_item);
+ peer->gl_item = NULL;
+ peer_for_free = peer;
+ peer = peer->next;
+ free(peer_for_free);
+ }
+ __FUNC_EXIT__;
+}
- __FUNC_EXIT__;
- return ugd->genlist;
+void wfd_check_gl_conn_peers(struct ug_data *ugd)
+{
+ __FUNC_ENTER__;
+ if (ugd->gl_connected_peer_cnt == 0) {
+ WFD_IF_DEL_ITEM(ugd->conn_wfd_item);
+ }
+ __FUNC_EXIT__;
}
-int _create_multi_button_genlist(void *data)
+/**
+ * This function let the ug free the peers
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ */
+void wfd_ug_view_free_peers(void *data)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
+ __FUNC_ENTER__;
+
+ struct ug_data *ugd = (struct ug_data *) data;
+
+ ugd->gl_connected_peer_cnt = 0;
+
+ if (ugd->gl_conn_peers_start != NULL) {
+ wfd_ug_view_free_peer(ugd->gl_conn_peers_start);
+ ugd->gl_conn_peers_start = NULL;
+ }
+
+ ugd->gl_available_peer_cnt = 0;
- ugd->multi_button_sep_high_item = elm_genlist_item_append(ugd->genlist, &sep_itc, NULL, NULL,
- ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ if (ugd->gl_avlb_peers_start != NULL) {
+ wfd_ug_view_free_peer(ugd->gl_avlb_peers_start);
+ ugd->gl_avlb_peers_start = 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);
+ ugd->gl_busy_peer_cnt = 0;
+
+ if (ugd->gl_busy_peers_start != NULL) {
+ wfd_ug_view_free_peer(ugd->gl_busy_peers_start);
+ ugd->gl_busy_peers_start = NULL;
}
- evas_object_show(ugd->multi_btn);
- __FUNC_EXIT__;
- return 0;
+ ugd->gl_multi_connect_peer_cnt = 0;
+
+ if (ugd->gl_mul_conn_peers_start != NULL) {
+ wfd_ug_view_free_peer(ugd->gl_mul_conn_peers_start);
+ ugd->gl_mul_conn_peers_start = NULL;
+ }
+
+ if (ugd->gl_connected_peer_cnt == 0) {
+ WFD_IF_DEL_ITEM(ugd->conn_wfd_item);
+ }
+
+ if (ugd->display_timer != NULL) {
+ ecore_timer_del(ugd->display_timer);
+ ugd->display_timer = NULL;
+ }
+
+ WFD_IF_DEL_ITEM(ugd->multi_connect_wfd_item);
+ WFD_IF_DEL_ITEM(ugd->multi_connect_sep_item);
+ WFD_IF_DEL_ITEM(ugd->avlbl_wfd_item);
+ WFD_IF_DEL_ITEM(ugd->busy_wfd_item);
+
+ __FUNC_EXIT__;
}
+void wfd_ug_update_toolbar(struct ug_data *ugd)
+{
+ __FUNC_ENTER__;
+ int no_of_conn_dev = ugd->raw_connected_peer_cnt;
+ Evas_Object *btn;
-int _create_busy_dev_list(void *data)
+ wfd_refresh_wifi_direct_state(ugd);
+ if (ugd->wfd_status == WIFI_DIRECT_STATE_CONNECTING) {
+ DBG(LOG_INFO, "WIFI_DIRECT_STATE_CONNECTING\n");
+ if( ugd->multi_connect_wfd_item != NULL) {
+ DBG(LOG_INFO, "multi_connect_toolbar_item\n");
+ btn = elm_button_add(ugd->layout);
+ /* Use "bottom" style button */
+ elm_object_style_set(btn, "bottom");
+ elm_object_domain_translatable_text_set(btn, PACKAGE,
+ "IDS_WIFI_SK2_CANCEL_CONNECTION");
+ evas_object_smart_callback_add(btn, "clicked",
+ _wfd_ug_cancel_connection_button_cb, (void *)ugd);
+ /* Set button into "toolbar" swallow part */
+ elm_object_part_content_set(ugd->layout, "button.next", btn);
+ ugd->disconnect_btn = btn;
+ evas_object_show(ugd->disconnect_btn);
+ elm_object_part_content_set(ugd->layout, "button.prev",
+ ugd->scan_toolbar);
+ wfd_ug_view_refresh_button(ugd->scan_toolbar,
+ "IDS_WIFI_SK4_SCAN", FALSE);
+ evas_object_data_set(ugd->disconnect_btn, "multi", "disconnect");
+ DBG(LOG_INFO, "button: disconnect button added\n");
+ } else {
+ DBG(LOG_INFO, "scan_toolbar\n");
+ WFD_IF_DEL_ITEM(ugd->multi_connect_toolbar_item);
+ wfd_ug_view_refresh_button(ugd->scan_toolbar,
+ "IDS_WIFI_SK2_CANCEL_CONNECTION", TRUE);
+ evas_object_data_set(ugd->scan_btn, "multi", "cancel");
+ DBG(LOG_INFO, "button: stop connect button added\n");
+ }
+ } else if (no_of_conn_dev > 0) {
+ if (!ugd->multi_connect_toolbar_item) {
+ btn = elm_button_add(ugd->layout);
+ /* Use "bottom" style button */
+ elm_object_style_set(btn, "bottom");
+ elm_object_domain_translatable_text_set(btn, PACKAGE,
+ "IDS_WIFI_SK_DISCONNECT");
+ evas_object_smart_callback_add(btn, "clicked",
+ _wfd_ug_disconnect_button_cb, (void *)ugd);
+ /* Set button into "toolbar" swallow part */
+ elm_object_part_content_set(ugd->layout, "button.next", btn);
+ ugd->disconnect_btn = btn;
+ evas_object_show(ugd->disconnect_btn);
+ }
+ elm_object_part_content_set(ugd->layout, "button.prev",
+ ugd->scan_toolbar);
+ wfd_ug_view_refresh_button(ugd->scan_toolbar,
+ "IDS_WIFI_SK4_SCAN", TRUE);
+ evas_object_data_set(ugd->disconnect_btn, "multi", "disconnect");
+ DBG(LOG_INFO, "button: disconnect button added\n");
+ }else {
+ if (no_of_conn_dev == 0 && ugd->disconnect_btn != NULL) {
+ DBG(LOG_INFO, "disconnect btn removed when conn failed\n");
+ Evas_Object *content;
+ content = elm_object_part_content_unset(ugd->layout, "button.next");
+ WFD_IF_DEL_OBJ(content);
+ ugd->disconnect_btn = NULL;
+ elm_object_part_content_set(ugd->layout, "button.big",
+ ugd->scan_toolbar);
+ }
+ wfd_ug_view_refresh_button(ugd->scan_toolbar,
+ "IDS_WIFI_SK4_SCAN", TRUE);
+ evas_object_data_set(ugd->scan_toolbar, "multi", "connect");
+ DBG(LOG_INFO, "button: scan button added\n");
+ }
+ __FUNC_EXIT__;
+}
+
+/**
+ * This function let the ug init the genlist
+ */
+void wfd_ug_view_init_genlist(void *data, bool is_free_all_peers)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) 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_failed_dev = 0;
- ugd->busy_wfd_item = elm_genlist_item_append(ugd->genlist, &title_busy_itc, (void*)ugd, NULL,
- ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ if (is_free_all_peers) {
+ wfd_ug_view_free_peers(ugd);
+ }
+
+ if (ugd->gl_failed_peers_start != NULL) {
+ DBG(LOG_INFO, "These are failed peers, must clear them");
+ ugd->gl_connected_failed_peer_cnt = 0;
+ wfd_ug_view_free_peer(ugd->gl_failed_peers_start);
+ ugd->gl_failed_peers_start = NULL;
+ WFD_IF_DEL_ITEM(ugd->conn_failed_wfd_item);
+ }
- elm_genlist_item_select_mode_set(ugd->busy_wfd_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ if (ugd->avlbl_wfd_item != NULL) {
+ DBG(LOG_INFO, "There are available peers in genlist");
+ wfd_ug_view_refresh_glitem(ugd->avlbl_wfd_item);
+ return;
+ }
+ __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);
- __FUNC_EXIT__;
- return 0;
+ __FUNC_EXIT__;
}
-static int _create_available_dev_genlist(void *data)
+/**
+ * This function let the ug find a peer in genlist
+ */
+device_type_s *find_peer_in_glist(device_type_s *start_pos, const char *mac_addr)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
+ __FUNC_ENTER__;
+
+ if (start_pos == NULL) {
+ DBG(LOG_INFO, "no peer in genlist");
+ return NULL;
+ }
- ugd->avlbl_wfd_item = elm_genlist_item_append(ugd->genlist, &title_itc, (void*)ugd, NULL,
- ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ device_type_s *peer = start_pos;
- // elm_genlist_item_select_mode_set(ugd->avlbl_wfd_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ while (peer != NULL) {
+ if (!strncmp(peer->mac_addr, mac_addr, MAC_LENGTH - 1)) {
+ peer->is_alive = true;
+ DBG(LOG_INFO, "device [%s] found in genlist", peer->ssid);
+ __FUNC_EXIT__;
+ return peer;
+ }
+ peer = peer->next;
+ }
- __FUNC_EXIT__;
- return 0;
+ __FUNC_EXIT__;
+ return NULL;
}
-static int _create_multi_connect_dev_genlist(void *data)
+void delete_not_alive_peers(struct ug_data *ugd, device_type_s **start_pos, int *cnt)
{
- __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);
+ __FUNC_ENTER__;
+ if (*start_pos == NULL) {
+ DBG(LOG_INFO, "no peer in genlist");
+ return;
+ }
- // elm_genlist_item_select_mode_set(ugd->avlbl_wfd_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ device_type_s *peer = *start_pos;
+ device_type_s *peer_tmp = NULL;
+ while (peer != NULL) {
+ peer_tmp = peer->next;
+ if(peer->is_alive == false) {
+ free_gl_peer(start_pos, peer->mac_addr, cnt);
+ }
+ peer = peer_tmp;
+ }
- __FUNC_EXIT__;
- return 0;
+// wfd_check_gl_available_peers(ugd);
+ if (ugd->gl_busy_peer_cnt == 0) {
+ WFD_IF_DEL_ITEM(ugd->busy_wfd_item);
+ }
+ __FUNC_EXIT__;
+ return;
}
-int _create_connected_dev_genlist(void *data)
+void set_not_alive_peers(device_type_s *start_pos)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
+ __FUNC_ENTER__;
+ if (start_pos == NULL) {
+ DBG(LOG_INFO, "no peer in genlist");
+ return;
+ }
- ugd->conn_wfd_item = elm_genlist_item_append(ugd->genlist, &title_conn_itc, (void*)ugd, NULL,
- ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ device_type_s *peer = start_pos;
+ while (peer != NULL) {
+ peer->is_alive = false;
+ peer = peer->next;
+ }
- elm_genlist_item_select_mode_set(ugd->conn_wfd_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
- __FUNC_EXIT__;
- return 0;
+ __FUNC_EXIT__;
+ return;
}
-int _create_connected_failed_dev_genlist(void *data)
+/**
+ * This function let the ug get the insert position for next item
+ */
+Elm_Object_Item *get_insert_postion(device_type_s *peer, Elm_Object_Item *pre_item, int peer_cnt)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
+ __FUNC_ENTER__;
+ int i = 0;
+ device_type_s *peer_ite = NULL;
+ Elm_Object_Item *head = elm_genlist_item_next_get(pre_item);
+ Elm_Object_Item *item = NULL;
+
+ if(peer_cnt == 0) {
+ DBG(LOG_INFO, "first peer [%s] would be added", peer->ssid);
+ return pre_item;
+ }
- ugd->conn_failed_wfd_item = elm_genlist_item_append(ugd->genlist, &title_conn_failed_itc, (void*)ugd, NULL,
- ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ peer_ite = (device_type_s *)elm_object_item_data_get(head);
+ WFD_RETV_IF(peer_ite == NULL, NULL, "peer_ite is NULL\n");
+
+ if(peer_ite->gl_item != NULL) {
+ for(i=0; i < peer_cnt; i++) {
+ if (strcasecmp(peer_ite->ssid, peer->ssid) > 0) {
+ /* if peer_ite is greater than peer, return previous item */
+ __FUNC_EXIT__;
+ return elm_genlist_item_prev_get(head);
+ } else {
+ item = elm_genlist_item_next_get(head);
+ if (item == NULL) {
+ /* return the last item */
+ return head;
+ } else {
+ head = item;
+ peer_ite = (device_type_s *)elm_object_item_data_get(head);
+ }
+ }
+ }
+ }
+ __FUNC_EXIT__;
+ return elm_genlist_item_prev_get(head);
+}
+
+/**
+ * This function let the ug insert peer item to genlist
+ */
+int insert_gl_item(Evas_Object *genlist, Elm_Object_Item *item, Elm_Gen_Item_Class *itc, device_type_s **start_pos,
+ device_type_s *peer_for_insert, void *callback)
+{
+ __FUNC_ENTER__;
+ WFD_RETV_IF(item == NULL, -1, "Item is NULL\n");
+ device_type_s *peer = NULL;
+ device_type_s *peer_ite = NULL;
+
+ peer = (device_type_s *)malloc(sizeof(device_type_s));
+ WFD_RETV_IF(peer == NULL, -1, "malloc failed\n");
+
+ memcpy(peer, peer_for_insert, sizeof(device_type_s));
+ peer->next = NULL;
+
+ if(*start_pos == NULL) {
+ *start_pos = peer;
+ } else {
+ peer_ite = *start_pos;
+ while(peer_ite->next != NULL) {
+ /* move pointer to the last peer */
+ peer_ite = peer_ite->next;
+ }
+ peer_ite->next = peer;
+ }
- elm_genlist_item_select_mode_set(ugd->conn_failed_wfd_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
- __FUNC_EXIT__;
- return 0;
+ peer->is_alive = true;
+ peer->gl_item = elm_genlist_item_insert_after(genlist, itc, (void *)peer, NULL, item,
+ ELM_GENLIST_ITEM_NONE, callback, (void *)peer);
+ if (callback == NULL && peer->gl_item != NULL) {
+ elm_genlist_item_select_mode_set(peer->gl_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ }
+ __FUNC_EXIT__;
+ return 0;
}
-static Eina_Bool _connect_failed_peers_display_cb(void *user_data)
+/**
+ * This function let the ug update connected peers
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ */
+void wfd_ug_update_connected_peers(void *data)
{
- int interval = 0;
- struct ug_data *ugd = (struct ug_data*) user_data;
+ __FUNC_ENTER__;
- if (NULL == ugd) {
- DBG(LOG_ERROR, "NULL parameters.\n");
- return ECORE_CALLBACK_CANCEL;
+ struct ug_data *ugd = (struct ug_data *) data;
+ int i = 0 ;
+ int res;
+ bool is_group_owner = FALSE;
+ Elm_Object_Item *item = NULL;
+
+ res = wifi_direct_is_group_owner(&is_group_owner);
+ if (res == WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_INFO, "is_group_owner=[%d]", is_group_owner);
}
- /* 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;
+ if (!ugd->conn_wfd_item) {
+ _create_connected_dev_genlist(ugd);
}
- /* re-discovery */
- wfd_client_start_discovery(ugd);
+ for (i = 0; i < ugd->raw_connected_peer_cnt; i++) {
+ if (find_peer_in_glist(ugd->gl_conn_peers_start, ugd->raw_connected_peers[i].mac_addr) == NULL) {
+ if (find_peer_in_glist(ugd->gl_avlb_peers_start, ugd->raw_connected_peers[i].mac_addr) != NULL) {
+ free_gl_peer(&ugd->gl_avlb_peers_start, ugd->raw_connected_peers[i].mac_addr,
+ &ugd->gl_available_peer_cnt);
+ wfd_check_gl_available_peers(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);
+ if (find_peer_in_glist(ugd->gl_mul_conn_peers_start, ugd->raw_connected_peers[i].mac_addr) != NULL) {
+ free_gl_peer(&ugd->gl_mul_conn_peers_start, ugd->raw_connected_peers[i].mac_addr,
+ &ugd->gl_multi_connect_peer_cnt);
+ if (ugd->gl_multi_connect_peer_cnt == 0) {
+ WFD_IF_DEL_ITEM(ugd->multi_connect_wfd_item);
+ WFD_IF_DEL_ITEM(ugd->multi_connect_sep_item);
+ }
+ }
- return ECORE_CALLBACK_CANCEL;
+ item = get_insert_postion(&(ugd->raw_connected_peers[i]), ugd->conn_wfd_item,
+ ugd->gl_connected_peer_cnt);
+ res = insert_gl_item(ugd->genlist, item, &peer_conn_itc, &ugd->gl_conn_peers_start,
+ &ugd->raw_connected_peers[i], NULL);
+ if (res != 0) {
+ break;
+ }
+ ugd->gl_connected_peer_cnt++;
+ }
+ }
+
+ /* if is not GO, free all available peers */
+ if (is_group_owner == FALSE) {
+ ugd->gl_available_peer_cnt = 0;
+ WFD_IF_DEL_ITEM(ugd->avlbl_wfd_item);
+
+ if (ugd->gl_avlb_peers_start != NULL) {
+ wfd_ug_view_free_peer(ugd->gl_avlb_peers_start);
+ ugd->gl_avlb_peers_start = NULL;
+ }
+ }
+
+ /* free busy peers */
+ if (ugd->gl_busy_peers_start != NULL) {
+ ugd->gl_busy_peer_cnt = 0;
+ WFD_IF_DEL_ITEM(ugd->busy_wfd_item);
+
+ wfd_ug_view_free_peer(ugd->gl_busy_peers_start);
+ ugd->gl_busy_peers_start = NULL;
+
+ }
+
+ __FUNC_EXIT__;
}
-void wfd_ug_view_free_peers(void *data)
+/**
+ * This function let the ug update the multi-connect peers
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ */
+void wfd_ug_view_update_multiconn_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;
+ __FUNC_ENTER__;
- 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;
+ struct ug_data *ugd = (struct ug_data *) data;
+ int i;
+ int res;
+ Elm_Object_Item *item = NULL;
- 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;
+ if (ugd->raw_multi_selected_peer_cnt > 0) {
+ if (ugd->raw_connected_peer_cnt < ugd->raw_multi_selected_peer_cnt &&
+ ugd->multi_connect_wfd_item == NULL) {
+ _create_multi_connect_dev_genlist(ugd);
+ }
- 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;
+ for (i = 0; i < ugd->raw_multi_selected_peer_cnt; i++) {
+ if (ugd->raw_multi_selected_peers[i].conn_status != PEER_CONN_STATUS_CONNECTED) {
+ item = get_insert_postion(&(ugd->raw_multi_selected_peers[i]),
+ ugd->multi_connect_wfd_item, ugd->gl_multi_connect_peer_cnt);
+ res = insert_gl_item(ugd->genlist, item, &peer_itc, &ugd->gl_mul_conn_peers_start,
+ &ugd->raw_multi_selected_peers[i], NULL);
+ if (res != 0) {
+ break;
+ }
+ ugd->gl_multi_connect_peer_cnt++;
+ }
+ }
+ }
- 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__;
+ __FUNC_EXIT__;
}
-
-void wfd_ug_view_update_peers(void *data)
+/**
+ * This function let the ug update the available and busy peers
+ */
+void wfd_ug_update_available_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...
- }
+ __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;
+ bool is_group_owner = FALSE;
+ int res = 0;
+ Elm_Object_Item *item = NULL;
+ device_type_s *peer = NULL;
+ GList *iterator = NULL;
+
+ __wfd_is_any_device_busy(ugd, &no_of_busy_dev);
+ __wfd_is_any_device_available(ugd, &no_of_available_dev);
+ no_of_conn_dev = ugd->raw_connected_peer_cnt;
+
+ res = wifi_direct_is_group_owner(&is_group_owner);
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_INFO, "Fail to get group_owner_state. ret=[%d]", res);
+ ugd->I_am_group_owner = FALSE;
+ } else {
+ ugd->I_am_group_owner = is_group_owner;
+ }
+
+ DBG(LOG_INFO, "avail_dev=[%d], busy_dev=[%d], GO=[%d]\n", no_of_available_dev, no_of_busy_dev, is_group_owner);
+ if (no_of_available_dev != 0 || no_of_busy_dev != 0) {
+ DBG(LOG_INFO, "There are available or busy peers\n");
+ wfd_free_nodivice_item(ugd);
+ }
+
+ if (no_of_conn_dev == 0 || is_group_owner == TRUE) {
+ if (ugd->avlbl_wfd_item == NULL) {
+ _create_available_dev_genlist(ugd);
+ }
+
+ for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
+ /* Not include the device which is connected with me */
+ if (__wfd_is_device_connected_with_me(ugd, (device_type_s *)iterator->data)) {
+ continue;
}
- 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++;
+ if (!__wfd_is_device_busy(ugd, (device_type_s *)iterator->data) &&
+ ((device_type_s *)iterator->data)->conn_status != PEER_CONN_STATUS_FAILED_TO_CONNECT &&
+ ((device_type_s *)iterator->data)->conn_status != PEER_CONN_STATUS_CONNECTED) {
+ /* free disconnected gl peer */
+ if (find_peer_in_glist(ugd->gl_conn_peers_start, ((device_type_s *)iterator->data)->mac_addr) != NULL) {
+ free_gl_peer(&ugd->gl_conn_peers_start, ((device_type_s *)iterator->data)->mac_addr,
+ &ugd->gl_connected_peer_cnt);
}
- else
- {
- // device is busy or connected..
- // skip it...
+
+ /* free busy gl peer, which is available now */
+ if (find_peer_in_glist(ugd->gl_busy_peers_start, ((device_type_s *)iterator->data)->mac_addr) != NULL) {
+ free_gl_peer(&ugd->gl_busy_peers_start, ((device_type_s *)iterator->data)->mac_addr, &ugd->gl_busy_peer_cnt);
+ if (ugd->gl_busy_peer_cnt == 0) {
+ WFD_IF_DEL_ITEM(ugd->busy_wfd_item);
+ }
}
- }
- }
- _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++;
+ if (find_peer_in_glist(ugd->gl_failed_peers_start, (const char *)((device_type_s *)iterator->data)->mac_addr) != NULL) {
+ continue;
}
- else
- {
- // device is available or connected..
- // skip it...
+
+ peer = find_peer_in_glist(ugd->gl_avlb_peers_start, (const char *)((device_type_s *)iterator->data)->mac_addr);
+ if (peer == NULL) {
+ item = get_insert_postion((device_type_s *)iterator->data,
+ ugd->avlbl_wfd_item, ugd->gl_available_peer_cnt);
+ res = insert_gl_item(ugd->genlist, item, &peer_itc, &ugd->gl_avlb_peers_start,
+ (device_type_s *)iterator->data, _gl_peer_sel);
+ if (res != 0) {
+ break;
+ }
+ ugd->gl_available_peer_cnt++;
+ } else if (no_of_conn_dev > 0 && ((device_type_s *)iterator->data)->is_group_owner == TRUE) {
+ /* if peer is GO, free it */
+ free_gl_peer(&ugd->gl_avlb_peers_start, ((device_type_s *)iterator->data)->mac_addr,
+ &ugd->gl_available_peer_cnt);
}
}
- 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);
+ wfd_check_gl_available_peers(ugd);
+ wfd_check_gl_conn_peers(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);
- }
+ 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]) &&
- 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++;
+ for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
+ /* Not include the device which is connected with me */
+ if (__wfd_is_device_connected_with_me(ugd, (device_type_s *)iterator->data)) {
+ continue;
+ }
+ if (__wfd_is_device_busy(ugd, (device_type_s *)iterator->data) == TRUE) {
+ if (find_peer_in_glist(ugd->gl_busy_peers_start, ((device_type_s *)iterator->data)->mac_addr) == NULL) {
+ if (find_peer_in_glist(ugd->gl_avlb_peers_start,
+ ((device_type_s *)iterator->data)->mac_addr) != NULL) {
+ free_gl_peer(&ugd->gl_avlb_peers_start, ((device_type_s *)iterator->data)->mac_addr,
+ &ugd->gl_available_peer_cnt);
+ wfd_check_gl_available_peers(ugd);
+ }
+ item = get_insert_postion((device_type_s *)iterator->data, ugd->busy_wfd_item,
+ ugd->gl_busy_peer_cnt);
+ res = insert_gl_item(ugd->genlist, item, &peer_busy_itc, &ugd->gl_busy_peers_start,
+ (device_type_s *)iterator->data, _gl_busy_peer_sel);
+ if (res != 0) {
+ break;
+ }
+ ugd->gl_busy_peer_cnt++;
}
}
-
- 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__;
-}
+ wfd_check_gl_busy_peers(ugd);
+ __FUNC_EXIT__;
+}
-void create_wfd_ug_view(void *data)
+/**
+ * This function let the ug update the failed peers
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ */
+void wfd_ug_update_failed_peers(void *data)
{
- __FUNC_ENTER__;
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *) data;
+ int no_of_conn_failed_dev = 0;
+ GList *iterator = NULL;
- 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;
+ __wfd_is_any_device_connect_failed(ugd, &no_of_conn_failed_dev);
+ DBG(LOG_INFO, "conn_failed_dev=[%d]", no_of_conn_failed_dev);
- if(ugd == NULL)
- {
- DBG(LOG_ERROR, "Incorrect parameter(NULL)");
- return;
- }
+ if (no_of_conn_failed_dev == 0) {
+ return;
+ }
+
+ /* 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(0.05, (Ecore_Task_Cb)_connect_failed_peers_display_cb, ugd);
+ }
+
+ for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
+ if (!__wfd_is_device_busy(ugd, (device_type_s *)iterator->data) &&
+ ((device_type_s *)iterator->data)->conn_status == PEER_CONN_STATUS_FAILED_TO_CONNECT) {
+ if (find_peer_in_glist(ugd->gl_failed_peers_start, ((device_type_s *)iterator->data)->mac_addr) == NULL) {
+ if (find_peer_in_glist(ugd->gl_avlb_peers_start, ((device_type_s *)iterator->data)->mac_addr) != NULL) {
+ free_gl_peer(&ugd->gl_avlb_peers_start, ((device_type_s *)iterator->data)->mac_addr,
+ &ugd->gl_available_peer_cnt);
+ wfd_check_gl_available_peers(ugd);
+ }
+ }
+ }
+ }
+
+ __FUNC_EXIT__;
+}
+
+#ifdef WFD_ON_OFF_GENLIST
+/**
+ * This function is called when user swipes on/off button
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
+void _onoff_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)data;
+ WFD_RET_IF(ugd == NULL, "Incorrect parameter(NULL)\n");
+ WFD_RET_IF(ugd->on_off_check == NULL, "on_off_check(NULL)\n");
+ wfd_refresh_wifi_direct_state(ugd);
+ if(ugd->device_name_item != NULL)
+ elm_genlist_item_update(ugd->device_name_item);
+
+ elm_object_disabled_set(ugd->on_off_check, TRUE);
+ if(ugd->disconnect_btn) {
+ Evas_Object *content;
+ content = elm_object_part_content_unset(ugd->layout, "button.next");
+ WFD_IF_DEL_OBJ(content);
+ ugd->disconnect_btn = NULL;
+ }
+ elm_object_part_content_set(ugd->layout, "button.big", ugd->scan_toolbar);
+
+ /* turn on/off wfd */
+ if (!ugd->wfd_onoff) {
+ if (ugd->wfd_status <= WIFI_DIRECT_STATE_DEACTIVATING) {
+ DBG(LOG_INFO, "wifi-direct switch on\n");
+ elm_genlist_item_selected_set(ugd->item_wifi_onoff,
+ EINA_FALSE);
+ wfd_client_switch_on(ugd);
+ }
+ } else {
+ if (ugd->wfd_status >= WIFI_DIRECT_STATE_ACTIVATING) {
+ DBG(LOG_INFO, "wifi-direct switch off\n");
+ elm_genlist_item_selected_set(ugd->item_wifi_onoff,
+ EINA_FALSE);
+ wfd_client_switch_off(ugd);
+ }
+ }
- ugd->naviframe = elm_naviframe_add(ugd->base);
- elm_object_part_content_set(ugd->base, "elm.swallow.content", ugd->naviframe);
- evas_object_show(ugd->naviframe);
+ __FUNC_EXIT__;
+}
- 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);
+void wfd_ug_refresh_on_off_check(struct ug_data *ugd)
+{
+ __FUNC_ENTER__;
+ WFD_RET_IF(ugd == NULL, "Incorrect parameter(NULL)\n");
+ WFD_RET_IF(ugd->on_off_check == NULL, "on_off_check(NULL)\n");
+ wfd_refresh_wifi_direct_state(ugd);
+ if (ugd->wfd_status == WIFI_DIRECT_STATE_DEACTIVATING ||
+ ugd->wfd_status == WIFI_DIRECT_STATE_ACTIVATING ) {
+ elm_object_disabled_set(ugd->on_off_check, TRUE);
+ } else {
+ elm_object_disabled_set(ugd->on_off_check, FALSE);
+ }
+ if (ugd->wfd_status > WIFI_DIRECT_STATE_ACTIVATING) {
+ elm_check_state_set(ugd->on_off_check, TRUE);
+ } else {
+ elm_check_state_set(ugd->on_off_check, 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;
+ __FUNC_EXIT__;
+}
- 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")
+void wfd_ug_create_on_off_check(struct ug_data *ugd)
+{
+ __FUNC_ENTER__;
+ WFD_RET_IF(ugd == NULL, "Incorrect parameter(NULL)\n");
+ WFD_RET_IF(ugd->naviframe == NULL, "naviframe NULL\n");
+
+ Evas_Object *check = elm_check_add(ugd->naviframe);
+ elm_object_style_set(check, "naviframe/title_on&off");
+ elm_check_state_set(check, ugd->wfd_onoff);
+ evas_object_propagate_events_set(check, EINA_FALSE);
+ evas_object_smart_callback_add(check, "changed", _onoff_changed_cb, ugd);
+ elm_object_focus_allow_set(check, EINA_TRUE);
+ elm_object_item_part_content_set(ugd->navi_item, "title_right_btn", check);
+ evas_object_show(check);
+ ugd->on_off_check = check;
- control_bar = elm_toolbar_add(ugd->naviframe);
- elm_toolbar_shrink_mode_set(control_bar, ELM_TOOLBAR_SHRINK_EXPAND);
- evas_object_show(control_bar);
+ __FUNC_EXIT__;
+}
+#endif
- 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);
+/**
+ * This function let the ug create the main view
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ */
+void create_wfd_ug_view(void *data)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *) data;
+ WFD_RET_IF(ugd == NULL, "Incorrect parameter(NULL)\n");
+ Evas_Object *more_btn;
+ Evas_Object *layout;
+
+ ugd->naviframe = elm_naviframe_add(ugd->base);
+ elm_naviframe_prev_btn_auto_pushed_set(ugd->naviframe, EINA_FALSE);
+ ea_object_event_callback_add(ugd->naviframe, EA_CALLBACK_BACK, ea_naviframe_back_cb, NULL);
+ ea_object_event_callback_add(ugd->naviframe, EA_CALLBACK_MORE, ea_naviframe_more_cb, NULL);
+ elm_object_part_content_set(ugd->base, "elm.swallow.content", ugd->naviframe);
+
+ ugd->back_btn = elm_button_add(ugd->naviframe);
+ elm_object_style_set(ugd->back_btn, "naviframe/back_btn/default");
+// evas_object_smart_callback_add(ugd->back_btn, "clicked", _back_btn_cb, (void *)ugd);
+ elm_object_focus_allow_set(ugd->back_btn, EINA_FALSE);
+
+ /* Create layout */
+ layout = elm_layout_add(ugd->naviframe);
+ elm_layout_file_set(layout, WFD_UG_EDJ_PATH, "main_layout");
+ ugd->layout = layout;
+
+ ugd->genlist = _create_basic_genlist(ugd);
+ if (ugd->genlist == NULL) {
+ DBG(LOG_ERROR, "Failed to create basic genlist");
+ return;
+ }
+ elm_object_part_content_set(layout, "elm.swallow.content", ugd->genlist);
+
+ elm_genlist_fx_mode_set(ugd->genlist, EINA_FALSE);
+ evas_object_show(ugd->base);
+ elm_object_focus_set(ugd->base, EINA_TRUE);
+
+ ugd->navi_item = elm_naviframe_item_push(ugd->naviframe, ugd->title,
+ ugd->back_btn, NULL, layout, NULL);
+ elm_naviframe_item_pop_cb_set(ugd->navi_item, _back_btn_cb, ugd);
+
+ more_btn = elm_button_add(ugd->naviframe);
+ elm_object_style_set(more_btn, "naviframe/more/default");
+ evas_object_smart_callback_add(more_btn, "clicked",
+ _more_button_cb, ugd->win);
+ elm_object_item_part_content_set(ugd->navi_item, "toolbar_more_btn",
+ more_btn);
+
+ wifi_direct_initialize();
+ wifi_direct_get_state(&ugd->wfd_status);
+ if (ugd->wfd_status > WIFI_DIRECT_STATE_DEACTIVATING) {
+ scan_button_create(ugd);
+ }
- elm_object_item_disabled_set(ugd->scan_btn, !ugd->wfd_onoff);
+ if (ugd->view_type && g_strcmp0(_(ugd->view_type), _("IDS_WIFI_BUTTON_MULTI_CONNECT")) == 0) {
+ int ret = 0;
+ ugd->raw_discovered_peer_cnt = 0;
+ wfd_create_multiconnect_view(ugd);
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
+ ret = wifi_direct_start_discovery_specific_channel(false, 1, WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
+ if (ret != WIFI_DIRECT_ERROR_NONE) {
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
+ DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", ret);
+ wifi_direct_cancel_discovery();
+ }
+ return;
+ }
- elm_object_item_part_content_set(navi_item, "controlbar", control_bar);
+ __FUNC_EXIT__;
+}
- __FUNC_EXIT__;
+/**
+ * This function let the ug destroy the main view
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ */
+void destroy_wfd_ug_view(void *data)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *) data;
+ WFD_IF_DEL_ITEM(ugd->device_name_item);
+ WFD_IF_DEL_ITEM(ugd->multi_connect_toolbar_item);
+ WFD_IF_DEL_ITEM(ugd->conn_wfd_item);
+
+ WFD_IF_DEL_OBJ(ugd->scan_toolbar);
+ WFD_IF_DEL_OBJ(ugd->back_btn);
+ WFD_IF_DEL_OBJ(ugd->toolbar);
+ WFD_IF_DEL_OBJ(ugd->genlist);
+ WFD_IF_DEL_OBJ(ugd->naviframe);
+ __FUNC_EXIT__;
}
diff --git a/ug-wifidirect/src/wfd_ug_multiconnect_view.c b/ug-wifidirect/src/wfd_ug_multiconnect_view.c
index aea5ce5..ef36a62 100755..100644
--- a/ug-wifidirect/src/wfd_ug_multiconnect_view.c
+++ b/ug-wifidirect/src/wfd_ug_multiconnect_view.c
@@ -18,8 +18,6 @@
*/
#include <libintl.h>
-
-#include <assert.h>
#include <glib.h>
#include <Elementary.h>
@@ -31,113 +29,203 @@
#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)
+/**
+ * This function let the ug call it when click 'back' button in multi connect view
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
+Eina_Bool _multiconnect_view_pop_cb(void *data, Elm_Object_Item *it)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)data;
+ int ret = 0;
+ device_type_s *peer_for_free = NULL;
+ device_type_s *peer = NULL;
+
+ if (!ugd) {
+ DBG(LOG_ERROR, "The param is NULL\n");
+ return EINA_FALSE;
+ }
- if(!ugd)
- {
- DBG(LOG_ERROR, "The param is NULL\n");
- return;
- }
+ peer = ugd->multi_conn_dev_list_start;
- ugd->multiconn_view_genlist = NULL;
- elm_naviframe_item_pop(ugd->naviframe);
+ while (peer != NULL) {
+ DBG(LOG_INFO, "Free peer, ssid:%s\n", peer->ssid);
+ peer_for_free = peer;
+ peer = peer->next;
+ free(peer_for_free);
+ peer_for_free = NULL;
+ }
- __FUNC_EXIT__;
- return;
-}
+ ugd->multi_conn_dev_list_start = NULL;
+ ugd->multiconn_view_genlist = NULL;
+ ugd->mcview_title_item = NULL;
+ ugd->mcview_nodevice_item = NULL;
+ ugd->multi_navi_item = NULL;
+ ugd->multiconn_conn_btn = NULL;
+ ugd->multiconn_layout = NULL;
+ ugd->multiconn_scan_stop_btn = NULL;
+
+ DBG(LOG_INFO, "MultiConnectMode: %d\n", ugd->multi_connect_mode);
+
+ /* if pressing connect for multi-connecting, it should not start discovery again */
+ if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_NONE) {
+ if (ugd->view_type == NULL) {
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
+ DBG(LOG_INFO, "Discovery started\n");
+ ret = wifi_direct_start_discovery_specific_channel(false, 1,
+ WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
+ if (ret != WIFI_DIRECT_ERROR_NONE) {
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
+ DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", ret);
+ wifi_direct_cancel_discovery();
+ }
+ } else if (g_strcmp0(_(ugd->view_type),
+ _("IDS_WIFI_BUTTON_MULTI_CONNECT")) == 0) {
+ DBG(LOG_INFO, "Discovery not started\n");
+ ug_destroy_me(ugd->ug);
+ }
+ }
-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;
+ __FUNC_EXIT__;
+ return EINA_TRUE;
}
+/**
+ * This function let the ug reset the connected failed peers
+ * @return false
+ * @param[in] event_info the pointer to the event information
+ */
gboolean __wfd_multi_connect_reset_cb(void *data)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
+ __FUNC_ENTER__;
- ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_NONE;
- ugd->raw_multi_selected_peer_cnt = 0;
- wfd_ug_view_update_peers(ugd);
+ if (!data) {
+ DBG(LOG_ERROR, "The param is NULL\n");
+ return false;
+ }
+
+ device_type_s *peer = NULL;
+ struct ug_data *ugd = (struct ug_data *)data;
+
+ peer = ugd->gl_mul_conn_peers_start;
+ while (peer != NULL) {
+ elm_object_item_del(peer->gl_item);
+ peer->gl_item = NULL;
+ peer = peer->next;
+ }
+
+ WFD_IF_DEL_ITEM(ugd->multi_connect_wfd_item);
+ WFD_IF_DEL_ITEM(ugd->multi_connect_sep_item);
+
+ wfd_ug_update_available_peers(ugd);
__FUNC_EXIT__;
return false;
}
+/**
+ * This function let the ug free the selected peers in multi connect view
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ */
+void wfd_free_multi_selected_peers(void *data)
+{
+ __FUNC_ENTER__;
+
+ int i = 0;
+ struct ug_data *ugd = (struct ug_data *)data;
+
+ /* destroy the created group */
+ wifi_direct_destroy_group();
+
+ /* release the selected peers */
+ for (i = 0; i < ugd->raw_multi_selected_peer_cnt; i++) {
+ memset(&ugd->raw_multi_selected_peers[i], 0x00, sizeof(device_type_s));
+ }
+
+ ugd->raw_multi_selected_peer_cnt = 0;
+ ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_NONE;
+
+ __FUNC_EXIT__;
+
+}
+
+/**
+ * This function let the ug stop to connect to selected peer
+ * @return If success, return 0, else return -1
+ * @param[in] data the pointer to the main data structure
+ */
int wfd_stop_multi_connect(void *data)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) 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;
+ }
- ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_COMPLETED;
- wfd_client_set_p2p_group_owner_intent(7);
+ /* change the title of failed peers */
+ ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_COMPLETED;
+ wfd_ug_view_refresh_glitem(ugd->multi_connect_wfd_item);
+ wfd_ug_update_toolbar(ugd);
- g_timeout_add(1000 /*ms*/, __wfd_multi_connect_reset_cb, ugd);
+ if (ugd->gl_connected_peer_cnt > 0) {
+ wfd_client_set_p2p_group_owner_intent(7);
+ } else {
+ wifi_direct_destroy_group();
+ }
+
+ if(ugd->timer_multi_reset > 0) {
+ g_source_remove(ugd->timer_multi_reset);
+ }
+ /* after 30s, remove the failed peers */
+ ugd->timer_multi_reset = g_timeout_add(30000 /*ms*/,
+ __wfd_multi_connect_reset_cb, ugd);
+
+ if (ugd->g_source_multi_connect_next > 0) {
+ g_source_remove(ugd->g_source_multi_connect_next);
+ }
+ ugd->g_source_multi_connect_next = 0;
+
+ /*when multi-connect end and auto_exit is true, exit UG*/
+ if (ugd->is_auto_exit) {
+ _wfd_ug_auto_exit(ugd);
+ }
- __FUNC_EXIT__;
+ __FUNC_EXIT__;
return 0;
}
-int wfd_start_multi_connect(void* data)
+/**
+ * This function let the ug start to connect the selected peers
+ * @return If success, return 0, else return -1
+ * @param[in] data the pointer to the main data structure
+ */
+int wfd_start_multi_connect(void *data)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
- int i;
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)data;
int res;
- if (ugd->raw_multi_selected_peer_cnt > 0)
- {
+ 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);
+ res = wfd_client_group_add();
+ if (res == -1) {
+ DBG(LOG_ERROR, "Failed to add group");
+ wfd_free_multi_selected_peers(ugd);
- DBG(LOG_VERBOSE, "All connect trails are failed.\n");
- return -1;
- }
- }
- else
- {
- // error popup...
- DBG(LOG_VERBOSE, "Setting GO intent is failed.\n");
+ __FUNC_EXIT__;
return -1;
}
-
- }
- else
- {
- DBG(LOG_VERBOSE, "No selected peers.\n");
+ } else {
+ DBG(LOG_INFO, "No selected peers.\n");
return -1;
}
@@ -145,551 +233,769 @@ int wfd_start_multi_connect(void* data)
return 0;
}
-gboolean wfd_multi_connect_next_cb(void* data)
+void wfd_sort_multi_selected_peers(struct ug_data *ugd)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
+ __FUNC_ENTER__;
+ int i = 0;
+ int j = 0;
+ device_type_s peer;
+
+ for(i = 0; i < ugd->raw_multi_selected_peer_cnt; i++) {
+ for(j = 0; j < ugd->raw_multi_selected_peer_cnt-i-1; j++) {
+ if (strcasecmp(ugd->raw_multi_selected_peers[j].ssid, ugd->raw_multi_selected_peers[j + 1].ssid) > 0) {
+ peer = ugd->raw_multi_selected_peers[j];
+ ugd->raw_multi_selected_peers[j] = ugd->raw_multi_selected_peers[j + 1];
+ ugd->raw_multi_selected_peers[j + 1] = peer;
+ }
+ }
+ }
+ __FUNC_EXIT__;
+}
+
+/**
+ * This function let the ug connect to the next selected peer automatically
+ * @return If stop the timer, return false, else return true
+ * @param[in] data the pointer to the main data structure
+ */
+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..
+ if (ugd->g_source_multi_connect_next > 0) {
+ g_source_remove(ugd->g_source_multi_connect_next);
+ }
ugd->g_source_multi_connect_next = 0;
- if (ugd->raw_multi_selected_peer_cnt > 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)
- {
+ 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) {
+ ugd->mac_addr_connecting = ugd->raw_multi_selected_peers[i].mac_addr;
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);
+ if (res == -1) {
ugd->raw_multi_selected_peers[i].conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT;
- }
- else
- {
+ } else {
ugd->raw_multi_selected_peers[i].conn_status = PEER_CONN_STATUS_CONNECTING;
break;
}
}
}
- if (i >= ugd->raw_multi_selected_peer_cnt)
- {
+ if (i >= ugd->raw_multi_selected_peer_cnt) {
// All selected peers are touched.
- DBG(LOG_VERBOSE, "Stop Multi Connect...\n");
+ DBG(LOG_INFO, "Stop Multi Connect...\n");
wfd_stop_multi_connect(ugd);
}
- }
- else
- {
- DBG(LOG_VERBOSE, "No selected peers.\n");
- return -1;
+ } else {
+ DBG(LOG_INFO, "No selected peers.\n");
}
__FUNC_EXIT__;
return false;
}
-
-void _connect_btn_cb(void *data, Evas_Object * obj, void *event_info)
+/**
+ * This function let the ug call it when click 'connect' button in multi connect view
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
+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;
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)data;
+ int count = 0;
+ char popup_text[MAX_POPUP_TEXT_SIZE] = {0};
+ device_type_s *peer = NULL;
+
+ peer = ugd->multi_conn_dev_list_start;
+ while (peer != NULL) {
+ if(peer->dev_sel_state) {
count++;
- }
- }
-
- ugd->raw_multi_selected_peer_cnt = count;
+ }
+ peer = peer->next;
+ }
+ DBG(LOG_INFO, "MultiSelected Peer Count: %d", 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);
+ /* if more than 7 device selected, show the popup */
+ if (count > MAX_CONNECTED_PEER_NUM) {
+ snprintf(popup_text, MAX_POPUP_TEXT_SIZE, _("IDS_ST_POP_YOU_CAN_CONNECT_UP_TO_PD_DEVICES_AT_THE_SAME_TIME"), MAX_CONNECTED_PEER_NUM);
wfd_ug_warn_popup(ugd, popup_text, POP_TYPE_MULTI_CONNECT_POPUP);
- }
+ __FUNC_EXIT__;
+ return;
+ }
- if (wfd_start_multi_connect(ugd) != -1)
- {
- wfd_ug_view_update_peers(ugd);
- }
+ peer = ugd->multi_conn_dev_list_start;
+ count = 0;
+ while (peer != NULL) {
+ if(peer->dev_sel_state) {
+ DBG(LOG_INFO, "peer_name[%s] select state[%d]", peer->ssid, peer->dev_sel_state);
+ memcpy(&ugd->raw_multi_selected_peers[count], peer, sizeof(device_type_s));
+ ugd->raw_multi_selected_peers[count].conn_status = PEER_CONN_STATUS_WAIT_FOR_CONNECT;
+ count++;
+ }
+ peer = peer->next;
+ }
- elm_naviframe_item_pop(ugd->naviframe);
+ DBG(LOG_INFO, "MultiSelected Peer Count2: %d", count);
+ ugd->raw_multi_selected_peer_cnt = count;
+ wfd_sort_multi_selected_peers(ugd);
+ wfd_cancel_progressbar_stop_timer(ugd);
+ wfd_cancel_not_alive_delete_timer(ugd);
- //ToDo: Do we need to free multiconn_view_genlist?
- ugd->multiconn_view_genlist = NULL;
- _change_multi_button_title(ugd);
+ /* start multi connection */
+ wfd_start_multi_connect(ugd);
+
+ elm_naviframe_item_pop(ugd->naviframe);
__FUNC_EXIT__;
return;
}
+void wfd_naviframe_title_set(struct ug_data *ugd, const char *title)
+{
+ if (!ugd || !ugd->multi_navi_item) {
+ DBG(LOG_ERROR, "The param is NULL\n");
+ return;
+ }
+ elm_object_item_part_text_set(ugd->multi_navi_item, "default", title);
+}
+/**
+ * This function let the ug call it when click the peer in multi connect view
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
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;
+
+ Eina_Bool state = EINA_FALSE;
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;
+ const char *object_type = NULL;
+ struct ug_data *ugd = (struct ug_data *)wfd_get_ug_data();
+ device_type_s *peer = (device_type_s *)data;
- if (NULL == ugd || NULL == item) {
- DBG(LOG_ERROR, "The param is NULL\n");
- return;
+ if (NULL == ugd) {
+ DBG(LOG_ERROR, "ugd 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;
+ ugd->is_multi_check_all_selected = TRUE;
+
+ if(event_info != NULL) {
+ Evas_Object *content = elm_object_item_part_content_get(event_info, "elm.icon.2");
+ chk_box = elm_object_part_content_get(content, "elm.swallow.content");
+ state = elm_check_state_get(chk_box);
+ DBG(LOG_INFO, "state = %d \n", state);
+ if (chk_box == NULL) {
+ DBG(LOG_INFO, "Check box is null\n");
+ }
}
- 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);
+ object_type = evas_object_type_get(obj);
+ if (g_strcmp0(object_type, "elm_genlist") == 0) {
+ Elm_Object_Item *item = (Elm_Object_Item *)event_info;
+ if (item) {
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+ }
+ DBG(LOG_INFO, "State elm_genlist %d\n", state);
+ elm_check_state_set(chk_box, !state);
+ peer->dev_sel_state = !state;
+ } else if (g_strcmp0(object_type, "elm_check") == 0){
+ DBG(LOG_INFO, "elm_check state; %d\n", peer->dev_sel_state);
+ peer->dev_sel_state = !peer->dev_sel_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);
+ DBG(LOG_INFO, "ptr->dev_sel_state = %d \n", peer->dev_sel_state);
+ DBG_SECURE(LOG_INFO, "ptr->peer.mac_addr = ["MACSECSTR"]\n",
+ MAC2SECSTR(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) {
+ peer = ugd->multi_conn_dev_list_start;
+ while (peer != NULL) {
+ if(peer->dev_sel_state) {
is_sel = TRUE;
sel_count++;
} else {
- is_selct_all = FALSE;
+ ugd->is_multi_check_all_selected = FALSE;
}
+ peer = peer->next;
}
- 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 (is_sel) {
+ char title[MAX_POPUP_TEXT_SIZE] = {0};
+ snprintf(title, MAX_POPUP_TEXT_SIZE, _("IDS_ST_HEADER_PD_SELECTED"), sel_count);
+ wfd_naviframe_title_set(ugd, title);
+ } else {
+ wfd_naviframe_title_set(ugd, _("IDS_DLNA_HEADER_SELECT_DEVICES_ABB"));
}
- if (sel_count > 0) {
- snprintf(msg, MAX_POPUP_TEXT_SIZE, _("IDS_WFD_POP_SELECTED_DEVICE_NUM"), sel_count);
- wfd_ug_tickernoti_popup(msg);
+ state = elm_check_state_get(ugd->select_all_icon);
+ if (ugd->multiconn_layout) {
+ if (state != EINA_TRUE && ugd->is_multi_check_all_selected == TRUE) {
+ elm_check_state_set(ugd->select_all_icon, TRUE);
+ ugd->is_select_all_checked = TRUE;
+ } else if (ugd->is_multi_check_all_selected == FALSE) {
+ elm_check_state_set(ugd->select_all_icon, FALSE);
+ ugd->is_select_all_checked = FALSE;
+ }
+ wfd_ug_view_refresh_button(ugd->multiconn_conn_btn,
+ "IDS_WIFI_SK_CONNECT", is_sel);
}
__FUNC_EXIT__;
}
-static void _wfd_gl_sel_cb(void *data, Evas_Object *obj, void *event_info)
+/**
+ * This function let the ug get the label of peer
+ * @return the label of peer
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] part the pointer to the part of item
+ */
+static char *_wfd_gl_device_label_get(void *data, Evas_Object *obj, const char *part)
{
- 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);
+ __FUNC_ENTER__;
+ DBG(LOG_INFO, "part %s", part);
+ device_type_s *peer = (device_type_s *)data;
+ char *ssid;
- if (NULL == ugd || NULL == obj) {
- DBG(LOG_ERROR, "NULL parameters.\n");
- return;
+ if (NULL == peer) {
+ return NULL;
}
- 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;
+ if (!g_strcmp0(part, "elm.text.main.left")) {
+ if (strlen(peer->ssid) != 0) {
+ ssid = elm_entry_utf8_to_markup(peer->ssid);
+ if (NULL == ssid) {
+ DBG(LOG_ERROR, "elm_entry_utf8_to_markup failed.\n");
+ __FUNC_EXIT__;
+ return NULL;
+ }
+ __FUNC_EXIT__;
+ return ssid;
+ }
}
- Eina_Bool state = elm_check_state_get(sel_chkbox);
+ return NULL;
+}
- if (state==TRUE)
- state = FALSE;
- else
- state = TRUE;
- elm_check_state_set(sel_chkbox, state);
+/**
+ * This function let the ug get the icon path of peer
+ * @return the icon path of titile
+ * @param[in] peer the pointer to the peer
+ */
+static char *__wfd_get_device_icon_path(device_type_s *peer)
+{
+ __FUNC_ENTER__;
+ char *img_name = NULL;
+
+ switch (peer->category) {
+ case WFD_DEVICE_TYPE_COMPUTER:
+ img_name = WFD_ICON_DEVICE_COMPUTER;
+ break;
+ case WFD_DEVICE_TYPE_INPUT_DEVICE:
+ img_name = WFD_ICON_DEVICE_INPUT_DEVICE;
+ break;
+ case WFD_DEVICE_TYPE_PRINTER:
+ img_name = WFD_ICON_DEVICE_PRINTER;
+ break;
+ case WFD_DEVICE_TYPE_CAMERA:
+ img_name = WFD_ICON_DEVICE_CAMERA;
+ break;
+ case WFD_DEVICE_TYPE_STORAGE:
+ img_name = WFD_ICON_DEVICE_STORAGE;
+ break;
+ case WFD_DEVICE_TYPE_NW_INFRA:
+ img_name = WFD_ICON_DEVICE_NETWORK_INFRA;
+ break;
+ case WFD_DEVICE_TYPE_DISPLAYS:
+ img_name = WFD_ICON_DEVICE_DISPLAY;
+ break;
+ case WFD_DEVICE_TYPE_MM_DEVICES:
+ img_name = WFD_ICON_DEVICE_MULTIMEDIA;
+ break;
+ case WFD_DEVICE_TYPE_GAME_DEVICES:
+ img_name = WFD_ICON_DEVICE_GAMING;
+ break;
+ case WFD_DEVICE_TYPE_TELEPHONE:
+ img_name = WFD_ICON_DEVICE_TELEPHONE;
+ break;
+ case WFD_DEVICE_TYPE_AUDIO:
+ img_name = WFD_ICON_DEVICE_HEADSET;
+ break;
+ default:
+ img_name = WFD_ICON_DEVICE_UNKNOWN;
+ break;
+ }
+ return img_name;
+}
- DBG(LOG_VERBOSE, "state = %d \n", state);
+/**
+ * This function let the ug get the icon of peer
+ * @return the icon of peer
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] part the pointer to the part of item
+ */
+static Evas_Object *_wfd_gl_device_icon_get(void *data, Evas_Object *obj, const char *part)
+{
+ __FUNC_ENTER__;
+ char *img_name = NULL;
+ device_type_s *peer = (device_type_s *) data;
+ Evas_Object *icon = NULL;
+ Evas_Object *icon_layout = NULL;
+
+
+ DBG(LOG_INFO, "Part %s", part);
+
+ if (!g_strcmp0(part, "elm.icon.2")) {
+ icon_layout = elm_layout_add(obj);
+ elm_layout_theme_set(icon_layout, "layout", "list/C/type.2", "default");
+ DBG(LOG_INFO, "Part %s", part);
+ icon = elm_check_add(icon_layout);
+ elm_object_style_set(icon, "default/genlist");
+ evas_object_propagate_events_set(icon, EINA_FALSE);
+ if (peer->dev_sel_state == EINA_TRUE) {
+ elm_check_state_set(icon, EINA_TRUE);
+ }
+ evas_object_smart_callback_add(icon,
+ "changed", _wfd_gl_multi_sel_cb, (void *)data);
+ elm_layout_content_set(icon_layout, "elm.swallow.content", icon);
+ }else if (!g_strcmp0(part, "elm.icon.1")) {
+ DBG(LOG_INFO, "Part %s", part);
+ icon_layout = elm_layout_add(obj);
+ elm_layout_theme_set(icon_layout, "layout", "list/B/type.3", "default");
+ img_name = __wfd_get_device_icon_path(peer);
+ icon = elm_image_add(icon_layout);
+ elm_image_file_set(icon, WFD_UG_EDJ_PATH, img_name);
+ evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ ea_theme_object_color_set(icon, "AO001");
+ evas_object_show(icon);
+ evas_object_propagate_events_set(icon, EINA_FALSE);
+ elm_layout_content_set(icon_layout, "elm.swallow.content", icon);
+ }
+ evas_object_show(icon_layout);
+ return icon_layout;
+}
- int i = 0;
+/**
+ * This function let the ug call it when unresized event is received
+*/
+static void _gl_unrealized(void *data, Evas_Object *obj, void *event_info)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)data;
+ int sel_count = 0;
bool is_sel = FALSE;
- Elm_Object_Item *item = NULL;
- Evas_Object *chk_box = NULL;
+ device_type_s *peer = 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 (!ugd->multiconn_conn_btn) {
+ DBG(LOG_INFO, "popup naviframe, no need to update UI\n");
+ return;
+ }
- if (state) {
- sel_count++;
+ if (ugd->gl_available_dev_cnt_at_multiconn_view > 0) {
+ peer = ugd->multi_conn_dev_list_start;
+ while (peer != NULL) {
+ if(peer->dev_sel_state) {
+ is_sel = TRUE;
+ sel_count++;
+ }
+ peer = peer->next;
}
}
- /* update the connect button */
- if (ugd->multi_connect_btn) {
- wfd_ug_view_refresh_button(ugd->multi_connect_btn, _("IDS_WFD_BUTTON_CONNECT"), is_sel);
+ if (is_sel) {
+ char title[MAX_POPUP_TEXT_SIZE] = {0};
+ snprintf(title, MAX_POPUP_TEXT_SIZE, _("IDS_ST_HEADER_PD_SELECTED"), sel_count);
+ wfd_naviframe_title_set(ugd, title);
+ } else {
+ wfd_naviframe_title_set(ugd, _("IDS_DLNA_HEADER_SELECT_DEVICES_ABB"));
}
- /* 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);
+ if (ugd->multiconn_conn_btn) {
+ wfd_ug_view_refresh_button(ugd->multiconn_conn_btn,
+ "IDS_WIFI_SK_CONNECT", is_sel);
}
- //elm_check_state_set(ugd->mcview_select_all_icon, EINA_FALSE);
+ __FUNC_EXIT__;
}
-
-static char *_wfd_gl_device_label_get(void *data, Evas_Object *obj, const char *part)
+/**
+ * This function let the ug free the multi connect devices
+ * @return 0
+ * @param[in] data the pointer to the main data structure
+ */
+int wfd_free_multiconnect_device(struct ug_data *ugd)
{
- DBG(LOG_VERBOSE, "part %s", part);
- device_type_s *peer = (device_type_s*) data;
+ __FUNC_ENTER__;
- if (NULL == peer)
- return NULL;
+ if (ugd->multiconn_view_genlist == NULL) {
+ return 0;
+ }
- if (!strcmp(part, "elm.text")) {
- return strdup(peer->ssid);
+ ugd->gl_available_dev_cnt_at_multiconn_view = 0;
+ if (ugd->multi_conn_dev_list_start != NULL) {
+ wfd_ug_view_free_peer(ugd->multi_conn_dev_list_start);
+ ugd->multi_conn_dev_list_start = NULL;
}
- return NULL;
-}
+ __FUNC_EXIT__;
+ return 0;
+}
-static char *__wfd_get_device_icon_path(device_type_s *peer)
+/**
+ * This function let the ug create "no device found" item
+*/
+Evas_Object *_create_no_device_multiconnect_genlist(struct ug_data *ugd)
{
- 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;
-}
+ __FUNC_ENTER__;
+ if (NULL == ugd) {
+ DBG(LOG_ERROR, "NULL parameters.\n");
+ return NULL;
+ }
+ if (!ugd->mcview_nodevice_item) {
+ ugd->mcview_nodevice_item = elm_genlist_item_append(ugd->multiconn_view_genlist, &noitem_itc, (void *)ugd, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ if(ugd->mcview_nodevice_item != NULL)
+ elm_genlist_item_select_mode_set(ugd->mcview_nodevice_item , ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ }
-static void _wfd_check_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+ __FUNC_EXIT__;
+ return ugd->multiconn_view_genlist;
+}
+
+/**
+ * This function let the ug update the multi connect devices
+ * @return 0
+ * @param[in] data the pointer to the main data structure
+ */
+int wfd_update_multiconnect_device(struct ug_data *ugd, bool is_free_all_peers)
{
- struct ug_data *ugd = (struct ug_data*) data;
- if (NULL == ugd || NULL == obj) {
- DBG(LOG_ERROR, "NULL parameters.\n");
- return;
- }
+ __FUNC_ENTER__;
- int i = 0;
- bool is_sel = FALSE;
+ int count = 0;
+ device_type_s *device = NULL;
+ Evas_Object *genlist = NULL;
Elm_Object_Item *item = NULL;
- Evas_Object *chk_box = NULL;
- Eina_Bool state = elm_check_state_get(obj);
- elm_check_state_set(obj, !state);
+ int res = 0;
- 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);
+ genlist = ugd->multiconn_view_genlist;
+ if (ugd->multiconn_view_genlist == NULL) {
+ return 0;
}
- /* update the connect button */
- wfd_ug_view_refresh_button(ugd->multi_connect_btn, _("IDS_WFD_BUTTON_CONNECT"), is_sel);
-#endif
-}
+ if (is_free_all_peers) {
+ wfd_free_multiconnect_device(ugd);
+ }
+ GList *iterator = NULL;
+ for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
+ device = (device_type_s *)iterator->data;
+ if (device->is_connected == FALSE && device->is_group_owner == FALSE) {
+ count++;
+ }
+ }
-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);
+ if (count == 0) {
+ DBG(LOG_INFO, "There are No peers\n");
+ if (!ugd->mcview_title_item) {
+ ugd->mcview_title_item = elm_genlist_item_append(genlist, &multi_view_title_itc, ugd, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ if(ugd->mcview_title_item != NULL)
+ elm_genlist_item_select_mode_set(ugd->mcview_title_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ } else {
+ wfd_ug_view_refresh_glitem(ugd->mcview_title_item);
+ }
+ elm_check_state_set(ugd->select_all_icon, EINA_FALSE);
+ ugd->is_select_all_checked = FALSE;
+ wfd_free_multiconnect_device(ugd);
+ wfd_naviframe_title_set(ugd, _("IDS_DLNA_HEADER_SELECT_DEVICES_ABB"));
+ } else {
+ WFD_IF_DEL_ITEM(ugd->mcview_nodevice_item);
+ wfd_ug_view_refresh_glitem(ugd->mcview_title_item);
+
+ for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
+ device = (device_type_s *)iterator->data;
+ if (device->is_connected == FALSE && device->is_group_owner == FALSE) {
+ if (!find_peer_in_glist(ugd->multi_conn_dev_list_start, device->mac_addr)) {
+ item = get_insert_postion(device, ugd->mcview_title_item, ugd->gl_available_dev_cnt_at_multiconn_view);
+ res = insert_gl_item(genlist, item, &device_itc, &ugd->multi_conn_dev_list_start,
+ device, _wfd_gl_multi_sel_cb);
+ if (res != 0) {
+ break;
+ }
+ elm_check_state_set(ugd->select_all_icon, EINA_FALSE);
+ ugd->is_select_all_checked = FALSE;
+
+ ugd->gl_available_dev_cnt_at_multiconn_view++;
+ }
+ }
+ }
}
+ ugd->is_multi_check_all_selected = FALSE;
- return icon;
+ __FUNC_EXIT__;
+ return 0;
}
-
-static char *_wfd_gl_select_all_label_get(void *data, Evas_Object *obj, const char *part)
+void wfd_genlist_select_all_check_changed_cb(void *data, Evas_Object * obj, void *event_info)
{
- if (!strcmp(part, "elm.text")) {
- DBG(LOG_VERBOSE, "Adding text %s", part);
- return strdup("Select all");
+ __FUNC_ENTER__;
+ Elm_Object_Item *item = NULL;
+ Evas_Object *chk_box = NULL;
+ Evas_Object *content = NULL;
+ const char *object_type;
+ Eina_Bool state;
+
+
+ struct ug_data *ugd = (struct ug_data *)data;
+ if (NULL == ugd || NULL == obj) {
+ DBG(LOG_ERROR, "NULL parameters.\n");
+ return;
}
- 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 (ugd->multi_conn_dev_list_start == NULL) {
+ elm_genlist_item_selected_set(ugd->select_all_view_genlist, EINA_FALSE);
+ elm_check_state_set(ugd->select_all_icon, EINA_FALSE);
+ ugd->is_select_all_checked = FALSE;
- 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);
+ DBG(LOG_INFO, "No devices in multi-connect view.\n");
+ return;
}
- return icon;
-}
+ device_type_s *peer = ugd->multi_conn_dev_list_start;
+ elm_genlist_item_selected_set(ugd->select_all_view_genlist, EINA_FALSE);
+ object_type = evas_object_type_get(obj);
+ if (g_strcmp0(object_type, "elm_genlist") == 0) {
+ state = elm_check_state_get(ugd->select_all_icon);
+ elm_check_state_set(ugd->select_all_icon, !state);
+ ugd->is_select_all_checked = !state;
+ }
+ state = elm_check_state_get(ugd->select_all_icon);
+ DBG(LOG_INFO, "state = %d",state);
+ if (state == EINA_TRUE) {
+ if (ugd->is_multi_check_all_selected == FALSE) {
+ int sel_count = 0;
+ while (peer != NULL) {
+ peer->dev_sel_state = TRUE;
+ item = peer->gl_item;
+ content = elm_object_item_part_content_get(item, "elm.icon.2");
+ chk_box = elm_object_part_content_get(content, "elm.swallow.content");
+ elm_check_state_set(chk_box, TRUE);
+ sel_count++;
+ peer = peer->next;
+ }
+ ugd->is_multi_check_all_selected = TRUE;
-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;
-}
+ char title[MAX_POPUP_TEXT_SIZE] = {0};
+ snprintf(title, MAX_POPUP_TEXT_SIZE,
+ _("IDS_ST_HEADER_PD_SELECTED"), sel_count);
+ wfd_naviframe_title_set(ugd, title);
-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++;
+ if (ugd->multiconn_layout) {
+ wfd_ug_view_refresh_button(ugd->multiconn_conn_btn,
+ "IDS_WIFI_SK_CONNECT", TRUE);
}
}
- }
+ } else {
+ while (peer != NULL) {
+ peer->dev_sel_state = FALSE;
+ item = peer->gl_item;
+ content = elm_object_item_part_content_get(item, "elm.icon.2");
+ chk_box = elm_object_part_content_get(content, "elm.swallow.content");
+ elm_check_state_set(chk_box, FALSE);
+ peer = peer->next;
+ }
+ ugd->is_multi_check_all_selected = FALSE;
+ wfd_naviframe_title_set(ugd,
+ _("IDS_DLNA_HEADER_SELECT_DEVICES_ABB"));
- __FUNC_EXIT__;
- return 0;
+ if (ugd->multiconn_layout) {
+ wfd_ug_view_refresh_button(ugd->multiconn_conn_btn,
+ "IDS_WIFI_SK_CONNECT", FALSE);
+ }
+ }
}
-void _wifid_create_multiconnect_view(struct ug_data *ugd)
+/**
+ * This function let the ug call it when click 'scan' button
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
+void _multi_scan_btn_cb(void *data, Evas_Object *obj, void *event_info)
{
__FUNC_ENTER__;
+ int ret = -1;
+ const char *btn_text = NULL;
+ device_type_s *peer = NULL;
+ struct ug_data *ugd = (struct ug_data *) data;
- 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;
+ if (NULL == ugd) {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return;
+ }
- 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;
+ if (ugd->multiconn_conn_btn) {
+ peer = ugd->multi_conn_dev_list_start;
+ while (peer) {
+ if(peer->dev_sel_state) {
+ wfd_ug_view_refresh_button(ugd->multiconn_conn_btn, "IDS_WIFI_SK_CONNECT", TRUE);
+ break;
+ }
+ peer = peer->next;
+ }
+ if (!peer) {
+ wfd_ug_view_refresh_button(ugd->multiconn_conn_btn, "IDS_WIFI_SK_CONNECT", FALSE);
+ }
+ }
- 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);
+ btn_text = elm_object_text_get(ugd->multiconn_scan_stop_btn);
+ if (NULL == btn_text) {
+ DBG(LOG_ERROR, "Incorrect button text(NULL)\n");
+ return;
+ }
- genlist = elm_genlist_add(ugd->naviframe);
- ugd->multiconn_view_genlist = genlist;
- elm_object_style_set(ugd->multiconn_view_genlist, "dialogue");
+ if (0 == strcmp(btn_text, _("IDS_WIFI_SK4_SCAN"))) {
+ wfd_refresh_wifi_direct_state(ugd);
+ DBG(LOG_INFO, "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_WIFI_BODY_CURRENT_CONNECTION_WILL_BE_DISCONNECTED_SO_THAT_SCANNING_CAN_START_CONTINUE_Q"), POP_TYPE_SCAN_AGAIN);
+ } else if (WIFI_DIRECT_STATE_DEACTIVATED == ugd->wfd_status) {
+ wfd_client_switch_on(ugd);
+ __FUNC_EXIT__;
+ return;
+ } else {
+ WFD_IF_DEL_ITEM(ugd->mcview_nodevice_item);
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
+ ret = wifi_direct_start_discovery_specific_channel(false, 1, WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
+ if (ret != WIFI_DIRECT_ERROR_NONE) {
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
+ DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", ret);
+ wifi_direct_cancel_discovery();
+ }
+ }
+ elm_object_domain_translatable_text_set(ugd->multiconn_scan_stop_btn,
+ PACKAGE, "IDS_WIFI_SK_STOP");
+ } else if (0 == strcmp(btn_text, _("IDS_WIFI_SK_STOP"))) {
+ DBG(LOG_INFO, "Stop pressed.\n");
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_STOPPED;
+ wfd_cancel_progressbar_stop_timer(ugd);
+ wfd_delete_progressbar_cb(ugd);
+ wfd_cancel_not_alive_delete_timer(ugd);
+ }
- ugd->mcview_title_item = NULL;
+ __FUNC_EXIT__;
+ return;
+}
- _wfd_update_multiconnect_device(ugd);
+/**
+ * This function let the ug create the view for multi connection
+ * @return void
+ * @param[in] ugd the pointer to the main data structure
+ */
+void wfd_create_multiconnect_view(struct ug_data *ugd)
+{
+ __FUNC_ENTER__;
- evas_object_show(genlist);
+ Evas_Object *genlist = NULL;
+ Elm_Object_Item *navi_item = NULL;
+ Evas_Object *btn1 = NULL;
+ Evas_Object *btn2 = NULL;
+ Evas_Object *layout = NULL;
- navi_item = elm_naviframe_item_push(ugd->naviframe, _("Multi connect"), back_btn, NULL, genlist, NULL);
+ if (ugd == NULL) {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)");
+ return;
+ }
- control_bar = elm_toolbar_add(ugd->naviframe);
- elm_toolbar_shrink_mode_set(control_bar, ELM_TOOLBAR_SHRINK_EXPAND);
- evas_object_show(control_bar);
+ device_itc.item_style = "1line";
+ 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;
+
+ /* Create layout */
+ layout = elm_layout_add(ugd->naviframe);
+ elm_layout_file_set(layout, WFD_UG_EDJ_PATH, "main_layout");
+ ugd->multiconn_layout = layout;
+
+
+ genlist = elm_genlist_add(ugd->multiconn_layout);
+ elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
+ evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_smart_callback_add(genlist, "unrealized", _gl_unrealized, ugd);
+
+ elm_object_part_content_set(layout, "elm.swallow.content", genlist);
+ elm_genlist_fx_mode_set(genlist, EINA_FALSE);
+ elm_genlist_homogeneous_set(genlist, EINA_TRUE);
+ elm_genlist_realization_mode_set(genlist, TRUE);
+
+
+ ugd->multiconn_view_genlist = genlist;
+ ugd->mcview_title_item = NULL;
+ ugd->mcview_nodevice_item = NULL;
+ ugd->gl_available_dev_cnt_at_multiconn_view = 0;
+ evas_object_show(genlist);
+
+ navi_item = elm_naviframe_item_push(ugd->naviframe,
+ "IDS_DLNA_HEADER_SELECT_DEVICES_ABB", NULL, NULL, layout, NULL);
+ elm_object_item_domain_text_translatable_set(navi_item, PACKAGE, EINA_TRUE);
+
+ elm_naviframe_item_pop_cb_set(navi_item, _multiconnect_view_pop_cb, (void *)ugd);
+ ugd->select_all_view_genlist = elm_genlist_item_append(genlist,
+ &select_all_multi_connect_itc, ugd, NULL, ELM_GENLIST_ITEM_NONE,
+ wfd_genlist_select_all_check_changed_cb, (void *)ugd );
+
+
+ btn1 = elm_button_add(ugd->multiconn_layout);
+ elm_object_style_set(btn1, "bottom");
+ if (ugd->view_type && g_strcmp0(_(ugd->view_type),
+ _("IDS_WIFI_BUTTON_MULTI_CONNECT")) == 0) {
+ elm_object_domain_translatable_text_set(btn1, PACKAGE,
+ "IDS_WIFI_SK4_SCAN");
+ } else {
+ elm_object_domain_translatable_text_set(btn1, PACKAGE,
+ "IDS_WIFI_SK_STOP");
+ }
+ elm_object_part_content_set(ugd->multiconn_layout, "button.prev", btn1);
+ evas_object_smart_callback_add(btn1, "clicked",_multi_scan_btn_cb, (void *)ugd);
+ evas_object_show(btn1);
+ ugd->multiconn_scan_stop_btn = btn1;
- 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);
+ btn2 = elm_button_add(ugd->multiconn_layout);
+ elm_object_style_set(btn2, "bottom");
+ elm_object_domain_translatable_text_set(btn2, PACKAGE,
+ "IDS_WIFI_SK_CONNECT");
+ elm_object_part_content_set(ugd->multiconn_layout, "button.next", btn2);
+ evas_object_smart_callback_add(btn2, "clicked",_connect_btn_cb, (void *)ugd);
+ evas_object_show(btn2);
+ ugd->multiconn_conn_btn = btn2;
+ elm_object_disabled_set(ugd->multiconn_conn_btn, EINA_TRUE);
- if (ugd->multi_connect_btn) {
- wfd_ug_view_refresh_button(ugd->multi_connect_btn, _("IDS_WFD_BUTTON_CONNECT"), FALSE);
- }
+ ugd->multi_navi_item = navi_item;
- 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);
+ wfd_update_multiconnect_device(ugd, true);
- __FUNC_EXIT__;
+ __FUNC_EXIT__;
}
diff --git a/ug-wifidirect/src/wfd_ug_popup.c b/ug-wifidirect/src/wfd_ug_popup.c
index 254a4e9..83f038d 100755
--- a/ug-wifidirect/src/wfd_ug_popup.c
+++ b/ug-wifidirect/src/wfd_ug_popup.c
@@ -18,121 +18,381 @@
*/
#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 "utilX.h"
#include "wfd_ug.h"
#include "wfd_ug_view.h"
#include "wfd_client.h"
-static void _wfd_ug_act_popup_wifi_ok_cb(void *data, Evas_Object *obj, void *event_info)
+static void delete_popup(void *data)
{
- __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);
+ __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__;
+ 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)
+static void pushbutton_accept_connect_cb(void *data, Evas_Object * obj,
+ void *event_info)
{
- __FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
+ __FUNC_ENTER__;
- // TODO: set genlist head item as "WiFi Direct"
- ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
- wfd_ug_view_refresh_glitem(ugd->head);
+ struct ug_data *ugd = (struct ug_data *) data;
+ if (NULL == ugd) {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return;
+ }
+ int result = -1;
+ result = wifi_direct_accept_connection(ugd->mac_addr_req);
+ if (result != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_INFO,"Failed to connect");
+ }
+ delete_popup(ugd);
- evas_object_del(ugd->act_popup);
- ugd->act_popup = NULL;
- __FUNC_EXIT__;
+ __FUNC_EXIT__;
}
-static void _wfd_ug_act_popup_disconnect_ok_cb(void *data, Evas_Object *obj, void *event_info)
+static void pushbutton_reject_connect_cb(void *data, Evas_Object * obj,
+ void *event_info)
{
__FUNC_ENTER__;
- char *mac_addr = NULL;
- struct ug_data *ugd = (struct ug_data*) data;
-
+ struct ug_data *ugd = (struct ug_data *) data;
if (NULL == ugd) {
DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
return;
}
+ int result = -1;
+ if (ugd->mac_addr_req[0] != '\0') {
+ result = wifi_direct_reject_connection(ugd->mac_addr_req);
+ if (result != WIFI_DIRECT_ERROR_NONE)
+ DBG(LOG_INFO,"Failed to reject connection");
+ } else {
+ DBG(LOG_INFO,"No Peer mac address");
+ }
+ delete_popup(ugd);
+
+ __FUNC_EXIT__;
+}
+#ifndef MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE
+static void _mouseup_wifi_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Up *ev = event_info;
+ if (ev->button == 3) {
+ struct ug_data *ugd = (struct ug_data *) data;
+
+ evas_object_del(ugd->act_popup);
+ ugd->act_popup = NULL;
+ }
+}
+
+static void _keydown_wifi_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Key_Down *ev = event_info;
+ if (!strcmp(ev->keyname, KEY_BACK)) {
+ struct ug_data *ugd = (struct ug_data *) data;
+
+ ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
+ wfd_ug_view_refresh_glitem(ugd->head);
- 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;
}
+}
+#endif /* MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE */
+
+
+static void _mouseup_hotspot_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Up *ev = event_info;
+ if (ev->button == 3) {
+ struct ug_data *ugd = (struct ug_data *) data;
- /* 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);
+#ifdef WFD_ON_OFF_GENLIST
+ wfd_ug_refresh_on_off_check(ugd);
+#endif
+ evas_object_del(ugd->act_popup);
+ ugd->act_popup = NULL;
+ }
+}
+static void _keydown_hotspot_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Key_Down *ev = event_info;
+ if (!strcmp(ev->keyname, KEY_BACK)) {
+ 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;
+ }
+}
+
+static void _mouseup_disconnect_all_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Up *ev = event_info;
+ if (ev->button == 3) {
+ 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;
+ }
+}
+
+/*static void _keydown_disconnect_all_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Key_Down *ev = event_info;
+ if (!strcmp(ev->keyname, KEY_BACK)) {
+ 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;
+ }
+}*/
+
+
+/**
+ * This function let the ug call it when click 'ok' button in hotspot action popup
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
+static void _wfd_ug_act_popup_hotspot_ok_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ __FUNC_ENTER__;
+ int result = -1;
+ struct ug_data *ugd = (struct ug_data *) data;
+
+ result = wfd_mobile_ap_off(ugd);
+ if (0 == result) {
+#ifdef WFD_ON_OFF_GENLIST
+ /* refresh the header */
+ if (ugd->on_off_check) {
+ elm_check_state_set(ugd->on_off_check, TRUE);
+ elm_object_disabled_set(ugd->on_off_check, TRUE);
+ }
+#endif
+
+ /* while activating/deactivating, disable the buttons */
+ if (ugd->scan_toolbar) {
+ wfd_ug_view_refresh_button(ugd->scan_toolbar, "IDS_WIFI_SK4_SCAN", FALSE);
+ }
+
+ if (ugd->multiconn_scan_stop_btn) {
+ wfd_ug_view_refresh_button(ugd->multiconn_scan_stop_btn, "IDS_WIFI_SK4_SCAN", FALSE);
+ }
+
+ if (ugd->back_btn) {
+ elm_object_disabled_set(ugd->back_btn, TRUE);
+ }
+ ugd->is_hotspot_locally_disabled = TRUE;
}
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)
+/**
+ * This function let the ug call it when click 'cancel' button in hotspot action popup
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
+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;
- struct ug_data *ugd = (struct ug_data*) data;
- if (NULL == ugd) {
- DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
- return;
+#ifdef WFD_ON_OFF_GENLIST
+ wfd_ug_refresh_on_off_check(ugd);
+#endif
+
+ wfd_client_destroy_tethering(ugd);
+
+ evas_object_del(ugd->act_popup);
+ ugd->act_popup = NULL;
+ __FUNC_EXIT__;
+}
+
+#ifndef MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE
+/**
+ * This function let the ug call it when click 'ok' button in wifi action popup
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
+static void _wfd_ug_act_popup_wifi_ok_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ __FUNC_ENTER__;
+ int result = -1;
+ struct ug_data *ugd = (struct ug_data *) data;
+
+ result = wfd_wifi_off(ugd);
+ if (0 == result) {
+#ifdef WFD_ON_OFF_GENLIST
+ /* refresh the header */
+ if (ugd->on_off_check) {
+ elm_check_state_set(ugd->on_off_check, TRUE);
+ elm_object_disabled_set(ugd->on_off_check, TRUE);
+ }
+#endif
+ /* while activating/deactivating, disable the buttons */
+ if (ugd->scan_toolbar) {
+ wfd_ug_view_refresh_button(ugd->scan_toolbar, "IDS_WIFI_SK4_SCAN", FALSE);
+ }
+
+ if (ugd->multiconn_scan_stop_btn) {
+ wfd_ug_view_refresh_button(ugd->multiconn_scan_stop_btn, "IDS_WIFI_SK4_SCAN", FALSE);
+ }
+
+ if (ugd->back_btn) {
+ elm_object_disabled_set(ugd->back_btn, TRUE);
+ }
}
evas_object_del(ugd->act_popup);
ugd->act_popup = NULL;
+ __FUNC_EXIT__;
+}
+/**
+ * This function let the ug call it when click 'cancel' button in wifi action popup
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
+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;
+
+#ifdef WFD_ON_OFF_GENLIST
+ wfd_ug_refresh_on_off_check(ugd);
+#endif
+ 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)
+#endif /* MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE */
+
+gboolean _wfd_disconnect_idle_cb(gpointer user_data)
{
__FUNC_ENTER__;
+ GList *iterator = NULL;
- struct ug_data *ugd = (struct ug_data*) data;
+ struct ug_data *ugd = (struct ug_data *) user_data;
if (NULL == ugd) {
DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
- return;
+ return FALSE;
}
+ Evas_Object *content;
+ content = elm_object_part_content_unset(ugd->layout, "button.next");
+ WFD_IF_DEL_OBJ(content);
+
+ wfd_ug_view_init_genlist(ugd, true);
- wfd_client_disconnect(NULL);
- if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_IN_PROGRESS) {
- wfd_stop_multi_connect(ugd);
+ if (0 != wfd_client_disconnect(NULL)) {
+ DBG(LOG_ERROR, "Disconnection Failed !!!\n");
}
- evas_object_del(ugd->act_popup);
- ugd->act_popup = NULL;
+ ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
+ discover_cb(WIFI_DIRECT_ERROR_NONE, WIFI_DIRECT_DISCOVERY_STARTED, ugd);
+
+ if (ugd->multi_connect_mode != WFD_MULTI_CONNECT_MODE_NONE) {
+ wfd_free_multi_selected_peers(ugd);
+ } else {
+ /* update the connecting icon */
+ for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
+ ((device_type_s *)iterator->data)->conn_status = PEER_CONN_STATUS_DISCONNECTED;
+ wfd_ug_view_refresh_glitem(((device_type_s *)iterator->data)->gl_item);
+ }
+ }
__FUNC_EXIT__;
+ return FALSE;
}
-static void _wfd_ug_act_popup_disconnect_all_cancel_cb(void *data, Evas_Object *obj, void *event_info)
+gboolean _wfd_cancel_connect_idle_cb(gpointer user_data)
{
__FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
+ int res;
+ GList *iterator = NULL;
+ struct ug_data *ugd = (struct ug_data *) user_data;
+ if (NULL == ugd || NULL == ugd->mac_addr_connecting) {
+ DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
+ return FALSE;
+ }
+
+ res = wifi_direct_cancel_connection(ugd->mac_addr_connecting);
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed wifi_direct_cancel_connection() [%d]\n", res);
+ return FALSE;
+ }
+
+ ugd->mac_addr_connecting = NULL;
+ if (ugd->multi_connect_mode != WFD_MULTI_CONNECT_MODE_NONE) {
+ if (ugd->raw_connected_peer_cnt > 0) {
+ res = wifi_direct_disconnect_all();
+ if (res != WIFI_DIRECT_ERROR_NONE) {
+ DBG(LOG_ERROR, "Failed wifi_direct_disconnect_all() [%d]\n", res);
+ return FALSE;
+ }
+ }
+
+ wfd_free_multi_selected_peers(ugd);
+ wfd_ug_view_init_genlist(ugd, true);
+ } else {
+ /* update the connecting icon */
+ for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
+ ((device_type_s *)iterator->data)->conn_status = PEER_CONN_STATUS_DISCONNECTED;
+ }
+ wfd_ug_view_init_genlist(ugd, false);
+ }
+
+ __FUNC_EXIT__;
+ return FALSE;
+}
+
+/**
+ * This function let the ug call it when click 'ok' button in cancel connection popup
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
+static void _wfd_ug_act_popup_cancel_connect_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;
@@ -141,92 +401,232 @@ static void _wfd_ug_act_popup_disconnect_all_cancel_cb(void *data, Evas_Object *
evas_object_del(ugd->act_popup);
ugd->act_popup = NULL;
+ g_idle_add(_wfd_cancel_connect_idle_cb, ugd);
+
__FUNC_EXIT__;
}
-static void _wfd_ug_act_popup_scan_again_ok_cb(void *data, Evas_Object *obj, void *event_info)
+/**
+ * This function let the ug call it when click 'ok' button in disconnect all popup
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
+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;
+ 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;
- }
+ evas_object_del(ugd->act_popup);
+ ugd->act_popup = 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);
+ g_idle_add(_wfd_disconnect_idle_cb, ugd);
+
+ __FUNC_EXIT__;
+}
+
+/**
+ * This function let the ug call it when click 'cancel' button in disconnect all popup
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
+static void _wfd_ug_act_popup_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;
}
- /* 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)
+void act_popup_language_changed(void *data, Evas_Object *obj, void *event_info)
{
__FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
+ int popup_type = (int)data;
+ Evas_Object *btn1 = NULL;
+ Evas_Object *btn2 = NULL;
+ struct ug_data *ugd = wfd_get_ug_data();
- evas_object_del(ugd->act_popup);
- ugd->act_popup = NULL;
+ if (!ugd || !ugd->act_popup) {
+ DBG(LOG_ERROR, "NULL parameters.\n");
+ return;
+ }
+
+ btn1 = elm_object_part_content_get(ugd->act_popup, "button1");
+ btn2 = elm_object_part_content_get(ugd->act_popup, "button2");
+ elm_object_domain_translatable_text_set(btn1, PACKAGE,
+ "IDS_BR_SK_CANCEL");
+ elm_object_domain_translatable_text_set(btn2, PACKAGE,
+ "IDS_BR_SK_OK");
+
+ switch(popup_type) {
+
+ case POPUP_TYPE_HOTSPOT_OFF:
+ elm_object_domain_translatable_text_set(btn1, PACKAGE,
+ "IDS_BR_SK_NO");
+ elm_object_domain_translatable_text_set(btn2, PACKAGE,
+ "IDS_BR_SK_YES");
+ elm_object_domain_translatable_text_set(ugd->act_popup, PACKAGE,
+ "IDS_WIFI_BODY_USING_WI_FI_DIRECT_WILL_DISCONNECT_CURRENT_WI_FI_TETHERING_CONTINUE_Q");
+ break;
+
+ case POP_TYPE_DISCONNECT:
+ elm_object_domain_translatable_text_set(ugd->act_popup, PACKAGE,
+ "IDS_WIFI_POP_CURRENT_CONNECTION_WILL_BE_DISCONNECTED_CONTINUE_Q");
+ break;
+ case POP_TYPE_SCAN_AGAIN:
+ elm_object_domain_translatable_text_set(ugd->act_popup, PACKAGE,
+ "IDS_WIFI_BODY_CURRENT_CONNECTION_WILL_BE_DISCONNECTED_SO_THAT_SCANNING_CAN_START_CONTINUE_Q");
+ break;
+ case POP_TYPE_CANCEL_CONNECT:
+ elm_object_domain_translatable_text_set(ugd->act_popup, PACKAGE,
+ "IDS_WIFI_POP_THIS_WI_FI_DIRECT_CONNECTION_WILL_BE_CANCELLED");
+ break;
+ case POP_TYPE_ACCEPT_CONNECTION:
+ elm_object_domain_translatable_text_set(ugd->act_popup, PACKAGE,
+ "IDS_WIFI_BODY_PS_IS_REQUESTING_A_WI_FI_DIRECT_CONNECTION_ALLOW_Q");
+ break;
+ default:
+ break;
+ }
__FUNC_EXIT__;
}
+/**
+ * This function let the ug create a action popup
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] message the pointer to the text of popup
+ * @param[in] popup_type the message type
+ */
void wfd_ug_act_popup(void *data, const char *message, int popup_type)
{
__FUNC_ENTER__;
- struct ug_data *ugd = (struct ug_data*) data;
+ struct ug_data *ugd = (struct ug_data *) data;
Evas_Object *popup = NULL;
Evas_Object *btn1 = NULL, *btn2 = NULL;
+ WFD_IF_DEL_OBJ(ugd->act_popup);
+
popup = elm_popup_add(ugd->base);
+ elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
+ ea_object_event_callback_add(popup, EA_CALLBACK_BACK, ea_popup_back_cb, NULL);
evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
- elm_object_text_set(popup, message);
+ elm_object_domain_translatable_part_text_set(popup, "title,text",
+ PACKAGE, _("IDS_WIFI_HEADER_WI_FI_DIRECT_CONNECTION_ABB"));
+ elm_object_domain_translatable_text_set(popup, PACKAGE, message);
+ evas_object_smart_callback_add(popup, "language,changed", act_popup_language_changed, (void *)popup_type);
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");
+ elm_object_style_set(btn1, "popup");
+ elm_object_style_set(btn2, "popup");
/* set the different text by type */
- if (popup_type == POPUP_TYPE_WIFI_OFF) {
- elm_object_text_set(btn1, S_("IDS_COM_SK_YES"));
- elm_object_text_set(btn2, S_("IDS_COM_SK_NO"));
+ if (
+#ifndef MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE
+ popup_type == POPUP_TYPE_WIFI_OFF ||
+#endif
+
+ popup_type == POPUP_TYPE_HOTSPOT_OFF ||
+
+ FALSE) {
+ elm_object_domain_translatable_part_text_set(popup, "title,text",
+ PACKAGE, "IDS_WIFI_BODY_WI_FI_DIRECT_ABB");
+ elm_object_domain_translatable_text_set(btn1, PACKAGE,
+ "IDS_BR_SK_CANCEL");
+ elm_object_domain_translatable_text_set(btn2, PACKAGE,
+ "IDS_ST_BUTTON_ENABLE");
+ } else if (popup_type == POP_TYPE_CANCEL_CONNECT) {
+ elm_object_domain_translatable_text_set(btn1, PACKAGE,
+ "IDS_BR_SK_CANCEL");
+ elm_object_domain_translatable_text_set(btn2, PACKAGE,
+ "IDS_WIFI_SK_STOP");
+ } else if (popup_type == POP_TYPE_DISCONNECT) {
+ elm_object_domain_translatable_part_text_set(popup, "title,text",
+ PACKAGE, "IDS_WIFI_SK_DISCONNECT");
+ elm_object_domain_translatable_text_set(btn1, PACKAGE,
+ "IDS_BR_SK_CANCEL");
+ elm_object_domain_translatable_text_set(btn2, PACKAGE,
+ "IDS_BR_SK_OK");
+
+ } else if (popup_type == POP_TYPE_SCAN_AGAIN) {
+ elm_object_domain_translatable_part_text_set(popup, "title,text",
+ PACKAGE, "IDS_WIFI_SK4_SCAN");
+ elm_object_domain_translatable_text_set(btn1, PACKAGE,
+ "IDS_BR_SK_CANCEL");
+ elm_object_domain_translatable_text_set(btn2, PACKAGE,
+ "IDS_BR_SK_OK");
+ } else if (popup_type == POP_TYPE_ACCEPT_CONNECTION) {
+ elm_object_domain_translatable_part_text_set(popup, "title,text",
+ PACKAGE, "IDS_WIFI_BODY_WI_FI_DIRECT_ABB");
+ elm_object_domain_translatable_text_set(btn1, PACKAGE,
+ "IDS_BR_SK_CANCEL");
+ elm_object_domain_translatable_text_set(btn2, PACKAGE,
+ "IDS_WIFI_SK_CONNECT");
} else {
- elm_object_text_set(btn1, S_("IDS_COM_SK_OK"));
- elm_object_text_set(btn2, S_("IDS_COM_SK_CANCEL"));
+ elm_object_domain_translatable_text_set(btn1, PACKAGE,
+ "IDS_BR_SK_CANCEL");
+ elm_object_domain_translatable_text_set(btn2, PACKAGE,
+ "IDS_BR_SK_OK");
}
elm_object_part_content_set(popup, "button1", btn1);
elm_object_part_content_set(popup, "button2", btn2);
/* set the different callback by type */
+#ifndef MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE
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 == 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_event_callback_add(popup, EVAS_CALLBACK_MOUSE_UP, _mouseup_wifi_cb, (void *)ugd);
+// evas_object_event_callback_add(popup, EVAS_CALLBACK_KEY_DOWN, _keydown_wifi_cb, (void *)ugd);
+
+ evas_object_smart_callback_add(btn1, "clicked", _wfd_ug_act_popup_wifi_cancel_cb, (void *)ugd);
+ evas_object_smart_callback_add(btn2, "clicked", _wfd_ug_act_popup_wifi_ok_cb, (void *)ugd);
+ } else
+#endif /* MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE */
+
+ if (popup_type == POPUP_TYPE_HOTSPOT_OFF) {
+ evas_object_event_callback_add(popup, EVAS_CALLBACK_MOUSE_UP, _mouseup_hotspot_cb, (void *)ugd);
+// evas_object_event_callback_add(popup, EVAS_CALLBACK_KEY_DOWN, _keydown_hotspot_cb, (void *)ugd);
+
+ evas_object_smart_callback_add(btn1, "clicked", _wfd_ug_act_popup_hotspot_cancel_cb, (void *)ugd);
+ evas_object_smart_callback_add(btn2, "clicked", _wfd_ug_act_popup_hotspot_ok_cb, (void *)ugd);
+ } else
+
+ if (popup_type == POP_TYPE_DISCONNECT ||
+ popup_type == POP_TYPE_SCAN_AGAIN) {
+ evas_object_event_callback_add(popup, EVAS_CALLBACK_MOUSE_UP, _mouseup_disconnect_all_cb, (void *)ugd);
+// evas_object_event_callback_add(popup, EVAS_CALLBACK_KEY_DOWN, _keydown_disconnect_all_cb, (void *)ugd);
+
+ evas_object_smart_callback_add(btn1, "clicked", _wfd_ug_act_popup_cancel_cb, (void *)ugd);
+ evas_object_smart_callback_add(btn2, "clicked", _wfd_ug_act_popup_disconnect_all_ok_cb, (void *)ugd);
+ } else if (popup_type == POP_TYPE_CANCEL_CONNECT) {
+ evas_object_event_callback_add(popup, EVAS_CALLBACK_MOUSE_UP, _mouseup_disconnect_all_cb, (void *)ugd);
+
+ evas_object_smart_callback_add(btn1, "clicked", _wfd_ug_act_popup_cancel_cb, (void *)ugd);
+ evas_object_smart_callback_add(btn2, "clicked", _wfd_ug_act_popup_cancel_connect_ok_cb, (void *)ugd);
+ } else if (popup_type == POP_TYPE_ACCEPT_CONNECTION ) {
+ evas_object_smart_callback_add(btn1, "clicked",
+ pushbutton_reject_connect_cb, (void *)ugd);
+ evas_object_smart_callback_add(btn2, "clicked",
+ pushbutton_accept_connect_cb, (void *)ugd);
}
evas_object_show(popup);
@@ -234,135 +634,178 @@ void wfd_ug_act_popup(void *data, const char *message, int popup_type)
__FUNC_EXIT__;
}
+/**
+ * This function let the ug remove the action popup
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ */
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__;
+ __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__;
}
+/**
+ * This function let the ug call it when click 'ok' button in warning popup of terminated problem
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
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;
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *) data;
- evas_object_del(ugd->warn_popup);
- ugd->warn_popup = NULL;
+ evas_object_del(ugd->warn_popup);
+ ugd->warn_popup = NULL;
- wfd_ug_view_free_peers(ugd);
+ wfd_ug_view_free_peers(ugd);
- ug_destroy_me(ugd->ug);
- __FUNC_EXIT__;
+ ug_destroy_me(ugd->ug);
+ __FUNC_EXIT__;
}
-static void _wfd_ug_warn_popup_cb(void *data, Evas_Object *obj, void *event_info)
+/**
+ * This function let the ug call it when click 'ok' button in warning popup of turning off WFD automatically
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
+/*static void _wfd_ug_automatic_turn_off_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_ENTER__;
+ struct ug_data *ugd = (struct ug_data *) data;
- __FUNC_EXIT__;
-}
+ evas_object_del(ugd->warn_popup);
+ ugd->warn_popup = NULL;
-void wfd_ug_warn_popup(void *data, const char *message, int popup_type)
+ __FUNC_EXIT__;
+}*/
+
+/**
+ * This function let the ug call it when click 'ok' button in warning popup
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
+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 *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__;
-}
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *) data;
-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__;
-}
+ evas_object_del(ugd->warn_popup);
+ ugd->warn_popup = NULL;
+ if (ugd->rename_entry) {
+ elm_object_focus_set(ugd->rename_entry, EINA_TRUE);
+ }
+
+ __FUNC_EXIT__;
+}
-void wfd_ug_tickernoti_popup(char *msg)
+void warn_popup_language_changed(void *data, Evas_Object *obj, void *event_info)
{
__FUNC_ENTER__;
- int ret = -1;
- bundle *b = NULL;
+ int popup_type = (int)data;
+ struct ug_data *ugd = wfd_get_ug_data();
+ char popup_text[MAX_POPUP_TEXT_SIZE] = {0};
+ Evas_Object *btn = NULL;
- b = bundle_create();
- if (!b) {
- DBG(LOG_ERROR, "FAIL: bundle_create()\n");
+ if (!ugd || !ugd->warn_popup) {
+ DBG(LOG_ERROR, "NULL parameters.\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;
+ btn = elm_object_part_content_get(ugd->warn_popup, "button1");
+ elm_object_domain_translatable_text_set(btn, PACKAGE,
+ "IDS_BR_SK_OK");
+
+ switch(popup_type) {
+ case POPUP_TYPE_ACTIVATE_FAIL_POLICY_RESTRICTS:
+ elm_object_domain_translatable_text_set(ugd->warn_popup, PACKAGE,
+ "IDS_COM_POP_SECURITY_POLICY_RESTRICTS_USE_OF_WI_FI");
+ break;
+ case POPUP_TYPE_TERMINATE:
+ elm_object_domain_translatable_text_set(ugd->warn_popup, PACKAGE,
+ "IDS_COM_POP_FAILED");
+ break;
+ case POPUP_TYPE_TERMINATE_DEACTIVATE_FAIL:
+ elm_object_domain_translatable_text_set(ugd->warn_popup, PACKAGE,
+ "IDS_WIFI_POP_DEACTIVATION_FAILED");
+ break;
+ case POPUP_TYPE_TERMINATE_NOT_SUPPORT:
+ elm_object_domain_translatable_text_set(ugd->warn_popup, PACKAGE,
+ "IDS_ST_POP_NOT_SUPPORTED");
+ break;
+ case POP_TYPE_BUSY_DEVICE_POPUP:
+ elm_object_domain_translatable_text_set(ugd->warn_popup, PACKAGE,
+ "IDS_ST_POP_DEVICE_CONNECTED_TO_ANOTHER_DEVICE");
+ break;
+ case POP_TYPE_MULTI_CONNECT_POPUP:
+ snprintf(popup_text, MAX_POPUP_TEXT_SIZE, _("IDS_ST_POP_YOU_CAN_CONNECT_UP_TO_PD_DEVICES_AT_THE_SAME_TIME"), MAX_CONNECTED_PEER_NUM);
+ elm_object_domain_translatable_text_set(ugd->warn_popup, PACKAGE,
+ popup_text);
+ break;
+ default:
+ break;
}
- /* popup text */
- ret = bundle_add(b, "1", msg);
- if (ret) {
- DBG(LOG_ERROR, "Fail to add popup text\n");
- bundle_free(b);
- return;
- }
+ __FUNC_EXIT__;
+}
- /* 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;
- }
+/**
+ * This function let the ug create a warning popup
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] message the pointer to the text of popup
+ * @param[in] popup_type the message type
+ */
+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;
- /* 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;
+ popup = elm_popup_add(ugd->base);
+ elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
+ ea_object_event_callback_add(popup, EA_CALLBACK_BACK, ea_popup_back_cb, NULL);
+ evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ if (popup_type == POP_TYPE_MULTI_CONNECT_POPUP ||
+ popup_type == POP_TYPE_BUSY_DEVICE_POPUP) {
+ elm_object_domain_translatable_part_text_set(popup, "title,text",
+ PACKAGE, "IDS_WIFI_HEADER_UNABLE_TO_CONNECT_ABB2");
+ } else {
+ elm_object_domain_translatable_part_text_set(popup, "title,text",
+ PACKAGE, _("IDS_WIFI_HEADER_WI_FI_DIRECT_CONNECTION_ABB"));
}
-
- /* launch tickernoti */
- ret = syspopup_launch(TICKERNOTI_SYSPOPUP, b);
- if (ret) {
- DBG(LOG_ERROR, "Fail to launch syspopup\n");
+ elm_object_domain_translatable_text_set(popup, PACKAGE, message);
+ evas_object_smart_callback_add(popup, "language,changed", warn_popup_language_changed, (void *)popup_type);
+
+ btn = elm_button_add(popup);
+ elm_object_style_set(btn, "popup");
+ elm_object_domain_translatable_text_set(btn, PACKAGE, "IDS_BR_SK_OK");
+ elm_object_part_content_set(popup, "button1", btn);
+ if (popup_type == POPUP_TYPE_TERMINATE ||
+ popup_type == POPUP_TYPE_TERMINATE_DEACTIVATE_FAIL ||
+ popup_type == POPUP_TYPE_TERMINATE_NOT_SUPPORT) {
+ 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);
}
- bundle_free(b);
+ evas_object_show(popup);
+ ugd->warn_popup = popup;
__FUNC_EXIT__;
}
diff --git a/ug-wifidirect/src/wfd_ug_rename_popup.c b/ug-wifidirect/src/wfd_ug_rename_popup.c
new file mode 100644
index 0000000..7014fa5
--- /dev/null
+++ b/ug-wifidirect/src/wfd_ug_rename_popup.c
@@ -0,0 +1,415 @@
+/*
+* 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 <Elementary.h>
+#include <vconf.h>
+#include <wifi-direct.h>
+
+#include "wfd_ug.h"
+#include "wfd_ug_view.h"
+#include "wfd_client.h"
+
+#define WSC_SPEC_DEVICE_NAME_MAX_LEN 32
+static char special_char[30] = "'!@$%^&*()-_=+[];:,<.>/?";
+
+static bool is_space_str(const char *str)
+{
+ while (str) {
+ if (*str != '\0' && *str != ' ') {
+ return FALSE;
+ } else if (*str == '\0') {
+ return TRUE;
+ }
+ str++;
+ }
+ return TRUE;
+}
+
+/**
+ * This function check the max length of the device name
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ */
+static void _rename_popop_entry_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *) data;
+ WFD_RET_IF(ugd == NULL || obj == NULL, "Incorrect parameter(NULL)\n");
+ WFD_RET_IF(ugd->rename_button == NULL, "ugd->rename_button(NULL)\n");
+
+ const char *entry_text = NULL;
+ char *input_str = NULL;
+ bool is_space_string = FALSE;
+
+ entry_text = elm_entry_entry_get(obj);
+ input_str = elm_entry_markup_to_utf8(entry_text);
+
+ if (elm_object_part_content_get(obj, "elm.swallow.clear")) {
+ if (elm_object_focus_get(obj)) {
+ if (elm_entry_is_empty(obj))
+ elm_object_signal_emit(obj, "elm,state,clear,hidden", "");
+ else
+ elm_object_signal_emit(obj, "elm,state,clear,visible", "");
+ }
+ }
+
+ if (input_str == NULL || (strlen(input_str) == 0)) {
+ elm_object_disabled_set(ugd->rename_button, TRUE);
+ elm_entry_input_panel_return_key_disabled_set(ugd->rename_entry, TRUE);
+ WFD_IF_FREE_MEM(input_str);
+ return;
+ }
+
+ is_space_string = is_space_str(input_str);
+ if (is_space_string) {
+ elm_object_disabled_set(ugd->rename_button, TRUE);
+ elm_entry_input_panel_return_key_disabled_set(ugd->rename_entry, TRUE);
+ WFD_IF_FREE_MEM(input_str);
+ return;
+ }
+
+ if (strlen(input_str) > 0) {
+ elm_object_disabled_set(ugd->rename_button, FALSE);
+ elm_entry_input_panel_return_key_disabled_set(ugd->rename_entry, FALSE);
+ }
+
+ WFD_IF_FREE_MEM(input_str);
+ __FUNC_EXIT__;
+}
+
+static void _rename_popup_cancel_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *) data;
+
+ WFD_IF_DEL_OBJ(ugd->rename_popup);
+ WFD_IF_DEL_OBJ(ugd->rename_entry);
+
+ __FUNC_EXIT__;
+}
+
+int _check_device_name(const char *device_name)
+{
+ __FUNC_ENTER__;
+
+ int i = 0;
+ int j = 0;
+ bool is_unavailable_char_found = true;
+
+ if ((device_name == NULL) || (strlen(device_name) == 0)) {
+ return -1;
+ }
+
+ for (i = 0; i < strlen(device_name); i++) {
+ if ((device_name[i] >= '0' && device_name[i] <= '9') ||
+ (device_name[i] >= 'a' && device_name[i] <= 'z') ||
+ (device_name[i] >= 'A' && device_name[i] <= 'Z') ||
+ device_name[i] == ' ') {
+ continue;
+ }
+ is_unavailable_char_found = true;
+ for (j = 0; j < strlen(special_char); j++) {
+ if (special_char[j] == device_name[i]) {
+ is_unavailable_char_found = false;
+ break;
+ }
+ }
+
+ if (is_unavailable_char_found) {
+ DBG(LOG_ERROR, "Unavailable char:[%c]\n", device_name[i]);
+ return -1;
+ }
+ }
+
+ __FUNC_EXIT__;
+ return 0;
+}
+
+static void _rename_popup_ok_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *) data;
+
+ const char *entry_str = elm_entry_entry_get(ugd->rename_entry);
+ char *device_name_str = NULL;
+ device_name_str = elm_entry_markup_to_utf8(entry_str);
+
+ DBG(LOG_INFO, "New device name:[%s]\n", device_name_str);
+ _check_device_name(device_name_str);
+
+ if (0 != vconf_set_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR, device_name_str)) {
+ DBG(LOG_ERROR, "Set vconf[%s] failed\n",VCONFKEY_SETAPPL_DEVICE_NAME_STR);
+ }
+#ifdef WFD_ON_OFF_GENLIST
+ wfd_ug_view_refresh_glitem(ugd->item_wifi_onoff);
+#endif
+ wfd_ug_view_refresh_glitem(ugd->device_name_item);
+ WFD_IF_DEL_OBJ(ugd->rename_popup);
+ WFD_IF_DEL_OBJ(ugd->rename_entry);
+ WFD_IF_FREE_MEM(device_name_str);
+ __FUNC_EXIT__;
+}
+
+static void _eraser_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *) data;
+ WFD_RET_IF(ugd == NULL, "Incorrect parameter(NULL)\n");
+ WFD_RET_IF(ugd->rename_entry == NULL, "ugd->rename_entry(NULL)\n");
+ elm_entry_entry_set(ugd->rename_entry, "");
+ elm_object_domain_translatable_part_text_set(ugd->rename_entry, "elm.guide",
+ PACKAGE, "IDS_STU_HEADER_ENTER_DEVICE_NAME");
+
+ WFD_RET_IF(ugd->rename_button == NULL, "ugd->rename_button(NULL)\n");
+ elm_object_disabled_set(ugd->rename_button, TRUE);
+ elm_entry_input_panel_return_key_disabled_set(ugd->rename_entry, TRUE);
+ __FUNC_EXIT__;
+}
+
+static void __device_name_maxlength_reached_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ __FUNC_ENTER__;
+
+ if (data == NULL || obj == NULL) {
+ DBG(LOG_ERROR, "The param is NULL\n");
+ return;
+ }
+
+ int ret = notification_status_message_post(
+ _("IDS_COM_POP_MAXIMUM_NUMBER_OF_CHARACTERS_REACHED"));
+ if (ret != NOTIFICATION_ERROR_NONE) {
+ DBG(LOG_ERROR, "notification_status_message_post() ERROR [%d]", ret);
+ }
+
+ __FUNC_EXIT__;
+}
+
+static void _entry_focused_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ if (elm_object_part_content_get(obj, "elm.swallow.clear")) {
+ if (!elm_entry_is_empty(obj))
+ elm_object_signal_emit(obj, "elm,state,clear,visible", "");
+ else
+ elm_object_signal_emit(obj, "elm,state,clear,hidden", "");
+ }
+ elm_object_signal_emit(obj, "elm,state,focus,on", "");
+}
+
+static void _rename_entry_keydown_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ __FUNC_ENTER__;
+
+ Evas_Event_Key_Down *ev;
+ Evas_Object *entry = obj;
+
+ WFD_RET_IF(data == NULL, "Incorrect parameter data(NULL)\n");
+ WFD_RET_IF(event_info == NULL, "Incorrect parameter event_info(NULL)\n");
+ WFD_RET_IF(entry == NULL, "Incorrect parameter entry(NULL)\n");
+
+ ev = (Evas_Event_Key_Down *)event_info;
+ DBG(LOG_INFO, "ENTER ev->key:%s", ev->key);
+
+ if (g_strcmp0(ev->key, "KP_Enter") == 0 || g_strcmp0(ev->key, "Return") == 0) {
+ Ecore_IMF_Context *imf_context;
+
+ imf_context = (Ecore_IMF_Context*)elm_entry_imf_context_get(entry);
+ if (imf_context) {
+ ecore_imf_context_input_panel_hide(imf_context);
+ }
+
+ elm_object_focus_set(entry, EINA_FALSE);
+ }
+}
+static char *__wfd_main_rename_desc_label_get(void *data, Evas_Object *obj,
+ const char *part)
+{
+ __FUNC_ENTER__;
+
+ DBG(LOG_INFO,"Part = %s", part);
+ if (obj == NULL || part == NULL) {
+ return NULL;
+ }
+
+ if (!strcmp(part, "elm.text.multiline")) {
+ return g_strdup(_("IDS_ST_POP_DEVICE_NAMES_ARE_DISPLAYED_TO_DISTINGUISH_EACH_OF_THE_DEVICES_AVAILABLE_MSG"));
+ }
+ __FUNC_EXIT__;
+ return NULL;
+}
+
+static Evas_Object *__wfd_main_rename_entry_icon_get(
+ void *data, Evas_Object *obj, const char *part)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *)data;
+ WFD_RETV_IF(ugd == NULL, NULL, "Incorrect parameter(NULL)\n");
+ Evas_Object *entry = NULL;
+ Evas_Object *layout = NULL;
+ Evas_Object *button = NULL;
+ Ecore_IMF_Context *imf_context;
+ char *name_value = NULL;
+
+ static Elm_Entry_Filter_Limit_Size limit_filter_data;
+
+ if (!strcmp(part, "elm.icon.entry")) {
+
+ name_value = elm_entry_utf8_to_markup(ugd->dev_name);
+ entry = ea_editfield_add(obj, EA_EDITFIELD_SCROLL_SINGLELINE);
+ limit_filter_data.max_char_count = WSC_SPEC_DEVICE_NAME_MAX_LEN;
+ elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, &limit_filter_data);
+
+ evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ ea_entry_selection_back_event_allow_set(entry, EINA_TRUE);
+ elm_object_signal_emit(entry, "elm,action,hide,search_icon", "");
+ elm_object_domain_translatable_part_text_set(entry, "elm.guide",
+ PACKAGE, "IDS_STU_HEADER_ENTER_DEVICE_NAME");
+
+ imf_context = (Ecore_IMF_Context*)elm_entry_imf_context_get(entry);
+ if (imf_context) {
+ ecore_imf_context_input_panel_return_key_type_set(imf_context,
+ ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_DONE);
+ }
+
+ ugd->rename_entry = entry;
+ elm_entry_cnp_mode_set(entry, ELM_CNP_MODE_PLAINTEXT);
+ elm_entry_entry_set(entry, name_value);
+ WFD_IF_FREE_MEM(name_value);
+ elm_entry_cursor_end_set(entry);
+
+ evas_object_smart_callback_add(entry, "changed,user", _rename_popop_entry_changed_cb, ugd);
+ evas_object_smart_callback_add(entry, "changed", _rename_popop_entry_changed_cb, ugd);
+ evas_object_smart_callback_add(entry, "preedit,changed", _rename_popop_entry_changed_cb, ugd);
+ evas_object_smart_callback_add(entry, "maxlength,reached",
+ __device_name_maxlength_reached_cb, ugd);
+
+ button = elm_button_add(obj);
+ elm_object_style_set(button, "search_clear");
+ elm_object_focus_allow_set(button, EINA_FALSE);
+ elm_object_part_content_set(entry, "elm.swallow.clear", button);
+ evas_object_smart_callback_add(button, "clicked", _eraser_btn_clicked_cb, ugd);
+
+ evas_object_smart_callback_add(entry, "focused", _entry_focused_cb, NULL);
+ evas_object_event_callback_add(entry, EVAS_CALLBACK_KEY_DOWN, _rename_entry_keydown_cb, ugd);
+ elm_object_part_content_set(layout, "entry_part", entry);
+ evas_object_show(entry);
+ elm_object_focus_set(entry, EINA_TRUE);
+
+ __FUNC_EXIT__;
+ return entry;
+ }
+ __FUNC_EXIT__;
+ return NULL;
+}
+
+
+/**
+ * This function let the ug create rename popup
+ * @return void
+ * @param[in] data the pointer to the main data structure
+ * @param[in] obj the pointer to the evas object
+ * @param[in] event_info the pointer to the event information
+ */
+void _gl_rename_device_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ __FUNC_ENTER__;
+ struct ug_data *ugd = (struct ug_data *) data;
+ WFD_RET_IF(ugd == NULL, "The param is NULL\n");
+ WFD_IF_DEL_OBJ(ugd->ctxpopup);
+ WFD_IF_DEL_OBJ(ugd->rename_popup);
+ Evas_Object *popup;
+ Evas_Object *button;
+ Evas_Object *genlist = NULL;
+ Evas_Object *layout = NULL;
+ Elm_Object_Item *git = NULL;
+
+ popup = elm_popup_add(ugd->layout);
+// elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
+ ea_object_event_callback_add(popup, EA_CALLBACK_BACK, _rename_popup_cancel_cb, ugd);
+ evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_domain_translatable_part_text_set(popup, "title,text",
+ PACKAGE, "IDS_ST_HEADER_RENAME_DEVICE");
+
+ layout = elm_layout_add(popup);
+ elm_layout_file_set(layout, WFD_UG_EDJ_PATH, "main_rename_device_ly");
+ evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ genlist = elm_genlist_add(layout);
+ evas_object_size_hint_weight_set(genlist,
+ EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
+ elm_scroller_content_min_limit(genlist, EINA_FALSE, EINA_TRUE);
+
+ /* Entry genlist item */
+ ugd->rename_entry_itc = elm_genlist_item_class_new();
+ WFD_RET_IF(ugd->rename_entry_itc == NULL, "rename_entry_itc is NULL\n");
+ ugd->rename_entry_itc->item_style = "entry";
+ ugd->rename_entry_itc->func.text_get = NULL;
+ ugd->rename_entry_itc->func.content_get = __wfd_main_rename_entry_icon_get;
+ ugd->rename_entry_itc->func.state_get = NULL;
+ ugd->rename_entry_itc->func.del = NULL;
+
+ elm_genlist_item_append(genlist, ugd->rename_entry_itc, ugd,
+ NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+ ugd->rename_desc_itc = elm_genlist_item_class_new();
+ WFD_RET_IF(ugd->rename_desc_itc == NULL, "rename_desc_itc is NULL\n");
+ ugd->rename_desc_itc->item_style = "multiline_sub";
+ ugd->rename_desc_itc->func.text_get = __wfd_main_rename_desc_label_get;
+ ugd->rename_desc_itc->func.content_get = NULL;
+ ugd->rename_desc_itc->func.state_get = NULL;
+ ugd->rename_desc_itc->func.del = NULL;
+
+ git = elm_genlist_item_append(genlist, ugd->rename_desc_itc, NULL, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ if(git != NULL)
+ elm_genlist_item_select_mode_set(git,
+ ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+
+ button = elm_button_add(popup);
+ elm_object_style_set(button, "popup");
+ elm_object_domain_translatable_text_set(button, PACKAGE,
+ "IDS_BR_SK_CANCEL");
+ elm_object_part_content_set(popup, "button1", button);
+ evas_object_smart_callback_add(button, "clicked", _rename_popup_cancel_cb, ugd);
+
+ button = elm_button_add(popup);
+ elm_object_style_set(button, "popup");
+ elm_object_domain_translatable_text_set(button, PACKAGE,
+ "IDS_ST_SK_RENAME");
+ elm_object_part_content_set(popup, "button2", button);
+ evas_object_smart_callback_add(button, "clicked", _rename_popup_ok_cb, ugd);
+ ugd->rename_button = button;
+ evas_object_show(button);
+
+ elm_genlist_realization_mode_set(genlist, EINA_TRUE);
+ evas_object_show(genlist);
+ elm_object_part_content_set(layout, "elm.swallow.layout", genlist);
+ evas_object_show(layout);
+ elm_object_content_set(popup, layout);
+ evas_object_show(popup);
+ elm_object_focus_set(ugd->rename_entry, EINA_TRUE);
+ ugd->rename_popup = popup;
+ evas_object_show(button);
+
+ __FUNC_EXIT__;
+}
+