Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Freeboxos] Fix NullPointerException when updating inactive Player #15813

Merged
merged 5 commits into from
Nov 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -197,21 +197,30 @@ private static record Channel(@SerializedName("bouquetId") long bouquetId,
public static record TvContext(@Nullable Channel channel, @Nullable PlayerDetails player) {
}

private final Map<Integer, String> subPaths = new HashMap<>();
private final Map<Integer, @Nullable String> subPaths = new HashMap<>();

public PlayerManager(FreeboxOsSession session) throws FreeboxException {
super(session, LoginManager.Permission.PLAYER, PlayerResponse.class,
session.getUriBuilder().path(THING_PLAYER));
}

private @Nullable String getSubPath(int id) throws FreeboxException {
String subPath = subPaths.get(id);
if (subPath != null) {
return subPath;
}
getDevices().stream().filter(Player::apiAvailable).forEach(player -> {
String baseUrl = player.baseUrl();
if (baseUrl != null) {
subPaths.put(player.id, baseUrl);
}
});
return subPaths.get(id);
}

public Status getPlayerStatus(int id) throws FreeboxException {
return getSingle(StatusResponse.class, subPaths.get(id), STATUS_PATH);
public @Nullable Status getPlayerStatus(int id) throws FreeboxException {
String subPath = getSubPath(id);
return subPath != null ? getSingle(StatusResponse.class, subPath, STATUS_PATH) : null;
}

// The player API does not allow to directly request a given player like others api parts
Expand All @@ -220,8 +229,9 @@ public Player getDevice(int id) throws FreeboxException {
return getDevices().stream().filter(player -> player.id == id).findFirst().orElse(null);
}

public Configuration getConfig(int id) throws FreeboxException {
return getSingle(ConfigurationResponse.class, subPaths.get(id), SYSTEM_PATH);
public @Nullable Configuration getConfig(int id) throws FreeboxException {
String subPath = getSubPath(id);
return subPath != null ? getSingle(ConfigurationResponse.class, subPath, SYSTEM_PATH) : null;
}

public void sendKey(String ip, String code, String key, boolean longPress, int count) {
Expand All @@ -240,7 +250,12 @@ public void sendKey(String ip, String code, String key, boolean longPress, int c
}
}

public void reboot(int id) throws FreeboxException {
post(subPaths.get(id), SYSTEM_PATH, REBOOT_ACTION);
public boolean reboot(int id) throws FreeboxException {
String subPath = getSubPath(id);
if (subPath != null) {
post(subPath, SYSTEM_PATH, REBOOT_ACTION);
return true;
}
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@
import org.slf4j.LoggerFactory;

/**
* The {@link ActivePlayerHandler} is responsible for handling everything associated to Freebox Player with api
* capabilities.
* The {@link ActivePlayerHandler} is responsible for handling everything associated to Freebox Player
* with api capabilities.
*
* @author Gaël L'hopital - Initial contribution
*/
Expand All @@ -59,32 +59,45 @@ void initializeProperties(Map<String, String> properties) throws FreeboxExceptio
Player player = getManager(PlayerManager.class).getDevice(getClientId());
if (player.reachable()) {
Configuration config = getManager(PlayerManager.class).getConfig(player.id());
properties.put(Thing.PROPERTY_SERIAL_NUMBER, config.serial());
properties.put(Thing.PROPERTY_FIRMWARE_VERSION, config.firmwareVersion());
if (config != null) {
properties.put(Thing.PROPERTY_SERIAL_NUMBER, config.serial());
properties.put(Thing.PROPERTY_FIRMWARE_VERSION, config.firmwareVersion());
}
}
}

@Override
protected void internalPoll() throws FreeboxException {
super.internalPoll();
if (thing.getStatus().equals(ThingStatus.ONLINE)) {
Status status = getManager(PlayerManager.class).getPlayerStatus(getClientId());
updateChannelString(PLAYER_STATUS, PLAYER_STATUS, status.powerState().name());
ForegroundApp foreground = status.foregroundApp();
if (foreground != null) {
updateChannelString(PLAYER_STATUS, PACKAGE, foreground._package());
Player player = getManager(PlayerManager.class).getDevice(getClientId());
updateStatus(player.reachable() ? ThingStatus.ONLINE : ThingStatus.OFFLINE);
if (player.reachable()) {
Status status = getManager(PlayerManager.class).getPlayerStatus(getClientId());
if (status != null) {
updateChannelString(PLAYER_STATUS, PLAYER_STATUS, status.powerState().name());
ForegroundApp foreground = status.foregroundApp();
if (foreground != null) {
updateChannelString(PLAYER_STATUS, PACKAGE, foreground._package());
}
}
Configuration config = getManager(PlayerManager.class).getConfig(getClientId());
if (config != null) {
uptime = checkUptimeAndFirmware(config.uptimeVal(), uptime, config.firmwareVersion());
} else {
uptime = 0;
}
}
Configuration config = getManager(PlayerManager.class).getConfig(getClientId());

uptime = checkUptimeAndFirmware(config.uptimeVal(), uptime, config.firmwareVersion());
updateChannelQuantity(SYS_INFO, UPTIME, uptime, Units.SECOND);
}
}

public void reboot() {
processReboot(() -> {
try {
getManager(PlayerManager.class).reboot(getClientId());
if (!getManager(PlayerManager.class).reboot(getClientId())) {
logger.warn("Unable to reboot the player - probably not reachable");
}
} catch (FreeboxException e) {
logger.warn("Error rebooting: {}", e.getMessage());
}
Expand Down