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"> - + + + + +