From d472952583d72301e7a823c42d45d3dc5effd63f Mon Sep 17 00:00:00 2001 From: Nathania Calista <nathania.calista01@gmail.com> Date: Mon, 1 Apr 2024 23:32:43 +0700 Subject: [PATCH] feat : get current location --- app/build.gradle.kts | 3 + app/src/main/AndroidManifest.xml | 3 + .../bondoman/activities/AddTransaction.kt | 79 ++++++++++++++----- .../bondoman/activities/EditTransaction.kt | 9 +-- .../bondoman/activities/LoginActivity.kt | 7 +- .../bondoman/fragments/TransaksiFragment.kt | 5 -- app/src/main/res/drawable/ic_search.xml | 9 +++ 7 files changed, 77 insertions(+), 38 deletions(-) create mode 100644 app/src/main/res/drawable/ic_search.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b27415d..1121e4e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -132,4 +132,7 @@ dependencies { implementation("androidx.camera:camera-video:$cameraxVersion") implementation("androidx.camera:camera-view:$cameraxVersion") implementation("androidx.camera:camera-extensions:$cameraxVersion") + + implementation("com.google.android.gms:play-services-location:17.0.0") + } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0105dde..7c379c5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,6 +6,9 @@ <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" /> + <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> + <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> + <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" diff --git a/app/src/main/java/com/example/bondoman/activities/AddTransaction.kt b/app/src/main/java/com/example/bondoman/activities/AddTransaction.kt index d5748fa..1213547 100644 --- a/app/src/main/java/com/example/bondoman/activities/AddTransaction.kt +++ b/app/src/main/java/com/example/bondoman/activities/AddTransaction.kt @@ -1,40 +1,43 @@ package com.example.bondoman.activities +import android.Manifest import android.app.Activity -import android.app.DatePickerDialog import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter -import android.graphics.Color +import android.content.pm.PackageManager +import android.location.Geocoder +import android.location.Location import android.os.Bundle -import android.text.TextUtils import android.util.Log -import android.view.View import android.widget.ArrayAdapter import android.widget.Button -import android.widget.DatePicker import android.widget.EditText +import android.widget.Spinner import androidx.appcompat.app.AppCompatActivity +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat import com.example.bondoman.R -import android.widget.Spinner -import com.example.bondoman.adapter.RecyclerViewAdapter -import com.example.bondoman.entities.Transaction import com.example.bondoman.services.TokenCheckService -import com.example.bondoman.viewModels.TransactionsViewModel -import java.util.Calendar -import java.util.Date +import com.google.android.gms.location.FusedLocationProviderClient +import com.google.android.gms.location.LocationServices +import java.io.IOException +import java.util.Locale class AddTransaction : AppCompatActivity() { private lateinit var tokenExpiredReceiver: BroadcastReceiver private lateinit var tokenServiceIntent : Intent private var isReceiverRegistered = false + private lateinit var fusedLocationClient: FusedLocationProviderClient + private lateinit var locationText : EditText override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_add_transaksi) tokenServiceIntent= Intent(this, TokenCheckService::class.java) startService(tokenServiceIntent) + fusedLocationClient = LocationServices.getFusedLocationProviderClient(this) tokenExpiredReceiver = object : BroadcastReceiver(){ override fun onReceive(context: Context?, intent: Intent?) { @@ -65,11 +68,12 @@ class AddTransaction : AppCompatActivity() { spinnerCategory.adapter = adapter val submitButton : Button = findViewById(R.id.buttonSubmit) + locationText = findViewById(R.id.editTextLocation) submitButton.setOnClickListener { val title = findViewById<EditText>(R.id.editTextTitle).text.toString() val category = spinnerCategory.selectedItem.toString() val amount = findViewById<EditText>(R.id.editTextAmount).text.toString().toFloatOrNull() ?: 0f - val location = findViewById<EditText>(R.id.editTextLocation).text.toString() + val location = locationText.text.toString() val replyIntent = Intent() if (title.isEmpty()) { @@ -83,15 +87,10 @@ class AddTransaction : AppCompatActivity() { } finish() } - + getLastLocation() } - companion object { - const val TITLE = "TITLE" - const val TYPE = "TYPE" - const val AMOUNT = "AMOUNT" - const val LOCATION = "LOCATION" - } + override fun onStart() { super.onStart() val filter = IntentFilter("com.example.bondoman.TOKEN_EXPIRED") @@ -115,4 +114,46 @@ class AddTransaction : AppCompatActivity() { isReceiverRegistered = false } } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (requestCode == REQUEST_LOCATION_PERMISSION) { + if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + getLastLocation() + } + } + } + private fun getLastLocation() { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + fusedLocationClient.lastLocation.addOnSuccessListener { location: Location? -> + location?.let { + updateLocationEditTextWithPlaceName(location.latitude, location.longitude) + } + } + }else { + ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), REQUEST_LOCATION_PERMISSION) + } + } + private fun updateLocationEditTextWithPlaceName(latitude: Double, longitude: Double) { + val geocoder = Geocoder(this, Locale.getDefault()) + try { + val addresses = geocoder.getFromLocation(latitude, longitude, 1) + if (addresses != null && addresses.isNotEmpty()) { + val address = addresses[0] + locationText.setText(address.getAddressLine(0).toString()) + } else { + Log.d("Location", "No address found for the location.") + } + } catch (e: IOException) { + Log.e("Location", "Service Not Available", e) + } + } + companion object { + const val TITLE = "TITLE" + const val TYPE = "TYPE" + const val AMOUNT = "AMOUNT" + const val LOCATION = "LOCATION" + const val REQUEST_LOCATION_PERMISSION = 1 // Define the constant here + + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoman/activities/EditTransaction.kt b/app/src/main/java/com/example/bondoman/activities/EditTransaction.kt index e34ca17..7ce6ec6 100644 --- a/app/src/main/java/com/example/bondoman/activities/EditTransaction.kt +++ b/app/src/main/java/com/example/bondoman/activities/EditTransaction.kt @@ -1,25 +1,18 @@ package com.example.bondoman.activities import android.app.Activity -import android.app.DatePickerDialog import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter -import android.graphics.Color import android.os.Bundle import android.util.Log -import android.view.View -import android.widget.ArrayAdapter import android.widget.Button -import android.widget.DatePicker import android.widget.EditText +import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import com.example.bondoman.R -import android.widget.Spinner -import android.widget.TextView import com.example.bondoman.services.TokenCheckService -import java.util.Calendar class EditTransaction() : AppCompatActivity() { diff --git a/app/src/main/java/com/example/bondoman/activities/LoginActivity.kt b/app/src/main/java/com/example/bondoman/activities/LoginActivity.kt index bd52792..423e0de 100644 --- a/app/src/main/java/com/example/bondoman/activities/LoginActivity.kt +++ b/app/src/main/java/com/example/bondoman/activities/LoginActivity.kt @@ -4,20 +4,15 @@ import android.app.Dialog import android.content.Intent import android.graphics.Color import android.graphics.drawable.ColorDrawable -import androidx.appcompat.app.AppCompatActivity import android.os.Bundle -import android.util.Log import android.widget.Button import android.widget.EditText import android.widget.Toast -import androidx.core.view.isVisible +import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope -import com.airbnb.lottie.LottieAnimationView import com.example.bondoman.R -import com.example.bondoman.apiServices.IAuthService import com.example.bondoman.lib.SecurePreferences import com.example.bondoman.repositories.AuthRepository -import com.example.bondoman.retrofits.Retro import kotlinx.coroutines.launch class LoginActivity : AppCompatActivity() { diff --git a/app/src/main/java/com/example/bondoman/fragments/TransaksiFragment.kt b/app/src/main/java/com/example/bondoman/fragments/TransaksiFragment.kt index 01244ec..ab51fec 100644 --- a/app/src/main/java/com/example/bondoman/fragments/TransaksiFragment.kt +++ b/app/src/main/java/com/example/bondoman/fragments/TransaksiFragment.kt @@ -44,14 +44,11 @@ class TransaksiFragment : Fragment() { super.onCreate(savedInstanceState) } - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val view = inflater.inflate(R.layout.fragment_transaksi, container, false) - - val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view) adapter = TransactionListAdapter(wordViewModel, ::itemEditRequest) recyclerView.layoutManager = LinearLayoutManager(requireContext()) @@ -76,8 +73,6 @@ class TransaksiFragment : Fragment() { override fun onActivityResult(requestCode: Int, resultCode: Int, intentData: Intent?) { super.onActivityResult(requestCode, resultCode, intentData) - Log.i("Masuk", "Masuk") - if (requestCode == newTransactionRequestCode && resultCode == Activity.RESULT_OK) { val title = intentData?.getStringExtra(AddTransaction.TITLE) ?: "" val amount = intentData?.getFloatExtra(AddTransaction.AMOUNT, 0.0f) ?: 0.0f diff --git a/app/src/main/res/drawable/ic_search.xml b/app/src/main/res/drawable/ic_search.xml new file mode 100644 index 0000000..d52a85d --- /dev/null +++ b/app/src/main/res/drawable/ic_search.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#000000" + android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zm-6,0C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/> +</vector> -- GitLab