ringer: Never cancel async DBus calls and refactor

Previously our code assumed that g_cancellable_cancel() the async DBus
calls to libfeedback would guarantee that the underlying operation would
not be performed (i.e. triggering or ending a feedback).

However the endless ringing exhibited in #470 shows this assumption not
to hold. Therefore we avoid using g_cancellable_cancel () completely and
default to waiting for the async operation to finish.

update_ring () now sets the target state by inspecting managed calls and
the main logic will now step towards the target state:
Changing from regular/loud to soft/quiet ringing (or vice versa)
requires we first end feedback before (re)triggering it.

Additionally the "is-quiet" and "is-ringing" properties are replaced by
a new "state" property to allow changing the combination atomically.

Closes: #470
This commit is contained in:
Evangelos Ribeiro Tzaras
2022-09-13 12:25:15 +02:00
parent 43353d48a3
commit 1056cba62a
4 changed files with 231 additions and 257 deletions

View File

@@ -28,13 +28,24 @@
G_BEGIN_DECLS
/* TODO docstring */
typedef enum {
CALLS_RING_STATE_INACTIVE,
CALLS_RING_STATE_RINGING,
CALLS_RING_STATE_RINGING_SOFT,
CALLS_RING_STATE_ERROR
} CallsRingState;
#define CALLS_TYPE_RINGER (calls_ringer_get_type ())
G_DECLARE_FINAL_TYPE (CallsRinger, calls_ringer, CALLS, RINGER, GObject)
CallsRinger *calls_ringer_new (void);
gboolean calls_ringer_get_is_ringing (CallsRinger *self);
gboolean calls_ringer_get_ring_is_quiet (CallsRinger *self);
CallsRingState calls_ringer_get_state (CallsRinger *self);
void calls_ringer_start_ringing (CallsRinger *self,
gboolean quiet);
void calls_ringer_stop_ringing (CallsRinger *self);
G_END_DECLS