From 46f685dfd1dc3eed7d552b7b7fc00d8ad0c5e781 Mon Sep 17 00:00:00 2001 From: Talha Javed Khan Date: Tue, 15 Aug 2023 18:29:07 +0500 Subject: [PATCH 01/10] Fix4559: Added getDownloadsDirectory() for Android --- .../path_provider/example/lib/main.dart | 10 ++-------- .../path_provider_android/CHANGELOG.md | 4 ++++ .../path_provider_android/example/lib/main.dart | 16 ++++++++++++++++ .../lib/path_provider_android.dart | 6 ++++-- .../path_provider_android/pubspec.yaml | 2 +- .../test/path_provider_android_test.dart | 10 +++------- .../CHANGELOG.md | 4 ++++ .../pubspec.yaml | 2 +- 8 files changed, 35 insertions(+), 19 deletions(-) diff --git a/packages/path_provider/path_provider/example/lib/main.dart b/packages/path_provider/path_provider/example/lib/main.dart index fcf0e138a65e..bbded68c8d81 100644 --- a/packages/path_provider/path_provider/example/lib/main.dart +++ b/packages/path_provider/path_provider/example/lib/main.dart @@ -302,14 +302,8 @@ class _MyHomePageState extends State { Padding( padding: const EdgeInsets.all(16.0), child: ElevatedButton( - onPressed: Platform.isAndroid || Platform.isIOS - ? null - : _requestDownloadsDirectory, - child: Text( - Platform.isAndroid || Platform.isIOS - ? 'Downloads directory is unavailable' - : 'Get Downloads Directory', - ), + onPressed: _requestDownloadsDirectory, + child: const Text('Get Downloads Directory'), ), ), FutureBuilder( diff --git a/packages/path_provider/path_provider_android/CHANGELOG.md b/packages/path_provider/path_provider_android/CHANGELOG.md index f829dcc73b6f..5d3f89f9018f 100644 --- a/packages/path_provider/path_provider_android/CHANGELOG.md +++ b/packages/path_provider/path_provider_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.1.1 + +- Added implementation of getDownloadsDirectory for Android + ## 2.1.0 * Adds getApplicationCachePath() for storing app-specific cache files. diff --git a/packages/path_provider/path_provider_android/example/lib/main.dart b/packages/path_provider/path_provider_android/example/lib/main.dart index 79293e155c01..29ce6f191550 100644 --- a/packages/path_provider/path_provider_android/example/lib/main.dart +++ b/packages/path_provider/path_provider_android/example/lib/main.dart @@ -41,6 +41,7 @@ class _MyHomePageState extends State { Future? _appDocumentsDirectory; Future? _appCacheDirectory; Future? _externalDocumentsDirectory; + Future? _externalDownloadsDirectory; Future?>? _externalStorageDirectories; Future?>? _externalCacheDirectories; @@ -118,6 +119,12 @@ class _MyHomePageState extends State { }); } + void _requestDownloadsDirectory() { + setState(() { + _externalDownloadsDirectory = provider.getDownloadsPath(); + }); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -199,6 +206,15 @@ class _MyHomePageState extends State { ]), FutureBuilder?>( future: _externalCacheDirectories, builder: _buildDirectories), + Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + onPressed: _requestDownloadsDirectory, + child: const Text('Get Downloads Directory'), + ), + ), + FutureBuilder( + future: _externalDownloadsDirectory, builder: _buildDirectory), ], ), ), diff --git a/packages/path_provider/path_provider_android/lib/path_provider_android.dart b/packages/path_provider/path_provider_android/lib/path_provider_android.dart index c65b0abc30b9..749be00130a7 100644 --- a/packages/path_provider/path_provider_android/lib/path_provider_android.dart +++ b/packages/path_provider/path_provider_android/lib/path_provider_android.dart @@ -86,7 +86,9 @@ class PathProviderAndroid extends PathProviderPlatform { } @override - Future getDownloadsPath() { - throw UnsupportedError('getDownloadsPath is not supported on Android'); + Future getDownloadsPath() async { + final List? paths = + await getExternalStoragePaths(type: StorageDirectory.downloads); + return (paths != null && paths.isNotEmpty) ? paths.first : null; } } diff --git a/packages/path_provider/path_provider_android/pubspec.yaml b/packages/path_provider/path_provider_android/pubspec.yaml index 42c4ba1b1a1d..bcf2021b2d6d 100644 --- a/packages/path_provider/path_provider_android/pubspec.yaml +++ b/packages/path_provider/path_provider_android/pubspec.yaml @@ -2,7 +2,7 @@ name: path_provider_android description: Android implementation of the path_provider plugin. repository: https://github.com/flutter/packages/tree/main/packages/path_provider/path_provider_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+path_provider%22 -version: 2.1.0 +version: 2.1.1 environment: sdk: ">=2.18.0 <4.0.0" diff --git a/packages/path_provider/path_provider_android/test/path_provider_android_test.dart b/packages/path_provider/path_provider_android/test/path_provider_android_test.dart index 5f94da6c4f3c..21c217a9116c 100644 --- a/packages/path_provider/path_provider_android/test/path_provider_android_test.dart +++ b/packages/path_provider/path_provider_android/test/path_provider_android_test.dart @@ -98,13 +98,9 @@ void main() { }); } // end of for-loop - test('getDownloadsPath fails', () async { - try { - await pathProvider.getDownloadsPath(); - fail('should throw UnsupportedError'); - } catch (e) { - expect(e, isUnsupportedError); - } + test('getDownloadsPath succeeds', () async { + final String? path = await pathProvider.getDownloadsPath(); + expect(path, kExternalStoragePaths); }); }); } diff --git a/packages/path_provider/path_provider_platform_interface/CHANGELOG.md b/packages/path_provider/path_provider_platform_interface/CHANGELOG.md index 051c0e5323cf..4e5f7568637a 100644 --- a/packages/path_provider/path_provider_platform_interface/CHANGELOG.md +++ b/packages/path_provider/path_provider_platform_interface/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.2 + +- Updated getDownloadsDirectory platform compatibility + ## 2.1.0 * Adds getApplicationCachePath() for storing app-specific cache files. diff --git a/packages/path_provider/path_provider_platform_interface/pubspec.yaml b/packages/path_provider/path_provider_platform_interface/pubspec.yaml index 44eb59aa4a66..e431dc122129 100644 --- a/packages/path_provider/path_provider_platform_interface/pubspec.yaml +++ b/packages/path_provider/path_provider_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/path_provider issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+path_provider%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.1.0 +version: 2.1.1 environment: sdk: ">=2.18.0 <4.0.0" From 0404fe84c0a723fb074cfad47f3983f59d9f4b43 Mon Sep 17 00:00:00 2001 From: Talha Javed Khan Date: Tue, 15 Aug 2023 19:33:53 +0500 Subject: [PATCH 02/10] Removed changes from path_provider example --- .../path_provider/path_provider/example/lib/main.dart | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/path_provider/path_provider/example/lib/main.dart b/packages/path_provider/path_provider/example/lib/main.dart index bbded68c8d81..fcf0e138a65e 100644 --- a/packages/path_provider/path_provider/example/lib/main.dart +++ b/packages/path_provider/path_provider/example/lib/main.dart @@ -302,8 +302,14 @@ class _MyHomePageState extends State { Padding( padding: const EdgeInsets.all(16.0), child: ElevatedButton( - onPressed: _requestDownloadsDirectory, - child: const Text('Get Downloads Directory'), + onPressed: Platform.isAndroid || Platform.isIOS + ? null + : _requestDownloadsDirectory, + child: Text( + Platform.isAndroid || Platform.isIOS + ? 'Downloads directory is unavailable' + : 'Get Downloads Directory', + ), ), ), FutureBuilder( From 1b1b64f6e5664ef42d73ea3926efda02f6608447 Mon Sep 17 00:00:00 2001 From: Talha Javed Khan Date: Tue, 15 Aug 2023 19:39:44 +0500 Subject: [PATCH 03/10] Updated Changelog --- .../path_provider/path_provider_platform_interface/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/path_provider/path_provider_platform_interface/CHANGELOG.md b/packages/path_provider/path_provider_platform_interface/CHANGELOG.md index 4e5f7568637a..1c81925b4b92 100644 --- a/packages/path_provider/path_provider_platform_interface/CHANGELOG.md +++ b/packages/path_provider/path_provider_platform_interface/CHANGELOG.md @@ -1,4 +1,4 @@ -## 2.0.2 +## 2.1.1 - Updated getDownloadsDirectory platform compatibility From 197128f42c7937e1f9f86a7876b1032d7dca21b5 Mon Sep 17 00:00:00 2001 From: Talha Javed Khan Date: Tue, 15 Aug 2023 20:44:14 +0500 Subject: [PATCH 04/10] Updated Changelog and Versions --- packages/path_provider/path_provider_android/CHANGELOG.md | 4 ++-- packages/path_provider/path_provider_android/pubspec.yaml | 2 +- .../path_provider_platform_interface/CHANGELOG.md | 4 ---- .../path_provider_platform_interface/pubspec.yaml | 2 +- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/packages/path_provider/path_provider_android/CHANGELOG.md b/packages/path_provider/path_provider_android/CHANGELOG.md index 5d3f89f9018f..118f77e90177 100644 --- a/packages/path_provider/path_provider_android/CHANGELOG.md +++ b/packages/path_provider/path_provider_android/CHANGELOG.md @@ -1,6 +1,6 @@ -## 2.1.1 +## 2.2.0 -- Added implementation of getDownloadsDirectory for Android +* Adds implementation of getDownloadsDirectory for Android. ## 2.1.0 diff --git a/packages/path_provider/path_provider_android/pubspec.yaml b/packages/path_provider/path_provider_android/pubspec.yaml index bcf2021b2d6d..d4596d39a1b3 100644 --- a/packages/path_provider/path_provider_android/pubspec.yaml +++ b/packages/path_provider/path_provider_android/pubspec.yaml @@ -2,7 +2,7 @@ name: path_provider_android description: Android implementation of the path_provider plugin. repository: https://github.com/flutter/packages/tree/main/packages/path_provider/path_provider_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+path_provider%22 -version: 2.1.1 +version: 2.2.0 environment: sdk: ">=2.18.0 <4.0.0" diff --git a/packages/path_provider/path_provider_platform_interface/CHANGELOG.md b/packages/path_provider/path_provider_platform_interface/CHANGELOG.md index 1c81925b4b92..051c0e5323cf 100644 --- a/packages/path_provider/path_provider_platform_interface/CHANGELOG.md +++ b/packages/path_provider/path_provider_platform_interface/CHANGELOG.md @@ -1,7 +1,3 @@ -## 2.1.1 - -- Updated getDownloadsDirectory platform compatibility - ## 2.1.0 * Adds getApplicationCachePath() for storing app-specific cache files. diff --git a/packages/path_provider/path_provider_platform_interface/pubspec.yaml b/packages/path_provider/path_provider_platform_interface/pubspec.yaml index e431dc122129..44eb59aa4a66 100644 --- a/packages/path_provider/path_provider_platform_interface/pubspec.yaml +++ b/packages/path_provider/path_provider_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/path_provider issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+path_provider%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.1.1 +version: 2.1.0 environment: sdk: ">=2.18.0 <4.0.0" From 045a68fc69ca855ee5be3f6245cc1b3a19ea4203 Mon Sep 17 00:00:00 2001 From: Talha Javed Khan Date: Fri, 18 Aug 2023 20:53:16 +0500 Subject: [PATCH 05/10] Added test for null and empty cases --- .../path_provider_android/CHANGELOG.md | 2 - .../plugins/pathprovider/Messages.java | 2 +- .../path_provider_android/lib/messages.g.dart | 9 +---- .../lib/path_provider_android.dart | 2 +- .../pigeons/messages.dart | 2 +- .../test/messages_test.g.dart | 4 +- .../test/path_provider_android_test.dart | 39 ++++++++++++++++++- 7 files changed, 44 insertions(+), 16 deletions(-) diff --git a/packages/path_provider/path_provider_android/CHANGELOG.md b/packages/path_provider/path_provider_android/CHANGELOG.md index 6eeea0aeb73a..14636086ee31 100644 --- a/packages/path_provider/path_provider_android/CHANGELOG.md +++ b/packages/path_provider/path_provider_android/CHANGELOG.md @@ -1,8 +1,6 @@ ## 2.2.0 * Adds implementation of getDownloadsDirectory for Android. -## NEXT - * Updates minimum supported SDK version to Flutter 3.7/Dart 2.19. ## 2.1.0 diff --git a/packages/path_provider/path_provider_android/android/src/main/java/io/flutter/plugins/pathprovider/Messages.java b/packages/path_provider/path_provider_android/android/src/main/java/io/flutter/plugins/pathprovider/Messages.java index 1bfa729157db..ce1e74d3c56d 100644 --- a/packages/path_provider/path_provider_android/android/src/main/java/io/flutter/plugins/pathprovider/Messages.java +++ b/packages/path_provider/path_provider_android/android/src/main/java/io/flutter/plugins/pathprovider/Messages.java @@ -93,7 +93,7 @@ public interface PathProviderApi { @NonNull List getExternalCachePaths(); - @NonNull + @Nullable List getExternalStoragePaths(@NonNull StorageDirectory directory); /** The codec used by PathProviderApi. */ diff --git a/packages/path_provider/path_provider_android/lib/messages.g.dart b/packages/path_provider/path_provider_android/lib/messages.g.dart index 20d4368d5d44..c4594ecc15fe 100644 --- a/packages/path_provider/path_provider_android/lib/messages.g.dart +++ b/packages/path_provider/path_provider_android/lib/messages.g.dart @@ -166,7 +166,7 @@ class PathProviderApi { } } - Future> getExternalStoragePaths( + Future?> getExternalStoragePaths( StorageDirectory arg_directory) async { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.PathProviderApi.getExternalStoragePaths', codec, @@ -184,13 +184,8 @@ class PathProviderApi { message: replyList[1] as String?, details: replyList[2], ); - } else if (replyList[0] == null) { - throw PlatformException( - code: 'null-error', - message: 'Host platform returned null value for non-null return value.', - ); } else { - return (replyList[0] as List?)!.cast(); + return (replyList[0] as List?)?.cast(); } } } diff --git a/packages/path_provider/path_provider_android/lib/path_provider_android.dart b/packages/path_provider/path_provider_android/lib/path_provider_android.dart index 749be00130a7..f2805cc06b82 100644 --- a/packages/path_provider/path_provider_android/lib/path_provider_android.dart +++ b/packages/path_provider/path_provider_android/lib/path_provider_android.dart @@ -82,7 +82,7 @@ class PathProviderAndroid extends PathProviderPlatform { StorageDirectory? type, }) async { return (await _api.getExternalStoragePaths(_convertStorageDirectory(type))) - .cast(); + ?.cast(); } @override diff --git a/packages/path_provider/path_provider_android/pigeons/messages.dart b/packages/path_provider/path_provider_android/pigeons/messages.dart index 6e4eb8f1956e..4603181ce324 100644 --- a/packages/path_provider/path_provider_android/pigeons/messages.dart +++ b/packages/path_provider/path_provider_android/pigeons/messages.dart @@ -42,5 +42,5 @@ abstract class PathProviderApi { @TaskQueue(type: TaskQueueType.serialBackgroundThread) List getExternalCachePaths(); @TaskQueue(type: TaskQueueType.serialBackgroundThread) - List getExternalStoragePaths(StorageDirectory directory); + List? getExternalStoragePaths(StorageDirectory directory); } diff --git a/packages/path_provider/path_provider_android/test/messages_test.g.dart b/packages/path_provider/path_provider_android/test/messages_test.g.dart index e18fc9699969..8b293d4aa91c 100644 --- a/packages/path_provider/path_provider_android/test/messages_test.g.dart +++ b/packages/path_provider/path_provider_android/test/messages_test.g.dart @@ -30,7 +30,7 @@ abstract class TestPathProviderApi { List getExternalCachePaths(); - List getExternalStoragePaths(StorageDirectory directory); + List? getExternalStoragePaths(StorageDirectory directory); static void setup(TestPathProviderApi? api, {BinaryMessenger? binaryMessenger}) { @@ -155,7 +155,7 @@ abstract class TestPathProviderApi { args[0] == null ? null : StorageDirectory.values[args[0] as int]; assert(arg_directory != null, 'Argument for dev.flutter.pigeon.PathProviderApi.getExternalStoragePaths was null, expected non-null StorageDirectory.'); - final List output = + final List? output = api.getExternalStoragePaths(arg_directory!); return [output]; }); diff --git a/packages/path_provider/path_provider_android/test/path_provider_android_test.dart b/packages/path_provider/path_provider_android/test/path_provider_android_test.dart index 21c217a9116c..40d2d275b37d 100644 --- a/packages/path_provider/path_provider_android/test/path_provider_android_test.dart +++ b/packages/path_provider/path_provider_android/test/path_provider_android_test.dart @@ -17,7 +17,16 @@ const String kExternalCachePaths = 'externalCachePaths'; const String kExternalStoragePaths = 'externalStoragePaths'; const String kDownloadsPath = 'downloadsPath'; +enum ExternalStoragePathsValueState { isNull, isEmpty, isNotEmpty } + class _Api implements TestPathProviderApi { + _Api({ + this.externalStoragePathsValueState = + ExternalStoragePathsValueState.isNotEmpty, + }); + + final ExternalStoragePathsValueState externalStoragePathsValueState; + @override String? getApplicationDocumentsPath() => kApplicationDocumentsPath; @@ -34,8 +43,16 @@ class _Api implements TestPathProviderApi { String? getExternalStoragePath() => kExternalStoragePaths; @override - List getExternalStoragePaths(messages.StorageDirectory directory) => - [kExternalStoragePaths]; + List? getExternalStoragePaths(messages.StorageDirectory directory) { + switch (externalStoragePathsValueState) { + case ExternalStoragePathsValueState.isNotEmpty: + return [kExternalStoragePaths]; + case ExternalStoragePathsValueState.isEmpty: + return []; + case ExternalStoragePathsValueState.isNull: + return null; + } + } @override String? getTemporaryPath() => kTemporaryPath; @@ -102,5 +119,23 @@ void main() { final String? path = await pathProvider.getDownloadsPath(); expect(path, kExternalStoragePaths); }); + + test('getDownloadsPath fails with null', () async { + final PathProviderAndroid pathProvider = PathProviderAndroid(); + TestPathProviderApi.setup(_Api( + externalStoragePathsValueState: + ExternalStoragePathsValueState.isNull)); + final String? path = await pathProvider.getDownloadsPath(); + expect(path, null); + }); + + test('getDownloadsPath fails with empty', () async { + final PathProviderAndroid pathProvider = PathProviderAndroid(); + TestPathProviderApi.setup(_Api( + externalStoragePathsValueState: + ExternalStoragePathsValueState.isEmpty)); + final String? path = await pathProvider.getDownloadsPath(); + expect(path, null); + }); }); } From aea4f5d7ffbd8436d29445630cb0093465b6f659 Mon Sep 17 00:00:00 2001 From: Talha Javed Khan <50271102+talhakhan1297@users.noreply.github.com> Date: Mon, 21 Aug 2023 23:03:21 +0500 Subject: [PATCH 06/10] Update packages/path_provider/path_provider_android/CHANGELOG.md Co-authored-by: Camille Simon <43054281+camsim99@users.noreply.github.com> --- packages/path_provider/path_provider_android/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/path_provider/path_provider_android/CHANGELOG.md b/packages/path_provider/path_provider_android/CHANGELOG.md index 14636086ee31..edfc3ba88e61 100644 --- a/packages/path_provider/path_provider_android/CHANGELOG.md +++ b/packages/path_provider/path_provider_android/CHANGELOG.md @@ -1,6 +1,6 @@ ## 2.2.0 -* Adds implementation of getDownloadsDirectory for Android. +* Adds implementation of getDownloadsDirectory. * Updates minimum supported SDK version to Flutter 3.7/Dart 2.19. ## 2.1.0 From 10a18dd12fb5b607e6eeed6dec33e36d2df7f582 Mon Sep 17 00:00:00 2001 From: Talha Javed Khan Date: Mon, 28 Aug 2023 22:42:50 +0500 Subject: [PATCH 07/10] Updated Tests description --- packages/path_provider/path_provider_android/CHANGELOG.md | 2 +- .../test/path_provider_android_test.dart | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/path_provider/path_provider_android/CHANGELOG.md b/packages/path_provider/path_provider_android/CHANGELOG.md index edfc3ba88e61..a73d5b8b5312 100644 --- a/packages/path_provider/path_provider_android/CHANGELOG.md +++ b/packages/path_provider/path_provider_android/CHANGELOG.md @@ -1,6 +1,6 @@ ## 2.2.0 -* Adds implementation of getDownloadsDirectory. +* Adds implementation of `getDownloadsDirectory()`. * Updates minimum supported SDK version to Flutter 3.7/Dart 2.19. ## 2.1.0 diff --git a/packages/path_provider/path_provider_android/test/path_provider_android_test.dart b/packages/path_provider/path_provider_android/test/path_provider_android_test.dart index 40d2d275b37d..ed2dbb8aa6b2 100644 --- a/packages/path_provider/path_provider_android/test/path_provider_android_test.dart +++ b/packages/path_provider/path_provider_android/test/path_provider_android_test.dart @@ -120,7 +120,9 @@ void main() { expect(path, kExternalStoragePaths); }); - test('getDownloadsPath fails with null', () async { + test( + 'getDownloadsPath returns null, when getExternalStoragePaths returns ' + 'null', () async { final PathProviderAndroid pathProvider = PathProviderAndroid(); TestPathProviderApi.setup(_Api( externalStoragePathsValueState: @@ -129,7 +131,9 @@ void main() { expect(path, null); }); - test('getDownloadsPath fails with empty', () async { + test( + 'getDownloadsPath returns null, when getExternalStoragePaths returns ' + 'an empty list', () async { final PathProviderAndroid pathProvider = PathProviderAndroid(); TestPathProviderApi.setup(_Api( externalStoragePathsValueState: From f50f6c8d35425162605b88fdd0862d4ca9bb56e4 Mon Sep 17 00:00:00 2001 From: Talha Javed Khan Date: Mon, 28 Aug 2023 23:49:15 +0500 Subject: [PATCH 08/10] Extracted _getExternalStoragePaths to fix nullable list issue --- .../flutter/plugins/pathprovider/Messages.java | 2 +- .../path_provider_android/lib/messages.g.dart | 9 +++++++-- .../lib/path_provider_android.dart | 16 +++++++++++----- .../path_provider_android/pigeons/messages.dart | 2 +- .../test/messages_test.g.dart | 4 ++-- .../test/path_provider_android_test.dart | 17 ++--------------- 6 files changed, 24 insertions(+), 26 deletions(-) diff --git a/packages/path_provider/path_provider_android/android/src/main/java/io/flutter/plugins/pathprovider/Messages.java b/packages/path_provider/path_provider_android/android/src/main/java/io/flutter/plugins/pathprovider/Messages.java index ce1e74d3c56d..1bfa729157db 100644 --- a/packages/path_provider/path_provider_android/android/src/main/java/io/flutter/plugins/pathprovider/Messages.java +++ b/packages/path_provider/path_provider_android/android/src/main/java/io/flutter/plugins/pathprovider/Messages.java @@ -93,7 +93,7 @@ public interface PathProviderApi { @NonNull List getExternalCachePaths(); - @Nullable + @NonNull List getExternalStoragePaths(@NonNull StorageDirectory directory); /** The codec used by PathProviderApi. */ diff --git a/packages/path_provider/path_provider_android/lib/messages.g.dart b/packages/path_provider/path_provider_android/lib/messages.g.dart index c4594ecc15fe..20d4368d5d44 100644 --- a/packages/path_provider/path_provider_android/lib/messages.g.dart +++ b/packages/path_provider/path_provider_android/lib/messages.g.dart @@ -166,7 +166,7 @@ class PathProviderApi { } } - Future?> getExternalStoragePaths( + Future> getExternalStoragePaths( StorageDirectory arg_directory) async { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.PathProviderApi.getExternalStoragePaths', codec, @@ -184,8 +184,13 @@ class PathProviderApi { message: replyList[1] as String?, details: replyList[2], ); + } else if (replyList[0] == null) { + throw PlatformException( + code: 'null-error', + message: 'Host platform returned null value for non-null return value.', + ); } else { - return (replyList[0] as List?)?.cast(); + return (replyList[0] as List?)!.cast(); } } } diff --git a/packages/path_provider/path_provider_android/lib/path_provider_android.dart b/packages/path_provider/path_provider_android/lib/path_provider_android.dart index f2805cc06b82..2a16155727b5 100644 --- a/packages/path_provider/path_provider_android/lib/path_provider_android.dart +++ b/packages/path_provider/path_provider_android/lib/path_provider_android.dart @@ -81,14 +81,20 @@ class PathProviderAndroid extends PathProviderPlatform { Future?> getExternalStoragePaths({ StorageDirectory? type, }) async { - return (await _api.getExternalStoragePaths(_convertStorageDirectory(type))) - ?.cast(); + return _getExternalStoragePaths(type: type); } @override Future getDownloadsPath() async { - final List? paths = - await getExternalStoragePaths(type: StorageDirectory.downloads); - return (paths != null && paths.isNotEmpty) ? paths.first : null; + final List paths = + await _getExternalStoragePaths(type: StorageDirectory.downloads); + return paths.isNotEmpty ? paths.first : null; + } + + Future> _getExternalStoragePaths({ + StorageDirectory? type, + }) async { + return (await _api.getExternalStoragePaths(_convertStorageDirectory(type))) + .cast(); } } diff --git a/packages/path_provider/path_provider_android/pigeons/messages.dart b/packages/path_provider/path_provider_android/pigeons/messages.dart index 4603181ce324..6e4eb8f1956e 100644 --- a/packages/path_provider/path_provider_android/pigeons/messages.dart +++ b/packages/path_provider/path_provider_android/pigeons/messages.dart @@ -42,5 +42,5 @@ abstract class PathProviderApi { @TaskQueue(type: TaskQueueType.serialBackgroundThread) List getExternalCachePaths(); @TaskQueue(type: TaskQueueType.serialBackgroundThread) - List? getExternalStoragePaths(StorageDirectory directory); + List getExternalStoragePaths(StorageDirectory directory); } diff --git a/packages/path_provider/path_provider_android/test/messages_test.g.dart b/packages/path_provider/path_provider_android/test/messages_test.g.dart index 8b293d4aa91c..e18fc9699969 100644 --- a/packages/path_provider/path_provider_android/test/messages_test.g.dart +++ b/packages/path_provider/path_provider_android/test/messages_test.g.dart @@ -30,7 +30,7 @@ abstract class TestPathProviderApi { List getExternalCachePaths(); - List? getExternalStoragePaths(StorageDirectory directory); + List getExternalStoragePaths(StorageDirectory directory); static void setup(TestPathProviderApi? api, {BinaryMessenger? binaryMessenger}) { @@ -155,7 +155,7 @@ abstract class TestPathProviderApi { args[0] == null ? null : StorageDirectory.values[args[0] as int]; assert(arg_directory != null, 'Argument for dev.flutter.pigeon.PathProviderApi.getExternalStoragePaths was null, expected non-null StorageDirectory.'); - final List? output = + final List output = api.getExternalStoragePaths(arg_directory!); return [output]; }); diff --git a/packages/path_provider/path_provider_android/test/path_provider_android_test.dart b/packages/path_provider/path_provider_android/test/path_provider_android_test.dart index ed2dbb8aa6b2..5c7eae924d31 100644 --- a/packages/path_provider/path_provider_android/test/path_provider_android_test.dart +++ b/packages/path_provider/path_provider_android/test/path_provider_android_test.dart @@ -17,7 +17,7 @@ const String kExternalCachePaths = 'externalCachePaths'; const String kExternalStoragePaths = 'externalStoragePaths'; const String kDownloadsPath = 'downloadsPath'; -enum ExternalStoragePathsValueState { isNull, isEmpty, isNotEmpty } +enum ExternalStoragePathsValueState { isEmpty, isNotEmpty } class _Api implements TestPathProviderApi { _Api({ @@ -43,14 +43,12 @@ class _Api implements TestPathProviderApi { String? getExternalStoragePath() => kExternalStoragePaths; @override - List? getExternalStoragePaths(messages.StorageDirectory directory) { + List getExternalStoragePaths(messages.StorageDirectory directory) { switch (externalStoragePathsValueState) { case ExternalStoragePathsValueState.isNotEmpty: return [kExternalStoragePaths]; case ExternalStoragePathsValueState.isEmpty: return []; - case ExternalStoragePathsValueState.isNull: - return null; } } @@ -120,17 +118,6 @@ void main() { expect(path, kExternalStoragePaths); }); - test( - 'getDownloadsPath returns null, when getExternalStoragePaths returns ' - 'null', () async { - final PathProviderAndroid pathProvider = PathProviderAndroid(); - TestPathProviderApi.setup(_Api( - externalStoragePathsValueState: - ExternalStoragePathsValueState.isNull)); - final String? path = await pathProvider.getDownloadsPath(); - expect(path, null); - }); - test( 'getDownloadsPath returns null, when getExternalStoragePaths returns ' 'an empty list', () async { From 38ea4c7e52be65a338a8324f904ff8edecd859a4 Mon Sep 17 00:00:00 2001 From: Talha Javed Khan Date: Tue, 29 Aug 2023 11:40:47 +0500 Subject: [PATCH 09/10] Replaced enum with bool and updated if condition. --- .../lib/path_provider_android.dart | 2 +- .../test/path_provider_android_test.dart | 22 ++++++------------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/packages/path_provider/path_provider_android/lib/path_provider_android.dart b/packages/path_provider/path_provider_android/lib/path_provider_android.dart index 2a16155727b5..20effb2f3c29 100644 --- a/packages/path_provider/path_provider_android/lib/path_provider_android.dart +++ b/packages/path_provider/path_provider_android/lib/path_provider_android.dart @@ -88,7 +88,7 @@ class PathProviderAndroid extends PathProviderPlatform { Future getDownloadsPath() async { final List paths = await _getExternalStoragePaths(type: StorageDirectory.downloads); - return paths.isNotEmpty ? paths.first : null; + return paths.isEmpty ? null : paths.first; } Future> _getExternalStoragePaths({ diff --git a/packages/path_provider/path_provider_android/test/path_provider_android_test.dart b/packages/path_provider/path_provider_android/test/path_provider_android_test.dart index 5c7eae924d31..48db095b6835 100644 --- a/packages/path_provider/path_provider_android/test/path_provider_android_test.dart +++ b/packages/path_provider/path_provider_android/test/path_provider_android_test.dart @@ -17,15 +17,10 @@ const String kExternalCachePaths = 'externalCachePaths'; const String kExternalStoragePaths = 'externalStoragePaths'; const String kDownloadsPath = 'downloadsPath'; -enum ExternalStoragePathsValueState { isEmpty, isNotEmpty } - class _Api implements TestPathProviderApi { - _Api({ - this.externalStoragePathsValueState = - ExternalStoragePathsValueState.isNotEmpty, - }); + _Api({this.returnsExternalStoragePaths = true}); - final ExternalStoragePathsValueState externalStoragePathsValueState; + final bool returnsExternalStoragePaths; @override String? getApplicationDocumentsPath() => kApplicationDocumentsPath; @@ -44,11 +39,10 @@ class _Api implements TestPathProviderApi { @override List getExternalStoragePaths(messages.StorageDirectory directory) { - switch (externalStoragePathsValueState) { - case ExternalStoragePathsValueState.isNotEmpty: - return [kExternalStoragePaths]; - case ExternalStoragePathsValueState.isEmpty: - return []; + if (returnsExternalStoragePaths) { + return [kExternalStoragePaths]; + } else { + return []; } } @@ -122,9 +116,7 @@ void main() { 'getDownloadsPath returns null, when getExternalStoragePaths returns ' 'an empty list', () async { final PathProviderAndroid pathProvider = PathProviderAndroid(); - TestPathProviderApi.setup(_Api( - externalStoragePathsValueState: - ExternalStoragePathsValueState.isEmpty)); + TestPathProviderApi.setup(_Api(returnsExternalStoragePaths: false)); final String? path = await pathProvider.getDownloadsPath(); expect(path, null); }); From b0b286430ee11cade091b1ef00fa17fd83036876 Mon Sep 17 00:00:00 2001 From: Talha Javed Khan Date: Tue, 29 Aug 2023 22:12:31 +0500 Subject: [PATCH 10/10] Updated if condition with modern dart implementation --- .../test/path_provider_android_test.dart | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/path_provider/path_provider_android/test/path_provider_android_test.dart b/packages/path_provider/path_provider_android/test/path_provider_android_test.dart index 48db095b6835..6d31a3cd6e50 100644 --- a/packages/path_provider/path_provider_android/test/path_provider_android_test.dart +++ b/packages/path_provider/path_provider_android/test/path_provider_android_test.dart @@ -39,11 +39,7 @@ class _Api implements TestPathProviderApi { @override List getExternalStoragePaths(messages.StorageDirectory directory) { - if (returnsExternalStoragePaths) { - return [kExternalStoragePaths]; - } else { - return []; - } + return [if (returnsExternalStoragePaths) kExternalStoragePaths]; } @override