├── .gitignore ├── .metadata ├── CHANGELOG.md ├── LICENSE ├── README.md ├── android ├── .gitignore ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties ├── settings.gradle └── src │ └── main │ ├── AndroidManifest.xml │ └── kotlin │ └── ly │ └── img │ └── flutter │ └── photo_editor_sdk │ └── FlutterPESDK.kt ├── example ├── .gitignore ├── .metadata ├── README.md ├── android │ ├── .gitignore │ ├── app │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── ic_launcher-playstore.png │ │ │ ├── kotlin │ │ │ │ └── ly │ │ │ │ │ └── img │ │ │ │ │ └── flutter │ │ │ │ │ └── photo_editor_sdk_example │ │ │ │ │ └── MainActivity.kt │ │ │ └── res │ │ │ │ ├── drawable │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ └── launch_background.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ └── values │ │ │ │ └── styles.xml │ │ │ └── profile │ │ │ └── AndroidManifest.xml │ ├── build.gradle │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ └── gradle-wrapper.properties │ └── settings.gradle ├── assets │ ├── Flutter-logo.png │ ├── IgorSticker.png │ └── LA.jpg ├── ios │ ├── .gitignore │ ├── Flutter │ │ ├── AppFrameworkInfo.plist │ │ ├── Debug.xcconfig │ │ └── Release.xcconfig │ ├── Podfile │ ├── Podfile.lock │ ├── Runner.xcodeproj │ │ ├── project.pbxproj │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── Runner.xcscheme │ ├── Runner.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── Runner │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── App_store_1024_1x.png │ │ │ ├── Contents.json │ │ │ ├── iPad_App_76_1x.png │ │ │ ├── iPad_App_76_2x.png │ │ │ ├── iPad_Notifications_20_1x.png │ │ │ ├── iPad_Notifications_20_2x.png │ │ │ ├── iPad_Pro_App_83.5_2x.png │ │ │ ├── iPad_Settings_29_1x-1.png │ │ │ ├── iPad_Settings_29_1x.png │ │ │ ├── iPad_Settings_29_2x.png │ │ │ ├── iPad_Spotlight_40_1x.png │ │ │ ├── iPad_Spotlight_40_2x.png │ │ │ ├── iPhone_App_60_2x.png │ │ │ ├── iPhone_App_60_3x.png │ │ │ ├── iPhone_Notifications_20_2x.png │ │ │ ├── iPhone_Notifications_20_3x.png │ │ │ ├── iPhone_Settings_29_2x.png │ │ │ ├── iPhone_Settings_29_3x.png │ │ │ ├── iPhone_Spotlight_40_2x.png │ │ │ └── iPhone_Spotlight_40_3x.png │ │ └── LaunchImage.imageset │ │ │ ├── Contents.json │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ └── README.md │ │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ │ ├── Info.plist │ │ └── Runner-Bridging-Header.h ├── lib │ └── main.dart ├── pubspec.yaml └── test │ └── widget_test.dart ├── ios ├── .gitignore ├── Assets │ └── .gitkeep ├── Classes │ ├── FlutterPESDK.swift │ ├── PhotoEditorSDKPlugin.h │ └── PhotoEditorSDKPlugin.m └── photo_editor_sdk.podspec ├── lib └── photo_editor_sdk.dart ├── pubspec.yaml └── test └── photo_editor_sdk_test.dart /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # OSX 3 | .DS_Store 4 | 5 | # Xcode 6 | # 7 | *.pbxuser 8 | !default.pbxuser 9 | *.mode1v3 10 | !default.mode1v3 11 | *.mode2v3 12 | !default.mode2v3 13 | *.perspectivev3 14 | !default.perspectivev3 15 | xcuserdata 16 | *.xccheckout 17 | *.moved-aside 18 | DerivedData 19 | *.hmap 20 | *.ipa 21 | *.xcuserstate 22 | project.xcworkspace 23 | flutter_export_environment.sh 24 | **/Flutter/Generated.xcconfig 25 | **/Flutter/Flutter.podspec 26 | 27 | # Dart 28 | .dart_tool/ 29 | .packages 30 | build/ 31 | pubspec.lock 32 | doc/api/ 33 | 34 | # CocoaPods 35 | Pods 36 | 37 | # Android Project Folder 38 | .externalNativeBuild 39 | .gradle 40 | .idea 41 | .cxx 42 | captures/ 43 | build/ 44 | 45 | # Android Project Files 46 | *.iml 47 | local.properties 48 | google-services.json -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 78910062997c3a836feee883712c241a5fd22983 8 | channel: stable 9 | 10 | project_type: plugin 11 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## [3.2.0] 2 | 3 | ### Changed 4 | 5 | * Updated minimum supported Flutter SDK version to 3.16. 6 | 7 | ### Fixed 8 | 9 | * Fixed incompatibility with Flutter 3.19+ caused by the deprecation of the imperative Gradle apply script method. 10 | 11 | ## [3.1.0] 12 | 13 | ### Changed 14 | 15 | * [video_editor_sdk] Raised minimum VideoEditor SDK for Android version to 10.9.0. See the [migration guide](https://img.ly/docs/vesdk/flutter/getting-started/migration-guides/3-1-0/) for more information. 16 | * [photo_editor_sdk] Raised minimum PhotoEditor SDK for Android version to 10.9.0. See the [migration guide](https://img.ly/docs/pesdk/flutter/getting-started/migration-guides/3-1-0/) for more information. 17 | 18 | ### Fixed 19 | 20 | * Fixed potential crash on Android: `IllegalStateException "You need to use a Theme.AppCompat theme (or descendant) with this activity."`. 21 | * Fixed potential compiling issues due to missing namespace for Android. 22 | 23 | ## [3.0.0] 24 | 25 | ### Changed 26 | 27 | * Changed and aligned the error codes for the plugins. 28 | * [imgly_sdk] Removed custom `Color` class and replaced its usage with the `dart:ui` `Color` class. 29 | * [video_editor_sdk] Unlocking the license via `VESDK.unlockWithLicense` is now executing asynchronously. 30 | * [photo_editor_sdk] Unlocking the license via `PESDK.unlockWithLicense` is now executing asynchronously. 31 | 32 | ### Fixed 33 | 34 | * [video_editor_sdk] Fixed tint color of the toolbar would not be applied correctly in the trim tool on iOS. 35 | 36 | ## [2.9.0] 37 | 38 | ### Added 39 | 40 | * [imgly_sdk] Added `configuration.singleToolMode` that skips main menu if only one tool is used. 41 | 42 | ## [2.8.1] 43 | 44 | ### Fixed 45 | 46 | * Fixed errors from the iOS plugin would not be caught. 47 | 48 | ## [2.8.0] 49 | 50 | ### Added 51 | 52 | * [video_editor_sdk] Added `VideoEditorResult.segments`, `VideoEditorResult.videoSize`, and `VideoEditorResult.release()` which enable serialization of the individual video composition components if `VideoOptions.segments` is enabled. 53 | * [video_editor_sdk] Added `FlutterVESDK.editorWillOpenClosure` and `FlutterVESDK.editorWillExportClosure` which allow further native configuration on Android. 54 | * [photo_editor_sdk] Added `FlutterPESDK.editorWillOpenClosure` and `FlutterPESDK.editorWillExportClosure` which allow further native configuration on Android. 55 | 56 | ### Fixed 57 | 58 | * [imgly_sdk] Fixed `TextOptions.canvasActions` would use `StickerCanvasAction` instead of `TextCanvasAction`. 59 | 60 | ## [2.7.1] 61 | 62 | ### Fixed 63 | 64 | * [video_editor_sdk] Fixed opening the editor with multiple videos would only load the first video. 65 | 66 | ## [2.7.0] 67 | 68 | ### Added 69 | 70 | * [imgly_sdk] Added `StickerAction.duration` as well as `TextAction.duration` which allow selecting a unique duration for texts and stickers in the video editor. 71 | 72 | ### Fixed 73 | 74 | * [video_editor_sdk] Fixed `Theme` would not be applied if the editor has been initialized with a single video on Android. 75 | 76 | ## [2.6.0] 77 | 78 | ### Changed 79 | 80 | * 🚨 Bumped iOS deployment target to 13.0. 81 | * [video_editor_sdk] Raised minimum VideoEditor SDK for iOS version to 11.1.0. See the [changelog](https://github.com/imgly/vesdk-ios-build/blob/master/CHANGELOG.md) for more information. 82 | * [photo_editor_sdk] Raised minimum PhotoEditor SDK for iOS version to 11.1.0. See the [changelog](https://github.com/imgly/pesdk-ios-build/blob/master/CHANGELOG.md) for more information. 83 | 84 | ### Added 85 | 86 | * [imgly_sdk] Added implementation and documentation for background removal. 87 | 88 | ## [2.5.0] 89 | 90 | ### Added 91 | 92 | * [imgly_sdk] Added `ThemeOptions` which enable customizing the UI color scheme with existing or custom runtime `Theme`s on iOS and existing or custom compiletime XML themes on Android. 93 | * [imgly_sdk] Added `Configuration.toolbarMode` which enables repositioning the toolbar to the top/bottom of the editor on iOS. 94 | * [video_editor_sdk] Added implementation and documentation for GIPHY sticker integration. 95 | 96 | ### Fixed 97 | 98 | * Fixed enabling serialization would potentially crash the export on Android. 99 | * [imgly_sdk] Fixed error when running on Android with Flutter 3. 100 | * [photo_editor_sdk] Fixed error when opening the editor without an image but with a serialization with an embedded image. 101 | * [video_editor_sdk] Fixed height and width of specified composition size would be flipped on Android. 102 | 103 | ## [2.4.0] 104 | 105 | ### Changed 106 | 107 | * 🚨 With this version you might need to create symlinks when using Android Gradle Plugin version `4.x`. Please refer to the new [known issues](https://github.com/imgly/pesdk-flutter#known-issues) section of the README for details. 108 | * 🚨 This version requires `minSdkVersion` `21` for Android. Please refer to the new step 3 in the [getting started](https://github.com/imgly/pesdk-flutter#android) section of the README for instructions on how to adjust it. 109 | * [video_editor_sdk] Raised minimum VideoEditor SDK for Android version to 10.0.1. See the [changelog](https://github.com/imgly/vesdk-android-demo/blob/master/CHANGELOG.md) for more information. 110 | * [photo_editor_sdk] Raised minimum PhotoEditor SDK for Android version to 10.0.1. See the [changelog](https://github.com/imgly/pesdk-android-demo/blob/master/CHANGELOG.md) for more information. 111 | 112 | ## [2.3.0] 113 | 114 | ### Changed 115 | 116 | * [imgly_sdk] Removed `WRITE_EXTERNAL_STORAGE` permission request when opening the editor on Android. 117 | * [imgly_sdk] Aligned emoji support for iOS and Android. Emoji support is not optimized for cross-platform use and disabled by default. Added option `TextOptions.allowEmojis`. 118 | * [imgly_sdk] Updated documentation for remote resources used in the editor. Remote resources are usable but not optimized and therefore should be downloaded in advance and then passed to the editor as local resources. 119 | 120 | ### Added 121 | 122 | * [imgly_sdk] Added integration and documentation for custom watermark. Use `Configuration.watermark` to add a custom watermark to the image/video. 123 | 124 | ### Fixed 125 | 126 | * Fixed unexpected behavior when invoking multiple requests. 127 | * [imgly_sdk] Fixed `CompositionOptions.personalVideoClips` would not be resolved correctly on Android. 128 | 129 | ## [2.2.0] 130 | 131 | ### Changed 132 | 133 | * The IMG.LY maven repository is no longer automatically added to your Android project by the plugin. Please refer to the new step 3 in the [getting started](https://github.com/imgly/vesdk-flutter#android) section of the README for instructions on how to add it. 134 | * Added support for PhotoEditor SDK and VideoEditor SDK for Android version 9. 135 | 136 | ### Added 137 | 138 | * [video_editor_sdk] Added integration and documentation for force trim. 139 | * [imgly_sdk] Added `TrimOptions.forceMode`, `TrimOptions.minimumDuration` and `TrimOptions.maximumDuration` to configure the force-trimming behavior. 140 | 141 | ### Fixed 142 | 143 | * [imgly_sdk] Fixed `TrimOptions` not being exposed for `Configuration.trim`. 144 | * [imgly_sdk] Fixed `CompositionOptions.clipTrimOptions` using `TrimOptions` instead of `ClipTrimOptions`. 145 | 146 | ## [2.1.0] 147 | 148 | ### Added 149 | 150 | * [imgly_sdk] Added `ExportOptions.forceExport` which will force the photo/video to be rendered and exported in the defined output format even if no changes have been applied. Otherwise, the input asset will be passed through and might not match the defined output format. 151 | * [imgly_sdk] Added an interface for native customization on iOS. Set `FlutterIMGLY.configureWithBuilder` to modify the `Configuration` after it has been retrieved from the plugin. 152 | * [photo_editor_sdk] Added support to replace the `PhotoEditViewController` with custom subclasses on iOS. 153 | * [photo_editor_sdk] Added `FlutterPESDK.willPresentPhotoEditViewController` allowing access to the `PhotoEditViewController` before it is presented on iOS. 154 | * [video_editor_sdk] Added support to replace the `VideoEditViewController` with custom subclasses on iOS. 155 | * [video_editor_sdk] Added `FlutterVESDK.willPresentVideoEditViewController` allowing access to the `VideoEditViewController` before it is presented on iOS. 156 | 157 | ### Changed 158 | 159 | * [video_editor_sdk] Changed the example to use the default `Video` constructor since `Video.composition` is only available when having a valid license for the video composition feature. 160 | 161 | ## [2.0.0] 162 | 163 | ### Added 164 | 165 | * Added null safety support for all three plugins. 166 | * [imgly_sdk] Added integration and documentation for new video composition, video library and audio library tools. 167 | * [imgly_sdk] Added missing code examples in the API documentation. 168 | * [video_editor_sdk] Added integration and documentation for new video composition, video library and audio library tools. 169 | 170 | ### Changed 171 | 172 | * [imgly_sdk] Updated identifier documentation for replaced and new fonts. 173 | * [video_editor_sdk] The named parameter `video` of the `VESDK.openEditor` method now expects a `Video` instead of a `String`. 174 | 175 | ### Fixed 176 | 177 | * Fixed crash when integrating all three plugins in the same project on Android. 178 | * [imgly_sdk] Fixed some custom assets would not be resolved correctly on Android. 179 | * [imgly_sdk] Fixed code examples in API documentation for using existing assets that are provided by the SDK. 180 | * [imgly_sdk] Fixed thumbnail would not be loaded for a custom `Overlay` on iOS. 181 | 182 | ## [1.0.1] 183 | 184 | ### Added 185 | 186 | * [photo_editor_sdk] Initial release. 187 | * [video_editor_sdk] Initial release. 188 | 189 | ### Fixed 190 | 191 | * [imgly_sdk] Fixed custom stickers and filters would not be resolved. 192 | 193 | ## [1.0.0] 194 | 195 | ### Added 196 | 197 | * [imgly_sdk] Initial release. 198 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This sample code or wrapper is licensed with a 3-clause BSD license. 2 | 3 | In order to run any samples or use any wrapper without a watermark, 4 | you'll have to purchase a commercial PhotoEditor SDK or VideoEditor SDK 5 | license. Visit https://img.ly for more details. 6 | 7 | Copyright (c) 2014-2024, IMG.LY GmbH 8 | All rights reserved. 9 | 10 | Redistribution and use in source and binary forms, with or without 11 | modification, are permitted provided that the following conditions are met: 12 | 13 | 1. Redistributions of source code must retain the above copyright 14 | notice, this list of conditions and the following disclaimer. 15 | 16 | 2. Redistributions in binary form must reproduce the above copyright 17 | notice, this list of conditions and the following disclaimer in the 18 | documentation and/or other materials provided with the distribution. 19 | 20 | 3. Neither the name IMG.LY GmbH, IMG.LY, PhotoEditor SDK, VideoEditor SDK 21 | nor the names of its developers may be used to endorse or promote products 22 | derived from this software without specific prior written permission. 23 | 24 | THIS SOFTWARE IS PROVIDED BY IMG.LY GMBH ''AS IS'' AND ANY 25 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 26 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 27 | DISCLAIMED. IN NO EVENT SHALL IMG.LY GMBH BE LIABLE FOR ANY 28 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 29 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 30 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 31 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 32 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 33 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | PhotoEditor SDK Logo 4 | 5 |

6 |

7 | 8 | pub.dev version 9 | 10 | 11 | Platform support 12 | 13 | 14 | Twitter 15 | 16 |

17 | 18 | # Flutter plugin for PhotoEditor SDK 19 | 20 | ## System requirements 21 | 22 | - Flutter: 1.20.0 23 | - Dart: 2.12.0 24 | - iOS: 13 25 | - Android: 5 (SDK 21) 26 | 27 | ## Getting started 28 | 29 | Add the plugin package to the `pubspec.yaml` file in your project: 30 | 31 | ```yaml 32 | dependencies: 33 | photo_editor_sdk: ^3.2.0 34 | ``` 35 | 36 | Install the new dependency: 37 | 38 | ```sh 39 | flutter pub get 40 | ``` 41 | 42 | ### Android 43 | 44 | 1. Add the IMG.LY repository and plugin by opening the `android/build.gradle` file (**not** `android/app/build.gradle`) and changing the following block: 45 | 46 | ```diff 47 | buildscript { 48 | - ext.kotlin_version = '1.3.50' 49 | + ext.kotlin_version = '1.7.21' 50 | repositories { 51 | ... 52 | mavenCentral() 53 | + maven { url "https://artifactory.img.ly/artifactory/imgly" } 54 | ... 55 | } 56 | dependencies { 57 | ... 58 | + classpath 'com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:1.7.21-1.0.8' // Depending on your `kotlin_version` version. 59 | + classpath 'ly.img.android.sdk:plugin:10.9.0' 60 | ... 61 | } 62 | } 63 | ``` 64 | 65 | The KSP version depends on the Kotlin version that you are using. In order to find the correct version, please visit the [official KSP release page](https://github.com/google/ksp/releases?page=1). 66 | 67 | In order to update PhotoEditor SDK for Android replace the version string `10.9.0` with a [newer release](https://github.com/imgly/pesdk-android-demo/releases). 68 | 69 | 2. Still in the `android/build.gradle` file (**not** `android/app/build.gradle`), add these lines at the bottom: 70 | 71 | ```groovy 72 | allprojects { 73 | repositories { 74 | maven { url 'https://artifactory.img.ly/artifactory/imgly' } 75 | } 76 | } 77 | ``` 78 | 79 | 3. In the `android/app/build.gradle` file (**not** `android/build.gradle`) you will need to modify the `minSdkVersion` to at least `21` depending on the version of Flutter that you are using. We also recommend to update the `buildToolsVersion` to `34.0.0` as well as the `compileSdkVersion` to `34`: 80 | 81 | ```diff 82 | android { 83 | - compileSdkVersion flutter.compileSdkVersion 84 | + compileSdkVersion 34 85 | + buildToolsVersion "34.0.0" 86 | ... 87 | defaultConfig { 88 | ... 89 | - minSdkVersion flutter.minSdkVersion 90 | + minSdkVersion 21 91 | ... 92 | } 93 | ... 94 | } 95 | ``` 96 | 97 | Depending on your **stable** Flutter SDK version (<= `2.5.0`), your `android/app/build.gradle` file might look a bit different. In this case, please modify it in the following way: 98 | 99 | ```diff 100 | android { 101 | - compileSdkVersion 30 102 | + compileSdkVersion 34 103 | + buildToolsVersion "34.0.0" 104 | ... 105 | defaultConfig { 106 | ... 107 | - minSdkVersion 16 108 | + minSdkVersion 21 109 | ... 110 | } 111 | ... 112 | } 113 | ``` 114 | 115 | 4. In the same file, configure PhotoEditor SDK for Android by adding the following lines under `apply plugin: "com.android.application"`: 116 | 117 | ```groovy 118 | apply plugin: 'ly.img.android.sdk' 119 | apply plugin: 'kotlin-android' 120 | 121 | // Comment out the modules you don't need, to save size. 122 | IMGLY.configure { 123 | modules { 124 | include 'ui:text' 125 | include 'ui:focus' 126 | include 'ui:frame' 127 | include 'ui:brush' 128 | include 'ui:filter' 129 | include 'ui:sticker' 130 | include 'ui:overlay' 131 | include 'ui:transform' 132 | include 'ui:adjustment' 133 | include 'ui:text-design' 134 | 135 | // This module is big, remove the serializer if you don't need that feature. 136 | include 'backend:serializer' 137 | 138 | // Remove the asset packs you don't need, these are also big in size. 139 | include 'assets:font-basic' 140 | include 'assets:frame-basic' 141 | include 'assets:filter-basic' 142 | include 'assets:overlay-basic' 143 | include 'assets:sticker-shapes' 144 | include 'assets:sticker-emoticons' 145 | 146 | include 'backend:sticker-smart' 147 | include 'backend:background-removal' 148 | } 149 | } 150 | ``` 151 | 152 | ### Usage 153 | 154 | Import the packages in your `main.dart`: 155 | 156 | ```dart 157 | import 'package:photo_editor_sdk/photo_editor_sdk.dart'; 158 | import 'package:imgly_sdk/imgly_sdk.dart'; 159 | ``` 160 | 161 | Each platform requires a separate license file. [Unlock PhotoEditor SDK](./lib/photo_editor_sdk.dart#L13-L22) with a single line of code for both platforms via platform-specific file extensions. 162 | 163 | Rename your license files: 164 | 165 | - Android license: `pesdk_license.android` 166 | - iOS license: `pesdk_license.ios` 167 | 168 | The licenses should be located on a project level. We recommend putting them into the `{PROJECT_ROOT}/assets/` folder. 169 | Pass the relative file path (based on the project root) without the extension to the `unlockWithLicense` function to unlock both iOS and Android: 170 | 171 | ```dart 172 | PESDK.unlockWithLicense("assets/pesdk_license"); 173 | ``` 174 | 175 | Open the editor with an image: 176 | 177 | ```dart 178 | PESDK.openEditor(image: "assets/image.jpg"); 179 | ``` 180 | 181 | Please see the [API documentation](https://pub.dev/documentation/photo_editor_sdk) for more details and additional [customization and configuration options](https://pub.dev/documentation/imgly_sdk). 182 | 183 | ## Example 184 | 185 | Please see our [example project](./example) which demonstrates how to use the Flutter plugin for PhotoEditor SDK. 186 | 187 | ## License Terms 188 | 189 | Make sure you have a [commercial license](https://img.ly/pricing?utm_campaign=Projects&utm_source=Github&utm_medium=PESDK&utm_content=Flutter) for PhotoEditor SDK before releasing your app. 190 | A commercial license is required for any app or service that has any form of monetization: This includes free apps with in-app purchases or ad supported applications. Please contact us if you want to purchase the commercial license. 191 | 192 | ## Support and License 193 | 194 | Use our [service desk](https://support.img.ly) for bug reports or support requests. To request a commercial license, please use the [license request form](https://img.ly/pricing?utm_campaign=Projects&utm_source=Github&utm_medium=PESDK&utm_content=Flutter) on our website. 195 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | group 'ly.img.flutter.photo_editor_sdk' 2 | version '1.0-SNAPSHOT' 3 | 4 | apply plugin: 'com.android.library' 5 | apply plugin: 'kotlin-android' 6 | apply plugin: 'ly.img.android.sdk' 7 | apply plugin: "com.google.devtools.ksp" 8 | 9 | IMGLY.configure { 10 | pesdk { 11 | enabled true 12 | } 13 | 14 | useInheritanceDependencies true 15 | 16 | modules { 17 | include 'ui:core' 18 | include 'backend:config-loader' 19 | } 20 | } 21 | 22 | def MIN_LY_IMG_ANDROID_SDK_PLUGIN_VERSION = "10.9.0" 23 | 24 | task checkVersion { 25 | if (imglyConfig.convertToVersionNumber(imglyConfig.getVersion()) < imglyConfig.convertToVersionNumber(MIN_LY_IMG_ANDROID_SDK_PLUGIN_VERSION)) { 26 | String WRONG_VERSION = "" + 27 | "┌───────────────────────────────────────────────────────────────────────┐\n"+ 28 | "│ PhotoEditor SDK update required! │\n"+ 29 | "│ Please update the plugin version in your 'android/build.gradle' file. │\n"+ 30 | "│ Minimum required dependency: 'ly.img.android.sdk:plugin:${MIN_LY_IMG_ANDROID_SDK_PLUGIN_VERSION}' │\n"+ 31 | "│ Your are currently using: 'ly.img.android.sdk:plugin:${imglyConfig.getVersion()}' │\n"+ 32 | "└───────────────────────────────────────────────────────────────────────┘\n" 33 | 34 | throw new GradleScriptException(WRONG_VERSION, new IllegalArgumentException(WRONG_VERSION)) 35 | } 36 | } 37 | 38 | preBuild.dependsOn checkVersion 39 | 40 | android { 41 | if (project.android.hasProperty("namespace")) { 42 | namespace 'ly.img.flutter.photo_editor_sdk' 43 | } 44 | compileSdkVersion 34 45 | 46 | sourceSets { 47 | main.java.srcDirs += 'src/main/kotlin' 48 | } 49 | defaultConfig { 50 | minSdkVersion 21 51 | } 52 | lintOptions { 53 | disable 'InvalidPackage' 54 | } 55 | } 56 | 57 | dependencies { 58 | compileOnly "ly.img.android.sdk:serializer:$imglyConfig.version" 59 | compileOnly rootProject.findProject(":imgly_sdk") 60 | } 61 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip 6 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'photo_editor_sdk' 2 | -------------------------------------------------------------------------------- /android/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /android/src/main/kotlin/ly/img/flutter/photo_editor_sdk/FlutterPESDK.kt: -------------------------------------------------------------------------------- 1 | package ly.img.flutter.photo_editor_sdk 2 | 3 | import android.app.Activity 4 | import android.content.Intent 5 | import android.net.Uri 6 | import android.util.Log 7 | import androidx.annotation.NonNull 8 | import androidx.annotation.WorkerThread 9 | 10 | import java.io.File 11 | import org.json.JSONObject 12 | 13 | import io.flutter.embedding.engine.plugins.FlutterPlugin 14 | import io.flutter.plugin.common.MethodCall 15 | import io.flutter.plugin.common.MethodChannel 16 | import io.flutter.plugin.common.MethodChannel.Result 17 | import ly.img.android.AuthorizationException 18 | 19 | import ly.img.android.IMGLY 20 | import ly.img.android.PESDK 21 | import ly.img.android.pesdk.PhotoEditorSettingsList 22 | import ly.img.android.pesdk.backend.decoder.ImageSource 23 | import ly.img.android.pesdk.backend.model.state.LoadSettings 24 | import ly.img.android.pesdk.kotlin_extension.continueWithExceptions 25 | import ly.img.android.pesdk.utils.UriHelper 26 | import ly.img.android.sdk.config.* 27 | import ly.img.android.pesdk.backend.encoder.Encoder 28 | import ly.img.android.pesdk.backend.model.EditorSDKResult 29 | import ly.img.android.pesdk.backend.model.state.manager.StateHandler 30 | import ly.img.android.pesdk.ui.activity.PhotoEditorActivity 31 | import ly.img.android.pesdk.utils.ThreadUtils 32 | import ly.img.android.serializer._3.IMGLYFileWriter 33 | import ly.img.android.serializer._3.type.FileMapper 34 | import ly.img.android.serializer._3.type.IMGLYJsonReader 35 | 36 | import ly.img.flutter.imgly_sdk.FlutterIMGLY 37 | import java.util.UUID 38 | 39 | /** FlutterPESDK */ 40 | class FlutterPESDK: FlutterIMGLY() { 41 | 42 | companion object { 43 | // This number must be unique. It is public to allow client code to change it if the same value is used elsewhere. 44 | var EDITOR_RESULT_ID = 29065 45 | 46 | /** A closure to modify a *PhotoEditorSettingsList* before the editor is opened. */ 47 | var editorWillOpenClosure: ((settingsList: PhotoEditorSettingsList) -> Unit)? = null 48 | 49 | /** A closure allowing access to the *StateHandler* before the editor is exporting. */ 50 | var editorWillExportClosure: ((stateHandler: StateHandler) -> Unit)? = null 51 | } 52 | 53 | override fun onAttachedToEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) { 54 | super.onAttachedToEngine(binding) 55 | 56 | channel = MethodChannel(binding.binaryMessenger, "photo_editor_sdk") 57 | channel.setMethodCallHandler(this) 58 | IMGLY.initSDK(binding.applicationContext) 59 | IMGLY.authorize() 60 | } 61 | 62 | override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) { 63 | if (this.result != null) { 64 | result.error(IMGLYConstants.K_ERROR_MULTIPLE_REQUESTS, "Cancelled due to multiple requests.", null) 65 | return 66 | } 67 | 68 | if (call.method == "openEditor") { 69 | var config = call.argument>("configuration") 70 | var photo: String? = null 71 | val serialization = call.argument("serialization") 72 | 73 | if (config != null) { 74 | config = this.resolveAssets(config) 75 | } 76 | config = config as? HashMap 77 | 78 | val imageValues = call.argument("image") 79 | if (imageValues != null) { 80 | photo = EmbeddedAsset(imageValues).resolvedURI 81 | } 82 | 83 | if (photo != null) { 84 | this.result = result 85 | this.present(photo, config, serialization) 86 | } else { 87 | if (serialization != null) { 88 | val json = IMGLYJsonReader.readJson(serialization, true) 89 | val mappedFile = FileMapper.readFrom(json) 90 | var imageData = mappedFile.image?.data 91 | if (imageData != null) { 92 | imageData = "data:base64,$imageData" 93 | this.result = result 94 | this.present(imageData, config, serialization) 95 | } else { 96 | result.error(IMGLYConstants.K_ERROR_UNABLE_TO_LOAD, "The specified serialization did not include a photo.", null) 97 | return 98 | } 99 | } else { 100 | result.error(IMGLYConstants.K_ERROR_UNABLE_TO_LOAD, "No image has been specified or included in the serialization.", null) 101 | return 102 | } 103 | } 104 | } else if (call.method == "unlock") { 105 | val license = call.argument("license") 106 | this.result = result 107 | this.resolveLicense(license) 108 | } else { 109 | result.notImplemented() 110 | } 111 | } 112 | 113 | /** 114 | * Configures and presents the editor. 115 | * 116 | * @param asset The image source as *String* which should be loaded into the editor. 117 | * @param config The *Configuration* to configure the editor with as if any. 118 | * @param serialization The serialization to load into the editor if any. 119 | */ 120 | override fun present(asset: String, config: HashMap?, serialization: String?) { 121 | val configuration = ConfigLoader.readFrom(config ?: mapOf()) 122 | val settingsList = PhotoEditorSettingsList(configuration.export?.serialization?.enabled == true) 123 | configuration.applyOn(settingsList) 124 | currentConfig = configuration 125 | 126 | settingsList.configure { loadSettings -> 127 | asset.also { 128 | if (it.startsWith("data:")) { 129 | loadSettings.source = UriHelper.createFromBase64String(it.substringAfter("base64,")) 130 | } else { 131 | val potentialFile = continueWithExceptions { File(it) } 132 | if (potentialFile?.exists() == true) { 133 | loadSettings.source = Uri.fromFile(potentialFile) 134 | } else { 135 | loadSettings.source = ConfigLoader.parseUri(it) 136 | } 137 | } 138 | } 139 | } 140 | 141 | editorWillOpenClosure?.invoke(settingsList) 142 | readSerialisation(settingsList, serialization, false) 143 | applyTheme(settingsList, configuration.theme) 144 | startEditor(settingsList, EDITOR_RESULT_ID, FlutterPESDKActivity::class.java) 145 | } 146 | 147 | /** 148 | * Unlocks the SDK with a stringified license. 149 | * 150 | * @param license The license as a *String*. 151 | */ 152 | override fun unlockWithLicense(license: String) { 153 | try { 154 | PESDK.initSDKWithLicenseData(license) 155 | IMGLY.authorize() 156 | this.result?.success(null) 157 | this.result = null 158 | } catch (e: AuthorizationException) { 159 | this.result?.error(IMGLYConstants.K_ERROR_UNABLE_TO_UNLOCK, "The license is invalid.", e.message) 160 | this.result = null 161 | } 162 | } 163 | 164 | override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?): Boolean { 165 | val intentData = try { 166 | data?.let { EditorSDKResult(it) } 167 | } catch (e: EditorSDKResult.NotAnImglyResultException) { 168 | null 169 | } ?: return false // If intentData is null the result is not from us. 170 | 171 | if (resultCode == Activity.RESULT_CANCELED && requestCode == EDITOR_RESULT_ID) { 172 | currentActivity?.runOnUiThread { 173 | this.result?.success(null) 174 | this.result = null 175 | } 176 | return true 177 | } else if (resultCode == Activity.RESULT_OK && requestCode == EDITOR_RESULT_ID) { 178 | ThreadUtils.runAsync { 179 | val serializationConfig = currentConfig?.export?.serialization 180 | val resultUri = intentData.resultUri 181 | val sourceUri = intentData.sourceUri 182 | 183 | var serialization: Any? = null 184 | if (serializationConfig?.enabled == true) { 185 | val settingsList = intentData.settingsList 186 | skipIfNotExists { 187 | settingsList.let { settingsList -> 188 | if (serializationConfig.embedSourceImage == true) { 189 | Log.e("IMG.LY SDK", "EmbedSourceImage is currently not supported by the Android SDK") 190 | } 191 | serialization = when (serializationConfig.exportType) { 192 | SerializationExportType.FILE_URL -> { 193 | val uri = serializationConfig.filename?.let { 194 | Uri.parse("$it.json") 195 | } ?: Uri.fromFile(File.createTempFile("serialization-" + UUID.randomUUID().toString(), ".json")) 196 | Encoder.createOutputStream(uri).use { outputStream -> 197 | IMGLYFileWriter(settingsList).writeJson(outputStream) 198 | } 199 | uri.toString() 200 | } 201 | SerializationExportType.OBJECT -> { 202 | jsonToMap(JSONObject(IMGLYFileWriter(settingsList).writeJsonAsString())) as Any? 203 | } 204 | } 205 | } 206 | settingsList.release() 207 | } ?: run { 208 | Log.e("IMG.LY SDK", "You need to include 'backend:serializer' Module, to use serialisation!") 209 | } 210 | } 211 | 212 | val map = mutableMapOf() 213 | map["image"] = when(currentConfig?.export?.image?.exportType) { 214 | ImageExportType.DATA_URL -> resultUri.let { 215 | val imageSource = ImageSource.create(it) 216 | "data:${imageSource.imageFormat.mimeType};base64,${imageSource.asBase64}" 217 | } 218 | ImageExportType.FILE_URL -> resultUri?.toString() 219 | else -> resultUri.toString() 220 | } 221 | map["hasChanges"] = (sourceUri?.path != resultUri?.path) 222 | map["serialization"] = serialization 223 | currentActivity?.runOnUiThread { 224 | this.result?.success(map) 225 | this.result = null 226 | } 227 | } 228 | return true 229 | } 230 | return false 231 | } 232 | } 233 | 234 | /** A *PhotoEditorActivity* used for the native interfaces. */ 235 | class FlutterPESDKActivity: PhotoEditorActivity() { 236 | @WorkerThread 237 | override fun onExportStart(stateHandler: StateHandler) { 238 | FlutterPESDK.editorWillExportClosure?.invoke(stateHandler) 239 | 240 | super.onExportStart(stateHandler) 241 | } 242 | } -------------------------------------------------------------------------------- /example/.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | **/ios/Flutter/.last_build_id 26 | .dart_tool/ 27 | .flutter-plugins 28 | .flutter-plugins-dependencies 29 | .packages 30 | .pub-cache/ 31 | .pub/ 32 | /build/ 33 | 34 | # Web related 35 | lib/generated_plugin_registrant.dart 36 | 37 | # Symbolication related 38 | app.*.symbols 39 | 40 | # Obfuscation related 41 | app.*.map.json 42 | -------------------------------------------------------------------------------- /example/.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 78910062997c3a836feee883712c241a5fd22983 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /example/README.md: -------------------------------------------------------------------------------- 1 | # PhotoEditor SDK Flutter Example App 2 | 3 | This project shows how to integrate [PhotoEditor SDK](https://img.ly/photo-sdk?utm_campaign=Projects&utm_source=Github&utm_medium=PESDK&utm_content=Flutter-Demo) into a Flutter application with the [Flutter plugin for PhotoEditor SDK](https://github.com/imgly/pesdk-flutter) which is available via pub.dev as [`photo_editor_sdk`](https://pub.dev/packages/photo_editor_sdk). 4 | -------------------------------------------------------------------------------- /example/android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | -------------------------------------------------------------------------------- /example/android/app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "com.android.application" 3 | id "kotlin-android" 4 | id "dev.flutter.flutter-gradle-plugin" 5 | id "ly.img.android.sdk" 6 | id "com.google.devtools.ksp" 7 | } 8 | 9 | def localProperties = new Properties() 10 | def localPropertiesFile = rootProject.file('local.properties') 11 | if (localPropertiesFile.exists()) { 12 | localPropertiesFile.withReader('UTF-8') { reader -> 13 | localProperties.load(reader) 14 | } 15 | } 16 | 17 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 18 | if (flutterVersionCode == null) { 19 | flutterVersionCode = '1' 20 | } 21 | 22 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 23 | if (flutterVersionName == null) { 24 | flutterVersionName = '1.0' 25 | } 26 | 27 | project.buildscript.configurations.getByName("classpath").dependencies.any { dependency -> 28 | println(name) 29 | } 30 | 31 | IMGLY.configure { 32 | modules { 33 | include 'ui:text' 34 | include 'ui:focus' 35 | include 'ui:frame' 36 | include 'ui:brush' 37 | include 'ui:filter' 38 | include 'ui:sticker' 39 | include 'ui:overlay' 40 | include 'ui:transform' 41 | include 'ui:adjustment' 42 | include 'ui:text-design' 43 | include 'ui:giphy-sticker' 44 | 45 | // This module is big, remove the serializer if you don't need that feature. 46 | include 'backend:serializer' 47 | 48 | // Remove the asset packs you don't need, these are also big in size. 49 | include 'assets:font-basic' 50 | include 'assets:frame-basic' 51 | include 'assets:filter-basic' 52 | include 'assets:overlay-basic' 53 | include 'assets:sticker-shapes' 54 | include 'assets:sticker-emoticons' 55 | 56 | include 'backend:sticker-smart' 57 | } 58 | } 59 | 60 | android { 61 | namespace "ly.img.flutter.photo_editor_sdk_example" 62 | compileSdkVersion 34 63 | 64 | sourceSets { 65 | main.java.srcDirs += 'src/main/kotlin' 66 | } 67 | 68 | lintOptions { 69 | disable 'InvalidPackage' 70 | } 71 | 72 | defaultConfig { 73 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 74 | applicationId "ly.img.flutter.photo_editor_sdk_example" 75 | minSdkVersion 21 76 | targetSdkVersion 34 77 | versionCode flutterVersionCode.toInteger() 78 | versionName flutterVersionName 79 | } 80 | 81 | buildTypes { 82 | release { 83 | // TODO: Add your own signing config for the release build. 84 | // Signing with the debug keys for now, so `flutter run --release` works. 85 | signingConfig signingConfigs.debug 86 | } 87 | } 88 | } 89 | 90 | flutter { 91 | source '../..' 92 | } -------------------------------------------------------------------------------- /example/android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /example/android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 4 | 9 | 14 | 22 | 26 | 30 | 35 | 39 | 40 | 41 | 42 | 43 | 44 | 46 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /example/android/app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/android/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /example/android/app/src/main/kotlin/ly/img/flutter/photo_editor_sdk_example/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package ly.img.flutter.photo_editor_sdk_example 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 | 24 | 26 | 28 | 30 | 32 | 34 | 36 | 38 | 40 | 42 | 44 | 46 | 48 | 50 | 52 | 54 | 56 | 58 | 60 | 62 | 64 | 66 | 68 | 70 | 72 | 74 | 75 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /example/android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /example/android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | repositories { 3 | google() 4 | mavenCentral() 5 | } 6 | } 7 | 8 | allprojects { 9 | repositories { 10 | google() 11 | mavenCentral() 12 | maven { url "https://artifactory.img.ly/artifactory/imgly" } 13 | } 14 | } 15 | 16 | rootProject.buildDir = '../build' 17 | subprojects { 18 | project.buildDir = "${rootProject.buildDir}/${project.name}" 19 | } 20 | subprojects { 21 | project.evaluationDependsOn(':app') 22 | } 23 | 24 | tasks.register("clean", Delete) { 25 | delete rootProject.buildDir 26 | } -------------------------------------------------------------------------------- /example/android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | android.enableR8=true 5 | -------------------------------------------------------------------------------- /example/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip 7 | -------------------------------------------------------------------------------- /example/android/settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | def flutterSdkPath = { 3 | def properties = new Properties() 4 | file("local.properties").withInputStream { properties.load(it) } 5 | def flutterSdkPath = properties.getProperty("flutter.sdk") 6 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 7 | return flutterSdkPath 8 | }() 9 | 10 | includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") 11 | 12 | repositories { 13 | google() 14 | mavenCentral() 15 | gradlePluginPortal() 16 | maven { url "https://artifactory.img.ly/artifactory/imgly" } 17 | } 18 | } 19 | 20 | plugins { 21 | id "dev.flutter.flutter-plugin-loader" version "1.0.0" 22 | id "com.android.application" version "8.1.2" apply false 23 | id "org.jetbrains.kotlin.android" version "1.7.21" apply false 24 | id "com.google.devtools.ksp" version "1.7.21-1.0.8" apply false 25 | id "ly.img.android.sdk" version "10.9.0" apply false 26 | } 27 | 28 | include ":app" -------------------------------------------------------------------------------- /example/assets/Flutter-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/assets/Flutter-logo.png -------------------------------------------------------------------------------- /example/assets/IgorSticker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/assets/IgorSticker.png -------------------------------------------------------------------------------- /example/assets/LA.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/assets/LA.jpg -------------------------------------------------------------------------------- /example/ios/.gitignore: -------------------------------------------------------------------------------- 1 | *.mode1v3 2 | *.mode2v3 3 | *.moved-aside 4 | *.pbxuser 5 | *.perspectivev3 6 | **/*sync/ 7 | .sconsign.dblite 8 | .tags* 9 | **/.vagrant/ 10 | **/DerivedData/ 11 | Icon? 12 | **/Pods/ 13 | **/.symlinks/ 14 | profile 15 | xcuserdata 16 | **/.generated/ 17 | Flutter/App.framework 18 | Flutter/Flutter.framework 19 | Flutter/Flutter.podspec 20 | Flutter/Generated.xcconfig 21 | Flutter/app.flx 22 | Flutter/app.zip 23 | Flutter/flutter_assets/ 24 | Flutter/flutter_export_environment.sh 25 | ServiceDefinitions.json 26 | Runner/GeneratedPluginRegistrant.* 27 | 28 | # Exceptions to above rules. 29 | !default.mode1v3 30 | !default.mode2v3 31 | !default.pbxuser 32 | !default.perspectivev3 33 | -------------------------------------------------------------------------------- /example/ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 13.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /example/ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /example/ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /example/ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '12.0' 3 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 6 | 7 | project 'Runner', { 8 | 'Debug' => :debug, 9 | 'Profile' => :release, 10 | 'Release' => :release, 11 | } 12 | 13 | def flutter_root 14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) 15 | unless File.exist?(generated_xcode_build_settings_path) 16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" 17 | end 18 | 19 | File.foreach(generated_xcode_build_settings_path) do |line| 20 | matches = line.match(/FLUTTER_ROOT\=(.*)/) 21 | return matches[1].strip if matches 22 | end 23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" 24 | end 25 | 26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) 27 | 28 | flutter_ios_podfile_setup 29 | 30 | target 'Runner' do 31 | use_frameworks! 32 | use_modular_headers! 33 | 34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) 35 | end 36 | 37 | post_install do |installer| 38 | installer.pods_project.targets.each do |target| 39 | flutter_additional_ios_build_settings(target) 40 | end 41 | end 42 | -------------------------------------------------------------------------------- /example/ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Flutter (1.0.0) 3 | - imgly_sdk (3.2.0): 4 | - Flutter 5 | - imglyKit (~> 11.4) 6 | - imglyKit (11.10.0) 7 | - photo_editor_sdk (3.2.0): 8 | - Flutter 9 | - imgly_sdk (= 3.2.0) 10 | 11 | DEPENDENCIES: 12 | - Flutter (from `Flutter`) 13 | - imgly_sdk (from `.symlinks/plugins/imgly_sdk/ios`) 14 | - photo_editor_sdk (from `.symlinks/plugins/photo_editor_sdk/ios`) 15 | 16 | SPEC REPOS: 17 | trunk: 18 | - imglyKit 19 | 20 | EXTERNAL SOURCES: 21 | Flutter: 22 | :path: Flutter 23 | imgly_sdk: 24 | :path: ".symlinks/plugins/imgly_sdk/ios" 25 | photo_editor_sdk: 26 | :path: ".symlinks/plugins/photo_editor_sdk/ios" 27 | 28 | SPEC CHECKSUMS: 29 | Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 30 | imgly_sdk: e512f1e5804683ec0d521e797a15626432ed4538 31 | imglyKit: 709ba7929c4b6633797938065b5514126e1dc235 32 | photo_editor_sdk: 0ee0a34243f86394456f53dabe5bf93a7e2e9b27 33 | 34 | PODFILE CHECKSUM: c4c93c5f6502fe2754f48404d3594bf779584011 35 | 36 | COCOAPODS: 1.15.2 37 | -------------------------------------------------------------------------------- /example/ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 54; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 12 | 57C9380C14E90AA9C1211B5C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9CB2309DBBEAF1F01483D25E /* Pods_Runner.framework */; }; 13 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 14 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 15 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 16 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 17 | /* End PBXBuildFile section */ 18 | 19 | /* Begin PBXCopyFilesBuildPhase section */ 20 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 21 | isa = PBXCopyFilesBuildPhase; 22 | buildActionMask = 2147483647; 23 | dstPath = ""; 24 | dstSubfolderSpec = 10; 25 | files = ( 26 | ); 27 | name = "Embed Frameworks"; 28 | runOnlyForDeploymentPostprocessing = 0; 29 | }; 30 | /* End PBXCopyFilesBuildPhase section */ 31 | 32 | /* Begin PBXFileReference section */ 33 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 34 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 35 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 36 | 4A899B02CDAABDD5638FDD09 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 37 | 6540F4EA578D4F2F0FC3C7F7 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 38 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 39 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 40 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 41 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 42 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 43 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 44 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 45 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 46 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 47 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 48 | 9CB2309DBBEAF1F01483D25E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | E20B8D0D4B2FC7A2AF983DB2 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 50 | /* End PBXFileReference section */ 51 | 52 | /* Begin PBXFrameworksBuildPhase section */ 53 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 54 | isa = PBXFrameworksBuildPhase; 55 | buildActionMask = 2147483647; 56 | files = ( 57 | 57C9380C14E90AA9C1211B5C /* Pods_Runner.framework in Frameworks */, 58 | ); 59 | runOnlyForDeploymentPostprocessing = 0; 60 | }; 61 | /* End PBXFrameworksBuildPhase section */ 62 | 63 | /* Begin PBXGroup section */ 64 | 6096990DDDC2E0BAB8BDD590 /* Pods */ = { 65 | isa = PBXGroup; 66 | children = ( 67 | E20B8D0D4B2FC7A2AF983DB2 /* Pods-Runner.debug.xcconfig */, 68 | 6540F4EA578D4F2F0FC3C7F7 /* Pods-Runner.release.xcconfig */, 69 | 4A899B02CDAABDD5638FDD09 /* Pods-Runner.profile.xcconfig */, 70 | ); 71 | path = Pods; 72 | sourceTree = ""; 73 | }; 74 | 85035AC01DD95579F391B2A1 /* Frameworks */ = { 75 | isa = PBXGroup; 76 | children = ( 77 | 9CB2309DBBEAF1F01483D25E /* Pods_Runner.framework */, 78 | ); 79 | name = Frameworks; 80 | sourceTree = ""; 81 | }; 82 | 9740EEB11CF90186004384FC /* Flutter */ = { 83 | isa = PBXGroup; 84 | children = ( 85 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 86 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 87 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 88 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 89 | ); 90 | name = Flutter; 91 | sourceTree = ""; 92 | }; 93 | 97C146E51CF9000F007C117D = { 94 | isa = PBXGroup; 95 | children = ( 96 | 9740EEB11CF90186004384FC /* Flutter */, 97 | 97C146F01CF9000F007C117D /* Runner */, 98 | 97C146EF1CF9000F007C117D /* Products */, 99 | 6096990DDDC2E0BAB8BDD590 /* Pods */, 100 | 85035AC01DD95579F391B2A1 /* Frameworks */, 101 | ); 102 | sourceTree = ""; 103 | }; 104 | 97C146EF1CF9000F007C117D /* Products */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | 97C146EE1CF9000F007C117D /* Runner.app */, 108 | ); 109 | name = Products; 110 | sourceTree = ""; 111 | }; 112 | 97C146F01CF9000F007C117D /* Runner */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 116 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 117 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 118 | 97C147021CF9000F007C117D /* Info.plist */, 119 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 120 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 121 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 122 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 123 | ); 124 | path = Runner; 125 | sourceTree = ""; 126 | }; 127 | /* End PBXGroup section */ 128 | 129 | /* Begin PBXNativeTarget section */ 130 | 97C146ED1CF9000F007C117D /* Runner */ = { 131 | isa = PBXNativeTarget; 132 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 133 | buildPhases = ( 134 | 7B816C74D0AAE61ECB3050A0 /* [CP] Check Pods Manifest.lock */, 135 | 9740EEB61CF901F6004384FC /* Run Script */, 136 | 97C146EA1CF9000F007C117D /* Sources */, 137 | 97C146EB1CF9000F007C117D /* Frameworks */, 138 | 97C146EC1CF9000F007C117D /* Resources */, 139 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 140 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 141 | 8AAD1FCD9809211EFD0B45BC /* [CP] Embed Pods Frameworks */, 142 | ); 143 | buildRules = ( 144 | ); 145 | dependencies = ( 146 | ); 147 | name = Runner; 148 | productName = Runner; 149 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 150 | productType = "com.apple.product-type.application"; 151 | }; 152 | /* End PBXNativeTarget section */ 153 | 154 | /* Begin PBXProject section */ 155 | 97C146E61CF9000F007C117D /* Project object */ = { 156 | isa = PBXProject; 157 | attributes = { 158 | LastUpgradeCheck = 1430; 159 | ORGANIZATIONNAME = ""; 160 | TargetAttributes = { 161 | 97C146ED1CF9000F007C117D = { 162 | CreatedOnToolsVersion = 7.3.1; 163 | LastSwiftMigration = 1100; 164 | }; 165 | }; 166 | }; 167 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 168 | compatibilityVersion = "Xcode 9.3"; 169 | developmentRegion = en; 170 | hasScannedForEncodings = 0; 171 | knownRegions = ( 172 | en, 173 | Base, 174 | ); 175 | mainGroup = 97C146E51CF9000F007C117D; 176 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 177 | projectDirPath = ""; 178 | projectRoot = ""; 179 | targets = ( 180 | 97C146ED1CF9000F007C117D /* Runner */, 181 | ); 182 | }; 183 | /* End PBXProject section */ 184 | 185 | /* Begin PBXResourcesBuildPhase section */ 186 | 97C146EC1CF9000F007C117D /* Resources */ = { 187 | isa = PBXResourcesBuildPhase; 188 | buildActionMask = 2147483647; 189 | files = ( 190 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 191 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 192 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 193 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 194 | ); 195 | runOnlyForDeploymentPostprocessing = 0; 196 | }; 197 | /* End PBXResourcesBuildPhase section */ 198 | 199 | /* Begin PBXShellScriptBuildPhase section */ 200 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 201 | isa = PBXShellScriptBuildPhase; 202 | alwaysOutOfDate = 1; 203 | buildActionMask = 2147483647; 204 | files = ( 205 | ); 206 | inputPaths = ( 207 | "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", 208 | ); 209 | name = "Thin Binary"; 210 | outputPaths = ( 211 | ); 212 | runOnlyForDeploymentPostprocessing = 0; 213 | shellPath = /bin/sh; 214 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 215 | }; 216 | 7B816C74D0AAE61ECB3050A0 /* [CP] Check Pods Manifest.lock */ = { 217 | isa = PBXShellScriptBuildPhase; 218 | buildActionMask = 2147483647; 219 | files = ( 220 | ); 221 | inputFileListPaths = ( 222 | ); 223 | inputPaths = ( 224 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 225 | "${PODS_ROOT}/Manifest.lock", 226 | ); 227 | name = "[CP] Check Pods Manifest.lock"; 228 | outputFileListPaths = ( 229 | ); 230 | outputPaths = ( 231 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", 232 | ); 233 | runOnlyForDeploymentPostprocessing = 0; 234 | shellPath = /bin/sh; 235 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 236 | showEnvVarsInLog = 0; 237 | }; 238 | 8AAD1FCD9809211EFD0B45BC /* [CP] Embed Pods Frameworks */ = { 239 | isa = PBXShellScriptBuildPhase; 240 | buildActionMask = 2147483647; 241 | files = ( 242 | ); 243 | inputFileListPaths = ( 244 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", 245 | ); 246 | name = "[CP] Embed Pods Frameworks"; 247 | outputFileListPaths = ( 248 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", 249 | ); 250 | runOnlyForDeploymentPostprocessing = 0; 251 | shellPath = /bin/sh; 252 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; 253 | showEnvVarsInLog = 0; 254 | }; 255 | 9740EEB61CF901F6004384FC /* Run Script */ = { 256 | isa = PBXShellScriptBuildPhase; 257 | alwaysOutOfDate = 1; 258 | buildActionMask = 2147483647; 259 | files = ( 260 | ); 261 | inputPaths = ( 262 | ); 263 | name = "Run Script"; 264 | outputPaths = ( 265 | ); 266 | runOnlyForDeploymentPostprocessing = 0; 267 | shellPath = /bin/sh; 268 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 269 | }; 270 | /* End PBXShellScriptBuildPhase section */ 271 | 272 | /* Begin PBXSourcesBuildPhase section */ 273 | 97C146EA1CF9000F007C117D /* Sources */ = { 274 | isa = PBXSourcesBuildPhase; 275 | buildActionMask = 2147483647; 276 | files = ( 277 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 278 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 279 | ); 280 | runOnlyForDeploymentPostprocessing = 0; 281 | }; 282 | /* End PBXSourcesBuildPhase section */ 283 | 284 | /* Begin PBXVariantGroup section */ 285 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 286 | isa = PBXVariantGroup; 287 | children = ( 288 | 97C146FB1CF9000F007C117D /* Base */, 289 | ); 290 | name = Main.storyboard; 291 | sourceTree = ""; 292 | }; 293 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 294 | isa = PBXVariantGroup; 295 | children = ( 296 | 97C147001CF9000F007C117D /* Base */, 297 | ); 298 | name = LaunchScreen.storyboard; 299 | sourceTree = ""; 300 | }; 301 | /* End PBXVariantGroup section */ 302 | 303 | /* Begin XCBuildConfiguration section */ 304 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 305 | isa = XCBuildConfiguration; 306 | buildSettings = { 307 | ALWAYS_SEARCH_USER_PATHS = NO; 308 | CLANG_ANALYZER_NONNULL = YES; 309 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 310 | CLANG_CXX_LIBRARY = "libc++"; 311 | CLANG_ENABLE_MODULES = YES; 312 | CLANG_ENABLE_OBJC_ARC = YES; 313 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 314 | CLANG_WARN_BOOL_CONVERSION = YES; 315 | CLANG_WARN_COMMA = YES; 316 | CLANG_WARN_CONSTANT_CONVERSION = YES; 317 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 318 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 319 | CLANG_WARN_EMPTY_BODY = YES; 320 | CLANG_WARN_ENUM_CONVERSION = YES; 321 | CLANG_WARN_INFINITE_RECURSION = YES; 322 | CLANG_WARN_INT_CONVERSION = YES; 323 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 324 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 325 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 326 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 327 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 328 | CLANG_WARN_STRICT_PROTOTYPES = YES; 329 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 330 | CLANG_WARN_UNREACHABLE_CODE = YES; 331 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 332 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 333 | COPY_PHASE_STRIP = NO; 334 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 335 | ENABLE_NS_ASSERTIONS = NO; 336 | ENABLE_STRICT_OBJC_MSGSEND = YES; 337 | GCC_C_LANGUAGE_STANDARD = gnu99; 338 | GCC_NO_COMMON_BLOCKS = YES; 339 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 340 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 341 | GCC_WARN_UNDECLARED_SELECTOR = YES; 342 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 343 | GCC_WARN_UNUSED_FUNCTION = YES; 344 | GCC_WARN_UNUSED_VARIABLE = YES; 345 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 346 | MTL_ENABLE_DEBUG_INFO = NO; 347 | SDKROOT = iphoneos; 348 | SUPPORTED_PLATFORMS = iphoneos; 349 | TARGETED_DEVICE_FAMILY = "1,2"; 350 | VALIDATE_PRODUCT = YES; 351 | }; 352 | name = Profile; 353 | }; 354 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 355 | isa = XCBuildConfiguration; 356 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 357 | buildSettings = { 358 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 359 | CLANG_ENABLE_MODULES = YES; 360 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 361 | ENABLE_BITCODE = NO; 362 | FRAMEWORK_SEARCH_PATHS = ( 363 | "$(inherited)", 364 | "$(PROJECT_DIR)/Flutter", 365 | ); 366 | INFOPLIST_FILE = Runner/Info.plist; 367 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 368 | LD_RUNPATH_SEARCH_PATHS = ( 369 | "$(inherited)", 370 | "@executable_path/Frameworks", 371 | ); 372 | LIBRARY_SEARCH_PATHS = ( 373 | "$(inherited)", 374 | "$(PROJECT_DIR)/Flutter", 375 | ); 376 | PRODUCT_BUNDLE_IDENTIFIER = ly.img.flutter.photoEditorSdkExample; 377 | PRODUCT_NAME = "$(TARGET_NAME)"; 378 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 379 | SWIFT_VERSION = 5.0; 380 | VERSIONING_SYSTEM = "apple-generic"; 381 | }; 382 | name = Profile; 383 | }; 384 | 97C147031CF9000F007C117D /* Debug */ = { 385 | isa = XCBuildConfiguration; 386 | buildSettings = { 387 | ALWAYS_SEARCH_USER_PATHS = NO; 388 | CLANG_ANALYZER_NONNULL = YES; 389 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 390 | CLANG_CXX_LIBRARY = "libc++"; 391 | CLANG_ENABLE_MODULES = YES; 392 | CLANG_ENABLE_OBJC_ARC = YES; 393 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 394 | CLANG_WARN_BOOL_CONVERSION = YES; 395 | CLANG_WARN_COMMA = YES; 396 | CLANG_WARN_CONSTANT_CONVERSION = YES; 397 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 398 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 399 | CLANG_WARN_EMPTY_BODY = YES; 400 | CLANG_WARN_ENUM_CONVERSION = YES; 401 | CLANG_WARN_INFINITE_RECURSION = YES; 402 | CLANG_WARN_INT_CONVERSION = YES; 403 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 404 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 405 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 406 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 407 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 408 | CLANG_WARN_STRICT_PROTOTYPES = YES; 409 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 410 | CLANG_WARN_UNREACHABLE_CODE = YES; 411 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 412 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 413 | COPY_PHASE_STRIP = NO; 414 | DEBUG_INFORMATION_FORMAT = dwarf; 415 | ENABLE_STRICT_OBJC_MSGSEND = YES; 416 | ENABLE_TESTABILITY = YES; 417 | GCC_C_LANGUAGE_STANDARD = gnu99; 418 | GCC_DYNAMIC_NO_PIC = NO; 419 | GCC_NO_COMMON_BLOCKS = YES; 420 | GCC_OPTIMIZATION_LEVEL = 0; 421 | GCC_PREPROCESSOR_DEFINITIONS = ( 422 | "DEBUG=1", 423 | "$(inherited)", 424 | ); 425 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 426 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 427 | GCC_WARN_UNDECLARED_SELECTOR = YES; 428 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 429 | GCC_WARN_UNUSED_FUNCTION = YES; 430 | GCC_WARN_UNUSED_VARIABLE = YES; 431 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 432 | MTL_ENABLE_DEBUG_INFO = YES; 433 | ONLY_ACTIVE_ARCH = YES; 434 | SDKROOT = iphoneos; 435 | TARGETED_DEVICE_FAMILY = "1,2"; 436 | }; 437 | name = Debug; 438 | }; 439 | 97C147041CF9000F007C117D /* Release */ = { 440 | isa = XCBuildConfiguration; 441 | buildSettings = { 442 | ALWAYS_SEARCH_USER_PATHS = NO; 443 | CLANG_ANALYZER_NONNULL = YES; 444 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 445 | CLANG_CXX_LIBRARY = "libc++"; 446 | CLANG_ENABLE_MODULES = YES; 447 | CLANG_ENABLE_OBJC_ARC = YES; 448 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 449 | CLANG_WARN_BOOL_CONVERSION = YES; 450 | CLANG_WARN_COMMA = YES; 451 | CLANG_WARN_CONSTANT_CONVERSION = YES; 452 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 453 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 454 | CLANG_WARN_EMPTY_BODY = YES; 455 | CLANG_WARN_ENUM_CONVERSION = YES; 456 | CLANG_WARN_INFINITE_RECURSION = YES; 457 | CLANG_WARN_INT_CONVERSION = YES; 458 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 459 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 460 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 461 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 462 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 463 | CLANG_WARN_STRICT_PROTOTYPES = YES; 464 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 465 | CLANG_WARN_UNREACHABLE_CODE = YES; 466 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 467 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 468 | COPY_PHASE_STRIP = NO; 469 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 470 | ENABLE_NS_ASSERTIONS = NO; 471 | ENABLE_STRICT_OBJC_MSGSEND = YES; 472 | GCC_C_LANGUAGE_STANDARD = gnu99; 473 | GCC_NO_COMMON_BLOCKS = YES; 474 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 475 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 476 | GCC_WARN_UNDECLARED_SELECTOR = YES; 477 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 478 | GCC_WARN_UNUSED_FUNCTION = YES; 479 | GCC_WARN_UNUSED_VARIABLE = YES; 480 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 481 | MTL_ENABLE_DEBUG_INFO = NO; 482 | SDKROOT = iphoneos; 483 | SUPPORTED_PLATFORMS = iphoneos; 484 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 485 | TARGETED_DEVICE_FAMILY = "1,2"; 486 | VALIDATE_PRODUCT = YES; 487 | }; 488 | name = Release; 489 | }; 490 | 97C147061CF9000F007C117D /* Debug */ = { 491 | isa = XCBuildConfiguration; 492 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 493 | buildSettings = { 494 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 495 | CLANG_ENABLE_MODULES = YES; 496 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 497 | ENABLE_BITCODE = NO; 498 | FRAMEWORK_SEARCH_PATHS = ( 499 | "$(inherited)", 500 | "$(PROJECT_DIR)/Flutter", 501 | ); 502 | INFOPLIST_FILE = Runner/Info.plist; 503 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 504 | LD_RUNPATH_SEARCH_PATHS = ( 505 | "$(inherited)", 506 | "@executable_path/Frameworks", 507 | ); 508 | LIBRARY_SEARCH_PATHS = ( 509 | "$(inherited)", 510 | "$(PROJECT_DIR)/Flutter", 511 | ); 512 | PRODUCT_BUNDLE_IDENTIFIER = ly.img.flutter.photoEditorSdkExample; 513 | PRODUCT_NAME = "$(TARGET_NAME)"; 514 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 515 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 516 | SWIFT_VERSION = 5.0; 517 | VERSIONING_SYSTEM = "apple-generic"; 518 | }; 519 | name = Debug; 520 | }; 521 | 97C147071CF9000F007C117D /* Release */ = { 522 | isa = XCBuildConfiguration; 523 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 524 | buildSettings = { 525 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 526 | CLANG_ENABLE_MODULES = YES; 527 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 528 | ENABLE_BITCODE = NO; 529 | FRAMEWORK_SEARCH_PATHS = ( 530 | "$(inherited)", 531 | "$(PROJECT_DIR)/Flutter", 532 | ); 533 | INFOPLIST_FILE = Runner/Info.plist; 534 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 535 | LD_RUNPATH_SEARCH_PATHS = ( 536 | "$(inherited)", 537 | "@executable_path/Frameworks", 538 | ); 539 | LIBRARY_SEARCH_PATHS = ( 540 | "$(inherited)", 541 | "$(PROJECT_DIR)/Flutter", 542 | ); 543 | PRODUCT_BUNDLE_IDENTIFIER = ly.img.flutter.photoEditorSdkExample; 544 | PRODUCT_NAME = "$(TARGET_NAME)"; 545 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 546 | SWIFT_VERSION = 5.0; 547 | VERSIONING_SYSTEM = "apple-generic"; 548 | }; 549 | name = Release; 550 | }; 551 | /* End XCBuildConfiguration section */ 552 | 553 | /* Begin XCConfigurationList section */ 554 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 555 | isa = XCConfigurationList; 556 | buildConfigurations = ( 557 | 97C147031CF9000F007C117D /* Debug */, 558 | 97C147041CF9000F007C117D /* Release */, 559 | 249021D3217E4FDB00AE95B9 /* Profile */, 560 | ); 561 | defaultConfigurationIsVisible = 0; 562 | defaultConfigurationName = Release; 563 | }; 564 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 565 | isa = XCConfigurationList; 566 | buildConfigurations = ( 567 | 97C147061CF9000F007C117D /* Debug */, 568 | 97C147071CF9000F007C117D /* Release */, 569 | 249021D4217E4FDB00AE95B9 /* Profile */, 570 | ); 571 | defaultConfigurationIsVisible = 0; 572 | defaultConfigurationName = Release; 573 | }; 574 | /* End XCConfigurationList section */ 575 | }; 576 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 577 | } 578 | -------------------------------------------------------------------------------- /example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /example/ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /example/ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/App_store_1024_1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/App_store_1024_1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "iPhone_Notifications_20_2x.png", 5 | "idiom" : "iphone", 6 | "scale" : "2x", 7 | "size" : "20x20" 8 | }, 9 | { 10 | "filename" : "iPhone_Notifications_20_3x.png", 11 | "idiom" : "iphone", 12 | "scale" : "3x", 13 | "size" : "20x20" 14 | }, 15 | { 16 | "filename" : "iPad_Settings_29_1x.png", 17 | "idiom" : "iphone", 18 | "scale" : "1x", 19 | "size" : "29x29" 20 | }, 21 | { 22 | "filename" : "iPhone_Settings_29_2x.png", 23 | "idiom" : "iphone", 24 | "scale" : "2x", 25 | "size" : "29x29" 26 | }, 27 | { 28 | "filename" : "iPhone_Settings_29_3x.png", 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "29x29" 32 | }, 33 | { 34 | "filename" : "iPhone_Spotlight_40_2x.png", 35 | "idiom" : "iphone", 36 | "scale" : "2x", 37 | "size" : "40x40" 38 | }, 39 | { 40 | "filename" : "iPhone_Spotlight_40_3x.png", 41 | "idiom" : "iphone", 42 | "scale" : "3x", 43 | "size" : "40x40" 44 | }, 45 | { 46 | "filename" : "iPhone_App_60_2x.png", 47 | "idiom" : "iphone", 48 | "scale" : "2x", 49 | "size" : "60x60" 50 | }, 51 | { 52 | "filename" : "iPhone_App_60_3x.png", 53 | "idiom" : "iphone", 54 | "scale" : "3x", 55 | "size" : "60x60" 56 | }, 57 | { 58 | "filename" : "iPad_Notifications_20_1x.png", 59 | "idiom" : "ipad", 60 | "scale" : "1x", 61 | "size" : "20x20" 62 | }, 63 | { 64 | "filename" : "iPad_Notifications_20_2x.png", 65 | "idiom" : "ipad", 66 | "scale" : "2x", 67 | "size" : "20x20" 68 | }, 69 | { 70 | "filename" : "iPad_Settings_29_1x-1.png", 71 | "idiom" : "ipad", 72 | "scale" : "1x", 73 | "size" : "29x29" 74 | }, 75 | { 76 | "filename" : "iPad_Settings_29_2x.png", 77 | "idiom" : "ipad", 78 | "scale" : "2x", 79 | "size" : "29x29" 80 | }, 81 | { 82 | "filename" : "iPad_Spotlight_40_1x.png", 83 | "idiom" : "ipad", 84 | "scale" : "1x", 85 | "size" : "40x40" 86 | }, 87 | { 88 | "filename" : "iPad_Spotlight_40_2x.png", 89 | "idiom" : "ipad", 90 | "scale" : "2x", 91 | "size" : "40x40" 92 | }, 93 | { 94 | "filename" : "iPad_App_76_1x.png", 95 | "idiom" : "ipad", 96 | "scale" : "1x", 97 | "size" : "76x76" 98 | }, 99 | { 100 | "filename" : "iPad_App_76_2x.png", 101 | "idiom" : "ipad", 102 | "scale" : "2x", 103 | "size" : "76x76" 104 | }, 105 | { 106 | "filename" : "iPad_Pro_App_83.5_2x.png", 107 | "idiom" : "ipad", 108 | "scale" : "2x", 109 | "size" : "83.5x83.5" 110 | }, 111 | { 112 | "filename" : "App_store_1024_1x.png", 113 | "idiom" : "ios-marketing", 114 | "scale" : "1x", 115 | "size" : "1024x1024" 116 | } 117 | ], 118 | "info" : { 119 | "author" : "xcode", 120 | "version" : 1 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPad_App_76_1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPad_App_76_1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPad_App_76_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPad_App_76_2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPad_Notifications_20_1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPad_Notifications_20_1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPad_Notifications_20_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPad_Notifications_20_2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPad_Pro_App_83.5_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPad_Pro_App_83.5_2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPad_Settings_29_1x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPad_Settings_29_1x-1.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPad_Settings_29_1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPad_Settings_29_1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPad_Settings_29_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPad_Settings_29_2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPad_Spotlight_40_1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPad_Spotlight_40_1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPad_Spotlight_40_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPad_Spotlight_40_2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPhone_App_60_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPhone_App_60_2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPhone_App_60_3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPhone_App_60_3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPhone_Notifications_20_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPhone_Notifications_20_2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPhone_Notifications_20_3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPhone_Notifications_20_3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPhone_Settings_29_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPhone_Settings_29_2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPhone_Settings_29_3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPhone_Settings_29_3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPhone_Spotlight_40_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPhone_Spotlight_40_2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPhone_Spotlight_40_3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/iPhone_Spotlight_40_3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /example/ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /example/ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /example/ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | photo_editor_sdk_example 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UIViewControllerBasedStatusBarAppearance 43 | 44 | CADisableMinimumFrameDurationOnPhone 45 | 46 | UIApplicationSupportsIndirectInputEvents 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /example/ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /example/lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:imgly_sdk/imgly_sdk.dart'; 3 | import 'package:photo_editor_sdk/photo_editor_sdk.dart'; 4 | 5 | void main() { 6 | runApp(MyApp()); 7 | } 8 | 9 | /// The example application of the photo_editor_sdk plugin. 10 | class MyApp extends StatefulWidget { 11 | @override 12 | _MyAppState createState() => _MyAppState(); 13 | } 14 | 15 | class _MyAppState extends State { 16 | Configuration createConfiguration() { 17 | final flutterSticker = Sticker( 18 | "example_sticker_logos_flutter", "Flutter", "assets/Flutter-logo.png"); 19 | final imglySticker = Sticker( 20 | "example_sticker_logos_imgly", "img.ly", "assets/IgorSticker.png"); 21 | 22 | /// A completely custom category. 23 | final logos = StickerCategory( 24 | "example_sticker_category_logos", "Logos", "assets/Flutter-logo.png", 25 | items: [flutterSticker, imglySticker]); 26 | 27 | /// A predefined category. 28 | final emoticons = 29 | StickerCategory.existing("imgly_sticker_category_emoticons"); 30 | 31 | /// A customized predefined category. 32 | final shapes = 33 | StickerCategory.existing("imgly_sticker_category_shapes", items: [ 34 | Sticker.existing("imgly_sticker_shapes_badge_01"), 35 | Sticker.existing("imgly_sticker_shapes_arrow_02") 36 | ]); 37 | final categories = [logos, emoticons, shapes]; 38 | final configuration = Configuration( 39 | sticker: 40 | StickerOptions(personalStickers: true, categories: categories)); 41 | return configuration; 42 | } 43 | 44 | @override 45 | void initState() { 46 | super.initState(); 47 | } 48 | 49 | void presentEditor() async { 50 | final result = await PESDK.openEditor( 51 | image: "assets/LA.jpg", configuration: createConfiguration()); 52 | print(result?.toJson()); 53 | } 54 | 55 | @override 56 | Widget build(BuildContext context) { 57 | return MaterialApp( 58 | home: Scaffold( 59 | appBar: AppBar( 60 | title: const Text('PhotoEditor SDK Example'), 61 | ), 62 | body: ListView.builder( 63 | itemBuilder: (context, index) { 64 | return ListTile( 65 | title: Text("Open photo editor"), 66 | subtitle: Text("Click to edit a sample image."), 67 | onTap: presentEditor, 68 | ); 69 | }, 70 | itemCount: 1, 71 | )), 72 | ); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /example/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: photo_editor_sdk_example 2 | description: Demonstrates how to use the photo_editor_sdk plugin. 3 | 4 | # The following line prevents the package from being accidentally published to 5 | # pub.dev using `pub publish`. This is preferred for private packages. 6 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev 7 | 8 | environment: 9 | sdk: ">=2.12.0 <3.0.0" 10 | 11 | dependencies: 12 | flutter: 13 | sdk: flutter 14 | 15 | photo_editor_sdk: 16 | # When depending on this package from a real application you should use: 17 | # photo_editor_sdk: ^x.y.z 18 | # See https://dart.dev/tools/pub/dependencies#version-constraints 19 | # The example app is bundled with the plugin so we use a path dependency on 20 | # the parent directory to use the current plugin's version. 21 | path: ../ 22 | 23 | # The following adds the Cupertino Icons font to your application. 24 | # Use with the CupertinoIcons class for iOS style icons. 25 | cupertino_icons: ^1.0.3 26 | 27 | dev_dependencies: 28 | flutter_test: 29 | sdk: flutter 30 | effective_dart: ^1.3.1 31 | 32 | # For information on the generic Dart part of this file, see the 33 | # following page: https://dart.dev/tools/pub/pubspec 34 | 35 | # The following section is specific to Flutter. 36 | flutter: 37 | 38 | assets: 39 | - assets/LA.jpg 40 | - assets/Flutter-logo.png 41 | - assets/IgorSticker.png 42 | 43 | # The following line ensures that the Material Icons font is 44 | # included with your application, so that you can use the icons in 45 | # the material Icons class. 46 | uses-material-design: true 47 | 48 | # To add assets to your application, add an assets section, like this: 49 | # assets: 50 | # - images/a_dot_burr.jpeg 51 | # - images/a_dot_ham.jpeg 52 | 53 | # An image asset can refer to one or more resolution-specific "variants", see 54 | # https://flutter.dev/assets-and-images/#resolution-aware. 55 | 56 | # For details regarding adding assets from package dependencies, see 57 | # https://flutter.dev/assets-and-images/#from-packages 58 | 59 | # To add custom fonts to your application, add a fonts section here, 60 | # in this "flutter" section. Each entry in this list should have a 61 | # "family" key with the font family name, and a "fonts" key with a 62 | # list giving the asset and other descriptors for the font. For 63 | # example: 64 | # fonts: 65 | # - family: Schyler 66 | # fonts: 67 | # - asset: fonts/Schyler-Regular.ttf 68 | # - asset: fonts/Schyler-Italic.ttf 69 | # style: italic 70 | # - family: Trajan Pro 71 | # fonts: 72 | # - asset: fonts/TrajanPro.ttf 73 | # - asset: fonts/TrajanPro_Bold.ttf 74 | # weight: 700 75 | # 76 | # For details regarding fonts from package dependencies, 77 | # see https://flutter.dev/custom-fonts/#from-packages 78 | -------------------------------------------------------------------------------- /example/test/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // 3 | // To perform an interaction with a widget in your test, use the WidgetTester 4 | // utility that Flutter provides. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter_test/flutter_test.dart'; 10 | import 'package:photo_editor_sdk_example/main.dart'; 11 | 12 | void main() { 13 | testWidgets('Verify Platform version', (tester) async { 14 | // Build our app and trigger a frame. 15 | await tester.pumpWidget(MyApp()); 16 | 17 | // Verify that platform version is retrieved. 18 | expect( 19 | find.byWidgetPredicate( 20 | (widget) => widget is Text && widget.data!.startsWith('Running on:'), 21 | ), 22 | findsOneWidget, 23 | ); 24 | }); 25 | } 26 | -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .vagrant/ 3 | .sconsign.dblite 4 | .svn/ 5 | 6 | .DS_Store 7 | *.swp 8 | profile 9 | 10 | DerivedData/ 11 | build/ 12 | GeneratedPluginRegistrant.h 13 | GeneratedPluginRegistrant.m 14 | 15 | .generated/ 16 | 17 | *.pbxuser 18 | *.mode1v3 19 | *.mode2v3 20 | *.perspectivev3 21 | 22 | !default.pbxuser 23 | !default.mode1v3 24 | !default.mode2v3 25 | !default.perspectivev3 26 | 27 | xcuserdata 28 | 29 | *.moved-aside 30 | 31 | *.pyc 32 | *sync/ 33 | Icon? 34 | .tags* 35 | 36 | /Flutter/Generated.xcconfig 37 | /Flutter/flutter_export_environment.sh -------------------------------------------------------------------------------- /ios/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imgly/pesdk-flutter/d32e49062d8c1d90e40d189694ca23a636251f93/ios/Assets/.gitkeep -------------------------------------------------------------------------------- /ios/Classes/FlutterPESDK.swift: -------------------------------------------------------------------------------- 1 | import Flutter 2 | import UIKit 3 | import CoreServices 4 | import ImglyKit 5 | import imgly_sdk 6 | 7 | @available(iOS 13.0, *) 8 | public class FlutterPESDK: FlutterIMGLY, FlutterPlugin, PhotoEditViewControllerDelegate { 9 | 10 | // MARK: - Typealias 11 | 12 | /// A closure to modify a new `PhotoEditViewController` before it is presented on screen. 13 | public typealias PESDKWillPresentBlock = (_ photoEditViewController: PhotoEditViewController) -> Void 14 | 15 | // MARK: - Properties 16 | 17 | /// Set this closure to modify a new `PhotoEditViewController` before it is presented on screen. 18 | public static var willPresentPhotoEditViewController: PESDKWillPresentBlock? 19 | 20 | // MARK: - Flutter Channel 21 | 22 | /// Registers for the channel in order to communicate with the 23 | /// Flutter plugin. 24 | /// - Parameter registrar: The `FlutterPluginRegistrar` used to register. 25 | public static func register(with registrar: FlutterPluginRegistrar) { 26 | let channel = FlutterMethodChannel(name: "photo_editor_sdk", binaryMessenger: registrar.messenger()) 27 | let instance = FlutterPESDK() 28 | registrar.addMethodCallDelegate(instance, channel: channel) 29 | FlutterPESDK.registrar = registrar 30 | FlutterPESDK.methodeChannel = channel 31 | } 32 | 33 | /// Retrieves the methods and initiates the fitting behavior. 34 | /// - Parameter call: The `FlutterMethodCall` containig the information about the method. 35 | /// - Parameter result: The `FlutterResult` to return to the Flutter plugin. 36 | public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { 37 | guard let arguments = call.arguments as? IMGLYDictionary else { return } 38 | 39 | if self.result != nil { 40 | result(FlutterError(code: IMGLYConstants.kErrorMultipleRequests, message: "Cancelled due to multiple requests.", details: nil)) 41 | return 42 | } 43 | 44 | if call.method == "openEditor" { 45 | let configuration = arguments["configuration"] as? IMGLYDictionary 46 | let serialization = arguments["serialization"] as? IMGLYDictionary 47 | self.result = result 48 | 49 | var photo: Photo? 50 | if let assetObject = arguments["image"] as? String, 51 | let assetURL = EmbeddedAsset(from: assetObject).resolvedURL, let url = URL(string: assetURL) { 52 | photo = Photo(url: url) 53 | } 54 | self.present(photo: photo, configuration: configuration, serialization: serialization) 55 | } else if call.method == "unlock" { 56 | guard let license = arguments["license"] as? String else { return } 57 | self.result = result 58 | self.unlockWithLicense(with: license) 59 | } else { 60 | result(FlutterMethodNotImplemented) 61 | } 62 | } 63 | 64 | // MARK: - Presenting editor 65 | 66 | /// Presents an instance of `PhotoEditViewController`. 67 | /// - Parameter photo: The `Photo` to initialize the editor with. 68 | /// - Parameter configuration: The configuration for the editor in as `IMGLYDictionary` 69 | /// - Parameter serialization: The serialization as `IMGLYDictionary`. 70 | private func present(photo: Photo?, configuration: IMGLYDictionary?, serialization: IMGLYDictionary?) { 71 | self.present(mediaEditViewControllerBlock: { (configurationData, serializationData) -> MediaEditViewController? in 72 | 73 | var finalPhotoAsset: Photo? = photo 74 | var photoEditModel = PhotoEditModel() 75 | var editor: PhotoEditViewController 76 | 77 | if let finalData = serializationData { 78 | var deserializationResult: Deserializer.DeserializationResult? 79 | if let photo_ = photo { 80 | deserializationResult = Deserializer.deserialize(data: finalData, imageDimensions: photo_.size, assetCatalog: configurationData?.assetCatalog ?? .defaultItems) 81 | } else { 82 | deserializationResult = Deserializer._objCDeserialize(data: finalData, assetCatalog: configurationData?.assetCatalog ?? .defaultItems) 83 | if let serializationPhoto = deserializationResult?.photo { 84 | finalPhotoAsset = Photo.from(photoRepresentation: serializationPhoto) 85 | } else { 86 | self.result?(FlutterError(code: IMGLYConstants.kErrorUnableToLoad, message: "The specified serialization did not include a photo.", details: nil)) 87 | self.result = nil 88 | return nil 89 | } 90 | } 91 | photoEditModel = deserializationResult?.model ?? photoEditModel 92 | } 93 | 94 | guard let finalPhoto = finalPhotoAsset else { 95 | self.result?(FlutterError(code: IMGLYConstants.kErrorUnableToLoad, message: "No image has been specified or included in the serialization.", details: nil)) 96 | self.result = nil 97 | return nil 98 | } 99 | 100 | if let configuration = configurationData { 101 | editor = PhotoEditViewController.makePhotoEditViewController(photoAsset: finalPhoto, configuration: configuration, photoEditModel: photoEditModel) 102 | } else { 103 | editor = PhotoEditViewController.makePhotoEditViewController(photoAsset: finalPhoto, photoEditModel: photoEditModel) 104 | } 105 | editor.delegate = self 106 | editor.modalPresentationStyle = .fullScreen 107 | 108 | FlutterPESDK.willPresentPhotoEditViewController?(editor) 109 | 110 | return editor 111 | }, utiBlock: { (configurationData) -> CFString in 112 | return (configurationData?.photoEditViewControllerOptions.outputImageFileFormatUTI ?? kUTTypeJPEG) 113 | }, configurationData: configuration, serialization: serialization) 114 | } 115 | 116 | // MARK: - Licensing 117 | 118 | /// Unlocks the license from a url. 119 | /// - Parameter url: The URL where the license file is located. 120 | public override func unlockWithLicenseFile(at url: URL) { 121 | DispatchQueue.main.async { 122 | do { 123 | try PESDK.unlockWithLicense(from: url) 124 | self.result?(nil) 125 | self.result = nil 126 | } catch let error { 127 | self.result?(FlutterError(code: IMGLYConstants.kErrorUnableToUnlock, message: "Unlocking the SDK failed due to:", details: error.localizedDescription)) 128 | self.result = nil 129 | } 130 | } 131 | } 132 | 133 | // MARK: - Helpers 134 | 135 | /// Handles an occuring error and closes the editor. 136 | /// - Parameter photoEditViewController: The `PhotoEditViewController` that caused the error. 137 | /// - Parameter code: The error code. 138 | /// - Parameter message: The error message. 139 | /// - Parameter details: The error details. 140 | private func handleError(_ photoEditViewController: PhotoEditViewController, code: String, message: String?, details: Any?) { 141 | self.dismiss(mediaEditViewController: photoEditViewController, animated: true) { 142 | self.result?(FlutterError(code: code, message: message, details: details)) 143 | self.result = nil 144 | } 145 | } 146 | } 147 | 148 | // MARK: - Delegate 149 | 150 | /// The delegate for the `PhotoEditViewController`. 151 | @available(iOS 13.0, *) 152 | extension FlutterPESDK { 153 | /// Delegate function called when the `PhotoEditViewController` has successfully exported the image. 154 | /// - Parameter photoEditViewController: The editor who has finished exporting. 155 | /// - Parameter result: The `PhotoEditorResult` from the editor. 156 | public func photoEditViewControllerDidFinish(_ photoEditViewController: PhotoEditViewController, result: PhotoEditorResult) { 157 | guard let uti = result.output.uti else { 158 | self.handleError(photoEditViewController, code: IMGLYConstants.kErrorUnableToExport, message: "Failed to retrieve the output UTI.", details: nil) 159 | return 160 | } 161 | 162 | let imageData = result.output.data 163 | var imageString: String? 164 | var serialization: Any? 165 | 166 | if imageData.isEmpty == false { 167 | if self.exportType == IMGLYConstants.kExportTypeFileURL { 168 | guard let fileURL = self.exportFile else { 169 | self.handleError(photoEditViewController, code: IMGLYConstants.kErrorUnableToExport, message: "No valid export type has been specified.", details: self.exportFile?.absoluteString) 170 | return 171 | } 172 | do { 173 | try imageData.IMGLYwriteToUrl(fileURL, andCreateDirectoryIfNeeded: true) 174 | imageString = fileURL.absoluteString 175 | } catch let error { 176 | self.handleError(photoEditViewController, code: IMGLYConstants.kErrorUnableToExport, message: error.localizedDescription, details: error.localizedDescription) 177 | return 178 | } 179 | } else if self.exportType == IMGLYConstants.kExportTypeDataURL { 180 | if let mediaType = UTTypeCopyPreferredTagWithClass(uti as CFString, kUTTagClassMIMEType)?.takeRetainedValue() as? NSString { 181 | imageString = String(format: "data:%@;base64,%@", mediaType, imageData.base64EncodedString()) 182 | } else { 183 | self.handleError(photoEditViewController, code: IMGLYConstants.kErrorUnableToExport, message: "The output UTI could not be read.", details: nil) 184 | return 185 | } 186 | } 187 | } 188 | 189 | if self.serializationEnabled == true { 190 | guard let serializationData = photoEditViewController.serializedSettings(withImageData: self.serializationEmbedImage ?? false) else { 191 | return 192 | } 193 | if self.serializationType == IMGLYConstants.kExportTypeFileURL { 194 | guard let exportURL = self.serializationFile else { 195 | self.handleError(photoEditViewController, code: IMGLYConstants.kErrorUnableToExport, message: "The URL must not be nil.", details: nil) 196 | return 197 | } 198 | do { 199 | try serializationData.IMGLYwriteToUrl(exportURL, andCreateDirectoryIfNeeded: true) 200 | serialization = self.serializationFile?.absoluteString 201 | } catch let error { 202 | self.handleError(photoEditViewController, code: IMGLYConstants.kErrorUnableToExport, message: error.localizedDescription, details: error.localizedDescription) 203 | return 204 | } 205 | } else if self.serializationType == IMGLYConstants.kExportTypeObject { 206 | do { 207 | serialization = try JSONSerialization.jsonObject(with: serializationData, options: .init(rawValue: 0)) 208 | } catch let error { 209 | self.handleError(photoEditViewController, code: IMGLYConstants.kErrorUnableToExport, message: error.localizedDescription, details: error.localizedDescription) 210 | return 211 | } 212 | } 213 | } 214 | 215 | self.dismiss(mediaEditViewController: photoEditViewController, animated: true) { 216 | let res: [String: Any?] = ["image": imageString ?? "no image exported", "hasChanges": result.status == .renderedWithChanges, "serialization": serialization] 217 | self.result?(res) 218 | self.result = nil 219 | } 220 | } 221 | 222 | /// Delegate function that is called if the `PhotoEditViewController` did fail 223 | /// to export the image. 224 | /// 225 | /// - Parameter photoEditViewController: The editor that failed to export. 226 | /// - Parameter error: The `PhotoEditorError` that caused the failure. 227 | public func photoEditViewControllerDidFail(_ photoEditViewController: PhotoEditViewController, error: PhotoEditorError) { 228 | self.handleError(photoEditViewController, code: IMGLYConstants.kErrorUnableToExport, message: "The editor did fail to generate the image.", details: error.localizedDescription) 229 | } 230 | 231 | /// Delegate function that is called if the `PhotoEditViewController` has 232 | /// been cancelled. 233 | /// 234 | /// - Parameter photoEditViewController: The editor that was cancelled. 235 | public func photoEditViewControllerDidCancel(_ photoEditViewController: PhotoEditViewController) { 236 | self.dismiss(mediaEditViewController: photoEditViewController, animated: true) { 237 | self.result?(nil) 238 | self.result = nil 239 | } 240 | } 241 | } 242 | -------------------------------------------------------------------------------- /ios/Classes/PhotoEditorSDKPlugin.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface PhotoEditorSDKPlugin : NSObject 4 | @end 5 | -------------------------------------------------------------------------------- /ios/Classes/PhotoEditorSDKPlugin.m: -------------------------------------------------------------------------------- 1 | #import "PhotoEditorSDKPlugin.h" 2 | #if __has_include() 3 | #import 4 | #else 5 | // Support project import fallback if the generated compatibility header 6 | // is not copied when this plugin is created as a library. 7 | // https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816 8 | #import "photo_editor_sdk-Swift.h" 9 | #endif 10 | 11 | @implementation PhotoEditorSDKPlugin 12 | + (void)registerWithRegistrar:(NSObject*)registrar { 13 | [FlutterPESDK registerWithRegistrar:registrar]; 14 | } 15 | @end 16 | -------------------------------------------------------------------------------- /ios/photo_editor_sdk.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html. 3 | # Run `pod lib lint photo_editor_sdk.podspec' to validate before publishing. 4 | # 5 | 6 | require 'yaml' 7 | 8 | content = YAML.load_file('../pubspec.yaml') 9 | 10 | Pod::Spec.new do |s| 11 | s.name = content['name'] 12 | s.version = content['version'] 13 | s.summary = content['description'] 14 | s.description = <<-DESC 15 | The official Flutter plugin for PhotoEditor SDK. Integrate the photo editor into your own iOS or Android app - in minutes! 16 | DESC 17 | s.homepage = content['homepage'] 18 | s.license = { :file => '../LICENSE' } 19 | s.author = { content['homepage'] => 'contact@img.ly' } 20 | s.source = { :path => '.' } 21 | s.source_files = 'Classes/**/*' 22 | s.dependency 'Flutter' 23 | s.platform = :ios, '13.0' 24 | s.dependency 'imgly_sdk', s.version.to_s 25 | 26 | # Flutter.framework does not contain a i386 slice. 27 | s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } 28 | s.swift_version = '5.6' 29 | end 30 | -------------------------------------------------------------------------------- /lib/photo_editor_sdk.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'dart:convert'; 3 | import 'dart:io'; 4 | 5 | import 'package:flutter/services.dart'; 6 | import 'package:imgly_sdk/imgly_sdk.dart'; 7 | 8 | /// The plugin class for the photo_editor_sdk plugin. 9 | class PESDK { 10 | /// The `MethodChannel`. 11 | static const MethodChannel _channel = MethodChannel('photo_editor_sdk'); 12 | 13 | /// Unlocks the SDK with a license file from the assets. 14 | /// The [path] input should be a relative path to the license 15 | /// file(s) as specified in your `pubspec.yaml` file. 16 | /// If you want to unlock the SDK for both iOS and Android, you need 17 | /// to include one license for each platform with the same name, but where 18 | /// the iOS license has `.ios` as its file extension and the 19 | /// Android license has `.android` as its file extension. 20 | static Future unlockWithLicense(String path) async { 21 | return _channel.invokeMethod('unlock', {'license': path}); 22 | } 23 | 24 | /// Opens a new photo editor. 25 | /// 26 | /// Modally opens the editor with an image from the given [image] source. 27 | /// The editor can be customized with the [configuration]. 28 | /// The [serialization] restores a previous state of the editor 29 | /// by re-applying all modifications to the image. 30 | /// The [image] source should either be a full path, an URI 31 | /// or if it is an asset the relative path as specified in 32 | /// your `pubspec.yaml` file. If this parameter is `null`, 33 | /// the [serialization] must not be `null` and it must contain 34 | /// an embedded source image. 35 | /// Once finished, the editor either returns a 36 | /// [PhotoEditorResult] or `null` if the editor was dismissed without 37 | /// exporting the image. 38 | static Future openEditor( 39 | {String? image, 40 | Configuration? configuration, 41 | Map? serialization}) async { 42 | final result = await _channel.invokeMethod('openEditor', { 43 | 'image': image, 44 | 'configuration': configuration?.toJson(), 45 | 'serialization': serialization == null 46 | ? null 47 | : Platform.isIOS 48 | ? serialization 49 | : jsonEncode(serialization) 50 | }); 51 | return result == null 52 | ? null 53 | : PhotoEditorResult._fromJson(Map.from(result)); 54 | } 55 | } 56 | 57 | /// Returned if an editor has completed exporting. 58 | class PhotoEditorResult { 59 | /// Creates a new [PhotoEditorResult]. 60 | PhotoEditorResult._(this.image, this.hasChanges, this.serialization); 61 | 62 | /// The edited image. 63 | final String image; 64 | 65 | /// Indicating whether the image has been 66 | /// changed at all. 67 | final bool hasChanges; 68 | 69 | /// The serialization contains the applied changes. This is only 70 | /// returned in case `Configuration.export.serialization.enabled` is 71 | /// set to `true`. 72 | /// The serialization can either be the path of the serialization file as 73 | /// a [String] in case that `Configuration.export.serialization.exportType` 74 | /// is set to [SerializationExportType.fileUrl] 75 | /// or an object if `Configuration.export.serialization.exportType` 76 | /// is set to [SerializationExportType.object]. 77 | final dynamic serialization; 78 | 79 | /// Creates a [PhotoEditorResult] from the [json] map. 80 | factory PhotoEditorResult._fromJson(Map json) => 81 | PhotoEditorResult._( 82 | json["image"], json["hasChanges"], json["serialization"]); 83 | 84 | /// Converts the [PhotoEditorResult] for JSON parsing. 85 | Map toJson() => { 86 | "image": image, 87 | "hasChanges": hasChanges, 88 | "serialization": serialization 89 | }; 90 | } 91 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: photo_editor_sdk 2 | description: The official Flutter plugin for PhotoEditor SDK. Integrate the photo editor into your own iOS or Android app - in minutes! 3 | version: 3.2.0 4 | homepage: https://img.ly/products/photo-sdk 5 | repository: https://github.com/imgly/pesdk-flutter 6 | 7 | environment: 8 | sdk: ">=2.12.0 <3.0.0" 9 | flutter: ">=3.16.0" 10 | 11 | dependencies: 12 | flutter: 13 | sdk: flutter 14 | imgly_sdk: 3.2.0 15 | 16 | dev_dependencies: 17 | flutter_test: 18 | sdk: flutter 19 | effective_dart: ^1.3.1 20 | 21 | # For information on the generic Dart part of this file, see the 22 | # following page: https://dart.dev/tools/pub/pubspec 23 | 24 | # The following section is specific to Flutter. 25 | flutter: 26 | # This section identifies this Flutter project as a plugin project. 27 | # The 'pluginClass' and Android 'package' identifiers should not ordinarily 28 | # be modified. They are used by the tooling to maintain consistency when 29 | # adding or updating assets for this project. 30 | plugin: 31 | platforms: 32 | android: 33 | package: ly.img.flutter.photo_editor_sdk 34 | pluginClass: FlutterPESDK 35 | ios: 36 | pluginClass: FlutterPESDK 37 | 38 | # To add assets to your plugin package, add an assets section, like this: 39 | # assets: 40 | # - images/a_dot_burr.jpeg 41 | # - images/a_dot_ham.jpeg 42 | # 43 | # For details regarding assets in packages, see 44 | # https://flutter.dev/assets-and-images/#from-packages 45 | # 46 | # An image asset can refer to one or more resolution-specific "variants", see 47 | # https://flutter.dev/assets-and-images/#resolution-aware. 48 | 49 | # To add custom fonts to your plugin package, add a fonts section here, 50 | # in this "flutter" section. Each entry in this list should have a 51 | # "family" key with the font family name, and a "fonts" key with a 52 | # list giving the asset and other descriptors for the font. For 53 | # example: 54 | # fonts: 55 | # - family: Schyler 56 | # fonts: 57 | # - asset: fonts/Schyler-Regular.ttf 58 | # - asset: fonts/Schyler-Italic.ttf 59 | # style: italic 60 | # - family: Trajan Pro 61 | # fonts: 62 | # - asset: fonts/TrajanPro.ttf 63 | # - asset: fonts/TrajanPro_Bold.ttf 64 | # weight: 700 65 | # 66 | # For details regarding fonts in packages, see 67 | # https://flutter.dev/custom-fonts/#from-packages 68 | -------------------------------------------------------------------------------- /test/photo_editor_sdk_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/services.dart'; 2 | import 'package:flutter_test/flutter_test.dart'; 3 | 4 | void main() { 5 | const channel = MethodChannel('photo_editor_sdk'); 6 | 7 | TestWidgetsFlutterBinding.ensureInitialized(); 8 | 9 | setUp(() {}); 10 | 11 | tearDown(() { 12 | channel.setMockMethodCallHandler(null); 13 | }); 14 | } 15 | --------------------------------------------------------------------------------