From b702fd6d8b437655c1aa27940787db6ac22bab13 Mon Sep 17 00:00:00 2001 From: Alex Li Date: Wed, 6 Dec 2023 23:05:24 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Integrate=20`PermissionRequestOptio?= =?UTF-8?q?n`=20for=20callers=20(#517)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 6 ++ example/android/app/build.gradle | 4 +- .../customs/pickers/insta_asset_picker.dart | 10 +++- .../pickers/multi_tabs_assets_picker.dart | 9 ++- example/pubspec.yaml | 2 +- guides/migration_guide.md | 60 +++++++++++++++++++ lib/src/delegates/asset_picker_delegate.dart | 21 +++++-- lib/src/widget/asset_picker.dart | 6 +- lib/src/widget/asset_picker_viewer.dart | 8 ++- pubspec.yaml | 2 +- test/test_utils.dart | 13 +++- 11 files changed, 124 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index be982615..7d27ccf8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ that can be found in the LICENSE file. --> See the [Migration Guide](guides/migration_guide.md) for the details of breaking changes between versions. +## 9.0.0-dev.1 + +### Breaking changes + +- Integrate `PermissionRequestOption` for callers. + ## 8.9.0-dev.1 ### Breaking changes diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 86d1add7..960c4110 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'kotlin-kapt' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 33 + compileSdkVersion 34 sourceSets { main.java.srcDirs += 'src/main/kotlin' @@ -40,7 +40,7 @@ android { defaultConfig { applicationId "com.fluttercandies.wechatAssetsPickerExample" minSdkVersion 21 - targetSdkVersion 33 + targetSdkVersion 34 versionCode flutterVersionCode.toInteger() versionName flutterVersionName testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/example/lib/customs/pickers/insta_asset_picker.dart b/example/lib/customs/pickers/insta_asset_picker.dart index 6e6da18e..d0003572 100644 --- a/example/lib/customs/pickers/insta_asset_picker.dart +++ b/example/lib/customs/pickers/insta_asset_picker.dart @@ -59,8 +59,14 @@ class _InstaAssetPickerState extends State { } Future callPicker(BuildContext context) async { - final PermissionState ps = await AssetPicker.permissionCheck(); - + final PermissionState ps = await AssetPicker.permissionCheck( + requestOption: PermissionRequestOption( + androidPermission: AndroidPermission( + type: provider.requestType, + mediaLocation: false, + ), + ), + ); final InstaAssetPickerBuilder builder = InstaAssetPickerBuilder( provider: provider, initialPermission: ps, diff --git a/example/lib/customs/pickers/multi_tabs_assets_picker.dart b/example/lib/customs/pickers/multi_tabs_assets_picker.dart index ad919e03..3750b157 100644 --- a/example/lib/customs/pickers/multi_tabs_assets_picker.dart +++ b/example/lib/customs/pickers/multi_tabs_assets_picker.dart @@ -30,7 +30,14 @@ class _MultiTabAssetPickerState extends State { bool isDisplayingDetail = true; Future callPicker(BuildContext context) async { - final PermissionState ps = await AssetPicker.permissionCheck(); + final PermissionState ps = await AssetPicker.permissionCheck( + requestOption: const PermissionRequestOption( + androidPermission: AndroidPermission( + type: RequestType.all, + mediaLocation: false, + ), + ), + ); final DefaultAssetPickerProvider provider = DefaultAssetPickerProvider( selectedAssets: entities, diff --git a/example/pubspec.yaml b/example/pubspec.yaml index cc0eb2b7..f2840e93 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -1,6 +1,6 @@ name: wechat_assets_picker_demo description: The demo project for the wechat_assets_picker package. -version: 8.8.0+47 +version: 9.0.0+48 publish_to: none environment: diff --git a/guides/migration_guide.md b/guides/migration_guide.md index c5399273..6de65974 100644 --- a/guides/migration_guide.md +++ b/guides/migration_guide.md @@ -8,6 +8,7 @@ This document gathered all breaking changes and migrations requirement between m ## Major versions +- [9.0.0](#900) - [8.6.0](#860) - [8.3.0](#830) - [8.2.0](#820) @@ -16,6 +17,65 @@ This document gathered all breaking changes and migrations requirement between m - [6.0.0](#600) - [5.0.0](#500) +## 9.0.0 + +### Summary + +`PermissionRequestOption` has been added to +`AssetPickerDelegate.permissionCheck` and +`AssetPickerDelegate.pickAssetsWithDelegate` as an argument. +Classes that extend `AssetPickerDelegate` and override these methods must migrate, +Delegates that use `AssetPicker.permissionCheck` +should choose whether to pass the request option. + +### Details + +Before: + +1. ```dart + AssetPicker.permissionCheck(); + ``` + +2. ```dart + Future permissionCheck(); + ``` + +3. ```dart + Future?> pickAssetsWithDelegate>( + BuildContext context, { + required AssetPickerBuilderDelegate delegate, + Key? key, + bool useRootNavigator = true, + AssetPickerPageRouteBuilder>? pageRouteBuilder, + }) + ``` + +After: + +1. ```dart + AssetPicker.permissionCheck(requestOption: ...); + ``` + +2. ```dart + Future permissionCheck({ + PermissionRequestOption requestOption = const PermissionRequestOption, + }); + ``` + +3. ```dart + Future?> pickAssetsWithDelegate>( + BuildContext context, { + required AssetPickerBuilderDelegate delegate, + PermissionRequestOption requestOption = + const PermissionRequestOption, + Key? key, + bool useRootNavigator = true, + AssetPickerPageRouteBuilder>? pageRouteBuilder, + }) + ``` + ## 8.6.0 ### Summary diff --git a/lib/src/delegates/asset_picker_delegate.dart b/lib/src/delegates/asset_picker_delegate.dart index d4ff44d6..5181f17e 100644 --- a/lib/src/delegates/asset_picker_delegate.dart +++ b/lib/src/delegates/asset_picker_delegate.dart @@ -29,8 +29,12 @@ class AssetPickerDelegate { /// See also: /// * [PermissionState] which defined all states of required permissions. /// {@endtemplate} - Future permissionCheck() async { - final PermissionState ps = await PhotoManager.requestPermissionExtend(); + Future permissionCheck({ + PermissionRequestOption requestOption = const PermissionRequestOption(), + }) async { + final PermissionState ps = await PhotoManager.requestPermissionExtend( + requestOption: requestOption, + ); if (ps != PermissionState.authorized && ps != PermissionState.limited) { throw StateError('Permission state error with $ps.'); } @@ -64,7 +68,14 @@ class AssetPickerDelegate { bool useRootNavigator = true, AssetPickerPageRouteBuilder>? pageRouteBuilder, }) async { - final PermissionState ps = await permissionCheck(); + final PermissionState ps = await permissionCheck( + requestOption: PermissionRequestOption( + androidPermission: AndroidPermission( + type: pickerConfig.requestType, + mediaLocation: false, + ), + ), + ); final AssetPickerPageRoute> route = pageRouteBuilder?.call(const SizedBox.shrink()) ?? AssetPickerPageRoute>( @@ -134,11 +145,13 @@ class AssetPickerDelegate { PickerProvider extends AssetPickerProvider>( BuildContext context, { required AssetPickerBuilderDelegate delegate, + PermissionRequestOption permissionRequestOption = + const PermissionRequestOption(), Key? key, bool useRootNavigator = true, AssetPickerPageRouteBuilder>? pageRouteBuilder, }) async { - await permissionCheck(); + await permissionCheck(requestOption: permissionRequestOption); final Widget picker = AssetPicker( key: key, builder: delegate, diff --git a/lib/src/widget/asset_picker.dart b/lib/src/widget/asset_picker.dart index 7e83313e..755fb444 100644 --- a/lib/src/widget/asset_picker.dart +++ b/lib/src/widget/asset_picker.dart @@ -31,8 +31,10 @@ class AssetPicker extends StatefulWidget { } /// {@macro wechat_assets_picker.delegates.AssetPickerDelegate.permissionCheck} - static Future permissionCheck() { - return _pickerDelegate.permissionCheck(); + static Future permissionCheck({ + PermissionRequestOption requestOption = const PermissionRequestOption(), + }) { + return _pickerDelegate.permissionCheck(requestOption: requestOption); } /// {@macro wechat_assets_picker.delegates.AssetPickerDelegate.pickAssets} diff --git a/lib/src/widget/asset_picker_viewer.dart b/lib/src/widget/asset_picker_viewer.dart index 5290f2dc..a9b6a21b 100644 --- a/lib/src/widget/asset_picker_viewer.dart +++ b/lib/src/widget/asset_picker_viewer.dart @@ -41,8 +41,10 @@ class AssetPickerViewer extends StatefulWidget { int? maxAssets, bool shouldReversePreview = false, AssetSelectPredicate? selectPredicate, + PermissionRequestOption permissionRequestOption = + const PermissionRequestOption(), }) async { - await AssetPicker.permissionCheck(); + await AssetPicker.permissionCheck(requestOption: permissionRequestOption); final Widget viewer = AssetPickerViewer( builder: DefaultAssetPickerViewerBuilderDelegate( currentIndex: currentIndex, @@ -82,8 +84,10 @@ class AssetPickerViewer extends StatefulWidget { static Future?> pushToViewerWithDelegate( BuildContext context, { required AssetPickerViewerBuilderDelegate delegate, + PermissionRequestOption permissionRequestOption = + const PermissionRequestOption(), }) async { - await AssetPicker.permissionCheck(); + await AssetPicker.permissionCheck(requestOption: permissionRequestOption); final Widget viewer = AssetPickerViewer(builder: delegate); final PageRouteBuilder> pageRoute = PageRouteBuilder>( pageBuilder: (_, __, ___) => viewer, diff --git a/pubspec.yaml b/pubspec.yaml index 96d4b5e6..049e253c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: wechat_assets_picker -version: 8.9.0-dev.1 +version: 9.0.0-dev.1 description: | An image picker (also with videos and audio) for Flutter projects based on WeChat's UI, diff --git a/test/test_utils.dart b/test/test_utils.dart index 7b1a1279..c0bb1fd7 100644 --- a/test/test_utils.dart +++ b/test/test_utils.dart @@ -73,7 +73,9 @@ class TestPhotoManagerPlugin extends PhotoManagerPlugin { class TestAssetPickerDelegate extends AssetPickerDelegate { @override - Future permissionCheck() async { + Future permissionCheck({ + PermissionRequestOption requestOption = const PermissionRequestOption(), + }) async { return SynchronousFuture(PermissionState.authorized); } @@ -85,7 +87,14 @@ class TestAssetPickerDelegate extends AssetPickerDelegate { bool useRootNavigator = true, AssetPickerPageRouteBuilder>? pageRouteBuilder, }) async { - final PermissionState ps = await permissionCheck(); + final PermissionState ps = await permissionCheck( + requestOption: PermissionRequestOption( + androidPermission: AndroidPermission( + type: pickerConfig.requestType, + mediaLocation: false, + ), + ), + ); final AssetPathEntity pathEntity = AssetPathEntity( id: 'test', name: 'pathEntity',