Compare commits

...

410 Commits

Author SHA1 Message Date
Michelle Tang
9b9734f82a Bump version to 7.74.0 2026-02-11 18:24:13 -05:00
Michelle Tang
fe437b5234 Update translations and other static files. 2026-02-11 18:14:12 -05:00
jeffrey-signal
59bb505a3e Support member labels in backups. 2026-02-11 18:08:57 -05:00
jeffrey-signal
28d8d62cbd Rotate receive member labels flag. 2026-02-11 18:08:57 -05:00
jeffrey-signal
cb05608422 Show member labels in quotes. 2026-02-11 18:08:57 -05:00
Michelle Tang
e384a37fab Fix beta label width. 2026-02-11 18:08:57 -05:00
Michelle Tang
9a04cd9e3b Move education sheet to safety numbers screen. 2026-02-11 18:08:57 -05:00
Cody Henthorne
dd396eb75a Fix group updates from others showing before messages made before the update. 2026-02-11 18:08:57 -05:00
Greyson Parrelli
611b52780e Fix sticker grid sometimes getting stuck on 2 columns. 2026-02-11 18:08:57 -05:00
Michelle Tang
20a05220ea Adjust strings. 2026-02-11 18:08:57 -05:00
Greyson Parrelli
38e8f24c20 Fix gif and stickers buttons disappearing after exiting edit. 2026-02-11 18:08:57 -05:00
Alex Hart
58d2c92102 Move the rest of the permissions classes. 2026-02-11 18:08:57 -05:00
Greyson Parrelli
f90ba45940 Make pinned chat limit remote configurable. 2026-02-11 18:08:57 -05:00
Tom Ritter
1ecf42bfd3 Fix the message edited label not always appearing.
Closes signalapp/Signal-Android#14582
2026-02-11 18:08:57 -05:00
Greyson Parrelli
ed56c21e5b Fix bug where image wasn't showing after send. 2026-02-11 18:08:57 -05:00
Greyson Parrelli
a0c55baf39 Show whose safety number changed in group chat summaries. 2026-02-10 11:34:24 -05:00
Greyson Parrelli
3b3ef0d545 Allow some context menu actions in search. 2026-02-10 11:30:05 -05:00
jeffrey-signal
78e7f99344 Add group member labels to conversation items. 2026-02-10 10:35:54 -05:00
jeffrey-signal
d709d67f54 Fix position of clearable text field remaining characters count. 2026-02-10 10:35:54 -05:00
jeffrey-signal
6d30fd11a7 Add description to edit member label screen. 2026-02-10 10:35:54 -05:00
Cody Henthorne
4a39c7950f Split performance benchmark and baseline profile into separate modules. 2026-02-10 10:35:54 -05:00
Greyson Parrelli
3dd5ad2a8a Fix video scrubber contrast with HDR video.
Co-authored-by: Milan Stevanovic <milan@signal.org>
2026-02-10 10:35:54 -05:00
jeffrey-signal
d7b7727aa6 Show member labels in conversation settings. 2026-02-10 10:35:54 -05:00
Cody Henthorne
0199cd24ef Remove proto files from APK. 2026-02-10 10:35:54 -05:00
jeffrey-signal
8513e8c4f9 Fix donation learn more sheet icon colors. 2026-02-10 10:35:54 -05:00
Greyson Parrelli
5d2d9017f1 Fix for some HDR transcoding issues.
Co-authored-by: Milan Stevanovic <milan@signal.org>
2026-02-10 10:35:54 -05:00
Alex Hart
879e8f98bd Ensure lint configuration is applied to all modules. 2026-02-10 10:35:54 -05:00
Greyson Parrelli
2c6524f6c0 Include battery info debuglog. 2026-02-10 10:35:54 -05:00
Greyson Parrelli
c9bd81d332 Show linked deviceId's for internal users. 2026-02-10 10:35:54 -05:00
Greyson Parrelli
2d29b02cea Add new sticker packs.
- My Daily Life 2
- Rocky Talk
- Cozy Season
- Chug the Mouse
- Croco's Feelings as blessed sticker packs
2026-02-10 10:35:54 -05:00
andrew-signal
c0a279fcc5 Bump to libsignal v0.87.1 2026-02-10 10:35:54 -05:00
Greyson Parrelli
1a612fab0b Update video demo app to minSdk 26. 2026-02-10 10:35:54 -05:00
Michelle Tang
63e821634a Adjust strings. 2026-02-10 10:35:54 -05:00
Alex Hart
62d951b438 Move additional fragments to core UI. 2026-02-10 10:35:54 -05:00
Greyson Parrelli
8d749c404f Refactor and improve video demo app. 2026-02-10 10:35:54 -05:00
jeffrey-signal
d5b2f4fdd3 Display member label on recipient details sheet. 2026-02-10 10:35:54 -05:00
Alex Hart
fae4ca91bd Ensure spans are accounted for when measuring text. 2026-02-10 10:35:54 -05:00
Alex Hart
6e92ff5096 Move fragments to core UI. 2026-02-10 10:35:54 -05:00
jeffrey-signal
61522cd682 Fix GroupTable.memberLabel() to return null for blank labels. 2026-02-10 10:35:54 -05:00
jeffrey-signal
74dbd0814a Add comment to clarify intentional fall-through in DeviceTransferSetUpFragment switch statement.
Resolves signalapp/Signal-Android##14437
2026-02-10 10:35:54 -05:00
Alex Hart
05751a5b79 Remove app module SignalTheme. 2026-02-10 10:35:54 -05:00
Alex Hart
7741844055 Add audio-indicator slot to use for single-remote-participant calls. 2026-02-10 10:35:54 -05:00
Cody Henthorne
09c07f0707 Fix benchmark tests. 2026-02-10 10:35:54 -05:00
Alex Hart
c565db812e Fix back button intermittently not working in conversation view.
Co-authored-by: Greyson Parrelli <greyson@signal.org>
2026-02-10 10:35:54 -05:00
Greyson Parrelli
00b72c9263 Clean up system for blessed sticker packs. 2026-02-10 10:35:54 -05:00
Alex Hart
5c415139fd Reshape entry point for V3 media screens. 2026-02-10 10:35:54 -05:00
jeffrey-signal
6d944c0f8c Add tests for MemberLabelViewModel. 2026-02-10 10:35:53 -05:00
Michelle Tang
6744a79325 Avoid showing KT for note to self. 2026-02-10 10:35:53 -05:00
Michelle Tang
472d86acc0 Bump version to 7.73.2 2026-02-09 16:33:14 -05:00
Michelle Tang
c1ee7a53b5 Update translations and other static files. 2026-02-09 16:29:47 -05:00
Greyson Parrelli
8d44640377 Prompt for microphone permission when recording video in new camera.
Previously, the new camera would silently record video without audio
when microphone permission was missing. Now it shows the same rationale
dialog and permanent denial flow as the old camera.
2026-02-09 15:52:03 -05:00
Greyson Parrelli
cbcbe3f564 Use OrientationEventListener to update CameraX target rotation. 2026-02-09 14:15:52 -05:00
Greyson Parrelli
698923423f Downsample gallery thumbnail to display size in camera HUD.
Was loading full size image, potentially causing OOM.
2026-02-09 12:01:40 -05:00
jeffrey-signal
bc6114f6e0 Bump version to 7.73.1 2026-02-06 19:10:12 -05:00
jeffrey-signal
21d91bb2cf Update translations and other static files. 2026-02-06 19:06:27 -05:00
Greyson Parrelli
bda9664cb9 Check audio permission before enabling audio in video recording. 2026-02-06 16:11:09 -05:00
Greyson Parrelli
9c055a35a9 Increase flash toggle button hitbox in new camera. 2026-02-06 15:59:18 -05:00
Greyson Parrelli
bf794c41da Maximize screen brightness during selfie flash in new camera. 2026-02-06 15:59:18 -05:00
Greyson Parrelli
de698c8a1a Enable torch during video recording in new camera. 2026-02-06 15:59:17 -05:00
Greyson Parrelli
f972382f5e Fix tap-to-focus using wrong coordinate space in new camera.
We were using raw coordinates. Now we transform them appropriately
to the correct coordinate space.
2026-02-06 15:35:47 -05:00
Greyson Parrelli
73b0331884 Fix video recording zoom starting at ultrawide instead of 1x. 2026-02-06 15:29:36 -05:00
Greyson Parrelli
2248abb749 Persist camera lens selection across sessions. 2026-02-06 15:18:50 -05:00
Greyson Parrelli
13435c0b54 Add double-tap gesture on viewfinder to switch cameras. 2026-02-06 15:17:08 -05:00
Greyson Parrelli
5575f75118 Block camera switching during video recording. 2026-02-06 15:17:04 -05:00
jeffrey-signal
4ce3c2309c Bump version to 7.73.0 2026-02-04 15:07:07 -05:00
jeffrey-signal
cd7ee1a042 Update translations and other static files. 2026-02-04 15:07:01 -05:00
Greyson Parrelli
cd087113e3 Ensure that notification heuristics are calculated in the background. 2026-02-04 12:28:01 -05:00
Alex Hart
36b6122b0f Move several Permissions dependencies to core. 2026-02-04 13:17:29 -04:00
Alex Hart
a74651d915 Move text styles to core UI. 2026-02-04 13:13:49 -04:00
Alex Hart
c274805eb0 Utilze localized description for calculating badge line count. 2026-02-04 11:39:01 -04:00
Jim Gustafson
d86d88f313 Update to RingRTC v2.64.1 2026-02-03 16:41:36 -05:00
Cody Henthorne
265e875a78 Fix baseline profile generation and update it. 2026-02-03 16:40:30 -05:00
Cody Henthorne
8353ad4962 Improve performance of first send to large group. 2026-02-03 15:26:27 -05:00
Alex Hart
9369cafd38 Update translations to support multiple modules. 2026-02-03 16:15:52 -04:00
Michelle Tang
989cda6662 Add internal setting to run KT. 2026-02-03 15:14:38 -05:00
Michelle Tang
0570aaeb6e Add more checks when doing KT. 2026-02-03 12:55:37 -05:00
Alex Hart
5a19117850 Move lru and bottomsheet util to core modules. 2026-02-03 13:23:43 -04:00
jeffrey-signal
ff726ec4d2 Don't send group update messages when member labels are changed. 2026-02-03 12:20:33 -05:00
Alex Hart
0cd93986bd Add media send feature module. 2026-02-03 11:25:57 -04:00
andrew-signal
bc7ba5f2c6 Bump to libsignal v0.87.0 2026-02-03 09:57:32 -05:00
Michelle Tang
1ddde6ab92 Enable key transparency for internal users. 2026-02-02 17:46:19 -05:00
Greyson Parrelli
e9f2580bb8 Rotate the cameraXModelBlocklist.
We think the new camera could solve all or most of our issues, so let's
start fresh.
2026-02-02 15:37:22 -05:00
Michelle Tang
b9dc2d3969 Add animations to key transparency. 2026-02-02 15:00:07 -05:00
Michelle Tang
7e27203bd8 Add KT to backups. 2026-02-02 14:55:32 -05:00
Alex Hart
5a582c12d8 Remove unused dependency in Util. 2026-02-02 15:22:39 -04:00
Michelle Tang
cd925d5f53 Self-check key transparency. 2026-02-02 14:12:16 -05:00
Alex Hart
853a37920c Cycle view focus if keyboard fails to open. 2026-02-02 12:59:40 -04:00
Alex Hart
2aa0b3700f Move blurhash to its own module. 2026-02-02 12:17:16 -04:00
BarbossHack
35190ebb63 Fix type comparison in reproducible script.
Resolves #14571
2026-02-02 10:19:44 -05:00
BarbossHack
d74350b708 Do not stop reproducible comparison at the first mismatch.
Resolves #14570
2026-02-02 10:14:20 -05:00
BarbossHack
bd3e4f9f87 Fix memory usage in reproducible-build GitHub workflow.
Resolves #14574
2026-02-02 10:10:04 -05:00
BarbossHack
7370756344 Fix type and type annotations issues in reproducible script.
Resolves #14573
2026-02-02 10:06:27 -05:00
Greyson Parrelli
7894377d1d Add a github distribution variant. 2026-02-02 09:56:01 -05:00
Greyson Parrelli
6416df241f Add basic re-reg support to regV5. 2026-01-31 22:21:41 -05:00
Alex Hart
85408f2b12 Convert PartUriParser into Kotlin. 2026-01-31 22:21:41 -05:00
Alex Hart
b698daa4cf Convert SentMediaQuality to kotlin. 2026-01-31 22:21:41 -05:00
Alex Hart
3a035a1b33 Fix crash when user local can't resolve to a currency in post-restore job. 2026-01-31 22:21:41 -05:00
Michelle Tang
a11888ff71 Allow opting out of key transparency. 2026-01-31 22:21:41 -05:00
Michelle Tang
423b8c942c Add key transparency backend support. 2026-01-31 22:21:41 -05:00
Greyson Parrelli
26739491a5 Fix instrumentation test compilation. 2026-01-31 22:21:41 -05:00
Greyson Parrelli
6bf39c5102 Fix attachment downloads stuck after call ending. 2026-01-31 22:21:41 -05:00
Greyson Parrelli
daac3bd143 Attempt to remove an android datatransport service.
Relates to #14556
2026-01-31 22:21:41 -05:00
jeffrey-signal
028242826e Rename Groups.proto modifyMemberLabel field to modifyMemberLabels. 2026-01-31 22:21:41 -05:00
jeffrey-signal
99d9c670b6 Add group member label editing screen. 2026-01-31 22:21:41 -05:00
Alex Hart
bc592cc4e2 Fix broken exoplayer pool test. 2026-01-31 22:21:41 -05:00
Greyson Parrelli
04707b00e7 Switch to using SurfaceView for ExoPlayer. 2026-01-31 22:21:41 -05:00
Greyson Parrelli
d44abfaeac Update exoplayer version to 1.9.1 2026-01-31 22:21:41 -05:00
Alex Hart
6c30f3d573 Local backups upgrade UI. 2026-01-31 22:21:41 -05:00
Greyson Parrelli
2e70ed14dd Fix benchmark compilation error. 2026-01-31 22:21:41 -05:00
Alex Hart
7823d4f49f Move UriGlideRenderer to lib:image-editor. 2026-01-31 22:21:41 -05:00
Alex Hart
7bd3482367 Move the org.signal.glide code inside signal-android into lib/glide. 2026-01-31 22:21:40 -05:00
Jim Gustafson
709adf05aa Update to RingRTC v2.63.0
Co-authored-by: Greyson Parrelli <greyson@signal.org>
2026-01-31 22:21:40 -05:00
andrew-signal
524736c5b2 Bump to libsignal v0.86.15 2026-01-31 22:21:40 -05:00
Greyson Parrelli
f53ae66fc9 Rebuild CameraXFragment to use a brand new camera. 2026-01-31 22:21:40 -05:00
Greyson Parrelli
0c102b061c Bump version to 7.72.2 2026-01-30 20:46:41 -05:00
Greyson Parrelli
ee198e47c8 Update translations and other static files. 2026-01-30 20:46:21 -05:00
Alex Hart
75c2931c8d Ensure placeables are only measured once in call elements screen. 2026-01-30 10:03:05 -04:00
Greyson Parrelli
2bb4edecd7 Bump version to 7.72.1 2026-01-29 19:49:29 -05:00
Greyson Parrelli
b79d9af7ae Update translations and other static files. 2026-01-29 19:44:21 -05:00
Greyson Parrelli
5c50372021 Move theme colors to core-ui. 2026-01-29 19:44:11 -05:00
Greyson Parrelli
d0d32c8f33 Limit gallery to most recent 5k items for now. 2026-01-29 16:44:32 -05:00
Greyson Parrelli
2aaaa1791e Fix issue where invalid videos get stuck in the send flow. 2026-01-29 11:09:17 -05:00
Greyson Parrelli
6ed63a67cd Bump version to 7.72.0 2026-01-28 16:28:45 -05:00
Greyson Parrelli
b858955243 Update translations and other static files. 2026-01-28 16:28:21 -05:00
Rémi Chauchadis
63a676b0ef Add Mi 9T Pro voice note sample rate special handling.
Fixes #14452
Resolves #14523
2026-01-28 16:17:12 -05:00
jeffrey-signal
155b59d71f Move clearable text field to core module. 2026-01-28 16:17:12 -05:00
Greyson Parrelli
d9dba89781 Use both envelope.type and ciphertextMessageType in the validator. 2026-01-28 16:17:12 -05:00
jeffrey-signal
0a572153f0 Add send and receive support for group member labels. 2026-01-28 16:17:12 -05:00
jeffrey-signal
ce46c44b5d Centralize common icons into SignalIcons. 2026-01-28 16:17:11 -05:00
Alex Hart
e6918b592e Move MediaFolder to core-model. 2026-01-28 16:17:11 -05:00
Michelle Tang
ddbbb4c21a Fix alarms being set for pinned messages. 2026-01-28 16:17:11 -05:00
Greyson Parrelli
d23290107b Fix document download UI not updating on first click. 2026-01-28 16:17:11 -05:00
Michelle Tang
69f4c89f84 Add key transparency UI. 2026-01-28 16:17:11 -05:00
Michelle Tang
279f9578cc Remove old safety number code. 2026-01-28 16:17:11 -05:00
Greyson Parrelli
af7989839f Do not include large P2P group changes. 2026-01-28 16:17:11 -05:00
Greyson Parrelli
01fb0c0eb6 Migrate to new SVR2 enclave. 2026-01-28 16:17:11 -05:00
Greyson Parrelli
dab47828c6 Add additional oversized message logging. 2026-01-28 16:17:11 -05:00
andrew-signal
c070743723 Bump libsignal to v0.86.14 2026-01-28 16:17:11 -05:00
Greyson Parrelli
9bbd9b56e7 Update a bunch of strings to include nonprofit labeling. 2026-01-28 09:58:55 -04:00
Alex Hart
311793ac33 Utilize fallback navbar height if the returned value is zero on Android10 and less. 2026-01-28 09:58:54 -04:00
Greyson Parrelli
986923ea6c Move GlideImage into the glide module. 2026-01-28 09:58:54 -04:00
Greyson Parrelli
2f6baf8743 Show upload progress for the first backup on the chat list. 2026-01-28 09:58:54 -04:00
jeffrey-signal
4c43bf2228 Replace categorical window size classes with breakpoint-based checks. 2026-01-28 09:58:54 -04:00
Greyson Parrelli
585bd5f24c Fix width of dropdown menu items and add preview. 2026-01-28 09:58:54 -04:00
Alex Hart
d420c0332b Bump version to 7.71.2 2026-01-23 18:13:59 -04:00
Alex Hart
e32df5d247 Update translations and other static files. 2026-01-23 16:41:53 -04:00
Alex Hart
19a8ec02cb Fix issue with screen guard while in ongoing call. 2026-01-23 14:36:32 -04:00
Alex Hart
798d4b90c3 Bump version to 7.71.1 2026-01-22 16:25:41 -04:00
Alex Hart
206f1f3775 Update translations and other static files. 2026-01-22 16:20:32 -04:00
Alex Hart
96273bb724 Disable call audio toggle while the switch is processing. 2026-01-22 16:11:59 -04:00
Michelle Tang
c0d9efc930 Improve scheduling of the expiration of pinned messages. 2026-01-22 14:38:53 -05:00
Michelle Tang
6722d9d15d Remove delivery indicator for pinned messages. 2026-01-22 13:40:02 -05:00
Alex Hart
52c2c58988 Adjust padding measurement to prevent text from touching footer. 2026-01-22 14:25:00 -04:00
Alex Hart
e3efc53b64 Squelch resize calls while in a resize loop. 2026-01-22 11:29:58 -04:00
Alex Hart
9a18f5ef6b Dismiss active context menu in on-destroy-view to prevent long-press crash. 2026-01-22 10:19:55 -04:00
Alex Hart
ce8d545d6f Bump version to 7.71.0 2026-01-21 16:39:21 -04:00
Alex Hart
f875a0c882 Update translations and other static files. 2026-01-21 16:31:05 -04:00
Jim Gustafson
4bbddf736c Add more AudioManager logging 2026-01-21 11:57:48 -08:00
Alex Hart
c1da17df48 Fix console crash with competing animations / layout. 2026-01-21 12:55:00 -04:00
Alex Hart
f6fa8166d2 Re-register if we lose registration in pip mode. 2026-01-21 12:42:29 -04:00
Alex Hart
20016adef1 Display self-pip above raise hands bar if it is present. 2026-01-21 12:38:49 -04:00
Greyson Parrelli
265bb29626 Include footerPinned in media message footer width calculation. 2026-01-21 11:21:49 -05:00
Alex Hart
d16be8c4d7 Fix issue where archival progress dialog never dismisses. 2026-01-21 12:19:15 -04:00
Michelle Tang
791a38a181 Rotate send pin config. 2026-01-21 10:31:40 -05:00
Greyson Parrelli
d1010eb886 Move internal backup details down further on the screen. 2026-01-20 14:44:42 -05:00
Alex Hart
471b214b4a Extract Media and TransformProperties to core/util/models. 2026-01-20 15:21:27 -04:00
benediktjohannes
f505d48d80 Update strings comment.
Resolves #14534
2026-01-20 15:04:02 -04:00
Greyson Parrelli
6d9a2d4787 Fix apk file names. 2026-01-20 15:04:02 -04:00
Greyson Parrelli
a36e2408f7 Add more internal logging around failed debuglogs uploads. 2026-01-20 15:04:02 -04:00
Greyson Parrelli
9012a2afc0 Prompt users to backup during quick restore. 2026-01-20 15:04:02 -04:00
Alex Hart
4921198cd8 Launch main activity directly from share. 2026-01-20 15:04:02 -04:00
Alex Hart
530b57644f Add displaySheet reset. 2026-01-20 15:04:01 -04:00
Alex Hart
921415632b Add log entry line for remote backup subscription source. 2026-01-20 15:04:01 -04:00
Greyson Parrelli
c723b2c6bf Fix issue where backfilled dupes may get different mediaIds. 2026-01-20 15:04:01 -04:00
Alex Hart
17d338f7af New system PiP treatment. 2026-01-20 15:04:01 -04:00
Greyson Parrelli
3d9e12e4c1 Update to libsignal v0.86.12 2026-01-20 15:04:01 -04:00
Jim Gustafson
4ca849c151 Update to RingRTC v2.62.0 2026-01-20 15:04:01 -04:00
Alex Hart
3e6145aed0 Bump version to 7.70.1 2026-01-20 15:02:44 -04:00
Alex Hart
c960f29e38 Update translations and other static files. 2026-01-20 14:52:10 -04:00
Alex Hart
c230eb179b Back camera mirror fix. 2026-01-20 13:44:41 -04:00
Alex Hart
05e77b1d33 Filter out participants without ServiceId when leaving group call.
Co-authored-by: Greyson Parrelli <greyson@signal.org>
2026-01-20 13:37:57 -04:00
Michelle Tang
a2bdea5df2 Fix missing windows dependency. 2026-01-15 13:58:36 -05:00
Michelle Tang
b2b2860a48 Bump version to 7.70.0 2026-01-14 15:49:42 -05:00
Michelle Tang
f71c1d0c5d Update translations and other static files. 2026-01-14 15:41:40 -05:00
Greyson Parrelli
43607edc1c Improve reconciliation logging and handling. 2026-01-14 13:53:57 -05:00
Greyson Parrelli
08beb7ff43 Properly tag account wallpapers as such during export. 2026-01-14 13:49:28 -05:00
Greyson Parrelli
b24c4e3302 Poke upload progress when viewing settings. 2026-01-14 12:21:19 -05:00
Greyson Parrelli
06a6f0ea0b Rotate backups beta megaphone flag. 2026-01-14 10:53:19 -05:00
Greyson Parrelli
bd38c4f5d2 Update Groups.proto to match shared spec. 2026-01-13 14:01:46 -05:00
Michelle Tang
2e4665e5c4 Fix missing UUID crash in storage service. 2026-01-13 12:20:29 -05:00
andrew-signal
1b250300c7 Bump to libsignal v0.86.11 2026-01-13 12:20:29 -05:00
Alex Hart
7f3966ff07 Remove call length checks from CallQuality trigger. 2026-01-13 12:20:29 -05:00
Alex Hart
1f7e9df7ff Clean up old calling code. 2026-01-13 12:20:29 -05:00
Greyson Parrelli
fd32ec9598 Improve internal logging for reconciliation errors. 2026-01-13 12:20:29 -05:00
Alex Hart
ed12a7691d Add the call quality diagnostics fragment. 2026-01-13 12:20:29 -05:00
Michelle Tang
5759609a11 Add education sheet for key transparency. 2026-01-13 12:20:29 -05:00
Greyson Parrelli
6a423cb18b Fetch abandoned attachment files in a transaction.
Not likely to affect anything because of the existin protected file
system, more just a defense-and-depth style thing.
2026-01-13 12:20:29 -05:00
Greyson Parrelli
c727f93534 Fix conversation list not updating when disappearing message expires
When a disappearing message expired while the user was on the chat list,
the message preview would persist until the user navigated into that
conversation or restarted the app.

The issue was that deleteMessage() only called notifyConversationListeners(threadId)
which notifies observers watching a specific thread, but not
notifyConversationListListeners() which notifies the conversation list UI.
Other similar operations (like bulk deletes at line 3639) correctly call both.
2026-01-13 12:20:29 -05:00
Greyson Parrelli
623d2f2659 Add vertical scrolling to Change Number screen for accessibility.
The Change Number intro screen was not scrollable, making the Continue
button inaccessible when users have larger font or display sizes
configured on their device. Added verticalScroll modifier to the Column
to allow scrolling when content overflows.
2026-01-13 12:20:29 -05:00
Greyson Parrelli
4dede65e32 Remove some bad thumbnails from archive reconciliation. 2026-01-13 12:20:29 -05:00
Greyson Parrelli
1c5f4da20f Potential fix for flakey name collision test. 2026-01-13 12:20:29 -05:00
Greyson Parrelli
33d9840a78 Fix bad attachment table test. 2026-01-13 12:20:29 -05:00
Greyson Parrelli
3e89e07ad3 Fix case where wallpapers may not be uploaded. 2026-01-13 12:20:29 -05:00
Greyson Parrelli
99c3e043e7 Include more debug information for debuglog upload failures. 2026-01-13 12:20:29 -05:00
Greyson Parrelli
3858024116 Fix log typo. 2026-01-13 12:20:29 -05:00
Greyson Parrelli
b06f0bba61 Do not run reconciliation while there are still uploads in progress. 2026-01-13 12:20:29 -05:00
Greyson Parrelli
73ea50d162 Make logging more accurate. 2026-01-13 12:20:29 -05:00
jeffrey-signal
98580e6a6b Move sticker preview classes to preview subpackage. 2026-01-13 12:20:29 -05:00
jeffrey-signal
2f0a63774f Move StickerManagementScreen to its own file. 2026-01-13 12:20:29 -05:00
Greyson Parrelli
3d8f364d59 Update to AGP 8.13.2 2026-01-13 12:20:29 -05:00
jeffrey-signal
2d93b31469 Update username link logo.
Resolves signalapp/Signal-Android#14258
2026-01-13 12:20:28 -05:00
Michelle Tang
e27abcb047 Bump version to 7.69.2 2026-01-12 13:54:14 -05:00
Michelle Tang
29b4b32692 Update translations and other static files. 2026-01-12 13:45:09 -05:00
Alex Hart
bdd6bcb932 Fix speaker button initialisation issue. 2026-01-12 12:45:04 -04:00
Alex Hart
062fb1fe0b Add factory call for MainNavigationViewModel in ConversationFragment. 2026-01-12 12:21:09 -04:00
Greyson Parrelli
4a0631a10c Attempt to restore attachment as long as we have the data hash. 2026-01-09 21:15:46 -05:00
jeffrey-signal
a0fdc735e7 Bump version to 7.69.1 2026-01-09 15:14:14 -05:00
jeffrey-signal
fa842ac281 Update translations and other static files. 2026-01-09 15:11:28 -05:00
Alex Hart
f8d17b04cb Fix ringing screen when an outgoing call is placed and the camera is off. 2026-01-09 14:17:49 -04:00
Alex Hart
0ac9f5d7c0 Add new raised hand treatment. 2026-01-09 13:25:29 -04:00
Alex Hart
1ad7aa901a Fix group-ring logic. 2026-01-09 13:24:51 -04:00
Alex Hart
b0aa440b9d Attempt to fix transparent bottom nav bar. 2026-01-09 13:17:59 -04:00
Alex Hart
dc6deee231 Remove new-calling-ui flag. 2026-01-09 12:03:51 -04:00
Greyson Parrelli
1cf52cae71 Ensure that we mark attachments restored from the archive as FINISHED. 2026-01-09 10:37:21 -05:00
Michelle Tang
c730a09123 Fix inconsistent pin timer. 2026-01-08 18:00:03 -05:00
Michelle Tang
01fc7fa179 Move the star over for poll results. 2026-01-08 17:45:01 -05:00
Alex Hart
d2c6698824 Add fix for call screen bar sizing and position. 2026-01-08 12:45:31 -04:00
jeffrey-signal
e014779b32 Bump version to 7.69.0 2026-01-08 07:49:15 -05:00
jeffrey-signal
fe400894b1 Update translations and other static files. 2026-01-08 07:42:59 -05:00
jeffrey-signal
051e98898d Mark translation gradle tasks as incompatible with configuration cache. 2026-01-08 07:39:51 -05:00
jeffrey-signal
9cf77d320c Fix lint checks. 2026-01-08 07:39:51 -05:00
Greyson Parrelli
7c11239875 Be more lenient with attachment restore conditions. 2026-01-08 07:39:51 -05:00
Greyson Parrelli
3e5af23f43 Do not attach a resend listener unless an attachment is failed. 2026-01-08 07:39:51 -05:00
Greyson Parrelli
a349fdd79e Keem some additional reconciliation logs longer. 2026-01-08 07:39:51 -05:00
jeffrey-signal
af32996728 Exit multi-select mode on back press in sticker management. 2026-01-08 07:39:51 -05:00
Greyson Parrelli
5fa5a98b87 Enqueue another backup after uploading new media. 2026-01-08 07:39:51 -05:00
Alex Hart
a7f239576f Add missing call link ui. 2026-01-08 07:39:51 -05:00
jeffrey-signal
c2ec9e579e Open sticker management in a bottom sheet on large screen devices. 2026-01-08 07:39:50 -05:00
Michelle Tang
b56e2222f5 Hide unpinning behind feature flag. 2026-01-08 07:39:50 -05:00
Alex Hart
fc94a9d748 Reintroduce blur behind pip. 2026-01-08 07:39:50 -05:00
Greyson Parrelli
4b41989b30 Respect 429 in SVR write requests. 2026-01-08 07:39:50 -05:00
jeffrey-signal
e3b569ca5b Calculate drag handle bounds using the container width instead of the screen width. 2026-01-08 07:39:50 -05:00
Michelle Tang
6459ef5b66 Rotate receive pinned messages flag. 2026-01-08 07:39:49 -05:00
Greyson Parrelli
b085989b22 Update to libsignal v0.86.10 2026-01-08 07:39:49 -05:00
Greyson Parrelli
888e7f8ed5 Fix potential issue with reaction export. 2026-01-08 07:39:49 -05:00
Greyson Parrelli
d50a9c61b0 Potential fix for empty BodyRange errors during export.
The only way I could see this being a problem is if the mention ACI was
empty. We'll have to see if that fixes it.
2026-01-08 07:39:49 -05:00
Greyson Parrelli
4fdc2bd76b Improve the qa task. 2026-01-08 07:39:49 -05:00
Michelle Tang
3f990327d8 Fix alphabetical group members bug. 2026-01-08 07:39:49 -05:00
Greyson Parrelli
8ccd2864fe Use legacy packaging for website builds to reduce download size. 2026-01-08 07:39:49 -05:00
Greyson Parrelli
e7bfefa027 Fix validation errors around group chat updates. 2026-01-08 07:39:49 -05:00
Michelle Tang
1da75018eb Fix polls in local backups. 2026-01-08 07:39:48 -05:00
Greyson Parrelli
88be84297e Fix validation error around session switchover events. 2026-01-08 07:39:48 -05:00
Michelle Tang
e1467480e9 Fix message timer for chat updates. 2026-01-08 07:39:48 -05:00
Alex Hart
92c71b3630 Fix issue where latest chat would reappear after reopening the app. 2026-01-08 07:39:48 -05:00
Alex Hart
24c994d5b2 Prevent multiple instances of main-activity from being added to our task stack. 2026-01-08 07:39:48 -05:00
Michelle Tang
f7d87f3436 Allow 1:1 polls and raise character limit. 2026-01-08 07:39:48 -05:00
Daniele Favaro
fd635542c0 Allow country code selection input to be multi-line.
Fixes #14407
Resolves #14408
2026-01-08 07:39:47 -05:00
Alex Hart
eb826b2786 Fix crash when rotating device in emoji reaction picker.
Adds null check for selectedConversationModel in hideInternal() to
prevent NPE when hide() is called after the overlay has already been
hidden during configuration changes.

Fixes #14491
2026-01-08 07:39:47 -05:00
Alex Hart
8cd0381df5 Fix persistent "group members have the same name" banner.
The hash calculation for name collisions iterated over a Set with undefined
order, causing inconsistent hashes and resetting the dismissed state.
2026-01-08 07:39:47 -05:00
Alex Hart
305c32cfc5 Fix snackbar durations. 2026-01-08 07:39:47 -05:00
Alex Hart
bb21363ca8 Display large screen participant on connecting call. 2026-01-08 07:39:47 -05:00
Alex Hart
6968edbeec Fix self-pip mirroring. 2026-01-08 07:39:47 -05:00
Greyson Parrelli
a6acbacaef Fix some string capitalizations.
Fixes #14210
2026-01-08 07:39:46 -05:00
Greyson Parrelli
870ae8a46f Potential fix for Android 7 crash on chat open.
Fixes #14447
2026-01-08 07:39:46 -05:00
Greyson Parrelli
a3c9f04719 Enable the gradle configuration cache. 2026-01-08 07:39:46 -05:00
Greyson Parrelli
fdcd24feb1 Fix ordering issues in updateStaticFilesAndQa. 2026-01-08 07:39:46 -05:00
Greyson Parrelli
c31b2edeab Add tests for SmartlingClient. 2026-01-08 07:39:46 -05:00
Greyson Parrelli
ffecdb3747 Make pushing and pulling translations part of updateStaticFilesAndQa. 2026-01-08 07:39:46 -05:00
Greyson Parrelli
3031d68863 Move the pullTranslations script into the codebase as kotlin. 2026-01-08 07:39:46 -05:00
Greyson Parrelli
fe1755f250 Move the pushTranslations script into the codebase as kotlin. 2026-01-08 07:39:45 -05:00
Greyson Parrelli
e162eb27c7 Re-organize gradle modules. 2026-01-08 07:39:45 -05:00
Greyson Parrelli
f4863efb2e Fix outdated comment. 2026-01-08 07:39:45 -05:00
Greyson Parrelli
5b3c51013b Move values from constants.gradle into libs.versions.toml 2026-01-08 07:39:45 -05:00
Greyson Parrelli
06bdc36136 Properly handle 413s when uploading to archive.
Fixes #14502
2026-01-08 07:39:45 -05:00
Michelle Tang
6e4edbd12d Disable image pasting when editing. 2026-01-08 07:39:45 -05:00
Michelle Tang
c38fafe9fd Use updated country picker when deleting account. 2026-01-08 07:39:44 -05:00
Greyson Parrelli
6f213158ed Clean up AndroidManifest.xml 2026-01-08 07:39:44 -05:00
Greyson Parrelli
3db8f5a2af Ensure that attachments received during calls are autodownloaded afterwards.
The easiest way to do this is to add the constraint to the job itself,
when appropriate, so that we don't even run the job until you're done
with the call.
2026-01-08 07:39:44 -05:00
Michelle Tang
0b5fa18504 Delete all messages in edit chain. 2026-01-08 07:39:44 -05:00
Greyson Parrelli
7ea1080801 Remove unneccessary member warning during forwarding. 2026-01-08 07:39:44 -05:00
Greyson Parrelli
4c47f337ea Restart the app to apply the new language setting. 2026-01-08 07:39:44 -05:00
Cody Henthorne
952990c8af Add extra info tooltips to Spinner. 2026-01-08 07:39:44 -05:00
Greyson Parrelli
f2582cae54 Add debug logging for failed media name requirements. 2026-01-08 07:39:44 -05:00
Greyson Parrelli
e089be310b Fix crash related to timer updates. 2026-01-08 07:39:43 -05:00
Michelle Tang
ed5c51d954 Allow pinning in note to self. 2026-01-08 07:39:43 -05:00
Michelle Tang
08915befa5 Fix sync message author when pinning. 2026-01-08 07:39:43 -05:00
Greyson Parrelli
062e958db5 Schedule search index optimization to occur overnight. 2026-01-08 07:39:43 -05:00
Greyson Parrelli
9be82a2739 Repair bad group storageId state on the fly.
Fixes #14308
2026-01-08 07:39:43 -05:00
Cody Henthorne
0ea3d524da Streamline invalid qr code dialog in link device flow. 2026-01-08 07:39:43 -05:00
Cody Henthorne
437979373c Always format e164 as LTR. 2026-01-08 07:39:43 -05:00
Greyson Parrelli
22ed8872e6 Ensure proxy settings are applied to default okhttp client.
Fixes #13682
2026-01-08 07:39:43 -05:00
Greyson Parrelli
39fe5b1eb5 Unconditionally disable auto updates. 2026-01-08 07:39:42 -05:00
Greyson Parrelli
717794a12e Remove now-unnecessary nightly auto-update stuff. 2026-01-08 07:39:42 -05:00
Cody Henthorne
4ce51c77a8 Remove verbose call link parsing logs. 2026-01-08 07:39:42 -05:00
Cody Henthorne
d9ecab5240 Update local backup v2 support. 2026-01-08 07:39:42 -05:00
Cody Henthorne
71b15d269e Update Signal logo/branding for donation receipts. 2026-01-08 07:39:42 -05:00
Greyson Parrelli
a1009da324 Update the versioning scheme for nightlies. 2026-01-08 07:39:42 -05:00
Cody Henthorne
26b8de2282 Abort re-reg with pin flow if unable to communicate via svr websocket. 2026-01-08 07:39:42 -05:00
Alex Hart
9db33c3fec Display proper text when not in the active call on the local device. 2026-01-08 07:39:42 -05:00
Greyson Parrelli
2538e48d0f Fix universal sealed sender setting in export. 2026-01-08 07:39:41 -05:00
Ehren Kret
68bf41b36a Delay auto-updates while in a VoIP call. 2026-01-08 07:39:41 -05:00
Michelle Tang
3a91bb8947 Potentially fix e164 crash. 2026-01-08 07:39:41 -05:00
Cody Henthorne
ee930f59db Fix request to join state mismatch with server bug. 2026-01-08 07:39:41 -05:00
Greyson Parrelli
6b5feadf6c Dismiss media editor if you have no valid items. 2026-01-08 07:39:41 -05:00
Greyson Parrelli
bd084e606c Allow saving e164-only contacts to your contacts. 2026-01-08 07:39:41 -05:00
Cody Henthorne
bb674a1539 Fix added to group not showing up on canceled request groups. 2026-01-08 07:39:41 -05:00
Greyson Parrelli
951d073ad6 Fix possible crash when splitting contacts with invalid e164s. 2026-01-08 07:39:41 -05:00
Cody Henthorne
b7d671dcbd Add better ux when group limit reached when joining via link. 2026-01-08 07:39:40 -05:00
Alex Hart
eb4540600e Make megaphones scrollable again. 2026-01-08 07:39:40 -05:00
Michelle Tang
22fc874b99 Avoid italicizing glyphs. 2026-01-08 07:39:40 -05:00
Michelle Tang
282a707bf9 Fix talkback saying meters instead of minutes. 2026-01-08 07:39:40 -05:00
Cody Henthorne
942c155723 Fix request to join approved message not showing up. 2026-01-08 07:39:40 -05:00
Jim Gustafson
286ae25ac5 Update to RingRTC v2.61.0 2026-01-08 07:39:40 -05:00
Alex Hart
38ad0903ff Fix issue where attachment albums do not update if one object is deleted. 2026-01-08 07:39:40 -05:00
Alex Hart
d76eb9a9e4 Add nicer snackbar propagation. 2026-01-08 07:39:40 -05:00
Alex Hart
a3e8ca8d33 Implement new call layout. 2026-01-08 07:39:39 -05:00
Michelle Tang
e1454cfc6a Fix notification profile overrides. 2026-01-08 07:39:39 -05:00
Alex Hart
df6d446e83 Update something else title. 2026-01-08 07:39:39 -05:00
Greyson Parrelli
2d17082a76 Backfill plaintext hashes for quotes. 2026-01-08 07:39:39 -05:00
Alex Hart
9aa4797792 Ensure when we start the calling activity that we turn the screen on. 2026-01-08 07:39:39 -05:00
Greyson Parrelli
3508269c17 Fix some places where data_hash_end was not being set. 2026-01-08 07:39:39 -05:00
Greyson Parrelli
c18e6e5e67 Fix export issue around long-text and quote-long texts. 2026-01-08 07:39:39 -05:00
Michelle Tang
ce86b511f0 Clear profile override if none exists. 2026-01-08 07:39:39 -05:00
Michelle Tang
b65079ec20 Support pinned messages in backups. 2026-01-08 07:39:38 -05:00
Greyson Parrelli
b99fec4274 Have allowedToRequestCode take precendent in 429 reg responses. 2026-01-08 07:39:38 -05:00
Cody Henthorne
15677c663b Fix backup restore service concurrent modification crash on timeout. 2026-01-08 07:39:38 -05:00
Greyson Parrelli
1bd5b03636 Ensure envelope model updates info from metadata.
In practice this doesn't really matter because we don't read from it
after this point, but good to be consistent.
2026-01-08 07:39:38 -05:00
Greyson Parrelli
3542c363d9 Add more debug info for oversized messages. 2026-01-08 07:39:38 -05:00
Alex Hart
ec44b9aae7 Fix audio indicator when system piping call. 2026-01-08 07:39:38 -05:00
Michelle Tang
e4ec538f13 Fix unreliable allow multiple votes toggle. 2026-01-08 07:39:38 -05:00
Greyson Parrelli
3e54cc5c77 Fix call string format template. 2026-01-08 07:39:38 -05:00
Greyson Parrelli
b1feb76535 Don't prevent multi-line when in 'enter is send' mode.
Fixes #14469
2026-01-08 07:39:37 -05:00
Greyson Parrelli
a4b7804c9b Add a network debugging interface for regV5. 2026-01-08 07:39:37 -05:00
Alex Hart
18b2587936 Fix undersized additional action icon. 2025-12-19 16:57:52 -04:00
Alex Hart
1238151d73 CallGrid animation updates. 2025-12-19 16:57:52 -04:00
Greyson Parrelli
c25f6d0bc4 Refactor regV5 navigation to remove some unnecessary layers. 2025-12-19 16:57:52 -04:00
Michelle Tang
2ca4748e00 Fix long press crash on long polls. 2025-12-19 16:57:52 -04:00
Alex Hart
1c30a8f38e Fix call link info display. 2025-12-19 16:57:51 -04:00
Alex Hart
cd29a1715e Add nicer dropshadow to self-pip. 2025-12-19 16:57:51 -04:00
Alex Hart
c9d0a11e85 Fix PictureInPicture fling behavior and simplify focused mode. 2025-12-19 16:57:51 -04:00
Michelle Tang
4d8ed34d94 Only animate on banner creation. 2025-12-19 16:57:51 -04:00
Michelle Tang
d98f51395f Fix transparent banner line. 2025-12-19 16:57:51 -04:00
Greyson Parrelli
657a7d2a6b Simplify and improve the JumpToDateValidator. 2025-12-19 16:57:51 -04:00
Greyson Parrelli
d6ade56233 Add PIN creation/entry to regV5. 2025-12-19 16:57:51 -04:00
Alex Hart
d88a862e09 Bump version to 7.68.5 2025-12-19 16:55:53 -04:00
Alex Hart
9c06b07262 Update translations and other static files. 2025-12-19 16:52:18 -04:00
Cody Henthorne
c5aedc7d85 Disable retry pending sends system. 2025-12-19 14:04:32 -05:00
Alex Hart
b9c91d195d Bump version to 7.68.4 2025-12-15 16:39:50 -04:00
Alex Hart
d4d32c2d36 Update translations and other static files. 2025-12-15 16:36:08 -04:00
Alex Hart
b6538101df Update call quality string. 2025-12-15 16:11:22 -04:00
Alex Hart
7e4602863f Bump version to 7.68.3 2025-12-15 14:48:48 -04:00
Alex Hart
0cc35fe881 Update translations and other static files. 2025-12-15 14:44:35 -04:00
Greyson Parrelli
0620410072 Ensure that libraries use support for vectors.
Fixes crashes on API 23 devices.
2025-12-15 11:06:09 -05:00
Michelle Tang
ea758edb5e Bump version to 7.68.2 2025-12-12 15:01:54 -05:00
Michelle Tang
1ded375f6f Update translations and other static files. 2025-12-12 14:55:18 -05:00
Cody Henthorne
c67267b589 Properly calculate backup size when optimize media is enabled. 2025-12-12 14:17:17 -05:00
Cody Henthorne
b1eba86445 Fix optimized media not viewable from All Media. 2025-12-12 12:52:19 -05:00
Cody Henthorne
53accdb446 Fix auto download for wifi restore bug. 2025-12-12 11:32:52 -05:00
Michelle Tang
3b40ae3ad3 Bump version to 7.68.1 2025-12-11 17:19:10 -05:00
Michelle Tang
298271fc2b Update translations and other static files. 2025-12-11 17:14:08 -05:00
Michelle Tang
7b965bac71 Fixing the preDecodeColorInfo methodology.
Co-authored-by: Milan Stevanovic <milan@signal.org>
2025-12-11 15:44:58 -05:00
Greyson Parrelli
e930a0f8ac Do not include release notes in chat exports. 2025-12-11 15:43:22 -05:00
Michelle Tang
10133b16b3 Allow for optimized storage in production. 2025-12-10 17:53:24 -05:00
Greyson Parrelli
f610c1a8b1 Fix exporting release note messages. 2025-12-10 16:58:09 -05:00
Michelle Tang
e7aed3bab3 Bump version to 7.68.0 2025-12-10 14:55:48 -05:00
Michelle Tang
081ffe2c11 Update translations and other static files. 2025-12-10 14:49:09 -05:00
Michelle Tang
3e7b101dbf Update strings. 2025-12-10 14:41:07 -05:00
Alex Hart
0e50e9b26a Rotate call quality survey config value. 2025-12-10 14:41:07 -05:00
Cody Henthorne
b7c9c53176 Enable the 'optimize storage' feature for production users. 2025-12-10 14:41:07 -05:00
Michelle Tang
d75e9b7a4b Update strings. 2025-12-10 14:41:07 -05:00
Cody Henthorne
a967cd8541 Fix TransferControlView showing play button on images bug. 2025-12-10 14:41:07 -05:00
Alex Hart
ea42653ae8 Enable new calling UI for internal users by default. 2025-12-10 14:41:07 -05:00
Alex Hart
0ce5a2eb2b Fix in-call status. 2025-12-10 14:41:07 -05:00
Alex Hart
e75d28cfca Implement new call grid that has animations. 2025-12-10 14:41:07 -05:00
Alex Hart
224503f6bb Add nicer call quality animation. 2025-12-10 14:41:07 -05:00
Cody Henthorne
86aa866626 Fix crash in internal backup settings on wipe and restore. 2025-12-10 14:41:07 -05:00
Alex Hart
067a22ff90 Fix crash when keyboard animation ends after view destroyed. 2025-12-10 14:41:07 -05:00
Michelle Tang
673cff8eed Send sync message when unpinning. 2025-12-10 14:41:07 -05:00
jeffrey-signal
413bdb7b38 Add optional git hook to run formatter pre-push. 2025-12-10 14:41:07 -05:00
Michelle Tang
5e81f9c720 Fix spacing between banner. 2025-12-10 14:41:07 -05:00
Cody Henthorne
22078bd774 Fix cancel offload restore banner showing complete bug. 2025-12-10 14:41:07 -05:00
jeffrey-signal
c33716c7b5 Fix split pane UI not showing after registration on large screen devices. 2025-12-10 14:41:07 -05:00
Alex Hart
587c9cb46f Prevent users from continuing while issue is not specified. 2025-12-10 14:41:07 -05:00
Michelle Tang
dda020b2bf Allow pinned messages to be resendable. 2025-12-10 14:41:07 -05:00
jeffrey-signal
6fba1b0153 Remove redundant total members count parameter from recipient picker callbacks. 2025-12-10 14:41:06 -05:00
Alex Hart
cf04bf8018 Reactions / Raised hands position adjustment. 2025-12-10 14:41:06 -05:00
jeffrey-signal
c1caff8005 Fix error when sending stories to unverified recipients. 2025-12-10 14:41:06 -05:00
Michelle Tang
04ccefbcf8 Do not allow pinning of gift badges. 2025-12-10 14:41:06 -05:00
Greyson Parrelli
6d32e534dc Fix any potentially stuck thumbnail uploads. 2025-12-10 14:41:06 -05:00
Cody Henthorne
293dcb93d6 Prevent backup restore service trashing for optimized restore. 2025-12-10 14:41:06 -05:00
Greyson Parrelli
6cb716516d Fix video color space transcoding issues.
Co-authored-by: Milan Stevanovic <milan@signal.org>
2025-12-10 14:41:06 -05:00
Alex Hart
aa3079673f Clear focus when entering gateway selection during badge checkout. 2025-12-10 14:41:06 -05:00
Alex Hart
37e77a53f9 Various picture in picture updates. 2025-12-10 14:41:06 -05:00
Greyson Parrelli
7969df4e4c Add basic reglock support to regV5. 2025-12-10 14:41:06 -05:00
Greyson Parrelli
4b06e14df6 Add FCM token support to regV5. 2025-12-10 14:41:06 -05:00
jeffrey-signal
da9c5edcc6 Fix share intent handling for multiple images with captions. 2025-12-05 09:50:55 -06:00
jeffrey-signal
109fc7f1fa Update ktlint to 1.5.0. 2025-12-05 09:48:22 -06:00
jeffrey-signal
cc381513ef Hide find by username option from add to groups search results. 2025-12-04 12:45:43 -06:00
Alex Hart
1ad19a7d45 Utilzie url keyboard when entering text into the proxy input. 2025-12-04 14:24:27 -04:00
Michelle Tang
3185bb6031 Add animation to pinned messages. 2025-12-04 11:10:20 -06:00
jeffrey-signal
630c21b07a Fix spinner build. 2025-12-04 11:10:20 -06:00
Alex Hart
6594b8532e Call quality icons and config rotation. 2025-12-04 11:10:20 -06:00
Alex Hart
c6de4c7650 Fix call screen timeout with remote video active. 2025-12-04 11:10:20 -06:00
Michelle Tang
7297f7a894 Handle offline state when pinning messages. 2025-12-04 11:10:20 -06:00
jeffrey-signal
0f5b790461 Update SignalIcons to support flexible icon sources.
Co-authored-by: Greyson Parrelli <greyson@signal.org>
2025-12-04 11:10:20 -06:00
Jordan Rose
783af42b1a Update to libsignal v0.86.6 (now on build-artifacts.signal.org) 2025-12-04 11:10:20 -06:00
Greyson Parrelli
ab5426e6bb Fix possible invalid poll export. 2025-12-04 11:10:20 -06:00
Greyson Parrelli
464345ee5f Fix possible issue when exporting thread merge update. 2025-12-04 11:10:20 -06:00
Greyson Parrelli
bafa9a26c6 Fix possible invalid username link export. 2025-12-04 11:10:20 -06:00
Greyson Parrelli
5d08906afd Support 'allow sealed sender from anyone' in archive. 2025-12-04 11:10:20 -06:00
3644 changed files with 209991 additions and 77938 deletions

View File

@@ -1,21 +1,20 @@
name: Reproducible Build Check
name: Check reproducible-build Dockerfile
on:
schedule:
- cron: '0 5 * * *'
- cron: "0 5 * * *"
permissions:
contents: read # to fetch code (actions/checkout)
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build image
run: cd reproducible-builds && docker build -t signal-android . && cd ..
- name: Test build
run: docker run --rm -v $(pwd):/project -w /project signal-android ./gradlew clean assemblePlayProdRelease
- uses: actions/checkout@v6
- name: Build image
run: |
cd reproducible-builds
docker build -t signal-android .
- name: Test build
run: docker run --memory=12g --rm -v "$(pwd)":/project -w /project signal-android ./gradlew --no-daemon --max-workers=1 -Dorg.gradle.jvmargs="-Xmx4g -XX:MaxMetaspaceSize=512m" -Dkotlin.compiler.execution.strategy=in-process bundlePlayProdRelease

1
.gitignore vendored
View File

@@ -32,3 +32,4 @@ maps.key
/local/
kls_database.db
.kotlin
lefthook-local.yml

View File

@@ -62,7 +62,7 @@ You will need to [sign our CLA](https://signal.org/cla/) before your pull reques
### Follow the Code Style Guidelines
Ensure that your code adheres to the [Code Style Guidelines](https://github.com/signalapp/Signal-Android/wiki/Code-Style-Guidelines) before submitting a pull request.
You can run `./gradlew format` to automatically check conformance with some of these guidelines.
You can run `./gradlew format` to automatically format your code. See `lefthook.yml` for instructions on how to run this as a git hook.
### Submit finished and well-tested pull requests
Please do not submit pull requests that are still a work in progress. Pull requests should be thoroughly tested and ready to merge before they are submitted.

View File

@@ -1,10 +1,17 @@
@file:Suppress("UnstableApiUsage")
import com.android.build.api.dsl.ManagedVirtualDevice
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.provider.ValueSource
import org.gradle.api.provider.ValueSourceParameters
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import java.io.FileInputStream
import java.text.SimpleDateFormat
import java.util.Date
import java.io.File
import java.util.Properties
plugins {
@@ -13,6 +20,7 @@ plugins {
alias(libs.plugins.ktlint)
alias(libs.plugins.compose.compiler)
alias(libs.plugins.kotlinx.serialization)
alias(benchmarkLibs.plugins.baselineprofile)
id("androidx.navigation.safeargs")
id("kotlin-parcelize")
id("com.squareup.wire")
@@ -22,12 +30,25 @@ plugins {
apply(from = "static-ips.gradle.kts")
val canonicalVersionCode = 1627
val canonicalVersionName = "7.67.1"
val canonicalVersionCode = 1648
val canonicalVersionName = "7.74.0"
val currentHotfixVersion = 0
val maxHotfixVersions = 100
val keystores: Map<String, Properties?> = mapOf("debug" to loadKeystoreProperties("keystore.debug.properties"))
// We don't want versions to ever end in 0 so that they don't conflict with nightly versions
val possibleHotfixVersions = (0 until maxHotfixVersions).toList().filter { it % 10 != 0 }
val debugKeystorePropertiesProvider = providers.of(PropertiesFileValueSource::class.java) {
parameters.file.set(rootProject.layout.projectDirectory.file("keystore.debug.properties"))
}
val languagesProvider = providers.of(LanguageListValueSource::class.java) {
parameters.resDir.set(layout.projectDirectory.dir("src/main/res"))
}
val languagesForBuildConfigProvider = languagesProvider.map { languages ->
languages.joinToString(separator = ", ") { language -> "\"$language\"" }
}
val selectableVariants = listOf(
"nightlyBackupRelease",
@@ -40,6 +61,8 @@ val selectableVariants = listOf(
"playProdSpinner",
"playProdCanary",
"playProdPerf",
"playProdMocked",
"playProdNonMinifiedMocked",
"playProdBenchmark",
"playProdInstrumentation",
"playProdRelease",
@@ -50,17 +73,11 @@ val selectableVariants = listOf(
"playStagingInstrumentation",
"playStagingRelease",
"websiteProdSpinner",
"websiteProdRelease"
"websiteProdRelease",
"githubProdSpinner",
"githubProdRelease"
)
val signalBuildToolsVersion: String by rootProject.extra
val signalCompileSdkVersion: String by rootProject.extra
val signalTargetSdkVersion: Int by rootProject.extra
val signalMinSdkVersion: Int by rootProject.extra
val signalNdkVersion: String by rootProject.extra
val signalJavaVersion: JavaVersion by rootProject.extra
val signalKotlinJvmTarget: String by rootProject.extra
wire {
kotlin {
javaInterop = true
@@ -71,22 +88,22 @@ wire {
}
protoPath {
srcDir("${project.rootDir}/libsignal-service/src/main/protowire")
srcDir("${project.rootDir}/lib/libsignal-service/src/main/protowire")
}
// Handled by libsignal
prune("signalservice.DecryptionErrorMessage")
}
ktlint {
version.set("1.2.1")
version.set("1.5.0")
}
android {
namespace = "org.thoughtcrime.securesms"
buildToolsVersion = signalBuildToolsVersion
compileSdkVersion = signalCompileSdkVersion
ndkVersion = signalNdkVersion
buildToolsVersion = libs.versions.buildTools.get()
compileSdkVersion = libs.versions.compileSdk.get()
ndkVersion = libs.versions.ndk.get()
flavorDimensions += listOf("distribution", "environment")
testBuildType = "instrumentation"
@@ -94,12 +111,12 @@ android {
android.bundle.language.enableSplit = false
kotlinOptions {
jvmTarget = signalKotlinJvmTarget
jvmTarget = libs.versions.kotlinJvmTarget.get()
freeCompilerArgs = listOf("-Xjvm-default=all")
suppressWarnings = true
}
keystores["debug"]?.let { properties ->
debugKeystorePropertiesProvider.orNull?.let { properties ->
signingConfigs.getByName("debug").apply {
storeFile = file("${project.rootDir}/${properties.getProperty("storeFile")}")
storePassword = properties.getProperty("storePassword")
@@ -139,8 +156,8 @@ android {
compileOptions {
isCoreLibraryDesugaringEnabled = true
sourceCompatibility = signalJavaVersion
targetCompatibility = signalJavaVersion
sourceCompatibility = JavaVersion.toVersion(libs.versions.javaVersion.get())
targetCompatibility = JavaVersion.toVersion(libs.versions.javaVersion.get())
}
packaging {
@@ -162,7 +179,8 @@ android {
"META-INF/LICENSE-notice.md",
"META-INF/proguard/androidx-annotations.pro",
"**/*.dylib",
"**/*.dll"
"**/*.dll",
"**/*.proto"
)
}
}
@@ -178,11 +196,14 @@ android {
}
defaultConfig {
versionCode = (canonicalVersionCode * maxHotfixVersions) + currentHotfixVersion
if (currentHotfixVersion >= maxHotfixVersions) {
throw AssertionError("Hotfix version offset is too large!")
}
versionCode = (canonicalVersionCode * maxHotfixVersions) + possibleHotfixVersions[currentHotfixVersion]
versionName = canonicalVersionName
minSdk = signalMinSdkVersion
targetSdk = signalTargetSdkVersion
minSdk = libs.versions.minSdk.get().toInt()
targetSdk = libs.versions.targetSdk.get().toInt()
vectorDrawables.useSupportLibrary = true
project.ext.set("archivesBaseName", "Signal")
@@ -215,13 +236,13 @@ android {
buildConfigField("String[]", "SIGNAL_CDSI_IPS", rootProject.extra["cdsi_ips"] as String)
buildConfigField("String[]", "SIGNAL_SVR2_IPS", rootProject.extra["svr2_ips"] as String)
buildConfigField("String", "SIGNAL_AGENT", "\"OWA\"")
buildConfigField("String", "SVR2_MRENCLAVE_LEGACY", "\"093be9ea32405e85ae28dbb48eb668aebeb7dbe29517b9b86ad4bec4dfe0e6a6\"")
buildConfigField("String", "SVR2_MRENCLAVE", "\"29cd63c87bea751e3bfd0fbd401279192e2e5c99948b4ee9437eafc4968355fb\"")
buildConfigField("String", "SVR2_MRENCLAVE_LEGACY", "\"29cd63c87bea751e3bfd0fbd401279192e2e5c99948b4ee9437eafc4968355fb\"")
buildConfigField("String", "SVR2_MRENCLAVE", "\"1240acbd4aa26974184844c8a46b1022d3957ac8a76c1fd8f5b1a15141ee0708\"")
buildConfigField("String[]", "UNIDENTIFIED_SENDER_TRUST_ROOTS", "new String[]{ \"BXu6QIKVz5MA8gstzfOgRQGqyLqOwNKHL6INkv3IHWMF\", \"BUkY0I+9+oPgDCn4+Ac6Iu813yvqkDr/ga8DzLxFxuk6\"}")
buildConfigField("String", "ZKGROUP_SERVER_PUBLIC_PARAMS", "\"AMhf5ywVwITZMsff/eCyudZx9JDmkkkbV6PInzG4p8x3VqVJSFiMvnvlEKWuRob/1eaIetR31IYeAbm0NdOuHH8Qi+Rexi1wLlpzIo1gstHWBfZzy1+qHRV5A4TqPp15YzBPm0WSggW6PbSn+F4lf57VCnHF7p8SvzAA2ZZJPYJURt8X7bbg+H3i+PEjH9DXItNEqs2sNcug37xZQDLm7X36nOoGPs54XsEGzPdEV+itQNGUFEjY6X9Uv+Acuks7NpyGvCoKxGwgKgE5XyJ+nNKlyHHOLb6N1NuHyBrZrgtY/JYJHRooo5CEqYKBqdFnmbTVGEkCvJKxLnjwKWf+fEPoWeQFj5ObDjcKMZf2Jm2Ae69x+ikU5gBXsRmoF94GXTLfN0/vLt98KDPnxwAQL9j5V1jGOY8jQl6MLxEs56cwXN0dqCnImzVH3TZT1cJ8SW1BRX6qIVxEzjsSGx3yxF3suAilPMqGRp4ffyopjMD1JXiKR2RwLKzizUe5e8XyGOy9fplzhw3jVzTRyUZTRSZKkMLWcQ/gv0E4aONNqs4P+NameAZYOD12qRkxosQQP5uux6B2nRyZ7sAV54DgFyLiRcq1FvwKw2EPQdk4HDoePrO/RNUbyNddnM/mMgj4FW65xCoT1LmjrIjsv/Ggdlx46ueczhMgtBunx1/w8k8V+l8LVZ8gAT6wkU5J+DPQalQguMg12Jzug3q4TbdHiGCmD9EunCwOmsLuLJkz6EcSYXtrlDEnAM+hicw7iergYLLlMXpfTdGxJCWJmP4zqUFeTTmsmhsjGBt7NiEB/9pFFEB3pSbf4iiUukw63Eo8Aqnf4iwob6X1QviCWuc8t0LUlT9vALgh/f2DPVOOmR0RW6bgRvc7DSF20V/omg+YBw==\"")
buildConfigField("String", "GENERIC_SERVER_PUBLIC_PARAMS", "\"AByD873dTilmOSG0TjKrvpeaKEsUmIO8Vx9BeMmftwUs9v7ikPwM8P3OHyT0+X3EUMZrSe9VUp26Wai51Q9I8mdk0hX/yo7CeFGJyzoOqn8e/i4Ygbn5HoAyXJx5eXfIbqpc0bIxzju4H/HOQeOpt6h742qii5u/cbwOhFZCsMIbElZTaeU+BWMBQiZHIGHT5IE0qCordQKZ5iPZom0HeFa8Yq0ShuEyAl0WINBiY6xE3H/9WnvzXBbMuuk//eRxXgzO8ieCeK8FwQNxbfXqZm6Ro1cMhCOF3u7xoX83QhpN\"")
buildConfigField("String", "BACKUP_SERVER_PUBLIC_PARAMS", "\"AJwNSU55fsFCbgaxGRD11wO1juAs8Yr5GF8FPlGzzvdJJIKH5/4CC7ZJSOe3yL2vturVaRU2Cx0n751Vt8wkj1bozK3CBV1UokxV09GWf+hdVImLGjXGYLLhnI1J2TWEe7iWHyb553EEnRb5oxr9n3lUbNAJuRmFM7hrr0Al0F0wrDD4S8lo2mGaXe0MJCOM166F8oYRQqpFeEHfiLnxA1O8ZLh7vMdv4g9jI5phpRBTsJ5IjiJrWeP0zdIGHEssUeprDZ9OUJ14m0v61eYJMKsf59Bn+mAT2a7YfB+Don9O\"")
buildConfigField("String[]", "LANGUAGES", "new String[]{ ${languageList().map { "\"$it\"" }.joinToString(separator = ", ")} }")
buildConfigField("String[]", "LANGUAGES", "new String[]{ ${languagesForBuildConfigProvider.get()} }")
buildConfigField("int", "CANONICAL_VERSION_CODE", "$canonicalVersionCode")
buildConfigField("String", "DEFAULT_CURRENCIES", "\"EUR,AUD,GBP,CAD,CNY\"")
buildConfigField("String", "GIPHY_API_KEY", "\"3o6ZsYH6U6Eri53TXy\"")
@@ -260,7 +281,7 @@ android {
buildTypes {
getByName("debug") {
if (keystores["debug"] != null) {
if (debugKeystorePropertiesProvider.orNull != null) {
signingConfig = signingConfigs["debug"]
}
isDefault = true
@@ -341,6 +362,16 @@ android {
buildConfigField("boolean", "TRACING_ENABLED", "true")
}
create("mocked") {
initWith(getByName("debug"))
isDefault = false
isDebuggable = false
isMinifyEnabled = true
matchingFallbacks += "debug"
buildConfigField("String", "BUILD_VARIANT_TYPE", "\"Benchmark\"")
buildConfigField("boolean", "TRACING_ENABLED", "true")
}
create("canary") {
initWith(getByName("debug"))
isDefault = false
@@ -366,17 +397,18 @@ android {
buildConfigField("String", "BUILD_DISTRIBUTION_TYPE", "\"website\"")
}
create("nightly") {
val apkUpdateManifestUrl = if (file("${project.rootDir}/nightly-url.txt").exists()) {
file("${project.rootDir}/nightly-url.txt").readText().trim()
} else {
"<unset>"
}
create("github") {
dimension = "distribution"
versionNameSuffix = "-nightly-untagged-${getDateSuffix()}"
buildConfigField("boolean", "MANAGES_APP_UPDATES", "true")
buildConfigField("String", "APK_UPDATE_MANIFEST_URL", "\"${apkUpdateManifestUrl}\"")
buildConfigField("boolean", "MANAGES_APP_UPDATES", "false")
buildConfigField("String", "APK_UPDATE_MANIFEST_URL", "null")
buildConfigField("String", "BUILD_DISTRIBUTION_TYPE", "\"github\"")
}
create("nightly") {
dimension = "distribution"
versionNameSuffix = "-nightly-untagged-${getGitHash()}"
buildConfigField("boolean", "MANAGES_APP_UPDATES", "false")
buildConfigField("String", "APK_UPDATE_MANIFEST_URL", "null")
buildConfigField("String", "BUILD_DISTRIBUTION_TYPE", "\"nightly\"")
buildConfigField("boolean", "LINK_DEVICE_UX_ENABLED", "true")
}
@@ -402,8 +434,8 @@ android {
buildConfigField("String", "SIGNAL_CDN3_URL", "\"https://cdn3-staging.signal.org\"")
buildConfigField("String", "SIGNAL_CDSI_URL", "\"https://cdsi.staging.signal.org\"")
buildConfigField("String", "SIGNAL_SVR2_URL", "\"https://svr2.staging.signal.org\"")
buildConfigField("String", "SVR2_MRENCLAVE_LEGACY", "\"2e8cefe6e3f389d8426adb24e9b7fb7adf10902c96f06f7bbcee36277711ed91\"")
buildConfigField("String", "SVR2_MRENCLAVE", "\"a75542d82da9f6914a1e31f8a7407053b99cc99a0e7291d8fbd394253e19b036\"")
buildConfigField("String", "SVR2_MRENCLAVE_LEGACY", "\"a75542d82da9f6914a1e31f8a7407053b99cc99a0e7291d8fbd394253e19b036\"")
buildConfigField("String", "SVR2_MRENCLAVE", "\"97f151f6ed078edbbfd72fa9cae694dcc08353f1f5e8d9ccd79a971b10ffc535\"")
buildConfigField("String[]", "UNIDENTIFIED_SENDER_TRUST_ROOTS", "new String[]{\"BbqY1DzohE4NUZoVF+L18oUPrK3kILllLEJh2UnPSsEx\", \"BYhU6tPjqP46KGZEzRs1OL4U39V5dlPJ/X09ha4rErkm\"}")
buildConfigField("String", "ZKGROUP_SERVER_PUBLIC_PARAMS", "\"ABSY21VckQcbSXVNCGRYJcfWHiAMZmpTtTELcDmxgdFbtp/bWsSxZdMKzfCp8rvIs8ocCU3B37fT3r4Mi5qAemeGeR2X+/YmOGR5ofui7tD5mDQfstAI9i+4WpMtIe8KC3wU5w3Inq3uNWVmoGtpKndsNfwJrCg0Hd9zmObhypUnSkfYn2ooMOOnBpfdanRtrvetZUayDMSC5iSRcXKpdlukrpzzsCIvEwjwQlJYVPOQPj4V0F4UXXBdHSLK05uoPBCQG8G9rYIGedYsClJXnbrgGYG3eMTG5hnx4X4ntARBgELuMWWUEEfSK0mjXg+/2lPmWcTZWR9nkqgQQP0tbzuiPm74H2wMO4u1Wafe+UwyIlIT9L7KLS19Aw8r4sPrXZSSsOZ6s7M1+rTJN0bI5CKY2PX29y5Ok3jSWufIKcgKOnWoP67d5b2du2ZVJjpjfibNIHbT/cegy/sBLoFwtHogVYUewANUAXIaMPyCLRArsKhfJ5wBtTminG/PAvuBdJ70Z/bXVPf8TVsR292zQ65xwvWTejROW6AZX6aqucUjlENAErBme1YHmOSpU6tr6doJ66dPzVAWIanmO/5mgjNEDeK7DDqQdB1xd03HT2Qs2TxY3kCK8aAb/0iM0HQiXjxZ9HIgYhbtvGEnDKW5ILSUydqH/KBhW4Pb0jZWnqN/YgbWDKeJxnDbYcUob5ZY5Lt5ZCMKuaGUvCJRrCtuugSMaqjowCGRempsDdJEt+cMaalhZ6gczklJB/IbdwENW9KeVFPoFNFzhxWUIS5ML9riVYhAtE6JE5jX0xiHNVIIPthb458cfA8daR0nYfYAUKogQArm0iBezOO+mPk5vCNWI+wwkyFCqNDXz/qxl1gAntuCJtSfq9OC3NkdhQlgYQ==\"")
buildConfigField("String", "GENERIC_SERVER_PUBLIC_PARAMS", "\"AHILOIrFPXX9laLbalbA9+L1CXpSbM/bTJXZGZiuyK1JaI6dK5FHHWL6tWxmHKYAZTSYmElmJ5z2A5YcirjO/yfoemE03FItyaf8W1fE4p14hzb5qnrmfXUSiAIVrhaXVwIwSzH6RL/+EO8jFIjJ/YfExfJ8aBl48CKHgu1+A6kWynhttonvWWx6h7924mIzW0Czj2ROuh4LwQyZypex4GuOPW8sgIT21KNZaafgg+KbV7XM1x1tF3XA17B4uGUaDbDw2O+nR1+U5p6qHPzmJ7ggFjSN6Utu+35dS1sS0P9N\"")
@@ -438,42 +470,43 @@ android {
ignoreWarnings = true
quiet = true
disable += "LintError"
}
applicationVariants.all {
outputs
.map { it as com.android.build.gradle.internal.api.ApkVariantOutputImpl }
.forEach { output ->
if (output.baseName.contains("nightly")) {
var tag = getCurrentGitTag()
if (!tag.isNullOrEmpty()) {
if (tag.startsWith("v")) {
tag = tag.substring(1)
}
output.versionNameOverride = tag
output.outputFileName = output.outputFileName.replace(".apk", "-${output.versionNameOverride}.apk")
} else {
output.outputFileName = output.outputFileName.replace(".apk", "-$versionName.apk")
}
} else {
output.outputFileName = output.outputFileName.replace(".apk", "-$versionName.apk")
if (currentHotfixVersion >= maxHotfixVersions) {
throw AssertionError("Hotfix version is too large!")
}
}
}
lintConfig = rootProject.file("lint.xml")
}
androidComponents {
beforeVariants { variant ->
variant.enable = variant.name in selectableVariants
}
onVariants { variant ->
onVariants(selector().all()) { variant: com.android.build.api.variant.ApplicationVariant ->
// Include the test-only library on debug builds.
if (variant.buildType != "instrumentation") {
variant.packaging.jniLibs.excludes.add("**/libsignal_jni_testing.so")
}
// Starting with minSdk 23, Android leaves native libraries uncompressed, which is fine for the Play Store, but not for our self-distributed APKs.
// This reverts it to the legacy behavior, compressing the native libraries, and drastically reducing the APK file size.
if (variant.name.contains("website", ignoreCase = true) || variant.name.contains("github", ignoreCase = true)) {
variant.packaging.jniLibs.useLegacyPackaging.set(true)
}
// Version overrides
if (variant.name.contains("nightly", ignoreCase = true)) {
var tag = getNightlyTagForCurrentCommit()
if (!tag.isNullOrEmpty()) {
if (tag.startsWith("v")) {
tag = tag.substring(1)
}
// We add a multiple of maxHotfixVersions to nightlies to ensure we're always at least that many versions ahead
val nightlyBuffer = (5 * maxHotfixVersions)
val nightlyVersionCode = (canonicalVersionCode * maxHotfixVersions) + (getNightlyBuildNumber(tag) * 10) + nightlyBuffer
variant.outputs.forEach { output ->
output.versionName.set(tag)
output.versionCode.set(nightlyVersionCode)
}
}
}
}
}
@@ -486,6 +519,40 @@ android {
java.srcDir(path)
}
}
sourceSets {
getByName("mocked") {
java.srcDir("$projectDir/src/benchmarkShared/java")
manifest.srcFile("$projectDir/src/benchmarkShared/AndroidManifest.xml")
}
getByName("benchmark") {
java.srcDir("$projectDir/src/benchmarkShared/java")
manifest.srcFile("$projectDir/src/benchmarkShared/AndroidManifest.xml")
}
}
applicationVariants.configureEach {
outputs.configureEach {
if (this is com.android.build.gradle.internal.api.BaseVariantOutputImpl) {
outputFileName = outputFileName.replace(".apk", "-$versionName.apk")
}
}
}
}
baselineProfile {
warnings {
disabledVariants = false
}
mergeIntoMain = true
variants.create("mocked") {
from(project(":baseline-profile"))
}
dexLayoutOptimization = false
}
dependencies {
@@ -493,21 +560,24 @@ dependencies {
ktlintRuleset(libs.ktlint.twitter.compose)
coreLibraryDesugaring(libs.android.tools.desugar)
implementation(project(":libsignal-service"))
implementation(project(":paging"))
implementation(project(":core-util"))
implementation(project(":glide-config"))
implementation(project(":video"))
implementation(project(":device-transfer"))
implementation(project(":image-editor"))
implementation(project(":donations"))
implementation(project(":debuglogs-viewer"))
implementation(project(":contacts"))
implementation(project(":qr"))
implementation(project(":sticky-header-grid"))
implementation(project(":photoview"))
implementation(project(":core-ui"))
implementation(project(":core-models"))
implementation(project(":lib:libsignal-service"))
implementation(project(":lib:paging"))
implementation(project(":core:util"))
implementation(project(":lib:glide"))
implementation(project(":lib:video"))
implementation(project(":lib:device-transfer"))
implementation(project(":lib:image-editor"))
implementation(project(":lib:donations"))
implementation(project(":lib:debuglogs-viewer"))
implementation(project(":lib:contacts"))
implementation(project(":lib:qr"))
implementation(project(":lib:sticky-header-grid"))
implementation(project(":lib:photoview"))
implementation(project(":lib:blurhash"))
implementation(project(":core:ui"))
implementation(project(":core:models"))
implementation(project(":core:models-jvm"))
implementation(project(":feature:camera"))
implementation(libs.androidx.fragment.ktx)
implementation(libs.androidx.appcompat) {
@@ -531,6 +601,8 @@ dependencies {
implementation(libs.androidx.navigation.fragment.ktx)
implementation(libs.androidx.navigation.ui.ktx)
implementation(libs.androidx.navigation.compose)
implementation(libs.androidx.navigation3.runtime)
implementation(libs.androidx.navigation3.ui)
implementation(libs.androidx.lifecycle.viewmodel.ktx)
implementation(libs.androidx.lifecycle.livedata.ktx)
implementation(libs.androidx.lifecycle.process)
@@ -607,9 +679,10 @@ dependencies {
implementation(libs.androidx.credentials.compat)
implementation(libs.kotlinx.serialization.json)
implementation(project(":billing"))
implementation(project(":lib:billing"))
implementation(project(":feature:media-send"))
"spinnerImplementation"(project(":spinner"))
"spinnerImplementation"(project(":lib:spinner"))
"canaryImplementation"(libs.square.leakcanary)
@@ -635,7 +708,7 @@ dependencies {
}
testImplementation(testLibs.conscrypt.openjdk.uber)
testImplementation(testLibs.mockk)
testImplementation(testFixtures(project(":libsignal-service")))
testImplementation(testFixtures(project(":lib:libsignal-service")))
testImplementation(testLibs.espresso.core)
testImplementation(testLibs.kotlinx.coroutines.test)
testImplementation(libs.androidx.compose.ui.test.junit4)
@@ -656,31 +729,29 @@ dependencies {
androidTestUtil(testLibs.androidx.test.orchestrator)
}
fun assertIsGitRepo() {
if (!file("${project.rootDir}/.git").exists()) {
throw IllegalStateException("Must be a git repository to guarantee reproducible builds! (git hash is part of APK)")
tasks.withType<Test>().configureEach {
testLogging {
events("failed")
exceptionFormat = TestExceptionFormat.FULL
showCauses = true
showExceptions = true
showStackTraces = true
}
}
fun getLastCommitTimestamp(): String {
assertIsGitRepo()
return providers.exec {
commandLine("git", "log", "-1", "--pretty=format:%ct")
}.standardOutput.asText.get() + "000"
}
fun getGitHash(): String {
assertIsGitRepo()
return providers.exec {
commandLine("git", "rev-parse", "HEAD")
}.standardOutput.asText.get().trim().substring(0, 12)
}
fun getCurrentGitTag(): String? {
assertIsGitRepo()
fun getNightlyTagForCurrentCommit(): String? {
val output = providers.exec {
commandLine("git", "tag", "--points-at", "HEAD")
}.standardOutput.asText.get().trim()
@@ -693,63 +764,69 @@ fun getCurrentGitTag(): String? {
}
}
tasks.withType<Test>().configureEach {
testLogging {
events("failed")
exceptionFormat = TestExceptionFormat.FULL
showCauses = true
showExceptions = true
showStackTraces = true
fun getNightlyBuildNumber(tag: String?): Int {
if (tag == null) {
return 0
}
}
gradle.taskGraph.whenReady {
if (gradle.startParameter.taskNames.any { it.contains("nightly", ignoreCase = true) }) {
if (!file("${project.rootDir}/nightly-url.txt").exists()) {
throw GradleException("Missing required file: nightly-url.txt")
}
}
}
fun loadKeystoreProperties(filename: String): Properties? {
val keystorePropertiesFile = file("${project.rootDir}/$filename")
return if (keystorePropertiesFile.exists()) {
val keystoreProperties = Properties()
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
keystoreProperties
} else {
null
}
}
fun getDateSuffix(): String {
return SimpleDateFormat("yyyy-MM-dd-HH:mm").format(Date())
val match = Regex("-(\\d{3})$").find(tag)
return match?.groupValues?.get(1)?.toIntOrNull() ?: 0
}
fun getMapsKey(): String {
val mapKey = file("${project.rootDir}/maps.key")
return providers
.gradleProperty("mapsKey")
.orElse(providers.environmentVariable("MAPS_KEY"))
.orElse("AIzaSyCSx9xea86GwDKGznCAULE9Y5a8b-TfN9U")
.get()
}
return if (mapKey.exists()) {
mapKey.readLines()[0]
} else {
"AIzaSyCSx9xea86GwDKGznCAULE9Y5a8b-TfN9U"
abstract class LanguageListValueSource : ValueSource<List<String>, LanguageListValueSource.Params> {
interface Params : ValueSourceParameters {
@get:InputDirectory
@get:PathSensitive(PathSensitivity.RELATIVE)
val resDir: DirectoryProperty
}
override fun obtain(): List<String> {
// In API 35, language codes for Hebrew and Indonesian now use the ISO 639-1 code ("he" and "id").
// However, the value resources still only support the outdated code ("iw" and "in") so we have
// to manually indicate that we support these languages.
val updatedLanguageCodes = listOf("he", "id")
val resRoot = parameters.resDir.asFile.get()
val languages = resRoot
.walkTopDown()
.filter { it.isFile && it.name == "strings.xml" }
.mapNotNull { stringFile -> stringFile.parentFile?.name }
.map { valuesFolderName -> valuesFolderName.removePrefix("values-") }
.filter { valuesFolderName -> valuesFolderName != "values" }
.map { languageCode -> languageCode.replace("-r", "_") }
.toList()
.distinct()
.sorted()
return languages + updatedLanguageCodes + "en"
}
}
fun Project.languageList(): List<String> {
// In API 35, language codes for Hebrew and Indonesian now use the ISO 639-1 code ("he" and "id").
// However, the value resources still only support the outdated code ("iw" and "in") so we have
// to manually indicate that we support these languages.
val updatedLanguageCodes = listOf("he", "id")
abstract class PropertiesFileValueSource : ValueSource<Properties?, PropertiesFileValueSource.Params> {
interface Params : ValueSourceParameters {
@get:InputFile
@get:Optional
@get:PathSensitive(PathSensitivity.RELATIVE)
val file: RegularFileProperty
}
return fileTree("src/main/res") { include("**/strings.xml") }
.map { stringFile -> stringFile.parentFile.name }
.map { valuesFolderName -> valuesFolderName.replace("values-", "") }
.filter { valuesFolderName -> valuesFolderName != "values" }
.map { languageCode -> languageCode.replace("-r", "_") }
.distinct()
.sorted() + updatedLanguageCodes + "en"
override fun obtain(): Properties? {
val f: File = parameters.file.asFile.get()
if (!f.exists()) return null
return Properties().apply {
f.inputStream().use { load(it) }
}
}
}
fun String.capitalize(): String {

Some files were not shown because too many files have changed in this diff Show More