![]() Shoutout to @fumiakiy for the excellent research here! Sometimes we get thrown to the bottom of the list (or other list locations) when reading content in the middle of the list. Most often, this happens when you have a lot of unread messages and you open the conversation. FixedSizePagingController#onDataNeededAroundIndex() can be called very fast in rapid succession, and we use the DataStatus class for bookkeeping to know which requests are in-flight. We then make those requests in LIFO order in order to make sure that the data visible on screen now gets the highest priority. ...But in practice, that LIFO ordering can make things a little screwy. Imagine we called onDataNeedAroundIndex() 50 times in rapid succession (1, 2..., 50). Each time it's called, we generate a range and mark that range as being fetched in DataStatus. That could mean that the latest request for index 50 might only have, like, 1 item in it, because a previously-enqueued fetch already got assigned most of it's data. BUT we execute the nearly-empty request for index 50 first because of the LIFO ordering. We give that data to RecyclerView first, and it doesn't like that at all, and it jumps to weird places because we gave it mostly null values, which are rendered as placeholder values (which are smaller than real cells). So then, when we give it the real data right after, its position is all off. I switched to a serial executor. That prevents us from giving back weird lists. The consequence is that if you scroll super fast, you run the risk of the executor getting 'backed up' fetching data that's offscreen. However, in practice, I couldn't trigger this. We'll see how it goes. I think the true solution is a smarter way of fetching and ordering requests, but that gets to be really tricky from a threading perspective, and I'd rather keep things simple. |
||
---|---|---|
.github | ||
apntool | ||
app | ||
buildSrc | ||
core-util | ||
gradle/wrapper | ||
libsignal/service | ||
lintchecks | ||
paging | ||
reproducible-builds | ||
video | ||
.gitattributes | ||
.gitignore | ||
CONTRIBUTING.md | ||
LICENSE | ||
NOTICE | ||
README.md | ||
build.gradle | ||
flavors.gradle | ||
gradle.properties | ||
gradlew | ||
gradlew.bat | ||
pkcs11.config | ||
settings.gradle |
README.md
Signal Android
Signal is a messaging app for simple private communication with friends.
Signal uses your phone's data connection (WiFi/3G/4G) to communicate securely, optionally supports plain SMS/MMS to function as a unified messenger, and can also encrypt the stored messages on your phone.
Currently available on the Play store.
Contributing Bug reports
We use GitHub for bug tracking. Please search the existing issues for your bug and create a new one if the issue is not yet tracked!
https://github.com/signalapp/Signal-Android/issues
Joining the Beta
Want to live life on the bleeding edge and help out with testing?
You can subscribe to Signal Android Beta releases here: https://play.google.com/apps/testing/org.thoughtcrime.securesms
If you're interested in a life of peace and tranquility, stick with the standard releases.
Contributing Translations
Interested in helping to translate Signal? Contribute here:
https://www.transifex.com/projects/p/signal-android/
Contributing Code
If you're new to the Signal codebase, we recommend going through our issues and picking out a simple bug to fix (check the "easy" label in our issues) in order to get yourself familiar. Also please have a look at the CONTRIBUTING.md, that might answer some of your questions.
For larger changes and feature ideas, we ask that you propose it on the unofficial Community Forum for a high-level discussion with the wider community before implementation.
Contributing Ideas
Have something you want to say about Open Whisper Systems projects or want to be part of the conversation? Get involved in the community forum.
Help
Support
For troubleshooting and questions, please visit our support center!
Documentation
Looking for documentation? Check out the wiki!
https://github.com/signalapp/Signal-Android/wiki
Legal things
Cryptography Notice
This distribution includes cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted. See http://www.wassenaar.org/ for more information.
The U.S. Government Department of Commerce, Bureau of Industry and Security (BIS), has classified this software as Export Commodity Control Number (ECCN) 5D002.C.1, which includes information security software using or performing cryptographic functions with asymmetric algorithms. The form and manner of this distribution makes it eligible for export under the License Exception ENC Technology Software Unrestricted (TSU) exception (see the BIS Export Administration Regulations, Section 740.13) for both object code and source code.
License
Copyright 2013-2020 Signal
Licensed under the GPLv3: http://www.gnu.org/licenses/gpl-3.0.html
Google Play and the Google Play logo are trademarks of Google Inc.