Boilerplate is modified
[apps/native/ug-wifi-direct.git] / ug-wifidirect / src / wfd_client.c
index e565b52..1be7fab 100755 (executable)
@@ -1,13 +1,13 @@
 /*
 *  WiFi-Direct UG
 *
-* Copyright 2012  Samsung Electronics Co., Ltd
+* Copyright 2012 Samsung Electronics Co., Ltd
 
-* Licensed under the Flora License, Version 1.0 (the "License");
+* Licensed under the Flora License, Version 1.1 (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
+* http://floralicense.org/license
 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 #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"
 
+/**
+ *     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__;
+       __WDUG_LOG_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) {
+               WDUG_LOGE("Failed to get wifi state from vconf. [%d]\n", res);
+               return;
+       }
+
+       if (wifi_state == VCONFKEY_WIFI_OFF) {
+               WDUG_LOGI("WiFi is turned off\n");
+               wfd_client_swtch_force(ugd, TRUE);
+       } else {
+               WDUG_LOGI("WiFi is turned on\n");
+       }
+
+       res = net_deregister_client();
+       if (res != NET_ERR_NONE) {
+               WDUG_LOGE("Failed to deregister network client. [%d]\n", res);
+       }
+
+       __WDUG_LOG_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__;
+       __WDUG_LOG_FUNC_ENTER__;
+       WDUG_LOGI("Event from network. [%d]\n", event_info->Event);
+       __WDUG_LOG_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;
+       __WDUG_LOG_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) {
+               WDUG_LOGE("Failed to register vconf callback\n");
+               return -1;
+       }
+
+       WDUG_LOGI("Vconf key callback is registered\n");
+
+       res = net_register_client((net_event_cb_t) _network_event_cb, NULL);
+       if (res != NET_ERR_NONE) {
+               WDUG_LOGE("Failed to register network client. [%d]\n", res);
+               return -1;
+       }
+
+       WDUG_LOGI("Network client is registered\n");
+
+       res = net_wifi_power_off();
+       if (res != NET_ERR_NONE) {
+               WDUG_LOGE("Failed to turn off wifi. [%d]\n", res);
+               return -1;
+       }
+
+       WDUG_LOGI("WiFi power off\n");
+
+       __WDUG_LOG_FUNC_EXIT__;
+       return 0;
 }
 
-static void _hotspot_state_cb(keynode_t *key, void *data)
+/**
+ *     This function let the ug make a change callback for enabling hotspot state
+ *     @return   void
+ *     @param[in] key the pointer to the key
+ *     @param[in] data the pointer to the main data structure
+ */
+static void _enable_hotspot_state_cb(keynode_t *key, void *data)
 {
-       __FUNC_ENTER__;
-       struct ug_data *ugd = (struct ug_data*) data;
+       __WDUG_LOG_FUNC_ENTER__;
+       struct ug_data *ugd = (struct ug_data *)data;
        int res;
        int hotspot_mode;
        tethering_error_e ret = TETHERING_ERROR_NONE;
        tethering_h th = NULL;
 
        res = vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &hotspot_mode);
-       if (res != 0)
-       {
-               DBG(LOG_ERROR, "Failed to get mobile hotspot state from vconf. [%d]\n", res);
-               // TODO: set genlist head item as "WiFi Direct"
+       if (res != 0) {
+               WDUG_LOGE("Failed to get mobile hotspot state from vconf. [%d]\n", res);
                return;
        }
 
-       if(hotspot_mode & VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI)
-       {
-               DBG(LOG_VERBOSE, " Mobile hotspot is activated\n");
+       if (hotspot_mode & VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI) {
+               WDUG_LOGI(" Mobile hotspot is activated\n");
+       }
+
+       th = ugd->hotspot_handle;
+
+       if (th != NULL) {
+               /* Deregister cbs */
+               ret = tethering_unset_enabled_cb(th, TETHERING_TYPE_WIFI);
+               if (ret != TETHERING_ERROR_NONE) {
+                       WDUG_LOGE("tethering_unset_enabled_cb is failed(%d)\n", ret);
+               }
+
+               /* Destroy tethering handle */
+               ret = tethering_destroy(th);
+               if (ret != TETHERING_ERROR_NONE) {
+                       WDUG_LOGE("tethering_destroy is failed(%d)\n", ret);
+               }
+
+               ugd->hotspot_handle = NULL;
+       }
+
+       __WDUG_LOG_FUNC_EXIT__;
+}
+
+/**
+ *     This function let the ug make a change callback for disabling hotspot state
+ *     @return   void
+ *     @param[in] key the pointer to the key
+ *     @param[in] data the pointer to the main data structure
+ */
+static void _disable_hotspot_state_cb(keynode_t *key, void *data)
+{
+       __WDUG_LOG_FUNC_ENTER__;
+       struct ug_data *ugd = (struct ug_data *)data;
+       int res;
+       int hotspot_mode;
+       tethering_error_e ret = TETHERING_ERROR_NONE;
+       tethering_h th = NULL;
+
+       res = vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &hotspot_mode);
+       if (res != 0) {
+               WDUG_LOGE("Failed to get mobile hotspot state from vconf. [%d]\n", res);
+               return;
        }
-       else
-       {
-               DBG(LOG_VERBOSE, " Mobile hotspot is deactivated\n");
+
+       if (!(hotspot_mode & VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI)) {
+               WDUG_LOGI(" Mobile hotspot is deactivated\n");
                wfd_client_swtch_force(ugd, TRUE);
        }
 
        th = ugd->hotspot_handle;
 
-       if(th != NULL)
-       {
+       if (th != NULL) {
                /* Deregister cbs */
                ret = tethering_unset_disabled_cb(th, TETHERING_TYPE_WIFI);
-               if(ret != TETHERING_ERROR_NONE)
-                       DBG(LOG_ERROR, "tethering_unset_disabled_cb is failed(%d)\n", ret);
+               if (ret != TETHERING_ERROR_NONE) {
+                       WDUG_LOGE("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);
+               if (ret != TETHERING_ERROR_NONE) {
+                       WDUG_LOGE("tethering_destroy is failed(%d)\n", ret);
+               }
 
                ugd->hotspot_handle = NULL;
        }
 
-       __FUNC_EXIT__;
+       __WDUG_LOG_FUNC_EXIT__;
 }
 
+/**
+ *     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)
+{
+       __WDUG_LOG_FUNC_ENTER__;
+
+       if (error != TETHERING_ERROR_NONE) {
+               if (is_requested != TRUE) {
+                       return;
+               }
+
+               WDUG_LOGE("error !!! TETHERING is not enabled.\n");
+               return;
+       }
+
+       WDUG_LOGI("TETHERING is enabled.\n");
+
+       __WDUG_LOG_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__;
+       __WDUG_LOG_FUNC_ENTER__;
 
        if (error != TETHERING_ERROR_NONE) {
-       
                if (code != TETHERING_DISABLED_BY_REQUEST) {
                        return;
                }
-               DBG(LOG_ERROR, "error !!! TETHERING is not disabled.\n");
+
+               WDUG_LOGE("error !!! TETHERING is not disabled.\n");
                return;
        }
 
-       DBG(LOG_VERBOSE, "TETHERING is disabled.\n");
-
-       __FUNC_EXIT__;
+       WDUG_LOGI("TETHERING is disabled.\n");
 
+       __WDUG_LOG_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)
+{
+       __WDUG_LOG_FUNC_ENTER__;
+       struct ug_data *ugd = (struct ug_data *)data;
+       int res;
+       tethering_error_e ret = TETHERING_ERROR_NONE;
+       tethering_h th = NULL;
+
+       res = vconf_notify_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE, _enable_hotspot_state_cb, ugd);
+       if (res == -1) {
+               WDUG_LOGE("Failed to register vconf callback\n");
+               return -1;
+       }
+
+       /* Create tethering handle */
+       ret = tethering_create(&th);
+       if (ret != TETHERING_ERROR_NONE) {
+               WDUG_LOGE("Failed to tethering_create() [%d]\n", ret);
+               return -1;
+       } else {
+               WDUG_LOGI("Succeeded to tethering_create()\n");
+       }
 
+       /* Register cbs */
+       ret = tethering_set_enabled_cb(th, TETHERING_TYPE_WIFI, __enabled_cb, NULL);
+       if (ret != TETHERING_ERROR_NONE) {
+               WDUG_LOGE("tethering_set_enabled_cb is failed\n", ret);
+               return -1;
+       }
+
+       /* Enable tethering */
+       ret = tethering_enable(th, TETHERING_TYPE_WIFI);
+       if (ret != TETHERING_ERROR_NONE) {
+               WDUG_LOGE("Failed to turn on mobile hotspot. [%d]\n", ret);
+               return -1;
+       } else {
+               WDUG_LOGI("Succeeded to turn on mobile hotspot\n");
+       }
+
+       ugd->hotspot_handle = th;
+       ugd->is_hotspot_off = FALSE;
+
+       __WDUG_LOG_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;
+       __WDUG_LOG_FUNC_ENTER__;
+       struct ug_data *ugd = (struct ug_data *)data;
        int res;
        tethering_error_e ret = TETHERING_ERROR_NONE;
        tethering_h th = NULL;
 
-       res = vconf_notify_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE, _hotspot_state_cb, ugd);
-       if (res == -1)
-       {
-               DBG(LOG_ERROR, "Failed to register vconf callback\n");
+       res = vconf_notify_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE, _disable_hotspot_state_cb, ugd);
+       if (res == -1) {
+               WDUG_LOGE("Failed to register vconf callback\n");
                return -1;
        }
 
        /* Create tethering handle */
        ret = tethering_create(&th);
-       if(ret != TETHERING_ERROR_NONE)
-       {
-               DBG(LOG_ERROR, "Failed to tethering_create() [%d]\n", ret);
+       if (ret != TETHERING_ERROR_NONE) {
+               WDUG_LOGE("Failed to tethering_create() [%d]\n", ret);
                return -1;
-       }
-       else
-       {
-               DBG(LOG_VERBOSE, "Succeeded to tethering_create()\n");
+       } else {
+               WDUG_LOGI("Succeeded to tethering_create()\n");
        }
 
        /* Register cbs */
-       ret = tethering_set_disabled_cb(th, TETHERING_TYPE_WIFI,
-                       __disabled_cb, NULL);
-       if(ret != TETHERING_ERROR_NONE)
-       {
-               DBG(LOG_ERROR, "tethering_set_disabled_cb is failed\n", ret);
+       ret = tethering_set_disabled_cb(th, TETHERING_TYPE_WIFI, __disabled_cb, NULL);
+       if (ret != TETHERING_ERROR_NONE) {
+               WDUG_LOGE("tethering_set_disabled_cb is failed\n", ret);
                return -1;
        }
 
        /* Disable tethering */
        ret = tethering_disable(th, TETHERING_TYPE_WIFI);
-       if(ret != TETHERING_ERROR_NONE)
-       {
-               DBG(LOG_ERROR, "Failed to turn off mobile hotspot. [%d]\n", ret);
+       if (ret != TETHERING_ERROR_NONE) {
+               WDUG_LOGE("Failed to turn off mobile hotspot. [%d]\n", ret);
                return -1;
-       }
-       else
-       {
-               DBG(LOG_VERBOSE, "Succeeded to turn off mobile hotspot\n");
+       } else {
+               WDUG_LOGI("Succeeded to turn off mobile hotspot\n");
        }
 
        ugd->hotspot_handle = th;
+       ugd->is_hotspot_off = TRUE;
 
-
-       __FUNC_EXIT__;
+       __WDUG_LOG_FUNC_EXIT__;
        return 0;
 }
 
-#if 0
-static device_type_s *wfd_client_find_peer_by_ssid(void *data, const char *ssid)
-{
-    __FUNC_ENTER__;
-    struct ug_data *ugd = (struct ug_data*) data;
-    int i;
-
-    if(ugd == NULL)
-    {
-        DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
-        return NULL;
-    }
-
-    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__;
-
-    return NULL;
-}
-#endif
-
+/**
+ *     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;
-    int i;
-
-    if(ugd == NULL)
-    {
-        DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
-        return 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__;
+       __WDUG_LOG_FUNC_ENTER__;
+       struct ug_data *ugd = (struct ug_data *)data;
+       int i;
+
+       if (ugd == NULL) {
+               WDUG_LOGE("Incorrect parameter(NULL)\n");
+               return NULL;
+       }
+
+       if (ugd->multi_connect_mode != WFD_MULTI_CONNECT_MODE_NONE) {
+               for (i = 0; i < ugd->raw_multi_selected_peer_cnt; i++) {
+                       WDUG_LOGI("[Multi Connect] check %dth peer\n", i);
+                       if (!strncmp(mac_addr, (const char *)ugd->raw_multi_selected_peers[i].mac_addr, MAC_LENGTH)) {
+                               WDUG_LOGI("selected found peer. [%d]\n", i);
+                               __WDUG_LOG_FUNC_EXIT__;
                                return &ugd->raw_multi_selected_peers[i];
                        }
                }
-    }
-    else
-    {
-               for(i=0; i<ugd->raw_discovered_peer_cnt; i++)
-               {
-                       DBG(LOG_VERBOSE, "check %dth peer\n", i);
-                       if(!strncmp(mac_addr, (const char*) ugd->raw_discovered_peers[i].mac_addr, MAC_LENGTH))
-                       {
-                               DBG(LOG_VERBOSE, "found peer. [%d]\n", i);
-                               __FUNC_EXIT__;
+       } else {
+               for (i = 0; i < ugd->raw_discovered_peer_cnt; i++) {
+                       WDUG_LOGI("check %dth peer\n", i);
+                       if (!strncmp(mac_addr, (const char *)ugd->raw_discovered_peers[i].mac_addr, MAC_LENGTH)) {
+                               WDUG_LOGI("found peer. [%d]\n", i);
+                               __WDUG_LOG_FUNC_EXIT__;
                                return &ugd->raw_discovered_peers[i];
                        }
                }
+       }
 
-    }
-    __FUNC_EXIT__;
-
-    return NULL;
-}
-
-int _wfd_ug_view_clean_on_off(struct ug_data *ugd)
-{
-       wfd_ug_view_update_peers(ugd);
-       return 0;
+       __WDUG_LOG_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);
-
-    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);
-
-                ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
-                ugd->wfd_onoff = 0;
-                wfd_ug_view_refresh_glitem(ugd->head);
-                return;
-            }
-
-            ugd->head_text_mode = HEAD_TEXT_TYPE_ACTIVATED;
-            ugd->wfd_onoff = 1;
-            wfd_ug_view_refresh_glitem(ugd->head);
-
-            wfg_ug_act_popup_remove(ugd);
-
-            res = vconf_ignore_key_changed(VCONFKEY_WIFI_STATE, _wifi_state_cb);
-            if(res == -1)
-            {
-                DBG(LOG_ERROR, "Failed to ignore vconf key callback for wifi state\n");
-            }
-
-            res = vconf_ignore_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE, _hotspot_state_cb);
-            if(res == -1)
-            {
-                DBG(LOG_ERROR, "Failed to ignore vconf key callback for hotspot state\n");
-            }
-
-            res = wifi_direct_start_discovery(FALSE, 0);
-            if(res != WIFI_DIRECT_ERROR_NONE)
-            {
-                DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", res);
-            }
-            DBG(LOG_VERBOSE, "Discovery is started\n");
-            break;
-
-        case WIFI_DIRECT_DEVICE_STATE_DEACTIVATED:
-            DBG(LOG_VERBOSE, "WIFI_DIRECT_DEVICE_STATE_DEACTIVATED\n");
-            if(error_code != WIFI_DIRECT_ERROR_NONE)
-            {
-                DBG(LOG_ERROR, "Error in Activation/Deactivation [%d]\n", error_code);
-                wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_DEACTIVATE_FAIL"), POPUP_TYPE_DEACTIVATE_FAIL);
-                ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
-                ugd->wfd_onoff = 1;
-                wfd_ug_view_refresh_glitem(ugd->head);
-                return;
-            }
-
-            ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
-            ugd->wfd_onoff = 0;
-
-            wfd_ug_view_update_peers(ugd);
-
-            break;
-        default:
-            break;
-    }
-
-    wfd_ug_view_refresh_glitem(ugd->head);
-
-    if (ugd->scan_btn) {
-       wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
-    }
-
-    if (ugd->multi_connect_btn) {
-       wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
-    }
-
-    __FUNC_EXIT__;
-    return;
+       __WDUG_LOG_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:
+               WDUG_LOGI("WIFI_DIRECT_DEVICE_STATE_ACTIVATED\n");
+               if (error_code != WIFI_DIRECT_ERROR_NONE) {
+                       WDUG_LOGE("Error in Activation/Deactivation [%d]\n", error_code);
+                       wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_ACTIVATE_FAIL"), POPUP_TYPE_ACTIVATE_FAIL);
+
+                       ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
+                       ugd->wfd_onoff = 0;
+                       wfd_ug_view_refresh_glitem(ugd->head);
+                       return;
+               }
+
+               ugd->head_text_mode = HEAD_TEXT_TYPE_ACTIVATED;
+               ugd->wfd_onoff = 1;
+               wfd_ug_view_refresh_glitem(ugd->head);
+
+               wfg_ug_act_popup_remove(ugd);
+
+               res = vconf_ignore_key_changed(VCONFKEY_WIFI_STATE, _wifi_state_cb);
+               if (res == -1) {
+                       WDUG_LOGE("Failed to ignore vconf key callback for wifi state\n");
+               }
+
+               res = vconf_ignore_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE, _disable_hotspot_state_cb);
+               if (res == -1) {
+                       WDUG_LOGE("Failed to ignore vconf key callback for hotspot state\n");
+               }
+
+               res = wifi_direct_start_discovery(FALSE, MAX_SCAN_TIME_OUT);
+               if (res != WIFI_DIRECT_ERROR_NONE) {
+                       WDUG_LOGE("Failed to start discovery. [%d]\n", res);
+                       ugd->is_re_discover = TRUE;
+                       wifi_direct_cancel_discovery();
+               } else {
+                       WDUG_LOGI("Discovery is started\n");
+                       ugd->is_re_discover = FALSE;
+               }
+
+               break;
+       case WIFI_DIRECT_DEVICE_STATE_DEACTIVATED:
+               WDUG_LOGI("WIFI_DIRECT_DEVICE_STATE_DEACTIVATED\n");
+               if (error_code != WIFI_DIRECT_ERROR_NONE) {
+                       WDUG_LOGE("Error in Activation/Deactivation [%d]\n", error_code);
+                       wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_DEACTIVATE_FAIL"), POPUP_TYPE_DEACTIVATE_FAIL);
+                       ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
+                       ugd->wfd_onoff = 1;
+                       wfd_ug_view_refresh_glitem(ugd->head);
+                       return;
+               }
+
+               ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
+               ugd->wfd_onoff = 0;
+
+               /*
+               * when deactivated, clear all the
+               *  discovered peers and connected peers
+               */
+               if (ugd->raw_discovered_peer_cnt > 0) {
+                       memset(ugd->raw_discovered_peers, 0x00, ugd->raw_discovered_peer_cnt*sizeof(device_type_s));
+               }
+
+               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_ug_view_update_peers(ugd);
+
+               /* remove the callback for hotspot */
+               res = vconf_ignore_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE, _enable_hotspot_state_cb);
+               if (res == -1) {
+                       WDUG_LOGE("Failed to ignore vconf key callback for hotspot state\n");
+               }
+
+               /* when deactivated, stop the timer */
+               if (ugd->monitor_timer) {
+                       ecore_timer_del(ugd->monitor_timer);
+                       ugd->monitor_timer = NULL;
+               }
+               break;
+       default:
+               break;
+       }
+
+       wfd_ug_view_refresh_glitem(ugd->head);
+
+       if (ugd->scan_btn) {
+               wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
+       }
+
+       if (ugd->multi_connect_btn) {
+               wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
+       }
+
+       if (ugd->back_btn) {
+               elm_object_disabled_set(ugd->back_btn, FALSE);
+       }
+
+       __WDUG_LOG_FUNC_EXIT__;
+       return;
 }
 
-bool _wfd_discoverd_peer_cb(wifi_direct_discovered_peer_info_s* peer, void *user_data)
+/**
+ *     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__;
+       __WDUG_LOG_FUNC_ENTER__;
+       if (NULL == peer || NULL == user_data) {
+               WDUG_LOGE("Incorrect parameter(NULL)\n");
+               __WDUG_LOG_FUNC_EXIT__;
+               return FALSE;
+       }
 
-    struct ug_data *ugd = (struct ug_data*) user_data;
-    int peer_cnt = ugd->raw_discovered_peer_cnt;
+       struct ug_data *ugd = (struct ug_data *)user_data;
+       int peer_cnt = ugd->raw_discovered_peer_cnt;
 
-    DBG(LOG_VERBOSE, "%dth discovered peer. [%s] [%s]\n", peer_cnt, peer->ssid, peer->mac_address);
+       WDUG_LOGI("%dth discovered peer. [%s] [%s]\n", peer_cnt, peer->device_name, peer->mac_address);
 
-    strncpy(ugd->raw_discovered_peers[peer_cnt].ssid, peer->ssid, sizeof(ugd->raw_discovered_peers[peer_cnt].ssid));
-    ugd->raw_discovered_peers[peer_cnt].category = peer->primary_device_type;
-    strncpy(ugd->raw_discovered_peers[peer_cnt].mac_addr, peer->mac_address, MAC_LENGTH);
-    strncpy(ugd->raw_discovered_peers[peer_cnt].if_addr, peer->interface_address, MAC_LENGTH);
-    ugd->raw_discovered_peers[peer_cnt].is_group_owner = peer->is_group_owner;
-    ugd->raw_discovered_peers[peer_cnt].is_persistent_group_owner = peer->is_persistent_group_owner;
-    ugd->raw_discovered_peers[peer_cnt].is_connected = peer->is_connected;
+       strncpy(ugd->raw_discovered_peers[peer_cnt].ssid, peer->device_name, SSID_LENGTH);
+       ugd->raw_discovered_peers[peer_cnt].ssid[SSID_LENGTH-1] = '\0';
+       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);
+       ugd->raw_discovered_peers[peer_cnt].mac_addr[MAC_LENGTH-1] = '\0';
+       strncpy(ugd->raw_discovered_peers[peer_cnt].if_addr, peer->interface_address, MAC_LENGTH);
+       ugd->raw_discovered_peers[peer_cnt].if_addr[MAC_LENGTH-1] = '\0';
+       ugd->raw_discovered_peers[peer_cnt].is_group_owner = peer->is_group_owner;
+       ugd->raw_discovered_peers[peer_cnt].is_persistent_group_owner = peer->is_persistent_group_owner;
+       ugd->raw_discovered_peers[peer_cnt].is_connected = peer->is_connected;
 
-    if (TRUE == peer->is_connected) {
-       ugd->raw_discovered_peers[peer_cnt].conn_status = PEER_CONN_STATUS_CONNECTED;
-    } else {
-       ugd->raw_discovered_peers[peer_cnt].conn_status = PEER_CONN_STATUS_DISCONNECTED;
-    }
+       if (TRUE == peer->is_connected) {
+               ugd->raw_discovered_peers[peer_cnt].conn_status = PEER_CONN_STATUS_CONNECTED;
+       } else {
+               ugd->raw_discovered_peers[peer_cnt].conn_status = PEER_CONN_STATUS_DISCONNECTED;
+       }
 
-    DBG(LOG_VERBOSE, "\tSSID: [%s]\n", ugd->raw_discovered_peers[peer_cnt].ssid);
-    DBG(LOG_VERBOSE, "\tPeer category [%d] -> [%d]\n", peer->primary_device_type, ugd->raw_discovered_peers[peer_cnt].category);
-    DBG(LOG_VERBOSE, "\tStatus: [%d]\n", ugd->raw_discovered_peers[peer_cnt].conn_status);
+       WDUG_LOGI("\tSSID: [%s]\n", ugd->raw_discovered_peers[peer_cnt].ssid);
+       WDUG_LOGI("\tPeer category [%d] -> [%d]\n", peer->primary_device_type, ugd->raw_discovered_peers[peer_cnt].category);
+       WDUG_LOGI("\tStatus: [%d]\n", ugd->raw_discovered_peers[peer_cnt].conn_status);
 
-    ugd->raw_discovered_peer_cnt ++;
+       ugd->raw_discovered_peer_cnt++;
 
-    free(peer->ssid);
-    free(peer->mac_address);
-    free(peer->interface_address);
-    free(peer);
+       free(peer->device_name);
+       free(peer->mac_address);
+       free(peer->interface_address);
+       free(peer);
 
-    __FUNC_EXIT__;
-    return TRUE;
+       __WDUG_LOG_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;
-
-    DBG(LOG_VERBOSE, "%dth connected peer. [%s] [%s]\n", peer_cnt, peer->ssid, peer->mac_address);
-
-    strncpy(ugd->raw_connected_peers[peer_cnt].ssid, peer->ssid, sizeof(ugd->raw_connected_peers[peer_cnt].ssid));
-    ugd->raw_connected_peers[peer_cnt].category = peer->primary_device_type;
-    strncpy(ugd->raw_connected_peers[peer_cnt].mac_addr, peer->mac_address, MAC_LENGTH);
-    strncpy(ugd->raw_connected_peers[peer_cnt].if_addr, peer->interface_address, MAC_LENGTH);
-    ugd->raw_connected_peers[peer_cnt].conn_status = PEER_CONN_STATUS_CONNECTED;
-
-    DBG(LOG_VERBOSE, "\tStatus: [%d]\n", ugd->raw_connected_peers[peer_cnt].conn_status);
-    DBG(LOG_VERBOSE, "\tCategory: [%d]\n", ugd->raw_connected_peers[peer_cnt].category);
-    DBG(LOG_VERBOSE, "\tSSID: [%s]\n", ugd->raw_connected_peers[peer_cnt].ssid);
-
-    ugd->raw_connected_peer_cnt++;
-
-    free(peer->ssid);
-    free(peer->mac_address);
-    free(peer->interface_address);
-    free(peer);
-    __FUNC_EXIT__;
-    return TRUE;
+       __WDUG_LOG_FUNC_ENTER__;
+       if (NULL == peer || NULL == user_data) {
+               WDUG_LOGE("Incorrect parameter(NULL)\n");
+               __WDUG_LOG_FUNC_EXIT__;
+               return FALSE;
+       }
+
+       struct ug_data *ugd = (struct ug_data *)user_data;
+       int peer_cnt = ugd->raw_connected_peer_cnt;
+
+       WDUG_LOGI("%dth connected peer. [%s] [%s]\n", peer_cnt, peer->device_name, peer->mac_address);
+
+       strncpy(ugd->raw_connected_peers[peer_cnt].ssid, peer->device_name, SSID_LENGTH);
+       ugd->raw_connected_peers[peer_cnt].ssid[SSID_LENGTH-1] = '\0';
+       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);
+       ugd->raw_connected_peers[peer_cnt].mac_addr[MAC_LENGTH-1] = '\0';
+       strncpy(ugd->raw_connected_peers[peer_cnt].if_addr, peer->interface_address, MAC_LENGTH);
+       ugd->raw_connected_peers[peer_cnt].if_addr[MAC_LENGTH-1] = '\0';
+       ugd->raw_connected_peers[peer_cnt].conn_status = PEER_CONN_STATUS_CONNECTED;
+
+       WDUG_LOGI("\tStatus: [%d]\n", ugd->raw_connected_peers[peer_cnt].conn_status);
+       WDUG_LOGI("\tCategory: [%d]\n", ugd->raw_connected_peers[peer_cnt].category);
+       WDUG_LOGI("\tSSID: [%s]\n", ugd->raw_connected_peers[peer_cnt].ssid);
+       WDUG_LOGI("\tMAC addr: [" MACSTR "]\n", ugd->raw_connected_peers[peer_cnt].mac_addr);
+       WDUG_LOGI("\tIface addr: [" MACSTR "]\n", ugd->raw_connected_peers[peer_cnt].if_addr);
+
+       ugd->raw_connected_peer_cnt++;
+
+       free(peer->device_name);
+       free(peer->mac_address);
+       free(peer->interface_address);
+       free(peer);
+
+       __WDUG_LOG_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)
 {
+       __WDUG_LOG_FUNC_ENTER__;
        int res = 0;
 
-       if (ugd==NULL)
+       if (ugd == NULL) {
                return -1;
+       }
 
        ugd->raw_discovered_peer_cnt = 0;
-    res = wifi_direct_foreach_discovered_peers(_wfd_discoverd_peer_cb, (void*) ugd);
-    if (res != WIFI_DIRECT_ERROR_NONE)
-    {
-       ugd->raw_discovered_peer_cnt = 0;
-        DBG(LOG_ERROR, "Get discovery result failed: %d\n", res);
-    }
+       res = wifi_direct_foreach_discovered_peers(_wfd_discoverd_peer_cb, (void *)ugd);
+       if (res != WIFI_DIRECT_ERROR_NONE) {
+               ugd->raw_discovered_peer_cnt = 0;
+               WDUG_LOGE("Get discovery result failed: %d\n", res);
+       }
 
+       __WDUG_LOG_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)
 {
+       __WDUG_LOG_FUNC_ENTER__;
        int res = 0;
 
-       if (ugd==NULL)
+       if (ugd == NULL) {
                return -1;
+       }
 
        ugd->raw_connected_peer_cnt = 0;
-       res = wifi_direct_foreach_connected_peers(_wfd_connected_peer_cb, (void*) ugd);
-       if(res != WIFI_DIRECT_ERROR_NONE)
-       {
+       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);
+               WDUG_LOGE("Get connected peer failed: %d\n", res);
        }
+
+       __WDUG_LOG_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 make a callback for deactivating wfd automatically
+ *     @return   if stop the timer, return ECORE_CALLBACK_CANCEL, else return ECORE_CALLBACK_RENEW
+ *     @param[in] user_data the pointer to the main data structure
+ */
+static Eina_Bool _wfd_automatic_deactivated_for_no_connection_cb(void *user_data)
 {
-    __FUNC_ENTER__;
-    struct ug_data *ugd = (struct ug_data*) user_data;
-
-    if(ugd == NULL)
-    {
-        DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
-        return;
-    }
-
-    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;
-    }
-
-    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);
+       int res = -1;
+       int interval = 0;
+       struct ug_data *ugd = (struct ug_data *)user_data;
+
+       if (NULL == ugd) {
+               WDUG_LOGE("NULL parameters.\n");
+               return ECORE_CALLBACK_CANCEL;
        }
 
-       if (ugd->multi_connect_btn) {
-               wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_STOPSCAN"), TRUE);
+       /* check the action, if action is exist, keep the cb */
+       res = wifi_direct_get_state(&ugd->wfd_status);
+       if (res != WIFI_DIRECT_ERROR_NONE) {
+               WDUG_LOGE("Failed to get link status. [%d]\n", res);
+               return ECORE_CALLBACK_CANCEL;
        }
-    } else {
-       if (ugd->scan_btn) {
-               wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
+
+       if (ugd->last_wfd_status != ugd->wfd_status) {
+               WDUG_LOGE("Action is exist, last status: %d\n",
+                       ugd->last_wfd_status);
+               ugd->last_wfd_status = ugd->wfd_status;
+               ugd->last_wfd_time = time(NULL);
+               return ECORE_CALLBACK_RENEW;
        }
 
-       if (ugd->multi_connect_btn) {
-               wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
+       /* check the timeout, if not timeout, keep the cb */
+       interval = time(NULL) - ugd->last_wfd_time;
+       if (interval < MAX_NO_ACTION_TIME_OUT) {
+               return ECORE_CALLBACK_RENEW;
+       }
+
+       /* turn off the Wi-Fi Direct */
+       wifi_direct_get_state(&ugd->wfd_status);
+       if (ugd->wfd_status < WIFI_DIRECT_STATE_ACTIVATING) {
+               WDUG_LOGE("Wi-Fi Direct is already deactivated\n");
+       } else {
+               wfd_ug_warn_popup(ugd, IDS_WFD_POP_AUTOMATIC_TURN_OFF, POP_TYPE_AUTOMATIC_TURN_OFF);
+       }
+
+       return ECORE_CALLBACK_CANCEL;
+}
+
+/**
+ *     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)
+{
+       __WDUG_LOG_FUNC_ENTER__;
+       struct ug_data *ugd = (struct ug_data *)user_data;
+
+       if (ugd == NULL) {
+               WDUG_LOGE("Incorrect parameter(NULL)\n");
+               return;
+       }
+
+       WDUG_LOGI("Discovery event [%d], error_code [%d]\n", discovery_state, error_code);
+
+       if (discovery_state == WIFI_DIRECT_ONLY_LISTEN_STARTED) {
+               __WDUG_LOG_FUNC_EXIT__;
+               return;
+       } else if (discovery_state == WIFI_DIRECT_DISCOVERY_STARTED) {
+               ugd->head_text_mode = HEAD_TEXT_TYPE_SCANING;
+
+               /* clear all the previous discovered peers */
+               if (ugd->raw_discovered_peer_cnt > 0) {
+                       memset(ugd->raw_discovered_peers, 0x00, ugd->raw_discovered_peer_cnt*sizeof(device_type_s));
+               }
+
+               ugd->raw_discovered_peer_cnt = 0;
+       } else if (discovery_state == WIFI_DIRECT_DISCOVERY_FOUND) {
+               ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
+               wfd_ug_get_discovered_peers(ugd);
+       } else {
+               ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
+
+               if (TRUE == ugd->is_re_discover) {
+                       ugd->is_re_discover = FALSE;
+                       wifi_direct_start_discovery(FALSE, MAX_SCAN_TIME_OUT);
+               } else {
+                       /* start LISTEN ONLY mode */
+                       wifi_direct_start_discovery(TRUE, 0);
+               }
        }
-    }
 
-    wfd_ug_get_discovered_peers(ugd);
-    wfd_ug_get_connected_peers(ugd);
+       wfd_ug_view_refresh_glitem(ugd->head);
+       wfd_ug_view_update_peers(ugd);
+       wfd_update_multiconnect_device(ugd);
 
-    wfd_ug_view_update_peers(ugd);
+       if (WIFI_DIRECT_DISCOVERY_STARTED == discovery_state) {
+               if (ugd->scan_btn) {
+                       wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_STOPSCAN"), TRUE);
+               }
 
-    _wfd_free_multiconnect_device(ugd);
-    _wfd_update_multiconnect_device(ugd);
-    //_change_multi_button_title(ugd);
+               if (ugd->multi_connect_btn) {
+                       wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_STOPSCAN"), TRUE);
+               }
+       } else {
+               if (ugd->scan_btn) {
+                       wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
+               }
+
+               if (ugd->multi_connect_btn) {
+                       wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
+               }
+       }
 
-    __FUNC_EXIT__;
-    return;
+       __WDUG_LOG_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
-                               {
-                                       peer->conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT;
-                               }
-                               ugd->g_source_multi_connect_next = g_timeout_add(1000, wfd_multi_connect_next_cb, ugd);
-                               break;
-                       default:
-                               break;
+       __WDUG_LOG_FUNC_ENTER__;
+       struct ug_data *ugd = (struct ug_data *)user_data;
+       device_type_s *peer = NULL;
+       bool owner = FALSE;
+       int res = 0;
+
+       WDUG_LOGI("Connection event [%d], error_code [%d], multi_connect_mode [%d]\n",
+               connection_state, error_code, ugd->multi_connect_mode);
+
+       if (mac_address == NULL) {
+               WDUG_LOGE("Incorrect parameter(peer mac is NULL)\n");
+               return;
+       }
+
+       /* 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]) {
+                       WDUG_LOGE("invalid peer from connection !!\n");
+                       goto refresh_button;
+               }
+       }
+
+       if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_IN_PROGRESS) {
+               switch (connection_state) {
+               case WIFI_DIRECT_CONNECTION_RSP:
+                       WDUG_LOGI("MULTI: WIFI_DIRECT_CONNECTION_RSP\n");
+
+                       if (error_code == WIFI_DIRECT_ERROR_NONE) {
+                               peer->conn_status = PEER_CONN_STATUS_CONNECTED;
+                               wfd_ug_get_connected_peers(ugd);
+                       } else {
+                               peer->conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT;
                        }
+
+                       wfd_ug_view_update_peers(ugd);
+
+                       /* connect the next peer */
+                       ugd->g_source_multi_connect_next = g_timeout_add(1000, wfd_multi_connect_next_cb, ugd);
+                       break;
+               case WIFI_DIRECT_CONNECTION_IN_PROGRESS:
+                       WDUG_LOGI("MULTI: WIFI_DIRECT_CONNECTION_IN_PROGRESS\n");
+                       peer->conn_status = PEER_CONN_STATUS_CONNECTING;
+                       wfd_ug_view_update_peers(ugd);
+                       break;
+               case WIFI_DIRECT_GROUP_CREATED:
+                       WDUG_LOGI("MULTI: WIFI_DIRECT_GROUP_CREATED\n");
+                       wfd_multi_connect_next_cb(ugd);
+                       break;
+               default:
+                       break;
+               }
+       } else {
+               switch (connection_state) {
+               case WIFI_DIRECT_CONNECTION_RSP:
+                       WDUG_LOGI("WIFI_DIRECT_CONNECTION_RSP\n");
+
+                       if (error_code == WIFI_DIRECT_ERROR_NONE) {
+                               peer->conn_status = PEER_CONN_STATUS_CONNECTED;
+                               wfd_ug_get_connected_peers(ugd);
+                       } else {
+                               peer->conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT;
+                       }
+
+                       wfd_ug_view_update_peers(ugd);
+                       break;
+               case WIFI_DIRECT_DISASSOCIATION_IND:
+                       WDUG_LOGI("WIFI_DIRECT_DISASSOCIATION_IND\n");
+                       /* 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_IN_PROGRESS;
+                       }
+
+                       /* if other peer disconnected, get connected peers and update */
+                       peer->conn_status = PEER_CONN_STATUS_WAIT_FOR_CONNECT;
                        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);
+                       break;
+               case WIFI_DIRECT_DISCONNECTION_RSP:
+               case WIFI_DIRECT_DISCONNECTION_IND:
+                       WDUG_LOGI("WIFI_DIRECT_DISCONNECTION_X\n");
+
+                       /* 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));
+                       }
+
+                       ugd->raw_connected_peer_cnt = 0;
+
+                       /* start discovery again */
+                       res = wifi_direct_start_discovery(FALSE, MAX_SCAN_TIME_OUT);
+                       if (res != WIFI_DIRECT_ERROR_NONE) {
+                               WDUG_LOGE("Failed to start discovery. [%d]\n", res);
+                               ugd->is_re_discover = TRUE;
+                               wifi_direct_cancel_discovery();
+                       } else {
+                               WDUG_LOGI("Discovery is started\n");
+                               ugd->is_re_discover = FALSE;
+                       }
+
+                       break;
+               case WIFI_DIRECT_CONNECTION_IN_PROGRESS:
+                       WDUG_LOGI("WIFI_DIRECT_CONNECTION_IN_PROGRESS\n");
+                       peer->conn_status = PEER_CONN_STATUS_CONNECTING;
+                       wfd_ug_view_update_peers(ugd);
+                       break;
+               case WIFI_DIRECT_CONNECTION_REQ:
+               case WIFI_DIRECT_CONNECTION_WPS_REQ:
+                       WDUG_LOGI("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);
 
 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) {
+       /* refresh the scan button */
+       wfd_refresh_wifi_direct_state(ugd);
+       if (WIFI_DIRECT_STATE_CONNECTING == ugd->wfd_status ||
+               WIFI_DIRECT_STATE_DISCONNECTING == ugd->wfd_status) {
+               res = wifi_direct_is_group_owner(&owner);
+               if (res == WIFI_DIRECT_ERROR_NONE) {
+                       if (!owner) {
+                               if (ugd->scan_btn) {
+                                       wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE);
+                               }
+
+                               if (ugd->multi_connect_btn) {
+                                       wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE);
+                               }
+                       }
+               } else {
+                   WDUG_LOGE("Failed to get whether client is group owner. [%d]\n", res);
+               }
+       } else {
                if (ugd->scan_btn) {
-                       wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE);
+                       wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
                }
 
                if (ugd->multi_connect_btn) {
-                       wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE);
+                       wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
                }
-           }
-       } else {
-           DBG(LOG_ERROR, "Failed to get whether client is group owner. [%d]\n", res);
-       }
-    } else {
-       if (ugd->scan_btn) {
-               wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
        }
 
-       if (ugd->multi_connect_btn) {
-               wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
+       /* if no connection, start the monitor timer */
+       wifi_direct_get_state(&ugd->wfd_status);
+       WDUG_LOGI("status: %d", ugd->wfd_status);
+
+       if (ugd->wfd_status >= WIFI_DIRECT_STATE_CONNECTED) {
+               if (ugd->monitor_timer) {
+                       ecore_timer_del(ugd->monitor_timer);
+                       ugd->monitor_timer = NULL;
+               }
+       } else {
+               if (NULL == ugd->monitor_timer) {
+                       WDUG_LOGI("start the monitor timer\n");
+                       ugd->last_wfd_time = time(NULL);
+                       ugd->monitor_timer = ecore_timer_add(5.0,
+                               (Ecore_Task_Cb)_wfd_automatic_deactivated_for_no_connection_cb, ugd);
+               }
        }
-    }
 
-    __FUNC_EXIT__;
-    return;
+       __WDUG_LOG_FUNC_EXIT__;
+       return;
 }
 
+/**
+ *     This function let the ug get wi-fi direct status from vconf
+ *     @return   If success, return 0, else return -1
+ *     @param[in] data the pointer to the main data structure
+ */
 int wfd_get_vconf_status(void *data)
 {
-    __FUNC_ENTER__;
-    struct ug_data *ugd = (struct ug_data*) data;
-    char *dev_name;
-
-    // TODO: get wifi direct status from vconf
-    // db/mobile_hotspot/wifi_key (string)
-
-    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 0;
+       __WDUG_LOG_FUNC_ENTER__;
+       struct ug_data *ugd = (struct ug_data *)data;
+       char *dev_name;
+       int wifi_direct_state = 0;
+
+       /* get wifi direct status from vconf */
+       if (vconf_get_int(VCONFKEY_WIFI_DIRECT_STATE, &wifi_direct_state) < 0) {
+               WDUG_LOGE("Error reading vconf (%s)\n", VCONFKEY_WIFI_DIRECT_STATE);
+               return -1;
+       }
+
+       ugd->wfd_status = wifi_direct_state;
+
+       /* 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);
+               WDUG_LOGE("The AP name is NULL(setting default value)\n");
+       } else {
+               ugd->dev_name = strdup(dev_name);
+               free(dev_name);
+       }
+
+       __WDUG_LOG_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;
+       __WDUG_LOG_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) {
+               WDUG_LOGE("Failed to get link status. [%d]\n", res);
+               return -1;
+       }
+
+       WDUG_LOGI("WFD status [%d]", wfd_status);
+       ugd->wfd_status = wfd_status;
+
+       __WDUG_LOG_FUNC_EXIT__;
+       return 0;
 }
 
+/**
+ *     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;
-    int res = 0;
+       __WDUG_LOG_FUNC_ENTER__;
+       struct ug_data *ugd = (struct ug_data *)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;
-    }
+       res = wifi_direct_initialize();
+       if (res != WIFI_DIRECT_ERROR_NONE) {
+               WDUG_LOGE("Failed to initialize wifi direct. [%d]\n", res);
+               return -1;
+       }
 
-    res = wifi_direct_set_device_state_changed_cb(_activation_cb, (void*) ugd);
-    res = wifi_direct_set_discovery_state_changed_cb(_discover_cb, (void*) ugd);
-    res = wifi_direct_set_connection_state_changed_cb(_connection_cb, (void*) ugd);
+       res = wifi_direct_initialize();
+       if (res != WIFI_DIRECT_ERROR_NONE) {
+               WDUG_LOGE("Failed to initialize Wi-Fi Direct. error code = [%d]\n", res);
+               return -1;
+       }
 
-    /* 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;
+       res = wifi_direct_set_device_state_changed_cb(_activation_cb, (void *)ugd);
+       if (res != WIFI_DIRECT_ERROR_NONE) {
+               WDUG_LOGE("Failed to register _cb_activation. error code = [%d]\n", res);
+               return -1;
+       }
 
-    DBG(LOG_VERBOSE, "WFD link status. [%d]\n", ugd->wfd_status);
+       res = wifi_direct_set_discovery_state_changed_cb(_discover_cb, (void *)ugd);
+       if (res != WIFI_DIRECT_ERROR_NONE) {
+               WDUG_LOGE("Failed to register _cb_discover. error code = [%d]\n", res);
+               return -1;
+       }
 
-    __FUNC_EXIT__;
+       res = wifi_direct_set_connection_state_changed_cb(_connection_cb, (void *)ugd);
+       if (res != WIFI_DIRECT_ERROR_NONE) {
+               WDUG_LOGE("Failed to register _cb_connection. error code = [%d]\n", res);
+               return -1;
+       }
 
-    return 0;
+       /* 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;
+       }
+
+       WDUG_LOGI("WFD link status. [%d]\n", ugd->wfd_status);
+
+       /* start the monitor timer */
+       ugd->last_wfd_time = time(NULL);
+       ugd->last_wfd_status = WIFI_DIRECT_STATE_DEACTIVATED;
+       ugd->monitor_timer = ecore_timer_add(5.0, (Ecore_Task_Cb)_wfd_automatic_deactivated_for_no_connection_cb, ugd);
+
+       ugd->is_re_discover = FALSE;
+
+       __WDUG_LOG_FUNC_EXIT__;
+       return 0;
 }
 
+/**
+ *     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;
+       __WDUG_LOG_FUNC_ENTER__;
+       struct ug_data *ugd = (struct ug_data *)data;
        int res = 0;
        tethering_error_e ret = TETHERING_ERROR_NONE;
        tethering_h th = NULL;
 
        wfd_refresh_wifi_direct_state(ugd);
 
-       if(ugd->wfd_status == WIFI_DIRECT_STATE_DISCOVERING)
-       {
-               DBG(LOG_VERBOSE, "Stop discovery before deregister client\n");
+       if (ugd->wfd_status == WIFI_DIRECT_STATE_DISCOVERING) {
+               WDUG_LOGI("Stop discovery before deregister client\n");
                wifi_direct_cancel_discovery();
        }
 
        res = wifi_direct_deinitialize();
-       if(res != WIFI_DIRECT_ERROR_NONE)
-       {
-               DBG(LOG_ERROR, "Failed to deregister client. [%d]\n", res);
+       if (res != WIFI_DIRECT_ERROR_NONE) {
+               WDUG_LOGE("Failed to deregister client. [%d]\n", res);
        }
 
+       /* release monitor timer */
+       if (ugd->monitor_timer) {
+               ecore_timer_del(ugd->monitor_timer);
+               ugd->monitor_timer = NULL;
+       }
+
+       /* release vconf, hotspot..  */
        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");
+       if (res == -1) {
+               WDUG_LOGE("Failed to ignore vconf key callback for wifi state\n");
        }
 
        res = net_deregister_client();
-       if(res != NET_ERR_NONE)
-       {
-               DBG(LOG_ERROR, "Failed to deregister network client. [%d]\n", res);
+       if (res != NET_ERR_NONE) {
+               WDUG_LOGE("Failed to deregister network client. [%d]\n", res);
+       }
+
+       res = vconf_ignore_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE, _enable_hotspot_state_cb);
+       if (res == -1) {
+               WDUG_LOGE("Failed to ignore vconf key callback for hotspot state\n");
        }
 
-       res = vconf_ignore_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE, _hotspot_state_cb);
-       if(res == -1)
-       {
-               DBG(LOG_ERROR, "Failed to ignore vconf key callback for hotspot state\n");
+       res = vconf_ignore_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE, _disable_hotspot_state_cb);
+       if (res == -1) {
+               WDUG_LOGE("Failed to ignore vconf key callback for hotspot state\n");
        }
 
        th = ugd->hotspot_handle;
-       
-       if(th != NULL)
-       {
+
+       if (th != NULL) {
                /* Deregister cbs */
+               ret = tethering_unset_enabled_cb(th, TETHERING_TYPE_WIFI);
+               if (ret != TETHERING_ERROR_NONE) {
+                       WDUG_LOGE("tethering_unset_enabled_cb is failed(%d)\n", ret);
+               }
+
                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);
+               if (ret != TETHERING_ERROR_NONE) {
+                       WDUG_LOGE("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);
+               if (ret != TETHERING_ERROR_NONE) {
+                       WDUG_LOGE("tethering_destroy is failed(%d)\n", ret);
+               }
 
                ugd->hotspot_handle = NULL;
-                       
        }
 
-       __FUNC_EXIT__;
-
+       __WDUG_LOG_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;
-        }
-
-        int hotspot_mode;
-        res = vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &hotspot_mode);
-        if (res != 0)
-        {
-            DBG(LOG_ERROR, "Failed to get mobile hotspot state from vconf. [%d]\n", res);
-            // TODO: set genlist head item as "WiFi Direct"
-            return -1;
-        }
-
-        if(wifi_state > VCONFKEY_WIFI_OFF)
-        {
-            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 if(hotspot_mode & VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI)
-        {
-            DBG(LOG_VERBOSE, "WiFi is connected, so have to turn off WiFi");
-            wfd_ug_act_popup(ugd, _("IDS_WFD_POP_HOTSPOT_OFF"), POPUP_TYPE_HOTSPOT_OFF); // "This will turn off Portable Wi-Fi hotspots operation.<br>Continue?"
-        }
-        else    // (wifi_state < VCONFKEY_WIFI_CONNECTED && !(hotspot_mode & VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI))
-        {
-            res = wifi_direct_activate();
-            if(res != WIFI_DIRECT_ERROR_NONE)
-            {
-                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;
+       __WDUG_LOG_FUNC_ENTER__;
+       struct ug_data *ugd = (struct ug_data *)data;
+       int res;
+
+       wfd_refresh_wifi_direct_state(ugd);
+       WDUG_LOGI("WFD status [%d]\n", ugd->wfd_status);
+
+       if (ugd->wfd_status < WIFI_DIRECT_STATE_ACTIVATING) {
+               int wifi_state;
+               res = vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
+               if (res != 0) {
+                       WDUG_LOGE("Failed to get wifi state from vconf. [%d]\n", res);
+                       return -1;
+               }
+
+               int hotspot_mode;
+               res = vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &hotspot_mode);
+               if (res != 0) {
+                       WDUG_LOGE("Failed to get mobile hotspot state from vconf. [%d]\n", res);
+                       return -1;
+               }
+
+               if (wifi_state > VCONFKEY_WIFI_OFF) {
+                       WDUG_LOGI("WiFi is connected, so have to turn off WiFi");
+                       wfd_ug_act_popup(ugd, _("IDS_WFD_POP_WIFI_OFF"), POPUP_TYPE_WIFI_OFF);
+               } else if (hotspot_mode & VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI) {
+                       WDUG_LOGI("WiFi is connected, so have to turn off WiFi");
+                       wfd_ug_act_popup(ugd, _("IDS_WFD_POP_HOTSPOT_OFF"), POPUP_TYPE_HOTSPOT_OFF);
+               } else {
+                       res = wifi_direct_activate();
+                       if (res != WIFI_DIRECT_ERROR_NONE) {
+                               WDUG_LOGE("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;
+                       }
+
+                       /* refresh the header */
+                       ugd->head_text_mode = HEAD_TEXT_TYPE_ACTIVATING;
+                       wfd_ug_view_refresh_glitem(ugd->head);
+
+                       /* while activating, disable the buttons */
+                       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);
+                       }
+
+                       if (ugd->back_btn) {
+                               elm_object_disabled_set(ugd->back_btn, TRUE);
+                       }
+               }
+       } else {
+               WDUG_LOGI("Wi-Fi Direct is already activated\n");
+       }
+
+       __WDUG_LOG_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;
-
-    DBG(LOG_VERBOSE, "WFD status [%d]\n", ugd->wfd_status);
-
-    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;
-
-        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;
+       __WDUG_LOG_FUNC_ENTER__;
+       struct ug_data *ugd = (struct ug_data *)data;
+       int res;
+
+       wfd_refresh_wifi_direct_state(ugd);
+       WDUG_LOGI("WFD status [%d]\n", ugd->wfd_status);
+
+       if (ugd->wfd_status < WIFI_DIRECT_STATE_ACTIVATING) {
+               WDUG_LOGI("Wi-Fi Direct is already deactivated\n");
+       } else {
+               /*if connected, disconnect all devices*/
+               if (WIFI_DIRECT_STATE_CONNECTED == ugd->wfd_status) {
+                       res = wifi_direct_disconnect_all();
+                       if (res != WIFI_DIRECT_ERROR_NONE) {
+                               WDUG_LOGE("Failed to send disconnection request to all. [%d]\n", res);
+                               return -1;
+                       }
+               }
+
+               res = wifi_direct_deactivate();
+               if (res != WIFI_DIRECT_ERROR_NONE) {
+                       WDUG_LOGE("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;
+               }
+
+               /* refresh the header */
+               ugd->head_text_mode = HEAD_TEXT_TYPE_DEACTIVATING;
+               wfd_ug_view_refresh_glitem(ugd->head);
+
+               /* while deactivating, disable the buttons */
+               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);
+               }
+
+               if (ugd->back_btn) {
+                       elm_object_disabled_set(ugd->back_btn, TRUE);
+               }
+       }
+
+       __WDUG_LOG_FUNC_EXIT__;
+       return 0;
 }
 
+/**
+ *     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__;
-    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;
+       __WDUG_LOG_FUNC_ENTER__;
+       struct ug_data *ugd = (struct ug_data *)data;
+       int res;
+
+       if (onoff) {
+               res = wifi_direct_activate();
+               if (res != WIFI_DIRECT_ERROR_NONE) {
+                       WDUG_LOGE("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) {
+                       WDUG_LOGE("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;
+               }
+       }
+
+       __WDUG_LOG_FUNC_EXIT__;
+       return 0;
 }
 
-int wfd_client_start_discovery(void *data)
+/**
+ *     This function let the ug create a group
+ *     @return   If success, return 0, else return -1
+ */
+int wfd_client_group_add()
 {
-    __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;
-        }
-    }
-#endif
-
-    ugd->wfd_status = WIFI_DIRECT_DISCOVERY_STARTED;
-    wfd_refresh_wifi_direct_state(ugd);
-    ugd->head_text_mode = HEAD_TEXT_TYPE_SCANING;
-    wfd_ug_view_refresh_glitem(ugd->head);
-    wifi_direct_cancel_discovery();
-
-    res = wifi_direct_start_discovery(FALSE, 0);
-    if (res != WIFI_DIRECT_ERROR_NONE) {
-       DBG(LOG_ERROR, "Fail to restart scanning. %d\n", res);
-       return -1;
-    }
-
-    ugd->wfd_status = WIFI_DIRECT_DISCOVERY_FOUND;
-    wfd_refresh_wifi_direct_state(ugd);
-
-    __FUNC_EXIT__;
-    return 0;
+       __WDUG_LOG_FUNC_ENTER__;
+       int res;
+
+       res = wifi_direct_create_group();
+       if (res != WIFI_DIRECT_ERROR_NONE) {
+               WDUG_LOGE("Failed to add group");
+               __WDUG_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       __WDUG_LOG_FUNC_EXIT__;
+       return 0;
 }
 
+/**
+ *     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;
-
-    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;
+       __WDUG_LOG_FUNC_ENTER__;
+       int res;
+
+       WDUG_LOGE("connect to peer=[%s]\n", mac_addr);
+       res = wifi_direct_connect(mac_addr);
+       if (res != WIFI_DIRECT_ERROR_NONE) {
+               WDUG_LOGE("Failed to send connection request. [%d]\n", res);
+               return -1;
+       }
+
+       __WDUG_LOG_FUNC_EXIT__;
+       return 0;
 }
 
+/**
+ *     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(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;
+       __WDUG_LOG_FUNC_ENTER__;
+       int res;
+
+       if (mac_addr == NULL) {
+               res = wifi_direct_disconnect_all();
+               if (res != WIFI_DIRECT_ERROR_NONE) {
+                       WDUG_LOGE("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) {
+                       WDUG_LOGE("Failed to send disconnection request. [%d]\n", res);
+                       return -1;
+               }
+       }
+
+       __WDUG_LOG_FUNC_EXIT__;
+       return 0;
 }
 
+/**
+ *     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;
+       __WDUG_LOG_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);
+       if (res != WIFI_DIRECT_ERROR_NONE) {
+               WDUG_LOGE("Failed to wifi_direct_set_go_intent(%d). [%d]\n", go_intent, res);
                return -1;
        }
-    __FUNC_EXIT__;
-    return 0;
-}
-
-int wfd_client_get_peers(struct ug_data *ugd)
-{
-
-       if(ugd->wfd_status < WFD_LINK_STATUS_ACTIVATED)
-       {
-               ugd->raw_discovered_peer_cnt = 0;
-               ugd->raw_connected_peer_cnt = 0;
-               return 0;
-       }
 
-    if(ugd->wfd_status > WIFI_DIRECT_STATE_ACTIVATING)
-    {
-        wfd_ug_get_discovered_peers(ugd);
-    }
-
-    if(ugd->wfd_status >= WIFI_DIRECT_STATE_CONNECTED)
-    {
-        wfd_ug_get_connected_peers(ugd);
-    }
-
-    wfd_ug_view_update_peers(ugd);
-    _change_multi_button_title(ugd);
-    return 0;
+       __WDUG_LOG_FUNC_EXIT__;
+       return 0;
 }