Skip to content

Release/1.33.8 - #2254

Merged
mpretty-cyro merged 39 commits into
masterfrom
release/1.33.8
Nov 5, 2026
Merged

mpretty-cyro merged 39 commits into
masterfrom
release/1.33.8

Conversation

@mpretty-cyro

Copy link
Copy Markdown
Collaborator

1.33.8 (456) as released to Play.

sandakersmann and others added 30 commits October 13, 2026 01:42
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
mpretty-cyro and others added 9 commits November 5, 2026 14:13
…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
@mpretty-cyro
mpretty-cyro merged commit f7001b3 into master Nov 5, 2026
9 of 14 checks passed
@mpretty-cyro
mpretty-cyro deleted the release/1.33.8 branch November 5, 2026 21:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants