- 
                Notifications
    You must be signed in to change notification settings 
- Fork 3.5k
          [image_picker_android] Inline sdk guard logic from internal isSystemPickerAvailable$activity_release()
          #10314
        
          New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
| It looks like this pull request may not have tests. Please make sure to add tests or get an explicit test exemption before merging. If you are not sure if you need tests, consider this rule of thumb: the purpose of a test is to make sure someone doesn't accidentally revert the fix. Ask yourself, is there anything in your PR that you feel it is important we not accidentally revert back to how it was before your fix? Reviewers: Read the Tree Hygiene page and make sure this patch meets those guidelines before LGTMing. If you believe this PR qualifies for a test exemption, contact "@test-exemption-reviewer" in the #hackers channel in Discord (don't just cc them here, they won't see it!). The test exemption team is a small volunteer group, so all reviewers should feel empowered to ask for tests, without delegating that responsibility entirely to the test exemption group. | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request inlines the internal isSystemPickerAvailable$activity_release() check. While the inlining is correct, it carries over a bug from the original implementation that would cause a crash on Android versions 11 and 12. The call to MediaStore.getPickImagesMaxLimit() is not guarded correctly, as it's only available on Android 13 (API 33) and above. I've provided a suggestion to fix this critical issue by simplifying the condition to check only for API level 33, which also has the side benefit of removing the need for the newly added SdkExtensions import.
| if (Build.VERSION.SDK_INT >= 33 || (Build.VERSION.SDK_INT >= 30 && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2)) { | ||
| return MediaStore.getPickImagesMaxLimit(); | ||
| } else { | ||
| return Integer.MAX_VALUE; | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This logic, while correctly inlining the check for the system photo picker, perpetuates a bug from the original code that will cause a crash on devices running Android 11 (API 30) to Android 12L (API 32).
The method MediaStore.getPickImagesMaxLimit() is only available on API 33+ (Android 13). The current condition allows this method to be called on API 30-32 if the photo picker is available via a system extension, which will result in a NoSuchMethodError at runtime.
I suggest simplifying the logic to only check for API 33+, as that's the only level where getPickImagesMaxLimit() is guaranteed to exist. For lower API levels, ACTION_PICK_IMAGES only supports single-item selection, and any fallback mechanism (like ACTION_GET_CONTENT) doesn't have a standard limit, so returning Integer.MAX_VALUE is appropriate.
This change will fix the crash and simplify the code. As a result, the android.os.ext.SdkExtensions import will no longer be needed and can be removed. The @SuppressLint("ClassVerificationFailure") may also no longer be necessary.
| if (Build.VERSION.SDK_INT >= 33 || (Build.VERSION.SDK_INT >= 30 && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2)) { | |
| return MediaStore.getPickImagesMaxLimit(); | |
| } else { | |
| return Integer.MAX_VALUE; | |
| if (Build.VERSION.SDK_INT >= 33) { | |
| return MediaStore.getPickImagesMaxLimit(); | |
| } else { | |
| return Integer.MAX_VALUE; | |
| } | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Seems wrong, based on
https://developer.android.com/reference/android/provider/MediaStore#getPickImagesMaxLimit()
!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks for jumping on this!
| test-exempt: code refactor with no semantic change | 
… `isSystemPickerAvailable$activity_release()` (flutter/packages#10314)
flutter/packages@c8ba0cc...41c6b3d 2025-10-28 [email protected] [image_picker_android] Inline sdk guard logic from internal `isSystemPickerAvailable$activity_release()` (flutter/packages#10314) 2025-10-28 [email protected] Roll Flutter from 4c91098 to 7cf0dc1 (31 revisions) (flutter/packages#10311) 2025-10-28 [email protected] [camera] Implement setDescription with android camerax (flutter/packages#10117) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-packages-flutter-autoroll Please CC [email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
…r#177725) flutter/packages@c8ba0cc...41c6b3d 2025-10-28 [email protected] [image_picker_android] Inline sdk guard logic from internal `isSystemPickerAvailable$activity_release()` (flutter/packages#10314) 2025-10-28 [email protected] Roll Flutter from 4c91098 to 7cf0dc1 (31 revisions) (flutter/packages#10311) 2025-10-28 [email protected] [camera] Implement setDescription with android camerax (flutter/packages#10117) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-packages-flutter-autoroll Please CC [email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
Inlines the check, copying the logic and then applying quick fixes that AS suggested to simplify.
Fixes flutter/flutter#177673
Pre-Review Checklist
[shared_preferences]pubspec.yamlwith an appropriate new version according to the pub versioning philosophy, or I have commented below to indicate which version change exemption this PR falls under1.CHANGELOG.mdto add a description of the change, following repository CHANGELOG style, or I have commented below to indicate which CHANGELOG exemption this PR falls under1.///).If you need help, consider asking for advice on the #hackers-new channel on Discord.
Note: The Flutter team is currently trialing the use of Gemini Code Assist for GitHub. Comments from the
gemini-code-assistbot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed.Footnotes
Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling. ↩ ↩2 ↩3