X-Git-Url: http://review.tizen.org/git/?p=apps%2Fnative%2Fug-wifi-direct.git;a=blobdiff_plain;f=popup-wifidirect%2Fsrc%2Fwfd-app-client.c;h=e6de1d9e2c4fb6c1d56e9238b6a16b60093d6c4a;hp=cc42794bb8271e0015c4336c695d5a7843982cc4;hb=ea0eb10918bf56338ccea1405cab0eaa5fac0782;hpb=b29aef1e4e9b50a31e775e22b08601f0212fa6ce diff --git a/popup-wifidirect/src/wfd-app-client.c b/popup-wifidirect/src/wfd-app-client.c old mode 100755 new mode 100644 index cc42794..e6de1d9 --- a/popup-wifidirect/src/wfd-app-client.c +++ b/popup-wifidirect/src/wfd-app-client.c @@ -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.1 (the "License"); +* 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://floralicense.org/license +* 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, @@ -24,17 +24,25 @@ * @author Sungsik Jang (sungsik.jang@samsung.com) * @version 0.1 */ - #include #include #include -#include +#include +#include #include +#include + +#include +#include +#include + +#include #include "wfd-app.h" #include "wfd-app-util.h" #include "wfd-app-strings.h" +#include "wfd-app-popup-view.h" /** * This function let the app make a callback for connected peer @@ -44,29 +52,26 @@ */ bool _wfd_connected_peer_cb(wifi_direct_connected_peer_info_s *peer, void *user_data) { - __WDPOP_LOG_FUNC_ENTER__; + __WFD_APP_FUNC_ENTER__; wfd_appdata_t *ad = (wfd_appdata_t *) user_data; + if (NULL == ad || NULL == peer || NULL == peer->device_name || NULL == peer->mac_address) { - WDPOP_LOGD( "NULL parameters.\n"); + WFD_APP_LOG(WFD_APP_LOG_ERROR, "NULL parameters.\n"); return FALSE; } int peer_cnt = ad->raw_connected_peer_cnt; - WDPOP_LOGD( "%dth connected peer. [%s]\n", peer_cnt, peer->device_name); + strncpy(ad->raw_connected_peers[peer_cnt].ssid, peer->device_name, sizeof(ad->raw_connected_peers[peer_cnt].ssid) - 1); + strncpy(ad->raw_connected_peers[peer_cnt].mac_address, peer->mac_address, WFD_MAC_ADDRESS_SIZE - 1); - strncpy(ad->raw_connected_peers[peer_cnt].ssid, peer->device_name, sizeof(ad->raw_connected_peers[peer_cnt].ssid)); - ad->raw_connected_peers[peer_cnt].ssid[31] = '\0'; - strncpy(ad->raw_connected_peers[peer_cnt].mac_address, peer->mac_address, WFD_MAC_ADDRESS_SIZE); - ad->raw_connected_peers[peer_cnt].mac_address[17] = '\0'; - WDPOP_LOGD( "\tSSID: [%s]\n", ad->raw_connected_peers[peer_cnt].ssid); ad->raw_connected_peer_cnt++; free(peer->device_name); free(peer->mac_address); free(peer); - __WDPOP_LOG_FUNC_EXIT__; + __WFD_APP_FUNC_EXIT__; return TRUE; } @@ -75,13 +80,13 @@ bool _wfd_connected_peer_cb(wifi_direct_connected_peer_info_s *peer, void *user_ * @return If success, return 0, else return -1 * @param[in] ugd the pointer to the main data structure */ -int _wfd_app_get_connected_peers(void *user_data) +int wfd_app_get_connected_peers(void *user_data) { - __WDPOP_LOG_FUNC_ENTER__; + __WFD_APP_FUNC_ENTER__; wfd_appdata_t *ad = (wfd_appdata_t *) user_data; if (NULL == ad) { - WDPOP_LOGD( "NULL parameters.\n"); + WFD_APP_LOG(WFD_APP_LOG_ERROR, "NULL parameters.\n"); return -1; } @@ -91,221 +96,170 @@ int _wfd_app_get_connected_peers(void *user_data) res = wifi_direct_foreach_connected_peers(_wfd_connected_peer_cb, (void *)ad); if (res != WIFI_DIRECT_ERROR_NONE) { ad->raw_connected_peer_cnt = 0; - WDPOP_LOGD( "Get connected peer failed: %d\n", res); + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Get connected peer failed: %d\n", res); } - __WDPOP_LOG_FUNC_EXIT__; + __WFD_APP_FUNC_EXIT__; return 0; } /** - * This function let the app delete the notification - * @return void - */ -void _del_wfd_notification() -{ - __WDPOP_LOG_FUNC_ENTER__; - - /* delete the notification */ - notification_error_e noti_err = NOTIFICATION_ERROR_NONE; - noti_err = notification_delete_all_by_type(NULL, NOTIFICATION_TYPE_NOTI); - if (noti_err != NOTIFICATION_ERROR_NONE) { - WDPOP_LOGD( "Fail to notification_delete_all_by_type.(%d)\n", noti_err); - return; - } - - __WDPOP_LOG_FUNC_EXIT__; -} - -/** - * This function let the app add the notification when it is connected - * @return void + * This function let the app make a callback for deactivating wfd automatically when connected + * @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 */ -void _add_wfd_peers_connected_notification(void *user_data) +Eina_Bool wfd_automatic_deactivated_for_connection_cb(void *user_data) { - __WDPOP_LOG_FUNC_ENTER__; - - wfd_appdata_t *ad = (wfd_appdata_t *) user_data; - if (NULL == ad || NULL == ad->noti) { - WDPOP_LOGD( "NULL parameters.\n"); - return; - } - - char msg[WFD_MAX_SIZE] = {0}; - notification_error_e noti_err = NOTIFICATION_ERROR_NONE; - - /* delete all notifications */ - _del_wfd_notification(); + __WFD_APP_FUNC_ENTER__; + int interval = 0; + int wfd_transfer_state = 0; + int res = 0; + wfd_appdata_t *ad = (wfd_appdata_t *)user_data; - /* set the icon */ - noti_err = notification_set_image(ad->noti, NOTIFICATION_IMAGE_TYPE_ICON, RESDIR"/images/A09_notification_icon.png"); - if (noti_err != NOTIFICATION_ERROR_NONE) { - WDPOP_LOGD( "Fail to notification_set_image. (%d)\n", noti_err); - return; + if (NULL == ad) { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "NULL parameters.\n"); + return ECORE_CALLBACK_CANCEL; } - /* set the title and content */ - _wfd_app_get_connected_peers(ad); - snprintf(msg, WFD_MAX_SIZE, "Connected with %d devices via Wi-Fi Direct", ad->raw_connected_peer_cnt); - noti_err = notification_set_text(ad->noti, NOTIFICATION_TEXT_TYPE_TITLE, msg, NULL, NOTIFICATION_VARIABLE_TYPE_NONE); - if (noti_err != NOTIFICATION_ERROR_NONE) { - WDPOP_LOGD( "Fail to notification_set_text. (%d)\n", noti_err); - return; + /* check the timeout, if not timeout, keep the cb */ + interval = time(NULL) - ad->last_wfd_transmit_time; + if (interval < NO_ACTION_TIME_OUT) { + return ECORE_CALLBACK_RENEW; } - noti_err = notification_set_text(ad->noti, NOTIFICATION_TEXT_TYPE_CONTENT, - "Tap to change settings", NULL, NOTIFICATION_VARIABLE_TYPE_NONE); - if (noti_err != NOTIFICATION_ERROR_NONE) { - WDPOP_LOGD( "Fail to notification_set_text. (%d)\n", noti_err); - return; + /* get transfer state */ + if (vconf_get_int(VCONFKEY_WIFI_DIRECT_TRANSFER_STATE, &wfd_transfer_state) < 0) { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Error reading vconf (%s)\n", + VCONFKEY_WIFI_DIRECT_TRANSFER_STATE); + return ECORE_CALLBACK_CANCEL; } - bundle *b = NULL; - b = bundle_create(); - appsvc_set_pkgname(b, PACKAGE); - appsvc_add_data(b, NOTIFICATION_BUNDLE_PARAM, NOTIFICATION_BUNDLE_VALUE); - - int res = NOTIFICATION_ERROR_NONE; - res = notification_set_execute_option(ad->noti, NOTIFICATION_EXECUTE_TYPE_SINGLE_LAUNCH, /*Button Text*/NULL, NULL, b); - if (res != NOTIFICATION_ERROR_NONE) { - WDPOP_LOGD( "Failed to notification_set_execute_option. [%d]", res); - bundle_free(b); - return; + res = wifi_direct_get_state(&ad->wfd_status); + if (res != WIFI_DIRECT_ERROR_NONE) { + return ECORE_CALLBACK_CANCEL; } - bundle_free(b); - /* set display application list */ - noti_err = notification_set_display_applist(ad->noti, NOTIFICATION_DISPLAY_APP_NOTIFICATION_TRAY); - if (noti_err != NOTIFICATION_ERROR_NONE) { - WDPOP_LOGD( "Fail to notification_set_display_applist : %d\n", noti_err); - return; + if (ad->wfd_status < WIFI_DIRECT_STATE_CONNECTED) { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Wi-Fi Direct is unconnected!"); + return ECORE_CALLBACK_CANCEL; } - /* notify the quick panel */ - noti_err = notification_insert(ad->noti, NULL); - if (noti_err != NOTIFICATION_ERROR_NONE) { - WDPOP_LOGD( "Fail to notification_insert.(%d)\n", noti_err); - return; + /* show tickernoti*/ + if (wfd_transfer_state > VCONFKEY_WIFI_DIRECT_TRANSFER_START) { + WFD_APP_LOG(WFD_APP_LOG_LOW, "Display Toast popup.\n"); + notification_status_message_post(_("IDS_WIFI_BODY_TO_SAVE_BATTERY_POWER_DISABLE_WI_FI_DIRECT_AFTER_USE")); + WFD_APP_LOG(WFD_APP_LOG_LOW, "No RX/TX packet, turn off WFD automatically.\n"); + wfd_app_util_add_wfd_turn_off_notification(ad); + } else { + WFD_APP_LOG(WFD_APP_LOG_LOW, "Has RX/TX packet, restart.\n"); + ad->last_wfd_transmit_time = time(NULL); + return ECORE_CALLBACK_RENEW; } - __WDPOP_LOG_FUNC_EXIT__; + ad->transmit_timer = NULL; + __WFD_APP_FUNC_EXIT__; + return ECORE_CALLBACK_CANCEL; } -/** - * This function let the app add the notification when it shoule be turned off - * @return void - * @param[in] user_data the pointer to the main data structure - */ -void _add_wfd_turn_off_notification(void *user_data) +int wfd_app_client_switch_off(void *data) { - __WDPOP_LOG_FUNC_ENTER__; - - wfd_appdata_t *ad = (wfd_appdata_t *) user_data; - if (NULL == ad || NULL == ad->noti) { - WDPOP_LOGD( "NULL parameters.\n"); - return; - } - - notification_error_e noti_err = NOTIFICATION_ERROR_NONE; - - /* delete all notifications */ - _del_wfd_notification(); - - /* set the icon */ - noti_err = notification_set_image(ad->noti, NOTIFICATION_IMAGE_TYPE_ICON, RESDIR"/images/A09_notification_icon.png"); - if (noti_err != NOTIFICATION_ERROR_NONE) { - WDPOP_LOGD( "Fail to notification_set_image. (%d)\n", noti_err); - return; - } - - /* set the title and content */ - noti_err = notification_set_text(ad->noti, NOTIFICATION_TEXT_TYPE_TITLE, - "Disable Wi-Fi Direct after use", NULL, NOTIFICATION_VARIABLE_TYPE_NONE); - if (noti_err != NOTIFICATION_ERROR_NONE) { - WDPOP_LOGD( "Fail to notification_set_text. (%d)\n", noti_err); - return; - } - - noti_err = notification_set_text(ad->noti, NOTIFICATION_TEXT_TYPE_CONTENT, - "Disable Wi-Fi Direct after use to save battery", NULL, NOTIFICATION_VARIABLE_TYPE_NONE); - if (noti_err != NOTIFICATION_ERROR_NONE) { - WDPOP_LOGD( "Fail to notification_set_text. (%d)\n", noti_err); - return; - } - - bundle *b = NULL; - b = bundle_create(); - appsvc_set_pkgname(b, PACKAGE); - appsvc_add_data(b, NOTIFICATION_BUNDLE_PARAM, NOTIFICATION_BUNDLE_VALUE); - - int res = NOTIFICATION_ERROR_NONE; - res = notification_set_execute_option(ad->noti, NOTIFICATION_EXECUTE_TYPE_SINGLE_LAUNCH, /*Button Text*/NULL, NULL, b); - if (res != NOTIFICATION_ERROR_NONE) { - WDPOP_LOGD( "Failed to notification_set_execute_option. [%d]", res); - bundle_free(b); - return; + wfd_appdata_t *ad = (wfd_appdata_t *)data; + int res; + if(NULL == ad) { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "NULL == ad!\n"); + return -1; } - bundle_free(b); - - /* set display application list */ - noti_err = notification_set_display_applist(ad->noti, NOTIFICATION_DISPLAY_APP_NOTIFICATION_TRAY); - if (noti_err != NOTIFICATION_ERROR_NONE) { - WDPOP_LOGD( "Fail to notification_set_display_applist : %d\n", noti_err); - return; + res = wifi_direct_get_state(&ad->wfd_status); + if (res != WIFI_DIRECT_ERROR_NONE) { + return ECORE_CALLBACK_CANCEL; } - /* notify the quick panel */ - noti_err = notification_insert(ad->noti, NULL); - if (noti_err != NOTIFICATION_ERROR_NONE) { - WDPOP_LOGD( "Fail to notification_insert.(%d)\n", noti_err); - return; + if (ad->wfd_status >= WIFI_DIRECT_STATE_ACTIVATING) { + /*if connected, disconnect all devices*/ + if (WIFI_DIRECT_STATE_CONNECTED == ad->wfd_status) { + res = wifi_direct_disconnect_all(); + if (res != WIFI_DIRECT_ERROR_NONE) { + return -1; + } + } + res = wifi_direct_deactivate(); + if (res != WIFI_DIRECT_ERROR_NONE) { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Failed to deactivate Wi-Fi Direct. error code = [%d]\n", res); + return -1; + } } - __WDPOP_LOG_FUNC_EXIT__; + return 0; } +#ifdef WFD_FIVE_MIN_IDLE_DEACTIVATION /** - * This function let the app make a callback for deactivating wfd automatically when connected + * 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_connection_cb(void *user_data) +static Eina_Bool _wfd_automatic_deactivated_for_no_connection_cb(void *user_data) { + int res = -1; int interval = 0; - int wfd_transfer_state = 0; wfd_appdata_t *ad = (wfd_appdata_t *)user_data; +#ifdef WFD_SCREEN_MIRRORING_ENABLED + int screen_mirroring_status = 0; +#endif if (NULL == ad) { - WDPOP_LOGD( "NULL parameters.\n"); return ECORE_CALLBACK_CANCEL; } - /* check the timeout, if not timeout, keep the cb */ - interval = time(NULL) - ad->last_wfd_transmit_time; - if (interval < NO_ACTION_TIME_OUT) { + /* check the action, if action is exist, keep the cb */ + res = wifi_direct_get_state(&ad->wfd_status); + if (res != WIFI_DIRECT_ERROR_NONE) { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Get wifi-direct status WIFI_DIRECT_ERROR_NONE!\n"); + return ECORE_CALLBACK_CANCEL; + } + + if (ad->last_wfd_status != ad->wfd_status) { + ad->last_wfd_status = ad->wfd_status; + ad->last_wfd_time = time(NULL); return ECORE_CALLBACK_RENEW; } - /* get transfer state */ - if (vconf_get_int(VCONFKEY_WIFI_DIRECT_TRANSFER_STATE, &wfd_transfer_state) < 0) { - WDPOP_LOGD( "Error reading vconf (%s)\n", - VCONFKEY_WIFI_DIRECT_TRANSFER_STATE); - return ECORE_CALLBACK_CANCEL; + /* check the timeout, if not timeout, keep the cb */ + interval = time(NULL) - ad->last_wfd_time; + if (interval < MAX_NO_ACTION_TIME_OUT) { + return ECORE_CALLBACK_RENEW; } - /* show tickernoti*/ - if (wfd_transfer_state > VCONFKEY_WIFI_DIRECT_TRANSFER_START) { - WDPOP_LOGD( "No RX/TX packet, turn off WFD automatically.\n"); - _add_wfd_turn_off_notification(ad); + /* turn off the Wi-Fi Direct */ + wifi_direct_get_state(&ad->wfd_status); + if (ad->wfd_status < WIFI_DIRECT_STATE_ACTIVATING) { + WFD_APP_LOG(WFD_APP_LOG_LOW, "wfd_status < WIFI_DIRECT_STATE_ACTIVATING!\n"); } else { - WDPOP_LOGD( "Has RX/TX packet, restart.\n"); - ad->last_wfd_transmit_time = time(NULL); - return ECORE_CALLBACK_RENEW; +#ifdef WFD_SCREEN_MIRRORING_ENABLED + if (vconf_get_int(VCONFKEY_SCREEN_MIRRORING_STATE, &screen_mirroring_status) < 0) + { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Failed to get vconf VCONFKEY_SCREEN_MIRRORING_STATE\n"); + } + + if (screen_mirroring_status == VCONFKEY_SCREEN_MIRRORING_ACTIVATED) { + ad->last_wfd_time = time(NULL); + return ECORE_CALLBACK_RENEW; + } else { + /* turn off the Wi-Fi Direct */ + wfd_app_client_switch_off(ad); + ad->popup = wfd_draw_pop_type_auto_deactivation(ad->win, user_data); + } +#endif + } + + /* reset monitor timer */ + if (ad->monitor_timer) { + ad->monitor_timer = NULL; //ECORE_CALLBACK_CANCEL will release timer. } return ECORE_CALLBACK_CANCEL; } +#endif /** * This function let the app make a callback for registering activation event @@ -316,149 +270,54 @@ static Eina_Bool _wfd_automatic_deactivated_for_connection_cb(void *user_data) */ void _cb_activation(int error_code, wifi_direct_device_state_e device_state, void *user_data) { - __WDPOP_LOG_FUNC_ENTER__; + __WFD_APP_FUNC_ENTER__; wfd_appdata_t *ad = (wfd_appdata_t *)user_data; switch (device_state) { case WIFI_DIRECT_DEVICE_STATE_ACTIVATED: - WDPOP_LOGD( "event ------------------ WIFI_DIRECT_DEVICE_STATE_ACTIVATED\n"); - break; + { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "---------------WIFI_DIRECT_DEVICE_STATE_ACTIVATED\n"); +#ifdef NOT_CONNECTED_INDICATOR_ICON + wfd_app_util_add_indicator_icon(ad); +#endif +#ifdef WFD_FIVE_MIN_IDLE_DEACTIVATION + if (NULL == ad->monitor_timer) { + ad->last_wfd_time = time(NULL); + ad->monitor_timer = ecore_timer_add(5.0, + (Ecore_Task_Cb)_wfd_automatic_deactivated_for_no_connection_cb, ad); + } +#endif + } + break; case WIFI_DIRECT_DEVICE_STATE_DEACTIVATED: - WDPOP_LOGD( "event ------------------ WIFI_DIRECT_DEVICE_STATE_DEACTIVATED\n"); - WDPOP_LOGD( "Termination process of wifi-direct popup begins...\n"); - + { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "---------------WIFI_DIRECT_DEVICE_STATE_DEACTIVATED\n"); /* when deactivated, stop the timer */ if (ad->transmit_timer) { ecore_timer_del(ad->transmit_timer); ad->transmit_timer = NULL; } - elm_exit(); - break; - - default: - break; - } - - __WDPOP_LOG_FUNC_EXIT__; -} - -/** - * This function let the app find the peer by mac address - * @return the found peer - * @param[in] data the pointer to the main data structure - * @param[in] mac_address the pointer to mac address - */ -static wfd_device_info_t *_wfd_app_find_peer_by_mac_address(void *data, const char *mac_address) -{ - __WDPOP_LOG_FUNC_ENTER__; - wfd_appdata_t *ad = (wfd_appdata_t *) data; - int i; - - if (ad == NULL) { - WDPOP_LOGD( "Incorrect parameter(NULL)\n"); - return NULL; - } - - WDPOP_LOGD( "find peer by MAC [%s] \n", mac_address); - - for (i = 0; i < ad->discovered_peer_count; i++) { - WDPOP_LOGD( "check %dth peer\n", i); - - if (!strncmp(mac_address, (const char *) ad->discovered_peers[i].mac_address, 18)) { - WDPOP_LOGD( "found peer. [%d]\n", i); - __WDPOP_LOG_FUNC_EXIT__; - return &ad->discovered_peers[i]; +#ifdef WFD_FIVE_MIN_IDLE_DEACTIVATION + /* when deactivated, stop the timer */ + if (ad->monitor_timer) { + ecore_timer_del(ad->monitor_timer); + ad->monitor_timer = NULL; } +#endif + wfd_app_util_del_notification(ad); +#ifdef WFD_SCREEN_MIRRORING_ENABLED + wfd_app_util_set_screen_mirroring_deactivated(ad); +#endif } - - __WDPOP_LOG_FUNC_EXIT__; - return NULL; -} - -/** - * This function let the app 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_app_discoverd_peer_cb(wifi_direct_discovered_peer_info_s *peer, void *user_data) -{ - __WDPOP_LOG_FUNC_ENTER__; - wfd_appdata_t *ad = (wfd_appdata_t *) user_data; - - if (NULL != peer->device_name) { - WDPOP_LOGD( "discovered peer ssid[%s]\n", peer->device_name); - strncpy(ad->discovered_peers[ad->discovered_peer_count].ssid, peer->device_name, 32); - ad->discovered_peers[ad->discovered_peer_count].ssid[31] = '\0'; - } else { - WDPOP_LOGD( "peer's device name is NULL\n"); - } - - if (NULL != peer->mac_address) { - WDPOP_LOGD( "discovered peer mac[%s]\n", peer->mac_address); - strncpy(ad->discovered_peers[ad->discovered_peer_count].mac_address, peer->mac_address, 18); - ad->discovered_peers[ad->discovered_peer_count].mac_address[17] = '\0'; - } else { - WDPOP_LOGD( "peer's mac is NULL\n"); - } - - ad->discovered_peer_count++; - - __WDPOP_LOG_FUNC_EXIT__; - return TRUE; - -} - -/** - * This function let the app 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 _cb_discover(int error_code, wifi_direct_discovery_state_e discovery_state, void *user_data) -{ - __WDPOP_LOG_FUNC_ENTER__; - wfd_appdata_t *ad = (wfd_appdata_t *)user_data; - int ret; - - switch (discovery_state) { - case WIFI_DIRECT_DISCOVERY_STARTED: - WDPOP_LOGD( "event ------------------ WIFI_DIRECT_DISCOVERY_STARTED\n"); - break; - - case WIFI_DIRECT_ONLY_LISTEN_STARTED: - WDPOP_LOGD( "event ------------------ WIFI_DIRECT_ONLY_LISTEN_STARTED\n"); - break; - - case WIFI_DIRECT_DISCOVERY_FINISHED: - WDPOP_LOGD( "event ------------------ WIFI_DIRECT_DISCOVERY_FINISHED\n"); - break; - - case WIFI_DIRECT_DISCOVERY_FOUND: - WDPOP_LOGD( "event ------------------ WIFI_DIRECT_DISCOVERY_FOUND\n"); - - if (NULL != ad->discovered_peers) { - free(ad->discovered_peers); - ad->discovered_peers = NULL; - } - - ad->discovered_peers = calloc(10, sizeof(wfd_device_info_t)); - ad->discovered_peer_count = 0; - - ret = wifi_direct_foreach_discovered_peers(_wfd_app_discoverd_peer_cb, (void *) ad); - if (ret != WIFI_DIRECT_ERROR_NONE) { - WDPOP_LOGD( "get discovery result failed: %d\n", ret); - } - break; + break; default: break; } - __WDPOP_LOG_FUNC_EXIT__; + __WFD_APP_FUNC_EXIT__; } /** @@ -471,285 +330,330 @@ void _cb_discover(int error_code, wifi_direct_discovery_state_e discovery_state, */ void _cb_connection(int error_code, wifi_direct_connection_state_e connection_state, const char *mac_address, void *user_data) { - __WDPOP_LOG_FUNC_ENTER__; + __WFD_APP_FUNC_ENTER__; wfd_appdata_t *ad = (wfd_appdata_t *)user_data; int result = -1; - char msg[WFD_POP_STR_MAX_LEN] = {0}; - wfd_device_info_t *peer_info = NULL; + int wfd_state = -1; +#ifdef WFD_SCREEN_MIRRORING_ENABLED + int screen_mirroring_status = 0; +#endif + wifi_direct_discovered_peer_info_s *peer_info = NULL; + wfd_connection_info_s *connection = ad->connection; +#ifdef NOT_CONNECTED_INDICATOR_ICON + notification_error_e noti_err = NOTIFICATION_ERROR_NONE; +#endif + char popup_text[MAX_POPUP_TEXT_SIZE] = {0, }; /* find the peer's name by the mac address */ - if (NULL == mac_address) { - WDPOP_LOGE("ERROR : mac address is NULL !!\n"); - return; - } + WFD_RET_IF(NULL == mac_address, "ERROR : mac address is NULL !!\n"); + + WFD_APP_LOG(WFD_APP_LOG_ERROR, "-------------------error_code:%d connection_state:%d \n", + error_code, connection_state); /* when disconnection, mac_address is empty */ - if (connection_state <= WIFI_DIRECT_CONNECTION_RSP || - connection_state == WIFI_DIRECT_INVITATION_REQ) { - memset(ad->peer_mac, 0, sizeof(ad->peer_mac)); - memset(ad->peer_name, 0, sizeof(ad->peer_name)); - strncpy(ad->peer_mac, mac_address, strlen(mac_address)); - ad->peer_mac[17] = '\0'; - peer_info = _wfd_app_find_peer_by_mac_address(ad, mac_address); - - if (NULL == peer_info) { - WDPOP_LOGD( "peer_info is NULL !!\n"); - } else if (0 == strlen(peer_info->ssid)) { - WDPOP_LOGD( "SSID from connection is invalid !!\n"); + if (connection_state <= WIFI_DIRECT_DISASSOCIATION_IND) { + if (connection) { + result = strncmp(connection->peer_addr, mac_address, MACSTR_LENGTH); + if (result) { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Connection event from unknown peer"); + return; + } } else { - WDPOP_LOGD( "SSID from connection is %s.\n", peer_info->ssid); - strncpy(ad->peer_name, peer_info->ssid, strlen(peer_info->ssid)); - ad->peer_name[31] = '\0'; - } + result = wifi_direct_get_peer_info((char *)mac_address, &peer_info); + if (result < 0 || !peer_info) { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Unknown peer"); + if (NULL != peer_info) + free(peer_info); + return; + } + + connection = (wfd_connection_info_s*) calloc(1, sizeof(wfd_connection_info_s)); + if (!connection) { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Failed to allocate memory for peer"); + free(peer_info); + return; + } - if (0 == strlen(ad->peer_name)) { - strncpy(ad->peer_name, ad->peer_mac, strlen(ad->peer_mac)); - ad->peer_name[31] = '\0'; + if (TRUE != dbus_validate_utf8(peer_info->device_name, NULL)) { + memcpy(connection->peer_name, peer_info->device_name, DEV_NAME_LENGTH-2); + connection->peer_name[DEV_NAME_LENGTH-2] = '\0'; + } else { + memcpy(connection->peer_name, peer_info->device_name, DEV_NAME_LENGTH); + connection->peer_name[DEV_NAME_LENGTH] = '\0'; + } + + strncpy(connection->peer_addr, mac_address, MACSTR_LENGTH); + connection->peer_addr[MACSTR_LENGTH] = '\0'; + connection->device_type = peer_info->primary_device_type; + connection->wifi_display = peer_info->is_miracast_device; + wifi_direct_get_local_wps_type(&connection->wps_type); + wifi_direct_is_autoconnection_mode(&connection->auto_conn); + + ad->connection = connection; + free(peer_info); } } switch (connection_state) { - case WIFI_DIRECT_CONNECTION_RSP: + case WIFI_DIRECT_CONNECTION_REQ: { - WDPOP_LOGD( "event ------------------ WIFI_DIRECT_CONNECTION_RSP\n"); - wfd_destroy_popup(); - - if (error_code == WIFI_DIRECT_ERROR_NONE) { - WDPOP_LOGD( "Link Complete!\n"); - - /* add connected notification */ - _add_wfd_peers_connected_notification(ad); + WFD_APP_LOG(WFD_APP_LOG_LOW, "event ------------------ WIFI_DIRECT_CONNECTION_REQ\n"); + + memcpy((char*)ad->mac_addr_connecting, connection->peer_addr, MACSTR_LENGTH); + + wfd_app_get_connected_peers(ad); + WFD_APP_LOG(WFD_APP_LOG_LOW, "No of connected peers = %d", ad->raw_connected_peer_cnt); + if (ad->raw_connected_peer_cnt >= WFD_MAX_CONNECTED_PEER) { + result = wifi_direct_reject_connection(connection->peer_addr); + if (result != WIFI_DIRECT_ERROR_NONE) + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Failed to reject connection(%d)", result); + snprintf(popup_text, MAX_POPUP_TEXT_SIZE, + _("IDS_ST_POP_YOU_CAN_CONNECT_UP_TO_PD_DEVICES_AT_THE_SAME_TIME"), + WFD_MAX_CONNECTED_PEER); + notification_status_message_post(popup_text); + break; + } - /* tickernoti popup */ - snprintf(msg, WFD_POP_STR_MAX_LEN, IDS_WFD_POP_CONNECTED, ad->peer_name); - notification_status_message_post(msg); - } else if (error_code == WIFI_DIRECT_ERROR_AUTH_FAILED) { - WDPOP_LOGD( - "Error Code - WIFI_DIRECT_ERROR_AUTH_FAILED\n"); - notification_status_message_post(_("IDS_WFD_POP_PIN_INVALID")); + if (connection->auto_conn) { + usleep(200); + result = wifi_direct_accept_connection(connection->peer_addr); + if (result < 0) { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Failed to accept connection"); + break; + } + WFD_APP_LOG(WFD_APP_LOG_HIGH, "Succeeded to accept connection"); } else { - if (error_code == WIFI_DIRECT_ERROR_CONNECTION_TIME_OUT) { - WDPOP_LOGD( - "Error Code - WIFI_DIRECT_ERROR_CONNECTION_TIME_OUT\n"); - } else if (error_code == WIFI_DIRECT_ERROR_CONNECTION_FAILED) { - WDPOP_LOGD( - "Error Code - WIFI_DIRECT_ERROR_CONNECTION_FAILED\n"); + if (connection->wps_type == WIFI_DIRECT_WPS_TYPE_PBC) { + WFD_APP_LOG(WFD_APP_LOG_LOW, "WPS type: WIFI_DIRECT_WPS_TYPE_PBC\n"); + wfd_prepare_popup(WFD_POP_APRV_CONNECTION_WPS_PUSHBUTTON_REQ, NULL); + } else if (connection->wps_type == WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY) { + char *pin; + WFD_APP_LOG(WFD_APP_LOG_LOW, "WPS type: WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY"); + if (wifi_direct_get_wps_pin(&pin) != WIFI_DIRECT_ERROR_NONE) { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Failed to get WPS pin"); + return; + } + strncpy(connection->wps_pin, pin, PIN_LENGTH); + WFD_IF_FREE_MEM(pin); + wfd_prepare_popup(WFD_POP_APRV_CONNECTION_WPS_DISPLAY_REQ, NULL); + } else if (connection->wps_type == WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD) { + WFD_APP_LOG(WFD_APP_LOG_LOW, "WPS type: WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD"); + wfd_prepare_popup(WFD_POP_APRV_CONNECTION_WPS_KEYPAD_REQ, NULL); + } else { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "wps_config is unkown!\n"); + break; } - - /* tickernoti popup */ - snprintf(msg, WFD_POP_STR_MAX_LEN, IDS_WFD_POP_CONNECT_FAILED, ad->peer_name); - notification_status_message_post(msg); + int res = display_change_state(LCD_NORMAL); + if(res < 0) + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Failed to change PM state(%d)", res); } } break; case WIFI_DIRECT_CONNECTION_WPS_REQ: { - wifi_direct_wps_type_e wps_mode; - - memcpy(ad->peer_mac, mac_address, sizeof(ad->peer_mac)); - - WDPOP_LOGD( - "event ------------------ WIFI_DIRECT_CONNECTION_WPS_REQ\n"); - result = wifi_direct_get_wps_type(&wps_mode); - WDPOP_LOGD( - "wifi_direct_get_wps_type() result=[%d]\n", result); - - if (wps_mode == WIFI_DIRECT_WPS_TYPE_PBC) { - WDPOP_LOGD( - "wps_config is WIFI_DIRECT_WPS_TYPE_PBC. Ignore it..\n"); - } else if (wps_mode == WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY) { + WFD_APP_LOG(WFD_APP_LOG_LOW, "event ------------------ WIFI_DIRECT_CONNECTION_WPS_REQ\n"); + if (connection->wps_type == WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD) { + WFD_APP_LOG(WFD_APP_LOG_LOW, "WPS type: WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD\n"); + wfd_prepare_popup(WFD_POP_PROG_CONNECT_WITH_KEYPAD, NULL); + } else if (connection->wps_type == WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY) { char *pin; - WDPOP_LOGD( "wps_config is WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY\n"); - - if (wifi_direct_generate_wps_pin() != WIFI_DIRECT_ERROR_NONE) { - WDPOP_LOGD( "wifi_direct_generate_wps_pin() is failed\n"); - return; - } + WFD_APP_LOG(WFD_APP_LOG_LOW, "WPS type: WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY\n"); if (wifi_direct_get_wps_pin(&pin) != WIFI_DIRECT_ERROR_NONE) { - WDPOP_LOGD( "wifi_direct_generate_wps_pin() is failed\n"); + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Failed to get WPS pin"); return; } - strncpy(ad->pin_number, pin, 64); - ad->pin_number[63] = '\0'; - free(pin); - pin = NULL; - - WDPOP_LOGD( "pin=[%s]\n", ad->pin_number); + strncpy(connection->wps_pin, pin, PIN_LENGTH); + WFD_IF_FREE_MEM(pin); wfd_prepare_popup(WFD_POP_PROG_CONNECT_WITH_PIN, NULL); - } else if (wps_mode == WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD) { - WDPOP_LOGD( "wps_config is WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD\n"); - wfd_prepare_popup(WFD_POP_PROG_CONNECT_WITH_KEYPAD, (void *) NULL); } else { - WDPOP_LOGD( "wps_config is unkown!\n"); - + WFD_APP_LOG(WFD_APP_LOG_ERROR, "WPS type: %d", connection->wps_type); } } break; - case WIFI_DIRECT_CONNECTION_REQ: + case WIFI_DIRECT_CONNECTION_IN_PROGRESS: { - WDPOP_LOGD( "event ------------------ WIFI_DIRECT_CONNECTION_REQ\n"); - - wifi_direct_wps_type_e wps_mode; - bool auto_connection_mode; + WFD_APP_LOG(WFD_APP_LOG_LOW, "event ------------------ WIFI_DIRECT_CONNECTION_IN_PROGRESS\n"); + } + break; - result = wifi_direct_get_wps_type(&wps_mode); - WDPOP_LOGD( "wifi_direct_get_wps_type() result=[%d]\n", result); + case WIFI_DIRECT_CONNECTION_RSP: + { + char *msg = NULL; + char txt[WFD_POP_STR_MAX_LEN] = {0}; + wfd_destroy_popup(); - result = wifi_direct_is_autoconnection_mode(&auto_connection_mode); - WDPOP_LOGD( "wifi_direct_is_autoconnection_mode() result=[%d]\n", result); + memset(ad->mac_addr_connecting, 0x00, MACSTR_LENGTH); - if (auto_connection_mode == TRUE) { - result = wifi_direct_accept_connection(ad->peer_mac); - WDPOP_LOGD("wifi_direct_accept_connection() result=[%d]\n", result); + if (error_code != WIFI_DIRECT_ERROR_NONE) { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Failed to connect with peer[%s] -(%d)", + connection->peer_name, error_code); + snprintf(txt, WFD_POP_STR_MAX_LEN, _("IDS_WIFI_POP_FAILED_TO_CONNECT_TO_PS"), + connection->peer_name); } else { - if (wps_mode == WIFI_DIRECT_WPS_TYPE_PBC) { - WDPOP_LOGD( "wps_config is WIFI_DIRECT_WPS_TYPE_PBC\n"); - wfd_prepare_popup(WFD_POP_APRV_CONNECTION_WPS_PUSHBUTTON_REQ, NULL); - } else if (wps_mode == WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY) { - WDPOP_LOGD( "wps_config is WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY\n"); - wfd_prepare_popup(WFD_POP_APRV_CONNECTION_WPS_DISPLAY_REQ, NULL); - } else if (wps_mode == WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD) { - WDPOP_LOGD( "wps_config is WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD\n"); - wfd_prepare_popup(WFD_POP_APRV_CONNECTION_WPS_KEYPAD_REQ, (void *) NULL); - } else { - WDPOP_LOGD( "wps_config is unkown!\n"); + WFD_APP_LOG(WFD_APP_LOG_LOW, "Succeeded to connect with peer[%s] -(%d)", + connection->peer_name, error_code); + snprintf(txt, WFD_POP_STR_MAX_LEN, _("IDS_WIFI_BODY_CONNECTED_TO_PS"), + connection->peer_name); +#ifdef WFD_SCREEN_MIRRORING_ENABLED + result = vconf_get_int(VCONFKEY_SCREEN_MIRRORING_STATE, &screen_mirroring_status); + if (result < 0) + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Failed to get VCONFKEY_SCREEN_MIRRORING_STATE"); + + if (screen_mirroring_status == VCONFKEY_SCREEN_MIRRORING_DEACTIVATED) + snprintf(txt, WFD_POP_STR_MAX_LEN, _("IDS_WIFI_BODY_CONNECTED_TO_PS"), + connection->peer_name); +#endif + } + if (connection) + free(ad->connection); + ad->connection = NULL; + + wfd_app_get_connected_peers(ad); + WFD_APP_LOG(WFD_APP_LOG_LOW, "No of connected peers = %d", ad->raw_connected_peer_cnt); + /* tickernoti popup */ + if (ad->raw_connected_peer_cnt < WFD_MAX_CONNECTED_PEER) { + if (strlen(txt) > 0) { + msg = elm_entry_utf8_to_markup(txt); + WFD_RET_IF(!msg, "Failed to elm_entry_markup_to_utf8()!"); + notification_status_message_post(msg); + WFD_IF_FREE_MEM(msg); } } } break; - case WIFI_DIRECT_DISCONNECTION_IND: + case WIFI_DIRECT_DISASSOCIATION_IND: { - _del_wfd_notification(); - WDPOP_LOGD( "event ------------------ WIFI_DIRECT_DISCONNECTION_IND\n"); + WFD_APP_LOG(WFD_APP_LOG_LOW, "event ------------------ WIFI_DIRECT_DISASSOCIATION_IND\n"); + wfd_app_util_del_wfd_connected_notification(ad); - result = wifi_direct_set_autoconnection_mode(false); - WDPOP_LOGD( "wifi_direct_set_autoconnection_mode() result=[%d]\n", result); +#ifdef WFD_SCREEN_MIRRORING_ENABLED + if (connection && connection->wifi_display) + wfd_app_util_set_screen_mirroring_deactivated(ad); +#endif + if (connection) + free(ad->connection); + ad->connection = NULL; - /* tickernoti popup */ - snprintf(msg, WFD_POP_STR_MAX_LEN, IDS_WFD_POP_DISCONNECTED, ad->peer_name); - notification_status_message_post(msg); + } + break; + + case WIFI_DIRECT_DISCONNECTION_IND: + { +#if 0 // changed to show notification only when allshare cast device is connected. + _del_wfd_notification(); +#endif + WFD_APP_LOG(WFD_APP_LOG_LOW, "event ------------------ WIFI_DIRECT_DISCONNECTION_IND\n"); +#ifdef WFD_SCREEN_MIRRORING_ENABLED + wfd_app_util_set_screen_mirroring_deactivated(ad); +#endif + notification_status_message_post(_("IDS_WIFI_BODY_THE_WI_FI_DIRECT_CONNECTION_HAS_BEEN_LOST")); + wfd_app_util_del_wfd_connected_notification(ad); } break; case WIFI_DIRECT_DISCONNECTION_RSP: { +#if 0 // changed to show notification only when allshare cast device is connected. _del_wfd_notification(); +#endif + WFD_APP_LOG(WFD_APP_LOG_LOW, "event ------------------ WIFI_DIRECT_DISCONNECTION_RSP\n"); + + wfd_app_util_del_wfd_connected_notification(ad); + +#ifdef WFD_SCREEN_MIRRORING_ENABLED + wfd_app_util_set_screen_mirroring_deactivated(ad); +#endif wfd_destroy_popup(); result = wifi_direct_set_autoconnection_mode(false); - WDPOP_LOGD( "wifi_direct_set_autoconnection_mode() result=[%d]\n", result); - - /* tickernoti popup */ - snprintf(msg, WFD_POP_STR_MAX_LEN, IDS_WFD_POP_DISCONNECTED, ad->peer_name); - notification_status_message_post(msg); + WFD_APP_LOG(WFD_APP_LOG_LOW, "wifi_direct_set_autoconnection_mode() result=[%d]\n", result); } break; - case WIFI_DIRECT_CONNECTION_IN_PROGRESS: + + case WIFI_DIRECT_GROUP_DESTROYED: { - WDPOP_LOGD( "event ------------------ WIFI_DIRECT_CONNECTION_IN_PROGRESS\n"); - /* tickernoti popup */ - notification_status_message_post(_("IDS_WFD_POP_CONNECTING")); + WFD_APP_LOG(WFD_APP_LOG_LOW, "event ------------------ WIFI_DIRECT_GROUP_DESTROYED\n"); + notification_status_message_post(_("IDS_WIFI_BODY_THE_WI_FI_DIRECT_CONNECTION_HAS_BEEN_LOST")); } break; - case WIFI_DIRECT_INVITATION_REQ: - { - WDPOP_LOGD( "event ------------------ WIFI_DIRECT_INVITATION_REQ\n"); - bool auto_connection_mode = FALSE; - wifi_direct_is_autoconnection_mode(&auto_connection_mode); - if (auto_connection_mode == TRUE) { - result = wifi_direct_connect(ad->peer_mac); - WDPOP_LOGD("wifi_direct_accept_connection() result=[%d]\n", result); - } else { - wfd_prepare_popup(WFD_POP_APRV_CONNECTION_INVITATION_REQ, NULL); - } - } - break; default: break; } - /* if connected, start the transmit timer */ - wifi_direct_get_state(&ad->wfd_status); - WDPOP_LOGD( "status: %d", ad->wfd_status); + /* + * To support ON DEMAND popup destroy. API request blocks and popup destroy + * fails. + */ + /* wifi_direct_get_state(&ad->wfd_status); */ - if (ad->wfd_status < WIFI_DIRECT_STATE_CONNECTED) { + if (vconf_get_int(VCONFKEY_WIFI_DIRECT_STATE, &wfd_state) < 0) { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Error reading vconf (%s)\n", VCONFKEY_WIFI_DIRECT_STATE); + } + WFD_APP_LOG(WFD_APP_LOG_LOW, "wfd state: %d", wfd_state); + + if (wfd_state == VCONFKEY_WIFI_DIRECT_DEACTIVATED) { + wfd_app_util_del_notification(ad); + } + +#ifdef NOT_CONNECTED_INDICATOR_ICON + if (wfd_state >= VCONFKEY_WIFI_DIRECT_CONNECTED) { + noti_err = notification_delete(ad->noti_wifi_direct_on); + if (noti_err != NOTIFICATION_ERROR_NONE) { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Fail to notification_delete.(%d)\n", noti_err); + } else { + noti_err = notification_free(ad->noti_wifi_direct_on); + ad->noti_wifi_direct_on = NULL; + if (noti_err != NOTIFICATION_ERROR_NONE) { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Fail to notification_free.(%d)\n", noti_err); + } + } + } +#endif + + if (wfd_state < VCONFKEY_WIFI_DIRECT_CONNECTED) { if (ad->transmit_timer) { ecore_timer_del(ad->transmit_timer); ad->transmit_timer = NULL; } } else { if (NULL == ad->transmit_timer) { - WDPOP_LOGD( "start the transmit timer\n"); + WFD_APP_LOG(WFD_APP_LOG_LOW, "start the transmit timer\n"); ad->last_wfd_transmit_time = time(NULL); ad->transmit_timer = ecore_timer_add(5.0, - (Ecore_Task_Cb)_wfd_automatic_deactivated_for_connection_cb, ad); + (Ecore_Task_Cb)wfd_automatic_deactivated_for_connection_cb, ad); } } - __WDPOP_LOG_FUNC_EXIT__; -} - -/** - * This function let the app make a change callback for flight mode - * @return void - * @param[in] key the pointer to the key - * @param[in] user_data the pointer to the main data structure - */ -static void _wfd_flight_mode_changed(keynode_t *node, void *user_data) -{ - __WDPOP_LOG_FUNC_ENTER__; - int res = -1; - int flight_mode = 0; - wfd_appdata_t *ad = (wfd_appdata_t *)user_data; - - if (NULL == ad) { - WDPOP_LOGE("NULL parameters.\n"); - return; - } - - res = vconf_get_bool(VCONFKEY_SETAPPL_FLIGHT_MODE_BOOL, &flight_mode); - if (res != 0) { - WDPOP_LOGE("Failed to get flight state from vconf. [%d]\n", res); - return; - } - - if (flight_mode == FALSE) { - WDPOP_LOGD( "Flight mode is off\n"); - return; - } - - /* If flight mode is on, turn off WFD */ - wifi_direct_get_state(&ad->wfd_status); - if (WIFI_DIRECT_STATE_DEACTIVATED == ad->wfd_status) { - WDPOP_LOGD( "Wi-Fi Direct is deactivated.\n"); - return; - } - - /*if connected, disconnect all devices*/ - if (WIFI_DIRECT_STATE_CONNECTED == ad->wfd_status) { - res = wifi_direct_disconnect_all(); - if (res != WIFI_DIRECT_ERROR_NONE) { - WDPOP_LOGE("Failed to send disconnection request to all. [%d]\n", res); - return; + if (wfd_state >= VCONFKEY_WIFI_DIRECT_CONNECTED) { +#ifdef WFD_FIVE_MIN_IDLE_DEACTIVATION + if (ad->monitor_timer) { + ecore_timer_del(ad->monitor_timer); + ad->monitor_timer = NULL; } +#endif + } else { +#ifdef NOT_CONNECTED_INDICATOR_ICON + wfd_app_util_add_indicator_icon(ad); +#endif +#ifdef WFD_FIVE_MIN_IDLE_DEACTIVATION + if (NULL == ad->monitor_timer) { + ad->last_wfd_time = time(NULL); + ad->monitor_timer = ecore_timer_add(5.0, + (Ecore_Task_Cb)_wfd_automatic_deactivated_for_no_connection_cb, ad); + } +#endif } - res = wifi_direct_deactivate(); - if (res != WIFI_DIRECT_ERROR_NONE) { - WDPOP_LOGE("Failed to deactivate Wi-Fi Direct. error code = [%d]\n", res); - return; - } - - __WDPOP_LOG_FUNC_EXIT__; + __WFD_APP_FUNC_EXIT__; } /** @@ -757,57 +661,48 @@ static void _wfd_flight_mode_changed(keynode_t *node, void *user_data) * @return If success, return TRUE, else return FALSE * @param[in] ad the pointer to the main data structure */ -int init_wfd_popup_client(wfd_appdata_t *ad) +bool init_wfd_client(wfd_appdata_t *ad) { - __WDPOP_LOG_FUNC_ENTER__; - - if (NULL == ad) { - WDPOP_LOGD( "NULL parameters.\n"); - return FALSE; - } - + __WFD_APP_FUNC_ENTER__; + WFD_RETV_IF(NULL == ad, FALSE, "NULL parameters.\n"); int ret = -1; + int retrys = 3; - ret = wifi_direct_initialize(); - if (ret != WIFI_DIRECT_ERROR_NONE) { - WDPOP_LOGE("Failed to initialize Wi-Fi Direct. error code = [%d]\n", ret); - return FALSE; - } + ad->last_wfd_status = WIFI_DIRECT_STATE_DEACTIVATED; - ret = wifi_direct_set_device_state_changed_cb(_cb_activation, (void *)ad); - if (ret != WIFI_DIRECT_ERROR_NONE) { - WDPOP_LOGE("Failed to register _cb_activation. error code = [%d]\n", ret); - return FALSE; - } + while (retrys > 0) { + ret = wifi_direct_initialize(); + if (ret == WIFI_DIRECT_ERROR_NONE || + ret == WIFI_DIRECT_ERROR_ALREADY_INITIALIZED) + break; + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Failed to initialize Wi-Fi Direct(%d)\n", ret); - ret = wifi_direct_set_discovery_state_changed_cb(_cb_discover, (void *)ad); - if (ret != WIFI_DIRECT_ERROR_NONE) { - WDPOP_LOGE("Failed to register _cb_discover. error code = [%d]\n", ret); - return FALSE; + retrys--; + if (retrys == 0) + return FALSE; + usleep(100*1000); } - ret = wifi_direct_set_connection_state_changed_cb(_cb_connection, (void *)ad); + ret = wifi_direct_set_device_state_changed_cb(_cb_activation, (void*) ad); if (ret != WIFI_DIRECT_ERROR_NONE) { - WDPOP_LOGE("Failed to register _cb_connection. error code = [%d]\n", ret); + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Failed to register _cb_activation(%d)\n", ret); return FALSE; } - /* initialize notification */ - ad->noti = notification_new(NOTIFICATION_TYPE_NOTI, NOTIFICATION_GROUP_ID_NONE, NOTIFICATION_PRIV_ID_NONE); - if (NULL == ad->noti) { - WDPOP_LOGD( "notification_new failed.\n"); + ret = wifi_direct_set_connection_state_changed_cb(_cb_connection, (void*) ad); + if (ret != WIFI_DIRECT_ERROR_NONE) { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Failed to register _cb_connection(%d)\n", ret); return FALSE; } - /* register flight mode */ - int result = -1; - result = vconf_notify_key_changed(VCONFKEY_SETAPPL_FLIGHT_MODE_BOOL, _wfd_flight_mode_changed, ad); - if (result == -1) { - WDPOP_LOGE("Failed to register vconf callback for flight mode\n"); - return FALSE; +#ifdef WFD_FIVE_MIN_IDLE_DEACTIVATION + if (NULL == ad->monitor_timer) { + ad->last_wfd_time = time(NULL); + ad->monitor_timer = ecore_timer_add(5.0, + (Ecore_Task_Cb)_wfd_automatic_deactivated_for_no_connection_cb, ad); } - - __WDPOP_LOG_FUNC_EXIT__; +#endif + __WFD_APP_FUNC_EXIT__; return TRUE; } @@ -816,43 +711,38 @@ int init_wfd_popup_client(wfd_appdata_t *ad) * @return If success, return TRUE, else return FALSE * @param[in] ad the pointer to the main data structure */ -int deinit_wfd_popup_client(wfd_appdata_t *ad) +int deinit_wfd_client(wfd_appdata_t *ad) { - __WDPOP_LOG_FUNC_ENTER__; - - if (NULL == ad || NULL == ad->noti) { - WDPOP_LOGD( "NULL parameters.\n"); - return FALSE; - } - + __WFD_APP_FUNC_ENTER__; int ret = -1; - ret = wifi_direct_deinitialize(); + if (NULL == ad) { + WFD_APP_LOG(WFD_APP_LOG_LOW, "NULL parameter\n"); + return -1; + } - _del_wfd_notification(ad); - notification_error_e noti_err = NOTIFICATION_ERROR_NONE; - noti_err = notification_free(ad->noti); - if (noti_err != NOTIFICATION_ERROR_NONE) { - WDPOP_LOGD( "Fail to notification_free.(%d)\n", noti_err); - ret = WIFI_DIRECT_ERROR_RESOURCE_BUSY; +#ifdef WFD_FIVE_MIN_IDLE_DEACTIVATION + if (ad->monitor_timer) { + ecore_timer_del(ad->monitor_timer); + ad->monitor_timer = NULL; } +#endif - /* remove callback for flight mode */ - int result = -1; - result = vconf_ignore_key_changed(VCONFKEY_WIFI_STATE, _wfd_flight_mode_changed); - if (result == -1) { - WDPOP_LOGE("Failed to ignore vconf key callback for flight mode\n"); + ret = wifi_direct_unset_device_state_changed_cb(); + if (ret != WIFI_DIRECT_ERROR_NONE) { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Failed to deregister _cb_activation(%d)\n", ret); } - if (ad->transmit_timer) { - ecore_timer_del(ad->transmit_timer); - ad->transmit_timer = NULL; + ret = wifi_direct_unset_connection_state_changed_cb(); + if (ret != WIFI_DIRECT_ERROR_NONE) { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Failed to deregister _cb_connection(%d)\n", ret); } - __WDPOP_LOG_FUNC_EXIT__; - if (ret == WIFI_DIRECT_ERROR_NONE) { - return TRUE; - } else { - return FALSE; + ret = wifi_direct_deinitialize(); + if (ret != WIFI_DIRECT_ERROR_NONE) { + WFD_APP_LOG(WFD_APP_LOG_ERROR, "Failed to deinitialize Wi-Fi Direct. error code = [%d]\n", ret); } + + __WFD_APP_FUNC_EXIT__; + return 0; }