Skip to content

Commit dff6d31

Browse files
committed
firstCommit
1 parent 4666de7 commit dff6d31

36 files changed

+1526
-104
lines changed

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ plugins {
22
alias(libs.plugins.androidLibrary) apply false
33
alias(libs.plugins.kotlinMultiplatform) apply false
44
alias(libs.plugins.vanniktech.mavenPublish) apply false
5+
alias(libs.plugins.compose.compiler) apply false
56
}

gradle.properties

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,6 @@ kotlin.mpp.enableCInteropCommonization=true
1010
#Android
1111
android.useAndroidX=true
1212
android.nonTransitiveRClass=true
13+
android.suppressUnsupportedCompileSdk=35
14+
org.gradle.parallel=false
15+
kotlin.incremental=false

gradle/libs.versions.toml

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,43 @@
11
[versions]
2+
accompanistPermissions = "0.30.1"
23
agp = "8.5.0"
4+
barcodeScanning = "17.2.0"
5+
cameraCore = "1.2.3"
6+
cameraView = "1.4.0"
7+
core = "3.4.1"
38
kotlin = "2.0.20"
49
android-minSdk = "24"
510
android-compileSdk = "34"
11+
compose = "1.7.1"
12+
androidx-activityCompose = "1.8.0"
13+
kotlinxCoroutinesCore = "1.7.3"
14+
runtimeAndroid = "1.7.6"
15+
ui = "1.4.0"
16+
zxingAndroidEmbedded = "4.3.0"
617

718
[libraries]
19+
accompanist-permissions = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanistPermissions" }
20+
androidx-camera-camera2 = { module = "androidx.camera:camera-camera2", version.ref = "cameraCore" }
21+
androidx-camera-core = { module = "androidx.camera:camera-core", version.ref = "cameraCore" }
22+
androidx-camera-lifecycle = { module = "androidx.camera:camera-lifecycle", version.ref = "cameraCore" }
23+
androidx-camera-view = { module = "androidx.camera:camera-view", version.ref = "cameraView" }
24+
androidx-ui = { module = "androidx.compose.ui:ui", version.ref = "ui" }
25+
androidx-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview", version.ref = "ui" }
26+
barcode-scanning = { module = "com.google.mlkit:barcode-scanning", version.ref = "barcodeScanning" }
27+
core = { module = "com.google.zxing:core", version.ref = "core" }
828
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
29+
compose-ui = { module = "org.jetbrains.compose.ui:ui", version.ref = "compose" }
30+
compose-animation = { module = "org.jetbrains.compose.animation:animation", version.ref = "compose" }
31+
compose-foundation = { module = "org.jetbrains.compose.foundation:foundation", version.ref = "compose" }
32+
compose-material = { module = "org.jetbrains.compose.material:material", version.ref = "compose" }
33+
compose-runtime = { module = "org.jetbrains.compose.runtime:runtime", version.ref = "compose" }
34+
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activityCompose" }
35+
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinxCoroutinesCore" }
36+
zxing-android-embedded = { module = "com.journeyapps:zxing-android-embedded", version.ref = "zxingAndroidEmbedded" }
37+
938

1039
[plugins]
1140
androidLibrary = { id = "com.android.library", version.ref = "agp" }
1241
kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
13-
vanniktech-mavenPublish = { id = "com.vanniktech.maven.publish", version = "0.29.0" }
42+
vanniktech-mavenPublish = { id = "com.vanniktech.maven.publish", version = "0.29.0" }
43+
compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version = "2.0.21" }

library/build.gradle.kts

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1-
import com.vanniktech.maven.publish.SonatypeHost
21
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
32
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
43

54
plugins {
65
alias(libs.plugins.kotlinMultiplatform)
76
alias(libs.plugins.androidLibrary)
87
alias(libs.plugins.vanniktech.mavenPublish)
8+
alias(libs.plugins.compose.compiler)
9+
`maven-publish`
910
}
1011

11-
group = "io.github.kotlin"
12+
group = "io.github.ismoy.BelZSpeedScan"
1213
version = "1.0.0"
1314

1415
kotlin {
@@ -17,37 +18,78 @@ kotlin {
1718
publishLibraryVariants("release")
1819
@OptIn(ExperimentalKotlinGradlePluginApi::class)
1920
compilerOptions {
20-
jvmTarget.set(JvmTarget.JVM_1_8)
21+
jvmTarget.set(JvmTarget.JVM_11)
2122
}
2223
}
24+
2325
iosX64()
2426
iosArm64()
2527
iosSimulatorArm64()
26-
linuxX64()
27-
28+
@OptIn(ExperimentalKotlinGradlePluginApi::class)
29+
targetHierarchy.default()
2830
sourceSets {
2931
val commonMain by getting {
3032
dependencies {
31-
//put your multiplatform dependencies here
33+
api(libs.compose.runtime)
34+
implementation(libs.compose.ui)
35+
implementation(libs.compose.animation)
36+
implementation(libs.compose.foundation)
37+
implementation(libs.compose.material)
3238
}
3339
}
3440
val commonTest by getting {
3541
dependencies {
3642
implementation(libs.kotlin.test)
3743
}
3844
}
45+
val androidMain by getting {
46+
dependencies {
47+
implementation(libs.androidx.activity.compose)
48+
implementation (libs.androidx.camera.core)
49+
implementation (libs.androidx.camera.camera2)
50+
implementation (libs.androidx.camera.lifecycle)
51+
implementation (libs.androidx.camera.view)
52+
implementation (libs.accompanist.permissions)
53+
implementation(libs.zxing.android.embedded)
54+
implementation(libs.core)
55+
implementation(libs.kotlinx.coroutines.core)
56+
implementation(libs.androidx.ui)
57+
implementation(libs.androidx.ui.tooling.preview)
58+
implementation (libs.barcode.scanning)
59+
}
60+
}
61+
iosMain{
62+
resources.srcDirs("src/iosMain/resources")
63+
tasks.withType<ProcessResources> {
64+
duplicatesStrategy = DuplicatesStrategy.INCLUDE
65+
}
66+
}
3967
}
4068
}
4169

4270
android {
43-
namespace = "org.jetbrains.kotlinx.multiplatform.library.template"
71+
namespace = "io.github.ismoy.BelZSpeedScan"
4472
compileSdk = libs.versions.android.compileSdk.get().toInt()
73+
buildTypes{
74+
release { }
75+
debug { }
76+
}
77+
compileOptions {
78+
sourceCompatibility = JavaVersion.VERSION_11
79+
targetCompatibility = JavaVersion.VERSION_11
80+
}
4581
defaultConfig {
4682
minSdk = libs.versions.android.minSdk.get().toInt()
4783
}
4884
}
85+
publishing{
86+
repositories {
87+
mavenLocal()
88+
}
89+
}
90+
4991

50-
mavenPublishing {
92+
/*mavenPublishing {
5193
publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL)
5294
5395
signAllPublications()
@@ -79,4 +121,4 @@ mavenPublishing {
79121
developerConnection = "ZZZ"
80122
}
81123
}
82-
}
124+
}*/

library/src/androidMain/kotlin/fibiprops.android.kt

Lines changed: 0 additions & 4 deletions
This file was deleted.
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
package io.github.ismoy.belzspeedscan
2+
3+
import io.github.ismoy.belzspeedscan.domain.CodeScanner
4+
import android.content.Context
5+
import android.util.Log
6+
import android.util.Size
7+
import androidx.camera.core.Camera
8+
import androidx.camera.core.CameraSelector
9+
import androidx.camera.core.ImageAnalysis
10+
import androidx.camera.core.Preview
11+
import androidx.camera.lifecycle.ProcessCameraProvider
12+
import androidx.camera.view.PreviewView
13+
import androidx.core.content.ContextCompat
14+
import androidx.lifecycle.LifecycleOwner
15+
import android.media.AudioAttributes
16+
import android.media.SoundPool
17+
import androidx.camera.core.AspectRatio
18+
19+
class AndroidScanner(
20+
private val context: Context,
21+
private val lifecycleOwner: LifecycleOwner,
22+
private val previewView: PreviewView,
23+
private val isQRScanning: Boolean,
24+
var onCodeScanned: (String) -> Unit,
25+
private val playSound: Boolean
26+
) : CodeScanner {
27+
28+
private var cameraProvider: ProcessCameraProvider? = null
29+
private var imageAnalysis: ImageAnalysis? = null
30+
private var preview: Preview? = null
31+
private var camera: Camera? = null
32+
private var isScannerActive = true
33+
private var isAnalyzerBound = false
34+
35+
private var soundPool: SoundPool? = null
36+
private var scanBeepSound: Int = 0
37+
38+
init {
39+
if (playSound) {
40+
setupSound()
41+
}
42+
}
43+
44+
private fun setupSound() {
45+
val audioAttributes = AudioAttributes.Builder()
46+
.setUsage(AudioAttributes.USAGE_NOTIFICATION)
47+
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
48+
.build()
49+
50+
soundPool = SoundPool.Builder()
51+
.setMaxStreams(1)
52+
.setAudioAttributes(audioAttributes)
53+
.build()
54+
55+
scanBeepSound = soundPool?.load(context, com.google.zxing.client.android.R.raw.zxing_beep, 1) ?: 0
56+
}
57+
58+
private fun playBeepSound() {
59+
if (playSound && scanBeepSound != 0) {
60+
soundPool?.play(scanBeepSound, 1f, 1f, 1, 0, 1f)
61+
}
62+
}
63+
64+
override fun startScanning() {
65+
isScannerActive = true
66+
val cameraProviderFuture = ProcessCameraProvider.getInstance(context)
67+
cameraProviderFuture.addListener({
68+
cameraProvider = cameraProviderFuture.get()
69+
bindCameraUseCases()
70+
}, ContextCompat.getMainExecutor(context))
71+
}
72+
73+
private fun bindCameraUseCases() {
74+
if (!isScannerActive) return
75+
76+
try {
77+
cameraProvider?.unbindAll()
78+
79+
preview = Preview.Builder()
80+
.build()
81+
.also {
82+
it.surfaceProvider = previewView.surfaceProvider
83+
}
84+
85+
imageAnalysis = ImageAnalysis.Builder()
86+
.setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_YUV_420_888)
87+
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
88+
.build()
89+
.also {
90+
if (isScannerActive && !isAnalyzerBound) {
91+
it.setAnalyzer(
92+
ContextCompat.getMainExecutor(context),
93+
MLKitBarcodeAnalyzer(
94+
onCodeScanned = { code ->
95+
playBeepSound()
96+
onCodeScanned(code)
97+
},
98+
isQRScanning = isQRScanning
99+
)
100+
)
101+
isAnalyzerBound = true
102+
}
103+
}
104+
105+
val cameraSelector = CameraSelector.Builder()
106+
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
107+
.build()
108+
109+
camera = cameraProvider?.bindToLifecycle(
110+
lifecycleOwner,
111+
cameraSelector,
112+
preview,
113+
imageAnalysis
114+
)
115+
116+
} catch (exc: Exception) {
117+
Log.e("CameraX", "Error al vincular casos de uso", exc)
118+
}
119+
}
120+
121+
override fun pauseScanning() {
122+
try {
123+
isScannerActive = false
124+
isAnalyzerBound = false
125+
imageAnalysis?.clearAnalyzer()
126+
} catch (e: Exception) {
127+
Log.e("CameraX", "Error al pausar el escaner", e)
128+
}
129+
}
130+
131+
override fun resumeScanning() {
132+
try {
133+
if (!isScannerActive) {
134+
isScannerActive = true
135+
bindCameraUseCases()
136+
}
137+
} catch (e: Exception) {
138+
Log.e("CameraX", "Error al reanudar el escaner", e)
139+
}
140+
}
141+
142+
override fun stopScanning() {
143+
try {
144+
isScannerActive = false
145+
isAnalyzerBound = false
146+
imageAnalysis?.clearAnalyzer()
147+
cameraProvider?.unbindAll()
148+
soundPool?.release()
149+
soundPool = null
150+
} catch (e: Exception) {
151+
Log.e("CameraX", "Error al detener el escaner", e)
152+
}
153+
}
154+
}

0 commit comments

Comments
 (0)