diff --git a/packages/path_provider/path_provider/lib/path_provider.dart b/packages/path_provider/path_provider/lib/path_provider.dart index e690b7f92960..6fa2d2d1ca86 100644 --- a/packages/path_provider/path_provider/lib/path_provider.dart +++ b/packages/path_provider/path_provider/lib/path_provider.dart @@ -210,7 +210,7 @@ Future?> getExternalStorageDirectories({ /// Path to the directory where downloaded files can be stored. /// This is typically only relevant on desktop operating systems. /// -/// On Android and on iOS, this function throws an [UnsupportedError] as no equivalent +/// On iOS, this function throws an [UnsupportedError] as no equivalent /// path exists. Future getDownloadsDirectory() async { final String? path = await _platform.getDownloadsPath(); diff --git a/packages/path_provider/path_provider_android/CHANGELOG.md b/packages/path_provider/path_provider_android/CHANGELOG.md index 628bd442c42f..64300d618cda 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.0 + +* Added implementation of getDownloadsDirectory + ## 2.0.9 * Updates Android compileSdkVersion to 31. diff --git a/packages/path_provider/path_provider_android/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java b/packages/path_provider/path_provider_android/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java index 3ff2416527d0..75b2e3710832 100644 --- a/packages/path_provider/path_provider_android/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java +++ b/packages/path_provider/path_provider_android/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java @@ -9,6 +9,7 @@ import android.os.Build.VERSION_CODES; import android.os.Handler; import android.os.Looper; +import android.os.Environment; import android.util.Log; import androidx.annotation.NonNull; import com.google.common.util.concurrent.FutureCallback; @@ -55,6 +56,8 @@ private interface PathProviderImpl { void getStorageDirectory(@NonNull Result result); + void getDownloadsDirectory(@NonNull Result result); + void getExternalCacheDirectories(@NonNull Result result); void getExternalStorageDirectories(@NonNull String directoryName, @NonNull Result result); @@ -84,6 +87,10 @@ public void getStorageDirectory(@NonNull Result result) { executeInBackground(() -> getPathProviderStorageDirectory(), result); } + public void getDownloadsDirectory(@NonNull Result result) { + executeInBackground(() -> getPathProviderDownloadsDirectory(), result); + } + public void getExternalCacheDirectories(@NonNull Result result) { executeInBackground(() -> getPathProviderExternalCacheDirectories(), result); } @@ -136,6 +143,10 @@ public void getStorageDirectory(@NonNull Result result) { result.success(getPathProviderStorageDirectory()); } + public void getDownloadsDirectory(@NonNull Result result) { + result.success(getPathProviderDownloadsDirectory()); + } + public void getExternalCacheDirectories(@NonNull Result result) { result.success(getPathProviderExternalCacheDirectories()); } @@ -206,6 +217,9 @@ public void onMethodCall(MethodCall call, @NonNull Result result) { case "getStorageDirectory": impl.getStorageDirectory(result); break; + case "getDownloadsDirectory": + impl.getDownloadsDirectory(result); + break; case "getExternalCacheDirectories": impl.getExternalCacheDirectories(result); break; @@ -242,6 +256,10 @@ private String getPathProviderStorageDirectory() { return dir.getAbsolutePath(); } + private String getPathProviderDownloadsDirectory() { + return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(); + } + private List getPathProviderExternalCacheDirectories() { final List paths = new ArrayList(); 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 6e04f865bfcf..0f3f3ecde0eb 100644 --- a/packages/path_provider/path_provider_android/example/lib/main.dart +++ b/packages/path_provider/path_provider_android/example/lib/main.dart @@ -36,6 +36,7 @@ class _MyHomePageState extends State { final PathProviderPlatform provider = PathProviderPlatform.instance; Future? _tempDirectory; Future? _appSupportDirectory; + Future? _downloadsDirectory; Future? _appDocumentsDirectory; Future? _externalDocumentsDirectory; Future?>? _externalStorageDirectories; @@ -90,6 +91,12 @@ class _MyHomePageState extends State { }); } + void _requestDownloadsDirectory() { + setState(() { + _downloadsDirectory = provider.getDownloadsPath(); + }); + } + void _requestExternalStorageDirectory() { setState(() { _externalDocumentsDirectory = provider.getExternalStoragePath(); @@ -143,6 +150,15 @@ class _MyHomePageState extends State { onPressed: _requestAppSupportDirectory, ), ), + FutureBuilder( + future: _downloadsDirectory, builder: _buildDirectory), + Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + child: const Text('Get Downloads Directory'), + onPressed: _requestDownloadsDirectory, + ), + ), FutureBuilder( future: _appSupportDirectory, builder: _buildDirectory), Padding( diff --git a/packages/path_provider/path_provider_android/pubspec.yaml b/packages/path_provider/path_provider_android/pubspec.yaml index 09b26a5efedb..3d48e20f3ee8 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/plugins/tree/master/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.0.9 +version: 2.1.0 environment: sdk: ">=2.14.0 <3.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 eec0fe3866b5..cbdd38e1e513 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.0.1 * Update platform_plugin_interface version requirement. diff --git a/packages/path_provider/path_provider_platform_interface/lib/src/method_channel_path_provider.dart b/packages/path_provider/path_provider_platform_interface/lib/src/method_channel_path_provider.dart index 007787444adb..d3ce0177a213 100644 --- a/packages/path_provider/path_provider_platform_interface/lib/src/method_channel_path_provider.dart +++ b/packages/path_provider/path_provider_platform_interface/lib/src/method_channel_path_provider.dart @@ -84,8 +84,8 @@ class MethodChannelPathProvider extends PathProviderPlatform { @override Future getDownloadsPath() { - if (!_platform.isMacOS) { - throw UnsupportedError('Functionality only available on macOS'); + if (_platform.isIOS) { + throw UnsupportedError('Functionality not available on iOS'); } return methodChannel.invokeMethod('getDownloadsDirectory'); } diff --git a/packages/path_provider/path_provider_platform_interface/pubspec.yaml b/packages/path_provider/path_provider_platform_interface/pubspec.yaml index 7fe5e8dfc232..d72f95761837 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/plugins/tree/master/packages/path_provide 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.0.1 +version: 2.0.2 environment: sdk: ">=2.12.0 <3.0.0" diff --git a/packages/path_provider/path_provider_platform_interface/test/method_channel_path_provider_test.dart b/packages/path_provider/path_provider_platform_interface/test/method_channel_path_provider_test.dart index 69c9b2b01f19..c5b4483bfc95 100644 --- a/packages/path_provider/path_provider_platform_interface/test/method_channel_path_provider_test.dart +++ b/packages/path_provider/path_provider_platform_interface/test/method_channel_path_provider_test.dart @@ -192,9 +192,20 @@ void main() { expect(result, kDownloadsPath); }); - test('getDownloadsPath non-macos fails', () async { + test('getDownloadsPath Android succeeds', () async { methodChannelPathProvider.setMockPathProviderPlatform( FakePlatform(operatingSystem: 'android')); + final String? result = await methodChannelPathProvider.getDownloadsPath(); + expect( + log, + [isMethodCall('getDownloadsDirectory', arguments: null)], + ); + expect(result, kDownloadsPath); + }); + + test('getDownloadsPath iOS fails', () async { + methodChannelPathProvider + .setMockPathProviderPlatform(FakePlatform(operatingSystem: 'ios')); try { await methodChannelPathProvider.getDownloadsPath(); fail('should throw UnsupportedError');