]> git.basschouten.com Git - openhab-addons.git/commitdiff
[homekit] fix for #9478. add listener for metadata changes (#9484)
authoreugen <freiter@gmail.com>
Wed, 23 Dec 2020 19:07:25 +0000 (20:07 +0100)
committerGitHub <noreply@github.com>
Wed, 23 Dec 2020 19:07:25 +0000 (11:07 -0800)
Signed-off-by: Eugen Freiter <freiter@gmx.de>
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitChangeListener.java

index c3a3aef27aaa9a785364fe58b70bcac087629cfa..d1503a4d885ece9999286cd2787d5b7f18d8cd5b 100644 (file)
@@ -25,11 +25,13 @@ import java.util.concurrent.ScheduledExecutorService;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.openhab.core.common.ThreadPoolManager;
+import org.openhab.core.common.registry.RegistryChangeListener;
 import org.openhab.core.items.GroupItem;
 import org.openhab.core.items.Item;
 import org.openhab.core.items.ItemNotFoundException;
 import org.openhab.core.items.ItemRegistry;
 import org.openhab.core.items.ItemRegistryChangeListener;
+import org.openhab.core.items.Metadata;
 import org.openhab.core.items.MetadataRegistry;
 import org.openhab.core.storage.Storage;
 import org.openhab.core.storage.StorageService;
@@ -41,7 +43,7 @@ import io.github.hapjava.accessories.HomekitAccessory;
 import io.github.hapjava.server.impl.HomekitRoot;
 
 /**
- * Listens for changes to the item registry. When changes are detected, check
+ * Listens for changes to the item and metadata registry. When changes are detected, check
  * for HomeKit tags and, if present, add the items to the HomekitAccessoryRegistry.
  *
  * @author Andy Lintner - Initial contribution
@@ -55,6 +57,7 @@ public class HomekitChangeListener implements ItemRegistryChangeListener {
     private final HomekitAccessoryRegistry accessoryRegistry = new HomekitAccessoryRegistry();
     private final MetadataRegistry metadataRegistry;
     private final Storage<String> storage;
+    private final RegistryChangeListener<Metadata> metadataChangeListener;
     private HomekitAccessoryUpdater updater = new HomekitAccessoryUpdater();
     private HomekitSettings settings;
     private int lastAccessoryCount;
@@ -82,8 +85,39 @@ public class HomekitChangeListener implements ItemRegistryChangeListener {
         storage = storageService.getStorage(HomekitAuthInfoImpl.STORAGE_KEY);
         this.applyUpdatesDebouncer = new Debouncer("update-homekit-devices", scheduler, Duration.ofMillis(1000),
                 Clock.systemUTC(), this::applyUpdates);
+        metadataChangeListener = new RegistryChangeListener<Metadata>() {
+            @Override
+            public void added(final Metadata metadata) {
+                try {
+                    markDirty(itemRegistry.getItem(metadata.getUID().getItemName()));
+                } catch (ItemNotFoundException e) {
+                    logger.debug("Could not found item for metadata {}", metadata);
+                }
+            }
+
+            @Override
+            public void removed(final Metadata metadata) {
+                try {
+                    markDirty(itemRegistry.getItem(metadata.getUID().getItemName()));
+                } catch (ItemNotFoundException e) {
+                    logger.debug("Could not found item for metadata {}", metadata);
+                }
+            }
 
+            @Override
+            public void updated(final Metadata metadata, final Metadata e1) {
+                try {
+                    markDirty(itemRegistry.getItem(metadata.getUID().getItemName()));
+                    if (!metadata.getUID().getItemName().equals(e1.getUID().getItemName())) {
+                        markDirty(itemRegistry.getItem(e1.getUID().getItemName()));
+                    }
+                } catch (ItemNotFoundException e) {
+                    logger.debug("Could not found item for metadata {}", metadata);
+                }
+            }
+        };
         itemRegistry.addRegistryChangeListener(this);
+        metadataRegistry.addRegistryChangeListener(metadataChangeListener);
         itemRegistry.getItems().forEach(this::createRootAccessories);
         initialiseRevision();
         logger.info("Created {} HomeKit items.", accessoryRegistry.getAllAccessories().size());
@@ -211,6 +245,7 @@ public class HomekitChangeListener implements ItemRegistryChangeListener {
 
     public void stop() {
         this.itemRegistry.removeRegistryChangeListener(this);
+        this.metadataRegistry.removeRegistryChangeListener(metadataChangeListener);
     }
 
     public Map<String, HomekitAccessory> getAccessories() {