4 * Copyright 2012 Samsung Electronics Co., Ltd
6 * Licensed under the Flora License, Version 1.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.tizenopensource.org/license
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
20 #include <wifi-direct.h>
22 #include "mh_func_onoff.h"
24 static bool __get_vconf_prev_wifi_state()
28 if (vconf_get_bool(VCONF_MOBILE_AP_PREV_WIFI_STATUS, &value) < 0) {
29 ERR("vconf_get_bool is failed\n");
33 DBG("%s : %d\n", VCONF_MOBILE_AP_PREV_WIFI_STATUS, value);
35 return value ? true : false;
38 int _get_vconf_usb_state()
40 int value = VCONFKEY_SYSMAN_USB_DISCONNECTED;
42 if (vconf_get_int(VCONFKEY_SYSMAN_USB_STATUS, &value) < 0) {
43 ERR("vconf_get_int is failed\n");
47 DBG("%s : %d\n", VCONFKEY_SYSMAN_USB_STATUS, value);
52 static bool __is_connected_wifi_net(mh_appdata_t *ad)
54 connection_wifi_state_e wifi_state;
57 ret = connection_get_wifi_state(ad->conn_handle, &wifi_state);
58 if (ret != CONNECTION_ERROR_NONE) {
59 ERR("connection_get_wifi_state() is failed : %d\n");
63 if (wifi_state != CONNECTION_WIFI_STATE_CONNECTED) {
64 ERR("Wi-Fi network is not connected : %d\n", wifi_state);
68 DBG("Wi-Fi network is connected\n");
72 static bool __is_connected_ethernet_net(mh_appdata_t *ad)
74 connection_ethernet_state_e ethernet_state;
77 ret = connection_get_ethernet_state(ad->conn_handle, ðernet_state);
78 if (ret != CONNECTION_ERROR_NONE) {
79 ERR("connection_get_ethernet_state() is failed : %d\n");
83 if (ethernet_state != CONNECTION_ETHERNET_STATE_CONNECTED) {
84 ERR("Ethernet network is not connected : %d\n", ethernet_state);
88 DBG("Ethernet network is connected\n");
92 static bool __is_connected_cellular_net(mh_appdata_t *ad)
94 connection_cellular_state_e cellular_state;
95 sim_state_e sim_state;
99 ret = sim_get_state(&sim_state);
100 if (ret != SIM_ERROR_NONE) {
101 ERR("sim_get_state() is failed : %d\n", ret);
104 DBG("SIM State : %d\n", sim_state);
105 if (sim_state != SIM_STATE_AVAILABLE) {
106 _prepare_popup(ad, MH_POP_INFORMATION,
107 _("IDS_MOBILEAP_POP_INSERT_SIM_CARD_AND_RESTART_DEVICE_TO_USE_TETHERING"));
112 ret = connection_get_cellular_state(ad->conn_handle, &cellular_state);
113 if (ret != CONNECTION_ERROR_NONE) {
114 ERR("connection_get_cellular_state() is failed : %d\n");
118 if (cellular_state == CONNECTION_CELLULAR_STATE_FLIGHT_MODE) {
119 _prepare_popup(ad, MH_POP_INFORMATION_WO_BUTTON,
120 _("IDS_MOBILEAP_POP_UNABLE_TO_USE_TETHERING_IN_FLIGHT_MODE_TO_USE_TETHERING_DISABLE_FLIGHT_MODE"));
122 ERR("Cellular network is not connected\n");
124 } else if (cellular_state != CONNECTION_CELLULAR_STATE_CONNECTED &&
125 cellular_state != CONNECTION_CELLULAR_STATE_AVAILABLE) {
126 _prepare_popup(ad, MH_POP_INFORMATION,
127 _("IDS_MOBILEAP_POP_UNABLE_TO_USE_PACKET_DATA_SERVICE_OUT_OF_COVERAGE"));
129 ERR("Cellular network is not connected : %d\n", cellular_state);
133 DBG("Cellular network is connected\n");
137 static int __create_wifi_hotspot_on_popup(mh_appdata_t *ad)
142 wifi_is_activated(&wifi_state);
143 if (wifi_state == true || _is_wifi_direct_on() == true)
144 str = _("IDS_MOBILEAP_POP_WI_FI_NETWORK_WILL_BE_DISCONNECTED_WI_FI_TETHERING_CONSUMES_MORE_BATTERY_POWER_AND_INCREASES_YOUR_DATA_USAGE_CONTINUE_Q");
146 str = _("IDS_MOBILEAP_POP_WI_FI_TETHERING_CONSUMES_MORE_BATTERY_POWER_AND_INCREASES_YOUR_DATA_USAGE_CONTINUE_Q");
148 _prepare_popup(ad, MH_POP_WIFI_ON_CONF, str);
154 static int __create_bt_tethering_on_popup(mh_appdata_t *ad)
156 _prepare_popup(ad, MH_POP_BT_ON_CONF,
157 _(MH_CONSUMES_MORE_BATTERY_POWER));
163 static int __create_usb_tethering_on_popup(mh_appdata_t *ad)
165 char buf[MH_LABEL_LENGTH_MAX] = {0, };
167 if (_get_vconf_usb_state() != VCONFKEY_SYSMAN_USB_AVAILABLE) {
168 DBG("USB is not connected\n");
169 _prepare_popup(ad, MH_POP_USB_ON_CONF,
170 _(MH_CONSUMES_MORE_BATTERY_POWER));
176 snprintf(buf, sizeof(buf), "%s.<br>%s",
177 _("IDS_MOBILEAP_POP_ENABLING_USB_TETHERING_WILL_DISCONNECT_PREVIOUS_USB_CONNECTION"),
178 _(MH_CONSUMES_MORE_BATTERY_POWER));
179 _prepare_popup(ad, MH_POP_USB_ON_CONF, buf);
185 static void __disable_tethering_by_ind(mh_appdata_t *ad, tethering_disabled_cause_e cause)
188 ERR("Param is NULL\n");
192 DBG("cause : %d\n", cause);
194 case TETHERING_DISABLED_BY_WIFI_ON:
195 DBG("TETHERING_DISABLED_IND by WIFI\n");
198 case TETHERING_DISABLED_BY_BT_OFF:
199 DBG("TETHERING_DISABLED_BY_BT_DEACTIVATION\n");
202 case TETHERING_DISABLED_BY_USB_DISCONNECTION:
203 DBG("TETHERING_DISABLED_IND by USB DISCONNECT\n");
206 case TETHERING_DISABLED_BY_FLIGHT_MODE:
207 DBG("TETHERING_DISABLED_IND by FLIGHT_MODE\n");
210 case TETHERING_DISABLED_BY_TIMEOUT:
211 DBG("TETHERING_DISABLED_BY_TIMEOUT\n");
214 case TETHERING_DISABLED_BY_OTHERS:
215 DBG("TETHERING_DISABLED_IND by OTHERS\n");
218 case TETHERING_DISABLED_BY_LOW_BATTERY:
219 DBG("TETHERING_DISABLED_IND by LOW_BATTERY\n");
222 case TETHERING_DISABLED_BY_MDM_ON:
223 DBG("TETHERING_DISABLED_IND by MDM\n");
227 DBG("TETHERING_DISABLED_IND Default\n");
234 static void __recover_wifi_station_mode(void)
238 if (__get_vconf_prev_wifi_state() == false) {
239 DBG("No need to recover wifi station mode\n");
243 if (_turn_on_wifi() != 0)
244 ERR("_turn_on_wifi is failed\n");
245 if (vconf_set_bool(VCONF_MOBILE_AP_PREV_WIFI_STATUS, 0) < 0)
246 ERR("vconf_set_bool failed\n");
251 /* Wi-Fi Direct callback */
252 static void _wifi_direct_state_cb(int error_code, wifi_direct_device_state_e state, void *user_data)
256 if (user_data == NULL) {
257 ERR("The param is NULL\n");
261 mh_appdata_t *ad = (mh_appdata_t *)user_data;
264 wifi_direct_unset_device_state_changed_cb();
265 wifi_direct_deinitialize();
268 if (error_code != 0) {
269 ERR("wifi_direct_deactivate fail in cb : %d\n", error_code);
270 _update_main_view(ad);
274 if (state != WIFI_DIRECT_DEVICE_STATE_DEACTIVATED) {
275 ERR("Unknown state : %d\n", state);
279 ret = tethering_enable(ad->handle, TETHERING_TYPE_WIFI);
280 if (ret != TETHERING_ERROR_NONE) {
281 ERR("wifi tethering on is failed : %d\n", ret);
282 _update_main_view(ad);
290 /* Wi-Fi callbacks */
291 static void __wifi_activated_cb(wifi_error_e result, void *user_data)
293 __MOBILE_AP_FUNC_ENTER__;
295 DBG("Wi-Fi on is done\n");
297 __MOBILE_AP_FUNC_EXIT__;
301 static void __wifi_deactivated_cb(wifi_error_e result, void *user_data)
303 __MOBILE_AP_FUNC_ENTER__;
305 if (user_data == NULL) {
306 ERR("The param is NULL\n");
310 mh_appdata_t *ad = (mh_appdata_t *)user_data;
313 if (result != WIFI_ERROR_NONE) {
314 ERR("__wifi_deactivated_cb error : %d\n", result);
315 _update_main_view(ad);
319 DBG("Wi-Fi is turned off\n");
321 ret = vconf_set_bool(VCONF_MOBILE_AP_PREV_WIFI_STATUS, 1);
323 ERR("vconf_set_bool() is failed : %d\n", ret);
325 ret = tethering_enable(ad->handle, TETHERING_TYPE_WIFI);
326 if (ret != TETHERING_ERROR_NONE) {
327 ERR("wifi tethering on is failed : %d\n", ret);
328 _update_main_view(ad);
332 __MOBILE_AP_FUNC_EXIT__;
336 /* Tethering callbacks */
337 void _enabled_cb(tethering_error_e result, tethering_type_e type, bool is_requested, void *user_data)
339 if (user_data == NULL) {
340 ERR("user_data is NULL\n");
344 mh_appdata_t *ad = (mh_appdata_t *)user_data;
347 if (NULL != ad->popup) {
348 evas_object_del(ad->popup);
351 _update_main_view(ad);
356 if (result != TETHERING_ERROR_NONE) {
357 _prepare_popup(ad, MH_POP_INFORMATION,
358 _("IDS_MOBILEAP_POP_UNABLE_TO_USE_TETHERING"));
362 _update_main_view(ad);
367 void _disabled_cb(tethering_error_e result, tethering_type_e type, tethering_disabled_cause_e cause, void *user_data)
369 if (user_data == NULL) {
370 ERR("user_data is NULL\n");
374 mh_appdata_t *ad = (mh_appdata_t *)user_data;
376 if (cause != TETHERING_DISABLED_BY_REQUEST) {
377 DBG("Tethering [%d] is disabled because of [%d]\n", type, cause);
378 if (NULL != ad->popup) {
379 evas_object_del(ad->popup);
382 _update_main_view(ad);
383 __disable_tethering_by_ind(ad, cause);
387 if (result != TETHERING_ERROR_NONE) {
388 _prepare_popup(ad, MH_POP_INFORMATION,
389 _("IDS_MOBILEAP_POP_UNABLE_TO_USE_TETHERING"));
391 _update_main_view(ad);
395 DBG("Tethering [%d] is disabled by reqeust\n", type);
396 if (type == TETHERING_TYPE_WIFI) {
397 __recover_wifi_station_mode();
400 _update_main_view(ad);
405 void _connection_changed_cb(tethering_client_h client, bool is_opened, void *user_data)
407 if (user_data == NULL) {
408 ERR("user_data is NULL\n");
412 mh_appdata_t *ad = (mh_appdata_t *)user_data;
415 tethering_client_get_name(client, &name);
416 DBG("Client %s is %s\n", name, is_opened ? "connected" : "disconnected");
420 ap_update_data_device(ad);
425 void _data_usage_cb(tethering_error_e result, unsigned long long received_data, unsigned long long sent_data, void *user_data)
427 if (user_data == NULL) {
428 ERR("user_data is NULL\n");
432 mh_appdata_t *ad = (mh_appdata_t *)user_data;
434 if (ad->data_statistics.pdp_total_sent != sent_data ||
435 ad->data_statistics.pdp_total_receive != received_data) {
436 ad->data_statistics.pdp_total_sent = sent_data;
437 ad->data_statistics.pdp_total_receive = received_data;
438 ap_update_data_packet_usage(ad);
441 ad->data_statistics.is_updated = true;
445 /* End of Tethering callbacks */
447 int _handle_wifi_onoff_change(mh_appdata_t *ad)
449 __MOBILE_AP_FUNC_ENTER__;
452 int connected_wifi_clients = 0;
454 /* Turn off WiFi hotspot */
455 if (ad->main.hotspot_mode & VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI) {
456 if (_get_no_of_connected_device(ad->handle, &connected_wifi_clients,
457 TETHERING_TYPE_WIFI) == FALSE) {
458 ERR("Getting the number of connected device is failed\n");
460 if (connected_wifi_clients > 0) {
461 _prepare_popup(ad, MH_POP_WIFI_OFF_CONF,
462 _("IDS_MOBILEAP_POP_DISABLING_TETHERING_WILL_PREVENT_LINKED_DEVICES_FROM_ACCESSING_THE_INTERNET_CONTINUE_Q"));
465 ret = tethering_disable(ad->handle, TETHERING_TYPE_WIFI);
466 if (ret != TETHERING_ERROR_NONE) {
467 ERR("wifi tethering off is failed : %d\n", ret);
474 /* Turn on WiFi hotspot */
475 if (!__is_connected_ethernet_net(ad) && !__is_connected_cellular_net(ad)) {
476 ERR("There is no connected network\n");
480 if (__create_wifi_hotspot_on_popup(ad) < 0) {
481 ERR("__create_wifi_hotspot_on_popup fail\n");
485 __MOBILE_AP_FUNC_EXIT__;
490 int _handle_bt_onoff_change(mh_appdata_t *ad)
492 __MOBILE_AP_FUNC_ENTER__;
496 /* Turn off Bluetooth tethering */
497 if (ad->main.hotspot_mode & VCONFKEY_MOBILE_HOTSPOT_MODE_BT) {
498 ret = tethering_disable(ad->handle, TETHERING_TYPE_BT);
500 ERR("Error disable bt tethering [%d]\n", ret);
506 /* Turn on Bluetooth tethering */
507 if (!__is_connected_ethernet_net(ad) && !__is_connected_wifi_net(ad) &&
508 !__is_connected_cellular_net(ad)) {
509 ERR("There is no connected network\n");
513 if (__create_bt_tethering_on_popup(ad) < 0) {
514 ERR("__create_wifi_hotspot_on_popup fail\n");
518 __MOBILE_AP_FUNC_EXIT__;
523 int _handle_usb_onoff_change(mh_appdata_t *ad)
525 __MOBILE_AP_FUNC_ENTER__;
529 /* Turn off USB tethering */
530 if (ad->main.hotspot_mode & VCONFKEY_MOBILE_HOTSPOT_MODE_USB) {
531 ret = tethering_disable(ad->handle, TETHERING_TYPE_USB);
533 DBG("Error disable usb tethering : %d\n", ret);
539 /* Turn on USB tethering */
540 if (!__is_connected_ethernet_net(ad) && !__is_connected_wifi_net(ad) &&
541 !__is_connected_cellular_net(ad)) {
542 ERR("There is no connected network\n");
546 if (__create_usb_tethering_on_popup(ad) < 0) {
547 ERR("__create_wifi_hotspot_on_popup fail\n");
553 __MOBILE_AP_FUNC_EXIT__;
558 int _turn_off_wifi(mh_appdata_t *ad)
562 ret = wifi_deactivate(__wifi_deactivated_cb, (void *)ad);
563 if (ret != WIFI_ERROR_NONE) {
564 ERR("wifi_deactivate() is failed : %d\n", ret);
571 int _turn_on_wifi(void)
575 ret = wifi_activate(__wifi_activated_cb, NULL);
576 if (ret != WIFI_ERROR_NONE) {
577 ERR("wifi_activate() is failed : %d\n", ret);
584 bool _is_wifi_direct_on(void)
586 int wifi_direct_state = 0;
589 ret = vconf_get_int(VCONFKEY_WIFI_DIRECT_STATE, &wifi_direct_state);
591 ERR("vconf_get_int() is failed : %d\n", ret);
595 return wifi_direct_state != 0 ? true : false;
598 int _turn_off_wifi_direct(mh_appdata_t *ad)
602 ret = wifi_direct_initialize();
604 ERR("wifi_direct_initialize() is failed : %d\n", ret);
608 ret = wifi_direct_set_device_state_changed_cb(_wifi_direct_state_cb, (void *)ad);
610 ERR("wifi_direct_set_device_state_changed_cb() is failed : %d\n", ret);
611 ret = wifi_direct_deinitialize();
612 DBG("wifi_direct_deinitialize() ret : %d\n", ret);
616 ret = wifi_direct_deactivate();
618 ERR("wifi_direct_deactivate() is failed : %d\n", ret);
619 ret = wifi_direct_unset_device_state_changed_cb();
620 DBG("wifi_direct_unset_device_state_changed_cb() ret : %d\n", ret);
621 ret = wifi_direct_deinitialize();
622 DBG("wifi_direct_deinitialize() ret : %d\n", ret);