From 9f5664c70e2793b0180cabf592378b51e6ad83ef Mon Sep 17 00:00:00 2001
From: Altair1618 <farhannabilsuryono3@gmail.com>
Date: Mon, 11 Mar 2024 07:29:28 +0700
Subject: [PATCH] feat: implement pick from gallery

---
 .../k2_9/omrekap/activities/CameraActivity.kt |  4 -
 .../k2_9/omrekap/activities/MainActivity.kt   | 85 +++++++++++++++----
 2 files changed, 70 insertions(+), 19 deletions(-)

diff --git a/app/src/main/java/com/k2_9/omrekap/activities/CameraActivity.kt b/app/src/main/java/com/k2_9/omrekap/activities/CameraActivity.kt
index 9f86d85..94caf4e 100644
--- a/app/src/main/java/com/k2_9/omrekap/activities/CameraActivity.kt
+++ b/app/src/main/java/com/k2_9/omrekap/activities/CameraActivity.kt
@@ -111,10 +111,6 @@ class CameraActivity : AppCompatActivity() {
 		captureButton.isEnabled = true
 
 		requirePermission(Manifest.permission.CAMERA) {
-			if (android.os.Build.VERSION.SDK_INT <= android.os.Build.VERSION_CODES.Q) {
-				requirePermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, false) {}
-			}
-
 			imageCapture =
 				ImageCapture.Builder()
 					.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
diff --git a/app/src/main/java/com/k2_9/omrekap/activities/MainActivity.kt b/app/src/main/java/com/k2_9/omrekap/activities/MainActivity.kt
index 9a61152..91024e4 100644
--- a/app/src/main/java/com/k2_9/omrekap/activities/MainActivity.kt
+++ b/app/src/main/java/com/k2_9/omrekap/activities/MainActivity.kt
@@ -1,15 +1,21 @@
 package com.k2_9.omrekap.activities
 
+import android.Manifest
 import android.content.Intent
+import android.content.pm.PackageManager
 import android.net.Uri
 import android.os.Build
 import android.os.Bundle
 import android.os.PersistableBundle
+import android.util.Log
 import android.widget.ImageButton
 import android.widget.Toast
+import androidx.activity.result.ActivityResult
+import androidx.activity.result.contract.ActivityResultContracts
 import androidx.activity.viewModels
 import androidx.appcompat.app.AppCompatActivity
 import androidx.cardview.widget.CardView
+import androidx.core.content.ContextCompat
 import androidx.fragment.app.Fragment
 import androidx.lifecycle.Observer
 import androidx.lifecycle.lifecycleScope
@@ -34,7 +40,7 @@ class MainActivity : AppCompatActivity() {
 
 	private val viewModel: ImageDataViewModel by viewModels()
 	private var saveFileJob: Job? = null
-	private var saveFileJobCompleted: Boolean = false
+	private var startSaveJob: Boolean = false
 	private val omrHelperObserver =
 		Observer<ImageSaveData> { newValue ->
 			if (newValue.isProcessed()) {
@@ -50,15 +56,56 @@ class MainActivity : AppCompatActivity() {
 	private var isCreated = false
 
 	private fun onGalleryButtonClick() {
-		val intent = Intent(this, MainActivity::class.java)
+		val intent = Intent(Intent.ACTION_GET_CONTENT)
+		intent.type = "image/*"
+		pickImage.launch(intent)
+	}
 
-		intent.putExtra(EXTRA_NAME_IS_RESULT, true)
-		intent.putExtra(EXTRA_NAME_IS_RESET, true)
-		intent.putExtra(EXTRA_NAME_IS_FROM_CAMERA, false)
-		// TODO: pass image URI from gallery
-		intent.putExtra(EXTRA_NAME_IMAGE_URI_STRING, imageUriString)
+	private val pickImage = registerForActivityResult(
+		ActivityResultContracts.StartActivityForResult()
+	) { result: ActivityResult ->
+		if (result.resultCode == RESULT_OK) {
+			val data: Intent? = result.data
+			val imageUri: Uri? = data?.data
 
-		startActivity(intent)
+			if (imageUri != null) {
+				val intent = Intent(this, MainActivity::class.java)
+
+				intent.putExtra(EXTRA_NAME_IS_RESULT, true)
+				intent.putExtra(EXTRA_NAME_IS_RESET, true)
+				intent.putExtra(EXTRA_NAME_IS_FROM_CAMERA, false)
+				intent.putExtra(EXTRA_NAME_IMAGE_URI_STRING, imageUri.toString())
+
+				startActivity(intent)
+			}
+		}
+	}
+
+	private fun requirePermission(
+		permission: String,
+		verbose: Boolean = true,
+		operation: () -> Unit,
+	) {
+		if (ContextCompat.checkSelfPermission(
+				this,
+				permission,
+			) == PackageManager.PERMISSION_GRANTED
+		) {
+			operation()
+		} else {
+			val requestPermissionLauncher =
+				registerForActivityResult(ActivityResultContracts.RequestPermission()) {
+						isGranted: Boolean ->
+					if (isGranted) {
+						operation()
+					} else {
+						if (verbose) {
+							Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show()
+						}
+					}
+				}
+			requestPermissionLauncher.launch(permission)
+		}
 	}
 
 	private fun onCameraButtonClick() {
@@ -77,8 +124,9 @@ class MainActivity : AppCompatActivity() {
 	private fun saveFile() {
 		saveFileJob =
 			lifecycleScope.launch(Dispatchers.IO) {
+				startSaveJob = true
 				SaveHelper().save(applicationContext, viewModel.data.value!!)
-				saveFileJobCompleted = true
+				startSaveJob = false
 
 				withContext(Dispatchers.Main) {
 					Toast.makeText(
@@ -139,10 +187,6 @@ class MainActivity : AppCompatActivity() {
 				viewModel.processImage(Uri.parse(imageUriString))
 				viewModel.data.observe(this, omrHelperObserver)
 			}
-
-			if (!isFromCamera && !saveFileJobCompleted && viewModel.data.value!!.isProcessed()) {
-				saveFile()
-			}
 		}
 	}
 
@@ -178,7 +222,18 @@ class MainActivity : AppCompatActivity() {
 		super.onCreate(savedInstanceState)
 		setContentView(R.layout.activity_main)
 
-		saveFileJobCompleted = savedInstanceState?.getBoolean("saveFileJobCompleted") ?: false
+		if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) {
+			requirePermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, false) {}
+		}
+
+		startSaveJob = savedInstanceState?.getBoolean("startSaveJob") ?: false
+		if (startSaveJob) {
+			if (viewModel.data.value != null && viewModel.data.value!!.isProcessed()) {
+				saveFile()
+			} else {
+				Log.e("MainActivity", "startSaveJob is true but data is not processed")
+			}
+		}
 
 		updateStates(intent)
 
@@ -215,7 +270,7 @@ class MainActivity : AppCompatActivity() {
 		outPersistentState: PersistableBundle,
 	) {
 		super.onSaveInstanceState(outState, outPersistentState)
-		outState.putBoolean("saveFileJobCompleted", saveFileJobCompleted)
+		outState.putBoolean("startSaveJob", startSaveJob)
 	}
 
 	override fun onDestroy() {
-- 
GitLab