Compare commits

...

110 Commits

Author SHA1 Message Date
Dan Ballard 899da5fea1 linux cmake fix for arm64 compiling
continuous-integration/drone/pr Build is pending Details
continuous-integration/drone/push Build is pending Details
2024-04-21 19:34:12 -07:00
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
169 changed files with 4122 additions and 2936 deletions

View File

@ -8,7 +8,7 @@ clone:
steps: steps:
- name: clone - name: clone
image: openpriv/flutter-desktop:linux-fstable-3.13.4 image: openpriv/flutter-desktop:linux-fstable-3.19.3
environment: environment:
buildbot_key_b64: buildbot_key_b64:
from_secret: buildbot_key_b64 from_secret: buildbot_key_b64
@ -24,7 +24,7 @@ steps:
- git checkout $DRONE_COMMIT - git checkout $DRONE_COMMIT
- name: fetch - name: fetch
image: openpriv/flutter-desktop:linux-fstable-3.13.4 image: openpriv/flutter-desktop:linux-fstable-3.19.3
volumes: volumes:
- name: deps - name: deps
path: /root/.pub-cache path: /root/.pub-cache
@ -47,7 +47,7 @@ steps:
# #Todo: fix all the lint errors and add `-set_exit_status` above to enforce linting # #Todo: fix all the lint errors and add `-set_exit_status` above to enforce linting
- name: build-linux - name: build-linux
image: openpriv/flutter-desktop:linux-fstable-3.13.4 image: openpriv/flutter-desktop:linux-fstable-3.19.3
volumes: volumes:
- name: deps - name: deps
path: /root/.pub-cache path: /root/.pub-cache
@ -55,14 +55,29 @@ steps:
- flutter build linux --dart-define BUILD_VER=`cat VERSION` --dart-define BUILD_DATE=`cat COMMIT_DATE` - flutter build linux --dart-define BUILD_VER=`cat VERSION` --dart-define BUILD_DATE=`cat COMMIT_DATE`
- linux/package-release.sh - linux/package-release.sh
- mkdir -p deploy/cwtch - 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 - cp -r build/linux/x64/release/bundle/* deploy/cwtch
- cd deploy - cd deploy
- 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 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 - 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 - rm -r cwtch
- cd deb
- dpkg-deb --build cwtch
- cd ..
- mv deb/cwtch.deb cwtch-$VERSION.deb
- rm -r deb
- name: linux-ui-tests - name: linux-ui-tests
image: openpriv/flutter-desktop:linux-fstable-3.13.4 image: openpriv/flutter-desktop:linux-fstable-3.19.3
volumes: volumes:
- name: deps - name: deps
path: /root/.pub-cache path: /root/.pub-cache
@ -71,7 +86,7 @@ steps:
- ./run-tests-headless.sh "01_general|01_tor|02_global_settings|04_profile_mgmt" - ./run-tests-headless.sh "01_general|01_tor|02_global_settings|04_profile_mgmt"
- name: test-build-android - name: test-build-android
image: openpriv/flutter-desktop:linux-fstable-3.13.4 image: openpriv/flutter-desktop:linux-fstable-3.19.3
when: when:
event: pull_request event: pull_request
volumes: volumes:
@ -81,7 +96,7 @@ steps:
- flutter build apk --debug - flutter build apk --debug
- name: build-android - name: build-android
image: openpriv/flutter-desktop:linux-fstable-3.13.4 image: openpriv/flutter-desktop:linux-fstable-3.19.3
when: when:
event: push event: push
environment: environment:
@ -105,7 +120,7 @@ steps:
#- cp build/app/outputs/flutter-apk/app-debug.apk deploy/android #- cp build/app/outputs/flutter-apk/app-debug.apk deploy/android
- name: widget-tests - name: widget-tests
image: openpriv/flutter-desktop:linux-fstable-3.13.4 image: openpriv/flutter-desktop:linux-fstable-3.19.3
volumes: volumes:
- name: deps - name: deps
path: /root/.pub-cache path: /root/.pub-cache
@ -114,6 +129,21 @@ steps:
- flutter test --coverage - flutter test --coverage
- genhtml coverage/lcov.info -o coverage/html - 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 - name: deploy-buildfiles
image: kroniak/ssh-client image: kroniak/ssh-client
pull: if-not-exists pull: if-not-exists
@ -178,7 +208,7 @@ clone:
steps: steps:
- name: clone - name: clone
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.13.4 image: openpriv/flutter-desktop:windows-sdk30-fstable-3.19.3
environment: environment:
buildbot_key_b64: buildbot_key_b64:
from_secret: buildbot_key_b64 from_secret: buildbot_key_b64
@ -196,7 +226,7 @@ steps:
- git checkout $Env:DRONE_COMMIT - git checkout $Env:DRONE_COMMIT
- name: fetch - name: fetch
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.10.2 image: openpriv/flutter-desktop:windows-sdk30-fstable-3.19.3
commands: commands:
- git describe --tags --abbrev=1 > VERSION - git describe --tags --abbrev=1 > VERSION
- git log -1 --format=%cd --date=format:'%Y-%m-%d-%H-%M' > COMMIT_DATE - git log -1 --format=%cd --date=format:'%Y-%m-%d-%H-%M' > COMMIT_DATE
@ -204,12 +234,12 @@ steps:
- .\fetch-libcwtch-go.ps1 - .\fetch-libcwtch-go.ps1
- name: build-windows - name: build-windows
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.13.4 image: openpriv/flutter-desktop:windows-sdk30-fstable-3.19.3
commands: commands:
- flutter pub get - flutter pub get
- $Env:version += type .\VERSION - $Env:version += type .\VERSION
- $Env:commitdate += type .\COMMIT_DATE - $Env:commitdate += type .\COMMIT_DATE
- $Env:releasedir = "build\\windows\\runner\\Release\\" - $Env:releasedir = "build\\windows\\x64\\runner\\Release\\"
- flutter build windows --dart-define BUILD_VER=$Env:version --dart-define BUILD_DATE=$Env:commitdate - flutter build windows --dart-define BUILD_VER=$Env:version --dart-define BUILD_DATE=$Env:commitdate
- copy windows\libCwtch.dll $Env:releasedir - 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 # flutter hasn't worked out it's packaging of required dll's so we have to resort to this manual nonsense
@ -236,7 +266,7 @@ steps:
commands: commands:
- $Env:version += type .\VERSION - $Env:version += type .\VERSION
- $Env:commitdate += type .\COMMIT_DATE - $Env:commitdate += type .\COMMIT_DATE
- $Env:releasedir = "build\\windows\\runner\\Release\\" - $Env:releasedir = "build\\windows\\x64\\runner\\Release\\"
- $Env:zip = 'cwtch-' + $Env:version + '.zip' - $Env:zip = 'cwtch-' + $Env:version + '.zip'
- $Env:zipsha = $Env:zip + '.sha512.txt' - $Env:zipsha = $Env:zip + '.sha512.txt'
- $Env:buildname = 'flwtch-' + $Env:commitdate + '-' + $Env:version - $Env:buildname = 'flwtch-' + $Env:commitdate + '-' + $Env:version
@ -261,7 +291,7 @@ steps:
- move *.sha512.txt deploy\$Env:builddir - move *.sha512.txt deploy\$Env:builddir
- name: deploy-windows - name: deploy-windows
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.13.4 image: openpriv/flutter-desktop:windows-sdk30-fstable-3.19.3
when: when:
event: push event: push
status: [ success ] status: [ success ]
@ -333,6 +363,7 @@ steps:
commands: commands:
- export PATH=$PATH:/Users/drone/bin/flutter/bin - export PATH=$PATH:/Users/drone/bin/flutter/bin
- export PATH=$GEM_HOME/ruby/2.6.0/bin:$PATH - export PATH=$GEM_HOME/ruby/2.6.0/bin:$PATH
- flutter doctor
- flutter build macos --dart-define BUILD_VER=`cat VERSION` --dart-define BUILD_DATE=`cat COMMIT_DATE` - flutter build macos --dart-define BUILD_VER=`cat VERSION` --dart-define BUILD_DATE=`cat COMMIT_DATE`
- export PATH=$PATH:/opt/homebrew/bin/ #create-dmg - export PATH=$PATH:/opt/homebrew/bin/ #create-dmg
- macos/package-release.sh - macos/package-release.sh

3
.gitignore vendored
View File

@ -35,6 +35,7 @@ test_home
.pub-cache/ .pub-cache/
.pub/ .pub/
/build/ /build/
./lib/gen/
# Web related # Web related
lib/generated_plugin_registrant.dart lib/generated_plugin_registrant.dart
@ -58,7 +59,7 @@ package.
# Compiled Libs # Compiled Libs
linux/tor linux/tor
linux/libCwtch.so linux/libCwtch.so
android/cwtch/cwtch.aar android/app/cwtch/cwtch.aar
android/app/src/main/jniLibs/*/libtor.so android/app/src/main/jniLibs/*/libtor.so
*.dylib *.dylib
integration_test/gherkin_suite_test.g.dart integration_test/gherkin_suite_test.g.dart

View File

@ -1 +1 @@
2024-01-03-20-52-v0.0.10-4-g6c0b2e2 2024-02-26-18-01-v0.0.14

View File

@ -1,5 +1,5 @@
MIT License 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: 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

@ -1,3 +1,9 @@
plugins {
id "com.android.application"
id "kotlin-android"
id "dev.flutter.flutter-gradle-plugin"
}
def localProperties = new Properties() def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties') def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) { 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') def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) { if (flutterVersionCode == null) {
flutterVersionCode = '1' flutterVersionCode = '1'
@ -21,10 +22,6 @@ if (flutterVersionName == null) {
flutterVersionName = '1.0' 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) // 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 keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties') def keystorePropertiesFile = rootProject.file('key.properties')
@ -33,7 +30,7 @@ if (keystorePropertiesFile.exists()) {
} }
android { android {
compileSdkVersion 33 compileSdkVersion 34
sourceSets { sourceSets {
main.java.srcDirs += 'src/main/kotlin' main.java.srcDirs += 'src/main/kotlin'
@ -54,7 +51,7 @@ android {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "im.cwtch.flwtch" applicationId "im.cwtch.flwtch"
minSdkVersion 19 minSdkVersion 19
targetSdkVersion 33 targetSdkVersion 34
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()
versionName flutterVersionName versionName flutterVersionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@ -93,11 +90,11 @@ flutter {
} }
dependencies { dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.21" // same as kotlin version in settings.gradle
implementation project(':cwtch') 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-core:1.3.2"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android: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 "androidx.localbroadcastmanager:localbroadcastmanager:1.0.0"
implementation "com.android.support.constraint:constraint-layout:2.0.4" 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"> package="im.cwtch.flwtch">
<!-- io.flutter.app.FlutterApplication is an android.app.Application that <!-- io.flutter.app.FlutterApplication is an android.app.Application that
calls FlutterMain.startInitialization(this); in its onCreate method. calls FlutterMain.startInitialization(this); in its onCreate method.
@ -13,7 +13,7 @@
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:launchMode="singleTop" 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:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true" android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize" android:windowSoftInputMode="adjustResize"
@ -38,22 +38,30 @@
android:name="flutterEmbedding" android:name="flutterEmbedding"
android:value="2" /> android:value="2" />
<!--Needed to run in background (lol)-->
<service
android:name="androidx.work.impl.foreground.SystemForegroundService"
android:foregroundServiceType="dataSync"
tools:node="merge" />
</application> </application>
<!--Needed to access Tor socket--> <!--Needed to access Tor socket-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" /> <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" /> <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. <!-- 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 --> Allows app to use ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS -->
<uses-permission-sdk-23 android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> <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" /> <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--> <!--Needed to check if activity is foregrounded or if messages from the service should be queued-->
<uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.GET_TASKS" />

View File

@ -11,6 +11,7 @@ import android.graphics.Color
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
import android.util.Log import android.util.Log
import android.content.pm.ServiceInfo
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.localbroadcastmanager.content.LocalBroadcastManager
@ -22,6 +23,13 @@ import io.flutter.FlutterInjector
import org.json.JSONObject import org.json.JSONObject
import java.nio.file.Files import java.nio.file.Files
import java.nio.file.Paths import java.nio.file.Paths
import java.io.FileInputStream
import java.io.File
class FlwtchWorker(context: Context, parameters: WorkerParameters) : class FlwtchWorker(context: Context, parameters: WorkerParameters) :
CoroutineWorker(context, parameters) { CoroutineWorker(context, parameters) {
@ -137,7 +145,19 @@ class FlwtchWorker(context: Context, parameters: WorkerParameters) :
Log.i(TAG, "notification for " + evt.EventType + " " + handle + " " + conversationId + " " + channelId) Log.i(TAG, "notification for " + evt.EventType + " " + handle + " " + conversationId + " " + channelId)
Log.i(TAG, data.toString()); Log.i(TAG, data.toString());
val key = loader.getLookupKeyForAsset(data.getString("picture"))//"assets/profiles/001-centaur.png") 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 -> val clickIntent = Intent(applicationContext, MainActivity::class.java).also { intent ->
intent.action = Intent.ACTION_RUN intent.action = Intent.ACTION_RUN
@ -145,18 +165,21 @@ class FlwtchWorker(context: Context, parameters: WorkerParameters) :
intent.putExtra("ProfileOnion", data.getString("ProfileOnion")) intent.putExtra("ProfileOnion", data.getString("ProfileOnion"))
intent.putExtra("Handle", handle) intent.putExtra("Handle", handle)
} }
val image : android.graphics.Bitmap? = if (fh != null) BitmapFactory.decodeStream(fh ) else null;
val newNotification = NotificationCompat.Builder(applicationContext, channelId) val newNotification = NotificationCompat.Builder(applicationContext, channelId)
.setContentTitle(data.getString("Nick")) .setContentTitle(data.getString("Nick"))
.setContentText((notificationConversationInfo .setContentText((notificationConversationInfo
?: "New Message From %1").replace("%1", data.getString("Nick"))) ?: "New Message From %1").replace("%1", data.getString("Nick")))
.setLargeIcon(BitmapFactory.decodeStream(fh)) .setLargeIcon(image)
.setSmallIcon(R.mipmap.knott_transparent) .setSmallIcon(R.mipmap.knott_transparent)
.setContentIntent(PendingIntent.getActivity(applicationContext, 1, clickIntent, flags)) .setContentIntent(PendingIntent.getActivity(applicationContext, 1, clickIntent, flags))
.setAutoCancel(true) .setAutoCancel(true)
.build() .build()
notificationManager.notify(getNotificationID(data.getString("ProfileOnion"), channelId), newNotification) notificationManager.notify(getNotificationID(data.getString("ProfileOnion"), channelId), newNotification)
if (fh != null) {
fh.close()
}
} }
} }
@ -292,7 +315,7 @@ class FlwtchWorker(context: Context, parameters: WorkerParameters) :
.addAction(android.R.drawable.ic_delete, cancel, PendingIntent.getActivity(applicationContext, 2, cancelIntent, flags)) .addAction(android.R.drawable.ic_delete, cancel, PendingIntent.getActivity(applicationContext, 2, cancelIntent, flags))
.build() .build()
return ForegroundInfo(101, notification) return ForegroundInfo(101, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC)
} }
@RequiresApi(Build.VERSION_CODES.O) @RequiresApi(Build.VERSION_CODES.O)

View File

@ -1,6 +1,5 @@
package im.cwtch.flwtch package im.cwtch.flwtch
import SplashView
import android.annotation.TargetApi import android.annotation.TargetApi
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
@ -19,7 +18,6 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager
import androidx.work.* import androidx.work.*
import cwtch.Cwtch import cwtch.Cwtch
import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.android.SplashScreen
import io.flutter.embedding.engine.FlutterEngine import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.ErrorLogResult import io.flutter.plugin.common.ErrorLogResult
import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodCall
@ -32,8 +30,6 @@ import java.util.concurrent.TimeUnit
import kotlinx.coroutines.* import kotlinx.coroutines.*
class MainActivity: FlutterActivity() { class MainActivity: FlutterActivity() {
override fun provideSplashScreen(): SplashScreen? = SplashView()
// Channel to get app info // Channel to get app info
private val CHANNEL_APP_INFO = "test.flutter.dev/applicationInfo" private val CHANNEL_APP_INFO = "test.flutter.dev/applicationInfo"
@ -577,9 +573,6 @@ class MainActivity: FlutterActivity() {
result.success(Cwtch.searchConversations(profile, pattern)) result.success(Cwtch.searchConversations(profile, pattern))
return return
} }
"ReconnectCwtchForeground" -> {
Cwtch.reconnectCwtchForeground()
}
"Shutdown" -> { "Shutdown" -> {
Cwtch.shutdownCwtch(); 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"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen --> <!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <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 --> <!-- You can insert your own image assets here -->
<!-- <item> <item>
<bitmap <bitmap
android:gravity="center" android:gravity="center"
android:src="@mipmap/launch_image" /> android:src="@mipmap/knott" />
</item> --> </item>
</layer-list> </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"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen --> <!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <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 --> <!-- You can insert your own image assets here -->
<!-- <item> <item android:drawable="@drawable/knott"
<bitmap android:gravity="center"
android:gravity="center" />
android:src="@mipmap/launch_image" />
</item> -->
</layer-list> </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"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on --> <!-- 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.Black.NoTitleBar"> <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when <!-- 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> <item name="android:windowBackground">@drawable/launch_background</item>
</style> </style>
<!-- Theme applied to the Android Window as soon as the process has started. <!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its Flutter UI initializes, as well as behind your Flutter UI while its
running. running.
This Theme is only used starting with V2 of Flutter's Android embedding. --> 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> <item name="android:windowBackground">?android:colorBackground</item>
</style> </style>
</resources> </resources>

View File

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

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") includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
def properties = new Properties()
assert localPropertiesFile.exists() repositories {
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } google()
mavenCentral()
gradlePluginPortal()
}
}
def flutterSdkPath = properties.getProperty("flutter.sdk") plugins {
assert flutterSdkPath != null, "flutter.sdk not set in local.properties" id "dev.flutter.flutter-plugin-loader" version "1.0.0"
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 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.

After

Width:  |  Height:  |  Size: 19 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -1,68 +1,86 @@
--- ---
colors: colors:
darkDarkBlue: 0x000051 darkDarkBlue: 0x0E1628
darkLightBlue: 0x1A237E darkLightBlue: 0x19243E
white: 0xFFFFFF white: 0xE6E9F4
darkBlue: 0xAAB6FE darkBlue: 0x131B2E
lighterDarkBlue: 0xC3CCFE lighterDarkBlue: 0x19243E
lightBlue: 0xE8EAF6 lightBlue: 0xC0C8E5
themes: themes:
name: ghost name: ghost
dark: dark:
colors: colors:
background: 0x0D0D1F background: 0x131B2E
header: 0x0D0D1F header: 0x0E1628
userBubble: darkLightBlue userBubble: 0x25355A
peerBubble: darkDarkBlue peerBubble: 0x19243E
font: white font: 0xE6E9F4
settings: 0xDFFFD settings: 0xE6E9F4
accent: darkLightBlue # Color(0xFFD20070) accent: 0xD20070
theme: reaction: 0x96A5D4
backgroundHilightElementColor: darkDarkBlue theme:
backgroundMainColor: background backgroundHilightElementColor: darkDarkBlue
backgroundPaneColor: header backgroundMainColor: background
defaultButtonColor: accent backgroundPaneColor: header
dropShadowColor: darkBlue defaultButtonColor: accent
mainTextColor: font dropShadowColor: darkBlue
messageFromMeBackgroundColor: userBubble mainTextColor: font
messageFromMeTextColor: font messageFromMeBackgroundColor: userBubble
messageFromOtherBackgroundColor: peerBubble messageFromMeTextColor: font
messageFromOtherTextColor: font messageFromOtherBackgroundColor: peerBubble
scrollbarDefaultColor: darkLightBlue messageFromOtherTextColor: font
sendHintTextColor: darkBlue portraitOfflineBorderColor: 0x96A5D4
textfieldBackgroundColor: peerBubble portraitOnlineBorderColor: font
textfieldBorderColor: userBubble portraitBackgroundColor: background
textfieldHintColor: mainTextColor scrollbarDefaultColor: darkLightBlue
toolbarIconColor: settings sendHintTextColor: userBubble
topbarColor: header textfieldBackgroundColor: peerBubble
light: textfieldBorderColor: userBubble
colors: textfieldHintColor: font
background: 0xFDFDFF toolbarIconColor: settings
header: darkBlue topbarColor: header
userBubble: darkBlue chatReactionIconColor: reaction
peerBubble: lightBlue chatImage: Ghost.png
font: 0x0D0D1F chatImageColor: userBubble
settings: 0x0D0D1F snackbarBackgroundColor: accent
accent: darkBlue snackbarTextColor: 0xE6E9F4
theme: light:
backgroundHilightElementColor: peerBubble colors:
backgroundMainColor: background background: 0xE6E9F4
backgroundPaneColor: background header: 0x96A5D4
defaultButtonColor: accent userBubble: 0x96A5D4
defaultButtonActiveColor: lighterDarkBlue peerBubble: 0xC0C8E5
defaultButtonDisabledColor: peerBubble font: 0x131B2E
dropShadowColor: darkBlue settings: 0x131B2E
mainTextColor: settings accent: 0xD20070
messageFromMeBackgroundColor: userBubble reaction: 0x96A5D4
messageFromMeTextColor: font theme:
messageFromOtherBackgroundColor: peerBubble backgroundHilightElementColor: peerBubble
messageFromOtherTextColor: font backgroundMainColor: background
portraitContactBadgeColor: accent backgroundPaneColor: background
scrollbarDefaultColor: accent defaultButtonColor: accent
sendHintTextColor: lightBlue defaultButtonActiveColor: lighterDarkBlue
textfieldBackgroundColor: peerBubble defaultButtonDisabledColor: userBubble
textfieldBorderColor: userBubble dropShadowColor: darkBlue
textfieldHintColor: font mainTextColor: settings
toolbarIconColor: settings messageFromMeBackgroundColor: userBubble
topbarColor: header 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

@ -1,48 +1,53 @@
--- ---
themes: themes:
name: juniper name: juniper
dark: dark:
colors: colors:
background: 0x1B1B1B background: 0x1B1B1B
backgroundAlt: 0x494949 backgroundAlt: 0x494949
header: 0x1B1B1B header: 0x1B1B1B
userBubble: 0x373737 userBubble: 0x373737
peerBubble: 0x494949 peerBubble: 0x494949
font: 0xFFFFFF font: 0xFFFFFF
settings: 0xFFFDFF settings: 0xFFFDFF
accent: 0x9E6A56 accent: 0x9E6A56
accentAlt: 0x9E6A56 accentAlt: 0x9E6A56
theme: theme:
backgroundMainColor: background backgroundMainColor: background
backgroundPaneColor: header backgroundPaneColor: header
topbarColor: header topbarColor: header
mainTextColor: font mainTextColor: font
defaultButtonColor: accent defaultButtonColor: accent
textfieldHintColor: mainTextColor textfieldHintColor: mainTextColor
toolbarIconColor: settings toolbarIconColor: settings
messageFromMeBackgroundColor: userBubble messageFromMeBackgroundColor: userBubble
messageFromMeTextColor: font messageFromMeTextColor: font
messageFromOtherBackgroundColor: peerBubble messageFromOtherBackgroundColor: peerBubble
messageFromOtherTextColor: font messageFromOtherTextColor: font
textfieldBackgroundColor: peerBubble textfieldBackgroundColor: peerBubble
textfieldBorderColor: userBubble textfieldBorderColor: userBubble
backgroundHilightElementColor: accent backgroundHilightElementColor: accent
sendHintTextColor: accentAlt sendHintTextColor: accentAlt
hilightElementColor: accentAlt hilightElementColor: accentAlt
defaultButtonTextColor: mainTextColor defaultButtonTextColor: mainTextColor
defaultButtonDisabledColor: peerBubble defaultButtonDisabledColor: peerBubble
defaultButtonDisabledTextColor: peerBubble defaultButtonDisabledTextColor: peerBubble
textfieldErrorColor: accent textfieldErrorColor: accent
scrollbarDefaultColor: accent scrollbarDefaultColor: accent
portraitBackgroundColor: header portraitBackgroundColor: header
portraitOnlineBorderColor: font portraitOnlineBorderColor: font
portraitOfflineBorderColor: peerBubble portraitOfflineBorderColor: peerBubble
portraitBlockedBorderColor: peerBubble portraitBlockedBorderColor: peerBubble
portraitBlockedTextColor: peerBubble portraitBlockedTextColor: peerBubble
portraitContactBadgeColor: accent portraitContactBadgeColor: accent
portraitContactBadgeTextColor: mainTextColor portraitContactBadgeTextColor: mainTextColor
portraitProfileBadgeColor: accent portraitProfileBadgeColor: accent
portraitProfileBadgeTextColor: mainTextColor portraitProfileBadgeTextColor: mainTextColor
dropShadowColor: accentAlt dropShadowColor: accentAlt
chatReactionIconColor: 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

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

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

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

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

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

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

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

View File

@ -3,6 +3,6 @@
VERSION=`cat LIBCWTCH-GO.version` VERSION=`cat LIBCWTCH-GO.version`
echo $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/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 # 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 curl --fail https://build.openprivacy.ca/files/libCwtch-autobindings-$VERSION/linux/libCwtch.x64.so --output linux/libCwtch.so

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/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/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:gherkin/gherkin.dart';
import 'package:flutter/material.dart';
import 'overrides.dart';
StepDefinitionGeneric ExpectReply() { StepDefinitionGeneric ExpectReply() {
return given3<String, String, int, FlutterWorld>( return given3<String, String, int, FlutterWorld>(

View File

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

View File

@ -1,6 +1,5 @@
import 'package:cwtch/themes/opaque.dart'; import 'package:cwtch/themes/opaque.dart';
import 'package:cwtch/third_party/linkify/linkify.dart'; import 'package:cwtch/third_party/linkify/linkify.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
@ -38,7 +37,7 @@ void modalOpenLink(BuildContext ctx, LinkableElement link) {
final snackBar = SnackBar( final snackBar = SnackBar(
content: Text( content: Text(
AppLocalizations.of(bcontext)!.copiedToClipboardNotification, AppLocalizations.of(bcontext)!.copiedToClipboardNotification,
style: Provider.of<Settings>(bcontext).scaleFonts(defaultTextButtonStyle), style: Provider.of<Settings>(bcontext, listen: false).scaleFonts(defaultTextButtonStyle),
), ),
); );

View File

@ -11,8 +11,8 @@ abstract class Cwtch {
// ignore: non_constant_identifier_names // ignore: non_constant_identifier_names
Future<void> Start(); Future<void> Start();
// ignore: non_constant_identifier_names
Future<void> ReconnectCwtchForeground(); Future<String> getCwtchDir();
String getAssetsDir(); String getAssetsDir();

View File

@ -3,15 +3,10 @@ import 'package:cwtch/cwtch/cwtch.dart';
import 'package:cwtch/main.dart'; import 'package:cwtch/main.dart';
import 'package:cwtch/models/appstate.dart'; import 'package:cwtch/models/appstate.dart';
import 'package:cwtch/models/contact.dart'; import 'package:cwtch/models/contact.dart';
import 'package:cwtch/models/message.dart';
import 'package:cwtch/models/profilelist.dart'; import 'package:cwtch/models/profilelist.dart';
import 'package:cwtch/models/profileservers.dart';
import 'package:cwtch/models/remoteserver.dart'; import 'package:cwtch/models/remoteserver.dart';
import 'package:cwtch/models/servers.dart'; import 'package:cwtch/models/servers.dart';
import 'package:cwtch/notification_manager.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'; import 'package:cwtch/torstatus.dart';
@ -63,7 +58,14 @@ class CwtchNotifier {
// EnvironmentConfig.debugLog("NewEvent $type $data"); // EnvironmentConfig.debugLog("NewEvent $type $data");
switch (type) { switch (type) {
case "CwtchStarted": case "CwtchStarted":
flwtchState.cwtch.LoadProfiles(DefaultPassword); 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(); appState.SetCwtchInit();
break; break;
case "CwtchStartError": case "CwtchStartError":
@ -193,21 +195,9 @@ class CwtchNotifier {
var senderImage = data['picture']; var senderImage = data['picture'];
var isAuto = data['Auto'] == "true"; var isAuto = data['Auto'] == "true";
String contenthash = data['ContentHash']; String contenthash = data['ContentHash'];
var selectedProfile = appState.selectedProfile == data["ProfileOnion"]; var selectedProfile = appState.selectedProfile == data["ProfileOnion"];
var selectedConversation = selectedProfile && appState.selectedConversation == identifier; 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( profileCN.getProfile(data["ProfileOnion"])?.newMessage(
identifier, identifier,
messageID, messageID,
@ -220,6 +210,19 @@ class CwtchNotifier {
selectedProfile, selectedProfile,
selectedConversation, 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(); appState.notifyProfileUnread();
break; break;
case "PeerAcknowledgement": case "PeerAcknowledgement":
@ -254,7 +257,7 @@ class CwtchNotifier {
var notification = data["notification"]; 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... // 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. // 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 // 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 // Received refers to the time we actually saw the message from the server
@ -302,6 +305,7 @@ class CwtchNotifier {
break; break;
case "UpdateGlobalSettings": case "UpdateGlobalSettings":
settings.handleUpdate(jsonDecode(data["Data"])); settings.handleUpdate(jsonDecode(data["Data"]));
appState.settingsLoaded = true;
break; break;
case "UpdatedProfileAttribute": case "UpdatedProfileAttribute":
if (data["Key"] == "public.profile.name") { if (data["Key"] == "public.profile.name") {
@ -346,7 +350,7 @@ class CwtchNotifier {
associatedGroups.forEach((identifier) { associatedGroups.forEach((identifier) {
profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(int.parse(identifier.toString()))!.antispamTickets = count; 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) { } catch (e) {
// No tokens in data... // No tokens in data...
} }

View File

@ -3,7 +3,6 @@ import 'dart:convert';
import 'dart:ffi'; import 'dart:ffi';
import 'dart:io'; import 'dart:io';
import 'dart:isolate'; import 'dart:isolate';
import 'dart:io' show Platform;
import 'package:cwtch/cwtch/cwtchNotifier.dart'; import 'package:cwtch/cwtch/cwtchNotifier.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
@ -13,7 +12,6 @@ import 'package:cwtch/cwtch/cwtch.dart';
import '../config.dart'; import '../config.dart';
import "package:path/path.dart" show dirname, join; import "package:path/path.dart" show dirname, join;
import 'dart:io' show Platform;
///////////////////// /////////////////////
/// Cwtch API /// /// Cwtch API ///
@ -135,6 +133,7 @@ class CwtchFfi implements Cwtch {
ReceivePort _receivePort = ReceivePort(); ReceivePort _receivePort = ReceivePort();
bool _isL10nInit = false; bool _isL10nInit = false;
String _assetsDir = path.join(Directory.current.path, "data", "flutter_assets"); String _assetsDir = path.join(Directory.current.path, "data", "flutter_assets");
String _cwtchDir = "";
static String getLibraryPath() { static String getLibraryPath() {
if (Platform.isWindows) { if (Platform.isWindows) {
@ -169,13 +168,12 @@ class CwtchFfi implements Cwtch {
String home = ""; String home = "";
String bundledTor = ""; String bundledTor = "";
Map<String, String> envVars = Platform.environment; Map<String, String> envVars = Platform.environment;
String cwtchDir = "";
if (Platform.isLinux) { if (Platform.isLinux) {
home = envVars['HOME'] ?? ""; home = envVars['HOME'] ?? "";
if (EnvironmentConfig.TEST_MODE) { if (EnvironmentConfig.TEST_MODE) {
cwtchDir = envVars['CWTCH_HOME']!; _cwtchDir = envVars['CWTCH_HOME']!;
} else { } 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()) { if (await File("linux/Tor/tor").exists()) {
@ -192,7 +190,7 @@ class CwtchFfi implements Cwtch {
bundledTor = "tor"; bundledTor = "tor";
} }
} else if (Platform.isWindows) { } 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"); String currentTor = path.join(Directory.current.absolute.path, "Tor\\Tor\\tor.exe");
if (await File(currentTor).exists()) { if (await File(currentTor).exists()) {
bundledTor = currentTor; bundledTor = currentTor;
@ -203,7 +201,7 @@ class CwtchFfi implements Cwtch {
_assetsDir = path.join(exeDir, "data", "flutter_assets"); _assetsDir = path.join(exeDir, "data", "flutter_assets");
} }
} else if (Platform.isMacOS) { } else if (Platform.isMacOS) {
cwtchDir = envVars['CWTCH_HOME'] ?? path.join(envVars['HOME']!, "Library/Application Support/Cwtch"); _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/"; _assetsDir = "/Applications/Cwtch.app/Contents/Frameworks/App.framework/Versions/Current/Resources/flutter_assets/";
if (await File("Cwtch.app/Contents/MacOS/Tor/tor").exists()) { if (await File("Cwtch.app/Contents/MacOS/Tor/tor").exists()) {
bundledTor = "Cwtch.app/Contents/MacOS/Tor/tor"; bundledTor = "Cwtch.app/Contents/MacOS/Tor/tor";
@ -232,27 +230,27 @@ class CwtchFfi implements Cwtch {
// if macOs and release build and no profile and is dev profile // if macOs and release build and no profile and is dev profile
// copy dev profile to release profile // copy dev profile to release profile
if (Platform.isMacOS && EnvironmentConfig.BUILD_VER != dev_version) { if (Platform.isMacOS && EnvironmentConfig.BUILD_VER != dev_version) {
var devProfileExists = await Directory(path.join(cwtchDir, "dev", "profiles")).exists(); var devProfileExists = await Directory(path.join(_cwtchDir, "dev", "profiles")).exists();
var releaseProfileExists = await Directory(path.join(cwtchDir, "profiles")).exists(); var releaseProfileExists = await Directory(path.join(_cwtchDir, "profiles")).exists();
if (devProfileExists && !releaseProfileExists) { if (devProfileExists && !releaseProfileExists) {
print("MacOS one time dev -> release profile migration..."); 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", "profiles"), _cwtchDir]);
await Process.run("cp", ["-r", "-p", path.join(cwtchDir, "dev", "SALT"), 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", "ui.globals"), _cwtchDir]);
} }
} }
if (EnvironmentConfig.BUILD_VER == dev_version) { 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"); var startCwtchC = library.lookup<NativeFunction<start_cwtch_function>>("c_StartCwtch");
// ignore: non_constant_identifier_names // ignore: non_constant_identifier_names
final StartCwtch = startCwtchC.asFunction<StartCwtchFn>(); final StartCwtch = startCwtchC.asFunction<StartCwtchFn>();
final utf8CwtchDir = cwtchDir.toNativeUtf8(); final utf8CwtchDir = _cwtchDir.toNativeUtf8();
StartCwtch(utf8CwtchDir, utf8CwtchDir.length, bundledTor.toNativeUtf8(), bundledTor.length); StartCwtch(utf8CwtchDir, utf8CwtchDir.length, bundledTor.toNativeUtf8(), bundledTor.length);
malloc.free(utf8CwtchDir); malloc.free(utf8CwtchDir);
@ -268,12 +266,8 @@ class CwtchFfi implements Cwtch {
return _assetsDir; return _assetsDir;
} }
// ignore: non_constant_identifier_names Future<String> getCwtchDir() async {
Future<void> ReconnectCwtchForeground() async { return _cwtchDir;
var reconnectCwtch = library.lookup<NativeFunction<Void Function()>>("c_ReconnectCwtchForeground");
// ignore: non_constant_identifier_names
final ReconnectCwtchForeground = reconnectCwtch.asFunction<void Function()>();
ReconnectCwtchForeground();
} }
// Called on object being disposed to (presumably on app close) to close the isolate that's listening to libcwtch-go events // Called on object being disposed to (presumably on app close) to close the isolate that's listening to libcwtch-go events

View File

@ -30,6 +30,7 @@ class CwtchGomobile implements Cwtch {
late Future<dynamic> androidLibraryDir; late Future<dynamic> androidLibraryDir;
late Future<dynamic> androidHomeDirectory; late Future<dynamic> androidHomeDirectory;
String androidHomeDirectoryStr = ""; String androidHomeDirectoryStr = "";
String _cwtchDir = "";
late CwtchNotifier cwtchNotifier; late CwtchNotifier cwtchNotifier;
bool _isL10nInit = false; bool _isL10nInit = false;
@ -67,23 +68,22 @@ class CwtchGomobile implements Cwtch {
return ""; return "";
} }
// Requires Start() to have been run to initialize
Future<String> getCwtchDir() async {
return _cwtchDir;
}
// ignore: non_constant_identifier_names // ignore: non_constant_identifier_names
Future<void> Start() async { Future<void> Start() async {
print("gomobile.dart: Start()..."); print("gomobile.dart: Start()...");
androidHomeDirectoryStr = (await androidHomeDirectory).path; androidHomeDirectoryStr = (await androidHomeDirectory).path;
var cwtchDir = path.join(androidHomeDirectoryStr, ".cwtch"); _cwtchDir = path.join(androidHomeDirectoryStr, ".cwtch");
if (EnvironmentConfig.BUILD_VER == dev_version) { if (EnvironmentConfig.BUILD_VER == dev_version) {
cwtchDir = path.join(cwtchDir, "dev"); _cwtchDir = path.join(_cwtchDir, "dev");
} }
String torPath = path.join(await androidLibraryDir, "libtor.so"); String torPath = path.join(await androidLibraryDir, "libtor.so");
print("gomobile.dart: Start invokeMethod Start($cwtchDir, $torPath)..."); print("gomobile.dart: Start invokeMethod Start($_cwtchDir, $torPath)...");
cwtchPlatform.invokeMethod("Start", {"appDir": cwtchDir, "torPath": torPath}); cwtchPlatform.invokeMethod("Start", {"appDir": _cwtchDir, "torPath": torPath});
}
@override
// ignore: non_constant_identifier_names
Future<void> ReconnectCwtchForeground() async {
cwtchPlatform.invokeMethod("ReconnectCwtchForeground", {});
} }
// Handle libcwtch-go events (received via kotlin) and dispatch to the cwtchNotifier // Handle libcwtch-go events (received via kotlin) and dispatch to the cwtchNotifier

View File

@ -648,4 +648,20 @@ class MaterialLocalizationLu extends MaterialLocalizations {
@override @override
// TODO: implement scanTextButtonLabel // TODO: implement scanTextButtonLabel
String get scanTextButtonLabel => throw UnimplementedError(); 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,16 @@
{ {
"@@locale": "cy", "@@locale": "cy",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",

View File

@ -1,6 +1,16 @@
{ {
"@@locale": "da", "@@locale": "da",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",

View File

@ -1,28 +1,40 @@
{ {
"@@locale": "de", "@@locale": "de",
"@@last_modified": "2024-01-04T10:56:20+01:00", "@@last_modified": "2024-02-12T08:05:24+01:00",
"settingsGroupAbout": "About", "settingsExperimentsShowPerformanceTitle": "Leistungs-Overlay anzeigen",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "settingsExperimentsShowPerformanceDescription": "Zeigt ein Overlay-Diagramm der Renderzeit an.",
"profileOfflineAtStart": "Appear Offline at Startup", "defaultScalingText": "Text in Standardgröße (Skalierungsfaktor:",
"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": "Server wirklich löschen", "deleteServerConfirmBtn": "Server wirklich löschen",
"cannotDeleteServerIfActiveGroups": "There are active groups associated with this Cwtch Server. Please delete them prior to deleting this Cwtch Server entry.",
"groupsOnThisServerLabel": "Gruppen, in denen ich bin, werden auf diesem Server gehostet", "groupsOnThisServerLabel": "Gruppen, in denen ich bin, werden auf diesem Server gehostet",
"serverinfoNoGroupInfo": "There are no groups associated with this Cwtch Server.", "profileEnabledDescription": "Starten oder Stoppen des Profils",
"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": "Konversationsverlauf bewahren",
"defaultPreserveHistorySetting": "Preserve Conversation History", "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", "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.", "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 \/ 日本語", "localeJa": "Japanisch \/ 日本語",
@ -30,8 +42,6 @@
"localeSv": "Schwedisch \/ Svenska", "localeSv": "Schwedisch \/ Svenska",
"localeSw": "Suaheli \/ Kiswahili", "localeSw": "Suaheli \/ Kiswahili",
"localeUk": "Ukrainisch \/ українською", "localeUk": "Ukrainisch \/ українською",
"profileEnabledDescription": "Starten oder Stoppen des Profils",
"defaultScalingText": "Text in Standardgröße (Skalierungsfaktor:",
"blodeuweddExperimentEnable": "Blodeuwedd Assistent", "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.", "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.", "blodeuweddNotSupported": "Diese Version von Cwtch wurde ohne Unterstützung für den Blodeuwedd-Assistenten kompiliert.",

View File

@ -1,6 +1,16 @@
{ {
"@@locale": "el", "@@locale": "el",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",

View File

@ -1,6 +1,16 @@
{ {
"@@locale": "en", "@@locale": "en",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",

View File

@ -1,6 +1,16 @@
{ {
"@@locale": "es", "@@locale": "es",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"deleteServerConfirmBtn": "¿Realmente desea borrar el servidor?", "deleteServerConfirmBtn": "¿Realmente desea borrar el servidor?",
"defaultScalingText": "Factor de escala del texto", "defaultScalingText": "Factor de escala del texto",

View File

@ -1,6 +1,16 @@
{ {
"@@locale": "fr", "@@locale": "fr",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",

View File

@ -1,6 +1,16 @@
{ {
"@@locale": "it", "@@locale": "it",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",

View File

@ -1,6 +1,16 @@
{ {
"@@locale": "ja", "@@locale": "ja",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",

View File

@ -1,6 +1,44 @@
{ {
"@@locale": "ko", "@@locale": "ko",
"@@last_modified": "2024-01-04T10:56:20+01:00", "@@last_modified": "2024-02-12T08:05:24+01:00",
"settingsExperimentsShowPerformanceDescription": "Display an overlay graph of render time.",
"settingsExperimentsShowPerformanceTitle": "Show Performance Overlay",
"sendAnInvitation": "초대를 보냈습니다: ",
"sendInvite": "연락처 또는 그룹 초대 보내기",
"pasteAddressToAddContact": "Paste a cwtch address, invitation or key bundle here to add a new conversation",
"invalidImportString": "잘못된 가져오기 문자열",
"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",
"resetTor": "초기화",
"torStatus": "Tor 상태",
"torVersion": "Tor 버전",
"passwordChangeError": "암호 변경 오류: 제공된 암호가 거부되었습니다.",
"enterProfilePassword": "프로필을 보려면 암호를 입력하세요.",
"todoPlaceholder": "할 일...",
"addNewItem": "목록에 새 항목 추가",
"addListItem": "새 목록 항목 추가",
"networkStatusConnecting": "네트워크 및 연락처에 연결 중...",
"networkStatusAttemptingTor": "Tor 네트워크에 연결을 시도 중",
"networkStatusDisconnected": "인터넷 연결 끊김, 연결 확인하세요",
"viewGroupMembershipTooltip": "그룹 구성원 보기",
"defaultScalingText": "글꼴 크기 조정",
"experimentsEnabled": "실험 사용",
"loadingTor": "tor 로딩 중...",
"builddate": "빌드 대상: %2",
"version": "버전: %1",
"versionTor": "버전 %1 및 tor %2",
"settingInterfaceZoom": "확대\/축소 수준",
"versionBuilddate": "버전: %1 빌드 대상: %2",
"error0ProfilesLoadedForPassword": "해당 비밀번호가 포함된 프로필이 0개 로드되었습니다.",
"deleteConfirmText": "삭제",
"unblockBtn": "연락처 차단 해제",
"savePeerHistoryDescription": "연락처와 연결된 기록을 삭제할지 여부를 결정합니다.",
"settingsThemeImagesDescription": "Enable display of images from themes",
"settingsThemeImages": "Theme Images",
"settingsGroupAbout": "About", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",
@ -114,7 +152,6 @@
"server": "서버", "server": "서버",
"peerName": "이름", "peerName": "이름",
"peerAddress": "주소", "peerAddress": "주소",
"builddate": "Built on: %2",
"deleteProfileConfirmBtn": "프로필 삭제 확인", "deleteProfileConfirmBtn": "프로필 삭제 확인",
"deleteConfirmLabel": "DELETE를 입력하여 확인", "deleteConfirmLabel": "DELETE를 입력하여 확인",
"deleteProfileBtn": "프로필 삭제", "deleteProfileBtn": "프로필 삭제",
@ -150,7 +187,6 @@
"localeSw": "Swahili \/ Kiswahili", "localeSw": "Swahili \/ Kiswahili",
"localeSv": "Swedish \/ Svenska", "localeSv": "Swedish \/ Svenska",
"fontScalingDescription": "Adjust the relative font scaling factor applied to text and widgets.", "fontScalingDescription": "Adjust the relative font scaling factor applied to text and widgets.",
"defaultScalingText": "Font Scaling",
"localeJa": "Japanese \/ 日本語", "localeJa": "Japanese \/ 日本語",
"retryConnectionTooltip": "Cwtch retries peers regularly, but you can tell Cwtch to try sooner by pushing this button.", "retryConnectionTooltip": "Cwtch retries peers regularly, but you can tell Cwtch to try sooner by pushing this button.",
"retryConnection": "Retry", "retryConnection": "Retry",
@ -374,11 +410,6 @@
"nickChangeSuccess": "Profile nickname changed successfully", "nickChangeSuccess": "Profile nickname changed successfully",
"addServerFirst": "You need to add a server before you can create a group", "addServerFirst": "You need to add a server before you can create a group",
"deleteProfileSuccess": "Successfully deleted profile", "deleteProfileSuccess": "Successfully deleted profile",
"sendInvite": "Send a contact or group invite",
"resetTor": "Reset",
"torStatus": "Tor Status",
"torVersion": "Tor Version",
"sendAnInvitation": "You sent an invitation for: ",
"contactSuggestion": "This is a contact suggestion for: ", "contactSuggestion": "This is a contact suggestion for: ",
"chatHistoryDefault": "This conversation will be deleted when Cwtch is closed! Message history can be enabled per-conversation via the Settings menu in the upper right.", "chatHistoryDefault": "This conversation will be deleted when Cwtch is closed! Message history can be enabled per-conversation via the Settings menu in the upper right.",
"reallyLeaveThisGroupPrompt": "Are you sure you want to leave this conversation? All messages and attributes will be deleted.", "reallyLeaveThisGroupPrompt": "Are you sure you want to leave this conversation? All messages and attributes will be deleted.",
@ -386,26 +417,5 @@
"descriptionBlockUnknownConnections": "If turned on, this option will automatically close connections from Cwtch users that have not been added to your contact list.", "descriptionBlockUnknownConnections": "If turned on, this option will automatically close connections from Cwtch users that have not been added to your contact list.",
"descriptionExperimentsGroups": "The group experiment allows Cwtch to connect with untrusted server infrastructure to facilitate communication with more than one contact.", "descriptionExperimentsGroups": "The group experiment allows Cwtch to connect with untrusted server infrastructure to facilitate communication with more than one contact.",
"descriptionExperiments": "Cwtch experiments are optional, opt-in features that add additional functionality to Cwtch that may have different privacy considerations than traditional 1:1 metadata resistant chat e.g. group chat, bot integration etc.", "descriptionExperiments": "Cwtch experiments are optional, opt-in features that add additional functionality to Cwtch that may have different privacy considerations than traditional 1:1 metadata resistant chat e.g. group chat, bot integration etc.",
"tooltipUnlockProfiles": "Unlock encrypted profiles by entering their password.", "tooltipUnlockProfiles": "Unlock encrypted profiles by entering their password."
"invalidImportString": "Invalid import string",
"todoPlaceholder": "Todo...",
"addNewItem": "Add a new item to the list",
"addListItem": "Add a New List Item",
"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...",
"version": "Version %1",
"versionTor": "Version %1 with tor %2",
"experimentsEnabled": "Enable Experiments",
"settingInterfaceZoom": "Zoom level",
"versionBuilddate": "Version: %1 Built on: %2",
"error0ProfilesLoadedForPassword": "0 profiles loaded with that password",
"enterProfilePassword": "Enter a password to view your profiles",
"deleteConfirmText": "DELETE",
"passwordChangeError": "Error changing password: Supplied password rejected",
"unblockBtn": "Unblock Contact",
"savePeerHistoryDescription": "Determines whether to delete any history associated with the contact.",
"pasteAddressToAddContact": "Paste a cwtch address, invitation or key bundle here to add a new conversation"
} }

View File

@ -1,6 +1,16 @@
{ {
"@@locale": "lb", "@@locale": "lb",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",

View File

@ -1,6 +1,16 @@
{ {
"@@locale": "nl", "@@locale": "nl",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",

View File

@ -1,6 +1,16 @@
{ {
"@@locale": "no", "@@locale": "no",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",

View File

@ -1,6 +1,16 @@
{ {
"@@locale": "pl", "@@locale": "pl",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",

View File

@ -1,6 +1,16 @@
{ {
"@@locale": "pt", "@@locale": "pt",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",

View File

@ -1,6 +1,16 @@
{ {
"@@locale": "pt_BR", "@@locale": "pt_BR",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",

View File

@ -1,6 +1,16 @@
{ {
"@@locale": "ro", "@@locale": "ro",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",

View File

@ -1,6 +1,16 @@
{ {
"@@locale": "ru", "@@locale": "ru",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",

View File

@ -1,6 +1,16 @@
{ {
"@@locale": "sk", "@@locale": "sk",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",

View File

@ -1,6 +1,16 @@
{ {
"@@locale": "sv", "@@locale": "sv",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",

View File

@ -1,6 +1,16 @@
{ {
"@@locale": "sw", "@@locale": "sw",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",

View File

@ -1,6 +1,16 @@
{ {
"@@locale": "tr", "@@locale": "tr",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",

View File

@ -1,6 +1,16 @@
{ {
"@@locale": "uk", "@@locale": "uk",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",

View File

@ -1,6 +1,16 @@
{ {
"@@locale": "uz", "@@locale": "uz",
"@@last_modified": "2024-01-04T10:56:20+01: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", "settingsGroupAbout": "About",
"localeUzbek": "Uzbek \/ Oʻzbekcha", "localeUzbek": "Uzbek \/ Oʻzbekcha",
"profileOfflineAtStart": "Appear Offline at Startup", "profileOfflineAtStart": "Appear Offline at Startup",

View File

@ -1,9 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:isolate';
import 'package:cwtch/config.dart'; import 'package:cwtch/config.dart';
import 'package:cwtch/notification_manager.dart'; import 'package:cwtch/notification_manager.dart';
import 'package:cwtch/themes/cwtch.dart';
import 'package:cwtch/views/doublecolview.dart'; import 'package:cwtch/views/doublecolview.dart';
import 'package:cwtch/views/messageview.dart'; import 'package:cwtch/views/messageview.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
@ -33,9 +31,7 @@ import 'themes/opaque.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:intl/intl.dart' as intl; var globalSettings = Settings(Locale("en", ''));
var globalSettings = Settings(Locale("en", ''), CwtchDark());
var globalErrorHandler = ErrorHandler(); var globalErrorHandler = ErrorHandler();
var globalTorStatus = TorStatus(); var globalTorStatus = TorStatus();
var globalAppState = AppState(); var globalAppState = AppState();
@ -80,7 +76,7 @@ class FlwtchState extends State<Flwtch> with WindowListener {
@override @override
initState() { initState() {
print("initState() started, setting up handlers"); print("initState() started, setting up handlers");
globalSettings = Settings(Locale("en", ''), CwtchDark()); globalSettings = Settings(Locale("en", ''));
globalErrorHandler = ErrorHandler(); globalErrorHandler = ErrorHandler();
globalTorStatus = TorStatus(); globalTorStatus = TorStatus();
globalAppState = AppState(); globalAppState = AppState();
@ -107,12 +103,14 @@ class FlwtchState extends State<Flwtch> with WindowListener {
new CwtchNotifier(profs, globalSettings, globalErrorHandler, globalTorStatus, newDesktopNotificationsManager(_notificationSelectConvo), globalAppState, globalServersList, this); new CwtchNotifier(profs, globalSettings, globalErrorHandler, globalTorStatus, newDesktopNotificationsManager(_notificationSelectConvo), globalAppState, globalServersList, this);
cwtch = CwtchFfi(cwtchNotifier); cwtch = CwtchFfi(cwtchNotifier);
} }
print("initState: invoking cwtch.Start()");
// Cwtch.start can take time, we don't want it blocking first splash screen draw, so postpone a smidge to let splash render // Cwtch.start can take time, we don't want it blocking first splash screen draw, so postpone a smidge to let splash render
Future.delayed(const Duration(milliseconds: 50), () { Future.delayed(const Duration(milliseconds: 100), () {
print("actually invoking cwtch.cwtch()!!!"); print("initState delayed: invoking cwtch.Start()");
cwtch.Start(); cwtch.Start().then((v) {
LoadAssetThemes(); cwtch.getCwtchDir().then((dir) {
globalSettings.themeloader.LoadThemes(dir);
});
});
}); });
print("initState: starting connectivityListener"); print("initState: starting connectivityListener");
if (EnvironmentConfig.TEST_MODE == false) { if (EnvironmentConfig.TEST_MODE == false) {
@ -129,7 +127,7 @@ class FlwtchState extends State<Flwtch> with WindowListener {
// gracefully fails and NOPs, as it's not a required functionality // gracefully fails and NOPs, as it's not a required functionality
startConnectivityListener() async { startConnectivityListener() async {
try { try {
connectivityStream = await Connectivity().onConnectivityChanged.listen((ConnectivityResult result) { connectivityStream = Connectivity().onConnectivityChanged.listen((ConnectivityResult result) {
// Got a new connectivity status! // Got a new connectivity status!
if (result == ConnectivityResult.none) { if (result == ConnectivityResult.none) {
connectivityState = ConnectivityState.confirmed_offline; connectivityState = ConnectivityState.confirmed_offline;
@ -162,6 +160,7 @@ class FlwtchState extends State<Flwtch> with WindowListener {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
globalSettings.initPackageInfo(); globalSettings.initPackageInfo();
return MultiProvider( return MultiProvider(
providers: [ providers: [
getFlwtchStateProvider(), getFlwtchStateProvider(),
@ -173,10 +172,6 @@ class FlwtchState extends State<Flwtch> with WindowListener {
getServerListStateProvider(), getServerListStateProvider(),
], ],
builder: (context, widget) { builder: (context, widget) {
// in test mode...rebuild everything every second...if cwtch isn't loaded...
if (EnvironmentConfig.TEST_MODE && cwtch.IsLoaded() == false) {
Timer t = new Timer.periodic(Duration(seconds: 1), (Timer t) => setState(() {}));
}
return Consumer2<Settings, AppState>( return Consumer2<Settings, AppState>(
builder: (context, settings, appState, child) => MaterialApp( builder: (context, settings, appState, child) => MaterialApp(
key: Key('app'), key: Key('app'),
@ -194,7 +189,7 @@ class FlwtchState extends State<Flwtch> with WindowListener {
title: 'Cwtch', title: 'Cwtch',
showSemanticsDebugger: settings.useSemanticDebugger, showSemanticsDebugger: settings.useSemanticDebugger,
theme: mkThemeData(settings), theme: mkThemeData(settings),
home: (!appState.cwtchInit || appState.modalState != ModalState.none) || !cwtch.IsLoaded() ? SplashView() : ProfileMgrView(), home: (!appState.loaded) ? SplashView() : ProfileMgrView(),
), ),
); );
}, },
@ -257,7 +252,6 @@ class FlwtchState extends State<Flwtch> with WindowListener {
exit(0); exit(0);
} }
} }
;
} }
// Invoked via notificationClickChannel by MyBroadcastReceiver in MainActivity.kt // Invoked via notificationClickChannel by MyBroadcastReceiver in MainActivity.kt

View File

@ -1,4 +1,3 @@
import 'package:cwtch/themes/cwtch.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -8,16 +7,14 @@ import 'package:glob/list_local_fs.dart';
import 'config.dart'; import 'config.dart';
import 'licenses.dart'; import 'licenses.dart';
import 'main.dart'; import 'main.dart';
import 'themes/opaque.dart';
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:typed_data';
import "package:flutter_driver/driver_extension.dart"; import "package:flutter_driver/driver_extension.dart";
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:glob/glob.dart'; import 'package:glob/glob.dart';
var globalSettings = Settings(Locale("en", ''), CwtchDark()); var globalSettings = Settings(Locale("en", ''));
var globalErrorHandler = ErrorHandler(); var globalErrorHandler = ErrorHandler();
Future<void> main() async { Future<void> main() async {

View File

@ -1,7 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'dart:io';
import 'package:cwtch/config.dart'; import 'package:cwtch/config.dart';
import 'package:cwtch/main.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
enum ModalState { none, storageMigration, shutdown } enum ModalState { none, storageMigration, shutdown }
@ -18,6 +18,8 @@ class AppState extends ChangeNotifier {
bool _unreadMessagesBelow = false; bool _unreadMessagesBelow = false;
bool _disableFilePicker = false; bool _disableFilePicker = false;
bool _focus = true; bool _focus = true;
bool _settingsLoaded = false;
bool _themesLoaded = false;
StreamController<bool> _profilesUnreadNotifyControler = StreamController<bool>(); StreamController<bool> _profilesUnreadNotifyControler = StreamController<bool>();
late Stream<bool> profilesUnreadNotify; late Stream<bool> profilesUnreadNotify;
@ -33,13 +35,13 @@ class AppState extends ChangeNotifier {
void SetAppError(String error) { void SetAppError(String error) {
appError = error; appError = error;
EnvironmentConfig.debugLog("App Error: ${appError}"); EnvironmentConfig.debugLog("App Error: $appError");
notifyListeners(); notifyListeners();
} }
void SetModalState(ModalState newState) { void SetModalState(ModalState newState) {
modalState = newState; modalState = newState;
EnvironmentConfig.debugLog("Modal State: ${newState}"); EnvironmentConfig.debugLog("Modal State: $newState");
notifyListeners(); notifyListeners();
} }
@ -86,6 +88,18 @@ class AppState extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
set settingsLoaded(bool newVal) {
_settingsLoaded = newVal;
notifyListeners();
}
set themesLoaded(bool newVal) {
_themesLoaded = newVal;
notifyListeners();
}
bool get loaded => cwtchInit && _settingsLoaded && globalSettings.themeloader.themes.length > 0 && modalState == ModalState.none;
bool isLandscape(BuildContext c) => MediaQuery.of(c).size.width > MediaQuery.of(c).size.height; bool isLandscape(BuildContext c) => MediaQuery.of(c).size.width > MediaQuery.of(c).size.height;
void notifyProfileUnread() { void notifyProfileUnread() {

View File

@ -1,5 +1,3 @@
import 'dart:ffi';
import 'package:cwtch/main.dart'; import 'package:cwtch/main.dart';
import 'package:cwtch/models/message_draft.dart'; import 'package:cwtch/models/message_draft.dart';
import 'package:cwtch/models/profile.dart'; import 'package:cwtch/models/profile.dart';
@ -13,7 +11,6 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
import 'message.dart';
import 'messagecache.dart'; import 'messagecache.dart';
enum ConversationNotificationPolicy { enum ConversationNotificationPolicy {

View File

@ -54,7 +54,7 @@ class ContactListState extends ChangeNotifier {
if (otherGroups != null && otherGroups.isNotEmpty) { if (otherGroups != null && otherGroups.isNotEmpty) {
EnvironmentConfig.debugLog("sharing antispam tickets to new group. FIXME: in Cwtch 1.14"); EnvironmentConfig.debugLog("sharing antispam tickets to new group. FIXME: in Cwtch 1.14");
var antispamTickets = otherGroups[0].antispamTickets; var antispamTickets = otherGroups[0].antispamTickets;
_contacts.last!.antispamTickets = antispamTickets; _contacts.last.antispamTickets = antispamTickets;
} }
servers?.addGroup(newContact); servers?.addGroup(newContact);
} }

View File

@ -34,7 +34,7 @@ abstract class Message {
Widget getWidget(BuildContext context, Key key, int index); Widget getWidget(BuildContext context, Key key, int index);
Widget getPreviewWidget(BuildContext context); Widget getPreviewWidget(BuildContext context, {BoxConstraints? constraints});
} }
Message compileOverlay(MessageInfo messageInfo) { Message compileOverlay(MessageInfo messageInfo) {
@ -64,6 +64,7 @@ Message compileOverlay(MessageInfo messageInfo) {
abstract class CacheHandler { abstract class CacheHandler {
Future<MessageInfo?> get(Cwtch cwtch, String profileOnion, int conversationIdentifier, MessageCache cache); Future<MessageInfo?> get(Cwtch cwtch, String profileOnion, int conversationIdentifier, MessageCache cache);
Future<MessageInfo?> sync(Cwtch cwtch, String profileOnion, int conversationIdentifier, MessageCache cache);
} }
class ByIndex implements CacheHandler { class ByIndex implements CacheHandler {
@ -128,7 +129,8 @@ class ByIndex implements CacheHandler {
List<dynamic> messagesWrapper = jsonDecode(msgs); List<dynamic> messagesWrapper = jsonDecode(msgs);
for (; i < messagesWrapper.length; i++) { for (; i < messagesWrapper.length; i++) {
var messageInfo = messageWrapperToInfo(profileOnion, conversationIdentifier, messagesWrapper[i]); var messageInfo = MessageWrapperToInfo(profileOnion, conversationIdentifier, messagesWrapper[i]);
messageInfo.metadata.lastChecked = DateTime.now();
cache.addIndexed(messageInfo, start + i); cache.addIndexed(messageInfo, start + i);
} }
} catch (e, stacktrace) { } catch (e, stacktrace) {
@ -143,6 +145,13 @@ class ByIndex implements CacheHandler {
void add(MessageCache cache, MessageInfo messageInfo) { void add(MessageCache cache, MessageInfo messageInfo) {
cache.addIndexed(messageInfo, index); cache.addIndexed(messageInfo, index);
} }
@override
Future<MessageInfo?> sync(Cwtch cwtch, String profileOnion, int conversationIdentifier, MessageCache cache) {
EnvironmentConfig.debugLog("performing a resync on message ${index}");
fetchAndProcess(index, 1, cwtch, profileOnion, conversationIdentifier, cache);
return get(cwtch, profileOnion, conversationIdentifier, cache);
}
} }
class ById implements CacheHandler { class ById implements CacheHandler {
@ -172,6 +181,11 @@ class ById implements CacheHandler {
} }
return fetch(cwtch, profileOnion, conversationIdentifier, cache); return fetch(cwtch, profileOnion, conversationIdentifier, cache);
} }
@override
Future<MessageInfo?> sync(Cwtch cwtch, String profileOnion, int conversationIdentifier, MessageCache cache) {
return get(cwtch, profileOnion, conversationIdentifier, cache);
}
} }
class ByContentHash implements CacheHandler { class ByContentHash implements CacheHandler {
@ -200,6 +214,11 @@ class ByContentHash implements CacheHandler {
} }
return fetch(cwtch, profileOnion, conversationIdentifier, cache); return fetch(cwtch, profileOnion, conversationIdentifier, cache);
} }
@override
Future<MessageInfo?> sync(Cwtch cwtch, String profileOnion, int conversationIdentifier, MessageCache cache) {
return get(cwtch, profileOnion, conversationIdentifier, cache);
}
} }
List<Message> getReplies(MessageCache cache, int messageIdentifier) { List<Message> getReplies(MessageCache cache, int messageIdentifier) {
@ -257,6 +276,16 @@ Future<Message> messageHandler(BuildContext context, String profileOnion, int co
MessageInfo? messageInfo = await cacheHandler.get(cwtch, profileOnion, conversationIdentifier, cache); MessageInfo? messageInfo = await cacheHandler.get(cwtch, profileOnion, conversationIdentifier, cache);
if (messageInfo != null) {
if (messageInfo.metadata.ackd == false) {
if (messageInfo.metadata.lastChecked == null || messageInfo.metadata.lastChecked!.difference(DateTime.now()).abs().inSeconds > 30) {
messageInfo.metadata.lastChecked = DateTime.now();
// NOTE: Only ByIndex lookups will trigger
messageInfo = await cacheHandler.sync(cwtch, profileOnion, conversationIdentifier, cache);
}
}
}
if (messageInfo != null) { if (messageInfo != null) {
return compileOverlay(messageInfo); return compileOverlay(messageInfo);
} else { } else {
@ -272,14 +301,14 @@ MessageInfo? messageJsonToInfo(String profileOnion, int conversationIdentifier,
return null; return null;
} }
return messageWrapperToInfo(profileOnion, conversationIdentifier, messageWrapper); return MessageWrapperToInfo(profileOnion, conversationIdentifier, messageWrapper);
} catch (e, stacktrace) { } catch (e, stacktrace) {
EnvironmentConfig.debugLog("message handler exception on parse message and cache: " + e.toString() + " " + stacktrace.toString()); EnvironmentConfig.debugLog("message handler exception on parse message and cache: " + e.toString() + " " + stacktrace.toString());
return null; return null;
} }
} }
MessageInfo messageWrapperToInfo(String profileOnion, int conversationIdentifier, dynamic messageWrapper) { MessageInfo MessageWrapperToInfo(String profileOnion, int conversationIdentifier, dynamic messageWrapper) {
// Construct the initial metadata // Construct the initial metadata
var messageID = messageWrapper['ID']; var messageID = messageWrapper['ID'];
var timestamp = DateTime.tryParse(messageWrapper['Timestamp'])!; var timestamp = DateTime.tryParse(messageWrapper['Timestamp'])!;
@ -312,6 +341,7 @@ class MessageMetadata extends ChangeNotifier {
final String? signature; final String? signature;
final String contenthash; final String contenthash;
DateTime? lastChecked;
dynamic get attributes => this._attributes; dynamic get attributes => this._attributes;

View File

@ -1,5 +1,4 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
/// A "MessageDraft" structure that stores information about in-progress message drafts. /// A "MessageDraft" structure that stores information about in-progress message drafts.
/// MessageDraft stores text, quoted replies, and attached images. /// MessageDraft stores text, quoted replies, and attached images.
@ -50,6 +49,8 @@ class MessageDraft extends ChangeNotifier {
void clearDraft() { void clearDraft() {
this._quotedReference = null; this._quotedReference = null;
this.ctrlCompose.clear(); this.ctrlCompose.clear();
this.ctrlCompose.clearComposing();
this.ctrlCompose.text = "";
this._inviteHandle = null; this._inviteHandle = null;
notifyListeners(); notifyListeners();
} }

View File

@ -128,8 +128,9 @@ class MessageCache extends ChangeNotifier {
void addNew(String profileOnion, int conversation, int messageID, DateTime timestamp, String senderHandle, String senderImage, bool isAuto, String data, String contenthash) { void addNew(String profileOnion, int conversation, int messageID, DateTime timestamp, String senderHandle, String senderImage, bool isAuto, String data, String contenthash) {
this.cache[messageID] = MessageInfo(MessageMetadata(profileOnion, conversation, messageID, timestamp, senderHandle, senderImage, "", {}, false, false, isAuto, contenthash), data); this.cache[messageID] = MessageInfo(MessageMetadata(profileOnion, conversation, messageID, timestamp, senderHandle, senderImage, "", {}, false, false, isAuto, contenthash), data);
this.cache[messageID]?.metadata.lastChecked = DateTime.now(); // Don't check straight away...
this.cacheByIndex.insert(0, LocalIndexMessage(messageID)); this.cacheByIndex.insert(0, LocalIndexMessage(messageID));
if (contenthash != null && contenthash != "") { if (contenthash != "") {
this.cacheByHash[contenthash] = messageID; this.cacheByHash[contenthash] = messageID;
} }
} }

View File

@ -49,24 +49,27 @@ class FileMessage extends Message {
} }
@override @override
Widget getPreviewWidget(BuildContext context) { Widget getPreviewWidget(BuildContext context, {BoxConstraints? constraints}) {
return ChangeNotifierProvider.value( return ChangeNotifierProvider.value(
value: this.metadata, value: this.metadata,
builder: (bcontext, child) { builder: (bcontext, child) {
dynamic shareObj = jsonDecode(this.content); dynamic shareObj = jsonDecode(this.content);
if (shareObj == null) { if (shareObj == null) {
return MessageRow(MalformedBubble(), 0); return MalformedBubble();
} }
String nameSuggestion = shareObj['f'] as String; String nameSuggestion = shareObj['f'] as String;
String rootHash = shareObj['h'] as String; String rootHash = shareObj['h'] as String;
String nonce = shareObj['n'] as String; String nonce = shareObj['n'] as String;
int fileSize = shareObj['s'] as int; int fileSize = shareObj['s'] as int;
if (!validHash(rootHash, nonce)) { if (!validHash(rootHash, nonce)) {
return MessageRow(MalformedBubble(), 0); return MalformedBubble();
} }
return Container( return Container(
alignment: Alignment.center, padding: EdgeInsets.all(1.0),
height: 100, decoration: BoxDecoration(),
clipBehavior: Clip.antiAliasWithSaveLayer,
constraints: BoxConstraints(minHeight: 50, maxHeight: 50, minWidth: 50, maxWidth: 300),
alignment: Alignment.centerLeft,
child: FileBubble( child: FileBubble(
nameSuggestion, nameSuggestion,
rootHash, rootHash,

View File

@ -48,7 +48,7 @@ class InviteMessage extends Message {
} }
@override @override
Widget getPreviewWidget(BuildContext context) { Widget getPreviewWidget(BuildContext context, {BoxConstraints? constraints}) {
return ChangeNotifierProvider.value( return ChangeNotifierProvider.value(
value: this.metadata, value: this.metadata,
builder: (bcontext, child) { builder: (bcontext, child) {

View File

@ -18,7 +18,7 @@ class MalformedMessage extends Message {
} }
@override @override
Widget getPreviewWidget(BuildContext context) { Widget getPreviewWidget(BuildContext context, {BoxConstraints? constraints}) {
return ChangeNotifierProvider.value( return ChangeNotifierProvider.value(
value: this.metadata, value: this.metadata,
builder: (bcontext, child) { builder: (bcontext, child) {

View File

@ -1,6 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'package:cwtch/config.dart';
import 'package:cwtch/models/message.dart'; import 'package:cwtch/models/message.dart';
import 'package:cwtch/models/messages/malformedmessage.dart'; import 'package:cwtch/models/messages/malformedmessage.dart';
import 'package:cwtch/widgets/malformedbubble.dart'; import 'package:cwtch/widgets/malformedbubble.dart';
@ -11,7 +10,6 @@ import 'package:flutter/widgets.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../settings.dart'; import '../../settings.dart';
import '../../third_party/linkify/flutter_linkify.dart';
class QuotedMessageStructure { class QuotedMessageStructure {
final String quotedHash; final String quotedHash;
@ -30,7 +28,7 @@ class QuotedMessage extends Message {
QuotedMessage(this.metadata, this.content); QuotedMessage(this.metadata, this.content);
@override @override
Widget getPreviewWidget(BuildContext context) { Widget getPreviewWidget(BuildContext context, {BoxConstraints? constraints}) {
return ChangeNotifierProvider.value( return ChangeNotifierProvider.value(
value: this.metadata, value: this.metadata,
builder: (bcontext, child) { builder: (bcontext, child) {
@ -40,7 +38,7 @@ class QuotedMessage extends Message {
); );
var content = message["body"]; var content = message["body"];
var formatMessages = Provider.of<Settings>(bcontext).isExperimentEnabled(FormattingExperiment); var formatMessages = Provider.of<Settings>(bcontext).isExperimentEnabled(FormattingExperiment);
return compileMessageContentWidget(context, false, content, FocusNode(), formatMessages, false); return compileMessageContentWidget(context, constraints ?? BoxConstraints.loose(MediaQuery.sizeOf(context)), false, content, FocusNode(), formatMessages, false);
} catch (e) { } catch (e) {
return MalformedBubble(); return MalformedBubble();
} }

View File

@ -1,17 +1,11 @@
import 'dart:math';
import 'package:cwtch/models/message.dart'; import 'package:cwtch/models/message.dart';
import 'package:cwtch/models/messages/malformedmessage.dart';
import 'package:cwtch/widgets/malformedbubble.dart';
import 'package:cwtch/widgets/messagebubble.dart'; import 'package:cwtch/widgets/messagebubble.dart';
import 'package:cwtch/widgets/messageloadingbubble.dart';
import 'package:cwtch/widgets/messagerow.dart'; import 'package:cwtch/widgets/messagerow.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../settings.dart'; import '../../settings.dart';
import '../../third_party/linkify/flutter_linkify.dart';
import '../../widgets/messageBubbleWidgetHelpers.dart'; import '../../widgets/messageBubbleWidgetHelpers.dart';
class TextMessage extends Message { class TextMessage extends Message {
@ -21,13 +15,12 @@ class TextMessage extends Message {
TextMessage(this.metadata, this.content); TextMessage(this.metadata, this.content);
@override @override
Widget getPreviewWidget(BuildContext context) { Widget getPreviewWidget(BuildContext context, {BoxConstraints? constraints}) {
return ChangeNotifierProvider.value( return ChangeNotifierProvider.value(
value: this.metadata, value: this.metadata,
builder: (bcontext, child) { builder: (bcontext, child) {
var formatMessages = Provider.of<Settings>(bcontext).isExperimentEnabled(FormattingExperiment); var formatMessages = Provider.of<Settings>(bcontext).isExperimentEnabled(FormattingExperiment);
return compileMessageContentWidget(context, false, content, FocusNode(), formatMessages, false); return compileMessageContentWidget(context, constraints ?? BoxConstraints.loose(MediaQuery.sizeOf(context)), false, content, FocusNode(), formatMessages, false);
;
}); });
} }

View File

@ -14,8 +14,6 @@ import '../views/contactsview.dart';
import 'contact.dart'; import 'contact.dart';
import 'contactlist.dart'; import 'contactlist.dart';
import 'filedownloadprogress.dart'; import 'filedownloadprogress.dart';
import 'message.dart';
import 'messagecache.dart';
import 'profileservers.dart'; import 'profileservers.dart';
class ProfileInfoState extends ChangeNotifier { class ProfileInfoState extends ChangeNotifier {
@ -241,7 +239,7 @@ class ProfileInfoState extends ChangeNotifier {
this._unreadMessages = 0; this._unreadMessages = 0;
this.replaceServers(serverJson); this.replaceServers(serverJson);
if (contactsJson != null && contactsJson != "" && contactsJson != "null") { if (contactsJson != "" && contactsJson != "null") {
List<dynamic> contacts = jsonDecode(contactsJson); List<dynamic> contacts = jsonDecode(contactsJson);
contacts.forEach((contact) { contacts.forEach((contact) {
var profileContact = this._contacts.getContact(contact["identifier"]); var profileContact = this._contacts.getContact(contact["identifier"]);

View File

@ -1,6 +1,3 @@
import 'dart:ui';
import 'package:cwtch/config.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';

View File

@ -1,5 +1,3 @@
import 'dart:io';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
@ -39,5 +37,7 @@ String prettyDateString(BuildContext context, DateTime date) {
// } // }
return AppLocalizations.of(context)!.now; return AppLocalizations.of(context)!.now;
} }
return DateFormat.yMd(Platform.localeName).add_jm().format(date.toLocal()); // note: explicitly overriding the 'locale' here to force
// a consistent YYYY-mm-dd HH::MM format.
return DateFormat.yMd('en_CA').add_jm().format(date.toLocal());
} }

View File

@ -1,4 +1,3 @@
import 'package:cwtch/config.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'contact.dart'; import 'contact.dart';

View File

@ -3,13 +3,8 @@ import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:cwtch/main.dart'; import 'package:cwtch/main.dart';
import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
import 'package:win_toast/win_toast.dart'; import 'package:win_toast/win_toast.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:flutter_local_notifications_linux/flutter_local_notifications_linux.dart';
import 'package:flutter_local_notifications_linux/src/model/hint.dart';
import 'package:flutter_local_notifications_linux/src/model/icon.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;

View File

@ -1,8 +1,6 @@
import 'dart:collection'; import 'dart:collection';
import 'dart:ui';
import 'dart:core'; import 'dart:core';
import 'package:cwtch/themes/cwtch.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:package_info_plus/package_info_plus.dart'; import 'package:package_info_plus/package_info_plus.dart';
@ -42,7 +40,7 @@ enum NotificationContent {
class Settings extends ChangeNotifier { class Settings extends ChangeNotifier {
Locale locale; Locale locale;
late PackageInfo packageInfo; late PackageInfo packageInfo;
OpaqueThemeType theme; bool _themeImages = false;
// explicitly set experiments to false until told otherwise... // explicitly set experiments to false until told otherwise...
bool experimentsEnabled = false; bool experimentsEnabled = false;
@ -69,6 +67,8 @@ class Settings extends ChangeNotifier {
bool _useSemanticDebugger = false; bool _useSemanticDebugger = false;
double _fontScaling = 1.0; double _fontScaling = 1.0;
ThemeLoader themeloader = ThemeLoader();
String get torCacheDir => _torCacheDir; String get torCacheDir => _torCacheDir;
// Whether to show the profiling interface, not saved // Whether to show the profiling interface, not saved
@ -87,8 +87,19 @@ class Settings extends ChangeNotifier {
bool get useSemanticDebugger => _useSemanticDebugger; bool get useSemanticDebugger => _useSemanticDebugger;
String? _themeId;
String? get themeId => _themeId;
String? _mode;
OpaqueThemeType get theme => themeloader.getTheme(_themeId, _mode);
void setTheme(String themeId, String mode) { void setTheme(String themeId, String mode) {
theme = getTheme(themeId, mode); _themeId = themeId;
_mode = mode;
notifyListeners();
}
bool get themeImages => _themeImages;
set themeImages(bool newVal) {
_themeImages = newVal;
notifyListeners(); notifyListeners();
} }
@ -127,6 +138,7 @@ class Settings extends ChangeNotifier {
handleUpdate(dynamic settings) { handleUpdate(dynamic settings) {
// Set Theme and notify listeners // Set Theme and notify listeners
this.setTheme(settings["Theme"], settings["ThemeMode"] ?? mode_dark); this.setTheme(settings["Theme"], settings["ThemeMode"] ?? mode_dark);
_themeImages = settings["ThemeImages"] ?? false;
// Set Locale and notify listeners // Set Locale and notify listeners
switchLocaleByCode(settings["Locale"]); switchLocaleByCode(settings["Locale"]);
@ -396,9 +408,12 @@ class Settings extends ChangeNotifier {
// checks experiment settings and file extension for image previews // checks experiment settings and file extension for image previews
// (ignores file size; if the user manually accepts the file, assume it's okay to preview) // (ignores file size; if the user manually accepts the file, assume it's okay to preview)
bool shouldPreview(String path) { bool shouldPreview(String path) {
return isExperimentEnabled(ImagePreviewsExperiment) && isImage(path);
}
bool isImage(String path) {
var lpath = path.toLowerCase(); var lpath = path.toLowerCase();
return isExperimentEnabled(ImagePreviewsExperiment) && return (lpath.endsWith(".jpg") || lpath.endsWith(".jpeg") || lpath.endsWith(".png") || lpath.endsWith(".gif") || lpath.endsWith(".webp") || lpath.endsWith(".bmp"));
(lpath.endsWith(".jpg") || lpath.endsWith(".jpeg") || lpath.endsWith(".png") || lpath.endsWith(".gif") || lpath.endsWith(".webp") || lpath.endsWith(".bmp"));
} }
String get downloadPath => _downloadPath; String get downloadPath => _downloadPath;
@ -453,7 +468,7 @@ class Settings extends ChangeNotifier {
} }
/// Construct a default settings object. /// Construct a default settings object.
Settings(this.locale, this.theme); Settings(this.locale);
String _blodeuweddPath = ""; String _blodeuweddPath = "";
String get blodeuweddPath => _blodeuweddPath; String get blodeuweddPath => _blodeuweddPath;
@ -467,8 +482,9 @@ class Settings extends ChangeNotifier {
dynamic asJson() { dynamic asJson() {
return { return {
"Locale": this.locale.toString(), "Locale": this.locale.toString(),
"Theme": theme.theme, "Theme": _themeId,
"ThemeMode": theme.mode, "ThemeMode": theme.mode,
"ThemeImages": _themeImages,
"PreviousPid": -1, "PreviousPid": -1,
"BlockUnknownConnections": blockUnknownConnections, "BlockUnknownConnections": blockUnknownConnections,
"NotificationPolicy": _notificationPolicy.toString(), "NotificationPolicy": _notificationPolicy.toString(),

View File

@ -63,6 +63,7 @@ class CwtchDark extends OpaqueThemeType {
get messageFromMeTextColor => font; //whiteishPurple; get messageFromMeTextColor => font; //whiteishPurple;
get messageFromOtherBackgroundColor => peerBubble; //deepPurple; get messageFromOtherBackgroundColor => peerBubble; //deepPurple;
get messageFromOtherTextColor => font; //whiteishPurple; get messageFromOtherTextColor => font; //whiteishPurple;
get messageSelectionColor => accent;
get portraitBackgroundColor => deepPurple; get portraitBackgroundColor => deepPurple;
get portraitBlockedBorderColor => lightGrey; get portraitBlockedBorderColor => lightGrey;
get portraitBlockedTextColor => lightGrey; get portraitBlockedTextColor => lightGrey;
@ -70,6 +71,8 @@ class CwtchDark extends OpaqueThemeType {
get portraitContactBadgeTextColor => whiteishPurple; get portraitContactBadgeTextColor => whiteishPurple;
get portraitOfflineBorderColor => purple; get portraitOfflineBorderColor => purple;
get portraitOnlineBorderColor => whiteishPurple; get portraitOnlineBorderColor => whiteishPurple;
get portraitOnlineAwayColor => Color(0xFFFFF59D);
get portraitOnlineBusyColor => Color(0xFFEF9A9A);
get portraitProfileBadgeColor => hotPink; get portraitProfileBadgeColor => hotPink;
get portraitProfileBadgeTextColor => whiteishPurple; get portraitProfileBadgeTextColor => whiteishPurple;
get scrollbarDefaultColor => purple; get scrollbarDefaultColor => purple;
@ -79,8 +82,14 @@ class CwtchDark extends OpaqueThemeType {
get textfieldBorderColor => deepPurple; get textfieldBorderColor => deepPurple;
get textfieldErrorColor => hotPink; get textfieldErrorColor => hotPink;
get textfieldHintColor => mainTextColor; get textfieldHintColor => mainTextColor;
get textfieldSelectionColor => accent;
get toolbarIconColor => settings; //whiteishPurple; get toolbarIconColor => settings; //whiteishPurple;
get topbarColor => header; //darkGreyPurple; get topbarColor => header; //darkGreyPurple;
get menuBackgroundColor => accent;
get menuTextColor => darkGreyPurple;
get snackbarBackgroundColor => accent;
get snackbarTextColor => whitePurple;
get chatImageColor => purple;
} }
class CwtchLight extends OpaqueThemeType { class CwtchLight extends OpaqueThemeType {
@ -108,6 +117,7 @@ class CwtchLight extends OpaqueThemeType {
get messageFromMeTextColor => font; //mainTextColor; get messageFromMeTextColor => font; //mainTextColor;
get messageFromOtherBackgroundColor => peerBubble; //purple; get messageFromOtherBackgroundColor => peerBubble; //purple;
get messageFromOtherTextColor => font; //darkPurple; get messageFromOtherTextColor => font; //darkPurple;
get messageSelectionColor => accent;
get portraitBackgroundColor => softPurple; get portraitBackgroundColor => softPurple;
get portraitBlockedBorderColor => softGrey; get portraitBlockedBorderColor => softGrey;
get portraitBlockedTextColor => softGrey; get portraitBlockedTextColor => softGrey;
@ -115,6 +125,8 @@ class CwtchLight extends OpaqueThemeType {
get portraitContactBadgeTextColor => whitePurple; get portraitContactBadgeTextColor => whitePurple;
get portraitOfflineBorderColor => greyPurple; get portraitOfflineBorderColor => greyPurple;
get portraitOnlineBorderColor => greyPurple; get portraitOnlineBorderColor => greyPurple;
get portraitOnlineAwayColor => Color(0xFFFFF59D);
get portraitOnlineBusyColor => Color(0xFFEF9A9A);
get portraitProfileBadgeColor => accent; get portraitProfileBadgeColor => accent;
get portraitProfileBadgeTextColor => whitePurple; get portraitProfileBadgeTextColor => whitePurple;
get scrollbarDefaultColor => accent; get scrollbarDefaultColor => accent;
@ -124,6 +136,12 @@ class CwtchLight extends OpaqueThemeType {
get textfieldBorderColor => purple; get textfieldBorderColor => purple;
get textfieldErrorColor => hotPink; get textfieldErrorColor => hotPink;
get textfieldHintColor => font; get textfieldHintColor => font;
get textfieldSelectionColor => accent;
get toolbarIconColor => settings; //darkPurple; get toolbarIconColor => settings; //darkPurple;
get topbarColor => header; //softPurple; get topbarColor => header; //softPurple;
get menuBackgroundColor => accent;
get menuTextColor => whitePurple;
get snackbarBackgroundColor => accent;
get snackbarTextColor => whitePurple;
get chatImageColor => purple;
} }

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