Implement configuration properties for dbus

Closes #759

commit 169bb518bf
Author: John Freed <okgithub@johnfreed.com>
Date:   Fri Oct 15 08:53:34 2021 +0200

    remove org.asamk.signal.manager.api.Configuration

commit 27ecfee382
Author: John Freed <okgithub@johnfreed.com>
Date:   Fri Oct 15 08:40:13 2021 +0200

    add a DBus "daemon running" indicator

commit 94b3d9e2ed
Author: John Freed <okgithub@johnfreed.com>
Date:   Fri Oct 15 08:20:03 2021 +0200

    changing most DBus logger.info to logger.debug

commit 15da060127
Author: John Freed <okgithub@johnfreed.com>
Date:   Fri Oct 15 00:09:26 2021 +0200

    Configuration for Dbus and main

    Main program subcommand
    - fix logic to take into account previously unset flags
    - provide output in json and plain-text formats

    new Dbus Properties:
    - ConfigurationReadReceipts
    - ConfigurationUnidentifiedDeliveryIndicators
    - ConfigurationTypingIndicators
    - ConfigurationLinkPreviews

    removed getConfiguration and setConfiguration methods

    updated documentation

commit 09da3aae62
Merge: 3c40b11 18ad9fb
Author: John Freed <okgithub@johnfreed.com>
Date:   Thu Oct 14 15:24:07 2021 +0200

    Merge branch master into dbus_updateConfiguration

commit 3c40b11b8a
Merge: 8416d4a cadcc6c
Author: John Freed <okgithub@johnfreed.com>
Date:   Sat Oct 9 14:08:08 2021 +0200

    Merge branch master into dbus_updateConfiguration

commit 8416d4ac47
Author: John Freed <okgithub@johnfreed.com>
Date:   Mon Oct 4 08:48:56 2021 +0200

    Dbus get/setConfiguration methods

    implement:

    - getConfiguration() -> [readReceipts<b>, unidentifiedDeliveryIndicators<b>, typingIndicators<b>, linkPreviews<b>] -> <>::

    - setConfiguration(readReceipts<b>, unidentifiedDeliveryIndicators<b>, typingIndicators<b>, linkPreviews<b>) -> <>::

    Update documentation
This commit is contained in:
John Freed 2021-11-07 10:59:14 +01:00 committed by AsamK
parent e22cc457ae
commit 8a216e3245
4 changed files with 129 additions and 1 deletions

View file

@ -458,6 +458,12 @@ public interface Signal extends DBusInterface {
void removeDevice() throws Error.Failure;
}
@DBusProperty(name = "ReadReceipts", type = Boolean.class)
@DBusProperty(name = "UnidentifiedDeliveryIndicators", type = Boolean.class)
@DBusProperty(name = "TypingIndicators", type = Boolean.class)
@DBusProperty(name = "LinkPreviews", type = Boolean.class)
interface Configuration extends DBusInterface, Properties {}
class StructGroup extends Struct {
@Position(0)

View file

@ -69,6 +69,7 @@ public class DaemonCommand implements MultiLocalCommand {
var t = run(conn, objectPath, m, outputWriter);
conn.requestBusName(DbusConfig.getBusname());
logger.info("DBus daemon running in single-user mode for " + m.getSelfNumber());
try {
t.join();
@ -114,6 +115,7 @@ public class DaemonCommand implements MultiLocalCommand {
}
conn.requestBusName(DbusConfig.getBusname());
logger.info("DBus daemon running in mulit-account mode");
signalControl.run();
} catch (DBusException | IOException e) {
@ -130,7 +132,7 @@ public class DaemonCommand implements MultiLocalCommand {
final var initThread = new Thread(signal::initObjects);
initThread.start();
logger.info("Exported dbus object: " + objectPath);
logger.debug("Exported dbus object: " + objectPath);
final var handler = outputWriter instanceof JsonWriter ? new JsonReceiveMessageHandler(m,
(JsonWriter) outputWriter) : new ReceiveMessageHandler(m, (PlainTextWriter) outputWriter);

View file

@ -33,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;
@ -62,6 +64,8 @@ public class DbusSignalImpl implements Signal {
private final List<StructDevice> devices = new ArrayList<>();
private final List<StructGroup> 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;
@ -71,11 +75,13 @@ public class DbusSignalImpl implements Signal {
public void initObjects() {
updateDevices();
updateGroups();
updateConfiguration();
}
public void close() {
unExportDevices();
unExportGroups();
unExportConfiguration();
}
@Override
@ -835,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();
}
@ -871,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();
}
@ -885,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;
@ -927,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;