diff --git a/src/calls-call-record-row.c b/src/calls-call-record-row.c
index d11d9bd..0b8ae52 100644
--- a/src/calls-call-record-row.c
+++ b/src/calls-call-record-row.c
@@ -296,10 +296,30 @@ setup_time (CallsCallRecordRow *self,
}
+static void
+on_notify_can_add_contacts (CallsCallRecordRow *self)
+{
+ CallsContactsProvider *contacts_provider;
+ GAction *action_new_contact = g_action_map_lookup_action (self->action_map, "new-contact");
+
+ contacts_provider = calls_manager_get_contacts_provider (calls_manager_get_default ());
+
+ if (!calls_contacts_provider_get_can_add_contacts (contacts_provider))
+ return;
+
+ g_object_bind_property (self->contact, "has-individual",
+ action_new_contact, "enabled",
+ G_BINDING_SYNC_CREATE |
+ G_BINDING_INVERT_BOOLEAN);
+ g_signal_handlers_disconnect_by_data(contacts_provider, self);
+}
+
+
static void
setup_contact (CallsCallRecordRow *self)
{
- GAction *act = g_action_map_lookup_action (self->action_map, "copy-number");
+ GAction *action_copy = g_action_map_lookup_action (self->action_map, "copy-number");
+ GAction *action_new_contact = g_action_map_lookup_action (self->action_map, "new-contact");
g_autofree gchar *target = NULL;
CallsContactsProvider *contacts_provider;
@@ -324,12 +344,23 @@ setup_contact (CallsCallRecordRow *self)
self->avatar, "loadable-icon",
G_BINDING_SYNC_CREATE);
+ if (calls_contacts_provider_get_can_add_contacts (contacts_provider)) {
+ on_notify_can_add_contacts (self);
+ } else {
+ g_simple_action_set_enabled (G_SIMPLE_ACTION (action_new_contact), FALSE);
+ g_signal_connect_swapped (contacts_provider,
+ "notify::can-add-contacts",
+ G_CALLBACK (on_notify_can_add_contacts),
+ self);
+ }
+
+
if (target[0] == '\0') {
gtk_actionable_set_action_name (GTK_ACTIONABLE (self->button), NULL);
- g_simple_action_set_enabled (G_SIMPLE_ACTION (act), FALSE);
+ g_simple_action_set_enabled (G_SIMPLE_ACTION (action_copy), FALSE);
} else {
gtk_actionable_set_action_name (GTK_ACTIONABLE (self->button), "app.dial");
- g_simple_action_set_enabled (G_SIMPLE_ACTION (act), TRUE);
+ g_simple_action_set_enabled (G_SIMPLE_ACTION (action_copy), TRUE);
}
}
@@ -545,10 +576,26 @@ copy_number_activated (GSimpleAction *action,
}
+static void
+new_contact_activated (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer data)
+{
+ CallsCallRecordRow *self = CALLS_CALL_RECORD_ROW (data);
+ CallsContactsProvider *contacts_provider;
+
+ contacts_provider = calls_manager_get_contacts_provider (calls_manager_get_default ());
+
+ calls_contacts_provider_add_new_contact (contacts_provider,
+ calls_best_match_get_phone_number (self->contact));
+}
+
+
static GActionEntry entries[] =
{
{ "delete-call", delete_call_activated, NULL, NULL, NULL},
{ "copy-number", copy_number_activated, NULL, NULL, NULL},
+ { "new-contact", new_contact_activated, NULL, NULL, NULL},
};
diff --git a/src/ui/call-record-row.ui b/src/ui/call-record-row.ui
index 99f4a1c..b55aa89 100644
--- a/src/ui/call-record-row.ui
+++ b/src/ui/call-record-row.ui
@@ -109,6 +109,11 @@
copy-number
action-disabled
+ -
+ _Add contact
+ new-contact
+ action-disabled
+