diff --git a/lib/app/app.dart b/lib/app/app.dart index 0ed666d2..462ee00b 100644 --- a/lib/app/app.dart +++ b/lib/app/app.dart @@ -1,3 +1,4 @@ +import 'package:revanced_manager/services/download_manager.dart'; import 'package:revanced_manager/services/github_api.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/services/patcher_api.dart'; @@ -41,6 +42,7 @@ import 'package:stacked_services/stacked_services.dart'; LazySingleton(classType: PatcherAPI), LazySingleton(classType: RevancedAPI), LazySingleton(classType: GithubAPI), + LazySingleton(classType: DownloadManager), LazySingleton(classType: Toast), ], ) diff --git a/lib/main.dart b/lib/main.dart index 29b715b9..956f1c30 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/services/download_manager.dart'; import 'package:revanced_manager/services/github_api.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/services/revanced_api.dart'; @@ -19,6 +20,7 @@ Future main() async { await setupLocator(); WidgetsFlutterBinding.ensureInitialized(); await locator().initialize(); + await locator().initialize(); final String apiUrl = locator().getApiUrl(); await locator().initialize(apiUrl); final String repoUrl = locator().getRepoUrl(); diff --git a/lib/services/download_manager.dart b/lib/services/download_manager.dart new file mode 100644 index 00000000..4c0919b9 --- /dev/null +++ b/lib/services/download_manager.dart @@ -0,0 +1,75 @@ +import 'package:dio/dio.dart'; +import 'package:dio_cache_interceptor/dio_cache_interceptor.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_cache_manager/file.dart'; +import 'package:flutter_cache_manager/flutter_cache_manager.dart'; +import 'package:injectable/injectable.dart'; +import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/services/manager_api.dart'; + +@lazySingleton +class DownloadManager { + final ManagerAPI _managerAPI = locator(); + late final String _userAgent; + + final _cacheOptions = CacheOptions( + store: MemCacheStore(), + maxStale: const Duration(days: 1), + priority: CachePriority.high, + ); + + Future initialize() async { + _userAgent = 'ReVanced-Manager/${await _managerAPI.getCurrentManagerVersion()}'; + } + + Dio initDio(String url) { + var dio = Dio(); + try { + dio = Dio( + BaseOptions( + baseUrl: url, + headers: { + 'User-Agent': _userAgent, + }, + ), + ); + } on Exception catch (e) { + if (kDebugMode) { + print(e); + } + } + + dio.interceptors.add(DioCacheInterceptor(options: _cacheOptions)); + return dio; + } + + Future clearAllCache() async { + try { + await _cacheOptions.store!.clean(); + } on Exception catch (e) { + if (kDebugMode) { + print(e); + } + } + } + + Future getSingleFile(String url) async { + return DefaultCacheManager().getSingleFile( + url, + headers: { + 'User-Agent': _userAgent, + }, + ); + } + + Stream getFileStream(String url) { + return DefaultCacheManager().getFileStream( + url, + withProgress: true, + headers: { + 'User-Agent': _userAgent, + }, + ); + } +} + diff --git a/lib/services/github_api.dart b/lib/services/github_api.dart index 8d3244b3..add2424d 100644 --- a/lib/services/github_api.dart +++ b/lib/services/github_api.dart @@ -1,48 +1,24 @@ import 'dart:io'; import 'package:collection/collection.dart'; import 'package:dio/dio.dart'; -import 'package:dio_cache_interceptor/dio_cache_interceptor.dart'; import 'package:flutter/foundation.dart'; -import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:injectable/injectable.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/services/download_manager.dart'; import 'package:revanced_manager/services/manager_api.dart'; @lazySingleton class GithubAPI { - late Dio _dio = Dio(); + late final Dio _dio; late final ManagerAPI _managerAPI = locator(); - - final _cacheOptions = CacheOptions( - store: MemCacheStore(), - maxStale: const Duration(days: 1), - priority: CachePriority.high, - ); + late final DownloadManager _downloadManager = locator(); Future initialize(String repoUrl) async { - try { - _dio = Dio( - BaseOptions( - baseUrl: repoUrl, - ), - ); - - _dio.interceptors.add(DioCacheInterceptor(options: _cacheOptions)); - } on Exception catch (e) { - if (kDebugMode) { - print(e); - } - } + _dio = _downloadManager.initDio(repoUrl); } Future clearAllCache() async { - try { - await _cacheOptions.store!.clean(); - } on Exception catch (e) { - if (kDebugMode) { - print(e); - } - } + await _downloadManager.clearAllCache(); } Future?> getLatestRelease( @@ -104,7 +80,7 @@ class GithubAPI { final Map releases = response.data[0]; int updates = 0; final String currentVersion = - await ManagerAPI().getCurrentManagerVersion(); + await _managerAPI.getCurrentManagerVersion(); while (response.data[updates]['tag_name'] != 'v$currentVersion') { updates++; } @@ -141,7 +117,7 @@ class GithubAPI { (asset) => (asset['name'] as String).endsWith(extension), ); if (asset != null) { - return await DefaultCacheManager().getSingleFile( + return await _downloadManager.getSingleFile( asset['browser_download_url'], ); } @@ -162,7 +138,7 @@ class GithubAPI { ) async { try { if (url.isNotEmpty) { - return await DefaultCacheManager().getSingleFile( + return await _downloadManager.getSingleFile( url, ); } @@ -180,7 +156,7 @@ class GithubAPI { } else { _managerAPI.setPatchesDownloadURL(downloadUrl); } - return await DefaultCacheManager().getSingleFile( + return await _downloadManager.getSingleFile( downloadUrl, ); } diff --git a/lib/services/revanced_api.dart b/lib/services/revanced_api.dart index fca17c0e..70d2064c 100644 --- a/lib/services/revanced_api.dart +++ b/lib/services/revanced_api.dart @@ -3,49 +3,27 @@ import 'dart:io'; import 'package:collection/collection.dart'; import 'package:dio/dio.dart'; -import 'package:dio_cache_interceptor/dio_cache_interceptor.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:injectable/injectable.dart'; +import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/services/download_manager.dart'; import 'package:synchronized/synchronized.dart'; import 'package:timeago/timeago.dart'; @lazySingleton class RevancedAPI { - late Dio _dio = Dio(); + late final Dio _dio; + late final DownloadManager _downloadManager = locator(); final Lock getToolsLock = Lock(); - final _cacheOptions = CacheOptions( - store: MemCacheStore(), - maxStale: const Duration(days: 1), - priority: CachePriority.high, - ); - - Future initialize(String apiUrl) async { - try { - _dio = Dio( - BaseOptions( - baseUrl: apiUrl, - ), - ); - - _dio.interceptors.add(DioCacheInterceptor(options: _cacheOptions)); - } on Exception catch (e) { - if (kDebugMode) { - print(e); - } - } + Future initialize(String repoUrl) async { + _dio = _downloadManager.initDio(repoUrl); } Future clearAllCache() async { - try { - await _cacheOptions.store!.clean(); - } on Exception catch (e) { - if (kDebugMode) { - print(e); - } - } + await _downloadManager.clearAllCache(); } Future>> getContributors() async { @@ -120,7 +98,7 @@ class RevancedAPI { ); if (release != null) { final String url = release['browser_download_url']; - return await DefaultCacheManager().getSingleFile(url); + return await _downloadManager.getSingleFile(url); } } on Exception catch (e) { if (kDebugMode) { @@ -152,9 +130,8 @@ class RevancedAPI { 'revanced/revanced-manager', ); File? outputFile; - await for (final result in DefaultCacheManager().getFileStream( + await for (final result in _downloadManager.getFileStream( release!['browser_download_url'] as String, - withProgress: true, )) { if (result is DownloadProgress) { final totalSize = result.totalSize ?? 10000000; diff --git a/lib/ui/widgets/contributorsView/contributors_card.dart b/lib/ui/widgets/contributorsView/contributors_card.dart index 574699a8..d0a4c624 100644 --- a/lib/ui/widgets/contributorsView/contributors_card.dart +++ b/lib/ui/widgets/contributorsView/contributors_card.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_cache_manager/file.dart'; -import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; +import 'package:revanced_manager/services/download_manager.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -58,7 +58,7 @@ class _ContributorsCardState extends State { mode: LaunchMode.externalApplication, ), child: FutureBuilder( - future: DefaultCacheManager().getSingleFile( + future: DownloadManager().getSingleFile( widget.contributors[index]['avatar_url'], ), builder: (context, snapshot) => snapshot.hasData