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
Use message validation hook in forum sharing client
This patch moves the forum sharing client's update handling from an event handler to a hook to ensure the update is handled even if it arrives just before shutdown.
See merge request !99
Move subscription updates to the client layer
This is part of #112.
I created a separate client for sharing lists of available forums, as that turned out to be cleaner than using the forum client to manage two kinds of group. The same will presumably be true for the blog and group messaging clients when we come to implement them.
The UX for sharing forums is due to change - instead of sharing a list of available forums with no explanation, we'll explicitly invite contacts to join forums. When that happens, the ForumSharingManager will change but the ForumManager should remain pretty much the same.
When hooks for message status changes have been implemented, the ForumSharingManager will use those instead of listening for MessageValidatedEvents.
When client layer transactions have been implemented, the ForumManager, ForumSharingManager and TransportPropertyManager will use them instead of locks to ensure atomicity and isolation.
See merge request !94
Set category and visibility of notifications. #241
Turns out we can't fully control the visibility of notifications on the lock screen - we can mark them as sensitive, and then a couple of global options determine whether they're visible.
See merge request !96
Fix a couple of bugs in settings
1. SettingsFragment wasn't receiving events because it extended BaseFragment rather than BaseEventFragment
2. Removed broken logic for deciding whether to broadcast a SettingsUpdatedEvent
3. Added the namespace to SettingsUpdatedEvent so listeners can decide whether to react
See merge request !97