briar issueshttps://code.briarproject.org/briar/briar/-/issues2023-08-28T16:03:27Zhttps://code.briarproject.org/briar/briar/-/issues/2401Testers were concerned that Briar showed Mailbox as connected when Mailbox wa...2023-08-28T16:03:27ZakwizgranTesters were concerned that Briar showed Mailbox as connected when Mailbox was offline> Participants were complaining that even when the Mailbox device was offline, on the Briar app it looked like the connection is still working well. There were no indications that the connection is not working. They were expecting to get...> Participants were complaining that even when the Mailbox device was offline, on the Briar app it looked like the connection is still working well. There were no indications that the connection is not working. They were expecting to get a notification on their Briar app device whenever there were any problems with the Mailbox connection.
>
> This was quite concerning to them, they expressed that in everyday use they would never think to manually check the connection and they would always assume that the Mailbox is working unless they get a notification on their Briar device telling them about the problems.
>
> The “Last connection…” indicator wasn’t enough to show them the connection problems. They didn’t know how often Briar automatically check the connection. For example, Mailbox device was disconnected 3 minutes ago but the screen on the Briar app didn’t indicate any problem it just showed the time of the “Last connection: 5 minutes ago”.
Some thoughts about how to address this:
* If the last connection was not very recent (say, more than a minute ago), show a neutral status instead of a successful status, to prompt the user to use the "check connection" button to update the status
* Show some text along the lines of "Briar will automatically check the connection to your Mailbox every hour and notify you if your Mailbox is not reachable", and maybe show when the next check is dueMailbox: Usability testinghttps://code.briarproject.org/briar/briar/-/issues/2431MailboxIntegrationTest sometimes fails in CI pipelines2023-08-28T16:03:06ZakwizgranMailboxIntegrationTest sometimes fails in CI pipelineshttps://code.briarproject.org/briar/briar/-/issues/2443OOM error when polling large number of contacts2023-08-24T15:00:10ZakwizgranOOM error when polling large number of contacts* Android version: 13
* Phone model: Realme RMX3516 (RMX3516EEA)
* Briar version: 1.5.4 (7d76171)
Stacktrace:
```
java.lang.OutOfMemoryError: Failed to allocate a 48 byte allocation with 252528 free bytes and 246KB until OOM, target foo...* Android version: 13
* Phone model: Realme RMX3516 (RMX3516EEA)
* Briar version: 1.5.4 (7d76171)
Stacktrace:
```
java.lang.OutOfMemoryError: Failed to allocate a 48 byte allocation with 252528 free bytes and 246KB until OOM, target footprint 201326592, growth limit 201326592; giving up on allocation because <1% of heap free after GC.
at java.util.regex.Pattern.matcher(Pattern.java:1040)
at org.briarproject.bramble.plugin.tor.TorPlugin.createConnection(TorPlugin.java:361)
at org.briarproject.bramble.plugin.tor.TorPlugin.lambda$connect$2(TorPlugin.java:349)
at org.briarproject.bramble.plugin.tor.TorPlugin.$r8$lambda$dsAekyWijvXWn3loJi16FAklboE(Unknown Source:0)
at org.briarproject.bramble.plugin.tor.TorPlugin$$ExternalSyntheticLambda4.run(Unknown Source:6)
at org.briarproject.android.dontkillmelib.wakelock.AndroidWakeLockManagerImpl.lambda$executeWakefully$0(AndroidWakeLockManagerImpl.java:71)
at org.briarproject.android.dontkillmelib.wakelock.AndroidWakeLockManagerImpl.$r8$lambda$YrcWd5iwE_LXXUj-LlmRNhzP9-U(Unknown Source:0)
at org.briarproject.android.dontkillmelib.wakelock.AndroidWakeLockManagerImpl$$ExternalSyntheticLambda0.run(Unknown Source:4)
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)
```
* NativeHeapAllocated: 467,674,320
* NativeHeapFree: 57,465,872
* NativeHeapTotal: 539,607,040
* SystemMemoryFree: 1,281,261,568
* SystemMemoryLow: false
* SystemMemoryThreshold: 339,738,624
* SystemMemoryTotal: 3,834,589,184
* VirtualMachineMemoryFree: 4,663,224
* VirtualMachineMemoryMaximum: 201,326,592
* VirtualMachineMemoryTotal: 201,326,592
The log shows that the crash happened about 9 seconds after polling the Tor plugin. Connection attempts from the previous two polls were still in progress, as shown by the messages logged when those attempts timed out. The previous two polls appear to have happened in quick succession, as two failures for the same address were often logged back-to-back. (This can happen when the plugin's enabled, as the first poll happens immediately and the second is scheduled after a randomised interval.)
The log shows that the user has at least 54 contacts. I'd speculate that this may cause polling to take longer than the polling interval, causing pending connection attempts to pile up.
All of the connection failures except the last are logged as "java.io.IOException: Connection failed: Host unreachable". The last connection failure is logged as "java.net.SocketTimeoutException: failed to connect to /127.0.0.1 (port 59050) from /127.0.0.1 (port 57012) after 5000ms", indicating that the connection to Tor's SOCKS port on localhost timed out. Perhaps the Tor process had become unresponsive, or perhaps the Java process was spending too much time in GC to service the connection.
The memory stats show 539 MB of native heap, which is a lot! Maybe there's a large backlog of socket connections, each with some native heap allocations, and each with an IoExecutor thread waiting on it that might have its own native heap allocations?
`VirtualMemoryFree` doesn't match the amount in the OOM error message, which is an issue we've seen before (https://code.briarproject.org/briar/briar/-/issues/1898#note_76643).
It's useful to know that the allocator gives up if it can't free more than 1% of the max heap space after GC.https://code.briarproject.org/briar/briar/-/issues/2442ArrayIndexOutOfBoundsException in Editor#onDraw()2023-08-24T15:00:04ZakwizgranArrayIndexOutOfBoundsException in Editor#onDraw()This looks like it's most likely a platform bug.
* Android version: 8.1.0
* Phone model: Samsung SM-A260F (a2coreltejx)
* Briar version: 1.5.4 (7d76171)
Stacktrace:
```
java.lang.ArrayIndexOutOfBoundsException: length=3; index=-1
...This looks like it's most likely a platform bug.
* Android version: 8.1.0
* Phone model: Samsung SM-A260F (a2coreltejx)
* Briar version: 1.5.4 (7d76171)
Stacktrace:
```
java.lang.ArrayIndexOutOfBoundsException: length=3; index=-1
at android.text.DynamicLayout.getBlockIndex(DynamicLayout.java:648)
at android.widget.Editor.drawHardwareAccelerated(Editor.java:1729)
at android.widget.Editor.onDraw(Editor.java:1698)
at android.widget.TextView.onDraw(TextView.java:6973)
at android.view.View.draw(View.java:19215)
at android.view.View.updateDisplayListIfDirty(View.java:18162)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4231)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4211)
at android.view.View.updateDisplayListIfDirty(View.java:18121)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4231)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4211)
at android.view.View.updateDisplayListIfDirty(View.java:18121)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4231)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4211)
at android.view.View.updateDisplayListIfDirty(View.java:18121)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4231)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4211)
at android.view.View.updateDisplayListIfDirty(View.java:18121)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4231)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4211)
at android.view.View.updateDisplayListIfDirty(View.java:18121)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4231)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4211)
at android.view.View.updateDisplayListIfDirty(View.java:18121)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4231)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4211)
at android.view.View.updateDisplayListIfDirty(View.java:18121)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4231)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4211)
at android.view.View.updateDisplayListIfDirty(View.java:18121)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4231)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4211)
at android.view.View.updateDisplayListIfDirty(View.java:18121)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4231)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4211)
at android.view.View.updateDisplayListIfDirty(View.java:18121)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:669)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:675)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:783)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:3050)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2864)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2417)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1429)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6823)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
at android.view.Choreographer.doCallbacks(Choreographer.java:723)
at android.view.Choreographer.doFrame(Choreographer.java:658)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6543)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:440)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:810)
```https://code.briarproject.org/briar/briar/-/issues/1647IllegalStateException when choosing attachments to send2023-08-24T14:33:28ZakwizgranIllegalStateException when choosing attachments to send* Android version: 7.1.1
* Phone model: BQ Aquarius X5 Plus
* Briar version: 1.1.9 (debug build, d7c9bf8)
* User feedback: "Crashed when selecting two pictures to send."
Stacktrace:
```
java.lang.RuntimeException: Failure delivering res...* Android version: 7.1.1
* Phone model: BQ Aquarius X5 Plus
* Briar version: 1.1.9 (debug build, d7c9bf8)
* User feedback: "Crashed when selecting two pictures to send."
Stacktrace:
```
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=13, result=-1, data=Intent { flg=0x43 clip={image/jpeg image/png image/gif U:content://com.android.providers.media.documents/document/image%3A87856 ...} }} to activity {org.briarproject.briar.android.debug/org.briarproject.briar.android.conversation.ConversationActivity}: java.lang.IllegalStateException
at android.app.ActivityThread.deliverResults(ActivityThread.java:4089)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4132)
at android.app.ActivityThread.-wrap20(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1533)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: java.lang.IllegalStateException
at org.briarproject.briar.android.attachment.AttachmentCreatorImpl.storeAttachments(AttachmentCreatorImpl.java:78)
at org.briarproject.briar.android.conversation.ConversationViewModel.storeAttachments(ConversationViewModel.java:206)
at org.briarproject.briar.android.view.TextAttachmentController.onNewUris(TextAttachmentController.java:185)
at org.briarproject.briar.android.view.TextAttachmentController.onImageReceived(TextAttachmentController.java:166)
at org.briarproject.briar.android.conversation.ConversationActivity.onActivityResult(ConversationActivity.java:304)
at android.app.Activity.dispatchActivityResult(Activity.java:6973)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4085)
... 9 more
java.lang.IllegalStateException
at org.briarproject.briar.android.attachment.AttachmentCreatorImpl.storeAttachments(AttachmentCreatorImpl.java:78)
at org.briarproject.briar.android.conversation.ConversationViewModel.storeAttachments(ConversationViewModel.java:206)
at org.briarproject.briar.android.view.TextAttachmentController.onNewUris(TextAttachmentController.java:185)
at org.briarproject.briar.android.view.TextAttachmentController.onImageReceived(TextAttachmentController.java:166)
at org.briarproject.briar.android.conversation.ConversationActivity.onActivityResult(ConversationActivity.java:304)
at android.app.Activity.dispatchActivityResult(Activity.java:6973)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4085)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4132)
at android.app.ActivityThread.-wrap20(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1533)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
```Android 1.3Torsten GroteTorsten Grotehttps://code.briarproject.org/briar/briar/-/issues/2433IllegalStateException when storing attachments2023-08-24T14:33:28ZakwizgranIllegalStateException when storing attachments* Android version: 9
* Phone model: Coolpad cp3648AT (full_cp3648at)
* Briar version: 1.4.11 (2aa39e4)
Stacktrace:
```
java.lang.IllegalStateException
at org.briarproject.briar.android.attachment.AttachmentCreatorImpl.storeAttac...* Android version: 9
* Phone model: Coolpad cp3648AT (full_cp3648at)
* Briar version: 1.4.11 (2aa39e4)
Stacktrace:
```
java.lang.IllegalStateException
at org.briarproject.briar.android.attachment.AttachmentCreatorImpl.storeAttachments(AttachmentCreatorImpl.java:83)
at org.briarproject.briar.android.conversation.ConversationViewModel.storeAttachments(ConversationViewModel.java:277)
at org.briarproject.briar.android.view.TextAttachmentController.onNewUris(TextAttachmentController.java:178)
at org.briarproject.briar.android.view.TextAttachmentController.onImageReceived(TextAttachmentController.java:160)
at org.briarproject.briar.android.conversation.ConversationActivity.onImagesChosen(ConversationActivity.java:797)
at org.briarproject.briar.android.conversation.ConversationActivity.$r8$lambda$Yw3fl1gK9EIeGMTHPyKDfNfoOkI(Unknown Source:0)
at org.briarproject.briar.android.conversation.ConversationActivity$$ExternalSyntheticLambda3.onActivityResult(Unknown Source:4)
at androidx.activity.result.ActivityResultRegistry$1.onStateChanged(ActivityResultRegistry.java:148)
at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:354)
at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:265)
at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:307)
at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:148)
at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:134)
at androidx.lifecycle.ReportFragment.dispatch(ReportFragment.java:68)
at androidx.lifecycle.ReportFragment.dispatch(ReportFragment.java:144)
at androidx.lifecycle.ReportFragment.onStart(ReportFragment.java:109)
at android.app.Fragment.performStart(Fragment.java:2548)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1334)
at android.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1576)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1637)
at android.app.FragmentManagerImpl.dispatchMoveToState(FragmentManager.java:3046)
at android.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:3003)
at android.app.FragmentController.dispatchStart(FragmentController.java:193)
at android.app.Activity.performStart(Activity.java:7165)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:2968)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1836)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6704)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:911)
```
Edited log:
```
01-12 20:00:06.622 I/ValidationManagerImpl: Validating message for org.briarproject.briar.messaging
01-12 20:00:06.831 I/ValidationManagerImpl: Delivering message for org.briarproject.briar.messaging
01-12 20:00:06.837 I/AutoDeleteManagerImpl: Mirroring auto-delete timer -1
01-12 20:00:06.940 I/ContactsViewModel: Conversation message tracked, updating item
01-12 20:00:11.836 I/BaseActivity: Destroying NavDrawerActivity
01-12 20:00:11.954 I/BaseActivity: Creating ConversationActivity
01-12 20:00:12.158 I/BaseActivity: Starting ConversationActivity
01-12 20:00:12.163 I/BaseActivity: Resuming ConversationActivity
01-12 20:00:12.233 I/ConversationViewModel: PrivateMessageFormat loaded: TEXT_IMAGES_AUTO_DELETE
01-12 20:00:25.255 I/ConversationActivity: Eagerly loading text for latest message
01-12 20:00:31.004 W/AttachmentRetrieverImpl: org.briarproject.bramble.api.db.MessageDeletedException
org.briarproject.bramble.api.db.MessageDeletedException
at org.briarproject.bramble.db.JdbcDatabase.getMessage(JdbcDatabase.java:1860)
at org.briarproject.bramble.db.JdbcDatabase.getMessage(JdbcDatabase.java:100)
at org.briarproject.bramble.db.DatabaseComponentImpl.getMessage(DatabaseComponentImpl.java:600)
at org.briarproject.bramble.client.ClientHelperImpl.getMessage(ClientHelperImpl.java:146)
at org.briarproject.briar.attachment.AttachmentReaderImpl.getAttachment(AttachmentReaderImpl.java:46)
at org.briarproject.briar.attachment.AttachmentReaderImpl.lambda$getAttachment$0(AttachmentReaderImpl.java:38)
at org.briarproject.briar.attachment.AttachmentReaderImpl.$r8$lambda$eCXQ8CbNfD8FSDzXT4wNgsUZiKY(Unknown Source:0)
at org.briarproject.briar.attachment.AttachmentReaderImpl$$ExternalSyntheticLambda0.call(Unknown Source:4)
at org.briarproject.bramble.db.DatabaseComponentImpl.transactionWithResult(DatabaseComponentImpl.java:212)
at org.briarproject.briar.attachment.AttachmentReaderImpl.getAttachment(AttachmentReaderImpl.java:38)
at org.briarproject.briar.android.attachment.AttachmentRetrieverImpl.loadAttachmentItem(AttachmentRetrieverImpl.java:189)
at org.briarproject.briar.android.attachment.AttachmentRetrieverImpl.lambda$getAttachmentItems$0(AttachmentRetrieverImpl.java:129)
at org.briarproject.briar.android.attachment.AttachmentRetrieverImpl.$r8$lambda$IddQB3KJutztIvZ-pFcOKTYs1rM(Unknown Source:0)
at org.briarproject.briar.android.attachment.AttachmentRetrieverImpl$$ExternalSyntheticLambda0.run(Unknown Source:8)
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:764)
01-12 20:00:32.000 W/AttachmentRetrieverImpl: org.briarproject.bramble.api.db.MessageDeletedException
org.briarproject.bramble.api.db.MessageDeletedException
at org.briarproject.bramble.db.JdbcDatabase.getMessage(JdbcDatabase.java:1860)
at org.briarproject.bramble.db.JdbcDatabase.getMessage(JdbcDatabase.java:100)
at org.briarproject.bramble.db.DatabaseComponentImpl.getMessage(DatabaseComponentImpl.java:600)
at org.briarproject.bramble.client.ClientHelperImpl.getMessage(ClientHelperImpl.java:146)
at org.briarproject.briar.attachment.AttachmentReaderImpl.getAttachment(AttachmentReaderImpl.java:46)
at org.briarproject.briar.attachment.AttachmentReaderImpl.lambda$getAttachment$0(AttachmentReaderImpl.java:38)
at org.briarproject.briar.attachment.AttachmentReaderImpl.$r8$lambda$eCXQ8CbNfD8FSDzXT4wNgsUZiKY(Unknown Source:0)
at org.briarproject.briar.attachment.AttachmentReaderImpl$$ExternalSyntheticLambda0.call(Unknown Source:4)
at org.briarproject.bramble.db.DatabaseComponentImpl.transactionWithResult(DatabaseComponentImpl.java:212)
at org.briarproject.briar.attachment.AttachmentReaderImpl.getAttachment(AttachmentReaderImpl.java:38)
at org.briarproject.briar.android.attachment.AttachmentRetrieverImpl.loadAttachmentItem(AttachmentRetrieverImpl.java:189)
at org.briarproject.briar.android.attachment.AttachmentRetrieverImpl.lambda$getAttachmentItems$0(AttachmentRetrieverImpl.java:129)
at org.briarproject.briar.android.attachment.AttachmentRetrieverImpl.$r8$lambda$IddQB3KJutztIvZ-pFcOKTYs1rM(Unknown Source:0)
at org.briarproject.briar.android.attachment.AttachmentRetrieverImpl$$ExternalSyntheticLambda0.run(Unknown Source:8)
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:764)
01-12 20:00:43.142 I/BaseActivity: Pausing ConversationActivity
01-12 20:00:43.192 I/BaseActivity: Stopping ConversationActivity
01-12 20:00:43.886 W/AttachmentRetrieverImpl: org.briarproject.bramble.api.db.MessageDeletedException
org.briarproject.bramble.api.db.MessageDeletedException
at org.briarproject.bramble.db.JdbcDatabase.getMessage(JdbcDatabase.java:1860)
at org.briarproject.bramble.db.JdbcDatabase.getMessage(JdbcDatabase.java:100)
at org.briarproject.bramble.db.DatabaseComponentImpl.getMessage(DatabaseComponentImpl.java:600)
at org.briarproject.bramble.client.ClientHelperImpl.getMessage(ClientHelperImpl.java:146)
at org.briarproject.briar.attachment.AttachmentReaderImpl.getAttachment(AttachmentReaderImpl.java:46)
at org.briarproject.briar.attachment.AttachmentReaderImpl.lambda$getAttachment$0(AttachmentReaderImpl.java:38)
at org.briarproject.briar.attachment.AttachmentReaderImpl.$r8$lambda$eCXQ8CbNfD8FSDzXT4wNgsUZiKY(Unknown Source:0)
at org.briarproject.briar.attachment.AttachmentReaderImpl$$ExternalSyntheticLambda0.call(Unknown Source:4)
at org.briarproject.bramble.db.DatabaseComponentImpl.transactionWithResult(DatabaseComponentImpl.java:212)
at org.briarproject.briar.attachment.AttachmentReaderImpl.getAttachment(AttachmentReaderImpl.java:38)
at org.briarproject.briar.android.attachment.AttachmentRetrieverImpl.loadAttachmentItem(AttachmentRetrieverImpl.java:189)
at org.briarproject.briar.android.attachment.AttachmentRetrieverImpl.lambda$getAttachmentItems$0(AttachmentRetrieverImpl.java:129)
at org.briarproject.briar.android.attachment.AttachmentRetrieverImpl.$r8$lambda$IddQB3KJutztIvZ-pFcOKTYs1rM(Unknown Source:0)
at org.briarproject.briar.android.attachment.AttachmentRetrieverImpl$$ExternalSyntheticLambda0.run(Unknown Source:8)
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:764)
01-12 20:01:00.181 I/BaseActivity: Starting ConversationActivity
01-12 20:01:00.308 I/BaseActivity: Resuming ConversationActivity
01-12 20:01:07.726 I/AutoDeleteManagerImpl: Sending message with auto-delete timer -1
01-12 20:01:17.992 I/BaseActivity: Pausing ConversationActivity
01-12 20:01:18.633 I/BaseActivity: Stopping ConversationActivity
01-12 20:01:19.034 I/ConversationActivity: Eagerly loading text for latest message
01-12 20:01:19.041 I/ConversationActivity: Concurrent update, reloading
01-12 20:01:19.064 I/AutoDeleteManagerImpl: Sending message with auto-delete timer -1
01-12 20:01:23.296 I/BaseActivity: Starting ConversationActivity
01-12 20:01:23.335 I/BaseActivity: Resuming ConversationActivity
01-12 20:01:23.550 I/ImageCompressorImpl: Original image size: 720x1440
01-12 20:01:23.550 I/ImageCompressorImpl: Scaling attachment by factor of 2
01-12 20:01:23.784 I/ImageCompressorImpl: Compressed image to 32229 bytes, quality 70
01-12 20:01:25.507 I/BaseActivity: Pausing ConversationActivity
01-12 20:01:26.209 I/BaseActivity: Stopping ConversationActivity
01-12 20:01:27.381 I/BaseActivity: Starting ConversationActivity
01-12 20:01:27.383 I/BaseActivity: Resuming ConversationActivity
01-12 20:01:29.743 I/BaseActivity: Pausing ConversationActivity
01-12 20:01:30.425 I/BaseActivity: Stopping ConversationActivity
01-12 20:01:30.751 I/BaseActivity: Starting ConversationActivity
01-12 20:01:30.756 W/AttachmentCreatorImpl: Task already exists!
01-12 20:01:30.756 W/AttachmentCreatorImpl: Result already exists!
01-12 20:01:30.756 W/AttachmentCreatorImpl: Uris available: [content://com.android.providers.media.documents/document/image%3A10277]
```
This looks similar to #1647.Android 1.4https://code.briarproject.org/briar/briar/-/issues/1898OOM error at startup2023-08-24T14:06:26ZakwizgranOOM error at startupI'm opening a new ticket for this because it doesn't seem to have the same cause as #1607.
* Android version: 9
* Phone model: Motorola Moto Z4 (foles)
* Briar version: 1.2.7 (eb562f8)
* System memory: 3629 MiB total, 1421 MiB free, 291...I'm opening a new ticket for this because it doesn't seem to have the same cause as #1607.
* Android version: 9
* Phone model: Motorola Moto Z4 (foles)
* Briar version: 1.2.7 (eb562f8)
* System memory: 3629 MiB total, 1421 MiB free, 291 MiB threshold
* VM memory: 6 MiB allocated, 3 MiB free, 128 MiB maximum
Stacktrace:
```
java.lang.OutOfMemoryError: OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack trace available
```
Log:
```
05-07 02:51:43.754 I/BriarApplicationImpl: Created
05-07 02:51:43.769 I/CryptoComponentImpl: Default SecureRandom: AndroidOpenSSL SHA1PRNG
05-07 02:51:43.889 I/CryptoComponentImpl: Installed SecureRandom: UnixPRNG SHA1PRNG
05-07 02:51:44.047 I/LifecycleManagerImpl: Registering executor TimeLoggingExecutor
05-07 02:51:44.047 I/LifecycleManagerImpl: Registering executor ThreadPoolExecutor
05-07 02:51:44.047 I/LifecycleManagerImpl: Registering executor ScheduledThreadPoolExecutor
05-07 02:51:44.047 I/LifecycleManagerImpl: Registering service AndroidNetworkManager
05-07 02:51:44.048 I/LifecycleManagerImpl: Registering service AndroidBatteryManager
05-07 02:51:44.048 I/LifecycleManagerImpl: Registering service KeyManagerImpl
05-07 02:51:44.049 I/LifecycleManagerImpl: Registering open database hook IdentityManagerImpl
05-07 02:51:44.049 I/LifecycleManagerImpl: Registering executor TimeLoggingExecutor
05-07 02:51:44.057 I/LifecycleManagerImpl: Registering service ValidationManagerImpl
05-07 02:51:44.059 I/LifecycleManagerImpl: Registering open database hook ClientVersioningManagerImpl
05-07 02:51:44.059 I/LifecycleManagerImpl: Registering service ClientVersioningManagerImpl
05-07 02:51:44.060 I/LifecycleManagerImpl: Registering open database hook TransportPropertyManagerImpl
05-07 02:51:44.061 I/LifecycleManagerImpl: Registering service PluginManagerImpl
05-07 02:51:44.061 I/LifecycleManagerImpl: Registering service RendezvousPollerImpl
05-07 02:51:44.065 I/LifecycleManagerImpl: Registering open database hook BlogManagerImpl
05-07 02:51:44.067 I/LifecycleManagerImpl: Registering open database hook FeedManagerImpl
05-07 02:51:44.072 I/LifecycleManagerImpl: Registering open database hook GroupInvitationManagerImpl
05-07 02:51:44.073 I/LifecycleManagerImpl: Registering open database hook MessagingManagerImpl
05-07 02:51:44.076 I/LifecycleManagerImpl: Registering open database hook ForumSharingManagerImpl
05-07 02:51:44.077 I/LifecycleManagerImpl: Registering open database hook BlogSharingManagerImpl
05-07 02:51:44.080 I/LifecycleManagerImpl: Registering open database hook IntroductionManagerImpl
05-07 02:51:44.081 I/LifecycleManagerImpl: Registering service AndroidNotificationManagerImpl
05-07 02:51:44.082 I/LifecycleManagerImpl: Registering service ScreenFilterMonitorImpl
05-07 02:51:44.082 I/LifecycleManagerImpl: Registering service NetworkUsageLogger
05-07 02:51:44.082 I/LifecycleManagerImpl: Registering service DozeWatchdogImpl
05-07 02:51:44.085 I/LifecycleManagerImpl: Registering service LockManagerImpl
05-07 02:51:44.086 I/LifecycleManagerImpl: Registering open database hook RecentEmojiImpl
05-07 02:51:44.209 I/BaseActivity: Starting SplashScreenActivity
05-07 02:51:44.868 I/BaseActivity: Starting NavDrawerActivity
05-07 02:51:44.915 I/AccountManagerImpl: Found database key in primary file
05-07 02:51:44.917 I/BaseActivity: Starting StartupActivity
05-07 02:51:46.391 I/BaseActivity: Stopping NavDrawerActivity
05-07 02:51:46.400 I/BaseActivity: Stopping SplashScreenActivity
05-07 02:51:56.059 I/AccountManagerImpl: Found database key in primary file
```
Looks like the app threw an OOM while showing the password screen, with only 6 MB of 128 MB allocated. :shrug:Android 1.4https://code.briarproject.org/briar/briar/-/issues/2418"Signing out" progress screen is no longer shown when relaunching quickly aft...2023-08-08T01:50:09Zakwizgran"Signing out" progress screen is no longer shown when relaunching quickly after signing outWhen the app was relaunched quickly after signing out, we used to show a progress screen with a "signing out" message to make it clear that the user's previous action was still being processed. But now when I relaunch the app after signi...When the app was relaunched quickly after signing out, we used to show a progress screen with a "signing out" message to make it clear that the user's previous action was still being processed. But now when I relaunch the app after signing out, the UI immediately closes again without letting me see the progress screen. This can happen several times before shutdown completes, so it's not just a race between relaunching the app and shutdown completing.
Tested on Android 13 (CalyxOS 4.6.1).https://code.briarproject.org/briar/briar/-/issues/2440Biometric login as an additional authentication method2023-07-31T16:12:24ZPatrick MaydellBiometric login as an additional authentication methodSometimes the briar app logs out and I have to enter the password again to unlock the database. Therefore it would be nice to have an additional authentication method like the biometric fingerprint to unlock briar's database by using And...Sometimes the briar app logs out and I have to enter the password again to unlock the database. Therefore it would be nice to have an additional authentication method like the biometric fingerprint to unlock briar's database by using Android's Biometric library.
https://developer.android.com/codelabs/biometric-login
I would like to try to commit this functionality to briar if you generally think this feature would be nice to have.https://code.briarproject.org/briar/briar/-/issues/2212Comply with Google emoji policy2023-07-31T15:02:31ZakwizgranComply with Google emoji policyGoogle has created a new policy that requires apps to support the latest emoji version within four months of its release.
https://support.google.com/googleplay/android-developer/answer/11190649#emoji_preview
To do this, we may need to ...Google has created a new policy that requires apps to support the latest emoji version within four months of its release.
https://support.google.com/googleplay/android-developer/answer/11190649#emoji_preview
To do this, we may need to replace our current emoji implementation with Google's emoji2 library, which can be used directly or via AppCompat.
https://developer.android.com/guide/topics/ui/look-and-feel/emoji2
By default this uses a downloadable font and requires a downloadable font provider such as Google Play Services. In order to work offline, avoid depending on Play Services and protect users' privacy, we would need to bundle the 10 MB emoji font in our APK.
https://developer.android.com/guide/topics/ui/look-and-feel/emoji2#support-bundled-fonts
The policy becomes effective on 2 February 2022.https://code.briarproject.org/briar/briar/-/issues/1671Adding contacts via acoustic modem2023-07-19T06:14:53ZtaggbuskeAdding contacts via acoustic modemI have noticed a lot of new users are put off by Bluetooth technically requiring location permissions. Asking for temporary access to microphone + speaker might be less paranoia-inducing.
Something like FSK running at a moderate rate co...I have noticed a lot of new users are put off by Bluetooth technically requiring location permissions. Asking for temporary access to microphone + speaker might be less paranoia-inducing.
Something like FSK running at a moderate rate could be used. There's plenty of software modems out there. Direwolf (https://github.com/wb2osz/direwolf) has really good implementations of Bell 103 and Bell 202 that could be ported to Java.
I am aware this is an esoteric solution, but I thought I should throw it out there 🙂
Related: #1645, #261, maybe #31https://code.briarproject.org/briar/briar/-/issues/1335Delete account without signing out2023-07-11T10:11:01ZakwizgranDelete account without signing outA user asked for the ability to delete their account in an emergency without signing out and using the "forgot password" button.A user asked for the ability to delete their account in an emergency without signing out and using the "forgot password" button.https://code.briarproject.org/briar/briar/-/issues/2438Incognito keyboard disables voice typing in Gboard2023-07-04T15:12:34ZakwizgranIncognito keyboard disables voice typing in GboardBriar uses the "no personalized learning" flag (incognito keyboard) for all text input. A user reported that this prevents them from using voice typing with Gboard.
We should probably provide a setting for this, as some users need voice...Briar uses the "no personalized learning" flag (incognito keyboard) for all text input. A user reported that this prevents them from using voice typing with Gboard.
We should probably provide a setting for this, as some users need voice typing for accessibility.https://code.briarproject.org/briar/briar/-/issues/2266Check for API/behaviour changes in Android 13 that could affect Briar2023-07-03T11:21:13ZTorsten GroteCheck for API/behaviour changes in Android 13 that could affect Briar* https://developer.android.com/about/versions/13/behavior-changes-13
* https://blog.esper.io/android-13-deep-dive/
* https://commonsware.com/blog/2022/02/12/random-musings-android-13-dp1.html
* https://commonsware.com/blog/2022/03/19/ra...* https://developer.android.com/about/versions/13/behavior-changes-13
* https://blog.esper.io/android-13-deep-dive/
* https://commonsware.com/blog/2022/02/12/random-musings-android-13-dp1.html
* https://commonsware.com/blog/2022/03/19/random-musings-android-13-dp2.html
Changes that may affect us:
* [Low power standby](https://developer.android.com/reference/android/os/PowerManager.html#isLowPowerStandbyEnabled()) is a new power saving mode (apparently distinct from doze, light doze and power save mode) in which apps with foreground services lose network access and their wake locks are ignored. It's not clear whether doze exemption affects this mode. We should look for ADB commands that can be used to test this mode
* [Light idle mode](https://developer.android.com/reference/android/os/PowerManager#isDeviceLightIdleMode()) has also been added to the PowerManager API, although this may just be exposing the "light doze" mode that was [added in Android 7](https://developer.android.com/about/versions/nougat/android-7.0-changes#doze)
* [Apps are placed in the "restricted" app standby bucket](https://developer.android.com/about/versions/13/changes/battery#restricted-bucket) if they "drain a significant amount of device battery during a 24-hour period". This is likely to apply to Briar and Briar Mailbox. Apps are also placed in the "restricted" bucket if the user doesn't interact with them for 8 days. This is very likely to apply to Briar Mailbox and may also apply to Briar. Running a foreground service isn't enough to meet definition of "interaction" being used here. The [docs for app standby buckets](https://developer.android.com/topic/performance/appstandby#buckets) say "Apps that are on the Doze exemption list are exempted from the App Standby Bucket-based restrictions." We should test whether this remains true for the new restrictions. We should also add code to [log which bucket we're in](https://developer.android.com/reference/android/app/usage/UsageStatsManager#getAppStandbyBucket()) periodically
* [Apps need to ask permission to show notifications](https://developer.android.com/about/versions/13/changes/notification-permission) - if the app doesn't target API 33 then the permission prompt will be shown automatically when the notification channels are created, which in Briar's case happens after signing in
* The new [foreground services task manager](https://developer.android.com/about/versions/13/changes/fgs-manager) enables the user to stop foreground services. Stopping an app in this way is [roughly equivalent](https://developer.android.com/about/versions/13/changes/fgs-manager#compare-swipe-up-force-stop) to force-stopping the app, but just different enough to make sure we'll have to test both workflows. Related to #2010
* [New rules for intent filters](https://developer.android.com/about/versions/13/behavior-changes-13#security) could affect our use of intents to open other apps (such as manufacturer-specific power management apps). These rules apply if the app receiving the intent targets API 33 or higher, so it could take a while for any effects to be noticeable
Article: https://medium.com/androiddevelopers/making-sense-of-intent-filters-in-android-13-8f6656903dde
* We should check whether the [`RECEIVER_NOT_EXPORTED`](https://developer.android.com/reference/android/content/Context.html#RECEIVER_NOT_EXPORTED) flag is relevant to us (all our BroadcastReceivers are used for receiving system broadcasts)
* [`NEARBY_WIFI_DEVICES`](https://developer.android.com/reference/android/Manifest.permission#NEARBY_WIFI_DEVICES) permission - this replaces `ACCESS_FINE_LOCATION` for some wifi APIs. We should use the new permission and find out whether location services still need to be enabled for these APIs to work
* If the user places an app in the "restricted" state for background battery usage (which AFAICT is [unrelated](https://developer.android.com/topic/performance/power/power-details) to the "restricted" app standby bucket) then the app [can't run foreground services, schedule alarms or run jobs](https://developer.android.com/about/versions/13/changes/battery#restricted-background-battery-usage). If the app targets API 33 then it can't receive `ACTION_BOOT_COMPLETED` broadcasts either, which we use for the sign-in reminder
* [System notification for long-running foreground services](https://developer.android.com/about/versions/13/changes/battery#system-notification-long-running-fgs) ("APP is running in the background for a long time. Tap to review") - as CommonsWare says, the obvious response from developers is to add `FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK` or `FOREGROUND_SERVICE_TYPE_LOCATION`, and the obvious response from Google is to restrict those flags in the next update
* [System notification for excessive background battery usage](https://developer.android.com/about/versions/13/changes/battery#system-notification-battery-usage) - the docs say this notification will be shown after our foreground service finishes, ie after the user signs out, which may cause confusion
* I'm sure [TARE](https://blog.esper.io/android-13-deep-dive/#tare) will produce great value for users and won't just be the equivalent of adding a dice roll to every attempt to queue a job or schedule an alarm. We should keep it in mind when debugging alarm issues
* [Apps can release unused permissions](https://developer.android.com/about/versions/13/features#developer-downgradable-permissions) - this looks useful for privacy-conscious users but some care will be needed to integrate this into our app lifecycle, as the system kills the app asynchronously at some point after the API is called
* There's a [new AndroidX API for implementing in-app language pickers](https://developer.android.com/about/versions/13/features/app-languages#api-impl), which is great. The user can also pick a per-app language [through the system settings app](https://developer.android.com/about/versions/13/features/app-languages#app-language-settings), in which case "The list of available languages might not reflect the languages that your app supports". This will need testing
* There's a new API for [opting out of screenshots in the recent apps list](https://developer.android.com/reference/android/app/Activity.html#setRecentsScreenshotEnabled(boolean)) without preventing the user from taking screenshots. This may be useful if it doesn't open some other horrendous information leak
* [SystemClock#currentNetworkTimeClock()](https://developer.android.com/reference/android/os/SystemClock.html#currentNetworkTimeClock()) may be useful for diagnosing whether clock sync issues are due to misconfiguration or [NTP tampering](https://gitlab.torproject.org/tpo/core/tor/-/issues/26359)
* Apps with the `ACCESS_FINE_LOCATION` permission are [exempt from most of the power management changes in Android 13](https://developer.android.com/about/versions/13/changes/battery#exemptions), as are media players that are actively playing media. Perhaps Google thinks media players and navigation apps (or exercise trackers?) should be allowed to run in the background, which would be consistent with the apparent intent of previous loopholesTorsten GroteTorsten Grotehttps://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/2437Use `SystemClock#currentNetworkTimeClock()` to diagnose clock sync isses2023-06-28T13:56:25ZTorsten GroteUse `SystemClock#currentNetworkTimeClock()` to diagnose clock sync isses`SystemClock#currentNetworkTimeClock()` may be useful for diagnosing whether clock sync issues are due to misconfiguration or NTP tampering.`SystemClock#currentNetworkTimeClock()` may be useful for diagnosing whether clock sync issues are due to misconfiguration or NTP tampering.https://code.briarproject.org/briar/briar/-/issues/2221Retire support for Android 42023-06-19T14:03:17ZakwizgranRetire support for Android 4We'll eventually need to drop support for Android 4 in order to be able to upgrade OkHttp (#2156). I don't think we should just raise our minSdkVersion and leave Android 4 users running an out-of-date version of Briar indefinitely. Inste...We'll eventually need to drop support for Android 4 in order to be able to upgrade OkHttp (#2156). I don't think we should just raise our minSdkVersion and leave Android 4 users running an out-of-date version of Briar indefinitely. Instead, we should set an expiry date and warn users that the app will stop working at that date, like we do with debug builds.
We should define a retirement period that ends at the expiry date, and release the following changes before the start of the retirement period, allowing enough time for most users to upgrade before the period starts:
* At the start of the retirement period, show a warning on Android 4 that Briar will stop working at the expiry date
* Refuse to start the app on Android 4 beyond the expiry date
The changes can be based on the existing code for expiring debug builds.
When the retirement period ends we can raise our min API level to 21 and upgrade OkHttp (and perhaps the emoji library, which also requires API 21 for the latest version, unless we've already resolved #2212 by switching to AppCompat for emoji).
If we release the changes above by the end of 2021, allow six months for users to upgrade before the retirement period starts, and allow another six months for the retirement period, then we can drop support for Android 4 at the end of 2022. (We can do everything faster than that if necessary, but I don't see any urgency.)
*Update:*
With !1577 and !1578 merged to master, the warning will show up on Android 4 on 2022-07-31. Briar will refuse to start on Android 4 on 2023-01-31.MailboxTorsten GroteTorsten Grote2023-01-31https://code.briarproject.org/briar/briar/-/issues/2156Upgrade OkHttp to 3.14.x2023-06-19T14:02:33ZakwizgranUpgrade OkHttp to 3.14.xhttps://square.github.io/okhttp/changelog_3x/#version-3130
OkHttp 3.12.x will receive critical bug fixes until the end of 2021. Newer versions drop support for Android 4, so when we upgrade we'll either need to drop support for Android ...https://square.github.io/okhttp/changelog_3x/#version-3130
OkHttp 3.12.x will receive critical bug fixes until the end of 2021. Newer versions drop support for Android 4, so when we upgrade we'll either need to drop support for Android 4 or restrict features that use HTTP (RSS feeds, mailbox) to Android 5+.
According to Google Play, 0.5% of devices running Briar use Android 4.
Depends on #2221.MailboxTorsten GroteTorsten Grotehttps://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/1956Disguise/mask app2023-06-19T08:42:38ZCleopatraDisguise/mask appIt will be cool if there was a way to disguise the Briar app so that an adversary can't see the app icon on the user's device.
I like the way the [Umbrella app](https://github.com/securityfirst/Umbrella_android) does it. You can click ...It will be cool if there was a way to disguise the Briar app so that an adversary can't see the app icon on the user's device.
I like the way the [Umbrella app](https://github.com/securityfirst/Umbrella_android) does it. You can click a button to disguise the app as a calculator app. While in the calculator app, you shake the device to unmask the app.
![umbrella-mask](/uploads/d7f0d519ff301f4ea246ecab88c401c6/umbrella-mask.png)