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