mirror of
https://github.com/danieldemus/openhab-addons
synced 2026-07-31 05:24:24 +02:00
[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:
co-authored by
Jan N. Klug
parent
e5ab744e58
commit
d7abc08cfd
+13
-13
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user