Compare commits
No commits in common. "main" and "rc1.6.0-1" have entirely different histories.
5
.gitignore
vendored
@ -10,10 +10,11 @@
|
||||
.buildlog/
|
||||
.history
|
||||
.svn/
|
||||
lib/generated_plugin_registrant.dart
|
||||
prime
|
||||
|
||||
# libolm package
|
||||
/assets/js/package
|
||||
/assets/js/package/*
|
||||
|
||||
# IntelliJ related
|
||||
*.iml
|
||||
@ -37,6 +38,7 @@ prime
|
||||
/build/
|
||||
|
||||
# Web related
|
||||
lib/generated_plugin_registrant.dart
|
||||
docs/build/
|
||||
docs/.jekyll-cache/
|
||||
docs/_site/
|
||||
@ -60,4 +62,3 @@ ios/Podfile.lock
|
||||
/linux/out
|
||||
/macos/out
|
||||
.vs
|
||||
olm
|
||||
|
||||
370
.gitlab-ci.yml
@ -1,7 +1,7 @@
|
||||
variables:
|
||||
FLUTTER_VERSION: 3.10.0
|
||||
FLUTTER_VERSION: 3.0.5
|
||||
|
||||
image: ghcr.io/cirruslabs/flutter:${FLUTTER_VERSION}
|
||||
image: cirrusci/flutter:${FLUTTER_VERSION}
|
||||
|
||||
.shared_windows_runners:
|
||||
tags:
|
||||
@ -10,180 +10,141 @@ image: ghcr.io/cirruslabs/flutter:${FLUTTER_VERSION}
|
||||
- windows-1809
|
||||
|
||||
stages:
|
||||
- test
|
||||
- build
|
||||
- coverage
|
||||
- release
|
||||
- deploy
|
||||
|
||||
code_analyze:
|
||||
stage: test
|
||||
script:
|
||||
- flutter pub get
|
||||
- dart run import_sorter:main --no-comments --exit-if-changed
|
||||
- dart format lib/ test/ --set-exit-if-changed
|
||||
- flutter analyze
|
||||
- git apply ./scripts/enable-android-google-services.patch
|
||||
- flutter pub get
|
||||
- flutter analyze
|
||||
- flutter pub run dart_code_metrics:metrics lib -r gitlab > code-quality-report.json || true
|
||||
stage: coverage
|
||||
script: [./scripts/code_analyze.sh]
|
||||
artifacts:
|
||||
reports:
|
||||
codequality: code-quality-report.json
|
||||
|
||||
widget_test:
|
||||
stage: test
|
||||
code_analyze_beta:
|
||||
extends: code_analyze
|
||||
image:
|
||||
name: cirrusci/flutter:beta
|
||||
allow_failure: true
|
||||
|
||||
test:
|
||||
stage: coverage
|
||||
script: [flutter test]
|
||||
|
||||
# the basic integration test configuration testing FLOSS builds on Synapse
|
||||
.integration_test:
|
||||
integration_test:
|
||||
image: registry.gitlab.com/famedly/company/frontend/flutter-dockerimages/integration/stable:${FLUTTER_VERSION}
|
||||
stage: test
|
||||
stage: coverage
|
||||
services:
|
||||
- name: docker:dind
|
||||
alias: docker
|
||||
parallel:
|
||||
matrix:
|
||||
- HOMESERVER_IMPLEMENTATION:
|
||||
- synapse
|
||||
- dendrite
|
||||
- conduit
|
||||
variables:
|
||||
# activate container-to-container networking
|
||||
FF_NETWORK_PER_BUILD: "true"
|
||||
# Tell docker CLI how to talk to Docker daemon.
|
||||
DOCKER_HOST: tcp://docker:2375/
|
||||
# Use the btrfs driver for improved performance.
|
||||
DOCKER_DRIVER: btrfs
|
||||
# Use the overlayfs driver for improved performance.
|
||||
DOCKER_DRIVER: overlay2
|
||||
# Disable TLS since we're running inside local network.
|
||||
DOCKER_TLS_CERTDIR: ""
|
||||
HOMESERVER: docker
|
||||
before_script:
|
||||
- scripts/integration-prepare-host.sh
|
||||
# create test user environment variables
|
||||
- source scripts/integration-create-environment-variables.sh
|
||||
# start AVD and keep running in background
|
||||
- scripts/integration-start-avd.sh &
|
||||
- scripts/integration-prepare-alpine.sh
|
||||
# create Synapse instance
|
||||
- scripts/integration-server-${HOMESERVER_IMPLEMENTATION}.sh
|
||||
- scripts/integration-server-synapse.sh
|
||||
# properly set the homeserver IP and create test users
|
||||
- scripts/integration-prepare-homeserver.sh
|
||||
# ensure the homeserver works
|
||||
- curl docker:8008/_matrix/static/ 2> /dev/null | grep "It works! Synapse is running"
|
||||
script:
|
||||
# start AVD and keep running in background
|
||||
- scripts/integration-start-avd.sh &
|
||||
- flutter pub get
|
||||
- scrcpy --no-display --record video.mkv &
|
||||
- flutter test integration_test --dart-define=HOMESERVER=$HOMESERVER --dart-define=USER1_NAME=$USER1_NAME --dart-define=USER2_NAME=$USER2_NAME --dart-define=USER1_PW=$USER1_PW --dart-define=USER2_PW=$USER2_PW || ( sleep 10 && exit 1 )
|
||||
after_script:
|
||||
- ffmpeg -i video.mkv -vf scale=iw/2:-2 -crf 40 -b:v 2000k -preset fast video.mp4 || true
|
||||
timeout: 30m
|
||||
retry: 2
|
||||
only:
|
||||
- tags
|
||||
artifacts:
|
||||
when: always
|
||||
paths:
|
||||
- video.mp4
|
||||
- flutter test integration_test
|
||||
tags:
|
||||
- docker
|
||||
- famedly
|
||||
|
||||
# integration tests for Linux builds
|
||||
### disabled because of Linux headless issues
|
||||
.integration_test_linux:
|
||||
extends: .integration_test
|
||||
parallel:
|
||||
matrix:
|
||||
- HOMESERVER_IMPLEMENTATION:
|
||||
- conduit
|
||||
script:
|
||||
- apt-get update
|
||||
- apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev libsecret-1-dev libjsoncpp-dev
|
||||
- flutter pub get
|
||||
- flutter test integration_test -d linux --dart-define=HOMESERVER=$HOMESERVER --dart-define=USER1_NAME=$USER1_NAME --dart-define=USER2_NAME=$USER2_NAME --dart-define=USER1_PW=$USER1_PW --dart-define=USER2_PW=$USER2_PW || ( sleep 10 && exit 1 )
|
||||
after_script: []
|
||||
artifacts:
|
||||
- docker
|
||||
timeout: 20m
|
||||
when: manual
|
||||
|
||||
# extending the default tests to test the Google-flavored builds
|
||||
.integration_test_proprietary:
|
||||
extends: .integration_test
|
||||
parallel:
|
||||
matrix:
|
||||
- HOMESERVER_IMPLEMENTATION:
|
||||
- conduit
|
||||
integration_test_google:
|
||||
extends: integration_test
|
||||
script:
|
||||
# start AVD and keep running in background
|
||||
- scripts/integration-start-avd.sh &
|
||||
- git apply ./scripts/enable-android-google-services.patch
|
||||
- flutter pub get
|
||||
- scrcpy --no-display --record video.mkv &
|
||||
- flutter test integration_test --dart-define=HOMESERVER=$HOMESERVER --dart-define=USER1_NAME=$USER1_NAME --dart-define=USER2_NAME=$USER2_NAME --dart-define=USER1_PW=$USER1_PW --dart-define=USER2_PW=$USER2_PW || ( sleep 10 && exit 1 )
|
||||
- flutter test integration_test
|
||||
when: manual
|
||||
|
||||
# extending the default tests to use Conduit as local homeserver
|
||||
integration_test_conduit:
|
||||
extends: integration_test
|
||||
before_script:
|
||||
# start AVD and keep running in background
|
||||
- scripts/integration-start-avd.sh &
|
||||
- scripts/integration-prepare-alpine.sh
|
||||
# create Conduit instance
|
||||
- scripts/integration-server-conduit.sh
|
||||
# properly set the homeserver IP and create test users
|
||||
- scripts/integration-prepare-homeserver.sh
|
||||
# ensure the homeserver works
|
||||
- curl docker:8008/_matrix/static/ 2> /dev/null | grep "M_NOT_FOUND" 1> /dev/null && echo "Conduit is running!"
|
||||
when: manual
|
||||
|
||||
# extending the default tests to use Dendrite as local homeserver
|
||||
integration_test_dendrite:
|
||||
extends: integration_test
|
||||
before_script:
|
||||
# start AVD and keep running in background
|
||||
- scripts/integration-start-avd.sh &
|
||||
- scripts/integration-prepare-alpine.sh
|
||||
# create Dendrite instance
|
||||
- scripts/integration-server-dendrite.sh
|
||||
# properly set the homeserver IP and create test users
|
||||
- scripts/integration-prepare-homeserver.sh
|
||||
# ensure the homeserver works
|
||||
- curl docker:8008/_matrix/static/ 2> /dev/null | grep "404 page not found" 1> /dev/null && echo "Dendrite is running!"
|
||||
when: manual
|
||||
|
||||
release_mode_launches:
|
||||
parallel:
|
||||
matrix:
|
||||
- FLAVOR:
|
||||
- floss
|
||||
- proprietary
|
||||
image: registry.gitlab.com/famedly/company/frontend/flutter-dockerimages/integration/stable:${FLUTTER_VERSION}
|
||||
stage: test
|
||||
before_script:
|
||||
- |
|
||||
if [ "$FLAVOR" == "proprietary" ]; then
|
||||
git apply ./scripts/enable-android-google-services.patch
|
||||
fi
|
||||
stage: coverage
|
||||
script:
|
||||
# start AVD and keep running in background
|
||||
- scripts/integration-start-avd.sh &
|
||||
# generate temporary release build configuration and ensure app launches
|
||||
- scripts/integration-check-release-build.sh
|
||||
timeout: 20m
|
||||
only:
|
||||
- tags
|
||||
tags:
|
||||
- docker
|
||||
- famedly
|
||||
- docker
|
||||
timeout: 20m
|
||||
when: manual
|
||||
|
||||
release_mode_launches_google:
|
||||
extends: release_mode_launches
|
||||
before_script:
|
||||
- git apply ./scripts/enable-android-google-services.patch
|
||||
|
||||
build_web:
|
||||
stage: build
|
||||
stage: coverage
|
||||
before_script:
|
||||
[sudo apt update && sudo apt install curl -y, ./scripts/prepare-web.sh]
|
||||
script:
|
||||
- flutter build web --release --verbose --source-maps
|
||||
script: [./scripts/build-web.sh]
|
||||
artifacts:
|
||||
paths:
|
||||
- build/web/
|
||||
|
||||
# yes, we *do* build a Windows DLL on Linux. More reliable.
|
||||
build_olm_windows:
|
||||
image: archlinux:latest
|
||||
stage: test
|
||||
before_script:
|
||||
- pacman-key --init
|
||||
- pacman --noconfirm -Sy mingw-w64 cmake git base-devel
|
||||
script:
|
||||
- ./scripts/build-olm-windows.sh
|
||||
- mv olm/build/libolm.dll .
|
||||
artifacts:
|
||||
paths:
|
||||
- libolm.dll
|
||||
build_web_beta:
|
||||
extends: build_web
|
||||
image:
|
||||
name: cirrusci/flutter:beta
|
||||
allow_failure: true
|
||||
only:
|
||||
- main
|
||||
- tags
|
||||
|
||||
build_windows:
|
||||
extends:
|
||||
- .shared_windows_runners
|
||||
stage: test
|
||||
before_script:
|
||||
- ./scripts/prepare-windows.ps1
|
||||
# workarounding artifacts download being broken
|
||||
- $response = Invoke-WebRequest -Uri "$CI_API_V4_URL/projects/$CI_PROJECT_ID/pipelines/$CI_PIPELINE_ID/jobs" -UseBasicParsing
|
||||
- $jobs = $response | ConvertFrom-Json
|
||||
- $job = $jobs | where { $_.name -eq "build_olm_windows" }
|
||||
- $jobId = $job.id
|
||||
- Invoke-WebRequest -Uri "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$jobId/artifacts/libolm.dll" -UseBasicParsing -OutFile libolm.dll
|
||||
script:
|
||||
- ./scripts/build-windows.ps1
|
||||
- Copy-Item -Path "libolm.dll" -Destination "build/windows/runner/Release"
|
||||
- ./scripts/package-windows.ps1
|
||||
stage: coverage
|
||||
before_script: [./scripts/prepare-windows.ps1]
|
||||
script: [./scripts/build-windows.ps1]
|
||||
artifacts:
|
||||
paths:
|
||||
- build/windows/runner/Release
|
||||
@ -193,38 +154,32 @@ build_windows:
|
||||
- tags
|
||||
|
||||
build_android_debug:
|
||||
stage: build
|
||||
script: [flutter build apk --debug]
|
||||
stage: coverage
|
||||
script: [./scripts/build-android-debug.sh]
|
||||
artifacts:
|
||||
when: on_success
|
||||
paths:
|
||||
- build/app/outputs/apk/debug/app-debug.apk
|
||||
tags:
|
||||
- docker
|
||||
- famedly
|
||||
except:
|
||||
- main
|
||||
- tags
|
||||
|
||||
build_android_apk:
|
||||
stage: build
|
||||
stage: coverage
|
||||
before_script:
|
||||
- git apply ./scripts/enable-android-google-services.patch
|
||||
- ./scripts/prepare-android-release.sh
|
||||
script: [flutter build apk --release]
|
||||
script: [./scripts/build-android-apk.sh]
|
||||
artifacts:
|
||||
when: on_success
|
||||
paths:
|
||||
- build/app/outputs/apk/release/app-release.apk
|
||||
tags:
|
||||
- docker
|
||||
- famedly
|
||||
- build/android/app-release.apk
|
||||
only:
|
||||
- main
|
||||
- tags
|
||||
|
||||
deploy_playstore_internal:
|
||||
stage: deploy
|
||||
build_android_appbundle:
|
||||
stage: coverage
|
||||
before_script:
|
||||
- git apply ./scripts/enable-android-google-services.patch
|
||||
- ./scripts/prepare-android-release.sh
|
||||
@ -234,47 +189,63 @@ deploy_playstore_internal:
|
||||
paths:
|
||||
- build/android/app-release.aab
|
||||
resource_group: playstore_release
|
||||
tags:
|
||||
- docker
|
||||
- famedly
|
||||
only:
|
||||
- main
|
||||
|
||||
fdroid_repo:
|
||||
image: debian:testing
|
||||
stage: deploy
|
||||
stage: release
|
||||
before_script:
|
||||
- apt-get update && apt-get -qy install fdroidserver wget curl jq --no-install-recommends || true
|
||||
- ./scripts/prepare-fdroid.sh || true
|
||||
- apt-get update && apt-get -qy install fdroidserver wget curl jq --no-install-recommends
|
||||
- ./scripts/prepare-fdroid.sh
|
||||
script:
|
||||
- ./scripts/create_fdroid_repos.sh || true
|
||||
- ./scripts/create_fdroid_repos.sh
|
||||
artifacts:
|
||||
when: always
|
||||
paths:
|
||||
- repo
|
||||
needs:
|
||||
needs:
|
||||
- "build_android_apk"
|
||||
resource_group: playstore_release
|
||||
allow_failure: true
|
||||
only:
|
||||
- main
|
||||
|
||||
upload-fdroid:
|
||||
stage: release
|
||||
before_script:
|
||||
- "which ssh-agent || (sudo apt-get update -y && sudo apt-get install openssh-client -y )"
|
||||
- "which rsync || (sudo apt-get update -y && sudo apt-get install rsync -y )"
|
||||
- "which pcregrep || (sudo apt-get update -y && sudo apt-get install pcregrep -y )"
|
||||
- eval $(ssh-agent -s)
|
||||
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
|
||||
- mkdir -p ~/.ssh
|
||||
- chmod 700 ~/.ssh
|
||||
- ssh-keyscan -t rsa ssh.fdroid.nordgedanken.dev >> ~/.ssh/known_hosts
|
||||
script:
|
||||
- cd build/android/
|
||||
- export UPDATE_VERSION=$(pcregrep -o1 'version:\s([0-9]*\.[0-9]*\.[0-9]*)\+[0-9]*' ../../pubspec.yaml) && mv app-release.apk "${UPDATE_VERSION}.apk"
|
||||
- rsync -rav -e ssh ./ fluffy@ssh.fdroid.nordgedanken.dev:/opt/fdroid/fluffychat/repo
|
||||
- ssh fluffy@ssh.fdroid.nordgedanken.dev -t '/bin/bash -i -l -c "cd /opt/fdroid/fluffychat && source ../fdroidserver-env/bin/activate && fdroid update --verbose && deactivate"'
|
||||
needs: ["build_android_apk"]
|
||||
resource_group: playstore_release
|
||||
allow_failure: true
|
||||
only:
|
||||
- tags
|
||||
|
||||
pages:
|
||||
needs:
|
||||
- "build_web"
|
||||
- "fdroid_repo"
|
||||
stage: deploy
|
||||
image: node:alpine
|
||||
before_script:
|
||||
- apk update
|
||||
- apk add jq unzip curl wget bash
|
||||
image: node
|
||||
script:
|
||||
- cd docs
|
||||
- npx tailwindcss -o ./tailwind.css --minify
|
||||
- cd ..
|
||||
- mv docs public
|
||||
- mv repo public || true
|
||||
- mv build/web/ public/web
|
||||
- mv repo public
|
||||
- mv build/web/ public/web/
|
||||
artifacts:
|
||||
paths:
|
||||
- public
|
||||
@ -282,25 +253,21 @@ pages:
|
||||
- main
|
||||
|
||||
build_linux_x86:
|
||||
stage: build
|
||||
image: registry.gitlab.com/famedly/company/frontend/flutter-dockerimages/flutter-linux/stable:${FLUTTER_VERSION}
|
||||
stage: coverage
|
||||
before_script:
|
||||
- sudo apt-get update
|
||||
- sudo apt-get install curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 -y
|
||||
script: [flutter build linux --release]
|
||||
tags:
|
||||
- docker
|
||||
- famedly
|
||||
[
|
||||
sudo apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install keyboard-configuration -y && sudo apt-get install curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 -y,
|
||||
]
|
||||
script: [./scripts/build-linux.sh]
|
||||
artifacts:
|
||||
when: on_success
|
||||
paths:
|
||||
- build/linux/x64/release/bundle/
|
||||
|
||||
build_linux_arm64:
|
||||
stage: build
|
||||
before_script:
|
||||
- flutter upgrade $FLUTTER_VERSION --force
|
||||
script: [flutter build linux --release]
|
||||
stage: coverage
|
||||
before_script: [flutter upgrade]
|
||||
script: [./scripts/build-linux.sh]
|
||||
tags: [docker_arm64]
|
||||
only:
|
||||
- main
|
||||
@ -311,9 +278,54 @@ build_linux_arm64:
|
||||
paths:
|
||||
- build/linux/arm64/release/bundle/
|
||||
|
||||
update_dependencies:
|
||||
stage: build
|
||||
build_linux_appimage_x86:
|
||||
stage: deploy
|
||||
image: appimagecrafters/appimage-builder
|
||||
needs: [build_linux_x86]
|
||||
only:
|
||||
- main
|
||||
- tags
|
||||
script:
|
||||
- cp -r build/linux/x64/release/bundle appimage/FluffyChat.AppDir
|
||||
- cd appimage
|
||||
- cp FluffyChat.desktop FluffyChat.AppDir/
|
||||
- cp AppRun FluffyChat.AppDir/
|
||||
- cp ../assets/logo.svg FluffyChat.AppDir/fluffychat.svg
|
||||
- appimagetool -u "zsync|https://gitlab.com/famedly/fluffychat/-/releases/permalink/latest/downloads/FluffyChat-x86_64.AppImage.zsync" FluffyChat.AppDir
|
||||
allow_failure: true
|
||||
artifacts:
|
||||
when: on_success
|
||||
paths:
|
||||
- appimage/FluffyChat-x86_64.AppImage
|
||||
- appimage/FluffyChat-x86_64.AppImage.zsync
|
||||
|
||||
build_linux_appimage_arm64:
|
||||
stage: deploy
|
||||
image: appimagecrafters/appimage-builder
|
||||
needs: [build_linux_arm64]
|
||||
tags: [docker_arm64]
|
||||
only:
|
||||
- main
|
||||
- tags
|
||||
script:
|
||||
- cp -r build/linux/arm64/release/bundle appimage/FluffyChat.AppDir
|
||||
- cd appimage
|
||||
- cp FluffyChat.desktop FluffyChat.AppDir/
|
||||
- cp AppRun FluffyChat.AppDir/
|
||||
- cp ../assets/logo.svg FluffyChat.AppDir/fluffychat.svg
|
||||
- appimagetool -u "zsync|https://gitlab.com/famedly/fluffychat/-/releases/permalink/latest/downloads/FluffyChat-arm64.AppImage.zsync" FluffyChat.AppDir
|
||||
allow_failure: true
|
||||
artifacts:
|
||||
when: on_success
|
||||
paths:
|
||||
- appimage/FluffyChat-arm64.AppImage
|
||||
- appimage/FluffyChat-arm64.AppImage.zsync
|
||||
|
||||
update-dependencies:
|
||||
stage: coverage
|
||||
needs: []
|
||||
tags:
|
||||
- docker
|
||||
only:
|
||||
- schedules
|
||||
variables:
|
||||
@ -336,7 +348,7 @@ update_dependencies:
|
||||
- 'git diff --exit-code || (git checkout -B ${UPDATE_BRANCH} && git add . && git commit -m "chore: Update dependencies" && git push -f origin ${UPDATE_BRANCH} && ./scripts/open-mr.sh)'
|
||||
|
||||
.release:
|
||||
stage: deploy
|
||||
stage: release
|
||||
image: curlimages/curl:latest
|
||||
rules:
|
||||
- if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/'
|
||||
@ -346,35 +358,38 @@ update_dependencies:
|
||||
- export RELEASE_VERSION=$(echo $CI_COMMIT_TAG | grep -oE "\d+\.\d+\.\d+")
|
||||
- export PACKAGE_REGISTRY_URL="${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/fluffychat/${RELEASE_VERSION}"
|
||||
|
||||
upload_android:
|
||||
upload-android:
|
||||
extends: .release
|
||||
script:
|
||||
- |
|
||||
curl --fail-with-body --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file build/app/outputs/apk/release/app-release.apk ${PACKAGE_REGISTRY_URL}/fluffychat.apk
|
||||
curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file build/android/app-release.apk ${PACKAGE_REGISTRY_URL}/fluffychat.apk
|
||||
|
||||
upload_web:
|
||||
upload-web:
|
||||
extends: .release
|
||||
script:
|
||||
- tar czf package.tar.gz -C build/web/ .
|
||||
- |
|
||||
curl --fail-with-body --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file package.tar.gz ${PACKAGE_REGISTRY_URL}/fluffychat-web.tar.gz
|
||||
curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file package.tar.gz ${PACKAGE_REGISTRY_URL}/fluffychat-web.tar.gz
|
||||
|
||||
upload_linux_x86:
|
||||
upload-linux-x86:
|
||||
extends: .release
|
||||
script:
|
||||
- tar czf package.tar.gz -C build/linux/x64/release/bundle/ .
|
||||
- |
|
||||
curl --fail-with-body --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file package.tar.gz ${PACKAGE_REGISTRY_URL}/fluffychat-linux-x86.tar.gz
|
||||
curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file package.tar.gz ${PACKAGE_REGISTRY_URL}/fluffychat-linux-x86.tar.gz
|
||||
curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file appimage/FluffyChat-x86_64.AppImage ${PACKAGE_REGISTRY_URL}/FluffyChat-x86_64.AppImage
|
||||
curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file appimage/FluffyChat-x86_64.AppImage.zsync ${PACKAGE_REGISTRY_URL}/FluffyChat-x86_64.AppImage.zsync
|
||||
|
||||
upload_linux_arm64:
|
||||
upload-linux-arm64:
|
||||
extends: .release
|
||||
script:
|
||||
- tar czf package.tar.gz -C build/linux/arm64/release/bundle/ .
|
||||
- |
|
||||
curl --fail-with-body --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file package.tar.gz ${PACKAGE_REGISTRY_URL}/fluffychat-linux-arm64.tar.gz
|
||||
allow_failure: true
|
||||
curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file package.tar.gz ${PACKAGE_REGISTRY_URL}/fluffychat-linux-arm64.tar.gz
|
||||
curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file appimage/FluffyChat-arm64.AppImage ${PACKAGE_REGISTRY_URL}/FluffyChat-arm64.AppImage
|
||||
curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file appimage/FluffyChat-arm64.AppImage.zsync ${PACKAGE_REGISTRY_URL}/FluffyChat-arm64.AppImage.zsync
|
||||
|
||||
upload_windows:
|
||||
upload-windows:
|
||||
extends: .release
|
||||
image: alpine:latest
|
||||
script:
|
||||
@ -382,12 +397,11 @@ upload_windows:
|
||||
- mv build/windows/runner/Release/fluffychat.msix fluffychat.msix
|
||||
- cd build/windows/runner/Release; zip -r ../../../../package.zip . ; cd -
|
||||
- |
|
||||
curl --fail-with-body --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file package.zip ${PACKAGE_REGISTRY_URL}/fluffychat-windows.zip
|
||||
curl --fail-with-body --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file fluffychat.msix ${PACKAGE_REGISTRY_URL}/fluffychat-windows.msix
|
||||
allow_failure: true
|
||||
curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file package.zip ${PACKAGE_REGISTRY_URL}/fluffychat-windows.zip
|
||||
curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file fluffychat.msix ${PACKAGE_REGISTRY_URL}/fluffychat-windows.msix
|
||||
|
||||
deploy_playstore:
|
||||
stage: deploy
|
||||
upload-playstore:
|
||||
stage: release
|
||||
before_script:
|
||||
- git apply ./scripts/enable-android-google-services.patch
|
||||
- ./scripts/prepare-android-release.sh
|
||||
@ -409,3 +423,7 @@ release:
|
||||
--assets-link "{\"name\":\"fluffychat-windows.zip\",\"url\":\"${PACKAGE_REGISTRY_URL}/fluffychat-windows.zip\"}" \
|
||||
--assets-link "{\"name\":\"fluffychat-windows.msix\",\"url\":\"${PACKAGE_REGISTRY_URL}/fluffychat-windows.msix\"}" \
|
||||
--assets-link "{\"name\":\"fluffychat-web.tar.gz\",\"url\":\"${PACKAGE_REGISTRY_URL}/fluffychat-web.tar.gz\"}"
|
||||
--assets-link "{\"name\":\"FluffyChat-x86_64.AppImage\",\"url\":\"${PACKAGE_REGISTRY_URL}/FluffyChat-x86_64.AppImage\",\"filepath\":\"/FluffyChat-x86_64.AppImage\"}"
|
||||
--assets-link "{\"name\":\"FluffyChat-x86_64.AppImage.zsync\",\"url\":\"${PACKAGE_REGISTRY_URL}/FluffyChat-x86_64.AppImage.zsync\",\"filepath\":\"/FluffyChat-x86_64.AppImage.zsync\"}"
|
||||
--assets-link "{\"name\":\"FluffyChat-arm64.AppImage\",\"url\":\"${PACKAGE_REGISTRY_URL}/FluffyChat-arm64.AppImage\",\"filepath\":\"/FluffyChat-arm64.AppImage\"}"
|
||||
--assets-link "{\"name\":\"FluffyChat-arm64.AppImage.zsync\",\"url\":\"${PACKAGE_REGISTRY_URL}/FluffyChat-arm64.AppImage.zsync\",\"filepath\":\"/FluffyChat-arm64.AppImage.zsync\"}"
|
||||
|
||||
12
.metadata
@ -4,7 +4,7 @@
|
||||
# This file should be version controlled.
|
||||
|
||||
version:
|
||||
revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2
|
||||
revision: 85684f9300908116a78138ea4c6036c35c9a1236
|
||||
channel: stable
|
||||
|
||||
project_type: app
|
||||
@ -13,11 +13,11 @@ project_type: app
|
||||
migration:
|
||||
platforms:
|
||||
- platform: root
|
||||
create_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2
|
||||
base_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2
|
||||
- platform: macos
|
||||
create_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2
|
||||
base_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2
|
||||
create_revision: 85684f9300908116a78138ea4c6036c35c9a1236
|
||||
base_revision: 85684f9300908116a78138ea4c6036c35c9a1236
|
||||
- platform: windows
|
||||
create_revision: 85684f9300908116a78138ea4c6036c35c9a1236
|
||||
base_revision: 85684f9300908116a78138ea4c6036c35c9a1236
|
||||
|
||||
# User provided section
|
||||
|
||||
|
||||
316
CHANGELOG.md
@ -1,319 +1,3 @@
|
||||
## v1.12.0
|
||||
- Added translation using Weblate (Toki Pona) (Mæve Rey)
|
||||
- Translated using Weblate (Arabic) (Rex_sa)
|
||||
- Translated using Weblate (Chinese (Simplified)) (Eric)
|
||||
- Translated using Weblate (Croatian) (Milo Ivir)
|
||||
- Translated using Weblate (Estonian) (Priit Jõerüüt)
|
||||
- Translated using Weblate (Galician) (josé m)
|
||||
- Translated using Weblate (Indonesian) (Linerly)
|
||||
- Translated using Weblate (Polish) (lauren n. liberda)
|
||||
- Translated using Weblate (Romanian) (Riley)
|
||||
- Translated using Weblate (Russian) (DarkCoder15)
|
||||
- Translated using Weblate (Spanish) (José Muñoz)
|
||||
- Translated using Weblate (Ukrainian) (Ihor Hordiichuk)
|
||||
- build: Remove dependency overwrite for ffi (Krille)
|
||||
- build: Update dependencies (Krille)
|
||||
- builds: Change minsdkversion of Android from 16 to 19 (Krille)
|
||||
- builds: Do not allow failure for linux x86 (Krille)
|
||||
- builds: Do not use verbose mode on building linux (Krille)
|
||||
- builds: Linux with flutter 3.10 (Krille)
|
||||
- builds: Remove workaround for building linux arm64 (Krille)
|
||||
- builds: Update file_picker to 5.3.0 (Krille)
|
||||
- builds: Update flutter table html (Krille)
|
||||
- builds: Update flutter_html (Krille)
|
||||
- builds: migrate to dart 3.0/flutter 3.10 (lauren n. liberda)
|
||||
- chore: Add missing blockquote style (Krille)
|
||||
- chore: Allow failure in build linux for now (Krille)
|
||||
- chore: Ask for storage persistence (Krille)
|
||||
- chore: Clean unused translations (Malin Errenst)
|
||||
- chore: Enhance room pills (Krille)
|
||||
- chore: Minor code clean up (Krille)
|
||||
- chore: Update flutter webrtc (Krille)
|
||||
- chore: Upgrade to Flutter 3.10.1 (Malin Errenst)
|
||||
- chore: change release curl calls to use --fail-with-body (Tim Flink)
|
||||
- chore: update macOS icons and add build script (TheOneWithTheBraid)
|
||||
- design: Replace anime images with neutral cupertino icons (Krille)
|
||||
- feat: Add toggle to mute notifications from chat groups (fbievan)
|
||||
- feat: Allow ruby tags in html (Krille)
|
||||
- feat: Display progress value for initial sync (Krille)
|
||||
- feat: Implement new error reporting tool when critical features break like playing audio or video messages or opening a chat (Krille)
|
||||
- feat: clean up macOS build metadata (TheOneWithTheBraid)
|
||||
- feat: set display information correctly (TheOneWithTheBraid)
|
||||
- feat: update macOS build files (TheOneWithTheBraid)
|
||||
- feat: update macOS build information for macOS Ventura (TheOneWithTheBraid)
|
||||
- fix "Unhandled Exception: VRouter.of(context) was called with a context which does not contain a VRouter." (Lauren N. Liberda)
|
||||
- fix: Broken arb file (Krille)
|
||||
- fix: Do not unnecessary request all members in public rooms (Krille)
|
||||
- fix: Remove wrong rendered linebreak in html (Krille)
|
||||
- fix: Scroll down button (Krille)
|
||||
- fix: Scroll up and scroll down buttons in chat list (Krille)
|
||||
- fix: Scrolldown button (Krille)
|
||||
- fix: Too long file name cause a render overflow (Skying)
|
||||
- fix: Try to reload timeline on IOException (Krille)
|
||||
- fix: User pills (Krille)
|
||||
- fix: broken CI artifact uploads (TheOneWithTheBraid)
|
||||
- fix: custom emote placeholder (TheOneWithTheBraid)
|
||||
- fix: path of libolm (TheOneWithTheBraid)
|
||||
- fix: Quick account switching (JHansen)
|
||||
- fix: read reciepts (JHansen)
|
||||
- perf: Use valuenotifier to not rebuild chatlist (Krille)
|
||||
- refactor: Reimplement flutter matrix html locally (Krille)
|
||||
- refactor: Update Roboto and Noto Emoji (The one with the Braid)
|
||||
- refactor: Use AnimatedSize for FAB (Krille)
|
||||
- refactor: Use DateTime for weekday localization (Malin Errenst)
|
||||
|
||||
## v1.11.2
|
||||
- Translated using Weblate (Croatian) (Milo Ivir)
|
||||
- Translated using Weblate (Dutch) (Jelv)
|
||||
- Translated using Weblate (Estonian) (Priit Jõerüüt)
|
||||
- Translated using Weblate (Galician) (josé m)
|
||||
- Translated using Weblate (Polish) (Eryk Michalak)
|
||||
- Translated using Weblate (Turkish) (Oğuz Ersen)
|
||||
- Translated using Weblate (Ukrainian) (Ihor Hordiichuk)
|
||||
- feat: Permission dialog before open link in browser (Krille)
|
||||
- fix: Chats do not load (Krille)
|
||||
|
||||
## v1.11.1 - 2023-04-20
|
||||
- fix: Download files on web and iOS with correct mimetype
|
||||
|
||||
## v1.11.0 - 2023-04-14
|
||||
- feat: Add visual read marker (Krille)
|
||||
- feat: Jump to last read event (Krille)
|
||||
- feat: Use fragmented timeline to jump to event (Krille)
|
||||
- feat: change to flutterwebauth2 (ShootingStarDragons)
|
||||
- fix: Join public room (Krille)
|
||||
- fix: Set fcm priority to max on android (Krille)
|
||||
- refactor: CI scripts and old workarounds for build scripts (Krille)
|
||||
- refactor: Client in ChatPage (Krille)
|
||||
- refactor: Not nullable room in ChatPage (Krille)
|
||||
- refactor: Switch to file_picker package and get rid of some dependency overrides (Krille)
|
||||
- refactor: Use correct Matrix instance (Krille)
|
||||
- style: Make emptypage logo bigger (Krille)
|
||||
- style: Minor adjustments for modal bottom sheets (Krille)
|
||||
- style: Move chats to top (Krille)
|
||||
- style: Use SliverList for chatlist (Krille)
|
||||
- refactor: Container -> SizedBox.shrink() (noob_tea)
|
||||
- Translated using Weblate (Chinese (Simplified)) (Eric)
|
||||
- Translated using Weblate (Dutch) (Jelv)
|
||||
- Translated using Weblate (Estonian) (Priit Jõerüüt)
|
||||
- Translated using Weblate (French) (Anne Onyme 017)
|
||||
- Translated using Weblate (Galician) (josé m)
|
||||
- Translated using Weblate (Indonesian) (Linerly)
|
||||
- Translated using Weblate (Persian) (Parsa)
|
||||
- Translated using Weblate (Persian) (Siavash)
|
||||
- Translated using Weblate (Polish) (Luna)
|
||||
- Translated using Weblate (Swedish) (Kristoffer Grundström)
|
||||
- Translated using Weblate (Turkish) (Oğuz Ersen)
|
||||
- Translated using Weblate (Ukrainian) (Ihor Hordiichuk)
|
||||
|
||||
## v1.10.0 - 2023-02-25
|
||||
- Added translation using Weblate (Thai) (Wphaoka)
|
||||
- Added translation using Weblate (Tibetan) (Nathan Freitas)
|
||||
- Default hardcoded message when l10n is not available (fabienli)
|
||||
- Fix: The stable repo fingerprint (TODO the qr-code should be updated) (machiav3lli)
|
||||
- Translated using Weblate (Basque) (xabirequejo)
|
||||
- Translated using Weblate (Dutch) (Jelv)
|
||||
- Translated using Weblate (Estonian) (Priit Jõerüüt)
|
||||
- Translated using Weblate (French) (Anne Onyme 017)
|
||||
- Translated using Weblate (Galician) (josé m)
|
||||
- Translated using Weblate (Galician) (josé m)
|
||||
- Translated using Weblate (Indonesian) (Linerly)
|
||||
- Translated using Weblate (Japanese) (Suguru Hirahara)
|
||||
- Translated using Weblate (Persian) (Farooq Karimi Zadeh)
|
||||
- Translated using Weblate (Swedish) (Joaquim Homrighausen)
|
||||
- Translated using Weblate (Turkish) (Oğuz Ersen)
|
||||
- Translated using Weblate (Ukrainian) (Ihor Hordiichuk)
|
||||
- chore: Disable stable for web until script is fixed (Krille)
|
||||
- chore: Display warning when logout without backup (Krille)
|
||||
- chore: Downgrade flutter CI version (Krille)
|
||||
- chore: Follow up audioplayer on linux (Krille)
|
||||
- chore: Follow up chat encryption desgin (Krille)
|
||||
- chore: Follow up fix audioplayer on android (Christian Pauly)
|
||||
- chore: Follow up formatting (Christian Pauly)
|
||||
- chore: Follow up formatting (Krille)
|
||||
- chore: Follow up remove hero animation (Krille)
|
||||
- chore: Follow up secrity settings design (Krille)
|
||||
- chore: Follow up settings page (Krille)
|
||||
- chore: Follow up settings page design (Christian Pauly)
|
||||
- chore: Follow up style adjustments (Krille)
|
||||
- chore: Lookup l10n in pushhelper if null (Krille)
|
||||
- chore: Update matrix package to 0.17.0 (Krille)
|
||||
- chore: Update to Flutter 3.7.1 (Krille)
|
||||
- docs/qr-stable.svg: update the QR code (Aminda Suomalainen)
|
||||
- feat: Enable audioplayer for web and linux (Christian Pauly)
|
||||
- fix: Display error when user tries to send too large file (Christian Pauly)
|
||||
- refactor: Do only instantiate AudioPlayer() object when in use (Christian Pauly)
|
||||
- refactor: Remove syncstatus verbose logs (Christian Pauly)
|
||||
- refactor: Store cached files in tmp directory so OS will clear file cache from time to time (Krille)
|
||||
- style: Adjust key verification dialog (Christian Pauly)
|
||||
- style: Bootstrap design adjustments (Christian Pauly)
|
||||
- style: Encryption page adjustments (Christian Pauly)
|
||||
- style: Enhance user device settings design (Krille)
|
||||
- style: Enhanced chat details design (Krille)
|
||||
- style: Give chat list list tiles rounded corners (Krille)
|
||||
- style: Link underline color (Christian Pauly)
|
||||
- style: Make adaptive bottom sheets scrollable by default (Krille)
|
||||
- style: Make invite page more pretty (Krille)
|
||||
- style: New settings design (Krille)
|
||||
- style: Nicer chips in encryption settings and icons showing device status (Krille)
|
||||
- style: Use emojis on web as well (Christian Pauly)
|
||||
- style: Use robotomono to display device keys (Christian Pauly)
|
||||
- utils/url_launcher: force opening http(s) links in external browser (Marcus Hoffmann)
|
||||
|
||||
## v1.9.0 - 2023-01-29
|
||||
- Translated using Weblate (Czech) (Michal Bedáň)
|
||||
- Translated using Weblate (Czech) (grreby)
|
||||
- Translated using Weblate (Dutch) (Jelv)
|
||||
- Translated using Weblate (Estonian) (Priit Jõerüüt)
|
||||
- Translated using Weblate (Galician) (josé m)
|
||||
- Translated using Weblate (German) (Christian)
|
||||
- Translated using Weblate (German) (Vri 🌈)
|
||||
- Translated using Weblate (Indonesian) (Linerly)
|
||||
- Translated using Weblate (Korean) (Youngbin Han)
|
||||
- Translated using Weblate (Polish) (Wiktor)
|
||||
- Translated using Weblate (Turkish) (Oğuz Ersen)
|
||||
- Translated using Weblate (Ukrainian) (Ihor Hordiichuk)
|
||||
- chore: Change invite link textfield label (Krille)
|
||||
- chore: Remove unused dependency (Krille)
|
||||
- chore: Remove unused translations (Krille)
|
||||
- chore: Update Matrix SDK and refactor (Krille)
|
||||
- chore: Update dependencies (Krille)
|
||||
- chore: Update flutter_map (Krille)
|
||||
- chore: add integration tests (TheOneWithTheBraid)
|
||||
- chore: add integration tests for spaces (TheOneWithTheBraid)
|
||||
- design: More clear chat background and rounded popup menu (Krille)
|
||||
- design: Nicer navigationrail (Krille)
|
||||
- design: Upgrade to Flutter 3.7
|
||||
- feat: Bring back disabling the header bar on Linux desktop (q234rty)
|
||||
- feat: Nicer design for abandonded DM rooms (Christian Pauly)
|
||||
- fix: Archive (Krille)
|
||||
- fix: Shared preferences package for flutter 3.7 (Christian Pauly)
|
||||
- fix: permission of web builds (TheOneWithTheBraid)
|
||||
- fix: Notification Settings (Krille)
|
||||
- refactor: Migrate to Flutter 3.7.0 (Christian Pauly)
|
||||
- refactor: Same animations everywhere in app (Krille)
|
||||
- refactor: Stories header with futurebuilder (Krille)
|
||||
- refactor: disable some redundant tests (TheOneWithTheBraid)
|
||||
- style: Animate in out search results (Krille)
|
||||
- style: New modal bottom sheets (Krille)
|
||||
- style: Redesign public room bottomsheets (Krille)
|
||||
|
||||
## v1.8.0 2022-12-30
|
||||
- Added translation using Weblate (Yue (yue_HK)) (Raatty)
|
||||
- Translated using Weblate (Chinese (Simplified)) (Mike Evans)
|
||||
- Translated using Weblate (Estonian) (Priit Jõerüüt)
|
||||
- Translated using Weblate (French) (Anne Onyme 017)
|
||||
- Translated using Weblate (Indonesian) (Linerly)
|
||||
- Translated using Weblate (Turkish) (Oğuz Ersen)
|
||||
- Translated using Weblate (Ukrainian) (Ihor Hordiichuk)
|
||||
- design: New encryption page (Krille Fear)
|
||||
- feat: Add audio message support to linux (Krille Fear)
|
||||
- feat: Use Android system accent color (Krille Fear)
|
||||
- feat: include olm to Windows builds (TheOneWithTheBraid)
|
||||
- feat: Store drafts (Krille)
|
||||
- fix: Android push notification follow-up (TheOneWithTheBraid)
|
||||
- fix: Content banner (Krille Fear)
|
||||
- fix: Correct redacted by username (Krille Fear)
|
||||
- fix: Do not setup push on every app resume (Krille Fear)
|
||||
- fix: Encryption button is orange in public rooms (Krille Fear)
|
||||
- fix: File event design (Krille Fear)
|
||||
- fix: Hide google services warning after marked (Krille Fear)
|
||||
- fix: Improve story page appearance (Reinhart Previano Koentjoro)
|
||||
- fix: Libhandy windows (Krille Fear)
|
||||
- fix: Monochromatic icon rendering for Android 13+ (Reinhart Previano Koentjoro)
|
||||
- fix: homeserver error text not visible in app bar (TheOneWithTheBraid)
|
||||
- fix: minor issues in room list (TheOneWithTheBraid)
|
||||
|
||||
## v1.7.2 2022-12-19
|
||||
Update dependencies and translations.
|
||||
|
||||
## v1.7.1 2022-11-23
|
||||
Minor bugfix release to retrigger build for FlatPak and Android. Fixes some style bugs and updates some translations
|
||||
|
||||
## v1.7.0 2022-11-17
|
||||
FluffyChat 1.7.0 features a new way to work with spaces via a bottom navigation bar. A lot of work has also been done under the hood to make the app faster and more stable. The main color has slightly changed and the design got some finetuning.
|
||||
|
||||
- chore: Add keys to roomlist and stories header (Christian Pauly)
|
||||
- chore: Add unread badge to navigation rail and adjust design (Christian Pauly)
|
||||
- chore: Adjust colors (Christian Pauly)
|
||||
- chore: Better design chat list items (Christian Pauly)
|
||||
- chore: Better load first client (Christian Pauly)
|
||||
- design: Hide unimportant state events instead of folding (Christian Pauly)
|
||||
- design: Improve login design (Krille Fear)
|
||||
- design: Nicer display notification short texts (Christian Pauly)
|
||||
- feat: background and terminated calls [android] (td)
|
||||
- feat: New navigation design (Christian Pauly)
|
||||
- fix: Hide password at login page (Krille Fear)
|
||||
- fix: Import session on iOS (Christian Pauly)
|
||||
- fix: incorrect setState inside setState in ChatListController (td)
|
||||
- fix: Password not obscure for a second when submitting login textfield (Christian Pauly)
|
||||
- fix: Popup menu without elevation (Christian Pauly)
|
||||
- fix: Push error message (Christian Pauly)
|
||||
- fix: Remove emoji picker workaround (Christian Pauly)
|
||||
- fix: Set theme after start app (Christian Pauly)
|
||||
- fix: Settings profile picture (Christian Pauly)
|
||||
- fix: Share files (Christian Pauly)
|
||||
- fix: UIA request handler (Christian Pauly)
|
||||
- fix: Update emoji picker for web and desktop (Christian Pauly)
|
||||
- improved (most) icons/image scaling, including avatar scaling (Mg138)
|
||||
- Mention Element instead of Riot (Has been renamed about a year ago) (jooooscha)
|
||||
- refactor: Chat list body code (Christian Pauly)
|
||||
- refactor: Minor chatlist refactoring (Christian Pauly)
|
||||
- refactor: No longer need selected of chat list tile (Christian Pauly)
|
||||
- refactor: Remove unused dependencies (Krille Fear)
|
||||
- Added translation using Weblate (Hindi) (Hemish)
|
||||
- Added translation using Weblate (Occidental) (OIS)
|
||||
- Translated using Weblate (Basque) (xabirequejo)
|
||||
- Translated using Weblate (Chinese (Simplified)) (Eric)
|
||||
- Translated using Weblate (Chinese (Simplified)) (Raatty)
|
||||
- Translated using Weblate (Dutch) (Jelv)
|
||||
- Translated using Weblate (English) (Raatty)
|
||||
- Translated using Weblate (Estonian) (Priit Jõerüüt)
|
||||
- Translated using Weblate (Estonian) (Raatty)
|
||||
- Translated using Weblate (Finnish) (Aminda Suomalainen)
|
||||
- Translated using Weblate (Finnish) (Raatty)
|
||||
- Translated using Weblate (French) (Anne Onyme 017)
|
||||
- Translated using Weblate (Galician) (Xosé M)
|
||||
- Translated using Weblate (German) (Jana)
|
||||
- Translated using Weblate (Indonesian) (Linerly)
|
||||
- Translated using Weblate (Lithuanian) (Anonimas)
|
||||
- Translated using Weblate (Occidental) (OIS)
|
||||
- Translated using Weblate (Persian) (Anastázius Darián)
|
||||
- Translated using Weblate (Persian) (Anastázius Kaejatídarján)
|
||||
- Translated using Weblate (Persian) (Seyedmahdi Moosavyan)
|
||||
- Translated using Weblate (Russian) (Nikita Epifanov)
|
||||
- Translated using Weblate (Turkish) (Oğuz Ersen)
|
||||
- Translated using Weblate (Turkish) (Raatty)
|
||||
- Translated using Weblate (Ukrainian) (Ihor Hordiichuk)
|
||||
- Translated using Weblate (Ukrainian) (Raatty)
|
||||
|
||||
## v1.6.4 - 2022-09-08
|
||||
- Translated using Weblate (Chinese (Simplified)) (Eric)
|
||||
- Translated using Weblate (Estonian) (Priit Jõerüüt)
|
||||
- Translated using Weblate (Galician) (Xosé M)
|
||||
- Translated using Weblate (Indonesian) (Linerly)
|
||||
- Translated using Weblate (Slovak) (Marek Ľach)
|
||||
- Translated using Weblate (Turkish) (Oğuz Ersen)
|
||||
- Translated using Weblate (Ukrainian) (Ihor Hordiichuk)
|
||||
- chore: Adjust bubble color in dark mode (Christian Pauly)
|
||||
- chore: Update matrix sdk (Christian Pauly)
|
||||
- chore: Update to flutter 3.3.0 (Christian Pauly)
|
||||
- feat: Automatic key requests and better key error dialog (Christian Pauly)
|
||||
- fix: Styling and notification settings (Christian Pauly)
|
||||
- fix: add missing command localizations (Christian Pauly)
|
||||
|
||||
## v1.6.3 - 2022-08-25
|
||||
- Translated using Weblate (Chinese (Simplified)) (Eric)
|
||||
- Translated using Weblate (Estonian) (Priit Jõerüüt)
|
||||
- Translated using Weblate (Finnish) (Aminda Suomalainen)
|
||||
- Translated using Weblate (Russian) (Sergey Shavin)
|
||||
- Translated using Weblate (Turkish) (Oğuz Ersen)
|
||||
- Translated using Weblate (Ukrainian) (Ihor Hordiichuk)
|
||||
- chore: Migrate back to flutter hive collections (Christian Pauly)
|
||||
- chore: Update provider package and remove dep override (Christian Pauly)
|
||||
- fix: Do not display push events for unknown event types (Christian Pauly)
|
||||
- refactor: App widget (Christian Pauly)
|
||||
|
||||
## v1.6.0 - 2022-07-31
|
||||
FluffyChat 1.6.0 features a lot of bug fixes and improvements. The code base has been
|
||||
simplified and the drawer on the chat list page got a come-back. Some new features like
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
FROM ghcr.io/cirruslabs/flutter as builder
|
||||
FROM cirrusci/flutter as builder
|
||||
RUN sudo apt update && sudo apt install curl -y
|
||||
COPY . /app
|
||||
WORKDIR /app
|
||||
|
||||
31
PRIVACY.md
@ -2,15 +2,15 @@
|
||||
|
||||
FluffyChat is available on Android, iOS and as a web version. Desktop versions for Windows, Linux and macOS may follow.
|
||||
|
||||
* [Matrix](#matrix)
|
||||
* Sentry
|
||||
* [Database](#database)
|
||||
* [Encryption](#encryption)
|
||||
* [App Permissions](#app-permissions)
|
||||
* [Push Notifications](#push-notifications)
|
||||
* [Stories](#stories)
|
||||
* [Matrix](#1)
|
||||
* [Sentry](#2)
|
||||
* [Database](#3)
|
||||
* [Encryption](#4)
|
||||
* [App Permissions](#5)
|
||||
* [Push Notifications](#6)
|
||||
* [Stories](#7)
|
||||
|
||||
## Matrix<a id="matrix"/>
|
||||
## Matrix<a id="1"/>
|
||||
FluffyChat uses the Matrix protocol. This means that FluffyChat is just a client that can be connected to any compatible matrix server. The respective data protection agreement of the server selected by the user then applies.
|
||||
|
||||
For convenience, one or more servers are set as default that the FluffyChat developers consider trustworthy. The developers of FluffyChat do not guarantee their trustworthiness. Before the first communication, users are informed which server they are connecting to.
|
||||
@ -19,17 +19,22 @@ FluffyChat only communicates with the selected server, with sentry.io if enabled
|
||||
|
||||
More information is available at: [https://matrix.org](https://matrix.org)
|
||||
|
||||
## Database<a id="database"/>
|
||||
## Sentry<a id="2"/>
|
||||
FluffyChat uses Sentry for crash reports if the user allows it.
|
||||
|
||||
More information is available at: [https://sentry.io](https://sentry.io)
|
||||
|
||||
## Database<a id="3"/>
|
||||
FluffyChat caches some data received from the server in a local database on the device of the user.
|
||||
|
||||
More information is available at: [https://pub.dev/packages/hive](https://pub.dev/packages/hive)
|
||||
|
||||
## Encryption<a id="encryption"/>
|
||||
## Encryption<a id="4"/>
|
||||
All communication of substantive content between Fluffychat and any server is done in secure way, using transport encryption to protect it.
|
||||
|
||||
FluffyChat is able to use End-To-End-Encryption as a tech preview.
|
||||
|
||||
## App Permissions<a id="app-permissions"/>
|
||||
## App Permissions<a id="5"/>
|
||||
|
||||
The permissions are the same on Android and iOS but may differ in the name. This are the Android Permissions:
|
||||
|
||||
@ -52,7 +57,7 @@ The user is able to send files from the device's file system.
|
||||
#### Location
|
||||
FluffyChat makes it possible to share the current location via the chat. When the user shares their location, FluffyChat uses the device location service and sends the geo-data via Matrix.
|
||||
|
||||
## Push Notifications<a id="push-notifications"/>
|
||||
## Push Notifications<a id="6"/>
|
||||
FluffyChat uses the Firebase Cloud Messaging service for push notifications on Android and iOS. This takes place in the following steps:
|
||||
1. The matrix server sends the push notification to the FluffyChat Push Gateway
|
||||
2. The FluffyChat Push Gateway forwards the message in a different format to Firebase Cloud Messaging
|
||||
@ -95,7 +100,7 @@ A typical push notification could look like this:
|
||||
|
||||
FluffyChat sets the `event_id_only` flag at the Matrix Server. This server is then responsible to send the correct data.
|
||||
|
||||
## Stories<a id="stories"/>
|
||||
## Stories<a id="7"/>
|
||||
|
||||
FluffyChat supports stories which is a feature similar to WhatsApp status or Instagram stories. However it is just a different GUI for the same room-related communication. More information about the feature can be found here:
|
||||
|
||||
|
||||
@ -8,12 +8,11 @@ linter:
|
||||
- prefer_final_locals
|
||||
- prefer_final_in_for_each
|
||||
- sort_pub_dependencies
|
||||
- require_trailing_commas
|
||||
|
||||
analyzer:
|
||||
errors:
|
||||
todo: ignore
|
||||
use_build_context_synchronously: ignore
|
||||
import_of_legacy_library_into_null_safe: ignore
|
||||
exclude:
|
||||
- lib/generated_plugin_registrant.dart
|
||||
- lib/l10n/*.dart
|
||||
|
||||
@ -32,7 +32,7 @@ if (keystorePropertiesFile.exists()) {
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion 33
|
||||
compileSdkVersion 32
|
||||
|
||||
sourceSets {
|
||||
main.java.srcDirs += 'src/main/kotlin'
|
||||
@ -44,8 +44,8 @@ android {
|
||||
|
||||
defaultConfig {
|
||||
applicationId "chat.fluffy.fluffychat"
|
||||
minSdkVersion 19
|
||||
targetSdkVersion 31
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 30
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
versionName flutterVersionName
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
|
||||
@ -14,6 +14,8 @@
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
|
||||
<uses-permission android:name="android.permission.VIBRATE" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH" />
|
||||
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||
@ -21,11 +23,10 @@
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
||||
<uses-permission android:name="android.permission.CALL_PHONE" />
|
||||
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
|
||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
|
||||
|
||||
<uses-sdk
|
||||
tools:overrideLibrary="io.wazo.callkeep, net.touchcapture.qr.flutterqr, com.cloudwebrtc.webrtc, org.webrtc, com.it_nomads.fluttersecurestorage, com.pichillilorenzo.flutter_inappwebview, com.example.video_compress, com.otaliastudios.transcoder, com.otaliastudios.opengl, com.kineapps.flutter_file_dialog, com.llfbandit.record, com.pravera.flutter_foreground_task"/>
|
||||
tools:overrideLibrary="io.wazo.callkeep, net.touchcapture.qr.flutterqr, com.cloudwebrtc.webrtc, org.webrtc, com.it_nomads.fluttersecurestorage, com.pichillilorenzo.flutter_inappwebview, com.example.video_compress, com.otaliastudios.transcoder, com.otaliastudios.opengl, com.kineapps.flutter_file_dialog, com.llfbandit.record"/>
|
||||
|
||||
<application
|
||||
android:label="FluffyChat"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
@ -39,8 +40,6 @@
|
||||
android:theme="@style/LaunchTheme"
|
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||
android:hardwareAccelerated="true"
|
||||
android:showOnLockScreen="false"
|
||||
android:turnScreenOn="true"
|
||||
android:windowSoftInputMode="adjustResize"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
@ -93,9 +92,8 @@
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name="com.linusu.flutter_web_auth_2.CallbackActivity"
|
||||
android:exported="true">
|
||||
<activity android:name="com.linusu.flutter_web_auth.CallbackActivity"
|
||||
android:exported="true">
|
||||
<intent-filter android:label="flutter_web_auth">
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
@ -111,20 +109,6 @@
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<service android:name="com.pravera.flutter_foreground_task.service.ForegroundService"
|
||||
android:foregroundServiceType="camera|microphone|mediaProjection">
|
||||
</service>
|
||||
|
||||
<service android:name="io.wazo.callkeep.VoiceConnectionService"
|
||||
android:label="Wazo"
|
||||
android:foregroundServiceType="camera|microphone|mediaProjection"
|
||||
android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.telecom.ConnectionService" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<receiver android:name="org.unifiedpush.flutter.connector.UnifiedPushReceiver"
|
||||
tools:replace="android:enabled"
|
||||
android:enabled="false">
|
||||
|
||||
@ -2,5 +2,5 @@
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/ic_launcher_background"/>
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
|
||||
<monochrome android:drawable="@drawable/ic_launcher_monochrome"/>
|
||||
<monochrome android:drawable="@drawable/ic_launcher_foreground"/>
|
||||
</adaptive-icon>
|
||||
@ -1,5 +1,5 @@
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.8.0'
|
||||
ext.kotlin_version = '1.6.10'
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
@ -27,6 +27,6 @@ subprojects {
|
||||
project.evaluationDependsOn(':app')
|
||||
}
|
||||
|
||||
tasks.register("clean", Delete) {
|
||||
task clean(type: Delete) {
|
||||
delete rootProject.buildDir
|
||||
}
|
||||
|
||||
@ -22,11 +22,11 @@ Decentralized
|
||||
There is no "FluffyChat server" you are forced to use. Use the server you find trustworthy or host your own.
|
||||
|
||||
Compatible
|
||||
Compatible with Element, Fractal, Nekho and all matrix messengers.
|
||||
Compatible with Riot, Fractal, Nekho and all matrix messengers.
|
||||
|
||||
|
||||
FluffyChat comes with a dream
|
||||
|
||||
Imagine a world where everyone can choose the messenger they like and is still able to chat with all of their friends.
|
||||
A world where there are no companies spying on you when you send selfies to friends and lovers.
|
||||
And a world where apps are made for fluffyness and not for profit. ♥
|
||||
And a world where apps are made for fluffyness and not for profit. ♥
|
||||
@ -5,17 +5,12 @@
|
||||
|
||||
|
||||
|
||||
<testcase classname="fastlane.lanes" name="0: update_fastlane" time="1.455419">
|
||||
<testcase classname="fastlane.lanes" name="0: update_fastlane" time="0.000202">
|
||||
|
||||
</testcase>
|
||||
|
||||
|
||||
<testcase classname="fastlane.lanes" name="1: default_platform" time="0.000127">
|
||||
|
||||
</testcase>
|
||||
|
||||
|
||||
<testcase classname="fastlane.lanes" name="2: google_play_track_version_codes" time="2.638619">
|
||||
<testcase classname="fastlane.lanes" name="1: default_platform" time="7.9e-05">
|
||||
|
||||
</testcase>
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 36 KiB |
@ -1,168 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 22.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
|
||||
<svg
|
||||
version="1.1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
viewBox="0 0 640 640"
|
||||
xml:space="preserve"
|
||||
id="svg24"
|
||||
sodipodi:docname="info-logo.svg"
|
||||
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14, custom)"
|
||||
width="640"
|
||||
height="640"
|
||||
inkscape:export-filename="info-logo.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||
id="defs29" /><sodipodi:namedview
|
||||
id="namedview26"
|
||||
pagecolor="#505050"
|
||||
bordercolor="#eeeeee"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#505050"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.4142136"
|
||||
inkscape:cx="235.113"
|
||||
inkscape:cy="375.4737"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1012"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg24" />
|
||||
<style
|
||||
type="text/css"
|
||||
id="style2">
|
||||
.st0{fill:url(#SVGID_1_);}
|
||||
.st1{fill:#F094BE;}
|
||||
.st2{fill:#4D3F92;}
|
||||
.st3{fill:#FFFFFF;}
|
||||
</style>
|
||||
|
||||
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:26.6667px;line-height:1.25;font-family:'Noto Sans Linear B';-inkscape-font-specification:'Noto Sans Linear B';display:none;fill:#ff0000;fill-opacity:0.993491"
|
||||
x="94.643097"
|
||||
y="633.18518"
|
||||
id="text455"
|
||||
inkscape:label="Note: I do not know the original font used...."
|
||||
sodipodi:insensitive="true"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan453"
|
||||
x="0"
|
||||
y="0"
|
||||
style="font-size:26.6667px;fill:#ff0000;fill-opacity:0.993491">Note: I do not know the original font used....</tspan></text><g
|
||||
id="Capa_2"
|
||||
transform="matrix(1.6168892,0,0,1.6168895,172.88889,94.00966)"
|
||||
style="image-rendering:auto">
|
||||
<g
|
||||
id="g21"
|
||||
transform="translate(9.4535881e-5,0.46581846)">
|
||||
<path
|
||||
class="st2"
|
||||
d="m 151.6,95.1 c 1.5,-0.3 2.8,-1 3.8,-2 4,-5.3 0.8,-11.8 -4.5,-12.6 -0.8,0 -1.5,-0.8 -1.5,-1.5 0,-0.3 0,-0.5 0,-0.5 0.8,-0.8 1.5,-1.8 2.5,-3.3 8.1,-10.8 11.8,-50.6 3.8,-53.7 -9.8,-3.3 -29.7,6.3 -38.3,17.4 -0.5,-0.3 -1,-1 -1,-1.8 0.3,-3 -1.3,-5.5 -3.5,-6.8 -4.5,-2.3 -8.8,0 -10.6,3.3 -0.5,0.8 -1.3,1.3 -2,1 -0.8,0 -1.5,-0.8 -1.5,-1.5 -0.5,-2.5 -2,-4.5 -4.3,-5.5 -4.8,-2 -9.8,0.8 -10.6,5.3 -0.3,0.8 -0.8,1.5 -1.5,1.5 -0.8,0.3 -1.5,-0.3 -2,-1 -1.5,-2.3 -4,-3.8 -6.5,-3.8 -4,0 -7.6,3.3 -7.8,7.3 v 0.3 0.3 c 0,0.8 -0.5,1.5 -1,1.8 H 64.8 C 56.5,28.5 36.3,18.6 26.3,21.9 c -8.1,2.8 -4.3,42.6 4,53.4 1.5,2 2.8,3.5 3.8,4.5 -0.3,0.8 -1,1.5 -1.8,1.5 -1.3,0 -2.5,0.5 -3.5,1.3 -5.3,5 -2.3,12.1 3,13.4 0.8,0.3 1.5,1 1.5,1.8 0,0.8 -0.5,1.8 -1.3,2 -1,0.5 -2,1 -2.8,2 -4,5.8 0,12.3 5.5,12.3 0.8,0 1.5,0.5 1.8,1.3 0.3,0.8 0.3,1.5 -0.5,2 -1.5,1.5 -2.3,3.5 -2,5.5 0.3,2.8 2,5.3 4.8,6.5 1.5,0.8 3,0.8 4.5,0.5 0.8,-0.3 1.5,0 2,0.8 0.5,0.5 0.5,1.5 0.3,2 -0.8,1.5 -1,3.3 -0.5,5 0.8,2.8 2.8,4.8 5.5,5.5 2.5,0.5 4.3,-0.3 5.5,-0.8 0.5,-0.3 -3.3,9.1 -6,15.4 -0.8,2 1.3,4.3 3.5,3.3 8.3,-3.8 22.2,-10.3 22.2,-9.8 0.5,5.3 6.5,9.1 12.3,5.3 1.3,-0.8 2,-2.3 2.3,-3.5 0.3,-0.8 1,-1.5 2,-1.5 1,0 1.8,0.5 2,1.5 0.3,1.3 0.8,2.3 1.8,3 5.8,4.5 12.3,0.8 12.8,-4.8 0,-0.8 0.5,-1.5 1.3,-1.8 0.8,-0.3 1.5,0 2,0.5 1.5,1.5 3.3,2.5 5.3,2.5 v 0 c 2.5,0 5,-1.3 6.5,-3.8 1,-1.5 1.3,-3 1,-5 0,-0.8 0.3,-1.5 0.8,-2 0.5,-0.5 1.5,-0.5 2,0 1.5,0.8 3.3,1.3 5,0.8 2.8,-0.5 5,-2.8 5.8,-5.3 0.5,-1.8 0.3,-3.5 -0.5,-5.3 -0.3,-0.8 -0.3,-1.5 0.3,-2 0.6,-0.5 1.3,-0.8 2,-0.8 1.8,0.3 3.3,0.3 4.8,-0.5 2.3,-1 3.8,-3 4.3,-5.5 0.5,-2.5 -0.3,-4.8 -2,-6.5 -0.5,-0.5 -0.8,-1.3 -0.5,-2 0.3,-0.7 1,-1.3 1.8,-1.3 1.8,0 3.8,-0.5 5,-2 4.3,-4.5 2.3,-10.6 -2.5,-12.6 -0.8,-0.3 -1.3,-1 -1.3,-2 0,-0.9 0.7,-1.6 1.5,-1.6 z"
|
||||
id="path7"
|
||||
style="stroke:#ffffff;stroke-width:4.32930058;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<path
|
||||
class="st3"
|
||||
d="m 131.4,42.2 c 0.5,1.5 0.5,3 0,4.5 -0.3,0.8 0,1.5 0.5,2 0.5,0.5 1.3,0.8 2,0.5 1,-0.5 2,-0.5 3,-0.5 2.3,0 4.3,1 5.8,3 1,1.3 1.8,3 1.5,4.8 0,1.5 -0.5,2.8 -1.3,4 -0.5,0.5 -0.5,1.5 0,2 0.3,0.3 0.5,0.8 1,0.8 1,-0.3 2,-1 2.8,-2 4.5,-6.3 5.3,-26.2 0.8,-27.7 -4.5,-1.5 -12.3,1.5 -17.9,6 1.1,0.5 1.6,1.3 1.8,2.6 z"
|
||||
id="path9" />
|
||||
<path
|
||||
class="st3"
|
||||
d="m 39,63.6 c 0.3,-0.3 0.5,-0.5 0.8,-0.8 0.5,-0.8 0.3,-1.5 0,-2 C 38.5,59 38.2,57 38.5,55 39,52.2 41.3,50 44,49.2 c 1.5,-0.5 3,-0.3 4.5,0.3 0.8,0.3 1.5,0 2,-0.5 0.5,-0.5 0.8,-1.3 0.5,-2 -0.5,-1.5 -0.5,-3 0,-4.5 0.3,-1 0.8,-2 1.5,-2.8 -5.5,-4.5 -13.9,-7.8 -18.4,-6.3 -4.5,1.5 -3.7,21.4 0.9,27.7 1,1.5 2.2,2.2 4,2.5 z"
|
||||
id="path11" />
|
||||
<g
|
||||
id="g19">
|
||||
<circle
|
||||
class="st3"
|
||||
cx="60.900002"
|
||||
cy="94.599998"
|
||||
r="9.3000002"
|
||||
id="circle13" />
|
||||
<path
|
||||
class="st3"
|
||||
d="m 100.7,94.6 c 0,5.3 -4.3,9.3 -9.3,9.3 -5.3,0 -9.3,-4.3 -9.3,-9.3 0,-5 18.6,-5.3 18.6,0 z"
|
||||
id="path15" />
|
||||
<circle
|
||||
class="st3"
|
||||
cx="121.6"
|
||||
cy="94.599998"
|
||||
r="9.3000002"
|
||||
id="circle17" />
|
||||
</g>
|
||||
</g>
|
||||
</g><g
|
||||
id="g2720"
|
||||
inkscape:label="fluffychat"
|
||||
style="display:inline;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
transform="matrix(0.92025338,0,0,0.92025338,-6.3220161,-4.7055202)"><g
|
||||
id="g14535"
|
||||
inkscape:label="chat"
|
||||
style="fill:#00a1bc;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"><path
|
||||
style="color:#000000;fill:#00a1bc;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
d="m 562.92197,448.4866 c -2.60917,-0.30486 -5.17384,1.64339 -5.69858,4.21245 -0.55728,2.72842 -0.24323,7.91189 -0.24323,7.91189 -2.74579,-0.0686 -5.55869,-0.59559 -7.95219,1.32171 -2.65609,2.12765 -2.58626,7.00643 0,8.95134 2.34163,1.76095 7.95219,1.25707 7.95219,1.25707 0,10.01284 3.8e-4,19.77116 0,29.784 0.49843,4.92696 4.90461,8.87339 9.77862,9.22679 3.37489,0.31796 6.92487,0.1972 10.13895,-0.94458 2.75868,-1.13315 4.655,-4.36744 3.42462,-7.26639 -0.79803,-2.84864 -4.22476,-3.70476 -6.73165,-2.71773 -2.98388,1.72425 -4.84172,-1.67013 -4.47089,-4.25546 -0.0315,-8.02703 0.014,-16.05409 0.003,-24.08114 2.70412,-0.0577 5.42586,0.12654 8.11662,-0.11491 4.83581,-0.90643 5.26253,-8.45876 0.98226,-10.6606 -1.74161,-0.89591 -5.46982,-0.20326 -9.09888,-0.20326 0,0 0.006,-8.17372 -0.31554,-8.93716 -0.95528,-2.26675 -3.55257,-3.48402 -5.8856,-3.48402 z"
|
||||
id="path14479"
|
||||
sodipodi:nodetypes="sscssscccsscccscsss"
|
||||
inkscape:label="t" /><path
|
||||
style="color:#000000;fill:#00a1bc;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
d="m 533.83203,458.7646 c -3.15141,-0.34296 -5.3587,2.78921 -5.64507,5.62849 -4.36454,-3.26144 -9.61516,-5.8459 -15.20756,-5.3963 -6.1831,0.04 -12.19324,2.65617 -16.52963,7.04459 -4.78443,4.13385 -6.10787,10.65878 -6.45154,16.67045 -0.74696,9.79875 2.9723,20.42469 11.3567,26.07195 4.72285,3.21814 10.72707,3.94029 16.29823,3.34602 3.96818,-0.47405 7.23684,-2.99092 10.0626,-5.63903 0.94876,3.35182 4.62364,5.93313 8.09234,4.68427 2.67575,-0.73754 4.24888,-3.52866 3.90033,-6.20541 -0.023,-13.74703 0.0461,-27.49708 -0.0348,-41.24221 -0.22956,-2.88413 -2.96011,-5.18257 -5.84164,-4.96282 z m -5.64507,23.94723 c 1.07828,6.5283 -1.60114,14.12719 -7.86545,17.06103 -4.79574,2.30687 -11.28382,1.71783 -14.76373,-2.60852 -4.1706,-4.99711 -5.43623,-12.34122 -2.74467,-18.33861 1.20342,-3.17686 3.3771,-6.03449 6.51321,-7.48705 5.19868,-2.91069 11.95962,-0.98785 15.64553,3.45474 1.89114,2.17769 3.29829,4.97591 3.21511,7.91841 z"
|
||||
id="path12957"
|
||||
sodipodi:nodetypes="ccsssscccscccscc"
|
||||
inkscape:label="a" /><path
|
||||
style="color:#000000;fill:#00a1bc;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
d="m 443.06641,439.94141 c -3.26433,-0.0465 -6.38452,2.89404 -5.90305,6.25001 0.0229,19.9673 -0.0459,39.93753 0.0344,59.903 0.62565,4.36445 6.57701,6.42025 9.82803,3.46417 2.47654,-1.86092 1.63462,-5.09581 1.78481,-7.74763 0.014,-6.16519 -0.16754,-10.96992 0,-17.13031 0.10617,-3.90402 0.32092,-9.9351 3.79481,-12.41759 3.66729,-2.85819 10.09275,-3.39125 13.27607,-0.31533 3.28466,3.17383 3.05437,10.54267 3.05369,11.74336 -0.005,8.0496 -0.0355,16.10183 0.0353,24.14882 0.80701,3.40737 5.32389,3.39114 8.08366,2.86381 3.60962,-0.47168 4.05352,-4.29795 3.6902,-7.21157 -0.059,-9.29553 0.25875,-18.60594 -0.25343,-27.89111 -0.49072,-5.78736 -2.03801,-10.89373 -6.23092,-13.58338 -5.57775,-3.57799 -14.24081,-3.55982 -19.88013,0 l -5.56919,3.51556 c -0.0217,-6.95923 0.0434,-13.9211 -0.0327,-20.87868 -0.34574,-2.71871 -3.05656,-4.71379 -5.71157,-4.71313 z"
|
||||
id="path12939"
|
||||
sodipodi:nodetypes="sscssscssssscascccs"
|
||||
inkscape:label="h" /><path
|
||||
style="color:#000000;fill:#00a1bc;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
d="m 391.91477,465.80108 c -7.57016,7.75562 -8.50788,19.94372 -5.30926,29.86701 3.38934,9.70476 13.24407,16.98333 23.65486,16.44674 6.17898,0.0435 12.93496,-1.24727 17.5401,-5.62829 2.78827,-3.46147 -0.34158,-10.49924 -5.13073,-8.5498 -3.84026,1.83312 -7.88892,3.96797 -12.31147,3.2528 -7.29184,-0.63102 -13.62087,-6.9993 -13.71248,-14.4019 -0.47868,-6.96567 3.61497,-14.86735 10.88009,-16.32616 4.0948,-0.89565 8.1361,0.43964 11.84821,2.0877 2.74473,1.20129 6.92733,2.38997 8.54085,-1.1092 2.05726,-3.93759 -1.06922,-8.39249 -4.75218,-9.94292 -7.03297,-3.7132 -15.61905,-3.33367 -23.00158,-0.92478 -3.03694,1.2244 -5.80603,3.05639 -8.24641,5.2288 z"
|
||||
id="path12912"
|
||||
sodipodi:nodetypes="ssssscccssssssccccss"
|
||||
inkscape:label="c" /></g><g
|
||||
id="g14529"
|
||||
inkscape:label="fluffy"
|
||||
style="fill:#444444;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"><path
|
||||
style="color:#000000;fill:#444444;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
d="m 364.1013,507.69269 c -0.28866,4.09909 -1.36926,8.95002 -5.67816,10.59919 -4.72351,1.73746 -10.372,1.86184 -14.85523,-0.654 -3.7123,-2.44424 -9.3586,0.29378 -8.95093,4.93619 0.18108,4.54251 4.91635,6.57172 8.83075,6.98673 8.42045,1.69401 18.29318,1.4336 25.17485,-4.32187 4.05818,-3.36451 7.25406,-8.26315 6.89092,-13.72643 0.55108,-15.0706 0.12618,-30.15744 0.2469,-45.233 0,-5.07272 -4.90962,-8.01177 -8.99688,-5.70693 -3.44378,2.45795 -2.39927,9.5583 -2.66313,14.77473 -0.0893,6.25566 0.19851,12.54437 -0.16132,18.7791 -1.9182,7.73184 -13.50136,9.71442 -18.10525,3.34532 -2.59461,-4.37765 -1.10335,-9.66951 -1.51487,-14.47456 -0.1096,-6.36844 0.2575,-12.78073 -0.2057,-19.12097 -1.55752,-5.57454 -11.54277,-5.31263 -11.57028,0.97725 -0.0947,10.73576 -0.20144,21.49831 0.0772,32.23681 0.40229,5.90824 3.9844,11.55506 9.57033,13.81024 7.19201,3.59272 15.68253,1.22319 21.91078,-3.2078 z"
|
||||
id="path8185"
|
||||
sodipodi:nodetypes="sasssccccccszssssss"
|
||||
inkscape:label="y" /><use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#path8140"
|
||||
id="use8146-8"
|
||||
transform="translate(160.70024)"
|
||||
inkscape:label="f"
|
||||
style="fill:#444444;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers" /><use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#path8140"
|
||||
id="use8146"
|
||||
transform="translate(120.79317)"
|
||||
inkscape:label="f"
|
||||
style="fill:#444444;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers" /><path
|
||||
style="color:#000000;fill:#444444;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
d="m 203.09961,459.81323 c -3.4821,0.005 -6.38987,3.50283 -5.7894,6.9306 0.0673,9.26978 -0.15327,18.54633 0.13261,27.81164 0.35452,5.09017 2.57678,10.21523 6.82972,13.22644 5.55736,4.38774 13.10608,4.7518 19.86263,3.9702 6.13229,-0.79837 11.54541,-4.96558 14.38597,-10.38016 2.82972,-5.25148 2.04801,-11.37621 2.1897,-17.10493 -0.10216,-6.59361 0.13071,-13.20167 -0.0996,-19.78723 -0.72775,-3.82018 -5.84877,-6.11481 -8.99816,-3.58329 -2.51578,1.5391 -2.9212,4.6479 -2.62583,7.32275 -0.008,7.68886 0.16168,15.38634 -0.0559,23.06981 -0.48698,3.93482 -2.69157,8.39569 -6.95923,9.17239 -3.94192,0.90809 -9.00029,0.30019 -11.2182,-3.51487 -2.44119,-4.33438 -1.38965,-9.47747 -1.63329,-14.21621 -0.005,-5.96309 0.0606,-11.92636 -0.006,-17.88931 -0.48316,-2.81114 -3.21405,-4.945 -6.01521,-5.02783 z"
|
||||
id="path1096"
|
||||
inkscape:label="u"
|
||||
sodipodi:nodetypes="sssssssssssasss" /><path
|
||||
style="color:#000000;fill:#444444;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
d="m 178.07031,440.24903 c -2.94273,-0.099 -6.12137,2.26392 -5.66929,5.43981 0.006,20.3714 -0.0127,40.74317 0.01,61.11433 0.23114,3.95816 5.38988,5.36394 8.48062,3.72849 2.17789,-0.83721 3.06822,-3.17125 2.82068,-5.34227 0,-20.07299 0,-40.14599 0,-60.21898 0.0267,-2.89989 -3.02815,-4.71312 -5.64156,-4.72138 z"
|
||||
id="path1226"
|
||||
inkscape:label="l"
|
||||
sodipodi:nodetypes="sssssss" /><path
|
||||
style="color:#000000;fill:#444444;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
d="m 139.73461,448.98277 c -1.14826,3.54622 -0.82212,7.38974 -0.94471,11.07629 -3.09968,0.1617 -6.7129,-0.69772 -9.15473,1.75098 -2.7547,2.92023 -1.92459,9.01668 2.44338,9.87866 2.20538,0.45339 4.47409,0.19142 6.71135,0.26152 0.0152,11.5529 -0.0304,23.10713 0.0229,34.65919 -0.10894,3.56452 3.75176,4.97291 6.73777,4.56755 3.00221,0.16258 5.93165,-2.21911 5.51966,-5.39349 0,-11.27775 0,-22.5555 0,-33.83325 3.22434,-0.0869 6.4758,0.20412 9.67787,-0.21167 4.22512,-0.5039 5.63076,-6.354 2.95775,-9.24029 -2.71637,-2.28723 -6.44022,-1.38284 -9.70112,-1.5715 -0.97817,0 -1.95633,0 -2.9345,0 -0.005,-2.94202 -0.4927,-6.38548 1.50629,-8.82582 2.27205,-1.97081 5.68412,-1.89124 8.14223,-0.31788 3.12241,1.35659 5.95844,-2.03832 6.28128,-4.89774 0.55889,-3.56544 -2.59547,-6.6544 -6.01774,-6.93035 -7.34549,-1.08714 -15.56841,1.21331 -20.11043,7.37767 -0.40614,0.53074 -0.78524,1.08209 -1.13728,1.65013 z"
|
||||
id="path8140"
|
||||
inkscape:label="f"
|
||||
sodipodi:nodetypes="scszscszscszscsszcs" /></g></g></svg>
|
||||
|
Before Width: | Height: | Size: 15 KiB |
1
assets/js/package/olm.js
Normal file
@ -0,0 +1 @@
|
||||
// Dummy file :-)
|
||||
@ -1,25 +1,30 @@
|
||||
{
|
||||
"@@last_modified": "2021-08-14 12:41:10.154280",
|
||||
"about": "সম্পর্কে",
|
||||
"@about": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"accept": "স্বীকার করি",
|
||||
"@accept": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"acceptedTheInvitation": "{username} আমন্ত্রণ গ্রহণ করেছে",
|
||||
"@acceptedTheInvitation": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"account": "অ্যাকাউন্ট",
|
||||
"@account": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
"@@last_modified": "2021-08-14 12:41:10.154280",
|
||||
"about": "সম্পর্কে",
|
||||
"@about": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"accept": "স্বীকার করি",
|
||||
"@accept": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"acceptedTheInvitation": "{username} আমন্ত্রণ গ্রহণ করেছে",
|
||||
"@acceptedTheInvitation": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"account": "অ্যাকাউন্ট",
|
||||
"@account": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"accountInformation": "অ্যাকাউন্ট তথ্য",
|
||||
"@accountInformation": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
}
|
||||
}
|
||||
@ -1 +0,0 @@
|
||||
{}
|
||||
@ -1 +0,0 @@
|
||||
{}
|
||||
@ -1 +0,0 @@
|
||||
{}
|
||||
1551
assets/l10n/intl_hy.arb
Normal file
@ -1,120 +1,3 @@
|
||||
{
|
||||
"@@last_modified": "2021-08-14 12:41:09.940318",
|
||||
"copiedToClipboard": "Copiada para a área de transferência",
|
||||
"@copiedToClipboard": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"login": "Iniciar sessão",
|
||||
"@login": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"about": "Sobre",
|
||||
"@about": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"admin": "Admin",
|
||||
"@admin": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"areYouSure": "Tens a certeza?",
|
||||
"@areYouSure": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"notifications": "Notificações",
|
||||
"@notifications": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"account": "Conta",
|
||||
"@account": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"cancel": "Cancelar",
|
||||
"@cancel": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"delete": "Eliminar",
|
||||
"@delete": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"dateAndTimeOfDay": "{date}, {timeOfDay}",
|
||||
"@dateAndTimeOfDay": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"date": {},
|
||||
"timeOfDay": {}
|
||||
}
|
||||
},
|
||||
"dateWithYear": "{day}-{month}-{year}",
|
||||
"@dateWithYear": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"year": {},
|
||||
"month": {},
|
||||
"day": {}
|
||||
}
|
||||
},
|
||||
"help": "Ajuda",
|
||||
"@help": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"messages": "Mensagens",
|
||||
"@messages": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"reason": "Razão",
|
||||
"@reason": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"privacy": "Privacidade",
|
||||
"@privacy": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"openCamera": "Abrir câmara",
|
||||
"@openCamera": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"settings": "Configurações",
|
||||
"@settings": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"logout": "Terminar sessão",
|
||||
"@logout": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"search": "Pesquisar",
|
||||
"@search": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"users": "Utilizadores",
|
||||
"@users": {},
|
||||
"close": "Fechar",
|
||||
"@close": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"dateWithoutYear": "{day}-{month}",
|
||||
"@dateWithoutYear": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"month": {},
|
||||
"day": {}
|
||||
}
|
||||
}
|
||||
"@@last_modified": "2021-08-14 12:41:09.940318"
|
||||
}
|
||||
374
assets/l10n/intl_si.arb
Normal file
@ -0,0 +1,374 @@
|
||||
{
|
||||
"@@last_modified": "2021-08-14 12:41:09.895217",
|
||||
"about": "පිළිබඳව",
|
||||
"@about": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"accept": "පිළිගන්න",
|
||||
"@accept": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"account": "ගිණුම",
|
||||
"@account": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"accountInformation": "ගිණුමේ තොරතුරු",
|
||||
"@accountInformation": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"addEmail": "වි-තැපෑල එකතු කරන්න",
|
||||
"@addEmail": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"admin": "පරිපාලක",
|
||||
"@admin": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"allChats": "සියලුම සංවාද",
|
||||
"@allChats": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"alreadyHaveAnAccount": "දැනටමත් ගිණුමක් තිබේද?",
|
||||
"@alreadyHaveAnAccount": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"anyoneCanJoin": "ඕනෑම කෙනෙකුට එක්විය හැකිය",
|
||||
"@anyoneCanJoin": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"archive": "සංරක්ෂිතය",
|
||||
"@archive": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"archivedRoom": "සංරක්ෂිත කාමරය",
|
||||
"@archivedRoom": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"areGuestsAllowedToJoin": "ආගන්තුක පරිශීලකයින්ට එක්වීමට අවසර තිබේද",
|
||||
"@areGuestsAllowedToJoin": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"areYouSure": "ඔබට විශ්වාසද?",
|
||||
"@areYouSure": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"areYouSureYouWantToLogout": "ඔබට නික්මීමට අවශ්ය බව විශ්වාසද?",
|
||||
"@areYouSureYouWantToLogout": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"audioPlayerPlay": "ධාවනය",
|
||||
"@audioPlayerPlay": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"blockDevice": "උපාංගය අවහිර කරන්න",
|
||||
"@blockDevice": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"cachedKeys": "යතුරු නිහිතගතයි",
|
||||
"@cachedKeys": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"cancel": "අවලංගු කරන්න",
|
||||
"@cancel": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changeDeviceName": "උපාංගයේ නම වෙනස් කරන්න",
|
||||
"@changeDeviceName": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changePassword": "මුරපදය වෙනස් කරන්න",
|
||||
"@changePassword": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chat": "සංවාදය",
|
||||
"@chat": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chatBackup": "සංවාද උපස්ථය",
|
||||
"@chatBackup": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chatDetails": "සංවාදයේ විස්තර",
|
||||
"@chatDetails": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chats": "සංවාද",
|
||||
"@chats": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chooseAStrongPassword": "ශක්තිමත් මුරපදයක් තෝරන්න",
|
||||
"@chooseAStrongPassword": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chooseAUsername": "පරිශීලක නාමයක් තෝරන්න",
|
||||
"@chooseAUsername": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"clearArchive": "සංරක්ෂිතය හිස් කරන්න",
|
||||
"@clearArchive": {},
|
||||
"close": "වසන්න",
|
||||
"@close": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"commandHint_join": "දී ඇති කාමරයට එක්වන්න",
|
||||
"@commandHint_join": {
|
||||
"type": "text",
|
||||
"description": "Usage hint for the command /join"
|
||||
},
|
||||
"commandHint_leave": "මෙම කාමරය හැරයන්න",
|
||||
"@commandHint_leave": {
|
||||
"type": "text",
|
||||
"description": "Usage hint for the command /leave"
|
||||
},
|
||||
"commandInvalid": "විධානය වලංගු නොවේ",
|
||||
"@commandInvalid": {
|
||||
"type": "text"
|
||||
},
|
||||
"commandMissing": "{{command} විධානයක් නොවේ.",
|
||||
"@commandMissing": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"command": {}
|
||||
},
|
||||
"description": "State that {command} is not a valid /command."
|
||||
},
|
||||
"compareEmojiMatch": "සසඳා බලා පහත දැක්වෙන ඉමොජි අනෙක් උපාංගයට නිසැකවම ගැලපෙන බවට වග බලා ගන්න:",
|
||||
"@compareEmojiMatch": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"compareNumbersMatch": "සංසන්දනය කර පහත දැක්වෙන අංක අනෙක් උපාංගට නිසැකව ගැලපෙන බවට වග බලා ගන්න:",
|
||||
"@compareNumbersMatch": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"confirm": "තහවුරු කරන්න",
|
||||
"@confirm": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"connect": "සබඳින්න",
|
||||
"@connect": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"connectionAttemptFailed": "සබැඳීමේ උත්සාහය අසාර්ථකයි",
|
||||
"@connectionAttemptFailed": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"contactHasBeenInvitedToTheGroup": "සමූහය වෙත සබඳතාවයකට ආරාධනා කර ඇත",
|
||||
"@contactHasBeenInvitedToTheGroup": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"copy": "පිටපත්",
|
||||
"@copy": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"create": "සාදන්න",
|
||||
"@create": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"createAccountNow": "දැන් ගිණුමක් සාදන්න",
|
||||
"@createAccountNow": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"createNewGroup": "නව සමූහයක් සාදන්න",
|
||||
"@createNewGroup": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"donate": "පරිත්යාග",
|
||||
"@donate": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"encryption": "සංකේතාංකනය",
|
||||
"@encryption": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"everythingReady": "සියල්ල සූදානම්!",
|
||||
"@everythingReady": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"fontSize": "මුද්රණඅකුරේ ප්රමාණය",
|
||||
"@fontSize": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"goToTheNewRoom": "නව කාමරයට යන්න",
|
||||
"@goToTheNewRoom": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"joinRoom": "කාමරයට එක්වන්න",
|
||||
"@joinRoom": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"keysCached": "යතුරු නිහිතගත යි",
|
||||
"@keysCached": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"next": "ඊලඟ",
|
||||
"@next": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"noPublicRoomsFound": "ප්රසිද්ධ කාමර හමු නොවිණි…",
|
||||
"@noPublicRoomsFound": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"people": "මිනිසුන්",
|
||||
"@people": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"publicGroups": "ප්රසිද්ධ සමූහ",
|
||||
"@publicGroups": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"removeDevice": "උපාංගය ඉවත්කරන්න",
|
||||
"@removeDevice": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"roomVersion": "කාමරයේ අනුවාදය",
|
||||
"@roomVersion": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"savedFileAs": "ලෙස ගොනුව සුරකින්න {filename}",
|
||||
"@savedFileAs": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"filename": {}
|
||||
}
|
||||
},
|
||||
"saveFile": "ගොනුව සුරකින්න",
|
||||
"@saveFile": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"saveFileToFolder": "ගොනුව මෙම බහාලුමට සුරකින්න",
|
||||
"@saveFileToFolder": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"securityKey": "ආරක්ෂක යතුර",
|
||||
"@securityKey": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"securityKeyLost": "ආරක්ෂක යතුර නැතිවුනාද?",
|
||||
"@securityKeyLost": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"send": "යවන්න",
|
||||
"@send": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"showPassword": "මුරපදය පෙන්වන්න",
|
||||
"@showPassword": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"sunday": "ඉරිදා",
|
||||
"@sunday": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"username": "පරිශීලක නාමය",
|
||||
"@username": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"videoCall": "දෘශ්ය ඇමතුම",
|
||||
"@videoCall": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"wallpaper": "බිතුපත",
|
||||
"@wallpaper": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"warning": "අවවාදයයි!",
|
||||
"@warning": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"wednesday": "බදාදා",
|
||||
"@wednesday": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"writeAMessage": "පණිවිඩයක් ලියන්න…",
|
||||
"@writeAMessage": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"yes": "ඔව්",
|
||||
"@yes": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"you": "ඔබ",
|
||||
"@you": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"yourOwnUsername": "ඔබට හිමි පරිශීලකනාමය",
|
||||
"@yourOwnUsername": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"zoomIn": "විශාලනය",
|
||||
"@zoomIn": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"zoomOut": "කුඩාලනය",
|
||||
"@zoomOut": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
}
|
||||
}
|
||||
@ -1,20 +1,20 @@
|
||||
{
|
||||
"@@last_modified": "2021-08-14 12:41:09.826673",
|
||||
"acceptedTheInvitation": "{username} அழைப்பை ஏற்றுக்கொண்டார்",
|
||||
"@acceptedTheInvitation": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"accept": "ஏற்றுக்கொள்",
|
||||
"@accept": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"about": "பற்றி",
|
||||
"@about": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
"@@last_modified": "2021-08-14 12:41:09.826673",
|
||||
"acceptedTheInvitation": "{username} அழைப்பை ஏற்றுக்கொண்டார்",
|
||||
"@acceptedTheInvitation": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"accept": "ஏற்றுக்கொள்",
|
||||
"@accept": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"about": "பற்றி",
|
||||
"@about": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1 +0,0 @@
|
||||
{}
|
||||
|
Before Width: | Height: | Size: 146 KiB After Width: | Height: | Size: 212 KiB |
BIN
assets/private_chat_wallpaper.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 38 KiB |
@ -1,80 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="64"
|
||||
height="30"
|
||||
viewBox="0 0 64 30"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
sodipodi:docname="typing.svg"
|
||||
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14, custom)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs12" />
|
||||
<sodipodi:namedview
|
||||
id="namedview10"
|
||||
pagecolor="#505050"
|
||||
bordercolor="#eeeeee"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#505050"
|
||||
showgrid="false"
|
||||
inkscape:zoom="9.9296875"
|
||||
inkscape:cx="24.018883"
|
||||
inkscape:cy="15.307632"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1012"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg8" />
|
||||
<circle
|
||||
style="fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
|
||||
cx="10"
|
||||
cy="15"
|
||||
r="9"
|
||||
id="circle2">
|
||||
<animate
|
||||
attributeName="fill"
|
||||
dur="2s"
|
||||
values="#000000; #efefef; #000000"
|
||||
calcMode="spline"
|
||||
keyTimes="0; 0.5; 1"
|
||||
keySplines="0 .75 .25 1; .5 0 .5 1"
|
||||
begin="0s" />
|
||||
</circle>
|
||||
<circle
|
||||
style="fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
|
||||
cx="32"
|
||||
cy="15"
|
||||
r="9"
|
||||
id="circle4">
|
||||
<animate
|
||||
attributeName="fill"
|
||||
dur="2s"
|
||||
values="#000000; #efefef; #000000"
|
||||
calcMode="spline"
|
||||
keyTimes="0; 0.5; 1"
|
||||
keySplines="0 .75 .25 1; .5 0 .5 1"
|
||||
begin="0.25s" />
|
||||
</circle>
|
||||
<circle
|
||||
style="fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
|
||||
cx="54"
|
||||
cy="15"
|
||||
r="9"
|
||||
id="circle6">
|
||||
<animate
|
||||
attributeName="fill"
|
||||
dur="2s"
|
||||
values="#000000; #efefef; #000000"
|
||||
calcMode="spline"
|
||||
keyTimes="0; 0.5; 1"
|
||||
keySplines="0 .75 .25 1; .5 0 .5 1"
|
||||
begin="0.5s" />
|
||||
</circle>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.3 KiB |
@ -7,9 +7,11 @@ are also published on it.
|
||||
|
||||
Easiest way to add the Repository is to either **scan the QR-Code** or if you are on your phone **directly click it**.
|
||||
|
||||
<a href="fdroidrepos://fluffychat.im/repo/stable/repo/?fingerprint=5EDB5C4395B2F2D9BA682F6A1D275170CCE5365A6FA27D2220EA8D52A6D95F07" >
|
||||
{::nomarkdown}
|
||||
<a href="fdroidrepos://fluffychat.im/repo/stable/repo/?fingerprint=8E2637AEF6697CC6DD486AF044A6EE45B1A742AE3EF56566E748CDE8BC65C1FB" >
|
||||
<img src="qr-stable.svg" width="300" height="300"/>
|
||||
</a>
|
||||
{:/}
|
||||
|
||||
|
||||
### If the QR-Code doesn't work:
|
||||
@ -22,11 +24,11 @@ If this still isn't working follow the next steps:
|
||||
2. Go to the `Settings` Tab in the Bottom bar
|
||||
3. Click the `Repositories` Action
|
||||
4. Click on the plus sign at the top.
|
||||
5. Fill in `https://fluffychat.im/repo/stable/repo/` into the top field and `5EDB5C4395B2F2D9BA682F6A1D275170CCE5365A6FA27D2220EA8D52A6D95F07` in the bottom field.
|
||||
5. Fill in `https://fluffychat.im/repo/stable/repo/` into the top field and `8E2637AEF6697CC6DD486AF044A6EE45B1A742AE3EF56566E748CDE8BC65C1FB` in the bottom field.
|
||||
|
||||
## What is the fingerprint?
|
||||
|
||||
The fingerprint of the Repository is: `5EDB5C4395B2F2D9BA682F6A1D275170CCE5365A6FA27D2220EA8D52A6D95F07`
|
||||
The fingerprint of the Repository is: `8E2637AEF6697CC6DD486AF044A6EE45B1A742AE3EF56566E748CDE8BC65C1FB`
|
||||
|
||||
# Nightly Repository
|
||||
|
||||
@ -34,9 +36,11 @@ The fingerprint of the Repository is: `5EDB5C4395B2F2D9BA682F6A1D275170CCE5365A6
|
||||
|
||||
Easiest way to add the Repository is to either **scan the QR-Code** or if you are on your phone **directly click** it.
|
||||
|
||||
{::nomarkdown}
|
||||
<a href="fdroidrepos://fluffychat.im/repo/nightly/repo/?fingerprint=21A469657300576478B623DF99D8EB889A80BCD939ACA60A4074741BEAEC397D" >
|
||||
<img src="qr-nightly.svg" width="300" height="300"/>
|
||||
</a>
|
||||
{:/}
|
||||
|
||||
|
||||
### If the QR-Code doesn't work:
|
||||
|
||||
652
docs/index.html
@ -1,117 +1,571 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>FluffyChat Official Website</title>
|
||||
<meta name="identifier-url" content="https://fluffychat.im" />
|
||||
<meta name="title" content="FluffyChat Official Website" />
|
||||
<meta name="description" content="The cutest messenger in the Matrix network" />
|
||||
<meta name="abstract" content="FluffyChat is the cutest messenger in the Matrix network" />
|
||||
<meta name="keywords" content="FluffyChat, Matrix, Flutter, App" />
|
||||
<meta name="author" content="Krille Fear" />
|
||||
<meta name="revisit-after" content="15" />
|
||||
<meta name="language" content="EN" />
|
||||
<meta name="robots" content="All" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="icon" type="image/x-icon" href="favicon.png">
|
||||
<link href="tailwind.css" rel="stylesheet">
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
<title>FluffyChat - Official Website</title>
|
||||
<meta name="description" content="A cute and secure chatclient for the matrix protocol">
|
||||
<meta name="keywords"
|
||||
content="Fluffychat, Matrix, Web, Android, iOS, Desktop, Chat, Client, Chatclient, Matrix.org, Secure, E2EE, End to End, Encryption, End to End Encryption, F-Droid, Foss, FOSS, OpenSource, Free, Community, Open">
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "MobileApplication",
|
||||
"name": "Fluffychat",
|
||||
"applicationCategory": "CommunicationApplication",
|
||||
"countriesNotSupported": "fr",
|
||||
"operatingSystem": "ANDROID",
|
||||
"releaseNotes": "https://gitlab.com/famedly/fluffychat/-/blob/main/CHANGELOG.md",
|
||||
"screenshot": "https://gitlab.com/famedly/fluffychat/-/raw/main/docs/screenshots/mobile.png",
|
||||
"softwareHelp": "https://gitlab.com/famedly/fluffychat/-/wikis/FAQ",
|
||||
"author": {
|
||||
"@type": "Person",
|
||||
"callSign": "KrilleFear"
|
||||
},
|
||||
"license": "https://gitlab.com/famedly/fluffychat/-/blob/main/LICENSE",
|
||||
"offers": {
|
||||
"@type": "Offer",
|
||||
"price": "0",
|
||||
"priceCurrency": "USD"
|
||||
},
|
||||
"aggregateRating": {
|
||||
"@type": "AggregateRating",
|
||||
"ratingValue": "4.5",
|
||||
"ratingCount": "133"
|
||||
},
|
||||
"installUrl": "https://play.google.com/store/apps/details?id=chat.fluffy.fluffychat"
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "MobileApplication",
|
||||
"name": "Fluffychat",
|
||||
"applicationCategory": "CommunicationApplication",
|
||||
"countriesNotSupported": "fr",
|
||||
"operatingSystem": "ANDROID",
|
||||
"releaseNotes": "https://gitlab.com/famedly/fluffychat/-/blob/main/CHANGELOG.md",
|
||||
"screenshot": "https://gitlab.com/famedly/fluffychat/-/raw/main/docs/screenshots/mobile.png",
|
||||
"softwareHelp": "https://gitlab.com/famedly/fluffychat/-/wikis/FAQ",
|
||||
"author": {
|
||||
"@type": "Person",
|
||||
"callSign": "KrilleFear"
|
||||
},
|
||||
"license": "https://gitlab.com/famedly/fluffychat/-/blob/main/LICENSE",
|
||||
"offers": {
|
||||
"@type": "Offer",
|
||||
"price": "0",
|
||||
"priceCurrency": "USD"
|
||||
},
|
||||
"aggregateRating": {
|
||||
"@type": "AggregateRating",
|
||||
"ratingValue": "4.5",
|
||||
"ratingCount": "133"
|
||||
},
|
||||
"installUrl": "https://f-droid.org/de/packages/chat.fluffy.fluffychat/"
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "MobileApplication",
|
||||
"name": "Fluffychat",
|
||||
"applicationCategory": "CommunicationApplication",
|
||||
"countriesNotSupported": "fr",
|
||||
"operatingSystem": "IOS",
|
||||
"releaseNotes": "https://gitlab.com/famedly/fluffychat/-/blob/main/CHANGELOG.md",
|
||||
"screenshot": "https://gitlab.com/famedly/fluffychat/-/raw/main/docs/screenshots/mobile.png",
|
||||
"softwareHelp": "https://gitlab.com/famedly/fluffychat/-/wikis/FAQ",
|
||||
"author": {
|
||||
"@type": "Person",
|
||||
"callSign": "KrilleFear"
|
||||
},
|
||||
"license": "https://gitlab.com/famedly/fluffychat/-/blob/main/LICENSE",
|
||||
"offers": {
|
||||
"@type": "Offer",
|
||||
"price": "0",
|
||||
"priceCurrency": "USD"
|
||||
},
|
||||
"aggregateRating": {
|
||||
"@type": "AggregateRating",
|
||||
"ratingValue": "4.4",
|
||||
"ratingCount": "28"
|
||||
},
|
||||
"installUrl": "https://apps.apple.com/app/fluffychat/id1551469600"
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "WebApplication",
|
||||
"name": "Fluffychat",
|
||||
"applicationCategory": "CommunicationApplication",
|
||||
"countriesNotSupported": "fr",
|
||||
"operatingSystem": "WEB",
|
||||
"releaseNotes": "https://gitlab.com/famedly/fluffychat/-/blob/main/CHANGELOG.md",
|
||||
"screenshot": "https://gitlab.com/famedly/fluffychat/-/raw/main/docs/screenshots/mobile.png",
|
||||
"softwareHelp": "https://gitlab.com/famedly/fluffychat/-/wikis/FAQ",
|
||||
"author": {
|
||||
"@type": "Person",
|
||||
"callSign": "KrilleFear"
|
||||
},
|
||||
"license": "https://gitlab.com/famedly/fluffychat/-/blob/main/LICENSE",
|
||||
"offers": {
|
||||
"@type": "Offer",
|
||||
"price": "0",
|
||||
"priceCurrency": "USD"
|
||||
},
|
||||
"aggregateRating": {
|
||||
"@type": "AggregateRating",
|
||||
"ratingValue": "4.5",
|
||||
"ratingCount": "133"
|
||||
},
|
||||
"url": "https://fluffychat.im/web",
|
||||
"downloadUrl": "https://fluffychat.im/web",
|
||||
"installUrl": "https://fluffychat.im/web"
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "SoftwareApplication",
|
||||
"name": "Fluffychat",
|
||||
"applicationCategory": "CommunicationApplication",
|
||||
"countriesNotSupported": "fr",
|
||||
"operatingSystem": "LINUX",
|
||||
"releaseNotes": "https://gitlab.com/famedly/fluffychat/-/blob/main/CHANGELOG.md",
|
||||
"screenshot": "https://gitlab.com/famedly/fluffychat/-/raw/main/docs/screenshots/mobile.png",
|
||||
"softwareHelp": "https://gitlab.com/famedly/fluffychat/-/wikis/FAQ",
|
||||
"author": {
|
||||
"@type": "Person",
|
||||
"callSign": "KrilleFear"
|
||||
},
|
||||
"license": "https://gitlab.com/famedly/fluffychat/-/blob/main/LICENSE",
|
||||
"offers": {
|
||||
"@type": "Offer",
|
||||
"price": "0",
|
||||
"priceCurrency": "USD"
|
||||
},
|
||||
"aggregateRating": {
|
||||
"@type": "AggregateRating",
|
||||
"ratingValue": "4.5",
|
||||
"ratingCount": "133"
|
||||
},
|
||||
"downloadUrl": "https://snapcraft.io/fluffychat",
|
||||
"installUrl": "https://snapcraft.io/fluffychat"
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "SoftwareApplication",
|
||||
"name": "Fluffychat",
|
||||
"applicationCategory": "CommunicationApplication",
|
||||
"countriesNotSupported": "fr",
|
||||
"operatingSystem": "LINUX",
|
||||
"releaseNotes": "https://gitlab.com/famedly/fluffychat/-/blob/main/CHANGELOG.md",
|
||||
"screenshot": "https://gitlab.com/famedly/fluffychat/-/raw/main/docs/screenshots/mobile.png",
|
||||
"softwareHelp": "https://gitlab.com/famedly/fluffychat/-/wikis/FAQ",
|
||||
"author": {
|
||||
"@type": "Person",
|
||||
"callSign": "KrilleFear"
|
||||
},
|
||||
"license": "https://gitlab.com/famedly/fluffychat/-/blob/main/LICENSE",
|
||||
"offers": {
|
||||
"@type": "Offer",
|
||||
"price": "0",
|
||||
"priceCurrency": "USD"
|
||||
},
|
||||
"aggregateRating": {
|
||||
"@type": "AggregateRating",
|
||||
"ratingValue": "4.5",
|
||||
"ratingCount": "133"
|
||||
},
|
||||
"downloadUrl": "https://flathub.org/apps/details/im.fluffychat.Fluffychat",
|
||||
"installUrl": "https://flathub.org/apps/details/im.fluffychat.Fluffychat"
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "WebSite",
|
||||
"name": "FluffyChat - Official Website",
|
||||
"url": "https://fluffychat.im",
|
||||
"description": "A cute and secure chatclient for the matrix protocol",
|
||||
"thumbnailUrl": "https://fluffychat.im/favicon.png",
|
||||
"inLanguage": "de-de"
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"description": "Breadcrumbs list",
|
||||
"name": "Breadcrumbs",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"item": {
|
||||
"@id": "https://fluffychat.im",
|
||||
"name": "Homepage"
|
||||
},
|
||||
"position": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
<link rel="icon" type="image/png" href="favicon.png">
|
||||
<link rel="stylesheet" href="tailwind.css">
|
||||
<!-- Animation CSS-->
|
||||
<style>
|
||||
@font-face {
|
||||
font-family: Zen Kurenaido;
|
||||
src: url(ZenKurenaido-Regular.ttf);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------
|
||||
* Generated by Animista
|
||||
* w: http://animista.net, t: @cssanimista
|
||||
* ---------------------------------------------- */
|
||||
|
||||
.slide-in-bottom {
|
||||
-webkit-animation: slide-in-bottom .5s cubic-bezier(.25, .46, .45, .94) both;
|
||||
animation: slide-in-bottom .5s cubic-bezier(.25, .46, .45, .94) both
|
||||
}
|
||||
|
||||
.slide-in-bottom-h1 {
|
||||
-webkit-animation: slide-in-bottom .5s cubic-bezier(.25, .46, .45, .94) .5s both;
|
||||
animation: slide-in-bottom .5s cubic-bezier(.25, .46, .45, .94) .5s both
|
||||
}
|
||||
|
||||
.slide-in-bottom-subtitle {
|
||||
-webkit-animation: slide-in-bottom .5s cubic-bezier(.25, .46, .45, .94) .75s both;
|
||||
animation: slide-in-bottom .5s cubic-bezier(.25, .46, .45, .94) .75s both
|
||||
}
|
||||
|
||||
.fade-in {
|
||||
-webkit-animation: fade-in 1.2s cubic-bezier(.39, .575, .565, 1.000) 1s both;
|
||||
animation: fade-in 1.2s cubic-bezier(.39, .575, .565, 1.000) 1s both
|
||||
}
|
||||
|
||||
.bounce-top-icons {
|
||||
-webkit-animation: bounce-top .9s 1s both;
|
||||
animation: bounce-top .9s 1s both
|
||||
}
|
||||
|
||||
@-webkit-keyframes slide-in-bottom {
|
||||
0% {
|
||||
-webkit-transform: translateY(1000px);
|
||||
transform: translateY(1000px);
|
||||
opacity: 0
|
||||
}
|
||||
|
||||
100% {
|
||||
-webkit-transform: translateY(0);
|
||||
transform: translateY(0);
|
||||
opacity: 1
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes slide-in-bottom {
|
||||
0% {
|
||||
-webkit-transform: translateY(1000px);
|
||||
transform: translateY(1000px);
|
||||
opacity: 0
|
||||
}
|
||||
|
||||
100% {
|
||||
-webkit-transform: translateY(0);
|
||||
transform: translateY(0);
|
||||
opacity: 1
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes bounce-top {
|
||||
0% {
|
||||
-webkit-transform: translateY(-45px);
|
||||
transform: translateY(-45px);
|
||||
-webkit-animation-timing-function: ease-in;
|
||||
animation-timing-function: ease-in;
|
||||
opacity: 1
|
||||
}
|
||||
|
||||
24% {
|
||||
opacity: 1
|
||||
}
|
||||
|
||||
40% {
|
||||
-webkit-transform: translateY(-24px);
|
||||
transform: translateY(-24px);
|
||||
-webkit-animation-timing-function: ease-in;
|
||||
animation-timing-function: ease-in
|
||||
}
|
||||
|
||||
65% {
|
||||
-webkit-transform: translateY(-12px);
|
||||
transform: translateY(-12px);
|
||||
-webkit-animation-timing-function: ease-in;
|
||||
animation-timing-function: ease-in
|
||||
}
|
||||
|
||||
82% {
|
||||
-webkit-transform: translateY(-6px);
|
||||
transform: translateY(-6px);
|
||||
-webkit-animation-timing-function: ease-in;
|
||||
animation-timing-function: ease-in
|
||||
}
|
||||
|
||||
93% {
|
||||
-webkit-transform: translateY(-4px);
|
||||
transform: translateY(-4px);
|
||||
-webkit-animation-timing-function: ease-in;
|
||||
animation-timing-function: ease-in
|
||||
}
|
||||
|
||||
25%,
|
||||
55%,
|
||||
75%,
|
||||
87% {
|
||||
-webkit-transform: translateY(0);
|
||||
transform: translateY(0);
|
||||
-webkit-animation-timing-function: ease-out;
|
||||
animation-timing-function: ease-out
|
||||
}
|
||||
|
||||
100% {
|
||||
-webkit-transform: translateY(0);
|
||||
transform: translateY(0);
|
||||
-webkit-animation-timing-function: ease-out;
|
||||
animation-timing-function: ease-out;
|
||||
opacity: 1
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes bounce-top {
|
||||
0% {
|
||||
-webkit-transform: translateY(-45px);
|
||||
transform: translateY(-45px);
|
||||
-webkit-animation-timing-function: ease-in;
|
||||
animation-timing-function: ease-in;
|
||||
opacity: 1
|
||||
}
|
||||
|
||||
24% {
|
||||
opacity: 1
|
||||
}
|
||||
|
||||
40% {
|
||||
-webkit-transform: translateY(-24px);
|
||||
transform: translateY(-24px);
|
||||
-webkit-animation-timing-function: ease-in;
|
||||
animation-timing-function: ease-in
|
||||
}
|
||||
|
||||
65% {
|
||||
-webkit-transform: translateY(-12px);
|
||||
transform: translateY(-12px);
|
||||
-webkit-animation-timing-function: ease-in;
|
||||
animation-timing-function: ease-in
|
||||
}
|
||||
|
||||
82% {
|
||||
-webkit-transform: translateY(-6px);
|
||||
transform: translateY(-6px);
|
||||
-webkit-animation-timing-function: ease-in;
|
||||
animation-timing-function: ease-in
|
||||
}
|
||||
|
||||
93% {
|
||||
-webkit-transform: translateY(-4px);
|
||||
transform: translateY(-4px);
|
||||
-webkit-animation-timing-function: ease-in;
|
||||
animation-timing-function: ease-in
|
||||
}
|
||||
|
||||
25%,
|
||||
55%,
|
||||
75%,
|
||||
87% {
|
||||
-webkit-transform: translateY(0);
|
||||
transform: translateY(0);
|
||||
-webkit-animation-timing-function: ease-out;
|
||||
animation-timing-function: ease-out
|
||||
}
|
||||
|
||||
100% {
|
||||
-webkit-transform: translateY(0);
|
||||
transform: translateY(0);
|
||||
-webkit-animation-timing-function: ease-out;
|
||||
animation-timing-function: ease-out;
|
||||
opacity: 1
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes fade-in {
|
||||
0% {
|
||||
opacity: 0
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fade-in {
|
||||
0% {
|
||||
opacity: 0
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
</head>
|
||||
|
||||
<body
|
||||
class="flex flex-col items-center justify-center min-h-screen w-screen bg-gradient-to-t from-purple-200 to-blue-50 dark:from-gray-800 dark:to-slate-900 p-4"
|
||||
style="font-family: 'Zen Kurenaido', sans-serif;">
|
||||
<img src="favicon.png" class="h-10" />
|
||||
<h1 class="flex text-4xl items-center mb-4">
|
||||
<span style="color: #5625BA">Fluffy</span>
|
||||
<span style="color: #41a2bc">Chat</span>
|
||||
</h1>
|
||||
<img src="screenshots/screenshots.png" class="sm:max-w-lg max-w-screen mb-8" />
|
||||
|
||||
<div class="max-w-lg mb-8 flex justify-center flex-wrap">
|
||||
<a href="https://apps.apple.com/app/fluffychat/id1551469600"><img src="appstore-badge.png"
|
||||
class="w-36 pr-2 mb-2 inline hover:scale-105 transition-transform"></a>
|
||||
<a href="https://play.google.com/store/apps/details?id=chat.fluffy.fluffychat"><img src="google-play-badge.png"
|
||||
class="w-36 pr-2 mb-2 hover:scale-105 transition-transform inline">
|
||||
</a><a href="https://f-droid.org/packages/chat.fluffy.fluffychat/"><img src="fdroid_button.png"
|
||||
class="w-36 pr-2 mb-2 hover:scale-105 transition-transform inline">
|
||||
</a>
|
||||
<a href="https://fluffychat.im/web">
|
||||
<img src="browser-badge.png" class="w-36 pr-2 mb-2 hover:scale-105 transition-transform inline"></a>
|
||||
<a href="https://snapcraft.io/fluffychat"><img
|
||||
src="https://snapcraft.io/static/images/badges/en/snap-store-black.svg"
|
||||
class="w-36 pr-2 mb-2 hover:scale-105 transition-transform inline"></a>
|
||||
<a href="https://flathub.org/apps/details/im.fluffychat.Fluffychat"><img src="flathub-badge-en.png"
|
||||
class="w-36 pr-2 mb-2 hover:scale-105 transition-transform inline"></a>
|
||||
</div>
|
||||
<body class="leading-normal tracking-normal text-gray-900" style="font-family: 'Zen Kurenaido', sans-serif;">
|
||||
|
||||
|
||||
|
||||
<div class="h-screen pb-14 bg-right bg-cover" style="background-image:url('bg.svg');">
|
||||
<!--Nav-->
|
||||
<div class="w-full container mx-auto p-6">
|
||||
|
||||
<div class="w-full flex items-center justify-between">
|
||||
<a class="flex items-center no-underline hover:no-underline font-bold text-2xl lg:text-4xl" href="#">
|
||||
<img src="favicon.png" class="h-8 fill-current text-indigo-600 pr-2" /> <span
|
||||
style="color: #5625BA">Fluffy</span><span style="color: #41a2bc">Chat</span>
|
||||
</a>
|
||||
|
||||
<div class="flex w-1/2 justify-end content-center">
|
||||
<a class="inline-block text-blue-300 no-underline hover:text-indigo-800 hover:text-underline text-center h-10 p-2 md:h-auto md:p-4"
|
||||
href="https://matrix.to/#/#fluffychat:matrix.org">
|
||||
<svg class="fill-current h-6" enable-background="new -91 49.217 56.693 56.693" id="Layer_1"
|
||||
version="1.1" viewBox="-91 49.217 56.693 56.693" xml:space="preserve"
|
||||
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<path
|
||||
d="M-38.3289,79.8244c-0.7526-2.2362-3.1756-3.4388-5.4117-2.6861l-4.5351,1.5264l-3.0737-9.1321l4.4169-1.4866 c2.2362-0.7526,3.4388-3.1756,2.6861-5.4117c-0.7526-2.2362-3.1756-3.4388-5.4117-2.6861l-4.4168,1.4866l-1.4877-4.4201 c-0.7527-2.2362-3.1756-3.4388-5.4117-2.6861v0c-2.2362,0.7526-3.4388,3.1756-2.6861,5.4117l1.4877,4.4201l-9.3246,3.1385 l-1.4697-4.3666c-0.7527-2.2362-3.1756-3.4388-5.4117-2.6861c-2.2362,0.7527-3.4388,3.1756-2.6861,5.4117l1.4697,4.3666 l-4.445,1.4961c-2.2362,0.7527-3.4388,3.1756-2.6861,5.4117v0c0.7526,2.2362,3.1756,3.4388,5.4117,2.6861l4.445-1.4961 l3.0737,9.1321l-4.3268,1.4563c-2.2362,0.7527-3.4388,3.1756-2.6861,5.4117c0.7526,2.2362,3.1756,3.4388,5.4117,2.6861 l4.3268-1.4563l1.5778,4.6877c0.7527,2.2362,3.1756,3.4388,5.4117,2.6861c2.2362-0.7527,3.4388-3.1756,2.6861-5.4117l-1.5778-4.6877 l9.3246-3.1385l1.5598,4.6342c0.7527,2.2362,3.1756,3.4388,5.4117,2.6861c2.2362-0.7527,3.4388-3.1756,2.6861-5.4117l-1.5598-4.6342 l4.5351-1.5264C-38.7789,84.4835-37.5762,82.0606-38.3289,79.8244z M-65.6982,84.5288l-3.0737-9.1321l9.3246-3.1385l3.0737,9.1321 L-65.6982,84.5288z" />
|
||||
</svg>
|
||||
</a>
|
||||
<a class="inline-block text-blue-300 no-underline hover:text-indigo-800 hover:text-underline text-center h-10 p-2 md:h-auto md:p-4"
|
||||
href="https://twitter.com/KrilleFear">
|
||||
<svg class="fill-current h-6" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
|
||||
<path
|
||||
d="M30.063 7.313c-.813 1.125-1.75 2.125-2.875 2.938v.75c0 1.563-.188 3.125-.688 4.625a15.088 15.088 0 0 1-2.063 4.438c-.875 1.438-2 2.688-3.25 3.813a15.015 15.015 0 0 1-4.625 2.563c-1.813.688-3.75 1-5.75 1-3.25 0-6.188-.875-8.875-2.625.438.063.875.125 1.375.125 2.688 0 5.063-.875 7.188-2.5-1.25 0-2.375-.375-3.375-1.125s-1.688-1.688-2.063-2.875c.438.063.813.125 1.125.125.5 0 1-.063 1.5-.25-1.313-.25-2.438-.938-3.313-1.938a5.673 5.673 0 0 1-1.313-3.688v-.063c.813.438 1.688.688 2.625.688a5.228 5.228 0 0 1-1.875-2c-.5-.875-.688-1.813-.688-2.75 0-1.063.25-2.063.75-2.938 1.438 1.75 3.188 3.188 5.25 4.25s4.313 1.688 6.688 1.813a5.579 5.579 0 0 1 1.5-5.438c1.125-1.125 2.5-1.688 4.125-1.688s3.063.625 4.188 1.813a11.48 11.48 0 0 0 3.688-1.375c-.438 1.375-1.313 2.438-2.563 3.188 1.125-.125 2.188-.438 3.313-.875z">
|
||||
</path>
|
||||
</svg>
|
||||
</a>
|
||||
<a class="inline-block text-blue-300 no-underline hover:text-indigo-800 hover:text-underline text-center h-10 p-2 md:h-auto md:p-4"
|
||||
href="https://reddit.com/r/fluffychat">
|
||||
<svg class="fill-current h-6" height="100%"
|
||||
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
|
||||
version="1.1" viewBox="0 0 512 512" width="100%" xml:space="preserve"
|
||||
xmlns="http://www.w3.org/2000/svg" xmlns:serif="http://www.serif.com/"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<path
|
||||
d="M256,0c141.29,0 256,114.71 256,256c0,141.29 -114.71,256 -256,256c-141.29,0 -256,-114.71 -256,-256c0,-141.29 114.71,-256 256,-256Zm170.667,256c0,-20.66 -16.768,-37.427 -37.427,-37.427c-10.18,0 -19.163,3.892 -25.75,10.48c-25.45,-18.265 -60.781,-30.241 -99.705,-31.738l17.066,-79.944l55.392,11.677c0.599,14.072 12.276,25.45 26.648,25.45c14.672,0 26.648,-11.976 26.648,-26.648c0,-14.671 -11.976,-26.648 -26.648,-26.648c-10.479,0 -19.462,5.989 -23.654,14.971l-61.979,-13.174c-1.796,-0.3 -3.593,0 -5.09,0.898c-1.497,0.898 -2.395,2.395 -2.994,4.192l-18.863,89.226c-39.822,1.197 -75.453,12.874 -101.202,31.738c-6.587,-6.288 -15.869,-10.48 -25.75,-10.48c-20.66,0 -37.427,16.767 -37.427,37.427c0,15.27 8.983,28.145 22.157,34.133c-0.599,3.593 -0.898,7.486 -0.898,11.378c0,57.488 66.769,103.897 149.408,103.897c82.638,0 149.408,-46.409 149.408,-103.897c0,-3.892 -0.299,-7.485 -0.898,-11.078c12.276,-5.989 21.558,-19.163 21.558,-34.433Zm-107.191,97.011c-18.264,18.264 -52.996,19.462 -63.177,19.462c-10.18,0 -45.211,-1.498 -63.176,-19.462c-2.695,-2.695 -2.695,-7.186 0,-9.881c2.695,-2.695 7.186,-2.695 9.881,0c11.377,11.378 35.929,15.569 53.595,15.569c17.665,0 41.918,-4.191 53.595,-15.569c2.695,-2.695 7.186,-2.695 9.881,0c2.096,2.994 2.096,7.186 -0.599,9.881Zm-148.809,-70.363c0,-14.671 11.976,-26.648 26.648,-26.648c14.671,0 26.648,11.977 26.648,26.648c0,14.671 -11.977,26.648 -26.648,26.648c-14.672,0 -26.648,-11.977 -26.648,-26.648Zm144.018,26.648c-14.671,0 -26.648,-11.977 -26.648,-26.648c0,-14.671 11.977,-26.648 26.648,-26.648c14.672,0 26.648,11.977 26.648,26.648c0,14.671 -11.976,26.648 -26.648,26.648Z"
|
||||
id="Artwork" />
|
||||
</svg>
|
||||
</a>
|
||||
<a class="inline-block text-blue-300 no-underline hover:text-indigo-800 hover:text-underline text-center h-10 p-2 md:h-auto md:p-4"
|
||||
href="https://metalhead.club/@krille">
|
||||
<svg class="fill-current h-6" viewBox="0 0 1000 1000" version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xml:space="preserve"
|
||||
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||
<clipPath id="_clip1">
|
||||
<rect x="33.6" y="-0.035" width="932.844" height="1000" />
|
||||
</clipPath>
|
||||
<g clip-path="url(#_clip1)">
|
||||
<path
|
||||
d="M946.586,599.455c-13.713,70.541 -122.816,147.742 -248.121,162.703c-65.341,7.796 -129.674,14.962 -198.275,11.815c-112.191,-5.139 -200.716,-26.776 -200.716,-26.776c0,10.92 0.673,21.319 2.02,31.044c14.586,110.711 109.787,117.344 199.967,120.436c91.021,3.114 172.068,-22.44 172.068,-22.44l3.74,82.281c0,0 -63.666,34.185 -177.079,40.473c-62.539,3.437 -140.192,-1.573 -230.636,-25.511c-196.158,-51.916 -229.893,-260.996 -235.055,-473.143c-1.573,-62.987 -0.603,-122.381 -0.603,-172.056c0,-216.931 142.142,-280.516 142.142,-280.516c71.672,-32.914 194.655,-46.755 322.508,-47.8l3.142,0c127.853,1.045 250.917,14.886 322.583,47.8c0,0 142.138,63.585 142.138,280.516c0,0 1.783,160.053 -19.823,271.174"
|
||||
style="fill-rule:nonzero;" />
|
||||
<path
|
||||
d="M798.748,345.11l0,262.667l-104.07,0l0,-254.946c0,-53.743 -22.614,-81.021 -67.847,-81.021c-50.012,0 -75.077,32.359 -75.077,96.343l0,139.547l-103.457,0l0,-139.547c0,-63.984 -25.07,-96.343 -75.082,-96.343c-45.233,0 -67.847,27.278 -67.847,81.021l0,254.946l-104.07,0l0,-262.667c0,-53.683 13.669,-96.343 41.127,-127.904c28.314,-31.561 65.395,-47.741 111.425,-47.741c53.256,0 93.585,20.468 120.251,61.41l25.922,43.451l25.927,-43.451c26.66,-40.942 66.99,-61.41 120.251,-61.41c46.025,0 83.106,16.18 111.425,47.741c27.453,31.561 41.122,74.221 41.122,127.904"
|
||||
style="fill:#fff;fill-rule:nonzero;" />
|
||||
</g>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!--Main-->
|
||||
<div class="container pt-24 md:pt-48 px-6 mx-auto flex flex-wrap flex-col md:flex-row items-center">
|
||||
|
||||
<!--Left Col-->
|
||||
<div class="flex flex-col w-full xl:w-2/5 justify-center lg:items-start overflow-y-hidden">
|
||||
<h1
|
||||
class="my-4 text-3xl md:text-5xl text-purple-800 font-bold leading-tight text-center md:text-left slide-in-bottom-h1">
|
||||
Open. Nonprofit. Cute.</h1>
|
||||
<p class="leading-normal text-base md:text-2xl mb-8 text-center md:text-left slide-in-bottom-subtitle">
|
||||
Easy to use (<a class="underline hover:text-blue-700 transition-all"
|
||||
href="https://matrix.org">matrix</a>) messenger. Secure and decentralized.</p>
|
||||
|
||||
<p class="text-blue-700 font-bold pb-4 text-center md:text-left fade-in">Mobile app:</p>
|
||||
<div class="w-full flex justify-center md:justify-start pb-24 lg:pb-0 fade-in">
|
||||
<a href="https://apps.apple.com/app/fluffychat/id1551469600"><img src="appstore-badge.png"
|
||||
class="max-h-12 pr-2 mb-2 bounce-top-icons inline"></a>
|
||||
<a href="https://play.google.com/store/apps/details?id=chat.fluffy.fluffychat"><img
|
||||
src="google-play-badge.png" class="max-h-12 pr-2 mb-2 bounce-top-icons inline">
|
||||
</a><a href="https://f-droid.org/de/packages/chat.fluffy.fluffychat/"><img src="fdroid_button.png"
|
||||
class="max-h-12 pr-2 mb-2 bounce-top-icons inline">
|
||||
</a>
|
||||
</div>
|
||||
<p class="text-blue-700 font-bold py-4 text-center md:text-left fade-in">Desktop app:</p>
|
||||
<div class="w-full flex justify-center md:justify-start pb-24 lg:pb-0 fade-in">
|
||||
<a href="https://fluffychat.im/web">
|
||||
<img src="browser-badge.png" class="max-h-12 pr-2 mb-2 bounce-top-icons inline"></a>
|
||||
<a href="https://snapcraft.io/fluffychat"><img
|
||||
src="https://snapcraft.io/static/images/badges/en/snap-store-black.svg"
|
||||
class="max-h-12 pr-2 mb-2 bounce-top-icons inline"></a>
|
||||
<a href="https://flathub.org/apps/details/im.fluffychat.Fluffychat"><img src="flathub-badge-en.png"
|
||||
class="max-h-12 pr-2 mb-2 bounce-top-icons inline"></a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!--Right Col-->
|
||||
<div class="w-full xl:w-3/5 py-6 relative">
|
||||
<img class="w-full mx-auto slide-in-bottom" src="screenshots/screenshots.png">
|
||||
</div>
|
||||
|
||||
<!--Footer-->
|
||||
<div class="w-full pt-16 pb-6 text-sm text-center md:text-left fade-in">
|
||||
<a class="text-gray-500 no-underline hover:text-purple-800"
|
||||
href="https://gitlab.com/famedly/fluffychat">Source code</a>
|
||||
-
|
||||
<a class="text-gray-500 no-underline hover:text-purple-800"
|
||||
href="https://gitlab.com/famedly/fluffychat/-/blob/main/PRIVACY.md">Privacy</a>
|
||||
-
|
||||
<a class="text-gray-500 no-underline hover:text-purple-800"
|
||||
href="https://gitlab.com/famedly/fluffychat/-/blob/main/CHANGELOG.md">Changelog</a>
|
||||
-
|
||||
<a class="text-gray-500 no-underline hover:text-purple-800"
|
||||
href="https://hosted.weblate.org/projects/fluffychat/">Translations</a>
|
||||
-
|
||||
<a class="text-gray-500 no-underline hover:text-purple-800"
|
||||
href="https://gitlab.com/famedly/fluffychat/-/blob/main/docs/fdroid_repo.md">FluffyChat F-Droid repository</a>
|
||||
-
|
||||
<a class="text-gray-500 no-underline hover:text-purple-800"
|
||||
href="https://liberapay.com/KrilleChritzelius/donate">Donate</a>
|
||||
-
|
||||
<a class="text-gray-500 no-underline hover:text-purple-800"
|
||||
href="https://keys.mailvelope.com/pks/lookup?op=get&search=christian-pauly%40posteo.de">Contact</a>
|
||||
-
|
||||
<a class="text-gray-500 no-underline hover:text-purple-800" href="https://krillefear.gitlab.io">Created
|
||||
by Krille Fear</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="flex mb-8 justify-center content-center">
|
||||
<a rel="me"
|
||||
class="inline-block text-indigo-500 no-underline hover:text-indigo-900 hover:scale-105 transition-all text-center h-auto p-4"
|
||||
rel="me" href="https://mastodon.art/@krille">
|
||||
<svg class="fill-current h-6" viewBox="0 0 1000 1000" version="1.1" xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve"
|
||||
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||
<clipPath id="_clip1">
|
||||
<rect x="33.6" y="-0.035" width="932.844" height="1000" />
|
||||
</clipPath>
|
||||
<g clip-path="url(#_clip1)">
|
||||
<path
|
||||
d="M946.586,599.455c-13.713,70.541 -122.816,147.742 -248.121,162.703c-65.341,7.796 -129.674,14.962 -198.275,11.815c-112.191,-5.139 -200.716,-26.776 -200.716,-26.776c0,10.92 0.673,21.319 2.02,31.044c14.586,110.711 109.787,117.344 199.967,120.436c91.021,3.114 172.068,-22.44 172.068,-22.44l3.74,82.281c0,0 -63.666,34.185 -177.079,40.473c-62.539,3.437 -140.192,-1.573 -230.636,-25.511c-196.158,-51.916 -229.893,-260.996 -235.055,-473.143c-1.573,-62.987 -0.603,-122.381 -0.603,-172.056c0,-216.931 142.142,-280.516 142.142,-280.516c71.672,-32.914 194.655,-46.755 322.508,-47.8l3.142,0c127.853,1.045 250.917,14.886 322.583,47.8c0,0 142.138,63.585 142.138,280.516c0,0 1.783,160.053 -19.823,271.174"
|
||||
style="fill-rule:nonzero;" />
|
||||
<path
|
||||
d="M798.748,345.11l0,262.667l-104.07,0l0,-254.946c0,-53.743 -22.614,-81.021 -67.847,-81.021c-50.012,0 -75.077,32.359 -75.077,96.343l0,139.547l-103.457,0l0,-139.547c0,-63.984 -25.07,-96.343 -75.082,-96.343c-45.233,0 -67.847,27.278 -67.847,81.021l0,254.946l-104.07,0l0,-262.667c0,-53.683 13.669,-96.343 41.127,-127.904c28.314,-31.561 65.395,-47.741 111.425,-47.741c53.256,0 93.585,20.468 120.251,61.41l25.922,43.451l25.927,-43.451c26.66,-40.942 66.99,-61.41 120.251,-61.41c46.025,0 83.106,16.18 111.425,47.741c27.453,31.561 41.122,74.221 41.122,127.904"
|
||||
style="fill:#fff;fill-rule:nonzero;" />
|
||||
</g>
|
||||
</svg>
|
||||
</a>
|
||||
<a class="inline-block text-indigo-500 no-underline hover:text-indigo-900 hover:scale-105 transition-all text-center h-auto p-4"
|
||||
href="https://matrix.to/#/#fluffychat:matrix.org">
|
||||
<svg class="fill-current h-6" enable-background="new -91 49.217 56.693 56.693" id="Layer_1" version="1.1"
|
||||
viewBox="-91 49.217 56.693 56.693" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<path
|
||||
d="M-38.3289,79.8244c-0.7526-2.2362-3.1756-3.4388-5.4117-2.6861l-4.5351,1.5264l-3.0737-9.1321l4.4169-1.4866 c2.2362-0.7526,3.4388-3.1756,2.6861-5.4117c-0.7526-2.2362-3.1756-3.4388-5.4117-2.6861l-4.4168,1.4866l-1.4877-4.4201 c-0.7527-2.2362-3.1756-3.4388-5.4117-2.6861v0c-2.2362,0.7526-3.4388,3.1756-2.6861,5.4117l1.4877,4.4201l-9.3246,3.1385 l-1.4697-4.3666c-0.7527-2.2362-3.1756-3.4388-5.4117-2.6861c-2.2362,0.7527-3.4388,3.1756-2.6861,5.4117l1.4697,4.3666 l-4.445,1.4961c-2.2362,0.7527-3.4388,3.1756-2.6861,5.4117v0c0.7526,2.2362,3.1756,3.4388,5.4117,2.6861l4.445-1.4961 l3.0737,9.1321l-4.3268,1.4563c-2.2362,0.7527-3.4388,3.1756-2.6861,5.4117c0.7526,2.2362,3.1756,3.4388,5.4117,2.6861 l4.3268-1.4563l1.5778,4.6877c0.7527,2.2362,3.1756,3.4388,5.4117,2.6861c2.2362-0.7527,3.4388-3.1756,2.6861-5.4117l-1.5778-4.6877 l9.3246-3.1385l1.5598,4.6342c0.7527,2.2362,3.1756,3.4388,5.4117,2.6861c2.2362-0.7527,3.4388-3.1756,2.6861-5.4117l-1.5598-4.6342 l4.5351-1.5264C-38.7789,84.4835-37.5762,82.0606-38.3289,79.8244z M-65.6982,84.5288l-3.0737-9.1321l9.3246-3.1385l3.0737,9.1321 L-65.6982,84.5288z" />
|
||||
</svg>
|
||||
</a>
|
||||
<a class="inline-block no-underline hover:scale-105 transition-all text-center h-auto p-4"
|
||||
href="https://ko-fi.com/krille">
|
||||
<img src="kofi_button_dark.png" class="h-6 fill-current" />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!--Footer-->
|
||||
<div class="w-full text-sm text-center max-w-lg">
|
||||
<a class="text-slate-700 dark:text-slate-200 no-underline hover:text-purple-800"
|
||||
href="https://gitlab.com/famedly/fluffychat">Source
|
||||
code</a>
|
||||
-
|
||||
<a class="text-slate-700 dark:text-slate-200 no-underline hover:text-purple-800"
|
||||
href="https://gitlab.com/famedly/fluffychat/-/blob/main/PRIVACY.md">Privacy</a>
|
||||
-
|
||||
<a class="text-slate-700 dark:text-slate-200 no-underline hover:text-purple-800"
|
||||
href="https://gitlab.com/famedly/fluffychat/-/blob/main/CHANGELOG.md">Changelog</a>
|
||||
-
|
||||
<a class="text-slate-700 dark:text-slate-200 no-underline hover:text-purple-800"
|
||||
href="https://hosted.weblate.org/projects/fluffychat/">Translations</a>
|
||||
-
|
||||
<a class="text-slate-700 dark:text-slate-200 no-underline hover:text-purple-800"
|
||||
href="https://gitlab.com/famedly/fluffychat/-/blob/main/docs/fdroid_repo.md">FluffyChat F-Droid
|
||||
repository</a>
|
||||
-
|
||||
<a class="text-slate-700 dark:text-slate-200 no-underline hover:text-purple-800"
|
||||
href="https://keys.mailvelope.com/pks/lookup?op=get&search=christian-pauly%40posteo.de">Contact</a>
|
||||
-
|
||||
<a class="text-slate-700 dark:text-slate-200 no-underline hover:text-purple-800"
|
||||
href="https://krillefear.gitlab.io">Created
|
||||
by Krille Fear</a>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
||||
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 84 KiB |
@ -10,4 +10,4 @@ archive_older = 0
|
||||
local_copy_dir = "/fdroid"
|
||||
|
||||
keystore = "key.jks"
|
||||
repo_keyalias = "key"
|
||||
repo_keyalias = "key alias"
|
||||
|
||||
BIN
fonts/NotoEmoji/NotoEmoji-Regular.ttf
Normal file
@ -1,193 +1,49 @@
|
||||
import 'package:fluffychat/config/setting_keys.dart';
|
||||
import 'package:fluffychat/pages/chat/chat_view.dart';
|
||||
import 'package:fluffychat/pages/chat_list/chat_list_body.dart';
|
||||
import 'package:fluffychat/pages/chat_list/search_title.dart';
|
||||
import 'package:fluffychat/pages/invitation_selection/invitation_selection_view.dart';
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:hive_flutter/hive_flutter.dart';
|
||||
import 'package:integration_test/integration_test.dart';
|
||||
|
||||
import 'package:fluffychat/main.dart' as app;
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import 'extensions/default_flows.dart';
|
||||
import 'extensions/wait_for.dart';
|
||||
import 'users.dart';
|
||||
|
||||
void main() {
|
||||
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
group(
|
||||
'Integration Test',
|
||||
() {
|
||||
setUpAll(
|
||||
() async {
|
||||
// this random dialog popping up is super hard to cover in tests
|
||||
SharedPreferences.setMockInitialValues({
|
||||
SettingKeys.showNoGoogle: false,
|
||||
});
|
||||
try {
|
||||
Hive.deleteFromDisk();
|
||||
Hive.initFlutter();
|
||||
} catch (_) {}
|
||||
},
|
||||
);
|
||||
group('Integration Test', () {
|
||||
testWidgets('Test if the app starts', (WidgetTester tester) async {
|
||||
app.main();
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
testWidgets(
|
||||
'Start app, login and logout',
|
||||
(WidgetTester tester) async {
|
||||
app.main();
|
||||
await tester.ensureAppStartedHomescreen();
|
||||
await tester.ensureLoggedOut();
|
||||
},
|
||||
);
|
||||
await Future.delayed(const Duration(seconds: 10));
|
||||
|
||||
testWidgets(
|
||||
'Login again',
|
||||
(WidgetTester tester) async {
|
||||
app.main();
|
||||
await tester.ensureAppStartedHomescreen();
|
||||
},
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
testWidgets(
|
||||
'Start chat and send message',
|
||||
(WidgetTester tester) async {
|
||||
app.main();
|
||||
await tester.ensureAppStartedHomescreen();
|
||||
await tester.waitFor(find.byType(TextField));
|
||||
await tester.enterText(find.byType(TextField), Users.user2.name);
|
||||
await tester.pumpAndSettle();
|
||||
expect(find.text('Connect'), findsOneWidget);
|
||||
|
||||
await tester.scrollUntilVisible(
|
||||
find.text('Chats').first,
|
||||
500,
|
||||
scrollable: find
|
||||
.descendant(
|
||||
of: find.byType(ChatListViewBody),
|
||||
matching: find.byType(Scrollable),
|
||||
)
|
||||
.first,
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.text('Chats'));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.waitFor(find.byType(SearchTitle));
|
||||
await tester.pumpAndSettle();
|
||||
final input = find.byType(TextField);
|
||||
|
||||
await tester.scrollUntilVisible(
|
||||
find.text(Users.user2.name).first,
|
||||
500,
|
||||
scrollable: find
|
||||
.descendant(
|
||||
of: find.byType(ChatListViewBody),
|
||||
matching: find.byType(Scrollable),
|
||||
)
|
||||
.first,
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.text(Users.user2.name).first);
|
||||
expect(input, findsOneWidget);
|
||||
|
||||
try {
|
||||
await tester.waitFor(
|
||||
find.byType(ChatView),
|
||||
timeout: const Duration(seconds: 5),
|
||||
);
|
||||
} catch (_) {
|
||||
// in case the homeserver sends the username as search result
|
||||
if (find.byIcon(Icons.send_outlined).evaluate().isNotEmpty) {
|
||||
await tester.tap(find.byIcon(Icons.send_outlined));
|
||||
await tester.pumpAndSettle();
|
||||
}
|
||||
}
|
||||
await tester.enterText(input, homeserver);
|
||||
await tester.testTextInput.receiveAction(TextInputAction.done);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.waitFor(find.byType(ChatView));
|
||||
await tester.enterText(find.byType(TextField).last, 'Test');
|
||||
await tester.pumpAndSettle();
|
||||
try {
|
||||
await tester.waitFor(find.byIcon(Icons.send_outlined));
|
||||
await tester.tap(find.byIcon(Icons.send_outlined));
|
||||
} catch (_) {
|
||||
await tester.testTextInput.receiveAction(TextInputAction.done);
|
||||
}
|
||||
await tester.pumpAndSettle();
|
||||
await tester.waitFor(find.text('Test'));
|
||||
await tester.pumpAndSettle();
|
||||
},
|
||||
);
|
||||
|
||||
testWidgets('Spaces', (tester) async {
|
||||
app.main();
|
||||
await tester.ensureAppStartedHomescreen();
|
||||
|
||||
await tester.waitFor(find.byTooltip('Show menu'));
|
||||
await tester.tap(find.byTooltip('Show menu'));
|
||||
// in case registration is allowed
|
||||
try {
|
||||
await tester.tap(find.text('Login'));
|
||||
await tester.pumpAndSettle();
|
||||
} catch (e) {
|
||||
log('Registration is not allowed. Proceeding with login...');
|
||||
}
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.waitFor(find.byIcon(Icons.workspaces_outlined));
|
||||
await tester.tap(find.byIcon(Icons.workspaces_outlined));
|
||||
await tester.pumpAndSettle();
|
||||
final inputs = find.byType(TextField);
|
||||
|
||||
await tester.waitFor(find.byType(TextField));
|
||||
await tester.enterText(find.byType(TextField).last, 'Test Space');
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.testTextInput.receiveAction(TextInputAction.done);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.waitFor(find.text('Invite contact'));
|
||||
|
||||
await tester.tap(find.text('Invite contact'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.waitFor(
|
||||
find.descendant(
|
||||
of: find.byType(InvitationSelectionView),
|
||||
matching: find.byType(TextField),
|
||||
),
|
||||
);
|
||||
await tester.enterText(
|
||||
find.descendant(
|
||||
of: find.byType(InvitationSelectionView),
|
||||
matching: find.byType(TextField),
|
||||
),
|
||||
Users.user2.name,
|
||||
);
|
||||
|
||||
await Future.delayed(const Duration(milliseconds: 250));
|
||||
await tester.testTextInput.receiveAction(TextInputAction.done);
|
||||
|
||||
await Future.delayed(const Duration(milliseconds: 1000));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.tap(
|
||||
find
|
||||
.descendant(
|
||||
of: find.descendant(
|
||||
of: find.byType(InvitationSelectionView),
|
||||
matching: find.byType(ListTile),
|
||||
),
|
||||
matching: find.text(Users.user2.name),
|
||||
)
|
||||
.last,
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.waitFor(find.maybeUppercaseText('Yes'));
|
||||
await tester.tap(find.maybeUppercaseText('Yes'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.tap(find.byTooltip('Back'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.waitFor(find.text('Load 2 more participants'));
|
||||
await tester.tap(find.text('Load 2 more participants'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text(Users.user2.name), findsOneWidget);
|
||||
});
|
||||
},
|
||||
);
|
||||
await tester.enterText(inputs.first, Users.alice.name);
|
||||
await tester.enterText(inputs.last, Users.alice.password);
|
||||
await tester.testTextInput.receiveAction(TextInputAction.done);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@ -1,171 +0,0 @@
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:fluffychat/pages/chat_list/chat_list_body.dart';
|
||||
import 'package:fluffychat/pages/homeserver_picker/homeserver_picker.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
import '../users.dart';
|
||||
import 'wait_for.dart';
|
||||
|
||||
extension DefaultFlowExtensions on WidgetTester {
|
||||
Future<void> login() async {
|
||||
final tester = this;
|
||||
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.waitFor(find.text('Let\'s start'));
|
||||
|
||||
expect(find.text('Let\'s start'), findsOneWidget);
|
||||
|
||||
final input = find.byType(TextField);
|
||||
|
||||
expect(input, findsOneWidget);
|
||||
|
||||
// getting the placeholder in place
|
||||
await tester.tap(find.byIcon(Icons.search));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.enterText(input, homeserver);
|
||||
await tester.pumpAndSettle();
|
||||
await tester.testTextInput.receiveAction(TextInputAction.done);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// in case registration is allowed
|
||||
// try {
|
||||
await Future.delayed(const Duration(milliseconds: 50));
|
||||
|
||||
await tester.scrollUntilVisible(
|
||||
find.text('Login'),
|
||||
500,
|
||||
scrollable: find.descendant(
|
||||
of: find.byKey(const Key('ConnectPageListView')),
|
||||
matching: find.byType(Scrollable).first,
|
||||
),
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.tap(find.text('Login'));
|
||||
await tester.pumpAndSettle();
|
||||
/*} catch (e) {
|
||||
log('Registration is not allowed. Proceeding with login...');
|
||||
}*/
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await Future.delayed(const Duration(milliseconds: 50));
|
||||
|
||||
final inputs = find.byType(TextField);
|
||||
|
||||
await tester.enterText(inputs.first, Users.user1.name);
|
||||
await tester.enterText(inputs.last, Users.user1.password);
|
||||
await tester.pumpAndSettle();
|
||||
await tester.testTextInput.receiveAction(TextInputAction.done);
|
||||
|
||||
try {
|
||||
// pumpAndSettle does not work in here as setState is called
|
||||
// asynchronously
|
||||
await tester.waitFor(
|
||||
find.byType(LinearProgressIndicator),
|
||||
timeout: const Duration(milliseconds: 1500),
|
||||
skipPumpAndSettle: true,
|
||||
);
|
||||
} catch (_) {
|
||||
// in case the input action does not work on the desired platform
|
||||
if (find.text('Login').evaluate().isNotEmpty) {
|
||||
await tester.tap(find.text('Login'));
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
await tester.pumpAndSettle();
|
||||
} catch (_) {
|
||||
// may fail because of ongoing animation below dialog
|
||||
}
|
||||
|
||||
await tester.waitFor(
|
||||
find.byType(ChatListViewBody),
|
||||
skipPumpAndSettle: true,
|
||||
);
|
||||
}
|
||||
|
||||
/// ensure PushProvider check passes
|
||||
Future<void> acceptPushWarning() async {
|
||||
final tester = this;
|
||||
|
||||
final matcher = find.maybeUppercaseText('Do not show again');
|
||||
|
||||
try {
|
||||
await tester.waitFor(matcher, timeout: const Duration(seconds: 5));
|
||||
|
||||
// the FCM push error dialog to be handled...
|
||||
await tester.tap(matcher);
|
||||
await tester.pumpAndSettle();
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
Future<void> ensureLoggedOut() async {
|
||||
final tester = this;
|
||||
await tester.pumpAndSettle();
|
||||
if (find.byType(ChatListViewBody).evaluate().isNotEmpty) {
|
||||
await tester.tap(find.byTooltip('Show menu'));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.text('Settings'));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.scrollUntilVisible(
|
||||
find.text('Account'),
|
||||
500,
|
||||
scrollable: find.descendant(
|
||||
of: find.byKey(const Key('SettingsListViewContent')),
|
||||
matching: find.byType(Scrollable),
|
||||
),
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.text('Logout'));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.maybeUppercaseText('Yes'));
|
||||
await tester.pumpAndSettle();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> ensureAppStartedHomescreen({
|
||||
Duration timeout = const Duration(seconds: 20),
|
||||
}) async {
|
||||
final tester = this;
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
final homeserverPickerFinder = find.byType(HomeserverPicker);
|
||||
final chatListFinder = find.byType(ChatListViewBody);
|
||||
|
||||
final end = DateTime.now().add(timeout);
|
||||
|
||||
log(
|
||||
'Waiting for HomeserverPicker or ChatListViewBody...',
|
||||
name: 'Test Runner',
|
||||
);
|
||||
do {
|
||||
if (DateTime.now().isAfter(end)) {
|
||||
throw Exception(
|
||||
'Timed out waiting for HomeserverPicker or ChatListViewBody',
|
||||
);
|
||||
}
|
||||
|
||||
await pumpAndSettle();
|
||||
await Future.delayed(const Duration(milliseconds: 100));
|
||||
} while (homeserverPickerFinder.evaluate().isEmpty &&
|
||||
chatListFinder.evaluate().isEmpty);
|
||||
|
||||
if (homeserverPickerFinder.evaluate().isNotEmpty) {
|
||||
log(
|
||||
'Found HomeserverPicker, performing login.',
|
||||
name: 'Test Runner',
|
||||
);
|
||||
await tester.login();
|
||||
} else {
|
||||
log(
|
||||
'Found ChatListViewBody, skipping login.',
|
||||
name: 'Test Runner',
|
||||
);
|
||||
}
|
||||
|
||||
await tester.acceptPushWarning();
|
||||
}
|
||||
}
|
||||
@ -1,49 +0,0 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
/// Workaround for https://github.com/flutter/flutter/issues/88765
|
||||
extension WaitForExtension on WidgetTester {
|
||||
Future<void> waitFor(
|
||||
Finder finder, {
|
||||
Duration timeout = const Duration(seconds: 20),
|
||||
bool skipPumpAndSettle = false,
|
||||
}) async {
|
||||
final end = DateTime.now().add(timeout);
|
||||
|
||||
do {
|
||||
if (DateTime.now().isAfter(end)) {
|
||||
throw Exception('Timed out waiting for $finder');
|
||||
}
|
||||
|
||||
if (!skipPumpAndSettle) {
|
||||
await pumpAndSettle();
|
||||
}
|
||||
await Future.delayed(const Duration(milliseconds: 100));
|
||||
} while (finder.evaluate().isEmpty);
|
||||
}
|
||||
}
|
||||
|
||||
extension MaybeUppercaseFinder on CommonFinders {
|
||||
/// On Android some button labels are in uppercase while on iOS they
|
||||
/// are not. This method tries both.
|
||||
Finder maybeUppercaseText(
|
||||
String text, {
|
||||
bool findRichText = false,
|
||||
bool skipOffstage = true,
|
||||
}) {
|
||||
try {
|
||||
final finder = find.text(
|
||||
text.toUpperCase(),
|
||||
findRichText: findRichText,
|
||||
skipOffstage: skipOffstage,
|
||||
);
|
||||
expect(finder, findsOneWidget);
|
||||
return finder;
|
||||
} catch (_) {
|
||||
return find.text(
|
||||
text,
|
||||
findRichText: findRichText,
|
||||
skipOffstage: skipOffstage,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -297,7 +297,7 @@ listeners:
|
||||
# If you plan to use a reverse proxy, please see
|
||||
# https://matrix-org.github.io/synapse/latest/reverse_proxy.html.
|
||||
#
|
||||
- port: 80
|
||||
- port: 8008
|
||||
tls: false
|
||||
type: http
|
||||
x_forwarded: false
|
||||
|
||||
@ -1,26 +1,8 @@
|
||||
abstract class Users {
|
||||
const Users._();
|
||||
|
||||
static const user1 = User(
|
||||
String.fromEnvironment(
|
||||
'USER1_NAME',
|
||||
defaultValue: 'alice',
|
||||
),
|
||||
String.fromEnvironment(
|
||||
'USER1_PW',
|
||||
defaultValue: 'AliceInWonderland',
|
||||
),
|
||||
);
|
||||
static const user2 = User(
|
||||
String.fromEnvironment(
|
||||
'USER2_NAME',
|
||||
defaultValue: 'bob',
|
||||
),
|
||||
String.fromEnvironment(
|
||||
'USER2_PW',
|
||||
defaultValue: 'JoWirSchaffenDas',
|
||||
),
|
||||
);
|
||||
static const alice = User('alice', 'AliceInWonderland');
|
||||
static const bob = User('bob', 'JoWirSchaffenDas');
|
||||
static const trudy = User('trudy', 'HaveIBeenPwned');
|
||||
}
|
||||
|
||||
class User {
|
||||
@ -30,7 +12,5 @@ class User {
|
||||
const User(this.name, this.password);
|
||||
}
|
||||
|
||||
const homeserver = 'http://${const String.fromEnvironment(
|
||||
'HOMESERVER',
|
||||
defaultValue: 'localhost',
|
||||
)}';
|
||||
// https://stackoverflow.com/a/33088657
|
||||
const homeserver = 'http://10.0.2.2:8008';
|
||||
|
||||
@ -21,6 +21,6 @@
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0</string>
|
||||
<key>MinimumOSVersion</key>
|
||||
<string>11.0</string>
|
||||
<string>9.0</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
17
ios/Podfile
@ -1,5 +1,5 @@
|
||||
# Uncomment this line to define a global platform for your project
|
||||
platform :ios, '11.0'
|
||||
platform :ios, '10.0'
|
||||
|
||||
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||
@ -39,17 +39,12 @@ post_install do |installer|
|
||||
flutter_additional_ios_build_settings(target)
|
||||
target.build_configurations.each do |config|
|
||||
config.build_settings['ENABLE_BITCODE'] = 'NO'
|
||||
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.0'
|
||||
|
||||
# see https://github.com/flutter-webrtc/flutter-webrtc/issues/1054
|
||||
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0'
|
||||
config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = 'arm64 i386'
|
||||
|
||||
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
|
||||
'$(inherited)',
|
||||
# dart: PermissionGroup.microphone
|
||||
'PERMISSION_MICROPHONE=1',
|
||||
]
|
||||
# https://github.com/flutter-webrtc/flutter-webrtc/issues/713
|
||||
if target.name == "flutter_webrtc" || target.name == "WebRTC-SDK"
|
||||
config.build_settings['ONLY_ACTIVE_ARCH'] = 'YES'
|
||||
end
|
||||
end
|
||||
end
|
||||
flutter_post_install(installer) if defined?(flutter_post_install)
|
||||
end
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 54;
|
||||
objectVersion = 51;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
@ -286,12 +286,10 @@
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
|
||||
);
|
||||
name = "Thin Binary";
|
||||
outputPaths = (
|
||||
@ -324,7 +322,6 @@
|
||||
};
|
||||
9740EEB61CF901F6004384FC /* Run Script */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
@ -453,7 +450,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
@ -542,7 +539,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
@ -591,7 +588,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
|
||||