briar issueshttps://code.briarproject.org/groups/briar/-/issues2020-11-21T16:39:44Zhttps://code.briarproject.org/briar/briar/-/issues/706Migrate crypto to libsodium2020-11-21T16:39:44ZakwizgranMigrate crypto to libsodiumUsing libsodium via JNI would give us constant-time implementations of Curve25519 and Ed25519 (see #236) and a fast implementation of Argon2 (see #170). Our crypto_secretbox implementation could be replaced, and we could use crypto_box i...Using libsodium via JNI would give us constant-time implementations of Curve25519 and Ed25519 (see #236) and a fast implementation of Argon2 (see #170). Our crypto_secretbox implementation could be replaced, and we could use crypto_box instead of ECIES for crash reports and feedback. BLAKE2s would remain in Java (libsodium only has BLAKE2b). If we replaced the Fortuna generator with libsodium's RNG, we could get rid of Bouncy Castle.
https://github.com/joshjdevl/libsodium-jnihttps://code.briarproject.org/briar/briar/-/issues/711Improve encapsulation between ThreadItemAdapter and ThreadItemViewHolder2020-11-21T16:38:55ZTorsten GroteImprove encapsulation between ThreadItemAdapter and ThreadItemViewHolderAs discussed in [!350](https://code.briarproject.org/akwizgran/briar/merge_requests/350#note_13731), the new `ThreadItemAdapter` should need to be accessed so heavily in the `ThreadItemViewHolder` when it is bound to a view.As discussed in [!350](https://code.briarproject.org/akwizgran/briar/merge_requests/350#note_13731), the new `ThreadItemAdapter` should need to be accessed so heavily in the `ThreadItemViewHolder` when it is bound to a view.https://code.briarproject.org/briar/briar/-/issues/716Warn when entered text is too long2020-11-21T16:38:26ZakwizgranWarn when entered text is too longWe do this for forum posts, we should also do it for:
* Private messages
* Introduction messages
* Invitation messages
* Blog posts
* Blog commentsWe do this for forum posts, we should also do it for:
* Private messages
* Introduction messages
* Invitation messages
* Blog posts
* Blog commentshttps://code.briarproject.org/briar/briar/-/issues/717Up navigation2020-11-21T16:38:01ZakwizgranUp navigationWe're currently treating the "up" action in the action bar as equivalent to the "back" action. Instead it should navigate to the current activity's parent.
https://developer.android.com/training/implementing-navigation/ancestral.htmlWe're currently treating the "up" action in the action bar as equivalent to the "back" action. Instead it should navigate to the current activity's parent.
https://developer.android.com/training/implementing-navigation/ancestral.htmlhttps://code.briarproject.org/briar/briar/-/issues/721UX design for showing client protocol errors in the UI2020-11-21T16:37:13ZakwizgranUX design for showing client protocol errors in the UIIf we receive an invalid sequence of messages in a client protocol, it may not be possible to continue with the protocol. If this makes certain actions unavailable to the user, the UI should inform the user about that in some way.
We sh...If we receive an invalid sequence of messages in a client protocol, it may not be possible to continue with the protocol. If this makes certain actions unavailable to the user, the UI should inform the user about that in some way.
We should go through the relevant actions and decide on appropriate UX for each case.https://code.briarproject.org/briar/briar/-/issues/725Result handlers may not return results if the screen is rotated2020-11-21T16:36:20ZakwizgranResult handlers may not return results if the screen is rotatedThis issue came to mind while reviewing !354 - `SetupActivity#onClick()` uses the onResultUi() method of a UiResultHandler to start the next activity. If the screen's rotated before the handler returns, the original activity will be dest...This issue came to mind while reviewing !354 - `SetupActivity#onClick()` uses the onResultUi() method of a UiResultHandler to start the next activity. If the screen's rotated before the handler returns, the original activity will be destroyed, so the handler will never call onResultUi(). The outcome, as far as I can see, will be a progress wheel that spins forever.
Similar problems may exist elsewhere. Most of the time we use ResultHandlers to update the state of the current activity or fragment, and we reload everything if the activity or fragment's recreated, so it doesn't matter if results are lost during rotation. But there may be some places like this one where we depend on the result being returned.https://code.briarproject.org/briar/briar/-/issues/729Blog posts should be created on the crypto executor2020-11-21T16:34:09ZakwizgranBlog posts should be created on the crypto executorWriteBlogPostActivity creates blog posts on the DB executor. They should be created on the crypto executor and stored on the DB executor using chaining.
(BlogManagerImpl similarly creates comments on the DB executor, but that would be m...WriteBlogPostActivity creates blog posts on the DB executor. They should be created on the crypto executor and stored on the DB executor using chaining.
(BlogManagerImpl similarly creates comments on the DB executor, but that would be much harder to disentangle.)https://code.briarproject.org/briar/briar/-/issues/730Remove redundant setup code from jMock tests2020-11-21T16:29:33ZakwizgranRemove redundant setup code from jMock testsIt's safe to reuse a Mockery and mocked objects across multiple tests - if unexpected or missing invocations cause a test to fail, the expectations are reset before running the next test. Setup code can therefore be moved from the indivi...It's safe to reuse a Mockery and mocked objects across multiple tests - if unexpected or missing invocations cause a test to fail, the expectations are reset before running the next test. Setup code can therefore be moved from the individual tests to the class in many cases.https://code.briarproject.org/briar/briar/-/issues/739StrictMode violation: DroidtoothPlugin does not release resource2020-11-21T16:28:28ZTorsten GroteStrictMode violation: DroidtoothPlugin does not release resourceThis shows up from time to time in the log of my test device during normal operation.
```
StrictMode: A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
...This shows up from time to time in the log of my test device during normal operation.
```
StrictMode: A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
java.lang.Throwable: Explicit termination method 'close' not called
at dalvik.system.CloseGuard.open(CloseGuard.java:184)
at android.os.ParcelFileDescriptor.<init>(ParcelFileDescriptor.java:180)
at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:916)
at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:906)
at android.bluetooth.IBluetooth$Stub$Proxy.connectSocket(IBluetooth.java:1684)
at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:311)
at org.briarproject.plugins.droidtooth.DroidtoothPlugin.connect(DroidtoothPlugin.java:331)
at org.briarproject.plugins.droidtooth.DroidtoothPlugin.access$1100(DroidtoothPlugin.java:62)
at org.briarproject.plugins.droidtooth.DroidtoothPlugin$3.run(DroidtoothPlugin.java:298)
```https://code.briarproject.org/briar/briar/-/issues/743Create a controller for ConversationActivity to encapsulate the UI code2020-11-21T16:27:52ZErnir ErlingssonCreate a controller for ConversationActivity to encapsulate the UI codehttps://code.briarproject.org/briar/briar/-/issues/744Use global constants for View's alpha values2020-11-21T16:27:13ZErnir ErlingssonUse global constants for View's alpha valuesIn several places in the app we're decreasing the opacity of views to represent things such as disabled states. Unfortunately, we're doing this through hard-coded float values at each location. We should rather use global constants and m...In several places in the app we're decreasing the opacity of views to represent things such as disabled states. Unfortunately, we're doing this through hard-coded float values at each location. We should rather use global constants and make sure that every occurrence uses them -- this will make it easier for us to modify it in the future to fit any design pattern.https://code.briarproject.org/briar/briar/-/issues/745Refactor redundant code in AndroidNotificationManagerImpl2020-11-21T16:26:13ZakwizgranRefactor redundant code in AndroidNotificationManagerImplAndroidNotificationManagerImpl contains blocks of nearly identical code for doing things like counting new messages per-group or per-contact, and blocking or unblocking notifications per-client. These could be refactored to reduce redund...AndroidNotificationManagerImpl contains blocks of nearly identical code for doing things like counting new messages per-group or per-contact, and blocking or unblocking notifications per-client. These could be refactored to reduce redundancy.
(ConnectionRegistryImpl also contains similar code for counting connections per-contact. Maybe this could be factored out into a separate `Counter<T>` class.)https://code.briarproject.org/briar/briar/-/issues/750ANR when copying and pasting long strings of emoji2020-11-21T16:24:41ZakwizgranANR when copying and pasting long strings of emojiCopying and pasting long strings of emoji from EmojiTextView to EmojiEditText is very slow and can produce an ANR dialog. The delay increases superlinearly with the number of emoji, and depends on the existing contents of the EmojiEditTe...Copying and pasting long strings of emoji from EmojiTextView to EmojiEditText is very slow and can produce an ANR dialog. The delay increases superlinearly with the number of emoji, and depends on the existing contents of the EmojiEditText.
With the Huawei Ascend Y330:
* 64 emoji: noticeable delay
* 128 emoji: 6 seconds if EmojiEditText is empty, 20 seconds if it already contains 128 emoji
* 256 emoji: 30 seconds if EmojiEditText is empty, 100 seconds if it already contains 256 emoji
With the Samsung Galaxy Ace 2:
* 128 emoji: noticeable delay
* 256 emoji: 6 seconds if EmojiEditText is empty, 18 seconds if it already contains 256 emoji
* 512 emoji: 37 seconds if EmojiEditText is empty, 135 seconds if it already contains 512 emoji
![device-2016-11-10-155441](/uploads/39033afde37e12b0840b97260d775389/device-2016-11-10-155441.png)
![device-2016-11-10-155523](/uploads/877491aa8bde25c54ef75d51632b8bec/device-2016-11-10-155523.png)
These problems don't occur when copying and pasting ordinary text from an EmojiTextView to an EmojiEditText. Thousands of characters can be copied and pasted without a noticeable delay.https://code.briarproject.org/briar/briar/-/issues/751Emoji flicker when BriarRecyclerView updates itself2020-11-21T16:23:47ZakwizgranEmoji flicker when BriarRecyclerView updates itselfWhen BriarRecyclerView updates itself once per minute, emoji visibly flicker.When BriarRecyclerView updates itself once per minute, emoji visibly flicker.https://code.briarproject.org/briar/briar/-/issues/773Tidy up message inheritance hierarchy2020-11-21T16:21:14ZakwizgranTidy up message inheritance hierarchyBlogPost extends ForumPost extends ThreadedMessage extends PrivateMessage... really?BlogPost extends ForumPost extends ThreadedMessage extends PrivateMessage... really?https://code.briarproject.org/briar/briar/-/issues/775The LanTcpPlugin tries to create a KeyAgreementListener even if Wifi/mobile d...2020-11-21T16:20:28ZJulian DehmThe LanTcpPlugin tries to create a KeyAgreementListener even if Wifi/mobile data is disabledWhen adding a contact with only bluetooth enabled the LanTcpPlugin tries to bind a serversocket, which seems like a useless effort to me.
`org.briarproject I/LanTcpPlugin: Could not bind server socket for key agreement`
Maybe there sh...When adding a contact with only bluetooth enabled the LanTcpPlugin tries to bind a serversocket, which seems like a useless effort to me.
`org.briarproject I/LanTcpPlugin: Could not bind server socket for key agreement`
Maybe there should be a check if Wifi is enabled before attempting to open a socket.https://code.briarproject.org/briar/briar/-/issues/776Merge redundant null safety annotations2020-11-21T16:19:21ZakwizgranMerge redundant null safety annotationsAfter some experience with the new null safety annotations, it seems we only want to express two conditions:
* Methods, parameters and fields are not null by default
* Methods and parameters are not null by default
Merge @MethodsNotNull...After some experience with the new null safety annotations, it seems we only want to express two conditions:
* Methods, parameters and fields are not null by default
* Methods and parameters are not null by default
Merge @MethodsNotNullByDefault with @ParametersNotNullByDefault, and remove @FieldsNotNullByDefault.https://code.briarproject.org/briar/briar/-/issues/779Use HTTPS for fetching RSS feeds where possible2020-11-21T16:18:44ZakwizgranUse HTTPS for fetching RSS feeds where possibleOn the first fetch:
* If the user enters an HTTP URL, try HTTPS first, then fall back to HTTP
* If the user enters a URL without a scheme, try HTTPS first, then fall back to HTTP
* If the user enters an HTTPS URL, don't fall back to HTTP...On the first fetch:
* If the user enters an HTTP URL, try HTTPS first, then fall back to HTTP
* If the user enters a URL without a scheme, try HTTPS first, then fall back to HTTP
* If the user enters an HTTPS URL, don't fall back to HTTP
* If HTTPS succeeds, save the HTTPS URL
On subsequent fetches, use the scheme from the URL with no fallbacks.https://code.briarproject.org/briar/briar/-/issues/792Tester could not find a private group they'd been invited to2020-11-21T12:57:05ZTorsten GroteTester could not find a private group they'd been invited toDuring a testing session (#788), a user was confused about where to find the private group they just had been invited to. They expected to find the group in the contact list screen. The group agreed that this is where they would expect t...During a testing session (#788), a user was confused about where to find the private group they just had been invited to. They expected to find the group in the contact list screen. The group agreed that this is where they would expect to find groups, because they know this from other messengers that have a list of conversation that include private conversations and group conversations in one screen.
The list of contacts could be made available elsewhere.https://code.briarproject.org/briar/briar/-/issues/801Revealing contact relationship is not clear2020-11-21T12:52:17ZTorsten GroteRevealing contact relationship is not clearDuring testing session #788, no one understood what revealing contact relationships means although most users were rather technical and were using other apps extensively. The onboarding dialog didn't help. It was not clear who can revea...During testing session #788, no one understood what revealing contact relationships means although most users were rather technical and were using other apps extensively. The onboarding dialog didn't help. It was not clear who can reveal contacts and why the creator can not do it. It was not clear what this exactly means and why it can be done.
It took some long explanations before everybody had understood this feature. They were all open to p2p apps and appreciated the explanation. They were happy to understand how messages travel through the p2p network, but they also acknowledged that we are trying to explain features without requiring users to understand that.
Some testers doubted that it is possible to understand revealing contacts without knowing about how messages travel. They pointed out how Briar works very differently than other apps they are familiar with and that it needs some getting used to. The user familiar with Retroshare suggested to use a visual representation of the contact relationship within a group as this can help with understanding this concept and also nicely illustrate the p2p approach.
![briar-user-graph](/uploads/a7819e19bc66f94fc0c3ff50d9265eb7/briar-user-graph.png)