Skip to content

Commit cae18b0

Browse files
authored
Merge pull request #12 from tillhub/develop
v.1.4.3
2 parents 57ba0d0 + 650dfe1 commit cae18b0

File tree

17 files changed

+248
-254
lines changed

17 files changed

+248
-254
lines changed

sample/src/main/java/de/tillhub/scanengine/sample/MainActivity.kt

Lines changed: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -12,65 +12,55 @@ import androidx.compose.material3.Button
1212
import androidx.compose.material3.MaterialTheme
1313
import androidx.compose.material3.Surface
1414
import androidx.compose.material3.Text
15-
import androidx.compose.runtime.Composable
1615
import androidx.compose.runtime.mutableStateOf
1716
import androidx.compose.ui.Alignment
1817
import androidx.compose.ui.Modifier
1918
import androidx.compose.ui.unit.dp
20-
import androidx.lifecycle.Lifecycle
2119
import androidx.lifecycle.lifecycleScope
22-
import androidx.lifecycle.repeatOnLifecycle
2320
import de.tillhub.scanengine.ScanEngine
2421
import de.tillhub.scanengine.ScanEvent
22+
import de.tillhub.scanengine.Scanner
2523
import de.tillhub.scanengine.sample.ui.theme.TillhubScanEngineTheme
2624
import kotlinx.coroutines.launch
2725

2826
class MainActivity : ComponentActivity() {
2927

30-
private val scanner by lazy { ScanEngine.getInstance(this).attach(this.lifecycle) }
31-
private val scanCode = mutableStateOf("")
32-
28+
private val scanEngine by lazy { ScanEngine.getInstance(applicationContext) }
29+
private lateinit var scanner: Scanner
30+
private var scanCode = mutableStateOf("")
3331
override fun onCreate(savedInstanceState: Bundle?) {
3432
super.onCreate(savedInstanceState)
35-
lifecycleScope.launch {
36-
lifecycle.repeatOnLifecycle(Lifecycle.State.CREATED) {
37-
scanner.observeScannerResults()
38-
.collect {
39-
scanCode.value = (it as? ScanEvent.Success)?.value.orEmpty()
40-
}
41-
}
42-
}
43-
33+
scanner = scanEngine.newCameraScanner(this).build(this.lifecycle)
4434
setContent {
4535
TillhubScanEngineTheme {
4636
Surface(
4737
modifier = Modifier.fillMaxSize(),
4838
color = MaterialTheme.colorScheme.background
4939
) {
50-
Greeting(scanCode.value) {
51-
scanner.startCameraScanner("key")
40+
Column(
41+
modifier = Modifier.fillMaxSize(),
42+
verticalArrangement = Arrangement.Center,
43+
horizontalAlignment = Alignment.CenterHorizontally
44+
) {
45+
Text(text = scanCode.value)
46+
Spacer(modifier = Modifier.height(36.dp))
47+
Button(
48+
onClick = {
49+
scanner.startCameraScanner("key")
50+
}
51+
) {
52+
Text(text = "Start camera scanner")
53+
}
5254
}
5355
}
5456
}
5557
}
56-
}
57-
}
58+
scanEngine.barcodeScanner.scanWithKey("key")
5859

59-
@Composable
60-
fun Greeting(value: String, onClick: () -> Unit) {
61-
Column(
62-
modifier = Modifier.fillMaxSize(),
63-
verticalArrangement = Arrangement.Center,
64-
horizontalAlignment = Alignment.CenterHorizontally
65-
) {
66-
Text(
67-
text = value
68-
)
69-
Spacer(modifier = Modifier.height(36.dp))
70-
Button(
71-
onClick = onClick
72-
) {
73-
Text(text = "Start camera scanner")
60+
lifecycleScope.launch {
61+
scanEngine.observeScannerResults().collect {
62+
scanCode.value = (it as? ScanEvent.Success)?.value.orEmpty()
63+
}
7464
}
7565
}
7666
}

scan-engine/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ afterEvaluate {
8080
create<MavenPublication>("scan-engine") {
8181
groupId = "de.tillhub.scanengine"
8282
artifactId = "scan-engine"
83-
version = "1.4.2"
83+
version = "1.4.3"
8484

8585
from(components.getByName("release"))
8686
}

scan-engine/src/main/AndroidManifest.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
<activity
1313
android:name="de.tillhub.scanengine.default.ui.GoogleScanningActivity"
1414
android:exported="false"
15-
android:theme="@style/Theme.AppCompat.Light.NoActionBar"
1615
/>
1716
</application>
1817

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,51 @@
11
package de.tillhub.scanengine
22

33
import SingletonHolder
4+
import android.content.Context
45
import androidx.activity.ComponentActivity
56
import androidx.lifecycle.Lifecycle
7+
import de.tillhub.scanengine.barcode.BarcodeScanner
8+
import de.tillhub.scanengine.barcode.DefaultBarcodeScanner
9+
import de.tillhub.scanengine.barcode.SunmiBarcodeScanner
610
import de.tillhub.scanengine.default.DefaultScanner
11+
import de.tillhub.scanengine.helper.ManagerBuilder
712
import de.tillhub.scanengine.sunmi.SunmiScanner
13+
import kotlinx.coroutines.flow.MutableSharedFlow
14+
import kotlinx.coroutines.flow.SharedFlow
815

9-
class ScanEngine private constructor(activity: ComponentActivity) {
16+
class ScanEngine private constructor(context: Context) {
1017

11-
private val scanner: Scanner by lazy {
12-
when (ScannerManufacturer.get()) {
13-
ScannerManufacturer.SUNMI -> SunmiScanner(activity)
14-
ScannerManufacturer.OTHER -> DefaultScanner(activity)
18+
private val mutableScanEvents = MutableSharedFlow<ScanEvent>(extraBufferCapacity = 1)
19+
fun observeScannerResults(): SharedFlow<ScanEvent> = mutableScanEvents
20+
21+
fun newCameraScanner(activity: ComponentActivity): ManagerBuilder<Scanner> {
22+
return object : ManagerBuilder<Scanner> {
23+
override fun build(lifecycle: Lifecycle): Scanner {
24+
return when (ScannerManufacturer.get()) {
25+
ScannerManufacturer.SUNMI -> SunmiScanner(
26+
activity.activityResultRegistry,
27+
activity.savedStateRegistry,
28+
mutableScanEvents
29+
)
30+
31+
ScannerManufacturer.OTHER -> DefaultScanner(
32+
activity.activityResultRegistry,
33+
activity.savedStateRegistry,
34+
mutableScanEvents
35+
)
36+
}.also {
37+
lifecycle.addObserver(it)
38+
}
39+
}
1540
}
1641
}
1742

18-
fun attach(lifecycle: Lifecycle): Scanner {
19-
lifecycle.addObserver(scanner)
20-
return scanner
43+
val barcodeScanner: BarcodeScanner by lazy {
44+
when (ScannerManufacturer.get()) {
45+
ScannerManufacturer.SUNMI -> SunmiBarcodeScanner(context, mutableScanEvents)
46+
ScannerManufacturer.OTHER -> DefaultBarcodeScanner(context, mutableScanEvents)
47+
}
2148
}
2249

23-
companion object : SingletonHolder<ScanEngine, ComponentActivity>(::ScanEngine)
50+
companion object : SingletonHolder<ScanEngine, Context>(::ScanEngine)
2451
}

scan-engine/src/main/java/de/tillhub/scanengine/ScanEventProvider.kt

Lines changed: 0 additions & 17 deletions
This file was deleted.

scan-engine/src/main/java/de/tillhub/scanengine/Scanner.kt

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,13 @@ import androidx.lifecycle.DefaultLifecycleObserver
44
import androidx.savedstate.SavedStateRegistry
55
import kotlinx.coroutines.flow.SharedFlow
66

7-
/**
8-
* Used for connecting and disconnecting a scanner, issue scan commands and observing scanned codes.
9-
*/
107
interface Scanner : DefaultLifecycleObserver, SavedStateRegistry.SavedStateProvider {
11-
12-
/**
13-
* Can be used to observe any scanned code.
14-
*/
158
fun observeScannerResults(): SharedFlow<ScanEvent>
16-
17-
/**
18-
* Start the camera based scanner.
19-
*/
209
fun startCameraScanner(scanKey: String? = null)
2110

22-
/**
23-
* Scan with next key
24-
*/
25-
fun scanNextWithKey(scanKey: String?)
26-
2711
companion object {
12+
const val PROVIDER = "scanner"
13+
const val SCAN_KEY = "scan_key"
2814
const val CAMERA_SCANNER_KEY = "CAMERA_SCANNER_KEY"
2915
}
3016
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package de.tillhub.scanengine
2+
3+
import android.os.Bundle
4+
import androidx.core.os.bundleOf
5+
import androidx.lifecycle.LifecycleOwner
6+
import androidx.savedstate.SavedStateRegistry
7+
import de.tillhub.scanengine.Scanner.Companion.PROVIDER
8+
import de.tillhub.scanengine.Scanner.Companion.SCAN_KEY
9+
import kotlinx.coroutines.flow.MutableSharedFlow
10+
import kotlinx.coroutines.flow.SharedFlow
11+
12+
abstract class ScannerImpl(
13+
private val savedStateRegistry: SavedStateRegistry,
14+
protected val mutableScanEvents: MutableSharedFlow<ScanEvent>
15+
) : Scanner {
16+
17+
protected var scanKey: String? = null
18+
override fun onCreate(owner: LifecycleOwner) {
19+
super.onCreate(owner)
20+
if (savedStateRegistry.getSavedStateProvider(PROVIDER) == null) {
21+
savedStateRegistry.registerSavedStateProvider(PROVIDER, this)
22+
} else {
23+
scanKey = savedStateRegistry.consumeRestoredStateForKey(PROVIDER)
24+
?.getString(SCAN_KEY)
25+
}
26+
}
27+
28+
override fun saveState(): Bundle {
29+
return bundleOf(SCAN_KEY to scanKey)
30+
}
31+
32+
override fun onDestroy(owner: LifecycleOwner) {
33+
super.onDestroy(owner)
34+
savedStateRegistry.unregisterSavedStateProvider(PROVIDER)
35+
}
36+
37+
override fun observeScannerResults(): SharedFlow<ScanEvent> = mutableScanEvents
38+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package de.tillhub.scanengine.barcode
2+
3+
import de.tillhub.scanengine.ScanEvent
4+
import kotlinx.coroutines.flow.Flow
5+
6+
interface BarcodeScanner {
7+
fun observeScannerResults(): Flow<ScanEvent>
8+
fun scanWithKey(scanKey: String? = null)
9+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package de.tillhub.scanengine.barcode
2+
3+
import de.tillhub.scanengine.ScanEvent
4+
import kotlinx.coroutines.flow.Flow
5+
import kotlinx.coroutines.flow.MutableSharedFlow
6+
7+
abstract class BarcodeScannerImpl(protected val mutableScanEvents: MutableSharedFlow<ScanEvent>) : BarcodeScanner {
8+
9+
protected var scanKey: String? = null
10+
11+
override fun observeScannerResults(): Flow<ScanEvent> = mutableScanEvents
12+
13+
override fun scanWithKey(scanKey: String?) {
14+
this.scanKey = scanKey
15+
}
16+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package de.tillhub.scanengine.barcode
2+
3+
import android.content.Context
4+
import de.tillhub.scanengine.ScanEvent
5+
import kotlinx.coroutines.flow.MutableSharedFlow
6+
7+
class DefaultBarcodeScanner(
8+
context: Context,
9+
mutableScanEvents: MutableSharedFlow<ScanEvent>
10+
) : BarcodeScannerImpl(mutableScanEvents)

0 commit comments

Comments
 (0)