diff --git a/lib/core/network.dart b/lib/core/network.dart new file mode 100644 index 000000000..b7cf69c79 --- /dev/null +++ b/lib/core/network.dart @@ -0,0 +1,30 @@ +import 'dart:convert'; +import 'dart:developer'; +import 'dart:io'; + +import 'package:dio/dio.dart'; +import 'package:pretty_dio_logger/pretty_dio_logger.dart'; +import 'package:super_logging/super_logging.dart'; + +class Network { + final _dio = Dio(); + + Network._privateConstructor() { + _dio.interceptors.add(PrettyDioLogger( + requestHeader: false, + responseHeader: false, + responseBody: true, + logPrint: (object) { + log(object); + SuperLogging.logFile.writeAsStringSync( + object.toString() + "\n", + encoding: Utf8Codec(allowMalformed: true), + flush: true, + mode: FileMode.append, + ); + })); + } + static Network instance = Network._privateConstructor(); + + Dio getDio() => _dio; +} diff --git a/lib/main.dart b/lib/main.dart index 8d085eaa0..731458b16 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -17,11 +17,9 @@ final _logger = Logger("main"); void main() async { WidgetsFlutterBinding.ensureInitialized(); - await SuperLogging.main(LogConfig( - body: _main, - logDirPath: (await getTemporaryDirectory()).path + "/logs", - enableInDebugMode: true, - )); + SuperLogging.logDirPath = (await getTemporaryDirectory()).path + "/logs"; + SuperLogging.enableInDebugMode = true; + await SuperLogging.main(_main); } void _main() async { diff --git a/lib/services/collections_service.dart b/lib/services/collections_service.dart index 2422b0c2e..b31ed7873 100644 --- a/lib/services/collections_service.dart +++ b/lib/services/collections_service.dart @@ -8,6 +8,7 @@ import 'package:logging/logging.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/core/event_bus.dart'; +import 'package:photos/core/network.dart'; import 'package:photos/db/collections_db.dart'; import 'package:photos/db/files_db.dart'; import 'package:photos/events/collection_updated_event.dart'; @@ -24,6 +25,7 @@ class CollectionsService { CollectionsDB _db; FilesDB _filesDB; Configuration _config; + final _dio = Network.instance.getDio(); final _localCollections = Map(); final _collectionIDToCollections = Map(); final _cachedKeys = Map(); @@ -79,7 +81,7 @@ class CollectionsService { } Future> getSharees(int collectionID) { - return Dio() + return _dio .get( Configuration.instance.getHttpEndpoint() + "/collections/sharees", queryParameters: { @@ -101,7 +103,7 @@ class CollectionsService { Future share(int collectionID, String email, String publicKey) { final encryptedKey = CryptoUtil.sealSync( getCollectionKey(collectionID), Sodium.base642bin(publicKey)); - return Dio() + return _dio .post( Configuration.instance.getHttpEndpoint() + "/collections/share", data: { @@ -116,7 +118,7 @@ class CollectionsService { } Future unshare(int collectionID, String email) { - return Dio().post( + return _dio.post( Configuration.instance.getHttpEndpoint() + "/collections/unshare", data: { "collectionID": collectionID, @@ -145,7 +147,7 @@ class CollectionsService { } Future> _fetchCollections(int sinceTime) { - return Dio() + return _dio .get( Configuration.instance.getHttpEndpoint() + "/collections", queryParameters: { @@ -228,7 +230,7 @@ class CollectionsService { file.uploadedFileID, file.encryptedKey, file.keyDecryptionNonce) .toMap()); } - return Dio() + return _dio .post( Configuration.instance.getHttpEndpoint() + "/collections/add-files", data: params, @@ -251,7 +253,7 @@ class CollectionsService { } params["fileIDs"].add(file.uploadedFileID); } - await Dio().post( + await _dio.post( Configuration.instance.getHttpEndpoint() + "/collections/remove-files", data: params, options: @@ -263,7 +265,7 @@ class CollectionsService { } Future createAndCacheCollection(Collection collection) async { - return Dio() + return _dio .post( Configuration.instance.getHttpEndpoint() + "/collections", data: collection.toMap(), diff --git a/lib/services/sync_service.dart b/lib/services/sync_service.dart index 07ce76a93..e7467d2e0 100644 --- a/lib/services/sync_service.dart +++ b/lib/services/sync_service.dart @@ -3,6 +3,7 @@ import 'package:connectivity/connectivity.dart'; import 'package:flutter/foundation.dart'; import 'package:logging/logging.dart'; import 'package:photos/core/event_bus.dart'; +import 'package:photos/core/network.dart'; import 'package:photos/db/files_db.dart'; import 'package:photos/events/collection_updated_event.dart'; import 'package:photos/events/sync_status_update_event.dart'; @@ -24,7 +25,7 @@ import 'package:photos/core/configuration.dart'; class SyncService { final _logger = Logger("SyncService"); - final _dio = Dio(); + final _dio = Network.instance.getDio(); final _db = FilesDB.instance; final _uploader = FileUploader.instance; final _collectionsService = CollectionsService.instance; diff --git a/lib/services/user_service.dart b/lib/services/user_service.dart index 388528518..69e769c6e 100644 --- a/lib/services/user_service.dart +++ b/lib/services/user_service.dart @@ -4,6 +4,7 @@ import 'package:flutter/widgets.dart'; import 'package:logging/logging.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/core/event_bus.dart'; +import 'package:photos/core/network.dart'; import 'package:photos/db/public_keys_db.dart'; import 'package:photos/events/user_authenticated_event.dart'; @@ -16,7 +17,7 @@ import 'package:photos/utils/dialog_util.dart'; import 'package:photos/utils/toast_util.dart'; class UserService { - final _dio = Dio(); + final _dio = Network.instance.getDio(); final _logger = Logger("UserAuthenticator"); final _config = Configuration.instance; diff --git a/lib/ui/location_search_widget.dart b/lib/ui/location_search_widget.dart index cbd432b53..aca3a616d 100644 --- a/lib/ui/location_search_widget.dart +++ b/lib/ui/location_search_widget.dart @@ -1,10 +1,9 @@ -import 'dart:developer'; - import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:photos/core/configuration.dart'; +import 'package:photos/core/network.dart'; import 'package:photos/models/location.dart'; import 'package:photos/ui/loading_widget.dart'; import 'package:photos/ui/location_search_results_page.dart'; @@ -41,15 +40,16 @@ class _LocationSearchWidgetState extends State { return null; } _searchString = pattern; - return Dio() + return Network.instance + .getDio() .get( - Configuration.instance.getHttpEndpoint() + "/search/location", - queryParameters: { - "query": pattern, - }, - options: Options( - headers: {"X-Auth-Token": Configuration.instance.getToken()}), - ) + Configuration.instance.getHttpEndpoint() + "/search/location", + queryParameters: { + "query": pattern, + }, + options: Options( + headers: {"X-Auth-Token": Configuration.instance.getToken()}), + ) .then((response) { if (_searchString == pattern) { // Query has not changed diff --git a/lib/ui/settings_page.dart b/lib/ui/settings_page.dart index 49ee831b0..801f8d29f 100644 --- a/lib/ui/settings_page.dart +++ b/lib/ui/settings_page.dart @@ -2,7 +2,6 @@ import 'dart:io'; import 'package:archive/archive_io.dart'; import 'package:crisp/crisp.dart'; -import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; @@ -11,6 +10,7 @@ import 'package:flutter_sodium/flutter_sodium.dart'; import 'package:logging/logging.dart'; import 'package:path_provider/path_provider.dart'; import 'package:photos/core/configuration.dart'; +import 'package:photos/core/network.dart'; import 'package:photos/db/files_db.dart'; import 'package:photos/ui/loading_widget.dart'; import 'package:photos/utils/dialog_util.dart'; @@ -56,6 +56,7 @@ class UsageWidget extends StatefulWidget { class UsageWidgetState extends State { double _usageInGBs; + @override void initState() { _getUsage(); @@ -135,7 +136,7 @@ class UsageWidgetState extends State { } void _getUsage() { - Dio().get( + Network.instance.getDio().get( Configuration.instance.getHttpEndpoint() + "/billing/usage", queryParameters: { "startTime": 0, diff --git a/lib/utils/file_downloader.dart b/lib/utils/file_downloader.dart index 365f27d67..01a68ba95 100644 --- a/lib/utils/file_downloader.dart +++ b/lib/utils/file_downloader.dart @@ -5,6 +5,7 @@ import 'package:flutter_sodium/flutter_sodium.dart'; import 'package:logging/logging.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/core/event_bus.dart'; +import 'package:photos/core/network.dart'; import 'package:photos/db/files_db.dart'; import 'package:photos/events/collection_updated_event.dart'; import 'package:photos/events/remote_sync_event.dart'; @@ -14,7 +15,7 @@ import 'package:photos/utils/file_util.dart'; class DiffFetcher { final _logger = Logger("FileDownloader"); - final _dio = Dio(); + final _dio = Network.instance.getDio(); Future> getEncryptedFilesDiff( int collectionID, int sinceTime, int limit) async { diff --git a/lib/utils/file_uploader.dart b/lib/utils/file_uploader.dart index bf09700a8..c1d03659c 100644 --- a/lib/utils/file_uploader.dart +++ b/lib/utils/file_uploader.dart @@ -8,6 +8,7 @@ import 'package:flutter_sodium/flutter_sodium.dart'; import 'package:logging/logging.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/core/constants.dart'; +import 'package:photos/core/network.dart'; import 'package:photos/db/files_db.dart'; import 'package:photos/models/file.dart'; import 'package:photos/models/location.dart'; @@ -17,7 +18,7 @@ import 'package:photos/utils/crypto_util.dart'; class FileUploader { final _logger = Logger("FileUploader"); - final _dio = Dio(); + final _dio = Network.instance.getDio(); final _queue = LinkedHashMap(); final _maximumConcurrentUploads = 4; int _currentlyUploading = 0; @@ -258,7 +259,7 @@ class FileUploader { Future _fetchUploadURLs() { if (_uploadURLFetchInProgress == null) { - _uploadURLFetchInProgress = Dio() + _uploadURLFetchInProgress = _dio .get( Configuration.instance.getHttpEndpoint() + "/files/upload-urls", queryParameters: { @@ -282,7 +283,7 @@ class FileUploader { final fileSize = file.lengthSync().toString(); final startTime = DateTime.now().millisecondsSinceEpoch; _logger.info("Putting file of size " + fileSize + " to " + uploadURL.url); - await Dio().put(uploadURL.url, + await _dio.put(uploadURL.url, data: file.openRead(), options: Options(headers: { Headers.contentLengthHeader: await file.length(), diff --git a/lib/utils/file_util.dart b/lib/utils/file_util.dart index cb72cdaac..9f6e5f37c 100644 --- a/lib/utils/file_util.dart +++ b/lib/utils/file_util.dart @@ -15,6 +15,7 @@ import 'package:photos/core/cache/video_cache_manager.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/core/constants.dart'; import 'package:photos/core/event_bus.dart'; +import 'package:photos/core/network.dart'; import 'package:photos/db/files_db.dart'; import 'package:photos/events/collection_updated_event.dart'; import 'package:photos/models/file.dart'; @@ -188,12 +189,13 @@ Future _downloadAndDecrypt(File file, BaseCacheManager cacheManager, final encryptedFile = io.File(encryptedFilePath); final decryptedFile = io.File(decryptedFilePath); final startTime = DateTime.now().millisecondsSinceEpoch; - return Dio() + return Network.instance + .getDio() .download( - file.getDownloadUrl(), - encryptedFilePath, - onReceiveProgress: progressCallback, - ) + file.getDownloadUrl(), + encryptedFilePath, + onReceiveProgress: progressCallback, + ) .then((response) async { if (response.statusCode != 200) { logger.warning("Could not download file: ", response.toString()); @@ -232,7 +234,10 @@ Future _downloadAndDecryptThumbnail(File file) async { final temporaryPath = Configuration.instance.getTempDirectory() + file.generatedID.toString() + "_thumbnail.decrypted"; - return Dio().download(file.getThumbnailUrl(), temporaryPath).then((_) async { + return Network.instance + .getDio() + .download(file.getThumbnailUrl(), temporaryPath) + .then((_) async { final encryptedFile = io.File(temporaryPath); final thumbnailDecryptionKey = decryptFileKey(file); final data = CryptoUtil.decryptChaCha( diff --git a/pubspec.lock b/pubspec.lock index 6fdb66d19..6f46feb80 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -499,6 +499,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.3" + pretty_dio_logger: + dependency: "direct main" + description: + name: pretty_dio_logger + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" process: dependency: transitive description: @@ -650,7 +657,7 @@ packages: name: super_logging url: "https://pub.dartlang.org" source: hosted - version: "1.3.4" + version: "2.0.1" synchronized: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 1a89bdc82..6dd990068 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -37,7 +37,7 @@ dependencies: visibility_detector: ^0.1.5 event_bus: ^1.1.1 sentry: ">=3.0.0 <4.0.0" - super_logging: ^1.0.0 + super_logging: ^2.0.1 archive: ^2.0.11 flutter_email_sender: ^3.0.1 like_button: ^0.2.0 @@ -61,6 +61,7 @@ dependencies: convex_bottom_bar: ^2.6.0 scrollable_positioned_list: ^0.1.8 connectivity: ^2.0.1 + pretty_dio_logger: ^1.1.1 dev_dependencies: flutter_test: