Skip to content

Commit ddd745c

Browse files
authored
Merge pull request #55 from doo/sc_barcode_classical_batch
Sc barcode classical batch
2 parents c48e177 + b3e30cf commit ddd745c

File tree

6 files changed

+238
-19
lines changed

6 files changed

+238
-19
lines changed

example_app/src/main/AndroidManifest.xml

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
</activity>
3030
<activity android:name=".QRScanCameraViewActivity" />
3131
<activity android:name=".BarcodeTypesActivity" />
32+
<activity android:name=".BatchQRScanActivity" />
3233
</application>
3334

3435
</manifest>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
package io.scanbot.example.sdk.barcode
2+
3+
import android.Manifest
4+
import android.content.pm.PackageManager
5+
import android.os.Bundle
6+
import android.view.LayoutInflater
7+
import android.view.View
8+
import android.view.ViewGroup
9+
import android.widget.ImageView
10+
import android.widget.TextView
11+
import android.widget.Toast
12+
import androidx.appcompat.app.AppCompatActivity
13+
import androidx.core.app.ActivityCompat
14+
import androidx.core.content.ContextCompat
15+
import androidx.core.view.WindowCompat
16+
import androidx.recyclerview.widget.LinearLayoutManager
17+
import androidx.recyclerview.widget.RecyclerView
18+
import io.scanbot.example.sdk.barcode.model.BarcodeTypeRepository
19+
import io.scanbot.sdk.SdkLicenseError
20+
import io.scanbot.sdk.barcode.BarcodeDetectorFrameHandler
21+
import io.scanbot.sdk.barcode.entity.BarcodeItem
22+
import io.scanbot.sdk.barcode.entity.BarcodeScanningResult
23+
import io.scanbot.sdk.barcode_scanner.ScanbotBarcodeScannerSDK
24+
import io.scanbot.sdk.camera.FrameHandlerResult
25+
import io.scanbot.sdk.camera.ScanbotCameraView
26+
27+
class BatchQRScanActivity : AppCompatActivity(), BarcodeDetectorFrameHandler.ResultHandler {
28+
29+
private lateinit var cameraView: ScanbotCameraView
30+
private lateinit var resultView: RecyclerView
31+
private lateinit var flash: View
32+
private var flashEnabled = false
33+
private var barcodeDetectorFrameHandler: BarcodeDetectorFrameHandler? = null
34+
private val resultAdapter by lazy { ResultAdapter(layoutInflater) }
35+
36+
override fun onCreate(savedInstanceState: Bundle?) {
37+
supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR_OVERLAY)
38+
super.onCreate(savedInstanceState)
39+
setContentView(R.layout.activity_batch_qr_camera_view)
40+
41+
cameraView = findViewById(R.id.camera)
42+
flash = findViewById(R.id.flash)
43+
flash.setOnClickListener {
44+
flashEnabled = !flashEnabled
45+
cameraView.useFlash(flashEnabled)
46+
}
47+
resultView = findViewById(R.id.resultsList)
48+
resultView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
49+
resultView.adapter = resultAdapter
50+
51+
cameraView.setCameraOpenCallback {
52+
cameraView.postDelayed({
53+
cameraView.useFlash(flashEnabled)
54+
cameraView.continuousFocus()
55+
}, 300)
56+
}
57+
58+
val barcodeDetector = ScanbotBarcodeScannerSDK(this).createBarcodeDetector()
59+
60+
barcodeDetectorFrameHandler = BarcodeDetectorFrameHandler.attach(
61+
cameraView,
62+
barcodeDetector
63+
)
64+
65+
barcodeDetectorFrameHandler?.setDetectionInterval(1000)
66+
barcodeDetectorFrameHandler?.addResultHandler(this)
67+
68+
barcodeDetector.modifyConfig {
69+
setSaveCameraPreviewFrame(false)
70+
setBarcodeFormats(BarcodeTypeRepository.selectedTypes.toList())
71+
}
72+
}
73+
74+
override fun onResume() {
75+
super.onResume()
76+
cameraView.onResume()
77+
if (ContextCompat.checkSelfPermission(
78+
this,
79+
Manifest.permission.CAMERA
80+
) != PackageManager.PERMISSION_GRANTED
81+
) {
82+
// Use onActivityResult to handle permission rejection
83+
ActivityCompat.requestPermissions(
84+
this,
85+
arrayOf(Manifest.permission.CAMERA),
86+
REQUEST_PERMISSION_CODE
87+
)
88+
}
89+
}
90+
91+
override fun onPause() {
92+
super.onPause()
93+
cameraView.onPause()
94+
}
95+
96+
private fun handleSuccess(result: FrameHandlerResult.Success<BarcodeScanningResult?>) {
97+
result.value?.let {
98+
cameraView.post {
99+
resultAdapter.addBarcodeItems(it.barcodeItems)
100+
}
101+
}
102+
}
103+
104+
override fun handle(result: FrameHandlerResult<BarcodeScanningResult?, SdkLicenseError>): Boolean {
105+
if (result is FrameHandlerResult.Success) {
106+
handleSuccess(result)
107+
} else {
108+
cameraView.post {
109+
Toast.makeText(
110+
this,
111+
"License has expired!",
112+
Toast.LENGTH_LONG
113+
).show()
114+
}
115+
}
116+
return false
117+
}
118+
119+
companion object {
120+
private const val REQUEST_PERMISSION_CODE = 200
121+
}
122+
}
123+
124+
class BarcodeViewHolder(item: View) : RecyclerView.ViewHolder(item) {
125+
val image: ImageView by lazy { item.findViewById(R.id.image) }
126+
val barcodeType: TextView by lazy { item.findViewById(R.id.barcodeFormat) }
127+
val text: TextView by lazy { item.findViewById(R.id.docText) }
128+
}
129+
130+
class ResultAdapter(val layoutInflater: LayoutInflater) :
131+
RecyclerView.Adapter<BarcodeViewHolder>() {
132+
private val items: MutableList<BarcodeItem> = mutableListOf()
133+
134+
fun addBarcodeItems(items: List<BarcodeItem>) {
135+
// lets check duplicates
136+
items.forEach { item ->
137+
var insertedCount = 0
138+
if (!this.items.any { it.text == item.text }) {
139+
this.items.add(0, item)
140+
insertedCount += 1
141+
}
142+
notifyItemRangeInserted(0, insertedCount)
143+
}
144+
}
145+
146+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BarcodeViewHolder {
147+
return BarcodeViewHolder(layoutInflater.inflate(R.layout.barcode_item, parent, false))
148+
}
149+
150+
override fun onBindViewHolder(holder: BarcodeViewHolder, position: Int) {
151+
val item = items.get(position)
152+
holder.text.text = item.text
153+
holder.barcodeType.text = item.barcodeFormat.name
154+
holder.image.setImageBitmap(item.image)
155+
}
156+
157+
override fun getItemCount(): Int = items.size
158+
159+
}

example_app/src/main/java/io/scanbot/example/sdk/barcode/ui/MainActivity.kt

+5-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package io.scanbot.sdk.sdk_integration_barcode_scanner_sdk
33
import android.app.Activity
44
import android.content.Intent
55
import android.graphics.Bitmap
6-
import android.os.Build
76
import android.os.Bundle
87
import android.provider.MediaStore
98
import android.view.View
@@ -50,6 +49,11 @@ class MainActivity : AppCompatActivity() {
5049
startActivity(intent)
5150
}
5251

52+
findViewById<View>(R.id.classical_batch).setOnClickListener {
53+
val intent = Intent(applicationContext, BatchQRScanActivity::class.java)
54+
startActivity(intent)
55+
}
56+
5357
findViewById<View>(R.id.rtu_ui).setOnClickListener {
5458
val barcodeCameraConfiguration = BarcodeScannerConfiguration()
5559
barcodeCameraConfiguration.setBarcodeFormatsFilter(arrayListOf<BarcodeFormat>().also {

example_app/src/main/java/io/scanbot/example/sdk/barcode/ui/QRScanCameraViewActivity.kt

+23-17
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import android.graphics.Bitmap
77
import android.graphics.BitmapFactory
88
import android.graphics.Matrix
99
import android.os.Bundle
10+
import android.view.View
1011
import android.widget.ImageView
1112
import android.widget.Toast
1213
import androidx.appcompat.app.AppCompatActivity
@@ -25,8 +26,9 @@ import io.scanbot.sdk.camera.*
2526

2627
class QRScanCameraViewActivity : AppCompatActivity(), BarcodeDetectorFrameHandler.ResultHandler {
2728

28-
private var cameraView: ScanbotCameraView? = null
29-
private var resultView: ImageView? = null
29+
private lateinit var cameraView: ScanbotCameraView
30+
private lateinit var resultView: ImageView
31+
private lateinit var flash: View
3032

3133
private var flashEnabled = false
3234
private var barcodeDetectorFrameHandler: BarcodeDetectorFrameHandler? = null
@@ -40,18 +42,22 @@ class QRScanCameraViewActivity : AppCompatActivity(), BarcodeDetectorFrameHandle
4042

4143
cameraView = findViewById(R.id.camera)
4244
resultView = findViewById(R.id.result)
43-
44-
cameraView!!.setCameraOpenCallback {
45-
cameraView!!.postDelayed({
46-
cameraView!!.useFlash(flashEnabled)
47-
cameraView!!.continuousFocus()
45+
flash = findViewById(R.id.flash)
46+
flash.setOnClickListener {
47+
flashEnabled = !flashEnabled
48+
cameraView.useFlash(flashEnabled)
49+
}
50+
cameraView.setCameraOpenCallback {
51+
cameraView.postDelayed({
52+
cameraView.useFlash(flashEnabled)
53+
cameraView.continuousFocus()
4854
}, 300)
4955
}
5056

5157
val barcodeDetector = ScanbotBarcodeScannerSDK(this).createBarcodeDetector()
5258

5359
barcodeDetectorFrameHandler = BarcodeDetectorFrameHandler.attach(
54-
cameraView!!,
60+
cameraView,
5561
barcodeDetector
5662
)
5763

@@ -64,9 +70,9 @@ class QRScanCameraViewActivity : AppCompatActivity(), BarcodeDetectorFrameHandle
6470
}
6571

6672
val barcodeAutoSnappingController =
67-
BarcodeAutoSnappingController.attach(cameraView!!, barcodeDetectorFrameHandler!!)
73+
BarcodeAutoSnappingController.attach(cameraView, barcodeDetectorFrameHandler!!)
6874
barcodeAutoSnappingController.setSensitivity(1f)
69-
cameraView?.addPictureCallback(object : PictureCallback() {
75+
cameraView.addPictureCallback(object : PictureCallback() {
7076
override fun onPictureTaken(image: ByteArray, captureInfo: CaptureInfo) {
7177
processPictureTaken(image, captureInfo.imageOrientation)
7278
}
@@ -75,7 +81,7 @@ class QRScanCameraViewActivity : AppCompatActivity(), BarcodeDetectorFrameHandle
7581

7682
override fun onResume() {
7783
super.onResume()
78-
cameraView?.onResume()
84+
cameraView.onResume()
7985
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
8086
// Use onActivityResult to handle permission rejection
8187
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), REQUEST_PERMISSION_CODE)
@@ -84,7 +90,7 @@ class QRScanCameraViewActivity : AppCompatActivity(), BarcodeDetectorFrameHandle
8490

8591
override fun onPause() {
8692
super.onPause()
87-
cameraView?.onPause()
93+
cameraView.onPause()
8894
}
8995

9096

@@ -106,10 +112,10 @@ class QRScanCameraViewActivity : AppCompatActivity(), BarcodeDetectorFrameHandle
106112
val resultBitmap =
107113
Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, false)
108114

109-
resultView?.post {
110-
resultView?.setImageBitmap(resultBitmap)
111-
cameraView?.continuousFocus()
112-
cameraView?.startPreview()
115+
resultView.post {
116+
resultView.setImageBitmap(resultBitmap)
117+
cameraView.continuousFocus()
118+
cameraView.startPreview()
113119
}
114120
}
115121

@@ -118,7 +124,7 @@ class QRScanCameraViewActivity : AppCompatActivity(), BarcodeDetectorFrameHandle
118124
if (result is FrameHandlerResult.Success) {
119125
handleSuccess(result)
120126
} else {
121-
cameraView?.post {
127+
cameraView.post {
122128
Toast.makeText(
123129
this,
124130
"License has expired!",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
2+
xmlns:app="http://schemas.android.com/apk/res-auto"
3+
xmlns:tools="http://schemas.android.com/tools"
4+
android:layout_width="match_parent"
5+
android:layout_height="match_parent"
6+
tools:context=".QRScanCameraViewActivity">
7+
8+
<io.scanbot.sdk.camera.ScanbotCameraView
9+
android:id="@+id/camera"
10+
android:layout_width="0dp"
11+
android:layout_height="400dp"
12+
app:layout_constraintEnd_toEndOf="parent"
13+
app:layout_constraintStart_toStartOf="parent"
14+
app:layout_constraintTop_toTopOf="parent"
15+
app:layout_constraintVertical_weight="1" />
16+
17+
<androidx.recyclerview.widget.RecyclerView
18+
android:id="@+id/resultsList"
19+
android:layout_width="0dp"
20+
android:layout_height="0dp"
21+
app:layout_constraintBottom_toBottomOf="parent"
22+
app:layout_constraintVertical_weight="1"
23+
app:layout_constraintEnd_toEndOf="parent"
24+
app:layout_constraintStart_toStartOf="parent"
25+
app:layout_constraintTop_toBottomOf="@+id/camera" />
26+
27+
<Button
28+
android:id="@+id/flash"
29+
android:layout_width="wrap_content"
30+
android:layout_height="wrap_content"
31+
android:text="Flash"
32+
app:layout_constraintEnd_toEndOf="parent"
33+
app:layout_constraintTop_toTopOf="parent" />
34+
35+
</androidx.constraintlayout.widget.ConstraintLayout>

example_app/src/main/res/layout/activity_main.xml

+15-1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,20 @@
6969
style="@style/Scanbot.Demo.MaterialTwoButtonTeaser.Button"
7070

7171
android:textColor="@color/scanbot_sdk_textColorPrimary" />
72+
<View
73+
android:layout_width="match_parent"
74+
android:layout_height="1dp"
75+
android:background="#50000000" />
76+
77+
<TextView
78+
android:id="@+id/classical_batch"
79+
android:layout_width="match_parent"
80+
android:layout_height="56dp"
81+
android:gravity="center_vertical"
82+
android:layout_marginLeft="16dp"
83+
style="@style/Scanbot.Demo.MaterialTwoButtonTeaser.Button"
84+
android:text="Batch Barcode Classic Component"
85+
android:textColor="@color/scanbot_sdk_textColorPrimary" />
7286

7387
<View
7488
android:layout_width="match_parent"
@@ -152,4 +166,4 @@
152166

153167
</LinearLayout>
154168
</ScrollView>
155-
</LinearLayout>
169+
</LinearLayout>

0 commit comments

Comments
 (0)