diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 65945c53b7ed19a69582549e43690060062b83e0..42e83dce10d7022be5568a7d0f59e57f2f00af20 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -77,4 +77,7 @@ dependencies { implementation("com.squareup.moshi:moshi:1.14.0") implementation("com.squareup.moshi:moshi-kotlin:1.14.0") ksp("com.squareup.moshi:moshi-kotlin-codegen:1.14.0") + + implementation("com.github.bumptech.glide:glide:4.12.0") + implementation("com.github.AnyChart:AnyChart-Android:1.1.5") } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f6976288ead006e7b66e0a3041cd0acec4d266d5..298a69653f8faf0a40415e34463773f3d708de06 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <application + android:name=".BandungBondowosoApp" android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" diff --git a/app/src/main/java/com/example/bandung_bondowoso/BandungBondowosoApp.kt b/app/src/main/java/com/example/bandung_bondowoso/BandungBondowosoApp.kt new file mode 100644 index 0000000000000000000000000000000000000000..1024071e2ecadc6d790fbac5a7142228c97610f8 --- /dev/null +++ b/app/src/main/java/com/example/bandung_bondowoso/BandungBondowosoApp.kt @@ -0,0 +1,10 @@ +package com.example.bandung_bondowoso + +import android.app.Application +import com.example.bandung_bondowoso.local.AppDatabase +import com.example.bandung_bondowoso.repository.TransactionRepository + +class BandungBondowosoApp : Application() { + private val database by lazy { AppDatabase.getInstance(this) } + val repository by lazy { TransactionRepository(database.transactionDao()) } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/bandung_bondowoso/helper/TransactionHelper.kt b/app/src/main/java/com/example/bandung_bondowoso/helper/TransactionHelper.kt new file mode 100644 index 0000000000000000000000000000000000000000..9fe0c2fbc8ad2f8734c537180e4c0aa03cb45fe3 --- /dev/null +++ b/app/src/main/java/com/example/bandung_bondowoso/helper/TransactionHelper.kt @@ -0,0 +1,42 @@ +package com.example.bandung_bondowoso.helper +import android.content.Context +import android.widget.EditText +import android.widget.RadioButton +import android.widget.Toast +import androidx.core.content.ContextCompat.getString +import com.example.bandung_bondowoso.R + +class TransactionHelper(private val context: Context) { + + fun validateTransaction( + transactionName: EditText, + transactionAmount: EditText, + expenseRadioButton: RadioButton, + incomeRadioButton: RadioButton, + transactionLocation: EditText + ): Boolean { + val name = transactionName.text.toString() + val amount = transactionAmount.text.toString() + val location = transactionLocation.text.toString() + + if (name.isEmpty()) { + transactionName.error = context.getString(R.string.error_transaction_name_empty) + return false + } + if (amount.isEmpty()) { + transactionAmount.error = context.getString(R.string.error_transaction_amount_empty) + return false + } + if (!expenseRadioButton.isChecked && !incomeRadioButton.isChecked) { + Toast.makeText(context, context.getString(R.string.error_transaction_category_empty), Toast.LENGTH_SHORT).show() + return false + } + + if (location.isEmpty()) { + transactionLocation.error = context.getString(R.string.error_transaction_location_empty) + return false + } + + return true + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..e294ad210d19f7dca3104077a2c398369b025e46 --- /dev/null +++ b/app/src/main/java/com/example/bandung_bondowoso/interface/transactionInterface.kt @@ -0,0 +1,10 @@ +package com.example.bandung_bondowoso.`interface` + +import android.view.View +import com.example.bandung_bondowoso.model.Transaction + +interface TransactionItemClickListener { + fun onDeleteTransaction(transaction: Transaction) + fun onEditTransaction(root: View, id: Int) + fun onOpenMap(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 0cef366cae0c1db02abeaee9b4571b9c63ce14cf..52206feb31375b6e8f6907476eabc2897f4ae3df 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 @@ -12,7 +12,14 @@ import kotlinx.coroutines.flow.Flow interface TransactionDao { @Query("SELECT * FROM `transaction`") fun getAll(): Flow<List<Transaction>> - + @Query("SELECT SUM(amount) FROM `transaction` WHERE category = 0") + suspend fun getIncome(): Int + @Query("SELECT SUM(amount) FROM `transaction` WHERE category = 1") + suspend fun getExpense(): Int + @Query("SELECT * FROM `transaction` WHERE id = :id") + suspend fun getTransaction(id: Int): Transaction + @Query("SELECT COUNT(*) FROM `transaction`") + suspend fun getCount(): Int @Upsert suspend fun upsert(transaction: Transaction) diff --git a/app/src/main/java/com/example/bandung_bondowoso/model/Transaction.kt b/app/src/main/java/com/example/bandung_bondowoso/model/Transaction.kt index 76de0618cd66c2d1fc4e2f40138da5ed2cfb1ac0..9bee418afdc790eb50ef3e6a179acce520560925 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/model/Transaction.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/model/Transaction.kt @@ -7,7 +7,7 @@ import java.util.Date @Entity(tableName = "transaction") data class Transaction ( - @PrimaryKey(autoGenerate = true) val id: Int, + @PrimaryKey(autoGenerate = true) val id: Int = 0, @ColumnInfo(name = "name") val name: String, @ColumnInfo(name = "amount") val amount: Int, @ColumnInfo(name = "category") val type: TransactionCategory, diff --git a/app/src/main/java/com/example/bandung_bondowoso/repository/TransactionRepository.kt b/app/src/main/java/com/example/bandung_bondowoso/repository/TransactionRepository.kt index cad2e64f0381e08f6e5551cb0af7d3065477e996..f5394a52d8c330dae8d92086af2c0cad006d825a 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/repository/TransactionRepository.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/repository/TransactionRepository.kt @@ -10,10 +10,28 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.withContext class TransactionRepository(private val transactionDao: TransactionDao, - private val defaultDispatcher: CoroutineDispatcher = Dispatchers.Default ) { + private val defaultDispatcher: CoroutineDispatcher = Dispatchers.Default + private val TAG:String = "TransactionRepository" + suspend fun getIncome() = withContext(defaultDispatcher){ + Log.d(TAG, "getIncome") + transactionDao.getIncome() + } + + suspend fun getExpense() = withContext(defaultDispatcher){ + Log.d(TAG, "getExpense") + transactionDao.getExpense() + } + + suspend fun getTransaction(id:Int) = withContext(defaultDispatcher){ + transactionDao.getTransaction(id) + } + suspend fun getCount() = withContext(defaultDispatcher) { + Log.d(TAG, "getCount") + transactionDao.getCount() + } suspend fun upsert(transaction: Transaction) = withContext(defaultDispatcher) { - Log.d("TransactionRepository", "upsert: $transaction") + Log.d(TAG, "upsert: $transaction") transactionDao.upsert(transaction) } @@ -25,13 +43,13 @@ class TransactionRepository(private val transactionDao: TransactionDao, .flowOn(defaultDispatcher) suspend fun delete(transaction: Transaction) = withContext(defaultDispatcher) { - Log.d("TransactionRepository", "delete: $transaction") + Log.d(TAG, "delete: $transaction") transactionDao.delete(transaction) } // Development function suspend fun deleteAll() = withContext(defaultDispatcher) { - Log.d("TransactionRepository", "deleteAll") + Log.d(TAG, "deleteAll") transactionDao.deleteAll() } } \ No newline at end of file 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 e244eccce920242f2bc0e6d9b45151454bb01026..037e13e22b6c5ee86901b0b59c3785d6020ce16d 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 @@ -1,34 +1,77 @@ package com.example.bandung_bondowoso.view.graph import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.TextView +import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels import androidx.lifecycle.ViewModelProvider -import com.example.bandung_bondowoso.databinding.FragmentDashboardBinding -import com.example.bandung_bondowoso.view.dashboard.DashboardViewModel +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 kotlinx.coroutines.launch class GraphFragment : Fragment() { - private var _binding: FragmentDashboardBinding? = null + private var _binding: FragmentGraphBinding? = null // This property is only valid between onCreateView and // onDestroyView. private val binding get() = _binding!! + private val tag = "graphFragment" + private val transactionViewModel: TransactionViewModel by viewModels { + TransactionViewModelFactory((activity?.application as BandungBondowosoApp).repository) + } + private lateinit var dataTransaction: List<ValueDataEntry> override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { - val graphViewModel = - ViewModelProvider(this).get(GraphViewModel::class.java) - _binding = FragmentDashboardBinding.inflate(inflater, container, false) + _binding = FragmentGraphBinding.inflate(inflater, container, false) val root: View = binding.root - return 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) + } + return root } override fun 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 new file mode 100644 index 0000000000000000000000000000000000000000..2e8084e7369cc19cc1849b785005019ea8f79a63 --- /dev/null +++ b/app/src/main/java/com/example/bandung_bondowoso/view/transaction/CreateTransactionFragment.kt @@ -0,0 +1,233 @@ +package com.example.bandung_bondowoso.view.transaction + +import android.Manifest +import android.app.Dialog +import android.content.pm.PackageManager +import android.location.Geocoder +import android.location.Location +import android.os.Build +import android.os.Bundle +import android.util.Log +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import android.widget.EditText +import android.widget.RadioButton +import android.widget.RadioGroup +import android.widget.TextView +import android.widget.Toast +import androidx.core.app.ActivityCompat +import androidx.fragment.app.viewModels +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +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.TransactionHelper +import com.example.bandung_bondowoso.model.Transaction +import com.example.bandung_bondowoso.model.TransactionCategory +import com.example.bandung_bondowoso.viewmodel.TransactionViewModel +import com.example.bandung_bondowoso.viewmodel.TransactionViewModelFactory +import com.google.android.gms.location.FusedLocationProviderClient +import com.google.android.gms.location.LocationServices +import java.util.Date + +class CreateTransactionFragment : Fragment() { + private val tag = "createTransactionFragment" + private var _binding: FragmentTransactionCreateBinding? = null + + private lateinit var transactionName: EditText + private lateinit var transactionAmount: EditText + private lateinit var transactionLocation: EditText + private lateinit var radioGroup: RadioGroup + private lateinit var incomeRadioButton: RadioButton + 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 val _locationName = MutableLiveData<String?>() + private val locationName: LiveData<String?> = _locationName + + private val _locationLat = MutableLiveData<Double>() + private val locationLat: LiveData<Double> = _locationLat + + private val _locationLong = MutableLiveData<Double>() + private val locationLong: LiveData<Double> = _locationLong + private val binding get() = _binding!! + + private lateinit var transactionHelper: TransactionHelper + + /** Initialize Transaction View Model */ + private val transactionViewModel: TransactionViewModel by viewModels { + TransactionViewModelFactory((activity?.application as BandungBondowosoApp).repository) + } + override fun onCreate(savedInstanceState: Bundle?) { + Log.d(tag, "onCreate") + super.onCreate(savedInstanceState) + } + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + Log.d(tag, "onCreateView") + + _binding = FragmentTransactionCreateBinding.inflate(inflater, container, false) + val root:View = binding.root + transactionHelper = TransactionHelper(requireContext()) + transactionName = binding.etTransactionName + transactionAmount = binding.etTransactionPrice + transactionLocation = binding.etTransactionLocation + radioGroup = binding.rgCategory + incomeRadioButton = binding.rbPemasukan + expenseRadioButton = binding.rbPembelian + dialog = Dialog(requireContext()) + dialog.setContentView(R.layout.dialog_custom) + dialog.window?.setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT) + dialog.window?.setBackgroundDrawableResource(R.drawable.bg_custom_dialog) + dialog.setCancelable(false) + tvDialogTitle = dialog.findViewById(R.id.dialog_tv_title) + tvDialogMsg = dialog.findViewById(R.id.dialog_tv_message) + btnDialogCancel= dialog.findViewById(R.id.dialog_btn_cancel) + btnDialogSubmit= dialog.findViewById(R.id.dialog_btn_submit) + btnDialogSubmit.text = getString(R.string.button_ok) + tvDialogTitle.text= getString(R.string.dialog_title_new_transaction) + tvDialogMsg.text = getString(R.string.dialog_message_new_transaction) + submitButton = binding.btnSubmit + submitButton.setOnClickListener { + if(createNewTransaction()){ + clearField() + Navigation.findNavController(root).navigate(R.id.action_newTransactionFragment_to_navigation_transaction) + Toast.makeText(requireContext(), "Create ETransaction Success", Toast.LENGTH_SHORT).show() + } else { + Toast.makeText(requireContext(), "Create ETransaction Failed", Toast.LENGTH_SHORT).show() + } + } + cancelButton = binding.btnCancel + cancelButton.setOnClickListener { + dialog.show() + btnDialogSubmit.setOnClickListener { + clearField() + Navigation.findNavController(root).navigate(R.id.action_newTransactionFragment_to_navigation_transaction) + dialog.dismiss() + } + btnDialogCancel.setOnClickListener { + dialog.dismiss() + } + } + return root + } + + private fun createNewTransaction(): Boolean{ + Log.d(tag, "createNewTransaction") + if (!transactionHelper.validateTransaction( + transactionName, + transactionAmount, + expenseRadioButton, + incomeRadioButton, + transactionLocation + )) return false + + val name = transactionName.text.toString() + val amount = transactionAmount.text.toString().toInt() + val location = transactionLocation.text.toString() + val category = when { + incomeRadioButton.isChecked -> TransactionCategory.INCOME + expenseRadioButton.isChecked -> TransactionCategory.EXPENSE + else -> throw IllegalStateException("No category selected") + } + + val newTransaction = Transaction( + name = name, + amount = amount, + type = category, + locationLat = 0.0, + locationLong = 0.0, + locationName = "Bandung", + createdAt = Date() + ) + transactionViewModel.upsert(newTransaction) + return true + } + private fun clearField(){ + Log.d(tag, "clearField") + transactionName.text.clear() + transactionAmount.text.clear() + transactionLocation.text.clear() + incomeRadioButton.isChecked = false + expenseRadioButton.isChecked = false + } + + private fun getLastLocation() { + Log.d(tag, "getLastLocation") + fusedLocationClient = LocationServices.getFusedLocationProviderClient(requireActivity()) + if (ActivityCompat.checkSelfPermission( + requireContext(), + Manifest.permission.ACCESS_COARSE_LOCATION + ) != PackageManager.PERMISSION_GRANTED + ) { + return + } + fusedLocationClient.lastLocation + .addOnSuccessListener { location: Location? -> + if (location != null) { + Log.d("HomeFragment", "Location: ${location.latitude}, ${location.longitude}") + 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) + } + } + + @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 + } + } + +} \ 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 new file mode 100644 index 0000000000000000000000000000000000000000..40680328b7507539d79d75b7cda23c8bdd5054dc --- /dev/null +++ b/app/src/main/java/com/example/bandung_bondowoso/view/transaction/EditTransactionFragment.kt @@ -0,0 +1,171 @@ +package com.example.bandung_bondowoso.view.transaction + +import android.app.Dialog +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.EditText +import android.widget.RadioButton +import android.widget.RadioGroup +import android.widget.TextView +import android.widget.Toast +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.lifecycle.lifecycleScope +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.TransactionHelper +import com.example.bandung_bondowoso.model.Transaction +import com.example.bandung_bondowoso.model.TransactionCategory +import com.example.bandung_bondowoso.viewmodel.TransactionViewModel +import com.example.bandung_bondowoso.viewmodel.TransactionViewModelFactory +import kotlinx.coroutines.launch +import java.util.Date +import kotlin.properties.Delegates + +class EditTransactionFragment : Fragment() { + private val tag ="EditTransactionFragment" + private var _binding: FragmentTransactionCreateBinding? = null + private val transactionId: Int by lazy { + arguments?.getInt("transactionId") ?: throw IllegalArgumentException("Transaction ID not provided") + } + private val binding get() = _binding!! + private lateinit var transactionHelper: TransactionHelper + /** Initialize Transaction View Model */ + private val transactionViewModel: TransactionViewModel by viewModels { + TransactionViewModelFactory((activity?.application as BandungBondowosoApp).repository) + } + private lateinit var transactionName: EditText + private lateinit var transactionAmount: EditText + private lateinit var transactionLocation: EditText + private lateinit var radioGroup: RadioGroup + private lateinit var incomeRadioButton: RadioButton + private lateinit var expenseRadioButton: RadioButton + private lateinit var submitButton: Button + private lateinit var cancelButton: Button + private lateinit var transaction: Transaction + private lateinit var title: TextView + 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 transactionDate:Date + private var locationLat by Delegates.notNull<Double>() + private var locationLong by Delegates.notNull<Double>() + + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + // Inflate the layout for this fragment + _binding = FragmentTransactionCreateBinding.inflate(inflater, container, false) + val root:View = binding.root + title = binding.tvTransactionNew + transactionHelper = TransactionHelper(requireContext()) + transactionName = binding.etTransactionName + transactionAmount = binding.etTransactionPrice + transactionLocation = binding.etTransactionLocation + radioGroup = binding.rgCategory + incomeRadioButton = binding.rbPemasukan + expenseRadioButton = binding.rbPembelian + submitButton = binding.btnSubmit + cancelButton = binding.btnCancel + dialog = Dialog(requireContext()) + dialog.setContentView(R.layout.dialog_custom) + dialog.window?.setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT) + dialog.window?.setBackgroundDrawableResource(R.drawable.bg_custom_dialog) + dialog.setCancelable(false) + tvDialogTitle = dialog.findViewById(R.id.dialog_tv_title) + tvDialogMsg = dialog.findViewById(R.id.dialog_tv_message) + btnDialogCancel= dialog.findViewById(R.id.dialog_btn_cancel) + btnDialogSubmit= dialog.findViewById(R.id.dialog_btn_submit) + btnDialogSubmit.text = getString(R.string.button_ok) + submitButton = binding.btnSubmit + + lifecycleScope.launch{ + transaction = transactionViewModel.getTransaction(transactionId) + title.text = transaction.name + transactionName.setText(transaction.name) + transactionAmount.setText(transaction.amount.toString()) + transactionLocation.setText(transaction.locationName) + if(transaction.type == TransactionCategory.INCOME ) { + incomeRadioButton.isChecked = true + } else { + expenseRadioButton.isChecked = true + } + tvDialogTitle.text = getString(R.string.dialog_title_edit_transaction, transaction.name) + tvDialogMsg.text = getString(R.string.dialog_message_edit_transaction, transaction.name) + transactionDate = transaction.createdAt + locationLat = transaction.locationLat + locationLong = transaction.locationLong + } + + submitButton.setOnClickListener { + if(editTransaction()){ + Navigation.findNavController(root).navigate(R.id.action_editTransactionFragment_to_navigation_transaction) + Toast.makeText(requireContext(), "Edit Transaction Success", Toast.LENGTH_SHORT).show() + } else { + Toast.makeText(requireContext(), "Edit Transaction Failed", Toast.LENGTH_SHORT).show() + } + } + cancelButton.setOnClickListener { + dialog.show() + btnDialogSubmit.setOnClickListener { + Navigation.findNavController(root).navigate(R.id.action_editTransactionFragment_to_navigation_transaction) + dialog.dismiss() + } + btnDialogCancel.setOnClickListener { + dialog.dismiss() + } + } + 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") + if (!transactionHelper.validateTransaction( + transactionName, + transactionAmount, + expenseRadioButton, + incomeRadioButton, + transactionLocation + )) return false + + val name = transactionName.text.toString() + val amount = transactionAmount.text.toString() + val location = transactionLocation.text.toString() + val category = when { + incomeRadioButton.isChecked -> TransactionCategory.INCOME + expenseRadioButton.isChecked -> TransactionCategory.EXPENSE + else -> throw IllegalStateException("No category selected") + } + + + val newTransaction = transaction.copy( + name = name, + amount = amount.toInt(), + type = category, + locationLat = locationLat, + locationLong = locationLong, + locationName = location + ) + + transactionViewModel.upsert(newTransaction) + return true + } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file 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 new file mode 100644 index 0000000000000000000000000000000000000000..0d905753fc758a12c616310ee3ad553efa152f49 --- /dev/null +++ b/app/src/main/java/com/example/bandung_bondowoso/view/transaction/TransactionAdapter.kt @@ -0,0 +1,163 @@ +package com.example.bandung_bondowoso.view.transaction + +import android.app.AlertDialog +import android.app.Dialog +import android.view.LayoutInflater +import android.view.View +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 +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +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 + +class TransactionAdapter (var transactionList: List<Transaction>, + private val itemClickListener: TransactionItemClickListener): + RecyclerView.Adapter<TransactionAdapter.TransactionViewHolder>(){ + inner class TransactionViewHolder(view: View): RecyclerView.ViewHolder(view){ + val tvTransactionName:TextView = view.findViewById(R.id.tv_transaction_name) + val tvTransactionAmount:TextView = view.findViewById(R.id.tv_transaction_amount) + val tvTransactionCategory:TextView = view.findViewById(R.id.tv_transaction_category) + val tvTransactionLocation:TextView = view.findViewById(R.id.tv_transaction_location) + val tvTransactionCurrency:TextView = view.findViewById(R.id.tv_currency) + val tvTransactionDate:TextView = view.findViewById(R.id.tv_transaction_date) + 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 dialog: Dialog = Dialog(itemView.context) + private lateinit var btnDialogCancel: Button + private lateinit var btnDialogSubmit: Button + + init { + mMenus.setOnClickListener { + popupMenus() + } + dialog.setContentView(R.layout.dialog_custom) + dialog.window?.setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT) + dialog.window?.setBackgroundDrawableResource(R.drawable.bg_custom_dialog) + dialog.setCancelable(false) + btnDialogCancel= dialog.findViewById(R.id.dialog_btn_cancel) + btnDialogSubmit= dialog.findViewById(R.id.dialog_btn_submit) + btnDialogSubmit.text = "HAPUS" + } + + private fun popupMenus(){ + val popupMenu = android.widget.PopupMenu(itemView.context, mMenus) + popupMenu.inflate(R.menu.transaction_menu) + popupMenu.setOnMenuItemClickListener { + when (it.itemId) { + R.id.edit_transaction -> { + itemClickListener.onEditTransaction(itemView, + transactionList[adapterPosition].id) + true + } + R.id.delete_transaction -> { + dialog.show() + btnDialogSubmit.setOnClickListener { + Toast.makeText(itemView.context, + "Transaction Deleted", Toast.LENGTH_SHORT).show() + itemClickListener.onDeleteTransaction(transactionList[adapterPosition]) + dialog.dismiss() + } + btnDialogCancel.setOnClickListener { + Toast.makeText(itemView.context, "Canceled", Toast.LENGTH_SHORT) + .show() + dialog.dismiss() + } + true + } + else -> false + } + } + try{ + val fieldMPopup = PopupMenu::class.java.getDeclaredField("mPopup") + fieldMPopup.isAccessible = true + val mPopup = fieldMPopup.get(popupMenu) + mPopup.javaClass.getDeclaredMethod("setForceShowIcon", Boolean::class.java) + .invoke(mPopup, true) + } catch (e: Exception){ + e.printStackTrace() + } + popupMenu.show() + } + + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TransactionViewHolder { + val view = LayoutInflater.from(parent.context). + inflate(R.layout.item_transaction, parent, false) + return TransactionViewHolder(view) + } + + override fun getItemCount(): Int { + return transactionList.size + } + + override fun onBindViewHolder(holder: TransactionViewHolder, position: Int) { + val transaction = transactionList[position] + val imageResource = when (transaction.type) { + TransactionCategory.INCOME -> R.drawable.ic_money_bill_wave + TransactionCategory.EXPENSE -> R.drawable.ic_shopping_cart + } + + val valueResource = when (transaction.type) { + TransactionCategory.INCOME -> R.drawable.ic_add + TransactionCategory.EXPENSE -> R.drawable.ic_remove + } + + Glide.with(holder.itemView.context) + .load(imageResource) + .into(holder.tvImageIcon as ImageView) + + Glide.with(holder.itemView.context) + .load(valueResource) + .into(holder.tvValueIcon) + + holder.tvTransactionName.text = transaction.name + holder.tvTransactionAmount.text = transaction.amount.toString() + + val category = transaction.type.name + if (category == "INCOME") { + holder.tvTransactionAmount.setTextColor( + ContextCompat.getColor(holder.itemView.context, R.color.md_theme_green) + ) + holder.tvTransactionCurrency.setTextColor( + ContextCompat.getColor(holder.itemView.context, R.color.md_theme_green) + ) + holder.tvValueIcon.setColorFilter( + ContextCompat.getColor(holder.itemView.context, R.color.md_theme_green) + ) + } else { + holder.tvTransactionAmount.setTextColor( + ContextCompat.getColor(holder.itemView.context, R.color.md_theme_red) + ) + holder.tvTransactionCurrency.setTextColor( + ContextCompat.getColor(holder.itemView.context, R.color.md_theme_red) + ) + holder.tvValueIcon.setColorFilter( + ContextCompat.getColor(holder.itemView.context, R.color.md_theme_red) + ) + } + + val dateFormat = SimpleDateFormat("dd/MM/yyyy HH:mm:ss", Locale.getDefault()) + holder.tvTransactionCategory.text = transaction.type.name + 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() + } + } +} \ 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 new file mode 100644 index 0000000000000000000000000000000000000000..8ad67d58d7c93ea0e02085ea90228d647fb8db8d --- /dev/null +++ b/app/src/main/java/com/example/bandung_bondowoso/view/transaction/TransactionFragment.kt @@ -0,0 +1,101 @@ +package com.example.bandung_bondowoso.view.transaction + +import android.location.Geocoder +import android.os.Build +import androidx.lifecycle.ViewModelProvider +import android.os.Bundle +import android.util.Log +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.os.bundleOf +import androidx.fragment.app.viewModels +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.lifecycleScope +import androidx.navigation.Navigation +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.`interface`.TransactionItemClickListener +import com.example.bandung_bondowoso.model.Transaction +import com.example.bandung_bondowoso.repository.TransactionRepository +import com.example.bandung_bondowoso.viewmodel.TransactionViewModel +import com.example.bandung_bondowoso.viewmodel.TransactionViewModelFactory +import com.google.android.material.floatingactionbutton.FloatingActionButton +import kotlinx.coroutines.launch + +class TransactionFragment : Fragment(), TransactionItemClickListener { + private var _binding: FragmentTransactionBinding? = null + private val tag = "transactionFragment" + private val binding get() = _binding!! + private var transactionList = listOf<Transaction>() + private lateinit var adapter: TransactionAdapter + + private val transactionViewModel: TransactionViewModel by viewModels { + TransactionViewModelFactory((activity?.application as BandungBondowosoApp).repository) + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + Log.d(tag, "onCreateView") + _binding = FragmentTransactionBinding.inflate(inflater, container, false) + val root:View = binding.root + + + adapter = TransactionAdapter(transactionList, itemClickListener = this) + binding.rvTransaction.adapter = adapter + binding.rvTransaction.layoutManager = LinearLayoutManager(context) +// viewModel.seedData() + transactionViewModel.transactions.observe(viewLifecycleOwner) { + Log.d(tag, "Transactions: $it") + + transactionList = it + if(transactionList.isNotEmpty()){ + adapter = TransactionAdapter(transactionList, itemClickListener = this) + binding.rvTransaction.adapter = adapter + } else { + Log.d(tag, "Transaction list is empty") + binding.clEmptyRv.visibility = View.VISIBLE + binding.rvTransaction.visibility = View.GONE + } + } + + transactionViewModel.balance.observe(viewLifecycleOwner){ + Log.d(tag, "Balance: $it") + binding.tvBalanceNominal.text = it.toString() + } + 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?) { + Log.d(tag, "onViewCreated") + super.onViewCreated(view, savedInstanceState) + } + override fun onDeleteTransaction(transaction: Transaction) { + transactionViewModel.delete(transaction) + } + + override fun onEditTransaction(root:View, id:Int) { + val bundle = bundleOf("transactionId" to id) + Navigation.findNavController(root).navigate(R.id.action_navigation_transaction_to_editTransactionFragment, bundle) + } + + override fun onOpenMap(location:String) { + TODO() + } + +} diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/graph/GraphViewModel.kt b/app/src/main/java/com/example/bandung_bondowoso/viewmodel/GraphViewModel.kt similarity index 60% rename from app/src/main/java/com/example/bandung_bondowoso/view/graph/GraphViewModel.kt rename to app/src/main/java/com/example/bandung_bondowoso/viewmodel/GraphViewModel.kt index b0d93dbd0a38d898ec8e731b5960c078207aa164..e5fdfca5f49f2ee7beb3f0d70b14e2674ff7050d 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/view/graph/GraphViewModel.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/viewmodel/GraphViewModel.kt @@ -1,4 +1,4 @@ -package com.example.bandung_bondowoso.view.graph +package com.example.bandung_bondowoso.viewmodel import androidx.lifecycle.ViewModel diff --git a/app/src/main/java/com/example/bandung_bondowoso/viewmodel/HomeViewModel.kt b/app/src/main/java/com/example/bandung_bondowoso/viewmodel/HomeViewModel.kt index fc36a990368906b5049a3386b3609193d276f195..9dcb246df278c465915859ea75afbf3237c166ca 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/viewmodel/HomeViewModel.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/viewmodel/HomeViewModel.kt @@ -35,7 +35,11 @@ class HomeViewModel(application: Application) : AndroidViewModel(application) { } } } - + fun getTransactionCount(){ + viewModelScope.launch { + repository.getCount() + } + } fun upsert(transaction: Transaction) = viewModelScope.launch { repository.upsert(transaction) } diff --git a/app/src/main/java/com/example/bandung_bondowoso/viewmodel/TransactionViewModel.kt b/app/src/main/java/com/example/bandung_bondowoso/viewmodel/TransactionViewModel.kt new file mode 100644 index 0000000000000000000000000000000000000000..9aa4db76782a9eda0f285044cb2aaaf187d2b25c --- /dev/null +++ b/app/src/main/java/com/example/bandung_bondowoso/viewmodel/TransactionViewModel.kt @@ -0,0 +1,132 @@ +package com.example.bandung_bondowoso.viewmodel + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.viewModelScope +import com.example.bandung_bondowoso.model.Transaction +import com.example.bandung_bondowoso.model.TransactionCategory +import com.example.bandung_bondowoso.repository.TransactionRepository +import kotlinx.coroutines.launch + +class TransactionViewModel(private val repository:TransactionRepository) : ViewModel() { + + private val _transactions = MutableLiveData<List<Transaction>>() + val transactions = _transactions + private val _balance = MutableLiveData<Int>() + val balance: LiveData<Int> = _balance + private val TAG = "TransactionViewModel" + + init { + viewModelScope.launch { + repository.getAll.collect { + _transactions.value = it + _balance.value = getBalance() + } + } + } + + suspend fun getTransaction(id: Int): Transaction { + return repository.getTransaction(id) + } + + fun getTransactionCount(){ + viewModelScope.launch { + repository.getCount() + } + } + fun upsert(transaction: Transaction) { + viewModelScope.launch { + repository.upsert(transaction) + } + } + + suspend fun getIncome(): Int { + return repository.getIncome() + } + + suspend fun getExpense(): Int { + return repository.getExpense() + } + private suspend fun getBalance(): Int { + return -1 * (getExpense() - getIncome()) + } + + fun edit(transaction: Transaction) { + viewModelScope.launch { + repository.upsert(transaction) + } + } + + fun validateAndUpdateTransaction(prevTransaction:Transaction, newTransaction: Transaction, field:String):Boolean{ + TODO() + } + fun delete(transaction: Transaction) { + viewModelScope.launch { + repository.delete(transaction) + } + } + fun randomizeTransaction():Transaction{ + val random = (0..1).random() + val randomName = (1..1000).random() + val randomAmount = (0..1000000).random() + val randomLocation = (0..1).random() + val randomType = if(random == 0) TransactionCategory.INCOME else TransactionCategory.EXPENSE + val randomLat = (-90..90).random().toDouble() + val randomLong = (-180..180).random().toDouble() + val randomLocationName = if(randomLocation == 0) "Bandung" else "Bondowoso" + return Transaction( name = "Random Transaction $randomName", amount = randomAmount, + type = randomType, locationLat = randomLat, + locationLong = randomLong, locationName = randomLocationName, + createdAt = java.util.Date()) } + // Development function + fun deleteAll() { + viewModelScope.launch { + repository.deleteAll() + } + } + fun seedData(){ + val transactionList = mutableListOf<Transaction>( + Transaction( name = "Test 1", amount = 100, + type = TransactionCategory.INCOME, locationLat = 6.1944, + locationLong = 106.8229, locationName = "Jakarta", + createdAt = java.util.Date()), + Transaction( name = "Test 2", amount = 100, + type = TransactionCategory.INCOME, locationLat = 6.1944, + locationLong = 106.8229, locationName = "Jakarta", + createdAt = java.util.Date()), + Transaction( name = "Test 3", amount = 100, + type = TransactionCategory.INCOME, locationLat = 6.1944, + locationLong = 106.8229, locationName = "Jakarta", + createdAt = java.util.Date()), + Transaction( name = "Test 4 ", amount = 100, + type = TransactionCategory.INCOME, locationLat = 6.1944, + locationLong = 106.8229, locationName = "Jakarta", + createdAt = java.util.Date()), + Transaction( name = "Test 5", amount = 100, + type = TransactionCategory.INCOME, locationLat = 6.1944, + locationLong = 106.8229, locationName = "Jakarta", + createdAt = java.util.Date()), + Transaction( name = "Test 6", amount = 100, + type = TransactionCategory.INCOME, locationLat = 6.1944, + locationLong = 106.8229, locationName = "Jakarta", + createdAt = java.util.Date()) + ) + + transactionList.forEach { + upsert(it) + } + } +} + +/** Provides repository to transaction view model */ +class TransactionViewModelFactory(private val repository: TransactionRepository) : ViewModelProvider.Factory { + override fun <T : ViewModel> create(modelClass: Class<T>): T { + if (modelClass.isAssignableFrom(TransactionViewModel::class.java)) { + @Suppress("UNCHECKED_CAST") + return TransactionViewModel(repository) as T + } + throw IllegalArgumentException("Unknown ViewModel class") + } +} diff --git a/app/src/main/res/drawable/bg_custom_dialog.xml b/app/src/main/res/drawable/bg_custom_dialog.xml new file mode 100644 index 0000000000000000000000000000000000000000..67a18ff4d5b6ca1aa2b33226000937ff085c2b22 --- /dev/null +++ b/app/src/main/res/drawable/bg_custom_dialog.xml @@ -0,0 +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_surfaceContainer"/> + <corners android:radius="20dp"/> + <size android:width="330dp"/> +</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 c649309ddf3978aac40a42938a058055fdd4a3ea..fb36bc26960f5d59e9a1efb69fb45447c79c5c48 100644 --- a/app/src/main/res/drawable/bg_transaction_card.xml +++ b/app/src/main/res/drawable/bg_transaction_card.xml @@ -1,7 +1,6 @@ -<?xml version="1.0" encoding="UTF-8"?> +<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> - <solid android:color="@android:color/transparent" /> - <stroke android:width="1dp" android:color="@color/md_theme_primary" /> - <corners android:radius="10dp"/> - <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" /> + <solid android:color="@color/md_theme_surface" /> + <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_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 0000000000000000000000000000000000000000..b48d354e65ce274b2b645256c3bda2078d1e342a --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,5 @@ +<vector android:height="24dp" android:tint="#000E8E" + 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="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z"/> +</vector> diff --git a/app/src/main/res/drawable/ic_edit.xml b/app/src/main/res/drawable/ic_edit.xml new file mode 100644 index 0000000000000000000000000000000000000000..db53a40a8bec9e3780accfa97cc808342e40a9fd --- /dev/null +++ b/app/src/main/res/drawable/ic_edit.xml @@ -0,0 +1,5 @@ +<vector android:height="24dp" android:tint="#000E8E" + 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="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z"/> +</vector> diff --git a/app/src/main/res/drawable/ic_more.xml b/app/src/main/res/drawable/ic_more.xml new file mode 100644 index 0000000000000000000000000000000000000000..6a7f27486b5865f637ed23c45b34d6ea1f32a2c3 --- /dev/null +++ b/app/src/main/res/drawable/ic_more.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="M12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z"/> +</vector> diff --git a/app/src/main/res/drawable/ic_remove.xml b/app/src/main/res/drawable/ic_remove.xml new file mode 100644 index 0000000000000000000000000000000000000000..128a7430fd985e7f784ba6b57f0caee824d2b7a5 --- /dev/null +++ b/app/src/main/res/drawable/ic_remove.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="M19,13H5v-2h14v2z"/> +</vector> diff --git a/app/src/main/res/drawable/no_data_cuate.xml b/app/src/main/res/drawable/no_data_cuate.xml new file mode 100644 index 0000000000000000000000000000000000000000..e6c0aaeb1d8d22069c48d3e89a23ca8dfc1adc6b --- /dev/null +++ b/app/src/main/res/drawable/no_data_cuate.xml @@ -0,0 +1,524 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="750dp" + android:height="500dp" + android:viewportWidth="750" + android:viewportHeight="500"> + <path + android:pathData="M666.95,150.27l-9.57,46.35l-6.16,-6.01l-10.48,7.48l-8.01,-9.95l-17.96,13.06l-15.35,-25.67l-17.12,10.03l-6.79,-9.36l-21.74,12.25l-6.54,-14.01l15.24,-73.81l81.7,16.87l22.78,32.77z" + android:fillColor="#ebebeb"/> + <path + android:pathData="M644.17,117.5l22.78,32.77l-28.34,-5.85l5.56,-26.92z" + android:fillColor="#dbdbdb"/> + <path + android:pathData="M655.34,205.88l-14.03,68l-110.05,-22.72l13.93,-67.45l6.54,14l21.75,-12.25l6.78,9.36l17.13,-10.02l15.34,25.67l17.97,-13.06l8,9.94l10.49,-7.47l6.15,6z" + android:fillColor="#ebebeb"/> + <path + android:pathData="M497.83,197.91l-112.15,6.94l-8.91,-143.96l83.28,-5.16l30.57,25.65l7.21,116.53z" + android:fillColor="#ebebeb"/> + <path + android:pathData="M460.05,55.73l30.57,25.65l-28.88,1.79l-1.69,-27.44z" + android:fillColor="#dbdbdb"/> + <path + android:pathData="M429,152.6l-0.44,-3.25c-1.13,-6.73 0.71,-14.26 6.56,-22.13 5.28,-7 8.14,-12 7.82,-17.68 -0.36,-6.4 -4.61,-10.44 -12.52,-10.12a22.31,22.31 0,0 0,-12.45 4.6l-3.45,-7.73c4,-3.25 11,-5.65 17.65,-6 14.43,-0.8 21.45,7.74 22,17.27 0.48,8.53 -3.94,14.94 -9.56,22.43 -5.16,6.83 -6.85,12.46 -6.12,18.83l0.31,3.26ZM427.22,170.31c-0.26,-4.64 2.69,-8.08 7.08,-8.32s7.59,2.84 7.85,7.49c0.24,4.39 -2.45,7.93 -7.09,8.19C430.63,177.92 427.43,174.7 427.18,170.31Z" + android:fillColor="#dbdbdb"/> + <path + android:pathData="M148.48,128.11 L137.2,123l-1.57,3.45a3,3 0,0 1,-2.57 1.72,14.48 14.48,0 0,0 -1.85,0.18 3,3 0,0 1,-2.85 -1.18l-2.21,-3.09 -10.07,7.22 2.21,3.09a3,3 0,0 1,0.2 3.07,18.29 18.29,0 0,0 -0.77,1.69 3,3 0,0 1,-2.45 1.89l-3.77,0.37 1.21,12.33 3.79,-0.38a3,3 0,0 1,2.77 1.38c0.16,0.26 0.33,0.51 0.51,0.76s0.36,0.49 0.55,0.73a2.94,2.94 0,0 1,0.42 3.05l-1.58,3.48 11.29,5.12 1.57,-3.47a3,3 0,0 1,2.58 -1.71,16.19 16.19,0 0,0 1.83,-0.18 3,3 0,0 1,2.85 1.18l2.21,3.09 10.08,-7.22 -2.21,-3.09a2.91,2.91 0,0 1,-0.2 -3.07,17.94 17.94,0 0,0 0.75,-1.68 2.94,2.94 0,0 1,2.45 -1.89l3.79,-0.38 -1.22,-12.33 -3.79,0.37a2.94,2.94 0,0 1,-2.75 -1.37c-0.17,-0.26 -0.34,-0.51 -0.52,-0.76s-0.36,-0.5 -0.55,-0.73a3,3 0,0 1,-0.42 -3.07ZM142.08,139.52a10.15,10.15 0,1 1,-14.16 -2.34A10.15,10.15 0,0 1,142.08 139.52Z" + android:fillColor="#ebebeb"/> + <path + android:pathData="M658.38,291.71l-7.52,4.34 1.33,2.3a2,2 0,0 1,-0.07 2.17c-0.23,0.36 -0.45,0.73 -0.65,1.12a2,2 0,0 1,-1.83 1.14L647,302.78v8.69h2.66a2,2 0,0 1,1.83 1.14c0.2,0.39 0.42,0.76 0.65,1.12a2,2 0,0 1,0.07 2.17l-1.33,2.3 7.52,4.34 1.34,-2.31a2.05,2.05 0,0 1,1.91 -1h1.28a2.06,2.06 0,0 1,1.91 1l1.34,2.32 7.51,-4.34 -1.33,-2.31a2.05,2.05 0,0 1,0.08 -2.16c0.23,-0.36 0.45,-0.74 0.65,-1.12a2,2 0,0 1,1.83 -1.14h2.66v-8.69L674.9,302.79a2,2 0,0 1,-1.83 -1.14c-0.2,-0.38 -0.42,-0.76 -0.65,-1.12a2.05,2.05 0,0 1,-0.08 -2.16l1.33,-2.31 -7.51,-4.34L664.82,294a2.05,2.05 0,0 1,-1.91 1l-0.64,0 -0.64,0a2.08,2.08 0,0 1,-1.92 -1ZM662.27,300.01a7.12,7.12 0,1 1,-7.11 7.11A7.11,7.11 0,0 1,662.27 300Z" + android:fillColor="#ebebeb"/> + <path + android:pathData="M171.3,91.16l-6.89,5.28L166,98.55a2,2 0,0 1,0.21 2.15,10.47 10.47,0 0,0 -0.5,1.2 2.05,2.05 0,0 1,-1.67 1.37l-2.64,0.34 1.12,8.61 2.64,-0.34a2.06,2.06 0,0 1,2 0.9,11.14 11.14,0 0,0 0.78,1 2,2 0,0 1,0.36 2.13l-1,2.46 8,3.33 1,-2.46a2.05,2.05 0,0 1,1.77 -1.25l0.64,-0.07 0.63,-0.1a2.06,2.06 0,0 1,2 0.75l1.63,2.13 6.89,-5.28 -1.61,-2.11a2.06,2.06 0,0 1,-0.21 -2.16,11.12 11.12,0 0,0 0.5,-1.19 2.05,2.05 0,0 1,1.67 -1.37l2.64,-0.34 -1.12,-8.61 -2.64,0.34a2.06,2.06 0,0 1,-2 -0.89c-0.25,-0.36 -0.51,-0.7 -0.79,-1A2.07,2.07 0,0 1,186 96l1,-2.46 -8,-3.33 -1,2.46a2.07,2.07 0,0 1,-1.77 1.25l-0.64,0.06L175,94a2.06,2.06 0,0 1,-2 -0.75ZM176.23,98.89a7.11,7.11 0,1 1,-6.14 8A7.11,7.11 0,0 1,176.23 98.89Z" + android:fillColor="#ebebeb"/> + <path + android:pathData="M119.82,316.78a275.64,275.64 0,0 0,-0.4 -29,370.79 370.79,0 0,0 -9.09,-59.16c-2.54,-10.94 -5.66,-21.7 -8.92,-32.45 -0.1,-0.33 -0.62,-0.24 -0.53,0.1 10.07,37.9 18.33,77 17.76,116.4 -0.16,11 -1.44,21.85 -2.48,32.81 0,0.29 0.45,0.41 0.52,0.11C118.75,336.18 119.43,326.36 119.82,316.78Z" + android:fillColor="#ebebeb"/> + <path + android:pathData="M100.88,196.24S85.64,234.94 89.05,244s10.45,11 10.45,11 -9.33,13.32 -2.81,25.81 21,11.9 22,26.06C118.66,306.94 119.46,247.73 100.88,196.24Z" + android:fillColor="#ebebeb"/> + <path + android:pathData="M117,282.49a0.28,0.28 0,0 0,0 -0.2,354.31 354.31,0 0,0 -14.78,-77.85c0,-0.07 -0.15,-0.05 -0.13,0q4.53,17 8,34.14a16.87,16.87 0,0 0,-7.28 -4.06s-0.08,0.06 0,0.08a19.35,19.35 0,0 1,7.52 5c0.44,2.25 0.88,4.49 1.29,6.74 -3.41,-3.81 -8.13,-5.7 -12.86,-7.5a0.06,0.06 0,0 0,0 0.11c4.93,2 9.83,4.58 13.17,8.83q1.74,9.63 3.06,19.33a18.43,18.43 0,0 0,-9.09 -5.21c-0.11,0 -0.17,0.13 -0.06,0.16A19.16,19.16 0,0 1,115 268l0.06,0q0.45,3.4 0.86,6.83a23.37,23.37 0,0 0,-6.37 -3.84c-0.06,0 -0.1,0.07 0,0.09a21.89,21.89 0,0 1,6.39 4.23s0.05,0 0.08,0c0.25,2.17 0.5,4.34 0.72,6.51a31,31 0,0 0,-12.93 -9.24,0.08 0.08,0 0,0 0,0.16 33.68,33.68 0,0 1,12.74 9.81,0.3 0.3,0 0,0 0.32,0.1c0.33,3.33 0.63,6.66 0.87,10 0,0.05 0.08,0.05 0.08,0Q117.43,287.62 117,282.49Z" + android:fillColor="#fff"/> + <path + android:pathData="M104.75,230.71a19.09,19.09 0,0 0,-9.16 -2.86,0.06 0.06,0 0,0 0,0.12 36.16,36.16 0,0 1,9.06 3C104.77,231 104.86,230.79 104.75,230.71Z" + android:fillColor="#fff"/> + <path + android:pathData="M106.6,271.68a19.06,19.06 0,0 0,-6.88 -2.35c-0.08,0 -0.09,0.11 0,0.13a26.05,26.05 0,0 1,6.8 2.38C106.61,271.89 106.69,271.73 106.6,271.68Z" + android:fillColor="#fff"/> + <path + android:pathData="M159.9,244.67a103.7,103.7 0,0 0,-17.65 15.42,63.19 63.19,0 0,0 -12.37,21 156.93,156.93 0,0 0,-9.22 50.2,122.32 122.32,0 0,0 2.71,28.23 0.27,0.27 0,0 0,0.53 -0.1,158.6 158.6,0 0,1 0.28,-49.35c2.62,-16 6.73,-33.42 16.91,-46.43 5.54,-7.09 12.45,-12.66 19.28,-18.42C160.73,244.9 160.27,244.41 159.9,244.67Z" + android:fillColor="#ebebeb"/> + <path + android:pathData="M122.9,319.75a95,95 0,0 1,12.86 -16.44c7.63,-7.63 14.05,-13.05 15.05,-18.09s-7.64,-8.76 -7.64,-8.76 10.55,1.9 13.44,-2.53 4.28,-30.09 4.28,-30.09 -19.2,13.71 -28.15,32.93S122.9,319.75 122.9,319.75Z" + android:fillColor="#ebebeb"/> + <path + android:pathData="M154.25,250.42c-8.08,7.93 -16.21,16.39 -21,26.82A102.83,102.83 0,0 0,129 288.29v0c-0.24,0.76 -0.49,1.52 -0.72,2.28a0.19,0.19 0,0 0,0 0.12,218.27 218.27,0 0,0 -5.46,23.71c0,0.05 0.07,0.07 0.08,0 0.83,-4 1.74,-8 2.76,-12.07a0.27,0.27 0,0 0,0.12 0,17.14 17.14,0 0,1 5,-1.28c0.11,0 0.1,-0.21 0,-0.2a18.78,18.78 0,0 0,-5 0.91c0.93,-3.63 1.94,-7.26 3.08,-10.83a53.32,53.32 0,0 1,11.39 -1.49,0 0,0 0,0 0,-0.06 43,43 0,0 0,-11.2 0.95c0.2,-0.61 0.41,-1.22 0.61,-1.83a59.12,59.12 0,0 1,7.58 -1.29s0,-0.08 0,-0.08a37,37 0,0 0,-7.42 0.9c1,-3.09 2.17,-6.14 3.42,-9.1a55,55 0,0 1,3.63 -7,45.52 45.52,0 0,1 6.15,-1.1s0,-0.1 0,-0.1a16.67,16.67 0,0 0,-5.75 0.57c1,-1.63 2.07,-3.23 3.21,-4.78h0c4.31,-0.95 8.67,-1.84 13.08,-1a0.07,0.07 0,0 0,0 -0.13c-4.19,-1.11 -8.35,-0.47 -12.52,0.35 0.45,-0.6 0.92,-1.2 1.39,-1.79a28.43,28.43 0,0 1,8 -1.27,0 0,0 0,0 0,-0.09 21.09,21.09 0,0 0,-7.5 0.67c3.56,-4.42 7.49,-8.58 11.38,-12.69C154.58,250.34 154.44,250.23 154.25,250.42Z" + android:fillColor="#fff"/> + <path + android:pathData="M154,267.91a16.84,16.84 0,0 0,-3.82 -0.13c-0.15,0 -0.14,0.26 0,0.27 1.26,0 2.53,-0.06 3.79,0A0.08,0.08 0,0 0,154 267.91Z" + android:fillColor="#fff"/> + <path + android:pathData="M140.21,292.8a17.2,17.2 0,0 0,-5.92 1.18s0,0.1 0,0.09c2,-0.47 3.93,-0.66 5.91,-1A0.15,0.15 0,0 0,140.21 292.8Z" + android:fillColor="#fff"/> + <path + android:pathData="M136.07,284.2a13.23,13.23 0,0 0,-2.51 0.22,0.08 0.08,0 0,0 0,0.15 12.39,12.39 0,0 0,2.51 -0.11A0.13,0.13 0,0 0,136.07 284.2Z" + android:fillColor="#fff"/> + <path + android:pathData="M66.61,271.89a87.15,87.15 0,0 1,17.85 8.41,53.33 53.33,0 0,1 14.87,14.12 132.2,132.2 0,0 1,19.06 38.49,102.52 102.52,0 0,1 4.32,23.48 0.23,0.23 0,0 1,-0.45 0,133.21 133.21,0 0,0 -11.62,-39.87c-5.83,-12.35 -13.18,-25.49 -24.42,-33.67 -6.12,-4.45 -13,-7.37 -19.86,-10.45C66,272.28 66.25,271.77 66.61,271.89Z" + android:fillColor="#ebebeb"/> + <path + android:pathData="M113.91,324.1A80.28,80.28 0,0 0,99.7 313.77c-7.94,-4.41 -14.39,-7.31 -16.36,-11.16s4.16,-8.85 4.16,-8.85 -8.1,4 -11.46,1.05 -10.42,-23.35 -10.42,-23.35S84.33,278.11 96,291.6 113.91,324.1 113.91,324.1Z" + android:fillColor="#ebebeb"/> + <path + android:pathData="M112.93,319.89C103.58,302.33 91.09,286.44 74,276h0a86.26,86.26 0,0 1,12.52 9.8,19.88 19.88,0 0,0 -10.06,2.12 0.06,0.06 0,0 0,0 0.11,27.5 27.5,0 0,1 10.35,-1.75 0.25,0.25 0,0 0,0.12 0c0.61,0.57 1.2,1.16 1.8,1.75a31.46,31.46 0,0 0,-5.38 0.71s0,0.08 0,0.08a27,27 0,0 1,5.67 -0.47,116.91 116.91,0 0,1 8.83,10 8.84,8.84 0,0 0,-3.76 0.27,0.07 0.07,0 1,0 0,0.14 19.92,19.92 0,0 1,4 -0.05c0.51,0.65 1,1.3 1.53,2a35.87,35.87 0,0 0,-11.35 1.1c-0.06,0 0,0.1 0,0.09A45.65,45.65 0,0 1,100 301c0.48,0.63 0.93,1.28 1.4,1.92a24.56,24.56 0,0 0,-6.76 0.78,0.07 0.07,0 0,0 0,0.13 26.09,26.09 0,0 1,7 -0.54c2,2.77 3.94,5.61 5.79,8.47a6.36,6.36 0,0 0,-3 0.18,0 0,0 0,0 0,0.08 13.26,13.26 0,0 1,3.21 0.16q2.5,3.88 4.82,7.85C112.7,320.29 113.06,320.12 112.93,319.89Z" + android:fillColor="#fff"/> + <path + android:pathData="M98.38,305.32a14.35,14.35 0,0 0,-5.44 0.67s0,0.09 0,0.08a40.82,40.82 0,0 1,5.41 -0.56C98.48,305.51 98.51,305.33 98.38,305.32Z" + android:fillColor="#fff"/> + <path + android:pathData="M82.06,283.92a9.19,9.19 0,0 0,-2.51 0.14c-0.09,0 -0.06,0.16 0,0.15 0.83,-0.09 1.64,-0.06 2.46,-0.08A0.11,0.11 0,0 0,82.06 283.92Z" + android:fillColor="#fff"/> + <path + android:pathData="M138.04,382.18l-42.23,0l6.02,-44.11l1.54,-11.31l27.11,0l1.54,11.31l6.02,44.11z" + android:fillColor="#dbdbdb"/> + <path + android:pathData="M132.02,338.07l-30.19,0l1.54,-11.31l27.11,0l1.54,11.31z" + android:fillColor="#c7c7c7"/> + <path + android:pathData="M99.49,322.84h34.86v9.58h-34.86z" + android:fillColor="#dbdbdb"/> + <path + android:pathData="M68.96,382.18l76.01,-0.24l76.01,-0.09l152.02,-0.17l152.02,0.17l76.01,0.09l76.01,0.24l-76.01,0.25l-76.01,0.08l-152.02,0.17l-152.02,-0.17l-76.01,-0.09l-76.01,-0.24z" + android:fillColor="#263238"/> + <path + android:pathData="M88.26,425.29a286.74,31.42 0,1 0,573.48 0a286.74,31.42 0,1 0,-573.48 0z" + android:fillColor="#ebebeb"/> + <path + android:pathData="M308.25,420.09c-2.33,0.79 -69.14,1 -71.7,-0.58 -1,-0.6 -1.57,-10.33 -2,-22.11 -0.09,-2.54 -0.16,-5.17 -0.22,-7.83L229,353.93l44.67,-0.29 4.21,35.65 -0.17,7.84s25.62,11.35 28.24,13.41S310.58,419.3 308.25,420.09Z" + android:fillColor="#eb9481"/> + <path + android:pathData="M308.25,420.09c-2.33,0.79 -69.14,1 -71.7,-0.58 -1.18,-0.74 -1.82,-14.95 -2.18,-29.94l43.46,-0.28 -0.17,7.84s25.62,11.35 28.24,13.41S310.58,419.3 308.25,420.09Z" + android:fillColor="#fff"/> + <path + android:pathData="M308.25,420.09c-2.33,0.79 -69.14,1 -71.7,-0.58 -1,-0.6 -1.57,-10.33 -2,-22.11l43.07,-0.27s25.62,11.35 28.24,13.41S310.58,419.3 308.25,420.09Z" + android:fillColor="#a6a6a6"/> + <path + android:pathData="M307.28,417.42c-11.2,-0.24 -56.4,-0.13 -67.49,0.49 -0.09,0 -0.09,0.06 0,0.07 11.1,0.47 56.3,0 67.49,-0.38C307.52,417.59 307.52,417.42 307.28,417.42Z" + android:fillColor="#263238"/> + <path + android:pathData="M301.59,408.15a9,9 0,0 0,-6.69 2.76,8.66 8.66,0 0,0 -2.48,6c0,0.07 0.12,0.07 0.13,0a10.4,10.4 0,0 1,9 -8.6A0.07,0.07 0,0 0,301.59 408.15Z" + android:fillColor="#263238"/> + <path + android:pathData="M282,398.23c-4.48,-0.05 -9.67,1.55 -12.45,5.23 -0.1,0.14 0.1,0.29 0.23,0.22a62.24,62.24 0,0 1,12.3 -4.9A0.28,0.28 0,0 0,282 398.23Z" + android:fillColor="#263238"/> + <path + android:pathData="M285.48,399.56c-4.49,0 -9.68,1.56 -12.45,5.23 -0.11,0.15 0.09,0.3 0.23,0.23a61.59,61.59 0,0 1,12.29 -4.91A0.28,0.28 0,0 0,285.48 399.56Z" + android:fillColor="#263238"/> + <path + android:pathData="M288.94,400.9c-4.48,0 -9.67,1.55 -12.45,5.23 -0.1,0.14 0.1,0.29 0.23,0.22a62.24,62.24 0,0 1,12.3 -4.9A0.28,0.28 0,0 0,288.94 400.9Z" + android:fillColor="#263238"/> + <path + android:pathData="M292.41,402.24c-4.49,-0.05 -9.68,1.55 -12.45,5.23 -0.11,0.14 0.1,0.29 0.23,0.22a62,62 0,0 1,12.3 -4.9A0.28,0.28 0,0 0,292.41 402.24Z" + android:fillColor="#263238"/> + <path + android:pathData="M242.61,407.26c-5,0 -5,7.85 0,7.82S247.65,407.23 242.61,407.26Z" + android:fillColor="#263238"/> + <path + android:pathData="M286.81,386.25c-2.27,-1.88 -5.13,0 -6.52,1.93a23.58,23.58 0,0 0,-4 11.48c0,0.09 0.07,0.13 0.14,0.13a0.54,0.54 0,0 0,0.81 0.35c3.18,-2.21 6.86,-4.19 9.27,-7.32C287.88,391 289,388 286.81,386.25ZM281.35,395.79c-1.54,1.13 -3.13,2.18 -4.63,3.37 0.8,-2.24 1.49,-4.5 2.51,-6.66a25.05,25.05 0,0 1,1.62 -3c1,-1.49 5.36,-5.25 5.82,-0.38C286.93,391.79 283.18,394.45 281.35,395.79Z" + android:fillColor="#263238"/> + <path + android:pathData="M265.13,401.36c3.9,0.58 7.93,-0.54 11.76,-1.15a0.55,0.55 0,0 0,0.33 -0.82,0.12 0.12,0 0,0 0,-0.19 23.5,23.5 0,0 0,-10.86 -5.47c-2.36,-0.45 -5.7,0.2 -6,3.13C260,399.62 262.85,401 265.13,401.36ZM262.41,398.82c-3,-3.84 2.73,-4.17 4.45,-3.77a25.58,25.58 0,0 1,3.28 1.06,69.56 69.56,0 0,1 6.41,3.05c-1.9,0.19 -3.77,0.53 -5.66,0.79C268.63,400.25 264.09,400.93 262.41,398.82Z" + android:fillColor="#263238"/> + <path + android:pathData="M163.32,189.2s51.87,88.24 53.26,94.44C218.71,293.16 230,387.17 230,387.17l54,-1s-9.3,-82.89 -18.11,-110.2c-6.34,-19.67 -52.12,-84.91 -52.12,-84.91Z" + android:fillColor="#37474f"/> + <path + android:pathData="M279.09,377.93c-7.75,-0.06 -35.22,-0.37 -45.54,0.59 -0.08,0 -0.07,0.14 0,0.15 3.55,0.51 37.78,-0.28 45.53,-0.53A0.11,0.11 0,1 0,279.09 377.93Z" + android:fillColor="#263238"/> + <path + android:pathData="M172.17,197.3c3.4,5.33 7,10.55 10.46,15.84S189.57,223.72 193,229q10.26,16 20,32.21A98.63,98.63 0,0 1,221.1 277a96.75,96.75 0,0 1,4.55 16.94c1.06,5.79 1.76,11.64 2.41,17.49q1,9.33 2.09,18.67 2.13,19.11 4.27,38.22c0.17,1.56 0.34,3.12 0.5,4.69 0,0.23 -0.39,0.27 -0.42,0 -1.59,-12.65 -2.91,-25.35 -4.35,-38q-1.08,-9.47 -2.15,-18.93c-0.67,-5.87 -1.31,-11.75 -2.22,-17.58a115,115 0,0 0,-3.8 -17A81.65,81.65 0,0 0,214.52 265c-6.25,-10.79 -12.87,-21.39 -19.49,-32s-13.42,-21.31 -20.4,-31.79c-0.86,-1.29 -1.73,-2.58 -2.63,-3.85C171.93,197.29 172.11,197.2 172.17,197.3Z" + android:fillColor="#263238"/> + <path + android:pathData="M180.32,425.29c-2.46,-0.15 -66,-25.89 -67.76,-28.33a0.84,0.84 0,0 1,-0.1 -0.47c0,-2.19 4.41,-9.83 8.09,-19.87 0.23,-0.64 1.87,-3.62 4.14,-7.63C131,358 142,339.07 142,339.07l41.53,16.5 -19.88,29.75 -3.09,7.2s19.49,20.15 21.13,23S182.77,425.43 180.32,425.29Z" + android:fillColor="#eb9481"/> + <path + android:pathData="M180.32,425.29c-2.46,-0.15 -66,-25.89 -67.76,-28.33a0.84,0.84 0,0 1,-0.1 -0.47c0,-2.19 4.41,-9.83 8.09,-19.87 0.23,-0.64 1.87,-3.62 4.14,-7.63l39,16.33 -3.09,7.2s19.49,20.15 21.13,23S182.77,425.43 180.32,425.29Z" + android:fillColor="#fff"/> + <path + android:pathData="M180.32,425.29c-2.46,-0.15 -66,-25.89 -67.76,-28.33 -0.68,-0.93 2.16,-9.6 8,-20.34l40,15.91s19.49,20.13 21.14,23S182.77,425.43 180.32,425.29Z" + android:fillColor="#a6a6a6"/> + <path + android:pathData="M180.42,422.45c-10.29,-4.42 -52.23,-21.28 -62.74,-24.86 -0.09,0 -0.11,0 0,0.06 10.11,4.6 52.18,21.12 62.7,25C180.58,422.7 180.64,422.54 180.42,422.45Z" + android:fillColor="#263238"/> + <path + android:pathData="M178.62,411.72a9,9 0,0 0,-7.24 0,8.7 8.7,0 0,0 -4.54,4.62c0,0.06 0.09,0.11 0.12,0.05a10.41,10.41 0,0 1,11.61 -4.59A0.07,0.07 0,0 0,178.62 411.72Z" + android:fillColor="#263238"/> + <path + android:pathData="M164.19,395.18c-4.13,-1.73 -9.55,-2.19 -13.5,0.18 -0.15,0.09 0,0.3 0.13,0.29a62.34,62.34 0,0 1,13.24 0.07A0.28,0.28 0,0 0,164.19 395.18Z" + android:fillColor="#263238"/> + <path + android:pathData="M166.9,397.72c-4.13,-1.73 -9.55,-2.19 -13.5,0.18 -0.15,0.09 0,0.3 0.13,0.29a61.69,61.69 0,0 1,13.24 0.07A0.28,0.28 0,0 0,166.9 397.72Z" + android:fillColor="#263238"/> + <path + android:pathData="M169.62,400.26c-4.14,-1.73 -9.56,-2.19 -13.5,0.18 -0.16,0.09 0,0.3 0.12,0.29a61.69,61.69 0,0 1,13.24 0.07A0.28,0.28 0,0 0,169.62 400.26Z" + android:fillColor="#263238"/> + <path + android:pathData="M172.33,402.8c-4.14,-1.73 -9.55,-2.19 -13.5,0.17 -0.16,0.1 0,0.31 0.12,0.3a61.69,61.69 0,0 1,13.24 0.07A0.28,0.28 0,0 0,172.33 402.8Z" + android:fillColor="#263238"/> + <path + android:pathData="M124.28,388.77c-4.67,-1.86 -7.57,5.41 -2.88,7.27S129,390.63 124.28,388.77Z" + android:fillColor="#263238"/> + <path + android:pathData="M173.14,385.88c-1.41,-2.59 -4.74,-1.95 -6.77,-0.66a23.52,23.52 0,0 0,-8 9.13,0.12 0.12,0 0,0 0.08,0.17c0,0.33 0.22,0.72 0.61,0.64 3.79,-0.87 7.94,-1.32 11.34,-3.32C172.35,390.68 174.47,388.33 173.14,385.88ZM164.49,392.67c-1.85,0.47 -3.71,0.85 -5.54,1.39a69.94,69.94 0,0 1,4.81 -5.23,25.34 25.34,0 0,1 2.65,-2.2c1.45,-1 6.93,-2.85 5.53,1.84C171.17,391.06 166.7,392.11 164.49,392.67Z" + android:fillColor="#263238"/> + <path + android:pathData="M147.37,391.75c3.4,2 7.55,2.47 11.33,3.35 0.39,0.09 0.65,-0.3 0.62,-0.64a0.11,0.11 0,0 0,0.08 -0.17,23.52 23.52,0 0,0 -8,-9.15c-2,-1.3 -5.35,-1.95 -6.77,0.63S145.38,390.58 147.37,391.75ZM145.81,388.37c-1.39,-4.69 4.08,-2.83 5.53,-1.82a24.33,24.33 0,0 1,2.64 2.21,70 70,0 0,1 4.8,5.24c-1.83,-0.54 -3.69,-0.93 -5.54,-1.4C151,392 146.57,391 145.81,388.37Z" + android:fillColor="#263238"/> + <path + android:pathData="M166.88,383.66l-46.49,-18.77s57.64,-84.75 58.06,-91.06c0.38,-5.58 -24.94,-54.2 -25.93,-68.37 -1.08,-15.3 6.28,-27.13 14.38,-34.48l47.95,20.39s-5.06,8.09 -13,12.6c0,0 24.59,56.2 23.19,73.48S166.88,383.66 166.88,383.66Z" + android:fillColor="#37474f"/> + <path + android:pathData="M168.94,374.82c-6.72,-2.89 -4.75,-2.16 -11.51,-5 -3.3,-1.38 -25,-10.41 -28.34,-11.16 -0.07,0 -0.12,0.1 -0.05,0.14 2.89,1.77 24.77,10.42 28.1,11.74 6.81,2.68 4.88,1.84 11.72,4.44A0.1,0.1 0,1 0,168.94 374.82Z" + android:fillColor="#263238"/> + <path + android:pathData="M209.71,202.94a90.5,90.5 0,0 0,-14.6 4.74,0.15 0.15,0 1,0 0.1,0.29c4.9,-1.43 9.88,-2.77 14.7,-4.46C210.28,203.38 210.09,202.86 209.71,202.94Z" + android:fillColor="#263238"/> + <path + android:pathData="M204,201a21.65,21.65 0,0 0,-1.23 2.57,5.91 5.91,0 0,0 -0.63,2.15c0,0.15 0.2,0.18 0.29,0.09a7.51,7.51 0,0 0,1.2 -2c0.41,-0.79 0.83,-1.57 1.22,-2.38C205.12,200.84 204.31,200.46 204,201Z" + android:fillColor="#263238"/> + <path + android:pathData="M204.6,196.46c0.3,-0.74 0.59,-1.47 0.9,-2.21s0.7,-1.5 1,-2.28c0,-0.12 0.24,0 0.19,0.09 -0.3,0.74 -0.49,1.52 -0.72,2.28s-0.49,1.52 -0.74,2.28c-0.47,1.41 -1,2.81 -1.65,4.18a5.3,5.3 0,0 0,2.3 -0.4,4.13 4.13,0 0,0 1.63,-2c0.42,-0.82 0.81,-1.66 1.24,-2.48a16.57,16.57 0,0 0,1.33 -2.79c0,-0.12 0.24,0 0.19,0.09a32.45,32.45 0,0 1,-2.55 5.91c-0.45,0.73 -0.8,1.5 -1.62,1.78a6.78,6.78 0,0 1,-2.73 0.19c-0.12,0 -0.26,0 -0.22,-0.18A47.4,47.4 0,0 1,204.6 196.46Z" + android:fillColor="#263238"/> + <path + android:pathData="M202.56,205.8c1.71,3.61 3.21,7.21 4.8,10.81s3,7.08 4.43,10.66c2.86,7.22 5.42,14.58 7.67,22 1.11,3.68 2.14,7.39 3.06,11.13a80,80 0,0 1,2.22 11.36,30 30,0 0,1 -1,11.4 66.68,66.68 0,0 1,-4.23 10.63c-1.05,2.16 -1.4,1.87 -0.9,0.78 1.43,-3.1 5.18,-12.49 4.91,-20.38A58.82,58.82 0,0 0,221.78 263q-1.31,-5.67 -2.95,-11.25c-2.13,-7.34 -4.66,-14.53 -7.26,-21.71 -1.46,-4 -3,-8 -4.5,-12s-3,-7.68 -4.68,-12.1C202.34,205.76 202.51,205.69 202.56,205.8Z" + android:fillColor="#263238"/> + <path + android:pathData="M167.27,193.87c0.83,-0.31 2,0.2 2.84,0.34a24.28,24.28 0,0 0,3.29 0.33,23.78 23.78,0 0,0 3.27,-0.11 7,7 0,0 0,3.13 -0.83,15.93 15.93,0 0,0 4,-4.23 24.61,24.61 0,0 0,3.11 -5.46c0,-0.12 0.21,0 0.17,0.08 -0.35,1.11 -0.61,2.23 -1,3.32a20.15,20.15 0,0 1,-1.54 2.95,12.61 12.61,0 0,1 -4.14,4.7c-1.93,1.1 -4.41,1 -6.56,0.91a25.63,25.63 0,0 1,-3.71 -0.49c-0.88,-0.19 -2.36,-0.33 -2.92,-1.1A0.27,0.27 0,0 1,167.27 193.87Z" + android:fillColor="#263238"/> + <path + android:pathData="M133.66,356q11.46,-17.36 22.5,-35t21.78,-35.55c1.71,-2.85 3.68,-5.69 4.78,-8.85 1.2,-3.43 0.52,-6.76 -0.56,-10.12a171.63,171.63 0,0 0,-7.14 -18c-2.68,-5.91 -5.57,-11.72 -8.41,-17.55s-5.81,-11.59 -8,-17.67c-2,-5.81 -2.81,-11.83 -1.25,-17.85s4.92,-11.34 8.43,-16.35c0.92,-1.32 1.87,-2.63 2.8,-4 0.07,-0.1 0.22,0 0.15,0.12 -3.87,5.22 -7.64,10.75 -9.91,16.88a29.15,29.15 0,0 0,-1.92 9.45,30.59 30.59,0 0,0 1.51,9.67c1.88,6.08 4.85,11.83 7.62,17.55s5.73,11.64 8.46,17.53A187.64,187.64 0,0 1,182 264.45c0.93,2.75 2,5.63 1.92,8.58 -0.07,3.23 -1.61,6.14 -3.21,8.86 -7,11.85 -14.17,23.56 -21.47,35.2s-14.81,23.28 -22.41,34.8l-2.88,4.35C133.8,356.42 133.54,356.21 133.66,356Z" + android:fillColor="#263238"/> + <path + android:pathData="M217.51,137.47c4.33,9.5 26.2,22.59 36.44,24 7.36,1 29.74,1.36 37.41,0.19 9,-1.38 2.12,-25.63 -3.19,-25 -14.6,1.7 -27,3.6 -30.9,3.6 -4.76,0 -30.51,-8.26 -33.61,-9.43C216.06,128 215.06,132.08 217.51,137.47Z" + android:fillColor="#eb9481"/> + <path + android:pathData="M217.65,140c5.48,8.11 23.69,21.37 23.69,21.37l2.53,-5.6 8.37,-18.52S235.51,132 224.5,129.6a24.12,24.12 0,0 0,-3.94 -0.56C213.53,128.66 212.92,133 217.65,140Z" + android:fillColor="#8AB0FF"/> + <path + android:pathData="M217.65,140c5.48,8.11 23.69,21.37 23.69,21.37l2.53,-5.6c-6.79,-7.89 -17.28,-19.84 -23.31,-26.71C213.53,128.66 212.92,133 217.65,140Z" + android:fillColor="#263238"/> + <path + android:pathData="M238.06,157.61c1.39,-3.41 7.57,-17.14 9.11,-20 0.1,-0.2 0.26,-0.18 0.17,0a201.71,201.71 0,0 1,-9.14 20C238.16,157.73 238,157.69 238.06,157.61Z" + android:fillColor="#263238"/> + <path + android:pathData="M285.49,136.91c8.88,-1.16 19.87,-3.15 29.18,0.8a5,5 0,0 1,2.49 2.13c4.2,1.7 4.66,4.19 4.66,4.19 3.43,2.78 3.55,5.4 3.55,5.4s4.92,2 4.17,5.22c-0.82,3.56 -7.56,0 -12.46,0.29 -11.25,0.7 -27,4.83 -30.25,5.35Z" + android:fillColor="#eb9481"/> + <path + android:pathData="M304.78,147.39a72.4,72.4 0,0 1,9.88 0,71.88 71.88,0 0,1 10.6,2.15 0.09,0.09 0,0 0,0.06 -0.17,38.29 38.29,0 0,0 -20.54,-2.08C304.62,147.27 304.62,147.4 304.78,147.39Z" + android:fillColor="#263238"/> + <path + android:pathData="M303.38,140.67c3.23,0 8.91,0.16 18.41,3.47a0,0 0,0 0,0 -0.06,34.41 34.41,0 0,0 -18.43,-3.57C303.18,140.53 303.16,140.66 303.38,140.67Z" + android:fillColor="#263238"/> + <path + android:pathData="M302.69,137c5.49,0.28 8.92,1.16 14.44,2.82a0,0 0,0 0,0 -0.06c-6.08,-2.54 -8.57,-2.78 -14.47,-3C302.47,136.84 302.48,137 302.69,137Z" + android:fillColor="#263238"/> + <path + android:pathData="M303.58,156.64c-1.43,0.67 -1.08,1.42 1.65,2.05s14.08,0.82 13.68,4.78 -16.41,3.46 -20.88,2.06 -11.2,-5.24 -11.2,-5.24C290,159.76 297.44,157.75 303.58,156.64Z" + android:fillColor="#eb9481"/> + <path + android:pathData="M229.4,152.61c-0.07,1.71 -0.23,3.45 -0.47,5.18 0,-0.07 0,-0.13 0.07,-0.19 0.33,-0.9 0.66,-1.82 1.06,-2.69 0,0 0.1,0 0.09,0a14.42,14.42 0,0 1,-0.86 2.78c-0.18,0.43 -0.35,0.85 -0.54,1.27 -0.12,0.77 -0.26,1.53 -0.41,2.29 -0.3,1.43 -1.65,7.51 -2,8.54 -0.06,0.21 -0.32,0.16 -0.3,-0.08 0.07,-1.12 1.2,-7.45 1.43,-8.89a77.71,77.71 0,0 1,1.79 -8.25C229.31,152.52 229.41,152.56 229.4,152.61Z" + android:fillColor="#263238"/> + <path + android:pathData="M219,198.08c-2.67,1.37 -6.11,3.5 -21.61,0.45 -1,-0.2 -1.94,-0.44 -2.92,-0.73 -14.53,-4.36 -32,-21.45 -32.95,-22.66 0,0 23.09,-37.43 52.62,-49.2 3.65,-1.45 9.69,1.35 13,4.84 1.19,1.25 3.78,10.44 2.79,17.88S221.66,196.71 219,198.08Z" + android:fillColor="#8AB0FF"/> + <path + android:pathData="M216.92,148.32a11.34,11.34 0,0 1,-0.65 4.66,10.85 10.85,0 0,1 0.65,-4.66Z" + android:fillColor="#fff"/> + <path + android:pathData="M206.85,173.81a10.33,10.33 0,0 1,-0.08 2.36,9.8 9.8,0 0,1 -0.57,2.3 9.85,9.85 0,0 1,0.08 -2.37A10.37,10.37 0,0 1,206.85 173.81Z" + android:fillColor="#fff"/> + <path + android:pathData="M189.74,154.54a11.35,11.35 0,0 1,-0.65 4.67,10.93 10.93,0 0,1 0.65,-4.67Z" + android:fillColor="#fff"/> + <path + android:pathData="M223.51,172.51a10.39,10.39 0,0 1,-0.08 2.37,9.8 9.8,0 0,1 -0.57,2.3 9.85,9.85 0,0 1,0.08 -2.37A10.32,10.32 0,0 1,223.51 172.51Z" + android:fillColor="#fff"/> + <path + android:pathData="M201.54,151.24a10.33,10.33 0,0 1,2.36 0.07,9.83 9.83,0 0,1 2.3,0.58 11.27,11.27 0,0 1,-4.66 -0.65Z" + android:fillColor="#fff"/> + <path + android:pathData="M182.12,169.65a11.34,11.34 0,0 1,4.66 0.65,10.85 10.85,0 0,1 -4.66,-0.65Z" + android:fillColor="#fff"/> + <path + android:pathData="M205,189.58a11.27,11.27 0,0 1,4.66 0.65,10.91 10.91,0 0,1 -4.66,-0.65Z" + android:fillColor="#fff"/> + <path + android:pathData="M176.13,182.34a11.34,11.34 0,0 1,4.66 0.65,10.91 10.91,0 0,1 -4.66,-0.65Z" + android:fillColor="#fff"/> + <path + android:pathData="M216.77,130.4a11.34,11.34 0,0 1,4.66 0.65,11.34 11.34,0 0,1 -4.66,-0.65Z" + android:fillColor="#fff"/> + <path + android:pathData="M211.12,136.78a9.75,9.75 0,0 1,-1.72 1.62,10.62 10.62,0 0,1 -2,1.22A10.17,10.17 0,0 1,209.1 138,10.54 10.54,0 0,1 211.12,136.78Z" + android:fillColor="#fff"/> + <path + android:pathData="M180.33,154.91a10.11,10.11 0,0 1,-1.73 1.61,9.43 9.43,0 0,1 -2,1.22 10.53,10.53 0,0 1,1.73 -1.61A9.68,9.68 0,0 1,180.33 154.91Z" + android:fillColor="#fff"/> + <path + android:pathData="M218.78,163.09a10.17,10.17 0,0 1,-1.73 1.62,9.68 9.68,0 0,1 -2,1.22 10.17,10.17 0,0 1,1.73 -1.62A10.32,10.32 0,0 1,218.78 163.09Z" + android:fillColor="#fff"/> + <path + android:pathData="M193.88,178.77a10.17,10.17 0,0 1,-1.73 1.62,9.86 9.86,0 0,1 -2,1.22 10.17,10.17 0,0 1,1.73 -1.62A10.32,10.32 0,0 1,193.88 178.77Z" + android:fillColor="#fff"/> + <path + android:pathData="M228.32,141.67a10.17,10.17 0,0 1,-1.73 1.62,10.62 10.62,0 0,1 -2,1.22 10.17,10.17 0,0 1,1.73 -1.62A9.86,9.86 0,0 1,228.32 141.67Z" + android:fillColor="#fff"/> + <path + android:pathData="M227.8,159.84a10.17,10.17 0,0 1,-1.62 -1.73,9.61 9.61,0 0,1 -1.22,-2 9.75,9.75 0,0 1,1.62 1.72A10.93,10.93 0,0 1,227.8 159.84Z" + android:fillColor="#fff"/> + <path + android:pathData="M172.3,172.36a10.17,10.17 0,0 1,-1.62 -1.73,10.32 10.32,0 0,1 -1.22,-2 10.17,10.17 0,0 1,1.62 1.73A9.86,9.86 0,0 1,172.3 172.36Z" + android:fillColor="#fff"/> + <path + android:pathData="M221.05,187.25a9.75,9.75 0,0 1,-1.62 -1.72,10.62 10.62,0 0,1 -1.22,-2 10.17,10.17 0,0 1,1.62 1.73A10.05,10.05 0,0 1,221.05 187.25Z" + android:fillColor="#fff"/> + <path + android:pathData="M196.62,144.8a10.11,10.11 0,0 1,-1.62 -1.72,10.93 10.93,0 0,1 -1.22,-2 9.75,9.75 0,0 1,1.62 1.72A10.93,10.93 0,0 1,196.62 144.8Z" + android:fillColor="#fff"/> + <path + android:pathData="M197.05,195.73a10.17,10.17 0,0 1,-1.62 -1.73,10.54 10.54,0 0,1 -1.22,-2 9.75,9.75 0,0 1,1.62 1.72A10.42,10.42 0,0 1,197.05 195.73Z" + android:fillColor="#fff"/> + <path + android:pathData="M201.2,165.69a10.53,10.53 0,0 1,-1.61 -1.73,9.43 9.43,0 0,1 -1.22,-2 10.11,10.11 0,0 1,1.61 1.73A9.68,9.68 0,0 1,201.2 165.69Z" + android:fillColor="#fff"/> + <path + android:pathData="M221.73,140.75c-3.77,-0.7 -7.31,-8.49 -7.76,-13.73 0,-0.36 1.76,-3.21 3.77,-6.78 1.22,-2.17 2.51,-4.62 3.54,-6.94 0.21,-0.47 1.44,1.12 1.44,1.12l2.68,2 8.85,6.79a40.34,40.34 0,0 0,-5.33 8.27,5 5,0 0,0 -0.32,1 1.22,1.22 0,0 0,0 0.17C228.05,134.63 225.36,141.42 221.73,140.75Z" + android:fillColor="#eb9481"/> + <path + android:pathData="M228.6,132.53a1.22,1.22 0,0 0,0 0.17,9.91 9.91,0 0,1 -1.53,-0.59c-9.69,-4.54 -5.42,-17.52 -5.42,-17.52l3.8,1.88 8.85,6.79a40.34,40.34 0,0 0,-5.33 8.27A5,5 0,0 0,228.6 132.53Z" + android:fillColor="#263238"/> + <path + android:pathData="M244.42,95.58s4.43,2.81 4.45,7.81 -2,9.89 -2.42,10.07S244.42,95.58 244.42,95.58Z" + android:fillColor="#263238"/> + <path + android:pathData="M222.44,98.18c-2.66,5.25 -2.52,21.8 0.8,26.06 4.82,6.18 14.1,8.31 19.71,2.2 5.43,-5.92 4.87,-27.48 1,-31.5C238.32,89 226.38,90.41 222.44,98.18Z" + android:fillColor="#eb9481"/> + <path + android:pathData="M222.87,124h0" + android:strokeLineJoin="round" + android:strokeWidth="0" + android:fillColor="#00000000" + android:strokeColor="#f5a79e" + android:strokeLineCap="round"/> + <path + android:pathData="M236.56,111.43s-0.09,0.06 -0.08,0.1c0.06,1.13 -0.06,2.43 -1.07,2.83 0,0 0,0.07 0,0.06C236.66,114.22 236.8,112.49 236.56,111.43Z" + android:fillColor="#263238"/> + <path + android:pathData="M235.53,110.28c-1.82,-0.1 -1.88,3.54 -0.19,3.63S237.05,110.36 235.53,110.28Z" + android:fillColor="#263238"/> + <path + android:pathData="M242.73,111.39s0.09,0 0.09,0.1c-0.06,1.13 0.07,2.43 1.09,2.82 0,0 0,0.07 0,0.06C242.65,114.18 242.5,112.45 242.73,111.39Z" + android:fillColor="#263238"/> + <path + android:pathData="M243.76,110.23c1.81,-0.11 1.9,3.53 0.22,3.63S242.24,110.32 243.76,110.23Z" + android:fillColor="#263238"/> + <path + android:pathData="M234.39,107.51a14.64,14.64 0,0 0,1.41 -0.48,2.4 2.4,0 0,0 1.36,-0.76 0.77,0.77 0,0 0,-0.11 -0.93,1.91 1.91,0 0,0 -1.92,-0.23 2.83,2.83 0,0 0,-1.64 1.19A0.83,0.83 0,0 0,234.39 107.51Z" + android:fillColor="#263238"/> + <path + android:pathData="M245,109.12a14.65,14.65 0,0 1,-1.44 -0.4,2.4 2.4,0 0,1 -1.39,-0.69 0.75,0.75 0,0 1,0.06 -0.93,1.89 1.89,0 0,1 1.9,-0.33 2.8,2.8 0,0 1,1.7 1.1A0.82,0.82 0,0 1,245 109.12Z" + android:fillColor="#263238"/> + <path + android:pathData="M234,122.12c0.27,0.27 0.53,0.63 0.94,0.67a3,3 0,0 0,1.22 -0.26s0.07,0 0,0.06a1.51,1.51 0,0 1,-1.44 0.59,1.21 1.21,0 0,1 -0.88,-1A0.06,0.06 0,0 1,234 122.12Z" + android:fillColor="#263238"/> + <path + android:pathData="M240.54,117.3s0.05,1.68 0,2.47a16.48,16.48 0,0 0,-4.61 0.16c-0.36,0.08 -0.32,-0.21 0.09,-0.4a6.76,6.76 0,0 1,3.92 -0.52c0.08,-0.21 -0.13,-2.6 0,-2.59a6.68,6.68 0,0 1,1.74 0.6c0,-3.52 -0.56,-7 -0.51,-10.52 0,-0.12 0.19,-0.14 0.21,0a56.64,56.64 0,0 1,1 11.3C242.39,118.23 240.84,117.46 240.54,117.3Z" + android:fillColor="#263238"/> + <path + android:pathData="M238.29,119.17a5,5 0,0 1,-2.1 2.51c-1.51,0.61 -2,-0.76 -0.48,-2A4.88,4.88 0,0 1,238.29 119.17Z" + android:fillColor="#263238"/> + <path + android:pathData="M236.72,121.37a2,2 0,0 1,-0.53 0.31c-1.39,0.56 -1.94,-0.55 -0.82,-1.67C236.13,120.07 237,120.35 236.72,121.37Z" + android:fillColor="#ff99ba"/> + <path + android:pathData="M221.68,112.33c1.83,0.56 3.93,-4.94 4.53,-7 0.52,-1.86 1.12,-7.77 1.21,-8.18s8,5.23 12.58,3.89 7.69,-5.49 7.76,-7.42 -5.66,-6.83 -10.61,-7.08 -11.66,6 -11.66,6a23,23 0,0 0,2.2 -2.94c-0.08,-0.22 -3.28,1.06 -3.87,3.34 0,0 0.64,-2.87 0.4,-2.92s-2.73,2.4 -2.17,4.26c0,0 -2.88,2.49 -3.14,5.22S219.53,111.67 221.68,112.33Z" + android:fillColor="#263238"/> + <path + android:pathData="M243.28,100a15.21,15.21 0,0 1,-4.35 1.56,10.33 10.33,0 0,1 -5,-0.8 15.36,15.36 0,0 1,-4.36 -2.58c-1.15,-0.94 -2.18,-2.09 -3.41,-2.93 -0.31,-0.22 -0.66,0.23 -0.47,0.51a16.52,16.52 0,0 0,8.36 6.16,9.53 9.53,0 0,0 9.22,-1.88S243.3,100 243.28,100Z" + android:fillColor="#263238"/> + <path + android:pathData="M223.59,111.84s-2.84,-5.76 -5.4,-4.83 -1,8.9 1.63,10.36a2.85,2.85 0,0 0,4 -0.94Z" + android:fillColor="#eb9481"/> + <path + android:pathData="M218.7,109.28s-0.06,0 0,0.08c1.82,1.08 2.56,3 3,5a1.57,1.57 0,0 0,-2.26 -0.78c-0.06,0 0,0.11 0,0.11a1.75,1.75 0,0 1,1.81 0.9,8.45 8.45,0 0,1 0.68,1.68c0.06,0.19 0.39,0.14 0.36,-0.07v0C222.72,113.71 221.32,109.94 218.7,109.28Z" + android:fillColor="#263238"/> + <path + android:pathData="M204.84,137.56c-2,11.33 10.28,49.5 18.15,56.63 11.71,10.6 33.36,17.57 41.21,19.84 3.42,1 12.88,-23.07 9.42,-24.66C266.21,186 243.19,178.8 241,177s-15.39,-20.87 -21.27,-31.85C211.86,130.37 205.83,131.83 204.84,137.56Z" + android:fillColor="#eb9481"/> + <path + android:pathData="M267.79,187.25s10.22,2.61 16.81,4.62c3.68,1.13 9.82,3.62 12.15,5.68 3.48,3.09 16.06,18.21 12.46,21.34 -3.26,2.84 -12.42,-11.53 -12.42,-11.53s10.52,13.68 6,16.37S290,208.81 290,208.81s10.49,14.3 5.36,16.33c-3.88,1.53 -12.2,-14 -12.2,-14s8.94,12.35 5,14.1c-4.34,1.94 -12.91,-11.92 -12.91,-11.92 -10.72,2.77 -17,-0.3 -21.13,-3C253.15,209.66 267.79,187.25 267.79,187.25Z" + android:fillColor="#eb9481"/> + <path + android:pathData="M293.45,202.39c1.3,1.56 2.62,3.14 3.77,4.81s2.24,3.39 3.23,5.16a34.62,34.62 0,0 1,3.2 7.26c-1.72,-4.4 -5.75,-10.45 -6.9,-12.12s-2.22,-3.4 -3.36,-5.07C293.36,202.39 293.42,202.35 293.45,202.39Z" + android:fillColor="#263238"/> + <path + android:pathData="M287.34,206.44c2.22,1.76 6.87,8.3 8.66,12.69 0.08,0.18 0,0.17 -0.13,0 -1.4,-2.17 -7.08,-10.57 -8.58,-12.66C287.26,206.44 287.31,206.41 287.34,206.44Z" + android:fillColor="#263238"/> + <path + android:pathData="M281.47,209a31.33,31.33 0,0 1,6.42 10c0.07,0.18 -0.07,0.15 -0.18,0 -2.07,-3.37 -3.67,-6 -6.35,-9.91C281.32,209 281.41,208.91 281.47,209Z" + android:fillColor="#263238"/> + <path + android:pathData="M216,138.39c-9.13,-12.91 -14.59,-8.13 -12.76,5.89 1.72,13.11 6.31,28.73 6.31,28.73l23,-11.16S221.81,146.66 216,138.39Z" + android:fillColor="#8AB0FF"/> + <path + android:pathData="M221.55,143.47a10.28,10.28 0,0 1,0.65 2.27,10.39 10.39,0 0,1 0.15,2.37 10.34,10.34 0,0 1,-0.64 -2.28A9.77,9.77 0,0 1,221.55 143.47Z" + android:fillColor="#fff"/> + <path + android:pathData="M207.92,151.32a11,11 0,0 1,4.63 -0.8,10.26 10.26,0 0,1 -2.27,0.64A9.8,9.8 0,0 1,207.92 151.32Z" + android:fillColor="#fff"/> + <path + android:pathData="M208.51,131.24a11.16,11.16 0,0 1,-2.71 3.85,11.16 11.16,0 0,1 2.71,-3.85Z" + android:fillColor="#fff"/> + <path + android:pathData="M228,157.35a10.44,10.44 0,0 1,-1.15 2.07,10.11 10.11,0 0,1 -1.56,1.78 11.16,11.16 0,0 1,2.71 -3.85Z" + android:fillColor="#fff"/> + <path + android:pathData="M212,165.18a10,10 0,0 1,-2.07 -1.15,10.06 10.06,0 0,1 -1.78,-1.56 11.16,11.16 0,0 1,3.85 2.71Z" + android:fillColor="#fff"/> + <path + android:pathData="M219,142.28c1.23,1.69 2.5,3.34 3.76,5q-0.48,-1.26 -0.84,-2.55a0,0 0,1 1,0.06 0c0.25,0.66 0.54,1.31 0.78,2l0.36,1a1.8,1.8 0,0 1,0.08 0.21c1,1.29 2,2.58 2.92,3.9 1.13,1.58 2.22,3.18 3.32,4.78s2.21,3.59 3.4,5.2c0.11,0.14 -2,1 -2.23,1.11s-0.35,-0.08 -0.13,-0.15 1.9,-1.1 1.92,-1.12c-1.1,-1.62 -2.37,-3.11 -3.52,-4.68s-2.29,-3.14 -3.4,-4.73c-2.25,-3.24 -4.31,-6.6 -6.55,-9.85A0,0 0,0 1,219 142.28Z" + android:fillColor="#263238"/> + <path + android:pathData="M203.78,153.56c0.35,0.68 0.73,1.35 1,2.05l0.38,0.87c-0.53,-2.49 -1,-5 -1.55,-7.49 0,0 0,0 0,0 1.06,4 2.13,8.09 3.11,12.15 0.93,3.88 2.06,7.8 2.6,11.76a13.05,13.05 0,0 1,2.16 -0.73,10.66 10.66,0 0,1 -2.38,1.15 124.82,124.82 0,0 1,-3 -12.24c-0.25,-1.12 -0.48,-2.24 -0.72,-3.36 -0.26,-0.68 -0.57,-1.33 -0.88,-2s-0.59,-1.42 -0.87,-2.13C203.69,153.55 203.76,153.51 203.78,153.56Z" + android:fillColor="#263238"/> + <path + android:pathData="M209.89,169.15c3.2,-1.8 16.57,-8.72 19.56,-10 0.21,-0.09 0.32,0 0.11,0.14a201.57,201.57 0,0 1,-19.6 10C209.88,169.31 209.8,169.2 209.89,169.15Z" + android:fillColor="#263238"/> + <path + android:pathData="M576.32,432.05l-304.68,0l44.05,-249.85l304.68,0l-44.05,249.85z" + android:fillColor="#8AB0FF"/> + <path + android:pathData="M419.97,156.32l-99.71,0l-4.57,25.88l106.71,0l-2.43,-25.88z" + android:fillColor="#8AB0FF"/> + <path + android:fillColor="#FF000000" + android:pathData="M576.32,432.05l-304.68,0l44.05,-249.85l304.68,0l-44.05,249.85z" + android:strokeAlpha="0.1" + android:fillAlpha="0.1"/> + <path + android:fillColor="#FF000000" + android:pathData="M419.97,156.32l-99.71,0l-4.57,25.88l106.71,0l-2.43,-25.88z" + android:strokeAlpha="0.1" + android:fillAlpha="0.1"/> + <path + android:pathData="M309.5,166.88a19.17,19.17 0,0 1,0 -8.7,19.17 19.17,0 0,1 0,8.7Z" + android:fillColor="#263238"/> + <path + android:pathData="M300.64,169.44a17,17 0,0 1,-2.61 -3.52,17.35 17.35,0 0,1 -1.75,-4 16.58,16.58 0,0 1,2.61 3.51A17.61,17.61 0,0 1,300.64 169.44Z" + android:fillColor="#263238"/> + <path + android:pathData="M294.24,176.09a19.18,19.18 0,0 1,-7.53 -4.35,17.16 17.16,0 0,1 4,1.74A17.58,17.58 0,0 1,294.24 176.09Z" + android:fillColor="#263238"/> + <path + android:pathData="M292,185.05a19.17,19.17 0,0 1,-8.7 0,19.17 19.17,0 0,1 8.7,0Z" + android:fillColor="#263238"/> + <path + android:pathData="M294.6,193.91a17.64,17.64 0,0 1,-3.52 2.61,17.16 17.16,0 0,1 -4,1.74 17,17 0,0 1,3.52 -2.61A16.8,16.8 0,0 1,294.6 193.91Z" + android:fillColor="#263238"/> + <path + android:pathData="M301.24,200.3a19.13,19.13 0,0 1,-4.35 7.54,16.83 16.83,0 0,1 1.75,-4A17.31,17.31 0,0 1,301.24 200.3Z" + android:fillColor="#263238"/> + <path + android:pathData="M310.2,202.51a17.45,17.45 0,0 1,0.5 4.35,17 17,0 0,1 -0.5,4.35 16.57,16.57 0,0 1,-0.5 -4.35A17.45,17.45 0,0 1,310.2 202.51Z" + android:fillColor="#263238"/> + <path + android:pathData="M319.06,200a17,17 0,0 1,2.61 3.52,16.8 16.8,0 0,1 1.74,4 19.13,19.13 0,0 1,-4.35 -7.54Z" + android:fillColor="#263238"/> + <path + android:pathData="M325.45,193.3a16.8,16.8 0,0 1,4 1.74,17 17,0 0,1 3.52,2.61 16.8,16.8 0,0 1,-4 -1.74A17,17 0,0 1,325.45 193.3Z" + android:fillColor="#263238"/> + <path + android:pathData="M327.66,184.34a19.22,19.22 0,0 1,8.71 0,19.22 19.22,0 0,1 -8.71,0Z" + android:fillColor="#263238"/> + <path + android:pathData="M325.1,175.48a17.31,17.31 0,0 1,3.52 -2.6,16.44 16.44,0 0,1 4,-1.75 19.13,19.13 0,0 1,-7.54 4.35Z" + android:fillColor="#263238"/> + <path + android:pathData="M318.45,169.09a17.58,17.58 0,0 1,1.74 -4,17 17,0 0,1 2.61,-3.52 16.8,16.8 0,0 1,-1.74 4A17,17 0,0 1,318.45 169.09Z" + android:fillColor="#263238"/> + <path + android:pathData="M575.87,432.05l-305.33,0l-43.36,-240.78l305.34,0l43.35,240.78z" + android:fillColor="#8AB0FF"/> + <path + android:pathData="M332.99,325.77m-12.69,0a12.69,12.69 0,1 1,25.38 0a12.69,12.69 0,1 1,-25.38 0" + android:fillColor="#263238"/> + <path + android:pathData="M433.31,325.77m-12.69,0a12.69,12.69 0,1 1,25.38 0a12.69,12.69 0,1 1,-25.38 0" + android:fillColor="#263238"/> + <path + android:pathData="M401.38,340.49l-0.7,-1.33c-0.06,-0.12 -6.62,-12.24 -19.81,-12.24 -12,0 -15,11.41 -15.08,11.9l-0.36,1.45 -2.91,-0.7 0.35,-1.46c0,-0.14 3.58,-14.19 18,-14.19 15,0 22.17,13.28 22.47,13.85l0.7,1.32Z" + android:fillColor="#263238"/> + <path + android:pathData="M555.71,324.8l-0.21,-1c0.65,-0.14 1.29,-0.29 1.93,-0.46l0.25,1C557,324.51 556.37,324.66 555.71,324.8Z" + android:fillColor="#263238"/> + <path + android:pathData="M561.55,323.19l-0.32,-0.94c1.25,-0.43 2.5,-0.9 3.71,-1.41l0.39,0.92C564.1,322.28 562.83,322.76 561.55,323.19ZM569,320l-0.45,-0.88c1.17,-0.61 2.34,-1.27 3.45,-2l0.52,0.85C571.38,318.76 570.19,319.43 569,320ZM575.88,315.77 L575.29,314.96c1.08,-0.79 2.12,-1.62 3.1,-2.47l0.66,0.75C578,314.15 577,315 575.87,315.81ZM581.98,310.45 L581.25,309.76c0.92,-1 1.79,-2 2.59,-3l0.79,0.61C583.8,308.47 582.91,309.5 582,310.49ZM586.93,304.05 L586.08,303.52a29.08,29.08 0,0 0,1.84 -3.48l0.92,0.41A33.74,33.74 0,0 1,586.92 304.09ZM590.24,296.63 L589.24,296.35a26.14,26.14 0,0 0,0.81 -3.83l1,0.13A25.66,25.66 0,0 1,590.23 296.67ZM591.35,288.63h-1v-0.29c0,-1.21 -0.07,-2.44 -0.19,-3.65l1,-0.1a36.24,36.24 0,0 1,0.2 3.75ZM589.55,280.8a39.3,39.3 0,0 0,-1 -3.82l1,-0.3c0.41,1.3 0.76,2.62 1,3.91ZM587.18,273.27c-0.48,-1.18 -1,-2.39 -1.64,-3.61l0.9,-0.45c0.61,1.24 1.17,2.48 1.66,3.68ZM583.68,266.14c-0.62,-1.09 -1.3,-2.24 -2,-3.42l0.85,-0.53c0.73,1.19 1.42,2.35 2,3.46ZM579.5,259.35c-0.73,-1.1 -1.47,-2.21 -2.23,-3.32l0.83,-0.56c0.76,1.11 1.5,2.22 2.23,3.34ZM575,252.73c-0.75,-1.1 -1.51,-2.21 -2.25,-3.31l0.83,-0.56c0.74,1.1 1.49,2.21 2.24,3.3ZM570.53,246.07c-0.73,-1.12 -1.44,-2.26 -2.14,-3.4l0.85,-0.52c0.7,1.14 1.41,2.26 2.13,3.38ZM566.36,239.2c-0.68,-1.21 -1.31,-2.41 -1.88,-3.56l0.9,-0.45c0.56,1.14 1.19,2.32 1.85,3.52ZM562.81,232c-0.53,-1.25 -1,-2.52 -1.44,-3.76l1,-0.32c0.42,1.21 0.89,2.46 1.41,3.69ZM560.21,224.37c-0.33,-1.3 -0.62,-2.63 -0.84,-4l1,-0.16c0.22,1.28 0.49,2.58 0.82,3.86ZM558.87,216.37c-0.1,-1.23 -0.15,-2.47 -0.15,-3.71v-0.33h1v0.32c0,1.21 0,2.43 0.15,3.63ZM559.87,208.37 L558.87,208.27c0,-0.27 0.05,-0.55 0.08,-0.84 0.12,-1.07 0.27,-2.14 0.45,-3.16l1,0.17c-0.17,1 -0.32,2.05 -0.44,3.1C560,207.85 560,208.12 559.92,208.4ZM561.26,200.59 L560.26,200.32c0.37,-1.32 0.8,-2.61 1.28,-3.84l0.93,0.36A36.6,36.6 0,0 0,561.31 200.62ZM611.09,194.76c-0.56,0 -1.14,-0.08 -1.71,-0.16 -0.78,-0.11 -1.56,-0.24 -2.33,-0.39l0.2,-1c0.74,0.14 1.51,0.27 2.27,0.38 0.54,0.07 1.09,0.12 1.62,0.15ZM615.2,194.45 L614.99,193.45a11.54,11.54 0,0 0,3.56 -1.38l0.52,0.85A12.45,12.45 0,0 1,615.25 194.48ZM564.14,193.26 L563.25,192.79a35.46,35.46 0,0 1,2.11 -3.46l0.82,0.57A32.66,32.66 0,0 0,564.19 193.29ZM603.14,193.2a38.51,38.51 0,0 1,-3.8 -1.43l0.41,-0.92a34.09,34.09 0,0 0,3.69 1.39ZM622.14,190.08 L621.31,189.52a7,7 0,0 0,1.22 -3.49l1,0.07A8,8 0,0 1,622.17 190.11ZM595.74,189.93a36.69,36.69 0,0 1,-3.39 -2.23l0.59,-0.8a35.28,35.28 0,0 0,3.3 2.16ZM568.64,186.81 L567.9,186.14a33.81,33.81 0,0 1,2.89 -2.85l0.66,0.75A33.41,33.41 0,0 0,568.67 186.84ZM589.23,185.12a37,37 0,0 1,-2.83 -2.91l0.75,-0.66a36.84,36.84 0,0 0,2.75 2.83ZM621.78,182.41a9.77,9.77 0,0 0,-2.33 -3l0.66,-0.75a10.8,10.8 0,0 1,2.57 3.29ZM574.56,181.62 L573.99,180.8a38.58,38.58 0,0 1,3.47 -2.11l0.47,0.88A37.77,37.77 0,0 0,574.59 181.65ZM583.9,179.02c-0.38,-0.54 -0.75,-1.09 -1.1,-1.66l-1.3,0.51 -0.38,-0.92 1.15,-0.46c-0.18,-0.3 -0.36,-0.6 -0.53,-0.9l0.87,-0.49c0.2,0.35 0.4,0.7 0.61,1q0.84,-0.3 1.71,-0.57l0.29,1c-0.49,0.15 -1,0.31 -1.46,0.48 0.31,0.49 0.63,1 1,1.43ZM616.23,177.3a21.3,21.3 0,0 0,-3 -1.22l-0.66,-0.21 0.29,-1 0.68,0.22a21.6,21.6 0,0 1,3.12 1.27ZM589.05,175.51 L588.84,174.51c1.29,-0.29 2.63,-0.53 4,-0.72l0.15,1C591.67,175 590.36,175.25 589.08,175.54ZM608.75,174.97c-1.25,-0.22 -2.57,-0.39 -3.92,-0.51l0.08,-1c1.39,0.12 2.74,0.29 4,0.52ZM596.9,174.39 L596.83,173.39c1.19,-0.07 2.38,-0.11 3.56,-0.11h0.49v1h-0.48C599.27,174.31 598.09,174.34 596.93,174.42ZM580,172c-0.54,-1.22 -1,-2.49 -1.45,-3.78l1,-0.31c0.42,1.26 0.89,2.5 1.41,3.69ZM577.47,164.32c-0.3,-1.29 -0.55,-2.63 -0.74,-4l1,-0.14c0.19,1.32 0.43,2.63 0.72,3.9ZM576.35,156.32c-0.05,-0.9 -0.08,-1.82 -0.08,-2.74 0,-0.43 0,-0.87 0,-1.3l1,0c0,0.43 0,0.85 0,1.28 0,0.9 0,1.81 0.07,2.68ZM577.54,148.32 L576.54,148.22c0.14,-1.32 0.33,-2.67 0.56,-4l1,0.17C577.83,145.72 577.64,147 577.51,148.34ZM578.91,140.51 L577.91,140.27c0.32,-1.29 0.69,-2.59 1.1,-3.89l1,0.31C579.56,138 579.19,139.27 578.88,140.53ZM581.31,132.94 L580.38,132.58c0.49,-1.25 1,-2.5 1.61,-3.71l0.9,0.44C582.29,130.51 581.76,131.73 581.28,133ZM584.75,125.81 L583.88,125.3c0.68,-1.15 1.41,-2.3 2.17,-3.4l0.82,0.57C586.09,123.57 585.38,124.69 584.72,125.83ZM589.26,119.3 L588.48,118.67c0.84,-1 1.74,-2.06 2.67,-3l0.72,0.69C590.93,117.3 590.05,118.3 589.23,119.32ZM594.7,113.54 L594.03,112.8c1,-0.89 2,-1.77 3.07,-2.62l0.62,0.79C596.65,111.82 595.63,112.69 594.67,113.56ZM600.91,108.6 L600.34,107.77c1.09,-0.75 2.23,-1.49 3.39,-2.19l0.51,0.85C603.08,107.14 602,107.87 600.88,108.62ZM607.7,104.47 L607.23,103.59c1.18,-0.63 2.4,-1.23 3.62,-1.79l0.42,0.91C610,103.28 608.83,103.88 607.67,104.49ZM614.93,101.15 L614.56,100.21c1.26,-0.49 2.53,-1 3.79,-1.37l0.32,1C617.4,100.22 616.14,100.68 614.9,101.17Z" + android:fillColor="#263238"/> + <path + android:pathData="M622.64,98.62l-0.25,-1c1.24,-0.32 2,-0.46 2,-0.46l0.18,1S623.85,98.31 622.64,98.62Z" + android:fillColor="#263238"/> + <path + android:pathData="M640.32,92.16c-2.55,-7.9 -19.63,-5.06 -16.3,5.27S642.87,100.07 640.32,92.16Z" + android:fillColor="#263238"/> + <path + android:pathData="M614.73,89c0.13,-3.47 4.95,-6.14 11.77,-4.91s13.23,5.83 13.23,5.83S633,94 626.11,94.75 614.6,92.46 614.73,89Z" + android:fillColor="#ebebeb"/> + <path + android:pathData="M639.73,89.9c-3.54,0 -7.07,-0.1 -10.6,-0.21s-7.07,-0.29 -10.6,-0.57c3.54,0 7.08,0.09 10.61,0.2S636.21,89.61 639.73,89.9Z" + android:fillColor="#263238"/> + <path + android:pathData="M621.58,85.91a29.75,29.75 0,0 1,5.65 3.53,26.64 26.64,0 0,1 -2.92,-1.6A28.63,28.63 0,0 1,621.58 85.91Z" + android:fillColor="#263238"/> + <path + android:pathData="M630.85,89.57A32.47,32.47 0,0 1,625 93.35a32.47,32.47 0,0 1,5.88 -3.78Z" + android:fillColor="#263238"/> + <path + android:pathData="M631.88,87.62a7.24,7.24 0,0 1,2.58 2.08,6.85 6.85,0 0,1 -1.41,-0.89A7.32,7.32 0,0 1,631.88 87.62Z" + android:fillColor="#263238"/> + <path + android:pathData="M621.23,109.55c2.13,2.74 7.6,2.08 12.41,-2.9S641,94.18 641,94.18s-7.88,0.6 -13.89,4S619.09,106.8 621.23,109.55Z" + android:fillColor="#ebebeb"/> + <path + android:pathData="M641,94.18c-2.88,2 -5.68,4.22 -8.49,6.37s-5.56,4.37 -8.25,6.66c2.88,-2 5.68,-4.21 8.48,-6.36S638.27,96.48 641,94.18Z" + android:fillColor="#263238"/> + <path + android:pathData="M628.58,108a28.53,28.53 0,0 0,1.43 -3,26.73 26.73,0 0,0 1.08,-3.16 27.77,27.77 0,0 0,-1.43 3A28.52,28.52 0,0 0,628.58 108Z" + android:fillColor="#263238"/> + <path + android:pathData="M634,99.64a33.06,33.06 0,0 0,-7 0.37,29.2 29.2,0 0,0 3.5,0A31.11,31.11 0,0 0,634 99.64Z" + android:fillColor="#263238"/> + <path + android:pathData="M635.93,100.63a7.15,7.15 0,0 0,0.62 -1.56,7.48 7.48,0 0,0 0.26,-1.65 7.45,7.45 0,0 0,-0.88 3.21Z" + android:fillColor="#263238"/> + <path + android:pathData="M640.32,92.16a3,3 0,1 1,1.93 -3.77A3,3 0,0 1,640.32 92.16Z" + android:fillColor="#455a64"/> + <path + android:pathData="M642.16,97.87a3,3 0,1 1,1.93 -3.78A3,3 0,0 1,642.16 97.87Z" + android:fillColor="#455a64"/> + <path + android:pathData="M314.31,95.32a24.92,24.92 0,0 1,-41.64 15.77l-12.47,1.83 6.24,-10.78a24.92,24.92 0,1 1,47.87 -6.82Z" + android:fillColor="#fff"/> + <path + android:pathData="M314.31,95.32a25,25 0,0 1,-5 12.63,22.11 22.11,0 0,1 -4.89,4.83 24.26,24.26 0,0 1,-6 3.35,24.53 24.53,0 0,1 -6.71,1.6 25,25 0,0 1,-3.46 0.07,22.18 22.18,0 0,1 -3.45,-0.36 25.16,25.16 0,0 1,-12.33 -6.09l0.29,0.09 -12.45,1.91 -0.91,0.14 0.46,-0.8 6.2,-10.8 0,0.43a25.18,25.18 0,0 1,1.54 -22.21,25.54 25.54,0 0,1 7.8,-8.32 25.37,25.37 0,0 1,21.91 -3,25.53 25.53,0 0,1 9.61,5.9A25,25 0,0 1,314.31 95.32ZM314.31,95.32a24.65,24.65 0,0 0,-28.26 -27,24.38 24.38,0 0,0 -10.29,4.06 25.69,25.69 0,0 0,-7.46 8.14,24.62 24.62,0 0,0 -3.17,10.54A24.87,24.87 0,0 0,266.89 102l0.09,0.22 -0.12,0.21 -6.28,10.76 -0.44,-0.66 12.48,-1.75 0.17,0 0.12,0.11A24.56,24.56 0,0 0,284.85 117a21.23,21.23 0,0 0,3.38 0.41,24.26 24.26,0 0,0 3.41,0 25,25 0,0 0,6.66 -1.47,23.44 23.44,0 0,0 6,-3.24 22.78,22.78 0,0 0,4.9 -4.77A25,25 0,0 0,314.31 95.32Z" + android:fillColor="#263238"/> + <path + android:pathData="M277.34,104.35a2.42,2.42 0,0 1,2.44 -2.56,2.56 2.56,0 0,1 0,5.12A2.42,2.42 0,0 1,277.34 104.35ZM278.34,98.44 L277.76,78.6h4l-0.58,19.84Z" + android:fillColor="#8AB0FF"/> + <path + android:pathData="M286.85,104.35a2.42,2.42 0,0 1,2.43 -2.56,2.56 2.56,0 0,1 0,5.12A2.42,2.42 0,0 1,286.85 104.35ZM287.85,98.44L287.3,78.6h4l-0.58,19.84Z" + android:fillColor="#8AB0FF"/> + <path + android:pathData="M296.35,104.35a2.42,2.42 0,0 1,2.44 -2.56,2.56 2.56,0 0,1 0,5.12A2.42,2.42 0,0 1,296.35 104.35ZM297.35,98.44 L296.77,78.6h4l-0.57,19.84Z" + android:fillColor="#8AB0FF"/> +</vector> diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index eca6dfce252664e7c5f70e63450523b6d2ccc447..afe2955da93dbe74caf42078f8c576481786fab6 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,6 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_parent" + android:background="@color/md_theme_surface" android:layout_height="match_parent" > @@ -11,7 +12,7 @@ android:id="@+id/nav_view" android:layout_width="0dp" android:layout_height="wrap_content" - android:background="?android:attr/windowBackground" + android:background="@color/md_theme_surface" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintLeft_toLeftOf="parent" diff --git a/app/src/main/res/layout/dialog_custom.xml b/app/src/main/res/layout/dialog_custom.xml new file mode 100644 index 0000000000000000000000000000000000000000..274d6aa40675a4489f32eee5255d9c82593c547b --- /dev/null +++ b/app/src/main/res/layout/dialog_custom.xml @@ -0,0 +1,99 @@ +<?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" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + > + + <androidx.cardview.widget.CardView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + app:cardBackgroundColor="@color/md_theme_surfaceContainer" + app:cardCornerRadius="20dp" + app:cardElevation="10dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="330dp" + android:layout_height="wrap_content" + android:paddingVertical="20dp" + android:paddingHorizontal="20dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + <TextView + android:id="@+id/dialog_tv_title" + style="@style/TextAppearance.HeadlineMedium" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="15dp" + android:text="@string/dialog_title" + android:gravity="center" + android:textColor="@color/md_theme_primary" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <TextView + android:id="@+id/dialog_tv_message" + style="@style/TextAppearance.BodyMedium" + android:layout_width="250dp" + android:layout_height="wrap_content" + android:layout_marginTop="10dp" + android:text="@string/dialog_message" + android:gravity="center" + android:textColor="@color/md_theme_primary" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/dialog_tv_title" + /> + + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="40dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/dialog_tv_message" + app:layout_constraintVertical_bias="0.0" + > + + <Button + android:id="@+id/dialog_btn_cancel" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:backgroundTint="@color/md_theme_red" + android:text="@string/btn_cancel" + android:textAllCaps="true" + android:layout_marginEnd="76dp" + android:textAppearance="@style/TextAppearance.LabelLarge" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toStartOf="@+id/dialog_btn_submit" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.0" /> + + <Button + android:id="@+id/dialog_btn_submit" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:backgroundTint="@color/md_theme_primary" + android:text="@string/btn_submit" + android:textAllCaps="true" + android:textAppearance="@style/TextAppearance.LabelLarge" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + </androidx.constraintlayout.widget.ConstraintLayout> + + + </androidx.constraintlayout.widget.ConstraintLayout> + </androidx.cardview.widget.CardView> +</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 77d9ef65f8c7c6bf54bdef7d54d1646b86417404..3fd26d23f8421a621c611d9737584aa6190b4d0b 100644 --- a/app/src/main/res/layout/fragment_graph.xml +++ b/app/src/main/res/layout/fragment_graph.xml @@ -1,6 +1,28 @@ <?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" + xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + tools:context=".view.graph.GraphFragment" + > + <TextView + android:id="@+id/textView" + style="@style/TextAppearance.HeadlineLarge" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="20dp" + android:padding="10dp" + android:text="Graph" + android:textColor="@color/md_theme_primary" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <com.anychart.AnyChartView + android:id="@+id/anyChartView" + android:layout_width="match_parent" + android:layout_height="match_parent" + app:layout_constraintBottom_toBottomOf="parent" + /> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_transaction.xml b/app/src/main/res/layout/fragment_transaction.xml index 0661ea3578bb1e9b9f44b5cc8b5a05fea42b3b42..cc342f951b478974c970657453df08665b549706 100644 --- a/app/src/main/res/layout/fragment_transaction.xml +++ b/app/src/main/res/layout/fragment_transaction.xml @@ -3,14 +3,16 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" + android:background="@color/md_theme_surface" android:layout_height="match_parent" + tools:context=".view.transaction.TransactionFragment" > <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/constraintLayout" android:layout_width="350dp" android:layout_height="wrap_content" - android:layout_marginTop="78dp" + android:layout_marginTop="25dp" android:background="@drawable/bg_transaction_balance" android:paddingLeft="10dp" android:paddingTop="22dp" @@ -26,7 +28,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/email" - android:textColor="@color/white" + android:textColor="@color/md_theme_surface" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -37,7 +39,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/balance" - android:textColor="@color/white" + android:textColor="@color/md_theme_surface" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/tv_email" /> @@ -48,41 +50,78 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/balance_value" - android:textColor="@color/white" + android:textColor="@color/md_theme_surface" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/tv_balance" /> + </androidx.constraintlayout.widget.ConstraintLayout> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/constraintLayout2" android:layout_width="350dp" - android:layout_height="500dp" + android:layout_height="570dp" + app:layout_constraintVertical_bias="0" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/constraintLayout"> <androidx.recyclerview.widget.RecyclerView + android:id="@+id/rvTransaction" android:layout_width="348dp" - android:layout_height="498dp" - app:layout_constraintBottom_toBottomOf="parent" + android:layout_height="wrap_content" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <com.google.android.material.floatingactionbutton.FloatingActionButton - android:id="@+id/floatingActionButton" + android:id="@+id/fab_create_transaction" + style="@style/FloatingActionButtonStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginEnd="16dp" + android:layout_marginBottom="16dp" android:clickable="true" + android:contentDescription="@string/cd_transaction_create" + app:backgroundTint="@color/md_theme_primary" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:srcCompat="@drawable/ic_add" - android:backgroundTint="@color/md_theme_primaryContainer" - android:tint="@color/md_theme_primary" - android:contentDescription="@string/cd_transaction_create" /> + app:srcCompat="@drawable/ic_add" /> </androidx.constraintlayout.widget.ConstraintLayout> + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/cl_empty_rv" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:layout_constraintTop_toBottomOf="@id/constraintLayout" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + android:visibility="gone" + > + + <ImageView + android:id="@+id/iv_no_data" + android:layout_width="300dp" + android:layout_height="300dp" + android:layout_marginTop="20dp" + android:src="@drawable/no_data_cuate" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" /> + <TextView + style="@style/TextAppearance.LabelLarge" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:text="@string/msg_empty_transaction" + android:textColor="@color/md_theme_tertiary" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/iv_no_data" + + /> + + + </androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_transaction_create.xml b/app/src/main/res/layout/fragment_transaction_create.xml index 1d5de80753a951870988655fa1fd485ea35bb71b..7a4ce99a9da5e1926ee10dce52c58ffff64adc05 100644 --- a/app/src/main/res/layout/fragment_transaction_create.xml +++ b/app/src/main/res/layout/fragment_transaction_create.xml @@ -3,7 +3,8 @@ 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" + tools:context=".view.transaction.CreateTransactionFragment"> <TextView android:id="@+id/tv_transaction_new" @@ -37,7 +38,7 @@ <com.google.android.material.textfield.TextInputLayout android:id="@+id/tf_transaction_name" - style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" + style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="2dp" @@ -70,7 +71,7 @@ <com.google.android.material.textfield.TextInputLayout android:id="@+id/tf_transaction_price" - style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" + style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="2dp" @@ -85,7 +86,9 @@ style="@style/TextAppearance.BodyLarge" android:layout_width="match_parent" android:layout_height="wrap_content" - android:inputType="numberDecimal" /> + android:inputType="numberDecimal" + android:textColor="@color/md_theme_primary" + /> </com.google.android.material.textfield.TextInputLayout> @@ -103,7 +106,7 @@ <com.google.android.material.textfield.TextInputLayout android:id="@+id/tf_transaction_location" - style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" + style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="2dp" @@ -117,7 +120,8 @@ android:id="@+id/et_transaction_location" style="@style/TextAppearance.BodyLarge" android:layout_width="match_parent" - android:layout_height="wrap_content" /> + android:layout_height="wrap_content" + android:textColor="@color/md_theme_primary"/> </com.google.android.material.textfield.TextInputLayout> @@ -148,6 +152,7 @@ android:layout_width="155dp" android:layout_height="wrap_content" android:text="@string/label_pembelian" + android:buttonTint="@color/md_theme_primary" android:textColor="@color/md_theme_primary" /> <RadioButton @@ -156,6 +161,7 @@ android:layout_width="155dp" android:layout_height="wrap_content" android:text="@string/label_pemasukan" + android:buttonTint="@color/md_theme_primary" android:textColor="@color/md_theme_primary" /> </RadioGroup> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/main/res/layout/fragment_transaction_edit.xml b/app/src/main/res/layout/fragment_transaction_edit.xml new file mode 100644 index 0000000000000000000000000000000000000000..de552f1a014196a5fd2fa35ea7939c340ba47666 --- /dev/null +++ b/app/src/main/res/layout/fragment_transaction_edit.xml @@ -0,0 +1,204 @@ +<?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" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".view.transaction.EditTransactionFragment"> + + <TextView + android:id="@+id/tv_transaction_edit" + style="@style/TextAppearance.HeadlineLarge" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="10dp" + android:text="@string/title_transaction_new" + android:textColor="@color/md_theme_primary" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/cl_field" + android:layout_width="310dp" + android:layout_height="wrap_content" + android:layout_marginTop="64dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/tv_transaction_edit"> + + <TextView + android:id="@+id/tv_transaction_title" + style="@style/TextAppearance.LabelLarge" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/label_transaction" + android:textColor="@color/md_theme_primary" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <com.google.android.material.textfield.TextInputLayout + android:id="@+id/tf_transaction_name" + style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="2dp" + android:hint="@string/hint_transaction_new" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/tv_transaction_title"> + + <!--This is the actual edit text which takes the input--> + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/et_transaction_name" + style="@style/TextAppearance.BodyLarge" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textColor="@color/md_theme_primary" + android:inputType="text" /> + + </com.google.android.material.textfield.TextInputLayout> + + <TextView + android:id="@+id/tv_transaction_price" + style="@style/TextAppearance.LabelLarge" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="10dp" + android:text="@string/label_price" + android:textColor="@color/md_theme_primary" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/tf_transaction_name" /> + + <com.google.android.material.textfield.TextInputLayout + android:id="@+id/tf_transaction_price" + style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="2dp" + android:hint="@string/hint_transaction_price" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/tv_transaction_price"> + + <!--This is the actual edit text which takes the input--> + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/et_transaction_price" + style="@style/TextAppearance.BodyLarge" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:inputType="numberDecimal" + android:textColor="@color/md_theme_primary"/> + + </com.google.android.material.textfield.TextInputLayout> + + + <TextView + android:id="@+id/tv_transaction_location" + style="@style/TextAppearance.LabelLarge" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="10dp" + android:text="@string/label_location" + android:textColor="@color/md_theme_primary" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/rg_category" /> + + <com.google.android.material.textfield.TextInputLayout + android:id="@+id/tf_transaction_location" + style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="2dp" + android:hint="@string/hint_transaction_location" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/tv_transaction_location"> + + <!--This is the actual edit text which takes the input--> + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/et_transaction_location" + style="@style/TextAppearance.BodyLarge" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textColor="@color/md_theme_primary" + /> + + </com.google.android.material.textfield.TextInputLayout> + + <TextView + android:id="@+id/tv_transaction_category" + style="@style/TextAppearance.LabelLarge" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="10dp" + android:text="@string/label_category" + android:textColor="@color/md_theme_primary" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/tf_transaction_price" /> + + <RadioGroup + android:id="@+id/rg_category" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="10dp" + android:orientation="horizontal" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@+id/tv_transaction_category"> + + <RadioButton + android:id="@+id/rb_pembelian" + style="@style/TextAppearance.LabelLarge" + android:layout_width="155dp" + android:layout_height="wrap_content" + android:text="@string/label_pembelian" + android:textColor="@color/md_theme_primary" /> + + <RadioButton + android:id="@+id/rb_pemasukan" + style="@style/TextAppearance.LabelLarge" + android:layout_width="155dp" + android:layout_height="wrap_content" + android:text="@string/label_pemasukan" + android:textColor="@color/md_theme_primary" /> + </RadioGroup> + </androidx.constraintlayout.widget.ConstraintLayout> + + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="310dp" + android:layout_height="wrap_content" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/cl_field"> + + <Button + android:id="@+id/btn_cancel" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:backgroundTint="@color/md_theme_red" + android:text="@string/btn_cancel" + android:textAllCaps="true" + android:textAppearance="@style/TextAppearance.LabelLarge" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toStartOf="@+id/btn_submit" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.0" /> + + <Button + android:id="@+id/btn_submit" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:backgroundTint="@color/md_theme_primary" + android:text="@string/btn_submit" + android:textAllCaps="true" + android:textAppearance="@style/TextAppearance.LabelLarge" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + </androidx.constraintlayout.widget.ConstraintLayout> + + +</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/main/res/layout/row_transaction.xml b/app/src/main/res/layout/item_transaction.xml similarity index 66% rename from app/src/main/res/layout/row_transaction.xml rename to app/src/main/res/layout/item_transaction.xml index 01f0202cb169798b498238cd53924529450c5458..f28cb61ce8f9a436bbbb7712eca82d85c1f1fa79 100644 --- a/app/src/main/res/layout/row_transaction.xml +++ b/app/src/main/res/layout/item_transaction.xml @@ -1,19 +1,21 @@ -<?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" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" + android:layout_marginHorizontal="5dp" + android:layout_marginVertical="10dp" android:background="@drawable/bg_transaction_card"> <ImageView - android:id="@+id/imageView" + android:id="@+id/img_icon_category" android:layout_width="36dp" android:layout_height="36dp" 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" @@ -24,10 +26,10 @@ android:id="@+id/verticalLayout1" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="20dp" + android:layout_marginStart="10dp" android:padding="10dp" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toEndOf="@+id/imageView" + app:layout_constraintStart_toEndOf="@+id/img_icon_category" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.0"> @@ -37,6 +39,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/transaction_name" + android:ellipsize="end" + android:maxLines="1" android:textColor="@color/md_theme_primary" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -48,6 +52,8 @@ android:layout_height="wrap_content" android:text="@string/transaction_category" android:textColor="@color/md_theme_primary" + android:ellipsize="end" + android:maxLines="1" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tv_transaction_name" /> @@ -57,8 +63,10 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/transaction_date" - android:textColor="@color/md_theme_primary" + 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> @@ -71,25 +79,53 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent"> + <ImageView + android:id="@+id/img_icon_value" + android:layout_width="20dp" + android:layout_height="20dp" + android:contentDescription="@string/transaction_category" + android:padding="2dp" + android:src="@drawable/ic_remove" + app:layout_constraintEnd_toStartOf="@+id/tv_currency" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:tint="@color/md_theme_red" /> + + <TextView + android:id="@+id/tv_currency" + style="@style/TextAppearance.LabelMedium" + 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" + 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_price" + android:id="@+id/tv_transaction_amount" style="@style/TextAppearance.LabelMedium" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="4dp" + android:ellipsize="end" + android:maxLines="1" android:text="@string/transaction_price" android:textColor="@color/md_theme_red" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="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_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/tv_transaction_price"> + app:layout_constraintTop_toBottomOf="@+id/tv_transaction_amount"> <ImageView android:id="@+id/iv_location" @@ -111,8 +147,26 @@ 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> </androidx.constraintlayout.widget.ConstraintLayout> -</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: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" /> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/menu/transaction_menu.xml b/app/src/main/res/menu/transaction_menu.xml new file mode 100644 index 0000000000000000000000000000000000000000..e747626a13ac62364a4ff9616a23b30175a6e4dd --- /dev/null +++ b/app/src/main/res/menu/transaction_menu.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu xmlns:android="http://schemas.android.com/apk/res/android"> + + <item android:title="@string/title_edit_transaction" + android:id="@+id/edit_transaction" + android:icon="@drawable/ic_edit" + /> + <item android:title="@string/title_delete_transaction" + android:id="@+id/delete_transaction" + android:icon="@drawable/ic_delete" /> +</menu> \ No newline at end of file diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index 474fae7121530026f7a2be922ebf9f471ea99c52..11a4f40958cbc643a7252397f4a624f864a09a8c 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -7,9 +7,19 @@ <fragment android:id="@+id/navigation_transaction" - android:name="com.example.bandung_bondowoso.view.home.HomeFragment" + android:name="com.example.bandung_bondowoso.view.transaction.TransactionFragment" android:label="@string/title_transactions" - tools:layout="@layout/fragment_home" /> + tools:layout="@layout/fragment_transaction" > + <action + android:id="@+id/action_navigation_transaction_to_newTransactionFragment" + app:destination="@id/newTransactionFragment" + android:label="Transaksi Baru" + /> + <action + android:id="@+id/action_navigation_transaction_to_editTransactionFragment" + app:destination="@id/editTransactionFragment" /> + </fragment> + <fragment android:id="@+id/navigation_scan" @@ -31,6 +41,34 @@ android:id="@+id/action_loginFragment_to_navigation_transaction" app:destination="@id/navigation_transaction" /> </fragment> + <fragment + android:id="@+id/newTransactionFragment" + android:name="com.example.bandung_bondowoso.view.transaction.CreateTransactionFragment" + android:label="fragment_transaction_create" + tools:layout="@layout/fragment_transaction_create" > + <action + android:id="@+id/action_newTransactionFragment_to_navigation_transaction" + app:destination="@id/navigation_transaction" /> + </fragment> + + <fragment + android:id="@+id/navigation_graph" + android:name="com.example.bandung_bondowoso.view.graph.GraphFragment" + android:label="GraphFragment" + tools:layout="@layout/fragment_graph" + /> + <fragment + android:id="@+id/editTransactionFragment" + android:name="com.example.bandung_bondowoso.view.transaction.EditTransactionFragment" + android:label="fragment_transaction_edit" + tools:layout="@layout/fragment_transaction_edit" > + <action + android:id="@+id/action_editTransactionFragment_to_navigation_transaction" + app:destination="@id/navigation_transaction" /> + <argument + android:name="transactionId" + app:argType="integer" /> + </fragment> </navigation> \ No newline at end of file diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index b9c3dc6d4d9db0b94dc90e1297e6c19024342792..af2223c1785b59379a45e9fca315401240948e83 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -144,6 +144,8 @@ </style> <style name="FABShapeStyleSquare" parent="ShapeAppearance.MaterialComponents.SmallComponent"> <item name="cornerSize">20%</item> + <item name="android:tint">@color/md_theme_primary</item> + <item name="android:backgroundTint">@color/md_theme_surface</item> </style> <style name="buttonStylePrimary" parent="Widget.MaterialComponents.Button"> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 8f040ef4f62130a3bace923077804d4675233f7c..f7f5bf383b53e8138d4820cd153d6d4e6d262a42 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -23,7 +23,7 @@ <color name="md_theme_background">#FBF8FF</color> <color name="md_theme_onBackground">#1B1B21</color> <color name="md_theme_surface">#FBF8FF</color> - <color name="md_theme_onSurface">#1B1B21</color> + <color name="md_theme_onSurface">#373740</color> <color name="md_theme_surfaceVariant">#E3E1EC</color> <color name="md_theme_onSurfaceVariant">#46464F</color> <color name="md_theme_outline">#777680</color> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e8c3cd7cd3601a7a8f59db972e4bddc67b0f080e..6be31d3d7b9a8caf7662477586586971cc0357cb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,7 +10,8 @@ <string name="title_twibbon">Twibbon</string> <string name="title_chart">Chart</string> <string name="title_settings">Settings</string> - + <string name="title_edit_transaction">Edit</string> + <string name="title_delete_transaction">Delete</string> <string name="token">Token: %s</string> <string name="error_message">Error Message: %s</string> @@ -24,27 +25,48 @@ <!--Transaction Card--> <string name="transaction_name">Warteg</string> <string name="transaction_category">Pembelian</string> - <string name="transaction_price">-IDR15000</string> + <string name="transaction_price">15000</string> <string name="transaction_date">29/02/2024</string> <string name="transaction_location">Bandung</string> <!--Content Description--> <string name="cd_transaction_create">Create New Transaction</string> + <string name="cd_transaction_modify">Edit/Delete Existing Transaction</string> <!--Label--> - <string name="label_transaction">Judul</string> - <string name="label_price">Harga</string> - <string name="label_location">Lokasi</string> + <string name="label_transaction">Judul Transaksi</string> + <string name="label_price">Nominal Transaksi</string> + <string name="label_location">Lokasi Transaksi</string> <string name="label_category">Kategori</string> - <string name="label_pembelian">Pembelian</string> + <string name="label_pembelian">Pengeluaran</string> <string name="label_pemasukan">Pemasukan</string> + <string name="label_mata_uang">IDR</string> <!--Hint--> <string name="hint_transaction_new">Nama Transaksi</string> - <string name="hint_transaction_price">Nominal</string> + <string name="hint_transaction_price">Jumlah Nominal</string> <string name="hint_transaction_location">Nama Lokasi</string> <!--Button--> <string name="btn_submit">Simpan</string> <string name="btn_cancel">Batal</string> + <!-- TODO: Remove or change this placeholder text --> + <string name="hello_blank_fragment">Hello blank fragment</string> + <string name="dialog_title">Hapus Transaksi</string> + <string name="dialog_message">Apakah Anda yakin ingin menghapus transaksi ini?</string> + <string name="msg_empty_transaction">Belum ada data transaksi</string> + + <string name="dialog_title_edit_transaction">Edit Transaksi: %1$s</string> + <string name="dialog_message_edit_transaction">Apakah Anda yakin ingin membatalkan pembuatan transaksi %1$s?</string> + + <string name="button_ok">OK</string> + <string name="button_cancel">BATAL</string> + <string name="button_delete">HAPUS</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> + <string name="error_transaction_name_empty">Nama transaksi tidak boleh kosong</string> + <string name="error_transaction_amount_empty">Nominal transaksi tidak boleh kosong</string> + <string name="error_transaction_location_empty">Lokasi transaksi tidak boleh kosong</string> + <string name="error_transaction_category_empty">Kategori transaksi tidak boleh kosong</string> <string name="login">Masuk</string> <string name="img_logo_description">Logo Bandung Bondowoso</string> <string name="hint_password">Password</string> diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 5e51ff95026d54bfc046806d9d1646ac7c09c538..2c5f6a1f2c015b364e5c1f5d24a81c8f97371b3a 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -158,10 +158,16 @@ </style> <style name="FABShapeStyleSquare" parent="ShapeAppearance.MaterialComponents.SmallComponent"> <item name="cornerSize">20%</item> + <item name="android:tint">@color/md_theme_primary</item> + <item name="android:backgroundTint">@color/md_theme_surface</item> </style> <style name="buttonStylePrimary" parent="Widget.MaterialComponents.Button"> <item name="android:background">@drawable/bg_button_primary</item> <item name="android:textColor">@color/white</item> </style> + <style name="LoginTextInputLayoutStyle" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"> + <item name="boxStrokeColor">@color/md_theme_primary</item> + <item name="boxStrokeWidth">2dp</item> + </style> </resources> \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 9aab2d208cd9cef0d57fb570983e386006b41f63..b43ba22e82ab2b7d788fd33c1eeffe67cccea237 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -10,6 +10,7 @@ dependencyResolutionManagement { repositories { google() mavenCentral() + maven { url = uri("https://jitpack.io") } } }