blob: 90e86bf486b41a834fc0b59f90065c2f1b260e4e [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import 'package:file_selector_platform_interface/file_selector_platform_interface.dart';
import 'package:file_selector_windows/file_selector_windows.dart';
import 'package:flutter/foundation.dart';
import 'package:image_picker_platform_interface/image_picker_platform_interface.dart';
/// The Windows implementation of [ImagePickerPlatform].
///
/// This class implements the `package:image_picker` functionality for
/// Windows.
class ImagePickerWindows extends ImagePickerPlatform {
/// Constructs a ImagePickerWindows.
ImagePickerWindows();
/// List of image extensions used when picking images
@visibleForTesting
static const List<String> imageFormats = <String>[
'jpg',
'jpeg',
'png',
'bmp',
'webp',
'gif',
'tif',
'tiff',
'apng'
];
/// List of video extensions used when picking videos
@visibleForTesting
static const List<String> videoFormats = <String>[
'mov',
'wmv',
'mkv',
'mp4',
'webm',
'avi',
'mpeg',
'mpg'
];
/// The file selector used to prompt the user to select images or videos.
@visibleForTesting
static FileSelectorPlatform fileSelector = FileSelectorWindows();
/// Registers this class as the default instance of [ImagePickerPlatform].
static void registerWith() {
ImagePickerPlatform.instance = ImagePickerWindows();
}
// `maxWidth`, `maxHeight`, `imageQuality` and `preferredCameraDevice`
// arguments are not supported on Windows. If any of these arguments
// is supplied, it'll be silently ignored by the Windows version of
// the plugin. `source` is not implemented for `ImageSource.camera`
// and will throw an exception.
@override
Future<PickedFile?> pickImage({
required ImageSource source,
double? maxWidth,
double? maxHeight,
int? imageQuality,
CameraDevice preferredCameraDevice = CameraDevice.rear,
}) async {
final XFile? file = await getImage(
source: source,
maxWidth: maxWidth,
maxHeight: maxHeight,
imageQuality: imageQuality,
preferredCameraDevice: preferredCameraDevice);
if (file != null) {
return PickedFile(file.path);
}
return null;
}
// `preferredCameraDevice` and `maxDuration` arguments are not
// supported on Windows. If any of these arguments is supplied,
// it'll be silently ignored by the Windows version of the plugin.
// `source` is not implemented for `ImageSource.camera` and will
// throw an exception.
@override
Future<PickedFile?> pickVideo({
required ImageSource source,
CameraDevice preferredCameraDevice = CameraDevice.rear,
Duration? maxDuration,
}) async {
final XFile? file = await getVideo(
source: source,
preferredCameraDevice: preferredCameraDevice,
maxDuration: maxDuration);
if (file != null) {
return PickedFile(file.path);
}
return null;
}
// `maxWidth`, `maxHeight`, `imageQuality`, and `preferredCameraDevice`
// arguments are not supported on Windows. If any of these arguments
// is supplied, it'll be silently ignored by the Windows version
// of the plugin. `source` is not implemented for `ImageSource.camera`
// and will throw an exception.
@override
Future<XFile?> getImage({
required ImageSource source,
double? maxWidth,
double? maxHeight,
int? imageQuality,
CameraDevice preferredCameraDevice = CameraDevice.rear,
}) async {
if (source != ImageSource.gallery) {
// TODO(azchohfi): Support ImageSource.camera.
// See https://github.com/flutter/flutter/issues/102115
throw UnimplementedError(
'ImageSource.gallery is currently the only supported source on Windows');
}
const XTypeGroup typeGroup =
XTypeGroup(label: 'images', extensions: imageFormats);
final XFile? file = await fileSelector
.openFile(acceptedTypeGroups: <XTypeGroup>[typeGroup]);
return file;
}
// `preferredCameraDevice` and `maxDuration` arguments are not
// supported on Windows. If any of these arguments is supplied,
// it'll be silently ignored by the Windows version of the plugin.
// `source` is not implemented for `ImageSource.camera` and will
// throw an exception.
@override
Future<XFile?> getVideo({
required ImageSource source,
CameraDevice preferredCameraDevice = CameraDevice.rear,
Duration? maxDuration,
}) async {
if (source != ImageSource.gallery) {
// TODO(azchohfi): Support ImageSource.camera.
// See https://github.com/flutter/flutter/issues/102115
throw UnimplementedError(
'ImageSource.gallery is currently the only supported source on Windows');
}
const XTypeGroup typeGroup =
XTypeGroup(label: 'videos', extensions: videoFormats);
final XFile? file = await fileSelector
.openFile(acceptedTypeGroups: <XTypeGroup>[typeGroup]);
return file;
}
// `maxWidth`, `maxHeight`, and `imageQuality` arguments are not
// supported on Windows. If any of these arguments is supplied,
// it'll be silently ignored by the Windows version of the plugin.
@override
Future<List<XFile>> getMultiImage({
double? maxWidth,
double? maxHeight,
int? imageQuality,
}) async {
const XTypeGroup typeGroup =
XTypeGroup(label: 'images', extensions: imageFormats);
final List<XFile> files = await fileSelector
.openFiles(acceptedTypeGroups: <XTypeGroup>[typeGroup]);
return files;
}
}