diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 24222e22..d0da6af0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,3 +1,3 @@ -Contributing to fast_barcode_scanner +Contributing to icapps_fast_barcode_scanner Contributions are welcome by submitting a PR for to be reviewed. \ No newline at end of file diff --git a/README.md b/README.md index 8ab08e38..2248c2e8 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## Packages -### fast_barcode_scanner: +### icapps_fast_barcode_scanner: code for the cross-platform facing plugin, used to display a camera view within Flutter applications [![pub package](https://img.shields.io/pub/v/fast_barcode_scanner.svg)](https://pub.dartlang.org/packages/fast_barcode_scanner) diff --git a/fast_barcode_scanner/CHANGELOG.md b/fast_barcode_scanner/CHANGELOG.md index a91b0d9c..89bd10dc 100644 --- a/fast_barcode_scanner/CHANGELOG.md +++ b/fast_barcode_scanner/CHANGELOG.md @@ -1,3 +1,25 @@ + +## 1.5.1 + +- Fix crashes on android + +## 1.5.0 + +- Updated to be 16KB compatible + +## 1.4.1 + +- Added namespace for android + +## 1.4.0 + +- Further rename to icapps_fast_barcode_scanner + +## 1.3.0 + +- Forked to icapps_fast_barcode_scanner +- fix 'Type mismatch: inferred type is Activity? but Context was expected' + ## 1.1.4 - Fixes `pauseDetector` on iOS diff --git a/fast_barcode_scanner/README.md b/fast_barcode_scanner/README.md index 76025330..dea58bb7 100644 --- a/fast_barcode_scanner/README.md +++ b/fast_barcode_scanner/README.md @@ -11,7 +11,7 @@ A fast barcode scanner using **MLKit** (and **CameraX**) on Android and **AVFoun ## Installation Add the following line to your **pubspec.yaml**: ```yaml -fast_barcode_scanner: ^1.1.0 +icapps_fast_barcode_scanner: ^1.1.0 ``` ### iOS Add the `NSCameraUsageDescription` key to your `ios/Runner/Info.plist`, like so: @@ -30,7 +30,7 @@ minSdkVersion 21 The barcode scanner consists of two main classes `CameraController` and `BarcodeCamera`. A full example looks like this: ```dart -import 'package:fast_barcode_scanner/fast_barcode_scanner.dart'; +import 'package:icapps_fast_barcode_scanner/icapps_fast_barcode_scanner.dart'; class MyScannerScreen extends StatelessWidget { @override diff --git a/fast_barcode_scanner/android/build.gradle b/fast_barcode_scanner/android/build.gradle index fe22c3a9..f46d91d7 100644 --- a/fast_barcode_scanner/android/build.gradle +++ b/fast_barcode_scanner/android/build.gradle @@ -1,15 +1,15 @@ -group 'com.jhoogstraat.fast_barcode_scanner' +group 'com.icapps.icapps_fast_barcode_scanner' version '1.0-SNAPSHOT' buildscript { - ext.kotlin_version = '1.3.50' + ext.kotlin_version = '1.9.24' repositories { google() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:4.1.0' + classpath 'com.android.tools.build:gradle:8.5.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } @@ -25,7 +25,8 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' android { - compileSdkVersion 31 + namespace 'com.icapps.icapps_fast_barcode_scanner' + compileSdkVersion 34 sourceSets { main.java.srcDirs += 'src/main/kotlin' @@ -53,8 +54,8 @@ android { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - def camerax_version = "1.1.0-alpha10" - def mlkit_version = "17.0.0" + def camerax_version = "1.4.0" + def mlkit_version = "17.3.0" implementation "androidx.camera:camera-camera2:$camerax_version" implementation "androidx.camera:camera-lifecycle:$camerax_version" diff --git a/fast_barcode_scanner/android/gradle/wrapper/gradle-wrapper.properties b/fast_barcode_scanner/android/gradle/wrapper/gradle-wrapper.properties index 3c9d0852..3c85cfe0 100644 --- a/fast_barcode_scanner/android/gradle/wrapper/gradle-wrapper.properties +++ b/fast_barcode_scanner/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip diff --git a/fast_barcode_scanner/android/settings.gradle b/fast_barcode_scanner/android/settings.gradle index d6d14a0d..eb2b22ba 100644 --- a/fast_barcode_scanner/android/settings.gradle +++ b/fast_barcode_scanner/android/settings.gradle @@ -1 +1 @@ -rootProject.name = 'fast_barcode_scanner' +rootProject.name = 'icapps_fast_barcode_scanner' diff --git a/fast_barcode_scanner/android/src/main/AndroidManifest.xml b/fast_barcode_scanner/android/src/main/AndroidManifest.xml index 34159d60..07709a54 100644 --- a/fast_barcode_scanner/android/src/main/AndroidManifest.xml +++ b/fast_barcode_scanner/android/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="com.icapps.icapps_fast_barcode_scanner"> diff --git a/fast_barcode_scanner/android/src/main/kotlin/com/jhoogstraat/fast_barcode_scanner/BarcodeReader.kt b/fast_barcode_scanner/android/src/main/kotlin/com/icapps/icapps_fast_barcode_scanner/BarcodeReader.kt similarity index 84% rename from fast_barcode_scanner/android/src/main/kotlin/com/jhoogstraat/fast_barcode_scanner/BarcodeReader.kt rename to fast_barcode_scanner/android/src/main/kotlin/com/icapps/icapps_fast_barcode_scanner/BarcodeReader.kt index b8b00366..66212936 100644 --- a/fast_barcode_scanner/android/src/main/kotlin/com/jhoogstraat/fast_barcode_scanner/BarcodeReader.kt +++ b/fast_barcode_scanner/android/src/main/kotlin/com/icapps/icapps_fast_barcode_scanner/BarcodeReader.kt @@ -1,4 +1,4 @@ -package com.jhoogstraat.fast_barcode_scanner +package com.icapps.icapps_fast_barcode_scanner import android.Manifest import android.app.Activity @@ -13,7 +13,7 @@ import androidx.core.util.Consumer import androidx.lifecycle.LifecycleOwner import com.google.android.gms.tasks.OnFailureListener import com.google.android.gms.tasks.OnSuccessListener -import com.google.mlkit.vision.barcode.Barcode +import com.google.mlkit.vision.barcode.common.Barcode import com.google.mlkit.vision.barcode.BarcodeScannerOptions import io.flutter.plugin.common.MethodChannel.Result @@ -23,7 +23,7 @@ import java.util.ArrayList import java.util.concurrent.ExecutorService import java.util.concurrent.Executors -data class CameraConfig(val formats: IntArray, val mode: DetectionMode, val resolution: Resolution, val framerate: Framerate, val position: CameraPosition) +data class CameraConfig(val formats: IntArray, val mode: DetectionMode, val resolution: Resolution, val framerate: Framerate, var position: CameraPosition) class BarcodeReader(private val flutterTextureEntry: TextureRegistry.SurfaceTextureEntry, private val listener: (List) -> Unit) : RequestPermissionsResultListener { /* Android Lifecycle */ @@ -100,10 +100,32 @@ class BarcodeReader(private val flutterTextureEntry: TextureRegistry.SurfaceText } fun toggleTorch(result: Result) { - if (!isInitialized) return + if (!isInitialized || activity == null) return camera.cameraControl.enableTorch(camera.cameraInfo.torchState.value != TorchState.ON).addListener(Runnable { result.success(camera.cameraInfo.torchState.value == TorchState.ON) - }, ContextCompat.getMainExecutor(activity)) + }, ContextCompat.getMainExecutor(activity!!)) + } + + fun canChangeCamera(result: Result) { + try { + val cameraProviderFuture = ProcessCameraProvider.getInstance(activity!!) + cameraProviderFuture.addListener(Runnable { + val cameraProviderForChangeCamera = cameraProviderFuture.get() + val hasFrontCamera = cameraProviderForChangeCamera.hasCamera(CameraSelector.DEFAULT_FRONT_CAMERA) + val hasBackCamera = cameraProviderForChangeCamera.hasCamera(CameraSelector.DEFAULT_BACK_CAMERA) + result.success(hasFrontCamera && hasBackCamera) + }, ContextCompat.getMainExecutor(activity!!)) + } catch (exc: Exception) { + result.success(false) + } + } + + fun changeCamera(position: String, result: Result) { + cameraConfig.position = when (position) { + "front" -> CameraPosition.front + else -> CameraPosition.back + } + initCamera() } private fun allPermissionsGranted() = REQUIRED_PERMISSIONS.all { @@ -148,12 +170,8 @@ class BarcodeReader(private val flutterTextureEntry: TextureRegistry.SurfaceText // Select camera val selectorBuilder = CameraSelector.Builder() when (cameraConfig.position) { - CameraPosition.front -> { - selectorBuilder.requireLensFacing(CameraSelector.LENS_FACING_FRONT) - } - CameraPosition.back -> { - selectorBuilder.requireLensFacing(CameraSelector.LENS_FACING_BACK) - } + CameraPosition.front -> selectorBuilder.requireLensFacing(CameraSelector.LENS_FACING_FRONT) + CameraPosition.back -> selectorBuilder.requireLensFacing(CameraSelector.LENS_FACING_BACK) } cameraSelector = selectorBuilder.build() @@ -211,7 +229,7 @@ class BarcodeReader(private val flutterTextureEntry: TextureRegistry.SurfaceText } companion object { - private const val TAG = "fast_barcode_scanner" + private const val TAG = "icapps_fast_barcode_scanner" private const val REQUEST_CODE_PERMISSIONS = 10 private val REQUIRED_PERMISSIONS = arrayOf(Manifest.permission.CAMERA) } diff --git a/fast_barcode_scanner/android/src/main/kotlin/com/icapps/icapps_fast_barcode_scanner/FastBarcodeScannerPlugin.kt b/fast_barcode_scanner/android/src/main/kotlin/com/icapps/icapps_fast_barcode_scanner/FastBarcodeScannerPlugin.kt new file mode 100644 index 00000000..7c9f6ab8 --- /dev/null +++ b/fast_barcode_scanner/android/src/main/kotlin/com/icapps/icapps_fast_barcode_scanner/FastBarcodeScannerPlugin.kt @@ -0,0 +1,127 @@ +package com.icapps.icapps_fast_barcode_scanner + + +import androidx.annotation.NonNull +import android.app.Activity +import androidx.camera.core.CameraSelector +import androidx.camera.lifecycle.ProcessCameraProvider +import androidx.core.content.ContextCompat + +import io.flutter.embedding.engine.plugins.FlutterPlugin +import io.flutter.embedding.engine.plugins.activity.ActivityAware +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding + +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 + +/** FastBarcodeScannerPlugin */ +class FastBarcodeScannerPlugin: FlutterPlugin, MethodCallHandler, ActivityAware, PluginRegistry.RequestPermissionsResultListener { + private lateinit var channel : MethodChannel + private var reader: BarcodeReader? = null + + private var pluginBinding: FlutterPlugin.FlutterPluginBinding? = null + private var activity: Activity? = null + + + override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { + this.pluginBinding = flutterPluginBinding + channel = MethodChannel(flutterPluginBinding.binaryMessenger, "com.icapps/icapps_fast_barcode_scanner") + } + + override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) { + this.pluginBinding = null + } + + // https://flutter.dev/docs/development/packages-and-plugins/plugin-api-migration#uiactivity-plugin + // https://github.com/flutter/plugins/blob/master/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java + override fun onAttachedToActivity(binding: ActivityPluginBinding) { + this.activity = binding.activity + binding.addRequestPermissionsResultListener(this) + channel.setMethodCallHandler(this) + } + + override fun onDetachedFromActivity() { + channel.setMethodCallHandler(null) + reader?.detachFromActivity() + this.activity = null + } + + override fun onDetachedFromActivityForConfigChanges() { + onDetachedFromActivity() + } + + override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) { + onAttachedToActivity(binding) + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ): Boolean { + return reader?.onRequestPermissionsResult(requestCode, permissions, grantResults) ?: false + } + + override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) { + @Suppress("UNCHECKED_CAST") + when (call.method) { + "start" -> { + if (activity == null) { + result.error("0", "Activity not connected!", null) + return + } + + pluginBinding?.let { binding -> + if (reader == null) { + reader = + BarcodeReader(binding.textureRegistry.createSurfaceTexture()) { barcodes -> + barcodes.firstOrNull()?.also { barcode -> + channel.invokeMethod( + "read", + listOf(barcodeStringMap[barcode.format], barcode.rawValue) + ) + } + } + reader!!.attachToActivity(activity!!) + } + + // Start the reader *inside* the null-safe block + reader!!.start(call.arguments as HashMap, result) + + } ?: run { + // This runs if pluginBinding is null + result.error("1", "Plugin not attached to an engine.", null) + } + reader!!.start(call.arguments as HashMap, result) + } + "stop" -> reader?.stop(result) + "pause" -> reader?.stop(result) + "resume" -> reader?.resume(result) + "toggleTorch" -> reader?.toggleTorch(result) + "canChangeCamera" -> { + if (activity == null) { + result.error("0", "Activity not connected!", null) + return + } + try { + val cameraProviderFuture = ProcessCameraProvider.getInstance(activity!!) + cameraProviderFuture.addListener({ + val cameraProviderForChangeCamera = cameraProviderFuture.get() + val hasFrontCamera = + cameraProviderForChangeCamera.hasCamera(CameraSelector.DEFAULT_FRONT_CAMERA) + val hasBackCamera = + cameraProviderForChangeCamera.hasCamera(CameraSelector.DEFAULT_BACK_CAMERA) + result.success(hasFrontCamera && hasBackCamera) + }, ContextCompat.getMainExecutor(activity!!)) + } catch (exc: Exception) { + result.success(false) + } + } + "changeCamera" -> reader?.changeCamera(call.arguments as String, result) + else -> result.notImplemented() + } + } +} diff --git a/fast_barcode_scanner/android/src/main/kotlin/com/jhoogstraat/fast_barcode_scanner/MLKitBarcodeDetector.kt b/fast_barcode_scanner/android/src/main/kotlin/com/icapps/icapps_fast_barcode_scanner/MLKitBarcodeDetector.kt similarity index 91% rename from fast_barcode_scanner/android/src/main/kotlin/com/jhoogstraat/fast_barcode_scanner/MLKitBarcodeDetector.kt rename to fast_barcode_scanner/android/src/main/kotlin/com/icapps/icapps_fast_barcode_scanner/MLKitBarcodeDetector.kt index 7ee2707f..f711d586 100644 --- a/fast_barcode_scanner/android/src/main/kotlin/com/jhoogstraat/fast_barcode_scanner/MLKitBarcodeDetector.kt +++ b/fast_barcode_scanner/android/src/main/kotlin/com/icapps/icapps_fast_barcode_scanner/MLKitBarcodeDetector.kt @@ -1,11 +1,11 @@ -package com.jhoogstraat.fast_barcode_scanner +package com.icapps.icapps_fast_barcode_scanner import androidx.camera.core.ExperimentalGetImage import androidx.camera.core.ImageAnalysis import androidx.camera.core.ImageProxy import com.google.android.gms.tasks.OnFailureListener import com.google.android.gms.tasks.OnSuccessListener -import com.google.mlkit.vision.barcode.Barcode +import com.google.mlkit.vision.barcode.common.Barcode import com.google.mlkit.vision.barcode.BarcodeScannerOptions import com.google.mlkit.vision.barcode.BarcodeScanning import com.google.mlkit.vision.common.InputImage diff --git a/fast_barcode_scanner/android/src/main/kotlin/com/jhoogstraat/fast_barcode_scanner/Types.kt b/fast_barcode_scanner/android/src/main/kotlin/com/icapps/icapps_fast_barcode_scanner/Types.kt similarity index 93% rename from fast_barcode_scanner/android/src/main/kotlin/com/jhoogstraat/fast_barcode_scanner/Types.kt rename to fast_barcode_scanner/android/src/main/kotlin/com/icapps/icapps_fast_barcode_scanner/Types.kt index 62be3354..90d8425e 100644 --- a/fast_barcode_scanner/android/src/main/kotlin/com/jhoogstraat/fast_barcode_scanner/Types.kt +++ b/fast_barcode_scanner/android/src/main/kotlin/com/icapps/icapps_fast_barcode_scanner/Types.kt @@ -1,7 +1,7 @@ -package com.jhoogstraat.fast_barcode_scanner +package com.icapps.icapps_fast_barcode_scanner import android.util.Size -import com.google.mlkit.vision.barcode.Barcode +import com.google.mlkit.vision.barcode.common.Barcode enum class Framerate { fps30, fps60, fps120, fps240; diff --git a/fast_barcode_scanner/android/src/main/kotlin/com/jhoogstraat/fast_barcode_scanner/FastBarcodeScannerPlugin.kt b/fast_barcode_scanner/android/src/main/kotlin/com/jhoogstraat/fast_barcode_scanner/FastBarcodeScannerPlugin.kt deleted file mode 100644 index a7223391..00000000 --- a/fast_barcode_scanner/android/src/main/kotlin/com/jhoogstraat/fast_barcode_scanner/FastBarcodeScannerPlugin.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.jhoogstraat.fast_barcode_scanner - - -import androidx.annotation.NonNull - -import io.flutter.embedding.engine.plugins.FlutterPlugin -import io.flutter.embedding.engine.plugins.activity.ActivityAware -import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding - -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 - -/** FastBarcodeScannerPlugin */ -class FastBarcodeScannerPlugin: FlutterPlugin, MethodCallHandler, ActivityAware { - private lateinit var channel : MethodChannel - private lateinit var reader: BarcodeReader - - override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { - channel = MethodChannel(flutterPluginBinding.binaryMessenger, "com.jhoogstraat/fast_barcode_scanner") - - reader = BarcodeReader(flutterPluginBinding.textureRegistry.createSurfaceTexture()) { barcodes -> - barcodes.firstOrNull()?.also { barcode -> channel.invokeMethod("read", listOf(barcodeStringMap[barcode.format], barcode.rawValue)) } - } - } - - override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) { - - } - - // https://flutter.dev/docs/development/packages-and-plugins/plugin-api-migration#uiactivity-plugin - // https://github.com/flutter/plugins/blob/master/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java - override fun onAttachedToActivity(binding: ActivityPluginBinding) { - reader.attachToActivity(binding.activity) - binding.addRequestPermissionsResultListener(reader) - channel.setMethodCallHandler(this) - } - - override fun onDetachedFromActivity() { - channel.setMethodCallHandler(null) - reader.detachFromActivity() - } - - override fun onDetachedFromActivityForConfigChanges() { - onDetachedFromActivity() - } - - override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) { - onAttachedToActivity(binding) - } - - override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) { - @Suppress("UNCHECKED_CAST") - when (call.method) { - "start" -> reader.start(call.arguments as HashMap, result) - "stop" -> reader.stop(result) - "pause" -> reader.stop(result) - "resume" -> reader.resume(result) - "toggleTorch" -> reader.toggleTorch(result) - else -> result.notImplemented() - } - } -} diff --git a/fast_barcode_scanner/example/android/app/build.gradle b/fast_barcode_scanner/example/android/app/build.gradle index ac3e9106..1c478881 100644 --- a/fast_barcode_scanner/example/android/app/build.gradle +++ b/fast_barcode_scanner/example/android/app/build.gradle @@ -1,3 +1,9 @@ +plugins { + id "com.android.application" + id "org.jetbrains.kotlin.android" + id "dev.flutter.flutter-gradle-plugin" +} + def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { @@ -6,11 +12,6 @@ if (localPropertiesFile.exists()) { } } -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' @@ -21,21 +22,18 @@ 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 31 + namespace = "com.icapps.icapps_fast_barcode_scanner_example" + compileSdkVersion 34 sourceSets { main.java.srcDirs += 'src/main/kotlin' } defaultConfig { - applicationId "com.jhoogstraat.fast_barcode_scanner_example" + applicationId "com.icapps.icapps_fast_barcode_scanner_example" minSdkVersion 21 - targetSdkVersion 31 + targetSdkVersion 33 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } @@ -47,6 +45,16 @@ android { signingConfig signingConfigs.debug } } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + // For Kotlin projects + kotlinOptions { + jvmTarget = "1.8" + } } flutter { @@ -54,5 +62,5 @@ flutter { } dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0" } diff --git a/fast_barcode_scanner/example/android/app/src/debug/AndroidManifest.xml b/fast_barcode_scanner/example/android/app/src/debug/AndroidManifest.xml index d40405e5..48708752 100644 --- a/fast_barcode_scanner/example/android/app/src/debug/AndroidManifest.xml +++ b/fast_barcode_scanner/example/android/app/src/debug/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="com.icapps.icapps_fast_barcode_scanner_example"> diff --git a/fast_barcode_scanner/example/android/app/src/main/AndroidManifest.xml b/fast_barcode_scanner/example/android/app/src/main/AndroidManifest.xml index 791aa044..b252a74c 100644 --- a/fast_barcode_scanner/example/android/app/src/main/AndroidManifest.xml +++ b/fast_barcode_scanner/example/android/app/src/main/AndroidManifest.xml @@ -1,12 +1,13 @@ + package="com.icapps.icapps_fast_barcode_scanner_example"> diff --git a/fast_barcode_scanner/example/android/app/src/main/kotlin/com/jhoogstraat/fast_barcode_scanner_example/MainActivity.kt b/fast_barcode_scanner/example/android/app/src/main/kotlin/com/jhoogstraat/fast_barcode_scanner_example/MainActivity.kt index 6447b34f..ea77059b 100644 --- a/fast_barcode_scanner/example/android/app/src/main/kotlin/com/jhoogstraat/fast_barcode_scanner_example/MainActivity.kt +++ b/fast_barcode_scanner/example/android/app/src/main/kotlin/com/jhoogstraat/fast_barcode_scanner_example/MainActivity.kt @@ -1,4 +1,4 @@ -package com.jhoogstraat.fast_barcode_scanner_example +package com.icapps.icapps_fast_barcode_scanner_example import io.flutter.embedding.android.FlutterActivity diff --git a/fast_barcode_scanner/example/android/app/src/profile/AndroidManifest.xml b/fast_barcode_scanner/example/android/app/src/profile/AndroidManifest.xml index d40405e5..48708752 100644 --- a/fast_barcode_scanner/example/android/app/src/profile/AndroidManifest.xml +++ b/fast_barcode_scanner/example/android/app/src/profile/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="com.icapps.icapps_fast_barcode_scanner_example"> diff --git a/fast_barcode_scanner/example/android/build.gradle b/fast_barcode_scanner/example/android/build.gradle index 373f9326..b42eb3a7 100644 --- a/fast_barcode_scanner/example/android/build.gradle +++ b/fast_barcode_scanner/example/android/build.gradle @@ -1,16 +1,3 @@ -buildscript { - ext.kotlin_version = '1.4.32' - repositories { - google() - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:4.1.3' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - allprojects { repositories { google() @@ -24,6 +11,6 @@ subprojects { project.evaluationDependsOn(':app') } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/fast_barcode_scanner/example/android/gradle/wrapper/gradle-wrapper.properties b/fast_barcode_scanner/example/android/gradle/wrapper/gradle-wrapper.properties index bc6a58af..7aeeb11c 100644 --- a/fast_barcode_scanner/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/fast_barcode_scanner/example/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip diff --git a/fast_barcode_scanner/example/android/settings.gradle b/fast_barcode_scanner/example/android/settings.gradle index 44e62bcf..1c5d14b0 100644 --- a/fast_barcode_scanner/example/android/settings.gradle +++ b/fast_barcode_scanner/example/android/settings.gradle @@ -1,11 +1,25 @@ -include ':app' +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() -def localPropertiesFile = new File(rootProject.projectDir, "local.properties") -def properties = new Properties() + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") -assert localPropertiesFile.exists() -localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} -def flutterSdkPath = properties.getProperty("flutter.sdk") -assert flutterSdkPath != null, "flutter.sdk not set in local.properties" -apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "8.5.1" apply false + id "org.jetbrains.kotlin.android" version "1.9.24" apply false +} + +include ":app" diff --git a/fast_barcode_scanner/example/ios/Podfile.lock b/fast_barcode_scanner/example/ios/Podfile.lock index 0c683580..a901bd1e 100644 --- a/fast_barcode_scanner/example/ios/Podfile.lock +++ b/fast_barcode_scanner/example/ios/Podfile.lock @@ -1,12 +1,12 @@ PODS: - - fast_barcode_scanner (0.0.1): - - Flutter - Flutter (1.0.0) + - icapps_fast_barcode_scanner (0.0.1): + - Flutter - SwiftLint (0.43.1) DEPENDENCIES: - - fast_barcode_scanner (from `.symlinks/plugins/fast_barcode_scanner/ios`) - Flutter (from `Flutter`) + - icapps_fast_barcode_scanner (from `.symlinks/plugins/icapps_fast_barcode_scanner/ios`) - SwiftLint SPEC REPOS: @@ -14,16 +14,16 @@ SPEC REPOS: - SwiftLint EXTERNAL SOURCES: - fast_barcode_scanner: - :path: ".symlinks/plugins/fast_barcode_scanner/ios" Flutter: :path: Flutter + icapps_fast_barcode_scanner: + :path: ".symlinks/plugins/icapps_fast_barcode_scanner/ios" SPEC CHECKSUMS: - fast_barcode_scanner: 0df01447443e9f9c7a6859844d8c4719887100b4 - Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + icapps_fast_barcode_scanner: 83cb3d2c2ff3dc3c15ac27d1c2f51cf6817e184a SwiftLint: 99f82d07b837b942dd563c668de129a03fc3fb52 -PODFILE CHECKSUM: 395641e259d365c89c7b492d0a7bb47b50dab597 +PODFILE CHECKSUM: 6c9fb70112cb51ceae68cd775dd2fea79f8c6640 -COCOAPODS: 1.10.0 +COCOAPODS: 1.15.2 diff --git a/fast_barcode_scanner/example/ios/Runner.xcodeproj/project.pbxproj b/fast_barcode_scanner/example/ios/Runner.xcodeproj/project.pbxproj index 81313534..a444e9b5 100644 --- a/fast_barcode_scanner/example/ios/Runner.xcodeproj/project.pbxproj +++ b/fast_barcode_scanner/example/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -155,7 +155,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1020; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -199,10 +199,12 @@ /* Begin PBXShellScriptBuildPhase section */ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); name = "Thin Binary"; outputPaths = ( @@ -230,6 +232,7 @@ }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -339,7 +342,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -362,7 +365,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.jhoogstraat.fastBarcodeScannerExample; + PRODUCT_BUNDLE_IDENTIFIER = com.icapps.fastBarcodeScannerExample; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -417,7 +420,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -466,7 +469,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -491,7 +494,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.jhoogstraat.fastBarcodeScannerExample; + PRODUCT_BUNDLE_IDENTIFIER = com.icapps.fastBarcodeScannerExample; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -514,7 +517,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.jhoogstraat.fastBarcodeScannerExample; + PRODUCT_BUNDLE_IDENTIFIER = com.icapps.fastBarcodeScannerExample; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/fast_barcode_scanner/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/fast_barcode_scanner/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index a28140cf..e67b2808 100644 --- a/fast_barcode_scanner/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/fast_barcode_scanner/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ UIViewControllerBasedStatusBarAppearance + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + diff --git a/fast_barcode_scanner/example/lib/scanner_screen.dart b/fast_barcode_scanner/example/lib/scanner_screen.dart index 2ced323c..acf02e83 100644 --- a/fast_barcode_scanner/example/lib/scanner_screen.dart +++ b/fast_barcode_scanner/example/lib/scanner_screen.dart @@ -1,7 +1,8 @@ import 'dart:async'; -import 'package:fast_barcode_scanner/fast_barcode_scanner.dart'; import 'package:flutter/material.dart'; +import 'package:icapps_fast_barcode_scanner/icapps_fast_barcode_scanner.dart'; + import 'detections_counter.dart'; final codeStream = StreamController.broadcast(); @@ -15,6 +16,19 @@ class ScannerScreen extends StatefulWidget { class _ScannerScreenState extends State { final _torchIconState = ValueNotifier(false); + bool _canChangeCamera = false; + + @override + void initState() { + super.initState(); + WidgetsBinding.instance + .addPostFrameCallback((_) => _checkCanChangeCamera()); + } + + Future _checkCanChangeCamera() async { + _canChangeCamera = await CameraController.instance.canChangeCamera(); + setState(() {}); + } @override Widget build(BuildContext context) { @@ -42,6 +56,11 @@ class _ScannerScreenState extends State { }, ), ), + if (_canChangeCamera) + IconButton( + icon: const Icon(Icons.cameraswitch), + onPressed: CameraController.instance.toggleCamera, + ), ], ), body: BarcodeCamera( diff --git a/fast_barcode_scanner/example/pubspec.yaml b/fast_barcode_scanner/example/pubspec.yaml index fc386e2a..dc0aae65 100644 --- a/fast_barcode_scanner/example/pubspec.yaml +++ b/fast_barcode_scanner/example/pubspec.yaml @@ -1,6 +1,7 @@ name: fast_barcode_scanner_example description: Demonstrates how to use the fast_barcode_scanner plugin. publish_to: 'none' +version: 0.0.1+1 environment: sdk: '>=2.12.0 <3.0.0' @@ -9,11 +10,15 @@ dependencies: flutter: sdk: flutter - fast_barcode_scanner: + icapps_fast_barcode_scanner: path: ../ dev_dependencies: flutter_lints: ^1.0.4 +dependency_overrides: + icapps_fast_barcode_scanner_platform_interface: + path: ../../fast_barcode_scanner_platform_interface/ + flutter: uses-material-design: true \ No newline at end of file diff --git a/fast_barcode_scanner/ios/Classes/BarcodeReader.swift b/fast_barcode_scanner/ios/Classes/BarcodeReader.swift index b1c2a333..d1793f1f 100644 --- a/fast_barcode_scanner/ios/Classes/BarcodeReader.swift +++ b/fast_barcode_scanner/ios/Classes/BarcodeReader.swift @@ -23,22 +23,22 @@ let avMetadataObjectTypes: [String: AVMetadataObject.ObjectType] = "pdf417": .pdf417, "qr": .qr, "upcE": .upce, - "interleaved": .interleaved2of5 -] + "interleaved": .interleaved2of5, + ] -let cameraPositions: [String: AVCaptureDevice.Position] = [ - "front": .front, - "back": .back +let cameraPositions: [String: AVCaptureDevice.Position] = [ + "front": .front, + "back": .back, ] // Reverse lookup flutter type -let flutterMetadataObjectTypes = Dictionary(uniqueKeysWithValues: avMetadataObjectTypes.map({ ($1, $0) })) +let flutterMetadataObjectTypes = Dictionary(uniqueKeysWithValues: avMetadataObjectTypes.map { ($1, $0) }) enum ReaderError: Error { case noInputDevice case cameraNotSuitable(Resolution, Framerate) - case unauthorized - case configurationLockError(Error) + case unauthorized + case configurationLockError(Error) } enum Resolution: String { @@ -88,43 +88,65 @@ class BarcodeReader: NSObject { var captureDevice: AVCaptureDevice! var captureSession: AVCaptureSession let dataOutput: AVCaptureVideoDataOutput - var metadataOutput: AVCaptureMetadataOutput + + var metadataOutput: AVCaptureMetadataOutput let codeCallback: ([String]) -> Void + + var position: AVCaptureDevice.Position let detectionMode: DetectionMode - let position: AVCaptureDevice.Position + let framerate: Framerate + let resolution: Resolution + let codes: [String] + var torchActiveOnStop = false + var isForcePaused = false var previewSize: CMVideoDimensions! init(textureRegistry: FlutterTextureRegistry, - arguments: StartArgs, - codeCallback: @escaping ([String]) -> Void) throws { + arguments: StartArgs, + codeCallback: @escaping ([String]) -> Void) throws + { self.textureRegistry = textureRegistry self.codeCallback = codeCallback - self.captureSession = AVCaptureSession() - self.dataOutput = AVCaptureVideoDataOutput() - self.metadataOutput = AVCaptureMetadataOutput() - self.detectionMode = arguments.detectionMode - self.position = arguments.position + + captureSession = AVCaptureSession() + dataOutput = AVCaptureVideoDataOutput() + metadataOutput = AVCaptureMetadataOutput() + + detectionMode = arguments.detectionMode + position = arguments.position + framerate = arguments.framerate + resolution = arguments.resolution + codes = arguments.codes + super.init() + do { + try setupCaptureDevice(arguments) + } catch { + throw error + } + } + + private func setupCaptureDevice(_ arguments: StartArgs) throws { captureDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: position) guard captureDevice != nil else { throw ReaderError.noInputDevice } - do { - let input = try AVCaptureDeviceInput(device: captureDevice) - captureSession.addInput(input) - } catch let error as AVError { - if error.code == AVError.applicationIsNotAuthorizedToUseDevice { - throw ReaderError.unauthorized - } - throw error - } + do { + let input = try AVCaptureDeviceInput(device: captureDevice) + captureSession.addInput(input) + } catch let error as AVError { + if error.code == AVError.applicationIsNotAuthorizedToUseDevice { + throw ReaderError.unauthorized + } + throw error + } - captureSession.addOutput(dataOutput) - captureSession.addOutput(metadataOutput) + captureSession.addOutput(dataOutput) + captureSession.addOutput(metadataOutput) dataOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_32BGRA] dataOutput.connection(with: .video)?.videoOrientation = .portrait @@ -146,45 +168,45 @@ class BarcodeReader: NSObject { throw ReaderError.cameraNotSuitable(arguments.resolution, arguments.framerate) } - do { - try captureDevice.lockForConfiguration() - captureDevice.activeFormat = optimalFormat - captureDevice.activeVideoMinFrameDuration = - optimalFormat.videoSupportedFrameRateRanges.first!.minFrameDuration - captureDevice.activeVideoMaxFrameDuration = - optimalFormat.videoSupportedFrameRateRanges.first!.minFrameDuration - captureDevice.unlockForConfiguration() - } catch { - throw ReaderError.configurationLockError(error) - } + do { + try captureDevice.lockForConfiguration() + captureDevice.activeFormat = optimalFormat + captureDevice.activeVideoMinFrameDuration = + optimalFormat.videoSupportedFrameRateRanges.first!.minFrameDuration + captureDevice.activeVideoMaxFrameDuration = + optimalFormat.videoSupportedFrameRateRanges.first!.minFrameDuration + captureDevice.unlockForConfiguration() + } catch { + throw ReaderError.configurationLockError(error) + } previewSize = CMVideoFormatDescriptionGetDimensions(captureDevice.activeFormat.formatDescription) } func start(fromPause: Bool) throws { - guard captureDevice != nil else { return } + guard captureDevice != nil else { return } captureSession.startRunning() if !fromPause { - self.textureId = textureRegistry.register(self) + textureId = textureRegistry.register(self) } - if (torchActiveOnStop) { - do { - try captureDevice.lockForConfiguration() - captureDevice.torchMode = .on - captureDevice.unlockForConfiguration() - torchActiveOnStop = false - } catch { - throw ReaderError.configurationLockError(error) - } + if torchActiveOnStop { + do { + try captureDevice.lockForConfiguration() + captureDevice.torchMode = .on + captureDevice.unlockForConfiguration() + torchActiveOnStop = false + } catch { + throw ReaderError.configurationLockError(error) + } } } func stop(pause: Bool) { - guard captureDevice != nil else { return } - + guard captureDevice != nil else { return } + torchActiveOnStop = captureDevice.isTorchActive captureSession.stopRunning() if !pause { @@ -195,21 +217,23 @@ class BarcodeReader: NSObject { } func toggleTorch() -> Bool { - guard captureDevice != nil && captureDevice.isTorchAvailable else { return false } + guard captureDevice != nil, captureDevice.isTorchAvailable else { return false } do { - try captureDevice.lockForConfiguration() - captureDevice.torchMode = captureDevice.isTorchActive ? .off : .on - captureDevice.unlockForConfiguration() } catch { - print(error) - return false - } + try captureDevice.lockForConfiguration() + captureDevice.torchMode = captureDevice.isTorchActive ? .off : .on + captureDevice.unlockForConfiguration() + } catch { + print(error) + return false + } return captureDevice.isTorchActive } func pauseIfRequired(force: Bool = false) { if force { + isForcePaused = true stop(pause: true) } else { switch detectionMode { @@ -224,20 +248,61 @@ class BarcodeReader: NSObject { func resume() throws { switch detectionMode { - case .continuous: return + case .continuous: + if(isForcePaused){ + isForcePaused = false + try start(fromPause: true) + } + return case .pauseDetection: - guard !captureSession.outputs.contains(metadataOutput) else { return } + guard !captureSession.outputs.contains(metadataOutput) else { return } - let types = metadataOutput.metadataObjectTypes - metadataOutput = AVCaptureMetadataOutput() - metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.global(qos: .default)) - metadataOutput.metadataObjectTypes = types + let types = metadataOutput.metadataObjectTypes + metadataOutput = AVCaptureMetadataOutput() + metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.global(qos: .default)) + metadataOutput.metadataObjectTypes = types captureSession.addOutput(metadataOutput) case .pauseVideo: try start(fromPause: true) } } + func changeCamera(type: String) { + position = type == "front" ? .front : .back + reloadCamera() + } + + func toggleCamera() { + position = position.toggled() + reloadCamera() + } + + private func reloadCamera() { + captureSession.stopRunning() + + captureSession.outputs.forEach { captureSession.removeOutput($0) } + captureSession.inputs.forEach { captureSession.removeInput($0) } + + do { + let arguments = StartArgs(position: position, detectionMode: detectionMode, framerate: framerate, resolution: resolution, codes: codes) + try setupCaptureDevice(arguments) + } catch { + print(error) + } + + captureSession.startRunning() + } +} + +private extension AVCaptureDevice.Position { + func toggled() -> AVCaptureDevice.Position { + switch self { + case .back: + return .front + default: + return .back + } + } } extension BarcodeReader: FlutterTexture { @@ -248,9 +313,10 @@ extension BarcodeReader: FlutterTexture { extension BarcodeReader: AVCaptureVideoDataOutputSampleBufferDelegate { // runs on dispatch queue - func captureOutput(_ output: AVCaptureOutput, - didOutput sampleBuffer: CMSampleBuffer, - from connection: AVCaptureConnection) { + func captureOutput(_: AVCaptureOutput, + didOutput sampleBuffer: CMSampleBuffer, + from _: AVCaptureConnection) + { pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) textureRegistry.textureFrameAvailable(textureId) } @@ -258,13 +324,14 @@ extension BarcodeReader: AVCaptureVideoDataOutputSampleBufferDelegate { extension BarcodeReader: AVCaptureMetadataOutputObjectsDelegate { // runs on dispatch queue - func metadataOutput(_ output: AVCaptureMetadataOutput, - didOutput metadataObjects: [AVMetadataObject], - from connection: AVCaptureConnection) { + func metadataOutput(_: AVCaptureMetadataOutput, + didOutput metadataObjects: [AVMetadataObject], + from _: AVCaptureConnection) + { guard let metadata = metadataObjects.first, let readableCode = metadata as? AVMetadataMachineReadableCodeObject - else { return } + else { return } pauseIfRequired() @@ -279,7 +346,7 @@ extension FourCharCode { CChar(self >> 16 & 0xFF), CChar(self >> 8 & 0xFF), CChar(self & 0xFF), - 0 + 0, ]) } } diff --git a/fast_barcode_scanner/ios/Classes/FastBarcodeScannerPlugin.swift b/fast_barcode_scanner/ios/Classes/FastBarcodeScannerPlugin.swift index 83e6ceb8..656d8999 100644 --- a/fast_barcode_scanner/ios/Classes/FastBarcodeScannerPlugin.swift +++ b/fast_barcode_scanner/ios/Classes/FastBarcodeScannerPlugin.swift @@ -20,6 +20,14 @@ struct StartArgs { self.detectionMode = detectionMode self.codes = codes } + + init(position: AVCaptureDevice.Position, detectionMode: DetectionMode, framerate: Framerate, resolution: Resolution, codes: [String]) { + self.position = position + self.detectionMode = detectionMode + self.framerate = framerate + self.resolution = resolution + self.codes = codes + } let position: AVCaptureDevice.Position let framerate: Framerate @@ -41,7 +49,7 @@ public class FastBarcodeScannerPlugin: NSObject, FlutterPlugin { } public static func register(with registrar: FlutterPluginRegistrar) { - let channel = FlutterMethodChannel(name: "com.jhoogstraat/fast_barcode_scanner", + let channel = FlutterMethodChannel(name: "com.icapps/icapps_fast_barcode_scanner", binaryMessenger: registrar.messenger()) let instance = FastBarcodeScannerPlugin(channel: channel, textureRegistry: registrar.textures()) registrar.addMethodCallDelegate(instance, channel: channel) @@ -55,7 +63,10 @@ public class FastBarcodeScannerPlugin: NSObject, FlutterPlugin { case "pause": pause(result: result) case "resume": try resume(result: result) case "toggleTorch": toggleTorch(result: result) + case "canChangeCamera": canChangeCamera(result: result) case "heartBeat": result(nil) + case "changeCamera": changeCamera(call: call, result: result) + case "toggleCamera": toggleCamera(result: result) default: result(FlutterMethodNotImplemented) } } catch { @@ -131,9 +142,27 @@ public class FastBarcodeScannerPlugin: NSObject, FlutterPlugin { result(reader?.toggleTorch()) } + func canChangeCamera(result: @escaping FlutterResult) { + result(true) + } + func stop(result: @escaping FlutterResult) { reader?.stop(pause: false) reader = nil result(nil) } + + func changeCamera(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let type = call.arguments as? String else { + result(false) + return + } + reader?.changeCamera(type: type) + result(true) + } + + func toggleCamera(result: @escaping FlutterResult) { + reader?.toggleCamera() + result(true) + } } diff --git a/fast_barcode_scanner/ios/fast_barcode_scanner.podspec b/fast_barcode_scanner/ios/icapps_fast_barcode_scanner.podspec similarity index 80% rename from fast_barcode_scanner/ios/fast_barcode_scanner.podspec rename to fast_barcode_scanner/ios/icapps_fast_barcode_scanner.podspec index eb0adf99..c6e5ab98 100644 --- a/fast_barcode_scanner/ios/fast_barcode_scanner.podspec +++ b/fast_barcode_scanner/ios/icapps_fast_barcode_scanner.podspec @@ -3,15 +3,15 @@ # Run `pod lib lint fast_barcode_scanner.podspec' to validate before publishing. # Pod::Spec.new do |s| - s.name = 'fast_barcode_scanner' + s.name = 'icapps_fast_barcode_scanner' s.version = '0.0.1' s.summary = 'A fast barcode scanner using ML Kit on Android and AVFoundation on iOS.' s.description = <<-DESC A fast barcode scanner using ML Kit on Android and AVFoundation on iOS. DESC - s.homepage = 'https://github.com/jhoogstraat/fast_barcode_scanner' + s.homepage = 'https://github.com/icapps/icapps_fast_barcode_scanner.git' s.license = { :file => '../LICENSE' } - s.author = { 'Joshua Hoogstraat' => 'https://github.com/jhoogstraat' } + s.author = { 'Icapps' => 'https://github.com/icapps' } s.source = { :path => '.' } s.source_files = 'Classes/**/*' s.dependency 'Flutter' diff --git a/fast_barcode_scanner/lib/fast_barcode_scanner.dart b/fast_barcode_scanner/lib/fast_barcode_scanner.dart deleted file mode 100644 index 45435f4f..00000000 --- a/fast_barcode_scanner/lib/fast_barcode_scanner.dart +++ /dev/null @@ -1,13 +0,0 @@ -export 'package:fast_barcode_scanner/src/barcode_camera.dart'; -export 'package:fast_barcode_scanner/src/camera_controller.dart'; -export 'package:fast_barcode_scanner/src/overlays/blur_overlay.dart'; -export 'package:fast_barcode_scanner/src/overlays/material_overlay.dart'; -export 'package:fast_barcode_scanner_platform_interface/fast_barcode_scanner_platform_interface.dart' - show - Barcode, - BarcodeType, - Framerate, - Resolution, - DetectionMode, - CameraPosition, - PreviewConfiguration; diff --git a/fast_barcode_scanner/lib/icapps_fast_barcode_scanner.dart b/fast_barcode_scanner/lib/icapps_fast_barcode_scanner.dart new file mode 100644 index 00000000..9a208560 --- /dev/null +++ b/fast_barcode_scanner/lib/icapps_fast_barcode_scanner.dart @@ -0,0 +1,13 @@ +export 'package:icapps_fast_barcode_scanner/src/barcode_camera.dart'; +export 'package:icapps_fast_barcode_scanner/src/camera_controller.dart'; +export 'package:icapps_fast_barcode_scanner/src/overlays/blur_overlay.dart'; +export 'package:icapps_fast_barcode_scanner/src/overlays/material_overlay.dart'; +export 'package:icapps_fast_barcode_scanner_platform_interface/icapps_fast_barcode_scanner_platform_interface.dart' + show + Barcode, + BarcodeType, + Framerate, + Resolution, + DetectionMode, + CameraPosition, + PreviewConfiguration; diff --git a/fast_barcode_scanner/lib/src/barcode_camera.dart b/fast_barcode_scanner/lib/src/barcode_camera.dart index fb2c24d8..effcaa2b 100644 --- a/fast_barcode_scanner/lib/src/barcode_camera.dart +++ b/fast_barcode_scanner/lib/src/barcode_camera.dart @@ -1,10 +1,6 @@ -import 'dart:ui'; - -import 'package:fast_barcode_scanner/src/camera_controller.dart'; -import 'package:fast_barcode_scanner_platform_interface/fast_barcode_scanner_platform_interface.dart'; -import 'package:flutter/foundation.dart'; +import 'package:icapps_fast_barcode_scanner/src/camera_controller.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; +import 'package:icapps_fast_barcode_scanner_platform_interface/icapps_fast_barcode_scanner_platform_interface.dart'; typedef ErrorCallback = Widget Function(BuildContext context, Object? error); diff --git a/fast_barcode_scanner/lib/src/camera_controller.dart b/fast_barcode_scanner/lib/src/camera_controller.dart index d88e69b0..8b968782 100644 --- a/fast_barcode_scanner/lib/src/camera_controller.dart +++ b/fast_barcode_scanner/lib/src/camera_controller.dart @@ -1,12 +1,17 @@ import 'dart:async'; -import 'package:fast_barcode_scanner_platform_interface/fast_barcode_scanner_platform_interface.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; +import 'package:icapps_fast_barcode_scanner_platform_interface/icapps_fast_barcode_scanner_platform_interface.dart'; class CameraConfiguration { - const CameraConfiguration(this.types, this.resolution, this.framerate, - this.detectionMode, this.position); + const CameraConfiguration( + this.types, + this.resolution, + this.framerate, + this.detectionMode, + this.position, + ); /// The types the scanner should look out for. /// @@ -38,6 +43,7 @@ class CameraState { PreviewConfiguration? _previewConfig; bool _torchState = false; bool _togglingTorch = false; + CameraPosition? position; Object? _error; Object? get error => _error; @@ -73,13 +79,15 @@ class CameraController { /// method repeatedly. /// Events and errors are received via the current state's eventNotifier. Future initialize( - List types, - Resolution resolution, - Framerate framerate, - DetectionMode detectionMode, - CameraPosition position, - void Function(Barcode)? onScan) async { + List types, + Resolution resolution, + Framerate framerate, + DetectionMode detectionMode, + CameraPosition position, + void Function(Barcode)? onScan, + ) async { state.eventNotifier.value = CameraEvent.init; + state.position = position; try { if (state.isInitialized) await _platform.dispose(); @@ -168,6 +176,18 @@ class CameraController { } } + /// Toggles the camera, if available. + /// + /// + Future toggleCamera() async { + state.position = state.position == CameraPosition.back + ? CameraPosition.front + : CameraPosition.back; + return changeCamera(state.position!); + } + + Future canChangeCamera() => _platform.canChangeCamera(); + Future changeCamera(CameraPosition position) async { try { await _platform.changeCamera(position); diff --git a/fast_barcode_scanner/lib/src/overlays/blur_overlay.dart b/fast_barcode_scanner/lib/src/overlays/blur_overlay.dart index 24b6cab0..999502cf 100644 --- a/fast_barcode_scanner/lib/src/overlays/blur_overlay.dart +++ b/fast_barcode_scanner/lib/src/overlays/blur_overlay.dart @@ -1,6 +1,6 @@ import 'dart:ui'; -import 'package:fast_barcode_scanner/src/camera_controller.dart'; +import 'package:icapps_fast_barcode_scanner/src/camera_controller.dart'; import 'package:flutter/material.dart'; class BlurPreviewOverlay extends StatelessWidget { diff --git a/fast_barcode_scanner/pubspec.yaml b/fast_barcode_scanner/pubspec.yaml index d4038769..ae8c9fc0 100644 --- a/fast_barcode_scanner/pubspec.yaml +++ b/fast_barcode_scanner/pubspec.yaml @@ -1,17 +1,17 @@ -name: fast_barcode_scanner +name: icapps_fast_barcode_scanner description: A fast barcode scanner using MLKit on Android and AVFoundation on iOS. -version: 1.1.4 +version: 1.5.1 homepage: https://github.com/jhoogstraat/fast_barcode_scanner repository: https://github.com/jhoogstraat/fast_barcode_scanner environment: - sdk: ">=2.12.0 <3.0.0" - flutter: ">=2.0.0" + sdk: ">=3.0.0 <4.0.0" + flutter: ">=1.10.0" dependencies: flutter: sdk: flutter - fast_barcode_scanner_platform_interface: ^1.0.4 + icapps_fast_barcode_scanner_platform_interface: ^1.2.0 dev_dependencies: flutter_test: @@ -22,7 +22,7 @@ flutter: plugin: platforms: android: - package: com.jhoogstraat.fast_barcode_scanner + package: com.icapps.icapps_fast_barcode_scanner pluginClass: FastBarcodeScannerPlugin ios: pluginClass: FastBarcodeScannerPlugin diff --git a/fast_barcode_scanner/test/fast_barcode_scanner_test.dart b/fast_barcode_scanner/test/fast_barcode_scanner_test.dart index bce9dcff..17fd3b9e 100644 --- a/fast_barcode_scanner/test/fast_barcode_scanner_test.dart +++ b/fast_barcode_scanner/test/fast_barcode_scanner_test.dart @@ -2,18 +2,20 @@ import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { - const MethodChannel channel = MethodChannel('fast_barcode_scanner'); + const MethodChannel channel = MethodChannel('icapps_fast_barcode_scanner'); TestWidgetsFlutterBinding.ensureInitialized(); setUp(() { - channel.setMockMethodCallHandler((MethodCall methodCall) async { + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(channel, (MethodCall methodCall) async { return '42'; }); }); tearDown(() { - channel.setMockMethodCallHandler(null); + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(channel, null); }); test('getPlatformVersion', () async { diff --git a/fast_barcode_scanner_platform_interface/CHANGELOG.md b/fast_barcode_scanner_platform_interface/CHANGELOG.md index 539a24d0..e553a9de 100644 --- a/fast_barcode_scanner_platform_interface/CHANGELOG.md +++ b/fast_barcode_scanner_platform_interface/CHANGELOG.md @@ -1,3 +1,11 @@ +## 1.4.0 + +- Further rename to icapps_fast_barcode_scanner + +## 1.3.0 + +* Forked to icapps_fast_barcode_scanner_platform_interface + ## 1.0.4 * Smaller code cleanups diff --git a/fast_barcode_scanner_platform_interface/lib/fast_barcode_scanner_platform_interface.dart b/fast_barcode_scanner_platform_interface/lib/fast_barcode_scanner_platform_interface.dart deleted file mode 100644 index 8d2b4c4b..00000000 --- a/fast_barcode_scanner_platform_interface/lib/fast_barcode_scanner_platform_interface.dart +++ /dev/null @@ -1,4 +0,0 @@ -export 'package:fast_barcode_scanner_platform_interface/src/fast_barcode_scanner_platform_interface.dart'; -export 'package:fast_barcode_scanner_platform_interface/src/types/barcode.dart'; -export 'package:fast_barcode_scanner_platform_interface/src/types/barcode_type.dart'; -export 'package:fast_barcode_scanner_platform_interface/src/types/preview_configuration.dart'; diff --git a/fast_barcode_scanner_platform_interface/lib/icapps_fast_barcode_scanner_platform_interface.dart b/fast_barcode_scanner_platform_interface/lib/icapps_fast_barcode_scanner_platform_interface.dart new file mode 100644 index 00000000..02d8aee7 --- /dev/null +++ b/fast_barcode_scanner_platform_interface/lib/icapps_fast_barcode_scanner_platform_interface.dart @@ -0,0 +1,4 @@ +export 'package:icapps_fast_barcode_scanner_platform_interface/src/fast_barcode_scanner_platform_interface.dart'; +export 'package:icapps_fast_barcode_scanner_platform_interface/src/types/barcode.dart'; +export 'package:icapps_fast_barcode_scanner_platform_interface/src/types/barcode_type.dart'; +export 'package:icapps_fast_barcode_scanner_platform_interface/src/types/preview_configuration.dart'; diff --git a/fast_barcode_scanner_platform_interface/lib/src/fast_barcode_scanner_platform_interface.dart b/fast_barcode_scanner_platform_interface/lib/src/fast_barcode_scanner_platform_interface.dart index c53f6c9b..b10ce0a3 100644 --- a/fast_barcode_scanner_platform_interface/lib/src/fast_barcode_scanner_platform_interface.dart +++ b/fast_barcode_scanner_platform_interface/lib/src/fast_barcode_scanner_platform_interface.dart @@ -68,6 +68,10 @@ abstract class FastBarcodeScannerPlatform extends PlatformInterface { throw UnimplementedError('changeCamera() has not been implemented'); } + Future canChangeCamera() { + throw UnimplementedError('canChangeCamera() has not been implemented'); + } + /// Set the method to be called when a barcode is detected void setOnDetectHandler(void Function(Barcode) handler) { throw UnimplementedError('setOnReadHandler() has not been implemented'); diff --git a/fast_barcode_scanner_platform_interface/lib/src/method_channel_fast_barcode_scanner.dart b/fast_barcode_scanner_platform_interface/lib/src/method_channel_fast_barcode_scanner.dart index 255bd42d..355c7511 100644 --- a/fast_barcode_scanner_platform_interface/lib/src/method_channel_fast_barcode_scanner.dart +++ b/fast_barcode_scanner_platform_interface/lib/src/method_channel_fast_barcode_scanner.dart @@ -10,7 +10,7 @@ import 'fast_barcode_scanner_platform_interface.dart'; class MethodChannelFastBarcodeScanner extends FastBarcodeScannerPlatform { static const MethodChannel _channel = - MethodChannel('com.jhoogstraat/fast_barcode_scanner'); + MethodChannel('com.icapps/icapps_fast_barcode_scanner'); void Function(Barcode)? _onDetectHandler; @@ -68,6 +68,10 @@ class MethodChannelFastBarcodeScanner extends FastBarcodeScannerPlatform { .invokeMethod('changeCamera', describeEnum(position)) .then((success) => success); + @override + Future canChangeCamera() => + _channel.invokeMethod('canChangeCamera').then((success) => success); + @override void setOnDetectHandler(void Function(Barcode) handler) => _onDetectHandler = handler; diff --git a/fast_barcode_scanner_platform_interface/lib/src/types/barcode.dart b/fast_barcode_scanner_platform_interface/lib/src/types/barcode.dart index 7639f92c..abb05bff 100644 --- a/fast_barcode_scanner_platform_interface/lib/src/types/barcode.dart +++ b/fast_barcode_scanner_platform_interface/lib/src/types/barcode.dart @@ -1,6 +1,6 @@ import 'package:flutter/foundation.dart'; -import '../../fast_barcode_scanner_platform_interface.dart'; +import '../../icapps_fast_barcode_scanner_platform_interface.dart'; /// Describes a Barcode with type and value. /// [Barcode] are equatable. diff --git a/fast_barcode_scanner_platform_interface/pubspec.yaml b/fast_barcode_scanner_platform_interface/pubspec.yaml index c7d17b6a..a77e779c 100644 --- a/fast_barcode_scanner_platform_interface/pubspec.yaml +++ b/fast_barcode_scanner_platform_interface/pubspec.yaml @@ -1,12 +1,11 @@ -name: fast_barcode_scanner_platform_interface +name: icapps_fast_barcode_scanner_platform_interface description: A common platform interface for the fast_barcode_scanner plugin. homepage: https://github.com/jhoogstraat/fast_barcode_scanner/tree/master/fast_barcode_scanner_platform_interface repository: https://github.com/jhoogstraat/fast_barcode_scanner -version: 1.0.4 +version: 1.4.0 environment: - sdk: '>=2.12.0 <3.0.0' - flutter: ">=2.0.0" + sdk: '>=3.0.0 <4.0.0' dependencies: flutter: