]> nmode's Git Repositories - signal-cli/commitdiff
Reexport dbus objects when self number changes
authorAsamK <asamk@gmx.de>
Fri, 11 Feb 2022 16:59:02 +0000 (17:59 +0100)
committerAsamK <asamk@gmx.de>
Fri, 11 Feb 2022 20:03:54 +0000 (21:03 +0100)
lib/src/main/java/org/asamk/signal/manager/Manager.java
lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java
src/main/java/org/asamk/signal/commands/DaemonCommand.java
src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java
src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java

index 9db509adf9460638dec1713b7fdb7c70bbb3ac0d..99b76781c4d6f74b527e006146307f148eaff80a 100644 (file)
@@ -261,6 +261,8 @@ public interface Manager extends Closeable {
      */
     boolean trustIdentityAllKeys(RecipientIdentifier.Single recipient) throws UnregisteredRecipientException;
 
+    void addAddressChangedListener(Runnable listener);
+
     void addClosedListener(Runnable listener);
 
     @Override
index 992dfb8bba0d2d1aa7d83f950a56f61b5334e196..fa50071209c141b5bc96aeee6eccad64bfa92ecf 100644 (file)
@@ -109,6 +109,7 @@ class ManagerImpl implements Manager {
     private final Set<ReceiveMessageHandler> weakHandlers = new HashSet<>();
     private final Set<ReceiveMessageHandler> messageHandlers = new HashSet<>();
     private final List<Runnable> closedListeners = new ArrayList<>();
+    private final List<Runnable> addressChangedListeners = new ArrayList<>();
     private final CompositeDisposable disposable = new CompositeDisposable();
 
     ManagerImpl(
@@ -139,12 +140,12 @@ class ManagerImpl implements Manager {
         final var attachmentStore = new AttachmentStore(pathConfig.attachmentsPath());
         final var stickerPackStore = new StickerPackStore(pathConfig.stickerPacksPath());
 
-        this.context = new Context(account,
-                accountFileUpdater,
-                dependencies,
-                avatarStore,
-                attachmentStore,
-                stickerPackStore);
+        this.context = new Context(account, (number, aci) -> {
+            accountFileUpdater.updateAccountIdentifiers(number, aci);
+            synchronized (addressChangedListeners) {
+                addressChangedListeners.forEach(Runnable::run);
+            }
+        }, dependencies, avatarStore, attachmentStore, stickerPackStore);
         this.context.getAccountHelper().setUnregisteredListener(this::close);
         this.context.getReceiveHelper().setAuthenticationFailureListener(this::close);
         this.context.getReceiveHelper().setCaughtUpWithOldMessagesListener(() -> {
@@ -998,6 +999,13 @@ class ManagerImpl implements Manager {
         return updated;
     }
 
+    @Override
+    public void addAddressChangedListener(final Runnable listener) {
+        synchronized (addressChangedListeners) {
+            addressChangedListeners.add(listener);
+        }
+    }
+
     @Override
     public void addClosedListener(final Runnable listener) {
         synchronized (closedListeners) {
index 043b19c2095714f7fcca282ba31e47017a2596ad..79e0cd82965ab20f240afe14adf5385b5aae11a7 100644 (file)
@@ -314,7 +314,6 @@ public class DaemonCommand implements MultiLocalCommand, LocalCommand {
                     }
                 } catch (DBusException ignored) {
                 }
-                connection.unExportObject(path);
             });
 
             final var initThreads = c.getManagers()
@@ -370,7 +369,6 @@ public class DaemonCommand implements MultiLocalCommand, LocalCommand {
             final DBusConnection conn, final String objectPath, final Manager m, final boolean noReceiveOnStart
     ) throws DBusException {
         final var signal = new DbusSignalImpl(m, conn, objectPath, noReceiveOnStart);
-        conn.exportObject(signal);
         final var initThread = new Thread(signal::initObjects);
         initThread.setName("dbus-init");
         initThread.start();
index bee87d7484b94ad3443bcc8e84ff699b238b99ef..51323395fa3576bee1c4b16a1b85dec73fa8f293 100644 (file)
@@ -621,6 +621,10 @@ public class DbusManagerImpl implements Manager {
         throw new UnsupportedOperationException();
     }
 
+    @Override
+    public void addAddressChangedListener(final Runnable listener) {
+    }
+
     @Override
     public void addClosedListener(final Runnable listener) {
         synchronized (closedListeners) {
index 671966a079aee0cd0dc3759e6048c69cd3912d5f..f387797400d80e53fb22532c6fa8878c6cebc061 100644 (file)
@@ -3,7 +3,6 @@ package org.asamk.signal.dbus;
 import org.asamk.Signal;
 import org.asamk.signal.BaseConfig;
 import org.asamk.signal.manager.Manager;
-import org.asamk.signal.manager.api.StickerPackInvalidException;
 import org.asamk.signal.manager.api.AttachmentInvalidException;
 import org.asamk.signal.manager.api.Identity;
 import org.asamk.signal.manager.api.InactiveGroupLinkException;
@@ -16,6 +15,7 @@ import org.asamk.signal.manager.api.Pair;
 import org.asamk.signal.manager.api.RecipientIdentifier;
 import org.asamk.signal.manager.api.SendMessageResult;
 import org.asamk.signal.manager.api.SendMessageResults;
+import org.asamk.signal.manager.api.StickerPackInvalidException;
 import org.asamk.signal.manager.api.TypingAction;
 import org.asamk.signal.manager.api.UnregisteredRecipientException;
 import org.asamk.signal.manager.api.UpdateGroup;
@@ -79,12 +79,22 @@ public class DbusSignalImpl implements Signal {
         this.connection = connection;
         this.objectPath = objectPath;
         this.noReceiveOnStart = noReceiveOnStart;
+
+        m.addAddressChangedListener(() -> {
+            unExportObjects();
+            exportObjects();
+        });
     }
 
     public void initObjects() {
+        exportObjects();
         if (!noReceiveOnStart) {
             subscribeReceive();
         }
+    }
+
+    private void exportObjects() {
+        exportObject(this);
 
         updateDevices();
         updateGroups();
@@ -96,9 +106,14 @@ public class DbusSignalImpl implements Signal {
             m.removeReceiveHandler(dbusMessageHandler);
             dbusMessageHandler = null;
         }
+        unExportObjects();
+    }
+
+    private void unExportObjects() {
         unExportDevices();
         unExportGroups();
         unExportConfiguration();
+        connection.unExportObject(this.objectPath);
     }
 
     @Override