diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8a1418fef3c0d1f4a88559e27ff88b9eada4c47d..6de6eadec6f69618daad92f1a499196e1c6cad9f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -37,6 +37,7 @@ android { } dependencies { + implementation("com.google.android.gms:play-services-location:21.2.0") val roomVersion = "2.6.1" implementation("androidx.core:core-ktx:1.8.0") diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 19a7945c0328370bb1578a3f67d095c2558f6997..cc68fa5c04a4be34bc896f7002634906606dca37 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,8 +2,9 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> - <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> + <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> + <uses-permission android:name="android.permission.INTERNET" /> <application android:name=".ui.transactions.TransactionsApplication" diff --git a/app/src/main/java/com/example/bondoyap/ui/transactions/AddTransactionsFragment.kt b/app/src/main/java/com/example/bondoyap/ui/transactions/AddTransactionsFragment.kt index 00f3673be3940831dc3fd5c94bd51fbbe70ceca1..3bd484ddb198fcd7c934173ec83caf05cb990ee5 100644 --- a/app/src/main/java/com/example/bondoyap/ui/transactions/AddTransactionsFragment.kt +++ b/app/src/main/java/com/example/bondoyap/ui/transactions/AddTransactionsFragment.kt @@ -1,15 +1,20 @@ package com.example.bondoyap.ui.transactions import android.R +import android.content.pm.PackageManager import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ArrayAdapter +import android.widget.TextView import android.widget.Toast +import androidx.core.app.ActivityCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import com.example.bondoyap.databinding.FragmentAddTransactionsBinding +import com.google.android.gms.location.FusedLocationProviderClient +import com.google.android.gms.location.LocationServices import java.text.SimpleDateFormat import java.util.Date import java.util.Locale @@ -26,6 +31,10 @@ class AddTransactionsFragment : Fragment() { TransactionsViewModelFactory((requireContext().applicationContext as TransactionsApplication).repository) } + private lateinit var fusedLocationProviderClient: FusedLocationProviderClient + private lateinit var latitude: String + private lateinit var longitude: String + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -42,7 +51,18 @@ class AddTransactionsFragment : Fragment() { adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item) binding.spinnerKategori.adapter = adapter + fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(requireContext()) + if ( + ActivityCompat.checkSelfPermission(requireContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) + != PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission(requireContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) + != PackageManager.PERMISSION_GRANTED + ) { + ActivityCompat.requestPermissions(requireActivity(), + arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION), 100 + ) + } binding.buttonSimpan.setOnClickListener { val isPemasukan: Boolean = when (binding.spinnerKategori.selectedItem.toString()) { @@ -65,14 +85,40 @@ class AddTransactionsFragment : Fragment() { 0.0 } - val transaction: Transactions = Transactions( - judul = judul, - nominal = nominal, - isPemasukan = isPemasukan, - tanggal = currentDate - ) + val location = fusedLocationProviderClient.lastLocation + location.addOnSuccessListener { + if(it != null) { + latitude = it.latitude.toString() + longitude = it.longitude.toString() + + val transaction: Transactions = Transactions( + judul = judul, + nominal = nominal, + isPemasukan = isPemasukan, + tanggal = currentDate, + longitude = longitude, + latitude = latitude + ) + transactionsViewModel.upsert(transaction) + } + } - transactionsViewModel.upsert(transaction) + if( + ActivityCompat.checkSelfPermission(requireContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) + != PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission(requireContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) + != PackageManager.PERMISSION_GRANTED + ) { + val transaction: Transactions = Transactions( + judul = judul, + nominal = nominal, + isPemasukan = isPemasukan, + tanggal = currentDate, + longitude = "", + latitude = "" + ) + transactionsViewModel.upsert(transaction) + } Toast.makeText(requireContext(), "Transaksi berhasil disimpan", Toast.LENGTH_SHORT).show() diff --git a/app/src/main/java/com/example/bondoyap/ui/transactions/EditTransactionsFragment.kt b/app/src/main/java/com/example/bondoyap/ui/transactions/EditTransactionsFragment.kt index a10402e363f98fbf0301093d1481508e1a96aec7..025e2796bb9065f35490a6fa76392895cc5ebc36 100644 --- a/app/src/main/java/com/example/bondoyap/ui/transactions/EditTransactionsFragment.kt +++ b/app/src/main/java/com/example/bondoyap/ui/transactions/EditTransactionsFragment.kt @@ -2,7 +2,14 @@ package com.example.bondoyap.ui.transactions import android.R import android.app.AlertDialog +import android.content.Intent +import android.content.pm.PackageManager +import android.location.Address +import android.location.Geocoder +import android.net.Uri import android.os.Bundle +import android.os.Handler +import android.os.Looper import android.text.Editable import android.text.Spannable import android.text.SpannableStringBuilder @@ -11,14 +18,19 @@ import android.view.View import android.view.ViewGroup import android.widget.ArrayAdapter import android.widget.Toast +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import com.example.bondoyap.databinding.FragmentAddTransactionsBinding import com.example.bondoyap.databinding.FragmentEditTransactionsBinding +import com.google.android.gms.location.FusedLocationProviderClient +import com.google.android.gms.location.LocationServices import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.launch +import java.util.Locale class EditTransactionsFragment : Fragment() { @@ -32,6 +44,8 @@ class EditTransactionsFragment : Fragment() { TransactionsViewModelFactory((requireContext().applicationContext as TransactionsApplication).repository) } + private lateinit var fusedLocationProviderClient: FusedLocationProviderClient + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -40,6 +54,8 @@ class EditTransactionsFragment : Fragment() { _binding = FragmentEditTransactionsBinding.inflate(inflater, container, false) var tanggal: String = "" + var latitude = "" + var longitude = "" val pemasukan = "Pemasukan" val pengeluaran = "Pengeluaran" @@ -51,6 +67,7 @@ class EditTransactionsFragment : Fragment() { binding.spinnerKategori.adapter = adapter binding.spinnerKategori.isEnabled = false + binding.editTextLokasi.isEnabled = false val transactionId: Int = arguments?.getInt("transaction_id") ?: -1 @@ -68,7 +85,54 @@ class EditTransactionsFragment : Fragment() { } tanggal = originalTransaction.tanggal + longitude = originalTransaction.longitude + latitude = originalTransaction.latitude + + if (originalTransaction.longitude.isEmpty() || originalTransaction.latitude.isEmpty()) { + binding.editTextLokasi.text = SpannableStringBuilder("Unavailable") + } else { + val addresses: List<Address> = + Geocoder(requireContext(), Locale.getDefault()).getFromLocation( + originalTransaction.latitude.toDouble(), + originalTransaction.longitude.toDouble(), + 1 + ) ?: emptyList() + if (addresses.isNotEmpty()) { + val locationName = addresses[0].getAddressLine(0) + Handler(Looper.getMainLooper()).post { + binding.editTextLokasi.text = SpannableStringBuilder(locationName) + } + } + } + } + + fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(requireContext()) + + if ( + ActivityCompat.checkSelfPermission(requireContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) + != PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission(requireContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) + != PackageManager.PERMISSION_GRANTED + ) { + ActivityCompat.requestPermissions(requireActivity(), + arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION), 100 + ) + } + binding.checkboxUpdateLokasi.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + if ( + ActivityCompat.checkSelfPermission(requireContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) + != PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission(requireContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) + != PackageManager.PERMISSION_GRANTED + ) { + ActivityCompat.requestPermissions(requireActivity(), + arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION), 100 + ) + binding.checkboxUpdateLokasi.isChecked = false + } + } } binding.buttonUpdate.setOnClickListener { @@ -94,9 +158,24 @@ class EditTransactionsFragment : Fragment() { nominal = nominal, isPemasukan = isPemasukan, tanggal = tanggal, + longitude = longitude, + latitude = latitude, id = transactionId ) + if (binding.checkboxUpdateLokasi.isChecked) { + val location = fusedLocationProviderClient.lastLocation + location.addOnSuccessListener { + if (it != null) { + latitude = it.latitude.toString() + longitude = it.longitude.toString() + + transaction.latitude = latitude + transaction.longitude = longitude + } + } + } + showConfirmationDialog("Update", "Apakah Anda yakin ingin memperbarui transaksi ini?") { transactionsViewModel.upsert(transaction) @@ -104,6 +183,19 @@ class EditTransactionsFragment : Fragment() { binding.editTextNominal.text = SpannableStringBuilder(transaction.nominal.toBigDecimal().toString()) + val addresses: List<Address> = + Geocoder(requireContext(), Locale.getDefault()).getFromLocation( + transaction.latitude.toDouble(), + transaction.longitude.toDouble(), + 1 + ) ?: emptyList() + if (addresses.isNotEmpty()) { + val locationName = addresses[0].getAddressLine(0) + Handler(Looper.getMainLooper()).post { + binding.editTextLokasi.text = SpannableStringBuilder(locationName) + } + } + if (transaction.isPemasukan) { binding.spinnerKategori.setSelection(categories.indexOf(pemasukan)) } else { @@ -111,6 +203,8 @@ class EditTransactionsFragment : Fragment() { } Toast.makeText(requireContext(), "Transaksi berhasil diperbarui", Toast.LENGTH_SHORT).show() } + + } binding.buttonHapus.setOnClickListener { diff --git a/app/src/main/java/com/example/bondoyap/ui/transactions/Transactions.kt b/app/src/main/java/com/example/bondoyap/ui/transactions/Transactions.kt index c5e55dd1edfcd9ce3f0b704610a1bdb256e2ffbd..33e0b82c9ffb70dfdbd28074a4c2e7ef886c5528 100644 --- a/app/src/main/java/com/example/bondoyap/ui/transactions/Transactions.kt +++ b/app/src/main/java/com/example/bondoyap/ui/transactions/Transactions.kt @@ -18,8 +18,11 @@ data class Transactions( @ColumnInfo(name = "tanggal") val tanggal: String, - @ColumnInfo(name = "lokasi") - val lokasi: String = "", + @ColumnInfo(name = "longitude") + var longitude: String = "", + + @ColumnInfo(name = "latitude") + var latitude: String = "", @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id") diff --git a/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsFragment.kt b/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsFragment.kt index 02ae440ad0e4bcd1319ac5d03558c8c7614e3435..036cd83e1724a379928591b30b629adc6a195603 100644 --- a/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsFragment.kt +++ b/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsFragment.kt @@ -1,9 +1,11 @@ package com.example.bondoyap.ui.transactions +import android.content.pm.PackageManager import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.app.ActivityCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.Observer @@ -25,6 +27,8 @@ class TransactionsFragment: Fragment() { TransactionsViewModelFactory((requireContext().applicationContext as TransactionsApplication).repository) } + private val requestcode: Int = 1 + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -33,7 +37,7 @@ class TransactionsFragment: Fragment() { _binding = FragmentTransactionsBinding.inflate(inflater, container, false) val recyclerView = binding.root.findViewById<RecyclerView>(R.id.recyclerViewTransactions) - val adapter = TransactionsListAdapter() + val adapter = TransactionsListAdapter(context = requireContext()) recyclerView.adapter = adapter recyclerView.layoutManager = LinearLayoutManager(requireContext()) diff --git a/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsListAdapter.kt b/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsListAdapter.kt index c79ddd8aa82c0a4346cbba83b424f23f1822c9f6..7ce3edd1637d5247920f3c1a07b148fd3fbf648e 100644 --- a/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsListAdapter.kt +++ b/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsListAdapter.kt @@ -1,23 +1,37 @@ package com.example.bondoyap.ui.transactions +import android.content.Context +import android.content.Intent +import android.location.Address +import android.location.Geocoder +import android.net.Uri import android.os.Bundle +import android.os.Handler +import android.os.Looper import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView +import android.widget.Toast import androidx.cardview.widget.CardView +import androidx.core.content.ContextCompat.startActivity import androidx.navigation.Navigation import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.example.bondoyap.R +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import java.io.IOException +import java.util.Locale -class TransactionsListAdapter : +class TransactionsListAdapter(private val context: Context) : ListAdapter<Transactions, TransactionsViewHolder>(TransactionsDiffCallback()) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TransactionsViewHolder { - return TransactionsViewHolder.create(parent) + return TransactionsViewHolder.create(parent, context) } override fun onBindViewHolder(holder: TransactionsViewHolder, position: Int) { @@ -27,18 +41,21 @@ class TransactionsListAdapter : } -class TransactionsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { +class TransactionsViewHolder(itemView: View, private val context: Context) : RecyclerView.ViewHolder(itemView) { private val cardView: CardView = itemView.findViewById(R.id.cardViewTransaction) private val transactionTitle: TextView = itemView.findViewById(R.id.transactionTitle) private val transactionAmount: TextView = itemView.findViewById(R.id.transactionAmount) private val transactionCategory: TextView = itemView.findViewById(R.id.transactionCategory) private val transactionDate: TextView = itemView.findViewById(R.id.transactionDate) + private val transactionLocation: TextView = itemView.findViewById(R.id.transactionLocation) + private val geocoder: Geocoder = Geocoder(context, Locale.getDefault()) fun bind(transaction: Transactions) { val maxAmountLength = 12 - val maxTitleLength = 19 + val maxTitleLength = 16 + val maxLocationLength = 9 - val amountText = if (transaction.nominal.toString().length > maxAmountLength) { + val amountText = if (transaction.nominal.toBigDecimal().toString().length > maxAmountLength) { "IDR " + transaction.nominal.toBigDecimal().toString().substring(0, maxAmountLength) + "..." } else { "IDR " + transaction.nominal.toBigDecimal().toString() @@ -56,8 +73,53 @@ class TransactionsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) true -> "Pemasukan" else -> "Pengeluaran" } + transactionDate.text = transaction.tanggal + if (transaction.latitude.isNotEmpty() && transaction.longitude.isNotEmpty()) { + CoroutineScope(Dispatchers.IO).launch { + try { + val addresses: List<Address> = geocoder.getFromLocation( + transaction.latitude.toDouble(), + transaction.longitude.toDouble(), + 1 + ) ?: emptyList() + if (addresses.isNotEmpty()) { + val locationName = addresses[0].getAddressLine(0) + Handler(Looper.getMainLooper()).post { + transactionLocation.text = if (locationName.length > maxLocationLength) { + locationName.substring(0, maxLocationLength) + "..." + } else { + locationName + } + } + } + } catch (e: IOException) { + e.printStackTrace() + } + } + } else { + transactionLocation.text = "Unavailable" + } + + transactionLocation.setOnClickListener { + if (transactionLocation.text != "Unavailable") { + val mapUri = Uri.parse("https://maps.google.com/maps/search/?api=1&query=${transaction.latitude},${transaction.longitude}") + val intent = Intent(Intent.ACTION_VIEW, mapUri) + intent.setPackage("com.google.android.apps.maps") + if (intent.resolveActivity(context.packageManager) != null) { + startActivity(context, intent, null) + } else { + val webIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.com/maps/search/?api=1&query=${transaction.latitude},${transaction.longitude}")) + if (webIntent.resolveActivity(context.packageManager) != null) { + startActivity(context, webIntent, null) + } else { + Toast.makeText(context, "Tidak ada app yang dapat menghandle maps", Toast.LENGTH_SHORT).show() + } + } + } + } + cardView.setOnClickListener { val bundle: Bundle = Bundle() bundle.putInt("transaction_id", transaction.id) @@ -66,10 +128,10 @@ class TransactionsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) } companion object { - fun create(parent: ViewGroup): TransactionsViewHolder { + fun create(parent: ViewGroup, context: Context): TransactionsViewHolder { val view: View = LayoutInflater.from(parent.context) .inflate(R.layout.recyclerview_transactions, parent, false) - return TransactionsViewHolder(view) + return TransactionsViewHolder(view, context) } } } diff --git a/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsRoomDatabase.kt b/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsRoomDatabase.kt index b5e530fdd2363d8ca3ad5e4c0dcbea8db70df86b..6c46f75237fc62f154a52ee7bd29be85deb46e7d 100644 --- a/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsRoomDatabase.kt +++ b/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsRoomDatabase.kt @@ -9,7 +9,7 @@ import androidx.sqlite.db.SupportSQLiteDatabase @Database( entities = [Transactions::class], - version = 2, + version = 3, exportSchema = false ) public abstract class TransactionsRoomDatabase: RoomDatabase() { @@ -26,7 +26,7 @@ public abstract class TransactionsRoomDatabase: RoomDatabase() { context.applicationContext, TransactionsRoomDatabase::class.java, "transactions_database" - ).addMigrations(MIGRATION_1_2). + ).addMigrations(MIGRATION_2_3). build() INSTANCE = instance instance @@ -47,6 +47,22 @@ public abstract class TransactionsRoomDatabase: RoomDatabase() { db.execSQL("DROP TABLE transactions") + db.execSQL("ALTER TABLE transactions_new RENAME TO transactions") + } + } + private val MIGRATION_2_3: Migration = object : Migration(2, 3) { + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("CREATE TABLE IF NOT EXISTS `transactions_new` " + + "(`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + "`judul` TEXT NOT NULL, " + + "`nominal` REAL NOT NULL, " + + "`is_pemasukan` INTEGER NOT NULL, " + + "`tanggal` TEXT NOT NULL, " + + "`longitude` TEXT NOT NULL, " + + "`latitude` TEXT NOT NULL)") + + db.execSQL("DROP TABLE transactions") + db.execSQL("ALTER TABLE transactions_new RENAME TO transactions") } } diff --git a/app/src/main/res/drawable/ic_pin.xml b/app/src/main/res/drawable/ic_pin.xml new file mode 100644 index 0000000000000000000000000000000000000000..4304772446917f94787245ca25f0020e4a904ccd --- /dev/null +++ b/app/src/main/res/drawable/ic_pin.xml @@ -0,0 +1,10 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + + <path + android:fillColor="#FF000000" + android:pathData="M12,2C8.13,2 5,5.13 5,9c0,5.25 7,13 7,13s7,-7.75 7,-13c0,-3.87 -3.13,-7 -7,-7zM12,11.5c-1.38,0 -2.5,-1.12 -2.5,-2.5s1.12,-2.5 2.5,-2.5s2.5,1.12 2.5,2.5s-1.12,2.5 -2.5,2.5z"/> +</vector> diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 06ea6cae22113f243efe317f984f7742418737e8..bad97d63dc8bac143e499f7ff3a349305c72700f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -3,8 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/container" android:layout_width="match_parent" - android:layout_height="match_parent" - android:paddingTop="?attr/actionBarSize"> + android:layout_height="match_parent"> <com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/nav_view" diff --git a/app/src/main/res/layout/fragment_edit_transactions.xml b/app/src/main/res/layout/fragment_edit_transactions.xml index b1bf97d41befb893d99ccc4ca40255f2474c01bf..ea202d0be3584d842892ba196c00dd45967f3216 100644 --- a/app/src/main/res/layout/fragment_edit_transactions.xml +++ b/app/src/main/res/layout/fragment_edit_transactions.xml @@ -43,26 +43,42 @@ android:layout_height="wrap_content" android:layout_marginBottom="16dp" /> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/textfield_label_lokasi" /> + <EditText + android:id="@+id/editText_lokasi" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:inputType="text|textMultiLine" + android:gravity="top"/> + + <CheckBox android:id="@+id/checkbox_update_lokasi" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Perbarui lokasi" /> + <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button - android:id="@+id/button_update" + android:id="@+id/button_hapus" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginEnd="8dp" - android:text="@string/button_update" /> + android:text="@string/button_hapus" + android:backgroundTint="@color/red"/> <Button - android:id="@+id/button_hapus" + android:id="@+id/button_update" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" - android:text="@string/button_hapus" - android:backgroundTint="@color/red"/> + android:text="@string/button_update" /> </LinearLayout> diff --git a/app/src/main/res/layout/fragment_transactions.xml b/app/src/main/res/layout/fragment_transactions.xml index 79600287495f8ba4d8189cd7ad96e48e21d423a7..ad4fddd01c2a89be080305241b2b70399ef56d7a 100644 --- a/app/src/main/res/layout/fragment_transactions.xml +++ b/app/src/main/res/layout/fragment_transactions.xml @@ -1,7 +1,8 @@ <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" - android:layout_height="match_parent" > + android:layout_height="match_parent" + android:layout_marginTop="16dp"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerViewTransactions" diff --git a/app/src/main/res/layout/recyclerview_transactions.xml b/app/src/main/res/layout/recyclerview_transactions.xml index 42a94517c6cc35b0707bbce31700af874f66d4c3..03524715210c6a87729033adc340fe07537e8e47 100644 --- a/app/src/main/res/layout/recyclerview_transactions.xml +++ b/app/src/main/res/layout/recyclerview_transactions.xml @@ -67,7 +67,8 @@ android:layout_height="wrap_content" android:textSize="16sp" android:text="Lokasi" - android:layout_marginTop="36dp"/> + android:layout_marginTop="36dp" + app:drawableLeftCompat="@drawable/ic_pin" /> </LinearLayout>