briar issueshttps://code.briarproject.org/groups/briar/-/issues2023-08-28T16:00:11Zhttps://code.briarproject.org/briar/briar-mailbox/-/issues/164AS cannot resolve version variables in build.gradle2023-08-28T16:00:11ZSebastianAS cannot resolve version variables in build.gradleAfter moving the version variables to the external file at `gradle/variables.gradle` so that they can be reused on briar for the integration tests, it seems while Gradle has no problem using those variables at that location, AS has a pro...After moving the version variables to the external file at `gradle/variables.gradle` so that they can be reused on briar for the integration tests, it seems while Gradle has no problem using those variables at that location, AS has a problem understanding where those variables are defined. As a result Ctrl-clicking the variables does not navigate us to their source and also the version checks that AS usually performs and displays warnings about possible library upgrades does not work. Both are suboptimal I think. I have not found any report for this or upstream issue yet.https://code.briarproject.org/briar/briar-desktop/-/issues/407Add forums to deterministic test data2022-12-09T21:24:50ZMikolai GütschowAdd forums to deterministic test datain a long term for screenshots #359, now for interactive testing as alternative to random forums
we probably need to enhance our DSL to support forum/threaded messages in generalin a long term for screenshots #359, now for interactive testing as alternative to random forums
we probably need to enhance our DSL to support forum/threaded messages in generalMikolai GütschowMikolai Gütschowhttps://code.briarproject.org/briar/briar-desktop/-/issues/406Add test scenario with multiple accounts connected to same forum2022-11-08T07:51:33ZMikolai GütschowAdd test scenario with multiple accounts connected to same forumfor interactive testing of #405 for examplefor interactive testing of #405 for exampleMikolai GütschowMikolai Gütschowhttps://code.briarproject.org/briar/briar-desktop/-/issues/405Update unread counter and timestamp on new message in forum list2022-11-15T08:45:31ZMikolai GütschowUpdate unread counter and timestamp on new message in forum listprobably similar to how it's done for private chatsprobably similar to how it's done for private chatsMikolai GütschowMikolai Gütschowhttps://code.briarproject.org/briar/briar-desktop/-/issues/402Deterministic test data with sent and received message state2023-02-05T22:31:15ZSebastianDeterministic test data with sent and received message stateIn order for messages to appear as received and read, I currently do this:``
```diff
index fc66a39..ee38a90 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationItemView.kt
+++ b/briar-deskt...In order for messages to appear as received and read, I currently do this:``
```diff
index fc66a39..ee38a90 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationItemView.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationItemView.kt
@@ -38,7 +38,6 @@ import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Done
import androidx.compose.material.icons.filled.DoneAll
-import androidx.compose.material.icons.filled.Schedule
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@@ -234,7 +233,7 @@ fun ColumnScope.ConversationItemStatusView(item: ConversationItem, rowModifier:
val icon =
if (item.isSeen) Icons.Filled.DoneAll // acknowledged
else if (item.isSent) Icons.Filled.Done // sent
- else Icons.Filled.Schedule // waiting
+ else Icons.Filled.DoneAll // waiting
Icon(icon, i18n("access.message.sent"), modifier, statusColor)
}
}
```
I think in the long term, it would be nice if the test data creator could just set those flags to values that we like for such purposes via the DSL.https://code.briarproject.org/briar/briar/-/issues/2369Keys or app backup2022-09-30T16:50:22ZNext OneKeys or app backupIt's a possible situation when you have to delete Briar app for safety purposes. But now it means losing all contacts.It's a possible situation when you have to delete Briar app for safety purposes. But now it means losing all contacts.https://code.briarproject.org/briar/briar/-/issues/2368Can't connect with Orbot or vpn2022-09-30T17:23:17ZNext OneCan't connect with Orbot or vpnGreetings and thanks for great project.
May I suggest to add a possibility to switch off routing through TOR? I's cool for normal phone but I must use Orbot for all traffic. And Briar can't connect like that. Same with vpn.Greetings and thanks for great project.
May I suggest to add a possibility to switch off routing through TOR? I's cool for normal phone but I must use Orbot for all traffic. And Briar can't connect like that. Same with vpn.https://code.briarproject.org/briar/briar-desktop/-/issues/401Permalinks for nightly builds in README are 4042022-09-30T12:41:19ZMikolai GütschowPermalinks for nightly builds in README are 404although the nightly pipelines [do run](https://code.briarproject.org/briar/briar-desktop/-/pipelines/12265) and we use the [permalinks as documented](https://docs.gitlab.com/ee/ci/pipelines/job_artifacts.html#access-the-latest-job-artif...although the nightly pipelines [do run](https://code.briarproject.org/briar/briar-desktop/-/pipelines/12265) and we use the [permalinks as documented](https://docs.gitlab.com/ee/ci/pipelines/job_artifacts.html#access-the-latest-job-artifacts-by-url)https://code.briarproject.org/briar/briar-desktop/-/issues/400Create release builds for Ubuntu 22 / Mint 21 / elementary 7 etc.2022-09-30T11:51:31ZSebastianCreate release builds for Ubuntu 22 / Mint 21 / elementary 7 etc.https://code.briarproject.org/briar/briar-desktop/-/issues/398Find mechanism for checking translations for missing variables or too many va...2023-05-08T14:14:43ZSebastianFind mechanism for checking translations for missing variables or too many variablesIt is possible that some translations contain:
* too many variables, e.g. "Some test {0} some more text {1}" while {1} will never be supplied
* too few variables, e.g. "Some test {0}" while two arguments will be supplied
Both situation ...It is possible that some translations contain:
* too many variables, e.g. "Some test {0} some more text {1}" while {1} will never be supplied
* too few variables, e.g. "Some test {0}" while two arguments will be supplied
Both situation don't cause an error, just a wrongly formatted string at the moment.
I think it would be nice if we could run some static analysis on our strings to check for this.
Maybe there's something like this in the Transifex online tools, not sure.https://code.briarproject.org/briar/briar-mailbox/-/issues/162Unable to start mailbox: SavedStateHandle issue2023-01-19T13:05:28ZIvanaUnable to start mailbox: SavedStateHandle issueUpdated the mailbox in AS to the build 84d336a47ff545be05f374bf7a5fae855f2f3c3d
The installation seems to run OK, and I get a message in Android Studio that the launch has succeeded.
However, when I try to launch the mailbox on a devi...Updated the mailbox in AS to the build 84d336a47ff545be05f374bf7a5fae855f2f3c3d
The installation seems to run OK, and I get a message in Android Studio that the launch has succeeded.
However, when I try to launch the mailbox on a device, I get this
![Screenshot_20220929_115848](/uploads/879aaf9e3cd6c3a1ec02daf21447f09c/Screenshot_20220929_115848.png)
If I go the screen App info, and tap on Open, I get the same message.
Michael took a look and attached this stack trace to the conversation in MM
```ruby
2022-09-29 12:05:16.432 6627-6627/org.briarproject.mailbox E/AndroidRuntime: FATAL EXCEPTION: main
Process: org.briarproject.mailbox, PID: 6627
java.lang.IllegalArgumentException: CreationExtras must have a value by `SAVED_STATE_REGISTRY_OWNER_KEY`
at androidx.lifecycle.SavedStateHandleSupport.createSavedStateHandle(SavedStateHandleSupport.kt:91)
at androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.java:89)
at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.create(HiltViewModelFactory.java:111)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:187)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153)
at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:53)
at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:35)
at org.briarproject.mailbox.android.ui.MainActivity.getViewModel(MainActivity.kt:68)
at org.briarproject.mailbox.android.ui.MainActivity.access$getViewModel(MainActivity.kt:59)
at org.briarproject.mailbox.android.ui.MainActivity$onCreate$2.invokeSuspend(MainActivity.kt:87)
at org.briarproject.mailbox.android.ui.MainActivity$onCreate$2.invoke(Unknown Source:8)
at org.briarproject.mailbox.android.ui.MainActivity$onCreate$2.invoke(Unknown Source:2)
at org.briarproject.mailbox.android.ui.UtilsKt$launchAndRepeatWhileStarted$1$1.invokeSuspend(Utils.kt:37)
at org.briarproject.mailbox.android.ui.UtilsKt$launchAndRepeatWhileStarted$1$1.invoke(Unknown Source:8)
at org.briarproject.mailbox.android.ui.UtilsKt$launchAndRepeatWhileStarted$1$1.invoke(Unknown Source:4)
at androidx.lifecycle.RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1$1$1.invokeSuspend(RepeatOnLifecycle.kt:111)
at androidx.lifecycle.RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1$1$1.invoke(Unknown Source:8)
at androidx.lifecycle.RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1$1$1.invoke(Unknown Source:4)
at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:89)
at kotlinx.coroutines.CoroutineScopeKt.coroutineScope(CoroutineScope.kt:264)
at androidx.lifecycle.RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1$1.invokeSuspend(RepeatOnLifecycle.kt:110)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:367)
at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:30)
at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable$default(Cancellable.kt:25)
at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:110)
at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:126)
at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:56)
at kotlinx.coroutines.BuildersKt.launch(Unknown Source:1)
at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch$default(Builders.common.kt:47)
at kotlinx.coroutines.BuildersKt.launch$default(Unknown Source:1)
at androidx.lifecycle.RepeatOnLifecycleKt$repeatOnLifecycle$3$1$1$1.onStateChanged(RepeatOnLifecycle.kt:106)
at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:360)
at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:271)
at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:313)
at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:151)
at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:134)
```Torsten GroteTorsten Grotehttps://code.briarproject.org/briar/briar/-/issues/2367Navigating back from Connection screen to Mailbox setup screens in Briar - se...2023-01-19T13:05:58ZIvanaNavigating back from Connection screen to Mailbox setup screens in Briar - second mailbox setup screen overwrites the first oneSteps to reproduce:
- In Briar go to Briar > settings > Connections and switch the internet and wifi connections off
- Then for to Briar > settings > mailbox => the mailbox is offline screen shows, which is correct
- Tap the check Con...Steps to reproduce:
- In Briar go to Briar > settings > Connections and switch the internet and wifi connections off
- Then for to Briar > settings > mailbox => the mailbox is offline screen shows, which is correct
- Tap the check Connections link on that screen => Connections screen shows, where the user can switch the internet and wifi back on
- switch the internet and wifi back on
- tap on Back button (arrow in upper left corner) and the first mailbox setup screen will show
- then tap continue => the second mailbxo setup screen overwrites the first one, see attached files
![device-2022-09-28-133914](/uploads/edcbf78a75a2348b7c280833da3ed82a/device-2022-09-28-133914.mp4)IvanaIvanahttps://code.briarproject.org/briar/briar-desktop/-/issues/397Enforce Twitter Jetpack Compose Rules using ktlint2023-02-02T22:38:06ZMikolai GütschowEnforce Twitter Jetpack Compose Rules using ktlintfound by @grote: https://twitter.github.io/compose-rules/found by @grote: https://twitter.github.io/compose-rules/https://code.briarproject.org/briar/briar-desktop/-/issues/396Report for work after UX and accessibility audit2023-01-09T22:41:09ZSebastianReport for work after UX and accessibility auditI'm working on the report for OTF and am using our summary issues with the checklists as a base for what we put into that report. Whatever is striked through is already mentioned in the report.
## Copied from #366:
Targeting issues rai...I'm working on the report for OTF and am using our summary issues with the checklists as a base for what we put into that report. Whatever is striked through is already mentioned in the report.
## Copied from #366:
Targeting issues raised in #341 and as part of #84.
- ~~Heading structure: > not supported by upstream Compose (https://github.com/JetBrains/compose-jb/issues/2119)~~
- [ ] ~~"Welcome to Briar" on login and main screen (no chats)~~
- [ ] ~~contact name in chat screen~~
- [ ] ~~"Settings" on SettingsScreen~~
- ~~Image(Button) contentDescription:~~
- [ ] ~~Briar logo on login > only of decorative nature, automatically skipped over by VoiceOver~~
- [x] ~~back and info button on login > !223 and info button already "About Briar Desktop" on `main`~~
- [x] ~~menu button in chat screen > already "Show Contact Menu" on `main`~~
- [x] ~~add contact button without chats > fixed on `main`~~
- [x] ~~attachment button in chat screen > fixed on `main`~~
- ~~Missing context:~~
- [x] ~~show password buttons on login/change password > automatically grouped on macOS/VoiceOver~~
- [x] ~~labels for text fields (registration screen) > !225 .~~
- ~~Missing list grouping:~~
- [x] ~~contact list > !218 .~~
- [x] ~~settings as list > !224 .~~
- ~~Missing state information (expanded/collapsed): Dropdowns/Pop-Ups not supported by Compose https://github.com/JetBrains/compose-jb/issues/2185 .~~
- [ ] ~~menu button in chat screen~~
- [ ] ~~theme/language settings, also dynamic changes~~
- Misc:
- [ ] ~~error message on login (not read out loud) > upstream bug: https://github.com/JetBrains/compose-jb/issues/2277 .~~
- [x] ~~about dialog (no exit button, table not marked as such, email is not link) > !221 .~~
- [x] ~~message count/online status in contact list > !218. ~~
- [x] ~~"keyboard trap" in compose message text field (tab button is stuck in text field) > !222 .~~
- [ ] ~~Missing landmarks on MainScreen to convey structure to screen-reader user > not supported by Compose~~
- [x] Keyboard focus does not go to close button on add contact dialog > probably missing OS-functionality on Ubuntu/Orca which is anyhow not supported, confirmed to work on macOS with VoiceOver as expected
- [ ] ~~Dropdown not marked as such (settings) > Dropdowns/Pop-Ups not supported by Compose https://github.com/JetBrains/compose-jb/issues/2185 .~~
- [x] ~~Briar link name/label on Add Contact dialog > !230~~
- [x] ~~Add attachment button not keyboard-focusable on macOS > !222~~
## Copied from #343:
During the accessibility audit #341 several issues were identified concerning poor color contrast:
- [x] ~~registration screen: text field label (light blue on white/black background) > !213 .~~
- [x] ~~settings/change password screen: text field labels (light blue on white) > !213 .~~
- [x] ~~settings screen: "change password" button (light blue on white/black) > !213 .~~
- [x] ~~registration screen: "next" button (black text color on blue/gray (disabled) button) > already fixed on current `main`~~
- [ ] registration screen: visual focus indicator on "show/hide password" button (light gray on white)
- [x] ~~registration screen: password strength indicator (light green on white / dark red on black) > !211 .~~
- [x] ~~registration screen: form error color (red on black) > !202 .~~
- [x] ~~message compose screen: send button (light green on white) > !212 .~~
these two issues were post-poned to #364:
- registration screen: disabled "next" button if some of the fields are not properly filled (light gray on white/black)
- settings/change password screen: disabled button (light gray on white)
as well as:
- add contact screen: close button (system-dependant window decoration, so I don't think we can/should do anything about it)https://code.briarproject.org/briar/briar-desktop/-/issues/395Prohibit i18n functions outside of Composable layer2022-09-28T11:41:18ZMikolai GütschowProhibit i18n functions outside of Composable layerFrom !240:
- [ ] @ialokim started a [discussion](https://code.briarproject.org/briar/briar-desktop/-/merge_requests/240#note_71107): (+7 comments)
> The problem with using those `i18n` calls outside of the Compose-world is that th...From !240:
- [ ] @ialokim started a [discussion](https://code.briarproject.org/briar/briar-desktop/-/merge_requests/240#note_71107): (+7 comments)
> The problem with using those `i18n` calls outside of the Compose-world is that they probably won't be re-created when the language is changed (this triggers a recomposition of the whole window, but ViewModels and thus Items will be re-used). Now that I'm seeing this, it should probably be a rule not to use `i18n` methods outside of Composables.
>
> ----
> Perhaps we could force the usage of `i18n` functions only inside composables by actually marking those as `@Composable` as well? :thinking:https://code.briarproject.org/briar/briar-desktop/-/issues/394Reconsider usage of `GlobalScope`2023-03-13T22:15:02ZMikolai GütschowReconsider usage of `GlobalScope`The following discussion from !240 should be addressed:
- [ ] @ialokim started a [discussion](https://code.briarproject.org/briar/briar-desktop/-/merge_requests/240#note_70890): (+3 comments)
> Which delicate API do you use here?
...The following discussion from !240 should be addressed:
- [ ] @ialokim started a [discussion](https://code.briarproject.org/briar/briar-desktop/-/merge_requests/240#note_70890): (+3 comments)
> Which delicate API do you use here?
>
> ----
> `GlobalScope.launch {}` which seems to be ok to use here, but if you have another idea like an injected app-wide scope, please let me know.https://code.briarproject.org/briar/briar-desktop/-/issues/393Use `rememberSaveable` wherever appropriate for Android2022-09-23T11:46:27ZMikolai GütschowUse `rememberSaveable` wherever appropriate for AndroidQuoting from !240:
- [ ] @ialokim started a [discussion](https://code.briarproject.org/briar/briar-desktop/-/merge_requests/240#note_70876): (+4 comments)
> We have always used `remember` instead of `rememberSaveable`. I know that...Quoting from !240:
- [ ] @ialokim started a [discussion](https://code.briarproject.org/briar/briar-desktop/-/merge_requests/240#note_70876): (+4 comments)
> We have always used `remember` instead of `rememberSaveable`. I know that this is needed on Android for, e.g., configuration changes. Are you aware of any consequences on Desktop though?
>
> ----
>
> No, don't know how this works on desktop. However, I'd argue best to use `rememberSaveable` everywhere where we'd want it in Android, to a) practice using it and recognizing when it is needed and b) to allow us one day to unify the UI codebases of both projects in an easier fashion.https://code.briarproject.org/briar/briar-desktop/-/issues/392Make it possible to start two testing instances on same machine that are inst...2022-10-25T08:04:52ZSebastianMake it possible to start two testing instances on same machine that are instantly connectedWe have these interactive tests that run multiple briar desktop UIs with temporary accounts such as `TestWithTwoConnectedTemporaryAccounts.kt`. They add each other as contacts, too, however that takes quite a while (for some users at lea...We have these interactive tests that run multiple briar desktop UIs with temporary accounts such as `TestWithTwoConnectedTemporaryAccounts.kt`. They add each other as contacts, too, however that takes quite a while (for some users at least, up to minutes) and makes interactive testing less efficient. I'd like to be able to make use of the internal managers and methods to establish a connection instantly.
One idea that came up was to use a special version of the LanPlugin that allows BRP (#373) however it might be easier and better maintainable to achieve this in a different manner.https://code.briarproject.org/briar/briar/-/issues/2365DesktopLifecycleModule extends LifecycleModule which probably doesn't work2022-09-21T19:16:45ZSebastianDesktopLifecycleModule extends LifecycleModule which probably doesn't workSee [this discussion](https://code.briarproject.org/briar/briar/-/merge_requests/1699#note_71081) on IoModule and TestIoModule which had a similar problem.See [this discussion](https://code.briarproject.org/briar/briar/-/merge_requests/1699#note_71081) on IoModule and TestIoModule which had a similar problem.https://code.briarproject.org/briar/briar-desktop/-/issues/390Image compressor unable to compress file to 32kb2022-12-09T08:26:46ZSebastianImage compressor unable to compress file to 32kbI found an image for which our ImageCompressor implementation fails to compress it to the required file size:
https://unsplash.com/photos/EHcIO_3DbOg
This is the log:
```
Exception in thread "Thread-13" java.io.IOException
at o...I found an image for which our ImageCompressor implementation fails to compress it to the required file size:
https://unsplash.com/photos/EHcIO_3DbOg
This is the log:
```
Exception in thread "Thread-13" java.io.IOException
at org.briarproject.briar.desktop.attachment.media.ImageCompressorImpl.compressImage(ImageCompressorImpl.kt:86)
at org.briarproject.briar.desktop.conversation.ConversationViewModel$sendMessage$1.invoke(ConversationViewModel.kt:180)
at org.briarproject.briar.desktop.conversation.ConversationViewModel$sendMessage$1.invoke(ConversationViewModel.kt:175)
at kotlin.concurrent.ThreadsKt$thread$thread$1.run(Thread.kt:30)
```
[ImageCompressorImpl.kt:86](https://code.briarproject.org/briar/briar-desktop/-/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/attachment/media/ImageCompressorImpl.kt#L86)
We have this there:
```kotlin
for (quality in 100 downTo 1 step 10) {
val jpgWriter = ImageIO.getImageWritersByFormatName("jpg").next()
jpgWriter.output = ImageIO.createImageOutputStream(out)
val jpgWriteParam = jpgWriter.defaultWriteParam
jpgWriteParam.compressionMode = ImageWriteParam.MODE_EXPLICIT
jpgWriteParam.compressionQuality = quality / 100f
val outputImage = IIOImage(scaled, null, null)
jpgWriter.write(null, outputImage, jpgWriteParam)
jpgWriter.dispose()
if (out.size() <= MAX_IMAGE_SIZE) {
LOG.i { "Compressed image to ${out.size()} bytes, quality $quality" }
return ByteArrayInputStream(out.toByteArray())
}
out.reset()
}
throw IOException()
```
I have not yet debugged this, but I'm wondering what the lowest quality is that we actually try. We start with 100 but do we reach 1 or 10 as the last value? Edit: I just checked. We never reach 1 but the lowest value we try is 10. I guess we probably should change this to try quality 1 and in doubt even reduce image dimensions if even that does not suffice.
This is the full image:
![imran-hecimovic-EHcIO_3DbOg-unsplash](/uploads/800f92fcdac18eb25a9e43417961d99a/imran-hecimovic-EHcIO_3DbOg-unsplash.jpg)