| @@ -0,0 +1,3 @@ | |||
| ## 0.0.1 | |||
| * QR Code scanner embedded inside flutter. | |||
| @@ -0,0 +1,9 @@ | |||
| Copyright 2018 Julius Canute | |||
| Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: | |||
| 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. | |||
| 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. | |||
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| @@ -0,0 +1,14 @@ | |||
| # flutter_qr | |||
| This package wires the PlatformView corresponding to iOS and Android inside flutter. | |||
| ## Getting Started | |||
| This project is a starting point for a Flutter | |||
| [plug-in package](https://flutter.io/developing-packages/), | |||
| a specialized package that includes platform-specific implementation code for | |||
| Android and/or iOS. | |||
| For help getting started with Flutter, view our | |||
| [online documentation](https://flutter.io/docs), which offers tutorials, | |||
| samples, guidance on mobile development, and a full API reference. | |||
| @@ -0,0 +1,67 @@ | |||
| # Built application files | |||
| *.apk | |||
| *.ap_ | |||
| *.aab | |||
| # Files for the ART/Dalvik VM | |||
| *.dex | |||
| # Java class files | |||
| *.class | |||
| # Generated files | |||
| bin/ | |||
| gen/ | |||
| out/ | |||
| # Gradle files | |||
| .gradle/ | |||
| build/ | |||
| # Local configuration file (sdk path, etc) | |||
| local.properties | |||
| # Proguard folder generated by Eclipse | |||
| proguard/ | |||
| # Log Files | |||
| *.log | |||
| # Android Studio Navigation editor temp files | |||
| .navigation/ | |||
| # Android Studio captures folder | |||
| captures/ | |||
| # IntelliJ | |||
| *.iml | |||
| .idea/workspace.xml | |||
| .idea/tasks.xml | |||
| .idea/gradle.xml | |||
| .idea/assetWizardSettings.xml | |||
| .idea/dictionaries | |||
| .idea/libraries | |||
| .idea/caches | |||
| # Keystore files | |||
| # Uncomment the following lines if you do not want to check your keystore files in. | |||
| #*.jks | |||
| #*.keystore | |||
| # External native build folder generated in Android Studio 2.2 and later | |||
| .externalNativeBuild | |||
| # Google Services (e.g. APIs or Firebase) | |||
| google-services.json | |||
| # Freeline | |||
| freeline.py | |||
| freeline/ | |||
| freeline_project_description.json | |||
| # fastlane | |||
| fastlane/report.xml | |||
| fastlane/Preview.html | |||
| fastlane/screenshots | |||
| fastlane/test_output | |||
| fastlane/readme.md | |||
| @@ -0,0 +1,47 @@ | |||
| group 'net.touchcapture.qr.flutterqr' | |||
| version '1.0-SNAPSHOT' | |||
| buildscript { | |||
| ext.kotlin_version = '1.2.71' | |||
| repositories { | |||
| google() | |||
| jcenter() | |||
| } | |||
| dependencies { | |||
| classpath 'com.android.tools.build:gradle:3.2.1' | |||
| classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" | |||
| } | |||
| } | |||
| rootProject.allprojects { | |||
| repositories { | |||
| google() | |||
| jcenter() | |||
| } | |||
| } | |||
| apply plugin: 'com.android.library' | |||
| apply plugin: 'kotlin-android' | |||
| apply plugin: 'kotlin-android-extensions' | |||
| apply plugin: 'kotlin-kapt' | |||
| android { | |||
| compileSdkVersion 27 | |||
| sourceSets { | |||
| main.java.srcDirs += 'src/main/kotlin' | |||
| } | |||
| defaultConfig { | |||
| minSdkVersion 16 | |||
| testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" | |||
| } | |||
| lintOptions { | |||
| disable 'InvalidPackage' | |||
| } | |||
| } | |||
| dependencies { | |||
| implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" | |||
| implementation "com.journeyapps:zxing-android-embedded:3.5.0" | |||
| } | |||
| @@ -0,0 +1 @@ | |||
| org.gradle.jvmargs=-Xmx1536M | |||
| @@ -0,0 +1 @@ | |||
| rootProject.name = 'flutter_qr' | |||
| @@ -0,0 +1,3 @@ | |||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | |||
| package="net.touchcapture.qr.flutterqr"> | |||
| </manifest> | |||
| @@ -0,0 +1,30 @@ | |||
| package net.touchcapture.qr.flutterqr | |||
| import android.app.Activity | |||
| import android.app.Application | |||
| import android.os.Bundle | |||
| import io.flutter.plugin.common.MethodCall | |||
| import io.flutter.plugin.common.MethodChannel | |||
| import io.flutter.plugin.common.MethodChannel.MethodCallHandler | |||
| import io.flutter.plugin.common.MethodChannel.Result | |||
| import io.flutter.plugin.common.PluginRegistry.Registrar | |||
| class FlutterQrPlugin : MethodCallHandler { | |||
| companion object { | |||
| @JvmStatic | |||
| fun registerWith(registrar: Registrar) { | |||
| registrar | |||
| .platformViewRegistry() | |||
| .registerViewFactory( | |||
| "net.touchcapture.qr.flutterqr/qrview", QRViewFactory(registrar)) | |||
| } | |||
| } | |||
| override fun onMethodCall(call: MethodCall, result: Result) { | |||
| if (call.method == "getPlatformVersion") { | |||
| result.success("Android ${android.os.Build.VERSION.RELEASE}") | |||
| } else { | |||
| result.notImplemented() | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,146 @@ | |||
| package net.touchcapture.qr.flutterqr | |||
| import android.Manifest | |||
| import android.app.Activity | |||
| import android.app.Application | |||
| import android.content.Context | |||
| import android.content.pm.PackageManager | |||
| import android.os.Build | |||
| import android.os.Bundle | |||
| import android.view.View | |||
| import com.google.zxing.ResultPoint | |||
| import com.journeyapps.barcodescanner.BarcodeCallback | |||
| import com.journeyapps.barcodescanner.BarcodeResult | |||
| import com.journeyapps.barcodescanner.BarcodeView | |||
| import com.journeyapps.barcodescanner.DefaultDecoderFactory | |||
| import io.flutter.plugin.common.MethodCall | |||
| import io.flutter.plugin.common.MethodChannel | |||
| import io.flutter.plugin.common.PluginRegistry | |||
| import io.flutter.plugin.platform.PlatformView | |||
| class QRView(context: Context, private val registrar: PluginRegistry.Registrar, id: Int) : | |||
| PlatformView,MethodChannel.MethodCallHandler { | |||
| companion object { | |||
| const val CAMERA_REQUEST_ID = 513469796 | |||
| } | |||
| var barcodeView = BarcodeView(context) | |||
| private val activity = registrar.activity() | |||
| var cameraPermissionContinuation: Runnable? = null | |||
| var requestingPermission = false | |||
| init { | |||
| registrar.addRequestPermissionsResultListener(CameraRequestPermissionsListener()) | |||
| val channel = MethodChannel(registrar.messenger(), "net.touchcapture.qr.flutterqr/qrview_$id") | |||
| channel.setMethodCallHandler(this) | |||
| barcodeView.decodeContinuous( | |||
| object : BarcodeCallback { | |||
| override fun barcodeResult(result: BarcodeResult) { | |||
| channel.invokeMethod("onRecognizeQR",result.text) | |||
| } | |||
| override fun possibleResultPoints(resultPoints: List<ResultPoint>) {} | |||
| } | |||
| ) | |||
| init() | |||
| activity.application.registerActivityLifecycleCallbacks( | |||
| object : Application.ActivityLifecycleCallbacks{ | |||
| override fun onActivityPaused(p0: Activity?) { | |||
| barcodeView.pause() | |||
| } | |||
| override fun onActivityResumed(p0: Activity?) { | |||
| init() | |||
| } | |||
| override fun onActivityStarted(p0: Activity?) { | |||
| } | |||
| override fun onActivityDestroyed(p0: Activity?) { | |||
| } | |||
| override fun onActivitySaveInstanceState(p0: Activity?, p1: Bundle?) { | |||
| } | |||
| override fun onActivityStopped(p0: Activity?) { | |||
| } | |||
| override fun onActivityCreated(p0: Activity?, p1: Bundle?) { | |||
| barcodeView.decoderFactory = DefaultDecoderFactory() | |||
| } | |||
| }) | |||
| } | |||
| private fun init(){ | |||
| if(!hasCameraPermission()) { | |||
| checkAndRequestPermission(null) | |||
| } else { | |||
| barcodeView.resume() | |||
| } | |||
| } | |||
| override fun getView(): View { | |||
| return barcodeView | |||
| } | |||
| override fun dispose() { | |||
| } | |||
| private inner class CameraRequestPermissionsListener : PluginRegistry.RequestPermissionsResultListener { | |||
| override fun onRequestPermissionsResult(id: Int, permissions: Array<String>, grantResults: IntArray): Boolean { | |||
| if (id == CAMERA_REQUEST_ID) { | |||
| cameraPermissionContinuation?.run() | |||
| return true | |||
| } | |||
| return false | |||
| } | |||
| } | |||
| private fun hasCameraPermission(): Boolean { | |||
| return Build.VERSION.SDK_INT < Build.VERSION_CODES.M || | |||
| activity.checkSelfPermission(Manifest.permission.CAMERA) === PackageManager.PERMISSION_GRANTED | |||
| } | |||
| override fun onMethodCall(call: MethodCall?, result: MethodChannel.Result?) { | |||
| when(call?.method){ | |||
| "checkAndRequestPermission" -> { | |||
| checkAndRequestPermission(result) | |||
| } | |||
| } | |||
| } | |||
| private fun checkAndRequestPermission(result: MethodChannel.Result?) { | |||
| if (cameraPermissionContinuation != null) { | |||
| result?.error("cameraPermission", "Camera permission request ongoing", null); | |||
| } | |||
| cameraPermissionContinuation = Runnable { | |||
| cameraPermissionContinuation = null | |||
| if (!hasCameraPermission()) { | |||
| result?.error( | |||
| "cameraPermission", "MediaRecorderCamera permission not granted", null) | |||
| return@Runnable | |||
| } | |||
| } | |||
| requestingPermission = false | |||
| if (hasCameraPermission()) { | |||
| cameraPermissionContinuation?.run() | |||
| } else { | |||
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | |||
| requestingPermission = true | |||
| registrar | |||
| .activity() | |||
| .requestPermissions( | |||
| arrayOf(Manifest.permission.CAMERA), | |||
| CAMERA_REQUEST_ID) | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,17 @@ | |||
| package net.touchcapture.qr.flutterqr | |||
| import android.content.Context | |||
| import io.flutter.plugin.common.PluginRegistry | |||
| import io.flutter.plugin.common.StandardMessageCodec | |||
| import io.flutter.plugin.platform.PlatformView | |||
| import io.flutter.plugin.platform.PlatformViewFactory | |||
| class QRViewFactory(private val registrar: PluginRegistry.Registrar) : | |||
| PlatformViewFactory(StandardMessageCodec.INSTANCE) { | |||
| override fun create(context: Context, id: Int, obj: Any?): PlatformView { | |||
| return QRView(context, registrar,id) | |||
| } | |||
| } | |||
| @@ -0,0 +1,71 @@ | |||
| # Miscellaneous | |||
| *.class | |||
| *.lock | |||
| *.log | |||
| *.pyc | |||
| *.swp | |||
| .DS_Store | |||
| .atom/ | |||
| .buildlog/ | |||
| .history | |||
| .svn/ | |||
| # IntelliJ related | |||
| *.iml | |||
| *.ipr | |||
| *.iws | |||
| .idea/ | |||
| # Visual Studio Code related | |||
| .vscode/ | |||
| # Flutter/Dart/Pub related | |||
| **/doc/api/ | |||
| .dart_tool/ | |||
| .flutter-plugins | |||
| .packages | |||
| .pub-cache/ | |||
| .pub/ | |||
| build/ | |||
| # Android related | |||
| **/android/**/gradle-wrapper.jar | |||
| **/android/.gradle | |||
| **/android/captures/ | |||
| **/android/gradlew | |||
| **/android/gradlew.bat | |||
| **/android/local.properties | |||
| **/android/**/GeneratedPluginRegistrant.java | |||
| # iOS/XCode related | |||
| **/ios/**/*.mode1v3 | |||
| **/ios/**/*.mode2v3 | |||
| **/ios/**/*.moved-aside | |||
| **/ios/**/*.pbxuser | |||
| **/ios/**/*.perspectivev3 | |||
| **/ios/**/*sync/ | |||
| **/ios/**/.sconsign.dblite | |||
| **/ios/**/.tags* | |||
| **/ios/**/.vagrant/ | |||
| **/ios/**/DerivedData/ | |||
| **/ios/**/Icon? | |||
| **/ios/**/Pods/ | |||
| **/ios/**/.symlinks/ | |||
| **/ios/**/profile | |||
| **/ios/**/xcuserdata | |||
| **/ios/.generated/ | |||
| **/ios/Flutter/App.framework | |||
| **/ios/Flutter/Flutter.framework | |||
| **/ios/Flutter/Generated.xcconfig | |||
| **/ios/Flutter/app.flx | |||
| **/ios/Flutter/app.zip | |||
| **/ios/Flutter/flutter_assets/ | |||
| **/ios/ServiceDefinitions.json | |||
| **/ios/Runner/GeneratedPluginRegistrant.* | |||
| # Exceptions to above rules. | |||
| !**/ios/**/default.mode1v3 | |||
| !**/ios/**/default.mode2v3 | |||
| !**/ios/**/default.pbxuser | |||
| !**/ios/**/default.perspectivev3 | |||
| !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages | |||
| @@ -0,0 +1,10 @@ | |||
| # This file tracks properties of this Flutter project. | |||
| # Used by Flutter tool to assess capabilities and perform upgrades etc. | |||
| # | |||
| # This file should be version controlled and should not be manually edited. | |||
| version: | |||
| revision: 58c8489fcdb4e4ef6c010117584c9b23d15221aa | |||
| channel: beta | |||
| project_type: app | |||
| @@ -0,0 +1,22 @@ | |||
| # qr_code_scanner | |||
| Demonstrates how to use the qr_code_scanner plugin. | |||
| TODO'S: | |||
| 1) Add support to flip camera view. | |||
| 2) iOS Native embedding is written to match what is supported in framework as of the date of publication of this package. It needs to be improved as the framework support improves. | |||
| 3) Finally, I welcome PR's to make it better :), thanks! | |||
| ## Getting Started | |||
| This project is a starting point for a Flutter application. | |||
| A few resources to get you started if this is your first Flutter project: | |||
| - [Lab: Write your first Flutter app](https://flutter.io/docs/get-started/codelab) | |||
| - [Cookbook: Useful Flutter samples](https://flutter.io/docs/cookbook) | |||
| For help getting started with Flutter, view our | |||
| [online documentation](https://flutter.io/docs), which offers tutorials, | |||
| samples, guidance on mobile development, and a full API reference. | |||
| @@ -0,0 +1,67 @@ | |||
| def localProperties = new Properties() | |||
| def localPropertiesFile = rootProject.file('local.properties') | |||
| if (localPropertiesFile.exists()) { | |||
| localPropertiesFile.withReader('UTF-8') { reader -> | |||
| localProperties.load(reader) | |||
| } | |||
| } | |||
| def flutterRoot = localProperties.getProperty('flutter.sdk') | |||
| if (flutterRoot == null) { | |||
| throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") | |||
| } | |||
| def flutterVersionCode = localProperties.getProperty('flutter.versionCode') | |||
| if (flutterVersionCode == null) { | |||
| flutterVersionCode = '1' | |||
| } | |||
| def flutterVersionName = localProperties.getProperty('flutter.versionName') | |||
| if (flutterVersionName == null) { | |||
| flutterVersionName = '1.0' | |||
| } | |||
| apply plugin: 'com.android.application' | |||
| apply plugin: 'kotlin-android' | |||
| apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" | |||
| android { | |||
| compileSdkVersion 27 | |||
| sourceSets { | |||
| main.java.srcDirs += 'src/main/kotlin' | |||
| } | |||
| lintOptions { | |||
| disable 'InvalidPackage' | |||
| } | |||
| defaultConfig { | |||
| // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). | |||
| applicationId "net.touchcapture.qr.flutterqrexample" | |||
| minSdkVersion 16 | |||
| targetSdkVersion 27 | |||
| versionCode flutterVersionCode.toInteger() | |||
| versionName flutterVersionName | |||
| testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" | |||
| } | |||
| buildTypes { | |||
| release { | |||
| // TODO: Add your own signing config for the release build. | |||
| // Signing with the debug keys for now, so `flutter run --release` works. | |||
| signingConfig signingConfigs.debug | |||
| } | |||
| } | |||
| } | |||
| flutter { | |||
| source '../..' | |||
| } | |||
| dependencies { | |||
| implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" | |||
| testImplementation 'junit:junit:4.12' | |||
| androidTestImplementation 'com.android.support.test:runner:1.0.2' | |||
| androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' | |||
| } | |||
| @@ -0,0 +1,39 @@ | |||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | |||
| package="net.touchcapture.qr.flutterqrexample"> | |||
| <!-- The INTERNET permission is required for development. Specifically, | |||
| flutter needs it to communicate with the running application | |||
| to allow setting breakpoints, to provide hot reload, etc. | |||
| --> | |||
| <uses-permission android:name="android.permission.INTERNET"/> | |||
| <!-- io.flutter.app.FlutterApplication is an android.app.Application that | |||
| calls FlutterMain.startInitialization(this); in its onCreate method. | |||
| In most cases you can leave this as-is, but you if you want to provide | |||
| additional functionality it is fine to subclass or reimplement | |||
| FlutterApplication and put your custom class here. --> | |||
| <application | |||
| android:name="io.flutter.app.FlutterApplication" | |||
| android:label="flutter_qr_example" | |||
| android:icon="@mipmap/ic_launcher"> | |||
| <activity | |||
| android:name=".MainActivity" | |||
| android:launchMode="singleTop" | |||
| android:theme="@style/LaunchTheme" | |||
| android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density" | |||
| android:hardwareAccelerated="true" | |||
| android:windowSoftInputMode="adjustResize"> | |||
| <!-- This keeps the window background of the activity showing | |||
| until Flutter renders its first frame. It can be removed if | |||
| there is no splash screen (such as the default splash screen | |||
| defined in @style/LaunchTheme). --> | |||
| <meta-data | |||
| android:name="io.flutter.app.android.SplashScreenUntilFirstFrame" | |||
| android:value="true" /> | |||
| <intent-filter> | |||
| <action android:name="android.intent.action.MAIN"/> | |||
| <category android:name="android.intent.category.LAUNCHER"/> | |||
| </intent-filter> | |||
| </activity> | |||
| </application> | |||
| </manifest> | |||
| @@ -0,0 +1,13 @@ | |||
| package net.touchcapture.qr.flutterqrexample | |||
| import android.os.Bundle | |||
| import io.flutter.app.FlutterActivity | |||
| import io.flutter.plugins.GeneratedPluginRegistrant | |||
| class MainActivity: FlutterActivity() { | |||
| override fun onCreate(savedInstanceState: Bundle?) { | |||
| super.onCreate(savedInstanceState) | |||
| GeneratedPluginRegistrant.registerWith(this) | |||
| } | |||
| } | |||
| @@ -0,0 +1,12 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <!-- Modify this file to customize your launch splash screen --> | |||
| <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> | |||
| <item android:drawable="@android:color/white" /> | |||
| <!-- You can insert your own image assets here --> | |||
| <!-- <item> | |||
| <bitmap | |||
| android:gravity="center" | |||
| android:src="@mipmap/launch_image" /> | |||
| </item> --> | |||
| </layer-list> | |||
| @@ -0,0 +1,8 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <resources> | |||
| <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar"> | |||
| <!-- Show a splash screen on the activity. Automatically removed when | |||
| Flutter draws its first frame --> | |||
| <item name="android:windowBackground">@drawable/launch_background</item> | |||
| </style> | |||
| </resources> | |||
| @@ -0,0 +1,31 @@ | |||
| buildscript { | |||
| ext.kotlin_version = '1.2.71' | |||
| repositories { | |||
| google() | |||
| jcenter() | |||
| } | |||
| dependencies { | |||
| classpath 'com.android.tools.build:gradle:3.2.1' | |||
| classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" | |||
| } | |||
| } | |||
| allprojects { | |||
| repositories { | |||
| google() | |||
| jcenter() | |||
| } | |||
| } | |||
| rootProject.buildDir = '../build' | |||
| subprojects { | |||
| project.buildDir = "${rootProject.buildDir}/${project.name}" | |||
| } | |||
| subprojects { | |||
| project.evaluationDependsOn(':app') | |||
| } | |||
| task clean(type: Delete) { | |||
| delete rootProject.buildDir | |||
| } | |||
| @@ -0,0 +1 @@ | |||
| org.gradle.jvmargs=-Xmx1536M | |||
| @@ -0,0 +1,6 @@ | |||
| #Fri Jun 23 08:50:38 CEST 2017 | |||
| distributionBase=GRADLE_USER_HOME | |||
| distributionPath=wrapper/dists | |||
| zipStoreBase=GRADLE_USER_HOME | |||
| zipStorePath=wrapper/dists | |||
| distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip | |||
| @@ -0,0 +1,15 @@ | |||
| include ':app' | |||
| def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() | |||
| def plugins = new Properties() | |||
| def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') | |||
| if (pluginsFile.exists()) { | |||
| pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } | |||
| } | |||
| plugins.each { name, path -> | |||
| def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() | |||
| include ":$name" | |||
| project(":$name").projectDir = pluginDirectory | |||
| } | |||
| @@ -0,0 +1,26 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||
| <plist version="1.0"> | |||
| <dict> | |||
| <key>CFBundleDevelopmentRegion</key> | |||
| <string>en</string> | |||
| <key>CFBundleExecutable</key> | |||
| <string>App</string> | |||
| <key>CFBundleIdentifier</key> | |||
| <string>io.flutter.flutter.app</string> | |||
| <key>CFBundleInfoDictionaryVersion</key> | |||
| <string>6.0</string> | |||
| <key>CFBundleName</key> | |||
| <string>App</string> | |||
| <key>CFBundlePackageType</key> | |||
| <string>FMWK</string> | |||
| <key>CFBundleShortVersionString</key> | |||
| <string>1.0</string> | |||
| <key>CFBundleSignature</key> | |||
| <string>????</string> | |||
| <key>CFBundleVersion</key> | |||
| <string>1.0</string> | |||
| <key>MinimumOSVersion</key> | |||
| <string>8.0</string> | |||
| </dict> | |||
| </plist> | |||
| @@ -0,0 +1,2 @@ | |||
| #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" | |||
| #include "Generated.xcconfig" | |||
| @@ -0,0 +1,2 @@ | |||
| #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" | |||
| #include "Generated.xcconfig" | |||
| @@ -0,0 +1,72 @@ | |||
| # Uncomment this line to define a global platform for your project | |||
| # platform :ios, '9.0' | |||
| # CocoaPods analytics sends network stats synchronously affecting flutter build latency. | |||
| ENV['COCOAPODS_DISABLE_STATS'] = 'true' | |||
| project 'Runner', { | |||
| 'Debug' => :debug, | |||
| 'Profile' => :release, | |||
| 'Release' => :release, | |||
| } | |||
| def parse_KV_file(file, separator='=') | |||
| file_abs_path = File.expand_path(file) | |||
| if !File.exists? file_abs_path | |||
| return []; | |||
| end | |||
| pods_ary = [] | |||
| skip_line_start_symbols = ["#", "/"] | |||
| File.foreach(file_abs_path) { |line| | |||
| next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } | |||
| plugin = line.split(pattern=separator) | |||
| if plugin.length == 2 | |||
| podname = plugin[0].strip() | |||
| path = plugin[1].strip() | |||
| podpath = File.expand_path("#{path}", file_abs_path) | |||
| pods_ary.push({:name => podname, :path => podpath}); | |||
| else | |||
| puts "Invalid plugin specification: #{line}" | |||
| end | |||
| } | |||
| return pods_ary | |||
| end | |||
| target 'Runner' do | |||
| use_frameworks! | |||
| # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock | |||
| # referring to absolute paths on developers' machines. | |||
| system('rm -rf .symlinks') | |||
| system('mkdir -p .symlinks/plugins') | |||
| # Flutter Pods | |||
| generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig') | |||
| if generated_xcode_build_settings.empty? | |||
| puts "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first." | |||
| end | |||
| generated_xcode_build_settings.map { |p| | |||
| if p[:name] == 'FLUTTER_FRAMEWORK_DIR' | |||
| symlink = File.join('.symlinks', 'flutter') | |||
| File.symlink(File.dirname(p[:path]), symlink) | |||
| pod 'Flutter', :path => File.join(symlink, File.basename(p[:path])) | |||
| end | |||
| } | |||
| # Plugin Pods | |||
| plugin_pods = parse_KV_file('../.flutter-plugins') | |||
| plugin_pods.map { |p| | |||
| symlink = File.join('.symlinks', 'plugins', p[:name]) | |||
| File.symlink(p[:path], symlink) | |||
| pod p[:name], :path => File.join(symlink, 'ios') | |||
| } | |||
| end | |||
| post_install do |installer| | |||
| installer.pods_project.targets.each do |target| | |||
| target.build_configurations.each do |config| | |||
| config.build_settings['ENABLE_BITCODE'] = 'NO' | |||
| end | |||
| end | |||
| end | |||
| @@ -0,0 +1,598 @@ | |||
| // !$*UTF8*$! | |||
| { | |||
| archiveVersion = 1; | |||
| classes = { | |||
| }; | |||
| objectVersion = 46; | |||
| objects = { | |||
| /* Begin PBXBuildFile section */ | |||
| 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; | |||
| 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; | |||
| 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; | |||
| 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; | |||
| 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; | |||
| 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; | |||
| 875CEA4621CCA9620072C5B9 /* MTBBarcodeScanner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 875CEA4521CCA9620072C5B9 /* MTBBarcodeScanner.framework */; }; | |||
| 90416EE8981E3A39D474076A /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18FDEF8746A8853DC11EEA49 /* Pods_Runner.framework */; }; | |||
| 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; | |||
| 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; | |||
| 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; | |||
| 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; | |||
| 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; | |||
| /* End PBXBuildFile section */ | |||
| /* Begin PBXCopyFilesBuildPhase section */ | |||
| 9705A1C41CF9048500538489 /* Embed Frameworks */ = { | |||
| isa = PBXCopyFilesBuildPhase; | |||
| buildActionMask = 2147483647; | |||
| dstPath = ""; | |||
| dstSubfolderSpec = 10; | |||
| files = ( | |||
| 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, | |||
| 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, | |||
| ); | |||
| name = "Embed Frameworks"; | |||
| runOnlyForDeploymentPostprocessing = 0; | |||
| }; | |||
| /* End PBXCopyFilesBuildPhase section */ | |||
| /* Begin PBXFileReference section */ | |||
| 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; }; | |||
| 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; }; | |||
| 18FDEF8746A8853DC11EEA49 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; | |||
| 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; | |||
| 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; }; | |||
| 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = "<group>"; }; | |||
| 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; }; | |||
| 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; | |||
| 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; }; | |||
| 875CEA4221CCA33A0072C5B9 /* MTBBarcodeScanner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MTBBarcodeScanner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; | |||
| 875CEA4521CCA9620072C5B9 /* MTBBarcodeScanner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MTBBarcodeScanner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; | |||
| 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; }; | |||
| 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; }; | |||
| 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = "<group>"; }; | |||
| 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; | |||
| 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; | |||
| 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; | |||
| 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; | |||
| 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; | |||
| /* End PBXFileReference section */ | |||
| /* Begin PBXFrameworksBuildPhase section */ | |||
| 97C146EB1CF9000F007C117D /* Frameworks */ = { | |||
| isa = PBXFrameworksBuildPhase; | |||
| buildActionMask = 2147483647; | |||
| files = ( | |||
| 875CEA4621CCA9620072C5B9 /* MTBBarcodeScanner.framework in Frameworks */, | |||
| 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, | |||
| 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, | |||
| 90416EE8981E3A39D474076A /* Pods_Runner.framework in Frameworks */, | |||
| ); | |||
| runOnlyForDeploymentPostprocessing = 0; | |||
| }; | |||
| /* End PBXFrameworksBuildPhase section */ | |||
| /* Begin PBXGroup section */ | |||
| 59377A0B384FA8EFF7C11C6F /* Frameworks */ = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| 875CEA4521CCA9620072C5B9 /* MTBBarcodeScanner.framework */, | |||
| 18FDEF8746A8853DC11EEA49 /* Pods_Runner.framework */, | |||
| ); | |||
| name = Frameworks; | |||
| sourceTree = "<group>"; | |||
| }; | |||
| 9740EEB11CF90186004384FC /* Flutter */ = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, | |||
| 3B80C3931E831B6300D905FE /* App.framework */, | |||
| 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, | |||
| 9740EEBA1CF902C7004384FC /* Flutter.framework */, | |||
| 9740EEB21CF90195004384FC /* Debug.xcconfig */, | |||
| 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, | |||
| 9740EEB31CF90195004384FC /* Generated.xcconfig */, | |||
| ); | |||
| name = Flutter; | |||
| sourceTree = "<group>"; | |||
| }; | |||
| 97C146E51CF9000F007C117D = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| 875CEA4221CCA33A0072C5B9 /* MTBBarcodeScanner.framework */, | |||
| 9740EEB11CF90186004384FC /* Flutter */, | |||
| 97C146F01CF9000F007C117D /* Runner */, | |||
| 97C146EF1CF9000F007C117D /* Products */, | |||
| E0C0CF8E7F3368743823A4D6 /* Pods */, | |||
| 59377A0B384FA8EFF7C11C6F /* Frameworks */, | |||
| ); | |||
| sourceTree = "<group>"; | |||
| }; | |||
| 97C146EF1CF9000F007C117D /* Products */ = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| 97C146EE1CF9000F007C117D /* Runner.app */, | |||
| ); | |||
| name = Products; | |||
| sourceTree = "<group>"; | |||
| }; | |||
| 97C146F01CF9000F007C117D /* Runner */ = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| 97C146FA1CF9000F007C117D /* Main.storyboard */, | |||
| 97C146FD1CF9000F007C117D /* Assets.xcassets */, | |||
| 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, | |||
| 97C147021CF9000F007C117D /* Info.plist */, | |||
| 97C146F11CF9000F007C117D /* Supporting Files */, | |||
| 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, | |||
| 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, | |||
| 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, | |||
| 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, | |||
| ); | |||
| path = Runner; | |||
| sourceTree = "<group>"; | |||
| }; | |||
| 97C146F11CF9000F007C117D /* Supporting Files */ = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| ); | |||
| name = "Supporting Files"; | |||
| sourceTree = "<group>"; | |||
| }; | |||
| E0C0CF8E7F3368743823A4D6 /* Pods */ = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| ); | |||
| name = Pods; | |||
| sourceTree = "<group>"; | |||
| }; | |||
| /* End PBXGroup section */ | |||
| /* Begin PBXNativeTarget section */ | |||
| 97C146ED1CF9000F007C117D /* Runner */ = { | |||
| isa = PBXNativeTarget; | |||
| buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; | |||
| buildPhases = ( | |||
| 0F3EF80A2505CFA7161E4046 /* [CP] Check Pods Manifest.lock */, | |||
| 9740EEB61CF901F6004384FC /* Run Script */, | |||
| 97C146EA1CF9000F007C117D /* Sources */, | |||
| 97C146EB1CF9000F007C117D /* Frameworks */, | |||
| 97C146EC1CF9000F007C117D /* Resources */, | |||
| 9705A1C41CF9048500538489 /* Embed Frameworks */, | |||
| 3B06AD1E1E4923F5004D2608 /* Thin Binary */, | |||
| 5694CD6E1A5E2C175A82230C /* [CP] Embed Pods Frameworks */, | |||
| ); | |||
| buildRules = ( | |||
| ); | |||
| dependencies = ( | |||
| ); | |||
| name = Runner; | |||
| productName = Runner; | |||
| productReference = 97C146EE1CF9000F007C117D /* Runner.app */; | |||
| productType = "com.apple.product-type.application"; | |||
| }; | |||
| /* End PBXNativeTarget section */ | |||
| /* Begin PBXProject section */ | |||
| 97C146E61CF9000F007C117D /* Project object */ = { | |||
| isa = PBXProject; | |||
| attributes = { | |||
| LastUpgradeCheck = 1010; | |||
| ORGANIZATIONNAME = "The Chromium Authors"; | |||
| TargetAttributes = { | |||
| 97C146ED1CF9000F007C117D = { | |||
| CreatedOnToolsVersion = 7.3.1; | |||
| DevelopmentTeam = W5L5PDU89L; | |||
| LastSwiftMigration = 1010; | |||
| }; | |||
| }; | |||
| }; | |||
| buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; | |||
| compatibilityVersion = "Xcode 3.2"; | |||
| developmentRegion = English; | |||
| hasScannedForEncodings = 0; | |||
| knownRegions = ( | |||
| en, | |||
| Base, | |||
| ); | |||
| mainGroup = 97C146E51CF9000F007C117D; | |||
| productRefGroup = 97C146EF1CF9000F007C117D /* Products */; | |||
| projectDirPath = ""; | |||
| projectRoot = ""; | |||
| targets = ( | |||
| 97C146ED1CF9000F007C117D /* Runner */, | |||
| ); | |||
| }; | |||
| /* End PBXProject section */ | |||
| /* Begin PBXResourcesBuildPhase section */ | |||
| 97C146EC1CF9000F007C117D /* Resources */ = { | |||
| isa = PBXResourcesBuildPhase; | |||
| buildActionMask = 2147483647; | |||
| files = ( | |||
| 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, | |||
| 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, | |||
| 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, | |||
| 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, | |||
| 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, | |||
| ); | |||
| runOnlyForDeploymentPostprocessing = 0; | |||
| }; | |||
| /* End PBXResourcesBuildPhase section */ | |||
| /* Begin PBXShellScriptBuildPhase section */ | |||
| 0F3EF80A2505CFA7161E4046 /* [CP] Check Pods Manifest.lock */ = { | |||
| isa = PBXShellScriptBuildPhase; | |||
| buildActionMask = 2147483647; | |||
| files = ( | |||
| ); | |||
| inputFileListPaths = ( | |||
| ); | |||
| inputPaths = ( | |||
| "${PODS_PODFILE_DIR_PATH}/Podfile.lock", | |||
| "${PODS_ROOT}/Manifest.lock", | |||
| ); | |||
| name = "[CP] Check Pods Manifest.lock"; | |||
| outputFileListPaths = ( | |||
| ); | |||
| outputPaths = ( | |||
| "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", | |||
| ); | |||
| runOnlyForDeploymentPostprocessing = 0; | |||
| shellPath = /bin/sh; | |||
| 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"; | |||
| showEnvVarsInLog = 0; | |||
| }; | |||
| 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { | |||
| isa = PBXShellScriptBuildPhase; | |||
| buildActionMask = 2147483647; | |||
| files = ( | |||
| ); | |||
| inputPaths = ( | |||
| ); | |||
| name = "Thin Binary"; | |||
| outputPaths = ( | |||
| ); | |||
| runOnlyForDeploymentPostprocessing = 0; | |||
| shellPath = /bin/sh; | |||
| shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; | |||
| }; | |||
| 5694CD6E1A5E2C175A82230C /* [CP] Embed Pods Frameworks */ = { | |||
| isa = PBXShellScriptBuildPhase; | |||
| buildActionMask = 2147483647; | |||
| files = ( | |||
| ); | |||
| inputFileListPaths = ( | |||
| ); | |||
| inputPaths = ( | |||
| "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", | |||
| "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", | |||
| "${BUILT_PRODUCTS_DIR}/MTBBarcodeScanner/MTBBarcodeScanner.framework", | |||
| "${BUILT_PRODUCTS_DIR}/flutter_qr/flutter_qr.framework", | |||
| ); | |||
| name = "[CP] Embed Pods Frameworks"; | |||
| outputFileListPaths = ( | |||
| ); | |||
| outputPaths = ( | |||
| "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", | |||
| "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MTBBarcodeScanner.framework", | |||
| "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_qr.framework", | |||
| ); | |||
| runOnlyForDeploymentPostprocessing = 0; | |||
| shellPath = /bin/sh; | |||
| shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; | |||
| showEnvVarsInLog = 0; | |||
| }; | |||
| 9740EEB61CF901F6004384FC /* Run Script */ = { | |||
| isa = PBXShellScriptBuildPhase; | |||
| buildActionMask = 2147483647; | |||
| files = ( | |||
| ); | |||
| inputPaths = ( | |||
| ); | |||
| name = "Run Script"; | |||
| outputPaths = ( | |||
| ); | |||
| runOnlyForDeploymentPostprocessing = 0; | |||
| shellPath = /bin/sh; | |||
| shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; | |||
| }; | |||
| /* End PBXShellScriptBuildPhase section */ | |||
| /* Begin PBXSourcesBuildPhase section */ | |||
| 97C146EA1CF9000F007C117D /* Sources */ = { | |||
| isa = PBXSourcesBuildPhase; | |||
| buildActionMask = 2147483647; | |||
| files = ( | |||
| 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, | |||
| 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, | |||
| ); | |||
| runOnlyForDeploymentPostprocessing = 0; | |||
| }; | |||
| /* End PBXSourcesBuildPhase section */ | |||
| /* Begin PBXVariantGroup section */ | |||
| 97C146FA1CF9000F007C117D /* Main.storyboard */ = { | |||
| isa = PBXVariantGroup; | |||
| children = ( | |||
| 97C146FB1CF9000F007C117D /* Base */, | |||
| ); | |||
| name = Main.storyboard; | |||
| sourceTree = "<group>"; | |||
| }; | |||
| 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { | |||
| isa = PBXVariantGroup; | |||
| children = ( | |||
| 97C147001CF9000F007C117D /* Base */, | |||
| ); | |||
| name = LaunchScreen.storyboard; | |||
| sourceTree = "<group>"; | |||
| }; | |||
| /* End PBXVariantGroup section */ | |||
| /* Begin XCBuildConfiguration section */ | |||
| 249021D3217E4FDB00AE95B9 /* Profile */ = { | |||
| isa = XCBuildConfiguration; | |||
| baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; | |||
| buildSettings = { | |||
| ALWAYS_SEARCH_USER_PATHS = NO; | |||
| CLANG_ANALYZER_NONNULL = YES; | |||
| CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | |||
| CLANG_CXX_LIBRARY = "libc++"; | |||
| CLANG_ENABLE_MODULES = YES; | |||
| CLANG_ENABLE_OBJC_ARC = YES; | |||
| CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; | |||
| CLANG_WARN_BOOL_CONVERSION = YES; | |||
| CLANG_WARN_COMMA = YES; | |||
| CLANG_WARN_CONSTANT_CONVERSION = YES; | |||
| CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; | |||
| CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | |||
| CLANG_WARN_EMPTY_BODY = YES; | |||
| CLANG_WARN_ENUM_CONVERSION = YES; | |||
| CLANG_WARN_INFINITE_RECURSION = YES; | |||
| CLANG_WARN_INT_CONVERSION = YES; | |||
| CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; | |||
| CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; | |||
| CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; | |||
| CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | |||
| CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; | |||
| CLANG_WARN_STRICT_PROTOTYPES = YES; | |||
| CLANG_WARN_SUSPICIOUS_MOVE = YES; | |||
| CLANG_WARN_UNREACHABLE_CODE = YES; | |||
| CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | |||
| "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | |||
| COPY_PHASE_STRIP = NO; | |||
| DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | |||
| ENABLE_NS_ASSERTIONS = NO; | |||
| ENABLE_STRICT_OBJC_MSGSEND = YES; | |||
| GCC_C_LANGUAGE_STANDARD = gnu99; | |||
| GCC_NO_COMMON_BLOCKS = YES; | |||
| GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | |||
| GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | |||
| GCC_WARN_UNDECLARED_SELECTOR = YES; | |||
| GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | |||
| GCC_WARN_UNUSED_FUNCTION = YES; | |||
| GCC_WARN_UNUSED_VARIABLE = YES; | |||
| IPHONEOS_DEPLOYMENT_TARGET = 8.0; | |||
| MTL_ENABLE_DEBUG_INFO = NO; | |||
| SDKROOT = iphoneos; | |||
| TARGETED_DEVICE_FAMILY = "1,2"; | |||
| VALIDATE_PRODUCT = YES; | |||
| }; | |||
| name = Profile; | |||
| }; | |||
| 249021D4217E4FDB00AE95B9 /* Profile */ = { | |||
| isa = XCBuildConfiguration; | |||
| baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; | |||
| buildSettings = { | |||
| ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | |||
| CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | |||
| DEVELOPMENT_TEAM = W5L5PDU89L; | |||
| ENABLE_BITCODE = NO; | |||
| FRAMEWORK_SEARCH_PATHS = ( | |||
| "$(inherited)", | |||
| "$(PROJECT_DIR)/Flutter", | |||
| ); | |||
| INFOPLIST_FILE = Runner/Info.plist; | |||
| LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; | |||
| LIBRARY_SEARCH_PATHS = ( | |||
| "$(inherited)", | |||
| "$(PROJECT_DIR)/Flutter", | |||
| ); | |||
| PRODUCT_BUNDLE_IDENTIFIER = net.touchcapture; | |||
| PRODUCT_NAME = "$(TARGET_NAME)"; | |||
| SWIFT_VERSION = 4.2; | |||
| VERSIONING_SYSTEM = "apple-generic"; | |||
| }; | |||
| name = Profile; | |||
| }; | |||
| 97C147031CF9000F007C117D /* Debug */ = { | |||
| isa = XCBuildConfiguration; | |||
| baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; | |||
| buildSettings = { | |||
| ALWAYS_SEARCH_USER_PATHS = NO; | |||
| CLANG_ANALYZER_NONNULL = YES; | |||
| CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | |||
| CLANG_CXX_LIBRARY = "libc++"; | |||
| CLANG_ENABLE_MODULES = YES; | |||
| CLANG_ENABLE_OBJC_ARC = YES; | |||
| CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; | |||
| CLANG_WARN_BOOL_CONVERSION = YES; | |||
| CLANG_WARN_COMMA = YES; | |||
| CLANG_WARN_CONSTANT_CONVERSION = YES; | |||
| CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; | |||
| CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | |||
| CLANG_WARN_EMPTY_BODY = YES; | |||
| CLANG_WARN_ENUM_CONVERSION = YES; | |||
| CLANG_WARN_INFINITE_RECURSION = YES; | |||
| CLANG_WARN_INT_CONVERSION = YES; | |||
| CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; | |||
| CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; | |||
| CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; | |||
| CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | |||
| CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; | |||
| CLANG_WARN_STRICT_PROTOTYPES = YES; | |||
| CLANG_WARN_SUSPICIOUS_MOVE = YES; | |||
| CLANG_WARN_UNREACHABLE_CODE = YES; | |||
| CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | |||
| "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | |||
| COPY_PHASE_STRIP = NO; | |||
| DEBUG_INFORMATION_FORMAT = dwarf; | |||
| ENABLE_STRICT_OBJC_MSGSEND = YES; | |||
| ENABLE_TESTABILITY = YES; | |||
| GCC_C_LANGUAGE_STANDARD = gnu99; | |||
| GCC_DYNAMIC_NO_PIC = NO; | |||
| GCC_NO_COMMON_BLOCKS = YES; | |||
| GCC_OPTIMIZATION_LEVEL = 0; | |||
| GCC_PREPROCESSOR_DEFINITIONS = ( | |||
| "DEBUG=1", | |||
| "$(inherited)", | |||
| ); | |||
| GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | |||
| GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | |||
| GCC_WARN_UNDECLARED_SELECTOR = YES; | |||
| GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | |||
| GCC_WARN_UNUSED_FUNCTION = YES; | |||
| GCC_WARN_UNUSED_VARIABLE = YES; | |||
| IPHONEOS_DEPLOYMENT_TARGET = 8.0; | |||
| MTL_ENABLE_DEBUG_INFO = YES; | |||
| ONLY_ACTIVE_ARCH = YES; | |||
| SDKROOT = iphoneos; | |||
| TARGETED_DEVICE_FAMILY = "1,2"; | |||
| }; | |||
| name = Debug; | |||
| }; | |||
| 97C147041CF9000F007C117D /* Release */ = { | |||
| isa = XCBuildConfiguration; | |||
| baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; | |||
| buildSettings = { | |||
| ALWAYS_SEARCH_USER_PATHS = NO; | |||
| CLANG_ANALYZER_NONNULL = YES; | |||
| CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | |||
| CLANG_CXX_LIBRARY = "libc++"; | |||
| CLANG_ENABLE_MODULES = YES; | |||
| CLANG_ENABLE_OBJC_ARC = YES; | |||
| CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; | |||
| CLANG_WARN_BOOL_CONVERSION = YES; | |||
| CLANG_WARN_COMMA = YES; | |||
| CLANG_WARN_CONSTANT_CONVERSION = YES; | |||
| CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; | |||
| CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | |||
| CLANG_WARN_EMPTY_BODY = YES; | |||
| CLANG_WARN_ENUM_CONVERSION = YES; | |||
| CLANG_WARN_INFINITE_RECURSION = YES; | |||
| CLANG_WARN_INT_CONVERSION = YES; | |||
| CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; | |||
| CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; | |||
| CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; | |||
| CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | |||
| CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; | |||
| CLANG_WARN_STRICT_PROTOTYPES = YES; | |||
| CLANG_WARN_SUSPICIOUS_MOVE = YES; | |||
| CLANG_WARN_UNREACHABLE_CODE = YES; | |||
| CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | |||
| "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | |||
| COPY_PHASE_STRIP = NO; | |||
| DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | |||
| ENABLE_NS_ASSERTIONS = NO; | |||
| ENABLE_STRICT_OBJC_MSGSEND = YES; | |||
| GCC_C_LANGUAGE_STANDARD = gnu99; | |||
| GCC_NO_COMMON_BLOCKS = YES; | |||
| GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | |||
| GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | |||
| GCC_WARN_UNDECLARED_SELECTOR = YES; | |||
| GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | |||
| GCC_WARN_UNUSED_FUNCTION = YES; | |||
| GCC_WARN_UNUSED_VARIABLE = YES; | |||
| IPHONEOS_DEPLOYMENT_TARGET = 8.0; | |||
| MTL_ENABLE_DEBUG_INFO = NO; | |||
| SDKROOT = iphoneos; | |||
| SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; | |||
| TARGETED_DEVICE_FAMILY = "1,2"; | |||
| VALIDATE_PRODUCT = YES; | |||
| }; | |||
| name = Release; | |||
| }; | |||
| 97C147061CF9000F007C117D /* Debug */ = { | |||
| isa = XCBuildConfiguration; | |||
| baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; | |||
| buildSettings = { | |||
| ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | |||
| CLANG_ENABLE_MODULES = YES; | |||
| CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | |||
| DEVELOPMENT_TEAM = W5L5PDU89L; | |||
| ENABLE_BITCODE = NO; | |||
| FRAMEWORK_SEARCH_PATHS = ( | |||
| "$(inherited)", | |||
| "$(PROJECT_DIR)/Flutter", | |||
| ); | |||
| INFOPLIST_FILE = Runner/Info.plist; | |||
| LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; | |||
| LIBRARY_SEARCH_PATHS = ( | |||
| "$(inherited)", | |||
| "$(PROJECT_DIR)/Flutter", | |||
| ); | |||
| PRODUCT_BUNDLE_IDENTIFIER = net.touchcapture; | |||
| PRODUCT_NAME = "$(TARGET_NAME)"; | |||
| SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | |||
| SWIFT_OPTIMIZATION_LEVEL = "-Onone"; | |||
| SWIFT_VERSION = 4.2; | |||
| VERSIONING_SYSTEM = "apple-generic"; | |||
| }; | |||
| name = Debug; | |||
| }; | |||
| 97C147071CF9000F007C117D /* Release */ = { | |||
| isa = XCBuildConfiguration; | |||
| baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; | |||
| buildSettings = { | |||
| ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | |||
| CLANG_ENABLE_MODULES = YES; | |||
| CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | |||
| DEVELOPMENT_TEAM = W5L5PDU89L; | |||
| ENABLE_BITCODE = NO; | |||
| FRAMEWORK_SEARCH_PATHS = ( | |||
| "$(inherited)", | |||
| "$(PROJECT_DIR)/Flutter", | |||
| ); | |||
| INFOPLIST_FILE = Runner/Info.plist; | |||
| LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; | |||
| LIBRARY_SEARCH_PATHS = ( | |||
| "$(inherited)", | |||
| "$(PROJECT_DIR)/Flutter", | |||
| ); | |||
| PRODUCT_BUNDLE_IDENTIFIER = net.touchcapture; | |||
| PRODUCT_NAME = "$(TARGET_NAME)"; | |||
| SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | |||
| SWIFT_VERSION = 4.2; | |||
| VERSIONING_SYSTEM = "apple-generic"; | |||
| }; | |||
| name = Release; | |||
| }; | |||
| /* End XCBuildConfiguration section */ | |||
| /* Begin XCConfigurationList section */ | |||
| 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { | |||
| isa = XCConfigurationList; | |||
| buildConfigurations = ( | |||
| 97C147031CF9000F007C117D /* Debug */, | |||
| 97C147041CF9000F007C117D /* Release */, | |||
| 249021D3217E4FDB00AE95B9 /* Profile */, | |||
| ); | |||
| defaultConfigurationIsVisible = 0; | |||
| defaultConfigurationName = Release; | |||
| }; | |||
| 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { | |||
| isa = XCConfigurationList; | |||
| buildConfigurations = ( | |||
| 97C147061CF9000F007C117D /* Debug */, | |||
| 97C147071CF9000F007C117D /* Release */, | |||
| 249021D4217E4FDB00AE95B9 /* Profile */, | |||
| ); | |||
| defaultConfigurationIsVisible = 0; | |||
| defaultConfigurationName = Release; | |||
| }; | |||
| /* End XCConfigurationList section */ | |||
| }; | |||
| rootObject = 97C146E61CF9000F007C117D /* Project object */; | |||
| } | |||
| @@ -0,0 +1,7 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <Workspace | |||
| version = "1.0"> | |||
| <FileRef | |||
| location = "group:Runner.xcodeproj"> | |||
| </FileRef> | |||
| </Workspace> | |||
| @@ -0,0 +1,91 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <Scheme | |||
| LastUpgradeVersion = "1010" | |||
| version = "1.3"> | |||
| <BuildAction | |||
| parallelizeBuildables = "YES" | |||
| buildImplicitDependencies = "YES"> | |||
| <BuildActionEntries> | |||
| <BuildActionEntry | |||
| buildForTesting = "YES" | |||
| buildForRunning = "YES" | |||
| buildForProfiling = "YES" | |||
| buildForArchiving = "YES" | |||
| buildForAnalyzing = "YES"> | |||
| <BuildableReference | |||
| BuildableIdentifier = "primary" | |||
| BlueprintIdentifier = "97C146ED1CF9000F007C117D" | |||
| BuildableName = "Runner.app" | |||
| BlueprintName = "Runner" | |||
| ReferencedContainer = "container:Runner.xcodeproj"> | |||
| </BuildableReference> | |||
| </BuildActionEntry> | |||
| </BuildActionEntries> | |||
| </BuildAction> | |||
| <TestAction | |||
| buildConfiguration = "Debug" | |||
| selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | |||
| selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | |||
| shouldUseLaunchSchemeArgsEnv = "YES"> | |||
| <Testables> | |||
| </Testables> | |||
| <MacroExpansion> | |||
| <BuildableReference | |||
| BuildableIdentifier = "primary" | |||
| BlueprintIdentifier = "97C146ED1CF9000F007C117D" | |||
| BuildableName = "Runner.app" | |||
| BlueprintName = "Runner" | |||
| ReferencedContainer = "container:Runner.xcodeproj"> | |||
| </BuildableReference> | |||
| </MacroExpansion> | |||
| <AdditionalOptions> | |||
| </AdditionalOptions> | |||
| </TestAction> | |||
| <LaunchAction | |||
| buildConfiguration = "Debug" | |||
| selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | |||
| selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | |||
| launchStyle = "0" | |||
| useCustomWorkingDirectory = "NO" | |||
| ignoresPersistentStateOnLaunch = "NO" | |||
| debugDocumentVersioning = "YES" | |||
| debugServiceExtension = "internal" | |||
| allowLocationSimulation = "YES"> | |||
| <BuildableProductRunnable | |||
| runnableDebuggingMode = "0"> | |||
| <BuildableReference | |||
| BuildableIdentifier = "primary" | |||
| BlueprintIdentifier = "97C146ED1CF9000F007C117D" | |||
| BuildableName = "Runner.app" | |||
| BlueprintName = "Runner" | |||
| ReferencedContainer = "container:Runner.xcodeproj"> | |||
| </BuildableReference> | |||
| </BuildableProductRunnable> | |||
| <AdditionalOptions> | |||
| </AdditionalOptions> | |||
| </LaunchAction> | |||
| <ProfileAction | |||
| buildConfiguration = "Profile" | |||
| shouldUseLaunchSchemeArgsEnv = "YES" | |||
| savedToolIdentifier = "" | |||
| useCustomWorkingDirectory = "NO" | |||
| debugDocumentVersioning = "YES"> | |||
| <BuildableProductRunnable | |||
| runnableDebuggingMode = "0"> | |||
| <BuildableReference | |||
| BuildableIdentifier = "primary" | |||
| BlueprintIdentifier = "97C146ED1CF9000F007C117D" | |||
| BuildableName = "Runner.app" | |||
| BlueprintName = "Runner" | |||
| ReferencedContainer = "container:Runner.xcodeproj"> | |||
| </BuildableReference> | |||
| </BuildableProductRunnable> | |||
| </ProfileAction> | |||
| <AnalyzeAction | |||
| buildConfiguration = "Debug"> | |||
| </AnalyzeAction> | |||
| <ArchiveAction | |||
| buildConfiguration = "Release" | |||
| revealArchiveInOrganizer = "YES"> | |||
| </ArchiveAction> | |||
| </Scheme> | |||
| @@ -0,0 +1,10 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <Workspace | |||
| version = "1.0"> | |||
| <FileRef | |||
| location = "group:Runner.xcodeproj"> | |||
| </FileRef> | |||
| <FileRef | |||
| location = "group:Pods/Pods.xcodeproj"> | |||
| </FileRef> | |||
| </Workspace> | |||
| @@ -0,0 +1,8 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||
| <plist version="1.0"> | |||
| <dict> | |||
| <key>IDEDidComputeMac32BitWarning</key> | |||
| <true/> | |||
| </dict> | |||
| </plist> | |||
| @@ -0,0 +1,8 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||
| <plist version="1.0"> | |||
| <dict> | |||
| <key>BuildSystemType</key> | |||
| <string>Original</string> | |||
| </dict> | |||
| </plist> | |||
| @@ -0,0 +1,13 @@ | |||
| import UIKit | |||
| import Flutter | |||
| @UIApplicationMain | |||
| @objc class AppDelegate: FlutterAppDelegate { | |||
| override func application( | |||
| _ application: UIApplication, | |||
| didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? | |||
| ) -> Bool { | |||
| GeneratedPluginRegistrant.register(with: self) | |||
| return super.application(application, didFinishLaunchingWithOptions: launchOptions) | |||
| } | |||
| } | |||
| @@ -0,0 +1,122 @@ | |||
| { | |||
| "images" : [ | |||
| { | |||
| "size" : "20x20", | |||
| "idiom" : "iphone", | |||
| "filename" : "Icon-App-20x20@2x.png", | |||
| "scale" : "2x" | |||
| }, | |||
| { | |||
| "size" : "20x20", | |||
| "idiom" : "iphone", | |||
| "filename" : "Icon-App-20x20@3x.png", | |||
| "scale" : "3x" | |||
| }, | |||
| { | |||
| "size" : "29x29", | |||
| "idiom" : "iphone", | |||
| "filename" : "Icon-App-29x29@1x.png", | |||
| "scale" : "1x" | |||
| }, | |||
| { | |||
| "size" : "29x29", | |||
| "idiom" : "iphone", | |||
| "filename" : "Icon-App-29x29@2x.png", | |||
| "scale" : "2x" | |||
| }, | |||
| { | |||
| "size" : "29x29", | |||
| "idiom" : "iphone", | |||
| "filename" : "Icon-App-29x29@3x.png", | |||
| "scale" : "3x" | |||
| }, | |||
| { | |||
| "size" : "40x40", | |||
| "idiom" : "iphone", | |||
| "filename" : "Icon-App-40x40@2x.png", | |||
| "scale" : "2x" | |||
| }, | |||
| { | |||
| "size" : "40x40", | |||
| "idiom" : "iphone", | |||
| "filename" : "Icon-App-40x40@3x.png", | |||
| "scale" : "3x" | |||
| }, | |||
| { | |||
| "size" : "60x60", | |||
| "idiom" : "iphone", | |||
| "filename" : "Icon-App-60x60@2x.png", | |||
| "scale" : "2x" | |||
| }, | |||
| { | |||
| "size" : "60x60", | |||
| "idiom" : "iphone", | |||
| "filename" : "Icon-App-60x60@3x.png", | |||
| "scale" : "3x" | |||
| }, | |||
| { | |||
| "size" : "20x20", | |||
| "idiom" : "ipad", | |||
| "filename" : "Icon-App-20x20@1x.png", | |||
| "scale" : "1x" | |||
| }, | |||
| { | |||
| "size" : "20x20", | |||
| "idiom" : "ipad", | |||
| "filename" : "Icon-App-20x20@2x.png", | |||
| "scale" : "2x" | |||
| }, | |||
| { | |||
| "size" : "29x29", | |||
| "idiom" : "ipad", | |||
| "filename" : "Icon-App-29x29@1x.png", | |||
| "scale" : "1x" | |||
| }, | |||
| { | |||
| "size" : "29x29", | |||
| "idiom" : "ipad", | |||
| "filename" : "Icon-App-29x29@2x.png", | |||
| "scale" : "2x" | |||
| }, | |||
| { | |||
| "size" : "40x40", | |||
| "idiom" : "ipad", | |||
| "filename" : "Icon-App-40x40@1x.png", | |||
| "scale" : "1x" | |||
| }, | |||
| { | |||
| "size" : "40x40", | |||
| "idiom" : "ipad", | |||
| "filename" : "Icon-App-40x40@2x.png", | |||
| "scale" : "2x" | |||
| }, | |||
| { | |||
| "size" : "76x76", | |||
| "idiom" : "ipad", | |||
| "filename" : "Icon-App-76x76@1x.png", | |||
| "scale" : "1x" | |||
| }, | |||
| { | |||
| "size" : "76x76", | |||
| "idiom" : "ipad", | |||
| "filename" : "Icon-App-76x76@2x.png", | |||
| "scale" : "2x" | |||
| }, | |||
| { | |||
| "size" : "83.5x83.5", | |||
| "idiom" : "ipad", | |||
| "filename" : "Icon-App-83.5x83.5@2x.png", | |||
| "scale" : "2x" | |||
| }, | |||
| { | |||
| "size" : "1024x1024", | |||
| "idiom" : "ios-marketing", | |||
| "filename" : "Icon-App-1024x1024@1x.png", | |||
| "scale" : "1x" | |||
| } | |||
| ], | |||
| "info" : { | |||
| "version" : 1, | |||
| "author" : "xcode" | |||
| } | |||
| } | |||
| @@ -0,0 +1,23 @@ | |||
| { | |||
| "images" : [ | |||
| { | |||
| "idiom" : "universal", | |||
| "filename" : "LaunchImage.png", | |||
| "scale" : "1x" | |||
| }, | |||
| { | |||
| "idiom" : "universal", | |||
| "filename" : "LaunchImage@2x.png", | |||
| "scale" : "2x" | |||
| }, | |||
| { | |||
| "idiom" : "universal", | |||
| "filename" : "LaunchImage@3x.png", | |||
| "scale" : "3x" | |||
| } | |||
| ], | |||
| "info" : { | |||
| "version" : 1, | |||
| "author" : "xcode" | |||
| } | |||
| } | |||
| @@ -0,0 +1,5 @@ | |||
| # Launch Screen Assets | |||
| You can customize the launch screen with your own desired assets by replacing the image files in this directory. | |||
| 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. | |||
| @@ -0,0 +1,37 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
| <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> | |||
| <dependencies> | |||
| <deployment identifier="iOS"/> | |||
| <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/> | |||
| </dependencies> | |||
| <scenes> | |||
| <!--View Controller--> | |||
| <scene sceneID="EHf-IW-A2E"> | |||
| <objects> | |||
| <viewController id="01J-lp-oVM" sceneMemberID="viewController"> | |||
| <layoutGuides> | |||
| <viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/> | |||
| <viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/> | |||
| </layoutGuides> | |||
| <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3"> | |||
| <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | |||
| <subviews> | |||
| <imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4"> | |||
| </imageView> | |||
| </subviews> | |||
| <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | |||
| <constraints> | |||
| <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/> | |||
| <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/> | |||
| </constraints> | |||
| </view> | |||
| </viewController> | |||
| <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/> | |||
| </objects> | |||
| <point key="canvasLocation" x="53" y="375"/> | |||
| </scene> | |||
| </scenes> | |||
| <resources> | |||
| <image name="LaunchImage" width="168" height="185"/> | |||
| </resources> | |||
| </document> | |||
| @@ -0,0 +1,26 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
| <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r"> | |||
| <dependencies> | |||
| <deployment identifier="iOS"/> | |||
| <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/> | |||
| </dependencies> | |||
| <scenes> | |||
| <!--Flutter View Controller--> | |||
| <scene sceneID="tne-QT-ifu"> | |||
| <objects> | |||
| <viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController"> | |||
| <layoutGuides> | |||
| <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/> | |||
| <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/> | |||
| </layoutGuides> | |||
| <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC"> | |||
| <rect key="frame" x="0.0" y="0.0" width="600" height="600"/> | |||
| <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | |||
| <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> | |||
| </view> | |||
| </viewController> | |||
| <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> | |||
| </objects> | |||
| </scene> | |||
| </scenes> | |||
| </document> | |||
| @@ -0,0 +1,54 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||
| <plist version="1.0"> | |||
| <dict> | |||
| <key>NSCameraUsageDescription</key> | |||
| <string>Can we access your camera in order to scan barcodes?</string> | |||
| <key>UIBackgroundModes</key> | |||
| <array> | |||
| <string>fetch</string> | |||
| <string>remote-notification</string> | |||
| </array> | |||
| <key>io.flutter.embedded_views_preview</key> | |||
| <true/> | |||
| <key>CFBundleDevelopmentRegion</key> | |||
| <string>en</string> | |||
| <key>CFBundleExecutable</key> | |||
| <string>$(EXECUTABLE_NAME)</string> | |||
| <key>CFBundleIdentifier</key> | |||
| <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | |||
| <key>CFBundleInfoDictionaryVersion</key> | |||
| <string>6.0</string> | |||
| <key>CFBundleName</key> | |||
| <string>flutter_qr_example</string> | |||
| <key>CFBundlePackageType</key> | |||
| <string>APPL</string> | |||
| <key>CFBundleShortVersionString</key> | |||
| <string>$(FLUTTER_BUILD_NAME)</string> | |||
| <key>CFBundleSignature</key> | |||
| <string>????</string> | |||
| <key>CFBundleVersion</key> | |||
| <string>$(FLUTTER_BUILD_NUMBER)</string> | |||
| <key>LSRequiresIPhoneOS</key> | |||
| <true/> | |||
| <key>UILaunchStoryboardName</key> | |||
| <string>LaunchScreen</string> | |||
| <key>UIMainStoryboardFile</key> | |||
| <string>Main</string> | |||
| <key>UISupportedInterfaceOrientations</key> | |||
| <array> | |||
| <string>UIInterfaceOrientationPortrait</string> | |||
| <string>UIInterfaceOrientationLandscapeLeft</string> | |||
| <string>UIInterfaceOrientationLandscapeRight</string> | |||
| </array> | |||
| <key>UISupportedInterfaceOrientations~ipad</key> | |||
| <array> | |||
| <string>UIInterfaceOrientationPortrait</string> | |||
| <string>UIInterfaceOrientationPortraitUpsideDown</string> | |||
| <string>UIInterfaceOrientationLandscapeLeft</string> | |||
| <string>UIInterfaceOrientationLandscapeRight</string> | |||
| </array> | |||
| <key>UIViewControllerBasedStatusBarAppearance</key> | |||
| <false/> | |||
| </dict> | |||
| </plist> | |||
| @@ -0,0 +1 @@ | |||
| #import "GeneratedPluginRegistrant.h" | |||
| @@ -0,0 +1,53 @@ | |||
| import 'package:flutter/material.dart'; | |||
| import 'package:flutter/services.dart'; | |||
| import 'package:qr_code_scanner/qr_code_scanner.dart'; | |||
| void main() => runApp(MaterialApp(home: TextViewExample())); | |||
| class TextViewExample extends StatefulWidget { | |||
| const TextViewExample({ | |||
| Key key, | |||
| }) : super(key: key); | |||
| @override | |||
| State<StatefulWidget> createState() => _TextViewExampleState(); | |||
| } | |||
| class _TextViewExampleState extends State<TextViewExample> { | |||
| final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); | |||
| var qrText = ""; | |||
| @override | |||
| Widget build(BuildContext context) { | |||
| return Scaffold( | |||
| body: Column( | |||
| children: <Widget>[ | |||
| Expanded( | |||
| child: QRView( | |||
| key: qrKey, | |||
| onQRViewCreated: _onQRViewCreated, | |||
| ), | |||
| flex: 1, | |||
| ), | |||
| Expanded( | |||
| child: Text("This is the result of scan: $qrText"), | |||
| flex: 4, | |||
| ) | |||
| ], | |||
| ), | |||
| ); | |||
| } | |||
| void _onQRViewCreated(QRViewController controller) { | |||
| final channel = controller.channel; | |||
| controller.init(qrKey); | |||
| channel.setMethodCallHandler((MethodCall call) async { | |||
| switch (call.method) { | |||
| case "onRecognizeQR": | |||
| dynamic arguments = call.arguments; | |||
| setState(() { | |||
| qrText = arguments.toString(); | |||
| }); | |||
| } | |||
| }); | |||
| } | |||
| } | |||
| @@ -0,0 +1,63 @@ | |||
| name: qr_code_scanner_example | |||
| description: Demonstrates how to use the flutter_qr plugin. | |||
| publish_to: 'none' | |||
| environment: | |||
| sdk: ">=2.0.0-dev.68.0 <3.0.0" | |||
| dependencies: | |||
| flutter: | |||
| sdk: flutter | |||
| # The following adds the Cupertino Icons font to your application. | |||
| # Use with the CupertinoIcons class for iOS style icons. | |||
| cupertino_icons: ^0.1.2 | |||
| dev_dependencies: | |||
| flutter_test: | |||
| sdk: flutter | |||
| qr_code_scanner: | |||
| path: ../ | |||
| # For information on the generic Dart part of this file, see the | |||
| # following page: https://www.dartlang.org/tools/pub/pubspec | |||
| # The following section is specific to Flutter. | |||
| flutter: | |||
| # The following line ensures that the Material Icons font is | |||
| # included with your application, so that you can use the icons in | |||
| # the material Icons class. | |||
| uses-material-design: true | |||
| # To add assets to your application, add an assets section, like this: | |||
| # assets: | |||
| # - images/a_dot_burr.jpeg | |||
| # - images/a_dot_ham.jpeg | |||
| # An image asset can refer to one or more resolution-specific "variants", see | |||
| # https://flutter.io/assets-and-images/#resolution-aware. | |||
| # For details regarding adding assets from package dependencies, see | |||
| # https://flutter.io/assets-and-images/#from-packages | |||
| # To add custom fonts to your application, add a fonts section here, | |||
| # in this "flutter" section. Each entry in this list should have a | |||
| # "family" key with the font family name, and a "fonts" key with a | |||
| # list giving the asset and other descriptors for the font. For | |||
| # example: | |||
| # fonts: | |||
| # - family: Schyler | |||
| # fonts: | |||
| # - asset: fonts/Schyler-Regular.ttf | |||
| # - asset: fonts/Schyler-Italic.ttf | |||
| # style: italic | |||
| # - family: Trajan Pro | |||
| # fonts: | |||
| # - asset: fonts/TrajanPro.ttf | |||
| # - asset: fonts/TrajanPro_Bold.ttf | |||
| # weight: 700 | |||
| # | |||
| # For details regarding fonts from package dependencies, | |||
| # see https://flutter.io/custom-fonts/#from-packages | |||
| @@ -0,0 +1,6 @@ | |||
| // This is a basic Flutter widget test. | |||
| // | |||
| // To perform an interaction with a widget in your test, use the WidgetTester | |||
| // utility that Flutter provides. For example, you can send tap and scroll | |||
| // gestures. You can also use WidgetTester to find child widgets in the widget | |||
| // tree, read text, and verify that the values of widget properties are correct. | |||
| @@ -0,0 +1,78 @@ | |||
| # Xcode | |||
| # | |||
| # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore | |||
| ## Build generated | |||
| build/ | |||
| DerivedData/ | |||
| ## Various settings | |||
| *.pbxuser | |||
| !default.pbxuser | |||
| *.mode1v3 | |||
| !default.mode1v3 | |||
| *.mode2v3 | |||
| !default.mode2v3 | |||
| *.perspectivev3 | |||
| !default.perspectivev3 | |||
| xcuserdata/ | |||
| ## Other | |||
| *.moved-aside | |||
| *.xccheckout | |||
| *.xcscmblueprint | |||
| ## Obj-C/Swift specific | |||
| *.hmap | |||
| *.ipa | |||
| *.dSYM.zip | |||
| *.dSYM | |||
| ## Playgrounds | |||
| timeline.xctimeline | |||
| playground.xcworkspace | |||
| # Swift Package Manager | |||
| # | |||
| # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. | |||
| # Packages/ | |||
| # Package.pins | |||
| # Package.resolved | |||
| .build/ | |||
| # CocoaPods | |||
| # | |||
| # We recommend against adding the Pods directory to your .gitignore. However | |||
| # you should judge for yourself, the pros and cons are mentioned at: | |||
| # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control | |||
| # | |||
| # Pods/ | |||
| # | |||
| # Add this line if you want to avoid checking in source code from the Xcode workspace | |||
| # *.xcworkspace | |||
| # Carthage | |||
| # | |||
| # Add this line if you want to avoid checking in source code from Carthage dependencies. | |||
| # Carthage/Checkouts | |||
| Carthage/Build | |||
| # fastlane | |||
| # | |||
| # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the | |||
| # screenshots whenever they are needed. | |||
| # For more information about the recommended setup visit: | |||
| # https://docs.fastlane.tools/best-practices/source-control/#source-control | |||
| fastlane/report.xml | |||
| fastlane/Preview.html | |||
| fastlane/screenshots/**/*.png | |||
| fastlane/test_output | |||
| # Code Injection | |||
| # | |||
| # After new code Injection tools there's a generated folder /iOSInjectionProject | |||
| # https://github.com/johnno1962/injectionforxcode | |||
| iOSInjectionProject/ | |||
| @@ -0,0 +1,4 @@ | |||
| #import <Flutter/Flutter.h> | |||
| @interface FlutterQrPlugin : NSObject<FlutterPlugin> | |||
| @end | |||
| @@ -0,0 +1,7 @@ | |||
| #import "FlutterQrPlugin.h" | |||
| #import <flutter_qr/flutter_qr-Swift.h> | |||
| @implementation FlutterQrPlugin | |||
| + (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar { | |||
| [SwiftFlutterQrPlugin registerWithRegistrar:registrar]; | |||
| } | |||
| @end | |||
| @@ -0,0 +1,60 @@ | |||
| // | |||
| // QRView.swift | |||
| // flutter_qr | |||
| // | |||
| // Created by Julius Canute on 21/12/18. | |||
| // | |||
| import Foundation | |||
| import MTBBarcodeScanner | |||
| public class QRView:NSObject,FlutterPlatformView { | |||
| @IBOutlet var previewView: UIView! | |||
| var scanner: MTBBarcodeScanner? | |||
| var registrar: FlutterPluginRegistrar | |||
| var channel: FlutterMethodChannel | |||
| public init(withFrame frame: CGRect, withRegistrar registrar: FlutterPluginRegistrar, withId id: Int64){ | |||
| self.registrar = registrar | |||
| previewView = UIView(frame: frame) | |||
| channel = FlutterMethodChannel(name: "net.touchcapture.qr.flutterqr/qrview_\(id)", binaryMessenger: registrar.messenger()) | |||
| } | |||
| func isCameraAvailable(success: Bool) -> Void { | |||
| if success { | |||
| do { | |||
| try scanner?.startScanning(resultBlock: { codes in | |||
| if let codes = codes { | |||
| for code in codes { | |||
| let stringValue = code.stringValue! | |||
| self.channel.invokeMethod("onRecognizeQR", arguments: stringValue) | |||
| } | |||
| } | |||
| }) | |||
| } catch { | |||
| NSLog("Unable to start scanning") | |||
| } | |||
| } else { | |||
| UIAlertView(title: "Scanning Unavailable", message: "This app does not have permission to access the camera", delegate: nil, cancelButtonTitle: nil, otherButtonTitles: "Ok").show() | |||
| } | |||
| } | |||
| public func view() -> UIView { | |||
| channel.setMethodCallHandler({ | |||
| [weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in | |||
| guard call.method == "setDimensions" else { | |||
| result(FlutterMethodNotImplemented) | |||
| return | |||
| } | |||
| var arguments = call.arguments as! Dictionary<String, Double> | |||
| self?.setDimensions(width: arguments["width"] ?? 0,height: arguments["height"] ?? 0) | |||
| }) | |||
| return previewView | |||
| } | |||
| func setDimensions(width: Double, height: Double) -> Void { | |||
| previewView.frame = CGRect(x: 0, y: 0, width: width, height: height) | |||
| scanner = MTBBarcodeScanner(previewView: previewView) | |||
| MTBBarcodeScanner.requestCameraPermission(success: isCameraAvailable) | |||
| } | |||
| } | |||
| @@ -0,0 +1,27 @@ | |||
| // | |||
| // QRViewFactory.swift | |||
| // flutter_qr | |||
| // | |||
| // Created by Julius Canute on 21/12/18. | |||
| // | |||
| import Foundation | |||
| public class QRViewFactory: NSObject, FlutterPlatformViewFactory { | |||
| var registrar: FlutterPluginRegistrar? | |||
| public init(withRegistrar registrar: FlutterPluginRegistrar){ | |||
| super.init() | |||
| self.registrar = registrar | |||
| } | |||
| public func create(withFrame frame: CGRect, viewIdentifier viewId: Int64, arguments args: Any?) -> FlutterPlatformView { | |||
| var dictionary = args as! Dictionary<String, Double> | |||
| return QRView(withFrame: CGRect(x: 0, y: 0, width: dictionary["width"] ?? 0, height: dictionary["height"] ?? 0), withRegistrar: registrar!,withId: viewId) | |||
| } | |||
| public func createArgsCodec() -> FlutterMessageCodec & NSObjectProtocol { | |||
| return FlutterStandardMessageCodec(readerWriter: FlutterStandardReaderWriter()) | |||
| } | |||
| } | |||
| @@ -0,0 +1,22 @@ | |||
| import Flutter | |||
| import UIKit | |||
| public class SwiftFlutterQrPlugin: NSObject, FlutterPlugin { | |||
| var factory: QRViewFactory | |||
| public init(with registrar: FlutterPluginRegistrar) { | |||
| self.factory = QRViewFactory(withRegistrar: registrar) | |||
| registrar.register(factory, withId: "net.touchcapture.qr.flutterqr/qrview") | |||
| } | |||
| public static func register(with registrar: FlutterPluginRegistrar) { | |||
| registrar.addApplicationDelegate(SwiftFlutterQrPlugin(with: registrar)) | |||
| } | |||
| public func applicationDidEnterBackground(_ application: UIApplication) { | |||
| } | |||
| public func applicationWillTerminate(_ application: UIApplication) { | |||
| } | |||
| } | |||
| @@ -0,0 +1,21 @@ | |||
| # | |||
| # To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html | |||
| # | |||
| Pod::Spec.new do |s| | |||
| s.name = 'flutter_qr' | |||
| s.version = '0.0.1' | |||
| s.summary = 'A new Flutter project.' | |||
| s.description = <<-DESC | |||
| A new Flutter project. | |||
| DESC | |||
| s.homepage = 'http://example.com' | |||
| s.license = { :file => '../LICENSE' } | |||
| s.author = { 'Your Company' => 'email@example.com' } | |||
| s.source = { :path => '.' } | |||
| s.source_files = 'Classes/**/*' | |||
| s.public_header_files = 'Classes/**/*.h' | |||
| s.dependency 'Flutter' | |||
| s.dependency 'MTBBarcodeScanner' | |||
| s.ios.deployment_target = '8.0' | |||
| end | |||
| @@ -0,0 +1,85 @@ | |||
| import 'package:flutter/foundation.dart'; | |||
| import 'package:flutter/material.dart'; | |||
| import 'package:flutter/services.dart'; | |||
| typedef void QRViewCreatedCallback(QRViewController controller); | |||
| class QRView extends StatefulWidget { | |||
| const QRView({ | |||
| Key key, | |||
| this.onQRViewCreated, | |||
| }) : super(key: key); | |||
| final QRViewCreatedCallback onQRViewCreated; | |||
| @override | |||
| State<StatefulWidget> createState() => _QRViewState(); | |||
| } | |||
| class _QRViewState extends State<QRView> { | |||
| @override | |||
| Widget build(BuildContext context) { | |||
| var androidView = AndroidView( | |||
| viewType: 'net.touchcapture.qr.flutterqr/qrview', | |||
| onPlatformViewCreated: _onPlatformViewCreated, | |||
| ); | |||
| if (defaultTargetPlatform == TargetPlatform.android) { | |||
| return androidView; | |||
| } | |||
| if (defaultTargetPlatform == TargetPlatform.iOS) { | |||
| return UiKitView( | |||
| viewType: 'net.touchcapture.qr.flutterqr/qrview', | |||
| onPlatformViewCreated: _onPlatformViewCreated, | |||
| creationParams: _CreationParams.fromWidget(0, 0).toMap(), | |||
| creationParamsCodec: StandardMessageCodec(), | |||
| ); | |||
| } | |||
| return Text( | |||
| '$defaultTargetPlatform is not yet supported by the text_view plugin'); | |||
| } | |||
| void _onPlatformViewCreated(int id) { | |||
| if (widget.onQRViewCreated == null) { | |||
| return; | |||
| } | |||
| widget.onQRViewCreated(new QRViewController._(id)); | |||
| } | |||
| } | |||
| class _CreationParams { | |||
| _CreationParams({this.width, this.height}); | |||
| static _CreationParams fromWidget(double width, double height) { | |||
| return _CreationParams( | |||
| width: width, | |||
| height: height, | |||
| ); | |||
| } | |||
| final double width; | |||
| final double height; | |||
| Map<String, dynamic> toMap() { | |||
| return <String, dynamic>{ | |||
| 'width': width, | |||
| 'height': height, | |||
| }; | |||
| } | |||
| } | |||
| class QRViewController { | |||
| QRViewController._(int id) | |||
| : channel = MethodChannel('net.touchcapture.qr.flutterqr/qrview_$id'); | |||
| final MethodChannel channel; | |||
| void init(GlobalKey qrKey) { | |||
| if (defaultTargetPlatform == TargetPlatform.iOS) { | |||
| final RenderBox renderBox = qrKey.currentContext.findRenderObject(); | |||
| channel.invokeMethod("setDimensions", | |||
| {"width": renderBox.size.width, "height": renderBox.size.height}); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,17 @@ | |||
| name: qr_code_scanner | |||
| description: QR code scanner natively embedded inside flutter. | |||
| version: 0.0.1 | |||
| author: Julius Canute<juliuscanute[*]touchcapture.net> | |||
| homepage: https://medium.com/@juliuscanute | |||
| environment: | |||
| sdk: ">=2.0.0-dev.68.0 <3.0.0" | |||
| dependencies: | |||
| flutter: | |||
| sdk: flutter | |||
| flutter: | |||
| plugin: | |||
| androidPackage: net.touchcapture.qr.flutterqr | |||
| pluginClass: FlutterQrPlugin | |||