Compare commits
110 Commits
post-stabl
...
trunk
Author | SHA1 | Date |
---|---|---|
Dan Ballard | 899da5fea1 | |
Sarah Jamie Lewis | 7741b255da | |
Sarah Jamie Lewis | 3aa0042b71 | |
Sarah Jamie Lewis | 4cb59d6cbc | |
Dan Ballard | f8ec6099bc | |
Sarah Jamie Lewis | 6e010b27b7 | |
Dan Ballard | 9f982ae167 | |
Dan Ballard | db1f0ed41e | |
Dan Ballard | fab824edce | |
Dan Ballard | 48152acca1 | |
Dan Ballard | 644245d9ce | |
Dan Ballard | b4b27da3e8 | |
Dan Ballard | 8f2b0b8563 | |
Sarah Jamie Lewis | ff297ff9e9 | |
Dan Ballard | 4dbfc83f16 | |
Dan Ballard | ddc23e35ca | |
Sarah Jamie Lewis | 50c9f66aca | |
Sarah Jamie Lewis | a4421f831a | |
Sarah Jamie Lewis | 33bc7b6db8 | |
Sarah Jamie Lewis | b23f8efaa1 | |
Sarah Jamie Lewis | e4c7729456 | |
Sarah Jamie Lewis | b64b99b510 | |
Sarah Jamie Lewis | 058fba7e69 | |
Sarah Jamie Lewis | da0d63b0dc | |
Sarah Jamie Lewis | 7cea83d141 | |
Sarah Jamie Lewis | 3b818e1181 | |
Sarah Jamie Lewis | 37ce0bd1d2 | |
Sarah Jamie Lewis | 26a3270585 | |
Sarah Jamie Lewis | 3463894dfd | |
Sarah Jamie Lewis | a479c2aeba | |
Sarah Jamie Lewis | fcd16b19c8 | |
Sarah Jamie Lewis | a866d9ff8a | |
Sarah Jamie Lewis | ff0bb0b548 | |
Sarah Jamie Lewis | 5ff87eb68a | |
Sarah Jamie Lewis | d22fccdd51 | |
Sarah Jamie Lewis | 2f1e939fdd | |
Sarah Jamie Lewis | 213ed00373 | |
Sarah Jamie Lewis | ff7d1cbd05 | |
Sarah Jamie Lewis | 3014a85803 | |
Sarah Jamie Lewis | a2f0fbdb38 | |
Sarah Jamie Lewis | 1dbd4b7ffc | |
Sarah Jamie Lewis | 03ffed9b25 | |
Sarah Jamie Lewis | dc45506f69 | |
Sarah Jamie Lewis | 8a0d52ab16 | |
Sarah Jamie Lewis | 7773efb8ee | |
Sarah Jamie Lewis | 8cc8af6a91 | |
Sarah Jamie Lewis | 9f03b48757 | |
Sarah Jamie Lewis | 098adc46e6 | |
Sarah Jamie Lewis | f235e56fbb | |
Sarah Jamie Lewis | 11e7e58109 | |
Sarah Jamie Lewis | 5627f6a438 | |
Sarah Jamie Lewis | caf85f337b | |
Sarah Jamie Lewis | eaae82ef55 | |
Sarah Jamie Lewis | 0ea595692f | |
Sarah Jamie Lewis | 5626e6ed90 | |
Dan Ballard | 273613a8b8 | |
Sarah Jamie Lewis | ff55f70bd4 | |
Dan Ballard | 7febeeadb6 | |
Dan Ballard | a6c0e8105d | |
Sarah Jamie Lewis | 3d2b960a20 | |
Sarah Jamie Lewis | f046dd923e | |
Sarah Jamie Lewis | 015b6ad10c | |
Dan Ballard | ea213080b1 | |
Sarah Jamie Lewis | fecf29176b | |
Sarah Jamie Lewis | 4bad19926b | |
Sarah Jamie Lewis | 75958faa38 | |
Sarah Jamie Lewis | 8300acb6f9 | |
Sarah Jamie Lewis | 33f99a3b18 | |
Sarah Jamie Lewis | b291188550 | |
Sarah Jamie Lewis | 0342eae5ce | |
Sarah Jamie Lewis | fe085e4802 | |
Sarah Jamie Lewis | 38d84e0f62 | |
Sarah Jamie Lewis | 3be7066e5d | |
Sarah Jamie Lewis | b492be0200 | |
Sarah Jamie Lewis | 6ba6f76ee1 | |
Sarah Jamie Lewis | 4ea0d4261c | |
Sarah Jamie Lewis | 88a8ac8cca | |
Sarah Jamie Lewis | 0eb1b95811 | |
Dan Ballard | e0546eb502 | |
Sarah Jamie Lewis | 68c83f2c9a | |
Sarah Jamie Lewis | 8bc0605503 | |
Sarah Jamie Lewis | e4b2e7936f | |
Sarah Jamie Lewis | 8acefb8b0b | |
Sarah Jamie Lewis | ad9c974dbd | |
Sarah Jamie Lewis | 9efc3e3c4a | |
Sarah Jamie Lewis | 5001255a8a | |
Sarah Jamie Lewis | 4578cc51ec | |
Sarah Jamie Lewis | a7041770a0 | |
Sarah Jamie Lewis | 497a12e8b6 | |
Sarah Jamie Lewis | cd476f39c0 | |
Sarah Jamie Lewis | 907cc262bb | |
Sarah Jamie Lewis | cb079c2fd3 | |
Sarah Jamie Lewis | 659c7fe75e | |
Sarah Jamie Lewis | abd32293eb | |
Sarah Jamie Lewis | 30dd0982db | |
Sarah Jamie Lewis | 52d0a6cf3f | |
Sarah Jamie Lewis | 9b65048bfd | |
Dan Ballard | 75eeb90cbb | |
Dan Ballard | 3095e9099f | |
Dan Ballard | 48dda98f25 | |
Dan Ballard | 8d1d9ded5e | |
Dan Ballard | 7dc25b92c7 | |
Dan Ballard | 581c52a53f | |
Dan Ballard | 74a9656216 | |
Dan Ballard | a8c957e679 | |
Dan Ballard | 183b88d8e0 | |
Sarah Jamie Lewis | da42a29e66 | |
Sarah Jamie Lewis | 6b6c60d9e5 | |
Dan Ballard | a48422cf5f | |
Dan Ballard | 238cddd7d3 |
57
.drone.yml
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
2024-01-03-20-52-v0.0.10-4-g6c0b2e2
|
2024-02-26-18-01-v0.0.14
|
2
LICENSE
|
@ -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:
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
`
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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" />
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
|
|
@ -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>
|
Before Width: | Height: | Size: 544 B |
Before Width: | Height: | Size: 442 B |
Before Width: | Height: | Size: 721 B |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.4 KiB |
|
@ -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>
|
|
@ -0,0 +1,5 @@
|
||||||
|
<resources>
|
||||||
|
<color name="darkGreyPurple">#281831</color>
|
||||||
|
<color name="testGreen">#00ff00</color>
|
||||||
|
<color name="ic_launcher_background">@color/darkGreyPurple</color>
|
||||||
|
</resources>
|
|
@ -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>
|
|
@ -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
|
}
|
||||||
//}
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
After Width: | Height: | Size: 19 KiB |
|
@ -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
|
After Width: | Height: | Size: 20 KiB |
|
@ -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
|
After Width: | Height: | Size: 19 KiB |
|
@ -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
|
After Width: | Height: | Size: 22 KiB |
|
@ -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
|
||||||
|
|
After Width: | Height: | Size: 26 KiB |
|
@ -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
|
||||||
|
|
After Width: | Height: | Size: 17 KiB |
|
@ -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
|
After Width: | Height: | Size: 17 KiB |
|
@ -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
|
||||||
|
|
After Width: | Height: | Size: 19 KiB |
|
@ -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
|
After Width: | Height: | Size: 20 KiB |
|
@ -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
|
||||||
|
|
After Width: | Height: | Size: 26 KiB |
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>(
|
||||||
|
|
|
@ -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;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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...
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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.",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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"
|
|
||||||
}
|
}
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
;
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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"]);
|
||||||
|
|
|
@ -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';
|
||||||
|
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
|
@ -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';
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|