Compare commits

...

320 Commits

Author SHA1 Message Date
Sarah Jamie Lewis 7741b255da
Format
continuous-integration/drone/pr Build is pending Details
continuous-integration/drone/push Build is pending Details
2024-04-16 10:58:30 -07:00
Sarah Jamie Lewis 3aa0042b71
Fix scaling on Contact Row Accept/Reject / Fix Color Blending 2024-04-16 10:58:22 -07:00
Sarah Jamie Lewis 4cb59d6cbc Merge pull request 'theme loading must take place after cwtch.Start so `dev/` has time to be appended to path' (#880) from themeFixes2 into trunk
continuous-integration/drone/push Build is pending Details
Reviewed-on: #880
Reviewed-by: Sarah Jamie Lewis <sarah@openprivacy.ca>
2024-04-16 17:57:29 +00:00
Dan Ballard f8ec6099bc theme loading must take place after cwtch.Start so `dev/` has time to be appended to path
continuous-integration/drone/pr Build is pending Details
2024-04-16 17:57:21 +00:00
Sarah Jamie Lewis 6e010b27b7
Fix Light Theme List Tile Colors
continuous-integration/drone/pr Build is pending Details
continuous-integration/drone/push Build is passing Details
2024-04-15 11:39:23 -07:00
Dan Ballard 9f982ae167 finally remove dirty struct copy in linux my_application.cc and nsis path fix for flutter 3.19.3
continuous-integration/drone/pr Build is passing Details
continuous-integration/drone/push Build is passing Details
2024-04-05 15:46:33 -07:00
Dan Ballard db1f0ed41e android resourses for flutter 3.19.3
continuous-integration/drone/pr Build is pending Details
continuous-integration/drone/push Build is failing Details
2024-04-05 12:43:59 -07:00
Dan Ballard fab824edce new goldens and minor windows build update 2024-04-05 12:43:59 -07:00
Dan Ballard 48152acca1 android updates and minor flutter 3.19.3 fixes 2024-04-05 12:43:59 -07:00
Dan Ballard 644245d9ce update drone to flutter 3.19.3 containers 2024-04-05 12:43:59 -07:00
Dan Ballard b4b27da3e8 fixes to build with flutter 3.19.5 and macos sonoma 2024-04-05 12:43:59 -07:00
Dan Ballard 8f2b0b8563 fix splash 2024-04-05 12:43:59 -07:00
Sarah Jamie Lewis ff297ff9e9 Flutter 3.19.3 Upgrade + Theme Fixes 2024-04-05 12:43:59 -07:00
Dan Ballard 4dbfc83f16 drone: .deb depends on tor now
continuous-integration/drone/pr Build is pending Details
continuous-integration/drone/push Build is pending Details
2024-03-20 13:23:46 -07:00
Dan Ballard ddc23e35ca drone: add .deb generation support
continuous-integration/drone/pr Build is pending Details
continuous-integration/drone/push Build is failing Details
2024-03-20 10:29:15 -07:00
Sarah Jamie Lewis 50c9f66aca Merge pull request 'Formatting / Layout Tweaks' (#858) from android_foreground_fix into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #858
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2024-02-27 21:13:58 +00:00
Sarah Jamie Lewis a4421f831a Formatting / Layout Tweaks
continuous-integration/drone/pr Build is passing Details
2024-02-27 18:52:30 +00:00
Sarah Jamie Lewis 33bc7b6db8 Merge pull request 'Prevent Android from Wiping Unsaved Conversations Every Time the Foreground Reloads' (#857) from android_foreground_fix into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #857
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2024-02-27 03:49:21 +00:00
Sarah Jamie Lewis b23f8efaa1
Remove Log
continuous-integration/drone/pr Build is pending Details
2024-02-26 19:48:59 -08:00
Sarah Jamie Lewis e4c7729456
Update Version
continuous-integration/drone/pr Build is pending Details
2024-02-26 19:45:17 -08:00
Sarah Jamie Lewis b64b99b510
Add lastChecked time to all new messages
continuous-integration/drone/pr Build is passing Details
2024-02-26 19:31:09 -08:00
Sarah Jamie Lewis 058fba7e69
Sync cache for acks
continuous-integration/drone/pr Build is pending Details
Also remove defunct calls.
2024-02-26 19:24:04 -08:00
Sarah Jamie Lewis da0d63b0dc
Prevent Android from Wiping Unsaved Conversations Every Time the Foreground Reloads
continuous-integration/drone/pr Build is passing Details
2024-02-26 18:19:50 -08:00
Sarah Jamie Lewis 7cea83d141 Merge pull request 'Name vs File' (#856) from android_foreground_fix into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #856
2024-02-26 22:42:41 +00:00
Sarah Jamie Lewis 3b818e1181
Name vs File
continuous-integration/drone/pr Build is pending Details
2024-02-26 14:42:19 -08:00
Sarah Jamie Lewis 37ce0bd1d2 Merge pull request 'Pointer to Info' (#855) from android_foreground_fix into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #855
2024-02-26 22:28:10 +00:00
Sarah Jamie Lewis 26a3270585 Pointer to Info
continuous-integration/drone/pr Build is pending Details
2024-02-26 22:28:03 +00:00
Sarah Jamie Lewis 3463894dfd Merge pull request 'GOGS_ACCOUNT_TOKEN env var for upload nightlies' (#854) from android_foreground_fix into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #854
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2024-02-26 22:11:16 +00:00
Sarah Jamie Lewis a479c2aeba
GOGS_ACCOUNT_TOKEN env var for upload nightlies
continuous-integration/drone/pr Build is pending Details
2024-02-26 14:10:43 -08:00
Sarah Jamie Lewis fcd16b19c8 Merge pull request 'New Cwtch Version' (#853) from android_foreground_fix into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #853
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2024-02-26 21:52:00 +00:00
Sarah Jamie Lewis a866d9ff8a
Add Secret to Upload Nightlies Step
continuous-integration/drone/pr Build is pending Details
2024-02-26 12:22:57 -08:00
Sarah Jamie Lewis ff0bb0b548
Fix URL
continuous-integration/drone/pr Build is pending Details
2024-02-26 12:20:06 -08:00
Sarah Jamie Lewis 5ff87eb68a
New Cwtch Version
continuous-integration/drone/pr Build is passing Details
2024-02-26 11:51:07 -08:00
Sarah Jamie Lewis d22fccdd51 Merge pull request 'android_foreground_fix' (#852) from android_foreground_fix into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #852
2024-02-26 19:30:28 +00:00
Sarah Jamie Lewis 2f1e939fdd
Fix script name
continuous-integration/drone/pr Build is pending Details
2024-02-26 11:30:16 -08:00
Sarah Jamie Lewis 213ed00373 Merge pull request 'Add new upload-nightlies step' (#851) from android_foreground_fix into trunk
continuous-integration/drone/push Build is failing Details
Reviewed-on: #851
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2024-02-26 19:14:26 +00:00
Sarah Jamie Lewis ff7d1cbd05 Add new upload-nightlies step
continuous-integration/drone/pr Build is pending Details
2024-02-26 19:14:17 +00:00
Sarah Jamie Lewis 3014a85803 Move DIR to before where it is needed 2024-02-26 19:14:17 +00:00
Sarah Jamie Lewis a2f0fbdb38 Merge pull request 'Don't exit 1 in upload releases script' (#850) from android_foreground_fix into trunk
continuous-integration/drone/push Build is failing Details
Reviewed-on: #850
2024-02-26 18:07:42 +00:00
Sarah Jamie Lewis 1dbd4b7ffc
Don't exit 1 in upload releases script
continuous-integration/drone/pr Build is pending Details
2024-02-26 10:07:07 -08:00
Sarah Jamie Lewis 03ffed9b25
Checking Drone 2024-02-26 10:05:58 -08:00
Sarah Jamie Lewis dc45506f69 Merge pull request 'Actual Source Dir' (#849) from android_foreground_fix into trunk
continuous-integration/drone/push Build is failing Details
Reviewed-on: #849
2024-02-26 17:24:58 +00:00
Sarah Jamie Lewis 8a0d52ab16
Actual Source Dir
continuous-integration/drone/pr Build is pending Details
2024-02-26 09:24:43 -08:00
Sarah Jamie Lewis 7773efb8ee Merge pull request 'Fix Path in Drone' (#848) from android_foreground_fix into trunk
continuous-integration/drone/push Build is failing Details
Reviewed-on: #848
2024-02-26 16:51:09 +00:00
Sarah Jamie Lewis 8cc8af6a91
Fix Path in Drone
continuous-integration/drone/pr Build is pending Details
2024-02-26 08:50:14 -08:00
Sarah Jamie Lewis 9f03b48757 Merge pull request 'Automatically Upload Nightly Artifacts if a Release is Cut' (#844) from android_foreground_fix into trunk
continuous-integration/drone/push Build is failing Details
Reviewed-on: #844
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2024-02-24 05:09:18 +00:00
Sarah Jamie Lewis 098adc46e6
Add Check for Empty Release and Exit Early
continuous-integration/drone/pr Build is passing Details
2024-02-23 20:38:02 -08:00
Sarah Jamie Lewis f235e56fbb Merge pull request 'Fix Notifications for ConversationInfor' (#845) from android_notif_fix into android_foreground_fix
continuous-integration/drone/pr Build was killed Details
Reviewed-on: #845
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2024-02-24 04:34:58 +00:00
Sarah Jamie Lewis 11e7e58109
Fix Notifications for ConversationInfor 2024-02-23 15:05:59 -08:00
Sarah Jamie Lewis 5627f6a438
Used drone-gogs for building
continuous-integration/drone/pr Build is pending Details
2024-02-23 13:48:05 -08:00
Sarah Jamie Lewis caf85f337b
Automatically Upload Nightly Artifacts if a Release is Cut
continuous-integration/drone/pr Build is passing Details
2024-02-23 13:08:52 -08:00
Sarah Jamie Lewis eaae82ef55 Merge pull request 'Foreground Permission Reset' (#843) from android_foreground_fix into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #843
2024-02-23 19:48:17 +00:00
Sarah Jamie Lewis 0ea595692f
Foreground Permission Reset
continuous-integration/drone/pr Build is passing Details
As of Android 13 we need to request a permission to stay in the background
https://developer.android.com/develop/background-work/background-tasks/persistent/how-to/long-running
2024-02-23 11:33:59 -08:00
Sarah Jamie Lewis 5626e6ed90 Merge pull request 'load theme name for single mode themes' (#832) from fixThemes into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #832
2024-02-14 08:12:34 +00:00
Dan Ballard 273613a8b8 load theme name for single mode themes
continuous-integration/drone/pr Build was killed Details
2024-02-13 23:38:42 -08:00
Sarah Jamie Lewis ff55f70bd4
Formatting
continuous-integration/drone/pr Build is pending Details
continuous-integration/drone/push Build is passing Details
2024-02-13 20:29:14 -08:00
Dan Ballard 7febeeadb6
move padding for message list inside image decoration background 2024-02-13 20:28:56 -08:00
Dan Ballard a6c0e8105d
fix saving and displaying theme name 2024-02-13 20:28:56 -08:00
Sarah Jamie Lewis 3d2b960a20 Merge pull request 'Fix Lazy Loading for Themes' (#827) from theme-loading-fix into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #827
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2024-02-14 04:06:38 +00:00
Sarah Jamie Lewis f046dd923e
Dart Fix
continuous-integration/drone/pr Build is pending Details
2024-02-13 20:05:33 -08:00
Sarah Jamie Lewis 015b6ad10c
Fix Lazy Loading for Themes 2024-02-13 19:59:47 -08:00
Dan Ballard ea213080b1 fix theme loading when no colors stanza and prep last settings for translation and translations
continuous-integration/drone/pr Build is pending Details
continuous-integration/drone/push Build is pending Details
2024-02-14 03:18:45 +00:00
Sarah Jamie Lewis fecf29176b Merge pull request 'Improve Install Images #741' (#824) from 0.0.12 into trunk
continuous-integration/drone/push Build is pending Details
Reviewed-on: #824
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2024-02-14 03:18:16 +00:00
Sarah Jamie Lewis 4bad19926b
Shorten Blub in Installer
continuous-integration/drone/pr Build is pending Details
2024-02-13 13:06:48 -08:00
Sarah Jamie Lewis 75958faa38 Nicer Installer Txt
continuous-integration/drone/pr Build is pending Details
2024-02-13 21:00:25 +00:00
Sarah Jamie Lewis 8300acb6f9 Fixup Installer Text 2024-02-13 21:00:25 +00:00
Sarah Jamie Lewis 33f99a3b18 24 Color Title Image 2024-02-13 21:00:25 +00:00
Sarah Jamie Lewis b291188550 Try a 24bit color windows 3 2024-02-13 21:00:25 +00:00
Sarah Jamie Lewis 0342eae5ce Actual V3 2024-02-13 21:00:25 +00:00
Sarah Jamie Lewis fe085e4802 Windows 3.1 Bitmaps... 2024-02-13 21:00:25 +00:00
Sarah Jamie Lewis 38d84e0f62 Improve Install Images #741 2024-02-13 21:00:25 +00:00
Sarah Jamie Lewis 3be7066e5d Upgrade libCwtch to fix #810
continuous-integration/drone/pr Build is pending Details
continuous-integration/drone/push Build is pending Details
2024-02-13 19:08:31 +00:00
Sarah Jamie Lewis b492be0200 Merge pull request 'Fix Image Previews + Make Invitations the correct Size' (#821) from fix-images into trunk
continuous-integration/drone/push Build is pending Details
Reviewed-on: #821
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2024-02-13 04:00:17 +00:00
Sarah Jamie Lewis 6ba6f76ee1 Formatting and Consolidate Image Check
continuous-integration/drone/pr Build is pending Details
2024-02-12 12:03:21 -08:00
Sarah Jamie Lewis 4ea0d4261c Properly handle image experiment flags when showing sender side images 2024-02-12 12:00:36 -08:00
Sarah Jamie Lewis 88a8ac8cca Fix Height on Invitation Widgets 2024-02-12 12:00:36 -08:00
Sarah Jamie Lewis 0eb1b95811 Fix Sender Preview for Image Files 2024-02-12 12:00:36 -08:00
Dan Ballard e0546eb502 hide blodeuwedd in settings if not supported
continuous-integration/drone/pr Build is passing Details
continuous-integration/drone/push Build is pending Details
2024-02-10 09:40:35 -08:00
Sarah Jamie Lewis 68c83f2c9a Update Translations
continuous-integration/drone/pr Build is pending Details
continuous-integration/drone/push Build is passing Details
2024-02-09 16:24:54 -08:00
Sarah Jamie Lewis 8bc0605503 Merge pull request 'Resize/Scaling Fixes' (#818) from fixchat into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #818
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2024-02-10 00:11:14 +00:00
Sarah Jamie Lewis e4b2e7936f Fixup Debug Mode Overlaps
continuous-integration/drone/pr Build is pending Details
2024-02-09 15:54:19 -08:00
Sarah Jamie Lewis 8acefb8b0b Remove old code
continuous-integration/drone/pr Build is passing Details
2024-02-09 15:26:21 -08:00
Sarah Jamie Lewis ad9c974dbd Fix Quoted Message Width
continuous-integration/drone/pr Build is pending Details
2024-02-09 15:25:39 -08:00
Sarah Jamie Lewis 9efc3e3c4a Fix Width Calc
continuous-integration/drone/pr Build is pending Details
2024-02-09 13:49:00 -08:00
Sarah Jamie Lewis 5001255a8a Prep 1.14 RC
continuous-integration/drone/pr Build is pending Details
2024-02-09 13:37:13 -08:00
Sarah Jamie Lewis 4578cc51ec Upgrade Cwtch, Fix Android File Sharing, Fixup UI Scaling
continuous-integration/drone/pr Build is pending Details
2024-02-09 13:34:10 -08:00
Sarah Jamie Lewis a7041770a0 A few more profile screen scaling tweaks
continuous-integration/drone/pr Build is pending Details
2024-02-09 10:18:11 -08:00
Sarah Jamie Lewis 497a12e8b6 Use monospace for cwtch identifiers so they are fixed width
continuous-integration/drone/pr Build is pending Details
2024-02-09 10:06:36 -08:00
Sarah Jamie Lewis cd476f39c0 Make Contact Row Layout More Consistent
continuous-integration/drone/pr Build is passing Details
2024-02-09 09:56:03 -08:00
Sarah Jamie Lewis 907cc262bb Remove Comments Out Interface
continuous-integration/drone/pr Build is pending Details
2024-02-09 09:40:23 -08:00
Sarah Jamie Lewis cb079c2fd3 Fix Up File Sharing Overlay
continuous-integration/drone/pr Build is passing Details
2024-02-08 15:43:10 -08:00
Sarah Jamie Lewis 659c7fe75e Fixup Malformed Sizes + Preview Contraints 2024-02-08 14:10:43 -08:00
Sarah Jamie Lewis abd32293eb Fixup Quote Sizing 2024-02-08 14:00:17 -08:00
Sarah Jamie Lewis 30dd0982db Fix Juniper Theme 2024-02-08 13:54:36 -08:00
Sarah Jamie Lewis 52d0a6cf3f Fix Chat Resize Layout 2024-02-08 13:54:36 -08:00
Sarah Jamie Lewis 9b65048bfd Merge pull request 'de dupping theme images, saving ~ 200kb' (#817) from themeBits into trunk
continuous-integration/drone/push Build is pending Details
Reviewed-on: #817
2024-02-08 21:44:56 +00:00
Dan Ballard 75eeb90cbb de dupping theme images, saving ~ 200kb
continuous-integration/drone/pr Build is pending Details
2024-02-08 13:16:37 -08:00
Dan Ballard 3095e9099f marcia's theme refresh
continuous-integration/drone/pr Build is pending Details
continuous-integration/drone/push Build is passing Details
2024-02-07 13:12:41 -08:00
Dan Ballard 48dda98f25 more text selection and menu bg settings on other message bubbles
continuous-integration/drone/push Build was killed Details
2024-02-07 19:51:04 +00:00
Dan Ballard 8d1d9ded5e Merge pull request 'theme fixes and new fields: messageSelectionColor, portraitOnlineAwayColor, portraitOnlineBusyColor, textfieldSelectionColor, menuBackgroundColor' (#812) from themeBits into trunk
continuous-integration/drone/push Build was killed Details
Reviewed-on: #812
Reviewed-by: Sarah Jamie Lewis <sarah@openprivacy.ca>
2024-02-07 17:55:34 +00:00
Dan Ballard 7dc25b92c7 theme fixes and new fields: messageSelectionColor, portraitOnlineAwayColor, portraitOnlineBusyColor, textfieldSelectionColor, menuBackgroundColor
continuous-integration/drone/pr Build was killed Details
2024-02-07 09:40:14 -08:00
Dan Ballard 581c52a53f fix initializing gomobile cwtchdir
continuous-integration/drone/pr Build is passing Details
continuous-integration/drone/push Build is passing Details
2024-02-05 00:06:01 -08:00
Dan Ballard 74a9656216 formatting with -l 200
continuous-integration/drone/push Build is passing Details
2024-02-03 02:09:05 +00:00
Dan Ballard a8c957e679 add the ability to import themes and support for loading custom themes that aren't assets 2024-02-03 02:09:05 +00:00
Dan Ballard 183b88d8e0 should fix unlock button text and icon themeing
continuous-integration/drone/push Build is passing Details
2024-01-29 21:21:00 +00:00
Sarah Jamie Lewis da42a29e66 Merge pull request 'FIX #546 - Force Canadian Locale for Full Date Format' (#807) from fixdate into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #807
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2024-01-29 18:37:23 +00:00
Sarah Jamie Lewis 6b6c60d9e5 FIX #546 - Force Canadian Locale for Full Date Format
continuous-integration/drone/pr Build is pending Details
We want a consistent YYYY-mm-dd HH::MM format here so setting.locale
isn't desirable (e.g. en_US outputs mm-dd-YY)
2024-01-29 10:21:10 -08:00
Dan Ballard a48422cf5f add theme chatImageColor
continuous-integration/drone/pr Build is passing Details
continuous-integration/drone/push Build is passing Details
2024-01-16 19:10:54 -08:00
Dan Ballard 238cddd7d3 add themeImage setting and use 2024-01-09 21:56:47 -08:00
Dan Ballard 111bceab5d Merge pull request 'split settings panes into seperate files' (#800) from settingsPanesFiles into trunk
continuous-integration/drone/push Build is pending Details
Reviewed-on: #800
Reviewed-by: Sarah Jamie Lewis <sarah@openprivacy.ca>
2024-01-10 00:32:26 +00:00
Dan Ballard 04985ee7eb split settings panes into seperate files
continuous-integration/drone/pr Build is passing Details
2024-01-06 11:39:33 -08:00
Dan Ballard 2abbf223b2 Merge pull request 'fix wiring of loading files for yaml theme images' (#799) from assetsPath into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #799
Reviewed-by: Sarah Jamie Lewis <sarah@openprivacy.ca>
2024-01-05 17:51:54 +00:00
Dan Ballard 05b50638da fix wiring of loading files for yaml theme images
continuous-integration/drone/pr Build is passing Details
2024-01-05 01:13:43 -08:00
Sarah Jamie Lewis 10195b78f8 Merge pull request 'more translation updates' (#798) from i10nupdate into trunk
continuous-integration/drone/push Build is pending Details
Reviewed-on: #798
2024-01-04 21:56:02 +00:00
Dan Ballard 6b432aa345 more translation updates
continuous-integration/drone/pr Build is pending Details
2024-01-04 13:54:55 -08:00
Dan Ballard ee07e707d2 settings about translations
continuous-integration/drone/push Build is pending Details
2024-01-04 21:34:44 +00:00
Dan Ballard d142c10fef settings into pane 2024-01-04 21:34:44 +00:00
Sarah Jamie Lewis efb9ce94e7 Merge pull request 'Improve Logic for Handelling Interrupted Downloads' (#797) from post-stable-fixes into trunk
continuous-integration/drone/push Build is pending Details
Reviewed-on: #797
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2024-01-04 20:16:54 +00:00
Sarah Jamie Lewis e360a71d59 Add chatReactionColor to Juniper Theme
continuous-integration/drone/pr Build is pending Details
2024-01-04 12:15:50 -08:00
Sarah Jamie Lewis abd7fe7415 Improve Logic for Handelling Interrupted Downloads
continuous-integration/drone/pr Build is passing Details
Move logic into FileDownloadProgress model, simplify to
the lastUpdated cases which abstracts over the requested case.
2024-01-04 11:55:09 -08:00
Sarah Jamie Lewis cc8227d228 Hide Ev-Log When Not Devmode 2024-01-04 11:55:07 -08:00
Sarah Jamie Lewis 856ed3ef64 Upgrade Cwtch, Add Per-Profile Event Log 2024-01-04 11:54:42 -08:00
Sarah Jamie Lewis 1d70adb595 Formatting 2024-01-04 11:53:42 -08:00
Sarah Jamie Lewis d6d064b804 Fix Crash Bug in Android (ShareFile and Reconnect)
In rare situtaitons (exacerbated by debug mode and multiple
file shares in succession) ReconnectCwtchForeground events can result
in negative message counts being calculated in the UI.

This fix ensures that doesn't happen, but a complete fix will need to wait until #664
is implement in the backend
2024-01-04 11:53:03 -08:00
Dan Ballard 2012b2dc7d Merge pull request 'theme fixups for loading bg image and new chat reaction icon color' (#795) from themeImgDir into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #795
Reviewed-by: Sarah Jamie Lewis <sarah@openprivacy.ca>
2024-01-04 06:11:06 +00:00
Dan Ballard 68db0867d4 theme fixups for loading bg image and new chat reaction icon color
continuous-integration/drone/pr Build is pending Details
2024-01-03 22:05:08 -08:00
Sarah Jamie Lewis e32ec30a1e Fix Crash Bug in Android (ShareFile and Reconnect) + Force prettyDateString to use .toLocal() time + Formatting (#794)
continuous-integration/drone/push Build is passing Details
commit fe4726986f
Author: Sarah Jamie Lewis <sarah@openprivacy.ca>
Date:   Tue Jan 2 10:53:15 2024 -0800

    Formatting

commit d4e57f493e
Author: Sarah Jamie Lewis <sarah@openprivacy.ca>
Date:   Tue Jan 2 10:48:31 2024 -0800

    Fix Crash Bug in Android (ShareFile and Reconnect)

    In rare situtaitons (exacerbated by debug mode and multiple
    file shares in succession) ReconnectCwtchForeground events can result
    in negative message counts being calculated in the UI.

    This fix ensures that doesn't happen, but a complete fix will need to wait until #664
    is implement in the backend

commit 44925783f5
Author: Sarah Jamie Lewis <sarah@openprivacy.ca>
Date:   Tue Jan 2 09:14:49 2024 -0800

    Force prettyDateString to use .toLocal() time

    Fixes an issue where, on some platforms, contact row dates in non-streaming mode
    were displayed in UTC.

Reviewed-on: #794
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2024-01-03 22:10:07 +00:00
Dan Ballard e421642a02 turn themes into directories, add image support, add image support for chat area
continuous-integration/drone/pr Build is pending Details
continuous-integration/drone/push Build is passing Details
2023-12-10 15:17:57 -08:00
Dan Ballard 6aaa66ea4d del old tors on linux install 2023-12-10 10:38:54 -08:00
Sarah Jamie Lewis 7732b66cad Merge pull request 'bump pubspec version' (#781) from pubspecVer into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #781
2023-12-01 03:41:22 +00:00
Dan Ballard c3d8bb6b50 bump pubspec version
continuous-integration/drone/pr Build is passing Details
2023-11-30 19:13:37 -08:00
Dan Ballard c09f10b650 fix update scripts to tor 0.4.8.9 mac
continuous-integration/drone/pr Build is passing Details
continuous-integration/drone/push Build is passing Details
2023-11-29 12:08:06 -08:00
Dan Ballard e3f0f66445 fix update scripts to tor 0.4.8.9
continuous-integration/drone/pr Build is failing Details
2023-11-29 12:01:58 -08:00
Dan Ballard e722133cea update fetch tors to 0.4.8.9
continuous-integration/drone/pr Build is passing Details
continuous-integration/drone/push Build is failing Details
2023-11-25 11:11:34 -08:00
Dan Ballard d75e5f4a55 Revert "script to update tor-fetch script to latest published tor expert bundle; compress mac .dmg"
This reverts commit acf3fcb648.
2023-11-24 14:07:03 -08:00
Dan Ballard e7c7f8af8b Revert "fix windows tor fetch"
This reverts commit efb29e81b6.
2023-11-24 14:07:02 -08:00
Dan Ballard 837960b387 Revert "fix windows tor fetch"
This reverts commit 11a63eccc2.
2023-11-24 14:07:00 -08:00
Dan Ballard 54bdcbf9cd Revert "fix windows tor fetch"
This reverts commit 7628fea346.
2023-11-24 14:06:55 -08:00
Dan Ballard 7628fea346 fix windows tor fetch
continuous-integration/drone/pr Build is pending Details
continuous-integration/drone/push Build is passing Details
2023-11-19 18:59:25 -08:00
Dan Ballard 11a63eccc2 fix windows tor fetch
continuous-integration/drone/pr Build is passing Details
continuous-integration/drone/push Build is passing Details
2023-11-19 16:47:58 -08:00
Dan Ballard efb29e81b6 fix windows tor fetch
continuous-integration/drone/pr Build is pending Details
continuous-integration/drone/push Build is failing Details
2023-11-19 16:25:21 -08:00
Dan Ballard acf3fcb648 script to update tor-fetch script to latest published tor expert bundle; compress mac .dmg
continuous-integration/drone/pr Build is pending Details
continuous-integration/drone/push Build is passing Details
2023-11-19 15:02:17 -08:00
Dan Ballard 570b3670f0 actually add .DS_Store and remove from gitignore
continuous-integration/drone/pr Build was killed Details
continuous-integration/drone/push Build is passing Details
2023-11-16 09:17:32 -08:00
Dan Ballard 043218a6d8 package .DS_Store on mac dmg
continuous-integration/drone/pr Build was killed Details
2023-11-16 09:11:58 -08:00
Dan Ballard e01f46fd08 final new mac build machine fixes
continuous-integration/drone/pr Build is pending Details
continuous-integration/drone/push Build is failing Details
2023-11-16 09:00:35 -08:00
Dan Ballard cb956d61d0 testing mac build with new commit, also testing removing cocoapods from drone
continuous-integration/drone/pr Build is passing Details
continuous-integration/drone/push Build was killed Details
2023-11-16 08:24:08 -08:00
Dan Ballard 705bffc857 Add yaml loading of themes, convert themes to yaml; also minnor boot speed fix with delayed, and removed superfulous return from gobmobile Start
continuous-integration/drone/pr Build is passing Details
continuous-integration/drone/push Build was killed Details
2023-10-19 09:15:58 -07:00
Sarah Jamie Lewis 69b7ddb2c1 Clarify Offline Mode Behaviour
continuous-integration/drone/pr Build is pending Details
continuous-integration/drone/push Build is passing Details
2023-10-03 03:44:13 +00:00
Sarah Jamie Lewis 51f07cffd5 Merge pull request 'windows seems incompatible with Noto Color Emoji, try falling back to their default emoji font' (#745) from winemoji into trunk
continuous-integration/drone/push Build is pending Details
Reviewed-on: #745
Reviewed-by: Sarah Jamie Lewis <sarah@openprivacy.ca>
2023-10-03 03:44:02 +00:00
Dan Ballard f75050bcb7 windows seems incompatible with Noto Color Emoji, try falling back to their default emoji font
continuous-integration/drone/pr Build is pending Details
2023-10-02 16:25:37 -07:00
Dan Ballard 19377e033f change lastMessageTime into lastMessage[receive|sent]Time. Receive for sort, and sent for display.
continuous-integration/drone/pr Build is pending Details
continuous-integration/drone/push Build is passing Details
2023-09-26 16:51:18 -07:00
Sarah Jamie Lewis 297a7e8a22 Merge pull request 'Font Scaling' (#738) from stable-blockers into trunk
continuous-integration/drone/push Build is pending Details
Reviewed-on: #738
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-09-26 21:30:44 +00:00
Sarah Jamie Lewis 020291dc9a Scale Contact Select
continuous-integration/drone/pr Build is pending Details
2023-09-26 14:04:11 -07:00
Sarah Jamie Lewis f025e8ee53 Font Scaling
continuous-integration/drone/pr Build is pending Details
2023-09-26 14:02:26 -07:00
Sarah Jamie Lewis db672a24a2 Merge pull request 'stable-blockers' (#737) from stable-blockers into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #737
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-09-26 20:25:42 +00:00
Sarah Jamie Lewis cc0a99a47c Update Cwtch
continuous-integration/drone/pr Build is pending Details
2023-09-26 20:21:28 +00:00
Sarah Jamie Lewis 92a42bb2f8 Fix ConfigureConnections on Android, Expose PublishServerUpdate 2023-09-26 20:21:28 +00:00
Sarah Jamie Lewis f8ab1650c9 Merge pull request 'Migrate Invites to use Message Draft' (#736) from stable-blockers into trunk
continuous-integration/drone/push Build is pending Details
Reviewed-on: #736
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-09-26 20:18:30 +00:00
Sarah Jamie Lewis 2af90179e0 OPRS Copyright Year Update
continuous-integration/drone/pr Build is pending Details
2023-09-26 11:00:36 -07:00
Sarah Jamie Lewis e612003e23 Add Emoji Font, Fix rendering issue with malformed Invite.
continuous-integration/drone/pr Build is pending Details
2023-09-26 10:58:43 -07:00
Sarah Jamie Lewis efd6134a06 Pretty Print Epoch Dates to Never Regardless of Redaction Status
continuous-integration/drone/pr Build is pending Details
2023-09-26 09:45:42 -07:00
Sarah Jamie Lewis 294279f34e Migrate Invites to use Message Draft
continuous-integration/drone/pr Build is pending Details
2023-09-25 14:41:06 -07:00
Sarah Jamie Lewis 1b4d79e5be Merge pull request 'Partially Redact Contact Onions where Nicks are unavailable. Upgrade Cwtch' (#734) from stable-blockers into trunk
continuous-integration/drone/push Build is pending Details
Reviewed-on: #734
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-09-25 21:12:43 +00:00
Sarah Jamie Lewis e212585f4b Remove log line
continuous-integration/drone/pr Build is pending Details
2023-09-25 14:07:10 -07:00
Sarah Jamie Lewis 46f90f3136 Fix Creating Groups on Android
continuous-integration/drone/pr Build is pending Details
2023-09-25 14:05:44 -07:00
Sarah Jamie Lewis c89299e836 Add Uzbek Support, Clarify Offline Functionality
continuous-integration/drone/pr Build is pending Details
2023-09-25 12:33:04 -07:00
Sarah Jamie Lewis 224642e00d Partially Redact Contact Onions where Nicks are unavailable. Upgrade Cwtch
continuous-integration/drone/pr Build is pending Details
2023-09-25 12:06:09 -07:00
Sarah Jamie Lewis 526b0fffaa Merge pull request 'Fix Block/Unblock Desktop FFI' (#733) from stable-blockers into trunk
continuous-integration/drone/push Build is pending Details
Reviewed-on: #733
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-09-25 18:34:54 +00:00
Sarah Jamie Lewis 1e0980e7b4 Fix Block/Unblock Desktop FFI
continuous-integration/drone/pr Build is pending Details
2023-09-25 11:33:07 -07:00
Sarah Jamie Lewis ae9301c8d0 Merge pull request 'Streamer Mode Date Redaction / Format Fixes / A Few More Font Fixes' (#732) from stable-blockers into trunk
continuous-integration/drone/push Build is pending Details
Reviewed-on: #732
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-09-25 18:19:53 +00:00
Sarah Jamie Lewis 921f62d088 Streamer Mode Date Redaction / Format Fixes / A Few More Font Fixes
continuous-integration/drone/pr Build is running Details
2023-09-25 10:48:56 -07:00
Dan Ballard 37e6511718 Add autoloading default profiles with default password (removed from bindings)
continuous-integration/drone/pr Build is running Details
continuous-integration/drone/push Build is pending Details
2023-09-24 10:28:29 -07:00
Sarah Jamie Lewis feccc04933 Merge pull request 'New Icons, New Translations, More Complete Profile Menu' (#728) from stable-blockers into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #728
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-09-20 22:33:37 +00:00
Sarah Jamie Lewis deab06beda Format
continuous-integration/drone/pr Build is pending Details
2023-09-20 15:31:32 -07:00
Sarah Jamie Lewis 8ff0cfe5b1 New Icons, New Translations, More Complete Profile Menu 2023-09-20 15:31:32 -07:00
Sarah Jamie Lewis fa21a4f719 New Icons, New Translations, More Complete Profile Menu
continuous-integration/drone/pr Build is pending Details
2023-09-20 12:30:08 -07:00
Sarah Jamie Lewis 7b9dcf0a8b Merge pull request 'Upgrade Cwtch' (#727) from stable-blockers into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #727
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-09-20 00:19:36 +00:00
Sarah Jamie Lewis 0b7a75a243 Upgrade Cwtch
continuous-integration/drone/pr Build is pending Details
2023-09-20 00:18:15 +00:00
Sarah Jamie Lewis 877a4e4fb3 Merge pull request 'Remove Activate Peer Engine from Mode Switch (Configure Connections Does this Automatically)' (#726) from stable-blockers into trunk
continuous-integration/drone/push Build was killed Details
Reviewed-on: #726
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-09-19 22:34:09 +00:00
Sarah Jamie Lewis e59b81f013 Activate Offline mode when switching
continuous-integration/drone/pr Build is pending Details
2023-09-19 14:58:54 -07:00
Sarah Jamie Lewis 88a4a93326 Remove Activate Peer Engine from Mode Switch (Configure Connections Does this Automatically)
continuous-integration/drone/pr Build is passing Details
2023-09-19 14:54:41 -07:00
Sarah Jamie Lewis 545c0c091a Merge pull request 'Bump Cwtch and Version' (#725) from stable-blockers into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #725
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-09-19 20:31:11 +00:00
Sarah Jamie Lewis ee3925b4db Bump Cwtch and Version
continuous-integration/drone/pr Build is passing Details
2023-09-19 13:18:46 -07:00
Sarah Jamie Lewis a6c7911243 Merge pull request 'Update Goldens' (#724) from stable-blockers into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #724
2023-09-18 15:56:34 +00:00
Sarah Jamie Lewis 9a9ace5377 Update Goldens
continuous-integration/drone/pr Build is pending Details
2023-09-18 15:56:24 +00:00
Sarah Jamie Lewis a788540944 Merge pull request 'Only show appear offline if not in test mode (bug in test framework cannot scroll past)' (#723) from stable-blockers into trunk
continuous-integration/drone/push Build is failing Details
Reviewed-on: #723
2023-09-18 15:40:43 +00:00
Sarah Jamie Lewis 18bbfdea54 Only show appear offline if not in test mode (bug in test framework cannot scroll past)
continuous-integration/drone/pr Build is pending Details
2023-09-18 08:40:17 -07:00
Sarah Jamie Lewis 3856591d2f Merge pull request 'Move status options under profile image in contacts view' (#722) from stable-blockers into trunk
continuous-integration/drone/push Build is failing Details
Reviewed-on: #722
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-09-18 15:23:02 +00:00
Sarah Jamie Lewis 5d4f152c80 Upgrade Cwtch
continuous-integration/drone/pr Build is pending Details
2023-09-18 08:22:03 -07:00
Sarah Jamie Lewis 90ec07b7a5 Format and API Cleanup
continuous-integration/drone/pr Build is pending Details
2023-09-18 07:55:07 -07:00
Sarah Jamie Lewis 9c9fa2f88f Upgrade Flutter to 3.13.4 2023-09-18 06:54:42 -07:00
Sarah Jamie Lewis 93b6e5c8c7 Android APIS
continuous-integration/drone/pr Build is running Details
2023-09-13 18:40:04 -07:00
Sarah Jamie Lewis 919c7c35a6 Support Appear Offline
continuous-integration/drone/pr Build is pending Details
2023-09-13 18:38:08 -07:00
Sarah Jamie Lewis 16de726b47 Move status options under profile image in contacts view
continuous-integration/drone/pr Build is pending Details
Also has the impact of resolving space contention when resized very small.
2023-09-11 14:59:24 -07:00
Sarah Jamie Lewis 70a7b338b2 Merge pull request 'Initial Implementation of #522' (#721) from stable-blockers into trunk
continuous-integration/drone/push Build is pending Details
Reviewed-on: #721
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-09-11 21:53:41 +00:00
Sarah Jamie Lewis 864d862219 Fix up logs
continuous-integration/drone/pr Build is passing Details
2023-09-11 13:45:29 -07:00
Sarah Jamie Lewis 11fb137f6c Return empty platform info for desktop builds 2023-09-11 13:45:29 -07:00
Sarah Jamie Lewis 7f8150c8b7 Fix History Setting Icon 2023-09-11 13:45:29 -07:00
Sarah Jamie Lewis 0942f92fa9 In debug mode, display debug channel information in Settings (initial implementation) 2023-09-11 13:45:29 -07:00
Sarah Jamie Lewis b570a127ad Merge pull request 'More nicely handle errors in setting up dbus/network manager listeners' (#720) from stable-blockers into trunk
continuous-integration/drone/push Build is pending Details
Reviewed-on: #720
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-09-11 19:04:48 +00:00
Sarah Jamie Lewis 63976c25fd Merge pull request 'android sdk to 33' (#719) from andro33 into trunk
continuous-integration/drone/push Build is pending Details
Reviewed-on: #719
Reviewed-by: Sarah Jamie Lewis <sarah@openprivacy.ca>
2023-09-11 18:38:57 +00:00
Sarah Jamie Lewis 29bdd2af02 More nicely handle errors in setting up dbus/network manager listeners
continuous-integration/drone/pr Build is pending Details
2023-09-11 11:16:08 -07:00
Dan Ballard 2015e05cc0 android sdk to 33
continuous-integration/drone/pr Build is running Details
2023-09-11 08:20:56 -07:00
Sarah Jamie Lewis 05b1616473 Merge pull request 'Upgrade Cwtch, Minor Formatting, Fix StopFileShare' (#716) from stable-blockers into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #716
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-09-06 21:25:15 +00:00
Sarah Jamie Lewis 60b2b34abc Formatting
continuous-integration/drone/pr Build is running Details
2023-09-06 10:56:25 -07:00
Sarah Jamie Lewis a0a00b1ade More clear comment 2023-09-06 10:56:25 -07:00
Sarah Jamie Lewis c0f23fe647 Upgrade Cwtch 2023-09-06 10:56:25 -07:00
Sarah Jamie Lewis 62c7a4f4eb Fixup Test and FFI 2023-09-06 10:56:25 -07:00
Sarah Jamie Lewis 042b1287ff Merge pull request 'Whonix installation and onion-grater profile' (#715) from nyxnor/cwtch-ui:whonix into trunk
continuous-integration/drone/push Build is pending Details
Reviewed-on: #715
2023-09-06 17:47:45 +00:00
nyxnor 88e405fdfe Add Whonix installation script
continuous-integration/drone/pr Build is pending Details
2023-09-06 00:54:18 +00:00
nyxnor 549d8a0405 Harden Whonix onion-grater profile 2023-09-06 00:08:12 +00:00
Sarah Jamie Lewis e019f5f52d Merge pull request 'DisableProfile, SaveHistorySetting, DeleteServerInfo, Draft Whonix Config' (#710) from stable-blockers into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #710
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-08-22 23:27:47 +00:00
Sarah Jamie Lewis a36a5ea2fe Fix UI Tests.
continuous-integration/drone/pr Build is pending Details
2023-08-22 23:27:41 +00:00
Sarah Jamie Lewis 8e5074ec98 Update Cwtch 2023-08-22 23:27:41 +00:00
Sarah Jamie Lewis afb00e9295 DisableProfile, SaveHistorySetting, DeleteServerInfo, Draft Whonix Config
Fixes #593
Fixes #690
Fixes #629
2023-08-22 23:27:41 +00:00
Dan Ballard e249492641 Merge pull request 'add label to scaling slider' (#705) from scalingLabel into trunk
continuous-integration/drone/push Build is running Details
Reviewed-on: #705
Reviewed-by: Sarah Jamie Lewis <sarah@openprivacy.ca>
2023-08-04 00:56:33 +00:00
Dan Ballard cead758f78 add label to scaling slider
continuous-integration/drone/pr Build is passing Details
2023-08-02 17:44:19 -07:00
Sarah Jamie Lewis 75b7e77bc1 Merge pull request 'Upgrade Cwtch Autobindings Version' (#704) from search into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #704
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-08-02 20:24:16 +00:00
Sarah Jamie Lewis ad215635d2 Upgrade Cwtch Autobindings Version
continuous-integration/drone/pr Build is pending Details
2023-08-02 13:19:46 -07:00
Sarah Jamie Lewis a937301d59 Merge pull request 'Update Goldens' (#703) from search into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #703
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-08-02 19:56:02 +00:00
Sarah Jamie Lewis b19724036d Update Goldens
continuous-integration/drone/pr Build is pending Details
2023-08-02 19:55:57 +00:00
Sarah Jamie Lewis 70914c7a87 Merge pull request 'Fix up a few fonts. Add more scaling options' (#702) from search into trunk
continuous-integration/drone/push Build was killed Details
Reviewed-on: #702
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-08-02 19:52:50 +00:00
Sarah Jamie Lewis 4577541e23 Update MessageText size
continuous-integration/drone/pr Build is pending Details
2023-08-02 12:50:58 -07:00
Sarah Jamie Lewis 35da8daed6 Fix font scaling for profile sharing menu
continuous-integration/drone/pr Build is pending Details
2023-08-02 12:43:32 -07:00
Sarah Jamie Lewis 45a0b8b767 Fix NPE in FileSharingView when no files have been shared
continuous-integration/drone/pr Build is pending Details
2023-08-02 12:38:48 -07:00
Sarah Jamie Lewis 3e6c3faeda Update PopupMenu Scaling and CwtchTextField Default
continuous-integration/drone/pr Build is pending Details
2023-08-02 11:25:37 -07:00
Sarah Jamie Lewis 81f2d171aa Add default dropdown style to peer/group settings pages
continuous-integration/drone/pr Build is pending Details
2023-08-02 11:14:18 -07:00
Sarah Jamie Lewis 388257bbff Fix up a few fonts. Add more scaling options
continuous-integration/drone/pr Build is pending Details
2023-08-02 10:26:30 -07:00
Sarah Jamie Lewis 1b35f8a32b Merge pull request 'Support Conversation Search, Upgrade Cwtch, Patch support for downloading new Cwtch library name formats' (#699) from search into trunk
continuous-integration/drone/push Build is pending Details
Reviewed-on: #699
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-08-02 17:25:07 +00:00
Sarah Jamie Lewis dee5752d38 Cleanup + Android Support
continuous-integration/drone/pr Build was killed Details
2023-08-02 09:49:36 -07:00
Sarah Jamie Lewis 6188dffbc0 Support Conversation Search, Upgrade Cwtch, Patch support for downloading new Cwtch library name formats
continuous-integration/drone/pr Build is pending Details
2023-08-02 09:45:37 -07:00
Sarah Jamie Lewis 3d9d707b83 Merge pull request 'Upgrade Cwtch' (#694) from repbuilds-additional into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #694
2023-07-13 20:19:00 +00:00
Sarah Jamie Lewis baccdee90e Upgrade Cwtch
continuous-integration/drone/pr Build is failing Details
2023-07-13 20:09:23 +00:00
Sarah Jamie Lewis e55f7af49c Merge pull request 'Make tar archives deterministic' (#693) from repbuilds-additional into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #693
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-07-10 20:33:56 +00:00
Sarah Jamie Lewis 632764b407 Make tar archives deterministic
continuous-integration/drone/pr Build is pending Details
2023-07-10 10:52:50 -07:00
Sarah Jamie Lewis 3148a8e064 Reduce Build Variance (Path to Reproducible Builds) (#692)
continuous-integration/drone/push Build is passing Details
Pass flags through CMake to strip generated binaries and linked libraries of os-specific or build-specific information.

Replace the default linker script with an override that suppresses the .comment section which can contain OS-specific references.

Reviewed-on: #692
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-07-07 01:44:20 +00:00
Sarah Jamie Lewis cc4403261e Merge pull request 'Remove subscript formatting.' (#687) from 1.12-rc into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #687
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-06-16 01:52:16 +00:00
Sarah Jamie Lewis c305f7ba23 Remove subscript formatting.
continuous-integration/drone/pr Build is running Details
It is rarely used, and often conflicts with other formatting
2023-06-15 15:06:50 -07:00
Sarah Jamie Lewis 49fcbdf9aa Merge pull request 'Upgrade Cwtch, Update Languages, Fix DeleteContact flow, various smaller fixes' (#686) from 1.12-rc into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #686
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-06-14 21:54:57 +00:00
Sarah Jamie Lewis 2ab0456dd5 Enable Tor Test (without explicit version check)
continuous-integration/drone/pr Build is passing Details
2023-06-14 14:40:13 -07:00
Sarah Jamie Lewis 5afd7c8dd8 Remove issue with shutdown feature
continuous-integration/drone/pr Build was killed Details
2023-06-14 14:28:42 -07:00
Sarah Jamie Lewis cccd669608 Renable 02_save_load test
continuous-integration/drone/pr Build was killed Details
2023-06-14 14:26:46 -07:00
Sarah Jamie Lewis 7f7e4536f2 Move around integration tests to prevent issues with flutter gherkin
continuous-integration/drone/pr Build is running Details
2023-06-14 14:09:31 -07:00
Sarah Jamie Lewis 4a3770d0ec Make Tor Version Check nicer
continuous-integration/drone/pr Build is failing Details
2023-06-14 12:27:22 -07:00
Sarah Jamie Lewis c3cd8d5d66 Fixup integration tests
continuous-integration/drone/pr Build is failing Details
2023-06-14 11:57:49 -07:00
Sarah Jamie Lewis e416638e65 Upgrade Cwtch, Update Languages, Fix DeleteContact flow, various smaller fixes
continuous-integration/drone/pr Build is failing Details
2023-06-14 10:59:25 -07:00
Sarah Jamie Lewis 040692c01e Merge pull request 'update _FlDartProject struct and use new flutter apis for some settings' (#684) from f10lin into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #684
2023-06-05 17:36:22 +00:00
Dan Ballard af8ed5ac78 update _FlDartProject struct and use new flutter apis for some settings
continuous-integration/drone/pr Build is running Details
2023-06-04 17:54:20 -07:00
Sarah Jamie Lewis 59c5004153 Merge pull request 'dep-upgrades-3.10.0' (#673) from dep-upgrades-3.10.0 into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #673
2023-06-02 20:31:25 +00:00
Sarah Jamie Lewis b183966980 Merge pull request 'Ongoing UI and Android Fixes on top of depenencies.' (#678) from ui-many-fixes into dep-upgrades-3.10.0
continuous-integration/drone/pr Build is passing Details
Reviewed-on: #678
2023-06-02 19:57:58 +00:00
Sarah Jamie Lewis a69f3cb46e Language Updates (Mostly Swahili) 2023-06-02 19:57:53 +00:00
Sarah Jamie Lewis aedc033df9 Update Goldens 2023-06-02 19:57:53 +00:00
Sarah Jamie Lewis 3f262afcac Add support for Ukrainian and additional Swahili translations 2023-06-02 19:57:53 +00:00
Sarah Jamie Lewis 2d18089721 More font fixups 2023-06-02 19:57:53 +00:00
Sarah Jamie Lewis 103c1e08b5 Add Support for Swedish and Swahili 2023-06-02 19:57:53 +00:00
Sarah Jamie Lewis ea701546e7 Fixup Translate Position to minimize space when hidden 2023-06-02 19:57:53 +00:00
Sarah Jamie Lewis a2a09966e6 More small fixes / remove extra logging 2023-06-02 19:57:52 +00:00
Sarah Jamie Lewis ea22864341 Fix Android File Downloading Stuck Notification / Small Settings Font Tweaks 2023-06-02 19:57:52 +00:00
Sarah Jamie Lewis 67a99c903a Fix Up Quotes 2023-06-02 19:57:52 +00:00
Sarah Jamie Lewis 01b5c41208 Update Cwtch 2023-06-02 19:57:52 +00:00
Sarah Jamie Lewis 22bf5cfe92 Small UI Fixes / Font Styles / Abstractions 2023-06-02 19:57:52 +00:00
Dan Ballard 7f50036968 drone win cp files from right place
continuous-integration/drone/pr Build is failing Details
2023-06-02 12:30:02 -07:00
Sarah Jamie Lewis 0687718803 Merge pull request 'revert win toast to 0.0.2' (#682) from win-fixes into dep-upgrades-3.10.0
continuous-integration/drone/pr Build is failing Details
Reviewed-on: #682
2023-06-02 17:40:46 +00:00
Dan Ballard 90625eacb5 revert win toast to 0.0.2 2023-06-02 17:40:39 +00:00
Dan Ballard 81d62a06e3 update drone to flutter 3.10 containers
continuous-integration/drone/pr Build is failing Details
2023-05-29 17:40:44 +00:00
Dan Ballard 38ec143ef6 build updates for macos flutter 3.10 2023-05-29 17:40:44 +00:00
Sarah Jamie Lewis 7237318c53 Merge pull request 'windows fixes: especially new version of win toast' (#677) from win-fixes into dep-upgrades-3.10.0
continuous-integration/drone/pr Build is failing Details
Reviewed-on: #677
2023-05-22 20:10:03 +00:00
Dan Ballard 471ab96743 windows fixes: especially new version of win toast 2023-05-22 12:54:40 -07:00
Sarah Jamie Lewis 2c0e0e16f2 Upgrade .lock
continuous-integration/drone/pr Build is pending Details
2023-05-15 22:12:27 +00:00
Sarah Jamie Lewis 42d2e8e825 Use git flutter gherkin 2023-05-15 22:12:27 +00:00
Sarah Jamie Lewis 0567f60294 Dependency Upgrades 2023-05-15 22:12:27 +00:00
Sarah Jamie Lewis 37e50b9579 Upgrading Dependencies 2023-05-15 22:12:27 +00:00
Sarah Jamie Lewis 7e74421a3d Merge pull request 'font-scaling' (#672) from font-scaling into trunk
continuous-integration/drone/push Build is pending Details
Reviewed-on: #672
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-05-15 22:12:10 +00:00
Sarah Jamie Lewis ab5d11b8bb Update Translation / Text
continuous-integration/drone/pr Build is pending Details
2023-05-15 12:18:49 -07:00
Sarah Jamie Lewis bc677bab05 Update Goldens
continuous-integration/drone/pr Build is passing Details
2023-05-15 12:06:21 -07:00
Sarah Jamie Lewis 71bc23fcaa Add Inter Font 2023-05-15 12:05:28 -07:00
Sarah Jamie Lewis f945d77a7e Initial Cut 2023-05-15 10:56:03 -07:00
Sarah Jamie Lewis d09b82db76 Formatting + Font Scale Setting 2023-05-15 10:08:54 -07:00
Sarah Jamie Lewis 0b0a5095f1 Merge pull request 'detectNetwork' (#670) from detectNetwork into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #670
2023-05-15 16:06:25 +00:00
Dan Ballard 9e879d560f remove connecticity plus web code, platform we do not need
continuous-integration/drone/pr Build is passing Details
2023-05-12 16:44:27 -07:00
Dan Ballard c2e61f7cf7 build third_party/connectivity_plus for android 2023-05-12 16:44:27 -07:00
Dan Ballard 4acb6c74c3 handle connectivity fails (like nm being unavail on build server) more gracefully 2023-05-12 16:44:27 -07:00
Dan Ballard f996590683 fix version downgrades; remove internet specificity; update licenses 2023-05-12 16:44:27 -07:00
Dan Ballard ecde441480 lcg bump 2023-05-12 16:44:24 -07:00
Dan Ballard 25aa6bd9f4 add connectivity_plus listener to restart ACN/tor when network comes back up 2023-05-12 16:43:50 -07:00
Dan Ballard a18cf9329d import of connectivity_plus and massively reduced nm plugins 2023-05-12 16:43:50 -07:00
Sarah Jamie Lewis d9551a1cd9 Add Retry Peer Connection. Japanese Translation. Nice Nightly Redirect and Update Cwtch
continuous-integration/drone/pr Build is running Details
continuous-integration/drone/push Build is passing Details
2023-05-11 22:08:15 +00:00
Sarah Jamie Lewis b4371c9125 Merge pull request 'Fix Tails Install' (#669) from tails-fix into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #669
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-04-26 20:57:36 +00:00
Sarah Jamie Lewis a8a316ef71 Fix Tails Install
continuous-integration/drone/pr Build is pending Details
2023-04-26 19:45:43 +00:00
Sarah Jamie Lewis a0a3c9fc35 Merge pull request 'Upgrade Cwtch' (#667) from performance into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #667
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-04-22 02:23:45 +00:00
Sarah Jamie Lewis 00024c3afb Upgrade Cwtch
continuous-integration/drone/pr Build is running Details
2023-04-21 19:00:16 -07:00
Sarah Jamie Lewis 5ccac2d259 Merge pull request 'fix install-sys' (#666) from fixinstsys into trunk
continuous-integration/drone/push Build is pending Details
Reviewed-on: #666
2023-04-21 17:51:37 +00:00
Sarah Jamie Lewis 0f749d6b90 Merge branch 'trunk' into fixinstsys
continuous-integration/drone/pr Build is pending Details
2023-04-21 17:51:29 +00:00
Dan Ballard 7c49b05076 fix install-sys
continuous-integration/drone/pr Build is pending Details
2023-04-21 09:08:02 -05:00
Sarah Jamie Lewis 21ad80b722 Merge pull request 'File Sharing Bug Fixes' (#665) from performance into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #665
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-04-20 23:39:34 +00:00
Sarah Jamie Lewis 133f4a9429 File Sharing Bug Fixes
continuous-integration/drone/pr Build is pending Details
- Allow restarting of file shares that have timed out
- Fix NPE in FileBubble caused by deleting the underlying file
- Upgrade Cwtch with more file sharing fixes
- Move from RetVal to UpdateConversationAttributes to minimze UI thread issues
- Update bindings
2023-04-20 16:37:48 -07:00
Sarah Jamie Lewis c2f0633efb Merge pull request 'performance' (#663) from performance into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #663
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-04-18 21:14:58 +00:00
Sarah Jamie Lewis cbe78ff2a7 Notify Listeners for ProfileMode
continuous-integration/drone/pr Build is pending Details
2023-04-18 21:14:42 +00:00
Sarah Jamie Lewis 8cd1bec07b Add Translate TODO 2023-04-18 21:14:42 +00:00
Sarah Jamie Lewis 75026ad57f Upgrade VerifyOrResume API 2023-04-18 21:14:42 +00:00
Sarah Jamie Lewis 3cdaf5db55 Upgrade Cwtch 2023-04-18 21:14:42 +00:00
Sarah Jamie Lewis 2920afa10c Merge pull request 'Fix Performance Issues Relating to File Bubble' (#661) from performance into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #661
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-04-17 20:33:03 +00:00
Sarah Jamie Lewis ca770c642f Update lcg version
continuous-integration/drone/pr Build was killed Details
2023-04-17 13:28:34 -07:00
Sarah Jamie Lewis 605e9c08c6 Improve Message Row Highlight/Performance Rendering
continuous-integration/drone/pr Build was killed Details
2023-04-17 13:05:26 -07:00
Sarah Jamie Lewis 9c89c93013 Formatting
continuous-integration/drone/pr Build was killed Details
2023-04-17 10:38:19 -07:00
Sarah Jamie Lewis 5418bb00d8 Fix Performance Issues related to File Bubble / Downloading 2023-04-17 10:37:07 -07:00
Sarah Jamie Lewis 150d1c27b4 Merge pull request 'fix mac deploy version, make shas .txt' (#658) from pkg into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #658
2023-04-11 17:30:17 +00:00
Dan Ballard ff5332841a fix mac deploy version, make shas .txt
continuous-integration/drone/pr Build is passing Details
2023-04-10 00:50:53 -05:00
Dan Ballard 0003e94407 fix mac shas
continuous-integration/drone/pr Build is passing Details
continuous-integration/drone/push Build is passing Details
2023-04-09 22:17:40 -05:00
Dan Ballard 55c39438e6 packaging fixes
continuous-integration/drone/pr Build was killed Details
continuous-integration/drone/push Build is failing Details
2023-04-09 13:29:56 -05:00
Dan Ballard 4824aa16c9 stream line linux install scripts and make reusable templates; update drone: sha512, android pkg name, use commit date; dpeloy to same dir
continuous-integration/drone/push Build was killed Details
2023-04-09 17:35:43 +00:00
Sarah Jamie Lewis c010e45ba4 Merge pull request 'Upgrade Cwtch' (#651) from status into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #651
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-04-06 03:20:22 +00:00
Sarah Jamie Lewis 269b2389e0 Upgrade Cwtch
continuous-integration/drone/pr Build is passing Details
2023-04-05 20:01:14 -07:00
Sarah Jamie Lewis 029042c2fb Package Onion Grater configs
continuous-integration/drone/pr Build is pending Details
continuous-integration/drone/push Build is passing Details
2023-04-05 11:08:53 -07:00
Sarah Jamie Lewis 7748b81233 Merge pull request 'Status + Profile Attributes' (#647) from status into trunk
continuous-integration/drone/push Build is passing Details
Reviewed-on: #647
Reviewed-by: Dan Ballard <dan@openprivacy.ca>
2023-04-05 05:14:50 +00:00
Sarah Jamie Lewis 9cc8db2a6d Merge pull request 'Goldens' (#649) from tails into status
continuous-integration/drone/pr Build is running Details
Reviewed-on: #649
2023-04-05 04:59:09 +00:00
Sarah Jamie Lewis 80fed2e57b Update Goldens 2023-04-05 04:58:54 +00:00
Sarah Jamie Lewis e1c0960fee Update Cwtch Version
continuous-integration/drone/pr Build is failing Details
2023-04-05 04:19:11 +00:00
Sarah Jamie Lewis db421f2691 Initial Tails Support / Center align profile attributes / biotext 2023-04-05 04:19:11 +00:00
Sarah Jamie Lewis 267b1b09b1 Status + Profile Attributes 2023-04-05 04:19:11 +00:00
288 changed files with 14401 additions and 3956 deletions

View File

@ -8,7 +8,7 @@ clone:
steps:
- name: clone
image: openpriv/flutter-desktop:linux-fstable-3.7.1
image: openpriv/flutter-desktop:linux-fstable-3.19.3
environment:
buildbot_key_b64:
from_secret: buildbot_key_b64
@ -24,14 +24,14 @@ steps:
- git checkout $DRONE_COMMIT
- name: fetch
image: openpriv/flutter-desktop:linux-fstable-3.7.1
image: openpriv/flutter-desktop:linux-fstable-3.19.3
volumes:
- name: deps
path: /root/.pub-cache
commands:
- ./fetch-tor.sh
- echo `git describe --tags --abbrev=1` > VERSION
- echo `date +%G-%m-%d-%H-%M` > BUILDDATE
- echo `git log -1 --format=%cd --date=format:%G-%m-%d-%H-%M` > COMMIT_DATE
- flutter pub get
- mkdir deploy
- ./fetch-libcwtch-go.sh
@ -47,31 +47,46 @@ steps:
# #Todo: fix all the lint errors and add `-set_exit_status` above to enforce linting
- name: build-linux
image: openpriv/flutter-desktop:linux-fstable-3.7.1
image: openpriv/flutter-desktop:linux-fstable-3.19.3
volumes:
- name: deps
path: /root/.pub-cache
commands:
- flutter build linux --dart-define BUILD_VER=`cat VERSION` --dart-define BUILD_DATE=`cat BUILDDATE`
- flutter build linux --dart-define BUILD_VER=`cat VERSION` --dart-define BUILD_DATE=`cat COMMIT_DATE`
- linux/package-release.sh
- mkdir -p deploy/cwtch
- mkdir -p deploy/deb/cwtch/usr
- mkdir -p deploy/deb/cwtch/DEBIAN
- export VERSION=`cat VERSION | tr -d 'v'`
- sed "s|VERSION|$VERSION|g" linux/deb/control > deploy/deb/cwtch/DEBIAN/control
- cp -r build/linux/x64/release/bundle/* deploy/cwtch
- cd deploy
- tar -czf cwtch-`cat ../VERSION`.tar.gz cwtch
- cd cwtch
- INSTALL_PREFIX=./../deb/cwtch/usr DESKTOP_PREFIX=/usr/ ./install.sh
- cd ..
# we depend on tor, get it from the tor project apt repo
- rm -r deb/cwtch/usr/lib/cwtch/Tor
# Tar archives need a few tricks to make this deterministic, see https://reproducible-builds.org/docs/archives/
- tar --sort=name --mtime=`cat COMMIT_DATE` --owner=0 --group=0 --numeric-owner --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime -czf cwtch-`cat ../VERSION`.tar.gz cwtch
- rm -r cwtch
- cd deb
- dpkg-deb --build cwtch
- cd ..
- mv deb/cwtch.deb cwtch-$VERSION.deb
- rm -r deb
- name: linux-ui-tests
image: openpriv/flutter-desktop:linux-fstable-3.7.1
image: openpriv/flutter-desktop:linux-fstable-3.19.3
volumes:
- name: deps
path: /root/.pub-cache
commands:
- ./fetch-tor.sh
# Run 01_general, 02_global_settings, and 04_profile_mgmt features...
- ./run-tests-headless.sh "01_general|02_global_settings|04_profile_mgmt"
# Run 01_general, 01_tor, 02_global_settings, and 04_profile_mgmt features...
- ./run-tests-headless.sh "01_general|01_tor|02_global_settings|04_profile_mgmt"
- name: test-build-android
image: openpriv/flutter-desktop:linux-fstable-3.7.1
image: openpriv/flutter-desktop:linux-fstable-3.19.3
when:
event: pull_request
volumes:
@ -81,7 +96,7 @@ steps:
- flutter build apk --debug
- name: build-android
image: openpriv/flutter-desktop:linux-fstable-3.7.1
image: openpriv/flutter-desktop:linux-fstable-3.19.3
when:
event: push
environment:
@ -96,16 +111,16 @@ steps:
- echo $upload_jks_file_b64 > upload-keystore.jks.b64
- base64 -i --decode upload-keystore.jks.b64 > android/app/upload-keystore.jks
- sed -i "s/%jks-password%/$upload_jks_pass/g" android/key.properties
- flutter build appbundle --dart-define BUILD_VER=`cat VERSION` --dart-define BUILD_DATE=`cat BUILDDATE`
- flutter build appbundle --dart-define BUILD_VER=`cat VERSION` --dart-define BUILD_DATE=`cat COMMIT_DATE`
# cant do debug for final release, this is just a stop gap
- flutter build apk --dart-define BUILD_VER=`cat VERSION` --dart-define BUILD_DATE=`cat BUILDDATE`
- flutter build apk --dart-define BUILD_VER=`cat VERSION` --dart-define BUILD_DATE=`cat COMMIT_DATE`
# or build apk --split-per-abi ?
- cp build/app/outputs/bundle/release/app-release.aab deploy/
- cp build/app/outputs/apk/release/app-release.apk deploy/
- cp build/app/outputs/bundle/release/app-release.aab deploy/cwtch-`cat VERSION`.aab
- cp build/app/outputs/apk/release/app-release.apk deploy/cwtch-`cat VERSION`.apk
#- cp build/app/outputs/flutter-apk/app-debug.apk deploy/android
- name: widget-tests
image: openpriv/flutter-desktop:linux-fstable-3.7.1
image: openpriv/flutter-desktop:linux-fstable-3.19.3
volumes:
- name: deps
path: /root/.pub-cache
@ -114,6 +129,21 @@ steps:
- flutter test --coverage
- genhtml coverage/lcov.info -o coverage/html
- name: upload-nightlies
image: openpriv/flutter-desktop:linux-fstable-3.19.3
environment:
GOGS_ACCOUNT_TOKEN:
from_secret: gogs_account_token
secrets: [gogs_account_token]
volumes:
- name: deps
path: /root/.pub-cache
when:
event: push
status: [ success ]
commands:
- ./upload-releases.sh deploy/cwtch-`cat VERSION`.apk application/vnd.android.package-archive cwtch-`cat VERSION`.apk
- name: deploy-buildfiles
image: kroniak/ssh-client
pull: if-not-exists
@ -128,15 +158,17 @@ steps:
- echo $BUILDFILES_KEY > ~/id_rsab64
- base64 -d ~/id_rsab64 > ~/id_rsa
- chmod 400 ~/id_rsa
- export DIR=flwtch-`cat BUILDDATE`-`cat VERSION`
- export DIR=flwtch-`cat COMMIT_DATE`-`cat VERSION`
- mv deploy $DIR
- cp -r coverage/html $DIR/coverage-tests
- cp -r test/failures $DIR/test-failures || true
- cd $DIR
- find . -type f -exec sha256sum {} \; > ./../sha256s.txt
- mv ./../sha256s.txt .
- find . -type f -exec sha512sum {} \; > ./../sha512s.txt
- mv ./../sha512s.txt .
- cd ..
- scp -r -o StrictHostKeyChecking=no -i ~/id_rsa $DIR buildfiles@build.openprivacy.ca:/home/buildfiles/buildfiles/
- ./gen-nightly-index.sh $DIR
- scp -r -o StrictHostKeyChecking=no -i ~/id_rsa cwtch-nightly.html buildfiles@build.openprivacy.ca:/home/buildfiles/buildfiles/
- name: notify-gogs
image: openpriv/drone-gogs
@ -176,7 +208,7 @@ clone:
steps:
- name: clone
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.7.1
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.19.3
environment:
buildbot_key_b64:
from_secret: buildbot_key_b64
@ -194,28 +226,28 @@ steps:
- git checkout $Env:DRONE_COMMIT
- name: fetch
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.7.1
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.19.3
commands:
- git describe --tags --abbrev=1 > VERSION
- powershell -command "Get-Date -Format 'yyyy-MM-dd-HH-mm'" > BUILDDATE
- git log -1 --format=%cd --date=format:'%Y-%m-%d-%H-%M' > COMMIT_DATE
- .\fetch-tor-win.ps1
- .\fetch-libcwtch-go.ps1
- name: build-windows
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.7.1
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.19.3
commands:
- flutter pub get
- $Env:version += type .\VERSION
- $Env:builddate += type .\BUILDDATE
- $Env:releasedir = "build\\windows\\runner\\Release\\"
- flutter build windows --dart-define BUILD_VER=$Env:version --dart-define BUILD_DATE=$Env:builddate
- $Env:commitdate += type .\COMMIT_DATE
- $Env:releasedir = "build\\windows\\x64\\runner\\Release\\"
- flutter build windows --dart-define BUILD_VER=$Env:version --dart-define BUILD_DATE=$Env:commitdate
- copy windows\libCwtch.dll $Env:releasedir
# flutter hasn't worked out it's packaging of required dll's so we have to resort to this manual nonsense
# https://github.com/google/flutter-desktop-embedding/issues/587
# https://github.com/flutter/flutter/issues/53167
- copy C:\BuildTools\VC\Redist\MSVC\14.29.30133\x64\Microsoft.VC142.CRT\vcruntime140.dll $Env:releasedir
- copy C:\BuildTools\VC\Redist\MSVC\14.29.30133\x64\Microsoft.VC142.CRT\vcruntime140_1.dll $Env:releasedir
- copy C:\BuildTools\VC\Redist\MSVC\14.29.30133\x64\Microsoft.VC142.CRT\msvcp140.dll $Env:releasedir
- copy 'C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Redist\MSVC\14.36.32532\x64\Microsoft.VC143.CRT\vcruntime140.dll' $Env:releasedir
- copy 'C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Redist\MSVC\14.36.32532\x64\Microsoft.VC143.CRT\vcruntime140_1.dll' $Env:releasedir
- copy 'C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Redist\MSVC\14.36.32532\x64\Microsoft.VC143.CRT\msvcp140.dll' $Env:releasedir
- copy README.md $Env:releasedir\
- copy windows\*.bat $Env:releasedir\
- powershell -command "Expand-Archive -Path tor.zip -DestinationPath $Env:releasedir\Tor"
@ -233,13 +265,11 @@ steps:
from_secret: pfx_pass
commands:
- $Env:version += type .\VERSION
- $Env:builddate += type .\BUILDDATE
- $Env:releasedir = "build\\windows\\runner\\Release\\"
- $Env:commitdate += type .\COMMIT_DATE
- $Env:releasedir = "build\\windows\\x64\\runner\\Release\\"
- $Env:zip = 'cwtch-' + $Env:version + '.zip'
- $Env:zipsha = $Env:zip + '.sha512'
- $Env:msix = 'cwtch-install-' + $Env:version + '.msix'
- $Env:msixsha = $Env:msix + '.sha512'
- $Env:buildname = 'flwtch-win-' + $Env:builddate + '-' + $Env:version
- $Env:zipsha = $Env:zip + '.sha512.txt'
- $Env:buildname = 'flwtch-' + $Env:commitdate + '-' + $Env:version
- $Env:builddir = $Env:buildname
- echo $Env:pfx > codesign.pfx.b64
- certutil -decode codesign.pfx.b64 codesign.pfx
@ -250,18 +280,18 @@ steps:
- makensis windows\nsis\cwtch-installer.nsi
- move windows\nsis\cwtch-installer.exe cwtch-installer.exe
- signtool sign /v /fd sha256 /a /f codesign.pfx /p $Env:pfx_pass /tr http://timestamp.digicert.com cwtch-installer.exe
- powershell -command "(Get-FileHash cwtch-installer.exe -Algorithm sha512).Hash" > cwtch-installer.sha512
- powershell -command "(Get-FileHash cwtch-installer.exe -Algorithm sha512).Hash" > cwtch-installer.sha512.txt
- mkdir deploy
- mkdir deploy\$Env:builddir
- move $Env:releasedir $Env:builddir
- powershell -command "Compress-Archive -Path $Env:builddir -DestinationPath cwtch.zip"
- powershell -command "(Get-FileHash cwtch.zip -Algorithm sha512).Hash" > $Env:zipsha
- move cwtch-installer.exe deploy\$Env:builddir\cwtch-installer.exe
- move cwtch-installer.exe deploy\$Env:builddir\cwtch-installer-$Env:version.exe
- move cwtch.zip deploy\$Env:builddir\$Env:zip
- move *.sha512 deploy\$Env:builddir
- move *.sha512.txt deploy\$Env:builddir
- name: deploy-windows
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.7.1
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.19.3
when:
event: push
status: [ success ]
@ -300,7 +330,8 @@ steps:
commands:
- mkdir ~/.ssh
- echo $buildbot_key_b64 > ~/.ssh/id_rsa.b64
- base64 -d ~/.ssh/id_rsa.b64 > ~/.ssh/id_rsa
- ls -lh ~/.ssh/id_rsa.b64
- base64 -d -i ~/.ssh/id_rsa.b64 -o ~/.ssh/id_rsa
- chmod 400 ~/.ssh/id_rsa
# force by pass of ssh host key check, less secure
- ssh-keyscan -H git.openprivacy.ca >> ~/.ssh/known_hosts
@ -318,24 +349,26 @@ steps:
commands:
- ./fetch-tor-macos.sh
- echo `git describe --tags --abbrev=1` > VERSION
- echo `date +%G-%m-%d-%H-%M` > BUILDDATE
- export PATH=$PATH:/Users/Dan/development/flutter/bin
- echo `git log -1 --format=%cd --date=format:%G-%m-%d-%H-%M` > COMMIT_DATE
- export PATH=$PATH:/Users/drone/development/flutter/bin
- flutter pub get
- mkdir deploy
- ./fetch-libcwtch-go-macos.sh
- gem install --user-install cocoapods
# Drone builds in container directories and gem seems to have some weird side effects so have to manually re install these locally
- gem install --user-install ffi -v 1.15.5 -- --enable-libffi-alloc
# currently unneeded to reinstall but was, and may be again? so saving
#- gem install --user-install cocoapods -v 1.11.3
- name: build-macos
commands:
- export PATH=$PATH:/Users/Dan/development/flutter/bin
- export GEM_HOME=$HOME/.gem
- export PATH=$PATH:/Users/drone/bin/flutter/bin
- export PATH=$GEM_HOME/ruby/2.6.0/bin:$PATH
- flutter config --enable-macos-desktop
- flutter build macos --dart-define BUILD_VER=`cat VERSION` --dart-define BUILD_DATE=`cat BUILDDATE`
- export PATH=$PATH:/usr/local/bin #create-dmg
- flutter doctor
- flutter build macos --dart-define BUILD_VER=`cat VERSION` --dart-define BUILD_DATE=`cat COMMIT_DATE`
- export PATH=$PATH:/opt/homebrew/bin/ #create-dmg
- macos/package-release.sh
- mkdir -p deploy
- mv Cwtch.dmg deploy
- mv Cwtch.dmg deploy/Cwtch-`cat VERSION`.dmg
- name: deploy-buildfiles
environment:
@ -346,13 +379,13 @@ steps:
status: [ success ]
commands:
- echo $BUILDFILES_KEY > ~/id_rsab64
- base64 -d ~/id_rsab64 > ~/id_rsa
- base64 -d -i ~/id_rsab64 -o ~/id_rsa
- chmod 400 ~/id_rsa
- export DIR=flwtch-macos-`cat BUILDDATE`-`cat VERSION`
- export DIR=flwtch-`cat COMMIT_DATE`-`cat VERSION`
- mv deploy $DIR
- cd $DIR
- find . -type f -exec shasum -a 512 {} \; > ./../sha512s.txt
- mv ./../sha512s.txt .
- find . -type f -exec shasum -a 512 {} \; > ./../Cwtch.dmg.sha512.txt
- mv ./../Cwtch.dmg.sha512.txt .
- cd ..
- scp -r -o StrictHostKeyChecking=no -i ~/id_rsa $DIR buildfiles@build.openprivacy.ca:/home/buildfiles/buildfiles/

5
.gitignore vendored
View File

@ -3,7 +3,6 @@
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
@ -13,6 +12,7 @@ package-lock.json
libCwtch*
cwtch.aar
node_modules
test_home
# IntelliJ related
*.iml
@ -35,6 +35,7 @@ node_modules
.pub-cache/
.pub/
/build/
./lib/gen/
# Web related
lib/generated_plugin_registrant.dart
@ -58,7 +59,7 @@ package.
# Compiled Libs
linux/tor
linux/libCwtch.so
android/cwtch/cwtch.aar
android/app/cwtch/cwtch.aar
android/app/src/main/jniLibs/*/libtor.so
*.dylib
integration_test/gherkin_suite_test.g.dart

View File

@ -1,10 +1,30 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.
# This file should be version controlled.
version:
revision: 78910062997c3a836feee883712c241a5fd22983
revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf
channel: stable
project_type: app
# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf
base_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf
- platform: macos
create_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf
base_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf
# User provided section
# List of Local paths (relative to this file) that should be
# ignored by the migrate tool.
#
# Files that are not part of the templates will be ignored by default.
unmanaged_files:
- 'lib/main.dart'
- 'ios/Runner.xcodeproj/project.pbxproj'

View File

@ -1 +1 @@
2023-03-16-15-07-v0.0.3-1-g50c853a
2024-02-26-18-01-v0.0.14

View File

@ -1,5 +1,5 @@
MIT License
Copyright (c) 2021 Open Privacy Research Society
Copyright (c) 2021-2024 Open Privacy Research Society
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

8
NSIS-Notes.md Normal file
View File

@ -0,0 +1,8 @@
# NSIS Notes
## Images
Requires Windows 3 Compatible Bitmaps.
Can convert to the correct format with e.g. `mogrify -compress none -format bmp3 windows/nsis/cwtch_title.bmp
`

View File

@ -21,6 +21,13 @@ Cwtch processes the following environment variables:
- `LOG_FILE=` will reroute all of libcwtch-go's logging to the specified file instead of the console
- `LOG_LEVEL=debug` will set the log level to debug instead of info
## Running Tests
You can run specific tests with `./run-tests-headless.sh`. See also the `.drone.yml` file for information on the specific tests that run.1
The gherkin test framework will occasionally fail silently with incomplete test. This is usually because a previous run resulted in an exception and the underlying Tor
process was not cleaned up (See #711).
## Building
### Getting Started
@ -64,10 +71,14 @@ To build a release version and load normal profiles, use `build-release.sh X` in
### Building on MacOS
- Cocaopods is required, you may need to `gem install cocaopods -v 1.9.3`
- copy `libCwtch.x64.dylib` and `libCwtch.arm/dylib` into the root folder, or run `fetch-libcwtch-go-macos.sh` to download it
- Cocoapods is required. Mac and Ruby don't seem to care about version stability and compatibility so good luck. The version of Ruby Mac seems to ship is very incompatible with software in the gem repo. You will probablly need to manually specify a specific older version of cocoapods that is compatible with your system. First you will also probably need to make sure you are on the latest MacOS version and then try `gem install cocoapods -v 1.x.x`
- For MacOS 13.4 `gem install cocoapods -v 1.11.3` worked on 2023.05.28
- copy `libCwtch.x64.dylib` and `libCwtch.arm.dylib` into the root folder, or run `fetch-libcwtch-go-macos.sh` to download it
- The error 'Podfile not found' has still been seen on fresh repos, depending on varios versions. To fix run `flutter create --platforms=macos . --org im.cwtch`
- You may have to temporarily rename the project folder a "dart project suitable name" like "cwtch"
- run `fetch-tor-macos.sh` to fetch Tor or Download and install Tor Browser and `cp -r /Applications/Tor\ Browser.app/Contents/MacOS/Tor ./macos/`
- `flutter build macos`
- If you are building on Mac Arm Silicon you may need to append `--no-tree-shake-icons` as the build seems to invoke a mac x64 binary that Arm Mac "cannot verify" and therefor will not run on some versions of Flutter
- optional: launch cwtch-ui release build with `./build/macos/Build/Products/Release/Cwtch.app/Contents/MacOS/Cwtch`
- To package the UI: `./macos/package-release.sh`, which results in a Cwtch.dmg that has libCwtch.dylib and tor in it as well and can be installed into Applications

View File

@ -1,3 +1,9 @@
plugins {
id "com.android.application"
id "kotlin-android"
id "dev.flutter.flutter-gradle-plugin"
}
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
@ -6,11 +12,6 @@ if (localPropertiesFile.exists()) {
}
}
def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
throw new FileNotFoundException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
@ -21,10 +22,6 @@ if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
// key.properties MUST have password placeholders filled in (via drone with secrets) and cwtch-upload.jks file must be added (from drone secret)
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
@ -33,7 +30,7 @@ if (keystorePropertiesFile.exists()) {
}
android {
compileSdkVersion 33
compileSdkVersion 34
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
@ -53,8 +50,8 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "im.cwtch.flwtch"
minSdkVersion 16
targetSdkVersion 31
minSdkVersion 19
targetSdkVersion 34
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@ -93,11 +90,11 @@ flutter {
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation project(':cwtch')
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.21" // same as kotlin version in settings.gradle
implementation fileTree( dir: 'cwtch')
implementation files ('cwtch/cwtch.aar')
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.2"
implementation "com.airbnb.android:lottie:5.2.0"
implementation "androidx.localbroadcastmanager:localbroadcastmanager:1.0.0"
implementation "com.android.support.constraint:constraint-layout:2.0.4"

View File

@ -1,4 +1,4 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
package="im.cwtch.flwtch">
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
calls FlutterMain.startInitialization(this); in its onCreate method.
@ -13,7 +13,7 @@
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:theme="@style/NormalTheme"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"
@ -38,22 +38,30 @@
android:name="flutterEmbedding"
android:value="2" />
<!--Needed to run in background (lol)-->
<service
android:name="androidx.work.impl.foreground.SystemForegroundService"
android:foregroundServiceType="dataSync"
tools:node="merge" />
</application>
<!--Needed to access Tor socket-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<!--Needed to run in background (lol)-->
<!-- Needed for running in the background -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<!-- As of Android 13 this permission is required -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<!-- Ability to ask user to exempt app from power management (which can kill it more frequently especially on some devices.
Allows app to use ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS -->
<uses-permission-sdk-23 android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<!-- TODO when we support sdk 31
<uses-permission-sdk-23 android:name="android.permission.HIDE_OVERLAY_WINDOWS" />
-->
<!--Needed to check if activity is foregrounded or if messages from the service should be queued-->
<uses-permission android:name="android.permission.GET_TASKS" />

View File

@ -11,6 +11,7 @@ import android.graphics.Color
import android.net.Uri
import android.os.Build
import android.util.Log
import android.content.pm.ServiceInfo
import androidx.annotation.RequiresApi
import androidx.core.app.NotificationCompat
import androidx.localbroadcastmanager.content.LocalBroadcastManager
@ -22,6 +23,13 @@ import io.flutter.FlutterInjector
import org.json.JSONObject
import java.nio.file.Files
import java.nio.file.Paths
import java.io.FileInputStream
import java.io.File
class FlwtchWorker(context: Context, parameters: WorkerParameters) :
CoroutineWorker(context, parameters) {
@ -84,6 +92,7 @@ class FlwtchWorker(context: Context, parameters: WorkerParameters) :
Log.i(TAG, "startCwtch success, starting coroutine AppbusEvent loop...")
val downloadIDs = mutableMapOf<String, Int>()
val downloadFinishedIDs = mutableMapOf<String, Int>()
var flags = PendingIntent.FLAG_UPDATE_CURRENT
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
flags = flags or PendingIntent.FLAG_IMMUTABLE
@ -92,7 +101,6 @@ class FlwtchWorker(context: Context, parameters: WorkerParameters) :
try {
val evt = MainActivity.AppbusEvent(Cwtch.getAppBusEvent())
// TODO replace this notification block with the NixNotification manager in dart as it has access to contact names and also needs less working around
if (evt.EventType == "NewMessageFromPeer" || evt.EventType == "NewMessageFromGroup") {
val data = JSONObject(evt.Data)
val handle = data.getString("RemotePeer");
@ -137,7 +145,19 @@ class FlwtchWorker(context: Context, parameters: WorkerParameters) :
Log.i(TAG, "notification for " + evt.EventType + " " + handle + " " + conversationId + " " + channelId)
Log.i(TAG, data.toString());
val key = loader.getLookupKeyForAsset(data.getString("picture"))//"assets/profiles/001-centaur.png")
val fh = applicationContext.assets.open(key)
var fh : java.io.InputStream? = null;
try {
fh = applicationContext.assets.open(key)
} catch (e: Exception) {
Log.d("FlwtchWorker->ContactInfo", e.toString() + " :: " + e.getStackTrace());
}
try {
val file = File(data.getString("picture"))
fh = FileInputStream(file)
} catch (e: Exception) {
Log.d("FlwtchWorker->ContactInfo", e.toString() + " :: " + e.getStackTrace());
}
val clickIntent = Intent(applicationContext, MainActivity::class.java).also { intent ->
intent.action = Intent.ACTION_RUN
@ -145,18 +165,21 @@ class FlwtchWorker(context: Context, parameters: WorkerParameters) :
intent.putExtra("ProfileOnion", data.getString("ProfileOnion"))
intent.putExtra("Handle", handle)
}
val image : android.graphics.Bitmap? = if (fh != null) BitmapFactory.decodeStream(fh ) else null;
val newNotification = NotificationCompat.Builder(applicationContext, channelId)
.setContentTitle(data.getString("Nick"))
.setContentText((notificationConversationInfo
?: "New Message From %1").replace("%1", data.getString("Nick")))
.setLargeIcon(BitmapFactory.decodeStream(fh))
.setLargeIcon(image)
.setSmallIcon(R.mipmap.knott_transparent)
.setContentIntent(PendingIntent.getActivity(applicationContext, 1, clickIntent, flags))
.setAutoCancel(true)
.build()
notificationManager.notify(getNotificationID(data.getString("ProfileOnion"), channelId), newNotification)
if (fh != null) {
fh.close()
}
}
}
@ -167,32 +190,36 @@ class FlwtchWorker(context: Context, parameters: WorkerParameters) :
val title = data.getString("NameSuggestion");
val progress = data.getString("Progress").toInt();
val progressMax = data.getString("FileSizeInChunks").toInt();
if (!downloadIDs.containsKey(fileKey)) {
downloadIDs.put(fileKey, downloadIDs.count());
}
var dlID = downloadIDs.get(fileKey);
if (dlID == null) {
dlID = 0;
}
if (progress >= 0) {
val channelId =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
createDownloadNotificationChannel(fileKey, fileKey)
} else {
// If earlier version channel ID is not used
// https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#NotificationCompat.Builder(android.content.Context)
""
};
val newNotification = NotificationCompat.Builder(applicationContext, channelId)
.setOngoing(true)
.setContentTitle("Downloading")//todo: translate
.setContentText(title)
.setSmallIcon(android.R.drawable.stat_sys_download)
.setProgress(progressMax, progress, false)
.setSound(null)
//.setSilent(true)
.build();
notificationManager.notify(dlID, newNotification);
// if we have seen a download finished update for this key then ignore it
if (!downloadFinishedIDs.containsKey(fileKey)) {
if (!downloadIDs.containsKey(fileKey)) {
downloadIDs.put(fileKey, downloadIDs.count());
}
var dlID = downloadIDs.get(fileKey);
if (dlID == null) {
dlID = 0;
}
if (progress >= 0) {
val channelId =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
createDownloadNotificationChannel(fileKey, fileKey)
} else {
// If earlier version channel ID is not used
// https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#NotificationCompat.Builder(android.content.Context)
""
};
val newNotification = NotificationCompat.Builder(applicationContext, channelId)
.setOngoing(true)
.setContentTitle("Downloading")//todo: translate
.setContentText(title)
.setSmallIcon(android.R.drawable.stat_sys_download)
.setProgress(progressMax, progress, false)
.setSound(null)
//.setSilent(true)
.build();
notificationManager.notify(dlID, newNotification);
}
}
} catch (e: Exception) {
Log.d("FlwtchWorker->FileDownloadProgressUpdate", e.toString() + " :: " + e.getStackTrace());
@ -216,6 +243,8 @@ class FlwtchWorker(context: Context, parameters: WorkerParameters) :
Files.delete(sourcePath);
}
}
// Suppress future notifications...
downloadFinishedIDs.put(fileKey, downloadIDs.count());
if (downloadIDs.containsKey(fileKey)) {
notificationManager.cancel(downloadIDs.get(fileKey) ?: 0);
}
@ -286,7 +315,7 @@ class FlwtchWorker(context: Context, parameters: WorkerParameters) :
.addAction(android.R.drawable.ic_delete, cancel, PendingIntent.getActivity(applicationContext, 2, cancelIntent, flags))
.build()
return ForegroundInfo(101, notification)
return ForegroundInfo(101, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC)
}
@RequiresApi(Build.VERSION_CODES.O)

View File

@ -1,6 +1,5 @@
package im.cwtch.flwtch
import SplashView
import android.annotation.TargetApi
import android.content.BroadcastReceiver
import android.content.Context
@ -19,7 +18,6 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager
import androidx.work.*
import cwtch.Cwtch
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.android.SplashScreen
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.ErrorLogResult
import io.flutter.plugin.common.MethodCall
@ -29,15 +27,14 @@ import org.json.JSONObject
import java.nio.file.Files
import java.nio.file.Paths
import java.util.concurrent.TimeUnit
import kotlinx.coroutines.*
class MainActivity: FlutterActivity() {
override fun provideSplashScreen(): SplashScreen? = SplashView()
// Channel to get app info
private val CHANNEL_APP_INFO = "test.flutter.dev/applicationInfo"
private val CALL_APP_INFO = "getNativeLibDir"
private val CALL_SERVICE_INFO = "getForegroundServiceInfo"
private val ANDROID_SETTINGS_CHANNEL_NAME = "androidSettings"
private val ANDROID_SETTINGS_CHANGE_NAME= "androidSettingsChanged"
private var andoidSettingsChangeChannel: MethodChannel? = null
@ -189,7 +186,9 @@ class MainActivity: FlutterActivity() {
when (call.method) {
CALL_APP_INFO -> result.success(getNativeLibDir())
?: result.error("Unavailable", "nativeLibDir not available", null);
else -> result.notImplemented()
CALL_SERVICE_INFO -> result.success(getForegroundServiceInfo())
?: result.error("Unavailable", "getForegroundServiceInfo not available", null);
else -> result.notImplemented()
}
}
@ -224,6 +223,24 @@ class MainActivity: FlutterActivity() {
return ainfo.nativeLibraryDir
}
fun getForegroundServiceInfo(): HashMap<String,String> {
var hashMap : HashMap<String, String>
= HashMap<String, String> ();
val workmanager = WorkManager.getInstance(this);
if (workmanager != null) {
runBlocking {
var lastCancelAllTime = workmanager.getLastCancelAllTimeMillis().await();
hashMap.put("workmanager.lastCancelAllTime", lastCancelAllTime.toString());
}
val works = workmanager.getWorkInfosByTag(WORKER_TAG).get()
for (workInfo in works) {
hashMap.put("workmanager.${workInfo.id}.state", workInfo.state.toString());
}
}
return hashMap
}
// receives messages from the ForegroundService (which provides, ironically enough, the backend)
private fun handleCwtch(@NonNull call: MethodCall, @NonNull result: Result) {
var method = call.method
@ -234,6 +251,7 @@ class MainActivity: FlutterActivity() {
// the frontend calls Start every time it fires up, but we don't want to *actually* call Cwtch.Start()
// in case the ForegroundService is still running. in both cases, however, we *do* want to re-register
// the eventbus listener.
when (call.method) {
"Start" -> {
val uniqueTag = argmap["torPath"] ?: "nullEventBus"
@ -309,8 +327,9 @@ class MainActivity: FlutterActivity() {
val conversation: Int = call.argument("conversation") ?: 0
val indexI: Int = call.argument("index") ?: 0
val count: Int = call.argument("count") ?: 1
val ucount : Int = maxOf(1, count) // don't allow negative counts
result.success(Cwtch.getMessages(profile, conversation.toLong(), indexI.toLong(), count.toLong()))
result.success(Cwtch.getMessages(profile, conversation.toLong(), indexI.toLong(), ucount.toLong()))
return
}
"SendMessage" -> {
@ -343,7 +362,7 @@ class MainActivity: FlutterActivity() {
return
}
"RestartSharing" -> {
"RestartFileShare" -> {
val profile: String = call.argument("ProfileOnion") ?: ""
val filepath: String = call.argument("filekey") ?: ""
result.success(Cwtch.restartFileShare(profile, filepath))
@ -357,6 +376,37 @@ class MainActivity: FlutterActivity() {
return
}
"DeleteServerInfo" -> {
val profile: String = call.argument("ProfileOnion") ?: ""
val handle: String = call.argument("handle") ?: ""
result.success(Cwtch.deleteServerInfo(profile, handle))
return
}
"PublishServerUpdate" -> {
val profile: String = call.argument("ProfileOnion") ?: ""
result.success(Cwtch.publishServerUpdate(profile))
return
}
"PeerWithOnion" -> {
val profile: String = call.argument("ProfileOnion") ?: ""
val onion: String = call.argument("onion") ?: ""
Cwtch.peerWithOnion(profile, onion)
}
"QueueJoinServer" -> {
val profile: String = call.argument("ProfileOnion") ?: ""
val onion: String = call.argument("onion") ?: ""
Cwtch.peerWithOnion(profile, onion)
}
"DisconnectFromPeer" -> {
val profile: String = call.argument("ProfileOnion") ?: ""
val onion: String = call.argument("onion") ?: ""
Cwtch.peerWithOnion(profile, onion)
}
"DisconnectFromServer" -> {
val profile: String = call.argument("ProfileOnion") ?: ""
val onion: String = call.argument("onion") ?: ""
Cwtch.peerWithOnion(profile, onion)
}
"CreateProfile" -> {
val nick: String = call.argument("nick") ?: ""
val pass: String = call.argument("pass") ?: ""
@ -371,6 +421,13 @@ class MainActivity: FlutterActivity() {
val profile: String = call.argument("profile") ?: ""
Cwtch.activatePeerEngine(profile)
}
"ConfigureConnections" -> {
val profile: String = call.argument("ProfileOnion") ?: ""
val listen: Boolean = call.argument("listen") ?: false
val peers: Boolean = call.argument("peers") ?: false
val servers: Boolean = call.argument("servers") ?: false
Cwtch.configureConnections(profile, listen, peers, servers)
}
"DeactivatePeerEngine" -> {
val profile: String = call.argument("profile") ?: ""
Cwtch.deactivatePeerEngine(profile)
@ -442,7 +499,7 @@ class MainActivity: FlutterActivity() {
val profile: String = call.argument("ProfileOnion") ?: ""
val conversation: Int = call.argument("conversation") ?: 0
val fileKey: String = call.argument("fileKey") ?: ""
Cwtch.verifyOrResumeDownload(profile, conversation.toLong(), fileKey)
Cwtch.verifyOrResumeDownloadDefaultLimit(profile, conversation.toLong(), fileKey)
}
"UpdateSettings" -> {
val json: String = call.argument("json") ?: ""
@ -460,7 +517,7 @@ class MainActivity: FlutterActivity() {
val profile: String = call.argument("ProfileOnion") ?: ""
val server: String = call.argument("server") ?: ""
val groupName: String = call.argument("groupName") ?: ""
Cwtch.startGroup(profile, server, groupName)
Cwtch.startGroup(profile, groupName, server)
}
"DeleteProfile" -> {
val profile: String = call.argument("ProfileOnion") ?: ""
@ -483,6 +540,20 @@ class MainActivity: FlutterActivity() {
val v: String = call.argument("Val") ?: ""
Cwtch.setProfileAttribute(profile, key, v)
}
"GetProfileAttribute" -> {
val profile: String = call.argument("ProfileOnion") ?: ""
val key: String = call.argument("key") ?: ""
var resultjson = Cwtch.getProfileAttribute(profile, key);
return result.success(resultjson)
}
"GetConversationAttribute" -> {
val profile: String = call.argument("ProfileOnion") ?: ""
val conversation: Int = call.argument("conversation") ?: 0
val key: String = call.argument("key") ?: ""
var resultjson = Cwtch.getConversationAttribute(profile, conversation.toLong(), key);
result.success(resultjson)
return
}
"SetConversationAttribute" -> {
val profile: String = call.argument("ProfileOnion") ?: ""
val conversation: Int = call.argument("conversation") ?: 0
@ -493,10 +564,14 @@ class MainActivity: FlutterActivity() {
"ImportProfile" -> {
val file: String = call.argument("file") ?: ""
val pass: String = call.argument("pass") ?: ""
Data.Builder().putString("result", Cwtch.importProfile(file, pass)).build()
result.success(Cwtch.importProfile(file, pass))
return
}
"ReconnectCwtchForeground" -> {
Cwtch.reconnectCwtchForeground()
"SearchConversations" -> {
val profile: String = call.argument("ProfileOnion") ?: ""
val pattern: String = call.argument("pattern") ?: ""
result.success(Cwtch.searchConversations(profile, pattern))
return
}
"Shutdown" -> {
Cwtch.shutdownCwtch();

View File

@ -1,15 +0,0 @@
import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import im.cwtch.flwtch.R
import io.flutter.embedding.android.SplashScreen
class SplashView : SplashScreen {
override fun createSplashView(context: Context, savedInstanceState: Bundle?): View? =
LayoutInflater.from(context).inflate(R.layout.splash_view, null, false)
override fun transitionToFlutter(onTransitionComplete: Runnable) {
onTransitionComplete.run()
}
}

View File

@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" />
<item android:drawable="@color/darkGreyPurple" />
<!-- You can insert your own image assets here -->
<!-- <item>
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
android:src="@mipmap/knott" />
</item>
</layer-list>

View File

@ -0,0 +1,81 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="500dp"
android:height="500dp"
android:viewportWidth="500"
android:viewportHeight="500">
<path
android:pathData="M436.2,215c-0.6,3 -2,6.4 -4.3,10.4l18.2,18.2c2.4,-4.8 6.2,-13.1 8.2,-22.9c4.1,-20.2 -0.5,-37.1 -13.7,-50.3c-24.2,-24.2 -49.4,-26.4 -81.8,-7.3c-7.8,4.6 -16.1,10.6 -24.6,17.7c-19.5,16.3 -41.3,39.5 -64.9,69.2c15.4,19.4 30.2,36.2 43.8,49.8c6.3,6.3 12.4,12 18.3,17.1l16.2,-16.2c-5.9,-5 -12.1,-10.7 -18.4,-17c-9,-9 -18.5,-19.5 -28.4,-31.2l-2.1,-2.5l2.1,-2.5c18.1,-21.5 35,-38.6 50.1,-50.9c9.6,-7.8 18.6,-13.8 26.7,-17.7c7,-3.4 13.4,-5.3 19,-5.6c2.7,-0.2 6.9,-0.1 12.1,2c5,2.1 10.2,5.8 15.7,11.3c2.1,2.1 5,5.4 6.8,10.4C437.1,202.1 437.5,208 436.2,215L436.2,215z"
android:fillColor="#242425"/>
<path
android:pathData="M340.9,354.7l81.5,-81.5c-4.8,-7.1 -11.1,-14 -14.6,-17.7L327.3,336C332.5,342.4 337.1,348.6 340.9,354.7z"
android:fillColor="#242425"/>
<path
android:pathData="M444.6,329.6c13.2,-13.2 17.8,-30.1 13.7,-50.3c-2.8,-14 -9.1,-24.9 -10.3,-26.9L382.6,187c-6,3.1 -12.5,7.4 -19.4,12.8l50.1,50.1l0,0c4.1,4.3 12.1,13 17.4,21.6c3.2,5.2 5.1,9.7 5.6,13.5c1.2,6.9 0.9,12.7 -0.9,17.9c-1.8,5 -4.8,8.3 -6.8,10.4c-5.9,5.9 -11.3,9.7 -16.7,11.7c-5.5,2 -10,1.8 -13.3,1.4c-4.4,-0.5 -9.2,-2 -14.3,-4.2l-17,17C397.5,355.7 421.5,352.7 444.6,329.6z"
android:fillColor="#242425"/>
<path
android:pathData="M303.1,64.7c5,1.8 8.3,4.8 10.4,6.8c5.9,5.9 9.7,11.3 11.7,16.7c2,5.5 1.8,10 1.4,13.3c-0.5,4.4 -2,9.2 -4.2,14.3l17,17c16.4,-30.3 13.3,-54.4 -9.7,-77.4c-13.2,-13.2 -30.1,-17.8 -50.3,-13.7c-14,2.8 -24.9,9.1 -26.9,10.3L187,117.4c3.1,6 7.4,12.5 12.8,19.4L250,86.7l0,0c4.3,-4.1 13,-12.1 21.6,-17.4c5.2,-3.2 9.7,-5.1 13.5,-5.6C292,62.6 297.9,62.9 303.1,64.7z"
android:fillColor="#242425"/>
<path
android:pathData="M170.4,55.4c-24.2,24.2 -26.4,49.4 -7.3,81.8c4.6,7.8 10.6,16.1 17.7,24.6c16.3,19.5 39.5,41.3 69.2,64.9c19.4,-15.4 36.2,-30.2 49.8,-43.8c6.3,-6.3 12,-12.4 17.1,-18.3l-16.2,-16.2c-5,5.9 -10.7,12.1 -17,18.4c-9,9 -19.5,18.5 -31.2,28.4l-2.5,2.1l-2.5,-2.1c-21.5,-18.1 -38.6,-35 -50.9,-50.1c-7.8,-9.6 -13.8,-18.6 -17.7,-26.7c-3.4,-7 -5.3,-13.4 -5.6,-19c-0.2,-2.7 -0.1,-6.9 2,-12.1c2.1,-5 5.8,-10.2 11.3,-15.7c2.1,-2.1 5.4,-5 10.4,-6.8c5.2,-1.9 11.1,-2.2 18,-0.9l0.1,0c3,0.6 6.4,2 10.4,4.3l18.2,-18.2c-4.8,-2.4 -13.1,-6.2 -23,-8.2C200.5,37.6 183.6,42.2 170.4,55.4z"
android:fillColor="#242425"/>
<path
android:pathData="M273.2,77.6c-7.1,4.8 -14,11.1 -17.7,14.6l80.5,80.5c6.4,-5.2 12.7,-9.7 18.7,-13.6L273.2,77.6z"
android:fillColor="#242425"/>
<path
android:pathData="M55.4,329.6c24.2,24.2 49.4,26.4 81.8,7.3c7.8,-4.6 16.1,-10.6 24.6,-17.7c19.5,-16.3 41.3,-39.5 64.9,-69.2c-15.4,-19.4 -30.2,-36.2 -43.8,-49.8c-6.3,-6.3 -12.4,-12 -18.3,-17.1l-16.2,16.2c5.9,5 12.1,10.7 18.4,17c9,9 18.5,19.5 28.4,31.2l2.1,2.5l-2.1,2.5c-18.1,21.5 -35,38.6 -50.1,50.9c-9.6,7.8 -18.6,13.8 -26.7,17.7c-7,3.4 -13.4,5.3 -19,5.6c-2.7,0.2 -6.9,0.1 -12.1,-2c-5,-2.1 -10.2,-5.8 -15.7,-11.3c-2.1,-2.1 -5,-5.4 -6.8,-10.4c-1.9,-5.2 -2.2,-11.1 -0.9,-18l0,-0.1c0.6,-3 2,-6.4 4.3,-10.4l-18.2,-18.2c-2.4,4.8 -6.2,13.1 -8.2,23C37.6,299.5 42.2,316.4 55.4,329.6z"
android:fillColor="#242425"/>
<path
android:pathData="M86.7,250L86.7,250c-4.1,-4.4 -12,-13.1 -17.3,-21.6c-3.2,-5.2 -5.1,-9.7 -5.6,-13.5c-1.2,-6.9 -0.9,-12.7 0.9,-17.9c1.8,-5 4.8,-8.3 6.8,-10.4c5.9,-5.9 11.3,-9.7 16.7,-11.7c5.5,-2 10,-1.8 13.3,-1.4c4.4,0.5 9.2,2 14.3,4.2l17,-17c-30.3,-16.4 -54.4,-13.3 -77.4,9.7c-13.2,13.2 -17.8,30.1 -13.7,50.3c2.8,14 9.1,24.9 10.3,26.9l65.4,65.4c6,-3.1 12.5,-7.4 19.4,-12.8L86.7,250z"
android:fillColor="#242425"/>
<path
android:pathData="M92.2,244.5l80.5,-80.5c-5.2,-6.4 -9.7,-12.7 -13.6,-18.7l-81.5,81.5C82.4,233.9 88.6,240.8 92.2,244.5z"
android:fillColor="#242425"/>
<path
android:pathData="M329.6,444.6c24.2,-24.2 26.4,-49.4 7.3,-81.8c-4.6,-7.8 -10.6,-16.1 -17.7,-24.6c-16.3,-19.5 -39.5,-41.3 -69.2,-64.9c-19.4,15.4 -36.2,30.2 -49.8,43.8c-6.3,6.3 -12,12.4 -17.1,18.3l16.2,16.2c5,-5.9 10.7,-12.1 17,-18.4c9,-9 19.5,-18.5 31.2,-28.4l2.5,-2.1l2.5,2.1c21.5,18.1 38.6,35 50.9,50.1c7.8,9.6 13.8,18.6 17.7,26.7c3.4,7 5.3,13.4 5.6,19c0.2,2.7 0.1,6.9 -2,12.1c-2.1,5 -5.8,10.2 -11.3,15.7c-2.1,2.1 -5.4,5 -10.4,6.8c-5.2,1.9 -11.1,2.2 -18,0.9l-0.1,0c-3,-0.6 -6.4,-2 -10.4,-4.3l-18.2,18.2c4.7,2.4 13.1,6.1 22.9,8.2C299.4,462.4 316.4,457.8 329.6,444.6z"
android:fillColor="#242425"/>
<path
android:pathData="M244.5,407.8L164,327.3c-6.4,5.2 -12.7,9.7 -18.7,13.6l81.5,81.5C233.9,417.6 240.8,411.4 244.5,407.8z"
android:fillColor="#242425"/>
<path
android:pathData="M483.4,250c2.6,-6.3 5.3,-14 7.1,-22.7c6.3,-30.8 -1.8,-59.2 -22.7,-80.1c-19.7,-19.7 -41.7,-29.7 -65.5,-29.7c-7.5,0 -15.1,1 -22.8,3c2.9,-11.3 3.7,-22.3 2.3,-33.2c-2.5,-19.8 -12.3,-38.3 -29,-55.1C336.6,15.9 315.9,7.4 293,7.4c-6.6,0 -13.4,0.7 -20.2,2.1c-8.7,1.8 -16.5,4.5 -22.7,7.1c-6.3,-2.6 -14.1,-5.3 -22.8,-7.1c-6.9,-1.4 -13.7,-2.1 -20.2,-2.1c-22.9,0 -43.6,8.6 -59.9,24.8c-17.6,17.6 -27.5,37.2 -29.4,58.1c-0.9,9.9 0,19.9 2.7,30.2c-7.7,-2 -15.3,-3 -22.8,-3c-23.8,0 -45.8,10 -65.5,29.7c-20.9,20.9 -28.9,49.3 -22.7,80.1c1.8,8.7 4.5,16.5 7.1,22.7c-2.6,6.3 -5.3,14.1 -7.1,22.8c-6.2,30.8 1.8,59.2 22.7,80.1c19.7,19.7 41.7,29.7 65.5,29.7c0,0 0,0 0,0c7.5,0 15.1,-1 22.8,-3c-2.9,11.3 -3.7,22.3 -2.3,33.2c2.5,19.8 12.3,38.3 29,55.1c16.2,16.2 36.9,24.8 59.8,24.8c0,0 0,0 0,0c6.6,0 13.4,-0.7 20.2,-2.1c8.7,-1.8 16.5,-4.4 22.7,-7.1c6.3,2.6 14,5.3 22.7,7.1c6.9,1.4 13.7,2.1 20.3,2.1c0,0 0,0 0,0c22.9,0 43.6,-8.6 59.9,-24.8c17.6,-17.6 27.5,-37.2 29.4,-58.1c0.9,-9.9 0,-19.9 -2.7,-30.2c7.7,2 15.3,3 22.8,3c0,0 0,0 0,0c23.8,0 45.8,-10 65.5,-29.7c20.9,-20.9 29,-49.3 22.7,-80.1C488.8,264 486.1,256.3 483.4,250z"
android:fillColor="#242425"/>
<path
android:pathData="M170.4,444.6c13.2,13.2 30.1,17.8 50.3,13.7c14,-2.8 24.9,-9.1 26.9,-10.3l65.4,-65.4c-3.1,-6 -7.4,-12.5 -12.8,-19.4L250,413.3l0,0c-4.3,4.1 -13,12.1 -21.6,17.4c-5.2,3.2 -9.7,5.1 -13.5,5.6c-6.9,1.2 -12.7,0.9 -17.9,-0.9c-5,-1.8 -8.3,-4.8 -10.4,-6.8c-5.9,-5.9 -9.7,-11.3 -11.7,-16.7c-2,-5.5 -1.8,-10 -1.4,-13.3c0.5,-4.4 2,-9.2 4.2,-14.3l-17,-17C144.3,397.5 147.3,421.5 170.4,444.6z"
android:fillColor="#242425"/>
<path
android:pathData="M436.2,215c-0.6,3 -2,6.4 -4.3,10.4l18.2,18.2c2.4,-4.8 6.2,-13.1 8.2,-22.9c4.1,-20.2 -0.5,-37.1 -13.7,-50.3c-24.2,-24.2 -49.4,-26.4 -81.8,-7.3c-7.8,4.6 -16.1,10.6 -24.6,17.7c-19.5,16.3 -41.3,39.5 -64.9,69.2c15.4,19.4 30.2,36.2 43.8,49.8c6.3,6.3 12.4,12 18.3,17.1l16.2,-16.2c-5.9,-5 -12.1,-10.7 -18.4,-17c-9,-9 -18.5,-19.5 -28.4,-31.2l-2.1,-2.5l2.1,-2.5c18.1,-21.5 35,-38.6 50.1,-50.9c9.6,-7.8 18.6,-13.8 26.7,-17.7c7,-3.4 13.4,-5.3 19,-5.6c2.7,-0.2 6.9,-0.1 12.1,2c5,2.1 10.2,5.8 15.7,11.3c2.1,2.1 5,5.4 6.8,10.4C437.1,202.1 437.5,208 436.2,215L436.2,215z"
android:fillColor="#FFFFFF"/>
<path
android:pathData="M340.9,354.7l81.5,-81.5c-4.8,-7.1 -11.1,-14 -14.6,-17.7L327.3,336C332.5,342.4 337.1,348.6 340.9,354.7z"
android:fillColor="#FFFFFF"/>
<path
android:pathData="M444.6,329.6c13.2,-13.2 17.8,-30.1 13.7,-50.3c-2.8,-14 -9.1,-24.9 -10.3,-26.9L382.6,187c-6,3.1 -12.5,7.4 -19.4,12.8l50.1,50.1l0,0c4.1,4.3 12.1,13 17.4,21.6c3.2,5.2 5.1,9.7 5.6,13.5c1.2,6.9 0.9,12.7 -0.9,17.9c-1.8,5 -4.8,8.3 -6.8,10.4c-5.9,5.9 -11.3,9.7 -16.7,11.7c-5.5,2 -10,1.8 -13.3,1.4c-4.4,-0.5 -9.2,-2 -14.3,-4.2l-17,17C397.5,355.7 421.5,352.7 444.6,329.6z"
android:fillColor="#FFFFFF"/>
<path
android:pathData="M303.1,64.7c5,1.8 8.3,4.8 10.4,6.8c5.9,5.9 9.7,11.3 11.7,16.7c2,5.5 1.8,10 1.4,13.3c-0.5,4.4 -2,9.2 -4.2,14.3l17,17c16.4,-30.3 13.3,-54.4 -9.7,-77.4c-13.2,-13.2 -30.1,-17.8 -50.3,-13.7c-14,2.8 -24.9,9.1 -26.9,10.3L187,117.4c3.1,6 7.4,12.5 12.8,19.4L250,86.7l0,0c4.3,-4.1 13,-12.1 21.6,-17.4c5.2,-3.2 9.7,-5.1 13.5,-5.6C292,62.6 297.9,62.9 303.1,64.7z"
android:fillColor="#FFFFFF"/>
<path
android:pathData="M170.4,55.4c-24.2,24.2 -26.4,49.4 -7.3,81.8c4.6,7.8 10.6,16.1 17.7,24.6c16.3,19.5 39.5,41.3 69.2,64.9c19.4,-15.4 36.2,-30.2 49.8,-43.8c6.3,-6.3 12,-12.4 17.1,-18.3l-16.2,-16.2c-5,5.9 -10.7,12.1 -17,18.4c-9,9 -19.5,18.5 -31.2,28.4l-2.5,2.1l-2.5,-2.1c-21.5,-18.1 -38.6,-35 -50.9,-50.1c-7.8,-9.6 -13.8,-18.6 -17.7,-26.7c-3.4,-7 -5.3,-13.4 -5.6,-19c-0.2,-2.7 -0.1,-6.9 2,-12.1c2.1,-5 5.8,-10.2 11.3,-15.7c2.1,-2.1 5.4,-5 10.4,-6.8c5.2,-1.9 11.1,-2.2 18,-0.9l0.1,0c3,0.6 6.4,2 10.4,4.3l18.2,-18.2c-4.8,-2.4 -13.1,-6.2 -23,-8.2C200.5,37.6 183.6,42.2 170.4,55.4z"
android:fillColor="#FFFFFF"/>
<path
android:pathData="M273.2,77.6c-7.1,4.8 -14,11.1 -17.7,14.6l80.5,80.5c6.4,-5.2 12.7,-9.7 18.7,-13.6L273.2,77.6z"
android:fillColor="#FFFFFF"/>
<path
android:pathData="M55.4,329.6c24.2,24.2 49.4,26.4 81.8,7.3c7.8,-4.6 16.1,-10.6 24.6,-17.7c19.5,-16.3 41.3,-39.5 64.9,-69.2c-15.4,-19.4 -30.2,-36.2 -43.8,-49.8c-6.3,-6.3 -12.4,-12 -18.3,-17.1l-16.2,16.2c5.9,5 12.1,10.7 18.4,17c9,9 18.5,19.5 28.4,31.2l2.1,2.5l-2.1,2.5c-18.1,21.5 -35,38.6 -50.1,50.9c-9.6,7.8 -18.6,13.8 -26.7,17.7c-7,3.4 -13.4,5.3 -19,5.6c-2.7,0.2 -6.9,0.1 -12.1,-2c-5,-2.1 -10.2,-5.8 -15.7,-11.3c-2.1,-2.1 -5,-5.4 -6.8,-10.4c-1.9,-5.2 -2.2,-11.1 -0.9,-18l0,-0.1c0.6,-3 2,-6.4 4.3,-10.4l-18.2,-18.2c-2.4,4.8 -6.2,13.1 -8.2,23C37.6,299.5 42.2,316.4 55.4,329.6z"
android:fillColor="#FFFFFF"/>
<path
android:pathData="M86.7,250L86.7,250c-4.1,-4.4 -12,-13.1 -17.3,-21.6c-3.2,-5.2 -5.1,-9.7 -5.6,-13.5c-1.2,-6.9 -0.9,-12.7 0.9,-17.9c1.8,-5 4.8,-8.3 6.8,-10.4c5.9,-5.9 11.3,-9.7 16.7,-11.7c5.5,-2 10,-1.8 13.3,-1.4c4.4,0.5 9.2,2 14.3,4.2l17,-17c-30.3,-16.4 -54.4,-13.3 -77.4,9.7c-13.2,13.2 -17.8,30.1 -13.7,50.3c2.8,14 9.1,24.9 10.3,26.9l65.4,65.4c6,-3.1 12.5,-7.4 19.4,-12.8L86.7,250z"
android:fillColor="#FFFFFF"/>
<path
android:pathData="M92.2,244.5l80.5,-80.5c-5.2,-6.4 -9.7,-12.7 -13.6,-18.7l-81.5,81.5C82.4,233.9 88.6,240.8 92.2,244.5z"
android:fillColor="#FFFFFF"/>
<path
android:pathData="M329.6,444.6c24.2,-24.2 26.4,-49.4 7.3,-81.8c-4.6,-7.8 -10.6,-16.1 -17.7,-24.6c-16.3,-19.5 -39.5,-41.3 -69.2,-64.9c-19.4,15.4 -36.2,30.2 -49.8,43.8c-6.3,6.3 -12,12.4 -17.1,18.3l16.2,16.2c5,-5.9 10.7,-12.1 17,-18.4c9,-9 19.5,-18.5 31.2,-28.4l2.5,-2.1l2.5,2.1c21.5,18.1 38.6,35 50.9,50.1c7.8,9.6 13.8,18.6 17.7,26.7c3.4,7 5.3,13.4 5.6,19c0.2,2.7 0.1,6.9 -2,12.1c-2.1,5 -5.8,10.2 -11.3,15.7c-2.1,2.1 -5.4,5 -10.4,6.8c-5.2,1.9 -11.1,2.2 -18,0.9l-0.1,0c-3,-0.6 -6.4,-2 -10.4,-4.3l-18.2,18.2c4.7,2.4 13.1,6.1 22.9,8.2C299.4,462.4 316.4,457.8 329.6,444.6z"
android:fillColor="#FFFFFF"/>
<path
android:pathData="M244.5,407.8L164,327.3c-6.4,5.2 -12.7,9.7 -18.7,13.6l81.5,81.5C233.9,417.6 240.8,411.4 244.5,407.8z"
android:fillColor="#FFFFFF"/>
<path
android:pathData="M170.4,444.6c13.2,13.2 30.1,17.8 50.3,13.7c14,-2.8 24.9,-9.1 26.9,-10.3l65.4,-65.4c-3.1,-6 -7.4,-12.5 -12.8,-19.4L250,413.3l0,0c-4.3,4.1 -13,12.1 -21.6,17.4c-5.2,3.2 -9.7,5.1 -13.5,5.6c-6.9,1.2 -12.7,0.9 -17.9,-0.9c-5,-1.8 -8.3,-4.8 -10.4,-6.8c-5.9,-5.9 -9.7,-11.3 -11.7,-16.7c-2,-5.5 -1.8,-10 -1.4,-13.3c0.5,-4.4 2,-9.2 4.2,-14.3l-17,-17C144.3,397.5 147.3,421.5 170.4,444.6z"
android:fillColor="#FFFFFF"/>
</vector>

View File

@ -1,12 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<item android:drawable="@color/darkGreyPurple" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
<item android:drawable="@drawable/knott"
android:gravity="center"
/>
</layer-list>

View File

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.airbnb.lottie.LottieAnimationView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:lottie_autoPlay="true"
app:lottie_rawRes="@raw/cwtch_animated_logo_op"
app:lottie_loop="true"
app:lottie_speed="1.00"
app:lottie_enableMergePathsForKitKatAndAbove="true" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/knott"/>
</adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 442 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 721 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowSplashScreenBackground">@color/darkGreyPurple</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/knott</item>
<item name="android:windowSplashScreenIconBackgroundColor">@color/darkGreyPurple</item>
</style>
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

View File

@ -0,0 +1,5 @@
<resources>
<color name="darkGreyPurple">#281831</color>
<color name="testGreen">#00ff00</color>
<color name="ic_launcher_background">@color/darkGreyPurple</color>
</resources>

View File

@ -1,18 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
Flutter draws its first frame -->
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>
</resources>

View File

@ -1,18 +1,3 @@
buildscript {
ext.kotlin_version = '1.6.21'
repositories {
google()
// jCenter() no longer exists... https://blog.gradle.org/jcenter-shutdown
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.1.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
@ -28,7 +13,6 @@ subprojects {
project.evaluationDependsOn(':app')
}
//removed due to gradle namespace conflicts that are beyond erinn's mere mortal understanding
//task clean(type: Delete) {
// delete rootProject.buildDir
//}
tasks.register("clean", Delete) {
delete rootProject.buildDir
}

View File

@ -1,6 +1,8 @@
#Mon Jun 20 10:33:21 PDT 2022
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
# third party plugin connectivity_plus should match, so when updating, also update
# lib/third_party/connectivity_plus/connectivity_plus/android/gradle/wrapper/gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

View File

@ -1,11 +1,25 @@
include ':app', ':cwtch'
pluginManagement {
def flutterSdkPath = {
def properties = new Properties()
file("local.properties").withInputStream { properties.load(it) }
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
return flutterSdkPath
}()
def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
def properties = new Properties()
includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
assert localPropertiesFile.exists()
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "7.4.2" apply false
id "org.jetbrains.kotlin.android" version "1.8.21" apply false
}
include ":app"

Binary file not shown.

Binary file not shown.

BIN
assets/fonts/Inter-Bold.ttf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
assets/fonts/Inter-Thin.ttf Normal file

Binary file not shown.

View File

@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Binary file not shown.

View File

@ -0,0 +1,93 @@
Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

93
assets/fonts/OFL-noto.txt Normal file
View File

@ -0,0 +1,93 @@
Copyright 2021 Google Inc. All Rights Reserved.
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1,107 @@
---
colors:
darkGreyPurple: 0x281831
deepPurple: 0x422850
mauvePurple: 0x8E64A5
whiteishPurple: 0xE3DFE4
lightGrey: 0x9E9E9E
softGreen: 0xA0FFB0
softRed: 0xFFA0B0
whitePurple: 0xFFFDFF
softPurple: 0xFDF3FC
purple: 0xDFB9DE
brightPurple: 0xD1B0E0 # not in new: portrait badge color
darkPurple: 0x350052
greyPurple: 0x775F84 # not in new: portrait borders
pink: 0xE85DA1 # not in new: active button color
hotPink: 0xD20070 # #D01972)
softGrey: 0xB3B6B3 # not in new theme: blocked
themes:
name: cwtch
dark:
colors:
background: darkGreyPurple
header: darkGreyPurple
userBubble: mauvePurple
peerBubble: deepPurple
font: whiteishPurple
settings: whiteishPurple
accent: hotPink
theme:
backgroundHilightElementColor: deepPurple
backgroundMainColor: background # darkGreyPurple
backgroundPaneColor: header # darkGreyPurple
defaultButtonColor: accent # hotPink
defaultButtonDisabledColor: lightGrey
defaultButtonDisabledTextColor: darkGreyPurple
defaultButtonTextColor: whiteishPurple
dropShadowColor: mauvePurple
hilightElementColor: purple
mainTextColor: font # whiteishPurple
messageFromMeBackgroundColor: userBubble # mauvePurple
messageFromMeTextColor: font # whiteishPurple
messageFromOtherBackgroundColor: peerBubble # deepPurple
messageFromOtherTextColor: font # whiteishPurple
portraitBackgroundColor: deepPurple
portraitBlockedBorderColor: lightGrey
portraitBlockedTextColor: lightGrey
portraitContactBadgeColor: hotPink
portraitContactBadgeTextColor: whiteishPurple
portraitOfflineBorderColor: purple
portraitOnlineBorderColor: whiteishPurple
portraitProfileBadgeColor: hotPink
portraitProfileBadgeTextColor: whiteishPurple
scrollbarDefaultColor: purple
sendHintTextColor: mauvePurple
chatReactionIconColor: mauvePurple
textfieldBackgroundColor: deepPurple
textfieldBorderColor: deepPurple
textfieldErrorColor: hotPink
textfieldHintColor: mainTextColor
toolbarIconColor: settings # whiteishPurple
topbarColor: header # darkGreyPurple
chatImage: Cwtch.png
chatImageColor: peerBubble
light:
colors:
background: whitePurple
header: softPurple
userBubble: purple
peerBubble: softPurple
font: 0x281831
settings: 0x281831
accent: hotPink
theme:
backgroundHilightElementColor: softPurple
backgroundMainColor: background # whitePurple
backgroundPaneColor: background # whitePurple
defaultButtonColor: accent # hotPink
defaultButtonDisabledColor: softGrey
defaultButtonTextColor: whitePurple # ?
dropShadowColor: purple
hilightElementColor: purple
mainTextColor: settings
messageFromMeBackgroundColor: userBubble # brightPurple
messageFromMeTextColor: font # mainTextColor
messageFromOtherBackgroundColor: peerBubble # purple
messageFromOtherTextColor: font # darkPurple
portraitBackgroundColor: softPurple
portraitBlockedBorderColor: softGrey
portraitBlockedTextColor: softGrey
portraitContactBadgeColor: accent
portraitContactBadgeTextColor: whitePurple
portraitOfflineBorderColor: greyPurple
portraitOnlineBorderColor: font
portraitProfileBadgeColor: accent
portraitProfileBadgeTextColor: whitePurple
scrollbarDefaultColor: accent
sendHintTextColor: purple
chatReactionIconColor: purple
textfieldBackgroundColor: purple
textfieldBorderColor: purple
textfieldErrorColor: hotPink
textfieldHintColor: font
toolbarIconColor: background # darkPurple
topbarColor: header # softPurple
chatImage: Cwtch.png
chatImageColor: 0xf1dff0

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -0,0 +1,86 @@
---
colors:
darkDarkBlue: 0x0E1628
darkLightBlue: 0x19243E
white: 0xE6E9F4
darkBlue: 0x131B2E
lighterDarkBlue: 0x19243E
lightBlue: 0xC0C8E5
themes:
name: ghost
dark:
colors:
background: 0x131B2E
header: 0x0E1628
userBubble: 0x25355A
peerBubble: 0x19243E
font: 0xE6E9F4
settings: 0xE6E9F4
accent: 0xD20070
reaction: 0x96A5D4
theme:
backgroundHilightElementColor: darkDarkBlue
backgroundMainColor: background
backgroundPaneColor: header
defaultButtonColor: accent
dropShadowColor: darkBlue
mainTextColor: font
messageFromMeBackgroundColor: userBubble
messageFromMeTextColor: font
messageFromOtherBackgroundColor: peerBubble
messageFromOtherTextColor: font
portraitOfflineBorderColor: 0x96A5D4
portraitOnlineBorderColor: font
portraitBackgroundColor: background
scrollbarDefaultColor: darkLightBlue
sendHintTextColor: userBubble
textfieldBackgroundColor: peerBubble
textfieldBorderColor: userBubble
textfieldHintColor: font
toolbarIconColor: settings
topbarColor: header
chatReactionIconColor: reaction
chatImage: Ghost.png
chatImageColor: userBubble
snackbarBackgroundColor: accent
snackbarTextColor: 0xE6E9F4
light:
colors:
background: 0xE6E9F4
header: 0x96A5D4
userBubble: 0x96A5D4
peerBubble: 0xC0C8E5
font: 0x131B2E
settings: 0x131B2E
accent: 0xD20070
reaction: 0x96A5D4
theme:
backgroundHilightElementColor: peerBubble
backgroundMainColor: background
backgroundPaneColor: background
defaultButtonColor: accent
defaultButtonActiveColor: lighterDarkBlue
defaultButtonDisabledColor: userBubble
dropShadowColor: darkBlue
mainTextColor: settings
messageFromMeBackgroundColor: userBubble
messageFromMeTextColor: font
messageFromOtherBackgroundColor: peerBubble
messageFromOtherTextColor: font
portraitContactBadgeColor: accent
portraitOfflineBorderColor: header
portraitOnlineBorderColor: font
portraitBackgroundColor: background
scrollbarDefaultColor: accent
sendHintTextColor: peerBubble
textfieldBackgroundColor: peerBubble
textfieldBorderColor: userBubble
textfieldHintColor: font
toolbarIconColor: 0xffffff
topbarColor: header
chatReactionIconColor: reaction
chatImage: Ghost.png
chatImageColor: peerBubble
snackbarBackgroundColor: accent
snackbarTextColor: background

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1,53 @@
---
themes:
name: juniper
dark:
colors:
background: 0x1B1B1B
backgroundAlt: 0x494949
header: 0x1B1B1B
userBubble: 0x373737
peerBubble: 0x494949
font: 0xFFFFFF
settings: 0xFFFDFF
accent: 0x9E6A56
accentAlt: 0x9E6A56
theme:
backgroundMainColor: background
backgroundPaneColor: header
topbarColor: header
mainTextColor: font
defaultButtonColor: accent
textfieldHintColor: mainTextColor
toolbarIconColor: settings
messageFromMeBackgroundColor: userBubble
messageFromMeTextColor: font
messageFromOtherBackgroundColor: peerBubble
messageFromOtherTextColor: font
textfieldBackgroundColor: peerBubble
textfieldBorderColor: userBubble
backgroundHilightElementColor: accent
sendHintTextColor: accentAlt
hilightElementColor: accentAlt
defaultButtonTextColor: mainTextColor
defaultButtonDisabledColor: peerBubble
defaultButtonDisabledTextColor: peerBubble
textfieldErrorColor: accent
scrollbarDefaultColor: accent
portraitBackgroundColor: header
portraitOnlineBorderColor: font
portraitOfflineBorderColor: peerBubble
portraitBlockedBorderColor: peerBubble
portraitBlockedTextColor: peerBubble
portraitContactBadgeColor: accent
portraitContactBadgeTextColor: mainTextColor
portraitProfileBadgeColor: accent
portraitProfileBadgeTextColor: mainTextColor
dropShadowColor: accentAlt
chatReactionIconColor: accentAlt
chatImage: JuniperDark.png
chatImageColor: userBubble
messageSelectionColor: accent
textfieldSelectionColor: accent
menuBackgroundColor: accent

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -0,0 +1,91 @@
---
colors:
lavender: 0xB194C1
themes:
name: mermaid
dark:
colors:
background: 0x15282A
header: 0x15282A
userBubble: 0x1d5754
peerBubble: 0x253D3F
font: 0xEDFAFC
settings: 0xEDFAFC
accent: 0x8E64A5
reaction: 0x8E64A5
theme:
backgroundHilightElementColor: peerBubble
backgroundMainColor: background # darkGreyPurple
backgroundPaneColor: header # darkGreyPurple
defaultButtonColor: accent # hotPink
dropShadowColor: lavender
mainTextColor: font # whiteishPurple
messageFromMeBackgroundColor: userBubble # mauvePurple
messageFromMeTextColor: font # whiteishPurple
messageFromOtherBackgroundColor: peerBubble # deepPurple
messageFromOtherTextColor: font # whiteishPurple
portraitOfflineBorderColor: userBubble
portraitOnlineBorderColor: font
portraitContactBadgeColor: accent
portraitContactBadgeTextColor: 0xffffff
portraitProfileBadgeColor: accent
portraitProfileBadgeTextColor: 0xffffff
portraitBackgroundColor: background
textfieldBackgroundColor: peerBubble
textfieldBorderColor: userBubble
textfieldHintColor: mainTextColor
toolbarIconColor: settings # whiteishPurple
topbarColor: header # darkGreyPurple
sendHintTextColor: userBubble
chatReactionIconColor: reaction
chatImage: Mermaid.png
chatImageColor: peerBubble
snackbarBackgroundColor: accent
snackbarTextColor: 0xEDFAFC
messageSelectionColor: accent
textfieldSelectionColor: accent
menuBackgroundColor: accent
light:
colors:
background: 0xEDFAFC
header: 0x71C1BF
userBubble: 0x71C1BF
peerBubble: 0xD2EFF3
font: 0x15282A
settings: 0x15282A
accent: 0x8E64A5
reaction: 0x71C1BF
theme:
backgroundHilightElementColor: peerBubble
backgroundMainColor: background # whitePurple
backgroundPaneColor: background # whitePurple
defaultButtonColor: accent # hotPink
dropShadowColor: peerBubble
mainTextColor: settings
messageFromMeBackgroundColor: userBubble # brightPurple
messageFromMeTextColor: font # mainTextColor
messageFromOtherBackgroundColor: peerBubble # purple
messageFromOtherTextColor: font # darkPurple
portraitContactBadgeColor: accent
portraitContactBadgeTextColor: 0xffffff
portraitProfileBadgeColor: accent
portraitProfileBadgeTextColor: 0xffffff
portraitOfflineBorderColor: userBubble
portraitOnlineBorderColor: font
portraitBackgroundColor: background
scrollbarDefaultColor: accent
textfieldBackgroundColor: peerBubble
textfieldBorderColor: userBubble
textfieldHintColor: font
toolbarIconColor: 0xffffff
topbarColor: header # softPurple
sendHintTextColor: userBubble
chatReactionIconColor: reaction
chatImage: Mermaid.png
chatImageColor: peerBubble
snackbarBackgroundColor: accent
snackbarTextColor: background
messageSelectionColor: 0xb1e3ea
textfieldSelectionColor: 0xb1e3ea
menuBackgroundColor: 0xb1e3ea

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@ -0,0 +1,77 @@
---
themes:
name: midnight
dark:
colors:
accentGray: 0xE0E0E0
background: 0x111111
backgroundAlt: 0x494949
header: 0x111111
userBubble: 0x2D2D2D
peerBubble: 0x1B1B1B
font: 0xF0F1F1
settings: 0xF0F1F1
accent: 0xD20070
reaction: 0xD20070
theme:
backgroundHilightElementColor: backgroundAlt
backgroundMainColor: background # darkGreyPurple
backgroundPaneColor: header # darkGreyPurple
defaultButtonColor: accent # hotPink
dropShadowColor: accentGray
mainTextColor: font # whiteishPurple
messageFromMeBackgroundColor: userBubble # mauvePurple
messageFromMeTextColor: font # whiteishPurple
messageFromOtherBackgroundColor: peerBubble # deepPurple
messageFromOtherTextColor: font # whiteishPurple
scrollbarDefaultColor: accentGray
textfieldBackgroundColor: peerBubble
textfieldBorderColor: userBubble
textfieldHintColor: mainTextColor
portraitOfflineBorderColor: 0x676767
portraitOnlineBorderColor: font
portraitBackgroundColor: background
toolbarIconColor: settings # whiteishPurple
topbarColor: header # darkGreyPurple
sendHintTextColor: userBubble
chatReactionIconColor: reaction
chatImage: Midnight.png
chatImageColor: userBubble
snackbarBackgroundColor: accent
snackbarTextColor: 0xF0F1F1
light:
colors:
background: 0xF0F1F1 # Color( 0xFFFDFF)
header: 0xE0E0E0
userBubble: 0xBABDBE
peerBubble: 0xE0E0E0
font: 0x111111
settings: 0x111111
accent: 0xD20070
reaction: 0xD20070
theme:
backgroundHilightElementColor: peerBubble
backgroundMainColor: background # whitePurple
backgroundPaneColor: background # whitePurple
defaultButtonColor: accent # hotPink
mainTextColor: settings
messageFromMeBackgroundColor: userBubble # brightPurple
messageFromMeTextColor: font # mainTextColor
messageFromOtherBackgroundColor: peerBubble # purple
messageFromOtherTextColor: font # darkPurple
portraitContactBadgeColor: accent
portraitOfflineBorderColor: userBubble
portraitOnlineBorderColor: font
portraitBackgroundColor: background
scrollbarDefaultColor: accent
textfieldBackgroundColor: userBubble
textfieldHintColor: font
toolbarIconColor: 0xffffff
topbarColor: header # softPurple
sendHintTextColor: userBubble
chatReactionIconColor: reaction
chatImage: Midnight.png
chatImageColor: peerBubble
snackbarBackgroundColor: accent
snackbarTextColor: background

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -0,0 +1,86 @@
---
themes:
name: neon1
dark:
colors:
background: 0x281831
header: 0x281831
userBubble: 0x7F00C5
peerBubble: 0x422850
font: 0xFBF3FF
settings: 0x281831
accent: 0x56DCD8
reaction: 0xD891FF
theme:
backgroundMainColor: background # darkGreyPurple
backgroundPaneColor: header # darkGreyPurple
defaultButtonColor: accent # hotPink
mainTextColor: 0xFBF3FF # whiteishPurple
messageFromMeBackgroundColor: userBubble # mauvePurple
messageFromMeTextColor: font # whiteishPurple
messageFromOtherBackgroundColor: peerBubble # deepPurple
messageFromOtherTextColor: font # whiteishPurple
portraitContactBadgeColor: accent
portraitContactBadgeTextColor: background
portraitProfileBadgeColor: accent
portraitProfileBadgeTextColor: background
portraitBackgroundColor: background
portraitOfflineBorderColor: 0x775F84
portraitOnlineBorderColor: font
scrollbarDefaultColor: accent
textfieldHintColor: mainTextColor
toolbarIconColor: settings # whiteishPurple
topbarColor: header # darkGreyPurple
sendHintTextColor: userBubble
chatReactionIconColor: reaction
defaultButtonTextColor: 0x281831
chatImage: Neon1.png
chatImageColor: 0x4f3060
snackbarBackgroundColor: accent
snackbarTextColor: background
messageSelectionColor: 0x775F84
textfieldSelectionColor: 0x775F84
menuBackgroundColor: 0x775F84
light:
colors:
background: 0xFBF3FF
header: 0x56DCD8
userBubble: 0x56DCD8
peerBubble: 0xF5E1FF
font: 0x281831
settings: 0x281831
accent: 0xD891FF
reaction: 0xD891FF
theme:
backgroundMainColor: background # whitePurple
backgroundPaneColor: background # whitePurple
defaultButtonColor: accent # hotPink
dropShadowColor: userBubble
mainTextColor: settings
messageFromMeBackgroundColor: userBubble # brightPurple
messageFromMeTextColor: font # mainTextColor
messageFromOtherBackgroundColor: peerBubble # purple
messageFromOtherTextColor: font # darkPurple
portraitOfflineBorderColor: 0xeac1ff
portraitOnlineBorderColor: font
portraitContactBadgeColor: accent
portraitContactBadgeTextColor: font
portraitProfileBadgeColor: accent
portraitProfileBadgeTextColor: font
scrollbarDefaultColor: accent
textfieldBackgroundColor: peerBubble
textfieldBorderColor: userBubble
textfieldHintColor: font
toolbarIconColor: settings # darkPurple
topbarColor: header # softPurple
sendHintTextColor: 0xeac1ff
chatReactionIconColor: reaction
chatImage: Neon1.png
chatImageColor: 0xeac1ff
defaultButtonTextColor: font
snackbarBackgroundColor: accent
snackbarTextColor: font
messageSelectionColor: accent
textfieldSelectionColor: accent
menuBackgroundColor: accent

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -0,0 +1,83 @@
---
themes:
name: neon2
dark:
colors:
background: 0x281831
header: 0x281831
userBubble: 0x7F00C5
peerBubble: 0x422850
font: 0xFBF3FF
settings: 0x281831
accent: 0x90EE02
reaction: 0xD891FF
theme:
backgroundMainColor: background # darkGreyPurple
backgroundPaneColor: header # darkGreyPurple
defaultButtonColor: accent # hotPink
mainTextColor: font # whiteishPurple
messageFromMeBackgroundColor: userBubble # mauvePurple
messageFromMeTextColor: font # whiteishPurple
messageFromOtherBackgroundColor: peerBubble # deepPurple
messageFromOtherTextColor: font # whiteishPurple
portraitContactBadgeColor: accent
portraitContactBadgeTextColor: 0x281831
portraitProfileBadgeColor: accent
portraitProfileBadgeTextColor: 0x281831
scrollbarDefaultColor: accent
textfieldHintColor: mainTextColor
toolbarIconColor: settings # whiteishPurple
topbarColor: header # darkGreyPurple
sendHintTextColor: userBubble
chatReactionIconColor: reaction
defaultButtonTextColor: background
chatImage: Neon2.png
chatImageColor: 0x573569
snackbarBackgroundColor: accent
snackbarTextColor: background
messageSelectionColor: 0x775F84
textfieldSelectionColor: 0x775F84
menuBackgroundColor: 0x775F84
light:
colors:
paleGreen: 0xE7F6F6
background: 0xFBFFF6
header: 0x90EE02
userBubble: 0x90EE02
peerBubble: 0xF3FFE4
font: 0x281831
settings: 0x281831
accent: 0x7F00C5
reaction: 0x7F00C5
theme:
backgroundMainColor: background # whitePurple
backgroundPaneColor: background # whitePurple
defaultButtonColor: accent # hotPink
dropShadowColor: userBubble
mainTextColor: settings
messageFromMeBackgroundColor: userBubble # brightPurple
messageFromMeTextColor: font # mainTextColor
messageFromOtherBackgroundColor: peerBubble # purple
messageFromOtherTextColor: font # darkPurple
portraitOfflineBorderColor: 0x775F84
portraitOnlineBorderColor: font
portraitContactBadgeColor: accent
portraitContactBadgeTextColor: background
portraitProfileBadgeColor: accent
portraitProfileBadgeTextColor: background
portraitBackgroundColor: background
scrollbarDefaultColor: accent
textfieldBackgroundColor: paleGreen
textfieldBorderColor: peerBubble
textfieldHintColor: font
toolbarIconColor: background # darkPurple
topbarColor: header # softPurple
chatReactionIconColor: accent
chatImage: Neon2.png
chatImageColor: 0xd9ffa8
snackbarBackgroundColor: accent
snackbarTextColor: background
messageSelectionColor: 0xd9ffa8
textfieldSelectionColor: 0xd9ffa8
menuBackgroundColor: 0xd9ffa8

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1,84 @@
---
themes:
name: pumpkin
dark:
colors:
background: 0x281831
header: 0x281831
userBubble: 0x873C14
peerBubble: 0x422850
font: 0xFFFAF2
settings: 0xFFFAF2
accent: 0x873C14
reaction: 0x873C14
theme:
backgroundMainColor: background # darkGreyPurple
backgroundPaneColor: header # darkGreyPurple
defaultButtonColor: accent # hotPink
mainTextColor: font # whiteishPurple
messageFromMeBackgroundColor: userBubble # mauvePurple
messageFromMeTextColor: font # whiteishPurple
messageFromOtherBackgroundColor: peerBubble # deepPurple
messageFromOtherTextColor: font # whiteishPurple
scrollbarDefaultColor: accent
portraitContactBadgeColor: accent
portraitContactBadgeTextColor: 0xFFFAF2
portraitProfileBadgeColor: accent
portraitProfileBadgeTextColor: 0xFFFAF2
portraitOfflineBorderColor: 0x775F84
portraitOnlineBorderColor: font
textfieldHintColor: mainTextColor
toolbarIconColor: settings # whiteishPurple
topbarColor: header # darkGreyPurple
sendHintTextColor: peerBubble
chatReactionIconColor: reaction
chatImage: Pumpkin.png
chatImageColor: 0x573569
snackbarBackgroundColor: accent
snackbarTextColor: 0xFFFAF2
messageSelectionColor: 0x775F84
textfieldSelectionColor: 0x775F84
menuBackgroundColor: 0x775F84
light:
colors:
background: 0xFFFAF2
header: 0xFF9800
userBubble: 0xFF9800
peerBubble: 0xFFF3E0
font: 0x281831
settings: 0x281831
accent: 0x422850
reaction: 0xFF9800
theme:
backgroundHilightElementColor: peerBubble
backgroundMainColor: background # whitePurple
backgroundPaneColor: background # whitePurple
defaultButtonColor: accent # hotPink
dropShadowColor: peerBubble
mainTextColor: settings
messageFromMeBackgroundColor: userBubble # brightPurple
messageFromMeTextColor: font # mainTextColor
messageFromOtherBackgroundColor: peerBubble # purple
messageFromOtherTextColor: font # darkPurple
portraitContactBadgeColor: accent
portraitContactBadgeTextColor: 0xFFFAF2
portraitProfileBadgeColor: accent
portraitProfileBadgeTextColor: 0xFFFAF2
portraitOfflineBorderColor: 0x775F84
portraitOnlineBorderColor: font
scrollbarDefaultColor: accent
textfieldBackgroundColor: background
textfieldBorderColor: userBubble
textfieldHintColor: mainTextColor
toolbarIconColor: background # darkPurple
topbarColor: header # softPurple
sendHintTextColor: 0xffd494
chatReactionIconColor: reaction
chatImage: Pumpkin.png
chatImageColor: 0xFFDCA8
snackbarBackgroundColor: accent
snackbarTextColor: background
messageSelectionColor: 0xFFDCA8
textfieldSelectionColor: 0xFFDCA8
menuBackgroundColor: 0xFFDCA8

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -0,0 +1,85 @@
---
themes:
name: vampire
dark:
colors:
background: 0x27141B
header: 0x27141B
userBubble: 0x422850
peerBubble: 0x502033
font: 0xFBF4F7
settings: 0xFBF4F7
accent: 0x502033
reaction: 0xC86B89
theme:
backgroundMainColor: background # darkGreyPurple
backgroundPaneColor: header # darkGreyPurple
defaultButtonColor: accent # hotPink
mainTextColor: font # whiteishPurple
messageFromMeBackgroundColor: userBubble # mauvePurple
messageFromMeTextColor: font # whiteishPurple
messageFromOtherBackgroundColor: peerBubble # deepPurple
messageFromOtherTextColor: font # whiteishPurple
portraitContactBadgeColor: 0x863655
portraitContactBadgeTextColor: 0xFBF4F7
portraitProfileBadgeColor: 0x863655
portraitProfileBadgeTextColor: 0xFBF4F7
portraitBackgroundColor: peerBubble
portraitOfflineBorderColor: 0x863655
portraitOnlineBorderColor: font
scrollbarDefaultColor: accent
textfieldHintColor: mainTextColor
toolbarIconColor: settings # whiteishPurple
topbarColor: header # darkGreyPurple
sendHintTextColor: peerBubble
chatReactionIconColor: reaction
chatImage: Vampire.png
chatImageColor: peerBubble
snackbarBackgroundColor: accent
snackbarTextColor: 0xFBF4F7
messageSelectionColor: 0x863655
textfieldSelectionColor: 0x863655
menuBackgroundColor: 0x863655
light:
colors:
background: 0xFBF4F7
header: 0xC86B89
userBubble: 0xDA94A9
peerBubble: 0xF7EAF0
font: 0x27141B
settings: 0xFBF4F7
accent: 0x502033
reaction: 0xDA94A9
theme:
backgroundMainColor: background # whitePurple
backgroundPaneColor: background # whitePurple
defaultButtonColor: accent # hotPink
dropShadowColor: userBubble
mainTextColor: font
messageFromMeBackgroundColor: userBubble # brightPurple
messageFromMeTextColor: font # mainTextColor
messageFromOtherBackgroundColor: peerBubble # purple
messageFromOtherTextColor: font # darkPurple
portraitContactBadgeColor: accent
portraitContactBadgeTextColor: 0xFBF4F7
portraitProfileBadgeColor: accent
portraitProfileBadgeTextColor: 0xFBF4F7
portraitOfflineBorderColor: 0x775F84
portraitOnlineBorderColor: font
portraitBackgroundColor: background
scrollbarDefaultColor: accent
textfieldBackgroundColor: peerBubble
textfieldBorderColor: userBubble
textfieldHintColor: font
toolbarIconColor: settings # darkPurple
topbarColor: header # softPurple
sendHintTextColor: userBubble
chatReactionIconColor: reaction
chatImage: Vampire.png
chatImageColor: 0xE9BFCD
snackbarBackgroundColor: accent
snackbarTextColor: background
messageSelectionColor: header
textfieldSelectionColor: header
menuBackgroundColor: header

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@ -0,0 +1,86 @@
---
themes:
name: witch
dark:
colors:
background: 0x111b11
header: 0x0E1E0E
userBubble: 0x3B5132
peerBubble: 0x152716
font: 0xF1F3EC
settings: 0xE3ECD3
accent: 0x8E64A5
reaction: 0x97AF6E
theme:
backgroundHilightElementColor: peerBubble
backgroundMainColor: background # darkGreyPurple
backgroundPaneColor: header # darkGreyPurple
defaultButtonColor: accent # hotPink
mainTextColor: font # whiteishPurple
messageFromMeBackgroundColor: userBubble # mauvePurple
messageFromMeTextColor: font # whiteishPurple
messageFromOtherBackgroundColor: peerBubble # deepPurple
messageFromOtherTextColor: font # whiteishPurple
portraitContactBadgeColor: accent
portraitContactBadgeTextColor: 0xF1F3EC
portraitProfileBadgeColor: accent
portraitProfileBadgeTextColor: 0xF1F3EC
portraitOfflineBorderColor: 0x355934
portraitOnlineBorderColor: font
portraitBackgroundColor: peerBubble
scrollbarDefaultColor: accent
textfieldBackgroundColor: peerBubble
textfieldBorderColor: userBubble
textfieldHintColor: mainTextColor
toolbarIconColor: settings # whiteishPurple
topbarColor: header # darkGreyPurple
chatReactionIconColor: reaction
chatImage: Witch.png
chatImageColor: 0x1E321D
snackbarBackgroundColor: accent
snackbarTextColor: 0xF1F3EC
messageSelectionColor: accent
textfieldSelectionColor: accent
menuBackgroundColor: accent
light:
colors:
background: 0xF1F3EC
header: 0x97af6e
userBubble: 0x97AF6E
peerBubble: 0xE3ECD3
font: 0x111b11
settings: 0x0E1E0E
accent: 0x8E64A5
reaction: 0x97AF6E
theme:
backgroundHilightElementColor: peerBubble
backgroundMainColor: background # whitePurple
backgroundPaneColor: background # whitePurple
defaultButtonColor: accent # hotPink
mainTextColor: settings
messageFromMeBackgroundColor: userBubble # brightPurple
messageFromMeTextColor: font # mainTextColor
messageFromOtherBackgroundColor: peerBubble # purple
messageFromOtherTextColor: font # darkPurple
portraitContactBadgeColor: accent
portraitContactBadgeTextColor: 0xF1F3EC
portraitProfileBadgeColor: accent
portraitProfileBadgeTextColor: 0xF1F3EC
portraitOfflineBorderColor: userBubble
portraitOnlineBorderColor: font
portraitBackgroundColor: background
scrollbarDefaultColor: accent
textfieldBackgroundColor: background
textfieldBorderColor: userBubble
textfieldHintColor: font
toolbarIconColor: settings # darkPurple
topbarColor: header # softPurple
chatReactionIconColor: reaction
chatImage: Witch.png
chatImageColor: 0xD0DDBA
snackbarBackgroundColor: accent
snackbarTextColor: background
messageSelectionColor: accent
textfieldSelectionColor: accent
menuBackgroundColor: accent

241
elf_x86_64.x Normal file
View File

@ -0,0 +1,241 @@
/* Slightly Modified Default linker script, for normal executables */
/* The only difference is that this version suppresses the .comment section. See DISCARD section`
/* Copyright (C) 2014-2022 Free Software Foundation, Inc.
Copying and distribution of this script, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. */
OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64",
"elf64-x86-64")
OUTPUT_ARCH(i386:x86-64)
ENTRY(_start)
SEARCH_DIR("=/usr/local/lib/x86_64-linux-gnu"); SEARCH_DIR("=/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr/lib/x86_64-linux-gnu64"); SEARCH_DIR("=/usr/local/lib64"); SEARCH_DIR("=/lib64"); SEARCH_DIR("=/usr/lib64"); SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib"); SEARCH_DIR("=/usr/x86_64-linux-gnu/lib64"); SEARCH_DIR("=/usr/x86_64-linux-gnu/lib");
SECTIONS
{
/* Read-only sections, merged into text segment: */
PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x400000)); . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS;
.interp : { *(.interp) }
.note.gnu.build-id : { *(.note.gnu.build-id) }
.hash : { *(.hash) }
.gnu.hash : { *(.gnu.hash) }
.dynsym : { *(.dynsym) }
.dynstr : { *(.dynstr) }
.gnu.version : { *(.gnu.version) }
.gnu.version_d : { *(.gnu.version_d) }
.gnu.version_r : { *(.gnu.version_r) }
.rela.init : { *(.rela.init) }
.rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) }
.rela.fini : { *(.rela.fini) }
.rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) }
.rela.data.rel.ro : { *(.rela.data.rel.ro .rela.data.rel.ro.* .rela.gnu.linkonce.d.rel.ro.*) }
.rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) }
.rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) }
.rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) }
.rela.ctors : { *(.rela.ctors) }
.rela.dtors : { *(.rela.dtors) }
.rela.got : { *(.rela.got) }
.rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) }
.rela.ldata : { *(.rela.ldata .rela.ldata.* .rela.gnu.linkonce.l.*) }
.rela.lbss : { *(.rela.lbss .rela.lbss.* .rela.gnu.linkonce.lb.*) }
.rela.lrodata : { *(.rela.lrodata .rela.lrodata.* .rela.gnu.linkonce.lr.*) }
.rela.ifunc : { *(.rela.ifunc) }
.rela.plt :
{
*(.rela.plt)
PROVIDE_HIDDEN (__rela_iplt_start = .);
*(.rela.iplt)
PROVIDE_HIDDEN (__rela_iplt_end = .);
}
.relr.dyn : { *(.relr.dyn) }
.init :
{
KEEP (*(SORT_NONE(.init)))
}
.plt : { *(.plt) *(.iplt) }
.plt.got : { *(.plt.got) }
.plt.sec : { *(.plt.sec) }
.text :
{
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
*(.text.exit .text.exit.*)
*(.text.startup .text.startup.*)
*(.text.hot .text.hot.*)
*(SORT(.text.sorted.*))
*(.text .stub .text.* .gnu.linkonce.t.*)
/* .gnu.warning sections are handled specially by elf.em. */
*(.gnu.warning)
}
.fini :
{
KEEP (*(SORT_NONE(.fini)))
}
PROVIDE (__etext = .);
PROVIDE (_etext = .);
PROVIDE (etext = .);
.rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
.rodata1 : { *(.rodata1) }
.eh_frame_hdr : { *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) }
.eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) *(.eh_frame.*) }
.gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }
.gnu_extab : ONLY_IF_RO { *(.gnu_extab*) }
/* These sections are generated by the Sun/Oracle C++ compiler. */
.exception_ranges : ONLY_IF_RO { *(.exception_ranges*) }
/* Adjust the address for the data segment. We want to adjust up to
the same address within the page on the next page up. */
. = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE));
/* Exception handling */
.eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) *(.eh_frame.*) }
.gnu_extab : ONLY_IF_RW { *(.gnu_extab) }
.gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }
.exception_ranges : ONLY_IF_RW { *(.exception_ranges*) }
/* Thread Local Storage sections */
.tdata :
{
PROVIDE_HIDDEN (__tdata_start = .);
*(.tdata .tdata.* .gnu.linkonce.td.*)
}
.tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
.preinit_array :
{
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP (*(.preinit_array))
PROVIDE_HIDDEN (__preinit_array_end = .);
}
.init_array :
{
PROVIDE_HIDDEN (__init_array_start = .);
KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
PROVIDE_HIDDEN (__init_array_end = .);
}
.fini_array :
{
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))
PROVIDE_HIDDEN (__fini_array_end = .);
}
.ctors :
{
/* gcc uses crtbegin.o to find the start of
the constructors, so we make sure it is
first. Because this is a wildcard, it
doesn't matter if the user does not
actually link against crtbegin.o; the
linker won't look for a file to match a
wildcard. The wildcard also means that it
doesn't matter which directory crtbegin.o
is in. */
KEEP (*crtbegin.o(.ctors))
KEEP (*crtbegin?.o(.ctors))
/* We don't want to include the .ctor section from
the crtend.o file until after the sorted ctors.
The .ctor section from the crtend file contains the
end of ctors marker and it must be last */
KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
}
.dtors :
{
KEEP (*crtbegin.o(.dtors))
KEEP (*crtbegin?.o(.dtors))
KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
KEEP (*(SORT(.dtors.*)))
KEEP (*(.dtors))
}
.jcr : { KEEP (*(.jcr)) }
.data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }
.dynamic : { *(.dynamic) }
.got : { *(.got) *(.igot) }
. = DATA_SEGMENT_RELRO_END (SIZEOF (.got.plt) >= 24 ? 24 : 0, .);
.got.plt : { *(.got.plt) *(.igot.plt) }
.data :
{
*(.data .data.* .gnu.linkonce.d.*)
SORT(CONSTRUCTORS)
}
.data1 : { *(.data1) }
_edata = .; PROVIDE (edata = .);
. = .;
__bss_start = .;
.bss :
{
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON)
/* Align here to ensure that the .bss section occupies space up to
_end. Align after .bss to ensure correct alignment even if the
.bss section disappears because there are no input sections.
FIXME: Why do we need it? When there is no .bss section, we do not
pad the .data section. */
. = ALIGN(. != 0 ? 64 / 8 : 1);
}
.lbss :
{
*(.dynlbss)
*(.lbss .lbss.* .gnu.linkonce.lb.*)
*(LARGE_COMMON)
}
. = ALIGN(64 / 8);
. = SEGMENT_START("ldata-segment", .);
.lrodata ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1)) :
{
*(.lrodata .lrodata.* .gnu.linkonce.lr.*)
}
.ldata ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1)) :
{
*(.ldata .ldata.* .gnu.linkonce.l.*)
. = ALIGN(. != 0 ? 64 / 8 : 1);
}
. = ALIGN(64 / 8);
_end = .; PROVIDE (end = .);
. = DATA_SEGMENT_END (.);
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */
/* DWARF 1. */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions. */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2. */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2. */
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions. */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
/* DWARF 3. */
.debug_pubtypes 0 : { *(.debug_pubtypes) }
.debug_ranges 0 : { *(.debug_ranges) }
/* DWARF 5. */
.debug_addr 0 : { *(.debug_addr) }
.debug_line_str 0 : { *(.debug_line_str) }
.debug_loclists 0 : { *(.debug_loclists) }
.debug_macro 0 : { *(.debug_macro) }
.debug_names 0 : { *(.debug_names) }
.debug_rnglists 0 : { *(.debug_rnglists) }
.debug_str_offsets 0 : { *(.debug_str_offsets) }
.debug_sup 0 : { *(.debug_sup) }
.gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.comment) }
}

View File

@ -3,5 +3,6 @@
VERSION=`cat LIBCWTCH-GO.version`
echo $VERSION
curl --fail https://build.openprivacy.ca/files/libCwtch-autobindings-$VERSION/android/cwtch.aar --output android/cwtch/cwtch.aar
curl --fail https://build.openprivacy.ca/files/libCwtch-autobindings-$VERSION/linux/libCwtch.so --output linux/libCwtch.so
curl --fail https://build.openprivacy.ca/files/libCwtch-autobindings-$VERSION/android/cwtch.aar --output android/app/cwtch/cwtch.aar
# FIXME...at some point we need to support different linux architectures...for now rely on existing expectations and rename x64 lib
curl --fail https://build.openprivacy.ca/files/libCwtch-autobindings-$VERSION/linux/libCwtch.x64.so --output linux/libCwtch.so

View File

@ -1,7 +1,7 @@
#!/bin/sh
cd macos
curl https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-macos-0.4.7.8.tar.gz --output tor.tar.gz
curl https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-0.4.8.9-macos.tar.gz --output tor.tar.gz
tar -xzf tor.tar.gz
chmod a+x Tor/tor.real
cd ..

View File

@ -1,6 +1,6 @@
Invoke-WebRequest -Uri https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-win64-0.4.7.8.zip -OutFile tor.zip
Invoke-WebRequest -Uri https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-0.4.8.9-win64.zip -OutFile tor.zip
if ((Get-FileHash tor.zip -Algorithm sha512).Hash -ne '5b8f900a37f6e90d7a945b3903d769383c7478042cb43b2105d2374186e1a536f1a4758a2823d1d5be71d53a81dcfd8243293e04f82812d355983df322823cf4' ) { Write-Error 'tor.zip sha512sum mismatch' }
if ((Get-FileHash tor.zip -Algorithm sha512).Hash -ne 'a1c90d9a2f82df5f3d973e260bbfec76e413417cfa276fb70d1668214e2e607cf65be86a25e30c6f7814261dc154a02568459945f31389ae6a22e03d6d0d3c4c' ) { Write-Error 'tor.zip sha512sum mismatch' }
Expand-Archive -Path tor.zip -DestinationPath Tor

View File

@ -1,14 +1,14 @@
#!/bin/sh
cd linux
wget https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-0.4.7.8-linux-x86_64.tar.gz -O tor.tar.gz
wget https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-0.4.8.9-linux-x86_64.tar.gz -O tor.tar.gz
tar -xzf tor.tar.gz
cd ..
mkdir -p android/app/src/main/jniLibs/arm64-v8a
wget https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-0.4.7.10-arm64 -O android/app/src/main/jniLibs/arm64-v8a/libtor.so
wget https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-0.4.8.9-android-arm64 -O android/app/src/main/jniLibs/arm64-v8a/libtor.so
chmod a+x android/app/src/main/jniLibs/arm64-v8a/libtor.so
mkdir -p android/app/src/main/jniLibs/armeabi-v7a
wget https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-0.4.7.10-arm7 -O android/app/src/main/jniLibs/armeabi-v7a/libtor.so
wget https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-0.4.8.9-android-arm7 -O android/app/src/main/jniLibs/armeabi-v7a/libtor.so
chmod a+x android/app/src/main/jniLibs/armeabi-v7a/libtor.so

5
gen-nightly-index.sh Executable file
View File

@ -0,0 +1,5 @@
#!/bin/bash
# A basic script to redirect https://build.openprivacy.ca/cwtch-nightly.html to the latest nightly.
# In the future we may want to make this page nicer...
echo "<html><head><title>Cwtch Nightly</title><meta http-equiv=\"refresh\" content=\"0;URL='https://build.openprivacy.ca/files/$1'\" /> s</head></html>" > cwtch-nightly.html

View File

@ -5,15 +5,23 @@ Feature: Settings pane opens and can save settings persistently
And I tap the 'OpenSettingsView' button
And I wait until the text 'Cwtch Settings' is present
And I take a screenshot
And I wait for 5 seconds
Scenario: Change every setting (except Language)
Given I wait until the widget with type 'ProfileMgrView' is present
Given I tap the 'OpenSettingsView' button
And I wait until the text 'Use Light Themes' is present
When I tap the widget that contains the text "Use Light Themes"
And I tap the widget that contains the text "Block Unknown Contacts"
And I tap the widget that contains the text "Streamer/Presentation Mode"
And I tap the widget that contains the text "Enable Experiments"
And I expect the switch that contains the text "Streamer/Presentation Mode" to be checked
Then I expect the switch that contains the text "Use Light Themes" to be checked
When I tap the 'OpenSettingsBehaviour' button
And I wait until the text 'Notification Policy' is present
When I tap the widget that contains the text "Block Unknown Contacts"
And I expect the switch that contains the text "Block Unknown Contacts" to be checked
When I tap the 'OpenSettingsExperiments' button
And I wait until the text 'Enable Experiments' is present
When I tap the widget that contains the text "Enable Experiments"
Then I wait until the text 'Enable Group Chat' is present
And I tap the widget that contains the text "Enable Group Chat"
And I tap the widget that contains the text "Hosting Servers"
@ -23,12 +31,11 @@ Feature: Settings pane opens and can save settings persistently
And I wait until the text 'Download Folder' is present
And I fill the "DownloadFolderPicker" field with "/this/is/a/test"
And I tap the widget that contains the text "Enable Clickable Links"
Then I expect the switch that contains the text "Use Light Themes" to be checked
And I expect the switch that contains the text "Block Unknown Contacts" to be checked
And I expect the switch that contains the text "Streamer/Presentation Mode" to be checked
And I expect the switch that contains the text "Enable Experiments" to be checked
And I expect the switch that contains the text "Enable Group Chat" to be checked
And I expect the switch that contains the text "Hosting Servers" to be checked
# Not every version of Cwtch Supports Hosting Servers..
# Leaving this undeleted for future documentation / interest
# And I expect the switch that contains the text "Hosting Servers" to be checked
And I expect the switch that contains the text "File Sharing" to be checked
And I expect the switch that contains the text "Image Previews and Profile Pictures" to be checked
And I expect the "DownloadFolderPicker" to be "/this/is/a/test"
@ -39,11 +46,17 @@ Feature: Settings pane opens and can save settings persistently
Given I tap the 'OpenSettingsView' button
And I wait until the text 'Use Light Themes' is present
Then I expect the switch that contains the text "Use Light Themes" to be checked
And I expect the switch that contains the text "Block Unknown Contacts" to be checked
And I expect the switch that contains the text "Streamer/Presentation Mode" to be checked
When I tap the 'OpenSettingsBehaviour' button
And I wait until the text 'Notification Policy' is present
And I expect the switch that contains the text "Block Unknown Contacts" to be checked
And I expect the switch that contains the text "Block Unknown Contacts" to be checked
When I tap the 'OpenSettingsExperiments' button
And I wait until the text 'Enable Experiments' is present
And I wait until the text 'Enable Experiments' is present
And I expect the switch that contains the text "Enable Experiments" to be checked
And I expect the switch that contains the text "Enable Group Chat" to be checked
And I expect the switch that contains the text "Hosting Servers" to be checked
# And I expect the switch that contains the text "Hosting Servers" to be checked
And I expect the switch that contains the text "File Sharing" to be checked
And I expect the switch that contains the text "Image Previews and Profile Pictures" to be checked
And I expect the "DownloadFolderPicker" to be "/this/is/a/test"

View File

@ -1,8 +1,9 @@
Feature: Shutdown Cwtch button works correctly
Scenario: Clicking 'Shutdown Cwtch' shuts down Cwtch
Given I wait until the widget with type 'ProfileMgrView' is present
And I tap the button with tooltip 'Shutdown Cwtch'
Then I expect the text 'Shutdown Cwtch?' to be present
#Feature: Shutdown Cwtch button works correctly
# Scenario: Clicking 'Shutdown Cwtch' shuts down Cwtch
# Given I wait until the widget with type 'ProfileMgrView' is present
# And I tap the button with tooltip 'Shutdown Cwtch'
# Then I expect the text 'Shutdown Cwtch?' to be present
# And I wait for 5 seconds
#this also kills the testing framework sadly. will have to find a workaround
#And I tap the button that contains the text 'Shutdown Cwtch'
#Then I wait until the widget with type 'ProfileMgrView' is absent

View File

@ -2,7 +2,6 @@ Feature: Tor initializes correctly
Scenario: Check the Tor version
Given I wait until the widget with type 'ProfileMgrView' is present
And I tap the icon with type "TorIcon"
Then I expect the Tor version to be present
And I expect the string 'Online' to be present within 120 seconds
Scenario: Reset Tor

View File

@ -1,12 +1,14 @@
@env:clean
Feature: Splash screen displays and then closes
Scenario: splash screen appears
Then I expect the widget 'SplashView' to be present within 10 seconds
Then I expect the widget 'ProfileManagerView' to be present within 10 seconds
# first-run of cwtch creates expected files and folders
Then I expect the folder 'integration_test/env/temp' to exist
And I expect the folder 'integration_test/env/temp/dev' to exist
And I expect the file 'integration_test/env/temp/dev/SALT' to exist
Then I wait for the file 'integration_test/env/temp/dev/ui.globals' to exist
And I expect the file 'integration_test/env/temp/dev/ui.globals' to exist
And I expect the folder 'integration_test/env/temp/dev/tor' to exist
And I expect the file 'integration_test/env/temp/dev/tor/torrc' to exist
And I expect the file 'integration_test/env/temp/dev/tor/torrc' to exist
And I wait for 5 seconds

View File

@ -3,6 +3,8 @@ Feature: Block unknown contacts setting
Scenario: Carol adds Alice but Alice doesn't see it because Block Unknowns is enabled
Given I wait until the widget with type 'ProfileMgrView' is present
Given I tap the 'OpenSettingsView' button
And I wait until the text "Behaviour" is present
When I tap the 'OpenSettingsBehaviour button
And I wait until the text "Block Unknown Contacts" is present
When I tap the widget that contains the text "Block Unknown Contacts"
Then I expect the switch that contains the text "Block Unknown Contacts" to be checked

View File

@ -32,6 +32,9 @@ Feature: Basic Profile Management
Scenario: Load Unencrypted Profile
Given I wait until the widget with type 'ProfileMgrView' is present
Then I expect a "ProfileRow" widget with text "Alice (Unencrypted)"
# This test is too short...if the test finishes before flutter has finished initializing then
# the framework gets very confused...
And I wait for 2 seconds
Scenario: Create Encrypted Profile
Given I wait until the widget with type 'ProfileMgrView' is present
@ -71,7 +74,7 @@ Feature: Basic Profile Management
When I tap the "IconButton" widget with tooltip "Edit Profile Alice (Encrypted)"
Then I expect the text 'Display Name' to be present
Then I fill the "displayNameFormElement" field with "Carol (Encrypted)"
And I tap the "button" widget with label "Save Profile"
And I tap the widget that contains the text "Save Profile"
And I wait until the widget with type 'ProfileMgrView' is present
Then I expect a "ProfileRow" widget with text "Carol (Encrypted)"
@ -87,7 +90,7 @@ Feature: Basic Profile Management
When I tap the "IconButton" widget with tooltip "Edit Profile Carol (Encrypted)"
Then I expect the text 'Display Name' to be present
Then I fill the "currentPasswordFormElement" field with "password1"
When I tap the button that contains the text "Delete"
And I tap the widget that contains the text "Delete"
Then I wait for 2 seconds
When I tap the "button" widget with label "Really Delete Profile"
And I wait until the widget with type 'ProfileMgrView' is present

View File

@ -56,6 +56,7 @@ void main() async {
// files
FolderExists(),
FileExists(),
WaitFileExists(),
];
var sb = StringBuffer();

View File

@ -1,17 +1,8 @@
import 'package:cwtch/main.dart';
import 'package:cwtch/widgets/messagebubble.dart';
import 'package:cwtch/widgets/profilerow.dart';
import 'package:cwtch/widgets/quotedmessage.dart';
import 'package:cwtch/widgets/tor_icon.dart';
import 'package:cwtch/views/profilemgrview.dart';
import 'package:flutter_gherkin/flutter_gherkin.dart';
import 'package:flutter_gherkin/src/flutter/parameters/existence_parameter.dart';
import 'package:flutter_gherkin/src/flutter/parameters/swipe_direction_parameter.dart';
import 'package:gherkin/gherkin.dart';
import 'package:flutter/material.dart';
import 'overrides.dart';
StepDefinitionGeneric ExpectReply() {
return given3<String, String, int, FlutterWorld>(

View File

@ -19,3 +19,16 @@ StepDefinitionGeneric FileExists() {
},
);
}
StepDefinitionGeneric WaitFileExists() {
return then1<String, FlutterWorld>(
RegExp(r'I wait for the file {string} to exist'),
(input1, context) async {
await context.world.appDriver.waitUntil(
() async {
await context.world.appDriver.waitForAppToSettle();
return File(input1).existsSync();
});
},
);
}

View File

@ -1,10 +1,7 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_driver/flutter_driver.dart';
import 'package:flutter_gherkin/flutter_gherkin.dart';
import 'package:gherkin/gherkin.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
enum SwitchState { checked, unchecked }
@ -17,6 +14,7 @@ class SwitchStateParameter extends CustomParameter<SwitchState> {
case "unchecked":
return SwitchState.unchecked;
}
return null;
});
}

View File

@ -33,7 +33,6 @@ StepDefinitionGeneric TorVersionPresent() {
break;
}
}
print('File is now closed.');
} catch (e) {
print('Error: $e');
}
@ -41,15 +40,18 @@ StepDefinitionGeneric TorVersionPresent() {
context.expect(versionString, "#.#.#", reason: "error reading version string from fetch-tor.sh");
return;
}
context.world.attach(versionString, "text/plain", "Then I expect the Tor version to be present");
context.world.attach(versionString.substring(0, 4), "text/plain", "Then I expect the Tor version to be present");
//context.reporter.message("test!!!", MessageLevel.info);
print("looking for version string $versionString");
final finder = context.world.appDriver.findBy(
versionString,
FindType.text,
);
final isP = await context.world.appDriver.isPresent(finder);
context.expect(isP, true);
return await context.world.appDriver.waitUntil(() async {
context.world.appDriver.waitForAppToSettle();
final finder = context.world.appDriver.findBy(
versionString.substring(0, 4),
FindType.text,
);
return await context.world.appDriver.isPresent(finder);
});
},
);
}

View File

@ -19,3 +19,4 @@ StepDefinitionGeneric TakeScreenshot() {
},
);
}

View File

@ -1 +1,2 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"

View File

@ -1 +1,2 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"

View File

@ -1,16 +1,19 @@
import 'package:cwtch/themes/opaque.dart';
import 'package:cwtch/third_party/linkify/linkify.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher_string.dart';
import '../settings.dart';
void modalOpenLink(BuildContext ctx, LinkableElement link) {
showModalBottomSheet<void>(
context: ctx,
builder: (BuildContext bcontext) {
return Container(
height: 200, // bespoke value courtesy of the [TextField] docs
height: 200,
child: Center(
child: Padding(
padding: EdgeInsets.all(30.0),
@ -18,17 +21,24 @@ void modalOpenLink(BuildContext ctx, LinkableElement link) {
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text(AppLocalizations.of(bcontext)!.clickableLinksWarning),
Text(
AppLocalizations.of(bcontext)!.clickableLinksWarning,
style: Provider.of<Settings>(bcontext).scaleFonts(defaultTextStyle),
),
Flex(direction: Axis.horizontal, mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
Container(
margin: EdgeInsets.symmetric(vertical: 20, horizontal: 10),
child: ElevatedButton(
child: Text(AppLocalizations.of(bcontext)!.clickableLinksCopy, semanticsLabel: AppLocalizations.of(bcontext)!.clickableLinksCopy),
child: Text(AppLocalizations.of(bcontext)!.clickableLinksCopy,
style: Provider.of<Settings>(bcontext).scaleFonts(defaultTextButtonStyle), semanticsLabel: AppLocalizations.of(bcontext)!.clickableLinksCopy),
onPressed: () {
Clipboard.setData(new ClipboardData(text: link.url));
final snackBar = SnackBar(
content: Text(AppLocalizations.of(bcontext)!.copiedToClipboardNotification),
content: Text(
AppLocalizations.of(bcontext)!.copiedToClipboardNotification,
style: Provider.of<Settings>(bcontext, listen: false).scaleFonts(defaultTextButtonStyle),
),
);
Navigator.pop(bcontext);
@ -39,15 +49,14 @@ void modalOpenLink(BuildContext ctx, LinkableElement link) {
Container(
margin: EdgeInsets.symmetric(vertical: 20, horizontal: 10),
child: ElevatedButton(
child: Text(AppLocalizations.of(bcontext)!.clickableLinkOpen, semanticsLabel: AppLocalizations.of(bcontext)!.clickableLinkOpen),
child: Text(AppLocalizations.of(bcontext)!.clickableLinkOpen,
style: Provider.of<Settings>(bcontext).scaleFonts(defaultTextButtonStyle), semanticsLabel: AppLocalizations.of(bcontext)!.clickableLinkOpen),
onPressed: () async {
if (await canLaunch(link.url)) {
await launch(link.url);
if (await canLaunchUrlString(link.url)) {
await launchUrlString(link.url);
Navigator.pop(bcontext);
} else {
final snackBar = SnackBar(
content: Text(AppLocalizations.of(bcontext)!.clickableLinkError),
);
final snackBar = SnackBar(content: Text(AppLocalizations.of(bcontext)!.clickableLinkError, style: Provider.of<Settings>(bcontext).scaleFonts(defaultTextButtonStyle)));
ScaffoldMessenger.of(bcontext).showSnackBar(snackBar);
}
},

View File

@ -1,14 +1,20 @@
// To handle profiles that are "unencrypted" (i.e don't require a password to open) we currently create a profile with a defacto, hardcoded password.
// Details: https://docs.openprivacy.ca/cwtch-security-handbook/profile_encryption_and_storage.html
import 'dart:collection';
const DefaultPassword = "be gay do crime";
const LastMessageSeenTimeKey = "profile.lastMessageSeenTime";
abstract class Cwtch {
Future<HashMap<String, String>> PlatformChannelInfo();
// ignore: non_constant_identifier_names
Future<void> Start();
// ignore: non_constant_identifier_names
Future<void> ReconnectCwtchForeground();
Future<String> getCwtchDir();
String getAssetsDir();
// ignore: non_constant_identifier_names
void CreateProfile(String nick, String pass, bool autostart);
@ -41,6 +47,11 @@ abstract class Cwtch {
// ignore: non_constant_identifier_names
void UnblockContact(String profileOnion, int contactHandle);
void AttemptReconnection(String profileOnion, String onion);
void AttemptReconnectionServer(String profileOnion, String onion);
void DisconnectFromPeer(String profileOnion, String onion);
void DisconnectFromServer(String profileOnion, String onion);
// ignore: non_constant_identifier_names
Future<dynamic> GetMessage(String profile, int handle, int index);
@ -95,9 +106,12 @@ abstract class Cwtch {
Future<dynamic> ImportBundle(String profile, String bundle);
// ignore: non_constant_identifier_names
void SetProfileAttribute(String profile, String key, String val);
Future<String?> GetProfileAttribute(String profile, String key);
// ignore: non_constant_identifier_names
void SetConversationAttribute(String profile, int conversation, String key, String val);
// ignore: non_constant_identifier_names
Future<String?> GetConversationAttribute(String profile, int identifier, String s);
// ignore: non_constant_identifier_names
void SetMessageAttribute(String profile, int conversation, int channel, int message, String key, String val);
// ignore: non_constant_identifier_names
void LoadServers(String password);
@ -138,4 +152,12 @@ abstract class Cwtch {
Future<String> TranslateMessage(String profile, int conversation, int message, String language);
bool IsBlodeuweddSupported();
// ignore: non_constant_identifier_names
Future<String> SearchConversations(String profile, String pattern);
void DeleteServerInfo(String profile, String handle);
void PublishServerUpdate(String onion);
Future<void> ConfigureConnections(String onion, bool listen, bool peers, bool servers);
bool IsLoaded();
}

View File

@ -1,16 +1,12 @@
import 'dart:convert';
import 'package:cwtch/cwtch/cwtch.dart';
import 'package:cwtch/main.dart';
import 'package:cwtch/models/appstate.dart';
import 'package:cwtch/models/contact.dart';
import 'package:cwtch/models/message.dart';
import 'package:cwtch/models/profilelist.dart';
import 'package:cwtch/models/profileservers.dart';
import 'package:cwtch/models/remoteserver.dart';
import 'package:cwtch/models/servers.dart';
import 'package:cwtch/notification_manager.dart';
import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
import 'package:provider/provider.dart';
import 'package:cwtch/torstatus.dart';
@ -30,14 +26,15 @@ class CwtchNotifier {
late NotificationsManager notificationManager;
late AppState appState;
late ServerListState serverListState;
late FlwtchState flwtchState;
String? notificationSimple;
String? notificationConversationInfo;
SeenMessageCallback? seenMessageCallback;
CwtchNotifier(
ProfileListState pcn, Settings settingsCN, ErrorHandler errorCN, TorStatus torStatusCN, NotificationsManager notificationManagerP, AppState appStateCN, ServerListState serverListStateCN) {
CwtchNotifier(ProfileListState pcn, Settings settingsCN, ErrorHandler errorCN, TorStatus torStatusCN, NotificationsManager notificationManagerP, AppState appStateCN,
ServerListState serverListStateCN, FlwtchState flwtchStateCN) {
profileCN = pcn;
settings = settingsCN;
error = errorCN;
@ -45,6 +42,7 @@ class CwtchNotifier {
notificationManager = notificationManagerP;
appState = appStateCN;
serverListState = serverListStateCN;
flwtchState = flwtchStateCN;
}
void l10nInit(String notificationSimple, String notificationConversationInfo) {
@ -57,23 +55,53 @@ class CwtchNotifier {
}
void handleMessage(String type, dynamic data) {
//EnvironmentConfig.debugLog("NewEvent $type $data");
// EnvironmentConfig.debugLog("NewEvent $type $data");
switch (type) {
case "CwtchStarted":
if (data["Reload"] == "true" && profileCN.num > 0) {
// don't reload...
// unless we have loaded no profiles...then there isnt a risk and this
// might be a first time (e.g. new apk, existing service)
} else {
flwtchState.cwtch.LoadProfiles(DefaultPassword);
}
appState.SetCwtchInit();
break;
case "CwtchStartError":
appState.SetAppError(data["Error"]);
break;
case "NewPeer":
// empty events can be caused by the testing framework
if (data["Online"] == null) {
break;
}
// EnvironmentConfig.debugLog("NewPeer $data");
// if tag != v1-defaultPassword then it is either encrypted OR it is an unencrypted account created during pre-beta...
profileCN.add(data["Identity"], data["name"], data["picture"], data["defaultPicture"], data["ContactsJson"], data["ServerList"], data["Online"] == "true", data["autostart"] == "true",
data["tag"] != "v1-defaultPassword");
profileCN.add(
data["Identity"],
data["name"],
data["picture"],
data["defaultPicture"],
data["ContactsJson"],
data["ServerList"],
data["Online"] == "true",
data["autostart"] == "true",
data["tag"] != "v1-defaultPassword",
data["appearOffline"] == "true",
);
// Update Profile Attributes
EnvironmentConfig.debugLog("Looking up Profile Attributes ${data["Identity"]} ${profileCN.getProfile(data["Identity"])}");
flwtchState.cwtch.GetProfileAttribute(data["Identity"], "profile.profile-attribute-1").then((value) => profileCN.getProfile(data["Identity"])?.setAttribute(0, value));
flwtchState.cwtch.GetProfileAttribute(data["Identity"], "profile.profile-attribute-2").then((value) => profileCN.getProfile(data["Identity"])?.setAttribute(1, value));
flwtchState.cwtch.GetProfileAttribute(data["Identity"], "profile.profile-attribute-3").then((value) => profileCN.getProfile(data["Identity"])?.setAttribute(2, value));
flwtchState.cwtch.GetProfileAttribute(data["Identity"], "profile.profile-status").then((value) => profileCN.getProfile(data["Identity"])?.setAvailabilityStatus(value ?? ""));
EnvironmentConfig.debugLog("Looking up Profile Information for Contact...");
profileCN.getProfile(data["Identity"])?.contactList.contacts.forEach((contact) {
flwtchState.cwtch.GetConversationAttribute(data["Identity"], contact.identifier, "public.profile.profile-attribute-1").then((value) => contact.setAttribute(0, value));
flwtchState.cwtch.GetConversationAttribute(data["Identity"], contact.identifier, "public.profile.profile-attribute-2").then((value) => contact.setAttribute(1, value));
flwtchState.cwtch.GetConversationAttribute(data["Identity"], contact.identifier, "public.profile.profile-attribute-3").then((value) => contact.setAttribute(2, value));
flwtchState.cwtch.GetConversationAttribute(data["Identity"], contact.identifier, "public.profile.profile-status").then((value) => contact.setAvailabilityStatus(value ?? ""));
});
break;
case "ContactCreated":
EnvironmentConfig.debugLog("ContactCreated $data");
@ -132,7 +160,7 @@ class CwtchNotifier {
lastMessageTime: DateTime.now(),
notificationPolicy: data["notificationPolicy"] ?? "ConversationNotificationPolicy.Default"));
profileCN.getProfile(data["ProfileOnion"])?.contactList.updateLastMessageTime(int.parse(data["ConversationID"]), DateTime.now());
profileCN.getProfile(data["ProfileOnion"])?.contactList.updateLastMessageReceivedTime(int.parse(data["ConversationID"]), DateTime.now());
}
break;
case "PeerDeleted":
@ -147,10 +175,8 @@ class CwtchNotifier {
}
break;
case "DeleteContact":
profileCN.getProfile(data["ProfileOnion"])?.contactList.removeContact(data["ConversationID"]);
break;
case "DeleteGroup":
profileCN.getProfile(data["ProfileOnion"])?.contactList.removeContact(data["ConversationID"]);
var identifier = int.parse(data["ConversationID"]);
profileCN.getProfile(data["ProfileOnion"])?.contactList.removeContact(identifier);
break;
case "PeerStateChange":
ContactInfoState? contact = profileCN.getProfile(data["ProfileOnion"])?.contactList.findContact(data["RemotePeer"]);
@ -169,21 +195,9 @@ class CwtchNotifier {
var senderImage = data['picture'];
var isAuto = data['Auto'] == "true";
String contenthash = data['ContentHash'];
var selectedProfile = appState.selectedProfile == data["ProfileOnion"];
var selectedConversation = selectedProfile && appState.selectedConversation == identifier;
var notification = data["notification"];
if (selectedConversation && seenMessageCallback != null) {
seenMessageCallback!(data["ProfileOnion"]!, identifier, DateTime.now().toUtc());
}
if (notification == "SimpleEvent") {
notificationManager.notify(notificationSimple ?? "New Message", "", 0);
} else if (notification == "ContactInfo") {
var contact = profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(identifier);
notificationManager.notify((notificationConversationInfo ?? "New Message from %1").replaceFirst("%1", (contact?.nickname ?? senderHandle.toString())), data["ProfileOnion"], identifier);
}
profileCN.getProfile(data["ProfileOnion"])?.newMessage(
identifier,
messageID,
@ -196,6 +210,19 @@ class CwtchNotifier {
selectedProfile,
selectedConversation,
);
// Now perform the notification logic...
var notification = data["notification"];
if (selectedConversation && seenMessageCallback != null) {
seenMessageCallback!(data["ProfileOnion"]!, identifier, DateTime.now().toUtc());
}
if (notification == "SimpleEvent") {
notificationManager.notify(notificationSimple ?? "New Message", "", 0);
} else if (notification == "ContactInfo") {
var contact = profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(identifier);
notificationManager.notify((notificationConversationInfo ?? "New Message from %1").replaceFirst("%1", (contact?.nickname ?? senderHandle.toString())), data["ProfileOnion"], identifier);
}
appState.notifyProfileUnread();
break;
case "PeerAcknowledgement":
@ -230,7 +257,7 @@ class CwtchNotifier {
var notification = data["notification"];
// Only bother to do anything if we know about the group and the provided index is greater than our current total...
if (currentTotal != null && idx >= currentTotal) {
if (idx >= currentTotal) {
// TODO: There are 2 timestamps associated with a new group message - time sent and time received.
// Sent refers to the time a profile alleges they sent a message
// Received refers to the time we actually saw the message from the server
@ -278,6 +305,7 @@ class CwtchNotifier {
break;
case "UpdateGlobalSettings":
settings.handleUpdate(jsonDecode(data["Data"]));
appState.settingsLoaded = true;
break;
case "UpdatedProfileAttribute":
if (data["Key"] == "public.profile.name") {
@ -291,6 +319,10 @@ class CwtchNotifier {
profileCN.getProfile(data["ProfileOnion"])?.downloadSetPathForSender(filekey, data["Data"]);
}
}
} else if (data["Key"].toString().startsWith("public.profile.profile-attribute")) {
// ignore these events...
} else if (data["Key"].toString().startsWith("public.profile.profile-status")) {
profileCN.getProfile(data["ProfileOnion"])?.setAvailabilityStatus(data["Data"]);
} else {
EnvironmentConfig.debugLog("unhandled set attribute event: ${data['Key']}");
}
@ -308,6 +340,7 @@ class CwtchNotifier {
torStatus.updateVersion(data["Data"]);
break;
case "UpdateServerInfo":
EnvironmentConfig.debugLog("NewEvent UpdateServerInfo $type $data");
profileCN.getProfile(data["ProfileOnion"])?.replaceServers(data["ServerList"]);
break;
case "TokenManagerInfo":
@ -317,7 +350,7 @@ class CwtchNotifier {
associatedGroups.forEach((identifier) {
profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(int.parse(identifier.toString()))!.antispamTickets = count;
});
EnvironmentConfig.debugLog("update server token count for ${associatedGroups}, $count");
EnvironmentConfig.debugLog("update server token count for $associatedGroups, $count");
} catch (e) {
// No tokens in data...
}
@ -346,8 +379,13 @@ class CwtchNotifier {
status: status,
isGroup: true,
lastMessageTime: DateTime.now()));
profileCN.getProfile(data["ProfileOnion"])?.contactList.updateLastMessageTime(identifier, DateTime.fromMillisecondsSinceEpoch(0));
profileCN.getProfile(data["ProfileOnion"])?.contactList.updateLastMessageReceivedTime(identifier, DateTime.fromMillisecondsSinceEpoch(0));
}
// request a new server update...
// NOTE: In the future this should also update the TokenManagerInfo
// This is not currently communicated by ServerUpdateInfo (but it probably should be)git
flwtchState.cwtch.PublishServerUpdate(data["ProfileOnion"]);
}
break;
case "ServerStateChange":
@ -360,8 +398,8 @@ class CwtchNotifier {
});
profileCN.getProfile(data["ProfileOnion"])?.contactList.resort();
break;
case "NewRetValMessageFromPeer":
if (data["Path"] == "profile.name" && data["Exists"] == "true") {
case "UpdatedConversationAttribute":
if (data["Path"] == "profile.name") {
if (data["Data"].toString().trim().length > 0) {
// Update locally on the UI...
if (profileCN.getProfile(data["ProfileOnion"])?.contactList.findContact(data["RemotePeer"]) != null) {
@ -369,14 +407,33 @@ class CwtchNotifier {
}
}
} else if (data['Path'] == "profile.custom-profile-image") {
if (data["Exists"] == "true") {
EnvironmentConfig.debugLog("received ret val of custom profile image: $data");
String fileKey = data['Data'];
var contact = profileCN.getProfile(data["ProfileOnion"])?.contactList.findContact(data["RemotePeer"]);
if (contact != null) {
profileCN.getProfile(data["ProfileOnion"])?.waitForDownloadComplete(contact.identifier, fileKey);
EnvironmentConfig.debugLog("received ret val of custom profile image: $data");
String fileKey = data['Data'];
var contact = profileCN.getProfile(data["ProfileOnion"])?.contactList.findContact(data["RemotePeer"]);
if (contact != null) {
EnvironmentConfig.debugLog("waiting for download from $contact");
profileCN.getProfile(data["ProfileOnion"])?.waitForDownloadComplete(contact.identifier, fileKey);
}
} else if (data['Path'] == "profile.profile-attribute-1" || data['Path'] == "profile.profile-attribute-2" || data['Path'] == "profile.profile-attribute-3") {
var contact = profileCN.getProfile(data["ProfileOnion"])?.contactList.findContact(data["RemotePeer"]);
if (contact != null) {
switch (data['Path']) {
case "profile.profile-attribute-1":
contact.setAttribute(0, data["Data"]);
break;
case "profile.profile-attribute-2":
contact.setAttribute(1, data["Data"]);
break;
case "profile.profile-attribute-3":
contact.setAttribute(2, data["Data"]);
break;
}
}
} else if (data['Path'] == "profile.profile-status") {
var contact = profileCN.getProfile(data["ProfileOnion"])?.contactList.findContact(data["RemotePeer"]);
if (contact != null) {
contact.setAvailabilityStatus(data['Data']);
}
} else {
EnvironmentConfig.debugLog("unhandled ret val event: ${data['Path']}");
}
@ -425,6 +482,12 @@ class CwtchNotifier {
profileCN.getProfile(data["ProfileOnion"])?.contactList.findContact(handle)?.acnCircuit = data["Data"];
}
break;
case "SearchResult":
String searchID = data["SearchID"];
var conversationIdentifier = int.parse(data["ConversationID"]);
var messageIndex = int.parse(data["RowIndex"]);
profileCN.getProfile(data["ProfileOnion"])?.handleSearchResult(searchID, conversationIdentifier, messageIndex);
break;
default:
EnvironmentConfig.debugLog("unhandled event: $type");
}

View File

@ -1,8 +1,8 @@
import 'dart:collection';
import 'dart:convert';
import 'dart:ffi';
import 'dart:io';
import 'dart:isolate';
import 'dart:io' show Platform;
import 'package:cwtch/cwtch/cwtchNotifier.dart';
import 'package:path/path.dart' as path;
@ -12,7 +12,6 @@ import 'package:cwtch/cwtch/cwtch.dart';
import '../config.dart';
import "package:path/path.dart" show dirname, join;
import 'dart:io' show Platform;
/////////////////////
/// Cwtch API ///
@ -44,6 +43,9 @@ typedef VoidFromStringIntStringStringStringFn = void Function(Pointer<Utf8>, int
typedef void_from_string_string_int_int_function = Void Function(Pointer<Utf8>, Int32, Pointer<Utf8>, Int32, Int64, Int64);
typedef VoidFromStringStringIntIntFn = void Function(Pointer<Utf8>, int, Pointer<Utf8>, int, int, int);
typedef void_from_string_bool_bool_bool = Void Function(Pointer<Utf8>, Int32, Bool, Bool, Bool);
typedef VoidFromStringBoolBoolBool = void Function(Pointer<Utf8>, int, bool, bool, bool);
typedef void_from_string_string_byte_function = Void Function(Pointer<Utf8>, Int32, Pointer<Utf8>, Int32, Int8);
typedef VoidFromStringStringByteFn = void Function(Pointer<Utf8>, int, Pointer<Utf8>, int, int);
@ -72,6 +74,9 @@ typedef GetJsonBlobFromStrStrIntFn = Pointer<Utf8> Function(Pointer<Utf8>, int,
typedef get_json_blob_from_str_int_function = Pointer<Utf8> Function(Pointer<Utf8>, Int32, Int32);
typedef GetJsonBlobFromStrIntFn = Pointer<Utf8> Function(Pointer<Utf8>, int, int);
typedef get_json_blob_from_str_str_function = Pointer<Utf8> Function(Pointer<Utf8>, Int32, Pointer<Utf8>, Int32);
typedef GetJsonBlobFromStrStrFn = Pointer<Utf8> Function(Pointer<Utf8>, int, Pointer<Utf8>, int);
typedef get_json_blob_from_str_int_int_str_function = Pointer<Utf8> Function(Pointer<Utf8>, Int32, Int32, Int32, Pointer<Utf8>, Int32);
typedef GetJsonBlobFromStrIntIntStrFn = Pointer<Utf8> Function(
Pointer<Utf8>,
@ -127,6 +132,8 @@ class CwtchFfi implements Cwtch {
late Isolate cwtchIsolate;
ReceivePort _receivePort = ReceivePort();
bool _isL10nInit = false;
String _assetsDir = path.join(Directory.current.path, "data", "flutter_assets");
String _cwtchDir = "";
static String getLibraryPath() {
if (Platform.isWindows) {
@ -161,13 +168,12 @@ class CwtchFfi implements Cwtch {
String home = "";
String bundledTor = "";
Map<String, String> envVars = Platform.environment;
String cwtchDir = "";
if (Platform.isLinux) {
home = envVars['HOME'] ?? "";
if (EnvironmentConfig.TEST_MODE) {
cwtchDir = envVars['CWTCH_HOME']!;
_cwtchDir = envVars['CWTCH_HOME']!;
} else {
cwtchDir = envVars['CWTCH_HOME'] ?? path.join(envVars['HOME']!, ".cwtch");
_cwtchDir = envVars['CWTCH_HOME'] ?? path.join(envVars['HOME']!, ".cwtch");
}
if (await File("linux/Tor/tor").exists()) {
@ -176,38 +182,44 @@ class CwtchFfi implements Cwtch {
bundledTor = "lib/Tor/tor";
} else if (await File(path.join(home, ".local/lib/cwtch/Tor/tor")).exists()) {
bundledTor = path.join(home, ".local/lib/cwtch/Tor/tor");
_assetsDir = path.join(home, ".local", "share", "cwtch", "data", "flutter_assets");
} else if (await File("/usr/lib/cwtch/Tor/tor").exists()) {
bundledTor = "/usr/lib/cwtch/Tor/tor";
_assetsDir = path.join("usr", "share", "cwtch", "data", "flutter_assets");
} else {
bundledTor = "tor";
}
} else if (Platform.isWindows) {
cwtchDir = envVars['CWTCH_DIR'] ?? path.join(envVars['UserProfile']!, ".cwtch");
_cwtchDir = envVars['CWTCH_DIR'] ?? path.join(envVars['UserProfile']!, ".cwtch");
String currentTor = path.join(Directory.current.absolute.path, "Tor\\Tor\\tor.exe");
if (await File(currentTor).exists()) {
bundledTor = currentTor;
_assetsDir = path.join(Directory.current.absolute.path, "data", "flutter_assets");
} else {
String exeDir = path.dirname(Platform.resolvedExecutable);
bundledTor = path.join(exeDir, "Tor\\Tor\\tor.exe");
_assetsDir = path.join(exeDir, "data", "flutter_assets");
}
} else if (Platform.isMacOS) {
cwtchDir = envVars['CWTCH_HOME'] ?? path.join(envVars['HOME']!, "Library/Application Support/Cwtch");
if (await File("Cwtch.app/Contents/MacOS/Tor/tor.real").exists()) {
bundledTor = "Cwtch.app/Contents/MacOS/Tor/tor.real";
} else if (await File("/Applications/Cwtch.app/Contents/MacOS/Tor/tor.real").exists()) {
bundledTor = "/Applications/Cwtch.app/Contents/MacOS/Tor/tor.real";
} else if (await File("/Volumes/Cwtch/Cwtch.app/Contents/MacOS/Tor/tor.real").exists()) {
bundledTor = "/Volumes/Cwtch/Cwtch.app/Contents/MacOS/Tor/tor.real";
} else if (await File("/Applications/Tor Browser.app/Contents/MacOS/Tor/tor.real").exists()) {
bundledTor = "/Applications/Tor Browser.app/Contents/MacOS/Tor/tor.real";
_cwtchDir = envVars['CWTCH_HOME'] ?? path.join(envVars['HOME']!, "Library/Application Support/Cwtch");
_assetsDir = "/Applications/Cwtch.app/Contents/Frameworks/App.framework/Versions/Current/Resources/flutter_assets/";
if (await File("Cwtch.app/Contents/MacOS/Tor/tor").exists()) {
bundledTor = "Cwtch.app/Contents/MacOS/Tor/tor";
_assetsDir = "Cwtch.app/Contents/Frameworks/App.framework/Versions/Current/Resources/flutter_assets/";
} else if (await File("/Applications/Cwtch.app/Contents/MacOS/Tor/tor").exists()) {
bundledTor = "/Applications/Cwtch.app/Contents/MacOS/Tor/tor";
} else if (await File("/Volumes/Cwtch/Cwtch.app/Contents/MacOS/Tor/tor").exists()) {
bundledTor = "/Volumes/Cwtch/Cwtch.app/Contents/MacOS/Tor/tor";
} else if (await File("/Applications/Tor Browser.app/Contents/MacOS/Tor/tor").exists()) {
bundledTor = "/Applications/Tor Browser.app/Contents/MacOS/Tor/tor";
print("We couldn't find Tor in the Cwtch app directory, however we can fall back to the Tor Browser binary");
} else {
var splitPath = path.split(dirname(Platform.script.path));
if (splitPath[0] == "/" && splitPath[1] == "Applications") {
var appName = splitPath[2];
print("We're running in /Applications in a non standard app name: $appName");
if (await File("/Applications/$appName/Contents/MacOS/Tor/tor.real").exists()) {
bundledTor = "/Applications/$appName/Contents/MacOS/Tor/tor.real";
if (await File("/Applications/$appName/Contents/MacOS/Tor/tor").exists()) {
bundledTor = "/Applications/$appName/Contents/MacOS/Tor/tor";
}
}
}
@ -218,27 +230,27 @@ class CwtchFfi implements Cwtch {
// if macOs and release build and no profile and is dev profile
// copy dev profile to release profile
if (Platform.isMacOS && EnvironmentConfig.BUILD_VER != dev_version) {
var devProfileExists = await Directory(path.join(cwtchDir, "dev", "profiles")).exists();
var releaseProfileExists = await Directory(path.join(cwtchDir, "profiles")).exists();
var devProfileExists = await Directory(path.join(_cwtchDir, "dev", "profiles")).exists();
var releaseProfileExists = await Directory(path.join(_cwtchDir, "profiles")).exists();
if (devProfileExists && !releaseProfileExists) {
print("MacOS one time dev -> release profile migration...");
await Process.run("cp", ["-r", "-p", path.join(cwtchDir, "dev", "profiles"), cwtchDir]);
await Process.run("cp", ["-r", "-p", path.join(cwtchDir, "dev", "SALT"), cwtchDir]);
await Process.run("cp", ["-r", "-p", path.join(cwtchDir, "dev", "ui.globals"), cwtchDir]);
await Process.run("cp", ["-r", "-p", path.join(_cwtchDir, "dev", "profiles"), _cwtchDir]);
await Process.run("cp", ["-r", "-p", path.join(_cwtchDir, "dev", "SALT"), _cwtchDir]);
await Process.run("cp", ["-r", "-p", path.join(_cwtchDir, "dev", "ui.globals"), _cwtchDir]);
}
}
if (EnvironmentConfig.BUILD_VER == dev_version) {
cwtchDir = path.join(cwtchDir, "dev");
_cwtchDir = path.join(_cwtchDir, "dev");
}
print("StartCwtch( cwtchdir: $cwtchDir, torPath: $bundledTor )");
print("StartCwtch( cwtchdir: $_cwtchDir, torPath: $bundledTor )");
var startCwtchC = library.lookup<NativeFunction<start_cwtch_function>>("c_StartCwtch");
// ignore: non_constant_identifier_names
final StartCwtch = startCwtchC.asFunction<StartCwtchFn>();
final utf8CwtchDir = cwtchDir.toNativeUtf8();
final utf8CwtchDir = _cwtchDir.toNativeUtf8();
StartCwtch(utf8CwtchDir, utf8CwtchDir.length, bundledTor.toNativeUtf8(), bundledTor.length);
malloc.free(utf8CwtchDir);
@ -250,17 +262,19 @@ class CwtchFfi implements Cwtch {
});
}
// ignore: non_constant_identifier_names
Future<void> ReconnectCwtchForeground() async {
var reconnectCwtch = library.lookup<NativeFunction<Void Function()>>("c_ReconnectCwtchForeground");
// ignore: non_constant_identifier_names
final ReconnectCwtchForeground = reconnectCwtch.asFunction<void Function()>();
ReconnectCwtchForeground();
String getAssetsDir() {
return _assetsDir;
}
Future<String> getCwtchDir() async {
return _cwtchDir;
}
// Called on object being disposed to (presumably on app close) to close the isolate that's listening to libcwtch-go events
@override
void dispose() {
EnvironmentConfig.debugLog("tearing down cwtch FFI isolate");
library.close();
cwtchIsolate.kill(priority: Isolate.immediate);
}
@ -386,7 +400,7 @@ class CwtchFfi implements Cwtch {
@override
// ignore: non_constant_identifier_names
void BlockContact(String profileOnion, int contactHandle) {
var blockContact = library.lookup<NativeFunction<string_int_to_void_function>>("c_BlockContact");
var blockContact = library.lookup<NativeFunction<string_int_to_void_function>>("c_BlockConversation");
// ignore: non_constant_identifier_names
final BlockContact = blockContact.asFunction<VoidFromStringIntFn>();
final u1 = profileOnion.toNativeUtf8();
@ -397,7 +411,7 @@ class CwtchFfi implements Cwtch {
@override
// ignore: non_constant_identifier_names
void UnblockContact(String profileOnion, int contactHandle) {
var unblockContact = library.lookup<NativeFunction<string_int_to_void_function>>("c_UnblockContact");
var unblockContact = library.lookup<NativeFunction<string_int_to_void_function>>("c_UnblockConversation");
// ignore: non_constant_identifier_names
final UnblockContact = unblockContact.asFunction<VoidFromStringIntFn>();
final u1 = profileOnion.toNativeUtf8();
@ -495,7 +509,7 @@ class CwtchFfi implements Cwtch {
@override
// ignore: non_constant_identifier_names
void VerifyOrResumeDownload(String profileOnion, int contactHandle, String filekey) {
var fn = library.lookup<NativeFunction<void_from_string_int_string_function>>("c_VerifyOrResumeDownload");
var fn = library.lookup<NativeFunction<void_from_string_int_string_function>>("c_VerifyOrResumeDownloadDefaultLimit");
// ignore: non_constant_identifier_names
final VerifyOrResumeDownload = fn.asFunction<VoidFromStringIntStringFn>();
final u1 = profileOnion.toNativeUtf8();
@ -560,7 +574,7 @@ class CwtchFfi implements Cwtch {
@override
// ignore: non_constant_identifier_names
void DeleteContact(String profileOnion, int handle) {
var deleteContact = library.lookup<NativeFunction<string_int_to_void_function>>("c_DeleteContact");
var deleteContact = library.lookup<NativeFunction<string_int_to_void_function>>("c_DeleteConversation");
// ignore: non_constant_identifier_names
final DeleteContact = deleteContact.asFunction<VoidFromStringIntFn>();
final u1 = profileOnion.toNativeUtf8();
@ -785,7 +799,7 @@ class CwtchFfi implements Cwtch {
@override
// ignore: non_constant_identifier_names
Future<String> GetMessageByID(String profile, int handle, int index) async {
var getMessageC = library.lookup<NativeFunction<get_json_blob_from_str_int_int_function>>("c_GetMessageByID");
var getMessageC = library.lookup<NativeFunction<get_json_blob_from_str_int_int_function>>("c_GetMessageById");
// ignore: non_constant_identifier_names
final GetMessage = getMessageC.asFunction<GetJsonBlobFromStrIntIntFn>();
final utf8profile = profile.toNativeUtf8();
@ -877,7 +891,7 @@ class CwtchFfi implements Cwtch {
@override
void RestartSharing(String profile, String filekey) {
var restartSharingC = library.lookup<NativeFunction<void_from_string_string_function>>("c_RestartSharing");
var restartSharingC = library.lookup<NativeFunction<void_from_string_string_function>>("c_RestartFileShare");
// ignore: non_constant_identifier_names
final RestartSharing = restartSharingC.asFunction<VoidFromStringStringFn>();
final utf8profile = profile.toNativeUtf8();
@ -889,7 +903,7 @@ class CwtchFfi implements Cwtch {
@override
void StopSharing(String profile, String filekey) {
var stopSharingC = library.lookup<NativeFunction<void_from_string_string_function>>("c_StopSharing");
var stopSharingC = library.lookup<NativeFunction<void_from_string_string_function>>("c_StopFileShare");
// ignore: non_constant_identifier_names
final StopSharing = stopSharingC.asFunction<VoidFromStringStringFn>();
final utf8profile = profile.toNativeUtf8();
@ -899,6 +913,18 @@ class CwtchFfi implements Cwtch {
malloc.free(ut8filekey);
}
@override
void DeleteServerInfo(String profile, String handle) {
var deleteServerInfoC = library.lookup<NativeFunction<void_from_string_string_function>>("c_DeleteServerInfo");
// ignore: non_constant_identifier_names
final StopSharing = deleteServerInfoC.asFunction<VoidFromStringStringFn>();
final utf8profile = profile.toNativeUtf8();
final ut8handle = handle.toNativeUtf8();
StopSharing(utf8profile, utf8profile.length, ut8handle, ut8handle.length);
malloc.free(utf8profile);
malloc.free(ut8handle);
}
@override
void UpdateSettings(String json) {
var updateSettings = library.lookup<NativeFunction<string_to_void_function>>("c_UpdateSettings");
@ -962,4 +988,151 @@ class CwtchFfi implements Cwtch {
}
return false;
}
@override
Future<String?> GetProfileAttribute(String profile, String key) {
var getProfileAttributeC = library.lookup<NativeFunction<get_json_blob_from_str_str_function>>("c_GetProfileAttribute");
// ignore: non_constant_identifier_names
final GetProfileAttribute = getProfileAttributeC.asFunction<GetJsonBlobFromStrStrFn>();
final utf8profile = profile.toNativeUtf8();
final utf8key = key.toNativeUtf8();
Pointer<Utf8> jsonMessageBytes = GetProfileAttribute(utf8profile, utf8profile.length, utf8key, utf8key.length);
String jsonMessage = jsonMessageBytes.toDartString();
_UnsafeFreePointerAnyUseOfThisFunctionMustBeDoubleApproved(jsonMessageBytes);
malloc.free(utf8profile);
malloc.free(utf8key);
try {
dynamic attributeResult = json.decode(jsonMessage);
if (attributeResult["Exists"]) {
return Future.value(attributeResult["Value"]);
}
} catch (e) {
EnvironmentConfig.debugLog("error getting profile attribute: $e");
}
return Future.value(null);
}
@override
Future<String?> GetConversationAttribute(String profile, int conversation, String key) {
var getConversationAttributeC = library.lookup<NativeFunction<get_json_blob_from_str_int_string_function>>("c_GetConversationAttribute");
// ignore: non_constant_identifier_names
final GetConversationAttribute = getConversationAttributeC.asFunction<GetJsonBlobFromStrIntStringFn>();
final utf8profile = profile.toNativeUtf8();
final utf8key = key.toNativeUtf8();
Pointer<Utf8> jsonMessageBytes = GetConversationAttribute(utf8profile, utf8profile.length, conversation, utf8key, utf8key.length);
String jsonMessage = jsonMessageBytes.toDartString();
_UnsafeFreePointerAnyUseOfThisFunctionMustBeDoubleApproved(jsonMessageBytes);
malloc.free(utf8profile);
malloc.free(utf8key);
try {
dynamic attributeResult = json.decode(jsonMessage);
if (attributeResult["Exists"]) {
return Future.value(attributeResult["Value"]);
}
} catch (e) {
EnvironmentConfig.debugLog("error getting profile attribute: $e");
}
return Future.value(null);
}
@override
void AttemptReconnection(String profile, String onion) {
// ignore: non_constant_identifier_names
var peerWithOnionC = library.lookup<NativeFunction<void_from_string_string_function>>("c_PeerWithOnion");
final PeerWithOnionF = peerWithOnionC.asFunction<VoidFromStringStringFn>();
final utf8profile = profile.toNativeUtf8();
final utf8onion = onion.toNativeUtf8();
PeerWithOnionF(utf8profile, utf8profile.length, utf8onion, utf8onion.length);
malloc.free(utf8profile);
malloc.free(utf8onion);
}
@override
void AttemptReconnectionServer(String profile, String onion) {
// ignore: non_constant_identifier_names
var queueJoinServerC = library.lookup<NativeFunction<void_from_string_string_function>>("c_QueueJoinServer");
final QueueJoinServerC = queueJoinServerC.asFunction<VoidFromStringStringFn>();
final utf8profile = profile.toNativeUtf8();
final utf8onion = onion.toNativeUtf8();
QueueJoinServerC(utf8profile, utf8profile.length, utf8onion, utf8onion.length);
malloc.free(utf8profile);
malloc.free(utf8onion);
}
@override
void DisconnectFromPeer(String profile, String onion) {
// ignore: non_constant_identifier_names
var disconnectFromPeerC = library.lookup<NativeFunction<void_from_string_string_function>>("c_DisconnectFromPeer");
final DisconnectFromPeerC = disconnectFromPeerC.asFunction<VoidFromStringStringFn>();
final utf8profile = profile.toNativeUtf8();
final utf8onion = onion.toNativeUtf8();
DisconnectFromPeerC(utf8profile, utf8profile.length, utf8onion, utf8onion.length);
malloc.free(utf8profile);
malloc.free(utf8onion);
}
@override
void DisconnectFromServer(String profile, String onion) {
// ignore: non_constant_identifier_names
var disconnectFromServerC = library.lookup<NativeFunction<void_from_string_string_function>>("c_DisconnectFromServer");
final DisconnectFromServerC = disconnectFromServerC.asFunction<VoidFromStringStringFn>();
final utf8profile = profile.toNativeUtf8();
final utf8onion = onion.toNativeUtf8();
DisconnectFromServerC(utf8profile, utf8profile.length, utf8onion, utf8onion.length);
malloc.free(utf8profile);
malloc.free(utf8onion);
}
@override
Future<String> SearchConversations(String profile, String pattern) async {
var searchConversationsC = library.lookup<NativeFunction<string_string_to_string_function>>("c_SearchConversations");
// ignore: non_constant_identifier_names
final SearchConversations = searchConversationsC.asFunction<StringFromStringStringFn>();
final utf8profile = profile.toNativeUtf8();
final utf8pattern = pattern.toNativeUtf8();
EnvironmentConfig.debugLog("Searching for $profile $pattern");
Pointer<Utf8> searchIDRaw = SearchConversations(utf8profile, utf8profile.length, utf8pattern, utf8pattern.length);
String searchID = searchIDRaw.toDartString();
_UnsafeFreePointerAnyUseOfThisFunctionMustBeDoubleApproved(searchIDRaw);
malloc.free(utf8profile);
malloc.free(utf8pattern);
return searchID;
}
@override
Future<HashMap<String, String>> PlatformChannelInfo() {
return Future.value(HashMap<String, String>());
}
@override
Future<void> ConfigureConnections(String profile, bool listen, bool peers, bool servers) async {
var configureConnections = library.lookup<NativeFunction<void_from_string_bool_bool_bool>>("c_ConfigureConnections");
// ignore: non_constant_identifier_names
final ConfigureConnections = configureConnections.asFunction<VoidFromStringBoolBoolBool>();
final utf8profile = profile.toNativeUtf8();
ConfigureConnections(utf8profile, utf8profile.length, listen, peers, servers);
malloc.free(utf8profile);
return;
}
@override
void PublishServerUpdate(String profile) {
var publishServerUpdate = library.lookup<NativeFunction<string_to_void_function>>("c_PublishServerUpdate");
// ignore: non_constant_identifier_names
final PublishServerUpdate = publishServerUpdate.asFunction<StringFn>();
final utf8profile = profile.toNativeUtf8();
PublishServerUpdate(utf8profile, utf8profile.length);
malloc.free(utf8profile);
}
@override
bool IsLoaded() {
bool check = library.providesSymbol("c_UpdateSettings");
EnvironmentConfig.debugLog("Checking that the FFI Interface is Correctly Loaded... $check");
return check;
}
}

View File

@ -1,3 +1,4 @@
import 'dart:collection';
import 'dart:convert';
import 'package:cwtch/config.dart';
@ -29,9 +30,27 @@ class CwtchGomobile implements Cwtch {
late Future<dynamic> androidLibraryDir;
late Future<dynamic> androidHomeDirectory;
String androidHomeDirectoryStr = "";
String _cwtchDir = "";
late CwtchNotifier cwtchNotifier;
bool _isL10nInit = false;
@override
Future<HashMap<String, String>> PlatformChannelInfo() async {
HashMap<String, String> info = HashMap<String, String>();
info.addAll({"appInfoPlatform.name": appInfoPlatform.name});
info.addAll({"appInfoPlatform.codec": appInfoPlatform.codec.toString()});
EnvironmentConfig.debugLog("getting foreground service info...");
appInfoPlatform.invokeMapMethod('getForegroundServiceInfo').then((foregroundServiceInfoMap) {
EnvironmentConfig.debugLog("parsing foreground service info...");
foregroundServiceInfoMap?.entries.forEach((element) {
info.addAll({element.key.toString(): element.value.toString()});
});
});
EnvironmentConfig.debugLog("returning foreground service info...");
return info;
}
CwtchGomobile(CwtchNotifier _cwtchNotifier) {
print("gomobile.dart: CwtchGomobile()");
cwtchNotifier = _cwtchNotifier;
@ -44,23 +63,27 @@ class CwtchGomobile implements Cwtch {
appbusEventChannel.setMethodCallHandler(this._handleAppbusEvent);
}
String getAssetsDir() {
// TODO
return "";
}
// Requires Start() to have been run to initialize
Future<String> getCwtchDir() async {
return _cwtchDir;
}
// ignore: non_constant_identifier_names
Future<void> Start() async {
print("gomobile.dart: Start()...");
androidHomeDirectoryStr = (await androidHomeDirectory).path;
var cwtchDir = path.join(androidHomeDirectoryStr, ".cwtch");
_cwtchDir = path.join(androidHomeDirectoryStr, ".cwtch");
if (EnvironmentConfig.BUILD_VER == dev_version) {
cwtchDir = path.join(cwtchDir, "dev");
_cwtchDir = path.join(_cwtchDir, "dev");
}
String torPath = path.join(await androidLibraryDir, "libtor.so");
print("gomobile.dart: Start invokeMethod Start($cwtchDir, $torPath)...");
return cwtchPlatform.invokeMethod("Start", {"appDir": cwtchDir, "torPath": torPath});
}
@override
// ignore: non_constant_identifier_names
Future<void> ReconnectCwtchForeground() async {
cwtchPlatform.invokeMethod("ReconnectCwtchForeground", {});
print("gomobile.dart: Start invokeMethod Start($_cwtchDir, $torPath)...");
cwtchPlatform.invokeMethod("Start", {"appDir": _cwtchDir, "torPath": torPath});
}
// Handle libcwtch-go events (received via kotlin) and dispatch to the cwtchNotifier
@ -352,7 +375,7 @@ class CwtchGomobile implements Cwtch {
@override
void RestartSharing(String profile, String filekey) {
cwtchPlatform.invokeMethod("RestartSharing", {"ProfileOnion": profile, "filekey": filekey});
cwtchPlatform.invokeMethod("RestartFileShare", {"ProfileOnion": profile, "filekey": filekey});
}
@override
@ -360,6 +383,11 @@ class CwtchGomobile implements Cwtch {
cwtchPlatform.invokeMethod("StopSharing", {"ProfileOnion": profile, "filekey": filekey});
}
@override
void DeleteServerInfo(String profile, String handle) {
cwtchPlatform.invokeMethod("DeleteServerInfo", {"ProfileOnion": profile, "handle": handle});
}
@override
void UpdateSettings(String json) {
cwtchPlatform.invokeMethod("UpdateSettings", {"json": json});
@ -388,4 +416,67 @@ class CwtchGomobile implements Cwtch {
// Blodeuwedd is not currently supported on lower end devices.
return false;
}
@override
Future<String?> GetProfileAttribute(String profile, String key) async {
return await cwtchPlatform.invokeMethod("GetProfileAttribute", {"ProfileOnion": profile, "key": key}).then((dynamic json) {
var value = jsonDecode(json);
if (value["Exists"]) {
return value["Value"];
}
return null;
});
}
@override
Future<String?> GetConversationAttribute(String profile, int conversation, String key) async {
return await cwtchPlatform.invokeMethod("GetConversationAttribute", {"ProfileOnion": profile, "conversation": conversation, "key": key}).then((dynamic json) {
var value = jsonDecode(json);
if (value["Exists"]) {
return value["Value"];
}
return null;
});
}
@override
void AttemptReconnection(String profile, String onion) {
cwtchPlatform.invokeMethod("PeerWithOnion", {"ProfileOnion": profile, "onion": onion});
}
@override
void AttemptReconnectionServer(String profile, String onion) {
cwtchPlatform.invokeMethod("QueueJoinServer", {"ProfileOnion": profile, "onion": onion});
}
@override
void DisconnectFromPeer(String profile, String onion) {
cwtchPlatform.invokeMethod("DisconnectFromPeer", {"ProfileOnion": profile, "onion": onion});
}
@override
void DisconnectFromServer(String profile, String onion) {
cwtchPlatform.invokeMethod("DisconnectFromServer", {"ProfileOnion": profile, "onion": onion});
}
@override
Future<String> SearchConversations(String profile, String pattern) async {
return await cwtchPlatform.invokeMethod("SearchConversations", {"ProfileOnion": profile, "pattern": pattern});
}
@override
Future<void> ConfigureConnections(String profile, bool listen, bool peers, bool servers) async {
cwtchPlatform.invokeMethod("ConfigureConnections", {"ProfileOnion": profile, "listen": listen, "peers": peers, "servers": servers});
return;
}
@override
void PublishServerUpdate(String profile) {
cwtchPlatform.invokeMethod("PublishServerUpdate", {"ProfileOnion": profile});
}
@override
bool IsLoaded() {
return true;
}
}

View File

@ -1,5 +1,5 @@
/// Flutter icons Cwtch
/// Copyright (C) 2021-2022 by Open Privacy Research Society
/// Copyright (C) 2021-2023 by Open Privacy Research Society
/// This font was generated by FlutterIcon.com, which is derived from Fontello.
///
/// To use this font, place it in your fonts/ directory and include the
@ -124,6 +124,7 @@ class CwtchIcons {
static const IconData view_replies = IconData(0xe869, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData anti_spam_2 = IconData(0xe86b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData manage_files = IconData(0xe86c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData attached_file_2 = IconData(0xe86d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData anti_spam_3 = IconData(0xe86e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData attached_file_3 = IconData(0xe86f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData disconnect_from_contact = IconData(0xe870, fontFamily: _kFontFam, fontPackage: _kFontPkg);
}

View File

@ -622,4 +622,46 @@ class MaterialLocalizationLu extends MaterialLocalizations {
@override
// TODO: implement menuBarMenuLabel
String get menuBarMenuLabel => throw UnimplementedError();
@override
// TODO: implement bottomSheetLabel
String get bottomSheetLabel => throw UnimplementedError();
@override
// TODO: implement currentDateLabel
String get currentDateLabel => throw UnimplementedError();
@override
// TODO: implement keyboardKeyShift
String get keyboardKeyShift => throw UnimplementedError();
@override
// TODO: implement scrimLabel
String get scrimLabel => throw UnimplementedError();
@override
String scrimOnTapHint(String modalRouteContentName) {
// TODO: implement scrimOnTapHint
throw UnimplementedError();
}
@override
// TODO: implement scanTextButtonLabel
String get scanTextButtonLabel => throw UnimplementedError();
@override
// TODO: implement lookUpButtonLabel
String get lookUpButtonLabel => throw UnimplementedError();
@override
// TODO: implement menuDismissLabel
String get menuDismissLabel => throw UnimplementedError();
@override
// TODO: implement searchWebButtonLabel
String get searchWebButtonLabel => throw UnimplementedError();
@override
// TODO: implement shareButtonLabel
String get shareButtonLabel => throw UnimplementedError();
}

View File

@ -1,6 +1,54 @@
{
"@@locale": "cy",
"@@last_modified": "2023-03-27T20:38:31+02:00",
"@@last_modified": "2024-02-12T08:05:24+01:00",
"settingsExperimentsShowPerformanceDescription": "Display an overlay graph of render time.",
"settingsExperimentsShowPerformanceTitle": "Show Performance Overlay",
"settingsImportThemeButton": "Import Theme",
"settingsImportThemeDescription": "Select theme directory to import for use in Cwtch",
"settingsImportThemeTitle": "Import Theme",
"settingsThemeErrorInvalid": "Error: Could not import $themeName, theme.yml missing, not a theme directory",
"settingThemeOverwriteQuestion": "Theme $themeName already exists, confirm overwrite?",
"settingThemeOverwriteConfirm": "Confirm",
"settingsThemeImagesDescription": "Enable display of images from themes",
"settingsThemeImages": "Theme Images",
"settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup",
"now": "Now",
"xSecondsAgo": "$seconds seconds ago",
"xMinutesAgo": "$minutes minutes ago",
"xHoursAgo": "$hours hours ago",
"xDaysAgo": "$days days ago",
"profileAllowUnknownContacts": "Allow Unknown Contacts",
"profileBlockUnknownContacts": "Block Unknown Contacts",
"profileDisableProfile": "Disable Profile",
"profileEnableProfile": "Enable Profile",
"profileAppearOnline": "Appear Online",
"contactDisconnect": "Disconnect from Contact (if you do not have Appear Offline set this contact may still be able to reestablish a connection to you)",
"profileAppearOfflineDescription": "By default, when Cwtch profile is enabled it automatically attempts to connect to know contacts, and allows inbound connections. This settings disables those actions and allows you to choose, manually, which contacts to connect to.",
"profileAppearOffline": "Appear Offline",
"deleteServerConfirmBtn": "Mewn gwirionedd dileu gweinydd",
"cannotDeleteServerIfActiveGroups": "There are active groups associated with this Cwtch Server. Please delete them prior to deleting this Cwtch Server entry.",
"groupsOnThisServerLabel": "Grwpiau rydw i'n eu cynnal ar y gweinydd hwn",
"serverinfoNoGroupInfo": "There are no groups associated with this Cwtch Server.",
"preserveHistorySettingDescription": "By default, Cwtch will purge conversation history when Cwtch is shutdown. If this setting is enabled, Cwtch will preserve the conversation history of peer conversations.",
"defaultPreserveHistorySetting": "Preserve Conversation History",
"localeUk": "Ukrainian \/ українською",
"profileEnabledDescription": "Activate or Deactivate the profile.",
"localeSw": "Swahili \/ Kiswahili",
"localeSv": "Swedish \/ Svenska",
"fontScalingDescription": "Adjust the relative font scaling factor applied to text and widgets.",
"defaultScalingText": "Testun maint rhagosodedig (ffactor graddfa:",
"localeJa": "Japanese \/ 日本語",
"retryConnectionTooltip": "Cwtch retries peers regularly, but you can tell Cwtch to try sooner by pushing this button.",
"retryConnection": "Retry",
"availabilityStatusTooltip": "Set your availability status",
"profileInfoHint3": "Contacts will be able to see this information in Conversation Settings ",
"profileInfoHint2": "You can add up to 3 fields.",
"profileInfoHint": "Add some public information about yourself here e.g. blog, websites, brief bio.",
"availabilityStatusBusy": "Busy",
"availabilityStatusAway": "Away",
"availabilityStatusAvailable": "Available",
"blodeuweddWarning": "Blodeuwedd uses a local language model and a set of small auxiliary models to power its functionality. These techniques are often very effective they are not without error. \n\nWhile we have taken efforts to minimize the risk, there is still the possibility that Blodeuwedd outputs will be incorrect, hallucinated and\/or offensive.\n\nBecause of that Blodeuwedd requires downloading two additional components separate from Cwtch, the Blodeuwedd Model (or a compatible model) and the Blodeuwedd Runner. \n\nSee https:\/\/docs.cwtch.im\/docs\/settings\/experiments\/blodeuwedd for more information on obtaining these components and setting them up.",
"blodeuweddProcessing": "Blodeuwedd is processing...",
"blodeuweddTranslate": "Translate Message",
@ -11,7 +59,6 @@
"blodeuweddExperimentEnable": "Blodeuwedd Assistant",
"localeKo": "Korean \/ 한국어",
"localeSk": "Slovak \/ Slovák",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
@ -82,7 +129,6 @@
"serverMetricsLabel": "Metrigau Gweinydd",
"manageKnownServersLong": "Rheoli Gweinyddwyr Hysbys",
"manageKnownServersButton": "Rheoli Gweinyddwyr Hysbys",
"groupsOnThisServerLabel": "Grwpiau rydw i'n eu cynnal ar y gweinydd hwn",
"importLocalServerSelectText": "Dewiswch Gweinyddwr Lleol",
"importLocalServerLabel": "Mewnforio gweinydd a letyir yn lleol",
"enterCurrentPasswordForDeleteServer": "Rhowch y cyfrinair cyfredol i ddileu'r gweinydd hwn",
@ -93,13 +139,11 @@
"settingUIColumnLandscape": "Colofnau UI yn y Modd Tirwedd",
"settingUIColumnPortrait": "Colofnau UI yn y Modd Portread",
"addNewItem": "Ychwanegu eitem newydd at y rhestr",
"defaultScalingText": "Testun maint rhagosodedig (ffactor graddfa:",
"zoomLabel": "Chwyddo rhyngwyneb (yn effeithio ar faint testun a botymau yn bennaf)",
"torSettingsEnabledAdvancedDescription": "Defnyddiwch wasanaeth Tor presennol ar eich system, neu newidiwch baramedrau Gwasanaeth Cwtch Tor",
"torSettingsCustomControlPortDescription": "Defnyddiwch borthladd wedi'i deilwra ar gyfer cysylltiadau rheoli i'r dirprwy Tor",
"torSettingsUseCustomTorServiceConfiguration": "Defnyddiwch Ffurfweddiad Gwasanaeth Custom Tor (torrc)",
"fileSharingSettingsDownloadFolderDescription": "Pan fydd ffeiliau'n cael eu llwytho i lawr yn awtomatig (ee ffeiliau delwedd, pan fydd rhagolygon delwedd yn cael eu galluogi) mae angen lleoliad rhagosodedig i lawrlwytho'r ffeiliau iddo.",
"deleteServerConfirmBtn": "Mewn gwirionedd dileu gweinydd",
"deleteServerSuccess": "Wedi dileu gweinydd yn llwyddiannus",
"enterServerPassword": "Rhowch gyfrinair i ddatgloi gweinydd",
"unlockProfileTip": "Crëwch neu ddatgloi proffil i ddechrau!",

View File

@ -1,6 +1,54 @@
{
"@@locale": "da",
"@@last_modified": "2023-03-27T20:38:31+02:00",
"@@last_modified": "2024-02-12T08:05:24+01:00",
"settingsExperimentsShowPerformanceDescription": "Display an overlay graph of render time.",
"settingsExperimentsShowPerformanceTitle": "Show Performance Overlay",
"settingsImportThemeButton": "Import Theme",
"settingsImportThemeDescription": "Select theme directory to import for use in Cwtch",
"settingsImportThemeTitle": "Import Theme",
"settingsThemeErrorInvalid": "Error: Could not import $themeName, theme.yml missing, not a theme directory",
"settingThemeOverwriteQuestion": "Theme $themeName already exists, confirm overwrite?",
"settingThemeOverwriteConfirm": "Confirm",
"settingsThemeImagesDescription": "Enable display of images from themes",
"settingsThemeImages": "Theme Images",
"settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup",
"now": "Now",
"xSecondsAgo": "$seconds seconds ago",
"xMinutesAgo": "$minutes minutes ago",
"xHoursAgo": "$hours hours ago",
"xDaysAgo": "$days days ago",
"profileAllowUnknownContacts": "Allow Unknown Contacts",
"profileBlockUnknownContacts": "Block Unknown Contacts",
"profileDisableProfile": "Disable Profile",
"profileEnableProfile": "Enable Profile",
"profileAppearOnline": "Appear Online",
"contactDisconnect": "Disconnect from Contact (if you do not have Appear Offline set this contact may still be able to reestablish a connection to you)",
"profileAppearOfflineDescription": "By default, when Cwtch profile is enabled it automatically attempts to connect to know contacts, and allows inbound connections. This settings disables those actions and allows you to choose, manually, which contacts to connect to.",
"profileAppearOffline": "Appear Offline",
"deleteServerConfirmBtn": "Ja fjern server",
"cannotDeleteServerIfActiveGroups": "There are active groups associated with this Cwtch Server. Please delete them prior to deleting this Cwtch Server entry.",
"groupsOnThisServerLabel": "Grupper som jeg er vært for på denne server",
"serverinfoNoGroupInfo": "There are no groups associated with this Cwtch Server.",
"preserveHistorySettingDescription": "By default, Cwtch will purge conversation history when Cwtch is shutdown. If this setting is enabled, Cwtch will preserve the conversation history of peer conversations.",
"defaultPreserveHistorySetting": "Preserve Conversation History",
"localeUk": "Ukrainian \/ українською",
"profileEnabledDescription": "Activate or Deactivate the profile.",
"localeSw": "Swahili \/ Kiswahili",
"localeSv": "Swedish \/ Svenska",
"fontScalingDescription": "Adjust the relative font scaling factor applied to text and widgets.",
"defaultScalingText": "Standard størrelse tekst (skaleringsfaktor:",
"localeJa": "Japanese \/ 日本語",
"retryConnectionTooltip": "Cwtch retries peers regularly, but you can tell Cwtch to try sooner by pushing this button.",
"retryConnection": "Retry",
"availabilityStatusTooltip": "Set your availability status",
"profileInfoHint3": "Contacts will be able to see this information in Conversation Settings ",
"profileInfoHint2": "You can add up to 3 fields.",
"profileInfoHint": "Add some public information about yourself here e.g. blog, websites, brief bio.",
"availabilityStatusBusy": "Busy",
"availabilityStatusAway": "Away",
"availabilityStatusAvailable": "Available",
"blodeuweddWarning": "Blodeuwedd uses a local language model and a set of small auxiliary models to power its functionality. These techniques are often very effective they are not without error. \n\nWhile we have taken efforts to minimize the risk, there is still the possibility that Blodeuwedd outputs will be incorrect, hallucinated and\/or offensive.\n\nBecause of that Blodeuwedd requires downloading two additional components separate from Cwtch, the Blodeuwedd Model (or a compatible model) and the Blodeuwedd Runner. \n\nSee https:\/\/docs.cwtch.im\/docs\/settings\/experiments\/blodeuwedd for more information on obtaining these components and setting them up.",
"blodeuweddProcessing": "Blodeuwedd is processing...",
"blodeuweddTranslate": "Translate Message",
@ -11,7 +59,6 @@
"blodeuweddExperimentEnable": "Blodeuwedd Assistant",
"localeKo": "Korean \/ 한국어",
"localeSk": "Slovak \/ Slovák",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
@ -144,7 +191,6 @@
"displayNameTooltip": "Vælg et navn til præsentation",
"manageKnownServersButton": "Administrer kendte Servere",
"fieldDescriptionLabel": "Beskrivelse",
"groupsOnThisServerLabel": "Grupper som jeg er vært for på denne server",
"importLocalServerButton": "Importer %1",
"importLocalServerSelectText": "Vælg lokal Server",
"importLocalServerLabel": "Importer en lokalt administreret server",
@ -156,7 +202,6 @@
"fileSavedTo": "Gemt på",
"encryptedServerDescription": "Ved at kryptere en server med et password beskytter du mod angreb fra andre brugere af denne enhed. Krypterede servere kan ikke tilgås, aflæses eller vises før det korrekte password er blevet brugt til at åbne dem.",
"plainServerDescription": "Vi anbefaler at du beskytter dine Cwtch servere med et password. Hvis ikke du sætter et password kan alle med adgang til denne enhed indsamle information om denne server samt hente beskyttede krypteringsnøgler.",
"deleteServerConfirmBtn": "Ja fjern server",
"deleteServerSuccess": "Fjernede server",
"enterCurrentPasswordForDeleteServer": "Indtast nuværende password for at fjerne denne server",
"copyAddress": "Kopier Adresse",
@ -272,7 +317,6 @@
"viewGroupMembershipTooltip": "Se gruppe-medlemsskab",
"loadingTor": "Åbner Tor...",
"smallTextLabel": "Lille",
"defaultScalingText": "Standard størrelse tekst (skaleringsfaktor:",
"builddate": "Bygget den: %2",
"version": "Version %1",
"versionTor": "Version %1 med tor %2",

View File

@ -1,20 +1,67 @@
{
"@@locale": "de",
"@@last_modified": "2023-03-27T20:38:31+02:00",
"blodeuweddWarning": "Blodeuwedd uses a local language model and a set of small auxiliary models to power its functionality. These techniques are often very effective they are not without error. \n\nWhile we have taken efforts to minimize the risk, there is still the possibility that Blodeuwedd outputs will be incorrect, hallucinated and\/or offensive.\n\nBecause of that Blodeuwedd requires downloading two additional components separate from Cwtch, the Blodeuwedd Model (or a compatible model) and the Blodeuwedd Runner. \n\nSee https:\/\/docs.cwtch.im\/docs\/settings\/experiments\/blodeuwedd for more information on obtaining these components and setting them up.",
"blodeuweddProcessing": "Blodeuwedd is processing...",
"blodeuweddTranslate": "Translate Message",
"blodeuweddSummarize": "Summarize Conversation",
"blodeuweddPath": "The directory where the Blodeuwedd is located on your computer.",
"blodeuweddNotSupported": "This version of Cwtch has been compiled without support for the Blodeuwedd Assistant.",
"blodeuweddDescription": "The Blodeuwedd assistant adds new features to Cwtch such as chat transcript summarization and message translation via a locally hosted language model.",
"blodeuweddExperimentEnable": "Blodeuwedd Assistant",
"@@last_modified": "2024-02-12T08:05:24+01:00",
"settingsExperimentsShowPerformanceTitle": "Leistungs-Overlay anzeigen",
"settingsExperimentsShowPerformanceDescription": "Zeigt ein Overlay-Diagramm der Renderzeit an.",
"defaultScalingText": "Text in Standardgröße (Skalierungsfaktor:",
"deleteServerConfirmBtn": "Server wirklich löschen",
"groupsOnThisServerLabel": "Gruppen, in denen ich bin, werden auf diesem Server gehostet",
"profileEnabledDescription": "Starten oder Stoppen des Profils",
"defaultPreserveHistorySetting": "Konversationsverlauf bewahren",
"preserveHistorySettingDescription": "Standardmäßig löscht Cwtch den Gesprächsverlauf, wenn Cwtch heruntergefahren wird. Wenn diese Einstellung aktiviert ist, bewahrt Cwtch den Gesprächsverlauf von Peer-Unterhaltungen auf.",
"serverinfoNoGroupInfo": "Es gibt keine Gruppen, die mit diesem Cwtch Server verbunden sind.",
"cannotDeleteServerIfActiveGroups": "Es gibt aktive Gruppen, die mit diesem Cwtch Server verbunden sind. Bitte lösche diese, bevor du diesen Cwtch-Server-Eintrag löschst.",
"profileAppearOnline": "Online erscheinen",
"profileAppearOffline": "Offline erscheinen",
"profileAppearOfflineDescription": "Standardmäßig wird bei aktiviertem Cwtch-Profil automatisch versucht, eine Verbindung zu bekannten Kontakten herzustellen und es werden eingehende Verbindungen zugelassen. Mit dieser Einstellung werden diese Aktionen deaktiviert und du kannst manuell auswählen, mit welchen Kontakten eine Verbindung hergestellt werden soll.",
"contactDisconnect": "Trenne die Verbindung mit dem Kontakt (wenn du die Funktion Offline erscheinen nicht aktiviert habst, kann der Kontakt trotzdem eine Verbindung zu dir herstellen)",
"profileEnableProfile": "Profil aktivieren",
"profileDisableProfile": "Profil deaktivieren",
"profileBlockUnknownContacts": "Unbekannte Kontakte blockieren",
"profileAllowUnknownContacts": "Unbekannte Kontakte zulassen",
"profileOfflineAtStart": "Beim Start offline erscheinen",
"xDaysAgo": "vor $days Tagen",
"xHoursAgo": "vor $hours Stunden",
"xMinutesAgo": "vor $minutes Minuten",
"xSecondsAgo": "vor $seconds Sekunden",
"now": "Jetzt",
"localeUzbek": "Usbekisch \/ Oʻzbekcha",
"settingsGroupAbout": "Über",
"settingsThemeImages": "Theme Bilder",
"settingsThemeImagesDescription": "Aktiviere die Anzeige von Bildern aus Themes",
"settingThemeOverwriteConfirm": "Bestätigen",
"settingThemeOverwriteQuestion": "Theme $themeName existiert bereits, Überschreiben bestätigen?",
"settingsThemeErrorInvalid": "Fehler: Konnte $themeName nicht importieren, theme.yml fehlt, kein Theme-Verzeichnis",
"settingsImportThemeTitle": "Theme importieren",
"settingsImportThemeDescription": "Wähle das Theme-Verzeichnis aus, das zur Verwendung in Cwtch importiert werden soll",
"settingsImportThemeButton": "Theme importieren",
"retryConnection": "Wiederholen",
"retryConnectionTooltip": "Cwtch wiederholt die Versuche regelmäßig, aber du kannst Cwtch anweisen, es früher zu versuchen, indem du diese Taste drückst.",
"localeJa": "Japanisch \/ 日本語",
"fontScalingDescription": "Passe den relativen Skalierungsfaktor der Schrift an, der auf Text und Widgets angewendet wird.",
"localeSv": "Schwedisch \/ Svenska",
"localeSw": "Suaheli \/ Kiswahili",
"localeUk": "Ukrainisch \/ українською",
"blodeuweddExperimentEnable": "Blodeuwedd Assistent",
"blodeuweddDescription": "Der Blodeuwedd-Assistent erweitert Cwtch um neue Funktionen wie die Zusammenfassung von Chat-Transkripten und die Übersetzung von Nachrichten über ein lokal gehostetes Sprachmodell.",
"blodeuweddNotSupported": "Diese Version von Cwtch wurde ohne Unterstützung für den Blodeuwedd-Assistenten kompiliert.",
"blodeuweddPath": "Das Verzeichnis, in dem sich der Blodeuwedd auf deinem Computer befindet.",
"blodeuweddSummarize": "Konversationszusammenfassung",
"blodeuweddTranslate": "Nachricht übersetzen",
"blodeuweddProcessing": "Blodeuwedd verarbeitet...",
"blodeuweddWarning": "Blodeuwedd verwendet ein lokales Sprachmodell und eine Reihe von kleinen Hilfsmodellen, um seine Funktionalität zu gewährleisten. Diese Techniken sind oft sehr effektiv, aber nicht fehlerfrei. \n\nObwohl wir uns bemüht haben, das Risiko zu minimieren, besteht immer noch die Möglichkeit, dass die Ausgaben von Blodeuwedd falsch, halluziniert und\/oder beleidigend sind.\n\nAus diesem Grund müssen für Blodeuwedd zwei zusätzliche Komponenten separat von Cwtch heruntergeladen werden: das Blodeuwedd-Modell (oder ein kompatibles Modell) und der Blodeuwedd-Runner. \n\nUnter https:\/\/docs.cwtch.im\/docs\/settings\/experiments\/blodeuwedd findest du weitere Informationen über den Bezug dieser Komponenten und deren Einrichtung.",
"availabilityStatusAvailable": "Verfügbar",
"availabilityStatusAway": "Abwesend",
"availabilityStatusBusy": "Beschäftigt",
"availabilityStatusTooltip": "Stelle deinen Verfügbarkeitsstatus ein",
"profileInfoHint": "Füge hier einige öffentliche Informationen über dich selbst hinzu, z. B. Blog, Websites, Kurzbiografie.",
"profileInfoHint3": "Kontakte können diese Informationen in den Konversationseinstellungen sehen.",
"profileInfoHint2": "Du kannst bis zu 3 Felder hinzufügen.",
"localeSk": "Slowakisch \/ Slovák",
"localeKo": "Koreanisch \/ 한국어",
"profileAutostartLabel": "Autostart",
"profileEnabled": "Aktivieren",
"profileAutostartDescription": "Legt fest, ob das Profil beim Starten automatisch gestartet wird",
"profileEnabledDescription": "Starten oder Stoppen des Profils",
"acquiringTicketsFromServer": "Antispam-Herausforderung meistern",
"acquiredTicketsFromServer": "Antispam-Herausforderung abgeschlossen",
"shareProfileMenuTooltop": "Profil teilen über...",
@ -153,7 +200,6 @@
"version": "Version %1",
"versionTor": "Version %1 mit Tor %2",
"builddate": "Erstellt am: %2",
"defaultScalingText": "Text in Standardgröße (Skalierungsfaktor:",
"smallTextLabel": "Klein",
"viewGroupMembershipTooltip": "Gruppenmitgliedschaft anzeigen",
"loadingTor": "Tor wird geladen...",
@ -271,7 +317,6 @@
"copyAddress": "Adresse kopieren",
"enterCurrentPasswordForDeleteServer": "Bitte gib das aktuelle Passwort ein, um diesen Server zu löschen",
"deleteServerSuccess": "Server erfolgreich gelöscht",
"deleteServerConfirmBtn": "Server wirklich löschen",
"plainServerDescription": "Wir empfehlen, dass du deinen Cwtch-Server mit einem Passwort schützst. Wenn Du diesen Server nicht mit einem Kennwort versiehst, kann jeder, der Zugang zu diesem Gerät hat, auf Informationen über diesen Server zugreifen, einschließlich sensibler kryptografischer Schlüssel.",
"encryptedServerDescription": "Das Verschlüsseln eines Servers mit einem Kennwort schützt ihn vor anderen Personen, die dieses Gerät ebenfalls benutzen könnten. Verschlüsselte Server können nicht entschlüsselt, angezeigt oder aufgerufen werden, bis das richtige Kennwort eingegeben wird, um sie zu entsperren.",
"fileSavedTo": "Gesichert in",
@ -283,7 +328,6 @@
"importLocalServerLabel": "Importieren eines lokal gehosteten Servers",
"importLocalServerSelectText": "Lokalen Server auswählen",
"importLocalServerButton": "%1 importieren",
"groupsOnThisServerLabel": "Gruppen, in denen ich bin, werden auf diesem Server gehostet",
"fieldDescriptionLabel": "Beschreibung",
"manageKnownServersButton": "Bekannte Server verwalten",
"displayNameTooltip": "Bitte gib einen Anzeigenamen ein",

View File

@ -1,6 +1,54 @@
{
"@@locale": "el",
"@@last_modified": "2023-03-27T20:38:31+02:00",
"@@last_modified": "2024-02-12T08:05:24+01:00",
"settingsExperimentsShowPerformanceDescription": "Display an overlay graph of render time.",
"settingsExperimentsShowPerformanceTitle": "Show Performance Overlay",
"settingsImportThemeButton": "Import Theme",
"settingsImportThemeDescription": "Select theme directory to import for use in Cwtch",
"settingsImportThemeTitle": "Import Theme",
"settingsThemeErrorInvalid": "Error: Could not import $themeName, theme.yml missing, not a theme directory",
"settingThemeOverwriteQuestion": "Theme $themeName already exists, confirm overwrite?",
"settingThemeOverwriteConfirm": "Confirm",
"settingsThemeImagesDescription": "Enable display of images from themes",
"settingsThemeImages": "Theme Images",
"settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup",
"now": "Now",
"xSecondsAgo": "$seconds seconds ago",
"xMinutesAgo": "$minutes minutes ago",
"xHoursAgo": "$hours hours ago",
"xDaysAgo": "$days days ago",
"profileAllowUnknownContacts": "Allow Unknown Contacts",
"profileBlockUnknownContacts": "Block Unknown Contacts",
"profileDisableProfile": "Disable Profile",
"profileEnableProfile": "Enable Profile",
"profileAppearOnline": "Appear Online",
"contactDisconnect": "Disconnect from Contact (if you do not have Appear Offline set this contact may still be able to reestablish a connection to you)",
"profileAppearOfflineDescription": "By default, when Cwtch profile is enabled it automatically attempts to connect to know contacts, and allows inbound connections. This settings disables those actions and allows you to choose, manually, which contacts to connect to.",
"profileAppearOffline": "Appear Offline",
"deleteServerConfirmBtn": "Really Delete Server?",
"cannotDeleteServerIfActiveGroups": "There are active groups associated with this Cwtch Server. Please delete them prior to deleting this Cwtch Server entry.",
"groupsOnThisServerLabel": "Known Groups on this Cwtch Server",
"serverinfoNoGroupInfo": "There are no groups associated with this Cwtch Server.",
"preserveHistorySettingDescription": "By default, Cwtch will purge conversation history when Cwtch is shutdown. If this setting is enabled, Cwtch will preserve the conversation history of peer conversations.",
"defaultPreserveHistorySetting": "Preserve Conversation History",
"localeUk": "Ukrainian \/ українською",
"profileEnabledDescription": "Activate or Deactivate the profile.",
"localeSw": "Swahili \/ Kiswahili",
"localeSv": "Swedish \/ Svenska",
"fontScalingDescription": "Adjust the relative font scaling factor applied to text and widgets.",
"defaultScalingText": "Font Scaling",
"localeJa": "Japanese \/ 日本語",
"retryConnectionTooltip": "Cwtch retries peers regularly, but you can tell Cwtch to try sooner by pushing this button.",
"retryConnection": "Retry",
"availabilityStatusTooltip": "Set your availability status",
"profileInfoHint3": "Contacts will be able to see this information in Conversation Settings ",
"profileInfoHint2": "You can add up to 3 fields.",
"profileInfoHint": "Add some public information about yourself here e.g. blog, websites, brief bio.",
"availabilityStatusBusy": "Busy",
"availabilityStatusAway": "Away",
"availabilityStatusAvailable": "Available",
"blodeuweddWarning": "Blodeuwedd uses a local language model and a set of small auxiliary models to power its functionality. These techniques are often very effective they are not without error. \n\nWhile we have taken efforts to minimize the risk, there is still the possibility that Blodeuwedd outputs will be incorrect, hallucinated and\/or offensive.\n\nBecause of that Blodeuwedd requires downloading two additional components separate from Cwtch, the Blodeuwedd Model (or a compatible model) and the Blodeuwedd Runner. \n\nSee https:\/\/docs.cwtch.im\/docs\/settings\/experiments\/blodeuwedd for more information on obtaining these components and setting them up.",
"blodeuweddProcessing": "Blodeuwedd is processing...",
"blodeuweddTranslate": "Translate Message",
@ -11,7 +59,6 @@
"blodeuweddExperimentEnable": "Blodeuwedd Assistant",
"localeKo": "Korean \/ 한국어",
"localeSk": "Slovak \/ Slovák",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
@ -187,11 +234,9 @@
"experimentClickableLinksDescription": "The clickable links experiment allows you to click on URLs shared in messages",
"enableExperimentClickableLinks": "Enable Clickable Links",
"serverMetricsLabel": "Server Metrics",
"groupsOnThisServerLabel": "Groups I am in hosted on this server",
"importLocalServerButton": "Import %1",
"encryptedServerDescription": "Encrypting a server with a password protects it from other people who may also use this device. Encrypted servers cannot be decrypted, displayed or accessed until the correct password is entered to unlock them.",
"plainServerDescription": "We recommend that you protect your Cwtch servers with a password. If you do not set a password on this server then anyone who has access to this device may be able to access information about this server, including sensitive cryptographic keys.",
"deleteServerConfirmBtn": "Really delete server",
"settingServersDescription": "The hosting servers experiment enables hosting and managing Cwtch servers",
"settingServers": "Hosting Servers",
"unlockProfileTip": "Please create or unlock a profile to begin!",
@ -276,7 +321,6 @@
"viewGroupMembershipTooltip": "View Group Membership",
"loadingTor": "Loading tor...",
"smallTextLabel": "Small",
"defaultScalingText": "Default size text (scale factor:",
"builddate": "Built on: %2",
"version": "Version %1",
"versionTor": "Version %1 with tor %2",

View File

@ -1,6 +1,54 @@
{
"@@locale": "en",
"@@last_modified": "2023-03-27T20:38:31+02:00",
"@@last_modified": "2024-02-12T08:05:24+01:00",
"settingsExperimentsShowPerformanceDescription": "Display an overlay graph of render time.",
"settingsExperimentsShowPerformanceTitle": "Show Performance Overlay",
"settingThemeOverwriteConfirm": "Confirm",
"settingThemeOverwriteQuestion": "Theme $themeName already exists, confirm overwrite?",
"settingsThemeErrorInvalid": "Error: Could not import $themeName, theme.yml missing, not a theme directory",
"settingsImportThemeTitle": "Import Theme",
"settingsImportThemeDescription": "Select theme directory to import for use in Cwtch",
"settingsImportThemeButton": "Import Theme",
"settingsThemeImagesDescription": "Enable display of images from themes",
"settingsThemeImages": "Theme Images",
"settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup",
"now": "Now",
"xSecondsAgo": "$seconds seconds ago",
"xMinutesAgo": "$minutes minutes ago",
"xHoursAgo": "$hours hours ago",
"xDaysAgo": "$days days ago",
"profileAllowUnknownContacts": "Allow Unknown Contacts",
"profileBlockUnknownContacts": "Block Unknown Contacts",
"profileDisableProfile": "Disable Profile",
"profileEnableProfile": "Enable Profile",
"profileAppearOnline": "Appear Online",
"contactDisconnect": "Disconnect from Contact (if you do not have Appear Offline set this contact may still be able to reestablish a connection to you)",
"profileAppearOfflineDescription": "By default, when Cwtch profile is enabled it automatically attempts to connect to know contacts, and allows inbound connections. This settings disables those actions and allows you to choose, manually, which contacts to connect to.",
"profileAppearOffline": "Appear Offline",
"deleteServerConfirmBtn": "Really Delete Server?",
"cannotDeleteServerIfActiveGroups": "There are active groups associated with this Cwtch Server. Please delete them prior to deleting this Cwtch Server entry.",
"groupsOnThisServerLabel": "Known Groups on this Cwtch Server",
"serverinfoNoGroupInfo": "There are no groups associated with this Cwtch Server.",
"preserveHistorySettingDescription": "By default, Cwtch will purge conversation history when Cwtch is shutdown. If this setting is enabled, Cwtch will preserve the conversation history of peer conversations.",
"defaultPreserveHistorySetting": "Preserve Conversation History",
"localeUk": "Ukrainian \/ українською",
"profileEnabledDescription": "Activate or Deactivate the profile.",
"localeSw": "Swahili \/ Kiswahili",
"localeSv": "Swedish \/ Svenska",
"fontScalingDescription": "Adjust the relative font scaling factor applied to text and widgets.",
"defaultScalingText": "Font Scaling",
"localeJa": "Japanese \/ 日本語",
"retryConnectionTooltip": "Cwtch retries peers regularly, but you can tell Cwtch to try sooner by pushing this button.",
"retryConnection": "Retry",
"availabilityStatusTooltip": "Set your availability status",
"profileInfoHint3": "Contacts will be able to see this information in Conversation Settings ",
"profileInfoHint2": "You can add up to 3 fields.",
"profileInfoHint": "Add some public information about yourself here e.g. blog, websites, brief bio.",
"availabilityStatusAway": "Away",
"availabilityStatusBusy": "Busy",
"availabilityStatusAvailable": "Available",
"blodeuweddWarning": "Blodeuwedd uses a local language model and a set of small auxiliary models to power its functionality. These techniques are often very effective they are not without error. \n\nWhile we have taken efforts to minimize the risk, there is still the possibility that Blodeuwedd outputs will be incorrect, hallucinated and\/or offensive.\n\nBecause of that Blodeuwedd requires downloading two additional components separate from Cwtch, the Blodeuwedd Model (or a compatible model) and the Blodeuwedd Runner. \n\nSee https:\/\/docs.cwtch.im\/docs\/settings\/experiments\/blodeuwedd for more information on obtaining these components and setting them up.",
"blodeuweddSummarize": "Summarize Conversation",
"blodeuweddTranslate": "Translate Message",
@ -11,7 +59,6 @@
"blodeuweddExperimentEnable": "Blodeuwedd Assistant",
"localeKo": "Korean \/ 한국어",
"localeSk": "Slovak \/ Slovák",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
@ -142,7 +189,6 @@
"displayNameTooltip": "Please enter a display name",
"manageKnownServersButton": "Manage Known Servers",
"fieldDescriptionLabel": "Description",
"groupsOnThisServerLabel": "Groups I am in hosted on this server",
"importLocalServerButton": "Import %1",
"importLocalServerSelectText": "Select Local Server",
"importLocalServerLabel": "Import a locally hosted server",
@ -155,7 +201,6 @@
"fileSavedTo": "Saved to",
"plainServerDescription": "We recommend that you protect your Cwtch servers with a password. If you do not set a password on this server then anyone who has access to this device may be able to access information about this server, including sensitive cryptographic keys.",
"encryptedServerDescription": "Encrypting a server with a password protects it from other people who may also use this device. Encrypted servers cannot be decrypted, displayed or accessed until the correct password is entered to unlock them.",
"deleteServerConfirmBtn": "Really delete server",
"deleteServerSuccess": "Successfully deleted server",
"enterCurrentPasswordForDeleteServer": "Please enter current password to delete this server",
"copyAddress": "Copy Address",
@ -285,7 +330,6 @@
"viewGroupMembershipTooltip": "View Group Membership",
"loadingTor": "Loading tor...",
"smallTextLabel": "Small",
"defaultScalingText": "Default size text (scale factor:",
"builddate": "Built on: %2",
"version": "Version %1",
"versionTor": "Version %1 with tor %2",

View File

@ -1,26 +1,73 @@
{
"@@locale": "es",
"@@last_modified": "2023-03-27T20:38:31+02:00",
"blodeuweddWarning": "Blodeuwedd uses a local language model and a set of small auxiliary models to power its functionality. These techniques are often very effective they are not without error. \n\nWhile we have taken efforts to minimize the risk, there is still the possibility that Blodeuwedd outputs will be incorrect, hallucinated and\/or offensive.\n\nBecause of that Blodeuwedd requires downloading two additional components separate from Cwtch, the Blodeuwedd Model (or a compatible model) and the Blodeuwedd Runner. \n\nSee https:\/\/docs.cwtch.im\/docs\/settings\/experiments\/blodeuwedd for more information on obtaining these components and setting them up.",
"blodeuweddProcessing": "Blodeuwedd is processing...",
"blodeuweddTranslate": "Translate Message",
"blodeuweddSummarize": "Summarize Conversation",
"blodeuweddPath": "The directory where the Blodeuwedd is located on your computer.",
"blodeuweddNotSupported": "This version of Cwtch has been compiled without support for the Blodeuwedd Assistant.",
"blodeuweddDescription": "The Blodeuwedd assistant adds new features to Cwtch such as chat transcript summarization and message translation via a locally hosted language model.",
"blodeuweddExperimentEnable": "Blodeuwedd Assistant",
"localeKo": "Korean \/ 한국어",
"localeSk": "Slovak \/ Slovák",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
"localePtBr": "Brazilian Portuguese \/ Português do Brasil",
"localeNl": "Dutch \/ Dutch",
"experimentQRCodeDescription": "QR Code support allows sharing data (such as profile identity) by QR Codes",
"enableExperimentQRCode": "QR Codes",
"shareMenuQRCode": "Show QR Code",
"shareProfileMenuTooltop": "Share profile via...",
"@@last_modified": "2024-02-12T08:05:24+01:00",
"settingsExperimentsShowPerformanceDescription": "Display an overlay graph of render time.",
"settingsExperimentsShowPerformanceTitle": "Show Performance Overlay",
"settingsImportThemeButton": "Import Theme",
"settingsImportThemeDescription": "Select theme directory to import for use in Cwtch",
"settingsImportThemeTitle": "Import Theme",
"settingsThemeErrorInvalid": "Error: Could not import $themeName, theme.yml missing, not a theme directory",
"settingThemeOverwriteQuestion": "Theme $themeName already exists, confirm overwrite?",
"settingThemeOverwriteConfirm": "Confirm",
"settingsThemeImagesDescription": "Enable display of images from themes",
"settingsThemeImages": "Theme Images",
"settingsGroupAbout": "About",
"deleteServerConfirmBtn": "¿Realmente desea borrar el servidor?",
"defaultScalingText": "Factor de escala del texto",
"groupsOnThisServerLabel": "Grupos alojados en este servidor de Cwtch",
"shareMenuQRCode": "Mostrar código QR",
"experimentQRCodeDescription": "La compatibilidad con códigos QR permite compartir datos (como la identidad del perfil) mediante códigos QR",
"enableExperimentQRCode": "Códigos QR",
"localeNl": "Holandés \/ Dutch",
"localePtBr": "Portugués brasileño \/ Português do Brasil",
"profileAutostartLabel": "Inicio automático",
"profileEnabled": "Habilitar",
"profileAutostartDescription": "Controla si el perfil se iniciará automáticamente al iniciar Cwtch",
"profileEnabledDescription": "Activar o Desactivar el perfil.",
"localeSk": "Eslovaco \/ Slovák",
"localeKo": "Coreano \/ 한국어",
"blodeuweddExperimentEnable": "Asistente Blodeuwedd",
"blodeuweddDescription": "El asistente Blodeuwedd agrega nuevas funciones a Cwtch, como el resumen de la transcripción del chat y la traducción de mensajes a través de un modelo de lenguaje alojado localmente.",
"blodeuweddNotSupported": "Esta versión de Cwtch se ha compilado sin soporte para Blodeuwedd Assistant.",
"blodeuweddPath": "El directorio donde se encuentra Blodeuwedd está en tu computadora.",
"blodeuweddSummarize": "Resumir la conversación",
"blodeuweddWarning": "Blodeuwedd utiliza un modelo de idioma local y un conjunto de modelos auxiliares para potenciar su funcionalidad. Estas técnicas suelen ser muy efectivas y no están exentas de errores. \n\nSi bien nos hemos esforzado por minimizar el riesgo, todavía existe la posibilidad de que los resultados de Blodeuwedd sean incorrectos, sin-sentido y\/u ofensivos. \n\nDebido a eso, Blodeuwedd requiere descargar dos componentes adicionales separados de Cwtch, el modelo Blodeuwedd (o un modelo compatible) y el Blodeuwedd Runner. \n\nConsulta https:\/\/docs.cwtch.im\/docs\/settings\/experiments\/blodeuwedd para obtener más información sobre cómo obtener estos componentes y configurarlos.",
"blodeuweddTranslate": "Traducir mensaje",
"blodeuweddProcessing": "Blodeuwedd está procesando...",
"availabilityStatusBusy": "Ocupad()",
"availabilityStatusAvailable": "Disponible",
"availabilityStatusAway": "Ausente",
"shareProfileMenuTooltop": "Comparte éste perfil por medio de...",
"availabilityStatusTooltip": "Establece tu estado",
"profileInfoHint": "Agrega información sobre tí, por ejemplo un blog, sitio web o una breve biografía.",
"profileInfoHint2": "Puedes agregar hasta 3 campos.",
"profileInfoHint3": "Los contactos podrán ver esta información en la Configuración de la Conversación ",
"retryConnection": "Reintentar",
"fontScalingDescription": "Ajusta el factor de escala de fuente relativo aplicado al texto y los widgets.",
"retryConnectionTooltip": "Cwtch reintenta conectarse a sus pares regularmente, pero puedes decirle a Cwtch que lo intente antes presionando este botón.",
"localeJa": "Japonés \/ 日本語",
"localeSv": "Sueco \/ Svenska",
"localeSw": "Suajili \/ Kiswahili",
"localeUk": "Ucraniano \/ українською",
"defaultPreserveHistorySetting": "Preservar el historial de conversaciones",
"preserveHistorySettingDescription": "De forma predeterminada, Cwtch borrará el historial de conversaciones cuando se cierre Cwtch. Si esta configuración está habilitada, Cwtch preservará el historial de conversaciones de pares.",
"serverinfoNoGroupInfo": "No hay grupos asociados co este servidor de Cwtch.",
"cannotDeleteServerIfActiveGroups": "Hay grupos activos asociados con este servidor de Cwtch. Elimínalos antes de eliminar esta entrada del servidor de Cwtch.",
"profileAppearOffline": "Aparecer sin conexión",
"profileAppearOfflineDescription": "De forma predeterminada, cuando el perfil Cwtch está habilitado, intenta conectarse automáticamente para conocer contactos y permite conexiones entrantes. Esta configuración desactiva esas acciones y te permite elegir, manualmente, a qué contactos conectarte.",
"contactDisconnect": "Desconectarse del contacto (si no tienes configurado Aparecer sin conexión, es posible que este contacto aún pueda restablecer la conexión contigo)",
"profileAppearOnline": "Aparecer en línea",
"profileEnableProfile": "Habilitar perfil",
"profileDisableProfile": "Deshabilitar perfil",
"profileBlockUnknownContacts": "Bloquear contactos desconocidos",
"profileAllowUnknownContacts": "Permitir contactos desconocidos",
"profileOfflineAtStart": "Aparecer sin conexión al iniciar",
"xDaysAgo": "Hace $days días",
"xHoursAgo": "Hace $hours horas",
"xMinutesAgo": "Hace $minutes minutos",
"xSecondsAgo": "Hace $seconds segundos",
"now": "Ahora",
"localeUzbek": "Uzbeko \/ O'zbekcha",
"tooltipPinConversation": "Fija la conversación en la parte superior de \"Conversaciones\"",
"errorDownloadDirectoryDoesNotExist": "No se puede habilitar el uso compartido de archivos porque la carpeta de descarga no se ha configurado o se configuró en una carpeta que no existe.",
"acquiringTicketsFromServer": "Realizando Desafío Antispam",
@ -117,8 +164,6 @@
"torSettingsCustomControlPort": "Puerto de control personalizado",
"torSettingsCustomSocksPortDescription": "Usar un puerto personalizad para conexiones de datos al proxy Tor",
"serverMetricsLabel": "Métricas del servidor",
"groupsOnThisServerLabel": "Grupos alojados en este servidor en los que estoy",
"deleteServerConfirmBtn": "Realmente eliminar el servidor",
"settingServersDescription": "El experimento de alojar servidores permite alojar y administrar servidores de Cwtch",
"settingServers": "Alojar Servidores",
"unlockProfileTip": "Crea o desbloquea un perfil para comenzar!",
@ -280,7 +325,6 @@
"addPeer": "Agregar Contacto",
"blocked": "Bloqueado",
"addPeerTab": "Agregar Contacto",
"defaultScalingText": "Tamaño predeterminado de texto (factor de escala:",
"todoPlaceholder": "Por hacer...",
"bulletinsBtn": "Boletines",
"radioNoPassword": "Sin cifrado (sin contraseña)",

View File

@ -1,6 +1,54 @@
{
"@@locale": "fr",
"@@last_modified": "2023-03-27T20:38:31+02:00",
"@@last_modified": "2024-02-12T08:05:24+01:00",
"settingsExperimentsShowPerformanceDescription": "Display an overlay graph of render time.",
"settingsExperimentsShowPerformanceTitle": "Show Performance Overlay",
"settingsImportThemeButton": "Import Theme",
"settingsImportThemeDescription": "Select theme directory to import for use in Cwtch",
"settingsImportThemeTitle": "Import Theme",
"settingsThemeErrorInvalid": "Error: Could not import $themeName, theme.yml missing, not a theme directory",
"settingThemeOverwriteQuestion": "Theme $themeName already exists, confirm overwrite?",
"settingThemeOverwriteConfirm": "Confirm",
"settingsThemeImagesDescription": "Enable display of images from themes",
"settingsThemeImages": "Theme Images",
"settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup",
"now": "Now",
"xSecondsAgo": "$seconds seconds ago",
"xMinutesAgo": "$minutes minutes ago",
"xHoursAgo": "$hours hours ago",
"xDaysAgo": "$days days ago",
"profileAllowUnknownContacts": "Allow Unknown Contacts",
"profileBlockUnknownContacts": "Block Unknown Contacts",
"profileDisableProfile": "Disable Profile",
"profileEnableProfile": "Enable Profile",
"profileAppearOnline": "Appear Online",
"contactDisconnect": "Disconnect from Contact (if you do not have Appear Offline set this contact may still be able to reestablish a connection to you)",
"profileAppearOfflineDescription": "By default, when Cwtch profile is enabled it automatically attempts to connect to know contacts, and allows inbound connections. This settings disables those actions and allows you to choose, manually, which contacts to connect to.",
"profileAppearOffline": "Appear Offline",
"deleteServerConfirmBtn": "Supprimer vraiment le serveur",
"cannotDeleteServerIfActiveGroups": "There are active groups associated with this Cwtch Server. Please delete them prior to deleting this Cwtch Server entry.",
"groupsOnThisServerLabel": "Les groupes dont je fais partie sont hébergés sur ce serveur",
"serverinfoNoGroupInfo": "There are no groups associated with this Cwtch Server.",
"preserveHistorySettingDescription": "By default, Cwtch will purge conversation history when Cwtch is shutdown. If this setting is enabled, Cwtch will preserve the conversation history of peer conversations.",
"defaultPreserveHistorySetting": "Preserve Conversation History",
"localeUk": "Ukrainian \/ українською",
"profileEnabledDescription": "Activate or Deactivate the profile.",
"localeSw": "Swahili \/ Kiswahili",
"localeSv": "Swedish \/ Svenska",
"fontScalingDescription": "Adjust the relative font scaling factor applied to text and widgets.",
"defaultScalingText": "Taille par défaut du texte (échelle:",
"localeJa": "Japanese \/ 日本語",
"retryConnectionTooltip": "Cwtch retries peers regularly, but you can tell Cwtch to try sooner by pushing this button.",
"retryConnection": "Retry",
"availabilityStatusTooltip": "Set your availability status",
"profileInfoHint3": "Contacts will be able to see this information in Conversation Settings ",
"profileInfoHint2": "You can add up to 3 fields.",
"profileInfoHint": "Add some public information about yourself here e.g. blog, websites, brief bio.",
"availabilityStatusBusy": "Busy",
"availabilityStatusAway": "Away",
"availabilityStatusAvailable": "Available",
"blodeuweddWarning": "Blodeuwedd uses a local language model and a set of small auxiliary models to power its functionality. These techniques are often very effective they are not without error. \n\nWhile we have taken efforts to minimize the risk, there is still the possibility that Blodeuwedd outputs will be incorrect, hallucinated and\/or offensive.\n\nBecause of that Blodeuwedd requires downloading two additional components separate from Cwtch, the Blodeuwedd Model (or a compatible model) and the Blodeuwedd Runner. \n\nSee https:\/\/docs.cwtch.im\/docs\/settings\/experiments\/blodeuwedd for more information on obtaining these components and setting them up.",
"blodeuweddProcessing": "Blodeuwedd is processing...",
"blodeuweddTranslate": "Translate Message",
@ -11,7 +59,6 @@
"blodeuweddExperimentEnable": "Blodeuwedd Assistant",
"localeKo": "Korean \/ 한국어",
"localeSk": "Slovak \/ Slovák",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
@ -153,7 +200,6 @@
"importLocalServerSelectText": "Sélectionnez le serveur local",
"importLocalServerLabel": "Importer un serveur hébergé localement",
"importLocalServerButton": "Importer %1",
"groupsOnThisServerLabel": "Les groupes dont je fais partie sont hébergés sur ce serveur",
"fieldDescriptionLabel": "Description",
"savePeerHistoryDescription": "Détermine s'il faut ou non supprimer tout historique associé au contact.",
"newMessagesLabel": "Nouveaux messages",
@ -166,7 +212,6 @@
"enterCurrentPasswordForDeleteServer": "Veuillez saisir le mot de passe actuel pour supprimer ce serveur",
"encryptedServerDescription": "Le chiffrement dun serveur avec un mot de passe le protège des autres personnes qui peuvent également utiliser cet appareil. Les serveurs cryptés ne peuvent pas être déchiffrés, affichés ou accessibles tant que le mot de passe correct nest pas entré pour les déverrouiller.",
"deleteServerSuccess": "Le serveur a été supprimé avec succès",
"deleteServerConfirmBtn": "Supprimer vraiment le serveur",
"unlockServerTip": "Veuillez créer ou déverrouiller un serveur pour commencer !",
"unlockProfileTip": "Veuillez créer ou déverrouiller un profil pour commencer !",
"settingServersDescription": "L'expérience des serveurs d'hébergement permet d'héberger et de gérer les serveurs Cwtch.",
@ -349,7 +394,6 @@
"notificationNewMessageFromPeer": "Nouveau message d'un contact !",
"notificationNewMessageFromGroup": "Nouveau message dans un groupe !",
"smallTextLabel": "Petit",
"defaultScalingText": "Taille par défaut du texte (échelle:",
"largeTextLabel": "Large",
"cwtchSettingsTitle": "Préférences Cwtch",
"saveBtn": "Sauvegarder",

View File

@ -1,22 +1,69 @@
{
"@@locale": "it",
"@@last_modified": "2023-03-27T20:38:31+02:00",
"blodeuweddWarning": "Blodeuwedd uses a local language model and a set of small auxiliary models to power its functionality. These techniques are often very effective they are not without error. \n\nWhile we have taken efforts to minimize the risk, there is still the possibility that Blodeuwedd outputs will be incorrect, hallucinated and\/or offensive.\n\nBecause of that Blodeuwedd requires downloading two additional components separate from Cwtch, the Blodeuwedd Model (or a compatible model) and the Blodeuwedd Runner. \n\nSee https:\/\/docs.cwtch.im\/docs\/settings\/experiments\/blodeuwedd for more information on obtaining these components and setting them up.",
"blodeuweddProcessing": "Blodeuwedd is processing...",
"blodeuweddTranslate": "Translate Message",
"blodeuweddSummarize": "Summarize Conversation",
"blodeuweddPath": "The directory where the Blodeuwedd is located on your computer.",
"blodeuweddNotSupported": "This version of Cwtch has been compiled without support for the Blodeuwedd Assistant.",
"blodeuweddDescription": "The Blodeuwedd assistant adds new features to Cwtch such as chat transcript summarization and message translation via a locally hosted language model.",
"blodeuweddExperimentEnable": "Blodeuwedd Assistant",
"localeKo": "Korean \/ 한국어",
"localeSk": "Slovak \/ Slovák",
"profileEnabledDescription": "Start or stop the profile",
"profileAutostartDescription": "Controls if the profile will be automatically launched on startup",
"profileEnabled": "Enable",
"profileAutostartLabel": "Autostart",
"localePtBr": "Brazilian Portuguese \/ Português do Brasil",
"localeNl": "Dutch \/ Dutch",
"@@last_modified": "2024-02-12T08:05:24+01:00",
"settingsExperimentsShowPerformanceDescription": "Display an overlay graph of render time.",
"settingsExperimentsShowPerformanceTitle": "Show Performance Overlay",
"settingsImportThemeButton": "Import Theme",
"settingsImportThemeDescription": "Select theme directory to import for use in Cwtch",
"settingsImportThemeTitle": "Import Theme",
"settingsThemeErrorInvalid": "Error: Could not import $themeName, theme.yml missing, not a theme directory",
"settingThemeOverwriteQuestion": "Theme $themeName already exists, confirm overwrite?",
"settingThemeOverwriteConfirm": "Confirm",
"settingsThemeImagesDescription": "Enable display of images from themes",
"settingsThemeImages": "Theme Images",
"settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup",
"now": "Now",
"xSecondsAgo": "$seconds seconds ago",
"xMinutesAgo": "$minutes minutes ago",
"xHoursAgo": "$hours hours ago",
"xDaysAgo": "$days days ago",
"profileAllowUnknownContacts": "Allow Unknown Contacts",
"profileBlockUnknownContacts": "Block Unknown Contacts",
"profileDisableProfile": "Disable Profile",
"profileEnableProfile": "Enable Profile",
"profileAppearOnline": "Appear Online",
"contactDisconnect": "Disconnect from Contact (if you do not have Appear Offline set this contact may still be able to reestablish a connection to you)",
"profileAppearOfflineDescription": "By default, when Cwtch profile is enabled it automatically attempts to connect to know contacts, and allows inbound connections. This settings disables those actions and allows you to choose, manually, which contacts to connect to.",
"profileAppearOffline": "Appear Offline",
"deleteServerConfirmBtn": "Elimina davvero il server",
"cannotDeleteServerIfActiveGroups": "There are active groups associated with this Cwtch Server. Please delete them prior to deleting this Cwtch Server entry.",
"groupsOnThisServerLabel": "Gruppi di cui sono parte su questo server",
"serverinfoNoGroupInfo": "There are no groups associated with this Cwtch Server.",
"preserveHistorySettingDescription": "By default, Cwtch will purge conversation history when Cwtch is shutdown. If this setting is enabled, Cwtch will preserve the conversation history of peer conversations.",
"defaultPreserveHistorySetting": "Preserve Conversation History",
"retryConnectionTooltip": "Cwtch riprova i peer regolarmente, ma puoi dire a Cwtch di provare prima premendo questo pulsante.",
"localeJa": "Giapponese \/ 日本語",
"fontScalingDescription": "Regola il fattore di scala relativo dei caratteri applicato al testo e ai widget.",
"localeSv": "Svedese \/ Svenska",
"localeSw": "Swahili \/ Kiswahili",
"localeUk": "Ucraino \/українською",
"localeNl": "Olandese \/ Dutch",
"localePtBr": "Portoghese brasiliano \/ Português do Brasil",
"profileAutostartLabel": "Avvio automatico",
"profileEnabled": "Abilita",
"profileAutostartDescription": "Controlla se il profilo verrà lanciato automaticamente all'avvio.",
"profileEnabledDescription": "Attiva o disattiva il profilo.",
"localeSk": "Slovacco \/ Slovák",
"localeKo": "Coreano \/ 한국어",
"blodeuweddExperimentEnable": "Assistente Blodeuwedd",
"blodeuweddDescription": "L'assistente Blodeuwedd aggiunge nuove funzionalità a Cwtch come il riepilogo della trascrizione della chat e la traduzione dei messaggi tramite un modello linguistico ospitato localmente.",
"blodeuweddNotSupported": "Questa versione di Cwtch è stata compilata senza il supporto per l'assistente Blodeuwedd.",
"blodeuweddPath": "La directory in cui si trova Blodeuwedd sul tuo computer.",
"blodeuweddSummarize": "Riassumi la conversazione",
"blodeuweddTranslate": "Traduci il messaggio",
"blodeuweddProcessing": "Blodeuwedd sta elaborando...",
"blodeuweddWarning": "Blodeuwedd utilizza un modello linguistico locale e una serie di piccoli modelli ausiliari per alimentare la sua funzionalità. Queste tecniche sono spesso molto efficaci ma non prive di errori. \n\nSebbene ci siamo impegnati per ridurre al minimo il rischio, esiste ancora la possibilità che i risultati di Blodeuwedd siano errati, allucinati e\/o offensivi. \n\nPer questo Blodeuwedd richiede il download di due componenti aggiuntivi separati da Cwtch, il Blodeuwedd Model (o un modello compatibile) e il Blodeuwedd Runner. \n\nVedere https:\/\/docs.cwtch.im\/docs\/settings\/experiments\/blodeuwedd per ulteriori informazioni su come ottenere questi componenti e configurarli.",
"availabilityStatusAvailable": "Disponibile",
"availabilityStatusAway": "Assente",
"availabilityStatusBusy": "Non disponibile",
"availabilityStatusTooltip": "Imposta il tuo stato di disponibilità",
"profileInfoHint": "Aggiungi qui alcune informazioni personali pubbliche, ad esempio blog, siti web, breve biografia.",
"profileInfoHint2": "È possibile aggiungere fino a 3 campi.",
"profileInfoHint3": "I contatti potranno vedere queste informazioni nelle Impostazioni di conversazione. ",
"retryConnection": "Riprova",
"defaultScalingText": "Testo di dimensioni predefinite (fattore di scala:",
"tooltipPinConversation": "Aggiungi la conversazione in cima alla lista \"Conversazioni\"",
"tooltipUnpinConversation": "Rimuovi la conversazione dalla cima della lista \"Conversazioni\"",
"errorDownloadDirectoryDoesNotExist": "La condivisione file non può essere abilitata perché la destinazione dei download non è stata impostata o è impostata su una cartella che non esiste.",
@ -191,7 +238,6 @@
"profileOnionLabel": "Invia questo indirizzo ai contatti con cui vuoi connetterti",
"importLocalServerLabel": "Importa un server ospitato localmente",
"importLocalServerButton": "Importa %1",
"groupsOnThisServerLabel": "Gruppi di cui sono parte su questo server",
"fieldDescriptionLabel": "Descrizione",
"displayNameTooltip": "Inserisci un nome visualizzato",
"manageKnownServersShort": "Server",
@ -253,7 +299,6 @@
"copyAddress": "Copia indirizzo",
"enterCurrentPasswordForDeleteServer": "Inserisci la password attuale per eliminare questo server",
"deleteServerSuccess": "Server eliminato con successo",
"deleteServerConfirmBtn": "Elimina davvero il server",
"encryptedServerDescription": "Criptare un server con una password lo protegge da altre persone che potrebbero usare questo dispositivo. I server criptati non possono essere decriptati, visualizzati o accessibili finché non viene inserita la password corretta per sbloccarli.",
"fileSavedTo": "Salvato in",
"fileInterrupted": "Interrotto",
@ -368,7 +413,6 @@
"largeTextLabel": "Grande",
"themeLight": "Chiaro",
"themeDark": "Scuro",
"defaultScalingText": "Testo di dimensioni predefinite (fattore di scala:",
"smallTextLabel": "Piccolo",
"loadingTor": "Caricamento di tor...",
"networkStatusDisconnected": "Disconnesso da Internet, controlla la tua connessione",

421
lib/l10n/intl_ja.arb Normal file
View File

@ -0,0 +1,421 @@
{
"@@locale": "ja",
"@@last_modified": "2024-02-12T08:05:24+01:00",
"settingsExperimentsShowPerformanceDescription": "Display an overlay graph of render time.",
"settingsExperimentsShowPerformanceTitle": "Show Performance Overlay",
"settingsImportThemeButton": "Import Theme",
"settingsImportThemeDescription": "Select theme directory to import for use in Cwtch",
"settingsImportThemeTitle": "Import Theme",
"settingsThemeErrorInvalid": "Error: Could not import $themeName, theme.yml missing, not a theme directory",
"settingThemeOverwriteQuestion": "Theme $themeName already exists, confirm overwrite?",
"settingThemeOverwriteConfirm": "Confirm",
"settingsThemeImagesDescription": "Enable display of images from themes",
"settingsThemeImages": "Theme Images",
"settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup",
"now": "Now",
"xSecondsAgo": "$seconds seconds ago",
"xMinutesAgo": "$minutes minutes ago",
"xHoursAgo": "$hours hours ago",
"xDaysAgo": "$days days ago",
"profileAllowUnknownContacts": "Allow Unknown Contacts",
"profileBlockUnknownContacts": "Block Unknown Contacts",
"profileDisableProfile": "Disable Profile",
"profileEnableProfile": "Enable Profile",
"profileAppearOnline": "Appear Online",
"contactDisconnect": "Disconnect from Contact (if you do not have Appear Offline set this contact may still be able to reestablish a connection to you)",
"profileAppearOfflineDescription": "By default, when Cwtch profile is enabled it automatically attempts to connect to know contacts, and allows inbound connections. This settings disables those actions and allows you to choose, manually, which contacts to connect to.",
"profileAppearOffline": "Appear Offline",
"deleteServerConfirmBtn": "Really Delete Server?",
"cannotDeleteServerIfActiveGroups": "There are active groups associated with this Cwtch Server. Please delete them prior to deleting this Cwtch Server entry.",
"groupsOnThisServerLabel": "Known Groups on this Cwtch Server",
"serverinfoNoGroupInfo": "There are no groups associated with this Cwtch Server.",
"preserveHistorySettingDescription": "By default, Cwtch will purge conversation history when Cwtch is shutdown. If this setting is enabled, Cwtch will preserve the conversation history of peer conversations.",
"defaultPreserveHistorySetting": "Preserve Conversation History",
"localeUk": "Ukrainian \/ українською",
"profileEnabledDescription": "Activate or Deactivate the profile.",
"localeSw": "Swahili \/ Kiswahili",
"localeSv": "Swedish \/ Svenska",
"fontScalingDescription": "Adjust the relative font scaling factor applied to text and widgets.",
"defaultScalingText": "Font Scaling",
"localeJa": "Japanese \/ 日本語",
"retryConnectionTooltip": "Cwtch retries peers regularly, but you can tell Cwtch to try sooner by pushing this button.",
"retryConnection": "Retry",
"fileDownloadUnavailable": "このファイルはダウンロードできないようです。送信者がこのファイルのダウンロードを無効にしている可能性があります。",
"localeRo": "ルーマニア語 \/ Română",
"localeRU": "ロシア語 \/ Русский",
"localeCy": "ウェールズ語 \/ Cymraeg",
"settingAndroidPowerExemptionDescription": "オプションです: Cwtchを最適化された電力管理から除外するようAndroidに要求します。これにより、バッテリーの使用量が増える代わりに、安定性が向上します。",
"settingImagePreviewsDescription": "画像やプロフィール画像は自動的にダウンロードされ、プレビューされます。信頼できない連絡先でCwtchを使用する場合は、この実験を有効にしないことをお勧めします。",
"profileAutostartLabel": "オートスタート",
"blodeuweddExperimentEnable": "Blodeuwedd アシスタント\n",
"serverLabel": "サーバー",
"serverAutostartLabel": "オートストラット",
"serverAutostartDescription": "アプリケーションが起動時に自動的にサーバーを起動するかどうかを制御します。",
"encryptedServerDescription": "パスワードでサーバーを暗号化することで、このデバイスを使用する可能性のある他の人からもサーバーを保護します。暗号化されたサーバーは、正しいパスワードを入力してロックを解除するまで、暗号化解除、表示、アクセスすることができません。",
"plainServerDescription": "Cwtchサーバーは、パスワードで保護することをお勧めします。このサーバーにパスワードを設定しない場合、このデバイスにアクセスできる人は、機密性の高い暗号鍵を含むこのサーバーに関する情報にアクセスできる可能性があります。",
"manageKnownServersShort": "サーバズ",
"radioUsePassword": "パスワ-ド",
"noPasswordWarning": "このアカウントでパスワードを使用しないことは、ローカルに保存されたすべてのデータが暗号化されないことを意味する",
"zoomLabel": "インターフェイスズーム(主にテキストやボタンのサイズに影響します。)",
"addServerFirst": "グループを作成する前に、サーバーを追加する必要があります",
"nickChangeSuccess": "プロフィールニックネームの変更に成功",
"createProfileToBegin": "プロフィールを作成または解除して始めてください",
"shutdownCwtchDialog": "本当にCwtchをシャットダウンするのですかすべての接続を終了し、アプリケーションを終了します。",
"groupInviteSettingsWarning": "あなたはグループに招待されています!この招待状を表示するには、設定からグループチャット実験を有効にしてください。",
"localePtBr": "ブラジル・ポルトガル語 \/ Português do Brasil",
"profileAutostartDescription": "起動時にプロファイルを自動的に起動させるかどうかを制御します。",
"blodeuweddProcessing": "Blodeuweddが加工している。。。",
"blodeuweddPath": "Blodeuwedd がコンピュータに配置されているディレクトリです。",
"blodeuweddNotSupported": "このバージョンのCwtchは、Blodeuwedd Assistantをサポートせずにコンパイルされています。",
"yesLeave": "はい、この会話を残して",
"chatHistoryDefault": "この会話は、Cwtchが終了すると削除されますメッセージの履歴は、右上の設定メニューから会話ごとに有効にすることができます。",
"descriptionBlockUnknownConnections": "このオプションをオンにすると、連絡先リストに追加されていないCwtchユーザーからの接続を自動的に閉じます。",
"descriptionExperimentsGroups": "グループ実験では、Cwtchが信頼されていないサーバーインフラと接続することで、複数のコンタクトとのコミュニケーションを円滑にすることができます。",
"descriptionExperiments": "Cwtch実験は、従来の1:1メタデータ耐性チャットとは異なるプライバシーへの配慮が必要なCwtchに追加機能を追加するオプション、オプトイン機能ですグループチャット、ボット統合など。",
"invitation": "インビテーション",
"server": "サーバー",
"peerName": "名前",
"joinGroupTab": "グループに参加する",
"createGroupTab": "グループを作成する",
"blodeuweddDescription": "Blodeuweddアシスタントは、ローカルにホストされた言語モデルによるチャット記録の要約やメッセージの翻訳など、Cwtchに新しい機能を追加します。",
"blodeuweddSummarize": "会話を要約する",
"blodeuweddWarning": "Blodeuweddは、ローカル言語モデルと小さな補助モデルのセットを使用して、その機能を強化しています。これらの技術はしばしば非常に効果的ですが、エラーがないわけではありません。\n\n私たちはリスクを最小限にする努力をしましたが、Blodeuweddの出力が不正確であったり、幻覚であったり、不快であったりする可能性はまだあります。\n\nそのため、BlodeuweddはCwtchとは別に、Blodeuweddモデルまたは互換性のあるモデルとBlodeuweddランナーという二つの追加コンポーネントをダウンロードする必要があります。\n\nこれらのコンポーネントの入手とセットアップの詳細については、https:\/\/docs.cwtch.im\/docs\/settings\/experiments\/blodeuwedd を参照してください。",
"profileInfoHint2": "最大3つのフィールドを追加することができます。",
"titlePlaceholder": "タイトル。。。",
"blocked": "ちっそく",
"pasteAddressToAddContact": "新しい会話を追加するために、Cwtchアドレス、招待状、キーバンドルをここに貼り付けます。",
"addPeerTab": "コンタクトを追加する",
"profileOnionLabel": "Send this address to people you want to connect with",
"createGroupBtn": "生み出す",
"createGroupTitle": "グループを作成する",
"defaultGroupName": "オーサムグループ",
"profileInfoHint3": "連絡先は、会話設定で確認することができます",
"availabilityStatusTooltip": "稼働状況を設定する",
"blodeuweddTranslate": "メッセージを翻訳する",
"availabilityStatusAvailable": "利用可能",
"availabilityStatusBusy": "忙しい",
"availabilityStatusAway": "アウェイ",
"profileInfoHint": "ブログ、ウェブサイト、簡単な経歴など、ご自身に関する公開情報をここに追加してください。",
"localeKo": "Korean \/ 한국어",
"localeSk": "Slovak \/ Slovák",
"profileEnabled": "Enable",
"localeNl": "Dutch \/ Dutch",
"experimentQRCodeDescription": "QR Code support allows sharing data (such as profile identity) by QR Codes",
"enableExperimentQRCode": "QR Codes",
"shareMenuQRCode": "Show QR Code",
"shareProfileMenuTooltop": "Share profile via...",
"acquiredTicketsFromServer": "Antispam Challenge Complete",
"acquiringTicketsFromServer": "Performing Antispam Challenge",
"errorDownloadDirectoryDoesNotExist": "Filesharing cannot be enabled because the Download Folder has not been set, or is set to a folder that does not exist.",
"localeTr": "トルコ語 \/ Türk",
"localeIt": "Italian \/ Italiano",
"tooltipUnpinConversation": "Unpin conversation from the top of \"Conversations\"",
"tooltipPinConversation": "Pin conversation to the top of \"Conversations\"",
"replyingTo": "Replying to %1",
"messageNoReplies": "There are no replies to this message.",
"headingReplies": "Replies",
"viewReplies": "View replies to this message",
"restartFileShare": "Start Sharing File",
"stopSharingFile": "Stop Sharing File",
"manageSharedFiles": "Manage Shared Files",
"localeDe": "German \/ Deutsch",
"localeEn": "English \/ English",
"localeLb": "Luxembourgish \/ Lëtzebuergesch",
"localeNo": "Norwegian \/ Norsk",
"localeEl": "Greek \/ Ελληνικά",
"localePl": "Polish \/ Polski",
"localeEs": "Spanish \/ Español",
"localeDa": "Danish \/ Dansk",
"localePt": "Portuguese \/ Portuguesa",
"localeFr": "French \/ Français",
"tooltipPreviewFormatting": "Preview Message Formatting",
"tooltipCode": "Code \/ Monospace",
"tooltipStrikethrough": "Strikethrough",
"tooltipSubscript": "Subscript",
"tooltipSuperscript": "Superscript",
"tooltipItalicize": "Italic",
"tooltipBackToMessageEditing": "Back to Message Editing",
"tooltipBoldText": "Bold",
"okButton": "OK",
"settingsAndroidPowerReenablePopup": "Cannot re-enable Battery Optimization from within Cwtch. Please go to Android \/ Settings \/ Apps \/ Cwtch \/ Battery and set Usage to 'Optimized'",
"settingAndroidPowerExemption": "Android Ignore Battery Optimizations",
"thisFeatureRequiresGroupExpermientsToBeEnabled": "This feature requires the Groups Experiment to be enabled in Settings",
"messageFormattingDescription": "Enable rich text formatting in displayed messages e.g. **bold** and *italic*",
"formattingExperiment": "Message Formatting",
"clickableLinkError": "Error encountered while attempting to open URL",
"clickableLinksCopy": "Copy URL",
"clickableLinkOpen": "Open URL",
"clickableLinksWarning": "Opening this URL will launch an application outside of Cwtch and may reveal metadata or otherwise compromise the security of Cwtch. Only open URLs from people you trust. Are you sure you want to continue?",
"shuttingDownApp": "Shutting down...",
"successfullyImportedProfile": "Successfully Imported Profile: %profile",
"failedToImportProfile": "Error Importing Profile",
"importProfileTooltip": "Use an encrypted Cwtch backup to bring in a profile created in another instance of Cwtch.",
"importProfile": "Import Profile",
"exportProfileTooltip": "Backup this profile to an encrypted file. The encrypted file can be imported into another Cwtch app.",
"exportProfile": "Export Profile",
"newMessageNotificationConversationInfo": "New Message From %1",
"newMessageNotificationSimple": "New Message",
"notificationContentContactInfo": "Conversation Information",
"notificationContentSimpleEvent": "Plain Event",
"conversationNotificationPolicySettingDescription": "Control notification behaviour for this conversation",
"conversationNotificationPolicySettingLabel": "Conversation Notification Policy",
"settingsGroupExperiments": "Experiments",
"settingsGroupAppearance": "Appearance",
"settingGroupBehaviour": "Behaviour",
"notificationContentSettingDescription": "Controls the contents of conversation notifications",
"notificationPolicySettingDescription": "Controls the default application notification behaviour",
"notificationContentSettingLabel": "Notification Content",
"notificationPolicySettingLabel": "Notification Policy",
"conversationNotificationPolicyNever": "Never",
"conversationNotificationPolicyOptIn": "Opt In",
"conversationNotificationPolicyDefault": "Default",
"notificationPolicyDefaultAll": "Default All",
"notificationPolicyOptIn": "Opt In",
"notificationPolicyMute": "Mute",
"tooltipSelectACustomProfileImage": "Select a Custom Profile Image",
"torSettingsEnabledCacheDescription": "Cache the current downloaded Tor consensus to reuse next time Cwtch is opened. This will allow Tor to start faster. When disabled, Cwtch will purge cached data on start up.",
"torSettingsEnableCache": "Cache Tor Consensus",
"labelTorNetwork": "Tor Network",
"descriptionACNCircuitInfo": "In depth information about the path that the anonymous communication network is using to connect to this conversation.",
"labelACNCircuitInfo": "ACN Circuit Info",
"fileSharingSettingsDownloadFolderTooltip": "Browse to select a different default folder for downloaded files.",
"fileSharingSettingsDownloadFolderDescription": "When files are downloaded automatically (e.g. image files, when image previews are enabled) a default location to download the files to is needed.",
"torSettingsErrorSettingPort": "Port Number must be between 1 and 65535",
"torSettingsUseCustomTorServiceConfigurastionDescription": "Override the default tor configuration. Warning: This could be dangerous. Only turn this on if you know what you are doing.",
"torSettingsUseCustomTorServiceConfiguration": "Use a Custom Tor Service Configuration (torrc)",
"torSettingsCustomControlPortDescription": "Use a custom port for control connections to the Tor proxy",
"torSettingsCustomControlPort": "Custom Control Port",
"torSettingsCustomSocksPortDescription": "Use a custom port for data connections to the Tor proxy",
"torSettingsCustomSocksPort": "Custom SOCKS Port",
"torSettingsEnabledAdvancedDescription": "Use an existing Tor service on your system, or change the parameters of the Cwtch Tor Service",
"torSettingsEnabledAdvanced": "Enable Advanced Tor Configuration",
"msgAddToAccept": "Add this account to your contacts in order to accept this file.",
"btnSendFile": "Send File",
"msgConfirmSend": "Are you sure you want to send",
"msgFileTooBig": "File size cannot exceed 10 GB",
"storageMigrationModalMessage": "Migrating profiles to new storage format. This could take a few minutes...",
"loadingCwtch": "Loading Cwtch...",
"themeColorLabel": "Color Theme",
"themeNameNeon2": "Neon2",
"themeNameNeon1": "Neon1",
"themeNameMidnight": "Midnight",
"themeNameMermaid": "Mermaid",
"themeNamePumpkin": "Pumpkin",
"themeNameGhost": "Ghost",
"themeNameVampire": "Vampire",
"themeNameWitch": "Witch",
"themeNameCwtch": "Cwtch",
"settingDownloadFolder": "Download Folder",
"settingImagePreviews": "Image Previews and Profile Pictures",
"experimentClickableLinksDescription": "The clickable links experiment allows you to click on URLs shared in messages",
"enableExperimentClickableLinks": "Enable Clickable Links",
"serverConnectionsLabel": "Connection",
"serverTotalMessagesLabel": "Total Messages",
"serverMetricsLabel": "Server Metrics",
"manageKnownServersLong": "Manage Known Servers",
"displayNameTooltip": "Please enter a display name",
"manageKnownServersButton": "Manage Known Servers",
"fieldDescriptionLabel": "Description",
"importLocalServerButton": "Import %1",
"importLocalServerSelectText": "Select Local Server",
"importLocalServerLabel": "Import a locally hosted server",
"newMessagesLabel": "New Messages",
"copyServerKeys": "Copy keys",
"verfiyResumeButton": "Verify\/resume",
"fileCheckingStatus": "Checking download status",
"fileInterrupted": "Interrupted",
"fileSavedTo": "Saved to",
"deleteServerSuccess": "Successfully deleted server",
"enterCurrentPasswordForDeleteServer": "Please enter current password to delete this server",
"copyAddress": "Copy Address",
"settingServersDescription": "The hosting servers experiment enables hosting and managing Cwtch servers",
"settingServers": "Hosting Servers",
"enterServerPassword": "Enter password to unlock server",
"unlockProfileTip": "Please create or unlock a profile to begin!",
"unlockServerTip": "Please create or unlock a server to begin!",
"addServerTooltip": "Add new server",
"serversManagerTitleShort": "Servers",
"serversManagerTitleLong": "Servers You Host",
"saveServerButton": "Save Server",
"serverEnabledDescription": "Start or stop the server",
"serverEnabled": "Server Enabled",
"serverDescriptionDescription": "Your description of the server for personal management use only, will never be shared",
"serverDescriptionLabel": "Server Description",
"serverAddress": "Server Address",
"editServerTitle": "Edit Server",
"addServerTitle": "Add Server",
"newPassword": "新しいパスワード",
"placeholderEnterMessage": "Type a message...",
"downloadFileButton": "ダウンロード",
"deleteBtn": "削除",
"deleteConfirmText": "削除",
"peerAddress": "アドレス",
"groupAddr": "アドレス",
"addressLabel": "アドレス",
"titleManageProfilesShort": "Profiles",
"descriptionFileSharing": "The file sharing experiment allows you to send and receive files from Cwtch contacts and groups. Note that sharing a file with a group will result in members of that group connecting with you directly over Cwtch to download it.",
"settingFileSharing": "File Sharing",
"tooltipSendFile": "Send File",
"messageFileOffered": "Contact is offering to send you a file",
"messageFileSent": "You sent a file",
"messageEnableFileSharing": "Enable the file sharing experiment to view this message.",
"labelFilesize": "Size",
"labelFilename": "Filename",
"openFolderButton": "Open Folder",
"retrievingManifestMessage": "Retrieving file information...",
"descriptionStreamerMode": "If turned on, this option makes the app more visually private for streaming or presenting with, for example, hiding profile and contact addresses",
"streamerModeLabel": "Streamer\/Presentation Mode",
"archiveConversation": "Archive this Conversation",
"blockUnknownConnectionsEnabledDescription": "Connections from unknown contacts are blocked. You can change this in Settings",
"showMessageButton": "Show Message",
"blockedMessageMessage": "This message is from a profile you have blocked.",
"plainProfileDescription": "We recommend that you protect your Cwtch profiles with a password. If you do not set a password on this profile then anyone who has access to this device may be able to access information about this profile, including contacts, messages and sensitive cryptographic keys.",
"encryptedProfileDescription": "Encrypting a profile with a password protects it from other people who may also use this device. Encrypted profiles cannot be decrypted, displayed or accessed until the correct password is entered to unlock them.",
"addContactConfirm": "Add contact %1",
"addContact": "Add contact",
"contactGoto": "Go to conversation with %1",
"settingUIColumnOptionSame": "Same as portrait mode setting",
"settingUIColumnDouble14Ratio": "Double (1:4)",
"settingUIColumnDouble12Ratio": "Double (1:2)",
"settingUIColumnSingle": "Single",
"settingUIColumnLandscape": "UI Columns in Landscape Mode",
"settingUIColumnPortrait": "UI Columns in Portrait Mode",
"tooltipRemoveThisQuotedMessage": "Remove quoted message.",
"tooltipReplyToThisMessage": "Reply to this message",
"tooltipRejectContactRequest": "Reject this contact request",
"tooltipAcceptContactRequest": "Accept this contact request.",
"notificationNewMessageFromGroup": "New message in a group!",
"notificationNewMessageFromPeer": "New message from a contact!",
"tooltipHidePassword": "Hide Password",
"tooltipShowPassword": "Show Password",
"shutdownCwtchAction": "Shutdown Cwtch",
"shutdownCwtchDialogTitle": "Shutdown Cwtch?",
"shutdownCwtchTooltip": "Shutdown Cwtch",
"malformedMessage": "Malformed message",
"profileDeleteSuccess": "Successfully deleted profile",
"debugLog": "Turn on console debug logging",
"torNetworkStatus": "Tor network status",
"addContactFirst": "Add or pick a contact to begin chatting.",
"deleteProfileSuccess": "Successfully deleted profile",
"sendInvite": "Send a contact or group invite",
"sendMessage": "Send Message",
"cancel": "Cancel",
"resetTor": "Reset",
"torStatus": "Tor Status",
"torVersion": "Tor Version",
"sendAnInvitation": "You sent an invitation for: ",
"contactSuggestion": "This is a contact suggestion for: ",
"rejected": "Rejected!",
"accepted": "Accepted!",
"reallyLeaveThisGroupPrompt": "Are you sure you want to leave this conversation? All messages and attributes will be deleted.",
"leaveConversation": "Leave This Conversation",
"inviteToGroup": "You have been invited to join a group:",
"titleManageServers": "Manage Servers",
"successfullAddedContact": "Successfully added ",
"titleManageProfiles": "Manage Cwtch Profiles",
"tooltipUnlockProfiles": "Unlock encrypted profiles by entering their password.",
"titleManageContacts": "Conversations",
"tooltipAddContact": "Add a new contact or conversation",
"tooltipOpenSettings": "Open the settings pane",
"contactAlreadyExists": "Contact Already Exists",
"invalidImportString": "Invalid import string",
"conversationSettings": "Conversation Settings",
"enterCurrentPasswordForDelete": "Please enter current password to delete this profile.",
"enableGroups": "Enable Group Chat",
"todoPlaceholder": "Todo...",
"addNewItem": "Add a new item to the list",
"addListItem": "Add a New List Item",
"newConnectionPaneTitle": "New Connection",
"networkStatusOnline": "Online",
"networkStatusConnecting": "Connecting to network and contacts...",
"networkStatusAttemptingTor": "Attempting to connect to Tor network",
"networkStatusDisconnected": "Disconnected from the internet, check your connection",
"viewGroupMembershipTooltip": "View Group Membership",
"loadingTor": "Loading tor...",
"smallTextLabel": "Small",
"builddate": "Built on: %2",
"version": "Version %1",
"versionTor": "Version %1 with tor %2",
"experimentsEnabled": "Enable Experiments",
"themeDark": "Dark",
"themeLight": "Light",
"settingTheme": "Use Light Themes",
"largeTextLabel": "Large",
"settingInterfaceZoom": "Zoom level",
"settingLanguage": "Language",
"blockUnknownLabel": "Block Unknown Contacts",
"versionBuilddate": "Version: %1 Built on: %2",
"cwtchSettingsTitle": "Cwtch Settings",
"unlock": "Unlock",
"yourServers": "Your Servers",
"yourProfiles": "Your Profiles",
"error0ProfilesLoadedForPassword": "0 profiles loaded with that password",
"password": "Password",
"enterProfilePassword": "Enter a password to view your profiles",
"addNewProfileBtn": "Add new profile",
"deleteProfileConfirmBtn": "Really Delete Profile",
"deleteConfirmLabel": "Type DELETE to confirm",
"deleteProfileBtn": "Delete Profile",
"passwordChangeError": "Error changing password: Supplied password rejected",
"passwordErrorMatch": "Passwords do not match",
"saveProfileBtn": "Save Profile",
"createProfileBtn": "Create Profile",
"passwordErrorEmpty": "Password cannot be empty",
"password2Label": "Reenter password",
"password1Label": "Password",
"currentPasswordLabel": "Current Password",
"yourDisplayName": "Your Display Name",
"radioNoPassword": "Unencrypted (No password)",
"editProfile": "Edit Profile",
"newProfile": "New Profile",
"defaultProfileName": "Alice",
"profileName": "Display name",
"editProfileTitle": "Edit Profile",
"addProfileTitle": "Add new profile",
"unblockBtn": "Unblock Contact",
"dontSavePeerHistory": "Delete History",
"savePeerHistoryDescription": "Determines whether to delete any history associated with the contact.",
"savePeerHistory": "Save History",
"blockBtn": "Block Contact",
"saveBtn": "Save",
"displayNameLabel": "Display Name",
"copiedToClipboardNotification": "Copied to Clipboard",
"puzzleGameBtn": "Puzzle Game",
"bulletinsBtn": "Bulletins",
"listsBtn": "Lists",
"chatBtn": "Chat",
"rejectGroupBtn": "Reject",
"acceptGroupBtn": "Accept",
"acceptGroupInviteLabel": "Do you want to accept the invitation to",
"newGroupBtn": "Create new group",
"copyBtn": "Copy",
"peerOfflineMessage": "Contact is offline, messages can't be delivered right now",
"peerBlockedMessage": "Contact is blocked",
"pendingLabel": "Pending",
"acknowledgedLabel": "Acknowledged",
"couldNotSendMsgError": "Could not send this message",
"dmTooltip": "Click to DM",
"membershipDescription": "Below is a list of users who have sent messages to the group. This list may not reflect all users who have access to the group.",
"addListItemBtn": "Add Item",
"peerNotOnline": "Contact is offline. Applications cannot be used right now.",
"searchList": "Search List",
"update": "Update",
"inviteBtn": "Invite",
"inviteToGroupLabel": "Invite to group",
"groupNameLabel": "Group Name",
"viewServerInfo": "Server Info",
"serverNotSynced": "Syncing New Messages (This can take some time)...",
"serverSynced": "Synced",
"serverConnectivityDisconnected": "Server Disconnected",
"serverConnectivityConnected": "Server Connected",
"serverInfo": "Server Information",
"invitationLabel": "Invitation",
"search": "Search...",
"postNewBulletinLabel": "Post new bulletin",
"newBulletinLabel": "New Bulletin",
"joinGroup": "Join group",
"createGroup": "Create group",
"addPeer": "Add Contact"
}

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