From 705ced844bca8be05d5290ee835769cb5ce9e649 Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Tue, 8 Sep 2020 10:55:32 +0200 Subject: [PATCH] feat: Implement sentry --- ios/Flutter/.last_build_id | 2 +- ios/Podfile.lock | 20 + lib/components/dialogs/simple_dialogs.dart | 3 +- lib/l10n/intl_messages.arb | 22 +- lib/l10n/l10n.dart | 10 + lib/l10n/messages_all.dart | 4 + lib/l10n/messages_et.dart | 477 +++++++++++++++++++++ lib/l10n/messages_messages.dart | 9 + lib/main.dart | 21 +- lib/utils/sentry_controller.dart | 26 ++ lib/views/homeserver_picker.dart | 5 + lib/views/settings.dart | 6 + pubspec.lock | 25 +- pubspec.yaml | 1 + 14 files changed, 625 insertions(+), 6 deletions(-) create mode 100644 lib/l10n/messages_et.dart create mode 100644 lib/utils/sentry_controller.dart diff --git a/ios/Flutter/.last_build_id b/ios/Flutter/.last_build_id index 04da217..7a826ec 100644 --- a/ios/Flutter/.last_build_id +++ b/ios/Flutter/.last_build_id @@ -1 +1 @@ -14bfb9c7e87ce172994e49cbda14b122 \ No newline at end of file +9cd9a74565170b55c5402198d76f5fb8 \ No newline at end of file diff --git a/ios/Podfile.lock b/ios/Podfile.lock index cb0955a..4f57191 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -87,6 +87,9 @@ PODS: - Flutter - flutter_local_notifications (0.0.1): - Flutter + - flutter_olm (0.0.1): + - Flutter + - OLMKit - flutter_plugin_android_lifecycle (0.0.1): - Flutter - flutter_secure_storage (3.3.1): @@ -130,6 +133,13 @@ PODS: - nanopb/encode (= 1.30906.0) - nanopb/decode (1.30906.0) - nanopb/encode (1.30906.0) + - native_imaging (0.0.1): + - Flutter + - OLMKit (3.1.0): + - OLMKit/olmc (= 3.1.0) + - OLMKit/olmcpp (= 3.1.0) + - OLMKit/olmc (3.1.0) + - OLMKit/olmcpp (3.1.0) - open_file (0.0.1): - Flutter - path_provider (0.0.1): @@ -175,10 +185,12 @@ DEPENDENCIES: - Flutter (from `Flutter`) - flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`) - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) + - flutter_olm (from `.symlinks/plugins/flutter_olm/ios`) - flutter_plugin_android_lifecycle (from `.symlinks/plugins/flutter_plugin_android_lifecycle/ios`) - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) - flutter_sound (from `.symlinks/plugins/flutter_sound/ios`) - image_picker (from `.symlinks/plugins/image_picker/ios`) + - native_imaging (from `.symlinks/plugins/native_imaging/ios`) - open_file (from `.symlinks/plugins/open_file/ios`) - path_provider (from `.symlinks/plugins/path_provider/ios`) - path_provider_linux (from `.symlinks/plugins/path_provider_linux/ios`) @@ -210,6 +222,7 @@ SPEC REPOS: - GoogleDataTransport - GoogleUtilities - nanopb + - OLMKit - PromisesObjC - Protobuf - SDWebImage @@ -227,6 +240,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/flutter_keyboard_visibility/ios" flutter_local_notifications: :path: ".symlinks/plugins/flutter_local_notifications/ios" + flutter_olm: + :path: ".symlinks/plugins/flutter_olm/ios" flutter_plugin_android_lifecycle: :path: ".symlinks/plugins/flutter_plugin_android_lifecycle/ios" flutter_secure_storage: @@ -235,6 +250,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/flutter_sound/ios" image_picker: :path: ".symlinks/plugins/image_picker/ios" + native_imaging: + :path: ".symlinks/plugins/native_imaging/ios" open_file: :path: ".symlinks/plugins/open_file/ios" path_provider: @@ -276,6 +293,7 @@ SPEC CHECKSUMS: Flutter: 0e3d915762c693b495b44d77113d4970485de6ec flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069 flutter_local_notifications: 9e4738ce2471c5af910d961a6b7eadcf57c50186 + flutter_olm: be36ebeb6388f7d7b3097d39feaf459a3cad2091 flutter_plugin_android_lifecycle: dc0b544e129eebb77a6bfb1239d4d1c673a60a35 flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec flutter_sound: 0e8163ceac1e00eb6d894e2ae4641ba726a2c479 @@ -285,6 +303,8 @@ SPEC CHECKSUMS: GoogleUtilities: 7f2f5a07f888cdb145101d6042bc4422f57e70b3 image_picker: 9c3312491f862b28d21ecd8fdf0ee14e601b3f09 nanopb: 59317e09cf1f1a0af72f12af412d54edf52603fc + native_imaging: 633687fc14422729cc67ed80c3435e359ef7a92b + OLMKit: 4ee0159d63feeb86d836fdcfefe418e163511639 open_file: 02eb5cb6b21264bd3a696876f5afbfb7ca4f4b7d path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c path_provider_linux: 4d630dc393e1f20364f3e3b4a2ff41d9674a84e4 diff --git a/lib/components/dialogs/simple_dialogs.dart b/lib/components/dialogs/simple_dialogs.dart index 01be2e9..4336ffb 100644 --- a/lib/components/dialogs/simple_dialogs.dart +++ b/lib/components/dialogs/simple_dialogs.dart @@ -2,6 +2,7 @@ import 'package:fluffychat/l10n/l10n.dart'; import 'package:flutter/material.dart'; import 'package:famedlysdk/famedlysdk.dart'; import 'package:bot_toast/bot_toast.dart'; +import 'package:matrix_link_text/link_text.dart'; class SimpleDialogs { final BuildContext context; @@ -84,7 +85,7 @@ class SimpleDialogs { context: context, builder: (c) => AlertDialog( title: Text(titleText ?? L10n.of(context).areYouSure), - content: contentText != null ? Text(contentText) : null, + content: contentText != null ? LinkText(text: contentText) : null, actions: [ FlatButton( child: Text( diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index f1ff9c4..b0e048f 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2020-08-16T12:43:17.825046", + "@@last_modified": "2020-09-09T13:52:07.398547", "About": "About", "@About": { "type": "text", @@ -1151,6 +1151,26 @@ "type": "text", "placeholders": {} }, + "Allow sending bug reports with sentry.io": "Allow sending bug reports with sentry.io", + "@Allow sending bug reports with sentry.io": { + "type": "text", + "placeholders": {} + }, + "Informations about your privacy: https://sentry.io/security/": "Informations about your privacy: https://sentry.io/security/", + "@Informations about your privacy: https://sentry.io/security/": { + "type": "text", + "placeholders": {} + }, + "Changes have been saved": "Changes have been saved", + "@Changes have been saved": { + "type": "text", + "placeholders": {} + }, + "No": "No", + "@No": { + "type": "text", + "placeholders": {} + }, "seenByUser": "Seen by {username}", "@seenByUser": { "type": "text", diff --git a/lib/l10n/l10n.dart b/lib/l10n/l10n.dart index 4a302cd..0695f2f 100644 --- a/lib/l10n/l10n.dart +++ b/lib/l10n/l10n.dart @@ -712,6 +712,16 @@ class L10n extends MatrixLocalizations { String get lastSeenLongTimeAgo => Intl.message('Seen a long time ago'); + String get sendBugReports => + Intl.message('Allow sending bug reports with sentry.io'); + + String get sentryInfo => Intl.message( + 'Informations about your privacy: https://sentry.io/security/'); + + String get changesHaveBeenSaved => Intl.message('Changes have been saved'); + + String get no => Intl.message('No'); + String seenByUser(String username) => Intl.message( "Seen by $username", name: "seenByUser", diff --git a/lib/l10n/messages_all.dart b/lib/l10n/messages_all.dart index 1b63aa9..c38241a 100644 --- a/lib/l10n/messages_all.dart +++ b/lib/l10n/messages_all.dart @@ -18,6 +18,7 @@ import 'package:intl/src/intl_helpers.dart'; import 'messages_cs.dart' as messages_cs; import 'messages_de.dart' as messages_de; import 'messages_es.dart' as messages_es; +import 'messages_et.dart' as messages_et; import 'messages_fr.dart' as messages_fr; import 'messages_gl.dart' as messages_gl; import 'messages_hr.dart' as messages_hr; @@ -37,6 +38,7 @@ Map _deferredLibraries = { 'cs': () => new Future.value(null), 'de': () => new Future.value(null), 'es': () => new Future.value(null), + 'et': () => new Future.value(null), 'fr': () => new Future.value(null), 'gl': () => new Future.value(null), 'hr': () => new Future.value(null), @@ -60,6 +62,8 @@ MessageLookupByLibrary _findExact(String localeName) { return messages_de.messages; case 'es': return messages_es.messages; + case 'et': + return messages_et.messages; case 'fr': return messages_fr.messages; case 'gl': diff --git a/lib/l10n/messages_et.dart b/lib/l10n/messages_et.dart new file mode 100644 index 0000000..4470fae --- /dev/null +++ b/lib/l10n/messages_et.dart @@ -0,0 +1,477 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a et locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'et'; + + static m0(username) => ""; + + static m1(username) => ""; + + static m2(senderName) => ""; + + static m3(username) => ""; + + static m4(username, targetName) => ""; + + static m5(homeserver) => ""; + + static m6(username) => ""; + + static m7(username, description) => ""; + + static m8(username, chatname) => ""; + + static m9(username) => ""; + + static m10(username, displayname) => ""; + + static m11(username) => ""; + + static m12(username, rules) => ""; + + static m13(username) => ""; + + static m14(username, rules) => ""; + + static m15(username) => ""; + + static m16(username, joinRules) => ""; + + static m17(username) => ""; + + static m18(username) => ""; + + static m19(username) => ""; + + static m20(error) => ""; + + static m21(count) => ""; + + static m22(username) => ""; + + static m23(date, timeOfDay) => ""; + + static m24(year, month, day) => ""; + + static m25(month, day) => ""; + + static m26(senderName) => ""; + + static m27(displayname) => ""; + + static m28(username, targetName) => ""; + + static m29(groupName) => ""; + + static m30(username, link) => ""; + + static m31(username, targetName) => ""; + + static m32(username) => ""; + + static m33(username, targetName) => ""; + + static m34(username, targetName) => ""; + + static m35(localizedTimeShort) => ""; + + static m36(count) => ""; + + static m37(homeserver) => ""; + + static m38(number) => ""; + + static m39(fileName) => ""; + + static m40(username) => ""; + + static m41(username) => ""; + + static m42(username) => ""; + + static m43(username) => ""; + + static m44(username, count) => ""; + + static m45(username, username2) => ""; + + static m46(username) => ""; + + static m47(username) => ""; + + static m48(username) => ""; + + static m49(username) => ""; + + static m50(username) => ""; + + static m51(senderName) => ""; + + static m52(username) => ""; + + static m53(senderName) => ""; + + static m54(hours12, hours24, minutes, suffix) => ""; + + static m55(username, targetName) => ""; + + static m56(type) => ""; + + static m57(unreadCount) => ""; + + static m58(unreadEvents) => ""; + + static m59(unreadEvents, unreadChats) => ""; + + static m60(username, count) => ""; + + static m61(username, username2) => ""; + + static m62(username) => ""; + + static m63(username) => ""; + + static m64(username, type) => ""; + + final messages = _notInlinedMessages(_notInlinedMessages); + static _notInlinedMessages(_) => { + "(Optional) Group name": MessageLookupByLibrary.simpleMessage(""), + "About": MessageLookupByLibrary.simpleMessage(""), + "Accept": MessageLookupByLibrary.simpleMessage(""), + "Account": MessageLookupByLibrary.simpleMessage(""), + "Account informations": MessageLookupByLibrary.simpleMessage(""), + "Add a group description": MessageLookupByLibrary.simpleMessage(""), + "Admin": MessageLookupByLibrary.simpleMessage(""), + "Already have an account?": MessageLookupByLibrary.simpleMessage(""), + "Anyone can join": MessageLookupByLibrary.simpleMessage(""), + "Archive": MessageLookupByLibrary.simpleMessage(""), + "Archived Room": MessageLookupByLibrary.simpleMessage(""), + "Are guest users allowed to join": + MessageLookupByLibrary.simpleMessage(""), + "Are you sure?": MessageLookupByLibrary.simpleMessage(""), + "Authentication": MessageLookupByLibrary.simpleMessage(""), + "Avatar has been changed": MessageLookupByLibrary.simpleMessage(""), + "Ban from chat": MessageLookupByLibrary.simpleMessage(""), + "Banned": MessageLookupByLibrary.simpleMessage(""), + "Block Device": MessageLookupByLibrary.simpleMessage(""), + "Cancel": MessageLookupByLibrary.simpleMessage(""), + "Change the homeserver": MessageLookupByLibrary.simpleMessage(""), + "Change the name of the group": + MessageLookupByLibrary.simpleMessage(""), + "Change the server": MessageLookupByLibrary.simpleMessage(""), + "Change wallpaper": MessageLookupByLibrary.simpleMessage(""), + "Change your style": MessageLookupByLibrary.simpleMessage(""), + "Changelog": MessageLookupByLibrary.simpleMessage(""), + "Chat": MessageLookupByLibrary.simpleMessage(""), + "Chat details": MessageLookupByLibrary.simpleMessage(""), + "Choose a strong password": MessageLookupByLibrary.simpleMessage(""), + "Choose a username": MessageLookupByLibrary.simpleMessage(""), + "Close": MessageLookupByLibrary.simpleMessage(""), + "Confirm": MessageLookupByLibrary.simpleMessage(""), + "Connect": MessageLookupByLibrary.simpleMessage(""), + "Connection attempt failed": MessageLookupByLibrary.simpleMessage(""), + "Contact has been invited to the group": + MessageLookupByLibrary.simpleMessage(""), + "Content viewer": MessageLookupByLibrary.simpleMessage(""), + "Copied to clipboard": MessageLookupByLibrary.simpleMessage(""), + "Copy": MessageLookupByLibrary.simpleMessage(""), + "Could not set avatar": MessageLookupByLibrary.simpleMessage(""), + "Could not set displayname": MessageLookupByLibrary.simpleMessage(""), + "Create": MessageLookupByLibrary.simpleMessage(""), + "Create account now": MessageLookupByLibrary.simpleMessage(""), + "Create new group": MessageLookupByLibrary.simpleMessage(""), + "Currently active": MessageLookupByLibrary.simpleMessage(""), + "Dark": MessageLookupByLibrary.simpleMessage(""), + "Delete": MessageLookupByLibrary.simpleMessage(""), + "Delete message": MessageLookupByLibrary.simpleMessage(""), + "Deny": MessageLookupByLibrary.simpleMessage(""), + "Device": MessageLookupByLibrary.simpleMessage(""), + "Devices": MessageLookupByLibrary.simpleMessage(""), + "Discard picture": MessageLookupByLibrary.simpleMessage(""), + "Displayname has been changed": + MessageLookupByLibrary.simpleMessage(""), + "Donate": MessageLookupByLibrary.simpleMessage(""), + "Download file": MessageLookupByLibrary.simpleMessage(""), + "Edit Jitsi instance": MessageLookupByLibrary.simpleMessage(""), + "Edit displayname": MessageLookupByLibrary.simpleMessage(""), + "Emote Settings": MessageLookupByLibrary.simpleMessage(""), + "Emote shortcode": MessageLookupByLibrary.simpleMessage(""), + "Empty chat": MessageLookupByLibrary.simpleMessage(""), + "Encryption": MessageLookupByLibrary.simpleMessage(""), + "Encryption algorithm": MessageLookupByLibrary.simpleMessage(""), + "Encryption is not enabled": MessageLookupByLibrary.simpleMessage(""), + "End to end encryption is currently in Beta! Use at your own risk!": + MessageLookupByLibrary.simpleMessage(""), + "End-to-end encryption settings": + MessageLookupByLibrary.simpleMessage(""), + "Enter a group name": MessageLookupByLibrary.simpleMessage(""), + "Enter a username": MessageLookupByLibrary.simpleMessage(""), + "Enter your homeserver": MessageLookupByLibrary.simpleMessage(""), + "File name": MessageLookupByLibrary.simpleMessage(""), + "File size": MessageLookupByLibrary.simpleMessage(""), + "FluffyChat": MessageLookupByLibrary.simpleMessage(""), + "Forward": MessageLookupByLibrary.simpleMessage(""), + "Friday": MessageLookupByLibrary.simpleMessage(""), + "From joining": MessageLookupByLibrary.simpleMessage(""), + "From the invitation": MessageLookupByLibrary.simpleMessage(""), + "Group": MessageLookupByLibrary.simpleMessage(""), + "Group description": MessageLookupByLibrary.simpleMessage(""), + "Group description has been changed": + MessageLookupByLibrary.simpleMessage(""), + "Group is public": MessageLookupByLibrary.simpleMessage(""), + "Guests are forbidden": MessageLookupByLibrary.simpleMessage(""), + "Guests can join": MessageLookupByLibrary.simpleMessage(""), + "Help": MessageLookupByLibrary.simpleMessage(""), + "Homeserver is not compatible": + MessageLookupByLibrary.simpleMessage(""), + "How are you today?": MessageLookupByLibrary.simpleMessage(""), + "ID": MessageLookupByLibrary.simpleMessage(""), + "Identity": MessageLookupByLibrary.simpleMessage(""), + "Invite contact": MessageLookupByLibrary.simpleMessage(""), + "Invited": MessageLookupByLibrary.simpleMessage(""), + "Invited users only": MessageLookupByLibrary.simpleMessage(""), + "It seems that you have no google services on your phone. That\'s a good decision for your privacy! To receive push notifications in FluffyChat we recommend using microG: https://microg.org/": + MessageLookupByLibrary.simpleMessage(""), + "Join room": MessageLookupByLibrary.simpleMessage(""), + "Kick from chat": MessageLookupByLibrary.simpleMessage(""), + "Last seen IP": MessageLookupByLibrary.simpleMessage(""), + "Leave": MessageLookupByLibrary.simpleMessage(""), + "Left the chat": MessageLookupByLibrary.simpleMessage(""), + "License": MessageLookupByLibrary.simpleMessage(""), + "Light": MessageLookupByLibrary.simpleMessage(""), + "Load more...": MessageLookupByLibrary.simpleMessage(""), + "Loading... Please wait": MessageLookupByLibrary.simpleMessage(""), + "Login": MessageLookupByLibrary.simpleMessage(""), + "Logout": MessageLookupByLibrary.simpleMessage(""), + "Make a moderator": MessageLookupByLibrary.simpleMessage(""), + "Make an admin": MessageLookupByLibrary.simpleMessage(""), + "Make sure the identifier is valid": + MessageLookupByLibrary.simpleMessage(""), + "Message will be removed for all participants": + MessageLookupByLibrary.simpleMessage(""), + "Moderator": MessageLookupByLibrary.simpleMessage(""), + "Monday": MessageLookupByLibrary.simpleMessage(""), + "Mute chat": MessageLookupByLibrary.simpleMessage(""), + "New message in FluffyChat": MessageLookupByLibrary.simpleMessage(""), + "New private chat": MessageLookupByLibrary.simpleMessage(""), + "No emotes found. 😕": MessageLookupByLibrary.simpleMessage(""), + "No permission": MessageLookupByLibrary.simpleMessage(""), + "No rooms found...": MessageLookupByLibrary.simpleMessage(""), + "None": MessageLookupByLibrary.simpleMessage(""), + "Not supported in web": MessageLookupByLibrary.simpleMessage(""), + "Oops something went wrong...": + MessageLookupByLibrary.simpleMessage(""), + "Open app to read messages": MessageLookupByLibrary.simpleMessage(""), + "Open camera": MessageLookupByLibrary.simpleMessage(""), + "Participating user devices": MessageLookupByLibrary.simpleMessage(""), + "Password": MessageLookupByLibrary.simpleMessage(""), + "Pick image": MessageLookupByLibrary.simpleMessage(""), + "Pin": MessageLookupByLibrary.simpleMessage(""), + "Please be aware that you need Pantalaimon to use end-to-end encryption for now.": + MessageLookupByLibrary.simpleMessage(""), + "Please choose a username": MessageLookupByLibrary.simpleMessage(""), + "Please enter a matrix identifier": + MessageLookupByLibrary.simpleMessage(""), + "Please enter your password": MessageLookupByLibrary.simpleMessage(""), + "Please enter your username": MessageLookupByLibrary.simpleMessage(""), + "Public Rooms": MessageLookupByLibrary.simpleMessage(""), + "Recording": MessageLookupByLibrary.simpleMessage(""), + "Reject": MessageLookupByLibrary.simpleMessage(""), + "Rejoin": MessageLookupByLibrary.simpleMessage(""), + "Remove": MessageLookupByLibrary.simpleMessage(""), + "Remove all other devices": MessageLookupByLibrary.simpleMessage(""), + "Remove device": MessageLookupByLibrary.simpleMessage(""), + "Remove exile": MessageLookupByLibrary.simpleMessage(""), + "Remove message": MessageLookupByLibrary.simpleMessage(""), + "Render rich message content": MessageLookupByLibrary.simpleMessage(""), + "Reply": MessageLookupByLibrary.simpleMessage(""), + "Request permission": MessageLookupByLibrary.simpleMessage(""), + "Request to read older messages": + MessageLookupByLibrary.simpleMessage(""), + "Revoke all permissions": MessageLookupByLibrary.simpleMessage(""), + "Room has been upgraded": MessageLookupByLibrary.simpleMessage(""), + "Saturday": MessageLookupByLibrary.simpleMessage(""), + "Search for a chat": MessageLookupByLibrary.simpleMessage(""), + "Seen a long time ago": MessageLookupByLibrary.simpleMessage(""), + "Send": MessageLookupByLibrary.simpleMessage(""), + "Send a message": MessageLookupByLibrary.simpleMessage(""), + "Send file": MessageLookupByLibrary.simpleMessage(""), + "Send image": MessageLookupByLibrary.simpleMessage(""), + "Set a profile picture": MessageLookupByLibrary.simpleMessage(""), + "Set group description": MessageLookupByLibrary.simpleMessage(""), + "Set invitation link": MessageLookupByLibrary.simpleMessage(""), + "Set status": MessageLookupByLibrary.simpleMessage(""), + "Settings": MessageLookupByLibrary.simpleMessage(""), + "Share": MessageLookupByLibrary.simpleMessage(""), + "Sign up": MessageLookupByLibrary.simpleMessage(""), + "Skip": MessageLookupByLibrary.simpleMessage(""), + "Source code": MessageLookupByLibrary.simpleMessage(""), + "Start your first chat :-)": MessageLookupByLibrary.simpleMessage(""), + "Submit": MessageLookupByLibrary.simpleMessage(""), + "Sunday": MessageLookupByLibrary.simpleMessage(""), + "System": MessageLookupByLibrary.simpleMessage(""), + "Tap to show menu": MessageLookupByLibrary.simpleMessage(""), + "The encryption has been corrupted": + MessageLookupByLibrary.simpleMessage(""), + "They Don\'t Match": MessageLookupByLibrary.simpleMessage(""), + "They Match": MessageLookupByLibrary.simpleMessage(""), + "This room has been archived.": + MessageLookupByLibrary.simpleMessage(""), + "Thursday": MessageLookupByLibrary.simpleMessage(""), + "Try to send again": MessageLookupByLibrary.simpleMessage(""), + "Tuesday": MessageLookupByLibrary.simpleMessage(""), + "Unblock Device": MessageLookupByLibrary.simpleMessage(""), + "Unknown device": MessageLookupByLibrary.simpleMessage(""), + "Unknown encryption algorithm": + MessageLookupByLibrary.simpleMessage(""), + "Unmute chat": MessageLookupByLibrary.simpleMessage(""), + "Unpin": MessageLookupByLibrary.simpleMessage(""), + "Use Amoled compatible colors?": + MessageLookupByLibrary.simpleMessage(""), + "Username": MessageLookupByLibrary.simpleMessage(""), + "Verify": MessageLookupByLibrary.simpleMessage(""), + "Verify User": MessageLookupByLibrary.simpleMessage(""), + "Video call": MessageLookupByLibrary.simpleMessage(""), + "Visibility of the chat history": + MessageLookupByLibrary.simpleMessage(""), + "Visible for all participants": + MessageLookupByLibrary.simpleMessage(""), + "Visible for everyone": MessageLookupByLibrary.simpleMessage(""), + "Voice message": MessageLookupByLibrary.simpleMessage(""), + "Wallpaper": MessageLookupByLibrary.simpleMessage(""), + "Wednesday": MessageLookupByLibrary.simpleMessage(""), + "Welcome to the cutest instant messenger in the matrix network.": + MessageLookupByLibrary.simpleMessage(""), + "Who is allowed to join this group": + MessageLookupByLibrary.simpleMessage(""), + "Write a message...": MessageLookupByLibrary.simpleMessage(""), + "Yes": MessageLookupByLibrary.simpleMessage(""), + "You": MessageLookupByLibrary.simpleMessage(""), + "You are invited to this chat": + MessageLookupByLibrary.simpleMessage(""), + "You are no longer participating in this chat": + MessageLookupByLibrary.simpleMessage(""), + "You cannot invite yourself": MessageLookupByLibrary.simpleMessage(""), + "You have been banned from this chat": + MessageLookupByLibrary.simpleMessage(""), + "You won\'t be able to disable the encryption anymore. Are you sure?": + MessageLookupByLibrary.simpleMessage(""), + "Your own username": MessageLookupByLibrary.simpleMessage(""), + "acceptedTheInvitation": m0, + "activatedEndToEndEncryption": m1, + "alias": MessageLookupByLibrary.simpleMessage(""), + "answeredTheCall": m2, + "askSSSSCache": MessageLookupByLibrary.simpleMessage(""), + "askSSSSSign": MessageLookupByLibrary.simpleMessage(""), + "askSSSSVerify": MessageLookupByLibrary.simpleMessage(""), + "askVerificationRequest": m3, + "bannedUser": m4, + "byDefaultYouWillBeConnectedTo": m5, + "cachedKeys": MessageLookupByLibrary.simpleMessage(""), + "changedTheChatAvatar": m6, + "changedTheChatDescriptionTo": m7, + "changedTheChatNameTo": m8, + "changedTheChatPermissions": m9, + "changedTheDisplaynameTo": m10, + "changedTheGuestAccessRules": m11, + "changedTheGuestAccessRulesTo": m12, + "changedTheHistoryVisibility": m13, + "changedTheHistoryVisibilityTo": m14, + "changedTheJoinRules": m15, + "changedTheJoinRulesTo": m16, + "changedTheProfileAvatar": m17, + "changedTheRoomAliases": m18, + "changedTheRoomInvitationLink": m19, + "compareEmojiMatch": MessageLookupByLibrary.simpleMessage(""), + "compareNumbersMatch": MessageLookupByLibrary.simpleMessage(""), + "couldNotDecryptMessage": m20, + "countParticipants": m21, + "createdTheChat": m22, + "crossSigningDisabled": MessageLookupByLibrary.simpleMessage(""), + "crossSigningEnabled": MessageLookupByLibrary.simpleMessage(""), + "dateAndTimeOfDay": m23, + "dateWithYear": m24, + "dateWithoutYear": m25, + "emoteExists": MessageLookupByLibrary.simpleMessage(""), + "emoteInvalid": MessageLookupByLibrary.simpleMessage(""), + "emoteWarnNeedToPick": MessageLookupByLibrary.simpleMessage(""), + "endedTheCall": m26, + "groupWith": m27, + "hasWithdrawnTheInvitationFor": m28, + "incorrectPassphraseOrKey": MessageLookupByLibrary.simpleMessage(""), + "inviteContactToGroup": m29, + "inviteText": m30, + "invitedUser": m31, + "is typing...": MessageLookupByLibrary.simpleMessage(""), + "isDeviceKeyCorrect": MessageLookupByLibrary.simpleMessage(""), + "joinedTheChat": m32, + "keysCached": MessageLookupByLibrary.simpleMessage(""), + "keysMissing": MessageLookupByLibrary.simpleMessage(""), + "kicked": m33, + "kickedAndBanned": m34, + "lastActiveAgo": m35, + "loadCountMoreParticipants": m36, + "logInTo": m37, + "newVerificationRequest": MessageLookupByLibrary.simpleMessage(""), + "noCrossSignBootstrap": MessageLookupByLibrary.simpleMessage(""), + "noMegolmBootstrap": MessageLookupByLibrary.simpleMessage(""), + "numberSelected": m38, + "ok": MessageLookupByLibrary.simpleMessage(""), + "onlineKeyBackupDisabled": MessageLookupByLibrary.simpleMessage(""), + "onlineKeyBackupEnabled": MessageLookupByLibrary.simpleMessage(""), + "passphraseOrKey": MessageLookupByLibrary.simpleMessage(""), + "play": m39, + "redactedAnEvent": m40, + "rejectedTheInvitation": m41, + "removedBy": m42, + "seenByUser": m43, + "seenByUserAndCountOthers": m44, + "seenByUserAndUser": m45, + "sentAFile": m46, + "sentAPicture": m47, + "sentASticker": m48, + "sentAVideo": m49, + "sentAnAudio": m50, + "sentCallInformations": m51, + "sessionVerified": MessageLookupByLibrary.simpleMessage(""), + "sharedTheLocation": m52, + "startedACall": m53, + "timeOfDay": m54, + "title": MessageLookupByLibrary.simpleMessage(""), + "unbannedUser": m55, + "unknownEvent": m56, + "unknownSessionVerify": MessageLookupByLibrary.simpleMessage(""), + "unreadChats": m57, + "unreadMessages": m58, + "unreadMessagesInChats": m59, + "userAndOthersAreTyping": m60, + "userAndUserAreTyping": m61, + "userIsTyping": m62, + "userLeftTheChat": m63, + "userSentUnknownEvent": m64, + "verifiedSession": MessageLookupByLibrary.simpleMessage(""), + "verifyManual": MessageLookupByLibrary.simpleMessage(""), + "verifyStart": MessageLookupByLibrary.simpleMessage(""), + "verifySuccess": MessageLookupByLibrary.simpleMessage(""), + "verifyTitle": MessageLookupByLibrary.simpleMessage(""), + "waitingPartnerAcceptRequest": MessageLookupByLibrary.simpleMessage(""), + "waitingPartnerEmoji": MessageLookupByLibrary.simpleMessage(""), + "waitingPartnerNumbers": MessageLookupByLibrary.simpleMessage("") + }; +} diff --git a/lib/l10n/messages_messages.dart b/lib/l10n/messages_messages.dart index 1c69e79..5739095 100644 --- a/lib/l10n/messages_messages.dart +++ b/lib/l10n/messages_messages.dart @@ -174,6 +174,9 @@ class MessageLookup extends MessageLookupByLibrary { "Add a group description": MessageLookupByLibrary.simpleMessage("Add a group description"), "Admin": MessageLookupByLibrary.simpleMessage("Admin"), + "Allow sending bug reports with sentry.io": + MessageLookupByLibrary.simpleMessage( + "Allow sending bug reports with sentry.io"), "Already have an account?": MessageLookupByLibrary.simpleMessage("Already have an account?"), "Anyone can join": @@ -202,6 +205,8 @@ class MessageLookup extends MessageLookupByLibrary { "Change your style": MessageLookupByLibrary.simpleMessage("Change your style"), "Changelog": MessageLookupByLibrary.simpleMessage("Changelog"), + "Changes have been saved": + MessageLookupByLibrary.simpleMessage("Changes have been saved"), "Chat": MessageLookupByLibrary.simpleMessage("Chat"), "Chat details": MessageLookupByLibrary.simpleMessage("Chat details"), "Choose a strong password": @@ -297,6 +302,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("How are you today?"), "ID": MessageLookupByLibrary.simpleMessage("ID"), "Identity": MessageLookupByLibrary.simpleMessage("Identity"), + "Informations about your privacy: https://sentry.io/security/": + MessageLookupByLibrary.simpleMessage( + "Informations about your privacy: https://sentry.io/security/"), "Invite contact": MessageLookupByLibrary.simpleMessage("Invite contact"), "Invited": MessageLookupByLibrary.simpleMessage("Invited"), @@ -334,6 +342,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("New message in FluffyChat"), "New private chat": MessageLookupByLibrary.simpleMessage("New private chat"), + "No": MessageLookupByLibrary.simpleMessage("No"), "No emotes found. 😕": MessageLookupByLibrary.simpleMessage("No emotes found. 😕"), "No permission": MessageLookupByLibrary.simpleMessage("No permission"), diff --git a/lib/main.dart b/lib/main.dart index a17430f..c4bc6ae 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:io'; import 'package:famedlysdk/famedlysdk.dart'; @@ -13,11 +14,29 @@ import 'components/theme_switcher.dart'; import 'components/matrix.dart'; import 'views/chat_list.dart'; import 'package:universal_html/prefer_universal/html.dart' as html; +import 'package:sentry/sentry.dart'; +import 'package:localstorage/localstorage.dart'; + +final sentry = SentryClient(dsn: '8591d0d863b646feb4f3dda7e5dcab38'); void main() { SystemChrome.setSystemUIOverlayStyle( SystemUiOverlayStyle(statusBarColor: Colors.transparent)); - runApp(App()); + runZonedGuarded( + () => runApp(App()), + (error, stackTrace) async { + final storage = LocalStorage('LocalStorage'); + await storage.ready; + debugPrint(error.toString()); + debugPrint(stackTrace.toString()); + if (storage.getItem('sentry') == true) { + await sentry.captureException( + exception: error, + stackTrace: stackTrace, + ); + } + }, + ); } class App extends StatelessWidget { diff --git a/lib/utils/sentry_controller.dart b/lib/utils/sentry_controller.dart new file mode 100644 index 0000000..e8c68b2 --- /dev/null +++ b/lib/utils/sentry_controller.dart @@ -0,0 +1,26 @@ +import 'package:bot_toast/bot_toast.dart'; +import 'package:fluffychat/components/dialogs/simple_dialogs.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:flutter/material.dart'; +import 'package:localstorage/localstorage.dart'; + +abstract class SentryController { + static LocalStorage storage = LocalStorage('LocalStorage'); + static Future toggleSentryAction(BuildContext context) async { + final enableSentry = await SimpleDialogs(context).askConfirmation( + titleText: L10n.of(context).sendBugReports, + contentText: L10n.of(context).sentryInfo, + confirmText: L10n.of(context).ok, + cancelText: L10n.of(context).no, + ); + await storage.ready; + await storage.setItem('sentry', enableSentry); + BotToast.showText(text: L10n.of(context).changesHaveBeenSaved); + return; + } + + static Future getSentryStatus() async { + await storage.ready; + return storage.getItem('sentry') as bool; + } +} diff --git a/lib/views/homeserver_picker.dart b/lib/views/homeserver_picker.dart index 85568be..0fcfde4 100644 --- a/lib/views/homeserver_picker.dart +++ b/lib/views/homeserver_picker.dart @@ -4,6 +4,7 @@ import 'package:fluffychat/components/dialogs/simple_dialogs.dart'; import 'package:fluffychat/components/matrix.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/app_route.dart'; +import 'package:fluffychat/utils/sentry_controller.dart'; import 'package:fluffychat/views/sign_up.dart'; import 'package:flutter/material.dart'; @@ -19,6 +20,10 @@ class HomeserverPicker extends StatelessWidget { } void _checkHomeserverAction(String homeserver, BuildContext context) async { + if (await SentryController.getSentryStatus() == null || true) { + await SentryController.toggleSentryAction(context); + } + if (!homeserver.startsWith('https://')) { homeserver = 'https://$homeserver'; } diff --git a/lib/views/settings.dart b/lib/views/settings.dart index c357d37..24636d3 100644 --- a/lib/views/settings.dart +++ b/lib/views/settings.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:famedlysdk/famedlysdk.dart'; import 'package:fluffychat/components/settings_themes.dart'; +import 'package:fluffychat/utils/sentry_controller.dart'; import 'package:fluffychat/views/settings_devices.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -341,6 +342,11 @@ class _SettingsState extends State { ), ), ), + ListTile( + trailing: Icon(Icons.bug_report), + title: Text(L10n.of(context).sendBugReports), + onTap: () => SentryController.toggleSentryAction(context), + ), ListTile( trailing: Icon(Icons.exit_to_app), title: Text(L10n.of(context).logout), diff --git a/pubspec.lock b/pubspec.lock index 213b400..22b50b0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -248,6 +248,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.5.0" + flutter_cache_manager: + dependency: transitive + description: + name: flutter_cache_manager + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.1" flutter_keyboard_visibility: dependency: transitive description: @@ -479,7 +486,7 @@ packages: name: matrix_link_text url: "https://pub.dartlang.org" source: hosted - version: "0.1.4" + version: "0.1.5" memoryfilepicker: dependency: "direct main" description: @@ -720,6 +727,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.24.1" + sentry: + dependency: "direct main" + description: + name: sentry + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" share: dependency: "direct main" description: @@ -921,6 +935,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.2" + usage: + dependency: transitive + description: + name: usage + url: "https://pub.dartlang.org" + source: hosted + version: "3.4.2" uuid: dependency: transitive description: @@ -1000,4 +1021,4 @@ packages: version: "0.1.2" sdks: dart: ">=2.10.0-0.0.dev <2.10.0" - flutter: ">=1.18.0-6.0.pre <2.0.0" + flutter: ">=1.20.0 <2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 2e9d463..1a5d992 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -70,6 +70,7 @@ dependencies: url: https://gitlab.com/famedly/libraries/native_imaging.git ref: master flutter_blurhash: ^0.5.0 + sentry: ">=3.0.0 <4.0.0" dev_dependencies: