aboutsummaryrefslogtreecommitdiff
path: root/src/media-player-user.vala
blob: 658b46604c5a48fa097ace155d284aa5b1688c85 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/*
 * Copyright © 2014 Canonical Ltd.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 3.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Authors:
 *      Ted Gould <ted@canonical.com>
 */

public abstract class MediaPlayerUser : MediaPlayer {
	Act.UserManager accounts_manager = Act.UserManager.get_default();
	string username;
	Act.User? actuser = null;
	AccountsServiceSoundSettings? proxy = null;

	MediaPlayerUser(string user) {
		username = user;

		actuser = accounts_manager.get_user(user);
		actuser.notify["is-loaded"].connect(() => {
			debug("User loaded");

			this.proxy = null;

			Bus.get_proxy.begin<AccountsServiceSoundSettings> (
				BusType.SYSTEM,
				"org.freedesktop.Accounts",
				actuser.get_object_path(),
				DBusProxyFlags.GET_INVALIDATED_PROPERTIES,
				null,
				new_proxy);
		});
	}

	void new_proxy (GLib.Object? obj, AsyncResult res) {
		try {
			this.proxy = Bus.get_proxy.end (res);
			/* TODO: Update settings */
		} catch (Error e) {
			this.proxy = null;
			warning("Unable to get proxy to user '%s' sound settings: %s", username, e.message);
		}
	}

	bool proxy_is_valid () {
		if (this.proxy == null) {
			return false;
		}

		/* More than 10 minutes old */
		if (this.proxy.timestamp < GLib.get_monotonic_time() - 10 * 60 * 1000 * 1000) {
			return false;
		}

		return true;
	}

	public override string id {
		get { return username; }
	}

	string name_cache;
	public override string name { 
		get {
			if (proxy_is_valid()) {
				name_cache = this.proxy.player_name;
				return name_cache;
			} else {
				return "";
			}
		}
	}
	string state_cache;
	public override string state {
		get {
			if (proxy_is_valid()) {
				state_cache = this.proxy.state;
				return state_cache;
			} else {
				return "";
			}
		}
		set { }
	}
	Icon icon_cache;
	public override Icon? icon { 
		get { 
			if (proxy_is_valid()) {
				icon_cache = Icon.deserialize(this.proxy.player_icon);
				return icon_cache;
			} else {
				return null;
			}
		}
	}
	public override string dbus_name { get { return ""; } }

	public override bool is_running { get { return true; } }
	public override bool can_raise { get { return false; } }

	MediaPlayer.Track track_cache;
	public override MediaPlayer.Track? current_track {
		get { 
			if (proxy_is_valid()) {
				track_cache = new MediaPlayer.Track(
					this.proxy.artist,
					this.proxy.title,
					this.proxy.album,
					this.proxy.art_url
				);
				return track_cache;
			} else {
				return null;
			}
		}
		set { }
	}

	/* Control functions through unity-greeter-session-broadcast */
	public override void activate () {
		/* TODO: */
	}
	public override void play_pause () {
		/* TODO: */
	}
	public override void next () {
		/* TODO: */
	}
	public override void previous () {
		/* TODO: */
	}

	/* Play list functions are all null as we don't support the
	   playlist feature on the greeter */
	public override uint get_n_playlists() {
		return 0;
	}
	public override string get_playlist_id (int index) {
		return "";
	}
	public override string get_playlist_name (int index) {
		return "";
	}
	public override void activate_playlist_by_name (string playlist) {
	}
}