From 2227f0bb46ce24e43aa6c60c662c96922a9acae5 Mon Sep 17 00:00:00 2001
From: Ahmad Nadil <13521024@std.stei.itb.ac.id>
Date: Mon, 1 Apr 2024 22:47:56 +0700
Subject: [PATCH] refactor: use latitude and longitude for transaction location

---
 app/src/main/AndroidManifest.xml              |  5 +-
 .../com/mhn/bondoman/database/Transaction.kt  |  4 +-
 .../com/mhn/bondoman/ui/scan/ScanResult.kt    | 13 +++--
 .../ui/transactions/TransactionAdapter.kt     |  7 +--
 .../ui/transactions/TransactionAdd.kt         | 46 +++++++++---------
 .../ui/transactions/TransactionUpdate.kt      | 48 +++++++++++++++++--
 .../com/mhn/bondoman/utils/LocationAdapter.kt | 12 +++--
 7 files changed, 88 insertions(+), 47 deletions(-)

diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 222061a..9e7778a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -13,7 +13,7 @@
         android:maxSdkVersion="18" />
     <application
         android:name=".BondomanApp"
-        android:allowBackup="true"
+        android:allowBackup="false"
         android:dataExtractionRules="@xml/data_extraction_rules"
         android:fullBackupContent="@xml/backup_rules"
         android:icon="@mipmap/ic_launcher"
@@ -21,7 +21,8 @@
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:theme="@style/Theme.Bondoman"
-        tools:targetApi="31">
+        tools:targetApi="31"
+        >
         <provider
             android:name="androidx.core.content.FileProvider"
             android:authorities="${applicationId}.provider"
diff --git a/app/src/main/java/com/mhn/bondoman/database/Transaction.kt b/app/src/main/java/com/mhn/bondoman/database/Transaction.kt
index 17e6eb8..397c39e 100644
--- a/app/src/main/java/com/mhn/bondoman/database/Transaction.kt
+++ b/app/src/main/java/com/mhn/bondoman/database/Transaction.kt
@@ -18,8 +18,8 @@ data class Transaction(
     @ColumnInfo(name = "transaction_price") val transaction_price: Int,
     @ColumnInfo(name = "transaction_category") val transaction_category: String,
     @ColumnInfo(name = "transaction_location") val transaction_location: String,
-//    @ColumnInfo(name = "transaction_latitude") val transaction_latitude: Double,
-//    @ColumnInfo(name = "transaction_longitude") val transaction_longitude: Double
+    @ColumnInfo(name = "transaction_latitude") val transaction_latitude: Double,
+    @ColumnInfo(name = "transaction_longitude") val transaction_longitude: Double
 )
 
 data class TransactionSummary(
diff --git a/app/src/main/java/com/mhn/bondoman/ui/scan/ScanResult.kt b/app/src/main/java/com/mhn/bondoman/ui/scan/ScanResult.kt
index d53c8b4..d1233bb 100644
--- a/app/src/main/java/com/mhn/bondoman/ui/scan/ScanResult.kt
+++ b/app/src/main/java/com/mhn/bondoman/ui/scan/ScanResult.kt
@@ -1,23 +1,20 @@
 package com.mhn.bondoman.ui.scan
 
+import android.location.Location
 import android.os.Bundle
 import android.util.Log
-import androidx.fragment.app.Fragment
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import android.widget.Toast
+import androidx.fragment.app.Fragment
 import androidx.lifecycle.Observer
 import androidx.lifecycle.ViewModelProvider
-import androidx.navigation.findNavController
 import androidx.navigation.fragment.findNavController
 import androidx.recyclerview.widget.LinearLayoutManager
 import com.mhn.bondoman.database.KeyStoreManager
 import com.mhn.bondoman.database.Transaction
 import com.mhn.bondoman.databinding.FragmentScanResultBinding
-import com.mhn.bondoman.models.Item
-import com.mhn.bondoman.models.Items
-import com.mhn.bondoman.ui.transactions.TransactionUpdateDirections
 import com.mhn.bondoman.ui.transactions.TransactionsViewModel
 import com.mhn.bondoman.utils.LocationAdapter
 import java.time.LocalDate
@@ -29,6 +26,7 @@ class ScanResult : Fragment() {
     private lateinit var adapter: ScanResultAdapter
     private lateinit var viewModel: TransactionsViewModel
     private lateinit var transactionLocation: String
+    private lateinit var transactionCoordinate: Location
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
@@ -77,8 +75,8 @@ class ScanResult : Fragment() {
                             transaction_category = "Outcome",
                             transaction_date= LocalDate.now().toString(),
                             transaction_location = transactionLocation,
-//                            transaction_latitude = 0.0,
-//                            transaction_longitude = 0.0
+                            transaction_latitude = transactionCoordinate.latitude,
+                            transaction_longitude = transactionCoordinate.longitude
                         )
                         viewModel.addTransaction(_transaction)
                     }
@@ -93,6 +91,7 @@ class ScanResult : Fragment() {
         try {
             gpsService.getLocation { location ->
                 transactionLocation = gpsService.transformToReadable(location)
+                transactionCoordinate = gpsService.getCurrentCoordinates()!!
                 binding.fabAddTransaction.visibility = View.VISIBLE
             }
         } catch (e: Exception) {
diff --git a/app/src/main/java/com/mhn/bondoman/ui/transactions/TransactionAdapter.kt b/app/src/main/java/com/mhn/bondoman/ui/transactions/TransactionAdapter.kt
index 177f77a..20722bd 100644
--- a/app/src/main/java/com/mhn/bondoman/ui/transactions/TransactionAdapter.kt
+++ b/app/src/main/java/com/mhn/bondoman/ui/transactions/TransactionAdapter.kt
@@ -2,7 +2,6 @@ package com.mhn.bondoman.ui.transactions
 
 import android.app.Activity
 import android.content.Intent
-import android.location.Location
 import android.net.Uri
 import android.view.LayoutInflater
 import android.view.ViewGroup
@@ -42,11 +41,9 @@ class TransactionAdapter(
                 onItemClick(transaction.transaction_id ?: 0)
             }
             binding.Location.setOnClickListener {
-                val location: Location? =
-                    locationService.transformToCoord(binding.Location.text.toString())
-                val gmmIntentUri = Uri.parse("geo:${location?.latitude},${location?.longitude}")
+                val gmmIntentUri =
+                    Uri.parse("geo:0,0?q=${transaction.transaction_latitude},${transaction.transaction_longitude}")
                 val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
-                mapIntent.setPackage("com.google.android.apps.maps")
                 activity.startActivity(mapIntent)
             }
         }
diff --git a/app/src/main/java/com/mhn/bondoman/ui/transactions/TransactionAdd.kt b/app/src/main/java/com/mhn/bondoman/ui/transactions/TransactionAdd.kt
index 79eb7bb..1bf7069 100644
--- a/app/src/main/java/com/mhn/bondoman/ui/transactions/TransactionAdd.kt
+++ b/app/src/main/java/com/mhn/bondoman/ui/transactions/TransactionAdd.kt
@@ -45,6 +45,7 @@ class TransactionAdd : Fragment(), OnMapReadyCallback {
     private lateinit var viewModel: TransactionsViewModel
     private lateinit var taViewModel: TransactionAddViewModel
     private lateinit var gMap: GoogleMap
+    private lateinit var transactionCoordinate: LatLng
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
@@ -82,14 +83,7 @@ class TransactionAdd : Fragment(), OnMapReadyCallback {
         addButton = binding.saveButton
         val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment
         mapFragment.getMapAsync(this)
-        val locationGet = gpsService.getLocation {
-            val location = LatLng(it.latitude, it.longitude)
-            gMap.addMarker(
-                MarkerOptions().position(location).title("Your Location")
-            )
-            gMap.moveCamera(com.google.android.gms.maps.CameraUpdateFactory.newLatLng(location))
-        }
-
+        getLocation()
         addButton.setOnClickListener {
             // Save the Items into the Database
             val email = KeyStoreManager.getInstance(requireContext()).getEmail()
@@ -114,9 +108,9 @@ class TransactionAdd : Fragment(), OnMapReadyCallback {
                     transaction_price = etNominal.text.toString().toInt(),
                     transaction_category = etKategori.selectedItem.toString(),
                     transaction_location = etLocation.text.toString(),
-                    transaction_date = LocalDate.now().toString()
-//                    transaction_latitude = 0.0,
-//                    transaction_longitude = 0.0
+                    transaction_date = LocalDate.now().toString(),
+                    transaction_latitude = transactionCoordinate.latitude,
+                    transaction_longitude = transactionCoordinate.longitude
                 )
                 viewModel.addTransaction(newTransaction)
                 // redirect to the transaction list
@@ -127,19 +121,6 @@ class TransactionAdd : Fragment(), OnMapReadyCallback {
         return binding.root
     }
 
-    override fun onStart() {
-        super.onStart()
-        try {
-            gpsService.getLocation { location ->
-                transactionLocation = gpsService.transformToReadable(location)
-                etLocation.setText(transactionLocation)
-            }
-            etTitle.setText(taViewModel.getTitle())
-        } catch (e: Exception) {
-            Toast.makeText(requireContext(), "Please allow location", Toast.LENGTH_SHORT).show()
-        }
-    }
-
     override fun onResume() {
         super.onResume()
         broadcastReceiver = object : BroadcastReceiver() {
@@ -167,4 +148,21 @@ class TransactionAdd : Fragment(), OnMapReadyCallback {
     override fun onMapReady(p0: GoogleMap) {
         gMap = p0
     }
+
+    private fun getLocation() {
+        addButton.visibility = View.GONE
+        try {
+            gpsService.getLocation { location ->
+                transactionLocation = gpsService.transformToReadable(location)
+                etLocation.setText(transactionLocation)
+                val loc = gpsService.getCurrentCoordinates()!!
+                transactionCoordinate = LatLng(loc.latitude, loc.longitude)
+                gMap.addMarker(MarkerOptions().position(transactionCoordinate).title("Transaction Location"))
+                gMap.moveCamera(com.google.android.gms.maps.CameraUpdateFactory.newLatLngZoom(transactionCoordinate, 15f))
+                addButton.visibility = View.VISIBLE
+            }
+        } catch (e: Exception) {
+            Toast.makeText(requireContext(), "Please allow location", Toast.LENGTH_SHORT).show()
+        }
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/mhn/bondoman/ui/transactions/TransactionUpdate.kt b/app/src/main/java/com/mhn/bondoman/ui/transactions/TransactionUpdate.kt
index d7492df..4beada8 100644
--- a/app/src/main/java/com/mhn/bondoman/ui/transactions/TransactionUpdate.kt
+++ b/app/src/main/java/com/mhn/bondoman/ui/transactions/TransactionUpdate.kt
@@ -1,19 +1,27 @@
 package com.mhn.bondoman.ui.transactions
 
 import android.os.Bundle
+import android.util.Log
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import android.widget.Button
 import android.widget.Toast
 import androidx.fragment.app.Fragment
 import androidx.lifecycle.ViewModelProvider
 import androidx.navigation.findNavController
+import com.google.android.gms.maps.GoogleMap
+import com.google.android.gms.maps.OnMapReadyCallback
+import com.google.android.gms.maps.SupportMapFragment
+import com.google.android.gms.maps.model.LatLng
+import com.google.android.gms.maps.model.MarkerOptions
 import com.google.android.material.textfield.TextInputEditText
+import com.mhn.bondoman.R
 import com.mhn.bondoman.database.Transaction
 import com.mhn.bondoman.databinding.FragmentTransactionUpdateBinding
 import com.mhn.bondoman.utils.LocationAdapter
 
-class TransactionUpdate : Fragment() {
+class TransactionUpdate : Fragment(), OnMapReadyCallback {
     private var _binding: FragmentTransactionUpdateBinding? = null
     private var currentTransaction: Transaction? = null
     private lateinit var viewModel: TransactionsViewModel
@@ -21,7 +29,11 @@ class TransactionUpdate : Fragment() {
     private lateinit var etTitle: TextInputEditText
     private lateinit var etNominal: TextInputEditText
     private lateinit var etLocation: TextInputEditText
+    private lateinit var saveButton: Button
+    private lateinit var updateLocationButton: Button
     private lateinit var transactionLocation: String
+    private lateinit var transactionCoordinate: LatLng
+    private lateinit var gMap: GoogleMap
 
     private val binding get() = _binding!!
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -42,6 +54,8 @@ class TransactionUpdate : Fragment() {
         etTitle = binding.etTitle
         etNominal = binding.etNominal
         etLocation = binding.etLokasi
+        saveButton = binding.saveButton
+        updateLocationButton = binding.updateLocationButton
 
         val transactionId = TransactionUpdateArgs.fromBundle(requireArguments()).transactionId
         viewModel.getTransactionById(transactionId)
@@ -51,13 +65,28 @@ class TransactionUpdate : Fragment() {
             binding.etTitle.setText(transaction!!.transaction_name.toString())
             binding.etNominal.setText(transaction.transaction_price.toString())
             binding.etLokasi.setText(transaction.transaction_location.toString())
+            transactionCoordinate = LatLng(
+                transaction.transaction_latitude,
+                transaction.transaction_longitude
+            )
+            val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment
+            mapFragment.getMapAsync(this)
         }
+
+        binding.updateLocationButton.setOnClickListener {
+            updateLocationButton.visibility = View.GONE
+            getLocation()
+            Log.d("Updated Location", transactionCoordinate.toString())
+        }
+
         binding.saveButton.setOnClickListener {
             currentTransaction?.let { transaction ->
                 val updatedTransaction = transaction.copy(
                     transaction_name = etTitle.text.toString(),
                     transaction_price = etNominal.text.toString().toIntOrNull() ?: 0,
-                    transaction_location = etLocation.text.toString()
+                    transaction_location = etLocation.text.toString(),
+                    transaction_latitude = transactionCoordinate.latitude,
+                    transaction_longitude = transactionCoordinate.longitude
                 )
                 viewModel.updateTransaction(updatedTransaction)
                 Toast.makeText(
@@ -74,12 +103,23 @@ class TransactionUpdate : Fragment() {
         return binding.root
     }
 
-    override fun onStart() {
-        super.onStart()
+    override fun onMapReady(p0: GoogleMap) {
+        gMap = p0
+        gMap.addMarker(MarkerOptions().position(transactionCoordinate).title("Transaction Location"))
+        gMap.moveCamera(com.google.android.gms.maps.CameraUpdateFactory.newLatLngZoom(transactionCoordinate, 15f))
+    }
+
+    private fun getLocation() {
+        saveButton.visibility = View.GONE
         try {
             gpsService.getLocation { location ->
                 transactionLocation = gpsService.transformToReadable(location)
                 etLocation.setText(transactionLocation)
+                val loc = gpsService.getCurrentCoordinates()!!
+                transactionCoordinate = LatLng(loc.latitude, loc.longitude)
+                gMap.addMarker(MarkerOptions().position(transactionCoordinate).title("Transaction Location"))
+                gMap.moveCamera(com.google.android.gms.maps.CameraUpdateFactory.newLatLngZoom(transactionCoordinate, 15f))
+                saveButton.visibility = View.VISIBLE
             }
         } catch (e: Exception) {
             Toast.makeText(requireContext(), "Please allow location", Toast.LENGTH_SHORT).show()
diff --git a/app/src/main/java/com/mhn/bondoman/utils/LocationAdapter.kt b/app/src/main/java/com/mhn/bondoman/utils/LocationAdapter.kt
index f61dc4b..74cf6af 100644
--- a/app/src/main/java/com/mhn/bondoman/utils/LocationAdapter.kt
+++ b/app/src/main/java/com/mhn/bondoman/utils/LocationAdapter.kt
@@ -14,8 +14,8 @@ import androidx.core.content.ContextCompat
 import java.io.IOException
 import java.util.Locale
 
-class LocationAdapter(val activity: Activity) {
-    private var locationManager: LocationManager
+class LocationAdapter(private val activity: Activity) {
+    private var locationManager: LocationManager = activity.getSystemService(Context.LOCATION_SERVICE) as LocationManager
     private var locationListener: LocationListener
     private var locationByGps: Location? = null
     private var locationListenerCallback: ((Location) -> Unit)? = null
@@ -34,7 +34,6 @@ class LocationAdapter(val activity: Activity) {
     }
 
     init {
-        locationManager = activity.getSystemService(Context.LOCATION_SERVICE) as LocationManager
 
         locationListener = object : LocationListener {
             override fun onLocationChanged(location: Location) {
@@ -118,4 +117,11 @@ class LocationAdapter(val activity: Activity) {
         }
         return null
     }
+
+    fun getCurrentCoordinates(): Location? {
+        val location = Location("")
+        location.latitude = locationByGps?.latitude ?: 6.9280835
+        location.longitude = locationByGps?.longitude ?: 107.7690498
+        return location
+    }
 }
\ No newline at end of file
-- 
GitLab