diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/QrScannerActivity.kt b/app/src/main/java/sh/sar/basedbank/ui/home/QrScannerActivity.kt
index d688cc9..f8d6475 100644
--- a/app/src/main/java/sh/sar/basedbank/ui/home/QrScannerActivity.kt
+++ b/app/src/main/java/sh/sar/basedbank/ui/home/QrScannerActivity.kt
@@ -13,6 +13,12 @@ import android.provider.Settings
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
+import android.content.res.ColorStateList
+import android.graphics.Color
+import android.graphics.drawable.Animatable
+import android.view.ScaleGestureDetector
+import androidx.appcompat.content.res.AppCompatResources
+import androidx.camera.core.Camera
import androidx.camera.core.CameraSelector
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
@@ -52,6 +58,8 @@ class QrScannerActivity : AppCompatActivity() {
textMode = ZxingCpp.TextMode.PLAIN
)
+ private var camera: Camera? = null
+ private var torchEnabled = false
private var cameraStarted = false
private val permissionLauncher = registerForActivityResult(
@@ -104,8 +112,36 @@ class QrScannerActivity : AppCompatActivity() {
}
insets
}
- binding.btnCancel.setOnClickListener { finish() }
binding.btnPickImage.setOnClickListener { pickImageLauncher.launch("image/*") }
+ binding.zoomSlider.addOnChangeListener { _, value, fromUser ->
+ if (fromUser) camera?.cameraControl?.setLinearZoom(value)
+ }
+ val scaleDetector = ScaleGestureDetector(this,
+ object : ScaleGestureDetector.SimpleOnScaleGestureListener() {
+ override fun onScale(detector: ScaleGestureDetector): Boolean {
+ val state = camera?.cameraInfo?.zoomState?.value ?: return true
+ camera?.cameraControl?.setZoomRatio(
+ (state.zoomRatio * detector.scaleFactor)
+ .coerceIn(state.minZoomRatio, state.maxZoomRatio)
+ )
+ return true
+ }
+ })
+ binding.previewView.setOnTouchListener { _, event ->
+ scaleDetector.onTouchEvent(event)
+ true
+ }
+ binding.btnFlashlight.setOnClickListener {
+ torchEnabled = !torchEnabled
+ camera?.cameraControl?.enableTorch(torchEnabled)
+ val drawableRes = if (torchEnabled) R.drawable.ic_flashlight_to_on else R.drawable.ic_flashlight_to_off
+ val drawable = AppCompatResources.getDrawable(this, drawableRes)
+ binding.btnFlashlight.icon = drawable
+ (drawable as? Animatable)?.start()
+ binding.btnFlashlight.iconTint = ColorStateList.valueOf(
+ if (torchEnabled) Color.parseColor("#FFEB3B") else Color.WHITE
+ )
+ }
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED
@@ -179,9 +215,12 @@ class QrScannerActivity : AppCompatActivity() {
try {
provider.unbindAll()
- provider.bindToLifecycle(
+ camera = provider.bindToLifecycle(
this, CameraSelector.DEFAULT_BACK_CAMERA, preview, analysis
)
+ camera?.cameraInfo?.zoomState?.observe(this@QrScannerActivity) { state ->
+ binding.zoomSlider.value = state.linearZoom
+ }
} catch (_: Exception) {
finish()
}
diff --git a/app/src/main/res/animator/flashlight_line_appear.xml b/app/src/main/res/animator/flashlight_line_appear.xml
new file mode 100644
index 0000000..e549cf6
--- /dev/null
+++ b/app/src/main/res/animator/flashlight_line_appear.xml
@@ -0,0 +1,8 @@
+
+
diff --git a/app/src/main/res/animator/flashlight_line_disappear.xml b/app/src/main/res/animator/flashlight_line_disappear.xml
new file mode 100644
index 0000000..93b4b35
--- /dev/null
+++ b/app/src/main/res/animator/flashlight_line_disappear.xml
@@ -0,0 +1,8 @@
+
+
diff --git a/app/src/main/res/drawable/ic_flashlight.xml b/app/src/main/res/drawable/ic_flashlight.xml
new file mode 100644
index 0000000..2590f6e
--- /dev/null
+++ b/app/src/main/res/drawable/ic_flashlight.xml
@@ -0,0 +1,10 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_flashlight_anim_off.xml b/app/src/main/res/drawable/ic_flashlight_anim_off.xml
new file mode 100644
index 0000000..3b10e20
--- /dev/null
+++ b/app/src/main/res/drawable/ic_flashlight_anim_off.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_flashlight_anim_on.xml b/app/src/main/res/drawable/ic_flashlight_anim_on.xml
new file mode 100644
index 0000000..64f4c85
--- /dev/null
+++ b/app/src/main/res/drawable/ic_flashlight_anim_on.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_flashlight_off.xml b/app/src/main/res/drawable/ic_flashlight_off.xml
new file mode 100644
index 0000000..2838abe
--- /dev/null
+++ b/app/src/main/res/drawable/ic_flashlight_off.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_flashlight_to_off.xml b/app/src/main/res/drawable/ic_flashlight_to_off.xml
new file mode 100644
index 0000000..b34cb32
--- /dev/null
+++ b/app/src/main/res/drawable/ic_flashlight_to_off.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_flashlight_to_on.xml b/app/src/main/res/drawable/ic_flashlight_to_on.xml
new file mode 100644
index 0000000..7e7b1a1
--- /dev/null
+++ b/app/src/main/res/drawable/ic_flashlight_to_on.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_image.xml b/app/src/main/res/drawable/ic_image.xml
new file mode 100644
index 0000000..c3de353
--- /dev/null
+++ b/app/src/main/res/drawable/ic_image.xml
@@ -0,0 +1,10 @@
+
+
+
+
diff --git a/app/src/main/res/layout/activity_qr_scanner.xml b/app/src/main/res/layout/activity_qr_scanner.xml
index 99db827..ae6a033 100644
--- a/app/src/main/res/layout/activity_qr_scanner.xml
+++ b/app/src/main/res/layout/activity_qr_scanner.xml
@@ -1,5 +1,6 @@
@@ -11,26 +12,49 @@
+ android:orientation="vertical"
+ android:paddingHorizontal="16dp">
-
+
+
+ android:layout_gravity="center_horizontal"
+ android:orientation="horizontal">
-
+
+
+
+
+