+static gboolean _interrupted_completed(gpointer *data)
+{
+ if (!data) {
+ debug_error("data is null");
+ return false;
+ }
+ if (!g_focus_session_interrupt_info.user_cb) {
+ debug_error("user_cb is null");
+ free(data);
+ return false;
+ }
+
+ debug_msg("invoke user_cb(%p)", g_focus_session_interrupt_info.user_cb);
+ (g_focus_session_interrupt_info.user_cb)(FOCUS_IS_RELEASED, (const char *)data, g_focus_session_interrupt_info.user_data);
+ debug_msg("invoked");
+
+ free(data);
+ return false;
+}
+
+static void _session_interrupted_cb(int id, mm_sound_focus_type_e focus_type, mm_sound_focus_state_e state,
+ const char *reason_for_change, const char *ext_info, void *user_data)
+{
+ debug_msg("id(%d), focus_type(%d), state(%d), reason(%s)", id, focus_type, state, reason_for_change);
+
+ if (id != g_focus_session_interrupt_info.watch_cb_id) {
+ debug_error("id is not valid(param id:%d, g_focus_session_interrupt_watch_cb_id:%d)",
+ id, g_focus_session_interrupt_info.watch_cb_id);
+ return;
+ }
+ if (!g_focus_session_interrupt_info.user_cb) {
+ debug_error("user callback is null");
+ return;
+ }
+
+ debug_msg(" >>> invoking session interrupt callback(%p)", g_focus_session_interrupt_info.user_cb);
+ if (state == FOCUS_IS_RELEASED)
+ (g_focus_session_interrupt_info.user_cb)(FOCUS_IS_ACQUIRED, reason_for_change, g_focus_session_interrupt_info.user_data);
+ else {
+ debug_msg("INTERRUPTED COMPLETED case, append it to idle");
+ g_idle_add((GSourceFunc)_interrupted_completed, strdup(reason_for_change));
+ }
+ debug_msg(" <<< session interrupt callback finished");
+}
+