This commit is contained in:
Inex Code 2020-10-14 04:47:54 +03:00
commit d5d7a254e3
14 changed files with 694 additions and 267 deletions

1
.gitignore vendored
View file

@ -11,6 +11,7 @@
.svn/ .svn/
lib/generated_plugin_registrant.dart lib/generated_plugin_registrant.dart
google-services.json google-services.json
prime
# libolm package # libolm package
/assets/js/package/* /assets/js/package/*

View file

@ -158,8 +158,7 @@ upload_to_fdroid_repo:
- export UPDATE_VERSION=$(pcregrep -o1 'version:\\s([0-9]*\\.[0-9]*\\.[0-9]*)\\+[0-9]*' pubspec.yaml) && mv app-release.apk "${UPDATE_VERSION}.apk" - 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@fdroid.nordgedanken.dev:/fdroid/repo - rsync -rav -e ssh ./ fluffy@fdroid.nordgedanken.dev:/fdroid/repo
- ssh fluffy@fdroid.nordgedanken.dev "cd fdroid && mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc && fdroid update" - ssh fluffy@fdroid.nordgedanken.dev "cd fdroid && mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc && fdroid update"
dependencies: needs: ["build_android_apk"]
- build_android_apk
only: only:
- tags - tags
@ -174,8 +173,7 @@ pages:
- cd build/web/ && bundle install && cd ../../ - cd build/web/ && bundle install && cd ../../
- cd build/web/ && bundle exec jekyll build -d public && cd ../../ - cd build/web/ && bundle exec jekyll build -d public && cd ../../
- mv build/web/public ./ - mv build/web/public ./
dependencies: needs: ["build_web"]
- build_web
artifacts: artifacts:
paths: paths:
- public - public
@ -215,3 +213,4 @@ snap:publish:
- './*.snap' - './*.snap'
when: on_success when: on_success
expire_in: 1 week expire_in: 1 week
needs: []

View file

@ -7,6 +7,7 @@ An experimental fork of FluffyChat.
* Removed Sentry * Removed Sentry
* Double check of .well-known * Double check of .well-known
* Get Jitsi instance from .well-known * Get Jitsi instance from .well-known
* Redesigned settings
# Features # Features
* Single and group chats * Single and group chats

View file

@ -2,3 +2,4 @@ arb-dir: lib/l10n
template-arb-file: intl_en.arb template-arb-file: intl_en.arb
output-localization-file: l10n.dart output-localization-file: l10n.dart
output-class: L10n output-class: L10n
preferred-supported-locales: ["en"]

View file

@ -11,7 +11,6 @@ import 'package:furrychat/utils/user_status.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:localstorage/localstorage.dart';
import 'package:universal_html/prefer_universal/html.dart' as html; import 'package:universal_html/prefer_universal/html.dart' as html;
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
@ -77,8 +76,7 @@ class MatrixState extends State<Matrix> {
void clean() async { void clean() async {
if (!kIsWeb) return; if (!kIsWeb) return;
final storage = LocalStorage('LocalStorage'); final storage = await getLocalStorage();
await storage.ready;
await storage.deleteItem(widget.clientName); await storage.deleteItem(widget.clientName);
} }

View file

@ -189,7 +189,7 @@
"username": {} "username": {}
} }
}, },
"changedTheDisplaynameTo": "{username} غيّر اسمه الى {displayname}", "changedTheDisplaynameTo": "{username} غيّر اسمه العلني الى {displayname}",
"@changedTheDisplaynameTo": { "@changedTheDisplaynameTo": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
@ -375,7 +375,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"couldNotSetDisplayname": "تعذر تعيين الاسم", "couldNotSetDisplayname": "تعذر تعيين الاسم العلني",
"@couldNotSetDisplayname": { "@couldNotSetDisplayname": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -489,7 +489,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"displaynameHasBeenChanged": "غُيِّر الاسم", "displaynameHasBeenChanged": "غُيِّر الاسم العلني",
"@displaynameHasBeenChanged": { "@displaynameHasBeenChanged": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -499,7 +499,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"editDisplayname": "حرر الاسم", "editDisplayname": "حرر الاسم العلني",
"@editDisplayname": { "@editDisplayname": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -514,7 +514,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"emoteWarnNeedToPick": "اختر صورة ورمزا للانفعالة", "emoteWarnNeedToPick": "اختر صورة ورمزا للانفعالة!",
"@emoteWarnNeedToPick": { "@emoteWarnNeedToPick": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -1374,7 +1374,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"useAmoledTheme": "", "useAmoledTheme": "هل تريد استخدم ألوان متوافقة مع Amoled؟",
"@useAmoledTheme": { "@useAmoledTheme": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -1507,14 +1507,14 @@
"unreadCount": {} "unreadCount": {}
} }
}, },
"unreadMessages": "", "unreadMessages": "{unreadEvents} رسالة غير مقروءة",
"@unreadMessages": { "@unreadMessages": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
"unreadEvents": {} "unreadEvents": {}
} }
}, },
"unreadMessagesInChats": "", "unreadMessagesInChats": "{unreadEvents} رسالة غير مقروءة من {unreadChats} محادثة",
"@unreadMessagesInChats": { "@unreadMessagesInChats": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
@ -1702,5 +1702,10 @@
"@yourOwnUsername": { "@yourOwnUsername": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
},
"privacy": "الخصوصية",
"@privacy": {
"type": "text",
"placeholders": {}
} }
} }

View file

@ -194,5 +194,272 @@
"@about": { "@about": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
},
"deleteMessage": "Cancella messaggio",
"@deleteMessage": {
"type": "text",
"placeholders": {}
},
"deleteAccount": "Elimina account",
"@deleteAccount": {
"type": "text",
"placeholders": {}
},
"deactivateAccountWarning": "Disabiliterà il tuo account. Non puoi tornare indietro! Sei sicuro?",
"@deactivateAccountWarning": {
"type": "text",
"placeholders": {}
},
"delete": "Cancella",
"@delete": {
"type": "text",
"placeholders": {}
},
"dateWithYear": "{day}-{month}-{year}",
"@dateWithYear": {
"type": "text",
"placeholders": {
"year": {},
"month": {},
"day": {}
}
},
"dateWithoutYear": "{month}-{day}",
"@dateWithoutYear": {
"type": "text",
"placeholders": {
"month": {},
"day": {}
}
},
"dateAndTimeOfDay": "{date}, {timeOfDay}",
"@dateAndTimeOfDay": {
"type": "text",
"placeholders": {
"date": {},
"timeOfDay": {}
}
},
"currentlyActive": "Attualmente attivo",
"@currentlyActive": {
"type": "text",
"placeholders": {}
},
"createNewGroup": "Crea un nuovo gruppo",
"@createNewGroup": {
"type": "text",
"placeholders": {}
},
"createdTheChat": "{username} ha creato la chat",
"@createdTheChat": {
"type": "text",
"placeholders": {
"username": {}
}
},
"createAccountNow": "Crea ora un account",
"@createAccountNow": {
"type": "text",
"placeholders": {}
},
"create": "Crea",
"@create": {
"type": "text",
"placeholders": {}
},
"countParticipants": "{count} partecipanti",
"@countParticipants": {
"type": "text",
"placeholders": {
"count": {}
}
},
"couldNotSetDisplayname": "Impossibile impostare nome",
"@couldNotSetDisplayname": {
"type": "text",
"placeholders": {}
},
"couldNotSetAvatar": "Impossibile impostare avatar",
"@couldNotSetAvatar": {
"type": "text",
"placeholders": {}
},
"couldNotDecryptMessage": "Impossibile decriptare messaggio: {error}",
"@couldNotDecryptMessage": {
"type": "text",
"placeholders": {
"error": {}
}
},
"copy": "Copia",
"@copy": {
"type": "text",
"placeholders": {}
},
"copiedToClipboard": "Copiato negli Appunti",
"@copiedToClipboard": {
"type": "text",
"placeholders": {}
},
"contentViewer": "Visualizzatore contenuti",
"@contentViewer": {
"type": "text",
"placeholders": {}
},
"contactHasBeenInvitedToTheGroup": "Il contatto è stato invitato nel gruppo",
"@contactHasBeenInvitedToTheGroup": {
"type": "text",
"placeholders": {}
},
"connectionAttemptFailed": "Tentativo di connessione fallito",
"@connectionAttemptFailed": {
"type": "text",
"placeholders": {}
},
"connect": "Connetti",
"@connect": {
"type": "text",
"placeholders": {}
},
"confirm": "Conferma",
"@confirm": {
"type": "text",
"placeholders": {}
},
"compareNumbersMatch": "Confronta e assicurati che le seguenti emoji corrispondano a quelle dell'altro dispositivo:",
"@compareNumbersMatch": {
"type": "text",
"placeholders": {}
},
"compareEmojiMatch": "Confronta e assicurati che le seguenti emoji corrispondano a quelle dell'altro dispositivo:",
"@compareEmojiMatch": {
"type": "text",
"placeholders": {}
},
"close": "Chiudi",
"@close": {
"type": "text",
"placeholders": {}
},
"chooseAUsername": "Scegli un username",
"@chooseAUsername": {
"type": "text",
"placeholders": {}
},
"chooseAStrongPassword": "Scegli una password complessa",
"@chooseAStrongPassword": {
"type": "text",
"placeholders": {}
},
"chatDetails": "Dettagli chat",
"@chatDetails": {
"type": "text",
"placeholders": {}
},
"chat": "Chat",
"@chat": {
"type": "text",
"placeholders": {}
},
"channelCorruptedDecryptError": "La crittografia è corrotta",
"@channelCorruptedDecryptError": {
"type": "text",
"placeholders": {}
},
"changeTheServer": "Cambia server",
"@changeTheServer": {
"type": "text",
"placeholders": {}
},
"changeWallpaper": "Cambia sfondo",
"@changeWallpaper": {
"type": "text",
"placeholders": {}
},
"changeTheNameOfTheGroup": "Cambia il nome del gruppo",
"@changeTheNameOfTheGroup": {
"type": "text",
"placeholders": {}
},
"changelog": "Registro cambiamenti",
"@changelog": {
"type": "text",
"placeholders": {}
},
"changedTheRoomInvitationLink": "{username} ha cambiato il link di invito",
"@changedTheRoomInvitationLink": {
"type": "text",
"placeholders": {
"username": {}
}
},
"changedTheRoomAliases": "{username} ha cambiato il nome delle stanze",
"@changedTheRoomAliases": {
"type": "text",
"placeholders": {
"username": {}
}
},
"changedTheProfileAvatar": "{username} ha cambiato il loro avatar",
"@changedTheProfileAvatar": {
"type": "text",
"placeholders": {
"username": {}
}
},
"changedTheJoinRulesTo": "{username} ha cambiato le regole per unirsi in: {joinRules}",
"@changedTheJoinRulesTo": {
"type": "text",
"placeholders": {
"username": {},
"joinRules": {}
}
},
"changedTheJoinRules": "{username} ha cambiato le regole per unirsi",
"@changedTheJoinRules": {
"type": "text",
"placeholders": {
"username": {}
}
},
"changedTheHistoryVisibilityTo": "{username} ha cambiato la visibilità della cronologia in: {rules}",
"@changedTheHistoryVisibilityTo": {
"type": "text",
"placeholders": {
"username": {},
"rules": {}
}
},
"changedTheHistoryVisibility": "{username} ha cambiato la visibilità della cronologia",
"@changedTheHistoryVisibility": {
"type": "text",
"placeholders": {
"username": {}
}
},
"changedTheGuestAccessRulesTo": "{username} ha cambiato le regole di accesso per ospiti con: {rules}",
"@changedTheGuestAccessRulesTo": {
"type": "text",
"placeholders": {
"username": {},
"rules": {}
}
},
"changedTheChatAvatar": "{username} ha cambiato avatar",
"@changedTheChatAvatar": {
"type": "text",
"placeholders": {
"username": {}
}
},
"askSSSSSign": "Per entrare con l'altro utente, per favore inserisci la tua passphrase o recovery key.",
"@askSSSSSign": {
"type": "text",
"placeholders": {}
},
"askSSSSCache": "Per favore inserisci la tua passphrase o recovery key per la cache delle chiavi.",
"@askSSSSCache": {
"type": "text",
"placeholders": {}
} }
} }

File diff suppressed because it is too large Load diff

View file

@ -8,7 +8,6 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:localstorage/localstorage.dart';
import 'package:universal_html/prefer_universal/html.dart' as html; import 'package:universal_html/prefer_universal/html.dart' as html;
import 'components/matrix.dart'; import 'components/matrix.dart';
@ -21,8 +20,6 @@ void main() {
runZonedGuarded( runZonedGuarded(
() => runApp(App()), () => runApp(App()),
(error, stackTrace) async { (error, stackTrace) async {
final storage = LocalStorage('LocalStorage');
await storage.ready;
debugPrint(error.toString()); debugPrint(error.toString());
debugPrint(stackTrace.toString()); debugPrint(stackTrace.toString());
}, },

View file

@ -6,12 +6,22 @@ import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:localstorage/localstorage.dart'; import 'package:localstorage/localstorage.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:async'; import 'dart:async';
import 'dart:core'; import 'dart:core';
import './database/shared.dart'; import './database/shared.dart';
import 'package:olm/olm.dart' as olm; // needed for migration import 'package:olm/olm.dart' as olm; // needed for migration
import 'package:random_string/random_string.dart'; import 'package:random_string/random_string.dart';
Future<LocalStorage> getLocalStorage() async {
final directory = PlatformInfos.isBetaDesktop
? await getApplicationSupportDirectory()
: await getApplicationDocumentsDirectory();
final localStorage = LocalStorage('LocalStorage', directory.path);
await localStorage.ready;
return localStorage;
}
Future<Database> getDatabase(Client client) async { Future<Database> getDatabase(Client client) async {
while (_generateDatabaseLock) { while (_generateDatabaseLock) {
await Future.delayed(Duration(milliseconds: 50)); await Future.delayed(Duration(milliseconds: 50));

View file

@ -18,8 +18,8 @@ Future<MatrixImageFile> resizeImage(MatrixImageFile file,
try { try {
final nativeImg = native.Image(); final nativeImg = native.Image();
await nativeImg.loadEncoded(file.bytes); await nativeImg.loadEncoded(file.bytes);
file.width = nativeImg.width(); file.width = nativeImg.width;
file.height = nativeImg.height(); file.height = nativeImg.height;
args = _IsolateArgs( args = _IsolateArgs(
width: file.width, height: file.height, bytes: file.bytes, max: max); width: file.width, height: file.height, bytes: file.bytes, max: max);
nativeImg.free(); nativeImg.free();
@ -96,8 +96,8 @@ Future<_IsolateResponse> _isolateFunction(_IsolateArgs args) async {
final ret = _IsolateResponse( final ret = _IsolateResponse(
blurhash: blurhash, blurhash: blurhash,
jpegBytes: jpegBytes, jpegBytes: jpegBytes,
width: nativeImg.width(), width: nativeImg.width,
height: nativeImg.height()); height: nativeImg.height);
nativeImg.free(); nativeImg.free();

View file

@ -171,7 +171,6 @@ class _LoginState extends State<Login> {
readOnly: loading, readOnly: loading,
autocorrect: false, autocorrect: false,
autofocus: true, autofocus: true,
keyboardType: TextInputType.emailAddress,
onChanged: (t) => _checkWellKnownWithCoolDown(t, context), onChanged: (t) => _checkWellKnownWithCoolDown(t, context),
controller: usernameController, controller: usernameController,
decoration: InputDecoration( decoration: InputDecoration(

View file

@ -553,7 +553,7 @@ packages:
description: description:
path: "." path: "."
ref: master ref: master
resolved-ref: bd24832f96537447174aa34ba78eaed7ff05bb8e resolved-ref: c8eb59c25c4e3a568bd64e4722108ec45259e157
url: "https://gitlab.com/famedly/libraries/native_imaging.git" url: "https://gitlab.com/famedly/libraries/native_imaging.git"
source: git source: git
version: "0.0.1" version: "0.0.1"

59
snap/snapcraft.yaml Normal file
View file

@ -0,0 +1,59 @@
name: fluffychat
base: core18 # the base snap is the execution environment for this snap
version: git # just for humans, typically '1.2+git' or '1.3.2'
summary: Open. Nonprofit. Cute ♥
description: |
FluffyChat - Chat with your friends
9 greatest FluffyChat features:
1. Opensource and open development where everyone can join.
2. Nonprofit - FluffyChat is donation funded.
3. Cute design and many theme settings including a dark mode.
4. Unlimited groups and direct chats.
5. FluffyChat is made as simple to use as possible.
6. Free to use for everyone without ads.
7. FluffyChat can use your addressbook to find your friends or you can use
usernames.
8. There is no "FluffyChat server" you are forced to use. Use the server
you find trustworthy or host your own.
9. Compatible with Riot, Fractal, Nekho and all matrix messengers.
Join the community: fluffychat://+ubports_community:matrix.org
Website: http://fluffy.chat
Microblog: https://metalhead.club/@krille
grade: devel # must be 'stable' to release into candidate/stable channels
confinement: strict # use 'strict' once you have the right plugs and slots
parts:
olm:
plugin: cmake
source: https://gitlab.matrix.org/matrix-org/olm.git
source-type: git
source-tag: 3.2.1
fluffychat:
plugin: flutter
source: .
flutter-target: lib/main.dart
stage-packages:
- libsqlite3-0
override-prime: |
snapcraftctl prime
ln -sf libsqlite3.so.0 ${SNAPCRAFT_PRIME}/usr/lib/x86_64-linux-gnu/libsqlite3.so
slots:
dbus-svc:
interface: dbus
bus: session
name: chat.fluffy.fluffychat
apps:
fluffychat:
command: fluffychat
extensions:
- flutter-dev
plugs:
- network
- home
slots:
- dbus-svc