diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1866bc344390e415172a5a1d48d9a23b9f45365f..8e12c486edd92b99da4979e8d5ac4c8e0284ac56 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -72,5 +72,7 @@ dependencies { implementation("androidx.camera:camera-view:1.3.2") implementation("androidx.camera:camera-lifecycle:1.3.2") + implementation("androidx.activity:activity-ktx:1.8.2") + } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dd0880aaa9550f08cfd0c5ee9e7948f1c284af8b..86ef56102e278c0cf56694ff7aeae2dc46441681 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,8 +2,15 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> + + <uses-feature + android:name="android.hardware.camera" + android:required="false" /> + <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> + <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> + <application android:allowBackup="true" diff --git a/app/src/main/java/com/example/bondoyap/ui/scanner/ScannerFragment.kt b/app/src/main/java/com/example/bondoyap/ui/scanner/ScannerFragment.kt index 272c5cf246d207f05c2fa5ef9ac7f610194eeaaf..d9e0d20d8e345b4bddfaf94b8b7a405678feb1cd 100644 --- a/app/src/main/java/com/example/bondoyap/ui/scanner/ScannerFragment.kt +++ b/app/src/main/java/com/example/bondoyap/ui/scanner/ScannerFragment.kt @@ -1,12 +1,17 @@ package com.example.bondoyap.ui.scanner import android.Manifest +import android.app.Activity import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.content.Intent +import android.provider.MediaStore +import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.widget.AppCompatImageView import androidx.camera.core.CameraSelector import androidx.camera.core.ImageCapture import androidx.camera.core.Preview @@ -21,11 +26,17 @@ class ScannerFragment : Fragment() { // onDestroyView. private var _binding: FragmentScannerBinding? = null private val binding get() = _binding!! - + + // Camera private var isBackCamera = true private var frozenPreview: Boolean = false - private var imageCapture: ImageCapture? = null - private var cameraProvider: ProcessCameraProvider? = null + private lateinit var imageCapture: ImageCapture + private lateinit var cameraLauncher: ActivityResultLauncher<String> + + // Gallery + private lateinit var changeImage: ActivityResultLauncher<Intent> + private lateinit var pickImageLauncher: ActivityResultLauncher<String> + override fun onCreateView( inflater: LayoutInflater, @@ -35,18 +46,37 @@ class ScannerFragment : Fragment() { _binding = FragmentScannerBinding.inflate(inflater, container, false) val root: View = binding.root - val permissionLauncher = registerForActivityResult( + cameraLauncher = registerForActivityResult( ActivityResultContracts.RequestPermission() ) { isGranted -> if (isGranted) { - // Do if the permission is granted startCamera() } } - permissionLauncher.launch(Manifest.permission.CAMERA) + pickImageLauncher = registerForActivityResult( + ActivityResultContracts.RequestPermission() + ) { isGranted -> + if (isGranted) { + val pickImageIntent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI) + changeImage.launch(pickImageIntent) + } + } + + changeImage = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { + if (it.resultCode == Activity.RESULT_OK) { + val data = it.data + val imgUri = data?.data + val selectedImage = AppCompatImageView(requireContext()) + selectedImage.setImageURI(imgUri) + Log.d("Image Input", "Image Selected with URI: $imgUri") + } + } imageCapture = ImageCapture.Builder().build() + cameraLauncher.launch(Manifest.permission.CAMERA) binding.switchCameraButton.setOnClickListener { toggleCamera() @@ -56,6 +86,10 @@ class ScannerFragment : Fragment() { freezePreview() } + binding.galleryButton.setOnClickListener { + pickImageLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE) + } + return root } @@ -67,7 +101,7 @@ class ScannerFragment : Fragment() { private fun startCamera() { val cameraProviderFuture = ProcessCameraProvider.getInstance(requireContext()) cameraProviderFuture.addListener({ - cameraProvider = cameraProviderFuture.get() + val cameraProvider = cameraProviderFuture.get() val preview = Preview.Builder().build().also { mPreview -> @@ -97,7 +131,7 @@ class ScannerFragment : Fragment() { private fun toggleCamera() { isBackCamera = !isBackCamera - startCamera() + cameraLauncher.launch(Manifest.permission.CAMERA) } private fun freezePreview() { @@ -107,6 +141,6 @@ class ScannerFragment : Fragment() { } else { binding.captureButton.text = "Retake" } - startCamera() + cameraLauncher.launch(Manifest.permission.CAMERA) } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_scanner.xml b/app/src/main/res/layout/fragment_scanner.xml index 3c82a34313bc712a9bae1e0e4dc3e401fa617940..459c75552df3d47d5a6f0ad32f6b4d49c303d723 100644 --- a/app/src/main/res/layout/fragment_scanner.xml +++ b/app/src/main/res/layout/fragment_scanner.xml @@ -28,6 +28,14 @@ android:text="@string/capture_button" app:layout_constraintTop_toBottomOf="@id/preview_view" app:layout_constraintStart_toEndOf="@+id/switch_camera_button" + /> + <Button + android:id="@+id/gallery_button" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:text="@string/gallery_button" + app:layout_constraintTop_toBottomOf="@id/preview_view" + app:layout_constraintStart_toEndOf="@+id/capture_button" app:layout_constraintEnd_toEndOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9551cd893ba5f86220d3f7c67265f2de4e7ad907..1cb99fecd39d2bdf28e3566ab9cc8abbe55ece62 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -23,4 +23,5 @@ <string name="send_transactions">Kirim daftar transaksi</string> <string name="capture_button">capture</string> <string name="switch_camera_button">switch camera</string> + <string name="gallery_button">gallery</string> </resources> \ No newline at end of file