diff --git a/src/calls-ringer.c b/src/calls-ringer.c index cdc65a7..a6255e9 100644 --- a/src/calls-ringer.c +++ b/src/calls-ringer.c @@ -27,6 +27,7 @@ #include "calls-manager.h" #include "calls-ringer.h" +#include "calls-ui-call-data.h" #include #include @@ -285,11 +286,13 @@ restart (CallsRinger *self, static inline gboolean -is_ring_state (CallsCallState state) +is_ring_state (CuiCallState state) { +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + switch (state) { - case CALLS_CALL_STATE_INCOMING: - case CALLS_CALL_STATE_WAITING: + case CUI_CALL_STATE_INCOMING: + case CUI_CALL_STATE_WAITING: return TRUE; default: return FALSE; @@ -298,18 +301,19 @@ is_ring_state (CallsCallState state) static inline gboolean -is_active_state (CallsCallState state) +is_active_state (CuiCallState state) { switch (state) { - case CALLS_CALL_STATE_ACTIVE: - case CALLS_CALL_STATE_DIALING: - case CALLS_CALL_STATE_ALERTING: - case CALLS_CALL_STATE_HELD: + case CUI_CALL_STATE_ACTIVE: + case CUI_CALL_STATE_CALLING: + case CUI_CALL_STATE_ALERTING: + case CUI_CALL_STATE_HELD: return TRUE; default: return FALSE; } } +#pragma GCC diagnostic warning "-Wdeprecated-declarations" static gboolean @@ -318,9 +322,9 @@ has_active_call (CallsRinger *self) g_assert (CALLS_IS_RINGER (self)); for (GList *node = self->calls; node != NULL; node = node->next) { - CallsCall *call = node->data; + CallsUiCallData *call = node->data; - if (is_active_state (calls_call_get_state (call))) + if (is_active_state (cui_call_get_state (CUI_CALL (call)))) return TRUE; } return FALSE; @@ -333,10 +337,10 @@ has_incoming_call (CallsRinger *self) g_assert (CALLS_IS_RINGER (self)); for (GList *node = self->calls; node != NULL; node = node->next) { - CallsCall *call = node->data; + CallsUiCallData *call = node->data; - if (is_ring_state (calls_call_get_state (call)) && - !calls_call_get_silenced (call)) + if (is_ring_state (cui_call_get_state (CUI_CALL (call))) && + !calls_ui_call_data_get_silenced (call)) return TRUE; } return FALSE; @@ -361,11 +365,11 @@ update_ring (CallsRinger *self) static void -call_added_cb (CallsRinger *self, - CallsCall *call) +call_added_cb (CallsRinger *self, + CallsUiCallData *call) { g_assert (CALLS_IS_RINGER (self)); - g_assert (CALLS_IS_CALL (call)); + g_assert (CALLS_IS_UI_CALL_DATA (call)); self->calls = g_list_append (self->calls, call); @@ -382,8 +386,8 @@ call_added_cb (CallsRinger *self, static void -call_removed_cb (CallsRinger *self, - CallsCall *call) +call_removed_cb (CallsRinger *self, + CallsUiCallData *call) { self->calls = g_list_remove (self->calls, call); @@ -442,12 +446,12 @@ constructed (GObject *object) CallsRinger *self = CALLS_RINGER (object); g_signal_connect_swapped (calls_manager_get_default (), - "call-add", + "ui-call-added", G_CALLBACK (call_added_cb), self); g_signal_connect_swapped (calls_manager_get_default (), - "call-remove", + "ui-call-removed", G_CALLBACK (call_removed_cb), self); diff --git a/src/calls-ui-call-data.c b/src/calls-ui-call-data.c index 7893b82..647d0e7 100644 --- a/src/calls-ui-call-data.c +++ b/src/calls-ui-call-data.c @@ -41,6 +41,7 @@ enum { PROP_CAN_DTMF, PROP_AVATAR_ICON, PROP_ACTIVE_TIME, + PROP_SILENCED, PROP_LAST_PROP }; @@ -64,6 +65,7 @@ struct _CallsUiCallData guint timer_id; CuiCallState state; + gboolean silenced; }; static void calls_ui_call_data_cui_call_interface_init (CuiCallInterface *iface); @@ -412,6 +414,9 @@ calls_ui_call_data_get_property (GObject *object, case PROP_ACTIVE_TIME: g_value_set_double (value, self->active_time); + + case PROP_SILENCED: + g_value_set_boolean (value, calls_ui_call_data_get_silenced (self)); break; default: @@ -476,6 +481,15 @@ calls_ui_call_data_class_init (CallsUiCallDataClass *klass) g_object_class_install_property (object_class, PROP_PROTOCOL, props[PROP_PROTOCOL]); + props[PROP_SILENCED] = + g_param_spec_boolean ("silenced", + "Silenced", + "Whether the call ringing should be silenced", + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_property (object_class, PROP_SILENCED, props[PROP_SILENCED]); + g_object_class_override_property (object_class, PROP_ID, "id"); props[PROP_ID] = g_object_class_find_property (object_class, "id"); @@ -531,6 +545,39 @@ calls_ui_call_data_get_call (CallsUiCallData *self) return self->call; } +/** + * calls_ui_call_data_silence_ring: + * @self: a #CallsUiCallData + * + * Inhibit ringing + */ +void +calls_ui_call_data_silence_ring (CallsUiCallData *self) +{ + g_return_if_fail (CALLS_IS_UI_CALL_DATA (self)); + g_return_if_fail (self->state == CUI_CALL_STATE_INCOMING); + + if (self->silenced) + return; + + self->silenced = TRUE; + g_object_notify_by_pspec (G_OBJECT (self), props[PROP_SILENCED]); +} + +/** + * calls_ui_call_data_get_silenced: + * @self: a #CallsUiCallData + * + * Returns: %TRUE if call has been silenced to not ring, %FALSE otherwise + */ +gboolean +calls_ui_call_data_get_silenced (CallsUiCallData *self) +{ + g_return_val_if_fail (CALLS_IS_UI_CALL_DATA (self), FALSE); + + return self->silenced; +} + CuiCallState calls_call_state_to_cui_call_state (CallsCallState state) @@ -552,4 +599,3 @@ calls_call_state_to_cui_call_state (CallsCallState state) return CUI_CALL_STATE_UNKNOWN; } } - diff --git a/src/calls-ui-call-data.h b/src/calls-ui-call-data.h index 66499ae..bf73a4b 100644 --- a/src/calls-ui-call-data.h +++ b/src/calls-ui-call-data.h @@ -37,6 +37,8 @@ G_DECLARE_FINAL_TYPE (CallsUiCallData, calls_ui_call_data, CALLS, UI_CALL_DATA, CallsUiCallData *calls_ui_call_data_new (CallsCall *call); CallsCall *calls_ui_call_data_get_call (CallsUiCallData *self); +void calls_ui_call_data_silence_ring (CallsUiCallData *self); +gboolean calls_ui_call_data_get_silenced (CallsUiCallData *self); CuiCallState calls_call_state_to_cui_call_state (CallsCallState state); G_END_DECLS diff --git a/tests/test-ringer.c b/tests/test-ringer.c index 4edc5a3..6f89eef 100644 --- a/tests/test-ringer.c +++ b/tests/test-ringer.c @@ -9,6 +9,7 @@ #include "calls-manager.h" #include "calls-ringer.h" +#include "calls-ui-call-data.h" #include "mock-call.h" #include "mock-libfeedback.h" #include "mock-contacts-provider.h" @@ -146,33 +147,35 @@ __wrap_calls_contacts_provider_new (CallsSettings *settings) /* add or remove calls */ static void -add_call (CallsManager *manager, - CallsMockCall *call) +add_call (CallsManager *manager, + CallsUiCallData *call) { g_assert (CALLS_IS_MANAGER (manager)); - g_assert (CALLS_IS_MOCK_CALL (call)); + g_assert (CALLS_IS_UI_CALL_DATA (call)); - g_signal_emit_by_name (manager, "call-add", CALLS_CALL (call), NULL); + g_signal_emit_by_name (manager, "ui-call-added", call, NULL); } static void -remove_call (CallsManager *manager, - CallsMockCall *call) +remove_call (CallsManager *manager, + CallsUiCallData *call) { g_assert (CALLS_IS_MANAGER (manager)); - g_assert (CALLS_IS_MOCK_CALL (call)); + g_assert (CALLS_IS_UI_CALL_DATA (call)); - g_signal_emit_by_name (manager, "call-remove", CALLS_CALL (call), NULL); + g_signal_emit_by_name (manager, "ui-call-removed", call, NULL); } /* TestData setup and tear down */ typedef struct { - CallsManager *manager; - CallsRinger *ringer; - CallsMockCall *call_one; - CallsMockCall *call_two; - GMainLoop *loop; + CallsManager *manager; + CallsRinger *ringer; + CallsMockCall *call_one; + CallsUiCallData *ui_call_one; + CallsMockCall *call_two; + CallsUiCallData *ui_call_two; + GMainLoop *loop; } TestData; @@ -187,7 +190,9 @@ setup_test_data (void **state) data->manager = calls_manager_get_default (); data->ringer = calls_ringer_new (); data->call_one = calls_mock_call_new (); + data->ui_call_one = calls_ui_call_data_new (CALLS_CALL (data->call_one)); data->call_two = calls_mock_call_new (); + data->ui_call_two = calls_ui_call_data_new (CALLS_CALL (data->call_two)); data->loop = g_main_loop_new (NULL, FALSE); *state = data; @@ -202,7 +207,9 @@ tear_down_test_data (void **state) TestData *data = *state; g_object_unref (data->call_one); + g_object_unref (data->ui_call_one); g_object_unref (data->call_two); + g_object_unref (data->ui_call_two); g_object_unref (data->ringer); g_main_loop_unref (data->loop); @@ -252,12 +259,12 @@ test_ringing_accept_call (void **state) will_return (__wrap_lfb_event_end_feedback_async, 10); calls_call_set_state (CALLS_CALL (data->call_one), CALLS_CALL_STATE_INCOMING); - add_call (data->manager, data->call_one); + add_call (data->manager, data->ui_call_one); /* main loop will quit in callback of notify::ring */ g_main_loop_run (data->loop); - remove_call (data->manager, data->call_one); + remove_call (data->manager, data->ui_call_one); assert_false (calls_ringer_get_is_ringing (data->ringer)); } @@ -303,12 +310,12 @@ test_ringing_hang_up_call (void **state) will_return (__wrap_lfb_event_end_feedback_async, 10); calls_call_set_state (CALLS_CALL (data->call_one), CALLS_CALL_STATE_INCOMING); - add_call (data->manager, data->call_one); + add_call (data->manager, data->ui_call_one); /* main loop will quit in callback of notify::ring */ g_main_loop_run (data->loop); - remove_call (data->manager, data->call_one); + remove_call (data->manager, data->ui_call_one); assert_false (calls_ringer_get_is_ringing (data->ringer)); } @@ -347,14 +354,14 @@ test_ringing_hang_up_call_ringer_cancelled (void **state) will_return (__wrap_lfb_event_trigger_feedback_async, 50); calls_call_set_state (CALLS_CALL (data->call_one), CALLS_CALL_STATE_INCOMING); - add_call (data->manager, data->call_one); + add_call (data->manager, data->ui_call_one); g_timeout_add (10, G_SOURCE_FUNC (t3_on_ringer_timeout), data); /* main loop will quit in t3_on_ringer_timeout() */ g_main_loop_run (data->loop); - remove_call (data->manager, data->call_one); + remove_call (data->manager, data->ui_call_one); assert_false (calls_ringer_get_is_ringing (data->ringer)); } @@ -370,8 +377,8 @@ t4_on_ringer_call_silence (CallsRinger *ringer, switch (test_phase++) { case 0: /* incoming call */ assert_true (calls_ringer_get_is_ringing (ringer)); - calls_call_silence_ring (CALLS_CALL (data->call_one)); - assert_true (calls_call_get_silenced (CALLS_CALL (data->call_one))); + calls_ui_call_data_silence_ring (data->ui_call_one); + assert_true (calls_ui_call_data_get_silenced (data->ui_call_one)); break; case 1: /* incoming call hung up */ assert_false (calls_ringer_get_is_ringing (ringer)); @@ -401,12 +408,12 @@ test_ringing_silence_call (void **state) will_return (__wrap_lfb_event_end_feedback_async, 10); calls_call_set_state (CALLS_CALL (data->call_one), CALLS_CALL_STATE_INCOMING); - add_call (data->manager, data->call_one); + add_call (data->manager, data->ui_call_one); /* main loop will quit in callback of notify::ring */ g_main_loop_run (data->loop); - remove_call (data->manager, data->call_one); + remove_call (data->manager, data->ui_call_one); assert_false (calls_ringer_get_is_ringing (data->ringer)); } @@ -419,13 +426,13 @@ t5_remove_calls (gpointer user_data) TestData *data = user_data; if (test_phase == 0) { - remove_call (data->manager, data->call_one); + remove_call (data->manager, data->ui_call_one); test_phase++; return G_SOURCE_CONTINUE; } assert_true (calls_ringer_get_is_ringing (data->ringer)); - remove_call (data->manager, data->call_two); + remove_call (data->manager, data->ui_call_two); return G_SOURCE_REMOVE; } @@ -442,7 +449,7 @@ t5_on_ringer_multiple_calls (CallsRinger *ringer, switch (test_phase++) { case 0: /* add second call, and schedule call removal */ assert_true (calls_ringer_get_is_ringing (ringer)); - add_call (data->manager, data->call_two); + add_call (data->manager, data->ui_call_two); g_timeout_add (25, t5_remove_calls, data); break; case 1: /* both calls should be removed now */ @@ -473,7 +480,7 @@ test_ringing_multiple_calls (void **state) will_return (__wrap_lfb_event_end_feedback_async, 10); calls_call_set_state (CALLS_CALL (data->call_one), CALLS_CALL_STATE_INCOMING); - add_call (data->manager, data->call_one); + add_call (data->manager, data->ui_call_one); /* main loop will quit in callback of notify::ring */ g_main_loop_run (data->loop); @@ -538,9 +545,9 @@ test_ringing_multiple_calls_with_restart (void **state) will_return_always (__wrap_lfb_event_end_feedback_async, 10); calls_call_set_state (CALLS_CALL (data->call_one), CALLS_CALL_STATE_INCOMING); - add_call (data->manager, data->call_one); + add_call (data->manager, data->ui_call_one); calls_call_set_state (CALLS_CALL (data->call_two), CALLS_CALL_STATE_INCOMING); - add_call (data->manager, data->call_two); + add_call (data->manager, data->ui_call_two); /* main loop will quit in callback of notify::ring */ g_main_loop_run (data->loop);