From b28e4a35341a35a44cb56337160fc87ece5198b3 Mon Sep 17 00:00:00 2001
From: sozy <thinpotatogithub@gmail.com>
Date: Mon, 1 Apr 2024 14:00:36 +0700
Subject: [PATCH] feat: scan receipt before navigate confirmation dialog

---
 .../bondoman/views/activities/MainActivity.kt | 10 +++-
 .../fragments/ScanReceiptResultFragment.kt    | 51 +++++++++++++++++++
 .../utils/interfaces/ParentActivityService.kt |  3 ++
 .../component_delete_transaction_dialog.xml   |  2 +-
 .../layout/component_scan_receipt_dialog.xml  | 10 ++++
 app/src/main/res/values/strings.xml           |  3 ++
 6 files changed, 77 insertions(+), 2 deletions(-)
 create mode 100644 app/src/main/res/layout/component_scan_receipt_dialog.xml

diff --git a/app/src/main/java/com/example/bondoman/views/activities/MainActivity.kt b/app/src/main/java/com/example/bondoman/views/activities/MainActivity.kt
index daccd2f..f34429a 100644
--- a/app/src/main/java/com/example/bondoman/views/activities/MainActivity.kt
+++ b/app/src/main/java/com/example/bondoman/views/activities/MainActivity.kt
@@ -57,6 +57,7 @@ class MainActivity : AppCompatActivity(), ParentActivityService {
 	private lateinit var dialogParent: BlurView
 	private lateinit var transactionViewModel: TransactionViewModel
 	private lateinit var navController: NavController
+	private lateinit var navbar: BottomNavigationView
 
 	// destinations
 	private val destinationListeners = mutableListOf<(Int) -> Unit>()
@@ -205,8 +206,9 @@ class MainActivity : AppCompatActivity(), ParentActivityService {
 		dialogParent.setBlurEnabled(false)
 	}
 
+
 	private fun configureNavigation() {
-		val navbar = findViewById<BottomNavigationView>(R.id.navbar)
+		navbar = findViewById<BottomNavigationView>(R.id.navbar)
 		val navHostFragment =
 			supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment
 		navController = navHostFragment.navController
@@ -214,6 +216,8 @@ class MainActivity : AppCompatActivity(), ParentActivityService {
 
 		navbar.setupWithNavController(navController)
 
+
+
 		navController.addOnDestinationChangedListener { _, destination, _ ->
 			headerText.text = destination.label ?: headerText.text
 
@@ -361,6 +365,10 @@ class MainActivity : AppCompatActivity(), ParentActivityService {
 		)
 	}
 
+	override fun getNavbarView(): BottomNavigationView {
+		return navbar
+	}
+
 	override fun onCreate(savedInstanceState: Bundle?) {
 		super.onCreate(savedInstanceState)
 
diff --git a/app/src/main/java/com/example/bondoman/views/fragments/ScanReceiptResultFragment.kt b/app/src/main/java/com/example/bondoman/views/fragments/ScanReceiptResultFragment.kt
index 538ac1d..484d617 100644
--- a/app/src/main/java/com/example/bondoman/views/fragments/ScanReceiptResultFragment.kt
+++ b/app/src/main/java/com/example/bondoman/views/fragments/ScanReceiptResultFragment.kt
@@ -15,6 +15,7 @@ import android.view.View
 import android.view.ViewGroup
 import android.widget.ProgressBar
 import android.widget.Toast
+import androidx.activity.OnBackPressedCallback
 import androidx.activity.result.contract.ActivityResultContracts
 import androidx.annotation.RequiresApi
 import androidx.core.content.ContextCompat
@@ -34,6 +35,8 @@ import com.example.bondoman.data.viewmodels.transaction.TransactionViewModel
 import com.example.bondoman.databinding.ComponentScanReceiptItemCardBinding
 import com.example.bondoman.databinding.FragmentScanReceiptResultBinding
 import com.example.bondoman.networks.responses.ScanReceiptResponseItemsWrapper
+import com.example.bondoman.views.components.DialogComponent
+import com.example.bondoman.views.utils.interfaces.ParentActivityService
 import java.io.File
 import java.io.FileOutputStream
 import java.io.IOException
@@ -44,6 +47,8 @@ class ScanReceiptResultFragment : Fragment() {
 	private lateinit var viewBinding: FragmentScanReceiptResultBinding
 	private lateinit var locationManager: LocationManager
 	private lateinit var transactionViewModel: TransactionViewModel
+	private lateinit var parentActivityService: ParentActivityService
+	private lateinit var dialog: DialogComponent
 
 	private val scanReceiptViewModel: ScanReceiptViewModel by viewModels()
 	private val args by navArgs<ScanReceiptResultFragmentArgs>()
@@ -87,6 +92,31 @@ class ScanReceiptResultFragment : Fragment() {
 	override fun onCreate(savedInstanceState: Bundle?) {
 		super.onCreate(savedInstanceState)
 
+		parentActivityService = requireActivity() as ParentActivityService
+
+
+		this.requireActivity().onBackPressedDispatcher.addCallback(
+			this,
+			object : OnBackPressedCallback(true) {
+				override fun handleOnBackPressed() {
+					parentActivityService.showDialog(dialog)
+				}
+			})
+
+		val navbar = parentActivityService.getNavbarView()
+
+		navbar.setOnItemSelectedListener { item ->
+			val itemId = item.itemId
+			val scanReceiptResultFragmentId = R.id.scanReceiptResultFragment
+
+			if (itemId != scanReceiptResultFragmentId) {
+				parentActivityService.showDialog(dialog)
+				return@setOnItemSelectedListener false
+			}
+
+			return@setOnItemSelectedListener true
+		}
+
 		transactionViewModel =
 			ViewModelProvider(this.requireActivity())[TransactionViewModel::class.java]
 		locationManager =
@@ -124,6 +154,8 @@ class ScanReceiptResultFragment : Fragment() {
 			)
 		}
 
+		addDialogComponent(inflater, container)
+
 		return viewBinding.root
 	}
 
@@ -496,6 +528,25 @@ class ScanReceiptResultFragment : Fragment() {
 		}
 	}
 
+	private fun addDialogComponent(
+		inflater: LayoutInflater,
+		container: ViewGroup?,
+	) {
+		val dialog =
+			inflater.inflate(
+				R.layout.component_scan_receipt_dialog,
+				container,
+				false,
+			) as DialogComponent
+		dialog.setFirstButtonOnClickListener { parentActivityService.hideDialog() }
+		dialog.setSecondButtonOnClickListener {
+			Navigation.findNavController(viewBinding.root)
+				.navigate(R.id.action_scanReceiptResultFragment_to_scanReceiptFragment)
+			parentActivityService.hideDialog()
+		}
+		this.dialog = dialog
+	}
+
 	companion object {
 		private const val TAG = "ScanReceiptResult"
 		private val REQUIRED_PERMISSIONS =
diff --git a/app/src/main/java/com/example/bondoman/views/utils/interfaces/ParentActivityService.kt b/app/src/main/java/com/example/bondoman/views/utils/interfaces/ParentActivityService.kt
index aa12d3d..235abb2 100644
--- a/app/src/main/java/com/example/bondoman/views/utils/interfaces/ParentActivityService.kt
+++ b/app/src/main/java/com/example/bondoman/views/utils/interfaces/ParentActivityService.kt
@@ -3,6 +3,7 @@ package com.example.bondoman.views.utils.interfaces
 import android.view.View
 import android.view.ViewGroup
 import android.view.ViewGroup.LayoutParams
+import com.google.android.material.bottomnavigation.BottomNavigationView
 
 interface ParentActivityService {
 	fun appendLayout(view: View)
@@ -53,4 +54,6 @@ interface ParentActivityService {
 	fun getEmail(): String
 
 	fun getNIM(): String
+
+	fun getNavbarView(): BottomNavigationView
 }
diff --git a/app/src/main/res/layout/component_delete_transaction_dialog.xml b/app/src/main/res/layout/component_delete_transaction_dialog.xml
index efd3e8c..f213867 100644
--- a/app/src/main/res/layout/component_delete_transaction_dialog.xml
+++ b/app/src/main/res/layout/component_delete_transaction_dialog.xml
@@ -7,4 +7,4 @@
     app:dialogSecondButtonType="negative"
     app:dialogText="@string/text_delete_transaction_dialog"
     app:firstButtonText="@string/text_first_button_delete_transaction_dialog"
-    app:secondButtonText="@string/text_second_button_delete_transaction_dialog"></com.example.bondoman.views.components.DialogComponent>
+    app:secondButtonText="@string/text_second_button_delete_transaction_dialog" />
diff --git a/app/src/main/res/layout/component_scan_receipt_dialog.xml b/app/src/main/res/layout/component_scan_receipt_dialog.xml
new file mode 100644
index 0000000..2d926cc
--- /dev/null
+++ b/app/src/main/res/layout/component_scan_receipt_dialog.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.example.bondoman.views.components.DialogComponent xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    app:dialogFirstButtonType="neutral"
+    app:dialogSecondButtonType="positive"
+    app:dialogText="@string/scan_receipt_dialog_message"
+    app:firstButtonText="@string/scan_receipt_dialog_cancel"
+    app:secondButtonText="@string/scan_receipt_dialog_confirm" />
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 25142fc..8c06689 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -73,5 +73,8 @@
     <string name="scan_receipt_form_button_retry_label">Retry</string>
     <string name="scan_receipt_form_button_save_label">Save</string>
     <string name="toast_icon">Toast icon</string>
+    <string name="scan_receipt_dialog_message">Are you sure to retry? All your current data will not be saved</string>
+    <string name="scan_receipt_dialog_confirm">Retry</string>
+    <string name="scan_receipt_dialog_cancel">Cancel</string>
 </resources>
 
-- 
GitLab