+
+#ifdef TIZEN_BT_A2DP_SINK_AUTO_CONNECT
+static void __bt_auto_connect_request_cb(GDBusProxy *proxy, GAsyncResult *res,
+ gpointer user_data)
+{
+ GError *err = NULL;
+ GVariant *reply = NULL;
+
+ reply = g_dbus_proxy_call_finish(proxy, res, &err);
+ g_object_unref(proxy);
+ g_variant_unref(reply);
+
+ BT_DBG("+");
+ if (err != NULL) {
+ g_dbus_error_strip_remote_error(err);
+ BT_INFO("Auto_connect_request Dbus Call Error: %s", err->message);
+
+ if (strcmp("Host is down", err->message)) {
+ BT_INFO("Fail reason is not 'Host Down'. Terminate auto connect");
+ _bt_audio_stop_auto_connect();
+ vconf_set_str(BT_LAST_CONNECTED_DEVICE, "");
+ }
+ }
+ g_clear_error(&err);
+}
+
+
+// It is the function that retry to create alarm.
+// Sometimes alarm mgr service is created later than bluetooth-frwk service in booting time.
+// So, in this case, we have to retry alarmmgr_add_alarm.
+static gboolean __bt_audio_alarm_retry_cb(gpointer data)
+{
+ int result;
+ alarm_id_t alarm_id;
+
+ BT_DBG("__bt_audio_alarm_retry_cb called.");
+ result = _bt_service_set_alarm(BT_AUTO_CONNECT_TIMEOUT_AFTER_LINKLOSS,
+ __bt_auto_connect_alarm_cb, NULL, &alarm_id);
+
+ if (result != BLUETOOTH_ERROR_NONE)
+ return TRUE;
+ else
+ auto_connect_timer.alarm_id = alarm_id;
+
+ return FALSE;
+}
+
+static int __bt_auto_connect_alarm_cb(alarm_id_t alarm_id, void* user_param)
+{
+ int result = BLUETOOTH_ERROR_NONE;
+ char *address = NULL;
+ alarm_id_t new_alarm_id;
+
+ BT_INFO("alram id = [%d] , retry_count [%d] ",
+ alarm_id, auto_connect_timer.retry_count);
+
+ if (alarm_id != auto_connect_timer.alarm_id)
+ return 0;
+
+ address = vconf_get_str(BT_LAST_CONNECTED_DEVICE);
+
+ if (address == NULL) {
+ BT_ERR("Address vconf is null");
+ auto_connect_timer.alarm_id = 0;
+ return 0;
+ }
+
+ BT_DBG("ADDRESS [%s]", address);
+
+ result = _bt_connect_profile(address, A2DP_SOURCE_UUID,
+ __bt_auto_connect_request_cb, NULL);
+
+ auto_connect_timer.retry_count--;
+
+ BT_DBG("result [%d]", result);
+
+ if (auto_connect_timer.retry_count <= 0) {
+ BT_INFO(" ### Stopping Auto connect retry");
+ auto_connect_timer.alarm_id = 0;
+ } else {
+ result = _bt_service_set_alarm(BT_AUTO_CONNECT_TIMEOUT_AFTER_LINKLOSS,
+ __bt_auto_connect_alarm_cb, NULL, &new_alarm_id);
+ if (result == BLUETOOTH_ERROR_NONE)
+ auto_connect_timer.alarm_id = new_alarm_id;
+ }
+
+ free(address);
+ return 0;
+}
+
+static void __bt_auto_connect_alarm_remove()
+{
+ BT_DBG("");
+ if (auto_connect_timer.alarm_id > 0) {
+ _bt_service_remove_alarm(auto_connect_timer.alarm_id);
+ auto_connect_timer.alarm_id = 0;
+ }
+ auto_connect_timer.retry_count = 0;
+}
+
+int _bt_audio_start_auto_connect(gboolean linkloss_flag)
+{
+ int result = BLUETOOTH_ERROR_NONE;
+ char *address = NULL;
+ alarm_id_t alarm_id = 0;
+
+ BT_DBG("");
+
+ address = vconf_get_str(BT_LAST_CONNECTED_DEVICE);
+
+ if (address == NULL) {
+ BT_ERR("No target device");
+ return 0;
+ }
+
+ __bt_auto_connect_alarm_remove();
+
+ auto_connect_timer.retry_count = BT_AUTO_CONNECT_TIMEOUT_RETRY_TIME /
+ BT_AUTO_CONNECT_TIMEOUT_AFTER_LINKLOSS;
+
+ if (linkloss_flag) {
+ BT_INFO(" ### Start auto connection after linkloss");
+ result = _bt_service_set_alarm(BT_AUTO_CONNECT_TIMEOUT_AFTER_LINKLOSS,
+ __bt_auto_connect_alarm_cb, NULL, &alarm_id);
+ if (result != BLUETOOTH_ERROR_NONE)
+ g_timeout_add(500, (GSourceFunc)__bt_audio_alarm_retry_cb, NULL);
+ else
+ auto_connect_timer.alarm_id = alarm_id;
+
+ } else {
+ BT_INFO(" ### Start auto connection after BT activated");
+ result = _bt_service_set_alarm(BT_AUTO_CONNECT_TIMEOUT_AFTER_BT_ACTIVATED,
+ __bt_auto_connect_alarm_cb, NULL, &alarm_id);
+ if (result == BLUETOOTH_ERROR_NONE)
+ auto_connect_timer.alarm_id = alarm_id;
+ }
+
+ free(address);
+ return BLUETOOTH_ERROR_NONE;
+}
+
+int _bt_audio_stop_auto_connect(void)
+{
+ BT_DBG("");
+ __bt_auto_connect_alarm_remove();
+
+ return BLUETOOTH_ERROR_NONE;
+}
+
+void _bt_audio_set_auto_connect_device_addr(const char *address)
+{
+ if (address == NULL) {
+ BT_ERR("address is null");
+ return;
+ }
+
+ BT_INFO("Last connected device is [%s]", address);
+ vconf_set_str(BT_LAST_CONNECTED_DEVICE, address);
+}
+#endif /*TIZEN_BT_A2DP_SINK_AUTO_CONNECT */