diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7b4ca55af63b4342df03757cfad712a2523ca7dd..a3bd951c3e163d1da63123731e15f5743ca1284f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -82,4 +82,5 @@ dependencies { implementation("com.github.bumptech.glide:glide:4.12.0") implementation("com.github.AnyChart:AnyChart-Android:1.1.5") + implementation("com.github.PhilJay:MPAndroidChart:v3.1.0") } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e628eb6317e560fa6d58cecdcd67f6020cb4a67a..204ed94e48cb7db2c9a28e5788910b92217d7bb6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -29,7 +29,6 @@ <activity android:name=".MainActivity" - android:configChanges="orientation|uiMode" android:exported="true" android:label="@string/app_name"> <intent-filter> diff --git a/app/src/main/java/com/example/bandung_bondowoso/MainActivity.kt b/app/src/main/java/com/example/bandung_bondowoso/MainActivity.kt index 8a971fa2692bb98d1a119515e5548705e001629c..5805cb8c85a37312b3128db7e591983240f850ec 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/MainActivity.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/MainActivity.kt @@ -10,21 +10,20 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.navigation.findNavController import com.example.bandung_bondowoso.databinding.ActivityMainBinding import com.example.bandung_bondowoso.service.JwtCheckerService +import com.example.bandung_bondowoso.view.graph.GraphFragment import com.example.bandung_bondowoso.viewmodel.AuthViewModel import com.example.bandung_bondowoso.viewmodel.AuthViewModelFactory import com.google.android.material.bottomnavigation.BottomNavigationView class MainActivity : AppCompatActivity() { - private lateinit var binding: ActivityMainBinding + lateinit var binding: ActivityMainBinding private lateinit var authViewModel: AuthViewModel - override fun onCreate(savedInstanceState: Bundle?) { Log.d("MainActivity", "onCreate") super.onCreate(savedInstanceState) - binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) @@ -99,18 +98,6 @@ class MainActivity : AppCompatActivity() { Log.d("MainActivity", "onDestroy") } - enum class DarkModeConfig{ - YES, - NO, - FOLLOW_SYSTEM - } - fun shouldEnableDarkMode(darkModeConfig: DarkModeConfig){ - when(darkModeConfig){ - DarkModeConfig.YES -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) - DarkModeConfig.NO -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) - DarkModeConfig.FOLLOW_SYSTEM -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) - } - } } \ No newline at end of file diff --git a/app/src/main/java/com/example/bandung_bondowoso/helper/LocationHelper.kt b/app/src/main/java/com/example/bandung_bondowoso/helper/LocationHelper.kt new file mode 100644 index 0000000000000000000000000000000000000000..a5d5e066c483f9bd13c4487fcc1d18083a6a3cc2 --- /dev/null +++ b/app/src/main/java/com/example/bandung_bondowoso/helper/LocationHelper.kt @@ -0,0 +1,34 @@ +package com.example.bandung_bondowoso.helper + +import android.content.Context +import android.location.Address +import android.location.Geocoder +import java.util.Locale + +class LocationHelper(private val context: Context) { + @Suppress("DEPRECATION") + fun setLocationByLatLong( + lat: Double, + lang: Double, + ): String? { + val geocoder = Geocoder(context, Locale.getDefault()) + return try { + val addresses: MutableList<Address>? = geocoder.getFromLocation(lat, lang, 1) + addresses?.firstOrNull()?.getAddressLine(0) + } catch (e: Exception) { + null + } + } + @Suppress("DEPRECATION") + fun setLatLongFromAddress(address:String): Pair<Double,Double>? { + val geocoder = Geocoder(context, Locale.getDefault()) + return try { + val addresses: MutableList<Address>? = geocoder.getFromLocationName(address, 1) + val lat = addresses?.firstOrNull()?.latitude + val long = addresses?.firstOrNull()?.longitude + Pair(lat?:0.0,long?:0.0) + } catch (e: Exception) { + null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/bandung_bondowoso/interface/transactionInterface.kt b/app/src/main/java/com/example/bandung_bondowoso/interface/transactionInterface.kt index e294ad210d19f7dca3104077a2c398369b025e46..cef936fd759cb5a6e47b2c18810fabdf6d867ab4 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/interface/transactionInterface.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/interface/transactionInterface.kt @@ -6,5 +6,5 @@ import com.example.bandung_bondowoso.model.Transaction interface TransactionItemClickListener { fun onDeleteTransaction(transaction: Transaction) fun onEditTransaction(root: View, id: Int) - fun onOpenMap(location:String) + fun onOpenMap(name:String, location:String) } \ No newline at end of file diff --git a/app/src/main/java/com/example/bandung_bondowoso/local/dao/TransactionDao.kt b/app/src/main/java/com/example/bandung_bondowoso/local/dao/TransactionDao.kt index 52206feb31375b6e8f6907476eabc2897f4ae3df..795578439396f1759d36e98f706687dba9473d86 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/local/dao/TransactionDao.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/local/dao/TransactionDao.kt @@ -10,7 +10,7 @@ import kotlinx.coroutines.flow.Flow @Dao interface TransactionDao { - @Query("SELECT * FROM `transaction`") + @Query("SELECT * FROM `transaction` ORDER BY created_at DESC") fun getAll(): Flow<List<Transaction>> @Query("SELECT SUM(amount) FROM `transaction` WHERE category = 0") suspend fun getIncome(): Int diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/graph/GraphFragment.kt b/app/src/main/java/com/example/bandung_bondowoso/view/graph/GraphFragment.kt index 1a191543ecfa992ed4c69b597c53ff334f60fbc4..184ac44e8fac5d3602655d07cc134fd66d50dd06 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/view/graph/GraphFragment.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/view/graph/GraphFragment.kt @@ -8,20 +8,16 @@ import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope -import com.anychart.AnyChart -import com.anychart.AnyChartView -import com.anychart.chart.common.dataentry.ValueDataEntry -import com.anychart.charts.Pie -import com.anychart.enums.Align -import com.anychart.enums.LegendLayout import com.example.bandung_bondowoso.BandungBondowosoApp import com.example.bandung_bondowoso.R import com.example.bandung_bondowoso.databinding.FragmentGraphBinding -import com.example.bandung_bondowoso.viewmodel.GraphViewModel import com.example.bandung_bondowoso.viewmodel.TransactionViewModel import com.example.bandung_bondowoso.viewmodel.TransactionViewModelFactory +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.data.PieEntry +import com.github.mikephil.charting.formatter.PercentFormatter import kotlinx.coroutines.launch class GraphFragment : Fragment() { @@ -34,8 +30,11 @@ class GraphFragment : Fragment() { private val transactionViewModel: TransactionViewModel by viewModels { TransactionViewModelFactory((activity?.application as BandungBondowosoApp).transactionRepository) } - private lateinit var dataTransaction: List<ValueDataEntry> - + private lateinit var chart:PieChart + override fun onCreate(savedInstanceState: Bundle?) { + Log.d(tag, "onCreate") + super.onCreate(savedInstanceState) + } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -43,32 +42,38 @@ class GraphFragment : Fragment() { ): View { _binding = FragmentGraphBinding.inflate(inflater, container, false) val root: View = binding.root - val pie:Pie = AnyChart.pie() - pie.labels(true) - lifecycleScope.launch { - val income = transactionViewModel.getIncome() - val expense = transactionViewModel.getExpense() - dataTransaction = listOf( - ValueDataEntry("Income", income), - ValueDataEntry("Expense", expense) - ) - pie.data(dataTransaction) - val anyChartView:AnyChartView = binding.anyChartView - anyChartView.setChart(pie) - anyChartView.setBackgroundColor(ContextCompat.getColor(requireContext(), - R.color.md_theme_surfaceContainer)) - pie.labels().position("outside") - .format("{%x}: {%value}") - .position("outside") - .fontColor("#000E8E") - .fontSize(12) - .fontFamily("Inter") - .format("{%x}: {%value}") - pie.legend() - .position("center-bottom") - .itemsLayout(LegendLayout.HORIZONTAL) - .align(Align.CENTER) + chart = binding.chart1!! + chart.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.md_theme_surface)) + chart.animateY(1400, Easing.EaseInOutQuad) + chart.setUsePercentValues(true) + + + + val l: com.github.mikephil.charting.components.Legend? = chart.legend + l?.verticalAlignment = com.github.mikephil.charting.components.Legend.LegendVerticalAlignment.TOP + l?.horizontalAlignment = com.github.mikephil.charting.components.Legend.LegendHorizontalAlignment.RIGHT + l?.orientation = com.github.mikephil.charting.components.Legend.LegendOrientation.VERTICAL + l?.setDrawInside(false) + l?.xEntrySpace = 7f + l?.yEntrySpace = 0f + l?.yOffset = 0f + chart.setEntryLabelColor(ContextCompat.getColor(requireContext(), R.color.md_theme_surface)) + chart.setEntryLabelTextSize(16f) + + val values = ArrayList<PieEntry>() + lifecycleScope.launch{ + values.add(PieEntry(transactionViewModel.getIncome().toFloat(), "Pemasukan")) + values.add(PieEntry(transactionViewModel.getExpense().toFloat(), "Pengeluaran")) + val dataSet = com.github.mikephil.charting.data.PieDataSet(values, "") + dataSet.setColors(ContextCompat.getColor(requireContext(), R.color.md_theme_primary), + ContextCompat.getColor(requireContext(), R.color.md_theme_tertiary)) + val data = com.github.mikephil.charting.data.PieData(dataSet) + chart.data = data + data.setValueFormatter(PercentFormatter(chart)) + data.setValueTextSize(16f) + data.setValueTextColor(ContextCompat.getColor(requireContext(), R.color.md_theme_surface)) + chart.invalidate() } return root } @@ -77,4 +82,5 @@ class GraphFragment : Fragment() { super.onDestroyView() _binding = null } + } \ No newline at end of file diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/setting/SettingFragment.kt b/app/src/main/java/com/example/bandung_bondowoso/view/setting/SettingFragment.kt index a98e6ce9a0a082d36869b313d088270b172be1c8..a4f458ea3761040d5f771fffb2160ed153642fe2 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/view/setting/SettingFragment.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/view/setting/SettingFragment.kt @@ -153,6 +153,9 @@ class SettingFragment : Fragment() { transactionList = it } + } + fun randomizeTransaction(){ + } override fun onDestroyView() { super.onDestroyView() diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/transaction/CreateTransactionFragment.kt b/app/src/main/java/com/example/bandung_bondowoso/view/transaction/CreateTransactionFragment.kt index f60f40cc691734d0c25ccad4abc687cab68ecd68..1b4ce26d3f9d4c4ccc42831443c284a9e49ec0fa 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/view/transaction/CreateTransactionFragment.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/view/transaction/CreateTransactionFragment.kt @@ -2,11 +2,13 @@ package com.example.bandung_bondowoso.view.transaction import android.Manifest import android.app.Dialog +import android.content.Context +import android.content.Intent import android.content.pm.PackageManager -import android.location.Geocoder import android.location.Location -import android.os.Build +import android.location.LocationManager import android.os.Bundle +import android.provider.Settings import android.util.Log import androidx.fragment.app.Fragment import android.view.LayoutInflater @@ -24,8 +26,10 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.navigation.Navigation import com.example.bandung_bondowoso.BandungBondowosoApp +import com.example.bandung_bondowoso.MainActivity import com.example.bandung_bondowoso.R import com.example.bandung_bondowoso.databinding.FragmentTransactionCreateBinding +import com.example.bandung_bondowoso.helper.LocationHelper import com.example.bandung_bondowoso.helper.TransactionHelper import com.example.bandung_bondowoso.model.Transaction import com.example.bandung_bondowoso.model.TransactionCategory @@ -47,12 +51,12 @@ class CreateTransactionFragment : Fragment() { private lateinit var expenseRadioButton: RadioButton private lateinit var submitButton: Button private lateinit var cancelButton: Button - private lateinit var fusedLocationClient: FusedLocationProviderClient private lateinit var dialog: Dialog private lateinit var btnDialogCancel: Button private lateinit var btnDialogSubmit: Button private lateinit var tvDialogTitle:TextView private lateinit var tvDialogMsg:TextView + private lateinit var fusedLocationClient: FusedLocationProviderClient private val _locationName = MutableLiveData<String?>() private val locationName: LiveData<String?> = _locationName @@ -65,6 +69,7 @@ class CreateTransactionFragment : Fragment() { private val binding get() = _binding!! private lateinit var transactionHelper: TransactionHelper + private lateinit var locationHelper: LocationHelper /** Initialize Transaction View Model */ private val transactionViewModel: TransactionViewModel by viewModels { @@ -82,7 +87,9 @@ class CreateTransactionFragment : Fragment() { _binding = FragmentTransactionCreateBinding.inflate(inflater, container, false) val root:View = binding.root + (activity as MainActivity).binding.navView.visibility = View.GONE transactionHelper = TransactionHelper(requireContext()) + locationHelper = LocationHelper(requireContext()) transactionName = binding.etTransactionName transactionAmount = binding.etTransactionPrice transactionLocation = binding.etTransactionLocation @@ -123,9 +130,35 @@ class CreateTransactionFragment : Fragment() { dialog.dismiss() } } + if(askLocation()){ + getLastLocation() + } else + { + Toast.makeText(context, "Please enable location", Toast.LENGTH_SHORT).show() + val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) + startActivity(intent) + } return root } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + locationName.observe(viewLifecycleOwner) { location -> + if(location != null){ + transactionLocation.setText(location) + } + } + + if (ActivityCompat.checkSelfPermission( + requireContext(), + Manifest.permission.ACCESS_COARSE_LOCATION + ) != PackageManager.PERMISSION_GRANTED + ) { +// setLatLongFromAddress(transactionLocation.text.toString()) + locationHelper.setLatLongFromAddress(transactionLocation.text.toString()) + } + } + private fun createNewTransaction(): Boolean{ Log.d(tag, "createNewTransaction") if (!transactionHelper.validateTransaction( @@ -145,15 +178,19 @@ class CreateTransactionFragment : Fragment() { else -> throw IllegalStateException("No category selected") } + val coordinates = locationHelper.setLatLongFromAddress(location) + val newTransaction = Transaction( name = name, amount = amount, type = category, - locationLat = 0.0, - locationLong = 0.0, - locationName = "Bandung", + locationLat = coordinates!!.first, + locationLong = coordinates.second, + locationName = location, createdAt = Date() ) + Log.d(tag, "Transaction: $name, $amount, $category, ${coordinates.first}, " + + "${coordinates.second}, $location") transactionViewModel.upsert(newTransaction) return true } @@ -179,55 +216,24 @@ class CreateTransactionFragment : Fragment() { fusedLocationClient.lastLocation .addOnSuccessListener { location: Location? -> if (location != null) { - Log.d("HomeFragment", "Location: ${location.latitude}, ${location.longitude}") - setLocationByLatLong(location.latitude, location.longitude) + Log.d(tag, "Location: ${location.latitude}, ${location.longitude}") + _locationLat.value = location.latitude + _locationLong.value = location.longitude + _locationName.value = locationHelper.setLocationByLatLong(location.latitude, location.longitude) } } } - private fun setLocation(location: String?) { - _locationName.value = location - } - @Suppress("DEPRECATION") - fun setLocationByLatLong( - lat: Double, - long: Double, - ) { - _locationLat.value = lat - _locationLong.value = long - - val geocoder = Geocoder(requireContext()) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - geocoder.getFromLocation(lat, long, 1) { - address -> - setLocation(address.firstOrNull()?.getAddressLine(0)) - } - return - } - try { - val address = geocoder.getFromLocation(lat, long, 1) - if (address != null) { - setLocation(address.firstOrNull()?.getAddressLine(0)) - } else { - setLocation(null) - } - } catch(e: Exception) { - //will catch if there is an internet problem - Log.e("HomeViewModel", "Error getting location", e) - setLocation(null) - } + fun askLocation(): Boolean { + val service: LocationManager = + requireContext().getSystemService(Context.LOCATION_SERVICE) as LocationManager + return service.isProviderEnabled(LocationManager.GPS_PROVIDER) } - @Suppress("DEPRECATION") - fun getLatLongFromLocation(locationName:String): Pair<Double, Double>? { - Log.d(tag, "getLatLongFromLocation: $locationName") - val geocoder = Geocoder(requireContext()) - val address = geocoder.getFromLocationName(locationName, 1) - return if (address != null) { - Pair(address[0].latitude, address[0].longitude) - } else { - null - } - } + + override fun onDestroyView() { + super.onDestroyView() + (activity as MainActivity).binding.navView.visibility = View.VISIBLE + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/transaction/EditTransactionFragment.kt b/app/src/main/java/com/example/bandung_bondowoso/view/transaction/EditTransactionFragment.kt index 38c0c4eda4bf254e2f279e994711904e6c07f08c..6a6bf7e3fbf598b1176036b6a9c437a555bc206c 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/view/transaction/EditTransactionFragment.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/view/transaction/EditTransactionFragment.kt @@ -19,6 +19,7 @@ import androidx.navigation.Navigation import com.example.bandung_bondowoso.BandungBondowosoApp import com.example.bandung_bondowoso.R import com.example.bandung_bondowoso.databinding.FragmentTransactionCreateBinding +import com.example.bandung_bondowoso.helper.LocationHelper import com.example.bandung_bondowoso.helper.TransactionHelper import com.example.bandung_bondowoso.model.Transaction import com.example.bandung_bondowoso.model.TransactionCategory @@ -36,6 +37,7 @@ class EditTransactionFragment : Fragment() { } private val binding get() = _binding!! private lateinit var transactionHelper: TransactionHelper + private lateinit var locationHelper: LocationHelper /** Initialize Transaction View Model */ private val transactionViewModel: TransactionViewModel by viewModels { TransactionViewModelFactory((activity?.application as BandungBondowosoApp).transactionRepository) @@ -59,7 +61,10 @@ class EditTransactionFragment : Fragment() { private var locationLat by Delegates.notNull<Double>() private var locationLong by Delegates.notNull<Double>() - + override fun onCreate(savedInstanceState: Bundle?) { + Log.d(tag, "onCreate") + super.onCreate(savedInstanceState) + } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -69,6 +74,7 @@ class EditTransactionFragment : Fragment() { val root:View = binding.root title = binding.tvTransactionNew transactionHelper = TransactionHelper(requireContext()) + locationHelper = LocationHelper(requireContext()) transactionName = binding.etTransactionName transactionAmount = binding.etTransactionPrice transactionLocation = binding.etTransactionLocation @@ -127,10 +133,6 @@ class EditTransactionFragment : Fragment() { } return root } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - Log.d(tag, "onViewCreated") - super.onViewCreated(view, savedInstanceState) - } private fun editTransaction(): Boolean{ Log.d(tag, "editTransaction") @@ -151,16 +153,19 @@ class EditTransactionFragment : Fragment() { else -> throw IllegalStateException("No category selected") } + val coordinates = locationHelper.setLatLongFromAddress(location) val newTransaction = transaction.copy( name = name, amount = amount.toInt(), type = category, - locationLat = locationLat, - locationLong = locationLong, + locationLat = coordinates!!.first, + locationLong = coordinates.second, locationName = location ) + Log.d(tag, "Transaction: $name, $amount, $category, ${coordinates.first}, " + + "${coordinates.second}, $location") transactionViewModel.upsert(newTransaction) return true } diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/transaction/TransactionAdapter.kt b/app/src/main/java/com/example/bandung_bondowoso/view/transaction/TransactionAdapter.kt index 0d905753fc758a12c616310ee3ad553efa152f49..4d598de26425ff78942fc53dae30306e88c19fca 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/view/transaction/TransactionAdapter.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/view/transaction/TransactionAdapter.kt @@ -1,6 +1,5 @@ package com.example.bandung_bondowoso.view.transaction -import android.app.AlertDialog import android.app.Dialog import android.view.LayoutInflater import android.view.View @@ -8,7 +7,6 @@ import android.view.ViewGroup import android.widget.Button import android.widget.ImageView import android.widget.PopupMenu -import android.widget.RadioButton import android.widget.TextView import android.widget.Toast import androidx.core.content.ContextCompat @@ -18,7 +16,6 @@ import com.example.bandung_bondowoso.R import com.example.bandung_bondowoso.`interface`.TransactionItemClickListener import com.example.bandung_bondowoso.model.Transaction import com.example.bandung_bondowoso.model.TransactionCategory -import java.sql.Date import java.text.SimpleDateFormat import java.util.Locale @@ -35,10 +32,10 @@ class TransactionAdapter (var transactionList: List<Transaction>, val tvValueIcon:ImageView = view.findViewById(R.id.img_icon_value) val tvImageIcon:View = view.findViewById(R.id.img_icon_category) val locationLayout:View = view.findViewById(R.id.locationLayout) - val mMenus:ImageView = view.findViewById(R.id.img_more_action) + private val mMenus:ImageView = view.findViewById(R.id.img_more_action) private val dialog: Dialog = Dialog(itemView.context) - private lateinit var btnDialogCancel: Button - private lateinit var btnDialogSubmit: Button + private var btnDialogCancel: Button + private var btnDialogSubmit: Button init { mMenus.setOnClickListener { @@ -55,7 +52,7 @@ class TransactionAdapter (var transactionList: List<Transaction>, } private fun popupMenus(){ - val popupMenu = android.widget.PopupMenu(itemView.context, mMenus) + val popupMenu = PopupMenu(itemView.context, mMenus) popupMenu.inflate(R.menu.transaction_menu) popupMenu.setOnMenuItemClickListener { when (it.itemId) { @@ -157,7 +154,7 @@ class TransactionAdapter (var transactionList: List<Transaction>, holder.tvTransactionLocation.text = transaction.locationName holder.tvTransactionDate.text = dateFormat.format((transaction.createdAt)) holder.locationLayout.setOnClickListener { - Toast.makeText(holder.itemView.context, "Location clicked", Toast.LENGTH_SHORT).show() + itemClickListener.onOpenMap(transaction.name, transaction.locationName) } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/transaction/TransactionFragment.kt b/app/src/main/java/com/example/bandung_bondowoso/view/transaction/TransactionFragment.kt index c7437a02e41cb383e242bf60dc7551d31222005e..4ff8de22b8eeb4bff8e5fb2552fa9e772fce91a2 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/view/transaction/TransactionFragment.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/view/transaction/TransactionFragment.kt @@ -1,10 +1,13 @@ package com.example.bandung_bondowoso.view.transaction +import android.content.Intent +import android.net.Uri 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.TextView import androidx.core.os.bundleOf import androidx.fragment.app.Fragment @@ -14,12 +17,14 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.example.bandung_bondowoso.BandungBondowosoApp import com.example.bandung_bondowoso.R import com.example.bandung_bondowoso.databinding.FragmentTransactionBinding +import com.example.bandung_bondowoso.helper.LocationHelper import com.example.bandung_bondowoso.`interface`.TransactionItemClickListener import com.example.bandung_bondowoso.model.Transaction import com.example.bandung_bondowoso.viewmodel.TransactionViewModel import com.example.bandung_bondowoso.viewmodel.TransactionViewModelFactory import com.example.bandung_bondowoso.viewmodel.login.LoginViewModel import com.example.bandung_bondowoso.viewmodel.login.LoginViewModelFactory +import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.floatingactionbutton.FloatingActionButton class TransactionFragment : Fragment(), TransactionItemClickListener { @@ -29,7 +34,9 @@ class TransactionFragment : Fragment(), TransactionItemClickListener { private var transactionList = listOf<Transaction>() private lateinit var adapter: TransactionAdapter private lateinit var userEmail: TextView - private lateinit var balance:TextView + private lateinit var balance: TextView + private lateinit var locationHelper: LocationHelper + private lateinit var bottomSheetDialog: BottomSheetDialog private val transactionViewModel: TransactionViewModel by viewModels { TransactionViewModelFactory((activity?.application as BandungBondowosoApp).transactionRepository) @@ -39,9 +46,6 @@ class TransactionFragment : Fragment(), TransactionItemClickListener { LoginViewModelFactory((activity?.application as BandungBondowosoApp).userRepository) } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -50,7 +54,8 @@ class TransactionFragment : Fragment(), TransactionItemClickListener { Log.d(tag, "onCreateView") _binding = FragmentTransactionBinding.inflate(inflater, container, false) val root:View = binding.root - + locationHelper = LocationHelper(requireContext()) + bottomSheetDialog = BottomSheetDialog(requireContext()) adapter = TransactionAdapter(transactionList, itemClickListener = this) binding.rvTransaction.adapter = adapter @@ -73,16 +78,6 @@ class TransactionFragment : Fragment(), TransactionItemClickListener { } } - val createTransactionButton:FloatingActionButton = binding.fabCreateTransaction - createTransactionButton.setOnClickListener { - Navigation.findNavController(root).navigate(R.id.action_navigation_transaction_to_newTransactionFragment) - } - return root - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - transactionViewModel.balance.observe(viewLifecycleOwner) { amount -> Log.d(tag, "Balance: $amount") balance.text = getString(R.string.balance_value, amount.toString()) @@ -92,7 +87,13 @@ class TransactionFragment : Fragment(), TransactionItemClickListener { Log.d(tag, "User Email: $email") userEmail.text = email.toString() } + val createTransactionButton:FloatingActionButton = binding.fabCreateTransaction + createTransactionButton.setOnClickListener { + Navigation.findNavController(root).navigate(R.id.action_navigation_transaction_to_newTransactionFragment) + } + return root } + override fun onDeleteTransaction(transaction: Transaction) { transactionViewModel.delete(transaction) } @@ -102,8 +103,37 @@ class TransactionFragment : Fragment(), TransactionItemClickListener { Navigation.findNavController(root).navigate(R.id.action_navigation_transaction_to_editTransactionFragment, bundle) } - override fun onOpenMap(location:String) { - TODO() + override fun onOpenMap(name:String, location:String) { + val bottomSheetView = layoutInflater.inflate(R.layout.bottom_dialog_map, null) + val nameTextView = bottomSheetView.findViewById<TextView>(R.id.tv_btm_dialog_name) + val addressTextView = bottomSheetView.findViewById<TextView>(R.id.tv_address) + val buttonOpenMap = bottomSheetView.findViewById<Button>(R.id.btn_open_map) + + + val coordinates = locationHelper.setLatLongFromAddress(location) + addressTextView.text = location + nameTextView.text = name + + bottomSheetDialog.setContentView(bottomSheetView) + bottomSheetDialog.show() + + buttonOpenMap.setOnClickListener { + bottomSheetDialog.dismiss() + val gmmIntentUri = "geo:0,0?q=$location" + val mapIntent = Intent(Intent.ACTION_VIEW, Uri.parse(gmmIntentUri)) + mapIntent.setPackage("com.google.android.apps.maps") + startActivity(mapIntent) + } + } + private fun dismissBottomSheetDialog() { + if (bottomSheetDialog.isShowing) { + bottomSheetDialog.dismiss() + } } + override fun onDestroyView() { + dismissBottomSheetDialog() + super.onDestroyView() + } } + diff --git a/app/src/main/res/drawable/bg_settings_card_email.xml b/app/src/main/res/drawable/bg_settings_card_email.xml new file mode 100644 index 0000000000000000000000000000000000000000..211758aeefd78f338544978746ff5f3704ae3fcc --- /dev/null +++ b/app/src/main/res/drawable/bg_settings_card_email.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <solid android:color="@color/md_theme_peach" /> + <corners android:radius="10dp" /> +</shape> \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_settings_card_excel.xml b/app/src/main/res/drawable/bg_settings_card_excel.xml new file mode 100644 index 0000000000000000000000000000000000000000..99e0d60361eea5facc82cf339d4d19e14d91d3f0 --- /dev/null +++ b/app/src/main/res/drawable/bg_settings_card_excel.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <solid android:color="@color/md_theme_light_green" /> + <corners android:radius="10dp" /> +</shape> \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_settings_card_user.xml b/app/src/main/res/drawable/bg_settings_card_user.xml new file mode 100644 index 0000000000000000000000000000000000000000..e8370c0dbd0fce4751b42db5edb58401baeaa725 --- /dev/null +++ b/app/src/main/res/drawable/bg_settings_card_user.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <solid android:color="@color/md_theme_primaryContainer" /> + <corners android:radius="10dp" /> +</shape> \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_transaction_card.xml b/app/src/main/res/drawable/bg_transaction_card.xml index fb36bc26960f5d59e9a1efb69fb45447c79c5c48..1daed3c4dd4b38038046a4fc2b9674030eb8204a 100644 --- a/app/src/main/res/drawable/bg_transaction_card.xml +++ b/app/src/main/res/drawable/bg_transaction_card.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> - <solid android:color="@color/md_theme_surface" /> + <solid android:color="@color/md_theme_primaryContainer" /> <stroke android:width="2dp" android:color="@color/md_theme_primary" /> <corners android:radius="10dp" /> </shape> \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_transaction_card_view.xml b/app/src/main/res/drawable/bg_transaction_card_view.xml new file mode 100644 index 0000000000000000000000000000000000000000..609817e9f209f1f5ceee73cf9bd5debf5bdbf494 --- /dev/null +++ b/app/src/main/res/drawable/bg_transaction_card_view.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <stroke android:width="2dp" android:color="@color/md_theme_primary" /> + <corners android:radius="10dp" /> +</shape> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_map.xml b/app/src/main/res/drawable/ic_map.xml new file mode 100644 index 0000000000000000000000000000000000000000..ffd9dd90c5b45dff6468ea4995e28bc6718b2c91 --- /dev/null +++ b/app/src/main/res/drawable/ic_map.xml @@ -0,0 +1,5 @@ +<vector android:height="24dp" android:tint="#FFFFFF" + android:viewportHeight="24" android:viewportWidth="24" + android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> + <path android:fillColor="@android:color/white" android:pathData="M20.5,3l-0.16,0.03L15,5.1 9,3 3.36,4.9c-0.21,0.07 -0.36,0.25 -0.36,0.48V20.5c0,0.28 0.22,0.5 0.5,0.5l0.16,-0.03L9,18.9l6,2.1 5.64,-1.9c0.21,-0.07 0.36,-0.25 0.36,-0.48V3.5c0,-0.28 -0.22,-0.5 -0.5,-0.5zM15,19l-6,-2.11V5l6,2.11V19z"/> +</vector> diff --git a/app/src/main/res/drawable/rounded_dialog.xml b/app/src/main/res/drawable/rounded_dialog.xml new file mode 100644 index 0000000000000000000000000000000000000000..78ba6c2d8d395d1a3fee721b15ec0fb9c227d467 --- /dev/null +++ b/app/src/main/res/drawable/rounded_dialog.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <solid android:color="@color/md_theme_surfaceContainer"/> + <corners android:topLeftRadius="50dp" + android:topRightRadius="50dp"/> + +</shape> diff --git a/app/src/main/res/layout/bottom_dialog_map.xml b/app/src/main/res/layout/bottom_dialog_map.xml new file mode 100644 index 0000000000000000000000000000000000000000..cfe1ccaf306118c3a8f6ab6849b63e238f9d1423 --- /dev/null +++ b/app/src/main/res/layout/bottom_dialog_map.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="match_parent" + > + + <TextView + android:id="@+id/tv_btm_dialog_name" + android:layout_width="330dp" + style="@style/TextAppearance.HeadlineMedium" + android:textColor="@color/md_theme_primary" + android:layout_marginTop="20dp" + android:gravity="center" + android:layout_height="wrap_content" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <TextView + android:id="@+id/tv_address" + android:layout_width="330dp" + style="@style/TextAppearance.BodyLarge" + android:textColor="@color/md_theme_primary" + android:layout_marginTop="20dp" + android:gravity="center" + android:layout_height="wrap_content" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/tv_btm_dialog_name" /> + + <Button + android:id="@+id/btn_open_map" + style="@style/buttonStylePrimary" + android:layout_width="330dp" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:layout_marginTop="30dp" + android:width="200dp" + android:drawableStart="@drawable/ic_map" + android:focusable="false" + android:layout_marginBottom="30dp" + android:focusableInTouchMode="false" + android:text="@string/btn_open_map" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.493" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/tv_address" + app:layout_constraintVertical_bias="0.028" /> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_graph.xml b/app/src/main/res/layout/fragment_graph.xml index 19ff9cd7bace9df79d732762eb05f42e98c6eafa..ed95a4c4451ee6a0cf528c307cc4f9c8892614ee 100644 --- a/app/src/main/res/layout/fragment_graph.xml +++ b/app/src/main/res/layout/fragment_graph.xml @@ -5,8 +5,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".view.graph.GraphFragment" + android:background="@color/md_theme_surface" > - <TextView android:id="@+id/textView" style="@style/TextAppearance.HeadlineLarge" @@ -20,21 +20,22 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - <LinearLayout + <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="1dp" + android:layout_marginTop="0dp" android:orientation="vertical" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/textView"> + app:layout_goneMarginTop="@dimen/title_top_margin" + app:layout_constraintTop_toBottomOf="@id/textView"> - <com.anychart.AnyChartView - android:id="@+id/anyChartView" + <com.github.mikephil.charting.charts.PieChart + android:id="@+id/chart1" android:layout_width="match_parent" - android:layout_height="700dp" - app:layout_constraintBottom_toBottomOf="parent" /> - </LinearLayout> + android:layout_height="match_parent" + /> + </RelativeLayout> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index c3cf19e9573f6d2a5dcab0ab1ab0c0d98b5c5a6c..8867c082b6043b1ebf951ef6cd227502765fd23d 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -3,15 +3,17 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:background="@color/md_theme_surface"> <TextView android:id="@+id/tv_transaction_new" style="@style/TextAppearance.HeadlineLarge" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:padding="10dp" - android:text="Pengaturan" + android:layout_marginStart="@dimen/title_start_margin" + android:layout_marginTop="@dimen/title_top_margin" + android:text="@string/title_settings" android:textColor="@color/md_theme_primary" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -19,28 +21,28 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/constraintLayout4" android:layout_width="match_parent" - android:layout_height="90dp" - android:layout_marginTop="64dp" - android:background="@drawable/bg_transaction_card" + android:layout_height="wrap_content" + android:layout_marginHorizontal="20dp" + android:layout_marginTop="30dp" + android:background="@drawable/bg_settings_card_user" android:padding="10dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/tv_transaction_new"> + <ImageView android:id="@+id/avatar" android:layout_width="60dp" android:layout_height="60dp" android:layout_marginStart="4dp" - android:background="@drawable/bg_transaction_icon" android:contentDescription="@string/excel_pic" android:padding="5dp" android:src="@drawable/avatar" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_bias="0.325" - /> + app:layout_constraintVertical_bias="0.325" /> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/layout_email" @@ -56,13 +58,11 @@ <TextView android:id="@+id/user_email" style="@style/TextAppearance.TitleMedium" - android:layout_width="280dp" - android:layout_height="30dp" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_marginStart="0dp" android:layout_marginTop="4dp" - android:textSize="22dp" android:textColor="@color/md_theme_primary" - android:text = "13521155@std.stei.itb.ac.id" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> @@ -70,15 +70,15 @@ </androidx.constraintlayout.widget.ConstraintLayout> - <androidx.constraintlayout.widget.ConstraintLayout + <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/constraintLayout3" - android:layout_width="match_parent" + android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginHorizontal="30dp" android:layout_marginTop="24dp" - android:background="@drawable/bg_transaction_card" + android:background="@drawable/bg_settings_card_excel" android:padding="10dp" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/constraintLayout4"> @@ -88,7 +88,6 @@ android:layout_width="36dp" android:layout_height="36dp" android:layout_marginStart="4dp" - android:background="@drawable/bg_transaction_icon" android:contentDescription="@string/excel_pic" android:padding="5dp" android:src="@drawable/excel_icon" @@ -100,7 +99,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/verticalLayout1" - android:layout_width="wrap_content" + android:layout_width="290dp" android:layout_height="wrap_content" android:layout_marginStart="20dp" android:padding="10dp" @@ -116,12 +115,13 @@ android:layout_height="wrap_content" android:text="@string/save_transaction" android:textColor="@color/md_theme_primary" + android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/tv_transaction_category_1" - style="@style/TextAppearance.LabelSmall" + style="@style/TextAppearance.LabelMedium" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/file_type" @@ -143,8 +143,8 @@ <Button android:id="@+id/buttonSimpan" - android:layout_width="101dp" - android:layout_height="40dp" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_marginTop="0dp" android:layout_marginEnd="16dp" android:text="@string/simpan" @@ -153,10 +153,12 @@ </androidx.constraintlayout.widget.ConstraintLayout> <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/constraintLayout5" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="24dp" - android:background="@drawable/bg_transaction_card" + android:layout_marginHorizontal="25dp" + android:layout_marginTop="16dp" + android:background="@drawable/bg_settings_card_email" android:padding="10dp" app:layout_constraintTop_toBottomOf="@+id/constraintLayout3" tools:layout_editor_absoluteX="-16dp"> @@ -167,7 +169,6 @@ android:layout_width="36dp" android:layout_height="36dp" android:layout_marginStart="4dp" - android:background="@drawable/bg_transaction_icon" android:contentDescription="@string/gmail_pic" android:padding="5dp" android:src="@drawable/email_icon" @@ -179,7 +180,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/verticalLayout1_second" - android:layout_width="wrap_content" + android:layout_width="290dp" android:layout_height="wrap_content" android:layout_marginStart="20dp" android:padding="10dp" @@ -195,12 +196,13 @@ android:layout_height="wrap_content" android:text="@string/kirim_daftar_transaksi" android:textColor="@color/md_theme_primary" + android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/tv_transaction_category_2" - style="@style/TextAppearance.LabelSmall" + style="@style/TextAppearance.LabelMedium" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/gmail" @@ -222,13 +224,77 @@ <Button android:id="@+id/buttonKirim" - android:layout_width="101dp" - android:layout_height="40dp" - android:layout_marginTop="0dp" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_marginEnd="16dp" android:text="@string/kirim" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/verticalLayout1_second" /> </androidx.constraintlayout.widget.ConstraintLayout> + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/constraintLayout6" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginHorizontal="25dp" + android:layout_marginTop="16dp" + android:background="@drawable/bg_settings_card_user" + android:padding="10dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/constraintLayout5"> + + <TextView + android:id="@+id/textView2" + style="@style/TextAppearance.TitleMedium" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/title_start_margin" + android:text="@string/random_transaksi" + android:textColor="@color/md_theme_primary" + android:textStyle="bold" + app:layout_constraintStart_toEndOf="@+id/imageView3" + app:layout_constraintTop_toTopOf="parent" /> + + <ImageView + android:id="@+id/imageView3" + android:layout_width="36dp" + android:layout_height="36dp" + android:contentDescription="@string/gmail_pic" + android:padding="5dp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:srcCompat="@drawable/ic_transaction" + app:tint="@color/md_theme_primary" /> + + <Button + android:id="@+id/button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/title_top_margin" + android:layout_marginEnd="5dp" + android:text="@string/button_random" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@+id/textView2" /> + </androidx.constraintlayout.widget.ConstraintLayout> + + <androidx.constraintlayout.widget.Guideline + android:id="@+id/guideline" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="vertical" + app:layout_constraintGuide_end="405dp" /> + + <Button + android:id="@+id/button2" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="105dp" + android:text="@string/button_logout" + android:layout_marginEnd="@dimen/title_start_margin" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@+id/constraintLayout6" /> + </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/main/res/layout/fragment_transaction.xml b/app/src/main/res/layout/fragment_transaction.xml index 41d73ede865bd22cba4894b962f9b5dc60733e31..43b92462a1c7af0eec35f3efee424479e59056cd 100644 --- a/app/src/main/res/layout/fragment_transaction.xml +++ b/app/src/main/res/layout/fragment_transaction.xml @@ -129,8 +129,8 @@ style="@style/TextAppearance.HeadlineLarge" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="30dp" - android:layout_marginTop="20dp" + android:layout_marginStart="@dimen/title_start_margin" + android:layout_marginTop="@dimen/title_top_margin" android:text="@string/title_transactions" android:textColor="@color/md_theme_primary" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/fragment_transaction_create.xml b/app/src/main/res/layout/fragment_transaction_create.xml index bf0a5623012da69fb81266928b367893612ebb2a..d19f31160f70c4fcebef6ccabccab1cdba3458f5 100644 --- a/app/src/main/res/layout/fragment_transaction_create.xml +++ b/app/src/main/res/layout/fragment_transaction_create.xml @@ -11,8 +11,8 @@ style="@style/TextAppearance.HeadlineLarge" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="30dp" - android:layout_marginStart="20dp" + android:layout_marginTop="@dimen/title_top_margin" + android:layout_marginStart="@dimen/title_start_margin" android:text="@string/title_transaction_new" android:textColor="@color/md_theme_primary" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/fragment_transaction_edit.xml b/app/src/main/res/layout/fragment_transaction_edit.xml index 0b8d89b10dc2ebc66be4df1968789dfe1d2b273d..680be236312e989893e991ee67f70bd5fcdb9a96 100644 --- a/app/src/main/res/layout/fragment_transaction_edit.xml +++ b/app/src/main/res/layout/fragment_transaction_edit.xml @@ -11,8 +11,8 @@ style="@style/TextAppearance.HeadlineLarge" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="30dp" - android:layout_marginStart="20dp" + android:layout_marginTop="@dimen/title_top_margin" + android:layout_marginStart="@dimen/title_start_margin" android:text="@string/title_transaction_new" android:textColor="@color/md_theme_primary" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/item_transaction.xml b/app/src/main/res/layout/item_transaction.xml index f28cb61ce8f9a436bbbb7712eca82d85c1f1fa79..92e1bd0ca15901a03260c459c61ed29c62d837d9 100644 --- a/app/src/main/res/layout/item_transaction.xml +++ b/app/src/main/res/layout/item_transaction.xml @@ -3,21 +3,20 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="10dp" + android:padding="25dp" android:layout_marginHorizontal="5dp" android:layout_marginVertical="10dp" - android:background="@drawable/bg_transaction_card"> + android:background="@drawable/bg_transaction_card_view"> <ImageView android:id="@+id/img_icon_category" - android:layout_width="36dp" - android:layout_height="36dp" + android:layout_width="48dp" + android:layout_height="48dp" + android:layout_marginTop="16dp" android:background="@drawable/bg_transaction_icon" android:contentDescription="@string/transaction_category" android:padding="5dp" - android:layout_marginStart="10dp" android:src="@drawable/ic_money_bill_wave" - app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:tint="@color/md_theme_primary" /> @@ -38,22 +37,23 @@ style="@style/TextAppearance.TitleMedium" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@string/transaction_name" android:ellipsize="end" android:maxLines="1" + android:text="@string/transaction_name" android:textColor="@color/md_theme_primary" + android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/tv_transaction_category" - style="@style/TextAppearance.LabelSmall" + style="@style/TextAppearance.LabelMedium" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@string/transaction_category" - android:textColor="@color/md_theme_primary" android:ellipsize="end" android:maxLines="1" + android:text="@string/transaction_category" + android:textColor="@color/md_theme_primary" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tv_transaction_name" /> @@ -62,22 +62,58 @@ style="@style/TextAppearance.LabelSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:ellipsize="end" + android:maxLines="1" android:text="@string/transaction_date" android:textColor="@color/md_theme_onSurface" app:layout_constraintStart_toStartOf="parent" - android:ellipsize="end" - android:maxLines="1" app:layout_constraintTop_toBottomOf="@id/tv_transaction_category" /> + + </androidx.constraintlayout.widget.ConstraintLayout> + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/locationLayout" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="10dp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/verticalLayout1"> + + <ImageView + android:id="@+id/iv_location" + android:layout_width="20dp" + android:layout_height="20dp" + android:contentDescription="@string/transaction_category" + android:src="@drawable/ic_location" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:tint="@color/md_theme_primary" /> + + <TextView + android:id="@+id/tv_transaction_location" + style="@style/TextAppearance.LabelSmall" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:gravity="start" + android:text="@string/transaction_location" + android:textColor="@color/md_theme_primary" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toEndOf="@+id/iv_location" + app:layout_constraintTop_toTopOf="parent" /> +</androidx.constraintlayout.widget.ConstraintLayout> + <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/verticalLayout2" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginTop="10dp" android:layout_marginEnd="30dp" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent"> + app:layout_constraintEnd_toStartOf="@+id/img_more_action" + app:layout_constraintStart_toEndOf="@+id/verticalLayout1" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0"> <ImageView android:id="@+id/img_icon_value" @@ -93,79 +129,41 @@ <TextView android:id="@+id/tv_currency" - style="@style/TextAppearance.LabelMedium" + style="@style/TextAppearance.LabelLarge" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@string/label_mata_uang" - android:textColor="@color/md_theme_primary" android:ellipsize="end" android:maxLines="1" + android:text="@string/label_mata_uang" + android:textColor="@color/md_theme_primary" app:layout_constraintEnd_toStartOf="@+id/tv_transaction_amount" app:layout_constraintStart_toEndOf="@id/img_icon_value" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/tv_transaction_amount" - style="@style/TextAppearance.LabelMedium" + style="@style/TextAppearance.LabelLarge" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:ellipsize="end" - android:maxLines="1" + android:gravity="start" + android:singleLine="true" android:text="@string/transaction_price" android:textColor="@color/md_theme_red" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/tv_currency" - app:layout_constraintTop_toTopOf="parent" - - /> - - <androidx.constraintlayout.widget.ConstraintLayout - android:id="@+id/locationLayout" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="16dp" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/tv_transaction_amount"> - - <ImageView - android:id="@+id/iv_location" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:contentDescription="@string/transaction_category" - - android:src="@drawable/ic_location" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:tint="@color/md_theme_primary" /> - - <TextView - android:id="@+id/tv_transaction_location" - style="@style/TextAppearance.LabelSmall" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/transaction_location" - android:textColor="@color/md_theme_primary" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintHorizontal_bias="0" - android:ellipsize="end" - android:maxLines="1" - app:layout_constraintStart_toEndOf="@+id/iv_location" - app:layout_constraintTop_toTopOf="parent" /> - </androidx.constraintlayout.widget.ConstraintLayout> + app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> <ImageView android:id="@+id/img_more_action" - android:layout_width="20dp" - android:layout_height="20dp" - android:layout_marginStart="9dp" - android:layout_marginTop="4dp" + android:layout_width="30dp" + android:layout_height="30dp" android:contentDescription="@string/cd_transaction_modify" android:padding="2dp" + android:src="@drawable/ic_more" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.0" - app:layout_constraintStart_toEndOf="@+id/verticalLayout2" + app:layout_constraintTop_toTopOf="parent" app:tint="@color/md_theme_onSurface" /> diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index 495ab16ee96b5a1666a820f850204813f31e3ec8..d3a7ec3aacbee91eb1046e83e578d33021ebe645 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -1,11 +1,14 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <color name="md_theme_primary">#BCC3FF</color> + <color name="md_theme_primary">#DFE0FF</color> <color name="md_theme_onPrimary">#242B61</color> <color name="md_theme_primaryContainer">#3B4279</color> <color name="md_theme_onPrimaryContainer">#DFE0FF</color> - <color name="md_theme_red">#751414</color> - <color name="md_theme_green">#129A18</color> + <color name="md_theme_red">#BE0707</color> + <color name="md_theme_green">#44C34A</color> + <color name="md_theme_peach">#FFDAD6</color> + <color name="md_theme_light_green">#C7ECC1</color> + <color name="md_theme_blue">#ADC7FF</color> <color name="md_theme_secondary">#BCC3FF</color> <color name="md_theme_onSecondary">#242C61</color> <color name="md_theme_secondaryContainer">#3B4279</color> @@ -46,7 +49,7 @@ <color name="md_theme_surfaceBright">#39393F</color> <color name="md_theme_surfaceContainerLowest">#0D0E13</color> <color name="md_theme_surfaceContainerLow">#1B1B21</color> - <color name="md_theme_surfaceContainer">#1F1F25</color> + <color name="md_theme_surfaceContainer">#070C1F</color> <color name="md_theme_surfaceContainerHigh">#29292F</color> <color name="md_theme_surfaceContainerHighest">#34343A</color> <color name="md_theme_primary_mediumContrast">#C1C7FF</color> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f7f5bf383b53e8138d4820cd153d6d4e6d262a42..3753890d8dc3b6770bfb3c94275ec9bb9b4a9f03 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -6,6 +6,9 @@ <color name="md_theme_onPrimary">#FFFFFF</color> <color name="md_theme_red">#BE0707</color> <color name="md_theme_green">#44C34A</color> + <color name="md_theme_peach">#FFDAD6</color> + <color name="md_theme_light_green">#C7ECC1</color> + <color name="md_theme_blue">#ADC7FF</color> <color name="md_theme_primaryContainer">#DFE0FF</color> <color name="md_theme_onPrimaryContainer">#0D154B</color> <color name="md_theme_secondary">#535A92</color> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index e00c2dd143c595389b3cf8a32d9dc6aff48ec367..3560bc0ffa53e166d225c53c8f54e29d52b276c6 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -2,4 +2,6 @@ <!-- Default screen margins, per the Android Design guidelines. --> <dimen name="activity_horizontal_margin">16dp</dimen> <dimen name="activity_vertical_margin">16dp</dimen> + <dimen name="title_top_margin">20dp</dimen> + <dimen name="title_start_margin">30dp</dimen> </resources> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2bd501d8f9eae16b7bcbbfb24060bf07bf1e6a2b..65687ebb33481e3eb3d910227c8e54de3c4eecbe 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -49,6 +49,7 @@ <!--Button--> <string name="btn_submit">Simpan</string> <string name="btn_cancel">Batal</string> + <string name="btn_open_map">Open Google Map</string> <!-- TODO: Remove or change this placeholder text --> <string name="hello_blank_fragment">Hello blank fragment</string> <string name="dialog_title">Hapus Transaksi</string> @@ -61,6 +62,8 @@ <string name="button_ok">OK</string> <string name="button_cancel">BATAL</string> <string name="button_delete">HAPUS</string> + <string name="button_random">RANDOM</string> + <string name="button_logout">LOG OUT</string> <string name="dialog_title_new_transaction">Transaksi Baru</string> <string name="dialog_message_new_transaction">Apakah Anda yakin ingin membatalkan pembuatan transaksi baru?</string> @@ -84,5 +87,7 @@ <string name="kirim_daftar_transaksi">Kirim Daftar Transaksi</string> <string name="gmail">Gmail</string> <string name="kirim">Kirim</string> + <string name="random_transaksi">Randomisasi Transaksi</string> + </resources> \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index f2055258cc6ca99d35c6a0150ed6e9f171352221..0288683a471345bfc77d675b5d00ef7a8bda056e 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -60,6 +60,7 @@ <item name="textAppearanceLabelLarge">@style/TextAppearance.LabelLarge</item> <item name="textAppearanceLabelMedium">@style/TextAppearance.LabelMedium</item> <item name="textAppearanceLabelSmall">@style/TextAppearance.LabelSmall</item> + <item name="bottomSheetDialogTheme">@style/AppBottomSheetDialogTheme</item> </style> <!-- Display --> @@ -170,4 +171,14 @@ <item name="boxStrokeColor">@color/md_theme_primary</item> <item name="boxStrokeWidth">2dp</item> </style> + + <style name="AppBottomSheetDialogTheme" + parent="Theme.Design.Light.BottomSheetDialog"> + <item name="bottomSheetStyle">@style/AppModalStyle</item> + </style> + + <style name="AppModalStyle" + parent="Widget.Design.BottomSheet.Modal"> + <item name="android:background">@drawable/rounded_dialog</item> + </style> </resources> \ No newline at end of file