From d16fa7d008362e207522de591ce6aaa859424403 Mon Sep 17 00:00:00 2001
From: DewanaGustavus <76590469+DewanaGustavus@users.noreply.github.com>
Date: Wed, 3 Apr 2024 18:40:37 +0700
Subject: [PATCH] fix: transaction location async issue, but not modular

---
 .../bondoyap/ui/scanner/ScanResultFragment.kt | 56 +++++++++++++------
 .../transactions/AddTransactionsFragment.kt   | 56 +++++++++++++------
 .../transactions/EditTransactionsFragment.kt  | 24 +++++---
 3 files changed, 95 insertions(+), 41 deletions(-)

diff --git a/app/src/main/java/com/example/bondoyap/ui/scanner/ScanResultFragment.kt b/app/src/main/java/com/example/bondoyap/ui/scanner/ScanResultFragment.kt
index f83ea07..0c79133 100644
--- a/app/src/main/java/com/example/bondoyap/ui/scanner/ScanResultFragment.kt
+++ b/app/src/main/java/com/example/bondoyap/ui/scanner/ScanResultFragment.kt
@@ -1,5 +1,6 @@
 package com.example.bondoyap.ui.scanner
 
+import android.annotation.SuppressLint
 import android.os.Bundle
 import android.util.Log
 import android.view.LayoutInflater
@@ -20,6 +21,7 @@ import com.example.bondoyap.ui.transactions.TransactionsApplication
 import com.example.bondoyap.ui.transactions.TransactionsViewModel
 import com.example.bondoyap.ui.transactions.TransactionsViewModelFactory
 import com.example.bondoyap.ui.transactions.data.Transactions
+import com.google.android.gms.location.LocationServices
 import java.text.SimpleDateFormat
 import java.util.Date
 import java.util.Locale
@@ -95,23 +97,43 @@ class ScanResultFragment : Fragment() {
 
         LocationManager.askLocationPermission(requireContext(), requireActivity())
         Log.d("ScanResult", "Getting location")
-        val location = LocationManager.getLocation(requireContext())
-        var longitude = ""
-        var latitude = ""
-        location?.let { it1 ->
-            longitude = it1.longitude.toString()
-            latitude = it1.latitude.toString()
-        }
 
-        Log.d("ScanResult", "Saving note on database")
-        val transaction = Transactions(
-            judul = "Scanner_${title}",
-            nominal = value,
-            isPemasukan = false,
-            tanggal = currentDate,
-            longitude = longitude,
-            latitude = latitude
-        )
-        transactionsViewModel.upsert(transaction)
+        if (LocationManager.haveLocationPermission(requireContext())) {
+            Log.d("ScanResult", "Saving note on database")
+            Log.d("LocationManager", "Getting last location")
+            val fusedLocationProviderClient =
+                LocationServices.getFusedLocationProviderClient(requireContext())
+
+            @SuppressLint("MissingPermission")
+            val locationProvider = fusedLocationProviderClient.lastLocation
+            locationProvider.addOnSuccessListener {
+                if (it != null) {
+                    Log.d(
+                        "LocationManager",
+                        "Updating location to latitude: ${it.latitude} and longitude: ${it.longitude}"
+                    )
+                    val transaction = Transactions(
+                        judul = "Scanner_${title}",
+                        nominal = value,
+                        isPemasukan = false,
+                        tanggal = currentDate,
+                        longitude = it.longitude.toString(),
+                        latitude = it.latitude.toString()
+                    )
+                    transactionsViewModel.upsert(transaction)
+                }
+            }
+        } else {
+            Log.d("ScanResult", "Saving note on database")
+            val transaction = Transactions(
+                judul = "Scanner_${title}",
+                nominal = value,
+                isPemasukan = false,
+                tanggal = currentDate,
+                longitude = "",
+                latitude = ""
+            )
+            transactionsViewModel.upsert(transaction)
+        }
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/example/bondoyap/ui/transactions/AddTransactionsFragment.kt b/app/src/main/java/com/example/bondoyap/ui/transactions/AddTransactionsFragment.kt
index 7b0656c..3179e81 100644
--- a/app/src/main/java/com/example/bondoyap/ui/transactions/AddTransactionsFragment.kt
+++ b/app/src/main/java/com/example/bondoyap/ui/transactions/AddTransactionsFragment.kt
@@ -1,7 +1,9 @@
 package com.example.bondoyap.ui.transactions
 
 import android.R
+import android.annotation.SuppressLint
 import android.os.Bundle
+import android.util.Log
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
@@ -12,6 +14,7 @@ import androidx.fragment.app.viewModels
 import com.example.bondoyap.databinding.FragmentAddTransactionsBinding
 import com.example.bondoyap.service.LocationManager
 import com.example.bondoyap.ui.transactions.data.Transactions
+import com.google.android.gms.location.LocationServices
 import java.text.SimpleDateFormat
 import java.util.Date
 import java.util.Locale
@@ -68,23 +71,44 @@ class AddTransactionsFragment : Fragment() {
             }
 
             LocationManager.askLocationPermission(requireContext(), requireActivity())
-            val location = LocationManager.getLocation(requireContext())
-            var longitude = ""
-            var latitude = ""
-            location?.let { it1 ->
-                longitude = it1.longitude.toString()
-                latitude = it1.latitude.toString()
-            }
 
-            val transaction = Transactions(
-                judul = judul,
-                nominal = nominal,
-                isPemasukan = isPemasukan,
-                tanggal = currentDate,
-                longitude = longitude,
-                latitude = latitude
-            )
-            transactionsViewModel.upsert(transaction)
+            if (LocationManager.haveLocationPermission(requireContext())) {
+                Log.d("ScanResult", "Saving note on database")
+                Log.d("LocationManager", "Getting last location")
+                val fusedLocationProviderClient =
+                    LocationServices.getFusedLocationProviderClient(requireContext())
+
+                @SuppressLint("MissingPermission")
+                val locationProvider = fusedLocationProviderClient.lastLocation
+                locationProvider.addOnSuccessListener {
+                    if (it != null) {
+                        Log.d(
+                            "LocationManager",
+                            "Updating location to latitude: ${it.latitude} and longitude: ${it.longitude}"
+                        )
+                        val transaction = Transactions(
+                            judul = judul,
+                            nominal = nominal,
+                            isPemasukan = isPemasukan,
+                            tanggal = currentDate,
+                            longitude = it.longitude.toString(),
+                            latitude = it.latitude.toString()
+                        )
+                        transactionsViewModel.upsert(transaction)
+                    }
+                }
+            } else {
+                Log.d("ScanResult", "Saving note on database")
+                val transaction = Transactions(
+                    judul = judul,
+                    nominal = nominal,
+                    isPemasukan = isPemasukan,
+                    tanggal = currentDate,
+                    longitude = "",
+                    latitude = ""
+                )
+                transactionsViewModel.upsert(transaction)
+            }
 
             Toast.makeText(requireContext(), "Transaksi berhasil disimpan", Toast.LENGTH_SHORT)
                 .show()
diff --git a/app/src/main/java/com/example/bondoyap/ui/transactions/EditTransactionsFragment.kt b/app/src/main/java/com/example/bondoyap/ui/transactions/EditTransactionsFragment.kt
index ee35e51..d0b9e61 100644
--- a/app/src/main/java/com/example/bondoyap/ui/transactions/EditTransactionsFragment.kt
+++ b/app/src/main/java/com/example/bondoyap/ui/transactions/EditTransactionsFragment.kt
@@ -1,6 +1,7 @@
 package com.example.bondoyap.ui.transactions
 
 import android.R
+import android.annotation.SuppressLint
 import android.app.AlertDialog
 import android.location.Address
 import android.location.Geocoder
@@ -19,6 +20,8 @@ import androidx.navigation.fragment.findNavController
 import com.example.bondoyap.databinding.FragmentEditTransactionsBinding
 import com.example.bondoyap.service.LocationManager
 import com.example.bondoyap.ui.transactions.data.Transactions
+import com.google.android.gms.location.FusedLocationProviderClient
+import com.google.android.gms.location.LocationServices
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers.Main
 import kotlinx.coroutines.launch
@@ -36,6 +39,8 @@ class EditTransactionsFragment : Fragment() {
         TransactionsViewModelFactory((requireContext().applicationContext as TransactionsApplication).repository)
     }
 
+    private lateinit var fusedLocationProviderClient: FusedLocationProviderClient
+
     override fun onCreateView(
         inflater: LayoutInflater,
         container: ViewGroup?,
@@ -98,6 +103,7 @@ class EditTransactionsFragment : Fragment() {
         }
 
         LocationManager.askLocationPermission(requireContext(), requireActivity())
+        fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(requireContext())
 
         binding.checkboxUpdateLokasi.setOnCheckedChangeListener { _, isChecked ->
             if (isChecked) {
@@ -137,14 +143,16 @@ class EditTransactionsFragment : Fragment() {
             )
 
             if (binding.checkboxUpdateLokasi.isChecked) {
-                LocationManager.askLocationPermission(requireContext(), requireActivity())
-                val location = LocationManager.getLocation(requireContext())
-                location?.let { it1 ->
-                    longitude = it1.longitude.toString()
-                    latitude = it1.latitude.toString()
-
-                    transaction.latitude = latitude
-                    transaction.longitude = longitude
+                @SuppressLint("MissingPermission")
+                val location = fusedLocationProviderClient.lastLocation
+                location.addOnSuccessListener { loc ->
+                    if (loc != null) {
+                        latitude = loc.latitude.toString()
+                        longitude = loc.longitude.toString()
+
+                        transaction.latitude = latitude
+                        transaction.longitude = longitude
+                    }
                 }
             }
 
-- 
GitLab