[gnome-contacts] Remember "no" reponse to link suggestion
- From: Alexander Larsson <alexl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-contacts] Remember "no" reponse to link suggestion
- Date: Tue, 24 Jan 2012 14:16:41 +0000 (UTC)
commit aab7274ecb45680b1553105dcc9f21be946c9389
Author: Alexander Larsson <alexl redhat com>
Date: Tue Jan 24 15:13:21 2012 +0100
Remember "no" reponse to link suggestion
src/contacts-contact-pane.vala | 2 +-
src/contacts-contact.vala | 3 ++
src/contacts-store.vala | 70 ++++++++++++++++++++++++++++++++++++++++
3 files changed, 74 insertions(+), 1 deletions(-)
---
diff --git a/src/contacts-contact-pane.vala b/src/contacts-contact-pane.vala
index d0724c1..8f51a88 100644
--- a/src/contacts-contact-pane.vala
+++ b/src/contacts-contact-pane.vala
@@ -1746,7 +1746,7 @@ public class Contacts.ContactPane : ScrolledWindow {
});
no.clicked.connect ( () => {
- /* TODO: Set up anti-linking relationship (and any where we force unlink) */
+ contacts_store.add_no_suggest_link (contact, c);
/* TODO: Add undo */
row.destroy ();
});
diff --git a/src/contacts-contact.vala b/src/contacts-contact.vala
index 334ca08..92d355b 100644
--- a/src/contacts-contact.vala
+++ b/src/contacts-contact.vala
@@ -1148,6 +1148,9 @@ public class Contacts.Contact : GLib.Object {
if (this.non_linkable () || other.non_linkable ())
return false;
+ if (!App.app.contacts_store.may_suggest_link (this, other))
+ return false;
+
/* Only connect main contacts with non-mainable contacts, and vice versa. */
if ((this.is_main && !other.has_mainable_persona()) ||
(!this.has_mainable_persona () && other.is_main)) {
diff --git a/src/contacts-store.vala b/src/contacts-store.vala
index 6dcb313..45b8d83 100644
--- a/src/contacts-store.vala
+++ b/src/contacts-store.vala
@@ -33,6 +33,8 @@ public class Contacts.Store : GLib.Object {
public Gee.HashMap<string, Account> calling_accounts;
+ public Gee.HashMultiMap<string, string> dont_suggest_link;
+
public bool can_call {
get {
return this.calling_accounts.size > 0 ? true : false;
@@ -62,9 +64,77 @@ public class Contacts.Store : GLib.Object {
return c.get_data<bool> ("contacts-master-at-join");
}
+ private void read_dont_suggest_db () {
+ dont_suggest_link.clear ();
+ try {
+ var path = Path.build_filename (Environment.get_user_config_dir (), "gnome-contacts", "dont_suggest.db");
+ string contents;
+ if (FileUtils.get_contents (path, out contents)) {
+ var rows = contents.split ("\n");
+ foreach (var r in rows) {
+ var ids = r.split (" ");
+ if (ids.length == 2) {
+ dont_suggest_link.set (ids[0], ids[1]);
+ }
+ }
+ }
+ } catch (GLib.Error e) {
+ if (!(e is FileError.NOENT))
+ warning ("error loading no suggestion db: %s\n", e.message);
+ }
+ }
+
+ private void write_dont_suggest_db () {
+ try {
+ var dir = Path.build_filename (Environment.get_user_config_dir (), "gnome-contacts");
+ DirUtils.create_with_parents (dir, 0700);
+ var path = Path.build_filename (dir, "dont_suggest.db");
+
+ var s = new StringBuilder ();
+ foreach (var key in dont_suggest_link.get_keys ()) {
+ foreach (var value in dont_suggest_link.get (key)) {
+ s.append_printf ("%s %s\n", key, value);
+ }
+ }
+ FileUtils.set_contents (path, s.str, s.len);
+ } catch (GLib.Error e) {
+ warning ("error writing no suggestion db: %s\n", e.message);
+ }
+ }
+
+ public bool may_suggest_link (Contact a, Contact b) {
+ foreach (var a_persona in a.individual.personas) {
+ foreach (var no_link_uid in dont_suggest_link.get (a_persona.uid)) {
+ foreach (var b_persona in b.individual.personas) {
+ if (b_persona.uid == no_link_uid)
+ return false;
+ }
+ }
+ }
+ foreach (var b_persona in b.individual.personas) {
+ foreach (var no_link_uid in dont_suggest_link.get (b_persona.uid)) {
+ foreach (var a_persona in a.individual.personas) {
+ if (a_persona.uid == no_link_uid)
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ public void add_no_suggest_link (Contact a, Contact b) {
+ var persona1 = a.get_personas_for_display ().to_array ()[0];
+ var persona2 = b.get_personas_for_display ().to_array ()[0];
+ dont_suggest_link.set (persona1.uid, persona2.uid);
+ write_dont_suggest_db ();
+ }
+
public Store () {
contacts = new Gee.ArrayList<Contact>();
+ dont_suggest_link = new Gee.HashMultiMap<string, string> ();
+ read_dont_suggest_db ();
+
backend_store = BackendStore.dup ();
aggregator = new IndividualAggregator ();
aggregator.notify["is-quiescent"].connect ( (obj, pspec) => {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]