From d44294e5bcb7a837e6cfffd44e04ea47d2baf94e Mon Sep 17 00:00:00 2001 From: Tristan Vanderaerden Date: Mon, 4 Apr 2022 16:13:49 +0200 Subject: [PATCH 01/53] * Fix build * Export CacheObject to allow extending CacheInfoRepository --- flutter_cache_manager/example/pubspec.yaml | 2 +- flutter_cache_manager/lib/flutter_cache_manager.dart | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/flutter_cache_manager/example/pubspec.yaml b/flutter_cache_manager/example/pubspec.yaml index 9ddcb677..8c9a61dc 100644 --- a/flutter_cache_manager/example/pubspec.yaml +++ b/flutter_cache_manager/example/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: baseflow_plugin_template: git: - url: git://github.com/Baseflow/baseflow_plugin_template.git + url: https://github.com/Baseflow/baseflow_plugin_template.git ref: v1.0.0 cupertino_icons: ^1.0.2 flutter: diff --git a/flutter_cache_manager/lib/flutter_cache_manager.dart b/flutter_cache_manager/lib/flutter_cache_manager.dart index 6d436c45..172a8072 100644 --- a/flutter_cache_manager/lib/flutter_cache_manager.dart +++ b/flutter_cache_manager/lib/flutter_cache_manager.dart @@ -5,5 +5,6 @@ export 'src/config/config.dart'; export 'src/logger.dart'; export 'src/result/result.dart'; export 'src/storage/cache_info_repositories/cache_info_repositories.dart'; +export 'src/storage/cache_object.dart'; export 'src/web/file_service.dart'; export 'src/web/web_helper.dart' show HttpExceptionWithStatus; From 3f8b66add47c54817b83ab8be0fd7c559a722f71 Mon Sep 17 00:00:00 2001 From: Aneesh Rao Date: Sat, 9 Apr 2022 14:26:07 +0530 Subject: [PATCH 02/53] chore(pubspec): Add `platform` declaration to pubspec.yaml Reference: https://dart.dev/tools/pub/pubspec#platforms --- flutter_cache_manager/pubspec.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/flutter_cache_manager/pubspec.yaml b/flutter_cache_manager/pubspec.yaml index 124d2745..029ebcf3 100644 --- a/flutter_cache_manager/pubspec.yaml +++ b/flutter_cache_manager/pubspec.yaml @@ -25,3 +25,11 @@ dev_dependencies: sdk: flutter mockito: ^5.0.0 flutter_lints: ^1.0.4 + +platforms: + android: + ios: + linux: + macos: + web: + windows: \ No newline at end of file From b9da5b2fa8b2c0ddac096f3a1efa7e09e5215087 Mon Sep 17 00:00:00 2001 From: Hugo Heneault Date: Mon, 9 May 2022 10:23:15 +0200 Subject: [PATCH 03/53] Add config getter to CacheManager --- flutter_cache_manager/lib/src/cache_manager.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/flutter_cache_manager/lib/src/cache_manager.dart b/flutter_cache_manager/lib/src/cache_manager.dart index 6d85e40d..a1d74a88 100644 --- a/flutter_cache_manager/lib/src/cache_manager.dart +++ b/flutter_cache_manager/lib/src/cache_manager.dart @@ -48,6 +48,9 @@ class CacheManager implements BaseCacheManager { final Config _config; + /// Get the config + Config get config => _config; + /// Store helper for cached files final CacheStore _store; From 00928b679e2b289bd991a071321ff1ed701180a6 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Thu, 25 Apr 2024 18:39:37 +0200 Subject: [PATCH 04/53] Update dependencies --- flutter_cache_manager/CHANGELOG.md | 3 +++ .../lib/src/result/download_progress.dart | 3 +-- flutter_cache_manager/pubspec.yaml | 20 +++++++++---------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/flutter_cache_manager/CHANGELOG.md b/flutter_cache_manager/CHANGELOG.md index beb2c28d..a857d3b0 100644 --- a/flutter_cache_manager/CHANGELOG.md +++ b/flutter_cache_manager/CHANGELOG.md @@ -1,3 +1,6 @@ +## [3.3.2] - 2024-04-25 +* Updates dependencies to their latest versions. + ## [3.3.1] - 2023-07-03 * Support Dart 3.0.0 for http ^1.0.0 and file ^7.0.0 * Update example diff --git a/flutter_cache_manager/lib/src/result/download_progress.dart b/flutter_cache_manager/lib/src/result/download_progress.dart index 4dffb0e6..54b6b576 100644 --- a/flutter_cache_manager/lib/src/result/download_progress.dart +++ b/flutter_cache_manager/lib/src/result/download_progress.dart @@ -2,8 +2,7 @@ import 'package:flutter_cache_manager/src/result/file_response.dart'; /// Progress of the file that is being downloaded from the [originalUrl]. class DownloadProgress extends FileResponse { - const DownloadProgress(String originalUrl, this.totalSize, this.downloaded) - : super(originalUrl); + const DownloadProgress(super.originalUrl, this.totalSize, this.downloaded); /// download progress as an double between 0 and 1. /// When the final size is unknown or the downloaded size exceeds the total diff --git a/flutter_cache_manager/pubspec.yaml b/flutter_cache_manager/pubspec.yaml index 903d4c94..b2e98f35 100644 --- a/flutter_cache_manager/pubspec.yaml +++ b/flutter_cache_manager/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_cache_manager description: Generic cache manager for flutter. Saves web files on the storages of the device and saves the cache info using sqflite. -version: 3.3.1 +version: 3.3.2 homepage: https://github.com/Baseflow/flutter_cache_manager/tree/develop/flutter_cache_manager topics: - cache @@ -10,20 +10,20 @@ environment: dependencies: clock: ^1.1.0 - collection: ^1.15.0 - file: '>=6.1.4 <8.0.0' + collection: ^1.18.0 + file: ^7.0.0 flutter: sdk: flutter - http: '>=0.13.0 <2.0.0' - path: ^1.8.0 - path_provider: ^2.0.0 - rxdart: '>=0.26.0 <0.28.0' - sqflite: ^2.0.0+4 - uuid: '>=3.0.0 <5.0.0' + http: ^1.2.1 + path: ^1.9.0 + path_provider: ^2.1.3 + rxdart: ^0.27.7 + sqflite: ^2.3.3 + uuid: ^4.4.0 dev_dependencies: build_runner: ^2.0.0 - flutter_lints: ^2.0.1 + flutter_lints: ^3.0.2 flutter_test: sdk: flutter mockito: ^5.0.0 From e2761887bde0c237c38e008704ded5010faae1b3 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Thu, 25 Apr 2024 18:45:27 +0200 Subject: [PATCH 05/53] Update dependencies --- flutter_cache_manager_firebase/CHANGELOG.md | 3 +++ flutter_cache_manager_firebase/pubspec.yaml | 8 ++++---- .../test/flutter_cache_manager_firebase_test.dart | 2 -- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/flutter_cache_manager_firebase/CHANGELOG.md b/flutter_cache_manager_firebase/CHANGELOG.md index ea848a30..4c46c62e 100644 --- a/flutter_cache_manager_firebase/CHANGELOG.md +++ b/flutter_cache_manager_firebase/CHANGELOG.md @@ -1,3 +1,6 @@ +## [2.0.2] - 2024-04-25 +* Updates dependencies to their latest versions. + ## [2.0.1] - 2021-08-27 * Update dependencies diff --git a/flutter_cache_manager_firebase/pubspec.yaml b/flutter_cache_manager_firebase/pubspec.yaml index aceaa2c4..95e819cb 100644 --- a/flutter_cache_manager_firebase/pubspec.yaml +++ b/flutter_cache_manager_firebase/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_cache_manager_firebase description: CacheManager implementation for firebase_storage. Uses the gs:// as key and translates to https:// -version: 2.0.1 +version: 2.0.2 homepage: https://github.com/Baseflow/flutter_cache_manager environment: @@ -10,9 +10,9 @@ dependencies: flutter: sdk: flutter flutter_cache_manager: ^3.0.0 - firebase_storage: ">=8.0.0 <11.0.0" - path_provider: ^2.0.0 - path: ^1.8.0 + firebase_storage: ^11.7.4 + path_provider: ^2.1.3 + path: ^1.9.0 dev_dependencies: flutter_test: diff --git a/flutter_cache_manager_firebase/test/flutter_cache_manager_firebase_test.dart b/flutter_cache_manager_firebase/test/flutter_cache_manager_firebase_test.dart index 0b45f02c..d30207dd 100644 --- a/flutter_cache_manager_firebase/test/flutter_cache_manager_firebase_test.dart +++ b/flutter_cache_manager_firebase/test/flutter_cache_manager_firebase_test.dart @@ -1,5 +1,3 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_cache_manager_firebase/flutter_cache_manager_firebase.dart'; void main() {} From 61317e44e09f986dc74c154305553c76bafd69b8 Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Thu, 25 Apr 2024 19:04:36 +0200 Subject: [PATCH 06/53] Update Dart SDK constraint --- flutter_cache_manager_firebase/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flutter_cache_manager_firebase/pubspec.yaml b/flutter_cache_manager_firebase/pubspec.yaml index 95e819cb..4ffd2c0c 100644 --- a/flutter_cache_manager_firebase/pubspec.yaml +++ b/flutter_cache_manager_firebase/pubspec.yaml @@ -4,7 +4,7 @@ version: 2.0.2 homepage: https://github.com/Baseflow/flutter_cache_manager environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.12.0 <4.0.0" dependencies: flutter: From 1fa6f69a6c5c00eac1ce6e1d304530c10cf79084 Mon Sep 17 00:00:00 2001 From: Roman Laptev Date: Fri, 14 Jun 2024 15:12:55 +0300 Subject: [PATCH 07/53] Support latest rxdart version --- flutter_cache_manager/example/pubspec.yaml | 8 ++++---- flutter_cache_manager/pubspec.yaml | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/flutter_cache_manager/example/pubspec.yaml b/flutter_cache_manager/example/pubspec.yaml index acace8eb..848756a1 100644 --- a/flutter_cache_manager/example/pubspec.yaml +++ b/flutter_cache_manager/example/pubspec.yaml @@ -3,21 +3,21 @@ description: A project that showcases usage of flutter_cache_manager publish_to: none version: 1.0.0+1 environment: - sdk: '>=2.17.0 <4.0.0' + sdk: '>=3.0.0 <4.0.0' dependencies: baseflow_plugin_template: ^2.1.2 - cupertino_icons: ^1.0.5 + cupertino_icons: ^1.0.8 flutter: sdk: flutter flutter_cache_manager: path: ../ - url_launcher: ^6.1.10 + url_launcher: ^6.3.0 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^2.0.1 + flutter_lints: ^4.0.0 flutter: uses-material-design: true diff --git a/flutter_cache_manager/pubspec.yaml b/flutter_cache_manager/pubspec.yaml index b2e98f35..fd9737f0 100644 --- a/flutter_cache_manager/pubspec.yaml +++ b/flutter_cache_manager/pubspec.yaml @@ -6,7 +6,7 @@ topics: - cache - cache-manager environment: - sdk: '>=2.17.0 <4.0.0' + sdk: '>=3.0.0 <4.0.0' dependencies: clock: ^1.1.0 @@ -17,13 +17,13 @@ dependencies: http: ^1.2.1 path: ^1.9.0 path_provider: ^2.1.3 - rxdart: ^0.27.7 + rxdart: '>=0.27.7 <1.0.0' sqflite: ^2.3.3 uuid: ^4.4.0 dev_dependencies: - build_runner: ^2.0.0 - flutter_lints: ^3.0.2 + build_runner: ^2.4.11 + flutter_lints: ^4.0.0 flutter_test: sdk: flutter - mockito: ^5.0.0 + mockito: ^5.4.4 From 012881a63f935a5b245aa51be81d2b34663b9637 Mon Sep 17 00:00:00 2001 From: Roman Laptev Date: Fri, 14 Jun 2024 15:15:40 +0300 Subject: [PATCH 08/53] Align flutter_cache_manager_firebase version --- flutter_cache_manager_firebase/pubspec.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flutter_cache_manager_firebase/pubspec.yaml b/flutter_cache_manager_firebase/pubspec.yaml index 4ffd2c0c..9bf011d2 100644 --- a/flutter_cache_manager_firebase/pubspec.yaml +++ b/flutter_cache_manager_firebase/pubspec.yaml @@ -4,13 +4,13 @@ version: 2.0.2 homepage: https://github.com/Baseflow/flutter_cache_manager environment: - sdk: ">=2.12.0 <4.0.0" + sdk: ">=3.0.0 <4.0.0" dependencies: flutter: sdk: flutter - flutter_cache_manager: ^3.0.0 - firebase_storage: ^11.7.4 + flutter_cache_manager: ^3.3.2 + firebase_storage: '>=12.0.0' path_provider: ^2.1.3 path: ^1.9.0 From aca5d51af00ca5fe179cc6a13f25ae91b270050b Mon Sep 17 00:00:00 2001 From: Roman Laptev Date: Mon, 24 Jun 2024 15:55:47 +0300 Subject: [PATCH 09/53] Align versions to support Dart 3 --- flutter_cache_manager/example/pubspec.yaml | 4 ++-- flutter_cache_manager/pubspec.yaml | 16 ++++++++-------- .../analysis_options.yaml | 1 + flutter_cache_manager_firebase/pubspec.yaml | 3 ++- 4 files changed, 13 insertions(+), 11 deletions(-) create mode 100644 flutter_cache_manager_firebase/analysis_options.yaml diff --git a/flutter_cache_manager/example/pubspec.yaml b/flutter_cache_manager/example/pubspec.yaml index 848756a1..df273309 100644 --- a/flutter_cache_manager/example/pubspec.yaml +++ b/flutter_cache_manager/example/pubspec.yaml @@ -12,12 +12,12 @@ dependencies: sdk: flutter flutter_cache_manager: path: ../ - url_launcher: ^6.3.0 + url_launcher: ^6.2.1 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^4.0.0 + flutter_lints: any flutter: uses-material-design: true diff --git a/flutter_cache_manager/pubspec.yaml b/flutter_cache_manager/pubspec.yaml index fd9737f0..82420821 100644 --- a/flutter_cache_manager/pubspec.yaml +++ b/flutter_cache_manager/pubspec.yaml @@ -9,21 +9,21 @@ environment: sdk: '>=3.0.0 <4.0.0' dependencies: - clock: ^1.1.0 - collection: ^1.18.0 + clock: ^1.1.1 + collection: ^1.16.0 file: ^7.0.0 flutter: sdk: flutter - http: ^1.2.1 + http: ^1.1.0 path: ^1.9.0 - path_provider: ^2.1.3 - rxdart: '>=0.27.7 <1.0.0' - sqflite: ^2.3.3 + path_provider: ^2.1.2 + rxdart: '>=0.27.7 <0.29.0' + sqflite: ^2.3.0 uuid: ^4.4.0 dev_dependencies: - build_runner: ^2.4.11 - flutter_lints: ^4.0.0 + build_runner: ^2.4.0 + flutter_lints: any flutter_test: sdk: flutter mockito: ^5.4.4 diff --git a/flutter_cache_manager_firebase/analysis_options.yaml b/flutter_cache_manager_firebase/analysis_options.yaml new file mode 100644 index 00000000..f9b30346 --- /dev/null +++ b/flutter_cache_manager_firebase/analysis_options.yaml @@ -0,0 +1 @@ +include: package:flutter_lints/flutter.yaml diff --git a/flutter_cache_manager_firebase/pubspec.yaml b/flutter_cache_manager_firebase/pubspec.yaml index 9bf011d2..f8a098d8 100644 --- a/flutter_cache_manager_firebase/pubspec.yaml +++ b/flutter_cache_manager_firebase/pubspec.yaml @@ -11,9 +11,10 @@ dependencies: sdk: flutter flutter_cache_manager: ^3.3.2 firebase_storage: '>=12.0.0' - path_provider: ^2.1.3 + path_provider: ^2.1.2 path: ^1.9.0 dev_dependencies: + flutter_lints: any flutter_test: sdk: flutter From f872a5c100a514d8a868b37ebaab625d35604ddc Mon Sep 17 00:00:00 2001 From: Rene Floor Date: Tue, 23 Jul 2024 10:41:18 +0200 Subject: [PATCH 10/53] Setting flutter_lints version --- flutter_cache_manager/example/pubspec.yaml | 2 +- flutter_cache_manager/pubspec.yaml | 2 +- .../lib/src/firebase_cache_manager.dart | 2 +- .../lib/src/firebase_http_file_service.dart | 4 ++-- flutter_cache_manager_firebase/pubspec.yaml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/flutter_cache_manager/example/pubspec.yaml b/flutter_cache_manager/example/pubspec.yaml index df273309..de16453a 100644 --- a/flutter_cache_manager/example/pubspec.yaml +++ b/flutter_cache_manager/example/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: any + flutter_lints: ^3.0.2 flutter: uses-material-design: true diff --git a/flutter_cache_manager/pubspec.yaml b/flutter_cache_manager/pubspec.yaml index 82420821..92d968eb 100644 --- a/flutter_cache_manager/pubspec.yaml +++ b/flutter_cache_manager/pubspec.yaml @@ -23,7 +23,7 @@ dependencies: dev_dependencies: build_runner: ^2.4.0 - flutter_lints: any + flutter_lints: ^3.0.2 flutter_test: sdk: flutter mockito: ^5.4.4 diff --git a/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart b/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart index 492f9f02..d474901f 100644 --- a/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart +++ b/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart @@ -7,7 +7,7 @@ import 'firebase_http_file_service.dart'; class FirebaseCacheManager extends CacheManager { static const key = 'firebaseCache'; - static late final FirebaseCacheManager _instance = FirebaseCacheManager._(); + static final FirebaseCacheManager _instance = FirebaseCacheManager._(); factory FirebaseCacheManager() { return _instance; diff --git a/flutter_cache_manager_firebase/lib/src/firebase_http_file_service.dart b/flutter_cache_manager_firebase/lib/src/firebase_http_file_service.dart index bc2c9554..c73710bc 100644 --- a/flutter_cache_manager_firebase/lib/src/firebase_http_file_service.dart +++ b/flutter_cache_manager_firebase/lib/src/firebase_http_file_service.dart @@ -9,8 +9,8 @@ class FirebaseHttpFileService extends HttpFileService { Future get(String url, {Map? headers}) async { var ref = FirebaseStorage.instance.ref().child(url); - var _url = await ref.getDownloadURL(); + var downloadUrl = await ref.getDownloadURL(); - return super.get(_url); + return super.get(downloadUrl); } } diff --git a/flutter_cache_manager_firebase/pubspec.yaml b/flutter_cache_manager_firebase/pubspec.yaml index f8a098d8..5eb4d1c4 100644 --- a/flutter_cache_manager_firebase/pubspec.yaml +++ b/flutter_cache_manager_firebase/pubspec.yaml @@ -15,6 +15,6 @@ dependencies: path: ^1.9.0 dev_dependencies: - flutter_lints: any + flutter_lints: ^3.0.2 flutter_test: sdk: flutter From 32e8a327a531ea945637d02c5f1969d12568e1b5 Mon Sep 17 00:00:00 2001 From: Rene Floor Date: Tue, 23 Jul 2024 10:44:09 +0200 Subject: [PATCH 11/53] Improve on firebase_storage version --- flutter_cache_manager_firebase/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flutter_cache_manager_firebase/pubspec.yaml b/flutter_cache_manager_firebase/pubspec.yaml index 5eb4d1c4..f1c0aa1f 100644 --- a/flutter_cache_manager_firebase/pubspec.yaml +++ b/flutter_cache_manager_firebase/pubspec.yaml @@ -10,7 +10,7 @@ dependencies: flutter: sdk: flutter flutter_cache_manager: ^3.3.2 - firebase_storage: '>=12.0.0' + firebase_storage: '>=11.7.4 <13.0.0' path_provider: ^2.1.2 path: ^1.9.0 From 4bffa3b277166e8c2fdc81746e48cbef65835714 Mon Sep 17 00:00:00 2001 From: Rene Floor Date: Tue, 23 Jul 2024 10:46:31 +0200 Subject: [PATCH 12/53] Update version and changelog --- flutter_cache_manager/CHANGELOG.md | 3 +++ flutter_cache_manager/pubspec.yaml | 2 +- flutter_cache_manager_firebase/CHANGELOG.md | 3 +++ flutter_cache_manager_firebase/pubspec.yaml | 2 +- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/flutter_cache_manager/CHANGELOG.md b/flutter_cache_manager/CHANGELOG.md index a857d3b0..6b7e0bc5 100644 --- a/flutter_cache_manager/CHANGELOG.md +++ b/flutter_cache_manager/CHANGELOG.md @@ -1,3 +1,6 @@ +## [3.3.3] - 2024-07-23 +* Updates dependencies ([#457](https://github.com/Baseflow/flutter_cache_manager/pull/457)) + ## [3.3.2] - 2024-04-25 * Updates dependencies to their latest versions. diff --git a/flutter_cache_manager/pubspec.yaml b/flutter_cache_manager/pubspec.yaml index 92d968eb..d220e136 100644 --- a/flutter_cache_manager/pubspec.yaml +++ b/flutter_cache_manager/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_cache_manager description: Generic cache manager for flutter. Saves web files on the storages of the device and saves the cache info using sqflite. -version: 3.3.2 +version: 3.3.3 homepage: https://github.com/Baseflow/flutter_cache_manager/tree/develop/flutter_cache_manager topics: - cache diff --git a/flutter_cache_manager_firebase/CHANGELOG.md b/flutter_cache_manager_firebase/CHANGELOG.md index 4c46c62e..2c1a7547 100644 --- a/flutter_cache_manager_firebase/CHANGELOG.md +++ b/flutter_cache_manager_firebase/CHANGELOG.md @@ -1,3 +1,6 @@ +## [2.0.3] - 2024-07-23 +* Updates dependencies ([#457](https://github.com/Baseflow/flutter_cache_manager/pull/457)) + ## [2.0.2] - 2024-04-25 * Updates dependencies to their latest versions. diff --git a/flutter_cache_manager_firebase/pubspec.yaml b/flutter_cache_manager_firebase/pubspec.yaml index f1c0aa1f..86489caa 100644 --- a/flutter_cache_manager_firebase/pubspec.yaml +++ b/flutter_cache_manager_firebase/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_cache_manager_firebase description: CacheManager implementation for firebase_storage. Uses the gs:// as key and translates to https:// -version: 2.0.2 +version: 2.0.3 homepage: https://github.com/Baseflow/flutter_cache_manager environment: From dd6c49276b3e91d580df430b438d67db8eef14e1 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 31 Jul 2024 19:51:39 +0200 Subject: [PATCH 13/53] Add icon --- icon.png | Bin 0 -> 41907 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 icon.png diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..06b5d15cb0456a73d6cbeb93f4d370d1d178967b GIT binary patch literal 41907 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 Date: Wed, 31 Jul 2024 20:17:31 +0200 Subject: [PATCH 14/53] Update ci --- .github/workflows/build.yaml | 99 ++++++++++++------- flutter_cache_manager/pubspec.yaml | 8 +- flutter_cache_manager/test/mock.mocks.dart | 45 ++++++++- flutter_cache_manager_firebase/pubspec.yaml | 6 +- .../flutter_cache_manager_firebase_test.dart | 2 - 5 files changed, 112 insertions(+), 48 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index c5c0ebcb..42cd3d98 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -4,13 +4,15 @@ name: build # events but only for the develop branch on: push: - branches: [ develop, master ] + branches: [develop, main] paths: - - 'flutter_cache_manager/**' + - "flutter_cache_manager/**" + - ".github/workflows/**" pull_request: - branches: [ develop ] + branches: [develop] paths: - - 'flutter_cache_manager/**' + - "flutter_cache_manager/**" + - ".github/workflows/**" # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: @@ -26,12 +28,15 @@ jobs: # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # Make sure the stable version of Flutter is available - - uses: subosito/flutter-action@v2 + - name: Set up Flutter + uses: subosito/flutter-action@v2 with: - channel: 'stable' + channel: "stable" + architecture: x64 + cache: true # Download all Flutter packages - name: Download dependencies @@ -55,12 +60,15 @@ jobs: # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # Make sure the stable version of Flutter is available - - uses: subosito/flutter-action@v2 + - name: Set up Flutter + uses: subosito/flutter-action@v2 with: - channel: 'stable' + channel: "stable" + architecture: x64 + cache: true # Download all Flutter packages - name: Download dependencies @@ -85,18 +93,21 @@ jobs: # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # Ensure correct JAVA version is installed. - - uses: actions/setup-java@v3 + - uses: actions/setup-java@v4 with: - distribution: 'zulu' - java-version: '17' + distribution: "zulu" + java-version: "17" # Make sure the stable version of Flutter is available - - uses: subosito/flutter-action@v2 + - name: Set up Flutter + uses: subosito/flutter-action@v2 with: - channel: 'stable' + channel: "stable" + architecture: x64 + cache: true # Download all Flutter packages - name: Download dependencies @@ -121,12 +132,15 @@ jobs: # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # Make sure the stable version of Flutter is available - - uses: subosito/flutter-action@v2 + - name: Set up Flutter + uses: subosito/flutter-action@v2 with: - channel: 'stable' + channel: "stable" + architecture: x64 + cache: true # Download all Flutter packages - name: Download dependencies @@ -151,12 +165,15 @@ jobs: # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # Make sure the stable version of Flutter is available - - uses: subosito/flutter-action@v2 + - name: Set up Flutter + uses: subosito/flutter-action@v2 with: - channel: 'stable' + channel: "stable" + architecture: x64 + cache: true # Enable platform support - name: Enable macOS @@ -186,12 +203,15 @@ jobs: # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # Make sure the stable version of Flutter is available - - uses: subosito/flutter-action@v2 + - name: Set up Flutter + uses: subosito/flutter-action@v2 with: - channel: 'stable' + channel: "stable" + architecture: x64 + cache: true # Enable platform support - name: Enable Windows @@ -225,12 +245,15 @@ jobs: - run: sudo apt-get install -y ninja-build libgtk-3-dev libblkid-dev # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # Make sure the stable version of Flutter is available - - uses: subosito/flutter-action@v2 + - name: Set up Flutter + uses: subosito/flutter-action@v2 with: - channel: 'stable' + channel: "stable" + architecture: x64 + cache: true # Enable platform support - name: Enable Linux @@ -265,12 +288,15 @@ jobs: # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # Make sure the stable version of Flutter is available - - uses: subosito/flutter-action@v2 + - name: Set up Flutter + uses: subosito/flutter-action@v2 with: - channel: 'stable' + channel: "stable" + architecture: x64 + cache: true # Download all Flutter packages - name: Download dependencies @@ -293,12 +319,15 @@ jobs: # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # Make sure the stable version of Flutter is available - - uses: subosito/flutter-action@v2 + - name: Set up Flutter + uses: subosito/flutter-action@v2 with: - channel: 'stable' + channel: "stable" + architecture: x64 + cache: true # Download all Flutter packages - name: Download dependencies @@ -311,7 +340,7 @@ jobs: working-directory: ${{env.source-directory}} # Upload code coverage information - - uses: codecov/codecov-action@v3 + - uses: codecov/codecov-action@v4 with: files: ${{env.source-directory}}/coverage/lcov.info name: CacheManager diff --git a/flutter_cache_manager/pubspec.yaml b/flutter_cache_manager/pubspec.yaml index d220e136..bb95c225 100644 --- a/flutter_cache_manager/pubspec.yaml +++ b/flutter_cache_manager/pubspec.yaml @@ -10,11 +10,11 @@ environment: dependencies: clock: ^1.1.1 - collection: ^1.16.0 + collection: ^1.18.0 file: ^7.0.0 flutter: sdk: flutter - http: ^1.1.0 + http: ^1.2.0 path: ^1.9.0 path_provider: ^2.1.2 rxdart: '>=0.27.7 <0.29.0' @@ -22,8 +22,8 @@ dependencies: uuid: ^4.4.0 dev_dependencies: - build_runner: ^2.4.0 - flutter_lints: ^3.0.2 + build_runner: ^2.4.11 + flutter_lints: ^4.0.0 flutter_test: sdk: flutter mockito: ^5.4.4 diff --git a/flutter_cache_manager/test/mock.mocks.dart b/flutter_cache_manager/test/mock.mocks.dart index 65312d65..4805ba49 100644 --- a/flutter_cache_manager/test/mock.mocks.dart +++ b/flutter_cache_manager/test/mock.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.2 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in flutter_cache_manager/test/mock.dart. // Do not manually edit this file. @@ -10,13 +10,16 @@ import 'package:flutter_cache_manager/src/cache_store.dart' as _i6; import 'package:flutter_cache_manager/src/storage/cache_object.dart' as _i2; import 'package:flutter_cache_manager/src/storage/file_system/file_system.dart' as _i3; -import 'package:flutter_cache_manager/src/web/web_helper.dart' as _i7; +import 'package:flutter_cache_manager/src/web/web_helper.dart' as _i8; import 'package:mockito/mockito.dart' as _i1; +import 'package:mockito/src/dummies.dart' as _i7; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters // ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member // ignore_for_file: prefer_const_constructors @@ -102,6 +105,7 @@ class MockCacheInfoRepositoryBase extends _i1.Mock ), returnValue: _i5.Future.value(false), ) as _i5.Future); + @override _i5.Future open() => (super.noSuchMethod( Invocation.method( @@ -110,6 +114,7 @@ class MockCacheInfoRepositoryBase extends _i1.Mock ), returnValue: _i5.Future.value(false), ) as _i5.Future); + @override _i5.Future updateOrInsert(_i2.CacheObject? cacheObject) => (super.noSuchMethod( @@ -119,6 +124,7 @@ class MockCacheInfoRepositoryBase extends _i1.Mock ), returnValue: _i5.Future.value(), ) as _i5.Future); + @override _i5.Future<_i2.CacheObject> insert( _i2.CacheObject? cacheObject, { @@ -139,6 +145,7 @@ class MockCacheInfoRepositoryBase extends _i1.Mock ), )), ) as _i5.Future<_i2.CacheObject>); + @override _i5.Future<_i2.CacheObject?> get(String? key) => (super.noSuchMethod( Invocation.method( @@ -147,6 +154,7 @@ class MockCacheInfoRepositoryBase extends _i1.Mock ), returnValue: _i5.Future<_i2.CacheObject?>.value(), ) as _i5.Future<_i2.CacheObject?>); + @override _i5.Future delete(int? id) => (super.noSuchMethod( Invocation.method( @@ -155,6 +163,7 @@ class MockCacheInfoRepositoryBase extends _i1.Mock ), returnValue: _i5.Future.value(0), ) as _i5.Future); + @override _i5.Future deleteAll(Iterable? ids) => (super.noSuchMethod( Invocation.method( @@ -163,6 +172,7 @@ class MockCacheInfoRepositoryBase extends _i1.Mock ), returnValue: _i5.Future.value(0), ) as _i5.Future); + @override _i5.Future update( _i2.CacheObject? cacheObject, { @@ -176,6 +186,7 @@ class MockCacheInfoRepositoryBase extends _i1.Mock ), returnValue: _i5.Future.value(0), ) as _i5.Future); + @override _i5.Future> getAllObjects() => (super.noSuchMethod( Invocation.method( @@ -185,6 +196,7 @@ class MockCacheInfoRepositoryBase extends _i1.Mock returnValue: _i5.Future>.value(<_i2.CacheObject>[]), ) as _i5.Future>); + @override _i5.Future> getObjectsOverCapacity(int? capacity) => (super.noSuchMethod( @@ -195,6 +207,7 @@ class MockCacheInfoRepositoryBase extends _i1.Mock returnValue: _i5.Future>.value(<_i2.CacheObject>[]), ) as _i5.Future>); + @override _i5.Future> getOldObjects(Duration? maxAge) => (super.noSuchMethod( @@ -205,6 +218,7 @@ class MockCacheInfoRepositoryBase extends _i1.Mock returnValue: _i5.Future>.value(<_i2.CacheObject>[]), ) as _i5.Future>); + @override _i5.Future close() => (super.noSuchMethod( Invocation.method( @@ -213,6 +227,7 @@ class MockCacheInfoRepositoryBase extends _i1.Mock ), returnValue: _i5.Future.value(false), ) as _i5.Future); + @override _i5.Future deleteDataFile() => (super.noSuchMethod( Invocation.method( @@ -240,6 +255,7 @@ class MockCacheStoreBase extends _i1.Mock implements _i6.CacheStore { Invocation.getter(#cleanupRunMinInterval), ), ) as Duration); + @override set cleanupRunMinInterval(Duration? _cleanupRunMinInterval) => super.noSuchMethod( @@ -249,6 +265,7 @@ class MockCacheStoreBase extends _i1.Mock implements _i6.CacheStore { ), returnValueForMissingStub: null, ); + @override _i3.FileSystem get fileSystem => (super.noSuchMethod( Invocation.getter(#fileSystem), @@ -257,6 +274,7 @@ class MockCacheStoreBase extends _i1.Mock implements _i6.CacheStore { Invocation.getter(#fileSystem), ), ) as _i3.FileSystem); + @override set fileSystem(_i3.FileSystem? _fileSystem) => super.noSuchMethod( Invocation.setter( @@ -265,6 +283,7 @@ class MockCacheStoreBase extends _i1.Mock implements _i6.CacheStore { ), returnValueForMissingStub: null, ); + @override DateTime get lastCleanupRun => (super.noSuchMethod( Invocation.getter(#lastCleanupRun), @@ -273,6 +292,7 @@ class MockCacheStoreBase extends _i1.Mock implements _i6.CacheStore { Invocation.getter(#lastCleanupRun), ), ) as DateTime); + @override set lastCleanupRun(DateTime? _lastCleanupRun) => super.noSuchMethod( Invocation.setter( @@ -281,11 +301,16 @@ class MockCacheStoreBase extends _i1.Mock implements _i6.CacheStore { ), returnValueForMissingStub: null, ); + @override String get storeKey => (super.noSuchMethod( Invocation.getter(#storeKey), - returnValue: '', + returnValue: _i7.dummyValue( + this, + Invocation.getter(#storeKey), + ), ) as String); + @override _i5.Future<_i4.FileInfo?> getFile( String? key, { @@ -299,6 +324,7 @@ class MockCacheStoreBase extends _i1.Mock implements _i6.CacheStore { ), returnValue: _i5.Future<_i4.FileInfo?>.value(), ) as _i5.Future<_i4.FileInfo?>); + @override _i5.Future putFile(_i2.CacheObject? cacheObject) => (super.noSuchMethod( Invocation.method( @@ -308,6 +334,7 @@ class MockCacheStoreBase extends _i1.Mock implements _i6.CacheStore { returnValue: _i5.Future.value(), returnValueForMissingStub: _i5.Future.value(), ) as _i5.Future); + @override _i5.Future<_i2.CacheObject?> retrieveCacheData( String? key, { @@ -321,6 +348,7 @@ class MockCacheStoreBase extends _i1.Mock implements _i6.CacheStore { ), returnValue: _i5.Future<_i2.CacheObject?>.value(), ) as _i5.Future<_i2.CacheObject?>); + @override _i5.Future<_i4.FileInfo?> getFileFromMemory(String? key) => (super.noSuchMethod( @@ -330,6 +358,7 @@ class MockCacheStoreBase extends _i1.Mock implements _i6.CacheStore { ), returnValue: _i5.Future<_i4.FileInfo?>.value(), ) as _i5.Future<_i4.FileInfo?>); + @override _i5.Future emptyCache() => (super.noSuchMethod( Invocation.method( @@ -339,6 +368,7 @@ class MockCacheStoreBase extends _i1.Mock implements _i6.CacheStore { returnValue: _i5.Future.value(), returnValueForMissingStub: _i5.Future.value(), ) as _i5.Future); + @override void emptyMemoryCache() => super.noSuchMethod( Invocation.method( @@ -347,6 +377,7 @@ class MockCacheStoreBase extends _i1.Mock implements _i6.CacheStore { ), returnValueForMissingStub: null, ); + @override _i5.Future removeCachedFile(_i2.CacheObject? cacheObject) => (super.noSuchMethod( @@ -357,6 +388,7 @@ class MockCacheStoreBase extends _i1.Mock implements _i6.CacheStore { returnValue: _i5.Future.value(), returnValueForMissingStub: _i5.Future.value(), ) as _i5.Future); + @override _i5.Future dispose() => (super.noSuchMethod( Invocation.method( @@ -381,6 +413,7 @@ class MockFileServiceBase extends _i1.Mock implements _i4.FileService { Invocation.getter(#concurrentFetches), returnValue: 0, ) as int); + @override set concurrentFetches(int? _concurrentFetches) => super.noSuchMethod( Invocation.setter( @@ -389,6 +422,7 @@ class MockFileServiceBase extends _i1.Mock implements _i4.FileService { ), returnValueForMissingStub: null, ); + @override _i5.Future<_i4.FileServiceResponse> get( String? url, { @@ -415,7 +449,7 @@ class MockFileServiceBase extends _i1.Mock implements _i4.FileService { /// A class which mocks [WebHelper]. /// /// See the documentation for Mockito's code generation for more information. -class MockWebHelper extends _i1.Mock implements _i7.WebHelper { +class MockWebHelper extends _i1.Mock implements _i8.WebHelper { MockWebHelper() { _i1.throwOnMissingStub(this); } @@ -428,11 +462,13 @@ class MockWebHelper extends _i1.Mock implements _i7.WebHelper { Invocation.getter(#fileFetcher), ), ) as _i4.FileService); + @override int get concurrentCalls => (super.noSuchMethod( Invocation.getter(#concurrentCalls), returnValue: 0, ) as int); + @override set concurrentCalls(int? _concurrentCalls) => super.noSuchMethod( Invocation.setter( @@ -441,6 +477,7 @@ class MockWebHelper extends _i1.Mock implements _i7.WebHelper { ), returnValueForMissingStub: null, ); + @override _i5.Stream<_i4.FileResponse> downloadFile( String? url, { diff --git a/flutter_cache_manager_firebase/pubspec.yaml b/flutter_cache_manager_firebase/pubspec.yaml index 86489caa..7924eaf8 100644 --- a/flutter_cache_manager_firebase/pubspec.yaml +++ b/flutter_cache_manager_firebase/pubspec.yaml @@ -9,12 +9,12 @@ environment: dependencies: flutter: sdk: flutter - flutter_cache_manager: ^3.3.2 - firebase_storage: '>=11.7.4 <13.0.0' + flutter_cache_manager: ^3.3.3 + firebase_storage: '>=12.0.0 <13.0.0' path_provider: ^2.1.2 path: ^1.9.0 dev_dependencies: - flutter_lints: ^3.0.2 + flutter_lints: ^4.0.0 flutter_test: sdk: flutter diff --git a/flutter_cache_manager_firebase/test/flutter_cache_manager_firebase_test.dart b/flutter_cache_manager_firebase/test/flutter_cache_manager_firebase_test.dart index d30207dd..ab73b3a2 100644 --- a/flutter_cache_manager_firebase/test/flutter_cache_manager_firebase_test.dart +++ b/flutter_cache_manager_firebase/test/flutter_cache_manager_firebase_test.dart @@ -1,3 +1 @@ - - void main() {} From 3c01adce47c76b427f1a31a6af6bbaf7d6e6624f Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 31 Jul 2024 20:20:36 +0200 Subject: [PATCH 15/53] Update sample --- flutter_cache_manager/example/.metadata | 36 ++++- .../example/android/app/build.gradle | 67 ++++---- .../android/app/src/main/AndroidManifest.xml | 12 ++ .../com/baseflow/example/MainActivity.kt | 6 - .../com/example/example/MainActivity.kt | 5 + .../example/android/build.gradle | 17 +- .../example/android/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../example/android/settings.gradle | 30 +++- .../ios/Flutter/AppFrameworkInfo.plist | 2 +- flutter_cache_manager/example/ios/Podfile | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 145 +++--------------- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../contents.xcworkspacedata | 3 - .../example/ios/Runner/AppDelegate.swift | 2 +- .../example/ios/Runner/Info.plist | 2 - .../macos/Runner.xcodeproj/project.pbxproj | 116 ++------------ .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../contents.xcworkspacedata | 3 - .../macos/Runner/Configs/AppInfo.xcconfig | 4 +- .../macos/RunnerTests/RunnerTests.swift | 2 +- flutter_cache_manager/example/web/index.html | 25 +-- .../example/web/manifest.json | 2 +- .../example/windows/CMakeLists.txt | 8 +- .../example/windows/flutter/CMakeLists.txt | 7 +- .../example/windows/runner/Runner.rc | 4 +- .../example/windows/runner/flutter_window.cpp | 5 + .../example/windows/runner/utils.cpp | 4 +- 28 files changed, 173 insertions(+), 344 deletions(-) delete mode 100644 flutter_cache_manager/example/android/app/src/main/kotlin/com/baseflow/example/MainActivity.kt create mode 100644 flutter_cache_manager/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt diff --git a/flutter_cache_manager/example/.metadata b/flutter_cache_manager/example/.metadata index a59942bf..8a0ce793 100644 --- a/flutter_cache_manager/example/.metadata +++ b/flutter_cache_manager/example/.metadata @@ -4,7 +4,39 @@ # This file should be version controlled and should not be manually edited. version: - revision: 6a3ff018b199a7febbe2b5adbb564081d8f49e2f - channel: dev + revision: "b0850beeb25f6d5b10426284f506557f66181b36" + channel: "stable" project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: b0850beeb25f6d5b10426284f506557f66181b36 + base_revision: b0850beeb25f6d5b10426284f506557f66181b36 + - platform: android + create_revision: b0850beeb25f6d5b10426284f506557f66181b36 + base_revision: b0850beeb25f6d5b10426284f506557f66181b36 + - platform: ios + create_revision: b0850beeb25f6d5b10426284f506557f66181b36 + base_revision: b0850beeb25f6d5b10426284f506557f66181b36 + - platform: macos + create_revision: b0850beeb25f6d5b10426284f506557f66181b36 + base_revision: b0850beeb25f6d5b10426284f506557f66181b36 + - platform: web + create_revision: b0850beeb25f6d5b10426284f506557f66181b36 + base_revision: b0850beeb25f6d5b10426284f506557f66181b36 + - platform: windows + create_revision: b0850beeb25f6d5b10426284f506557f66181b36 + base_revision: b0850beeb25f6d5b10426284f506557f66181b36 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/flutter_cache_manager/example/android/app/build.gradle b/flutter_cache_manager/example/android/app/build.gradle index 9192d00d..2a2d082b 100644 --- a/flutter_cache_manager/example/android/app/build.gradle +++ b/flutter_cache_manager/example/android/app/build.gradle @@ -1,69 +1,58 @@ +plugins { + id "com.android.application" + id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id "dev.flutter.flutter-gradle-plugin" +} + def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') +def localPropertiesFile = rootProject.file("local.properties") if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> + localPropertiesFile.withReader("UTF-8") { reader -> localProperties.load(reader) } } -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +def flutterVersionCode = localProperties.getProperty("flutter.versionCode") if (flutterVersionCode == null) { - flutterVersionCode = '1' + flutterVersionCode = "1" } -def flutterVersionName = localProperties.getProperty('flutter.versionName') +def flutterVersionName = localProperties.getProperty("flutter.versionName") if (flutterVersionName == null) { - flutterVersionName = '1.0' + flutterVersionName = "1.0" } -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - android { - namespace "com.baseflow.example" - compileSdkVersion 33 - ndkVersion flutter.ndkVersion + namespace = "com.example.example" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = '1.8' - } - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 } defaultConfig { - applicationId "com.baseflow.example" - minSdkVersion 21 - targetSdkVersion 33 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.example" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutterVersionCode.toInteger() + versionName = flutterVersionName } buildTypes { release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug + signingConfig = signingConfigs.debug } } } flutter { - source '../..' -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + source = "../.." } diff --git a/flutter_cache_manager/example/android/app/src/main/AndroidManifest.xml b/flutter_cache_manager/example/android/app/src/main/AndroidManifest.xml index 19b862ec..74a78b93 100644 --- a/flutter_cache_manager/example/android/app/src/main/AndroidManifest.xml +++ b/flutter_cache_manager/example/android/app/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ android:name=".MainActivity" android:exported="true" android:launchMode="singleTop" + android:taskAffinity="" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" @@ -30,4 +31,15 @@ android:name="flutterEmbedding" android:value="2" /> + + + + + + + diff --git a/flutter_cache_manager/example/android/app/src/main/kotlin/com/baseflow/example/MainActivity.kt b/flutter_cache_manager/example/android/app/src/main/kotlin/com/baseflow/example/MainActivity.kt deleted file mode 100644 index 1751a1f6..00000000 --- a/flutter_cache_manager/example/android/app/src/main/kotlin/com/baseflow/example/MainActivity.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.baseflow.example - -import io.flutter.embedding.android.FlutterActivity - -class MainActivity: FlutterActivity() { -} diff --git a/flutter_cache_manager/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/flutter_cache_manager/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt new file mode 100644 index 00000000..70f8f08f --- /dev/null +++ b/flutter_cache_manager/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt @@ -0,0 +1,5 @@ +package com.example.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() diff --git a/flutter_cache_manager/example/android/build.gradle b/flutter_cache_manager/example/android/build.gradle index ce647a43..d2ffbffa 100644 --- a/flutter_cache_manager/example/android/build.gradle +++ b/flutter_cache_manager/example/android/build.gradle @@ -1,16 +1,3 @@ -buildscript { - ext.kotlin_version = '1.7.10' - repositories { - google() - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:7.4.2' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - allprojects { repositories { google() @@ -18,12 +5,12 @@ allprojects { } } -rootProject.buildDir = '../build' +rootProject.buildDir = "../build" subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" } subprojects { - project.evaluationDependsOn(':app') + project.evaluationDependsOn(":app") } tasks.register("clean", Delete) { diff --git a/flutter_cache_manager/example/android/gradle.properties b/flutter_cache_manager/example/android/gradle.properties index 94adc3a3..3b5b324f 100644 --- a/flutter_cache_manager/example/android/gradle.properties +++ b/flutter_cache_manager/example/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx1536M +org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/flutter_cache_manager/example/android/gradle/wrapper/gradle-wrapper.properties b/flutter_cache_manager/example/android/gradle/wrapper/gradle-wrapper.properties index ceccc3a8..e1ca574e 100644 --- a/flutter_cache_manager/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/flutter_cache_manager/example/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip diff --git a/flutter_cache_manager/example/android/settings.gradle b/flutter_cache_manager/example/android/settings.gradle index 44e62bcf..536165d3 100644 --- a/flutter_cache_manager/example/android/settings.gradle +++ b/flutter_cache_manager/example/android/settings.gradle @@ -1,11 +1,25 @@ -include ':app' +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() -def localPropertiesFile = new File(rootProject.projectDir, "local.properties") -def properties = new Properties() + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") -assert localPropertiesFile.exists() -localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} -def flutterSdkPath = properties.getProperty("flutter.sdk") -assert flutterSdkPath != null, "flutter.sdk not set in local.properties" -apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.3.0" apply false + id "org.jetbrains.kotlin.android" version "1.7.10" apply false +} + +include ":app" diff --git a/flutter_cache_manager/example/ios/Flutter/AppFrameworkInfo.plist b/flutter_cache_manager/example/ios/Flutter/AppFrameworkInfo.plist index 9625e105..7c569640 100644 --- a/flutter_cache_manager/example/ios/Flutter/AppFrameworkInfo.plist +++ b/flutter_cache_manager/example/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 11.0 + 12.0 diff --git a/flutter_cache_manager/example/ios/Podfile b/flutter_cache_manager/example/ios/Podfile index fdcc671e..d97f17e2 100644 --- a/flutter_cache_manager/example/ios/Podfile +++ b/flutter_cache_manager/example/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '11.0' +# platform :ios, '12.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/flutter_cache_manager/example/ios/Runner.xcodeproj/project.pbxproj b/flutter_cache_manager/example/ios/Runner.xcodeproj/project.pbxproj index c75eb654..506236fe 100644 --- a/flutter_cache_manager/example/ios/Runner.xcodeproj/project.pbxproj +++ b/flutter_cache_manager/example/ios/Runner.xcodeproj/project.pbxproj @@ -14,8 +14,6 @@ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - A89E80E5C66383851D85960C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7704FAAF0269F6CE42DFB4D6 /* Pods_Runner.framework */; }; - F7BD10BFE0340F283E6E93AA /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A27122686E56836116819985 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,16 +42,11 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1FFD3A151B2AE9CB0F79637E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 28A91B98ACD307F50795CE63 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 2A5D500DD59C5ABD8BC320E9 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 2BDBBCDC95EE9D699340FEB0 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7704FAAF0269F6CE42DFB4D6 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; @@ -62,25 +55,13 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A27122686E56836116819985 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - BFBE6121C722D36CAD68B894 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - E65907C93E9A58DEA8ECEC68 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 0356ECBC3811FC8EF96B797F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - F7BD10BFE0340F283E6E93AA /* Pods_RunnerTests.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A89E80E5C66383851D85960C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -113,8 +94,6 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - F70FE31A2C97E1C947ACFAE4 /* Pods */, - F197309FCBE2E2C735CA3658 /* Frameworks */, ); sourceTree = ""; }; @@ -142,29 +121,6 @@ path = Runner; sourceTree = ""; }; - F197309FCBE2E2C735CA3658 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 7704FAAF0269F6CE42DFB4D6 /* Pods_Runner.framework */, - A27122686E56836116819985 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - F70FE31A2C97E1C947ACFAE4 /* Pods */ = { - isa = PBXGroup; - children = ( - 1FFD3A151B2AE9CB0F79637E /* Pods-Runner.debug.xcconfig */, - 2A5D500DD59C5ABD8BC320E9 /* Pods-Runner.release.xcconfig */, - 28A91B98ACD307F50795CE63 /* Pods-Runner.profile.xcconfig */, - 2BDBBCDC95EE9D699340FEB0 /* Pods-RunnerTests.debug.xcconfig */, - E65907C93E9A58DEA8ECEC68 /* Pods-RunnerTests.release.xcconfig */, - BFBE6121C722D36CAD68B894 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +128,8 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - A7C74AA6240117247B9AC070 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 0356ECBC3811FC8EF96B797F /* Frameworks */, ); buildRules = ( ); @@ -191,14 +145,12 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 62496165A00AB805F616810E /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - A9CBAD837CA4D9F4D3F704C5 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -215,7 +167,8 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1300; + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 331C8080294A63A400263BE5 = { @@ -285,28 +238,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 62496165A00AB805F616810E /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -322,45 +253,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - A7C74AA6240117247B9AC070 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - A9CBAD837CA4D9F4D3F704C5 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -415,6 +307,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -444,6 +337,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -452,7 +346,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -468,14 +362,14 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = NWAXZVJAA5; + DEVELOPMENT_TEAM = 6UEL98K25V; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.baseflow.example; + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -485,14 +379,13 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2BDBBCDC95EE9D699340FEB0 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.baseflow.example.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.example.example.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -503,14 +396,13 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E65907C93E9A58DEA8ECEC68 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.baseflow.example.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.example.example.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -519,14 +411,13 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BFBE6121C722D36CAD68B894 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.baseflow.example.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.example.example.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -537,6 +428,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -566,6 +458,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -580,7 +473,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -592,6 +485,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -621,6 +515,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -629,7 +524,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -647,14 +542,14 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = NWAXZVJAA5; + DEVELOPMENT_TEAM = 6UEL98K25V; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.baseflow.example; + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -670,14 +565,14 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = NWAXZVJAA5; + DEVELOPMENT_TEAM = 6UEL98K25V; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.baseflow.example; + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/flutter_cache_manager/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/flutter_cache_manager/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index e42adcb3..8e3ca5df 100644 --- a/flutter_cache_manager/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/flutter_cache_manager/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - diff --git a/flutter_cache_manager/example/ios/Runner/AppDelegate.swift b/flutter_cache_manager/example/ios/Runner/AppDelegate.swift index 70693e4a..9074fee9 100644 --- a/flutter_cache_manager/example/ios/Runner/AppDelegate.swift +++ b/flutter_cache_manager/example/ios/Runner/AppDelegate.swift @@ -1,5 +1,5 @@ -import UIKit import Flutter +import UIKit @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { diff --git a/flutter_cache_manager/example/ios/Runner/Info.plist b/flutter_cache_manager/example/ios/Runner/Info.plist index 7f553465..5458fc41 100644 --- a/flutter_cache_manager/example/ios/Runner/Info.plist +++ b/flutter_cache_manager/example/ios/Runner/Info.plist @@ -41,8 +41,6 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - UIViewControllerBasedStatusBarAppearance - CADisableMinimumFrameDurationOnPhone UIApplicationSupportsIndirectInputEvents diff --git a/flutter_cache_manager/example/macos/Runner.xcodeproj/project.pbxproj b/flutter_cache_manager/example/macos/Runner.xcodeproj/project.pbxproj index 41d3694e..daa7bf13 100644 --- a/flutter_cache_manager/example/macos/Runner.xcodeproj/project.pbxproj +++ b/flutter_cache_manager/example/macos/Runner.xcodeproj/project.pbxproj @@ -27,8 +27,6 @@ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - D5B01A320121EDFB3C6E5ACE /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC57B9A51BACFF27C67AB72D /* Pods_Runner.framework */; }; - ED974FA40384DB36751215A8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE2C8A8FDAE0A7FDAB1E4DBD /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,13 +60,11 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0F691A0E4B4C9F59E57294BC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 28DB72531F61FBC40F3CEDAA /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; - 33CC10ED2044A3C60003C045 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10ED2044A3C60003C045 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; @@ -80,14 +76,8 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 42144AD4456D168DBD9EA36B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 421819CD2EE32280AEA755EC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - BAD57FC1C963D684F07ED177 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - CC57B9A51BACFF27C67AB72D /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - DE2C8A8FDAE0A7FDAB1E4DBD /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FF9DC3FB6BB66E62F5038DE0 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +85,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - ED974FA40384DB36751215A8 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +92,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - D5B01A320121EDFB3C6E5ACE /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +125,6 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 82766BBE125D5C25EDDF556B /* Pods */, ); sourceTree = ""; }; @@ -185,25 +172,9 @@ path = Runner; sourceTree = ""; }; - 82766BBE125D5C25EDDF556B /* Pods */ = { - isa = PBXGroup; - children = ( - FF9DC3FB6BB66E62F5038DE0 /* Pods-Runner.debug.xcconfig */, - 421819CD2EE32280AEA755EC /* Pods-Runner.release.xcconfig */, - 0F691A0E4B4C9F59E57294BC /* Pods-Runner.profile.xcconfig */, - 42144AD4456D168DBD9EA36B /* Pods-RunnerTests.debug.xcconfig */, - BAD57FC1C963D684F07ED177 /* Pods-RunnerTests.release.xcconfig */, - 28DB72531F61FBC40F3CEDAA /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - CC57B9A51BACFF27C67AB72D /* Pods_Runner.framework */, - DE2C8A8FDAE0A7FDAB1E4DBD /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +186,6 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - D3A74C11E776FE7C8B976997 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +204,11 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 1F2AC582A47D8424DC730A99 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - D383C0B9CE6563DCF1551308 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -258,8 +226,9 @@ 33CC10E52044A3C60003C045 /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 331C80D4294CF70F00263BE5 = { @@ -322,28 +291,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 1F2AC582A47D8424DC730A99 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -382,45 +329,6 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - D383C0B9CE6563DCF1551308 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - D3A74C11E776FE7C8B976997 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -472,13 +380,12 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 42144AD4456D168DBD9EA36B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.baseflow.example.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.example.example.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/example"; @@ -487,13 +394,12 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BAD57FC1C963D684F07ED177 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.baseflow.example.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.example.example.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/example"; @@ -502,13 +408,12 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28DB72531F61FBC40F3CEDAA /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.baseflow.example.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.example.example.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/example"; @@ -520,6 +425,7 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -543,9 +449,11 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -593,6 +501,7 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -616,9 +525,11 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -646,6 +557,7 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -669,9 +581,11 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; diff --git a/flutter_cache_manager/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/flutter_cache_manager/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8fedab68..15368ecc 100644 --- a/flutter_cache_manager/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/flutter_cache_manager/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - diff --git a/flutter_cache_manager/example/macos/Runner/Configs/AppInfo.xcconfig b/flutter_cache_manager/example/macos/Runner/Configs/AppInfo.xcconfig index 8705ced4..92fb3cd5 100644 --- a/flutter_cache_manager/example/macos/Runner/Configs/AppInfo.xcconfig +++ b/flutter_cache_manager/example/macos/Runner/Configs/AppInfo.xcconfig @@ -8,7 +8,7 @@ PRODUCT_NAME = example // The application's bundle identifier -PRODUCT_BUNDLE_IDENTIFIER = com.baseflow.example +PRODUCT_BUNDLE_IDENTIFIER = com.example.example // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2023 com.baseflow. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. diff --git a/flutter_cache_manager/example/macos/RunnerTests/RunnerTests.swift b/flutter_cache_manager/example/macos/RunnerTests/RunnerTests.swift index 5418c9f5..61f3bd1f 100644 --- a/flutter_cache_manager/example/macos/RunnerTests/RunnerTests.swift +++ b/flutter_cache_manager/example/macos/RunnerTests/RunnerTests.swift @@ -1,5 +1,5 @@ -import FlutterMacOS import Cocoa +import FlutterMacOS import XCTest class RunnerTests: XCTestCase { diff --git a/flutter_cache_manager/example/web/index.html b/flutter_cache_manager/example/web/index.html index 8be2c326..1aa025dd 100644 --- a/flutter_cache_manager/example/web/index.html +++ b/flutter_cache_manager/example/web/index.html @@ -18,7 +18,7 @@ - + @@ -31,29 +31,8 @@ example - - - - - + diff --git a/flutter_cache_manager/example/web/manifest.json b/flutter_cache_manager/example/web/manifest.json index 94c8eb03..096edf8f 100644 --- a/flutter_cache_manager/example/web/manifest.json +++ b/flutter_cache_manager/example/web/manifest.json @@ -5,7 +5,7 @@ "display": "standalone", "background_color": "#0175C2", "theme_color": "#0175C2", - "description": "A project that showcases usage of flutter_cache_manager", + "description": "A new Flutter project.", "orientation": "portrait-primary", "prefer_related_applications": false, "icons": [ diff --git a/flutter_cache_manager/example/windows/CMakeLists.txt b/flutter_cache_manager/example/windows/CMakeLists.txt index 13786727..d960948a 100644 --- a/flutter_cache_manager/example/windows/CMakeLists.txt +++ b/flutter_cache_manager/example/windows/CMakeLists.txt @@ -8,7 +8,7 @@ set(BINARY_NAME "example") # Explicitly opt in to modern CMake behaviors to avoid warnings with recent # versions of CMake. -cmake_policy(SET CMP0063 NEW) +cmake_policy(VERSION 3.14...3.25) # Define build configuration option. get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) @@ -87,6 +87,12 @@ if(PLUGIN_BUNDLED_LIBRARIES) COMPONENT Runtime) endif() +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + # Fully re-copy the assets directory on each build to avoid having stale files # from a previous install. set(FLUTTER_ASSET_DIR_NAME "flutter_assets") diff --git a/flutter_cache_manager/example/windows/flutter/CMakeLists.txt b/flutter_cache_manager/example/windows/flutter/CMakeLists.txt index 930d2071..903f4899 100644 --- a/flutter_cache_manager/example/windows/flutter/CMakeLists.txt +++ b/flutter_cache_manager/example/windows/flutter/CMakeLists.txt @@ -10,6 +10,11 @@ include(${EPHEMERAL_DIR}/generated_config.cmake) # https://github.com/flutter/flutter/issues/57146. set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + # === Flutter Library === set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") @@ -92,7 +97,7 @@ add_custom_command( COMMAND ${CMAKE_COMMAND} -E env ${FLUTTER_TOOL_ENVIRONMENT} "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" - windows-x64 $ + ${FLUTTER_TARGET_PLATFORM} $ VERBATIM ) add_custom_target(flutter_assemble DEPENDS diff --git a/flutter_cache_manager/example/windows/runner/Runner.rc b/flutter_cache_manager/example/windows/runner/Runner.rc index bae43fce..687e6bd2 100644 --- a/flutter_cache_manager/example/windows/runner/Runner.rc +++ b/flutter_cache_manager/example/windows/runner/Runner.rc @@ -89,11 +89,11 @@ BEGIN BEGIN BLOCK "040904e4" BEGIN - VALUE "CompanyName", "com.baseflow" "\0" + VALUE "CompanyName", "com.example" "\0" VALUE "FileDescription", "example" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "InternalName", "example" "\0" - VALUE "LegalCopyright", "Copyright (C) 2023 com.baseflow. All rights reserved." "\0" + VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" VALUE "OriginalFilename", "example.exe" "\0" VALUE "ProductName", "example" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" diff --git a/flutter_cache_manager/example/windows/runner/flutter_window.cpp b/flutter_cache_manager/example/windows/runner/flutter_window.cpp index b25e363e..955ee303 100644 --- a/flutter_cache_manager/example/windows/runner/flutter_window.cpp +++ b/flutter_cache_manager/example/windows/runner/flutter_window.cpp @@ -31,6 +31,11 @@ bool FlutterWindow::OnCreate() { this->Show(); }); + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + return true; } diff --git a/flutter_cache_manager/example/windows/runner/utils.cpp b/flutter_cache_manager/example/windows/runner/utils.cpp index b2b08734..3a0b4651 100644 --- a/flutter_cache_manager/example/windows/runner/utils.cpp +++ b/flutter_cache_manager/example/windows/runner/utils.cpp @@ -45,13 +45,13 @@ std::string Utf8FromUtf16(const wchar_t* utf16_string) { if (utf16_string == nullptr) { return std::string(); } - int target_length = ::WideCharToMultiByte( + unsigned int target_length = ::WideCharToMultiByte( CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, -1, nullptr, 0, nullptr, nullptr) -1; // remove the trailing null character int input_length = (int)wcslen(utf16_string); std::string utf8_string; - if (target_length <= 0 || target_length > utf8_string.max_size()) { + if (target_length == 0 || target_length > utf8_string.max_size()) { return utf8_string; } utf8_string.resize(target_length); From 8027df2c2d29990ea62d8d30d8f87934ef99ae1a Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 31 Jul 2024 20:22:35 +0200 Subject: [PATCH 16/53] Disable --- .github/workflows/build.yaml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 42cd3d98..977a0797 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -339,9 +339,11 @@ jobs: run: flutter test --coverage working-directory: ${{env.source-directory}} - # Upload code coverage information - - uses: codecov/codecov-action@v4 - with: - files: ${{env.source-directory}}/coverage/lcov.info - name: CacheManager - fail_ci_if_error: true + # # Upload code coverage information + # - uses: codecov/codecov-action@v4 + # env: + # CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + # with: + # files: ${{env.source-directory}}/coverage/lcov.info + # name: CacheManager + # fail_ci_if_error: true From 6cd8334ada548be283fd6a37923fa875601b44cd Mon Sep 17 00:00:00 2001 From: Vinicius Teixeira Date: Fri, 10 Dec 2021 15:47:39 -0300 Subject: [PATCH 17/53] expose memoryCacheContainsKey method from cache_store --- .../lib/src/cache_store.dart | 4 + .../test/cache_store_test.dart | 87 +++++++++---------- 2 files changed, 44 insertions(+), 47 deletions(-) diff --git a/flutter_cache_manager/lib/src/cache_store.dart b/flutter_cache_manager/lib/src/cache_store.dart index 395e3eaf..2d755853 100644 --- a/flutter_cache_manager/lib/src/cache_store.dart +++ b/flutter_cache_manager/lib/src/cache_store.dart @@ -188,6 +188,10 @@ class CacheStore { } } + bool memoryCacheContainsKey(String key) { + return _memCache.containsKey(key); + } + Future dispose() async { final provider = await _cacheInfoRepository; await provider.close(); diff --git a/flutter_cache_manager/test/cache_store_test.dart b/flutter_cache_manager/test/cache_store_test.dart index 93a8bd7b..dddb06db 100644 --- a/flutter_cache_manager/test/cache_store_test.dart +++ b/flutter_cache_manager/test/cache_store_test.dart @@ -110,6 +110,23 @@ void main() { await store.getFile(fileUrl); expect(await store.getFileFromMemory(fileUrl), isNotNull); }); + + test( + 'Store.memoryCacheContainsKey should return true if the key is present in the memory cache', + () async { + var config = createTestConfig(); + var store = CacheStore(config); + + var cacheObject = CacheObject( + 'baseflow.com/test.png', + relativePath: 'testimage.png', + validTill: clock.now().add(const Duration(days: 7)), + ); + await store.putFile(cacheObject); + + expect(store.memoryCacheContainsKey('baseflow.com/test.png'), true); + expect(store.memoryCacheContainsKey('unseen-file'), false); + }); }); group('Storing files in store', () { @@ -127,9 +144,7 @@ void main() { verify(config.repo.updateOrInsert(cacheObject)).called(1); }); - test( - 'Store should store fileinfo in repo and id should be available afterwards', - () async { + test('Store should store fileinfo in repo and id should be available afterwards', () async { var config = createTestConfig(); var cacheObject = CacheObject( @@ -174,8 +189,7 @@ void main() { ); await store.removeCachedFile(cacheObject); - verify(config.mockRepo.deleteAll(argThat(contains(cacheObject.id)))) - .called(1); + verify(config.mockRepo.deleteAll(argThat(contains(cacheObject.id)))).called(1); }); test('Store should remove file over capacity', () async { @@ -191,20 +205,16 @@ void main() { ); await config.returnsFile('testimage.png'); - when(config.mockRepo.getObjectsOverCapacity(any)) - .thenAnswer((_) => Future.value([cacheObject])); - when(config.mockRepo.getOldObjects(any)) - .thenAnswer((_) => Future.value([])); - when(config.mockRepo.get('baseflow.com/test.png')) - .thenAnswer((_) => Future.value(cacheObject)); + when(config.mockRepo.getObjectsOverCapacity(any)).thenAnswer((_) => Future.value([cacheObject])); + when(config.mockRepo.getOldObjects(any)).thenAnswer((_) => Future.value([])); + when(config.mockRepo.get('baseflow.com/test.png')).thenAnswer((_) => Future.value(cacheObject)); expect(await store.getFile('baseflow.com/test.png'), isNotNull); await untilCalled(config.mockRepo.deleteAll(any)); verify(config.mockRepo.getObjectsOverCapacity(any)).called(1); - verify(config.mockRepo.deleteAll(argThat(contains(cacheObject.id)))) - .called(1); + verify(config.mockRepo.deleteAll(argThat(contains(cacheObject.id)))).called(1); }); test('Store should remove file over that are too old', () async { @@ -220,20 +230,16 @@ void main() { validTill: clock.now().add(const Duration(days: 7)), ); - when(config.mockRepo.getObjectsOverCapacity(any)) - .thenAnswer((_) => Future.value([])); - when(config.mockRepo.getOldObjects(any)) - .thenAnswer((_) => Future.value([cacheObject])); - when(config.mockRepo.get('baseflow.com/test.png')) - .thenAnswer((_) => Future.value(cacheObject)); + when(config.mockRepo.getObjectsOverCapacity(any)).thenAnswer((_) => Future.value([])); + when(config.mockRepo.getOldObjects(any)).thenAnswer((_) => Future.value([cacheObject])); + when(config.mockRepo.get('baseflow.com/test.png')).thenAnswer((_) => Future.value(cacheObject)); expect(await store.getFile('baseflow.com/test.png'), isNotNull); await untilCalled(config.mockRepo.deleteAll(any)); verify(config.mockRepo.getOldObjects(any)).called(1); - verify(config.mockRepo.deleteAll(argThat(contains(cacheObject.id)))) - .called(1); + verify(config.mockRepo.deleteAll(argThat(contains(cacheObject.id)))).called(1); }); test('Store should remove file old and over capacity', () async { @@ -249,12 +255,9 @@ void main() { validTill: clock.now().add(const Duration(days: 7)), ); - when(config.mockRepo.getObjectsOverCapacity(any)) - .thenAnswer((_) => Future.value([cacheObject])); - when(config.mockRepo.getOldObjects(any)) - .thenAnswer((_) => Future.value([cacheObject])); - when(config.mockRepo.get('baseflow.com/test.png')) - .thenAnswer((_) => Future.value(cacheObject)); + when(config.mockRepo.getObjectsOverCapacity(any)).thenAnswer((_) => Future.value([cacheObject])); + when(config.mockRepo.getOldObjects(any)).thenAnswer((_) => Future.value([cacheObject])); + when(config.mockRepo.get('baseflow.com/test.png')).thenAnswer((_) => Future.value(cacheObject)); expect(await store.getFile('baseflow.com/test.png'), isNotNull); @@ -263,8 +266,7 @@ void main() { verify(config.mockRepo.getObjectsOverCapacity(any)).called(1); verify(config.mockRepo.getOldObjects(any)).called(1); - verify(config.mockRepo.deleteAll(argThat(contains(cacheObject.id)))) - .called(1); + verify(config.mockRepo.deleteAll(argThat(contains(cacheObject.id)))).called(1); }); test('Store should recheck cache info when file is removed', () async { @@ -280,20 +282,16 @@ void main() { validTill: clock.now().add(const Duration(days: 7)), ); - when(config.mockRepo.getObjectsOverCapacity(any)) - .thenAnswer((_) => Future.value([])); - when(config.mockRepo.getOldObjects(any)) - .thenAnswer((_) => Future.value([])); - when(config.mockRepo.get('baseflow.com/test.png')) - .thenAnswer((_) => Future.value(cacheObject)); + when(config.mockRepo.getObjectsOverCapacity(any)).thenAnswer((_) => Future.value([])); + when(config.mockRepo.getOldObjects(any)).thenAnswer((_) => Future.value([])); + when(config.mockRepo.get('baseflow.com/test.png')).thenAnswer((_) => Future.value(cacheObject)); expect(await store.getFile('baseflow.com/test.png'), isNotNull); await file.delete(); expect(await store.getFile('baseflow.com/test.png'), isNull); }); - test('Store should not remove files that are not old or over capacity', - () async { + test('Store should not remove files that are not old or over capacity', () async { var config = createTestConfig(); var store = CacheStore(config); store.cleanupRunMinInterval = const Duration(milliseconds: 1); @@ -306,12 +304,9 @@ void main() { validTill: clock.now().add(const Duration(days: 7)), ); - when(config.mockRepo.getObjectsOverCapacity(any)) - .thenAnswer((_) => Future.value([])); - when(config.mockRepo.getOldObjects(any)) - .thenAnswer((_) => Future.value([])); - when(config.mockRepo.get('baseflow.com/test.png')) - .thenAnswer((_) => Future.value(cacheObject)); + when(config.mockRepo.getObjectsOverCapacity(any)).thenAnswer((_) => Future.value([])); + when(config.mockRepo.getOldObjects(any)).thenAnswer((_) => Future.value([])); + when(config.mockRepo.get('baseflow.com/test.png')).thenAnswer((_) => Future.value(cacheObject)); expect(await store.getFile('baseflow.com/test.png'), isNotNull); @@ -346,13 +341,11 @@ void main() { validTill: clock.now().add(const Duration(days: 7)), ); - when(config.mockRepo.getAllObjects()) - .thenAnswer((_) => Future.value([co1, co2, co3])); + when(config.mockRepo.getAllObjects()).thenAnswer((_) => Future.value([co1, co2, co3])); await store.emptyCache(); - verify(config.mockRepo - .deleteAll(argThat(containsAll([co1.id, co2.id, co3.id])))).called(1); + verify(config.mockRepo.deleteAll(argThat(containsAll([co1.id, co2.id, co3.id])))).called(1); }); }); } From 9dd7c8c7527c3d29eea28715b437c941219160fb Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 31 Jul 2024 21:29:45 +0200 Subject: [PATCH 18/53] Format --- .../test/cache_store_test.dart | 70 +++++++++++++------ 1 file changed, 47 insertions(+), 23 deletions(-) diff --git a/flutter_cache_manager/test/cache_store_test.dart b/flutter_cache_manager/test/cache_store_test.dart index dddb06db..b440164c 100644 --- a/flutter_cache_manager/test/cache_store_test.dart +++ b/flutter_cache_manager/test/cache_store_test.dart @@ -144,7 +144,9 @@ void main() { verify(config.repo.updateOrInsert(cacheObject)).called(1); }); - test('Store should store fileinfo in repo and id should be available afterwards', () async { + test( + 'Store should store fileinfo in repo and id should be available afterwards', + () async { var config = createTestConfig(); var cacheObject = CacheObject( @@ -189,7 +191,8 @@ void main() { ); await store.removeCachedFile(cacheObject); - verify(config.mockRepo.deleteAll(argThat(contains(cacheObject.id)))).called(1); + verify(config.mockRepo.deleteAll(argThat(contains(cacheObject.id)))) + .called(1); }); test('Store should remove file over capacity', () async { @@ -205,16 +208,20 @@ void main() { ); await config.returnsFile('testimage.png'); - when(config.mockRepo.getObjectsOverCapacity(any)).thenAnswer((_) => Future.value([cacheObject])); - when(config.mockRepo.getOldObjects(any)).thenAnswer((_) => Future.value([])); - when(config.mockRepo.get('baseflow.com/test.png')).thenAnswer((_) => Future.value(cacheObject)); + when(config.mockRepo.getObjectsOverCapacity(any)) + .thenAnswer((_) => Future.value([cacheObject])); + when(config.mockRepo.getOldObjects(any)) + .thenAnswer((_) => Future.value([])); + when(config.mockRepo.get('baseflow.com/test.png')) + .thenAnswer((_) => Future.value(cacheObject)); expect(await store.getFile('baseflow.com/test.png'), isNotNull); await untilCalled(config.mockRepo.deleteAll(any)); verify(config.mockRepo.getObjectsOverCapacity(any)).called(1); - verify(config.mockRepo.deleteAll(argThat(contains(cacheObject.id)))).called(1); + verify(config.mockRepo.deleteAll(argThat(contains(cacheObject.id)))) + .called(1); }); test('Store should remove file over that are too old', () async { @@ -230,16 +237,20 @@ void main() { validTill: clock.now().add(const Duration(days: 7)), ); - when(config.mockRepo.getObjectsOverCapacity(any)).thenAnswer((_) => Future.value([])); - when(config.mockRepo.getOldObjects(any)).thenAnswer((_) => Future.value([cacheObject])); - when(config.mockRepo.get('baseflow.com/test.png')).thenAnswer((_) => Future.value(cacheObject)); + when(config.mockRepo.getObjectsOverCapacity(any)) + .thenAnswer((_) => Future.value([])); + when(config.mockRepo.getOldObjects(any)) + .thenAnswer((_) => Future.value([cacheObject])); + when(config.mockRepo.get('baseflow.com/test.png')) + .thenAnswer((_) => Future.value(cacheObject)); expect(await store.getFile('baseflow.com/test.png'), isNotNull); await untilCalled(config.mockRepo.deleteAll(any)); verify(config.mockRepo.getOldObjects(any)).called(1); - verify(config.mockRepo.deleteAll(argThat(contains(cacheObject.id)))).called(1); + verify(config.mockRepo.deleteAll(argThat(contains(cacheObject.id)))) + .called(1); }); test('Store should remove file old and over capacity', () async { @@ -255,9 +266,12 @@ void main() { validTill: clock.now().add(const Duration(days: 7)), ); - when(config.mockRepo.getObjectsOverCapacity(any)).thenAnswer((_) => Future.value([cacheObject])); - when(config.mockRepo.getOldObjects(any)).thenAnswer((_) => Future.value([cacheObject])); - when(config.mockRepo.get('baseflow.com/test.png')).thenAnswer((_) => Future.value(cacheObject)); + when(config.mockRepo.getObjectsOverCapacity(any)) + .thenAnswer((_) => Future.value([cacheObject])); + when(config.mockRepo.getOldObjects(any)) + .thenAnswer((_) => Future.value([cacheObject])); + when(config.mockRepo.get('baseflow.com/test.png')) + .thenAnswer((_) => Future.value(cacheObject)); expect(await store.getFile('baseflow.com/test.png'), isNotNull); @@ -266,7 +280,8 @@ void main() { verify(config.mockRepo.getObjectsOverCapacity(any)).called(1); verify(config.mockRepo.getOldObjects(any)).called(1); - verify(config.mockRepo.deleteAll(argThat(contains(cacheObject.id)))).called(1); + verify(config.mockRepo.deleteAll(argThat(contains(cacheObject.id)))) + .called(1); }); test('Store should recheck cache info when file is removed', () async { @@ -282,16 +297,20 @@ void main() { validTill: clock.now().add(const Duration(days: 7)), ); - when(config.mockRepo.getObjectsOverCapacity(any)).thenAnswer((_) => Future.value([])); - when(config.mockRepo.getOldObjects(any)).thenAnswer((_) => Future.value([])); - when(config.mockRepo.get('baseflow.com/test.png')).thenAnswer((_) => Future.value(cacheObject)); + when(config.mockRepo.getObjectsOverCapacity(any)) + .thenAnswer((_) => Future.value([])); + when(config.mockRepo.getOldObjects(any)) + .thenAnswer((_) => Future.value([])); + when(config.mockRepo.get('baseflow.com/test.png')) + .thenAnswer((_) => Future.value(cacheObject)); expect(await store.getFile('baseflow.com/test.png'), isNotNull); await file.delete(); expect(await store.getFile('baseflow.com/test.png'), isNull); }); - test('Store should not remove files that are not old or over capacity', () async { + test('Store should not remove files that are not old or over capacity', + () async { var config = createTestConfig(); var store = CacheStore(config); store.cleanupRunMinInterval = const Duration(milliseconds: 1); @@ -304,9 +323,12 @@ void main() { validTill: clock.now().add(const Duration(days: 7)), ); - when(config.mockRepo.getObjectsOverCapacity(any)).thenAnswer((_) => Future.value([])); - when(config.mockRepo.getOldObjects(any)).thenAnswer((_) => Future.value([])); - when(config.mockRepo.get('baseflow.com/test.png')).thenAnswer((_) => Future.value(cacheObject)); + when(config.mockRepo.getObjectsOverCapacity(any)) + .thenAnswer((_) => Future.value([])); + when(config.mockRepo.getOldObjects(any)) + .thenAnswer((_) => Future.value([])); + when(config.mockRepo.get('baseflow.com/test.png')) + .thenAnswer((_) => Future.value(cacheObject)); expect(await store.getFile('baseflow.com/test.png'), isNotNull); @@ -341,11 +363,13 @@ void main() { validTill: clock.now().add(const Duration(days: 7)), ); - when(config.mockRepo.getAllObjects()).thenAnswer((_) => Future.value([co1, co2, co3])); + when(config.mockRepo.getAllObjects()) + .thenAnswer((_) => Future.value([co1, co2, co3])); await store.emptyCache(); - verify(config.mockRepo.deleteAll(argThat(containsAll([co1.id, co2.id, co3.id])))).called(1); + verify(config.mockRepo + .deleteAll(argThat(containsAll([co1.id, co2.id, co3.id])))).called(1); }); }); } From c8567c8a939469fa772d11e54a9189ae79fa7da3 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 31 Jul 2024 21:40:51 +0200 Subject: [PATCH 19/53] Update pubspec.yaml --- flutter_cache_manager/pubspec.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/flutter_cache_manager/pubspec.yaml b/flutter_cache_manager/pubspec.yaml index e8dc06e9..c0a8e293 100644 --- a/flutter_cache_manager/pubspec.yaml +++ b/flutter_cache_manager/pubspec.yaml @@ -27,7 +27,6 @@ dev_dependencies: flutter_test: sdk: flutter mockito: ^5.4.4 - flutter_lints: ^1.0.4 platforms: android: From 472c8e1cf04997029b904022c5fa0e56adc71087 Mon Sep 17 00:00:00 2001 From: Mateus Siqueira <54752439+mateussiqueira@users.noreply.github.com> Date: Tue, 26 Jul 2022 10:06:04 -0300 Subject: [PATCH 20/53] ensure Store return null if file is not cached --- .../.flutter-plugins-dependencies | 1 + .../lib/generated_plugin_registrant.dart | 17 ++++++++ .../lib/src/cache_store.dart | 6 ++- .../test/cache_store_test.dart | 43 +++++++++++++++++++ 4 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 flutter_cache_manager/.flutter-plugins-dependencies create mode 100644 flutter_cache_manager/example/lib/generated_plugin_registrant.dart diff --git a/flutter_cache_manager/.flutter-plugins-dependencies b/flutter_cache_manager/.flutter-plugins-dependencies new file mode 100644 index 00000000..78f9fd4c --- /dev/null +++ b/flutter_cache_manager/.flutter-plugins-dependencies @@ -0,0 +1 @@ +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider_ios","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/path_provider_ios-2.0.10/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/sqflite-2.0.3/","native_build":true,"dependencies":[]}],"android":[{"name":"path_provider_android","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/path_provider_android-2.0.16/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/sqflite-2.0.3/","native_build":true,"dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.6/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/sqflite-2.0.3/","native_build":true,"dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.7/","native_build":false,"dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.1.0/","native_build":false,"dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"path_provider","dependencies":["path_provider_android","path_provider_ios","path_provider_linux","path_provider_macos","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_ios","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"sqflite","dependencies":[]}],"date_created":"2022-07-26 10:05:46.413539","version":"3.0.4"} \ No newline at end of file diff --git a/flutter_cache_manager/example/lib/generated_plugin_registrant.dart b/flutter_cache_manager/example/lib/generated_plugin_registrant.dart new file mode 100644 index 00000000..40a0d005 --- /dev/null +++ b/flutter_cache_manager/example/lib/generated_plugin_registrant.dart @@ -0,0 +1,17 @@ +// +// Generated file. Do not edit. +// + +// ignore_for_file: directives_ordering +// ignore_for_file: lines_longer_than_80_chars +// ignore_for_file: depend_on_referenced_packages + +import 'package:url_launcher_web/url_launcher_web.dart'; + +import 'package:flutter_web_plugins/flutter_web_plugins.dart'; + +// ignore: public_member_api_docs +void registerPlugins(Registrar registrar) { + UrlLauncherPlugin.registerWith(registrar); + registrar.registerMessageHandler(); +} diff --git a/flutter_cache_manager/lib/src/cache_store.dart b/flutter_cache_manager/lib/src/cache_store.dart index c213b144..dca3a648 100644 --- a/flutter_cache_manager/lib/src/cache_store.dart +++ b/flutter_cache_manager/lib/src/cache_store.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; +import 'dart:io' as io; import 'package:flutter_cache_manager/src/storage/file_system/file_system.dart'; ///Flutter Cache Manager @@ -181,8 +182,9 @@ class CacheStore { if (_futureCache.containsKey(cacheObject.key)) { _futureCache.remove(cacheObject.key); } - final file = await fileSystem.createFile(cacheObject.relativePath); - if (await file.exists()) { + final file = io.File(cacheObject.relativePath); + + if (file.existsSync()) { await file.delete(); } } diff --git a/flutter_cache_manager/test/cache_store_test.dart b/flutter_cache_manager/test/cache_store_test.dart index b440164c..6767d453 100644 --- a/flutter_cache_manager/test/cache_store_test.dart +++ b/flutter_cache_manager/test/cache_store_test.dart @@ -11,6 +11,27 @@ import 'helpers/mock_cache_info_repository.dart'; import 'helpers/test_configuration.dart'; void main() { + late int fileId; + late String fileName; + late String fileUrl; + late DateTime validTill; + + late CacheObject cacheObject; + + setUp(() { + fileId = 666; + fileName = 'testimage.png'; + fileUrl = 'baseflow.com/test.png'; + validTill = DateTime(2017, 9, 7, 17, 30); + + cacheObject = CacheObject( + fileUrl, + relativePath: fileName, + id: fileId, + validTill: validTill, + ); + }); + group('Retrieving files from store', () { test('Store should return null when file not cached', () async { var repo = MockCacheInfoRepository(); @@ -36,6 +57,28 @@ void main() { expect(await store.getFile('baseflow.com/test.png'), isNotNull); }); + test('Store should return null if file is not cached', () async { + var config = createTestConfig(); + await config.returnsFile(fileName); + config.returnsCacheObject(fileUrl, fileName, validTill, + id: fileId, key: fileUrl); + + var tempDir = createDir(); + await (await tempDir).childFile('testimage.png').create(); + + final store = CacheStore(config); + + final _results = Future.wait([ + store.removeCachedFile(cacheObject), + store.removeCachedFile(cacheObject), + ]); + + expect( + () => _results, + returnsNormally, + ); + }); + test('Store should return null when file is no longer cached', () async { var repo = MockCacheInfoRepository(); From 1f72221093a8addd49a6f115646fc330e2546dc1 Mon Sep 17 00:00:00 2001 From: Mateus Siqueira <54752439+mateussiqueira@users.noreply.github.com> Date: Tue, 26 Jul 2022 10:06:34 -0300 Subject: [PATCH 21/53] move const values to the setup --- flutter_cache_manager/.flutter-plugins-dependencies | 2 +- flutter_cache_manager/test/cache_store_test.dart | 12 ------------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/flutter_cache_manager/.flutter-plugins-dependencies b/flutter_cache_manager/.flutter-plugins-dependencies index 78f9fd4c..903a165c 100644 --- a/flutter_cache_manager/.flutter-plugins-dependencies +++ b/flutter_cache_manager/.flutter-plugins-dependencies @@ -1 +1 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider_ios","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/path_provider_ios-2.0.10/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/sqflite-2.0.3/","native_build":true,"dependencies":[]}],"android":[{"name":"path_provider_android","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/path_provider_android-2.0.16/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/sqflite-2.0.3/","native_build":true,"dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.6/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/sqflite-2.0.3/","native_build":true,"dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.7/","native_build":false,"dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.1.0/","native_build":false,"dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"path_provider","dependencies":["path_provider_android","path_provider_ios","path_provider_linux","path_provider_macos","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_ios","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"sqflite","dependencies":[]}],"date_created":"2022-07-26 10:05:46.413539","version":"3.0.4"} \ No newline at end of file +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider_ios","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/path_provider_ios-2.0.10/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/sqflite-2.0.3/","native_build":true,"dependencies":[]}],"android":[{"name":"path_provider_android","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/path_provider_android-2.0.16/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/sqflite-2.0.3/","native_build":true,"dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.6/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/sqflite-2.0.3/","native_build":true,"dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.7/","native_build":false,"dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.1.0/","native_build":false,"dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"path_provider","dependencies":["path_provider_android","path_provider_ios","path_provider_linux","path_provider_macos","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_ios","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"sqflite","dependencies":[]}],"date_created":"2022-07-26 10:06:23.183472","version":"3.0.4"} \ No newline at end of file diff --git a/flutter_cache_manager/test/cache_store_test.dart b/flutter_cache_manager/test/cache_store_test.dart index 6767d453..bdb35c75 100644 --- a/flutter_cache_manager/test/cache_store_test.dart +++ b/flutter_cache_manager/test/cache_store_test.dart @@ -42,9 +42,6 @@ void main() { }); test('Store should return FileInfo when file is cached', () async { - var fileName = 'testimage.png'; - var fileUrl = 'baseflow.com/test.png'; - var config = createTestConfig(); await config.returnsFile(fileName); config.returnsCacheObject(fileUrl, fileName, DateTime.now()); @@ -102,9 +99,6 @@ void main() { }); test('Store should return CacheInfo when file is cached', () async { - var fileName = 'testimage.png'; - var fileUrl = 'baseflow.com/test.png'; - var config = createTestConfig(); await config.returnsFile(fileName); config.returnsCacheObject(fileUrl, fileName, DateTime.now(), id: 1); @@ -117,8 +111,6 @@ void main() { test('Store should return CacheInfo from memory when asked twice', () async { - var fileName = 'testimage.png'; - var fileUrl = 'baseflow.com/test.png'; var validTill = DateTime.now(); var config = createTestConfig(); @@ -139,8 +131,6 @@ void main() { test( 'Store should return File from memcache only when file is retrieved before', () async { - var fileName = 'testimage.png'; - var fileUrl = 'baseflow.com/test.png'; var validTill = DateTime.now(); var config = createTestConfig(); @@ -215,8 +205,6 @@ void main() { group('Removing files in store', () { test('Store should remove fileinfo from repo on delete', () async { - var fileName = 'testimage.png'; - var fileUrl = 'baseflow.com/test.png'; var validTill = DateTime.now(); var config = createTestConfig(); From d569cead12988737bf18217ede9db5401ffd1c03 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 31 Jul 2024 21:32:17 +0200 Subject: [PATCH 22/53] Delete flutter_cache_manager/.flutter-plugins-dependencies --- flutter_cache_manager/.flutter-plugins-dependencies | 1 - 1 file changed, 1 deletion(-) delete mode 100644 flutter_cache_manager/.flutter-plugins-dependencies diff --git a/flutter_cache_manager/.flutter-plugins-dependencies b/flutter_cache_manager/.flutter-plugins-dependencies deleted file mode 100644 index 903a165c..00000000 --- a/flutter_cache_manager/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider_ios","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/path_provider_ios-2.0.10/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/sqflite-2.0.3/","native_build":true,"dependencies":[]}],"android":[{"name":"path_provider_android","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/path_provider_android-2.0.16/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/sqflite-2.0.3/","native_build":true,"dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.6/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/sqflite-2.0.3/","native_build":true,"dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.7/","native_build":false,"dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/mateussiqueira/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.1.0/","native_build":false,"dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"path_provider","dependencies":["path_provider_android","path_provider_ios","path_provider_linux","path_provider_macos","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_ios","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"sqflite","dependencies":[]}],"date_created":"2022-07-26 10:06:23.183472","version":"3.0.4"} \ No newline at end of file From 801b713ed638d2cc0062686624c294712e6328bb Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 31 Jul 2024 21:45:11 +0200 Subject: [PATCH 23/53] Delete flutter_cache_manager/example/lib/generated_plugin_registrant.dart --- .../lib/generated_plugin_registrant.dart | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 flutter_cache_manager/example/lib/generated_plugin_registrant.dart diff --git a/flutter_cache_manager/example/lib/generated_plugin_registrant.dart b/flutter_cache_manager/example/lib/generated_plugin_registrant.dart deleted file mode 100644 index 40a0d005..00000000 --- a/flutter_cache_manager/example/lib/generated_plugin_registrant.dart +++ /dev/null @@ -1,17 +0,0 @@ -// -// Generated file. Do not edit. -// - -// ignore_for_file: directives_ordering -// ignore_for_file: lines_longer_than_80_chars -// ignore_for_file: depend_on_referenced_packages - -import 'package:url_launcher_web/url_launcher_web.dart'; - -import 'package:flutter_web_plugins/flutter_web_plugins.dart'; - -// ignore: public_member_api_docs -void registerPlugins(Registrar registrar) { - UrlLauncherPlugin.registerWith(registrar); - registrar.registerMessageHandler(); -} From 35085bf182e570c3e0a546c45bf0c2e947542499 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 31 Jul 2024 21:49:49 +0200 Subject: [PATCH 24/53] Format --- .gitignore | 91 ++++++++++++++----- .../test/cache_store_test.dart | 4 +- 2 files changed, 70 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index 856e7441..b22a5648 100644 --- a/.gitignore +++ b/.gitignore @@ -8,9 +8,11 @@ .atom/ .buildlog/ .history -.project .svn/ -bin/ +devtools_options.yaml + +# Environment files +ios/Flutter/Dart-Defines.xcconfig # IntelliJ related *.iml @@ -18,30 +20,23 @@ bin/ *.iws .idea/ -# Android Studio related -android/.classpath -android/.settings/ - # Visual Studio Code related -.vscode/ - -# Flutter repo-specific -/bin/cache/ -/bin/mingit/ -/dev/benchmarks/mega_gallery/ -/dev/bots/.recipe_deps -/dev/bots/android_tools/ -/dev/docs/doc/ -/dev/docs/lib/ -/dev/docs/pubspec.yaml -/packages/flutter/coverage/ -version +.classpath +.project +.settings/ +.vscode/* + +# packages file containing multi-root paths +.packages.generated # Flutter/Dart/Pub related **/doc/api/ .dart_tool/ .flutter-plugins +.flutter-plugins-dependencies +**/generated_plugin_registrant.dart .packages +.pub-preload-cache/ .pub-cache/ .pub/ build/ @@ -49,16 +44,17 @@ flutter_*.png linked_*.ds unlinked.ds unlinked_spec.ds -flutter_export_environment.sh # Android related **/android/**/gradle-wrapper.jar -**/android/.gradle +.gradle/ **/android/captures/ **/android/gradlew **/android/gradlew.bat **/android/local.properties **/android/**/GeneratedPluginRegistrant.java +**/android/key.properties +*.jks # iOS/XCode related **/ios/**/*.mode1v3 @@ -77,20 +73,69 @@ flutter_export_environment.sh **/ios/**/profile **/ios/**/xcuserdata **/ios/.generated/ +**/ios/Flutter/.last_build_id **/ios/Flutter/App.framework **/ios/Flutter/Flutter.framework +**/ios/Flutter/Flutter.podspec **/ios/Flutter/Generated.xcconfig +**/ios/Flutter/ephemeral **/ios/Flutter/app.flx **/ios/Flutter/app.zip **/ios/Flutter/flutter_assets/ +**/ios/Flutter/flutter_export_environment.sh **/ios/ServiceDefinitions.json **/ios/Runner/GeneratedPluginRegistrant.* +# macOS +**/Flutter/ephemeral/ +**/Pods/ +**/macos/Flutter/GeneratedPluginRegistrant.swift +**/macos/Flutter/ephemeral +**/xcuserdata/ + +# Windows +**/windows/flutter/generated_plugin_registrant.cc +**/windows/flutter/generated_plugin_registrant.h +**/windows/flutter/generated_plugins.cmake + +# Linux +**/linux/flutter/generated_plugin_registrant.cc +**/linux/flutter/generated_plugin_registrant.h +**/linux/flutter/generated_plugins.cmake + +# Coverage +coverage/ + +# Submodules +packages/**/pubspec.lock + +# Web related +lib/generated_plugin_registrant.dart + +# Symbols +app.*.symbols + +# Obfuscation related +app.*.map.json + # Exceptions to above rules. !**/ios/**/default.mode1v3 !**/ios/**/default.mode2v3 !**/ios/**/default.pbxuser !**/ios/**/default.perspectivev3 !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages -example/.flutter-plugins-dependencies -flutter_cache_manager/example/ios/Flutter/.last_build_id +!/dev/ci/**/Gemfile.lock +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.idea/codeStyles/ +!.idea/dictionaries/ +!.idea/runConfigurations/ + +# Generated files +**/generated +*.g.dart + +# Injection generated files +injectable.config.dart \ No newline at end of file diff --git a/flutter_cache_manager/test/cache_store_test.dart b/flutter_cache_manager/test/cache_store_test.dart index bdb35c75..b9a7ccd4 100644 --- a/flutter_cache_manager/test/cache_store_test.dart +++ b/flutter_cache_manager/test/cache_store_test.dart @@ -65,13 +65,13 @@ void main() { final store = CacheStore(config); - final _results = Future.wait([ + final results = Future.wait([ store.removeCachedFile(cacheObject), store.removeCachedFile(cacheObject), ]); expect( - () => _results, + () => results, returnsNormally, ); }); From fae466f7035fe3ccd3e1bf0ffce53c7865ec64e2 Mon Sep 17 00:00:00 2001 From: Peter Keefe <16809252+percula@users.noreply.github.com> Date: Sun, 19 May 2024 21:50:21 -0400 Subject: [PATCH 25/53] feat: Add retry mechanism (WIP) --- .../lib/src/firebase_cache_manager.dart | 7 ++++++- .../lib/src/firebase_http_file_service.dart | 17 ++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart b/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart index d474901f..bead1b26 100644 --- a/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart +++ b/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart @@ -1,4 +1,5 @@ import 'package:flutter_cache_manager/flutter_cache_manager.dart'; +import 'package:retry/retry.dart'; import 'firebase_http_file_service.dart'; @@ -9,10 +10,14 @@ class FirebaseCacheManager extends CacheManager { static final FirebaseCacheManager _instance = FirebaseCacheManager._(); + final RetryOptions? retryOptions; + factory FirebaseCacheManager() { return _instance; } - FirebaseCacheManager._() + FirebaseCacheManager.retry({this.retryOptions = const RetryOptions()}): super(Config(key, fileService: FirebaseHttpFileService(retryOptions: retryOptions))); + + FirebaseCacheManager._({this.retryOptions}) : super(Config(key, fileService: FirebaseHttpFileService())); } diff --git a/flutter_cache_manager_firebase/lib/src/firebase_http_file_service.dart b/flutter_cache_manager_firebase/lib/src/firebase_http_file_service.dart index c73710bc..301d0947 100644 --- a/flutter_cache_manager_firebase/lib/src/firebase_http_file_service.dart +++ b/flutter_cache_manager_firebase/lib/src/firebase_http_file_service.dart @@ -1,16 +1,31 @@ import 'package:firebase_storage/firebase_storage.dart'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; +import 'package:retry/retry.dart'; /// [FirebaseHttpFileService] is another common file service which parses a /// firebase reference into, to standard url which can be passed to the /// standard [HttpFileService]. class FirebaseHttpFileService extends HttpFileService { + final RetryOptions? retryOptions; + + FirebaseHttpFileService({ + this.retryOptions, + }); + @override Future get(String url, {Map? headers}) async { var ref = FirebaseStorage.instance.ref().child(url); - var downloadUrl = await ref.getDownloadURL(); + String downloadUrl; + if (retryOptions != null) { + downloadUrl = await retryOptions!.retry( + () async => await ref.getDownloadURL(), + retryIf: (e) => e is FirebaseException, + ); + } else { + downloadUrl = await ref.getDownloadURL(); + } return super.get(downloadUrl); } } From decf8c8cc3753846636dabac18f141514902595d Mon Sep 17 00:00:00 2001 From: Peter Keefe <16809252+percula@users.noreply.github.com> Date: Sun, 19 May 2024 21:50:21 -0400 Subject: [PATCH 26/53] feat: Add retry mechanism (WIP) --- .../lib/src/firebase_cache_manager.dart | 2 ++ flutter_cache_manager_firebase/pubspec.yaml | 1 + 2 files changed, 3 insertions(+) diff --git a/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart b/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart index bead1b26..4e44279b 100644 --- a/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart +++ b/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart @@ -12,6 +12,8 @@ class FirebaseCacheManager extends CacheManager { final RetryOptions? retryOptions; + final RetryOptions? retryOptions; + factory FirebaseCacheManager() { return _instance; } diff --git a/flutter_cache_manager_firebase/pubspec.yaml b/flutter_cache_manager_firebase/pubspec.yaml index 7924eaf8..18bd7396 100644 --- a/flutter_cache_manager_firebase/pubspec.yaml +++ b/flutter_cache_manager_firebase/pubspec.yaml @@ -13,6 +13,7 @@ dependencies: firebase_storage: '>=12.0.0 <13.0.0' path_provider: ^2.1.2 path: ^1.9.0 + retry: ^3.1.2 dev_dependencies: flutter_lints: ^4.0.0 From 84cd02be3ba9fd12fab92888afd4554e4a7ce9ca Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 31 Jul 2024 21:59:50 +0200 Subject: [PATCH 27/53] Fix --- .../lib/src/firebase_cache_manager.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart b/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart index 4e44279b..4868c18e 100644 --- a/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart +++ b/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart @@ -12,14 +12,14 @@ class FirebaseCacheManager extends CacheManager { final RetryOptions? retryOptions; - final RetryOptions? retryOptions; - factory FirebaseCacheManager() { return _instance; } - FirebaseCacheManager.retry({this.retryOptions = const RetryOptions()}): super(Config(key, fileService: FirebaseHttpFileService(retryOptions: retryOptions))); + FirebaseCacheManager.retry({this.retryOptions = const RetryOptions()}) + : super(Config(key, + fileService: FirebaseHttpFileService(retryOptions: retryOptions))); - FirebaseCacheManager._({this.retryOptions}) + FirebaseCacheManager._(this.retryOptions) : super(Config(key, fileService: FirebaseHttpFileService())); } From 530f20c31836a4b7ee37c1f24af773439b05fafd Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 31 Jul 2024 22:02:34 +0200 Subject: [PATCH 28/53] Fix --- flutter_cache_manager_firebase/CHANGELOG.md | 7 +++++++ .../lib/src/firebase_cache_manager.dart | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/flutter_cache_manager_firebase/CHANGELOG.md b/flutter_cache_manager_firebase/CHANGELOG.md index 2c1a7547..6628afc3 100644 --- a/flutter_cache_manager_firebase/CHANGELOG.md +++ b/flutter_cache_manager_firebase/CHANGELOG.md @@ -1,22 +1,29 @@ ## [2.0.3] - 2024-07-23 + * Updates dependencies ([#457](https://github.com/Baseflow/flutter_cache_manager/pull/457)) ## [2.0.2] - 2024-04-25 + * Updates dependencies to their latest versions. ## [2.0.1] - 2021-08-27 + * Update dependencies ## [2.0.0] - 2021-05-28 + * Update to null safety ## [1.1.0] - 2021-01-14 + * Update Firebase dependency ## [1.1.0-beta] - 2020-10-02 + * Update CacheManager dependency to 2.x.x. ## [1.0.1] - Update firebase dependency + * Added support for version 4.x.x ## [1.0.0] - Initial release diff --git a/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart b/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart index 4868c18e..08c44187 100644 --- a/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart +++ b/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart @@ -8,7 +8,7 @@ import 'firebase_http_file_service.dart'; class FirebaseCacheManager extends CacheManager { static const key = 'firebaseCache'; - static final FirebaseCacheManager _instance = FirebaseCacheManager._(); + static final FirebaseCacheManager _instance = FirebaseCacheManager._(null); final RetryOptions? retryOptions; From 91ca8051f70754c7baa7da94631f354396b28a66 Mon Sep 17 00:00:00 2001 From: MattyBoy Date: Sat, 29 Jul 2023 10:45:37 -0500 Subject: [PATCH 29/53] Fixed: PathNotFoundException when deleting a file that is already deleted --- flutter_cache_manager/lib/src/cache_store.dart | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/flutter_cache_manager/lib/src/cache_store.dart b/flutter_cache_manager/lib/src/cache_store.dart index dca3a648..6e511005 100644 --- a/flutter_cache_manager/lib/src/cache_store.dart +++ b/flutter_cache_manager/lib/src/cache_store.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:io'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'dart:io' as io; @@ -185,7 +186,12 @@ class CacheStore { final file = io.File(cacheObject.relativePath); if (file.existsSync()) { - await file.delete(); + try { + await file.delete(); + // ignore: unused_catch_clause + } on PathNotFoundException catch (e) { + // File has already been deleted. Do nothing #184 + } } } From 8c9d01fe6d79ef745505b729a9b88f754ae81f21 Mon Sep 17 00:00:00 2001 From: wyyadd Date: Mon, 9 Oct 2023 11:19:43 +0800 Subject: [PATCH 30/53] Export File System --- flutter_cache_manager/lib/flutter_cache_manager.dart | 1 + .../lib/src/storage/file_system/file_system.dart | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/flutter_cache_manager/lib/flutter_cache_manager.dart b/flutter_cache_manager/lib/flutter_cache_manager.dart index 40741985..943d910a 100644 --- a/flutter_cache_manager/lib/flutter_cache_manager.dart +++ b/flutter_cache_manager/lib/flutter_cache_manager.dart @@ -10,5 +10,6 @@ export 'src/logger.dart'; export 'src/result/result.dart'; export 'src/storage/cache_info_repositories/cache_info_repositories.dart'; export 'src/storage/cache_object.dart'; +export 'src/storage/file_system/file_system.dart'; export 'src/web/file_service.dart'; export 'src/web/web_helper.dart' show HttpExceptionWithStatus; diff --git a/flutter_cache_manager/lib/src/storage/file_system/file_system.dart b/flutter_cache_manager/lib/src/storage/file_system/file_system.dart index e5bb1427..2cd9764b 100644 --- a/flutter_cache_manager/lib/src/storage/file_system/file_system.dart +++ b/flutter_cache_manager/lib/src/storage/file_system/file_system.dart @@ -1,3 +1,7 @@ +export 'file_system.dart'; +export 'file_system_io.dart'; +export 'file_system_web.dart'; + import 'package:file/file.dart'; abstract class FileSystem { From 818051ca733f478769da667728157db9fb6e5b6e Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 31 Jul 2024 22:17:21 +0200 Subject: [PATCH 31/53] Fix --- flutter_cache_manager/lib/src/cache_store.dart | 1 - flutter_cache_manager/lib/src/config/_config_io.dart | 2 -- flutter_cache_manager/lib/src/config/_config_web.dart | 1 - flutter_cache_manager/lib/src/config/config.dart | 1 - 4 files changed, 5 deletions(-) diff --git a/flutter_cache_manager/lib/src/cache_store.dart b/flutter_cache_manager/lib/src/cache_store.dart index 6e511005..cb90ae2d 100644 --- a/flutter_cache_manager/lib/src/cache_store.dart +++ b/flutter_cache_manager/lib/src/cache_store.dart @@ -3,7 +3,6 @@ import 'dart:io'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'dart:io' as io; -import 'package:flutter_cache_manager/src/storage/file_system/file_system.dart'; ///Flutter Cache Manager ///Copyright (c) 2019 Rene Floor diff --git a/flutter_cache_manager/lib/src/config/_config_io.dart b/flutter_cache_manager/lib/src/config/_config_io.dart index 9ff7eadf..67eb8cb3 100644 --- a/flutter_cache_manager/lib/src/config/_config_io.dart +++ b/flutter_cache_manager/lib/src/config/_config_io.dart @@ -2,8 +2,6 @@ import 'dart:io'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:flutter_cache_manager/src/config/config.dart' as def; -import 'package:flutter_cache_manager/src/storage/file_system/file_system.dart'; -import 'package:flutter_cache_manager/src/storage/file_system/file_system_io.dart'; class Config implements def.Config { Config( diff --git a/flutter_cache_manager/lib/src/config/_config_web.dart b/flutter_cache_manager/lib/src/config/_config_web.dart index 3b1e433c..99e4f3b8 100644 --- a/flutter_cache_manager/lib/src/config/_config_web.dart +++ b/flutter_cache_manager/lib/src/config/_config_web.dart @@ -2,7 +2,6 @@ import 'package:flutter_cache_manager/src/config/config.dart' as def; import 'package:flutter_cache_manager/src/storage/cache_info_repositories/cache_info_repository.dart'; import 'package:flutter_cache_manager/src/storage/cache_info_repositories/non_storing_object_provider.dart'; import 'package:flutter_cache_manager/src/storage/file_system/file_system.dart'; -import 'package:flutter_cache_manager/src/storage/file_system/file_system_web.dart'; import 'package:flutter_cache_manager/src/web/file_service.dart'; class Config implements def.Config { diff --git a/flutter_cache_manager/lib/src/config/config.dart b/flutter_cache_manager/lib/src/config/config.dart index a0dc4894..cd25bbf7 100644 --- a/flutter_cache_manager/lib/src/config/config.dart +++ b/flutter_cache_manager/lib/src/config/config.dart @@ -2,7 +2,6 @@ import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:flutter_cache_manager/src/config/_config_unsupported.dart' if (dart.library.html) '_config_web.dart' if (dart.library.io) '_config_io.dart' as impl; -import 'package:flutter_cache_manager/src/storage/file_system/file_system.dart'; abstract class Config { /// Config file for the CacheManager. From a29670e303f4a69ea0dd2937b1196afb13f07339 Mon Sep 17 00:00:00 2001 From: ltOgt Date: Tue, 5 Dec 2023 11:55:19 +0100 Subject: [PATCH 32/53] add failing test --- .../test/cache_manager_test.dart | 146 +++++++++--------- 1 file changed, 70 insertions(+), 76 deletions(-) diff --git a/flutter_cache_manager/test/cache_manager_test.dart b/flutter_cache_manager/test/cache_manager_test.dart index a5f443f0..1822c490 100644 --- a/flutter_cache_manager/test/cache_manager_test.dart +++ b/flutter_cache_manager/test/cache_manager_test.dart @@ -150,13 +150,10 @@ void main() { when(store.getFile(fileUrl)).thenAnswer((_) => Future.value(cachedInfo)); var webHelper = MockWebHelper(); - var downloadedInfo = FileInfo(file, FileSource.Online, - DateTime.now().add(const Duration(days: 1)), fileUrl); - when(webHelper.downloadFile(fileUrl, key: anyNamed('key'))) - .thenAnswer((_) => Stream.value(downloadedInfo)); + var downloadedInfo = FileInfo(file, FileSource.Online, DateTime.now().add(const Duration(days: 1)), fileUrl); + when(webHelper.downloadFile(fileUrl, key: anyNamed('key'))).thenAnswer((_) => Stream.value(downloadedInfo)); - var cacheManager = TestCacheManager(createTestConfig(), - store: store, webHelper: webHelper); + var cacheManager = TestCacheManager(createTestConfig(), store: store, webHelper: webHelper); // ignore: deprecated_member_use_from_same_package var fileStream = cacheManager.getFile(fileUrl); @@ -177,8 +174,7 @@ void main() { when(store.getFile(fileUrl)).thenAnswer((_) => Future.value(null)); var webHelper = MockWebHelper(); - when(webHelper.downloadFile(fileUrl, key: anyNamed('key'))) - .thenAnswer((_) => Stream.value(fileInfo)); + when(webHelper.downloadFile(fileUrl, key: anyNamed('key'))).thenAnswer((_) => Stream.value(fileInfo)); var cacheManager = TestCacheManager( createTestConfig(), @@ -199,10 +195,8 @@ void main() { when(store.getFile(fileUrl)).thenAnswer((_) => Future.value(null)); var webHelper = MockWebHelper(); - var error = HttpExceptionWithStatus(404, 'Invalid statusCode: 404', - uri: Uri.parse(fileUrl)); - when(webHelper.downloadFile(fileUrl, key: anyNamed('key'))) - .thenThrow(error); + var error = HttpExceptionWithStatus(404, 'Invalid statusCode: 404', uri: Uri.parse(fileUrl)); + when(webHelper.downloadFile(fileUrl, key: anyNamed('key'))).thenThrow(error); var cacheManager = TestCacheManager( createTestConfig(), @@ -215,6 +209,36 @@ void main() { await expectLater(fileStream, emitsError(error)); verify(webHelper.downloadFile(any, key: anyNamed('key'))).called(1); }); + + test('Outdated cacheFile should call to web, where 404 response should add Error to Stream and evict cache', + () async { + var fileName = 'test.jpg'; + var fileUrl = 'baseflow.com/test'; + var validTill = DateTime.now().subtract(const Duration(days: 1)); + + var store = MockCacheStore(); + var file = await createTestConfig().fileSystem.createFile(fileName); + var cachedInfo = FileInfo(file, FileSource.Cache, validTill, fileUrl); + var cacheObject = CacheObject(fileUrl, relativePath: file.path, validTill: validTill, id: 123); + when(store.getFile(fileUrl)).thenAnswer((_) => Future.value(cachedInfo)); + when(store.retrieveCacheData(fileUrl)).thenAnswer((_) => Future.value(cacheObject)); + + var webHelper = MockWebHelper(); + var error = HttpExceptionWithStatus(404, 'Invalid statusCode: 404', uri: Uri.parse(fileUrl)); + when(webHelper.downloadFile(fileUrl, key: anyNamed('key'))).thenThrow(error); + + var cacheManager = TestCacheManager( + createTestConfig(), + store: store, + webHelper: webHelper, + ); + + // ignore: deprecated_member_use_from_same_package + var fileStream = cacheManager.getFile(fileUrl); + await expectLater(fileStream, emitsInOrder([cachedInfo, emitsError(error)])); + verify(webHelper.downloadFile(any, key: anyNamed('key'))).called(1); + verify(store.removeCachedFile(cacheObject)).called(1); + }); }); group('explicit key', () { test('Valid cacheFile should not call to web', () async { @@ -278,8 +302,7 @@ void main() { var store = MockCacheStore(); var cacheManager = TestCacheManager(createTestConfig(), store: store); - var file = await cacheManager.putFile(fileUrl, fileBytes, - fileExtension: extension); + var file = await cacheManager.putFile(fileUrl, fileBytes, fileExtension: extension); expect(await file.exists(), true); expect(await file.readAsBytes(), fileBytes); verify(store.putFile(any)).called(1); @@ -294,12 +317,10 @@ void main() { var store = MockCacheStore(); var cacheManager = TestCacheManager(createTestConfig(), store: store); - var file = await cacheManager.putFile(fileUrl, fileBytes, - key: fileKey, fileExtension: extension); + var file = await cacheManager.putFile(fileUrl, fileBytes, key: fileKey, fileExtension: extension); expect(await file.exists(), true); expect(await file.readAsBytes(), fileBytes); - final arg = - verify(store.putFile(captureAny)).captured.first as CacheObject; + final arg = verify(store.putFile(captureAny)).captured.first as CacheObject; expect(arg.key, fileKey); expect(arg.url, fileUrl); }); @@ -307,8 +328,7 @@ void main() { test('Check if file is written and info is stored', () async { var fileUrl = 'baseflow.com/test'; var extension = 'jpg'; - var memorySystem = - await MemoryFileSystem().systemTempDirectory.createTemp('origin'); + var memorySystem = await MemoryFileSystem().systemTempDirectory.createTemp('origin'); var existingFile = memorySystem.childFile('testfile.jpg'); var fileBytes = Uint8List(16); @@ -317,9 +337,7 @@ void main() { var store = MockCacheStore(); var cacheManager = TestCacheManager(createTestConfig(), store: store); - var file = await cacheManager.putFileStream( - fileUrl, existingFile.openRead(), - fileExtension: extension); + var file = await cacheManager.putFileStream(fileUrl, existingFile.openRead(), fileExtension: extension); expect(await file.exists(), true); expect(await file.readAsBytes(), fileBytes); verify(store.putFile(any)).called(1); @@ -329,8 +347,7 @@ void main() { var fileUrl = 'baseflow.com/test'; var fileKey = 'test1234'; var extension = 'jpg'; - var memorySystem = - await MemoryFileSystem().systemTempDirectory.createTemp('origin'); + var memorySystem = await MemoryFileSystem().systemTempDirectory.createTemp('origin'); var existingFile = memorySystem.childFile('testfile.jpg'); var fileBytes = Uint8List(16); @@ -339,13 +356,11 @@ void main() { var store = MockCacheStore(); var cacheManager = TestCacheManager(createTestConfig(), store: store); - var file = await cacheManager.putFileStream( - fileUrl, existingFile.openRead(), - key: fileKey, fileExtension: extension); + var file = + await cacheManager.putFileStream(fileUrl, existingFile.openRead(), key: fileKey, fileExtension: extension); expect(await file.exists(), true); expect(await file.readAsBytes(), fileBytes); - final arg = - verify(store.putFile(captureAny)).captured.first as CacheObject; + final arg = verify(store.putFile(captureAny)).captured.first as CacheObject; expect(arg.key, fileKey); expect(arg.url, fileUrl); }); @@ -356,13 +371,12 @@ void main() { var fileUrl = 'baseflow.com/test'; var store = MockCacheStore(); - when(store.retrieveCacheData(fileUrl)) - .thenAnswer((_) => Future.value(CacheObject( - fileUrl, - relativePath: 'test.png', - validTill: clock.now(), - id: 123, - ))); + when(store.retrieveCacheData(fileUrl)).thenAnswer((_) => Future.value(CacheObject( + fileUrl, + relativePath: 'test.png', + validTill: clock.now(), + id: 123, + ))); var cacheManager = TestCacheManager(createTestConfig(), store: store); @@ -374,8 +388,7 @@ void main() { var fileUrl = 'baseflow.com/test'; var store = MockCacheStore(); - when(store.retrieveCacheData(fileUrl)) - .thenAnswer((_) => Future.value(null)); + when(store.retrieveCacheData(fileUrl)).thenAnswer((_) => Future.value(null)); var cacheManager = TestCacheManager(createTestConfig(), store: store); @@ -387,13 +400,12 @@ void main() { var fileUrl = 'baseflow.com/test'; var store = MockCacheStore(); - when(store.retrieveCacheData(fileUrl)) - .thenAnswer((_) => Future.value(CacheObject( - fileUrl, - relativePath: 'test.png', - validTill: clock.now(), - id: null, - ))); + when(store.retrieveCacheData(fileUrl)).thenAnswer((_) => Future.value(CacheObject( + fileUrl, + relativePath: 'test.png', + validTill: clock.now(), + id: null, + ))); var cacheManager = TestCacheManager(createTestConfig(), store: store); @@ -405,12 +417,10 @@ void main() { test('Download file just downloads file', () async { var fileUrl = 'baseflow.com/test'; - var fileInfo = FileInfo(MemoryFileSystem.test().file('f'), FileSource.Cache, - DateTime.now(), fileUrl); + var fileInfo = FileInfo(MemoryFileSystem.test().file('f'), FileSource.Cache, DateTime.now(), fileUrl); var store = MockCacheStore(); var webHelper = MockWebHelper(); - when(webHelper.downloadFile(fileUrl, key: anyNamed('key'))) - .thenAnswer((_) => Stream.value(fileInfo)); + when(webHelper.downloadFile(fileUrl, key: anyNamed('key'))).thenAnswer((_) => Stream.value(fileInfo)); var cacheManager = TestCacheManager( createTestConfig(), webHelper: webHelper, @@ -421,15 +431,12 @@ void main() { test('test file from memory', () async { var fileUrl = 'baseflow.com/test'; - var fileInfo = FileInfo(MemoryFileSystem.test().file('f'), FileSource.Cache, - DateTime.now(), fileUrl); + var fileInfo = FileInfo(MemoryFileSystem.test().file('f'), FileSource.Cache, DateTime.now(), fileUrl); var store = MockCacheStore(); - when(store.getFileFromMemory(fileUrl)) - .thenAnswer((realInvocation) async => fileInfo); + when(store.getFileFromMemory(fileUrl)).thenAnswer((realInvocation) async => fileInfo); var webHelper = MockWebHelper(); - var cacheManager = TestCacheManager(createTestConfig(), - store: store, webHelper: webHelper); + var cacheManager = TestCacheManager(createTestConfig(), store: store, webHelper: webHelper); var result = await cacheManager.getFileFromMemory(fileUrl); expect(result, fileInfo); }); @@ -448,15 +455,9 @@ void main() { var config = createTestConfig(); var fileService = config.fileService; var downloadStreamController = StreamController>(); - when(fileService.get(fileUrl, headers: anyNamed('headers'))) - .thenAnswer((_) { - return Future.value(MockFileFetcherResponse( - downloadStreamController.stream, - 6, - 'testv1', - '.jpg', - 200, - DateTime.now())); + when(fileService.get(fileUrl, headers: anyNamed('headers'))).thenAnswer((_) { + return Future.value( + MockFileFetcherResponse(downloadStreamController.stream, 6, 'testv1', '.jpg', 200, DateTime.now())); }); var cacheManager = TestCacheManager(config); @@ -491,15 +492,9 @@ void main() { when(store.getFile(fileUrl)).thenAnswer((_) => Future.value(null)); var downloadStreamController = StreamController>(); - when(config.fileService.get(fileUrl, headers: anyNamed('headers'))) - .thenAnswer((_) { - return Future.value(MockFileFetcherResponse( - downloadStreamController.stream, - 6, - 'testv1', - '.jpg', - 200, - DateTime.now())); + when(config.fileService.get(fileUrl, headers: anyNamed('headers'))).thenAnswer((_) { + return Future.value( + MockFileFetcherResponse(downloadStreamController.stream, 6, 'testv1', '.jpg', 200, DateTime.now())); }); var cacheManager = TestCacheManager(config); @@ -527,6 +522,5 @@ class TestCacheManager extends CacheManager with ImageCacheManager { Config? config, { CacheStore? store, WebHelper? webHelper, - }) : super.custom(config ?? createTestConfig(), - cacheStore: store, webHelper: webHelper); + }) : super.custom(config ?? createTestConfig(), cacheStore: store, webHelper: webHelper); } From 0e06a32af74f03efd7563d4c00eebd80f80f3a2e Mon Sep 17 00:00:00 2001 From: ltOgt Date: Tue, 5 Dec 2023 11:55:44 +0100 Subject: [PATCH 33/53] remove file on 404 --- flutter_cache_manager/lib/src/cache_manager.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/flutter_cache_manager/lib/src/cache_manager.dart b/flutter_cache_manager/lib/src/cache_manager.dart index cae88db5..b0e9283e 100644 --- a/flutter_cache_manager/lib/src/cache_manager.dart +++ b/flutter_cache_manager/lib/src/cache_manager.dart @@ -151,9 +151,12 @@ class CacheManager implements BaseCacheManager { cacheLogger.log( 'CacheManager: Failed to download file from $url with error:\n$e', CacheManagerLogLevel.debug); - if (cacheFile == null && streamController.hasListener) { + if (streamController.hasListener) { streamController.addError(e); } + if (cacheFile != null) { + await removeFile(key); + } } } streamController.close(); From 942bc8db3c25d5b0eddfdab3af021aeea7066d6f Mon Sep 17 00:00:00 2001 From: ltOgt Date: Tue, 5 Dec 2023 13:48:47 +0100 Subject: [PATCH 34/53] evict and add only on 404 --- flutter_cache_manager/lib/src/cache_manager.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/flutter_cache_manager/lib/src/cache_manager.dart b/flutter_cache_manager/lib/src/cache_manager.dart index b0e9283e..f71a40f4 100644 --- a/flutter_cache_manager/lib/src/cache_manager.dart +++ b/flutter_cache_manager/lib/src/cache_manager.dart @@ -151,10 +151,12 @@ class CacheManager implements BaseCacheManager { cacheLogger.log( 'CacheManager: Failed to download file from $url with error:\n$e', CacheManagerLogLevel.debug); - if (streamController.hasListener) { + if (cacheFile == null && streamController.hasListener) { streamController.addError(e); } - if (cacheFile != null) { + + if (cacheFile != null && e is HttpExceptionWithStatus && e.statusCode == 404) { + streamController.addError(e); await removeFile(key); } } From 2e37e33a49bd0fa1af20cdc675cef887890fe4d2 Mon Sep 17 00:00:00 2001 From: ltOgt Date: Tue, 5 Dec 2023 13:49:58 +0100 Subject: [PATCH 35/53] add only if has listener --- flutter_cache_manager/lib/src/cache_manager.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/flutter_cache_manager/lib/src/cache_manager.dart b/flutter_cache_manager/lib/src/cache_manager.dart index f71a40f4..3ab5c149 100644 --- a/flutter_cache_manager/lib/src/cache_manager.dart +++ b/flutter_cache_manager/lib/src/cache_manager.dart @@ -156,7 +156,9 @@ class CacheManager implements BaseCacheManager { } if (cacheFile != null && e is HttpExceptionWithStatus && e.statusCode == 404) { - streamController.addError(e); + if (streamController.hasListener) { + streamController.addError(e); + } await removeFile(key); } } From 4bf2cfb67c2934acdfb421d1a80dcdca3302712a Mon Sep 17 00:00:00 2001 From: ltOgt Date: Tue, 5 Dec 2023 13:57:09 +0100 Subject: [PATCH 36/53] bump version and changelog --- flutter_cache_manager/CHANGELOG.md | 64 +++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 15 deletions(-) diff --git a/flutter_cache_manager/CHANGELOG.md b/flutter_cache_manager/CHANGELOG.md index 6b7e0bc5..1d84e049 100644 --- a/flutter_cache_manager/CHANGELOG.md +++ b/flutter_cache_manager/CHANGELOG.md @@ -1,76 +1,102 @@ +## [3.3.4] - 2023-12-05 + +* [Bugfix] For a previously cached file that got removed on the server, now evicts that file on 404 and notifies listeners. + ## [3.3.3] - 2024-07-23 + * Updates dependencies ([#457](https://github.com/Baseflow/flutter_cache_manager/pull/457)) ## [3.3.2] - 2024-04-25 + * Updates dependencies to their latest versions. ## [3.3.1] - 2023-07-03 + * Support Dart 3.0.0 for http ^1.0.0 and file ^7.0.0 * Update example * Add topics ## [3.3.0] - 2021-11-29 + * Added option to manage the log level. Doesn't print failed downloads by default anymore. You can set it like this: + ```dart CacheManager.logLevel = CacheManagerLogLevel.verbose; ``` ## [3.2.0] - 2021-11-27 + * [Bugfix] getSingleFile now downloads a new file before completing as the outdated file might have been deleted. ## [3.1.3] - 2021-11-05 + * Disabled resizing of cached gifs as this was broken. ## [3.1.2] - 2021-06-17 + * removeFile function now completes after the file is removed from disk and not earlier ([#323](https://github.com/Baseflow/flutter_cache_manager/pull/323)) * Image resizing doesn't block ui anymore and doesn't use image package but existing Flutter components ([#319](https://github.com/Baseflow/flutter_cache_manager/pull/319)) ## [3.1.1] - 2021-06-03 + * Move File to separate file. You can add it using the following import: + ```dart import 'package:flutter_cache_manager/file.dart' as cache_file; ``` ## [3.1.0] - 2021-05-28 + * Export File from package file ([#302](https://github.com/Baseflow/flutter_cache_manager/pull/302)) * Bugfix for eTag on Flutter Web ([#304](https://github.com/Baseflow/flutter_cache_manager/pull/315)) * Bugfix for loading multiple images simultaneously ([#315](https://github.com/Baseflow/flutter_cache_manager/pull/315)) ## [3.0.2] - 2021-05-10 + * Include rxdart 0.27 as possible dependency ## [3.0.1] - 2021-03-29 + * Include file 6.0.0 as possible dependency ## [3.0.0] - 2021-03-27 + * Bug fix on removing a relatively new file from cache * Migration to nullsafety. ## [3.0.0-nullsafety.3] - 2021-03-26 + * Add null-check on id in removeFile ## [3.0.0-nullsafety.2] - 2021-03-22 + * Fix sqflite warning ## [3.0.0-nullsafety.1] - 2021-03-02 + * Bug fix for NonStoringObjectProvider. ## [3.0.0-nullsafety.0] - 2021-02-25 + * Migration to nullsafety. ## [2.1.2] - 2021-03-09 + * Update dependencies * Bug fix for JsonCacheInfoRepository when file is corrupted. ## [2.1.1] - 2021-01-14 + * Update minimal dependency sqflite * Small fix for non-existing directory (PR [#264](https://github.com/Baseflow/flutter_cache_manager/pull/264)) ## [2.1.0] - 2020-12-21 + * Added ImageCacheManager with support for image resizing. * Upgrade dependencies. ## [2.0.0] - 2020-10-16 + * Restructured the configuration of the CacheManager. Look at the ReadMe for more information. * Added queueing mechanism for downloading new files. By default, the cache manager downloads a maximum of 10 files at the same time. @@ -84,14 +110,15 @@ import 'package:flutter_cache_manager/file.dart' as cache_file; * **BREAKING CHANGE** A CacheInfoRepository is now assumed to allow multiple connections, which means you can call 'open' multiple times and the repo keeps track on the number of connections. - ## [2.0.0-beta.1] - 2020-10-10 + * Reintroduced BaseCacheManager interface for backwards compatibility. * Renamed putExistFile to putFileStream. This is equally efficient, but more clear in what it does. ## [2.0.0-beta] - 2020-10-01 + * Added option for a key different from the url. -* Added a new CacheInfoRepository: JsonCacheInfoRepository, which is not used by default on the existing platforms, +* Added a new CacheInfoRepository: JsonCacheInfoRepository, which is not used by default on the existing platforms, but can be used on any. * Added support for Windows and Linux using the JsonCacheInfoRepository by default. * Added support for adding an existing file. @@ -101,49 +128,56 @@ but can be used on any. * **BREAKING CHANGE** A CacheInfoRepository is now assumed to allow multiple connections, which means you can call 'open' multiple times and the repo keeps track on the number of connections. - ## [1.4.2] - 2020-09-10 + * Compatibility with Flutter version 1.22. ## [1.4.1] - 2020-06-14 + * Bugfix: CacheManager returned a file that didn't exist when the file was removed by the OS (or any other external system) while the app was active. This also prevented the CacheManager to redownload the file ([PR #190](https://github.com/Baseflow/flutter_cache_manager/pull/190)). ## [1.4.0] - 2020-06-04 + * Allow cleaning of memory cache ([PR #183](https://github.com/Baseflow/flutter_cache_manager/pull/183)). * Bugfix: Cleaning doesn't want to delete a file twice anymore ([PR #185](https://github.com/Baseflow/flutter_cache_manager/pull/185)). ## [1.3.0] - 2020-05-28 + * Basic web support. (At least it downloads the file for you.) * Support for the following mimetypes: - * application/vnd.android.package-archive (apk) - * audio/x-aac (aac) - * video/quicktime (mov) + * application/vnd.android.package-archive (apk) + * audio/x-aac (aac) + * video/quicktime (mov) ## [1.2.2] - 2020-04-16 + * Support for RxDart 0.24.x ## [1.2.1] - 2020-04-14 + * Fixed optional parameters in the Content-Type header ([#164](https://github.com/Baseflow/flutter_cache_manager/issues/164)). ## [1.2.0] - 2020-04-10 + * Added getFileStream to CacheManager - * getFileStream has an optional parameter 'withProgress' to receive progress. - * getFileStream returns a FileResponse which is either a FileInfo or a DownloadProgress. + * getFileStream has an optional parameter 'withProgress' to receive progress. + * getFileStream returns a FileResponse which is either a FileInfo or a DownloadProgress. * Changes to FileFetcher and FileFetcherResponse: - * FileFetcher is now replaced with a FileService which is a class instead of a function. - * FileServiceResponse doesn't just give magic headers, but concrete implementation of the needed information. - * FileServiceResponse gives a contentStream instead of content for more efficient handling of the data. - * FileServiceResponse contains contentLength with information about the total size of the content. + * FileFetcher is now replaced with a FileService which is a class instead of a function. + * FileServiceResponse doesn't just give magic headers, but concrete implementation of the needed information. + * FileServiceResponse gives a contentStream instead of content for more efficient handling of the data. + * FileServiceResponse contains contentLength with information about the total size of the content. * Changes in CacheStore for testability: - * CleanupRunMinInterval can now be set. - * Expects a mockable directory instead of a path. + * CleanupRunMinInterval can now be set. + * Expects a mockable directory instead of a path. * Added CacheInfoRepository interface to possibly replace the current CacheObjectProvider based on sqflite. * Changes in WebHelper * Files are now always saved with a new name. Files are first saved to storage before old file is removed. * General code quality improvements ## [1.1.3] - 2019-10-17 + * Use try-catch in WebHelper so VM understands that errors are not uncaught. ## [1.1.2] - 2019-10-16 @@ -203,7 +237,7 @@ while the app was active. This also prevented the CacheManager to redownload the ## [0.0.4+1] - 2018-02-16 -* Fixed nullpointer when non-updated file (a 304 response) has no cache-control period. +* Fixed nullpointer when non-updated file (a 304 response) has no cache-control period. ## [0.0.4] - 2018-01-31 From d31e0335a1c58c67ec35544477ac01a5c91c68d1 Mon Sep 17 00:00:00 2001 From: ltOgt Date: Tue, 5 Dec 2023 13:59:57 +0100 Subject: [PATCH 37/53] undo format changes --- .../test/cache_manager_test.dart | 116 ++++++++++++------ 1 file changed, 76 insertions(+), 40 deletions(-) diff --git a/flutter_cache_manager/test/cache_manager_test.dart b/flutter_cache_manager/test/cache_manager_test.dart index 1822c490..b1f4cae4 100644 --- a/flutter_cache_manager/test/cache_manager_test.dart +++ b/flutter_cache_manager/test/cache_manager_test.dart @@ -150,10 +150,13 @@ void main() { when(store.getFile(fileUrl)).thenAnswer((_) => Future.value(cachedInfo)); var webHelper = MockWebHelper(); - var downloadedInfo = FileInfo(file, FileSource.Online, DateTime.now().add(const Duration(days: 1)), fileUrl); - when(webHelper.downloadFile(fileUrl, key: anyNamed('key'))).thenAnswer((_) => Stream.value(downloadedInfo)); + var downloadedInfo = FileInfo(file, FileSource.Online, + DateTime.now().add(const Duration(days: 1)), fileUrl); + when(webHelper.downloadFile(fileUrl, key: anyNamed('key'))) + .thenAnswer((_) => Stream.value(downloadedInfo)); - var cacheManager = TestCacheManager(createTestConfig(), store: store, webHelper: webHelper); + var cacheManager = TestCacheManager(createTestConfig(), + store: store, webHelper: webHelper); // ignore: deprecated_member_use_from_same_package var fileStream = cacheManager.getFile(fileUrl); @@ -174,7 +177,8 @@ void main() { when(store.getFile(fileUrl)).thenAnswer((_) => Future.value(null)); var webHelper = MockWebHelper(); - when(webHelper.downloadFile(fileUrl, key: anyNamed('key'))).thenAnswer((_) => Stream.value(fileInfo)); + when(webHelper.downloadFile(fileUrl, key: anyNamed('key'))) + .thenAnswer((_) => Stream.value(fileInfo)); var cacheManager = TestCacheManager( createTestConfig(), @@ -195,8 +199,10 @@ void main() { when(store.getFile(fileUrl)).thenAnswer((_) => Future.value(null)); var webHelper = MockWebHelper(); - var error = HttpExceptionWithStatus(404, 'Invalid statusCode: 404', uri: Uri.parse(fileUrl)); - when(webHelper.downloadFile(fileUrl, key: anyNamed('key'))).thenThrow(error); + var error = HttpExceptionWithStatus(404, 'Invalid statusCode: 404', + uri: Uri.parse(fileUrl)); + when(webHelper.downloadFile(fileUrl, key: anyNamed('key'))) + .thenThrow(error); var cacheManager = TestCacheManager( createTestConfig(), @@ -302,7 +308,8 @@ void main() { var store = MockCacheStore(); var cacheManager = TestCacheManager(createTestConfig(), store: store); - var file = await cacheManager.putFile(fileUrl, fileBytes, fileExtension: extension); + var file = await cacheManager.putFile(fileUrl, fileBytes, + fileExtension: extension); expect(await file.exists(), true); expect(await file.readAsBytes(), fileBytes); verify(store.putFile(any)).called(1); @@ -317,10 +324,12 @@ void main() { var store = MockCacheStore(); var cacheManager = TestCacheManager(createTestConfig(), store: store); - var file = await cacheManager.putFile(fileUrl, fileBytes, key: fileKey, fileExtension: extension); + var file = await cacheManager.putFile(fileUrl, fileBytes, + key: fileKey, fileExtension: extension); expect(await file.exists(), true); expect(await file.readAsBytes(), fileBytes); - final arg = verify(store.putFile(captureAny)).captured.first as CacheObject; + final arg = + verify(store.putFile(captureAny)).captured.first as CacheObject; expect(arg.key, fileKey); expect(arg.url, fileUrl); }); @@ -328,7 +337,8 @@ void main() { test('Check if file is written and info is stored', () async { var fileUrl = 'baseflow.com/test'; var extension = 'jpg'; - var memorySystem = await MemoryFileSystem().systemTempDirectory.createTemp('origin'); + var memorySystem = + await MemoryFileSystem().systemTempDirectory.createTemp('origin'); var existingFile = memorySystem.childFile('testfile.jpg'); var fileBytes = Uint8List(16); @@ -337,7 +347,9 @@ void main() { var store = MockCacheStore(); var cacheManager = TestCacheManager(createTestConfig(), store: store); - var file = await cacheManager.putFileStream(fileUrl, existingFile.openRead(), fileExtension: extension); + var file = await cacheManager.putFileStream( + fileUrl, existingFile.openRead(), + fileExtension: extension); expect(await file.exists(), true); expect(await file.readAsBytes(), fileBytes); verify(store.putFile(any)).called(1); @@ -347,7 +359,8 @@ void main() { var fileUrl = 'baseflow.com/test'; var fileKey = 'test1234'; var extension = 'jpg'; - var memorySystem = await MemoryFileSystem().systemTempDirectory.createTemp('origin'); + var memorySystem = + await MemoryFileSystem().systemTempDirectory.createTemp('origin'); var existingFile = memorySystem.childFile('testfile.jpg'); var fileBytes = Uint8List(16); @@ -356,11 +369,13 @@ void main() { var store = MockCacheStore(); var cacheManager = TestCacheManager(createTestConfig(), store: store); - var file = - await cacheManager.putFileStream(fileUrl, existingFile.openRead(), key: fileKey, fileExtension: extension); + var file = await cacheManager.putFileStream( + fileUrl, existingFile.openRead(), + key: fileKey, fileExtension: extension); expect(await file.exists(), true); expect(await file.readAsBytes(), fileBytes); - final arg = verify(store.putFile(captureAny)).captured.first as CacheObject; + final arg = + verify(store.putFile(captureAny)).captured.first as CacheObject; expect(arg.key, fileKey); expect(arg.url, fileUrl); }); @@ -371,12 +386,13 @@ void main() { var fileUrl = 'baseflow.com/test'; var store = MockCacheStore(); - when(store.retrieveCacheData(fileUrl)).thenAnswer((_) => Future.value(CacheObject( - fileUrl, - relativePath: 'test.png', - validTill: clock.now(), - id: 123, - ))); + when(store.retrieveCacheData(fileUrl)) + .thenAnswer((_) => Future.value(CacheObject( + fileUrl, + relativePath: 'test.png', + validTill: clock.now(), + id: 123, + ))); var cacheManager = TestCacheManager(createTestConfig(), store: store); @@ -388,7 +404,8 @@ void main() { var fileUrl = 'baseflow.com/test'; var store = MockCacheStore(); - when(store.retrieveCacheData(fileUrl)).thenAnswer((_) => Future.value(null)); + when(store.retrieveCacheData(fileUrl)) + .thenAnswer((_) => Future.value(null)); var cacheManager = TestCacheManager(createTestConfig(), store: store); @@ -400,12 +417,13 @@ void main() { var fileUrl = 'baseflow.com/test'; var store = MockCacheStore(); - when(store.retrieveCacheData(fileUrl)).thenAnswer((_) => Future.value(CacheObject( - fileUrl, - relativePath: 'test.png', - validTill: clock.now(), - id: null, - ))); + when(store.retrieveCacheData(fileUrl)) + .thenAnswer((_) => Future.value(CacheObject( + fileUrl, + relativePath: 'test.png', + validTill: clock.now(), + id: null, + ))); var cacheManager = TestCacheManager(createTestConfig(), store: store); @@ -417,10 +435,12 @@ void main() { test('Download file just downloads file', () async { var fileUrl = 'baseflow.com/test'; - var fileInfo = FileInfo(MemoryFileSystem.test().file('f'), FileSource.Cache, DateTime.now(), fileUrl); + var fileInfo = FileInfo(MemoryFileSystem.test().file('f'), FileSource.Cache, + DateTime.now(), fileUrl); var store = MockCacheStore(); var webHelper = MockWebHelper(); - when(webHelper.downloadFile(fileUrl, key: anyNamed('key'))).thenAnswer((_) => Stream.value(fileInfo)); + when(webHelper.downloadFile(fileUrl, key: anyNamed('key'))) + .thenAnswer((_) => Stream.value(fileInfo)); var cacheManager = TestCacheManager( createTestConfig(), webHelper: webHelper, @@ -431,12 +451,15 @@ void main() { test('test file from memory', () async { var fileUrl = 'baseflow.com/test'; - var fileInfo = FileInfo(MemoryFileSystem.test().file('f'), FileSource.Cache, DateTime.now(), fileUrl); + var fileInfo = FileInfo(MemoryFileSystem.test().file('f'), FileSource.Cache, + DateTime.now(), fileUrl); var store = MockCacheStore(); - when(store.getFileFromMemory(fileUrl)).thenAnswer((realInvocation) async => fileInfo); + when(store.getFileFromMemory(fileUrl)) + .thenAnswer((realInvocation) async => fileInfo); var webHelper = MockWebHelper(); - var cacheManager = TestCacheManager(createTestConfig(), store: store, webHelper: webHelper); + var cacheManager = TestCacheManager(createTestConfig(), + store: store, webHelper: webHelper); var result = await cacheManager.getFileFromMemory(fileUrl); expect(result, fileInfo); }); @@ -455,9 +478,15 @@ void main() { var config = createTestConfig(); var fileService = config.fileService; var downloadStreamController = StreamController>(); - when(fileService.get(fileUrl, headers: anyNamed('headers'))).thenAnswer((_) { - return Future.value( - MockFileFetcherResponse(downloadStreamController.stream, 6, 'testv1', '.jpg', 200, DateTime.now())); + when(fileService.get(fileUrl, headers: anyNamed('headers'))) + .thenAnswer((_) { + return Future.value(MockFileFetcherResponse( + downloadStreamController.stream, + 6, + 'testv1', + '.jpg', + 200, + DateTime.now())); }); var cacheManager = TestCacheManager(config); @@ -492,9 +521,15 @@ void main() { when(store.getFile(fileUrl)).thenAnswer((_) => Future.value(null)); var downloadStreamController = StreamController>(); - when(config.fileService.get(fileUrl, headers: anyNamed('headers'))).thenAnswer((_) { - return Future.value( - MockFileFetcherResponse(downloadStreamController.stream, 6, 'testv1', '.jpg', 200, DateTime.now())); + when(config.fileService.get(fileUrl, headers: anyNamed('headers'))) + .thenAnswer((_) { + return Future.value(MockFileFetcherResponse( + downloadStreamController.stream, + 6, + 'testv1', + '.jpg', + 200, + DateTime.now())); }); var cacheManager = TestCacheManager(config); @@ -522,5 +557,6 @@ class TestCacheManager extends CacheManager with ImageCacheManager { Config? config, { CacheStore? store, WebHelper? webHelper, - }) : super.custom(config ?? createTestConfig(), cacheStore: store, webHelper: webHelper); + }) : super.custom(config ?? createTestConfig(), + cacheStore: store, webHelper: webHelper); } From 2a7966623761fcf9045f08696deb32e31d317b57 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 31 Jul 2024 22:24:22 +0200 Subject: [PATCH 38/53] Format --- .../lib/src/cache_manager.dart | 4 +++- .../test/cache_manager_test.dart | 18 ++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/flutter_cache_manager/lib/src/cache_manager.dart b/flutter_cache_manager/lib/src/cache_manager.dart index 3ab5c149..82ac52a9 100644 --- a/flutter_cache_manager/lib/src/cache_manager.dart +++ b/flutter_cache_manager/lib/src/cache_manager.dart @@ -155,7 +155,9 @@ class CacheManager implements BaseCacheManager { streamController.addError(e); } - if (cacheFile != null && e is HttpExceptionWithStatus && e.statusCode == 404) { + if (cacheFile != null && + e is HttpExceptionWithStatus && + e.statusCode == 404) { if (streamController.hasListener) { streamController.addError(e); } diff --git a/flutter_cache_manager/test/cache_manager_test.dart b/flutter_cache_manager/test/cache_manager_test.dart index b1f4cae4..c4be9381 100644 --- a/flutter_cache_manager/test/cache_manager_test.dart +++ b/flutter_cache_manager/test/cache_manager_test.dart @@ -216,7 +216,8 @@ void main() { verify(webHelper.downloadFile(any, key: anyNamed('key'))).called(1); }); - test('Outdated cacheFile should call to web, where 404 response should add Error to Stream and evict cache', + test( + 'Outdated cacheFile should call to web, where 404 response should add Error to Stream and evict cache', () async { var fileName = 'test.jpg'; var fileUrl = 'baseflow.com/test'; @@ -225,13 +226,17 @@ void main() { var store = MockCacheStore(); var file = await createTestConfig().fileSystem.createFile(fileName); var cachedInfo = FileInfo(file, FileSource.Cache, validTill, fileUrl); - var cacheObject = CacheObject(fileUrl, relativePath: file.path, validTill: validTill, id: 123); + var cacheObject = CacheObject(fileUrl, + relativePath: file.path, validTill: validTill, id: 123); when(store.getFile(fileUrl)).thenAnswer((_) => Future.value(cachedInfo)); - when(store.retrieveCacheData(fileUrl)).thenAnswer((_) => Future.value(cacheObject)); + when(store.retrieveCacheData(fileUrl)) + .thenAnswer((_) => Future.value(cacheObject)); var webHelper = MockWebHelper(); - var error = HttpExceptionWithStatus(404, 'Invalid statusCode: 404', uri: Uri.parse(fileUrl)); - when(webHelper.downloadFile(fileUrl, key: anyNamed('key'))).thenThrow(error); + var error = HttpExceptionWithStatus(404, 'Invalid statusCode: 404', + uri: Uri.parse(fileUrl)); + when(webHelper.downloadFile(fileUrl, key: anyNamed('key'))) + .thenThrow(error); var cacheManager = TestCacheManager( createTestConfig(), @@ -241,7 +246,8 @@ void main() { // ignore: deprecated_member_use_from_same_package var fileStream = cacheManager.getFile(fileUrl); - await expectLater(fileStream, emitsInOrder([cachedInfo, emitsError(error)])); + await expectLater( + fileStream, emitsInOrder([cachedInfo, emitsError(error)])); verify(webHelper.downloadFile(any, key: anyNamed('key'))).called(1); verify(store.removeCachedFile(cacheObject)).called(1); }); From 4a3be03b6be3cd748d06796b0fb05cbdc4ffa298 Mon Sep 17 00:00:00 2001 From: liasica Date: Sun, 10 Mar 2024 11:55:22 +0800 Subject: [PATCH 39/53] get cache total size --- flutter_cache_manager/lib/src/cache_store.dart | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/flutter_cache_manager/lib/src/cache_store.dart b/flutter_cache_manager/lib/src/cache_store.dart index cb90ae2d..670c30cd 100644 --- a/flutter_cache_manager/lib/src/cache_store.dart +++ b/flutter_cache_manager/lib/src/cache_store.dart @@ -202,4 +202,15 @@ class CacheStore { final provider = await _cacheInfoRepository; await provider.close(); } + + + Future getCacheSize() async { + final provider = await _cacheInfoRepository; + final allObjects = await provider.getAllObjects(); + int total = 0; + for (var cacheObject in allObjects) { + total += cacheObject.length ?? 0; + } + return total; + } } From 980b33b588827689cb9c4548d823b4f36fb695e5 Mon Sep 17 00:00:00 2001 From: Abdelrahman Saed Date: Tue, 23 Jul 2024 12:41:25 +0300 Subject: [PATCH 40/53] change order to allow to override ifNoneMatchHeader --- flutter_cache_manager/lib/src/web/web_helper.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/flutter_cache_manager/lib/src/web/web_helper.dart b/flutter_cache_manager/lib/src/web/web_helper.dart index 81b0e710..c56c46f7 100644 --- a/flutter_cache_manager/lib/src/web/web_helper.dart +++ b/flutter_cache_manager/lib/src/web/web_helper.dart @@ -100,9 +100,6 @@ class WebHelper { Future _download( CacheObject cacheObject, Map? authHeaders) { final headers = {}; - if (authHeaders != null) { - headers.addAll(authHeaders); - } final etag = cacheObject.eTag; @@ -111,6 +108,10 @@ class WebHelper { headers[HttpHeaders.ifNoneMatchHeader] = etag; } + if (authHeaders != null) { + headers.addAll(authHeaders); + } + return fileFetcher.get(cacheObject.url, headers: headers); } From 6be3abfa5cec070b59753fa952d2917f39f6f15f Mon Sep 17 00:00:00 2001 From: Abdelrahman Saed Date: Wed, 31 Jul 2024 03:44:51 +0300 Subject: [PATCH 41/53] add statusCode to file_info.dart --- flutter_cache_manager/lib/src/result/file_info.dart | 5 ++++- flutter_cache_manager/lib/src/web/web_helper.dart | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/flutter_cache_manager/lib/src/result/file_info.dart b/flutter_cache_manager/lib/src/result/file_info.dart index 1023e3ef..ae874830 100644 --- a/flutter_cache_manager/lib/src/result/file_info.dart +++ b/flutter_cache_manager/lib/src/result/file_info.dart @@ -12,7 +12,8 @@ enum FileSource { NA, Cache, Online } /// FileInfo contains the fetch File next to some info on the validity and /// the origin of the file. class FileInfo extends FileResponse { - const FileInfo(this.file, this.source, this.validTill, String originalUrl) + const FileInfo(this.file, this.source, this.validTill, String originalUrl, + {this.statusCode = 200}) : super(originalUrl); /// Fetched file @@ -24,4 +25,6 @@ class FileInfo extends FileResponse { /// Validity date of the file. After this date the validity is not guaranteed /// and the CacheManager will try to update the file. final DateTime validTill; + + final int statusCode; } diff --git a/flutter_cache_manager/lib/src/web/web_helper.dart b/flutter_cache_manager/lib/src/web/web_helper.dart index c56c46f7..20685484 100644 --- a/flutter_cache_manager/lib/src/web/web_helper.dart +++ b/flutter_cache_manager/lib/src/web/web_helper.dart @@ -153,6 +153,7 @@ class WebHelper { FileSource.Online, newCacheObject.validTill, newCacheObject.url, + statusCode: response.statusCode, ); } From ba41d3cf784d165172643e1de92bdb97203a6933 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 31 Jul 2024 22:30:19 +0200 Subject: [PATCH 42/53] Format --- flutter_cache_manager/lib/src/cache_store.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/flutter_cache_manager/lib/src/cache_store.dart b/flutter_cache_manager/lib/src/cache_store.dart index 670c30cd..3ad735ac 100644 --- a/flutter_cache_manager/lib/src/cache_store.dart +++ b/flutter_cache_manager/lib/src/cache_store.dart @@ -203,7 +203,6 @@ class CacheStore { await provider.close(); } - Future getCacheSize() async { final provider = await _cacheInfoRepository; final allObjects = await provider.getAllObjects(); From 516dff8b9236dcaffd89da7d8c908f04608fe16c Mon Sep 17 00:00:00 2001 From: minhdanh Date: Sat, 25 May 2024 19:55:58 +0700 Subject: [PATCH 43/53] Support bucket --- .../lib/src/firebase_cache_manager.dart | 19 +++++++++++-------- .../lib/src/firebase_http_file_service.dart | 13 +++++++++++-- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart b/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart index 08c44187..e45ed319 100644 --- a/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart +++ b/flutter_cache_manager_firebase/lib/src/firebase_cache_manager.dart @@ -8,18 +8,21 @@ import 'firebase_http_file_service.dart'; class FirebaseCacheManager extends CacheManager { static const key = 'firebaseCache'; - static final FirebaseCacheManager _instance = FirebaseCacheManager._(null); + static final FirebaseCacheManager _instance = + FirebaseCacheManager._(retryOptions: retryOptions, bucket: bucket); - final RetryOptions? retryOptions; + static RetryOptions? retryOptions; - factory FirebaseCacheManager() { + static String? bucket; + + factory FirebaseCacheManager({RetryOptions? retryOptions, String? bucket}) { + bucket = bucket; + retryOptions = retryOptions; return _instance; } - FirebaseCacheManager.retry({this.retryOptions = const RetryOptions()}) + FirebaseCacheManager._({RetryOptions? retryOptions, String? bucket}) : super(Config(key, - fileService: FirebaseHttpFileService(retryOptions: retryOptions))); - - FirebaseCacheManager._(this.retryOptions) - : super(Config(key, fileService: FirebaseHttpFileService())); + fileService: FirebaseHttpFileService( + retryOptions: retryOptions, bucket: bucket))); } diff --git a/flutter_cache_manager_firebase/lib/src/firebase_http_file_service.dart b/flutter_cache_manager_firebase/lib/src/firebase_http_file_service.dart index 301d0947..f7a6da5f 100644 --- a/flutter_cache_manager_firebase/lib/src/firebase_http_file_service.dart +++ b/flutter_cache_manager_firebase/lib/src/firebase_http_file_service.dart @@ -10,12 +10,21 @@ class FirebaseHttpFileService extends HttpFileService { FirebaseHttpFileService({ this.retryOptions, - }); + this.bucket, + }) : super(); + + final String? bucket; @override Future get(String url, {Map? headers}) async { - var ref = FirebaseStorage.instance.ref().child(url); + late Reference ref; + if (bucket != null) { + ref = + FirebaseStorage.instanceFor(bucket: "gs://$bucket").ref().child(url); + } else { + ref = FirebaseStorage.instance.ref().child(url); + } String downloadUrl; if (retryOptions != null) { From 69b888988c5dc63f34f0c37a3d9f5b480c6e4b22 Mon Sep 17 00:00:00 2001 From: minhdanh Date: Sun, 23 Jun 2024 09:08:42 +0700 Subject: [PATCH 44/53] Update related README --- flutter_cache_manager_firebase/README.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/flutter_cache_manager_firebase/README.md b/flutter_cache_manager_firebase/README.md index 9a2f2c60..28df01a2 100644 --- a/flutter_cache_manager_firebase/README.md +++ b/flutter_cache_manager_firebase/README.md @@ -6,9 +6,16 @@ A Firebase implementation for [flutter_cache_manager](https://pub.dev/packages/f This library contains FirebaseCacheManager and FirebaseHttpFileService. -You can easily fetch a file stored on Firebase with +You can easily fetch a file stored on Firebase with ```dart var file = await FirebaseCacheManager().getSingleFile(url); ``` -You could also write your own CacheManager which uses the FirebaseHttpFileService. \ No newline at end of file +You could also write your own CacheManager which uses the FirebaseHttpFileService. + +### Custom Firebase storage bucket + +You can use a custom bucket by passing `bucket` parameter. For example: +```dart +FirebaseCacheManager(bucket: "my-bucket"); +``` From 199a0c4cb20bc2d9d5c6d899bce1f25d1ceb7978 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 31 Jul 2024 23:02:12 +0200 Subject: [PATCH 45/53] Update changelogs --- flutter_cache_manager/CHANGELOG.md | 7 ++++++- flutter_cache_manager/pubspec.yaml | 2 +- flutter_cache_manager_firebase/CHANGELOG.md | 6 ++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/flutter_cache_manager/CHANGELOG.md b/flutter_cache_manager/CHANGELOG.md index 1d84e049..5d122841 100644 --- a/flutter_cache_manager/CHANGELOG.md +++ b/flutter_cache_manager/CHANGELOG.md @@ -1,6 +1,11 @@ -## [3.3.4] - 2023-12-05 +## [3.4.0] - 2024-08-01 * [Bugfix] For a previously cached file that got removed on the server, now evicts that file on 404 and notifies listeners. +* Allow to override ifNoneMatchHeader +* Get cache total size +* Export File System +* Expose memoryCacheContainsKey method from cache_store +* Updates dependencies ## [3.3.3] - 2024-07-23 diff --git a/flutter_cache_manager/pubspec.yaml b/flutter_cache_manager/pubspec.yaml index c0a8e293..cf64132c 100644 --- a/flutter_cache_manager/pubspec.yaml +++ b/flutter_cache_manager/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_cache_manager description: Generic cache manager for flutter. Saves web files on the storages of the device and saves the cache info using sqflite. -version: 3.3.3 +version: 3.4.0 homepage: https://github.com/Baseflow/flutter_cache_manager/tree/develop/flutter_cache_manager topics: - cache diff --git a/flutter_cache_manager_firebase/CHANGELOG.md b/flutter_cache_manager_firebase/CHANGELOG.md index 6628afc3..d0d6fa3b 100644 --- a/flutter_cache_manager_firebase/CHANGELOG.md +++ b/flutter_cache_manager_firebase/CHANGELOG.md @@ -1,3 +1,9 @@ +## [2.1.0] - 2024-08-01 + +* Support setting a bucket +* Add retry options +* Updates dependencies + ## [2.0.3] - 2024-07-23 * Updates dependencies ([#457](https://github.com/Baseflow/flutter_cache_manager/pull/457)) From 28499e67f4b51efe540f8214aa202805891bc87c Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 31 Jul 2024 23:13:58 +0200 Subject: [PATCH 46/53] CI --- .github/workflows/build-firebase.yaml | 158 ++++++++++++++++++++++++++ .github/workflows/build.yaml | 96 ++++++++++++++++ 2 files changed, 254 insertions(+) create mode 100644 .github/workflows/build-firebase.yaml diff --git a/.github/workflows/build-firebase.yaml b/.github/workflows/build-firebase.yaml new file mode 100644 index 00000000..639ed443 --- /dev/null +++ b/.github/workflows/build-firebase.yaml @@ -0,0 +1,158 @@ +name: build firebase + +# Controls when the action will run. Triggers the workflow on push or pull request +# events but only for the develop branch +on: + push: + branches: [develop, main] + paths: + - "flutter_cache_manager_firebase/**" + - ".github/workflows/**" + pull_request: + branches: [develop] + paths: + - "flutter_cache_manager_firebase/**" + - ".github/workflows/**" + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + format: + name: Format + + # The type of runner that the job will run on + runs-on: ubuntu-latest + + env: + source-directory: ./flutter_cache_manager_firebase_firebase + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v4 + + # Make sure the stable version of Flutter is available + - name: Set up Flutter + uses: subosito/flutter-action@v2 + with: + channel: "stable" + architecture: x64 + cache: true + + # Download all Flutter packages + - name: Download dependencies + run: flutter pub get + working-directory: ${{env.source-directory}} + + # Run Flutter Format to ensure formatting is valid + - name: Run Flutter Format + run: dart format --set-exit-if-changed . + working-directory: ${{env.source-directory}} + + analyze: + name: Analyze + + # The type of runner that the job will run on + runs-on: ubuntu-latest + + env: + source-directory: ./flutter_cache_manager_firebase + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v4 + + # Make sure the stable version of Flutter is available + - name: Set up Flutter + uses: subosito/flutter-action@v2 + with: + channel: "stable" + architecture: x64 + cache: true + + # Download all Flutter packages + - name: Download dependencies + run: flutter pub get + working-directory: ${{env.source-directory}} + + # Run Flutter Analyzer + - name: Run Flutter Analyzer + run: flutter analyze + working-directory: ${{env.source-directory}} + + tests: + name: Unit-tests + # The type of runner that the job will run on + runs-on: ubuntu-latest + + env: + source-directory: ./flutter_cache_manager_firebase + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v4 + + # Make sure the stable version of Flutter is available + - name: Set up Flutter + uses: subosito/flutter-action@v2 + with: + channel: "stable" + architecture: x64 + cache: true + + # Download all Flutter packages + - name: Download dependencies + run: flutter pub get + working-directory: ${{env.source-directory}} + + # Run all unit-tests with code coverage + - name: Run unit tests + run: flutter test --coverage + working-directory: ${{env.source-directory}} + + # # Upload code coverage information + # - uses: codecov/codecov-action@v4 + # env: + # CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + # with: + # files: ${{env.source-directory}}/coverage/lcov.info + # name: CacheManager + # fail_ci_if_error: true + + publish_cache_manager_firebase: + if: ${{ github.ref_type == 'tag' }} + name: Publish Cache Manager Firebase + permissions: + id-token: write + needs: [format, analyze, tests] + # The type of runner that the job will run on + runs-on: ubuntu-latest + + env: + source-directory: ./flutter_cache_manager_firebase + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v4 + + - name: Set up Dart + uses: dart-lang/setup-dart@v1 + + # Make sure the stable version of Flutter is available + - name: Set up Flutter + uses: subosito/flutter-action@v2 + with: + channel: "stable" + architecture: x64 + cache: true + + # Download all Flutter packages + - name: Download dependencies + run: flutter pub get + working-directory: ${{env.source-directory}} + + # Publish the package + - name: Publish package + run: dart pub publish -v -f diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 977a0797..daeacd21 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -347,3 +347,99 @@ jobs: # files: ${{env.source-directory}}/coverage/lcov.info # name: CacheManager # fail_ci_if_error: true + + publish_cache_manager: + if: ${{ github.ref_type == 'tag' }} + name: Publish CacheManager + permissions: + id-token: write + needs: + [ + format, + analyze, + tests, + build_android, + build_ios, + build_macOS, + build_windows, + build_linux, + build_web, + ] + # The type of runner that the job will run on + runs-on: ubuntu-latest + + env: + source-directory: ./flutter_cache_manager + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v4 + + - name: Set up Dart + uses: dart-lang/setup-dart@v1 + + # Make sure the stable version of Flutter is available + - name: Set up Flutter + uses: subosito/flutter-action@v2 + with: + channel: "stable" + architecture: x64 + cache: true + + # Download all Flutter packages + - name: Download dependencies + run: flutter pub get + working-directory: ${{env.source-directory}} + + # Publish the package + - name: Publish package + run: dart pub publish -v -f + + publish_cache_manager_firebase: + if: ${{ github.ref_type == 'tag' }} + name: Publish Cache Manager Firebase + permissions: + id-token: write + needs: + [ + format, + analyze, + tests, + build_android, + build_ios, + build_macOS, + build_windows, + build_linux, + build_web, + ] + # The type of runner that the job will run on + runs-on: ubuntu-latest + + env: + source-directory: ./flutter_cache_manager_firebase + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v4 + + - name: Set up Dart + uses: dart-lang/setup-dart@v1 + + # Make sure the stable version of Flutter is available + - name: Set up Flutter + uses: subosito/flutter-action@v2 + with: + channel: "stable" + architecture: x64 + cache: true + + # Download all Flutter packages + - name: Download dependencies + run: flutter pub get + working-directory: ${{env.source-directory}} + + # Publish the package + - name: Publish package + run: dart pub publish -v -f From 0099da296d6aae884f86e4f768a67aefea65e253 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 31 Jul 2024 23:15:24 +0200 Subject: [PATCH 47/53] Typo --- .github/workflows/build-firebase.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-firebase.yaml b/.github/workflows/build-firebase.yaml index 639ed443..143a821a 100644 --- a/.github/workflows/build-firebase.yaml +++ b/.github/workflows/build-firebase.yaml @@ -23,7 +23,7 @@ jobs: runs-on: ubuntu-latest env: - source-directory: ./flutter_cache_manager_firebase_firebase + source-directory: ./flutter_cache_manager_firebase # Steps represent a sequence of tasks that will be executed as part of the job steps: From 3a22bd42971383da5bae2e8fac2d91d668ddc573 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 31 Jul 2024 23:17:17 +0200 Subject: [PATCH 48/53] Disable test --- .github/workflows/build-firebase.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-firebase.yaml b/.github/workflows/build-firebase.yaml index 143a821a..57a0629e 100644 --- a/.github/workflows/build-firebase.yaml +++ b/.github/workflows/build-firebase.yaml @@ -107,9 +107,9 @@ jobs: working-directory: ${{env.source-directory}} # Run all unit-tests with code coverage - - name: Run unit tests - run: flutter test --coverage - working-directory: ${{env.source-directory}} + # - name: Run unit tests + # run: flutter test --coverage + # working-directory: ${{env.source-directory}} # # Upload code coverage information # - uses: codecov/codecov-action@v4 From b638540d3ad92d20f182e8ce48457837ff4c2938 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 31 Jul 2024 23:25:49 +0200 Subject: [PATCH 49/53] CI --- .github/workflows/build-firebase.yaml | 6 +++++- .github/workflows/build.yaml | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-firebase.yaml b/.github/workflows/build-firebase.yaml index 57a0629e..040a9a38 100644 --- a/.github/workflows/build-firebase.yaml +++ b/.github/workflows/build-firebase.yaml @@ -3,13 +3,17 @@ name: build firebase # Controls when the action will run. Triggers the workflow on push or pull request # events but only for the develop branch on: + workflow_dispatch: + push: + tags: + - "*" branches: [develop, main] paths: - "flutter_cache_manager_firebase/**" - ".github/workflows/**" pull_request: - branches: [develop] + branches: [develop, main] paths: - "flutter_cache_manager_firebase/**" - ".github/workflows/**" diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index daeacd21..ccc161da 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -3,13 +3,17 @@ name: build # Controls when the action will run. Triggers the workflow on push or pull request # events but only for the develop branch on: + workflow_dispatch: + push: + tags: + - "*" branches: [develop, main] paths: - "flutter_cache_manager/**" - ".github/workflows/**" pull_request: - branches: [develop] + branches: [develop, main] paths: - "flutter_cache_manager/**" - ".github/workflows/**" From 87edbb1adfcf1a0cf8cb9c647436689a51020ade Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 31 Jul 2024 23:42:25 +0200 Subject: [PATCH 50/53] Fix path --- .github/workflows/build-firebase.yaml | 1 + .github/workflows/build.yaml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/build-firebase.yaml b/.github/workflows/build-firebase.yaml index 040a9a38..040847e9 100644 --- a/.github/workflows/build-firebase.yaml +++ b/.github/workflows/build-firebase.yaml @@ -160,3 +160,4 @@ jobs: # Publish the package - name: Publish package run: dart pub publish -v -f + working-directory: ${{env.source-directory}} diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index ccc161da..3becb8e1 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -447,3 +447,4 @@ jobs: # Publish the package - name: Publish package run: dart pub publish -v -f + working-directory: ${{env.source-directory}} From a79168ff160d849bc1b2f6771e7adabd1b308c88 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 31 Jul 2024 23:53:01 +0200 Subject: [PATCH 51/53] Remove firebase from normal build --- .github/workflows/build.yaml | 48 ------------------------------------ 1 file changed, 48 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 3becb8e1..15614d28 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -375,54 +375,6 @@ jobs: env: source-directory: ./flutter_cache_manager - # Steps represent a sequence of tasks that will be executed as part of the job - steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v4 - - - name: Set up Dart - uses: dart-lang/setup-dart@v1 - - # Make sure the stable version of Flutter is available - - name: Set up Flutter - uses: subosito/flutter-action@v2 - with: - channel: "stable" - architecture: x64 - cache: true - - # Download all Flutter packages - - name: Download dependencies - run: flutter pub get - working-directory: ${{env.source-directory}} - - # Publish the package - - name: Publish package - run: dart pub publish -v -f - - publish_cache_manager_firebase: - if: ${{ github.ref_type == 'tag' }} - name: Publish Cache Manager Firebase - permissions: - id-token: write - needs: - [ - format, - analyze, - tests, - build_android, - build_ios, - build_macOS, - build_windows, - build_linux, - build_web, - ] - # The type of runner that the job will run on - runs-on: ubuntu-latest - - env: - source-directory: ./flutter_cache_manager_firebase - # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it From 730e1b82be8018d69478e909c57897a57ff35bf5 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Thu, 1 Aug 2024 00:16:15 +0200 Subject: [PATCH 52/53] Update firebase --- flutter_cache_manager_firebase/pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flutter_cache_manager_firebase/pubspec.yaml b/flutter_cache_manager_firebase/pubspec.yaml index 18bd7396..292a5ef3 100644 --- a/flutter_cache_manager_firebase/pubspec.yaml +++ b/flutter_cache_manager_firebase/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_cache_manager_firebase description: CacheManager implementation for firebase_storage. Uses the gs:// as key and translates to https:// -version: 2.0.3 +version: 2.1.0 homepage: https://github.com/Baseflow/flutter_cache_manager environment: @@ -9,7 +9,7 @@ environment: dependencies: flutter: sdk: flutter - flutter_cache_manager: ^3.3.3 + flutter_cache_manager: ^3.4.0 firebase_storage: '>=12.0.0 <13.0.0' path_provider: ^2.1.2 path: ^1.9.0 From a42c7c8eb91fcb303c4cbab0a320fc3d17d73da1 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Thu, 1 Aug 2024 14:57:16 +0200 Subject: [PATCH 53/53] Only allow correct tags --- .github/workflows/build-firebase.yaml | 2 +- .github/workflows/build.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-firebase.yaml b/.github/workflows/build-firebase.yaml index 040847e9..71451485 100644 --- a/.github/workflows/build-firebase.yaml +++ b/.github/workflows/build-firebase.yaml @@ -7,7 +7,7 @@ on: push: tags: - - "*" + - "firebase-v[0-9]+.[0-9]+.[0-9]+*" branches: [develop, main] paths: - "flutter_cache_manager_firebase/**" diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 15614d28..08bfb396 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -7,7 +7,7 @@ on: push: tags: - - "*" + - "v[0-9]+.[0-9]+.[0-9]+*" branches: [develop, main] paths: - "flutter_cache_manager/**"