From af4976a985b5864b3c476b2794a2f8400a7deeea Mon Sep 17 00:00:00 2001 From: Sudipto Bal Date: Tue, 11 Jun 2019 17:31:48 +0530 Subject: [PATCH] Porting flight mode logic to tizen5.5 Change-Id: I56df155dc5153fe735b16acaa1e4dc3bd759feb2 Signed-off-by: Sudipto Bal --- bt-oal/bluez_hal/src/bt-hal-event-receiver.c | 8 +- .../services/adapter/bt-service-core-adapter.c | 256 ++++++++++++++++++++- .../services/bt-request-handler.c | 8 +- bt-service-adaptation/services/bt-service-main.c | 12 +- .../services/include/bt-service-core-adapter.h | 10 + 5 files changed, 278 insertions(+), 16 deletions(-) diff --git a/bt-oal/bluez_hal/src/bt-hal-event-receiver.c b/bt-oal/bluez_hal/src/bt-hal-event-receiver.c index 719681c..316a792 100644 --- a/bt-oal/bluez_hal/src/bt-hal-event-receiver.c +++ b/bt-oal/bluez_hal/src/bt-hal-event-receiver.c @@ -293,7 +293,11 @@ static void __bt_hal_adapter_property_changed_event(GVariant *msg) _bt_hal_destroy_adapter_agent(); } else { DBG("###### Adapter Powered Up ######"); - if (_bt_hal_get_adapter_request_state()) { + int is_flight_mode=1, ret = -1; + ret = vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &is_flight_mode); + if (ret != 0) + ERR("vconf_get_bool failed"); + if (_bt_hal_get_adapter_request_state() || !is_flight_mode) { DBG("Sending STATE CHANGE EVENT for Adapter... "); _bt_hal_set_adapter_request_state(FALSE); struct hal_ev_adapter_state_changed ev; @@ -301,7 +305,7 @@ static void __bt_hal_adapter_property_changed_event(GVariant *msg) event_cb(HAL_EV_ADAPTER_STATE_CHANGED, &ev, sizeof(ev)); } #ifdef TIZEN_BT_HAL - if (_bt_hal_get_le_request_state()) { + if (_bt_hal_get_le_request_state() || !is_flight_mode) { DBG("Sending STATE CHANGE EVENT for LE... "); _bt_hal_set_le_request_state(FALSE); struct hal_ev_le_state_changed ev; diff --git a/bt-service-adaptation/services/adapter/bt-service-core-adapter.c b/bt-service-adaptation/services/adapter/bt-service-core-adapter.c index 9d6efdd..31e9358 100644 --- a/bt-service-adaptation/services/adapter/bt-service-core-adapter.c +++ b/bt-service-adaptation/services/adapter/bt-service-core-adapter.c @@ -75,9 +75,14 @@ typedef struct { static bt_adapter_timer_t visible_timer; static guint timer_id = 0; +static guint le_timer_id = 0; static gboolean a2dp_init_pending = FALSE; +static GDBusProxy *core_proxy = NULL; +#define BT_CORE_NAME "org.projectx.bt_core" +#define BT_CORE_PATH "/org/projectx/bt_core" +#define BT_CORE_INTERFACE "org.projectx.btcore" /* Adapter default states */ static bt_status_t adapter_state = BT_DEACTIVATED; @@ -104,6 +109,38 @@ static gboolean __bt_is_service_request_present(int service_function); static void __bt_set_visible_mode(void); static void __bt_set_local_name(void); +void _bt_adapter_start_enable_timer(void); +void _bt_adapter_start_le_enable_timer(void); + +GDBusProxy *_bt_init_core_proxy(void) +{ + GDBusProxy *proxy; + GDBusConnection *conn; + + conn = _bt_gdbus_get_system_gconn(); + if (!conn) + return NULL; + + proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE, + NULL, + BT_CORE_NAME, + BT_CORE_PATH, + BT_CORE_INTERFACE, + NULL, NULL); + + if (!proxy) + return NULL; + + core_proxy = proxy; + + return proxy; +} + +static GDBusProxy *__bt_get_core_proxy(void) +{ + return (core_proxy) ? core_proxy : _bt_init_core_proxy(); +} + /* Initialize BT stack (Initialize OAL layer) */ int _bt_stack_init(void) @@ -141,9 +178,34 @@ int _bt_enable_adapter(void) int _bt_enable_core(void) { - /* TODO_40 : 4.0 merge */ - BT_INFO("Not Supported"); - return BLUETOOTH_ERROR_NOT_SUPPORT; + BT_INFO("Implemented"); + GDBusProxy *proxy; + GVariant *result; + GError *error = NULL; + + proxy = __bt_get_core_proxy(); + retv_if(!proxy, BLUETOOTH_ERROR_INTERNAL); + + /* Clean up the process */ + result = g_dbus_proxy_call_sync(proxy, + "EnableCore", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + + if (!result) { + if (error != NULL) { + BT_ERR("Bt core call failed(Error: %s)", error->message); + g_clear_error(&error); + } else + BT_ERR("Bt core call failed"); + return BLUETOOTH_ERROR_INTERNAL; +} + +g_variant_unref(result); +return BLUETOOTH_ERROR_NONE; } int _bt_recover_adapter(void) @@ -168,6 +230,30 @@ int _bt_reset_adapter(void) return BLUETOOTH_ERROR_NONE; } +void _bt_set_le_disabled(int result) +{ + int power_off_status; + int ret; + + ret = vconf_get_int(VCONFKEY_SYSMAN_POWER_OFF_STATUS, &power_off_status); + BT_DBG("ret : %d", ret); + BT_DBG("power_off_status : %d", power_off_status); + + /* Update Bluetooth Status to notify other modules */ + BT_DBG("Update vconf for BT LE normal Deactivation"); + if (vconf_set_int(VCONFKEY_BT_LE_STATUS, VCONFKEY_BT_LE_STATUS_OFF) != 0) + BT_ERR("Set vconf failed\n"); + _bt_adapter_set_le_status(BT_LE_DEACTIVATED); + + if (_bt_eventsystem_set_value(SYS_EVENT_BT_STATE, EVT_KEY_BT_LE_STATE, + EVT_VAL_BT_LE_OFF) != ES_R_OK) + BT_ERR("Fail to set value"); + + /* Send disabled event */ + _bt_send_event(BT_LE_ADAPTER_EVENT, BLUETOOTH_EVENT_LE_DISABLED, + g_variant_new("(i)", result)); +} + int _bt_check_adapter(int *status) { BT_INFO("+"); @@ -218,6 +304,170 @@ gboolean _bt_is_discovering(void) return FALSE; } +static void __bt_service_flight_ps_mode_cb(keynode_t *node, void *data) +{ + gboolean flight_mode = FALSE; + int type; + + DBG_SECURE("key=%s", vconf_keynode_get_name(node)); + type = vconf_keynode_get_type(node); + if (type == VCONF_TYPE_BOOL) { + flight_mode = vconf_keynode_get_bool(node); + if (flight_mode != TRUE) { + BT_ERR("Ignore the event"); + return; + } + else { + BT_ERR("Flight Mode == TRUE"); + } + } else { + BT_ERR("Invaild vconf key type : %d", type); + return; + } + + _bt_enable_core(); +} + +void _bt_service_register_vconf_handler(void) +{ + BT_DBG("+"); + + if (vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE, + (vconf_callback_fn)__bt_service_flight_ps_mode_cb, NULL) < 0) + BT_ERR("Unable to register key handler"); + BT_DBG("Telephony is disabled"); + if (vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE, + (vconf_callback_fn)__bt_service_flight_ps_mode_cb, NULL) < 0) + BT_ERR("Unable to register key handler"); +} + +void _bt_service_unregister_vconf_handler(void) +{ + BT_DBG("+"); + + vconf_ignore_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE, + (vconf_callback_fn)__bt_service_flight_ps_mode_cb); + + vconf_ignore_key_changed(VCONFKEY_SETAPPL_PSMODE, + (vconf_callback_fn)__bt_service_flight_ps_mode_cb); +} + +static gboolean __bt_enable_timeout_cb(gpointer user_data) +{ + GDBusProxy *proxy; + GVariant *result; + GError *error = NULL; + + timer_id = 0; + + retv_if(_bt_adapter_get_status() == BT_ACTIVATED, FALSE); + + BT_ERR("EnableAdapter is failed"); + + proxy = __bt_get_core_proxy(); + if (!proxy) + return FALSE; + + /* Clean up the process */ + result = g_dbus_proxy_call_sync(proxy, + "DisableAdapter", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + + if (!result) { + if (error != NULL) { + BT_ERR("Bt core call failed(Error: %s)", error->message); + g_clear_error(&error); + } else { + BT_ERR("Bt core call failed"); + } + return FALSE; + } + + g_variant_unref(result); + _bt_set_disabled(BLUETOOTH_ERROR_TIMEOUT); + +#ifndef USB_BLUETOOTH + _bt_terminate_service(NULL); +#endif + + return FALSE; +} + +void _bt_adapter_start_enable_timer(void) +{ + if (timer_id > 0) { + g_source_remove(timer_id); + timer_id = 0; + } + + timer_id = g_timeout_add(BT_ENABLE_TIMEOUT, + __bt_enable_timeout_cb, NULL); + + return; +} + +static gboolean __bt_enable_le_timeout_cb(gpointer user_data) +{ + GDBusProxy *proxy; + GVariant *result; + GError *error = NULL; + + le_timer_id = 0; + + retv_if(_bt_adapter_get_le_status() == BT_LE_ACTIVATED, FALSE); + + BT_ERR("EnableAdapterLE is failed"); + + proxy = __bt_get_core_proxy(); + if (!proxy) + return FALSE; + + /* Clean up the process */ + result = g_dbus_proxy_call_sync(proxy, + "DisableAdapterLe", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + + if (!result) { + if (error != NULL) { + BT_ERR("Bt core call failed(Error: %s)", error->message); + g_clear_error(&error); + } else + BT_ERR("Bt core call failed"); + return FALSE; + } + + g_variant_unref(result); + _bt_adapter_set_le_status(BT_LE_DEACTIVATED); + + _bt_set_le_disabled(BLUETOOTH_ERROR_TIMEOUT); + + if (_bt_adapter_get_status() == BT_DEACTIVATED) + _bt_terminate_service(NULL); + + return FALSE; +} + +void _bt_adapter_start_le_enable_timer(void) +{ + if (le_timer_id > 0) { + g_source_remove(le_timer_id); + le_timer_id = 0; + } + + le_timer_id = g_timeout_add(BT_ENABLE_TIMEOUT, + __bt_enable_le_timeout_cb, NULL); + + return; +} + int _bt_get_local_address(void) { int result; diff --git a/bt-service-adaptation/services/bt-request-handler.c b/bt-service-adaptation/services/bt-request-handler.c index bffe34d..a6a05e2 100644 --- a/bt-service-adaptation/services/bt-request-handler.c +++ b/bt-service-adaptation/services/bt-request-handler.c @@ -3449,11 +3449,10 @@ int __bt_core_request(int function_name, BT_DBG("Already enabled"); result = BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED; } else { + BT_INFO("Start Enabling Adapter"); _bt_adapter_set_status(BT_ACTIVATING); - -#if TODO_40 /* Need to add this function */ _bt_adapter_start_enable_timer(); -#endif + BT_INFO("Returning with no error"); result = BLUETOOTH_ERROR_NONE; } @@ -3491,9 +3490,8 @@ int __bt_core_request(int function_name, } else { _bt_adapter_set_le_status(BT_LE_ACTIVATING); -#if TODO_40 /* Need to add this function */ _bt_adapter_start_le_enable_timer(); -#endif + result = BLUETOOTH_ERROR_NONE; } diff --git a/bt-service-adaptation/services/bt-service-main.c b/bt-service-adaptation/services/bt-service-main.c index ae45d1c..ac58c28 100644 --- a/bt-service-adaptation/services/bt-service-main.c +++ b/bt-service-adaptation/services/bt-service-main.c @@ -54,9 +54,9 @@ static void __on_log_glib(const gchar *log_domain, GLogLevelFlags log_level, static void __bt_release_service(void) { -#if TODO_40 + _bt_service_unregister_vconf_handler(); -#endif + _bt_service_le_deinit(); _bt_deinit_hf_local_term_event_sender(); _bt_deinit_service_event_sender(); @@ -200,10 +200,10 @@ static gboolean __bt_check_bt_service(void *data) if ((bt_le_status == VCONFKEY_BT_LE_STATUS_ON) && (le_status == BT_LE_DEACTIVATED)) { BT_DBG("Previous session was le enabled. Turn BT LE on automatically."); -#if TODO_40 /* Need to enable this function */ + /* Enable the BT LE */ _bt_enable_adapter_le(); -#endif + } else { status = _bt_adapter_get_status(); le_status = _bt_adapter_get_le_status(); @@ -231,9 +231,9 @@ int _bt_service_initialize(void) return EXIT_FAILURE; } -#if TODO_40 /* Need to add this function */ _bt_service_register_vconf_handler(); -#endif + BT_INFO("Registered flight mode handler"); + /* Event sender Init */ ret = _bt_init_service_event_sender(); if (ret != BLUETOOTH_ERROR_NONE) { diff --git a/bt-service-adaptation/services/include/bt-service-core-adapter.h b/bt-service-adaptation/services/include/bt-service-core-adapter.h index d4259c1..a6bbd33 100644 --- a/bt-service-adaptation/services/include/bt-service-core-adapter.h +++ b/bt-service-adaptation/services/include/bt-service-core-adapter.h @@ -62,6 +62,8 @@ int _bt_start_custom_discovery(bt_discovery_role_type_t role); int _bt_cancel_discovery(void); +void _bt_service_register_vconf_handler(void); + gboolean _bt_is_discovering(void); int _bt_stack_init(void); @@ -100,6 +102,14 @@ bt_status_t _bt_adapter_get_status(void); void _bt_set_disabled(int result); +void _bt_adapter_start_enable_timer(void); + +void _bt_set_le_disabled(int result); + +void _bt_adapter_start_le_enable_timer(void); + +void _bt_service_unregister_vconf_handler(void); + #ifdef __cplusplus } #endif /* __cplusplus */ -- 2.7.4