X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/2ab42ca5471e8fc1e1a31cde954e19564178f114..8a216e324571db898a83f7e127018b22a0318ac5:/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java diff --git a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java index 58bd1a97..047b4f99 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java @@ -2,7 +2,6 @@ package org.asamk.signal.dbus; import org.asamk.Signal; import org.asamk.signal.BaseConfig; -import org.asamk.signal.commands.exceptions.IOErrorException; import org.asamk.signal.manager.AttachmentInvalidException; import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.NotMasterDeviceException; @@ -34,6 +33,8 @@ import org.freedesktop.dbus.connections.impl.DBusConnection; import org.freedesktop.dbus.exceptions.DBusException; import org.freedesktop.dbus.exceptions.DBusExecutionException; import org.freedesktop.dbus.types.Variant; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; @@ -63,6 +64,8 @@ public class DbusSignalImpl implements Signal { private final List devices = new ArrayList<>(); private final List groups = new ArrayList<>(); + private final static Logger logger = LoggerFactory.getLogger(DbusSignalImpl.class); + public DbusSignalImpl(final Manager m, DBusConnection connection, final String objectPath) { this.m = m; this.connection = connection; @@ -72,11 +75,13 @@ public class DbusSignalImpl implements Signal { public void initObjects() { updateDevices(); updateGroups(); + updateConfiguration(); } public void close() { unExportDevices(); unExportGroups(); + unExportConfiguration(); } @Override @@ -90,13 +95,13 @@ public class DbusSignalImpl implements Signal { } @Override - public void submitRateLimitChallenge(String challenge, String captchaString) throws IOErrorException { + public void submitRateLimitChallenge(String challenge, String captchaString) { final var captcha = captchaString == null ? null : captchaString.replace("signalcaptcha://", ""); try { m.submitRateLimitRecaptchaChallenge(challenge, captcha); } catch (IOException e) { - throw new IOErrorException("Submit challenge error: " + e.getMessage(), e); + throw new Error.Failure("Submit challenge error: " + e.getMessage()); } } @@ -836,6 +841,7 @@ public class DbusSignalImpl implements Signal { final var deviceObjectPath = object.getObjectPath(); try { connection.exportObject(object); + logger.debug("Exported dbus object: " + deviceObjectPath); } catch (DBusException e) { e.printStackTrace(); } @@ -872,6 +878,7 @@ public class DbusSignalImpl implements Signal { final var object = new DbusSignalGroupImpl(g.groupId()); try { connection.exportObject(object); + logger.debug("Exported dbus object: " + object.getObjectPath()); } catch (DBusException e) { e.printStackTrace(); } @@ -886,6 +893,26 @@ public class DbusSignalImpl implements Signal { this.groups.clear(); } + private static String getConfigurationObjectPath(String basePath) { + return basePath + "/Configuration"; + } + + private void updateConfiguration() { + try { + unExportConfiguration(); + final var object = new DbusSignalConfigurationImpl(); + connection.exportObject(object); + logger.debug("Exported dbus object: " + objectPath + "/Configuration"); + } catch (DBusException e) { + e.printStackTrace(); + } + } + + private void unExportConfiguration() { + final var objectPath = getConfigurationObjectPath(this.objectPath); + connection.unExportObject(objectPath); + } + public class DbusSignalDeviceImpl extends DbusProperties implements Signal.Device { private final org.asamk.signal.manager.api.Device device; @@ -928,6 +955,78 @@ public class DbusSignalImpl implements Signal { } } + public class DbusSignalConfigurationImpl extends DbusProperties implements Signal.Configuration { + + public DbusSignalConfigurationImpl( + ) { + super.addPropertiesHandler(new DbusInterfacePropertiesHandler("org.asamk.Signal.Configuration", + List.of(new DbusProperty<>("ReadReceipts", this::getReadReceipts, this::setReadReceipts), + new DbusProperty<>("UnidentifiedDeliveryIndicators", + this::getUnidentifiedDeliveryIndicators, + this::setUnidentifiedDeliveryIndicators), + new DbusProperty<>("TypingIndicators", + this::getTypingIndicators, + this::setTypingIndicators), + new DbusProperty<>("LinkPreviews", this::getLinkPreviews, this::setLinkPreviews)))); + + } + + @Override + public String getObjectPath() { + return getConfigurationObjectPath(objectPath); + } + + public void setReadReceipts(Boolean readReceipts) { + setConfiguration(readReceipts, null, null, null); + } + + public void setUnidentifiedDeliveryIndicators(Boolean unidentifiedDeliveryIndicators) { + setConfiguration(null, unidentifiedDeliveryIndicators, null, null); + } + + public void setTypingIndicators(Boolean typingIndicators) { + setConfiguration(null, null, typingIndicators, null); + } + + public void setLinkPreviews(Boolean linkPreviews) { + setConfiguration(null, null, null, linkPreviews); + } + + private void setConfiguration( + Boolean readReceipts, + Boolean unidentifiedDeliveryIndicators, + Boolean typingIndicators, + Boolean linkPreviews + ) { + try { + m.updateConfiguration(new org.asamk.signal.manager.api.Configuration(Optional.ofNullable(readReceipts), + Optional.ofNullable(unidentifiedDeliveryIndicators), + Optional.ofNullable(typingIndicators), + Optional.ofNullable(linkPreviews))); + } catch (IOException e) { + throw new Error.Failure("UpdateAccount error: " + e.getMessage()); + } catch (NotMasterDeviceException e) { + throw new Error.Failure("This command doesn't work on linked devices."); + } + } + + private boolean getReadReceipts() { + return m.getConfiguration().readReceipts().orElse(false); + } + + private boolean getUnidentifiedDeliveryIndicators() { + return m.getConfiguration().unidentifiedDeliveryIndicators().orElse(false); + } + + private boolean getTypingIndicators() { + return m.getConfiguration().typingIndicators().orElse(false); + } + + private boolean getLinkPreviews() { + return m.getConfiguration().linkPreviews().orElse(false); + } + } + public class DbusSignalGroupImpl extends DbusProperties implements Signal.Group { private final GroupId groupId;