Helper class to reduce client boilerplate
* Renamed BdfReader methods for consistency with BdfList/BdfDictionary
* Added readList() and readDictionary() methods to BdfReader
* Added ClientHelper to reduce boilerplate when converting messages and metadata to and from BDF
* Moved PrivateGroupFactory to the same package as ClientHelper
See merge request !114
Unit tests for ValidationManagerImpl
Unit test for the validation manager. I also changed the way the validation manager loads unvalidated messages - instead of using a single DB task to load all unvalidated messages, it loads a list of message IDs and then loads each message in a separate task. This prevents the DatabaseExecutor from being blocked by a long-running task if there are lots of messages to validate.
See merge request !113
Add contact and transport keys in the same transaction
This avoids a potential problem where the app crashes after adding the contact but before adding the transport keys, leaving the contact unusable.
See merge request !112
New polling logic for Tor. #250
Poll for outgoing connections each time the network is enabled, then disable polling once our hidden service descriptor has been published. If our contacts do the same, any contacts that are offline when we poll will connect to us when they come online.
This should reduce bandwidth and battery usage. The idea comes from Ricochet:
https://github.com/ricochet-im/ricochet/issues/68Fixes#250.
See merge request !103
If two contacts publish their descriptors simultaneously, they may both stop polling without retrieving each other's descriptors. Continue polling for 2 intervals after publishing the descriptor.
New polling logic for LAN. #252
Same approach as !104. Modified the poller to cancel any scheduled poll when pollNow() is called and randomise the next polling interval so plugins that call pollNow() at the same time don't end up polling in sync.
Depends on !104. Fixes#252.
See merge request !105
New polling logic for Bluetooth. #251
Increase the polling interval exponentially each time polling is unsuccessful, up to a maximum of 60 minutes. The interval is reset to 2 minutes whenever a connection is made and whenever Bluetooth is re-enabled.
This should reduce battery usage when there are no contacts nearby.
Fixes#251.
See merge request !104
The polling interval increases exponentially each time polling is unsuccessful, up to a maximum of 60 minutes. The interval is reset to 2 minutes whenever a connection is made and whenever Bluetooth is re-enabled.
Don't communicate with inactive contacts
When we're introduced to a new contact, we need to store the transport keys and start key rotation before activating the contact. During this period we shouldn't use the transport keys for outgoing streams until either the introduction protocol is complete or we receive an incoming stream from the contact, indicating that they've also started key rotation.
See merge request !106
Database efficiency improvements
Some tweaks to the DB schema to improve efficiency:
* Only keep status rows for messages that are visible - this saves space and avoids the need to join the groupVisibilities table when selecting messages to offer or send
* Use adjacent columns for the composite primary key on the settings table
This MR depends on !101.
See merge request !102
Don't keep message status rows for groups that are invisible to the contact - this avoids the need to join the groupVisibilities table when selecting messages to offer or send. Add or remove status rows when group visibility changes.
Transactions for clients
This patch moves transactions out of the database component, allowing clients to perform multiple database calls in a single transaction. This should improve efficiency and reliability, at the cost of increased boilerplate for database calls.
Operations that allow hooks, such as adding and removing contacts, pass their transactions to their hooks. This ensures the whole operation is atomic and isolated, so StorageStatus is no longer needed, hooks don't need to be idempotent, and locks can be removed from clients that were using them for isolation.
This merge request is marked WIP because it will conflict with !74.
See merge request !101
Increase contrast between identicons and background
Identicons currently have a dark or light background depending on the V component of the foreground colour. But V isn't a great measure of brightness - cyan looks much brighter than blue with the same V, for example. This leads to some identicons having low contrast between the foreground and background.
This patch scales the R, G and B components of the foreground colour to 3/4 of the full range and sets the background to white, so there's always good contrast between the foreground and background. The patch also adds a 1dp outline around identicons and adds some padding to the identity selection dropdown.
Before:

After:

See merge request !100