Support the RPI3 target for TV profile
[platform/core/connectivity/bluetooth-frwk.git] / bt-service-adaptation / services / adapter / bt-service-core-adapter.c
index 453022f..0f7823d 100644 (file)
@@ -75,6 +75,14 @@ typedef struct {
 
 static bt_adapter_timer_t visible_timer;
 
+typedef enum {
+       BT_ADAPTER_FLIGHT_MODE_NONE = -1,
+       BT_ADAPTER_FLIGHT_MODE_OFF,
+       BT_ADAPTER_FLIGHT_MODE_ON,
+} bt_adapter_flightmode_req_e;
+
+static bt_adapter_flightmode_req_e flightmode_request = BT_ADAPTER_FLIGHT_MODE_NONE;
+
 static guint timer_id = 0;
 
 static gboolean a2dp_init_pending = TRUE;
@@ -164,13 +172,6 @@ int _bt_enable_adapter(void)
        return __bt_adapter_state_handle_request(TRUE);
 }
 
-int _bt_enable_core(void)
-{
-       /* TODO_40 : 4.0 merge  */
-       BT_INFO("Not Supported");
-       return BLUETOOTH_ERROR_NOT_SUPPORT;
-}
-
 int _bt_recover_adapter(void)
 {
        int result = BLUETOOTH_ERROR_NONE;
@@ -212,6 +213,42 @@ int _bt_reset_adapter(void)
        return BLUETOOTH_ERROR_NONE;
 }
 
+#ifdef TIZEN_FEATURE_BT_PERMANENT_LOG
+void _bt_start_log_dump(const char *path)
+{
+       GDBusProxy *proxy;
+       GVariant *result;
+       GError *error = NULL;
+
+       ret_if(path == NULL);
+
+       BT_INFO("Start log_dump(path = %s)", path);
+
+       _bt_send_dump_signal(BT_DUMP_SERVICE_START_SIGNAL);
+
+       proxy = __bt_get_core_proxy();
+       ret_if(proxy == NULL);
+
+       result = g_dbus_proxy_call_sync(proxy, "LogDump",
+                               g_variant_new("(s)", path),
+                               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");
+               }
+       } else {
+               g_variant_unref(result);
+       }
+
+       _bt_send_dump_signal(BT_DUMP_SERVICE_FINISH_SIGNAL);
+}
+#endif
+
 int _bt_check_adapter(int *status)
 {
        BT_INFO("+");
@@ -288,6 +325,132 @@ gboolean _bt_is_discovering(void)
                return FALSE;
 }
 
+static void __bt_set_flightmode_request(int value)
+{
+       BT_INFO("Setting flightmode request to %d", value);
+       flightmode_request = value;
+}
+
+static int __bt_is_flightmode_request(void)
+{
+       return flightmode_request;
+}
+
+static void __bt_service_handle_flight_mode(gboolean flight_mode, bt_status_t adapter_status)
+{
+       int flight_mode_value = 0;
+       int ps_mode_value = 0;
+
+       if (flight_mode == TRUE) {
+               BT_INFO_C("### Flight mode on. Turn off BT");
+
+               if (adapter_status != BT_ACTIVATED) {
+                       BT_INFO("No need to control bt status");
+                       if (vconf_get_int(BT_OFF_DUE_TO_POWER_SAVING_MODE, &ps_mode_value))
+                               BT_ERR("Fail get PS mode value");
+
+                       BT_DBG("ps_mode_value %d", ps_mode_value);
+                       if (ps_mode_value > 0) {
+                               if (vconf_set_int(BT_OFF_DUE_TO_FLIGHT_MODE, 1) != 0)
+                                       BT_ERR("Set vconf failed");
+                       }
+                       return;
+               }
+
+               __bt_set_flightmode_request(BT_ADAPTER_FLIGHT_MODE_ON);
+
+               if (vconf_set_int(BT_OFF_DUE_TO_FLIGHT_MODE, 1) != 0)
+                       BT_ERR("Set vconf failed");
+
+               if (adapter_status == BT_ACTIVATED)
+                       _bt_disable_adapter();
+
+       } else {
+               BT_INFO_C("### Flight mode off. Turn on BT");
+
+               if (adapter_status == BT_ACTIVATED)
+                       return;
+
+               if (vconf_get_int(BT_OFF_DUE_TO_FLIGHT_MODE, &flight_mode_value))
+                       BT_ERR("Fail get flight mode value");
+
+               BT_DBG("flight_mode_value %d", flight_mode_value);
+               if (flight_mode_value == 0)
+                       return;
+
+               if (vconf_set_int(BT_OFF_DUE_TO_FLIGHT_MODE, 0) != 0)
+                       BT_ERR("Set vconf failed");
+
+               if (vconf_get_int(BT_OFF_DUE_TO_POWER_SAVING_MODE, &ps_mode_value))
+                       BT_ERR("Fail get PS mode value");
+
+               BT_DBG("ps_mode_value %d", ps_mode_value);
+               if (ps_mode_value > 0) {
+                       BT_DBG("Bt should not turn on");
+                       return;
+               }
+
+               if (adapter_status == BT_DEACTIVATING) {
+                       BT_INFO("BT adapter is deactivating. Turn on BT after deactivation");
+                       __bt_set_flightmode_request(BT_ADAPTER_FLIGHT_MODE_OFF);
+                       return;
+               }
+
+               if (adapter_status != BT_DEACTIVATED) {
+                       BT_INFO("No need to control bt status");
+                       return;
+               }
+               _bt_service_initialize();
+
+               if (adapter_status == BT_DEACTIVATED)
+                       _bt_enable_adapter();
+
+       }
+}
+
+static void __bt_service_flight_ps_mode_cb(keynode_t *node, void *data)
+{
+       int type;
+       bt_status_t adapter_status = BT_DEACTIVATED;
+       gboolean flight_mode = FALSE;
+
+       adapter_status = _bt_adapter_get_status();
+       BT_INFO("Flight mode changed. Current bt status is %d", adapter_status);
+
+       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);
+               __bt_service_handle_flight_mode(flight_mode, adapter_status);
+       } else {
+               BT_ERR("Invaild vconf key type : %d", type);
+       }
+}
+
+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");
+       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);
+}
+
 int _bt_get_local_address(void)
 {
        int result;
@@ -1387,7 +1550,19 @@ static gboolean __bt_adapter_post_set_disabled(gpointer user_data)
        /* bt-service should be terminated when BT is off */
        if (!TIZEN_FEATURE_BT_USB_DONGLE) {
                /* TODO: Implement to check if it is the recovery mode or not */
-               _bt_reliable_terminate_service(NULL);
+               if (__bt_is_flightmode_request() == BT_ADAPTER_FLIGHT_MODE_ON) {
+                       /* Keep bt-service to handle Flight mode OFF */
+                       BT_DBG("Deactived due to flight mode. Keep bt-service");
+                       _bt_set_disabled(BLUETOOTH_ERROR_NONE);
+                       __bt_set_flightmode_request(BT_ADAPTER_FLIGHT_MODE_NONE);
+               } else if (__bt_is_flightmode_request() == BT_ADAPTER_FLIGHT_MODE_OFF) {
+                       BT_DBG("Durning deactivation, receive Flight mode Off. Enable BT adapter");
+                       _bt_set_disabled(BLUETOOTH_ERROR_NONE);
+                       _bt_service_initialize();
+                       _bt_enable_adapter();
+                       __bt_set_flightmode_request(BT_ADAPTER_FLIGHT_MODE_NONE);
+               } else
+                       _bt_reliable_terminate_service(NULL);
        } else {
                _bt_set_disabled(BLUETOOTH_ERROR_NONE);
        }
@@ -1424,6 +1599,11 @@ static void __bt_adapter_update_bt_disabled(void)
 
        _bt_device_handle_adapter_state(FALSE);
 
+#ifdef TIZEN_FEATURE_BT_AVC_TARGET
+       /* Send the information to Absolute Volume Controller */
+       _bt_audio_handle_adapter_disabled();
+#endif
+
        /* Update the vconf BT status in normal Deactivation case only */
        ret = vconf_get_int(VCONFKEY_SYSMAN_POWER_OFF_STATUS, &power_off_status);
        BT_DBG("ret : %d, power_off_status : %d", ret, power_off_status);
@@ -1455,7 +1635,7 @@ static void __bt_adapter_update_discovery_status(bt_adapter_discovery_state_t st
 
 static void __bt_adapter_state_change_callback(int bt_status)
 {
-       BT_INFO("__bt_adapter_state_change_callback: status [%d]", bt_status);
+       BT_INFO("BT adapter status changed [%d]", bt_status);
 
        switch (bt_status) {
        case BT_DEACTIVATED:
@@ -1475,6 +1655,14 @@ static void __bt_adapter_state_change_callback(int bt_status)
                        g_source_remove(timer_id);
                        timer_id = 0;
                }
+
+               /*If adapter gets activated when flight mode is ON*/
+               if (__bt_is_flightmode_request() == BT_ADAPTER_FLIGHT_MODE_ON) {
+                       BT_DBG("Receive Flight mode On. Disable BT adapter");
+                       _bt_disable_adapter();
+                       return;
+               }
+
                __bt_adapter_update_bt_enabled();
                break;
        default: