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
[](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: