[calls] ui-call-data: Implement "active-time" property



commit edbf046bfdf0b170d2b02b4121fe53156e6dc9de
Author: Evangelos Ribeiro Tzaras <devrtz fortysixandtwo eu>
Date:   Mon Jan 31 15:51:45 2022 +0100

    ui-call-data: Implement "active-time" property

 src/calls-ui-call-data.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)
---
diff --git a/src/calls-ui-call-data.c b/src/calls-ui-call-data.c
index 58d7f3d4..b650409f 100644
--- a/src/calls-ui-call-data.c
+++ b/src/calls-ui-call-data.c
@@ -37,6 +37,7 @@ enum {
   PROP_ENCRYPTED,
   PROP_CAN_DTMF,
   PROP_AVATAR_ICON,
+  PROP_ACTIVE_TIME,
   PROP_LAST_PROP
 };
 
@@ -49,6 +50,10 @@ struct _CallsUiCallData
 
   CallsCall *call;
   CallsBestMatch *best_match;
+
+  GTimer       *timer;
+  gdouble       active_time;
+  guint         timer_id;
 };
 
 static void calls_ui_call_data_cui_call_interface_init (CuiCallInterface *iface);
@@ -124,6 +129,17 @@ calls_ui_call_data_get_avatar_icon (CuiCall *call_data)
 }
 
 
+static gdouble
+calls_ui_call_data_get_active_time (CuiCall *call_data)
+{
+  CallsUiCallData *self = (CallsUiCallData *) call_data;
+
+  g_return_val_if_fail (CALLS_IS_UI_CALL_DATA (self), 0.0);
+
+  return self->active_time;
+}
+
+
 static void
 calls_ui_call_data_accept (CuiCall *call_data)
 {
@@ -169,6 +185,7 @@ calls_ui_call_data_cui_call_interface_init (CuiCallInterface *iface)
   iface->get_encrypted = calls_ui_call_data_get_encrypted;
   iface->get_can_dtmf = calls_ui_call_data_get_can_dtmf;
   iface->get_avatar_icon = calls_ui_call_data_get_avatar_icon;
+  iface->get_active_time = calls_ui_call_data_get_active_time;
 
   iface->accept = calls_ui_call_data_accept;
   iface->hang_up = calls_ui_call_data_hang_up;
@@ -176,11 +193,33 @@ calls_ui_call_data_cui_call_interface_init (CuiCallInterface *iface)
 }
 
 
+static gboolean
+on_timer_ticked (CallsUiCallData *self)
+{
+  g_assert (CALLS_IS_UI_CALL_DATA (self));
+
+  self->active_time = g_timer_elapsed (self->timer, NULL);
+  g_object_notify_by_pspec (G_OBJECT (self), props[PROP_ACTIVE_TIME]);
+
+  return G_SOURCE_CONTINUE;
+}
+
+
 static void
 on_notify_state (CallsUiCallData *self)
 {
   g_assert (CALLS_IS_UI_CALL_DATA (self));
 
+  if (calls_call_get_state (self->call) == CALLS_CALL_STATE_ACTIVE) {
+    self->timer = g_timer_new ();
+    self->timer_id = g_timeout_add (500,
+                                    G_SOURCE_FUNC (on_timer_ticked),
+                                    self);
+  } else if (calls_call_get_state (self->call) == CALLS_CALL_STATE_DISCONNECTED) {
+    g_clear_handle_id (&self->timer_id, g_source_remove);
+    g_clear_pointer (&self->timer, g_timer_destroy);
+  }
+
   g_object_notify_by_pspec (G_OBJECT (self), props[PROP_STATE]);
 }
 
@@ -303,6 +342,10 @@ calls_ui_call_data_get_property (GObject    *object,
     g_value_set_object (value, calls_ui_call_data_get_avatar_icon (cui_call));
     break;
 
+  case PROP_ACTIVE_TIME:
+    g_value_set_double (value, self->active_time);
+    break;
+
   default:
     G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
     break;
@@ -317,6 +360,9 @@ calls_ui_call_data_finalize (GObject *object)
   g_object_unref (self->call);
   g_object_unref (self->best_match);
 
+  g_clear_handle_id (&self->timer_id, g_source_remove);
+  g_clear_pointer (&self->timer, g_timer_destroy);
+
   G_OBJECT_CLASS (calls_ui_call_data_parent_class)->finalize (object);
 }
 
@@ -361,6 +407,9 @@ calls_ui_call_data_class_init (CallsUiCallDataClass *klass)
 
   g_object_class_override_property (object_class, PROP_AVATAR_ICON, "avatar-icon");
   props[PROP_AVATAR_ICON] = g_object_class_find_property (object_class, "avatar-icon");
+
+  g_object_class_override_property (object_class, PROP_ACTIVE_TIME, "active-time");
+  props[PROP_ACTIVE_TIME] = g_object_class_find_property (object_class, "active-time");
 }
 
 CallsUiCallData *


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]