Vishnu Mohandas 4 лет назад
Родитель
Сommit
34ffc9e5a1

+ 30 - 0
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;
+}

+ 3 - 5
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 {

+ 9 - 7
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<String, Collection>();
   final _collectionIDToCollections = Map<int, Collection>();
   final _cachedKeys = Map<int, Uint8List>();
@@ -79,7 +81,7 @@ class CollectionsService {
   }
 
   Future<List<User>> getSharees(int collectionID) {
-    return Dio()
+    return _dio
         .get(
       Configuration.instance.getHttpEndpoint() + "/collections/sharees",
       queryParameters: {
@@ -101,7 +103,7 @@ class CollectionsService {
   Future<void> 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<void> 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<List<Collection>> _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<Collection> createAndCacheCollection(Collection collection) async {
-    return Dio()
+    return _dio
         .post(
       Configuration.instance.getHttpEndpoint() + "/collections",
       data: collection.toMap(),

+ 2 - 1
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;

+ 2 - 1
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;
 

+ 10 - 10
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<LocationSearchWidget> {
           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

+ 3 - 2
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<UsageWidget> {
   double _usageInGBs;
+
   @override
   void initState() {
     _getUsage();
@@ -135,7 +136,7 @@ class UsageWidgetState extends State<UsageWidget> {
   }
 
   void _getUsage() {
-    Dio().get(
+    Network.instance.getDio().get(
       Configuration.instance.getHttpEndpoint() + "/billing/usage",
       queryParameters: {
         "startTime": 0,

+ 2 - 1
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<List<File>> getEncryptedFilesDiff(
       int collectionID, int sinceTime, int limit) async {

+ 4 - 3
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<int, FileUploadItem>();
   final _maximumConcurrentUploads = 4;
   int _currentlyUploading = 0;
@@ -258,7 +259,7 @@ class FileUploader {
 
   Future<void> _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(),

+ 11 - 6
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<io.File> _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<io.File> _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(

+ 8 - 1
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:

+ 2 - 1
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: