Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ class FakeImagePicker extends ImagePickerPlatform {
required ImageSource source,
CameraDevice preferredCameraDevice = CameraDevice.rear,
Duration? maxDuration,
VideoQuality quality = VideoQuality.high,
}) async {
return XFile(source == ImageSource.camera ? 'cameraVideo' : 'galleryVideo');
}
Expand Down
5 changes: 5 additions & 0 deletions packages/image_picker/image_picker/lib/image_picker.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export 'package:image_picker_platform_interface/image_picker_platform_interface.
LostDataResponse,
PickedFile,
RetrieveType,
VideoQuality,
XFile,
kTypeImage,
kTypeVideo;
Expand Down Expand Up @@ -277,6 +278,8 @@ class ImagePicker {
/// The `preferredCameraDevice` is ignored when `source` is [ImageSource.gallery]. It is also ignored if the chosen camera is not supported on the device.
/// Defaults to [CameraDevice.rear].
///
/// The [quality] argument specifies the video quality for recording/picking. Defaults to [VideoQuality.high].
///
/// In Android, the MainActivity can be destroyed for various reasons. If that happens, the result will be lost
/// in this call. You can then call [retrieveLostData] when your app relaunches to retrieve the lost data.
///
Expand All @@ -289,11 +292,13 @@ class ImagePicker {
required ImageSource source,
CameraDevice preferredCameraDevice = CameraDevice.rear,
Duration? maxDuration,
VideoQuality quality = VideoQuality.high,
}) {
return platform.getVideo(
source: source,
preferredCameraDevice: preferredCameraDevice,
maxDuration: maxDuration,
quality: quality,
);
}

Expand Down
51 changes: 50 additions & 1 deletion packages/image_picker/image_picker/test/image_picker_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,7 @@ void main() {
source: anyNamed('source'),
preferredCameraDevice: anyNamed('preferredCameraDevice'),
maxDuration: anyNamed('maxDuration'),
quality: anyNamed('quality'),
),
).thenAnswer((Invocation _) async => null);
});
Expand Down Expand Up @@ -390,6 +391,49 @@ void main() {
]);
});

test('video quality defaults to high', () async {
final picker = ImagePicker();
await picker.pickVideo(source: ImageSource.camera);

verify(
mockPlatform.getVideo(
source: ImageSource.camera,
quality: VideoQuality.high,
),
);
});

test('passes the video quality argument correctly', () async {
final picker = ImagePicker();
await picker.pickVideo(
source: ImageSource.camera,
quality: VideoQuality.low,
);
await picker.pickVideo(
source: ImageSource.camera,
quality: VideoQuality.medium,
);
await picker.pickVideo(
source: ImageSource.camera,
quality: VideoQuality.high,
);

verifyInOrder(<Object>[
mockPlatform.getVideo(
source: ImageSource.camera,
quality: VideoQuality.low,
),
mockPlatform.getVideo(
source: ImageSource.camera,
quality: VideoQuality.medium,
),
mockPlatform.getVideo(
source: ImageSource.camera,
quality: VideoQuality.high,
),
]);
});

test('handles a null video file response gracefully', () async {
final picker = ImagePicker();

Expand All @@ -401,7 +445,12 @@ void main() {
final picker = ImagePicker();
await picker.pickVideo(source: ImageSource.camera);

verify(mockPlatform.getVideo(source: ImageSource.camera));
verify(
mockPlatform.getVideo(
source: ImageSource.camera,
quality: VideoQuality.high,
),
);
});

test('camera position can set to front', () async {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import 'package:mockito/mockito.dart' as _i1;
// ignore_for_file: unnecessary_parenthesis
// ignore_for_file: camel_case_types
// ignore_for_file: subtype_of_sealed_class
// ignore_for_file: invalid_use_of_internal_member

class _FakeLostData_0 extends _i1.SmartFake implements _i2.LostData {
_FakeLostData_0(Object parent, Invocation parentInvocation)
Expand Down Expand Up @@ -156,12 +157,14 @@ class MockImagePickerPlatform extends _i1.Mock
required _i2.ImageSource? source,
_i2.CameraDevice? preferredCameraDevice = _i2.CameraDevice.rear,
Duration? maxDuration,
_i2.VideoQuality? quality = _i2.VideoQuality.high,
}) =>
(super.noSuchMethod(
Invocation.method(#getVideo, [], {
#source: source,
#preferredCameraDevice: preferredCameraDevice,
#maxDuration: maxDuration,
#quality: quality,
}),
returnValue: _i4.Future<_i5.XFile?>.value(),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -389,6 +389,10 @@ private void launchTakeVideoWithCameraIntent() {
int maxSeconds = localVideoOptions.getMaxDurationSeconds().intValue();
intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, maxSeconds);
}
if (localVideoOptions != null && localVideoOptions.getVideoQuality() != null) {
int videoQuality = localVideoOptions.getVideoQuality().intValue();
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, videoQuality);
}
if (cameraDevice == CameraDevice.FRONT) {
useFrontCamera(intent);
}
Expand Down
Loading