Skip to content
Snippets Groups Projects
Commit 2227f0bb authored by Ahmad Nadil's avatar Ahmad Nadil
Browse files

refactor: use latitude and longitude for transaction location

parent 2e92335f
1 merge request!27Staging
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
android:maxSdkVersion="18" /> android:maxSdkVersion="18" />
<application <application
android:name=".BondomanApp" android:name=".BondomanApp"
android:allowBackup="true" android:allowBackup="false"
android:dataExtractionRules="@xml/data_extraction_rules" android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules" android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
...@@ -21,7 +21,8 @@ ...@@ -21,7 +21,8 @@
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.Bondoman" android:theme="@style/Theme.Bondoman"
tools:targetApi="31"> tools:targetApi="31"
>
<provider <provider
android:name="androidx.core.content.FileProvider" android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider" android:authorities="${applicationId}.provider"
......
...@@ -18,8 +18,8 @@ data class Transaction( ...@@ -18,8 +18,8 @@ data class Transaction(
@ColumnInfo(name = "transaction_price") val transaction_price: Int, @ColumnInfo(name = "transaction_price") val transaction_price: Int,
@ColumnInfo(name = "transaction_category") val transaction_category: String, @ColumnInfo(name = "transaction_category") val transaction_category: String,
@ColumnInfo(name = "transaction_location") val transaction_location: String, @ColumnInfo(name = "transaction_location") val transaction_location: String,
// @ColumnInfo(name = "transaction_latitude") val transaction_latitude: Double, @ColumnInfo(name = "transaction_latitude") val transaction_latitude: Double,
// @ColumnInfo(name = "transaction_longitude") val transaction_longitude: Double @ColumnInfo(name = "transaction_longitude") val transaction_longitude: Double
) )
data class TransactionSummary( data class TransactionSummary(
......
package com.mhn.bondoman.ui.scan package com.mhn.bondoman.ui.scan
import android.location.Location
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.navigation.findNavController
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.mhn.bondoman.database.KeyStoreManager import com.mhn.bondoman.database.KeyStoreManager
import com.mhn.bondoman.database.Transaction import com.mhn.bondoman.database.Transaction
import com.mhn.bondoman.databinding.FragmentScanResultBinding 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.ui.transactions.TransactionsViewModel
import com.mhn.bondoman.utils.LocationAdapter import com.mhn.bondoman.utils.LocationAdapter
import java.time.LocalDate import java.time.LocalDate
...@@ -29,6 +26,7 @@ class ScanResult : Fragment() { ...@@ -29,6 +26,7 @@ class ScanResult : Fragment() {
private lateinit var adapter: ScanResultAdapter private lateinit var adapter: ScanResultAdapter
private lateinit var viewModel: TransactionsViewModel private lateinit var viewModel: TransactionsViewModel
private lateinit var transactionLocation: String private lateinit var transactionLocation: String
private lateinit var transactionCoordinate: Location
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
...@@ -77,8 +75,8 @@ class ScanResult : Fragment() { ...@@ -77,8 +75,8 @@ class ScanResult : Fragment() {
transaction_category = "Outcome", transaction_category = "Outcome",
transaction_date= LocalDate.now().toString(), transaction_date= LocalDate.now().toString(),
transaction_location = transactionLocation, transaction_location = transactionLocation,
// transaction_latitude = 0.0, transaction_latitude = transactionCoordinate.latitude,
// transaction_longitude = 0.0 transaction_longitude = transactionCoordinate.longitude
) )
viewModel.addTransaction(_transaction) viewModel.addTransaction(_transaction)
} }
...@@ -93,6 +91,7 @@ class ScanResult : Fragment() { ...@@ -93,6 +91,7 @@ class ScanResult : Fragment() {
try { try {
gpsService.getLocation { location -> gpsService.getLocation { location ->
transactionLocation = gpsService.transformToReadable(location) transactionLocation = gpsService.transformToReadable(location)
transactionCoordinate = gpsService.getCurrentCoordinates()!!
binding.fabAddTransaction.visibility = View.VISIBLE binding.fabAddTransaction.visibility = View.VISIBLE
} }
} catch (e: Exception) { } catch (e: Exception) {
......
...@@ -2,7 +2,6 @@ package com.mhn.bondoman.ui.transactions ...@@ -2,7 +2,6 @@ package com.mhn.bondoman.ui.transactions
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.location.Location
import android.net.Uri import android.net.Uri
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
...@@ -42,11 +41,9 @@ class TransactionAdapter( ...@@ -42,11 +41,9 @@ class TransactionAdapter(
onItemClick(transaction.transaction_id ?: 0) onItemClick(transaction.transaction_id ?: 0)
} }
binding.Location.setOnClickListener { binding.Location.setOnClickListener {
val location: Location? = val gmmIntentUri =
locationService.transformToCoord(binding.Location.text.toString()) Uri.parse("geo:0,0?q=${transaction.transaction_latitude},${transaction.transaction_longitude}")
val gmmIntentUri = Uri.parse("geo:${location?.latitude},${location?.longitude}")
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri) val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
mapIntent.setPackage("com.google.android.apps.maps")
activity.startActivity(mapIntent) activity.startActivity(mapIntent)
} }
} }
......
...@@ -45,6 +45,7 @@ class TransactionAdd : Fragment(), OnMapReadyCallback { ...@@ -45,6 +45,7 @@ class TransactionAdd : Fragment(), OnMapReadyCallback {
private lateinit var viewModel: TransactionsViewModel private lateinit var viewModel: TransactionsViewModel
private lateinit var taViewModel: TransactionAddViewModel private lateinit var taViewModel: TransactionAddViewModel
private lateinit var gMap: GoogleMap private lateinit var gMap: GoogleMap
private lateinit var transactionCoordinate: LatLng
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
...@@ -82,14 +83,7 @@ class TransactionAdd : Fragment(), OnMapReadyCallback { ...@@ -82,14 +83,7 @@ class TransactionAdd : Fragment(), OnMapReadyCallback {
addButton = binding.saveButton addButton = binding.saveButton
val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this) mapFragment.getMapAsync(this)
val locationGet = gpsService.getLocation { 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))
}
addButton.setOnClickListener { addButton.setOnClickListener {
// Save the Items into the Database // Save the Items into the Database
val email = KeyStoreManager.getInstance(requireContext()).getEmail() val email = KeyStoreManager.getInstance(requireContext()).getEmail()
...@@ -114,9 +108,9 @@ class TransactionAdd : Fragment(), OnMapReadyCallback { ...@@ -114,9 +108,9 @@ class TransactionAdd : Fragment(), OnMapReadyCallback {
transaction_price = etNominal.text.toString().toInt(), transaction_price = etNominal.text.toString().toInt(),
transaction_category = etKategori.selectedItem.toString(), transaction_category = etKategori.selectedItem.toString(),
transaction_location = etLocation.text.toString(), transaction_location = etLocation.text.toString(),
transaction_date = LocalDate.now().toString() transaction_date = LocalDate.now().toString(),
// transaction_latitude = 0.0, transaction_latitude = transactionCoordinate.latitude,
// transaction_longitude = 0.0 transaction_longitude = transactionCoordinate.longitude
) )
viewModel.addTransaction(newTransaction) viewModel.addTransaction(newTransaction)
// redirect to the transaction list // redirect to the transaction list
...@@ -127,19 +121,6 @@ class TransactionAdd : Fragment(), OnMapReadyCallback { ...@@ -127,19 +121,6 @@ class TransactionAdd : Fragment(), OnMapReadyCallback {
return binding.root 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() { override fun onResume() {
super.onResume() super.onResume()
broadcastReceiver = object : BroadcastReceiver() { broadcastReceiver = object : BroadcastReceiver() {
...@@ -167,4 +148,21 @@ class TransactionAdd : Fragment(), OnMapReadyCallback { ...@@ -167,4 +148,21 @@ class TransactionAdd : Fragment(), OnMapReadyCallback {
override fun onMapReady(p0: GoogleMap) { override fun onMapReady(p0: GoogleMap) {
gMap = p0 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
package com.mhn.bondoman.ui.transactions package com.mhn.bondoman.ui.transactions
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Button
import android.widget.Toast import android.widget.Toast
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.navigation.findNavController 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.google.android.material.textfield.TextInputEditText
import com.mhn.bondoman.R
import com.mhn.bondoman.database.Transaction import com.mhn.bondoman.database.Transaction
import com.mhn.bondoman.databinding.FragmentTransactionUpdateBinding import com.mhn.bondoman.databinding.FragmentTransactionUpdateBinding
import com.mhn.bondoman.utils.LocationAdapter import com.mhn.bondoman.utils.LocationAdapter
class TransactionUpdate : Fragment() { class TransactionUpdate : Fragment(), OnMapReadyCallback {
private var _binding: FragmentTransactionUpdateBinding? = null private var _binding: FragmentTransactionUpdateBinding? = null
private var currentTransaction: Transaction? = null private var currentTransaction: Transaction? = null
private lateinit var viewModel: TransactionsViewModel private lateinit var viewModel: TransactionsViewModel
...@@ -21,7 +29,11 @@ class TransactionUpdate : Fragment() { ...@@ -21,7 +29,11 @@ class TransactionUpdate : Fragment() {
private lateinit var etTitle: TextInputEditText private lateinit var etTitle: TextInputEditText
private lateinit var etNominal: TextInputEditText private lateinit var etNominal: TextInputEditText
private lateinit var etLocation: TextInputEditText private lateinit var etLocation: TextInputEditText
private lateinit var saveButton: Button
private lateinit var updateLocationButton: Button
private lateinit var transactionLocation: String private lateinit var transactionLocation: String
private lateinit var transactionCoordinate: LatLng
private lateinit var gMap: GoogleMap
private val binding get() = _binding!! private val binding get() = _binding!!
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
...@@ -42,6 +54,8 @@ class TransactionUpdate : Fragment() { ...@@ -42,6 +54,8 @@ class TransactionUpdate : Fragment() {
etTitle = binding.etTitle etTitle = binding.etTitle
etNominal = binding.etNominal etNominal = binding.etNominal
etLocation = binding.etLokasi etLocation = binding.etLokasi
saveButton = binding.saveButton
updateLocationButton = binding.updateLocationButton
val transactionId = TransactionUpdateArgs.fromBundle(requireArguments()).transactionId val transactionId = TransactionUpdateArgs.fromBundle(requireArguments()).transactionId
viewModel.getTransactionById(transactionId) viewModel.getTransactionById(transactionId)
...@@ -51,13 +65,28 @@ class TransactionUpdate : Fragment() { ...@@ -51,13 +65,28 @@ class TransactionUpdate : Fragment() {
binding.etTitle.setText(transaction!!.transaction_name.toString()) binding.etTitle.setText(transaction!!.transaction_name.toString())
binding.etNominal.setText(transaction.transaction_price.toString()) binding.etNominal.setText(transaction.transaction_price.toString())
binding.etLokasi.setText(transaction.transaction_location.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 { binding.saveButton.setOnClickListener {
currentTransaction?.let { transaction -> currentTransaction?.let { transaction ->
val updatedTransaction = transaction.copy( val updatedTransaction = transaction.copy(
transaction_name = etTitle.text.toString(), transaction_name = etTitle.text.toString(),
transaction_price = etNominal.text.toString().toIntOrNull() ?: 0, 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) viewModel.updateTransaction(updatedTransaction)
Toast.makeText( Toast.makeText(
...@@ -74,12 +103,23 @@ class TransactionUpdate : Fragment() { ...@@ -74,12 +103,23 @@ class TransactionUpdate : Fragment() {
return binding.root return binding.root
} }
override fun onStart() { override fun onMapReady(p0: GoogleMap) {
super.onStart() 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 { try {
gpsService.getLocation { location -> gpsService.getLocation { location ->
transactionLocation = gpsService.transformToReadable(location) transactionLocation = gpsService.transformToReadable(location)
etLocation.setText(transactionLocation) 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) { } catch (e: Exception) {
Toast.makeText(requireContext(), "Please allow location", Toast.LENGTH_SHORT).show() Toast.makeText(requireContext(), "Please allow location", Toast.LENGTH_SHORT).show()
......
...@@ -14,8 +14,8 @@ import androidx.core.content.ContextCompat ...@@ -14,8 +14,8 @@ import androidx.core.content.ContextCompat
import java.io.IOException import java.io.IOException
import java.util.Locale import java.util.Locale
class LocationAdapter(val activity: Activity) { class LocationAdapter(private val activity: Activity) {
private var locationManager: LocationManager private var locationManager: LocationManager = activity.getSystemService(Context.LOCATION_SERVICE) as LocationManager
private var locationListener: LocationListener private var locationListener: LocationListener
private var locationByGps: Location? = null private var locationByGps: Location? = null
private var locationListenerCallback: ((Location) -> Unit)? = null private var locationListenerCallback: ((Location) -> Unit)? = null
...@@ -34,7 +34,6 @@ class LocationAdapter(val activity: Activity) { ...@@ -34,7 +34,6 @@ class LocationAdapter(val activity: Activity) {
} }
init { init {
locationManager = activity.getSystemService(Context.LOCATION_SERVICE) as LocationManager
locationListener = object : LocationListener { locationListener = object : LocationListener {
override fun onLocationChanged(location: Location) { override fun onLocationChanged(location: Location) {
...@@ -118,4 +117,11 @@ class LocationAdapter(val activity: Activity) { ...@@ -118,4 +117,11 @@ class LocationAdapter(val activity: Activity) {
} }
return null 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
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment