briar issueshttps://code.briarproject.org/briar/briar/-/issues2023-06-19T14:01:29Zhttps://code.briarproject.org/briar/briar/-/issues/1011Offline message delivery (mailbox)2023-06-19T14:01:29ZakwizgranOffline message delivery (mailbox)Two testers asked for the ability for messages to be delivered while the recipient is offline. "Some of my global contacts are rarely online with me."Two testers asked for the ability for messages to be delivered while the recipient is offline. "Some of my global contacts are rarely online with me."Mailbox2022-10-31https://code.briarproject.org/briar/briar/-/issues/2061inform user if connection does not work because time is out of synch2021-08-27T11:41:52Zsysterinform user if connection does not work because time is out of synchIf the time is out of sync with the time of a contact, one cannot connect with them over bluetooth (haven't checked it with wifi/internet)
There is no further information in the app, why the connection fails and so it difficult for a u...If the time is out of sync with the time of a contact, one cannot connect with them over bluetooth (haven't checked it with wifi/internet)
There is no further information in the app, why the connection fails and so it difficult for a user to detect and correct the issue.
Time out of sync might happen often through the following:
- battery empty
- battery unplugged
- user has a spare phone that they haven't used since long and they just start it to test briar
If connection does not work because time is out of sync, the user should receive an inapp information.Transfer content securely via SD cards and USB memory sticksIvanaIvana2021-07-31https://code.briarproject.org/briar/briar/-/issues/1995Test sharing an app when offline2022-07-20T10:38:40ZTorsten GroteTest sharing an app when offlineYou will need *two* Android phones to help with testing sharing an app in an offline scenario.
It starts by download this test app on the first phone: https://grobox.de/tmp/hotspot.apk
Then please respond to this ticket, copying and pa...You will need *two* Android phones to help with testing sharing an app in an offline scenario.
It starts by download this test app on the first phone: https://grobox.de/tmp/hotspot.apk
Then please respond to this ticket, copying and pasting the text below into your response, giving the phone models in the first line.
You can check boxes by replacing `[ ]` with `[x]` or sending your response and then go through the steps, checking boxes by clicking them.
If you don't have or want an account to respond here, you can also send your response to `contact@briarproject.org` via email.
Please also respond, if you fail to complete all the steps. We would especially like to hear from you!
If something didn't go as expected, please feel free to add extra info to the questionnaire.
This is an example, how going through these steps could look like on the first phone:
[<img src="/uploads/b78344755319ed1b0830ce528b8c9637/device-2021-04-13-141128.png" width="200">](/uploads/b78344755319ed1b0830ce528b8c9637/device-2021-04-13-141128.png)
[<img src="/uploads/cdf3ae921106e98ee9dabbec2dfb3ac8/device-2021-04-13-141146.png" width="200">](/uploads/cdf3ae921106e98ee9dabbec2dfb3ac8/device-2021-04-13-141146.png)
[<img src="/uploads/750cd78087a215ede1c8a295eb9eb8a2/device-2021-04-13-142703.png" width="200">](/uploads/750cd78087a215ede1c8a295eb9eb8a2/device-2021-04-13-142703.png)
[<img src="/uploads/2e720826106e1fbedad1dde85b1683cd/device-2021-04-13-142720.png" width="200">](/uploads/2e720826106e1fbedad1dde85b1683cd/device-2021-04-13-142720.png)
[<img src="/uploads/6ccedfa1a0f8475383e43eb202645258/device-2021-04-14-102618.png" width="200">](/uploads/6ccedfa1a0f8475383e43eb202645258/device-2021-04-14-102618.png)
```
1. My phone models are: **[ModelOfPhone1]** and **[ModelOfPhone2]** running **[AndroidVersion1]** and **[AndroidVersion2]**
1. Download and install app on the first phone only
1. Start app and allow location permission (if requested)
1. [ ] Below the `START HOTSPOT` button, it says that `5GHz Wi-Fi is supported`.
1. Press the `START HOTSPOT` button
1. [ ] A QR code for a Wi-Fi appears
1. [ ] The Wi-Fi's name starts with `DIRECT-`
1. [ ] Below the `START HOTSPOT` button, it says `Hotspot started` and there's this text behind: **[no text]**
1. With a second phone I was able to connect to this Wi-Fi by
1. [ ] Scanning the QR code with a reader app
1. [ ] Entering the Wi-Fi data manually in the phone's Wi-Fi settings
1. Once the second phone is connected, press the `PEER CONNECTED` button
1. [ ] The app shows `http://192.168.49.1:9999` at the bottom
1. Press the menu/overflow icon and select `Network interfaces`
1. [ ] A new page shows text that includes the line `p2p0: /192.168.49.1`
1. Press the back button to come back to the (second) QR code screen
1. I was able to visit the shown site with the second phone by
1. [ ] Scanning the QR code with a reader app
1. [ ] Entering the link manually in my browser app
1. [ ] I could not visit this site
1. [ ] I could download the app on the second phone
1. [ ] I could install and open the app on the second phone
1. [ ] The second phone stayed connected to the first phone's Wi-Fi and I did not need to reconnect
1. While still connected to the first phone's Wi-Fi, go to system settings on the second phone.
* Open Wi-Fi settings and select the first phone's Wi-Fi.
* Try to find the `Frequency` (e.g. `5 GHz`) the Wi-Fi is using and write it down here: **[frequency]**
1. [ ] Bonus step: I could repeat the process by switching phones and it works the same or different in what aspect?
```
You can see how this will look like below or when using the "Preview" tab in your response.
Subtask of #1992Install via Bluetooth or Wi-FiTorsten GroteTorsten Grote2021-07-31https://code.briarproject.org/briar/briar/-/issues/1081Share app via WiFi hotspot2021-11-04T12:43:33ZJordiShare app via WiFi hotspotDuring an emergency with Internet down it would be a good option to be able to share the application with a wifi hotspot. It would make possible to distribute the application to multiple devices at the same time with just a single user h...During an emergency with Internet down it would be a good option to be able to share the application with a wifi hotspot. It would make possible to distribute the application to multiple devices at the same time with just a single user having itInstall via Bluetooth or Wi-FiIvanaIvana2021-07-31https://code.briarproject.org/briar/briar/-/issues/1114Show when user feedback has been received2021-07-06T10:03:53ZakwizgranShow when user feedback has been receivedA user asked to be shown when their feedback was received.A user asked to be shown when their feedback was received.Adapt to changes in the Android platformTorsten GroteTorsten Grote2021-04-30https://code.briarproject.org/briar/briar/-/issues/804Self-destruct timer for messages2021-07-06T09:57:26ZTorsten GroteSelf-destruct timer for messagesDuring testing session #788 and during the first Briar presentation at Cryptorave, users asked if we support a self-destruct timer for messages like Signal introduced recently and like it is also supported by Telegram.
The user seemed t...During testing session #788 and during the first Briar presentation at Cryptorave, users asked if we support a self-destruct timer for messages like Signal introduced recently and like it is also supported by Telegram.
The user seemed to see less need for the feature after it was explained that this feature does not help against adversaries who also receive that message, because they can always retain it despite the self-destruct timer. Most users might not know that and get a false sense of security from such a feature. However, testers still found it nice to be able to let messages delete automatically in case they are forced to enter their password or somebody gets hold of their phone unlocked.Self-destructing messages2021-01-31https://code.briarproject.org/briar/briar/-/issues/214User Avatars2021-05-05T16:17:22ZTorsten GroteUser AvatarsFollowing support for Identicons in #120, we want to give users the possibility to use their own avatar to be recognized by their peers.
We should bear in mind the potential for impersonation, especially in forums, where users will see ...Following support for Identicons in #120, we want to give users the possibility to use their own avatar to be recognized by their peers.
We should bear in mind the potential for impersonation, especially in forums, where users will see posts from known and unknown identities mixed together. Anyone can create a throwaway identity with the same nickname (and avatar, if we allow them) as another user, which is different from what people are used to in centralised systems.
One possibility would be to show avatars *only* for known/verified identities and use identicons for unknown identities and those users who did not specify an avatar.
Unverified contacts should be distinguished from verified contacts in some way. They could use different identicons or have a little badge on their image indicating the trust-level similar to the little green briar icons we use at the moment.Profile picturesIvanaIvana2021-01-31https://code.briarproject.org/briar/briar/-/issues/2446IllegalStateException in HotspotActivity2024-03-28T13:34:33ZakwizgranIllegalStateException in HotspotActivity* Android version: 13
* Phone model: OnePlus CPH2415 (CPH2415EEA)
* Briar version: 1.5.6 (b68d24d)
Stacktrace:
```
java.lang.IllegalStateException: LifecycleOwner org.briarproject.briar.android.hotspot.HotspotActivity@52aa2cb is attempt...* Android version: 13
* Phone model: OnePlus CPH2415 (CPH2415EEA)
* Briar version: 1.5.6 (b68d24d)
Stacktrace:
```
java.lang.IllegalStateException: LifecycleOwner org.briarproject.briar.android.hotspot.HotspotActivity@52aa2cb is attempting to register while current state is RESUMED. LifecycleOwners must call register before they are STARTED.
at androidx.activity.result.ActivityResultRegistry.register(ActivityResultRegistry.java:123)
at androidx.activity.ComponentActivity.registerForActivityResult(ComponentActivity.java:817)
at androidx.activity.ComponentActivity.registerForActivityResult(ComponentActivity.java:826)
at org.briarproject.briar.android.hotspot.AbstractConditionManager.init(AbstractConditionManager.java:50)
at org.briarproject.briar.android.hotspot.HotspotIntroFragment.onCreateView(HotspotIntroFragment.java:79)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:3104)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:524)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1890)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1817)
at androidx.fragment.app.FragmentManager.popBackStackImmediate(FragmentManager.java:871)
at androidx.fragment.app.FragmentManager.popBackStackImmediate(FragmentManager.java:778)
at androidx.fragment.app.FragmentManager.handleOnBackPressed(FragmentManager.java:699)
at androidx.fragment.app.FragmentManager$1.handleOnBackPressed(FragmentManager.java:429)
at androidx.activity.OnBackPressedDispatcher.onBackPressed(OnBackPressedDispatcher.java:192)
at androidx.activity.ComponentActivity.onBackPressed(ComponentActivity.java:657)
at android.app.Activity.onKeyUp(Activity.java:3926)
at android.view.KeyEvent.dispatch(KeyEvent.java:2933)
at android.app.Activity.dispatchKeyEvent(Activity.java:4304)
at androidx.core.app.ComponentActivity.superDispatchKeyEvent(ComponentActivity.java:124)
at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:86)
at androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity.java:142)
at androidx.appcompat.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:601)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:60)
at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent(AppCompatDelegateImpl.java:3106)
at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:442)
at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:6870)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6731)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6186)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6248)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6209)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:6379)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6217)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:6436)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6190)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6248)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6209)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6217)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6190)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6248)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6209)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:6412)
at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:6592)
at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:3778)
at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:3291)
at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:3282)
at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:3755)
at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:154)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:349)
at android.os.Looper.loopOnce(Looper.java:186)
at android.os.Looper.loop(Looper.java:351)
at android.app.ActivityThread.main(ActivityThread.java:8427)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:584)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1013)
```
Looks like the crash happens when the back button is pressed, popping a fragment off the back stack and causing HotspotIntroFragment to be recreated.Android 1.4https://code.briarproject.org/briar/briar/-/issues/2444ActivityNotFoundException for CHOOSER intent when adding contact remotely2023-09-06T15:36:50ZakwizgranActivityNotFoundException for CHOOSER intent when adding contact remotely* Android version: 14
* Phone model: Google Pixel 6
* Briar version: 1.5.4 (7d76171)
Stacktrace:
```
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.CHOOSER (has extras) }
...* Android version: 14
* Phone model: Google Pixel 6
* Briar version: 1.5.4 (7d76171)
Stacktrace:
```
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.CHOOSER (has extras) }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2239)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1878)
at android.app.Activity.startActivityForResult(Activity.java:5589)
at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:712)
at android.app.Activity.startActivityForResult(Activity.java:5547)
at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:693)
at android.app.Activity.startActivity(Activity.java:6045)
at android.app.Activity.startActivity(Activity.java:6012)
at androidx.core.app.ShareCompat$IntentBuilder.startChooser(ShareCompat.java:436)
at org.briarproject.briar.android.contact.add.remote.LinkExchangeFragment.lambda$onHandshakeLinkLoaded$2(LinkExchangeFragment.java:123)
at org.briarproject.briar.android.contact.add.remote.LinkExchangeFragment.$r8$lambda$rc2OESX5RIoUPUdisIlqrX1uomc(Unknown Source:0)
at org.briarproject.briar.android.contact.add.remote.LinkExchangeFragment$$ExternalSyntheticLambda3.onClick(Unknown Source:4)
at android.view.View.performClick(View.java:7659)
at android.view.View.performClickInternal(View.java:7636)
at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
at android.view.View$PerformClick.run(View.java:30155)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:205)
at android.os.Looper.loop(Looper.java:294)
at android.app.ActivityThread.main(ActivityThread.java:8176)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
```
Puzzling, but easy to catch.Android 1.4https://code.briarproject.org/briar/briar/-/issues/2434IllegalArgumentException when pairing mailbox2023-05-31T16:58:06ZakwizgranIllegalArgumentException when pairing mailbox* Android version: 11
* Phone model: Xiaomi Redmi Not 6 Pro (lineage_twolip)
* Briar version: 1.5.3 (1f1a97f)
Stacktrace:
```
java.lang.IllegalArgumentException: Invalid URL host: \"[scrubbed].onion\"
at okhttp3.HttpUrl$Builder....* Android version: 11
* Phone model: Xiaomi Redmi Not 6 Pro (lineage_twolip)
* Briar version: 1.5.3 (1f1a97f)
Stacktrace:
```
java.lang.IllegalArgumentException: Invalid URL host: \"[scrubbed].onion\"
at okhttp3.HttpUrl$Builder.parse$okhttp(HttpUrl.kt:1338)
at okhttp3.HttpUrl$Companion.get(HttpUrl.kt:1634)
at okhttp3.Request$Builder.url(Request.kt:184)
at org.briarproject.bramble.mailbox.MailboxApiImpl.setup(MailboxApiImpl.java:85)
at org.briarproject.bramble.mailbox.MailboxPairingTaskImpl.pairMailbox(MailboxPairingTaskImpl.java:140)
at org.briarproject.bramble.mailbox.MailboxPairingTaskImpl.run(MailboxPairingTaskImpl.java:125)
at org.briarproject.bramble.mailbox.MailboxManagerImpl.lambda$startPairingTask$0(MailboxManagerImpl.java:97)
at org.briarproject.bramble.mailbox.MailboxManagerImpl.$r8$lambda$OqqL4NbxBrCG5gMD-GnzDqowbVk(Unknown Source:0)
at org.briarproject.bramble.mailbox.MailboxManagerImpl$$ExternalSyntheticLambda0.run(Unknown Source:4)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
```
I've scrubbed the hostname for privacy, but it was 56 valid-looking chars.
Last lines of log:
```
05-26 22:34:31.304 I/CameraView: Starting preview
05-26 22:34:33.480 I/MailboxViewModel: Got result from decoder
05-26 22:34:33.482 I/MailboxPairingTaskImpl: QR code is valid
05-26 22:34:33.482 I/MailboxViewModel: New pairing state: QrCodeReceived
05-26 22:34:33.484 I/CameraView: Stopping preview
```Mailbox: Releasehttps://code.briarproject.org/briar/briar/-/issues/2429SecurityException: Permission Denial for CLOSE_SYSTEM_DIALOGS2023-04-18T15:39:33ZakwizgranSecurityException: Permission Denial for CLOSE_SYSTEM_DIALOGS* Android version: 12
* Phone model: Google Pixel 3 XL (crosshatch)
* Briar version: 1.4.23 (070165f)
* User feedback: "I wrote a message, then Briar shut down. This also happens frequently to other apps."
Stacktrace:
```
java.lang.Secu...* Android version: 12
* Phone model: Google Pixel 3 XL (crosshatch)
* Briar version: 1.4.23 (070165f)
* User feedback: "I wrote a message, then Briar shut down. This also happens frequently to other apps."
Stacktrace:
```
java.lang.SecurityException: Permission Denial: android.intent.action.CLOSE_SYSTEM_DIALOGS broadcast from org.briarproject.briar.android (pid=24174, uid=10004) requires android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS.
at android.os.Parcel.createExceptionOrNull(Parcel.java:2425)
at android.os.Parcel.createException(Parcel.java:2409)
at android.os.Parcel.readException(Parcel.java:2392)
at android.os.Parcel.readException(Parcel.java:2334)
at android.app.IActivityManager$Stub$Proxy.closeSystemDialogs(IActivityManager.java:7614)
at com.android.internal.policy.PhoneWindow.sendCloseSystemWindows(PhoneWindow.java:3791)
at com.android.internal.policy.PhoneFallbackEventHandler.sendCloseSystemWindows(PhoneFallbackEventHandler.java:323)
at com.android.internal.policy.PhoneFallbackEventHandler.startCallActivity(PhoneFallbackEventHandler.java:275)
at com.android.internal.policy.PhoneFallbackEventHandler.onKeyUp(PhoneFallbackEventHandler.java:261)
at com.android.internal.policy.PhoneFallbackEventHandler.dispatchKeyEvent(PhoneFallbackEventHandler.java:76)
at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:6317)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6141)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5623)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5680)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5646)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5811)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5654)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5868)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5627)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5680)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5646)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5654)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5627)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5680)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5646)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5844)
at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:6002)
at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:3158)
at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2722)
at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2713)
at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:3135)
at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:154)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:335)
at android.os.Looper.loopOnce(Looper.java:161)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7842)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.server.wm.ActivityTaskManagerService.checkCanCloseSystemDialogs(ActivityTaskManagerService.java:2955)
at com.android.server.wm.ActivityTaskManagerService.access$900(ActivityTaskManagerService.java:294)
at com.android.server.wm.ActivityTaskManagerService$LocalService.checkCanCloseSystemDialogs(ActivityTaskManagerService.java:5309)
at com.android.server.wm.ActivityTaskManagerService$LocalService.closeSystemDialogs(ActivityTaskManagerService.java:5783)
at com.android.server.am.ActivityManagerService.closeSystemDialogs(ActivityManagerService.java:3800)
```
Edited log:
```
04-02 10:16:30.039 I/BaseActivity: Starting ConversationActivity
04-02 10:16:30.041 I/BaseActivity: Resuming ConversationActivity
04-02 10:16:32.999 I/AutoDeleteManagerImpl: Sending message with auto-delete timer 604800000
04-02 10:16:33.045 I/DuplexOutgoingSession: Next send time decreased
04-02 10:16:33.052 I/DuplexOutgoingSession: Generated offer: true
04-02 10:16:33.052 I/DuplexOutgoingSession: Sent offer
04-02 10:16:33.061 I/DuplexOutgoingSession: Generated offer: false
04-02 10:16:33.495 I/DuplexOutgoingSession: Generated batch: true
04-02 10:16:33.495 I/ConversationActivity: Messages sent
04-02 10:16:33.495 I/DuplexOutgoingSession: Sent batch
04-02 10:16:33.504 I/DuplexOutgoingSession: Generated batch: false
04-02 10:16:34.069 I/ConversationActivity: Messages acked
04-02 10:16:42.127 I/DuplexOutgoingSession: Generated request: true
04-02 10:16:42.127 I/DuplexOutgoingSession: Sent request
04-02 10:16:42.128 I/DuplexOutgoingSession: Generated request: false
04-02 10:16:42.743 I/ValidationManagerImpl: Validating message for org.briarproject.briar.messaging
04-02 10:16:42.761 I/DuplexOutgoingSession: Generated ack: true
04-02 10:16:42.762 I/DuplexOutgoingSession: Sent ack
04-02 10:16:42.768 I/ValidationManagerImpl: Delivering message for org.briarproject.briar.messaging
04-02 10:16:42.770 I/AutoDeleteManagerImpl: Mirroring auto-delete timer 604800000
04-02 10:16:42.786 I/ConversationActivity: Message received, adding
04-02 10:16:42.791 I/DuplexOutgoingSession: Generated ack: false
04-02 10:17:12.763 I/DuplexOutgoingSession: Sending keepalive
04-02 10:17:33.484 I/DuplexOutgoingSession: Checking for retransmittable messages
04-02 10:17:33.514 I/DuplexOutgoingSession: Generated batch: false
04-02 10:17:33.520 I/DuplexOutgoingSession: Generated offer: false
```
As far as I can tell, the crash happens because `PhoneFallbackEventHandler` is being called to [handle a key event](https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/com/android/internal/policy/PhoneFallbackEventHandler.java;drc=95c1165bb895dd844e1793460710f7163dd330a3;l=250) for `KEYCODE_CALL`. The handler tries to start a call activity for the current app, which fails because Briar doesn't have permission to close system dialogs (which I guess is part of the process of launching the call activity).
So perhaps this is happening just because the user hits the call button on their device/keyboard, or perhaps it also requires some other circumstances, like an unusual device/keyboard config. Either way, it looks like a problem that's specific to this user and (based on their comment) not specific to Briar.https://code.briarproject.org/briar/briar/-/issues/2420SecurityException when requesting Bluetooth discoverability2024-03-19T11:28:53ZakwizgranSecurityException when requesting Bluetooth discoverability* Android version: 12
* Phone model: Nubia NX679J (NX679J-UN)
* Briar version: 1.4.22 (f02bbeb)
* User feedback: "Attempting to add contact."
Stacktrace:
```
java.lang.SecurityException: Permission Denial: starting Intent { act=android....* Android version: 12
* Phone model: Nubia NX679J (NX679J-UN)
* Briar version: 1.4.22 (f02bbeb)
* User feedback: "Attempting to add contact."
Stacktrace:
```
java.lang.SecurityException: Permission Denial: starting Intent { act=android.bluetooth.adapter.action.REQUEST_DISCOVERABLE cmp=com.android.settings/.bluetooth.RequestPermissionActivity (has extras) } from ProcessRecord{708319 15100:org.b
riarproject.briar.android/u0a226} (pid=15100, uid=10226) requires android.permission.BLUETOOTH
at android.os.Parcel.createExceptionOrNull(Parcel.java:2426)
at android.os.Parcel.createException(Parcel.java:2410)
at android.os.Parcel.readException(Parcel.java:2393)
at android.os.Parcel.readException(Parcel.java:2335)
at android.app.IActivityTaskManager$Stub$Proxy.startActivity(IActivityTaskManager.java:2559)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:2071)
at android.app.Activity.startActivityForResult(Activity.java:5574)
at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:574)
at androidx.core.app.ActivityCompat.startActivityForResult(ActivityCompat.java:234)
at androidx.activity.ComponentActivity$2.onLaunch(ComponentActivity.java:208)
at androidx.activity.result.ActivityResultRegistry$2.launch(ActivityResultRegistry.java:166)
at androidx.activity.result.ActivityResultLauncher.launch(ActivityResultLauncher.java:47)
at org.briarproject.briar.android.contact.add.nearby.AddNearbyContactActivity.requestBluetoothDiscoverable(AddNearbyContactActivity.java:125)
at org.briarproject.briar.android.contact.add.nearby.AddNearbyContactActivity.lambda$onCreate$0(AddNearbyContactActivity.java:78)
at org.briarproject.briar.android.contact.add.nearby.AddNearbyContactActivity.$r8$lambda$AaDmrglLROf2UvjD046fjtdaWVs(Unknown Source:0)
at org.briarproject.briar.android.contact.add.nearby.AddNearbyContactActivity$$ExternalSyntheticLambda2.onEvent(Unknown Source:4)
at org.briarproject.briar.android.viewmodel.LiveEvent$LiveEventObserver.onChanged(LiveEvent.java:84)
at org.briarproject.briar.android.viewmodel.LiveEvent$LiveEventObserver.onChanged(LiveEvent.java:70)
at androidx.lifecycle.LiveData.considerNotify(LiveData.java:133)
at androidx.lifecycle.LiveData.dispatchingValue(LiveData.java:151)
at androidx.lifecycle.LiveData.setValue(LiveData.java:309)
at org.briarproject.briar.android.viewmodel.MutableLiveEvent.setEvent(MutableLiveEvent.java:29)
at org.briarproject.briar.android.contact.add.nearby.AddNearbyContactViewModel.showQrCodeFragmentIfAllowed(AddNearbyContactViewModel.java:410)
at org.briarproject.briar.android.contact.add.nearby.AddNearbyContactIntroFragment.lambda$new$0(AddNearbyContactIntroFragment.java:38)
at org.briarproject.briar.android.contact.add.nearby.AddNearbyContactIntroFragment.$r8$lambda$O-WIAJRYMQrkvddeOqSFkFHjtQ0(Unknown Source:0)
at org.briarproject.briar.android.contact.add.nearby.AddNearbyContactIntroFragment$$ExternalSyntheticLambda1.onActivityResult(Unknown Source:4)
at androidx.activity.result.ActivityResultRegistry.dispatchResult(ActivityResultRegistry.java:367)
at androidx.activity.ComponentActivity$2$1.run(ComponentActivity.java:159)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:242)
at android.os.Looper.loop(Looper.java:374)
at android.app.ActivityThread.main(ActivityThread.java:9333)
at java.lang.reflect.Method.invoke(Native Method)
```
Last line of log:
```
03-03 00:28:17.358 I/AddNearbyContactActivity: Asking for Bluetooth discoverability
```
Looks like another manufacturer that didn't completely remove the old Bluetooth permission checks when migrating to the new Android 12 permissions.Android 1.4akwizgranakwizgranhttps://code.briarproject.org/briar/briar/-/issues/2415NPE in TimeoutInputStream2023-02-21T13:44:15ZakwizgranNPE in TimeoutInputStream* Android version: 10
* Briar version: 1.4.20 (6b20b03)
* Phone model: SPRD ums512_1h10_Natv
Stacktrace:
```
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.io.InputStream.read(byte[], int, int)' on a null obj...* Android version: 10
* Briar version: 1.4.20 (6b20b03)
* Phone model: SPRD ums512_1h10_Natv
Stacktrace:
```
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.io.InputStream.read(byte[], int, int)' on a null object reference
at org.briarproject.bramble.io.TimeoutInputStream.read(TimeoutInputStream.java:52)
at org.briarproject.bramble.util.IoUtils.read(IoUtils.java:95)
at org.briarproject.bramble.connection.Connection.readTag(Connection.java:59)
at org.briarproject.bramble.connection.Connection.recogniseTag(Connection.java:49)
at org.briarproject.bramble.connection.IncomingDuplexSyncConnection.run(IncomingDuplexSyncConnection.java:44)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
```
Edited log:
```
02-16 17:40:19.815 I/BaseActivity: Pausing ConversationActivity
02-16 17:40:19.842 I/BaseActivity: Creating ConnectViaBluetoothActivity
02-16 17:40:19.870 I/BaseActivity: Starting ConnectViaBluetoothActivity
02-16 17:40:19.872 I/BaseActivity: Resuming ConnectViaBluetoothActivity
02-16 17:40:20.349 I/BaseActivity: Stopping ConversationActivity
02-16 17:40:22.536 I/BaseActivity: Pausing ConnectViaBluetoothActivity
02-16 17:40:22.679 I/BaseActivity: Resuming ConnectViaBluetoothActivity
02-16 17:40:22.690 I/BaseActivity: Pausing ConnectViaBluetoothActivity
02-16 17:40:22.781 I/AndroidBluetoothPlugin: Scan mode: Discoverable
02-16 17:40:22.822 I/BluetoothConnectionLimiterImpl: Limiting started
02-16 17:40:22.833 I/BaseActivity: Resuming ConnectViaBluetoothActivity
02-16 17:40:22.873 I/AndroidBluetoothPlugin: Discovery started
02-16 17:40:25.153 I/BaseActivity: Pausing ConnectViaBluetoothActivity
02-16 17:40:25.310 I/BaseActivity: Resuming ConnectViaBluetoothActivity
02-16 17:40:31.235 I/PollerImpl: Polling plugin org.briarproject.bramble.bluetooth
02-16 17:40:31.239 I/ConnectionRegistryImpl: 0 contacts connected or better: org.briarproject.bramble.bluetooth
02-16 17:40:31.239 I/BluetoothConnectionLimiterImpl: Can't open contact connection while limiting
02-16 17:40:32.850 I/AndroidBluetoothPlugin: Cancelling discovery
02-16 17:40:32.853 I/AndroidBluetoothPlugin: Could not connect to any devices
02-16 17:40:37.857 W/ConnectViaBluetoothViewModel: Failed to connect
02-16 17:40:37.858 I/BluetoothConnectionLimiterImpl: Limiting ended
02-16 17:40:37.894 I/BaseActivity: Pausing ConnectViaBluetoothActivity
02-16 17:40:37.935 I/BaseActivity: Starting ConversationActivity
02-16 17:40:37.938 I/BaseActivity: Resuming ConversationActivity
02-16 17:40:38.418 I/BaseActivity: Stopping ConnectViaBluetoothActivity
02-16 17:40:38.422 I/BaseActivity: Destroying ConnectViaBluetoothActivity
02-16 17:40:43.489 I/BaseActivity: Pausing ConversationActivity
02-16 17:40:43.516 I/BaseActivity: Creating ConnectViaBluetoothActivity
02-16 17:40:43.536 I/BaseActivity: Starting ConnectViaBluetoothActivity
02-16 17:40:43.538 I/BaseActivity: Resuming ConnectViaBluetoothActivity
02-16 17:40:44.003 I/BaseActivity: Stopping ConversationActivity
02-16 17:40:44.794 I/BaseActivity: Pausing ConnectViaBluetoothActivity
02-16 17:40:44.824 I/AndroidBluetoothPlugin: Scan mode: Discoverable
02-16 17:40:44.828 I/BluetoothConnectionLimiterImpl: Limiting started
02-16 17:40:44.836 I/BaseActivity: Resuming ConnectViaBluetoothActivity
02-16 17:40:44.879 I/AndroidBluetoothPlugin: Discovery started
02-16 17:40:47.692 I/AndroidBluetoothPlugin: Discovered AC:[scrubbed]:72
02-16 17:40:50.144 I/AndroidBluetoothPlugin: Discovered 30:[scrubbed]:50
02-16 17:40:51.531 I/AndroidBluetoothPlugin: Discovered AC:[scrubbed]:72
02-16 17:40:52.154 I/AndroidBluetoothPlugin: Discovered AC:[scrubbed]:72
02-16 17:40:52.890 I/AndroidBluetoothPlugin: Discovered CC:[scrubbed]:85
02-16 17:40:53.437 I/AndroidBluetoothPlugin: Discovered CC:[scrubbed]:85
02-16 17:40:54.092 I/AndroidBluetoothPlugin: Discovered AC:[scrubbed]:72
02-16 17:40:54.844 I/AndroidBluetoothPlugin: Cancelling discovery
02-16 17:40:54.848 I/AndroidBluetoothPlugin: Connecting to 30:[scrubbed]:50
02-16 17:40:54.850 I/BluetoothConnectionLimiterImpl: Connection opened, 1 open
02-16 17:40:54.850 I/ConnectViaBluetoothViewModel: Could connect, handling connection
02-16 17:40:54.850 I/BluetoothConnectionLimiterImpl: Limiting ended
02-16 17:40:54.867 I/DuplexOutgoingSession: Generated ack: false
02-16 17:40:54.878 I/DuplexOutgoingSession: Generated batch: false
02-16 17:40:54.880 I/DuplexOutgoingSession: Generated offer: false
02-16 17:40:54.881 I/DuplexOutgoingSession: Generated request: false
02-16 17:40:54.882 I/BaseActivity: Pausing ConnectViaBluetoothActivity
02-16 17:40:54.925 I/BaseActivity: Starting ConversationActivity
02-16 17:40:54.929 I/BaseActivity: Resuming ConversationActivity
02-16 17:40:55.410 I/BaseActivity: Stopping ConnectViaBluetoothActivity
02-16 17:40:55.413 I/BaseActivity: Destroying ConnectViaBluetoothActivity
02-16 17:41:01.986 I/AbstractBluetoothPlugin: Connection received
02-16 17:41:01.986 I/BluetoothConnectionLimiterImpl: Connection opened, 2 open
```
As far as I can tell, this device is the head unit in a car.
The log shows an outgoing Bluetooth connection being made, then an incoming connection being received. Perhaps the Bluetooth stack doesn't support multiple connections (or doesn't support incoming and outgoing connections with the same device). In any case, BluetoothSocket#getInputStream() returns null for the second connection. We should check this (and also for the output stream) and throw an IOException rather than crashing.Android 1.4akwizgranakwizgranhttps://code.briarproject.org/briar/briar/-/issues/2409SecurityException when binding Bluetooth socket2023-05-29T11:38:26ZakwizgranSecurityException when binding Bluetooth socketThis crash looks similar to #1698 but the stacktrace is different. The error message says the app lacks permission android.permission.BLUETOOTH, which was replaced by new permissions in Android 12. Is the error message out of date, or do...This crash looks similar to #1698 but the stacktrace is different. The error message says the app lacks permission android.permission.BLUETOOTH, which was replaced by new permissions in Android 12. Is the error message out of date, or does this device still use the old Bluetooth permissions?
* Android version: 12
* Phone model: Redmi M2101K6R (sweet_global)
* Briar version: 1.4.18 (4797151)
* User feedback: "The app stopped out of nowhere and I need it urgently."
Stacktrace:
```
java.lang.SecurityException: UID 10414 / PID 7993 lacks permission android.permission.BLUETOOTH
at android.os.Parcel.createExceptionOrNull(Parcel.java:2426)
at android.os.Parcel.createException(Parcel.java:2410)
at android.os.Parcel.readException(Parcel.java:2393)
at android.os.Parcel.readException(Parcel.java:2335)
at android.bluetooth.IBluetoothSocketManager$Stub$Proxy.createSocketChannel(IBluetoothSocketManager.java:265)
at android.bluetooth.BluetoothSocket.bindListen(BluetoothSocket.java:453)
at android.bluetooth.BluetoothAdapter.createNewRfcommSocketAndRecord(BluetoothAdapter.java:2883)
at android.bluetooth.BluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord(BluetoothAdapter.java:2830)
at org.briarproject.bramble.plugin.bluetooth.AndroidBluetoothPlugin.openServerSocket(AndroidBluetoothPlugin.java:152)
at org.briarproject.bramble.plugin.bluetooth.AndroidBluetoothPlugin.openServerSocket(AndroidBluetoothPlugin.java:61)
at org.briarproject.bramble.plugin.bluetooth.AbstractBluetoothPlugin.lambda$bind$0(AbstractBluetoothPlugin.java:215)
at org.briarproject.bramble.plugin.bluetooth.AbstractBluetoothPlugin.$r8$lambda$Nv27P8uQlCv6FpD1a0uQUudeR9U(Unknown Source:0)
at org.briarproject.bramble.plugin.bluetooth.AbstractBluetoothPlugin$$ExternalSyntheticLambda0.run(Unknown Source:2)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
at java.lang.Thread.run(Thread.java:1012)
```
Edited log:
```
12-28 01:54:17.763 I/PluginManagerImpl: Starting simplex plugins
12-28 01:54:17.763 I/PluginManagerImpl: Starting duplex plugins
12-28 01:54:17.779 I/PluginManagerImpl: org.briarproject.bramble.bluetooth changed from state STARTING_STOPPING to INACTIVE
12-28 01:54:17.799 I/AbstractBluetoothPlugin: Local address null
12-28 01:54:17.802 I/PluginViewModel: TransportStateEvent: org.briarproject.bramble.bluetooth is INACTIVE
```
Looks like the plugin was enabled and the crash happened at startup.Android 1.4akwizgranakwizgranhttps://code.briarproject.org/briar/briar/-/issues/2407Crash when getting Bluetooth address2023-01-06T16:28:57ZakwizgranCrash when getting Bluetooth address* Android version: 12
* Phone model: Redmi M2004J19C (galahad_global)
* Briar version: 1.4.18 (4797151)
Edited log:
```
12-17 21:55:20.433 I/AbstractBluetoothPlugin: Bluetooth enabled
```
Stacktrace:
```
java.lang.SecurityException: Ne...* Android version: 12
* Phone model: Redmi M2004J19C (galahad_global)
* Briar version: 1.4.18 (4797151)
Edited log:
```
12-17 21:55:20.433 I/AbstractBluetoothPlugin: Bluetooth enabled
```
Stacktrace:
```
java.lang.SecurityException: Need android.permission.BLUETOOTH_CONNECT permission for android.content.AttributionSource@458c6c33: getAddress
at android.os.Parcel.createExceptionOrNull(Parcel.java:2426)
at android.os.Parcel.createException(Parcel.java:2410)
at android.os.Parcel.readException(Parcel.java:2393)
at android.os.Parcel.readException(Parcel.java:2335)
at android.bluetooth.IBluetoothManager$Stub$Proxy.getAddress(IBluetoothManager.java:789)
at android.bluetooth.BluetoothAdapter.getAddress(BluetoothAdapter.java:1290)
at org.briarproject.bramble.util.AndroidUtils.getBluetoothAddressAndMethod(AndroidUtils.java:70)
at org.briarproject.bramble.util.AndroidUtils.getBluetoothAddress(AndroidUtils.java:63)
at org.briarproject.bramble.plugin.bluetooth.AndroidBluetoothPlugin.getBluetoothAddress(AndroidBluetoothPlugin.java:146)
at org.briarproject.bramble.plugin.bluetooth.AbstractBluetoothPlugin.updateProperties(AbstractBluetoothPlugin.java:239)
at org.briarproject.bramble.plugin.bluetooth.AbstractBluetoothPlugin.$r8$lambda$ZdCFKGKAr5elvl5L48zy5sncMIA(Unknown Source:0)
at org.briarproject.bramble.plugin.bluetooth.AbstractBluetoothPlugin$$ExternalSyntheticLambda2.run(Unknown Source:2)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:920)
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.server.BluetoothManagerService.checkPermissionForDataDelivery(BluetoothManagerService.java:3327)
at com.android.server.BluetoothManagerService.checkConnectPermissionForDataDelivery(BluetoothManagerService.java:3345)
at com.android.server.BluetoothManagerService.getAddress(BluetoothManagerService.java:1951)
at android.bluetooth.IBluetoothManager$Stub.onTransact(IBluetoothManager.java:373)
at android.os.Binder.execTransactInternal(Binder.java:1190)
```Android 1.4akwizgranakwizgranhttps://code.briarproject.org/briar/briar/-/issues/2405SecurityException at startup when getting Bluetooth bonded devices2023-06-30T10:34:39ZakwizgranSecurityException at startup when getting Bluetooth bonded devicesThis crash has been reported by Google Play but not by our crash reporter, perhaps because it happens early in the app lifecycle.
* Android version: 13
* Briar version: 1.4.15
* Phone models: Google raven, panther and bluejay
Stacktrac...This crash has been reported by Google Play but not by our crash reporter, perhaps because it happens early in the app lifecycle.
* Android version: 13
* Briar version: 1.4.15
* Phone models: Google raven, panther and bluejay
Stacktrace:
```
Exception java.lang.RuntimeException:
at android.app.ActivityThread.handleBindApplication (ActivityThread.java:6790)
at android.app.ActivityThread.-$$Nest$mhandleBindApplication
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2134)
at android.os.Handler.dispatchMessage (Handler.java:106)
at android.os.Looper.loopOnce (Looper.java:201)
at android.os.Looper.loop (Looper.java:288)
at android.app.ActivityThread.main (ActivityThread.java:7898)
at java.lang.reflect.Method.invoke
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:936)
Caused by java.lang.SecurityException:
at com.android.bluetooth.Utils.checkPermissionForDataDelivery (Utils.java:482)
at com.android.bluetooth.Utils.checkConnectPermissionForDataDelivery (Utils.java:514)
at com.android.bluetooth.btservice.AdapterService$AdapterServiceBinder.getBondedDevices (AdapterService.java:2122)
at com.android.bluetooth.btservice.AdapterService$AdapterServiceBinder.getBondedDevices (AdapterService.java:2114)
at android.bluetooth.IBluetooth$Stub.onTransact (IBluetooth.java:642)
at android.os.Binder.execTransactInternal (Binder.java:1285)
at android.os.Binder.execTransact (Binder.java:1244)
```
AndroidSecureRandomProvider calls getBondedDevices() at startup to feed the entropy pool. We added a permission check for Android 12, but apparently it's not always effective.Android 1.4akwizgranakwizgranhttps://code.briarproject.org/briar/briar/-/issues/2385Sponsor 6 User feedback2023-08-28T16:07:07ZIvanaSponsor 6 User feedbackThis ticket gathers different strands of user feedback received during Q3 and Q4 2022 from users.
Users were asked to test the Briar app at an event, therefore there was little in the way of user preparation, onboarding etc.
## Feedba...This ticket gathers different strands of user feedback received during Q3 and Q4 2022 from users.
Users were asked to test the Briar app at an event, therefore there was little in the way of user preparation, onboarding etc.
## Feedback from users on how to improve Briar
### Issues Relating to User Experience and Functionality
| Problem | Solution proposed by person giving feedback | Notes from team | Relevant tickets | Next steps |
| ------ | ------ | ------ | ------ | ------ |
| Anecdotally, users have said that Briar doesn't work during internet shutdowns. We heard this at the conference last week. | <p> What we need to explain is that it does work, but it has limitations. We need to lower expectations of what this can do. It is not as good as WhatsApp, and it can take up to 10 minutes to install and connect with friends who have it as well as add yourself to a forum. </p><p> Briar should adjust expectations of what it is capable of doing and make its limitations clear, so users don't become frustrated that it doesn't operate like WhatsApp. </p> | <p> This feedback touches on an issue we've been discussing recently: whether our product strategy of imitating the features and UX of a typical messaging app is effective for meeting the needs of people affected by internet shutdowns. That's an issue we should continue to discuss as a team, but it's too big to tackle in the remaining sponsor 6 hours. Still, within the existing product strategy there are things we could do to address this feedback. </p><p> We could change the language we use to describe the app (on our website, Google Play and elsewhere), to make it clear that when operating offline, the app can only be used to communicate with people nearby. </p><p> Within the app, we could create a stronger UX distinction between online and offline operation. </p><p> We could add onboarding to explain how offline communication works when the app is used offline for the first time, perhaps using information about the available transports and contacts to decide when onboarding is needed. </p><p> We could be more proactive about using onboarding and UX cues to explain the differences between Briar and typical messaging apps, both online and offline. </p> | #1472 | Design UX for contextual help: #2390. |
| Techies at the event found it hard to download and install the app and became frustrated. Once the app is downloaded and users are trying to connect to one another, they don't understand how to scan each other's QR codes. Our tests often saw pairs of users only scanning one of the QR codes, rather than both on each user’s phone - the current documentation of a still image doesn't exactly show how to do that - and users can get frustrated during this period. | Here are some ways to improve this: Briar needs to include clear images, GIFs and/or a video to make clear how to correctly scan the QR codes early in the installation process to avoid user frustration. | <p> Many other apps use QR codes, but none of them require both parties to scan each other's codes, creating a strong expectation that Briar will work in the same way. </p><p> We've already made a small step towards addressing this by adding hints to the UI. </p><p> We could improve the onboarding for adding a nearby contact, perhaps with a vector animation of both devices scanning each other's QR codes. </p><p> In the longer term we could replace the QR code workflow with a new workflow in which the users choose who will go first, so that we can show each user the next step they need to take. </p> | #348, #1909, #1235 | Design UX for contextual help: #2390. |
| While tutorials and documentation on Briar exist in several languages, these are difficult to find. | <p> We need a centralized place to download Briar's existing documentation and tutorials in multiple languages quickly and easily to help people install the app with ease. </p><p> Some suggestions to improve this include: Making these resources available on the Google Play Store and/or the Briar website, and/or when people download the app they are instructed to do a walkthrough of the app in various languages. Instructions or a walk-through in multiple languages would be helpful. </p> | <p> We should make the manual, quick start guide and FAQ easier to find on the website - this depends on restructuring the nav. </p><p> Linking to the docs from Google Play is an easy win. </p><p> We could also write tutorials for specific tasks (eg creating an account, adding a contact). These might replace the current quick start guide and would allow more topics to be covered. </p><p> Bundling the manual and/or tutorials with the app, and/or writing help text specifically for the app, might also help. </p><p> Open problem: generating in-app documentation and web documentation from the same source, in a format that's compatible with Transifex. </p> | website#21, #1312 | <p> Restructure website navigation: website#21. </p><p> Link to docs from Google Play: #2387. </p><p> Design UX for contextual help: #2390. </p> |
| People join Briar, but they don't know what to do or how to find and join a forum. | The documentation should spell this process out clearly, along with GIFs -- not just still images that don't properly explain what is needed. | <p> We should add onboarding for the blog, forum and private group features. This could consist of a "tour" after the user creates their account, and/or onboarding for specific features when the user first opens them. </p><p> We should offer contextual help throughout the app, either by linking to the appropriate part of the bundled documentation or by writing help text specifically for the app. </p><p> Open problem: how to indicate that help is available in a given context without interrupting the user's workflow? </p> | #1472 | Design UX for contextual help: #2390. |
### Issues Relating to Transparency
| Problem | Solution proposed by person giving feedback | Notes from team | Relevant tickets | Next steps |
| ------ | ------ | ------ | ------ | ------ |
| <p> Information on how and what user data is collected and used by Briar needs to be more clear and more transparent to users in plain language. While the privacy information is on GitHub this is not accessible to an ordinary user and to those who may not be familiar with a privacy policy, especially if it is written in very technical language. </p><p> Some of the questions event participants wished to be answered before they downloaded the app included: Is it encrypted? What will they do with my data? Why do I need a password? Why isn't it on iOS? Will it become available on iOS? Who has developed the app? </p> | They should have a help/FAQ section based on this information. | <p> The privacy policy is linked from Google Play - we should also link to it from GitHub. </p><p> The privacy policy is written in non-technical language, but it's only available in English. Making the website available in multiple languages would help with this. </p><p> The FAQ should also be made available in multiple languages and linked from Google Play and GitHub. This argues in favour of putting the FAQ on the website (where it can be translated) rather than the wiki. Including the FAQ in the app might also help. </p><p> We could add onboarding to the account setup process (or expand the existing contextual help and make it more obvious) to answer the questions about encryption, data storage and why the password is needed. </p> | website#28, website#29, #1312 | <p> Link to docs and privacy policy from GitHub: #2388. </p><p> Make website translatable: website!87. </p><p> Add FAQ to website: website#29 (depends on website#21). </p><p> Design UX for contextual help: #2390. </p> |
### Some Suggestions for Improvements to Increase Functionality/User Uptake
#### Read/Delivery Receipts
| Problem | Solution proposed by person giving feedback | Notes from team | Relevant tickets | Next steps |
| ------ | ------ | ------ | ------ | ------ |
| During an emergency situation information on the delivery/receipt/reading of messages can be vital. | Briar developers should make it optional to add read receipts to private messages and forums. The app should provide clear ways to show if a message has not been delivered or read, similar to some other apps. | <p> Opt-in read receipts could be implemented for private messages. </p><p> We should look at how other apps handle the UI distinction between a contact who hasn't enabled read receipts and a contact who has enabled them but hasn't read the message. </p><p> Some apps don't let you request read receipts unless you also send receipts to your contacts (although this couldn't be enforced in a P2P app). </p><p> For forums, it's not clear how read receipts would work, as the membership of the forum isn't known. </p><p> Read receipts for private groups might be feasible. We should look at how other apps handle read receipts for group chats. </p><p> Some people may think that two checkmarks mean a message has been read. We could show onboarding for this and add it to the FAQ. </p> | #1220, #1208 | <p> Research how other apps handle read receipts: #2389. </p> |
#### Understanding the Internet vs Bluetooth Function
| Problem | Solution proposed by person giving feedback | Notes from team | Relevant tickets | Next steps |
| ------ | ------ | ------ | ------ | ------ |
| At the moment, people don't seem to understand what the internet and Bluetooth functions are, what they mean, why it is better than WhatsApp, when it is appropriate to use either function, and what the limitations are when these functions are used. | A notification/banner showing if the app is relying on the internet or Bluetooth should be shown to make the use of the two functions clear and help people understand the two different modes it can operate. | See notes above re: making it clear that the app works differently from WhatsApp. | See above. | See above. |
#### Confusion about the Forum Function
| Problem | Solution proposed by person giving feedback | Notes from team | Relevant tickets | Next steps |
| ------ | ------ | ------ | ------ | ------ |
| Event participants were confused about what the term ‘forum’ meant and which function it was meant to provide, which can indicate that other users, especially non-English-speaking users may not be able to understand what this function provides. | Briar should consider changing the name Forum to Groups which is more clear and in line with other apps to avoid confusion and misunderstandings by users, especially those in non-English-speaking countries. | <p> We should try to find out whether this is a translation issue or whether the term is also unclear to English-speaking users. </p><p> We could do some user research into what users expect the terms "forum", "private group" and "blog" to mean. </p><p> We discussed renaming "forum" and "private group" to "public group" and "private group", or "open group" and "closed group", but this might cause further confusion between the two features. We won't find any single term that conveys the right concept to everyone, so explanations need to be included in the app and easily accessible. See notes above re: onboarding for features and contextual help. </p> | #800, #1472 | Design UX for contextual help: #2390. |
#### Warnings and Notifications on Internet Disruptions and Shutdowns
| Problem | Solution proposed by person giving feedback | Notes from team | Relevant tickets | Next steps |
| ------ | ------ | ------ | ------ | ------ |
| It needs to be clear that people DO need internet access to download and install the app, so installation needs to happen before any shutdowns/disruptions. | <p> To help users be prepared and remember to use Briar, notifications could be sent to users' phones while they are connected to the internet to tell friends about the application and to help them download it. The notification can be sent periodically to remind users about the app. </p><p> Briar could also connect to civil society/research groups who monitor internet connectivity around the world, so that it can provide notifications and warnings if there is a risk of imminent internet disruption or shutdown so that users can prepare/share information to friends/family to start using Briar. </p> | <p> Apparently we need to do a better job of advertising the offline app sharing function! We could add onboarding for this feature when the app is first used offline. We could also think about whether there's a more prominent place in the app where this feature could live. </p><p> Showing too many notifications might irritate users and cause them to turn off notifications. </p><p> Notifications for specific countries at risk of internet disruptions would be possible, but the Briar team would prefer not to operate any centralised infrastructure. We might be able to partner with an organisation like Access Now to publish information, perhaps as an RSS feed that Briar peers could fetch via Tor and automatically re-share. </p><p> We could direct the user to the offline app sharing feature when we detect that the app is offline. </p><p> Many apps have the ability to generate a generic message like "Let's keep in touch via Briar, download it here", which can be sent via another app. This would be an easy win. </p> | | Share a link to the Briar download page: #2391. |
## Feedback received via Briar blog from project partners
| Problem | Solution proposed by person giving feedback | Notes from team | Relevant tickets | Next steps |
| ------ | ------ | ------ | ------ | ------ |
| It's not obvious that the Reblog button can be used to reply to a post. The reblog icon is intuitive *if you're accustomed to Tumblr*, but that's ancient to most savvy youths, a primary target audience for Briar. | It would be better to have separate Reply and Reblog buttons, like Twitter. | This is an easy win. | | Use separate buttons for reblogging and commenting: #2392. |
| A link shared within a blog is neither clickable not intuitively copy-able. | | <p> The underlying issue is that blog posts are written in plain text but rendered as HTML, because RSS posts can contain HTML. Messages elsewhere in the app (private messages, forums, private groups and even blog comments) are written and rendered as plain text. </p><p> We could convert blog posts to HTML when they're written, including converting URLs into links. </p><p> Alternatively, we could continue to render RSS posts as HTML, but render non-RSS posts as plain text. We could then make links clickable when rendering all plain text content (blog posts, blog comments, private messages, forums and private groups). </p><p> We should investigate the options for preprocessing text to HTML. </p> | #689, #421, #786, #1038, #90 | Convert blog posts and comments to HTML when composing: #2393. |
| As I play with the app, I'm continually seeking a "homebase" with the feed but featuring notifications of messages and new posts, and instead I end up hitting the Back button and accidentally exiting the app. | A centralised homepage with just my notifications would be optimal. | <p> We could show badges for new content in the nav menu, and maybe even on the hamburger button. This might require some refactoring to limit the amount of DB work needed. </p><p> Paul has some drawings of different navigation options, including bottom navigation, which would make the badges visible from everywhere. </p><p> Another option would be to create a new homepage that shows new content from all parts of the app. This would be a much bigger change, requiring design work to differentiate the various types of content and backend work to make the new content available efficiently. </p> | #42 | Show new content in navigation drawer: #42. (This may need to be broken down into subtasks.) |
| Why can't I filter the Blogs page to see posts from specific contacts? | | This could be added, either as a blog list screen accessible via the overflow menu, similar to the forum and private group lists, or as a dropdown at the top of the feed.| #624, #864, #865, #996 | |
| Post that is continually reblogged when I add comments to it creates annoying redundancy for my contact. | | This is a tricky one because comment threads can fork. Let's look at how Tumblr and Twitter handle this. | #2154 | Research how Tumblr and Twitter handle comments/reblogs for previously seen posts: #2394. |
| When I go to contacts individually, I'd like to see their blogs. | | This could easily be added to the conversation screen's overflow menu. Alternatively, it could be added to the long-requested contact info screen. The contact info screen could also serve as an entry point for documentation. | #26 | |
| Adding nearby contact wait screen makes one unable to do other things in the app. | Can it happen in the background? | <p> By the time we know that the contact has scanned our QR code, the process is nearly finished. So with the current protocol, not much time would be saved by moving the process to the background at that point. </p><p> If we redesign the workflow and protocol for adding nearby contacts then we should keep this request in mind, but that redesign is probably too big a piece of work to tackle in the remaining sponsor 6 hours. </p> | #348 | Too big for sponsor 6. |
| Ability to make others admins of private groups. | | This has been requested before. Having multiple admins would be very complex. Transferring ownership to a new admin might be feasible, but it would be too big a piece of work for the remaining sponsor 6 hours. | #920 | Too big for sponsor 6. |
| Bigger buttons. | | More information needed. | | Ask for more info. |
| Too many similar terms. | | More information needed. | | Ask for more info. |
| Notifications are clunky. | | More information needed. | | Ask for more info. |
| Restructure actions so you just write a post and then decide who sees it (eg private, a contact, a group, or all). | | <p> If the request is only intended to apply to blogs then it should be feasible. It would require UX and backend changes, including a small protocol change to let recipients know whether they're allowed to re-share the post. </p><p> If the request is intended to apply across the app, ie to make it possible to write some content and then decide whether it should be a private message, a blog post, etc, then that would be more complex (for example, private messages support attachments but other types of content don't). Email clients and some messengers support this, and it's useful to be able to create an ad hoc group for a conversation. We should keep this use case in mind when working on public mesh protocols. </p> | #1013 | |akwizgranakwizgranhttps://code.briarproject.org/briar/briar/-/issues/2330NPE when getting IPv6 address for network interface2023-09-06T15:37:00ZakwizgranNPE when getting IPv6 address for network interface* Android version: 11
* Phone model: OnePlus HD1903 (OnePlus7T)
* Briar version: 1.4.6 (d5e17c8)
Stacktrace:
```
java.lang.NullPointerException: Attempt to read from field 'java.util.List java.net.NetworkInterface.childs' on a null obje...* Android version: 11
* Phone model: OnePlus HD1903 (OnePlus7T)
* Briar version: 1.4.6 (d5e17c8)
Stacktrace:
```
java.lang.NullPointerException: Attempt to read from field 'java.util.List java.net.NetworkInterface.childs' on a null object reference
at java.net.NetworkInterface.getAll(NetworkInterface.java:498)
at java.net.NetworkInterface.getByInetAddress(NetworkInterface.java:365)
at org.briarproject.bramble.plugin.tcp.AndroidLanTcpPlugin.getIpv6AddressForInterface(AndroidLanTcpPlugin.java:199)
at org.briarproject.bramble.plugin.tcp.AndroidLanTcpPlugin.getWifiAddress(AndroidLanTcpPlugin.java:125)
at org.briarproject.bramble.plugin.tcp.AndroidLanTcpPlugin.getUsableLocalInetAddresses(AndroidLanTcpPlugin.java:110)
at org.briarproject.bramble.plugin.tcp.LanTcpPlugin.getLocalSocketAddresses(LanTcpPlugin.java:140)
at org.briarproject.bramble.plugin.tcp.TcpPlugin.bind(TcpPlugin.java:159)
at org.briarproject.bramble.plugin.tcp.TcpPlugin.lambda$bind$0(TcpPlugin.java:152)
at org.briarproject.bramble.plugin.tcp.TcpPlugin.$r8$lambda$IG7OujafuxmUKGD9Z35IgV8DTwo(Unknown Source:0)
at org.briarproject.bramble.plugin.tcp.TcpPlugin$$ExternalSyntheticLambda0.run(Unknown Source:2)
at org.briarproject.bramble.PoliteExecutor.lambda$execute$0(PoliteExecutor.java:57)
at org.briarproject.bramble.PoliteExecutor.$r8$lambda$wSvuPL6t_HUoaaqCVexrhJX_RSg(Unknown Source:0)
at org.briarproject.bramble.PoliteExecutor$$ExternalSyntheticLambda0.run(Unknown Source:6)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
```Android 1.4https://code.briarproject.org/briar/briar/-/issues/2308Emoji button doesn't work on Android 42023-03-22T12:47:53ZakwizgranEmoji button doesn't work on Android 4* Android version: 4.1.2
* Phone model: Samsung GT-I8260 (arubaslimssxx)
* Briar version: 1.4.5 (4df523a)
* User feedback: "I would like to inform you about the emoji icon which does nothing. It does not show the emoji selection box and ...* Android version: 4.1.2
* Phone model: Samsung GT-I8260 (arubaslimssxx)
* Briar version: 1.4.5 (4df523a)
* User feedback: "I would like to inform you about the emoji icon which does nothing. It does not show the emoji selection box and therefore it is not possible to send any emoji."
I can reproduce this on my API 16 test device (Samsung Galaxy Ace 2).https://code.briarproject.org/briar/briar/-/issues/2280NPE in RemovableDriveTaskImpl2022-04-20T14:54:14ZakwizgranNPE in RemovableDriveTaskImpl* Android version: 9
* Phone model: Huawei POT-LX1
* Briar version: 1.4.5 (4df523a)
* User feedback: "Doesn't work without internet."
Log:
```
03-01 07:20:01.142 I/BriarApplicationImpl: Created
03-01 07:20:01.187 I/BaseActivity: Creatin...* Android version: 9
* Phone model: Huawei POT-LX1
* Briar version: 1.4.5 (4df523a)
* User feedback: "Doesn't work without internet."
Log:
```
03-01 07:20:01.142 I/BriarApplicationImpl: Created
03-01 07:20:01.187 I/BaseActivity: Creating RemovableDriveActivity
03-01 07:20:01.244 I/BaseActivity: Starting RemovableDriveActivity
03-01 07:20:01.322 I/BaseActivity: Resuming RemovableDriveActivity
03-01 07:20:01.322 I/BriarActivity: Not signed in, launching StartupActivity
03-01 07:20:01.340 I/BaseActivity: Pausing RemovableDriveActivity
```
Stacktrace:
```
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
at org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull(NullSafety.java:12)
at org.briarproject.bramble.plugin.file.RemovableDriveTaskImpl.getPlugin(RemovableDriveTaskImpl.java:78)
at org.briarproject.bramble.plugin.file.RemovableDriveReaderTask.run(RemovableDriveReaderTask.java:38)
at java.util.concurrent.ThreadPoolExecutor.processTask(ThreadPoolExecutor.java:1187)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:784)
```
Looks like the crash happened when relaunching the app from the recent apps list after it was killed with RemovableDriveActivity open.Android 1.4akwizgranakwizgran