diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 863f239792c4968cb70673e42dcd9ac792510475..c1c8b5a43684ba8a7ba7361b4fe36f4e2ede6dd9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> + <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> @@ -24,6 +25,7 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.If32102024androidaab" + android:enableOnBackInvokedCallback="true" tools:targetApi="31"> <activity android:name=".EditTransactionActivity" diff --git a/app/src/main/java/com/example/if3210_2024_android_aab/ScanFragment.kt b/app/src/main/java/com/example/if3210_2024_android_aab/ScanFragment.kt index a08a30123d13b93559d6e2467412bfddb0f08f80..0e7dd204b76377e60082e59226560a919f7dee85 100644 --- a/app/src/main/java/com/example/if3210_2024_android_aab/ScanFragment.kt +++ b/app/src/main/java/com/example/if3210_2024_android_aab/ScanFragment.kt @@ -3,6 +3,7 @@ package com.example.if3210_2024_android_aab import android.Manifest import android.annotation.SuppressLint import android.app.Activity +import android.content.ContentResolver import android.content.Intent import android.content.pm.PackageManager import android.location.LocationManager @@ -10,6 +11,8 @@ import android.location.LocationRequest import android.net.Uri import android.os.Bundle import android.os.Environment +import android.provider.MediaStore +import android.provider.Settings import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -69,6 +72,8 @@ class ScanFragment : Fragment() { TransactionViewModelFactory((requireActivity().application as TransactionApplication).repository) } + private val SELECT_IMAGE_REQUEST = 1 + private var capturedImageFile: File? = null private lateinit var fusedLocationClient: FusedLocationProviderClient @@ -106,6 +111,10 @@ class ScanFragment : Fragment() { takePhoto() } + binding.galleryButton.setOnClickListener { + selectPhoto() + } + binding.retryButton.setOnClickListener { retryPhoto() } @@ -237,6 +246,59 @@ class ScanFragment : Fragment() { ) } + private fun selectPhoto() { + if (!Environment.isExternalStorageManager()) { + val intentESM = Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION) + startActivity(intentESM) + } + + val intent = Intent(Intent.ACTION_PICK) + intent.type = "image/*" + startActivityForResult(intent, SELECT_IMAGE_REQUEST) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + + if (requestCode == SELECT_IMAGE_REQUEST && resultCode == Activity.RESULT_OK) { + val selectedImageUri: Uri? = data?.data + + if (selectedImageUri != null) { + val selectedImage: File? = selectedImageUri?.let { + getImageFile(requireActivity().contentResolver, it) + } + } + + val imageView = binding.imageView + + capturedImageFile = getImageFile(requireActivity().contentResolver, selectedImageUri!!) + + imageView.setImageURI(selectedImageUri) + imageView.visibility = View.VISIBLE + + binding.viewFinder.visibility = View.GONE + binding.captureButton.visibility = View.GONE + binding.galleryButton.visibility = View.GONE + binding.retryButton.visibility = View.VISIBLE + binding.okButton.visibility = View.VISIBLE + } + } + + private fun getImageFile(contentResolver: ContentResolver, uri: Uri): File? { + val filePathCol = arrayOf(MediaStore.Images.Media.DATA) + val cursor = contentResolver.query(uri, filePathCol, null, null, null) + cursor?.moveToFirst() + val colIdx = cursor?.getColumnIndex(filePathCol[0]) + val filePath = colIdx?.let { + cursor.getString(it) + } + cursor?.close() + + return filePath?.let { + File(it) + } + } + private fun retryPhoto() { binding.imageView.visibility = View.GONE binding.viewFinder.visibility = View.VISIBLE @@ -292,6 +354,7 @@ class ScanFragment : Fragment() { } } override fun onFailure (call: Call<ResponseItem>, t: Throwable) { + println(t) Toast.makeText(requireContext(), t.localizedMessage, Toast.LENGTH_SHORT).show() } })