briar issueshttps://code.briarproject.org/briar/briar/-/issues2018-11-27T10:00:12Zhttps://code.briarproject.org/briar/briar/-/issues/1460Introduction to existing contact shows wrong message2018-11-27T10:00:12ZakwizgranIntroduction to existing contact shows wrong messageWhen an existing contact is introduced, the text of the introduction request doesn't change as it should.When an existing contact is introduced, the text of the introduction request doesn't change as it should.Android 1.1akwizgranakwizgranhttps://code.briarproject.org/briar/briar/-/issues/1459IllegalArgumentException when activating keys2021-08-27T11:37:48ZakwizgranIllegalArgumentException when activating keys* Android version: 8.0
* Phone model: Huawei P8 Lite 2017 (HWPRA-H)
* Briar version: 1.1.1 and 1.1.3
Google Play has 12 occurrences of this crash across a three-day period: eight crashes on 1.1.3 and four on 1.1.1. The crashes on 1.1.3 ...* Android version: 8.0
* Phone model: Huawei P8 Lite 2017 (HWPRA-H)
* Briar version: 1.1.1 and 1.1.3
Google Play has 12 occurrences of this crash across a three-day period: eight crashes on 1.1.3 and four on 1.1.1. The crashes on 1.1.3 and 1.1.1 are interleaved in time, suggesting they come from two or more devices.
Stacktrace:
```
java.lang.IllegalArgumentException:
at org.briarproject.bramble.transport.TransportKeyManagerImpl.activateKeys (TransportKeyManagerImpl.java:206)
at org.briarproject.bramble.transport.KeyManagerImpl.activateKeys (KeyManagerImpl.java:123)
at org.briarproject.briar.introduction.IntroduceeProtocolEngine.onRemoteActivate (IntroduceeProtocolEngine.java:501)
at org.briarproject.briar.introduction.IntroduceeProtocolEngine.onActivateMessage (IntroduceeProtocolEngine.java:215)
at org.briarproject.briar.introduction.IntroduceeProtocolEngine.onActivateMessage (IntroduceeProtocolEngine.java:53)
at org.briarproject.briar.introduction.IntroductionManagerImpl.handleMessage (IntroductionManagerImpl.java:235)
at org.briarproject.briar.introduction.IntroductionManagerImpl.incomingMessage (IntroductionManagerImpl.java:193)
at org.briarproject.briar.client.BdfIncomingMessageHook.incomingMessage (BdfIncomingMessageHook.java:60)
at org.briarproject.bramble.sync.ValidationManagerImpl.deliverMessage (ValidationManagerImpl.java:334)
at org.briarproject.bramble.sync.ValidationManagerImpl.storeMessageContext (ValidationManagerImpl.java:295)
at org.briarproject.bramble.sync.ValidationManagerImpl.lambda$storeMessageContextAsync$3$ValidationManagerImpl (ValidationManagerImpl.java:259)
at org.briarproject.bramble.sync.ValidationManagerImpl$$Lambda$5.run (Unknown Source:10)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:636)
at java.lang.Thread.run (Thread.java:784)
```Android 1.3akwizgranakwizgranhttps://code.briarproject.org/briar/briar/-/issues/1456Adaptive icons2020-11-16T10:33:14ZakwizgranAdaptive iconsA user asked us to add support for [adaptive icons](https://www.androidcentral.com/adaptive-icons).A user asked us to add support for [adaptive icons](https://www.androidcentral.com/adaptive-icons).Android 1.2akwizgranakwizgranhttps://code.briarproject.org/briar/briar/-/issues/1455NPE when getting stream context2018-11-27T10:00:48ZakwizgranNPE when getting stream context* Android version: 8.1.0
* Phone model: Xiaomi Redmi Note 4 (lineage_mido)
* Briar version: 1.1.4 (d02b30e)
Stacktrace:
```
java.lang.NullPointerException
at org.briarproject.bramble.db.DatabaseComponentImpl.transactionWithResul...* Android version: 8.1.0
* Phone model: Xiaomi Redmi Note 4 (lineage_mido)
* Briar version: 1.1.4 (d02b30e)
Stacktrace:
```
java.lang.NullPointerException
at org.briarproject.bramble.db.DatabaseComponentImpl.transactionWithResult(DatabaseComponentImpl.java:187)
at org.briarproject.bramble.transport.KeyManagerImpl.getStreamContext(KeyManagerImpl.java:152)
at org.briarproject.bramble.plugin.ConnectionManagerImpl$ManageIncomingDuplexConnection.run(ConnectionManagerImpl.java:248)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
```Android 1.1akwizgranakwizgranhttps://code.briarproject.org/briar/briar/-/issues/1454ArrayIndexOutOfBoundsException in SettingsActivity2019-11-06T09:47:05ZakwizgranArrayIndexOutOfBoundsException in SettingsActivityI'm guessing this may be related to removing the system default option for the dark theme.
* Android version: 8.0.0
* Phone model: Samsung SM-G965F (star2ltexx)
* Briar version: 1.1.4
Stacktrace:
```
java.lang.ArrayIndexOutOfBoundsExce...I'm guessing this may be related to removing the system default option for the dark theme.
* Android version: 8.0.0
* Phone model: Samsung SM-G965F (star2ltexx)
* Briar version: 1.1.4
Stacktrace:
```
java.lang.ArrayIndexOutOfBoundsException: length=3; index=3
at android.support.v7.preference.ListPreference.getEntry(ListPreference.java:229)
at android.support.v7.preference.ListPreference.getSummary(ListPreference.java:174)
at android.support.v7.preference.Preference.onBindViewHolder(Preference.java:584)
at android.support.v7.preference.PreferenceGroupAdapter.onBindViewHolder(PreferenceGroupAdapter.java:381)
at android.support.v7.preference.PreferenceGroupAdapter.onBindViewHolder(PreferenceGroupAdapter.java:45)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823)
at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5752)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6019)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3641)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4194)
at android.view.View.layout(View.java:20822)
at android.view.ViewGroup.layout(ViewGroup.java:6401)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20822)
at android.view.ViewGroup.layout(ViewGroup.java:6401)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
at android.view.View.layout(View.java:20822)
at android.view.ViewGroup.layout(ViewGroup.java:6401)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20822)
at android.view.ViewGroup.layout(ViewGroup.java:6401)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20822)
at android.view.ViewGroup.layout(ViewGroup.java:6401)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20822)
at android.view.ViewGroup.layout(ViewGroup.java:6401)
at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:444)
at android.view.View.layout(View.java:20822)
at android.view.ViewGroup.layout(ViewGroup.java:6401)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20822)
at android.view.ViewGroup.layout(ViewGroup.java:6401)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20822)
at android.view.ViewGroup.layout(ViewGroup.java:6401)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20822)
at android.view.ViewGroup.layout(ViewGroup.java:6401)
at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:444)
at android.view.View.layout(View.java:20822)
at android.view.ViewGroup.layout(ViewGroup.java:6401)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20822)
at android.view.ViewGroup.layout(ViewGroup.java:6401)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
at android.view.View.layout(View.java:20822)
at android.view.ViewGroup.layout(ViewGroup.java:6401)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:944)
at android.view.View.layout(View.java:20822)
at android.view.ViewGroup.layout(ViewGroup.java:6401)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2948)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2635)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1779)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7810)
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:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
```Android 1.2Torsten GroteTorsten Grotehttps://code.briarproject.org/briar/briar/-/issues/1453the link to the Briar application on Google Play in the user manual is broken2018-11-27T09:59:45ZRoman Beslikme@beroal.in.uathe link to the Briar application on Google Play in the user manual is brokenIn the chapter "Installation". The error message is "URL not found".In the chapter "Installation". The error message is "URL not found".Android 1.1Roman Beslikme@beroal.in.uaRoman Beslikme@beroal.in.uahttps://code.briarproject.org/briar/briar/-/issues/1452Websocket Authentication2018-11-27T10:00:33ZTorsten GroteWebsocket AuthenticationDespite many (older) claims in the internet that you can establish websocket connections with basic auth, this doesn't seem to be true for javascript libraries running in a recent browser. I managed to do it in Python and assumed it will...Despite many (older) claims in the internet that you can establish websocket connections with basic auth, this doesn't seem to be true for javascript libraries running in a recent browser. I managed to do it in Python and assumed it will just work on browsers as well, but it seems that isn't the case. At least I haven't been able to make this work. The only thing we can send in the upgrade request from a browser is a list of protocols. In absence of a standardized authentication mechanism, there's people using this already to pass auth tokens. I confirmed that we can access this header on the server side and check if there's an auth token in it.
If we don't want that hacky (but easy) solution, I am afraid we need to get into the business of tracking each session's authentication state and require them to send a first message with the token before we start sending stuff to it. Maybe even terminate sessions that haven't authenticated after a timeout.Headless MVPTorsten GroteTorsten Grotehttps://code.briarproject.org/briar/briar/-/issues/1451"All in briar-headless" run configuration runs tests in other modules2018-11-07T17:47:51Zakwizgran"All in briar-headless" run configuration runs tests in other modulesThe "All in briar-headless" run configuration in Android Studio runs tests in other modules as well as briar-headless. It seems to be picking up JUnit 4 tests from all modules.The "All in briar-headless" run configuration in Android Studio runs tests in other modules as well as briar-headless. It seems to be picking up JUnit 4 tests from all modules.Android 1.1Torsten GroteTorsten Grotehttps://code.briarproject.org/briar/briar/-/issues/1450"All tests" run confguration doesn't run briar-android tests2018-11-27T10:00:04Zakwizgran"All tests" run confguration doesn't run briar-android testsThe "All tests" run configuration for Android Studio stops after running the briar-headless tests, so the briar-android tests aren't run.The "All tests" run configuration for Android Studio stops after running the briar-headless tests, so the briar-android tests aren't run.Android 1.1Torsten GroteTorsten Grotehttps://code.briarproject.org/briar/briar/-/issues/1449Why not migrate to v3 hidden Service address ?2018-11-07T15:09:55ZveraWhy not migrate to v3 hidden Service address ?Why does briar still generate only onion2 address even though the tor-android-binary can work with hidden service v3 now? https://code.briarproject.org/briar/briar/blob/master/bramble-core/src/main/java/org/briarproject/bramble/plugin/to...Why does briar still generate only onion2 address even though the tor-android-binary can work with hidden service v3 now? https://code.briarproject.org/briar/briar/blob/master/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java#L449
And I found the `NEW:BEST` in https://github.com/akwizgran/jtorctl/blob/master/net/freehaven/tor/control/TorControlConnection.java#L763 always generate RSA1024 key, and it should use `NEW:ED25519-V3` to generate ed25519 key.https://code.briarproject.org/briar/briar/-/issues/1446SecurityException when starting TestDataActivity with multiple Briar versions...2018-11-07T09:52:46ZakwizgranSecurityException when starting TestDataActivity with multiple Briar versions installed* Android version: 7.1.2
* Phone model: Motorola Moto G4 (lineage_athene)
* Briar version: 1.1.3 (93090f0, a debug build for testing the remote contact UX)
* Package name: org.briarproject.briar.android.debug.qr
Stack trace:
```
java.la...* Android version: 7.1.2
* Phone model: Motorola Moto G4 (lineage_athene)
* Briar version: 1.1.3 (93090f0, a debug build for testing the remote contact UX)
* Package name: org.briarproject.briar.android.debug.qr
Stack trace:
```
java.lang.SecurityException: Permission Denial: starting Intent { cmp=org.briarproject.briar.android.debug/org.briarproject.briar.android.test.TestDataActivity } from ProcessRecord{81ac00c 16789:org.briarproject.briar.android.debug.qr/u0a88} (pid=16789, uid=10088) not exported from uid 10087
at android.os.Parcel.readException(Parcel.java:1684)
at android.os.Parcel.readException(Parcel.java:1637)
at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3101)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1520)
at android.app.Activity.startActivityForResult(Activity.java:4229)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767)
at android.app.Activity.startActivityForResult(Activity.java:4187)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:754)
at android.app.Activity.startActivity(Activity.java:4526)
at android.app.Activity.startActivity(Activity.java:4494)
at android.content.ContextWrapper.startActivity(ContextWrapper.java:356)
at android.support.v7.preference.Preference.performClick(Preference.java:1180)
at android.support.v7.preference.Preference.performClick(Preference.java:1148)
at android.support.v7.preference.Preference$1.onClick(Preference.java:172)
at android.view.View.performClick(View.java:5637)
at android.view.View$PerformClick.run(View.java:22433)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6186)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
```
It looks like the intent is trying to open an activity that belongs to another version of Briar with a different package name (org.briarproject.briar.android.debug rather than org.briarproject.briar.android.debug.qr).
Although this was a debug build, I'm opening a ticket because it suggests something unexpected is happening in the way intents are handled - shouldn't they always be routed to the same app by default if a component is specified?Julian DehmJulian Dehmhttps://code.briarproject.org/briar/briar/-/issues/1445Change app lock password2023-02-06T14:50:21ZakwizgranChange app lock passwordA user asked for the ability to change the app lock password.A user asked for the ability to change the app lock password.https://code.briarproject.org/briar/briar/-/issues/1442Use v3 hidden service for crash reports and feedback2021-11-17T13:38:12ZakwizgranUse v3 hidden service for crash reports and feedbackVersions of Briar that support v3 hidden services should use a v3 service for crash reports and feedback. The old service can be retired eventually when most users have upgraded.
Creating this here rather than in https://code.briarproje...Versions of Briar that support v3 hidden services should use a v3 service for crash reports and feedback. The old service can be retired eventually when most users have upgraded.
Creating this here rather than in https://code.briarproject.org/briar/admin because it requires some small code changes.https://code.briarproject.org/briar/briar/-/issues/1438Implement UX for sending image attachments2020-11-16T10:11:30ZTorsten GroteImplement UX for sending image attachmentsWhen the message field is empty, there's an image icon to attach an image:
![Image_Attachment_Preselection](/uploads/cfaa2500f2d39f3b4e9c540d8ce46b88/Image_Attachment_Preselection.png)
Clicking it opens the system file selector:
![Ima...When the message field is empty, there's an image icon to attach an image:
![Image_Attachment_Preselection](/uploads/cfaa2500f2d39f3b4e9c540d8ce46b88/Image_Attachment_Preselection.png)
Clicking it opens the system file selector:
![Image_Attachment_Selection__System_](/uploads/97ad63158569fd22d7dc35b28453e6e4/Image_Attachment_Selection__System_.png)
If chosen image is shown as a preview, with an option to cancel the operation and to add an image caption:
![Confirmation](/uploads/621ca864593e0670f654ebdc832fbf48/Confirmation.png)
A seascape image shows a black/grey or color picked from the image on the sides:
![Confirmation_Tall_Image](/uploads/9ca88cffecbed1ee167835ba5efdd167/Confirmation_Tall_Image.png)
Subtask of #1237.Android 1.3Torsten GroteTorsten Grotehttps://code.briarproject.org/briar/briar/-/issues/1437List of recently used emoji is reversed2018-12-19T12:27:05ZTorsten GroteList of recently used emoji is reversedSo I've been eating my own dog food and always had issues finding my emoji until I realized that the emoji I had used last is always at the *end* of the list instead of at the *beginning* where I would expected it.So I've been eating my own dog food and always had issues finding my emoji until I realized that the emoji I had used last is always at the *end* of the list instead of at the *beginning* where I would expected it.Android 1.1Torsten GroteTorsten Grotehttps://code.briarproject.org/briar/briar/-/issues/1435[android] Migrate to HtmlCompat2020-08-14T11:32:43ZTorsten Grote[android] Migrate to HtmlCompat`UiUtils#getSpanned()` should use the new HtmlCompat.
https://commonsware.com/blog/2018/05/29/at-last-htmlcompat.html`UiUtils#getSpanned()` should use the new HtmlCompat.
https://commonsware.com/blog/2018/05/29/at-last-htmlcompat.htmlAndroid 1.2https://code.briarproject.org/briar/briar/-/issues/1434Implement backend for sending and receiving image attachments2019-11-12T13:45:59ZTorsten GroteImplement backend for sending and receiving image attachments### Receiving Image Attachments
Private message headers will include a list of attachments, and there will be a `MessagingManager` method for loading an attachment, which will include the attachment data as a `ByteBuffer`, later to be c...### Receiving Image Attachments
Private message headers will include a list of attachments, and there will be a `MessagingManager` method for loading an attachment, which will include the attachment data as a `ByteBuffer`, later to be converted to an `InputStream` if we find that loading images into ByteBuffers won't scale.
This implies that private message headers (in the sense of headers belonging to the private messaging client) will no longer correspond to the root class `PrivateMessageHeader` (from which all one-to-one headers currently inherit). The root class may need to be renamed, and some refactoring of the code that handles that hierarchy will be needed.
### Sending Image Attachments
*TODO*: MessagingManager API for creating local messages with optional attachmentsAndroid 1.3Torsten GroteTorsten Grotehttps://code.briarproject.org/briar/briar/-/issues/1433BdfReaderImpl has undefined behaviour for strings with illegal byte sequences2018-10-30T13:58:53ZakwizgranBdfReaderImpl has undefined behaviour for strings with illegal byte sequencesBdfReaderImpl uses the `String(byte[] bytes, int offset, int length, String charsetName)` constructor to convert UTF-8 byte arrays into strings. The [javadoc](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#String-byte:A-...BdfReaderImpl uses the `String(byte[] bytes, int offset, int length, String charsetName)` constructor to convert UTF-8 byte arrays into strings. The [javadoc](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#String-byte:A-int-int-java.lang.String-) says "The behavior of this constructor when the given bytes are not valid in the given charset is unspecified. The CharsetDecoder class should be used when more control over the decoding process is required."
We have a `StringUtils.toUtf8(byte[] bytes)` method with well-defined behaviour for this situation (illegal byte sequences are ignored), which we should probably be using here (and fuzz-testing).Android 1.1akwizgranakwizgranhttps://code.briarproject.org/briar/briar/-/issues/1428Log messages with level FINE aren't recorded in Android's system log2019-10-09T12:17:59ZakwizgranLog messages with level FINE aren't recorded in Android's system logLog messages with level FINE (such as timing measurements) aren't being recorded in Android's system log. These messages should be recorded on debug and beta builds, where the root logger's log level is set to FINE.
The messages are rec...Log messages with level FINE (such as timing measurements) aren't being recorded in Android's system log. These messages should be recorded on debug and beta builds, where the root logger's log level is set to FINE.
The messages are recorded in our own internal log, as expected, so they're included in crash reports and feedback from debug and beta builds.Android 1.1akwizgranakwizgranhttps://code.briarproject.org/briar/briar/-/issues/1427Keep a changelog2018-11-22T11:35:24ZRobert PollakKeep a changelogPlease keep a changelog, to make it easier for users to see what notable changes have been made, before installing a new Briar version.
F-Droid can then link to this changelog on the app page.Please keep a changelog, to make it easier for users to see what notable changes have been made, before installing a new Briar version.
F-Droid can then link to this changelog on the app page.Android 1.1akwizgranakwizgran