]> git.basschouten.com Git - openhab-addons.git/commitdiff
[Freeboxos] npe when updating inactive Player (#15813)
authorGaël L'hopital <gael@lhopital.org>
Sat, 4 Nov 2023 09:28:46 +0000 (10:28 +0100)
committerGitHub <noreply@github.com>
Sat, 4 Nov 2023 09:28:46 +0000 (10:28 +0100)
* Correcting npe
* Added status update

---------

Signed-off-by: clinique <gael@lhopital.org>
bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/api/rest/PlayerManager.java
bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/ActivePlayerHandler.java

index 0326c1e0ff8b4a95ca85624c9fea5183adb85bc6..31256516c750dedbdbf8ec9d35ce52d28a6ad745 100644 (file)
@@ -197,21 +197,30 @@ public class PlayerManager extends ListableRest<PlayerManager.Player, PlayerMana
     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
@@ -220,8 +229,9 @@ public class PlayerManager extends ListableRest<PlayerManager.Player, PlayerMana
         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) {
@@ -240,7 +250,12 @@ public class PlayerManager extends ListableRest<PlayerManager.Player, PlayerMana
         }
     }
 
-    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;
     }
 }
index 52c8063664735ef0101898b3af15b2766343000e..63a02eb4b64dc78410e35e1399629fa0aceeb24c 100644 (file)
@@ -35,8 +35,8 @@ import org.slf4j.Logger;
 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
  */
@@ -59,8 +59,10 @@ public class ActivePlayerHandler extends PlayerHandler implements FreeDeviceIntf
         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());
+            }
         }
     }
 
@@ -68,15 +70,24 @@ public class ActivePlayerHandler extends PlayerHandler implements FreeDeviceIntf
     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);
         }
     }
@@ -84,7 +95,9 @@ public class ActivePlayerHandler extends PlayerHandler implements FreeDeviceIntf
     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());
             }