├── .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 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
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 |
--------------------------------------------------------------------------------