Repository navigation
Release/1.33.8 - #2254
Merged
Merged
Release/1.33.8#2254
Conversation
Add SHA-256 certificate fingerprints to README.md
Add SHA-256 certificate fingerprints to README.md
Deleting an old notification channel throws SecurityException while a running foreground service posts to it, and NotificationChannelManager is built at startup, so the app crashed on launch. The migration also re-deleted every channel, including the current ones, whenever it was retried. Delete only channels that aren't current, skip any the system refuses, and leave the migration flag unset so those are retried on a later launch.
Glide cancels image requests on the main thread, for example when the Giphy grid recycles a cell while scrolling or when the activity stops. CallRequestController.cancel() then closed the response body there, and closing a TLS stream can write to the socket, which threw NetworkOnMainThreadException.
Outgoing documents are tappable before their attachment reaches DONE, and such a part can have a null URI. PartUriParser then threw a NullPointerException. Show the existing "unable to open" toast instead.
The video renderers are owned by CallManager and outlive WebRtcCallActivity, so when a new instance of the screen rendered its video state a renderer could still be attached to the previous instance's layout. addView then threw "The specified child already has a parent".
ContentResolver.insert throws IllegalArgumentException for values MediaStore won't accept, and can return null; SaveAttachmentTask caught only IOException and dereferenced the result with !!, so saving such an attachment from a conversation or the media preview crashed. Both now end in the existing "save failed" toast.
HomeViewModel collects conversationListAddressesFlow on the main thread as the home screen opens. Its first emission initialises the user configs, which reads ConfigDatabase and so waits for the database to open. When that first open is slow, the home screen sat with an empty list until the app was killed for not responding at launch.
Every typing indicator was sent from the input field's text watcher on the main thread: sendTyping read the thread's address and recipient and MessageSender.send persisted a job. When the connection pool was busy, typing froze the conversation until the app was killed for not responding. Sends now run in order on a dedicated background thread.
Every reload trigger called restartLoader, which abandons the running load without stopping it. Its query holds a database connection until the cursor window is filled, so during bursts of message, reaction or attachment changes several loads ran at once (up to four in ANR samples) and the main thread waited for a connection while binding rows. Signal a content change on the existing loader instead, which runs one load at a time; restart only when the thread ID has changed.
Picking a reaction wrote it to ReactionDatabase in a transaction, looked up the community server ID and persisted the send job, all on the main thread from the reaction overlay's touch handler. On a busy database that froze the conversation until the app was killed for not responding. Removing a reaction did the same. Both now run in the app-wide scope on an IO thread, then reload the conversation.
ScreenLockActivity started KeyCachingService in onCreate. The activity can be created while the app is in the background, where Android 12+ throws BackgroundServiceStartNotAllowedException, crashing the launch. Keep binding in onCreate and start the service from onResume, which is always reached before the user can unlock.
CallForegroundService always started with the phone-call and microphone types. Android 14+ throws SecurityException for the microphone type when RECORD_AUDIO isn't granted or the service starts from the background, and only IllegalStateException was caught, so the app crashed. Include the microphone type only with the permission, and fall back to the phone-call type alone if the system still refuses it.
…options Long-pressing a conversation on the home screen loaded the whole conversation list (every thread with its last message and unread counts) on the main thread in the options sheet's onCreate, just to find the one that was pressed. With many conversations, or a busy database, that froze the home screen until the app was killed for not responding. Query the one thread on a background thread and bind the sheet once it arrives.
A recreated activity found the retained loader and only signalled a content change, so its own callbacks never received a load and the conversation stayed empty. Each instance now restarts the loader once.
The legacy-group branch still read the group on the main thread, and the not-found path could dismiss after the state was saved.
Each reaction ran in its own IO coroutine, so a removal could be sent before the add it undoes. Run them on one shared lane, and look up the existing reaction for "react with any" on that lane too, so it sees a reaction still being written.
Falling back to phone-call only on a restart, such as when a call connects in the background, would drop the microphone type for the rest of the call. A running service now keeps its types and only its notification is updated.
…-off-main Send typing indicators off the main thread
…in-translations [Automated] Update translations from Crowdin
…der-coalesce Coalesce conversation reloads instead of restarting the loader
…ions-sheet-lookup Look up only the selected conversation, off the main thread, for its options
…ff-main Write and send emoji reactions off the main thread
…n-list-off-main Build the conversation list addresses off the main thread
…nnel-migration-fgs Don't crash at startup when an old notification channel is in use
…se-off-main Close a cancelled request's stream off the calling thread
…t-service-foreground Start KeyCachingService when the lock screen is shown, not when created
…rophone-type Start the call service without the microphone type when it isn't allowed
…insert-failure Report a failed save instead of crashing when MediaStore rejects it
…ll-uri Don't crash when tapping a document that has no data
…rer-reparent Detach a call video renderer before adding it to the call screen
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
1.33.8 (456) as released to Play.