Clean HTML from RSS feeds with Jsoup and Show Link Warning
This adds HTML cleaning with the Jsoup library based on a whitelist. The resulting HTML is then used to create a `Spannable` in Android. This spannable is traversed and URLs are replaced by a custom dialog fragment that shows the following warning.

Closes#569
See merge request !311
Resolve Outstanding Blog Issues
This MR has several commits which fix individual small issues. The biggest commit is a refactoring of the `BlogActivity`, so its `ViewPager` can be used also for the Blog feed.
Closes#637
See merge request !309
Show Blog Posts always in the same design
This also adds comments to the blog post detail screen that were previously missing.
It re-uses the existing `BlogPostViewHolder` and its `bind()` methods effectively reducing the amount of code necessary.
Closes#636
See merge request !307
Add one introduction test for modified response message
This is only the first part of #627, but I am putting it up for review already, since the second part will be very similar and issues found here will likely apply to both.
See merge request !306
UI for reblogging and blog comments
This MR wraps all blog posts inside a `CardView` and adds a reblog button to blog posts. When this button is pressed, a new activity opens that shows the blog post again and allows the user to reblog it into their own blog. An optional comment can be added.
Also a new compound view `AuthorView` is introduced to display authors and their trust level in a consistent way.
The `BlogController` has been refactored, so the `FeedController` can share most code through an abstract base class.

Closes#496, #437
See merge request !300
Scroll down Adding Contact screen
Normally, you would introduce a new layout only for small screens, but in this case it is easier and has less maintenance overhead to just scroll down the screen, so the button is always visible after loading.
While I was at it, I also replaced `getLocalAuthors()` by the new `getLocalAuthor()`.
Closes#616
See merge request !294
Factor out Tor Socks Port
This MR factors out the local Tor port, so other clients can listen to an `TransportEnabledEvent` for Tor and start tasks as soon as Tor becomes available. This would also enable client to pass traffic through Tor's local SOCKS proxy.
See merge request !301
Attach optional messages to invitations in Conversation view

Closes#359
See merge request !299
Add support for comments and reblogging to Blog Client
Comments and reblogs need to depend on the post they refer to.
Since message dependencies are limited to one group,
the post and also the comments need to be wrapped
when commented on or reblogged to another blog (and group).
For this reason, in addition to comments, two new wrapping message types
are introduced. They retain all data of the original messages and allow
for reconstruction and signature verification.
This MR breaks backwards compatibility with old blog posts.
It removes the content type, title and parent ID from the post.
Furthermore, it includes one commit that replaces the `Message` in `MessageSharedEvent` with a `MessageId`.
Closes#494
See merge request !285
Sign Introduction Information to be able to discover MITM attack
The local introducee doesn't know whether each piece of information received from the introducer originates from the remote introducee or has been replaced by the introducer, i.e. whether the introducer is carrying out a man-in-the-middle attack.
The introduction protocol doesn't aim to detect or prevent man-in-the-middle attacks. We only aim to establish that if the remote identity public key is not replaced then the remote ephemeral public key, transport properties and timestamp are not replaced either. This MR adds a MAC and a signature to the introduction protocol's ACK message to fulfill that aim. See #364 for the detailed security argument.
Later, when the local introducee verifies that the remote identity public key belongs to a particular person (#513), she can also be sure that the remote ephemeral public key, transport properties and timestamp originated from that person.
Closes#364
See merge request !297
Remove sensitive information from crash and feedback reports
This depends on MR !290 and removes also the crash report settings.
Closes#311
See merge request !291
Scrub addresses before logging them
MAC, IP and onion addresses are now scrubbed before logging to ensure we don't leave any sensitive information in plaintext on the device or send it in crash reports or feedback.
* Bluetooth MAC addresses keep the first and last octets
* IPv4 addresses keep the first and last octets
* IPv6 addresses should be scrubbed completely (couldn't test)
* Onion addresses keep the first three characters
If an address is invalid it will not be scrubbed to enable debugging, because it is most likely not sensitive.
Closes#592
See merge request !290
Add feed title to imported entries
Also fixes one bug where a new feed was not saved and improved HTML stripping a bit.
Closes#483
See merge request !287
Server-side code for accepting crash reports and feedback
* Moved some shared code for copying InputStreams to OutputStreams into a utility class
* Modified the dev report sender to send one report per connection
* Easier to handle on the server side
* If the connection fails after sending any reports, they don't need to be resent
* Tor will reuse the circuit, so it's cheap
* Added server-side code for accepting dev reports
* We need to protect the server's resources from DoS attacks
* Reports can't be larger than 1 MB
* Connections are limited to an average rate of one per minute
* The rate limiter uses a token bucket to allow bursts of up to 1,000 connections
* If the rate limit is exceeded, connection attempts will fail - clients will retry next time they sign in
* The limits can be raised when we move to a bigger server (and when we have some users)
See merge request !288
Fix two crashes when scanning QR codes
One crash was two due the `Context` being `null` and the other due to the camera being opened within an `AsyncTask`.
Closes#583
See merge request !282
Let clients decide whether to share messages or not
Before this MR, the `ValidationManager` was sharing all messages after they had been delivered. Now, it is within the client's responsibility whether to share messages or not. So far, only the Blog and the Forum client are sharing incoming messages.
Closes#595
See merge request !283
Allow unsubscribing from shared blogs
Only personal blogs from non-contacts can be removed.
This also adds integration tests that check the conditions under which blogs can actually be removed.
Closes#579
See merge request !268
Show Explanatory Graphic Before Scanning QR Codes


Closes#429
See merge request !270
Fix crashes when no Bluetooth or no Camera is available
Briar crashed when run in a device without bluetooth or without camera
such as an emulator.
Closes#514
See merge request !269
Prevent empty state messages from showing briefly
When we clear a list in `onPause()`, the proper behavior is that the empty state
message is shown, because the list is indeed empty.
However, we will reload the list content again in `onResume()`,
so the fix chosen in this MR is to force showing the progress bar
right after clearing the list.
Closes#576
See merge request !267
Simple UI for Managing and Importing RSS Feeds
Please note that this does not yet include the reblogging style for displaying imported RSS entries.



Closes#517
See merge request !251
Keep track of which RSS entries have been seen
This is done by remembering the time of the latest entry.
All entries newer than that are considered new and will be posted.
Closes#485
See merge request !249
Implement background task for fetching RSS feeds
* Implemented in briar-core as a `ScheduledExecutorService`
that gets started when the app starts
* The briar-api has a `FeedManager` interface
that the UI can use to register and unregister feeds
* In this first iteration, feeds are fetched via HTTP(S), not Tor
Closes#484
See merge request !247
UX improvements for crash reports and feedback
(The background color of the first screenshot is white, but I now changed it to use the same background color like everywhere)

Closes#335
See merge request !246
Pause Periodic List Refresh when View is not Visible
This MR also sneaks in a second commit which stops the cevron in the forum list to sometimes lose its blue color. I noticed this when testing this MR with short refresh intervals. This is not as nice of specifying the color as a tint, but unfortunately tints are not yet ready for primetime on Android.
Closes#553
See merge request !259
Show notifications for new blog posts
This also adds a setting allowing people to turn blog post notifications off.
As instructed, this does not yet improve upon the current notification mechanism, but rather follows it, leaving the improvements for #289.
Closes#488
See merge request !258
Show Personal Blog When Clicking On Post in Combined Blog Feed
This is your own personal blog when clicking on your own posts. Note how you can also write posts from that screen and no trust indicator is shown for the posts:

This is somebody else's blog on a dedicated screen after clicking on a blog post:

Closes#415
See merge request !256
Use Client Layer Events in ContactListFragment
This prevents trying to access the same group metadata in different groups.
Also, the conversation does not need to be reloaded once introduction messages arrive.
Closes#535
See merge request !254
Remove PersistentData classes as they aren't thread-safe
This MR depends on !244 and does not claim to resolve *all* issues with the ForumActivity.
Closes#544
See merge request !253
Introduce client layer events for forums
The forum UI depended on sync layer events such as `MessageStateChangedEvent`.
Now, the forum client broadcasts its own high-level event (`ForumPostReceivedEvent`)
with the information the UI needs (`ForumPostHeader`).
Closes#310
See merge request !244
Simple metadata queries
Adds support for retrieving metadata that matches all key/value pairs in a query object. This is a minimal version of #222 that can be extended if we need other query capabilities.
See merge request !187
Rotate crash fix
The problem was that two controllers were trying to unbind the Briar service where of course only one was needed.
I did the following
* Restructured the relevant Controllers
* Made a more permanent solution so that the last fragment will always be reloaded on config changes and Activity restarts.
Closes#386
See merge request !183
Add forum avatars to list of available forums

Closes#374
See merge request !182
Forum Avatars
These new forum avatars are using the first letter of the forum and calculate the background color from forum's group ID.
Closes#337

See merge request !178
Start plugins asynchronously
This prevents other services from getting stuck behind the plugin manager while the Tor plugin is starting, which takes several seconds. The plugin manager waits for each plugin to start before stopping it.
I've also added some canaries to plugins and services to ensure instances aren't started more than once.
See merge request !181
Poller refactoring, replace Timer with ScheduledExecutorService
* Replace Timer with ScheduledExecutorService (closes#258)
* Move automatic connection logic from PluginManager to Poller
* Reschedule polling when connections are opened or closed, making the poller more responsive to reductions in the polling interval
See merge request !180
274 code encapsulation
The goal of this branch is to better compartmentalize, structure and simplify the code in the Android module. It does this via the following techniques:
* Extended use of Dagger by introducing a component for Activities that injects, among other things, SharedPreferences and Fragments. The latter makes it possible to mock fragments more easily and letting Dagger automatically handle its injections.
* Decouple Briar API code, from the activities and Fragments, and encapsulate in re-usable Controller classes
* Introduce a UI-thread App event bus that the Helper classes use to communicate with Activities & Fragments.
* Define the testing methods in the briar-android module per Robolectric and Mockito
NOTE! Don't be alarmed if you see the contact introduction message one more time, one of the changes was to purify UI shared preferences from the Briar shared preferences, which now only contain preferences related to the API and it's usage.
closes#274
See merge request !130
Forum Sharing Client UI
This changes `ShareForumActivity` to use two fragments to facilitate
forum sharing with the new Forum Sharing Client backend.
The `ContactSelectorFragment` allows the user to select a
number of contacts. If there is an ongoing sharing session or the forum
is already shared with the contact, it is disabled in the list. If there
is at least one contact selected, a button appears in the toolbar that
brings the user to the `ShareForumMessageFragment` where the user can
write an optional message to be send along with the invitation.
After sending an invitation, the user is brought back to the forum that
she shared and there is a snackbar showing up briefly to indicate the
successful invitation.
The invitation is shown along with the message within the private
conversation of each contact. The person who shares the forum also sees
the invitation and the message as outgoing messages that also display
the current status of the messages.
A notification is shown like for other private messages as well.
Please note that this commit does not include a way for users to respond
to invitations. This is in MR !172. Both MRs are based on the new backend in !170.


See merge request !171
Modernize AvailableForumsActivity
Turn list of available forums into a `BriarRecyclerView` with XML layout.
Allow to respond to forum invitations from the list of available forums.
The user can either accept or decline an invitation.

See merge request !172
New List of Forums
The adapter of the `ForumListFragment` has been changed into a
`BriarRecyclerView` and all its code has been adapted and simplified
accordingly.
All UI of the forum list is now defined in XML layouts. This enabled me to move the snackbar into onCreate().
Before:

After:

See merge request !175
Try harder to connect to contacts
* When an outgoing connection is lost, try to reconnect to the contact straight away
* Use periodic polling for Tor, regardless of whether our hidden service descriptor has been published
* Reduce polling intervals for all plugins (this can be reverted if we solve the connectivity issues)
Closes#262, #314. Hopefully helps with #361.
See merge request !177
Forum Sharing Integration Tests
This adds integration tests for these cases:
* normal invitation session where invitee accepts
* normal invitation session where invitee declines
* session where invitee leaves again after she joined
* session where sharer leaves after invitee has joined
* session where sharer leaves before invitee can respond
* sharer reuses the session ID of the previous session
* after accepting the invitation, the invitee invites the sharer to the same forum
* after session contacts delete each other and session states get cleaned up
Closes#339
See merge request !173
Forum Sharing Client Backend
This MR replaces the old `ForumSharingManagerImpl` with a new one
which is based on state machines and the `ProtocolEngine`.
There is a `SharerEngine` and a `InviteeEngine` that take care of state
transitions, messages, events and trigger actions to be carried out by
the `ForumSharingManagerImpl`. This is all very similar to the
Introduction Client.
The general sharing paradigm has been changed from sharing as a state to
sharing as an action. Now the UI can allow users to invite contacts to
forums. The contacts can accept or decline the invitation. Also, the
Forum Sharing Manager is notified when users leave a forum.
Please note that you will need the UI to actually test this. It is coming up soon in another MR.
Closes#322
See merge request !170
Do not allow session ID reuse and clean up sessions for introducee
It was possible that a malicious introducer sends new request with the
same session ID that was used previously and thus causing introducees to
have multiple states for the same session ID.
This commits prevents that from happening and adds an integration test
for that scenario.
Also if an introducee removes an introducer, all past session states
will be deleted from the database. For this, a test was added as well.
Closes#371Closes#372
See merge request !179
Set ongoing notification to minimum priority
Setting the priority of the ongoing notification to PRIORITY_MIN prevents it from being shown in the status bar on Android 4.1 and later. The service still runs in the foreground.
Thanks to @str4d for finding the solution. Closes#154.
See merge request !169
Prepare for new Forum Sharing Client
Methods for creating, adding and removing forums have been moved to the
`ForumManager`. In order to still handle removing forums properly, a
`RemoveForumHook` has been introduced.
Methods for sharing forums with all current and future contacts have
been removed along with the localGroup where this information was saved.
The `ShareForumActivity` now has the proper label.
The `SessionId` and the `ProtocolEngine` have been moved to the
`clients` package.
This addresses part of #322 and part of what has been discussed in #320.
See merge request !156
Hold a wake lock while Tor is connected to the internet
This is a partial fix for #314. As noted on that ticket, if a Tor connection is lost for any reason other than the device sleeping, the plugin won't try to replace the lost connection. I'm leaving the ticket open until that more general issue is solved.
The Tor plugin uses several variables to keep track of its connectivity status. This patch refactors those variables into an inner class to improve readability and ensure they're accessed atomically. However, it's still possible for the plugin's state to become inconsistent with the state of the Tor process. For example, calls to updateConnectionStatus() may run concurrently on the IO executor, so their calls to enableNetwork() may be interleaved. As usual, locking would solve this problem but create the potential for deadlock, so I won't try to solve it in this patch.
See merge request !168
Use Android executor for background API calls
Some Android API calls need to be made from a thread with a message queue, but to keep the UI responsive they shouldn't be made from the UI thread.
This patch gives AndroidExecutor a captive thread with a message queue to execute tasks, and converts various background tasks from creating their own threads to using AndroidExecutor and IoExecutor.
This allows us to upgrade the support library to 23.2.1. Fixes#332.
See merge request !161
Add Snackbar and Toolbar Button to Forum List
This MR is a small change that replaces the custom UI elements in
the forum list with a Snackbar and a Toolbar menu.
It also fixes a background color that was still present with fragment from the NavDrawer.
Before:

After:

It addresses one part (2b) of #305 and is part of #121.
See merge request !163
Converts the splash screen to XML format
Removes all programatic calls that modify the layout and uses the XML
resource instead.
See merge request !123
Refactor `ContactListAdapter` to be used for Introductions and Forum Sharing
This MR introduces an abstract `BaseContactListAdapter` which provides
most of the adapter logic. The original `ContactListAdapter` extends it to
show date and online status of the contacts.
The new `ContactChooserAdapter` which is used for introductions extends
the `ContactListAdapter` and adds logic for graying out contacts from
different identities than the currently used one.
A new `ContactSelectorAdapter` extends the `BaseContactListAdapter` and
allows to select multiple contacts. It offers a method to return a
collection of all selected `ContactId`s.
Closes#292
See merge request !151
Don't connect to inactive contacts
Two changes:
1. Don't use remote transport properties for contacts that are in the process of being introduced - this avoids wasted connection attempts, as we can't create stream contexts for such contacts.
2. Don't activate contacts when receiving incoming streams - doing so was meant as a workaround for newly introduced contacts having inconsistent views of their introduction status if the introducer was offline. But it just shifted the inconsistency elsewhee, so this change removes the workaround.
See merge request !153
Use consistent styling for dialogs. #296
Converted all dialogs to use the support library and the Briar theme, so they have a consistent Material Design appearance across all Android versions.
See merge request !152
Move create forum post and share forum buttons in action bar
According to the designs in #305, the 'create forum post' and 'share forum' buttons will go into the in action bar.
In the spirit of keeping MRs small and to avoid conflicts with #306, I did this first and independently of future work.
This also introduces constants for the `GROUP_ID`, `FORUM_NAME` and `MIN_TIMESTAMP` as they were used for the two buttons.
Closes#313
See merge request !150
Remove avatar code and layout from ConversationActivity and ConversationAdapter
Please note that I have not been able to test this MR on an actual device as I have none at the moment :(
Closes#293
See merge request !148
Show relevant introduction decline responses in the conversation
* If the user has already declined, we don't show that the other
introducee has declined as well. The backend doesn't have that information, so
this is compatible with the principle of showing what we know.
* If the user has already accepted or hasn't yet responded, we now show the
decline response in the private conversation with the introducer. If
the user hasn't yet responded, we hide the accept/decline buttons
in the introduction request message.
Please note that I do not have three devices at the moment to test this MR in its entirety in practice. I created another test which is hopefully sufficient to ensure that the modifications are correct.
Closes#295
See merge request !149
Remove Tor binaries from repo. #203
This patch removes the Tor binaries from the repo - the binaries will be downloaded at build time and verified using SHA-256 hashes included in the repo.
After this branch has been merged I plan to reduce the size of the repo by rewriting the commit history to delete the Tor binaries (and various other cruft that used to live in the repo, such as fonts).
After the history has been rewritten, everyone will need to delete their local repo and clone a fresh copy. I'll send out some warnings beforehand.
See merge request !147
Introduction Integration Tests
This introduces these integration tests for the introduction client:
* normal session where both introducees accept
* normal session where the first introducee declines
* normal session where the second introducee declines
* one session where a contact is introduced to herself
* one session where two identities of the same contact are introduced to each other
I managed to get rid of the non-determinism missing validator problem by properly injecting the eager singletons.
Attention: This is based on !143 which addresses a corner case that is already tested here.
See merge request !139
Addresses two Introduction Corner Cases
* force decline when two of our own identities are introduced to each
other
* throw away introduction requests to the same identity
(impossible to trigger from UI)
Closes#284Closes#294
See merge request !143
Don't use inverse style for progress bars. #286
Fixes the appearance of progress bars on Gingerbread, no difference on other platforms. Thanks to @str4d for finding the source of the problem.
See merge request !145
Unit Tests for the Introduction Client
Please note that I based this MR is on top of the introduction UI in !122, because I needed to do some more refactoring on top of the other refactoring ;) The refactoring and the tests are in two separate commits.
An integration test will be added as a separate MR.
This addresses part of #276.
See merge request !136
Introduction UI
This is the user interface for the new introduction feature as specified by @Megalox in #253.
This will close#253
See merge request !122
Connect to new contacts
The motivation for this change was realising that when we add a new contact, if the Tor plugin has finished publishing its descriptor and stopped polling, we'll never try to connect to that contact via Tor. I decided that instead of making a special case for Tor, we should try to connect to new contacts via all transports.
Changes:
* Don't register outgoing connections until we've read the incoming tag - this prevents the connection indicator from blinking when connecting to a contact who's removed us
* Connect to newly activated contacts using all available transports, without waiting for the poller
* Removed device IDs from transport properties, we don't know how we're going to handle multi-device support yet
See merge request !135