location,schema: Keep max accuracy in gsetting
Instead of relying on geoclue to store this user configuration, lets keep it in gsettings. Geoclue is a system service and therefore is not the appropriate entity to keep this info. https://bugzilla.gnome.org/show_bug.cgi?id=723684
This commit is contained in:
parent
38f241479c
commit
d6146197dd
@ -65,6 +65,7 @@
|
||||
<child name="calendar" schema="org.gnome.shell.calendar"/>
|
||||
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
|
||||
<child name="keyboard" schema="org.gnome.shell.keyboard"/>
|
||||
<child name="location" schema="org.gnome.shell.location"/>
|
||||
</schema>
|
||||
|
||||
<schema id="org.gnome.shell.calendar" path="/org/gnome/shell/calendar/"
|
||||
@ -134,6 +135,32 @@
|
||||
</key>
|
||||
</schema>
|
||||
|
||||
<enum id="org.gnome.shell.geoclue.AccuracyLevel">
|
||||
<value value="0" nick="off"/>
|
||||
<value value="1" nick="country"/>
|
||||
<value value="4" nick="city"/>
|
||||
<value value="5" nick="neighborhood"/>
|
||||
<value value="6" nick="street"/>
|
||||
<value value="8" nick="exact"/>
|
||||
</enum>
|
||||
<schema id="org.gnome.shell.location"
|
||||
path="/org/gnome/shell/location/"
|
||||
gettext-domain="@GETTEXT_PACKAGE@">
|
||||
<key name="max-accuracy-level" enum="org.gnome.shell.geoclue.AccuracyLevel">
|
||||
<default>'exact'</default>
|
||||
<_summary>The maximum accuracy level of location.</_summary>
|
||||
<_description>
|
||||
Configures the maximum level of location accuracy applications are
|
||||
allowed to see. Valid options are 'off' (disable location tracking),
|
||||
'country', 'city', 'neighborhood', 'street', and 'exact' (typically
|
||||
requires GPS receiver). Please keep in mind that this only controls
|
||||
what Geoclue will allow applications to see and they can find user's
|
||||
location on their own using network resources (albeit with street-level
|
||||
accuracy at best).
|
||||
</_description>
|
||||
</key>
|
||||
</schema>
|
||||
|
||||
<schema id="org.gnome.shell.app-switcher"
|
||||
path="/org/gnome/shell/app-switcher/"
|
||||
gettext-domain="@GETTEXT_PACKAGE@">
|
||||
|
@ -8,6 +8,9 @@ const Shell = imports.gi.Shell;
|
||||
const PanelMenu = imports.ui.panelMenu;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
|
||||
const LOCATION_SCHEMA = 'org.gnome.shell.location';
|
||||
const MAX_ACCURACY_LEVEL = 'max-accuracy-level';
|
||||
|
||||
var GeoclueIface = '<node> \
|
||||
<interface name="org.freedesktop.GeoClue2.Manager"> \
|
||||
<property name="InUse" type="b" access="read"/> \
|
||||
@ -39,6 +42,10 @@ const Indicator = new Lang.Class({
|
||||
_init: function() {
|
||||
this.parent();
|
||||
|
||||
this._settings = new Gio.Settings({ schema: LOCATION_SCHEMA });
|
||||
this._settings.connect('changed::' + MAX_ACCURACY_LEVEL,
|
||||
Lang.bind(this, this._onMaxAccuracyLevelChanged));
|
||||
|
||||
this._indicator = this._addIndicator();
|
||||
this._indicator.icon_name = 'find-location-symbolic';
|
||||
|
||||
@ -61,20 +68,12 @@ const Indicator = new Lang.Class({
|
||||
0,
|
||||
Lang.bind(this, this._connectToGeoclue),
|
||||
Lang.bind(this, this._onGeoclueVanished));
|
||||
|
||||
this._onMaxAccuracyLevelChanged();
|
||||
this._connectToGeoclue();
|
||||
},
|
||||
|
||||
get MaxAccuracyLevel() {
|
||||
return this._maxAccuracyLevel;
|
||||
},
|
||||
|
||||
set MaxAccuracyLevel(value) {
|
||||
if (this._userSetAccuracy)
|
||||
// If user set the max accuracy level, don't let geoclue override
|
||||
return;
|
||||
|
||||
this._setMaxAccuracyLevel(value, false);
|
||||
return this._getMaxAccuracyLevel();
|
||||
},
|
||||
|
||||
// We (and geoclue) have currently no way to reliably identifying apps so
|
||||
@ -87,7 +86,7 @@ const Indicator = new Lang.Class({
|
||||
return [false, 0];
|
||||
}
|
||||
|
||||
var allowedAccuracyLevel = clamp(reqAccuracyLevel, 0, this._maxAccuracyLevel);
|
||||
let allowedAccuracyLevel = clamp(reqAccuracyLevel, 0, this._getMaxAccuracyLevel());
|
||||
return [true, allowedAccuracyLevel];
|
||||
},
|
||||
|
||||
@ -115,7 +114,6 @@ const Indicator = new Lang.Class({
|
||||
_onProxyReady: function(proxy, error) {
|
||||
if (error != null) {
|
||||
log(error.message);
|
||||
this._userSetAccuracy = false;
|
||||
this._connecting = false;
|
||||
return;
|
||||
}
|
||||
@ -144,16 +142,14 @@ const Indicator = new Lang.Class({
|
||||
},
|
||||
|
||||
_onOnOffAction: function() {
|
||||
if (this._maxAccuracyLevel == 0)
|
||||
this._setMaxAccuracyLevel(this._availableAccuracyLevel, true);
|
||||
if (this._getMaxAccuracyLevel() == 0)
|
||||
this._settings.set_enum(MAX_ACCURACY_LEVEL, this._availableAccuracyLevel);
|
||||
else
|
||||
this._setMaxAccuracyLevel(0, true);
|
||||
this._settings.set_enum(MAX_ACCURACY_LEVEL, 0);
|
||||
},
|
||||
|
||||
_setMaxAccuracyLevel: function(maxAccuracyLevel, userSet) {
|
||||
this._maxAccuracyLevel = maxAccuracyLevel;
|
||||
|
||||
if (this._maxAccuracyLevel == 0) {
|
||||
_onMaxAccuracyLevelChanged: function() {
|
||||
if (this._getMaxAccuracyLevel() == 0) {
|
||||
this._item.status.text = _("Off");
|
||||
this._onoffAction.label.text = "Turn On";
|
||||
} else {
|
||||
@ -161,31 +157,23 @@ const Indicator = new Lang.Class({
|
||||
this._onoffAction.label.text = "Turn Off";
|
||||
}
|
||||
|
||||
if (!userSet)
|
||||
return;
|
||||
|
||||
this._userSetAccuracy = true;
|
||||
// Gotta ensure geoclue is up and we are registered as agent to it
|
||||
// before we emit the notify for this property change.
|
||||
if (!this._connectToGeoclue())
|
||||
this._notifyMaxAccuracyLevel();
|
||||
},
|
||||
|
||||
_notifyMaxAccuracyLevel: function() {
|
||||
if (!this._userSetAccuracy)
|
||||
return;
|
||||
_getMaxAccuracyLevel: function() {
|
||||
return this._settings.get_enum(MAX_ACCURACY_LEVEL);
|
||||
},
|
||||
|
||||
var variant = new GLib.Variant('u', this._maxAccuracyLevel);
|
||||
_notifyMaxAccuracyLevel: function() {
|
||||
let variant = new GLib.Variant('u', this._getMaxAccuracyLevel());
|
||||
this._agent.emit_property_changed('MaxAccuracyLevel', variant);
|
||||
this._userSetAccuracy = false;
|
||||
},
|
||||
|
||||
_updateMenuVisibility: function() {
|
||||
this._availableAccuracyLevel = this._proxy.AvailableAccuracyLevel;
|
||||
if (!this._maxAccuracyLevelInitialized) {
|
||||
this._maxAccuracyLevel = this._availableAccuracyLevel;
|
||||
this._maxAccuracyLevelInitialized = true;
|
||||
}
|
||||
this.menu.actor.visible = (this._availableAccuracyLevel != 0);
|
||||
},
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user