briar issueshttps://code.briarproject.org/briar/briar/-/issues2017-12-18T07:40:36Zhttps://code.briarproject.org/briar/briar/-/issues/756Creator discards new member's join message2017-12-18T07:40:36ZakwizgranCreator discards new member's join messageThe creator of a private group will discard a join message from a new member that arrives before the corresponding invitation protocol message has been handled. The new member will eventually retransmit the message and the creator will h...The creator of a private group will discard a join message from a new member that arrives before the corresponding invitation protocol message has been handled. The new member will eventually retransmit the message and the creator will handle it, but this causes an unnecessary delay in the creator handling the new member's join message.Milestone Eakwizgranakwizgranhttps://code.briarproject.org/briar/briar/-/issues/755Timestamp of new group message should be higher than that of all messages in ...2017-12-18T07:40:36ZTorsten GroteTimestamp of new group message should be higher than that of all messages in the groupMilestone ETorsten GroteTorsten Grotehttps://code.briarproject.org/briar/briar/-/issues/754Add visibility information to group member list2017-12-18T07:40:36ZTorsten GroteAdd visibility information to group member listThe member list currently only says if the group is shared with a contact or not using a sharing icon. It does not give any details on whether the relationship to that user is revealed or not.The member list currently only says if the group is shared with a contact or not using a sharing icon. It does not give any details on whether the relationship to that user is revealed or not.Milestone FTorsten GroteTorsten Grotehttps://code.briarproject.org/briar/briar/-/issues/753Listener interfaces have mixed responsibilities2021-01-20T12:34:20ZakwizgranListener interfaces have mixed responsibilitiesThe UI makes heavy use of listener interfaces that inherit from either DestroyableContext or BaseFragmentListener. These are used for various purposes:
* Callbacks from a controller to the UI (e.g. `TransportStateListener#stateUpdate()`...The UI makes heavy use of listener interfaces that inherit from either DestroyableContext or BaseFragmentListener. These are used for various purposes:
* Callbacks from a controller to the UI (e.g. `TransportStateListener#stateUpdate()`)
* Injecting dependencies into fragments (`BaseFragmentListener#getActivityComponent()`)
* Manipulating other parts of the UI (e.g. `CreateGroupListener#showSoftKeyboard()`)
* Running tasks (`DestroyableContext#runOnUiThreadUnlessDestroyed()`, `BaseFragmentListener#runOnDbThread()` (deprecated))
These different purposes would ideally be separated into different interfaces. Maybe it would clarify things if communication from controllers back to the UI used the "listener" name and communication between fragments and their activities used some other name.
Listeners are usually provided by casting an Activity or Context (passed to `ActivityLifecycleController#onActivityCreate()` or `Fragment#onAttach()`) to an arbitrary listener interface. This is a bit of a hack - it would be nice if we could provide listeners in a type-safe way, for example by injection.
Related to #752.https://code.briarproject.org/briar/briar/-/issues/752Break up ActivityModule so controller implementations can be package-private2017-12-18T07:40:36ZakwizgranBreak up ActivityModule so controller implementations can be package-privateController implementations need to be public so that ActivityModule can access them. Break up ActivityModule into smaller package-specific modules, like we do in the core, so we can reduce the visibility of the controllers.
Related to #...Controller implementations need to be public so that ActivityModule can access them. Break up ActivityModule into smaller package-specific modules, like we do in the core, so we can reduce the visibility of the controllers.
Related to #368.Milestone Fhttps://code.briarproject.org/briar/briar/-/issues/751Emoji flicker when BriarRecyclerView updates itself2020-11-21T16:23:47ZakwizgranEmoji flicker when BriarRecyclerView updates itselfWhen BriarRecyclerView updates itself once per minute, emoji visibly flicker.When BriarRecyclerView updates itself once per minute, emoji visibly flicker.https://code.briarproject.org/briar/briar/-/issues/750ANR when copying and pasting long strings of emoji2020-11-21T16:24:41ZakwizgranANR when copying and pasting long strings of emojiCopying and pasting long strings of emoji from EmojiTextView to EmojiEditText is very slow and can produce an ANR dialog. The delay increases superlinearly with the number of emoji, and depends on the existing contents of the EmojiEditTe...Copying and pasting long strings of emoji from EmojiTextView to EmojiEditText is very slow and can produce an ANR dialog. The delay increases superlinearly with the number of emoji, and depends on the existing contents of the EmojiEditText.
With the Huawei Ascend Y330:
* 64 emoji: noticeable delay
* 128 emoji: 6 seconds if EmojiEditText is empty, 20 seconds if it already contains 128 emoji
* 256 emoji: 30 seconds if EmojiEditText is empty, 100 seconds if it already contains 256 emoji
With the Samsung Galaxy Ace 2:
* 128 emoji: noticeable delay
* 256 emoji: 6 seconds if EmojiEditText is empty, 18 seconds if it already contains 256 emoji
* 512 emoji: 37 seconds if EmojiEditText is empty, 135 seconds if it already contains 512 emoji
![device-2016-11-10-155441](/uploads/39033afde37e12b0840b97260d775389/device-2016-11-10-155441.png)
![device-2016-11-10-155523](/uploads/877491aa8bde25c54ef75d51632b8bec/device-2016-11-10-155523.png)
These problems don't occur when copying and pasting ordinary text from an EmojiTextView to an EmojiEditText. Thousands of characters can be copied and pasted without a noticeable delay.https://code.briarproject.org/briar/briar/-/issues/749Emoji are invisible on some devices when using LAYER_TYPE_NONE2018-09-03T12:14:15ZakwizgranEmoji are invisible on some devices when using LAYER_TYPE_NONEThis issue can be reproduced on master with the Samsung Galaxy Ace 2 (Android 4.1.2) by creating a large EmojiTextView (for example a long forum post), so that rendering switches from LAYER_TYPE_SOFTWARE to LAYER_TYPE_NONE. In the screen...This issue can be reproduced on master with the Samsung Galaxy Ace 2 (Android 4.1.2) by creating a large EmojiTextView (for example a long forum post), so that rendering switches from LAYER_TYPE_SOFTWARE to LAYER_TYPE_NONE. In the screenshot below, the post at the top of the screen is below the threshold and uses LAYER_TYPE_SOFTWARE, while the invisible post filling the rest of the screen is above the threshold and uses LAYER_TYPE_NONE.
![device-2016-11-10-144841](/uploads/c55ea098cebfb45b5974816af3be4353/device-2016-11-10-144841.png)
The issue can be reproduced with EmojiTextViews of any size by changing the code to always use LAYER_TYPE_NONE. This makes it easier to see that emoji are sometimes drawn and sometimes not. For example, the screenshot below shows a mixture of posts, all of which use LAYER_TYPE_NONE and contain strings of emoji.
![device-2016-11-10-135603](/uploads/e0a04004b56ed1a4cc3286b09c60b3fa/device-2016-11-10-135603.png)
The issue also affects EmojiEditText if the rendering type is changed to LAYER_TYPE_NONE. In the screenshot below, one emoji has been typed but it's invisible.
![device-2016-11-10-135216](/uploads/9c3b4a7ca9afbf2ed24ab741d6c9d1cc/device-2016-11-10-135216.png)
Selecting invisible emoji makes them visible.
![device-2016-11-10-144910](/uploads/e7fecfe91ad52b0676343fde866fa805/device-2016-11-10-144910.png)
The issue also occurs on master with the Huawei Ascend Y330 (Android 4.2.2).
![device-2016-11-10-152529](/uploads/6893ab42d5ae585c38a76337c9186ad6/device-2016-11-10-152529.png)
If an EmojiTextView contains a mixture of emoji and text, the text is rendered normally. In the following screenshot, the post starts with one emoji, which is invisible.
![device-2016-11-10-150808](/uploads/de3bd61eb4f0aa9cf3955d5a837dbecb/device-2016-11-10-150808.png)Android 1.1akwizgranakwizgranhttps://code.briarproject.org/briar/briar/-/issues/748Re-encoding of QR code payloads may produce different results2017-12-18T07:40:37ZakwizgranRe-encoding of QR code payloads may produce different resultsSince !394, adding a contact sometimes fails at the confirmation stage.
The Payload class contains a map from TransportIds to BdfLists. When calculating confirmation records, the Payload object received from the contact is re-encoded us...Since !394, adding a contact sometimes fails at the confirmation stage.
The Payload class contains a map from TransportIds to BdfLists. When calculating confirmation records, the Payload object received from the contact is re-encoded using the map's iteration order. The map is implemented as a HashMap, which doesn't have a defined iteration order. Devices with different HashMap implementations may re-encode each other's payloads differently from the original encoding, thus producing different confirmation records.Milestone Fakwizgranakwizgranhttps://code.briarproject.org/briar/briar/-/issues/747Remove injected field from BlogManagerImplTest2017-12-18T07:40:37ZakwizgranRemove injected field from BlogManagerImplTestBlogManagerImplTest has an @Inject annotated field, but injections aren't used in the briar-tests module. Replace it with a mock.BlogManagerImplTest has an @Inject annotated field, but injections aren't used in the briar-tests module. Replace it with a mock.Milestone Fakwizgranakwizgranhttps://code.briarproject.org/briar/briar/-/issues/746Crash while trying to add contact2017-12-18T07:40:37ZMegaloxCrash while trying to add contact@ernir installed the newest version of briar on my two test devices this morning (Nexus 5 and Sony Xperia M2). I tried to add these as contacts and both devices crashed after scanning the QR code. I reproduced this crash three times.@ernir installed the newest version of briar on my two test devices this morning (Nexus 5 and Sony Xperia M2). I tried to add these as contacts and both devices crashed after scanning the QR code. I reproduced this crash three times.akwizgranakwizgranhttps://code.briarproject.org/briar/briar/-/issues/745Refactor redundant code in AndroidNotificationManagerImpl2020-11-21T16:26:13ZakwizgranRefactor redundant code in AndroidNotificationManagerImplAndroidNotificationManagerImpl contains blocks of nearly identical code for doing things like counting new messages per-group or per-contact, and blocking or unblocking notifications per-client. These could be refactored to reduce redund...AndroidNotificationManagerImpl contains blocks of nearly identical code for doing things like counting new messages per-group or per-contact, and blocking or unblocking notifications per-client. These could be refactored to reduce redundancy.
(ConnectionRegistryImpl also contains similar code for counting connections per-contact. Maybe this could be factored out into a separate `Counter<T>` class.)https://code.briarproject.org/briar/briar/-/issues/744Use global constants for View's alpha values2020-11-21T16:27:13ZErnir ErlingssonUse global constants for View's alpha valuesIn several places in the app we're decreasing the opacity of views to represent things such as disabled states. Unfortunately, we're doing this through hard-coded float values at each location. We should rather use global constants and m...In several places in the app we're decreasing the opacity of views to represent things such as disabled states. Unfortunately, we're doing this through hard-coded float values at each location. We should rather use global constants and make sure that every occurrence uses them -- this will make it easier for us to modify it in the future to fit any design pattern.https://code.briarproject.org/briar/briar/-/issues/743Create a controller for ConversationActivity to encapsulate the UI code2020-11-21T16:27:52ZErnir ErlingssonCreate a controller for ConversationActivity to encapsulate the UI codehttps://code.briarproject.org/briar/briar/-/issues/742Use unique request IDs across the app2017-12-18T07:40:37ZakwizgranUse unique request IDs across the app@ernir came up with a nice solution for this: a static method that returns an incrementing counter.
```
private final static int REQUEST_INVITE = SomeUtil.getUniqueRequestId();
```@ernir came up with a nice solution for this: a static method that returns an incrementing counter.
```
private final static int REQUEST_INVITE = SomeUtil.getUniqueRequestId();
```Milestone FTorsten GroteTorsten Grotehttps://code.briarproject.org/briar/briar/-/issues/741Move events into their respective packages2017-12-18T07:40:37ZakwizgranMove events into their respective packagesAll events are currently in the package `org.briarproject.api.event`. Events that are specific to a given package should be moved into the package that uses them.
Sub-task of #136All events are currently in the package `org.briarproject.api.event`. Events that are specific to a given package should be moved into the package that uses them.
Sub-task of #136Milestone Fakwizgranakwizgranhttps://code.briarproject.org/briar/briar/-/issues/740App silently quits when out of memory2019-02-25T10:04:29ZTorsten GroteApp silently quits when out of memory```
11-07 13:04:42.066 D/dalvikvm: GC_FOR_ALLOC freed 618K, 40% free 28656K/47559K, paused 75ms, total 76ms
11-07 13:04:42.066 I/dalvikvm-heap: Forcing collection of SoftReferences for 2385116-byte allocation
11-07 13:04:42.146 D/dalv...```
11-07 13:04:42.066 D/dalvikvm: GC_FOR_ALLOC freed 618K, 40% free 28656K/47559K, paused 75ms, total 76ms
11-07 13:04:42.066 I/dalvikvm-heap: Forcing collection of SoftReferences for 2385116-byte allocation
11-07 13:04:42.146 D/dalvikvm: GC_BEFORE_OOM freed 26K, 40% free 28629K/47559K, paused 84ms, total 84ms
11-07 13:04:42.146 E/dalvikvm-heap: Out of memory on a 2385116-byte allocation.
11-07 13:04:42.146 I/dalvikvm: "main" prio=5 tid=1 RUNNABLE
11-07 13:04:42.146 I/dalvikvm: | group="main" sCount=0 dsCount=0 obj=0x2b545568 self=0x12ad8
11-07 13:04:42.146 I/dalvikvm: | sysTid=24662 nice=0 sched=0/0 cgrp=apps handle=715976496
11-07 13:04:42.146 I/dalvikvm: | schedstat=( 0 0 0 ) utm=5505 stm=1699 core=0
11-07 13:04:42.146 I/dalvikvm: at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
11-07 13:04:42.146 I/dalvikvm: at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:500)
11-07 13:04:42.146 I/dalvikvm: at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:353)
11-07 13:04:42.146 I/dalvikvm: at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:781)
11-07 13:04:42.146 I/dalvikvm: at android.content.res.Resources.loadDrawable(Resources.java:1959)
11-07 13:04:42.146 I/dalvikvm: at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
11-07 13:04:42.146 I/dalvikvm: at android.widget.ImageView.<init>(ImageView.java:120)
11-07 13:04:42.156 I/dalvikvm: at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:57)
11-07 13:04:42.156 I/dalvikvm: at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:53)
11-07 13:04:42.156 I/dalvikvm: at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:106)
11-07 13:04:42.156 I/dalvikvm: at android.support.v7.app.AppCompatDelegateImplV7.createView(AppCompatDelegateImplV7.java:972)
11-07 13:04:42.156 I/dalvikvm: at android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:1031)
11-07 13:04:42.156 I/dalvikvm: at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
11-07 13:04:42.156 I/dalvikvm: at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:675)
11-07 13:04:42.156 I/dalvikvm: at android.view.LayoutInflater.inflate(LayoutInflater.java:466)
11-07 13:04:42.156 I/dalvikvm: at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
11-07 13:04:42.156 I/dalvikvm: at android.support.design.internal.NavigationMenuPresenter.inflateHeaderView(NavigationMenuPresenter.java:189)
11-07 13:04:42.156 I/dalvikvm: at android.support.design.widget.NavigationView.inflateHeaderView(NavigationView.java:258)
11-07 13:04:42.156 I/dalvikvm: at android.support.design.widget.NavigationView.<init>(NavigationView.java:173)
11-07 13:04:42.156 I/dalvikvm: at android.support.design.widget.NavigationView.<init>(NavigationView.java:95)
11-07 13:04:42.156 I/dalvikvm: at java.lang.reflect.Constructor.constructNative(Native Method)
11-07 13:04:42.156 I/dalvikvm: at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
11-07 13:04:42.156 I/dalvikvm: at android.view.LayoutInflater.createView(LayoutInflater.java:587)
11-07 13:04:42.156 I/dalvikvm: at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
11-07 13:04:42.156 I/dalvikvm: at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
11-07 13:04:42.156 I/dalvikvm: at android.view.LayoutInflater.parseInclude(LayoutInflater.java:830)
11-07 13:04:42.156 I/dalvikvm: at android.view.LayoutInflater.rInflate(LayoutInflater.java:736)
11-07 13:04:42.156 I/dalvikvm: at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
11-07 13:04:42.156 I/dalvikvm: at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
11-07 13:04:42.156 I/dalvikvm: at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
11-07 13:04:42.156 I/dalvikvm: at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:276)
11-07 13:04:42.156 I/dalvikvm: at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)
11-07 13:04:42.156 I/dalvikvm: at org.briarproject.android.NavDrawerActivity.onCreate(NavDrawerActivity.java:96)
```https://code.briarproject.org/briar/briar/-/issues/739StrictMode violation: DroidtoothPlugin does not release resource2020-11-21T16:28:28ZTorsten GroteStrictMode violation: DroidtoothPlugin does not release resourceThis shows up from time to time in the log of my test device during normal operation.
```
StrictMode: A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
...This shows up from time to time in the log of my test device during normal operation.
```
StrictMode: A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
java.lang.Throwable: Explicit termination method 'close' not called
at dalvik.system.CloseGuard.open(CloseGuard.java:184)
at android.os.ParcelFileDescriptor.<init>(ParcelFileDescriptor.java:180)
at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:916)
at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:906)
at android.bluetooth.IBluetooth$Stub$Proxy.connectSocket(IBluetooth.java:1684)
at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:311)
at org.briarproject.plugins.droidtooth.DroidtoothPlugin.connect(DroidtoothPlugin.java:331)
at org.briarproject.plugins.droidtooth.DroidtoothPlugin.access$1100(DroidtoothPlugin.java:62)
at org.briarproject.plugins.droidtooth.DroidtoothPlugin$3.run(DroidtoothPlugin.java:298)
```https://code.briarproject.org/briar/briar/-/issues/738Older devices show overflow icon on some screens but not others2017-12-18T07:40:37ZakwizgranOlder devices show overflow icon on some screens but not othersOn the Sony Xperia Tipo (Android 4.0.4), which has a hardware menu button, the action bar overflow icon is shown on some screens but not others. For example, it's shown in the private conversation, but not in private groups. This should ...On the Sony Xperia Tipo (Android 4.0.4), which has a hardware menu button, the action bar overflow icon is shown on some screens but not others. For example, it's shown in the private conversation, but not in private groups. This should be consistent across the app.
In screens where it's shown, the menu can be opened by pressing either the overflow icon or the hardware button.Milestone FTorsten GroteTorsten Grotehttps://code.briarproject.org/briar/briar/-/issues/737Private group conversation is not updated when group is dissolved2017-12-18T07:40:37ZakwizgranPrivate group conversation is not updated when group is dissolvedIf a private group is dissolved while it's being viewed, the view doesn't update until the activity is recreated.If a private group is dissolved while it's being viewed, the view doesn't update until the activity is recreated.Milestone ETorsten GroteTorsten Grote