diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b27415d983e652133d2a97e1589f5466b2f0139c..1121e4ea78df542ef5edbb42ab0a8284fdfefa78 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 bfce828dde64304855a8f45c60ee8ad4be8fce21..dd0109049113a2495ced8eb1ae9dce4735bb56e5 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 64d11bd16dfd86e5b8e6763f5c8163da21134719..11a06b584859a4b205a2ed1d90d17c0279f8a76f 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,44 @@ 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 +69,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,7 +88,7 @@ class AddTransaction : AppCompatActivity() { } finish() } - + getLastLocation() } override fun onBackPressed() { @@ -91,12 +96,6 @@ class AddTransaction : AppCompatActivity() { finish() } - 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") @@ -120,4 +119,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 { + locationText.setText("${latitude}, ${longitude}") + } + } 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 3218e5da3cd1442968e31001f77895541a1bd4f7..ca10024840556fb159f2170f8efe56d482afa613 100644 --- a/app/src/main/java/com/example/bondoman/activities/EditTransaction.kt +++ b/app/src/main/java/com/example/bondoman/activities/EditTransaction.kt @@ -1,31 +1,25 @@ 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.net.Uri 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() { private lateinit var tokenExpiredReceiver: BroadcastReceiver private lateinit var tokenServiceIntent : Intent private var isReceiverRegistered = false + private lateinit var location : EditText override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_edit_transaksi) @@ -54,8 +48,8 @@ class EditTransaction() : AppCompatActivity() { val type : TextView = findViewById(R.id.editTextType) val title : EditText = findViewById(R.id.editTextTitle) val amount : EditText = findViewById(R.id.editTextAmount) - val location : EditText = findViewById(R.id.editTextLocation) - + location = findViewById(R.id.editTextLocation) + val seeLocationText : TextView = findViewById(R.id.textViewSeeLocationLabel) val intentData = intent title.setText(intentData?.getStringExtra("title") ?: "") @@ -92,7 +86,9 @@ class EditTransaction() : AppCompatActivity() { } finish() } - + seeLocationText.setOnClickListener { + seeLocation() + } } override fun onBackPressed() { @@ -124,4 +120,11 @@ class EditTransaction() : AppCompatActivity() { } } + private fun seeLocation(){ + val locationText = location.text.toString() + val gmmIntentUri = Uri.parse("geo:0,0?q=$locationText") + val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri) + mapIntent.setPackage("com.google.android.apps.maps") + startActivity(mapIntent) + } } \ No newline at end of file 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 8ed2971de92abec9d984a6786f6fb6fa8089e737..2c8e505e2c9468c16d6986719898abb10f1b2ea9 100644 --- a/app/src/main/java/com/example/bondoman/activities/LoginActivity.kt +++ b/app/src/main/java/com/example/bondoman/activities/LoginActivity.kt @@ -5,7 +5,6 @@ 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.os.Handler import android.util.DisplayMetrics @@ -17,14 +16,12 @@ import android.widget.Button import android.widget.EditText import android.widget.ImageView import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity import androidx.cardview.widget.CardView 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 import kotlin.math.log diff --git a/app/src/main/java/com/example/bondoman/adapter/RecyclerViewAdapter.kt b/app/src/main/java/com/example/bondoman/adapter/RecyclerViewAdapter.kt index c579deb752c851a599164a896d57af4ee392a36d..f902d359ea6774fb28232564d0ce48dca4bdd2df 100644 --- a/app/src/main/java/com/example/bondoman/adapter/RecyclerViewAdapter.kt +++ b/app/src/main/java/com/example/bondoman/adapter/RecyclerViewAdapter.kt @@ -4,10 +4,7 @@ import android.content.Intent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Button -import android.widget.TextView import androidx.cardview.widget.CardView -import androidx.core.content.ContextCompat.startActivity import androidx.lifecycle.LiveData import androidx.recyclerview.widget.RecyclerView import com.example.bondoman.R diff --git a/app/src/main/java/com/example/bondoman/adapter/TransactionListAdapter.kt b/app/src/main/java/com/example/bondoman/adapter/TransactionListAdapter.kt index b0ba205fba51770a6adc4809d3bc5390729123a1..81dbe187d02afcea8788ffa240d159765a87f347 100644 --- a/app/src/main/java/com/example/bondoman/adapter/TransactionListAdapter.kt +++ b/app/src/main/java/com/example/bondoman/adapter/TransactionListAdapter.kt @@ -6,7 +6,6 @@ import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.cardview.widget.CardView -import androidx.lifecycle.LiveData import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView @@ -15,7 +14,6 @@ import com.example.bondoman.activities.EditTransaction import com.example.bondoman.entities.Transaction import com.example.bondoman.lib.SecurePreferences import com.example.bondoman.viewModels.TransactionsViewModel -import java.text.SimpleDateFormat import java.time.LocalDate import java.time.format.DateTimeFormatter import java.util.Locale diff --git a/app/src/main/java/com/example/bondoman/apiServices/IAuthService.kt b/app/src/main/java/com/example/bondoman/apiServices/IAuthService.kt index 9112f0914cc5e33a9a6c2572a9499121eacdbf37..172847f50a5d6a714e14a4476d4b1e2dc0a53c27 100644 --- a/app/src/main/java/com/example/bondoman/apiServices/IAuthService.kt +++ b/app/src/main/java/com/example/bondoman/apiServices/IAuthService.kt @@ -1,6 +1,5 @@ package com.example.bondoman.apiServices -import retrofit2.Call import retrofit2.http.Body import retrofit2.http.Header import retrofit2.http.POST 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 637784ae3200acad88f00fc414faf1387aa73ded..c62887fd669ca369a7933b385c8d784adc43ade0 100644 --- a/app/src/main/java/com/example/bondoman/fragments/TransaksiFragment.kt +++ b/app/src/main/java/com/example/bondoman/fragments/TransaksiFragment.kt @@ -7,14 +7,12 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Toast import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.example.bondoman.R import com.example.bondoman.activities.AddTransaction -import com.example.bondoman.activities.EditTransaction import com.example.bondoman.adapter.TransactionListAdapter import com.example.bondoman.database.TransactionDatabase import com.example.bondoman.entities.Transaction @@ -47,14 +45,11 @@ class TransaksiFragment : Fragment() { securePreferences = SecurePreferences(requireContext()) } - 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, securePreferences) recyclerView.layoutManager = LinearLayoutManager(requireContext()) @@ -79,8 +74,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/java/com/example/bondoman/fragments/TwibbonFragment.kt b/app/src/main/java/com/example/bondoman/fragments/TwibbonFragment.kt index d3bea777cb6c5294354d6a937dd1182cd63d2660..a69442a1dce9773f2d8a187dc44c084ad07dfa2c 100644 --- a/app/src/main/java/com/example/bondoman/fragments/TwibbonFragment.kt +++ b/app/src/main/java/com/example/bondoman/fragments/TwibbonFragment.kt @@ -4,10 +4,7 @@ import android.Manifest import android.content.pm.PackageManager import android.graphics.Bitmap import android.graphics.BitmapFactory -import android.graphics.ImageFormat import android.graphics.Matrix -import android.graphics.Rect -import android.graphics.YuvImage import android.hardware.camera2.CameraCharacteristics import android.media.ExifInterface import android.media.Image @@ -34,7 +31,6 @@ import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import com.example.bondoman.R import java.io.ByteArrayInputStream -import java.io.ByteArrayOutputStream import java.util.concurrent.ExecutorService import java.util.concurrent.Executors diff --git a/app/src/main/java/com/example/bondoman/repositories/AuthRepository.kt b/app/src/main/java/com/example/bondoman/repositories/AuthRepository.kt index 430b7e15aa1dc4dae782800832ea6045e7740219..5192451aed57d31f4e931e2d2897d8ba7a52de2d 100644 --- a/app/src/main/java/com/example/bondoman/repositories/AuthRepository.kt +++ b/app/src/main/java/com/example/bondoman/repositories/AuthRepository.kt @@ -2,7 +2,6 @@ package com.example.bondoman.repositories import android.util.Log import com.example.bondoman.apiServices.IAuthService -import com.example.bondoman.apiServices.IScanService import com.example.bondoman.apiServices.LoginRequest import com.example.bondoman.lib.SecurePreferences import com.example.bondoman.retrofits.Retro 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 0000000000000000000000000000000000000000..d52a85d7b663e9a892310ff7faccf2bd6157f31e --- /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>