briar issueshttps://code.briarproject.org/briar/briar/-/issues2021-05-05T16:14:53Zhttps://code.briarproject.org/briar/briar/-/issues/1991Panic button preferences screen doesn't use material design switches on API 192021-05-05T16:14:53ZakwizgranPanic button preferences screen doesn't use material design switches on API 19![device-2021-03-26-154413](/uploads/0dc8a6696c9159263f6e2f24e695dd69/device-2021-03-26-154413.png)![device-2021-03-26-154413](/uploads/0dc8a6696c9159263f6e2f24e695dd69/device-2021-03-26-154413.png)Torsten GroteTorsten Grotehttps://code.briarproject.org/briar/briar/-/issues/1986Introducing same two contacts not possible after self-destructing non-answere...2021-05-05T16:14:52ZSebastianIntroducing same two contacts not possible after self-destructing non-answered response to one-sided declined introductionUnder certain circumstances, an introduction can fail and leave the introducer in a state where they are not able to retry the introduction.
Situation to reproduce this: A introduces B and C with self-destructing messages enabled among ...Under certain circumstances, an introduction can fail and leave the introducer in a state where they are not able to retry the introduction.
Situation to reproduce this: A introduces B and C with self-destructing messages enabled among A-B and A-C. At the time of the introduction being sent, C is offline to simulate a delay.
* introduction arrives at B
* 30 seconds pass
* C comes online
* introduction arrives at C
* another 30 seconds pass
* B didn't do anything, the introduction self-destructs, and auto-declines it
* A forwards the decline to C
* another 30 seconds pass
* C didn't do anything, the introduction self-destructs, but doesn't auto decline it because B already declined and the
introduction can no longer succeed
* C didn't send a response and hence A cannot try again to introduce B and C, although it should. Also C has no way to respond to the introduction any longer to fix that
Test instructions:
* Variant 1
* Let A introduce B and C, with self-destructing messages enabled among A and C but not necessarily enabled among A and B.
* let B **decline** the introduction
* observe that C receives the response from B
* let the timer of the introduction expire at C
* observe that A received a decline from both B and C
* try to let A introduce B and C again. Make sure it is possible to actually send a new introduction that arrives at B and C
* Variant 2
* Let A introduce B and C, with self-destructing messages enabled among A and C but not necessarily enabled among A and B.
* let B **accept** the introduction
* in this case, C does not receive any response from B
* let the timer of the introduction expire at C
* observe that A received an accept from B and a decline from C
* try to let A introduce B and C again. Make sure it is possible to actually send a new introduction that arrives at B and CSelf-destructing messagesIvanaIvana2021-01-31https://code.briarproject.org/briar/briar/-/issues/1964Colons in filename prevent image from being saved on API 21 emulator2021-05-05T16:14:51ZakwizgranColons in filename prevent image from being saved on API 21 emulatorWhen saving images we use the time and date to generate a default filename. Trying to save the image with this filename fails on the API 21 emulator because the colons in the filename are illegal for some filesystems (I assume the SD car...When saving images we use the time and date to generate a default filename. Trying to save the image with this filename fails on the API 21 emulator because the colons in the filename are illegal for some filesystems (I assume the SD card uses the FAT filesystem). Replacing the colons with dashes allows the image to be saved.Android 1.3https://code.briarproject.org/briar/briar/-/issues/870Blog Posts Sometimes Not Shown in the UI2021-05-05T16:13:19ZMegaloxBlog Posts Sometimes Not Shown in the UISometimes posts don't get displayed at all (there should be a single blog post in the gap):
![Blogs_missing_post](/uploads/85b793cfd26ee88984e406cd4e25cb0e/Blogs_missing_post.png)Sometimes posts don't get displayed at all (there should be a single blog post in the gap):
![Blogs_missing_post](/uploads/85b793cfd26ee88984e406cd4e25cb0e/Blogs_missing_post.png)https://code.briarproject.org/briar/briar/-/issues/1982RuntimeException: getParameters failed (empty parameters)2021-05-05T16:12:24ZakwizgranRuntimeException: getParameters failed (empty parameters)* Android version: 7.1
* Phone model: Google Nexus 7 (nakasig)
* Briar version: 1.2.16 (8a534b4)
Stacktrace:
```
getParameters failed (empty parameters)
java.lang.RuntimeException: getParameters failed (empty parameters)
at andr...* Android version: 7.1
* Phone model: Google Nexus 7 (nakasig)
* Briar version: 1.2.16 (8a534b4)
Stacktrace:
```
getParameters failed (empty parameters)
java.lang.RuntimeException: getParameters failed (empty parameters)
at android.hardware.Camera.native_getParameters(Native Method)
at android.hardware.Camera.getParameters(Camera.java:1896)
at org.briarproject.briar.android.keyagreement.CameraView.start(CameraView.java:130)
at org.briarproject.briar.android.keyagreement.KeyAgreementFragment.onStart(KeyAgreementFragment.java:149)
at androidx.fragment.app.Fragment.performStart(Fragment.java:2730)
at androidx.fragment.app.FragmentStateManager.start(FragmentStateManager.java:365)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1194)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:447)
at androidx.fragment.app.FragmentManager.executeOps(FragmentManager.java:2169)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1992)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1947)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
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:6148)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:778)
```
This is very similar to #998, but getParameters() is being called from a different place where apparently we forgot to catch the exception.
Also similar to #1523, but here the call is synchronous so catching the exception is an option.Android 1.2Torsten GroteTorsten Grotehttps://code.briarproject.org/briar/briar/-/issues/1979Crash when showing feedback details as feedback is being sent2021-05-05T16:11:10ZakwizgranCrash when showing feedback details as feedback is being sent* Android version: 11
* Phone model: Google Pixel 4a (sunfish)
* Briar version: 1.2.13 (5fdc7e7)
* User feedback: "I was about to send feedback and I selected include more data and send, while it was loading I pressed on 'show' to see th...* Android version: 11
* Phone model: Google Pixel 4a (sunfish)
* Briar version: 1.2.13 (5fdc7e7)
* User feedback: "I was about to send feedback and I selected include more data and send, while it was loading I pressed on 'show' to see the logs that will be sent, then it caused the crash prompt."
Stacktrace:
```
String resource ID #0x0
android.content.res.Resources$NotFoundException: String resource ID #0x0
at android.content.res.Resources.getText(Resources.java:444)
at android.widget.TextView.setText(TextView.java:6429)
at org.briarproject.briar.android.reporting.ReportDataAdapter$ReportDataViewHolder.bind(ReportDataAdapter.java:62)
at org.briarproject.briar.android.reporting.ReportDataAdapter.onBindViewHolder(ReportDataAdapter.java:38)
at org.briarproject.briar.android.reporting.ReportDataAdapter.onBindViewHolder(ReportDataAdapter.java:18)
at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2303)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1627)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3540)
at android.view.View.measure(View.java:25466)
at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:792)
at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measure(BasicMeasure.java:480)
at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measureChildren(BasicMeasure.java:134)
at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.solverMeasure(BasicMeasure.java:277)
at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:119)
at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1578)
at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1690)
at android.view.View.measure(View.java:25466)
at androidx.core.widget.NestedScrollView.measureChildWithMargins(NestedScrollView.java:1599)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at androidx.core.widget.NestedScrollView.onMeasure(NestedScrollView.java:585)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:146)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:747)
at android.view.View.measure(View.java:25466)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3402)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:2246)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2504)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1948)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8177)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:972)
at android.view.Choreographer.doCallbacks(Choreographer.java:796)
at android.view.Choreographer.doFrame(Choreographer.java:731)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7660)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
```
Log not available due to #1917.Android 1.2IvanaIvanahttps://code.briarproject.org/briar/briar/-/issues/1957All conversation messages are marked as read via messaging manager2021-05-05T16:08:47ZakwizgranAll conversation messages are marked as read via messaging managerThe setReadFlag() method is declared in the ConversationClient interface, but only MessagingManagerImpl's implementation of the method is used (except for one integration test).
If clients don't need their own implementations, the metho...The setReadFlag() method is declared in the ConversationClient interface, but only MessagingManagerImpl's implementation of the method is used (except for one integration test).
If clients don't need their own implementations, the method could be moved to the MessagingManager or ConversationManager interface, and the unused implementation in ConversationClientImpl could be removed.
On the other hand, if clients *do* need their own implementations then the implementation in ConversationClientImpl should be updated and we should make sure that ConversationViewModel and (eventually) MessagingControllerImpl call the right client for each message.
Test instructions:
* repeat tests from !1389Self-destructing messagesIvanaIvana2021-01-31https://code.briarproject.org/briar/briar/-/issues/1872Finish migrating KeyAgreementActivity to ViewModel2021-05-05T16:08:47ZTorsten GroteFinish migrating KeyAgreementActivity to ViewModelThe `KeyAgreementActivity` is abstract and only implemented by `ContactExchangeActivity`. See if both can be merged and more logic moved into `ContactExchangeViewModel`.
`KeyAgreementFragment` is doing lots of work and interactions with...The `KeyAgreementActivity` is abstract and only implemented by `ContactExchangeActivity`. See if both can be merged and more logic moved into `ContactExchangeViewModel`.
`KeyAgreementFragment` is doing lots of work and interactions with briar-core. This should also be moved into the ViewModel.
Subtask of #1823.Adapt to changes in the Android platformIvanaIvana2021-04-30https://code.briarproject.org/briar/briar/-/issues/1871Introduce ViewModel for IntroductionActivity (and ContactChooserFragment)2021-05-05T16:08:46ZTorsten GroteIntroduce ViewModel for IntroductionActivity (and ContactChooserFragment)The IntroductionActivity and its two fragments do lots of work on the UI level, this should be migrated to a ViewModel scoped to the activity that both fragments also access.
Subtask of #1823.
Test instructions:
1. Check that contact ...The IntroductionActivity and its two fragments do lots of work on the UI level, this should be migrated to a ViewModel scoped to the activity that both fragments also access.
Subtask of #1823.
Test instructions:
1. Check that contact list used displays correctly
* Go into a conversation
* menu → make introduction
* check that list does not contain the contact you're introducing
2. Check that contact list used updates properly
* On some device (A) repeat steps from 1.
* While the contact selection list is open: use a different device (B) and sent a message to (A). Make sure the number of unread messages displayed on (A) updates and also the contact moves up to the top as it now is the contact with the last recent message
3. Check that selecting a contact works
* Repeat steps from 1.
* select a contact and check that the next screen show the expected contacts
4. Make sure going back to contact selection and repeatedly selecting contacts works as expected
* Repeat steps from 3.
* Navigate back to the list of contacts to introduce your contact to
* Select a different contact than before, check that the next screen show the contact selected the second time
* Just to be sure, try again with a third contact
5. Check screen rotation doesn't break anything
* Repeat steps from 4.
* During navigation, rotate device at different times during the processAdapt to changes in the Android platformIvanaIvana2021-04-30https://code.briarproject.org/briar/briar/-/issues/1894Introduce ViewModel for RssFeed*Activity2021-05-05T16:08:09ZTorsten GroteIntroduce ViewModel for RssFeed*ActivityThere's `RssFeedManageActivity` and `RssFeedImportActivity`. Maybe one of them or both can be turned into a fragment and share the same ViewModel.
Subtask of #1823.There's `RssFeedManageActivity` and `RssFeedImportActivity`. Maybe one of them or both can be turned into a fragment and share the same ViewModel.
Subtask of #1823.Adapt to changes in the Android platformDaniel LublinDaniel Lublin2021-04-30https://code.briarproject.org/briar/briar/-/issues/1827Raise target API level to 302021-05-05T16:08:09ZakwizgranRaise target API level to 30Adapt to changes in the Android platform2021-04-30https://code.briarproject.org/briar/briar/-/issues/1824Adapt to power management restrictions2021-04-30T13:42:29ZakwizgranAdapt to power management restrictionsAdapt to changes in the Android platform2021-04-30https://code.briarproject.org/briar/briar/-/issues/1962Implement backend of "Connect via Bluetooth" feature2021-04-27T12:31:32ZTorsten GroteImplement backend of "Connect via Bluetooth" featureProvide the backend functionality for: #1961
A couple of options there:
* we can try to connect to a specific contact without closing any existing connections (no prioritisation), which is what we'd usually do when polling
* or we can ...Provide the backend functionality for: #1961
A couple of options there:
* we can try to connect to a specific contact without closing any existing connections (no prioritisation), which is what we'd usually do when polling
* or we can close other connections first to give the new connection the best chance of succeeding
Maybe we should defer this question until we've experimented a bit. We already have a mechanism for closing connections so we know it's something that could be added later if needed.Adapt to changes in the Android platformDaniel LublinDaniel Lublin2021-04-30https://code.briarproject.org/briar/briar/-/issues/1891Migrate SharingController to ViewModel2021-04-26T12:53:15ZTorsten GroteMigrate SharingController to ViewModelUsed by blogs and forums.Used by blogs and forums.Adapt to changes in the Android platformTorsten GroteTorsten Grote2021-04-30https://code.briarproject.org/briar/briar/-/issues/1960Design "Connect via Bluetooth" feature2021-04-26T12:52:47ZTorsten GroteDesign "Connect via Bluetooth" featureSub-task of #1821Sub-task of #1821Adapt to changes in the Android platformTorsten GroteTorsten Grote2021-04-30https://code.briarproject.org/briar/briar/-/issues/1905Use ContactListViewModel in ContactChooserFragment and IntroductionActivity2021-04-26T12:51:23ZSebastianUse ContactListViewModel in ContactChooserFragment and IntroductionActivity!1341 introduced the ContactListViewModel which should be reusable by ContactChooserFragment and IntroductionActivity!1341 introduced the ContactListViewModel which should be reusable by ContactChooserFragment and IntroductionActivityAdapt to changes in the Android platformSebastianSebastian2021-04-30https://code.briarproject.org/briar/briar/-/issues/1942Profile picture isn't shown if settings screen is recreated after process was...2021-04-26T12:13:43ZakwizgranProfile picture isn't shown if settings screen is recreated after process was killedSteps to reproduce:
* Open the Briar settings screen
* Leave Briar running in the foreground and turn the screen off
* Use the ADB shell to kill the Briar process
* Turn the screen back on
* The Briar password prompt is shown
* Sign into...Steps to reproduce:
* Open the Briar settings screen
* Leave Briar running in the foreground and turn the screen off
* Use the ADB shell to kill the Briar process
* Turn the screen back on
* The Briar password prompt is shown
* Sign into Briar
* The settings screen is shown
* The profile picture isn't loaded
![device-2021-02-18-143535](/uploads/264e108ebbe0be0b9acb706e3080bfe1/device-2021-02-18-143535.png)
Tested on the Nexus 5X (Android 8.1.0).Adapt to changes in the Android platformakwizgranakwizgran2021-04-30https://code.briarproject.org/briar/briar/-/issues/1973Make use of DbViewModel#handleException2021-04-26T12:13:14ZTorsten GroteMake use of DbViewModel#handleException!1342 is introducing `DbViewModel#handleException()` that we should also use in other ViewModel code where we currently do nothing more than logging the exception.!1342 is introducing `DbViewModel#handleException()` that we should also use in other ViewModel code where we currently do nothing more than logging the exception.Adapt to changes in the Android platformSebastianSebastian2021-04-30https://code.briarproject.org/briar/briar/-/issues/1972Unable to add nearby contact when location services disabled2021-04-26T12:12:47ZDaniel LublinUnable to add nearby contact when location services disabled2 Android 10 devices trying to add each other. Location permissions has been granted, but actual location service were later disabled in the system. Adding times out, and I get the "Could not connect to your contact" screen.
Enabling lo...2 Android 10 devices trying to add each other. Location permissions has been granted, but actual location service were later disabled in the system. Adding times out, and I get the "Could not connect to your contact" screen.
Enabling location service on both devices and trying again is successful.Adapt to changes in the Android platformIvanaIvana2021-04-30https://code.briarproject.org/briar/briar/-/issues/1883Prepare for Resource IDs becoming non-final in Android Gradle Plugin version 5.02021-04-26T12:12:21ZTorsten GrotePrepare for Resource IDs becoming non-final in Android Gradle Plugin version 5.0Adapt to changes in the Android platformSebastianSebastian2021-04-30