aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy-gtk/empathy-location-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'libempathy-gtk/empathy-location-manager.c')
-rw-r--r--libempathy-gtk/empathy-location-manager.c50
1 files changed, 49 insertions, 1 deletions
diff --git a/libempathy-gtk/empathy-location-manager.c b/libempathy-gtk/empathy-location-manager.c
index 2e61d8d5e..caa40b5cd 100644
--- a/libempathy-gtk/empathy-location-manager.c
+++ b/libempathy-gtk/empathy-location-manager.c
@@ -57,6 +57,8 @@ typedef struct {
GeocluePosition *gc_position;
GeoclueAddress *gc_address;
#endif
+ gboolean reduce_accuracy;
+ gdouble reduce_value;
} EmpathyLocationManagerPriv;
static void location_manager_finalize (GObject *object);
@@ -77,6 +79,8 @@ static void publish_cb (EmpathyConf *conf, const gchar *key,
static void update_resources (EmpathyLocationManager *location_manager);
static void resource_cb (EmpathyConf *conf, const gchar *key,
gpointer user_data);
+static void accuracy_cb (EmpathyConf *conf, const gchar *key,
+ gpointer user_data);
#endif
G_DEFINE_TYPE (EmpathyLocationManager, empathy_location_manager, G_TYPE_OBJECT);
@@ -178,10 +182,13 @@ empathy_location_manager_init (EmpathyLocationManager *location_manager)
resource_cb, location_manager);
empathy_conf_notify_add (conf, EMPATHY_PREFS_LOCATION_RESOURCE_GPS,
resource_cb, location_manager);
+ empathy_conf_notify_add (conf, EMPATHY_PREFS_LOCATION_REDUCE_ACCURACY,
+ accuracy_cb, location_manager);
resource_cb (conf, EMPATHY_PREFS_LOCATION_RESOURCE_NETWORK, location_manager);
resource_cb (conf, EMPATHY_PREFS_LOCATION_RESOURCE_CELL, location_manager);
resource_cb (conf, EMPATHY_PREFS_LOCATION_RESOURCE_GPS, location_manager);
+ accuracy_cb (conf, EMPATHY_PREFS_LOCATION_REDUCE_ACCURACY, location_manager);
publish_cb (conf, EMPATHY_PREFS_LOCATION_PUBLISH, location_manager);
// Setup account status callbacks
@@ -315,6 +322,7 @@ position_changed_cb (GeocluePosition *position,
if (fields & GEOCLUE_POSITION_FIELDS_LONGITUDE)
{
+ longitude += priv->reduce_value;
new_value = tp_g_value_slice_new (G_TYPE_DOUBLE);
g_value_set_double (new_value, longitude);
g_hash_table_insert (priv->location, EMPATHY_LOCATION_LON, new_value);
@@ -322,6 +330,7 @@ position_changed_cb (GeocluePosition *position,
}
if (fields & GEOCLUE_POSITION_FIELDS_LATITUDE)
{
+ latitude += priv->reduce_value;
new_value = tp_g_value_slice_new (G_TYPE_DOUBLE);
g_value_set_double (new_value, latitude);
g_hash_table_insert (priv->location, EMPATHY_LOCATION_LAT, new_value);
@@ -360,6 +369,10 @@ address_foreach_cb (gpointer key,
EmpathyLocationManagerPriv *priv;
priv = GET_PRIV (location_manager);
+ // Discard street information if reduced accuracy is on
+ if (priv->reduce_accuracy && strcmp (key, EMPATHY_LOCATION_STREET) == 0)
+ return;
+
GValue *new_value = tp_g_value_slice_new (G_TYPE_STRING);
g_value_set_string (new_value, value);
@@ -510,7 +523,42 @@ publish_cb (EmpathyConf *conf,
}
-static void
+static void
+accuracy_cb (EmpathyConf *conf,
+ const gchar *key,
+ gpointer user_data)
+{
+ EmpathyLocationManager *manager = EMPATHY_LOCATION_MANAGER (user_data);
+ EmpathyLocationManagerPriv *priv;
+
+ gboolean enabled;
+
+ priv = GET_PRIV (manager);
+ DEBUG ("%s changed", key);
+
+ if (!empathy_conf_get_bool (conf, key, &enabled))
+ return;
+ priv->reduce_accuracy = enabled;
+
+ if (enabled)
+ {
+ GRand *rand = g_rand_new_with_seed (time (NULL));
+ priv->reduce_value = g_rand_double_range (rand, -0.25, 0.25);
+ g_rand_free (rand);
+ }
+ else
+ priv->reduce_value = 0.0;
+
+ if (!priv->is_setup)
+ return;
+
+ geoclue_address_get_address_async (priv->gc_address,
+ initial_address_cb, manager);
+ geoclue_position_get_position_async (priv->gc_position,
+ initial_position_cb, manager);
+}
+
+static void
resource_cb (EmpathyConf *conf,
const gchar *key,
gpointer user_data)