From 42b0af9279df54a799287bbfd6750a05cdd8a56a Mon Sep 17 00:00:00 2001
From: Chris Albert <christiangultom5@gmail.com>
Date: Fri, 5 Apr 2024 16:05:53 +0700
Subject: [PATCH] feat: select image from gallery

---
 app/src/main/AndroidManifest.xml              |  2 +
 .../if3210_2024_android_aab/ScanFragment.kt   | 63 +++++++++++++++++++
 2 files changed, 65 insertions(+)

diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 863f239..c1c8b5a 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 a08a301..0e7dd20 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()
                     }
                 })
-- 
GitLab