private String likeCommand;
private String unlikeCommand;
+ private boolean connected = false;
/**
* Creates SqueezeBox Player Handler
public void initialize() {
mac = getConfig().as(SqueezeBoxPlayerConfig.class).mac;
timeCounter();
- updateBridgeStatus();
+ updateThingStatus();
logger.debug("player thing {} initialized with mac {}", getThing().getUID(), mac);
+ if (squeezeBoxServerHandler != null) {
+ // ensure we get an up-to-date connection state
+ squeezeBoxServerHandler.requestPlayers();
+ }
}
@Override
public void bridgeStatusChanged(ThingStatusInfo bridgeStatusInfo) {
- updateBridgeStatus();
+ updateThingStatus();
}
- private void updateBridgeStatus() {
+ private void updateThingStatus() {
Thing bridge = getBridge();
if (bridge != null) {
squeezeBoxServerHandler = (SqueezeBoxServerHandler) bridge.getHandler();
ThingStatus bridgeStatus = bridge.getStatus();
- if (bridgeStatus == ThingStatus.ONLINE && getThing().getStatus() != ThingStatus.ONLINE) {
- updateStatus(ThingStatus.ONLINE, ThingStatusDetail.NONE);
- } else if (bridgeStatus == ThingStatus.OFFLINE) {
+
+ if (bridgeStatus == ThingStatus.OFFLINE) {
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_OFFLINE);
+ } else if (!this.connected) {
+ updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.NONE);
+ } else if (bridgeStatus == ThingStatus.ONLINE && getThing().getStatus() != ThingStatus.ONLINE) {
+ updateStatus(ThingStatus.ONLINE, ThingStatusDetail.NONE);
}
} else {
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR, "Bridge not found");
}
}
+ @Override
+ public void connectedStateChangeEvent(String mac, boolean connected) {
+ if (isMe(mac)) {
+ this.connected = connected;
+ updateThingStatus();
+ }
+ }
+
@Override
public void updateFavoritesListEvent(List<Favorite> favorites) {
logger.trace("Player {} updating favorites list with {} favorites", mac, favorites.size());
import java.util.Base64;
import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
}
private void handlePlayersList(String message) {
+ final Set<String> connectedPlayers = new HashSet<>();
+
// Split out players
String[] playersList = message.split("playerindex\\S*\\s");
for (String playerParams : playersList) {
player.setName(parameter.substring(parameter.indexOf(":") + 1));
} else if (parameter.startsWith("model:")) {
player.setModel(parameter.substring(parameter.indexOf(":") + 1));
+ } else if (parameter.startsWith("connected:")) {
+ if ("1".equals(parameter.substring(parameter.indexOf(":") + 1))) {
+ connectedPlayers.add(macAddress);
+ }
}
}
sendCommand(player.getMacAddress() + " status - 1 subscribe:10 tags:yagJlNKjc");
}
}
+ for (final SqueezeBoxPlayer player : players.values()) {
+ final String mac = player.getMacAddress();
+ final boolean connected = connectedPlayers.contains(mac);
+ updatePlayer(listener -> listener.connectedStateChangeEvent(mac, connected));
+ }
}
private void handlePlayerUpdate(String message) {
// get the message type
String messageType = messageParts[1];
switch (messageType) {
+ case "client":
+ handleClientMessage(mac, messageParts);
+ break;
case "status":
handleStatusMessage(mac, messageParts);
break;
}
}
+ private void handleClientMessage(final String mac, String[] messageParts) {
+ if (messageParts.length < 3) {
+ return;
+ }
+
+ String action = messageParts[2];
+ final boolean connected;
+
+ if ("new".equals(action) || "reconnect".equals(action)) {
+ connected = true;
+ } else if ("disconnect".equals(action) || "forget".equals(action)) {
+ connected = false;
+ } else {
+ logger.trace("Unhandled client message type '{}'", Arrays.toString(messageParts));
+ return;
+ }
+
+ updatePlayer(listener -> listener.connectedStateChangeEvent(mac, connected));
+ }
+
private void handleStatusMessage(final String mac, String[] messageParts) {
String remoteTitle = "", artist = "", album = "", genre = "", year = "";
boolean coverart = false;