[amazonechocontrol] Fix push activity handling (#18297)

Port of https://github.com/smarthomej/addons/pull/607

Signed-off-by: Cody Cutrer <cody@cutrer.us>
Co-authored-by: Jan N. Klug <github@klug.nrw>
This commit is contained in:
Cody Cutrer
2025-02-19 20:25:57 +01:00
committed by GitHub
co-authored by Jan N. Klug
parent e5ab744e58
commit d7abc08cfd
@@ -28,7 +28,6 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@@ -115,7 +114,7 @@ public class AccountHandler extends BaseBridgeHandler implements PushConnection.
private final Map<String, EchoHandler> echoHandlers = new ConcurrentHashMap<>(); private final Map<String, EchoHandler> echoHandlers = new ConcurrentHashMap<>();
private final Set<SmartHomeDeviceHandler> smartHomeDeviceHandlers = new CopyOnWriteArraySet<>(); private final Set<SmartHomeDeviceHandler> smartHomeDeviceHandlers = new CopyOnWriteArraySet<>();
private final Set<FlashBriefingProfileHandler> flashBriefingProfileHandlers = new CopyOnWriteArraySet<>(); private final Set<FlashBriefingProfileHandler> flashBriefingProfileHandlers = new CopyOnWriteArraySet<>();
private final Set<String> deviceSerialNumbers = new CopyOnWriteArraySet<>(); private final LinkedBlockingQueue<String> pushActivityProcessingQueue = new LinkedBlockingQueue<>();
private final Object synchronizeConnection = new Object(); private final Object synchronizeConnection = new Object();
private Map<String, DeviceTO> serialNumberDeviceMapping = new HashMap<>(); private Map<String, DeviceTO> serialNumberDeviceMapping = new HashMap<>();
@@ -628,17 +627,18 @@ public class AccountHandler extends BaseBridgeHandler implements PushConnection.
} }
echoHandler.handlePushCommand(command, payload); echoHandler.handlePushCommand(command, payload);
if ("PUSH_EQUALIZER_STATE_CHANGE".equals(command) || "PUSH_VOLUME_CHANGE".equals(command)) { if ("PUSH_EQUALIZER_STATE_CHANGE".equals(command) || "PUSH_VOLUME_CHANGE".equals(command)) {
deviceSerialNumbers.add(dopplerId.deviceSerialNumber); pushActivityProcessingQueue.add(dopplerId.deviceSerialNumber);
// check if a processing job is already scheduled or we need to create a new one
ScheduledFuture<?> refreshActivityJob = this.refreshActivityJob; ScheduledFuture<?> refreshActivityJob = this.refreshActivityJob;
if (refreshActivityJob != null) { if (refreshActivityJob == null || refreshActivityJob.isDone()) {
refreshActivityJob.cancel(false);
}
this.refreshActivityJob = scheduler.schedule( this.refreshActivityJob = scheduler.schedule(
() -> handlePushActivity(deviceSerialNumbers, pushCommand.timeStamp), () -> handlePushActivity(pushCommand.timeStamp),
handlerConfig.activityRequestDelay, TimeUnit.SECONDS); handlerConfig.activityRequestDelay, TimeUnit.SECONDS);
} }
} }
} }
}
break; break;
case "NotifyNowPlayingUpdated": case "NotifyNowPlayingUpdated":
NotifyNowPlayingUpdatedTO update = Objects NotifyNowPlayingUpdatedTO update = Objects
@@ -672,13 +672,13 @@ public class AccountHandler extends BaseBridgeHandler implements PushConnection.
return connection.getActivities(startTimestamp, endTimestamp); return connection.getActivities(startTimestamp, endTimestamp);
} }
private void handlePushActivity(Set<String> deviceSerialNumbers, @Nullable Long timestamp) { private void handlePushActivity(@Nullable Long timestamp) {
List<CustomerHistoryRecordTO> activityRecords = getCustomerActivity(timestamp); List<CustomerHistoryRecordTO> activityRecords = getCustomerActivity(timestamp);
Iterator<String> iterator = deviceSerialNumbers.iterator(); while (!pushActivityProcessingQueue.isEmpty()) {
while (iterator.hasNext()) { String deviceSerialNumber = pushActivityProcessingQueue.poll();
try { try {
String deviceSerialNumber = iterator.next(); Objects.requireNonNull(deviceSerialNumber);
EchoHandler echoHandler = echoHandlers.get(deviceSerialNumber); EchoHandler echoHandler = echoHandlers.get(deviceSerialNumber);
if (echoHandler == null) { if (echoHandler == null) {
logger.warn("Could not find thing handler for serialnumber {}", deviceSerialNumber); logger.warn("Could not find thing handler for serialnumber {}", deviceSerialNumber);
@@ -686,8 +686,8 @@ public class AccountHandler extends BaseBridgeHandler implements PushConnection.
} }
activityRecords.stream().filter(r -> r.recordKey.endsWith(deviceSerialNumber)) activityRecords.stream().filter(r -> r.recordKey.endsWith(deviceSerialNumber))
.forEach(echoHandler::handlePushActivity); .forEach(echoHandler::handlePushActivity);
} finally { } catch (RuntimeException e) {
iterator.remove(); logger.warn("Could not handle push activity", e);
} }
} }
} }