diff --git a/CHANGELOG.md b/CHANGELOG.md index 8394762..39b5d78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,3 +20,7 @@ ## 1.0.0 - September 26th 2022 - Icons can be changed by Widgets instead of IconData. + +## 1.0.2 - Oktober 21st 2022 + +- ImagePickerService can be correctly injected into the widget. \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..fe891f8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,9 @@ +Copyright (c) 2022 Iconica, All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md index 0359618..557ba6c 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ Please file any issues, bugs or feature request as an issue on our [GitHub](http ## Want to contribute -If you would like to contribute to the plugin (e.g. by improving the documentation, solving a bug or adding a cool new feature), please carefully review our [contribution guide](../CONTRIBUTING.md) and send us your [pull request](URL TO PULL REQUEST TAB IN REPO). +If you would like to contribute to the plugin (e.g. by improving the documentation, solving a bug or adding a cool new feature), please carefully review our [contribution guide](../CONTRIBUTING.md) and send us your [pull request](https://github.com/Iconica-Development/flutter_image_picker/pulls). ## Author diff --git a/example/lib/main.dart b/example/lib/main.dart index 7f2c28e..66f03b1 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2022 Iconica +// +// SPDX-License-Identifier: BSD-3-Clause + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_image_picker/flutter_image_picker.dart'; diff --git a/example/pubspec.lock b/example/pubspec.lock index 3c87037..cc1a00f 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -68,7 +68,7 @@ packages: path: ".." relative: true source: path - version: "1.0.0" + version: "1.0.3" flutter_lints: dependency: "direct dev" description: diff --git a/lib/flutter_image_picker.dart b/lib/flutter_image_picker.dart index 042dada..3ba2563 100644 --- a/lib/flutter_image_picker.dart +++ b/lib/flutter_image_picker.dart @@ -1,5 +1,10 @@ +// SPDX-FileCopyrightText: 2022 Iconica +// +// SPDX-License-Identifier: BSD-3-Clause + library flutter_image_picker; +export 'src/services/image_picker_service.dart'; export 'src/models/image_picker_theme.dart'; export 'src/models/image_picker_config.dart'; export 'src/ui/image_picker.dart'; diff --git a/lib/src/models/image_picker_theme.dart b/lib/src/models/image_picker_theme.dart index e7aac6d..91e2dbc 100644 --- a/lib/src/models/image_picker_theme.dart +++ b/lib/src/models/image_picker_theme.dart @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2022 Iconica +// +// SPDX-License-Identifier: BSD-3-Clause + import 'package:flutter/material.dart'; class ImagePickerTheme { diff --git a/lib/src/services/image_picker_service.dart b/lib/src/services/image_picker_service.dart index f6fc870..5e0c217 100644 --- a/lib/src/services/image_picker_service.dart +++ b/lib/src/services/image_picker_service.dart @@ -1,18 +1,33 @@ -import 'dart:typed_data'; +// SPDX-FileCopyrightText: 2022 Iconica +// +// SPDX-License-Identifier: BSD-3-Clause +import 'dart:typed_data'; import 'package:flutter_image_picker/src/models/image_picker_config.dart'; import 'package:image_picker/image_picker.dart'; /// The Image Picker Service class is the functionality of the Image Picker package which uses the Image Picker package to choose an image. /// If you have your own implementation of the Image Picker you can add it to the constructor when creating the class. -class ImagePickerService { - ImagePickerService({this.imagePicker}); +abstract class ImagePickerService { + /// [pickImage] is the function that picks the image and returns it as a [Uint8List]. + /// The function requires [source], an [ImageSource] + Future pickImage( + ImageSource source, { + ImagePickerConfig? config, + }); +} + +/// The ImagePickerServiceDefault is the default implementation of the ImagePickerService. +/// It uses the Image Picker package to pick an image and returns it as a [Uint8List]. +class ImagePickerServiceDefault implements ImagePickerService { + ImagePickerServiceDefault({this.imagePicker}); /// It's possible to have your own implementation for the Image Picker if you don't want to use the Image Picker Package. ImagePicker? imagePicker; /// [pickImage] is the function that picks the image and returns it as a [Uint8List]. /// The function requires [source], an [ImageSource] that's the method of how the image needs to be picked, for example gallery or camera. + @override Future pickImage( ImageSource source, { ImagePickerConfig? config, diff --git a/lib/src/ui/image_picker.dart b/lib/src/ui/image_picker.dart index 1e46177..932c745 100644 --- a/lib/src/ui/image_picker.dart +++ b/lib/src/ui/image_picker.dart @@ -1,6 +1,9 @@ +// SPDX-FileCopyrightText: 2022 Iconica +// +// SPDX-License-Identifier: BSD-3-Clause + import 'package:flutter/material.dart'; import 'package:flutter_image_picker/flutter_image_picker.dart'; -import 'package:flutter_image_picker/src/services/image_picker_service.dart'; import 'package:image_picker/image_picker.dart'; /// The Image Picker class generates the Image Picker Widget which can be displayed in your application. If you call the class you can give it 4 optional variables: @@ -10,12 +13,12 @@ import 'package:image_picker/image_picker.dart'; /// The fourth one is a custom Button widget. class ImagePicker extends StatelessWidget { const ImagePicker({ - Key? key, this.imagePickerTheme = const ImagePickerTheme(), this.imagePickerConfig = const ImagePickerConfig(), this.imagePickerService, this.customButton, - }) : super(key: key); + super.key, + }); /// ImagePickerTheme can be used to change the UI of the Image Picker Widget to change the text/icons to your liking. final ImagePickerTheme imagePickerTheme; @@ -24,82 +27,84 @@ class ImagePicker extends StatelessWidget { final ImagePickerConfig imagePickerConfig; /// The Image Picker Dialog can have a custom button if you want to. - final StatelessWidget? customButton; + final Widget? customButton; /// The ImagePickerService can be used if you want to use your own implementation of the Image Service if you want to use it for testing or add more features. If null the current implementation will be used. final ImagePickerService? imagePickerService; @override - Widget build(BuildContext context) => SingleChildScrollView( - child: Column( - children: [ - ListTile( - tileColor: imagePickerTheme.titleBackgroundColor, - title: Text( - textAlign: imagePickerTheme.titleAlignment, - imagePickerTheme.title, - style: TextStyle( - fontFamily: imagePickerTheme.font, - fontSize: imagePickerTheme.titleTextSize, - color: imagePickerTheme.titleColor, - ), + Widget build(BuildContext context) { + return SingleChildScrollView( + child: Column( + children: [ + ListTile( + tileColor: imagePickerTheme.titleBackgroundColor, + title: Text( + textAlign: imagePickerTheme.titleAlignment, + imagePickerTheme.title, + style: TextStyle( + fontFamily: imagePickerTheme.font, + fontSize: imagePickerTheme.titleTextSize, + color: imagePickerTheme.titleColor, ), ), - const SizedBox(height: 20), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - _generateIconButtonWithText( - context, - imagePickerTheme.selectImageIcon, - imagePickerTheme, - Icons.image, - ImageSource.gallery, - imagePickerTheme.selectImageText, - ), - SizedBox( - width: imagePickerTheme.spaceBetweenIcons, - ), - _generateIconButtonWithText( - context, - imagePickerTheme.makePhotoIcon, - imagePickerTheme, - Icons.camera_alt_rounded, - ImageSource.camera, - imagePickerTheme.makePhotoText, - ), - ], - ), - const SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SizedBox( - width: imagePickerTheme.closeButtonWidth, - height: imagePickerTheme.closeButtonHeight, - child: customButton ?? - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: - imagePickerTheme.closeButtonBackgroundColor, - ), - onPressed: () => Navigator.of(context).pop(), - child: Text( - imagePickerTheme.closeButtonText, - style: TextStyle( - fontFamily: imagePickerTheme.font, - fontSize: imagePickerTheme.closeButtonTextSize, - color: imagePickerTheme.closeButtonTextColor, - ), + ), + const SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + _generateIconButtonWithText( + context, + imagePickerTheme.selectImageIcon, + imagePickerTheme, + Icons.image, + ImageSource.gallery, + imagePickerTheme.selectImageText, + ), + SizedBox( + width: imagePickerTheme.spaceBetweenIcons, + ), + _generateIconButtonWithText( + context, + imagePickerTheme.makePhotoIcon, + imagePickerTheme, + Icons.camera_alt_rounded, + ImageSource.camera, + imagePickerTheme.makePhotoText, + ), + ], + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + width: imagePickerTheme.closeButtonWidth, + height: imagePickerTheme.closeButtonHeight, + child: customButton ?? + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: + imagePickerTheme.closeButtonBackgroundColor, + ), + onPressed: () => Navigator.of(context).pop(), + child: Text( + imagePickerTheme.closeButtonText, + style: TextStyle( + fontFamily: imagePickerTheme.font, + fontSize: imagePickerTheme.closeButtonTextSize, + color: imagePickerTheme.closeButtonTextColor, ), ), - ) - ], - ), - const SizedBox(height: 30), - ], - ), - ); + ), + ) + ], + ), + const SizedBox(height: 30), + ], + ), + ); + } /// The [_generateIconButtonWithText] function returns a column that includes an [IconButton] and [Text]. /// The function requires the following parameters to be able to generate an icon with text: @@ -109,39 +114,41 @@ class ImagePicker extends StatelessWidget { /// [imageSource] The type of [ImageSource] to be used to pick an image when pressed on the icon. /// [bottomText] The text that's displayed underneath the icon. Column _generateIconButtonWithText( - BuildContext context, - Widget? customIcon, - ImagePickerTheme imagePickerTheme, - IconData icon, - ImageSource imageSource, - String bottomText) => - Column( - mainAxisSize: MainAxisSize.min, - children: [ - InkWell( - key: Key(bottomText), - onTap: () async { - final navigator = Navigator.of(context); - var image = await (imagePickerService ?? ImagePickerService()) - .pickImage(imageSource, config: imagePickerConfig); - navigator.pop(image); - }, - child: customIcon ?? - Icon( - icon, - size: imagePickerTheme.iconSize, - color: imagePickerTheme.iconColor, - ), + BuildContext context, + Widget? customIcon, + ImagePickerTheme imagePickerTheme, + IconData icon, + ImageSource imageSource, + String bottomText) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + InkWell( + key: Key(bottomText), + onTap: () async { + final navigator = Navigator.of(context); + var image = + await (imagePickerService ?? ImagePickerServiceDefault()) + .pickImage(imageSource, config: imagePickerConfig); + navigator.pop(image); + }, + child: customIcon ?? + Icon( + icon, + size: imagePickerTheme.iconSize, + color: imagePickerTheme.iconColor, + ), + ), + Text( + bottomText, + style: TextStyle( + fontFamily: imagePickerTheme.font, + fontSize: imagePickerTheme.iconTextSize, + color: imagePickerTheme.textColor, ), - Text( - bottomText, - style: TextStyle( - fontFamily: imagePickerTheme.font, - fontSize: imagePickerTheme.iconTextSize, - color: imagePickerTheme.textColor, - ), - ), - const SizedBox(height: 20), - ], - ); + ), + const SizedBox(height: 20), + ], + ); + } } diff --git a/pubspec.yaml b/pubspec.yaml index 2871c75..790e63c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: flutter_image_picker -description: A new Flutter package project. -version: 1.0.0 -homepage: https://github.com/Iconica-Development/flutter_image_picker +description: A Flutter Image Picking package. +version: 1.0.3 +repository: https://github.com/Iconica-Development/flutter_image_picker environment: sdk: ">=2.17.6 <3.0.0" @@ -18,38 +18,4 @@ dev_dependencies: flutter_lints: ^2.0.0 mocktail: ^0.3.0 -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. flutter: - # To add assets to your package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # To add custom fonts to your package, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts in packages, see - # https://flutter.dev/custom-fonts/#from-packages diff --git a/test/image_picker_ui_test.dart b/test/image_picker_ui_test.dart index 985d25c..c977a12 100644 --- a/test/image_picker_ui_test.dart +++ b/test/image_picker_ui_test.dart @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2022 Iconica +// +// SPDX-License-Identifier: BSD-3-Clause + import 'dart:typed_data'; import 'package:flutter/material.dart'; diff --git a/test/mocks/image_picker_service_mock.dart b/test/mocks/image_picker_service_mock.dart index 31b7722..1f16e5c 100644 --- a/test/mocks/image_picker_service_mock.dart +++ b/test/mocks/image_picker_service_mock.dart @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2022 Iconica +// +// SPDX-License-Identifier: BSD-3-Clause + import 'package:flutter_image_picker/src/services/image_picker_service.dart'; import 'package:mocktail/mocktail.dart';