weather: Follow GNOME Weather's location permissions

Our weather integration should follow GNOME Weather as closely as
possible, which means that we should respect its location permission
rather than using our own or none at all (which we can as a "system"
component and as geoclue's authorization agent).

https://bugzilla.gnome.org/show_bug.cgi?id=780252
This commit is contained in:
Florian Müllner 2017-03-19 16:29:35 +01:00
parent 9cc1e6b85c
commit c3428f1efa
2 changed files with 42 additions and 1 deletions

View File

@ -17,6 +17,13 @@ const PermissionStoreIface = '<node> \
<arg name="app_permissions" type="a{sas}" direction="in"/> \ <arg name="app_permissions" type="a{sas}" direction="in"/> \
<arg name="data" type="v" direction="in"/> \ <arg name="data" type="v" direction="in"/> \
</method> \ </method> \
<signal name="Changed"> \
<arg name="table" type="s" direction="out"/> \
<arg name="id" type="s" direction="out"/> \
<arg name="deleted" type="b" direction="out"/> \
<arg name="data" type="v" direction="out"/> \
<arg name="permissions" type="a{sas}" direction="out"/> \
</signal> \
</interface> \ </interface> \
</node>'; </node>';

View File

@ -7,6 +7,7 @@ const GWeather = imports.gi.GWeather;
const Lang = imports.lang; const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
const PermissionStore = imports.misc.permissionStore;
const Util = imports.misc.util; const Util = imports.misc.util;
// Minimum time between updates to show loading indication // Minimum time between updates to show loading indication
@ -28,6 +29,25 @@ const WeatherClient = new Lang.Class({
this._gclueStarting = false; this._gclueStarting = false;
this._gclueLocationChangedId = 0; this._gclueLocationChangedId = 0;
this._weatherAuthorized = false;
this._permStore = new PermissionStore.PermissionStore((proxy, error) => {
if (error) {
log('Failed to connect to permissionStore: ' + error.message);
return;
}
this._permStore.LookupRemote('gnome', 'geolocation', (res, error) => {
if (error)
log('Error looking up permission: ' + error.message);
let [perms, data] = error ? [{}, null] : res;
let params = ['gnome', 'geolocation', false, data, perms];
this._onPermStoreChanged(this._permStore, '', params);
});
});
this._permStore.connectSignal('Changed',
Lang.bind(this, this._onPermStoreChanged));
this._locationSettings = new Gio.Settings({ schema_id: 'org.gnome.system.location' }); this._locationSettings = new Gio.Settings({ schema_id: 'org.gnome.system.location' });
this._locationSettings.connect('changed::enabled', this._locationSettings.connect('changed::enabled',
Lang.bind(this, this._updateAutoLocation)); Lang.bind(this, this._updateAutoLocation));
@ -87,7 +107,8 @@ const WeatherClient = new Lang.Class({
get _useAutoLocation() { get _useAutoLocation() {
return this._autoLocationRequested && return this._autoLocationRequested &&
this._locationSettings.get_boolean('enabled'); this._locationSettings.get_boolean('enabled') &&
this._weatherAuthorized;
}, },
_loadInfo: function() { _loadInfo: function() {
@ -205,6 +226,19 @@ const WeatherClient = new Lang.Class({
if (!this._useAutoLocation || !this._gclueStarted) if (!this._useAutoLocation || !this._gclueStarted)
this._setLocation(this._mostRecentLocation); this._setLocation(this._mostRecentLocation);
},
_onPermStoreChanged: function(proxy, sender, params) {
let [table, id, deleted, data, perms] = params;
if (table != 'gnome' || id != 'geolocation')
return;
let permission = perms['org.gnome.Weather.Application'] || ['NONE'];
let [accuracy] = permission;
this._weatherAuthorized = accuracy != 'NONE';
this._updateAutoLocation();
} }
}); });
Signals.addSignalMethods(WeatherClient.prototype); Signals.addSignalMethods(WeatherClient.prototype);