Porting flight mode logic to tizen5.5 58/207758/5
authorSudipto Bal <sudipto.bal@samsung.com>
Tue, 11 Jun 2019 12:01:48 +0000 (17:31 +0530)
committerSudipto Bal <sudipto.bal@samsung.com>
Thu, 27 Jun 2019 06:41:26 +0000 (12:11 +0530)
Change-Id: I56df155dc5153fe735b16acaa1e4dc3bd759feb2
Signed-off-by: Sudipto Bal <sudipto.bal@samsung.com>
bt-oal/bluez_hal/src/bt-hal-event-receiver.c
bt-service-adaptation/services/adapter/bt-service-core-adapter.c
bt-service-adaptation/services/bt-request-handler.c
bt-service-adaptation/services/bt-service-main.c
bt-service-adaptation/services/include/bt-service-core-adapter.h

index 719681c..316a792 100644 (file)
@@ -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;
index 9d6efdd..31e9358 100644 (file)
@@ -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;
index bffe34d..a6a05e2 100644 (file)
@@ -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;
                }
 
index ae45d1c..ac58c28 100644 (file)
@@ -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) {
index d4259c1..a6bbd33 100644 (file)
@@ -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 */