From f9ec489f89e5c804f73e98860a01340786ca571e Mon Sep 17 00:00:00 2001 From: mrsyaban <mrsyaban99@gmail.com> Date: Mon, 1 Apr 2024 17:07:43 +0700 Subject: [PATCH] feat: add add-transaction activity --- app/src/main/AndroidManifest.xml | 22 ++++- .../com/pbd/psi/AddTransactionActivity.kt | 20 ++++ .../main/java/com/pbd/psi/room/AppDatabase.kt | 3 +- .../main/java/com/pbd/psi/room/Converters.kt | 17 ++++ .../java/com/pbd/psi/room/TransactionDao.kt | 4 +- .../com/pbd/psi/room/TransactionEntity.kt | 24 ++++- .../ui/add_transaction/AddTransFragment.kt | 60 ------------ .../add_transaction/AddTransactionFragment.kt | 43 ++++++++ .../AddTransactionViewModel.kt | 18 ++++ .../psi/ui/add_transaction/ExpenseFragment.kt | 60 ------------ .../psi/ui/add_transaction/IncomeFragment.kt | 60 ------------ .../psi/ui/transaction/TransactionAdapter.kt | 21 ---- .../psi/ui/transaction/TransactionFragment.kt | 24 ++++- .../ui/transaction/TransactionViewAdapter.kt | 69 +++++++++++++ .../ui/transaction/TransactionViewHolder.kt | 44 +++++++++ .../ui/transaction/TransactionViewModel.kt | 7 -- app/src/main/res/drawable/add_icon.xml | 9 ++ app/src/main/res/drawable/expense_symbol.xml | 15 +++ app/src/main/res/drawable/income_symbol.xml | 15 +++ app/src/main/res/drawable/location_icon.xml | 12 +++ .../res/layout/activity_add_transaction.xml | 47 +++++++++ app/src/main/res/layout/expense_card.xml | 84 ++++++++++++++++ .../main/res/layout/fragment_add_trans.xml | 97 ------------------- .../res/layout/fragment_add_transaction.xml | 63 ++++++++++++ app/src/main/res/layout/fragment_expense.xml | 14 --- app/src/main/res/layout/fragment_income.xml | 64 ------------ .../main/res/layout/fragment_transaction.xml | 14 +-- app/src/main/res/layout/income_card.xml | 42 ++++++++ app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 2 - 30 files changed, 571 insertions(+), 404 deletions(-) create mode 100644 app/src/main/java/com/pbd/psi/AddTransactionActivity.kt delete mode 100644 app/src/main/java/com/pbd/psi/ui/add_transaction/AddTransFragment.kt create mode 100644 app/src/main/java/com/pbd/psi/ui/add_transaction/AddTransactionFragment.kt create mode 100644 app/src/main/java/com/pbd/psi/ui/add_transaction/AddTransactionViewModel.kt delete mode 100644 app/src/main/java/com/pbd/psi/ui/add_transaction/ExpenseFragment.kt delete mode 100644 app/src/main/java/com/pbd/psi/ui/add_transaction/IncomeFragment.kt delete mode 100644 app/src/main/java/com/pbd/psi/ui/transaction/TransactionAdapter.kt create mode 100644 app/src/main/java/com/pbd/psi/ui/transaction/TransactionViewAdapter.kt create mode 100644 app/src/main/java/com/pbd/psi/ui/transaction/TransactionViewHolder.kt create mode 100644 app/src/main/res/drawable/add_icon.xml create mode 100644 app/src/main/res/drawable/expense_symbol.xml create mode 100644 app/src/main/res/drawable/income_symbol.xml create mode 100644 app/src/main/res/drawable/location_icon.xml create mode 100644 app/src/main/res/layout/activity_add_transaction.xml create mode 100644 app/src/main/res/layout/expense_card.xml delete mode 100644 app/src/main/res/layout/fragment_add_trans.xml create mode 100644 app/src/main/res/layout/fragment_add_transaction.xml delete mode 100644 app/src/main/res/layout/fragment_expense.xml delete mode 100644 app/src/main/res/layout/fragment_income.xml create mode 100644 app/src/main/res/layout/income_card.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f1aae8a..49883f8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,11 +1,13 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools"> + xmlns:tools="http://schemas.android.com/tools" > <uses-feature android:name="android.hardware.camera.any" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> + <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> + <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.CAMERA" /> <application @@ -17,23 +19,33 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.PSI" - tools:targetApi="31"> + tools:targetApi="31" > + <activity + android:name=".AddTransactionActivity" + android:exported="false" /> <activity android:name=".LoginActivity" android:exported="false" /> <activity android:name=".SplashActivity" - android:exported="true"> + android:exported="true" > <intent-filter> <action android:name="android.intent.action.MAIN" /> + <action android:name="android.intent.action.VIEW" /> + + <category android:name="android.intent.category.DEFAULT" /> + <category android:name="android.intent.category.BROWSABLE" /> + + <data android:scheme="geo" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MainActivity" - android:exported="false"/> - <service android:name=".services.BackgroundService"/> + android:exported="false" /> + + <service android:name=".services.BackgroundService" /> </application> </manifest> \ No newline at end of file diff --git a/app/src/main/java/com/pbd/psi/AddTransactionActivity.kt b/app/src/main/java/com/pbd/psi/AddTransactionActivity.kt new file mode 100644 index 0000000..953c18b --- /dev/null +++ b/app/src/main/java/com/pbd/psi/AddTransactionActivity.kt @@ -0,0 +1,20 @@ +package com.pbd.psi + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import com.pbd.psi.databinding.ActivityAddTransactionBinding +import com.pbd.psi.ui.add_transaction.AddTransactionFragment + +class AddTransactionActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val binding = ActivityAddTransactionBinding.inflate(layoutInflater) + setContentView(binding.root) + + val fragment = AddTransactionFragment() + supportFragmentManager + .beginTransaction() + .replace(R.id.placeholderForm, fragment) + .commit() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pbd/psi/room/AppDatabase.kt b/app/src/main/java/com/pbd/psi/room/AppDatabase.kt index 04d804a..7a02105 100644 --- a/app/src/main/java/com/pbd/psi/room/AppDatabase.kt +++ b/app/src/main/java/com/pbd/psi/room/AppDatabase.kt @@ -4,9 +4,10 @@ import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase import android.content.Context +import androidx.room.TypeConverter import androidx.room.TypeConverters -@Database(entities = [TransactionEntity::class], version = 1) +@Database(entities = [TransactionEntity::class], version = 2) @TypeConverters(Converters::class) abstract class AppDatabase() : RoomDatabase() { diff --git a/app/src/main/java/com/pbd/psi/room/Converters.kt b/app/src/main/java/com/pbd/psi/room/Converters.kt index dee6eeb..0beca3e 100644 --- a/app/src/main/java/com/pbd/psi/room/Converters.kt +++ b/app/src/main/java/com/pbd/psi/room/Converters.kt @@ -4,7 +4,12 @@ import androidx.room.TypeConverter import java.text.SimpleDateFormat import java.util.* +enum class Category { + INCOME, + EXPENSE +} class Converters { + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) @TypeConverter @@ -16,4 +21,16 @@ class Converters { fun fromDate(date: Date?): String? { return date?.let { dateFormat.format(it) } } + + // Convert String to Category + @TypeConverter + fun toCategory(value: String?): Category? { + return value?.let { Category.valueOf(it) } + } + + // Convert Category to String + @TypeConverter + fun fromCategory(category: Category?): String? { + return category?.name + } } diff --git a/app/src/main/java/com/pbd/psi/room/TransactionDao.kt b/app/src/main/java/com/pbd/psi/room/TransactionDao.kt index f4e7024..cf094ec 100644 --- a/app/src/main/java/com/pbd/psi/room/TransactionDao.kt +++ b/app/src/main/java/com/pbd/psi/room/TransactionDao.kt @@ -4,10 +4,10 @@ import androidx.lifecycle.LiveData import androidx.room.* @Dao interface TransactionDao { - @Query("SELECT * FROM `transaction`") + @Query("SELECT * FROM transactionTable") fun getAllTrans(): LiveData<List<TransactionEntity>> - @Query("SELECT * FROM `transaction` WHERE id=:id") + @Query("SELECT * FROM transactionTable WHERE id=:id") fun getTransById(id: Int): TransactionEntity @Insert(onConflict = OnConflictStrategy.ABORT) diff --git a/app/src/main/java/com/pbd/psi/room/TransactionEntity.kt b/app/src/main/java/com/pbd/psi/room/TransactionEntity.kt index e7a721a..4c2bcbe 100644 --- a/app/src/main/java/com/pbd/psi/room/TransactionEntity.kt +++ b/app/src/main/java/com/pbd/psi/room/TransactionEntity.kt @@ -1,17 +1,35 @@ package com.pbd.psi.room +import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey import java.util.Date -@Entity(tableName = "transaction") + +@Entity(tableName = "transactionTable") data class TransactionEntity( @PrimaryKey(autoGenerate = true) + @ColumnInfo(name = "id") val id: Int = 0, + + @ColumnInfo(name = "name") val name: String = "", - val category: Int = 0, - val price: Int = 0, + + @ColumnInfo(name = "category") + val category: Category, + + @ColumnInfo(name = "amount") + val amount: Int = 0, + + @ColumnInfo(name = "date") val date: Date = Date(), + + @ColumnInfo(name = "location") + val location: String = "", + + @ColumnInfo(name = "longitude") val longitude: Double = 0.0, + + @ColumnInfo(name = "latitude") val latitude: Double = 0.0, ) \ No newline at end of file diff --git a/app/src/main/java/com/pbd/psi/ui/add_transaction/AddTransFragment.kt b/app/src/main/java/com/pbd/psi/ui/add_transaction/AddTransFragment.kt deleted file mode 100644 index 4ab80d9..0000000 --- a/app/src/main/java/com/pbd/psi/ui/add_transaction/AddTransFragment.kt +++ /dev/null @@ -1,60 +0,0 @@ -package com.pbd.psi.ui.add_transaction - -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.pbd.psi.R - -// TODO: Rename parameter arguments, choose names that match -// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER -private const val ARG_PARAM1 = "param1" -private const val ARG_PARAM2 = "param2" - -/** - * A simple [Fragment] subclass. - * Use the [AddTransFragment.newInstance] factory method to - * create an instance of this fragment. - */ -class AddTransFragment : Fragment() { - // TODO: Rename and change types of parameters - private var param1: String? = null - private var param2: String? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - arguments?.let { - param1 = it.getString(ARG_PARAM1) - param2 = it.getString(ARG_PARAM2) - } - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_add_trans, container, false) - } - - companion object { - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment AddTransFragment. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - AddTransFragment().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/pbd/psi/ui/add_transaction/AddTransactionFragment.kt b/app/src/main/java/com/pbd/psi/ui/add_transaction/AddTransactionFragment.kt new file mode 100644 index 0000000..ccf7199 --- /dev/null +++ b/app/src/main/java/com/pbd/psi/ui/add_transaction/AddTransactionFragment.kt @@ -0,0 +1,43 @@ +package com.pbd.psi.ui.add_transaction + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.EditText +import com.pbd.psi.R +import com.pbd.psi.databinding.FragmentAddTransactionBinding +import com.pbd.psi.repository.TransactionRepository +import com.pbd.psi.room.AppDatabase +import com.pbd.psi.room.Category + +class AddTransactionFragment : Fragment() { + + + private lateinit var binding: FragmentAddTransactionBinding + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = FragmentAddTransactionBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val inputName = binding.titleInput.text.toString() + val inputAmount = binding.amountInput.text.toString().toInt() + + val appDatabase = AppDatabase.getDatabase(requireContext()) + val repository = TransactionRepository(appDatabase) + val viewModel = AddTransactionViewModel(repository) + + binding.submitButton.setOnClickListener{ + viewModel.addTransaction(inputName, Category.EXPENSE, inputAmount) + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/pbd/psi/ui/add_transaction/AddTransactionViewModel.kt b/app/src/main/java/com/pbd/psi/ui/add_transaction/AddTransactionViewModel.kt new file mode 100644 index 0000000..692dcde --- /dev/null +++ b/app/src/main/java/com/pbd/psi/ui/add_transaction/AddTransactionViewModel.kt @@ -0,0 +1,18 @@ +package com.pbd.psi.ui.add_transaction + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.pbd.psi.repository.TransactionRepository +import com.pbd.psi.room.Category +import com.pbd.psi.room.TransactionEntity +import kotlinx.coroutines.launch +import java.time.LocalDateTime +import java.util.Date +class AddTransactionViewModel(private val repository: TransactionRepository) : ViewModel() { + fun addTransaction(name: String, category: Category, amount: Int) = viewModelScope.launch { + val curDate = Date() + val transaction = TransactionEntity(0, name, category, amount, curDate, "dummy location", 10.0, 10.0) + repository.addTransaction(transaction) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pbd/psi/ui/add_transaction/ExpenseFragment.kt b/app/src/main/java/com/pbd/psi/ui/add_transaction/ExpenseFragment.kt deleted file mode 100644 index f35255f..0000000 --- a/app/src/main/java/com/pbd/psi/ui/add_transaction/ExpenseFragment.kt +++ /dev/null @@ -1,60 +0,0 @@ -package com.pbd.psi.ui.add_transaction - -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.pbd.psi.R - -// TODO: Rename parameter arguments, choose names that match -// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER -private const val ARG_PARAM1 = "param1" -private const val ARG_PARAM2 = "param2" - -/** - * A simple [Fragment] subclass. - * Use the [ExpenseFragment.newInstance] factory method to - * create an instance of this fragment. - */ -class ExpenseFragment : Fragment() { - // TODO: Rename and change types of parameters - private var param1: String? = null - private var param2: String? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - arguments?.let { - param1 = it.getString(ARG_PARAM1) - param2 = it.getString(ARG_PARAM2) - } - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_expense, container, false) - } - - companion object { - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment ExpenseFragment. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - ExpenseFragment().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/pbd/psi/ui/add_transaction/IncomeFragment.kt b/app/src/main/java/com/pbd/psi/ui/add_transaction/IncomeFragment.kt deleted file mode 100644 index 7c0bf65..0000000 --- a/app/src/main/java/com/pbd/psi/ui/add_transaction/IncomeFragment.kt +++ /dev/null @@ -1,60 +0,0 @@ -package com.pbd.psi.ui.add_transaction - -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.pbd.psi.R - -// TODO: Rename parameter arguments, choose names that match -// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER -private const val ARG_PARAM1 = "param1" -private const val ARG_PARAM2 = "param2" - -/** - * A simple [Fragment] subclass. - * Use the [IncomeFragment.newInstance] factory method to - * create an instance of this fragment. - */ -class IncomeFragment : Fragment() { - // TODO: Rename and change types of parameters - private var param1: String? = null - private var param2: String? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - arguments?.let { - param1 = it.getString(ARG_PARAM1) - param2 = it.getString(ARG_PARAM2) - } - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_income, container, false) - } - - companion object { - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment IncomeFragment. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - IncomeFragment().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/pbd/psi/ui/transaction/TransactionAdapter.kt b/app/src/main/java/com/pbd/psi/ui/transaction/TransactionAdapter.kt deleted file mode 100644 index 8165a50..0000000 --- a/app/src/main/java/com/pbd/psi/ui/transaction/TransactionAdapter.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.pbd.psi.ui.transaction - -import android.view.View -import android.view.ViewGroup -import androidx.recyclerview.widget.RecyclerView - -class TransactionAdapter: RecyclerView.Adapter<TransactionAdapter.ViewHolder>() { - class ViewHolder(val view:View): RecyclerView.ViewHolder(view) - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - TODO("Not yet implemented") - } - - override fun getItemCount(): Int { - TODO("Not yet implemented") - } - - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - TODO("Not yet implemented") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/pbd/psi/ui/transaction/TransactionFragment.kt b/app/src/main/java/com/pbd/psi/ui/transaction/TransactionFragment.kt index cc70303..87353e6 100644 --- a/app/src/main/java/com/pbd/psi/ui/transaction/TransactionFragment.kt +++ b/app/src/main/java/com/pbd/psi/ui/transaction/TransactionFragment.kt @@ -1,10 +1,15 @@ package com.pbd.psi.ui.transaction +import android.content.Intent import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout +import androidx.fragment.app.viewModels +import androidx.recyclerview.widget.LinearLayoutManager +import com.pbd.psi.AddTransactionActivity import com.pbd.psi.R import com.pbd.psi.databinding.FragmentTransactionBinding import com.pbd.psi.repository.TransactionRepository @@ -12,7 +17,7 @@ import com.pbd.psi.room.AppDatabase class TransactionFragment : Fragment() { private lateinit var binding: FragmentTransactionBinding - + private val adapter by lazy { TransactionViewAdapter() } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -21,11 +26,26 @@ class TransactionFragment : Fragment() { val appDatabase = AppDatabase.getDatabase(requireContext()) val repository = TransactionRepository(appDatabase) val viewModel = TransactionViewModel(repository) -// binding.transList.text = viewModel.transactionList + viewModel.transactionList.observe(viewLifecycleOwner) { transItems -> + if (transItems != null) { + val transList = ArrayList(transItems) + adapter.transactionItems = transList + } + } return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + binding.transactionList.apply { + setHasFixedSize(true) + layoutManager = LinearLayoutManager(context) + adapter = adapter + } + binding.addButton.setOnClickListener{ + val intent = Intent(requireContext(), AddTransactionActivity::class.java) + startActivity(intent) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/pbd/psi/ui/transaction/TransactionViewAdapter.kt b/app/src/main/java/com/pbd/psi/ui/transaction/TransactionViewAdapter.kt new file mode 100644 index 0000000..00ee327 --- /dev/null +++ b/app/src/main/java/com/pbd/psi/ui/transaction/TransactionViewAdapter.kt @@ -0,0 +1,69 @@ +package com.pbd.psi.ui.transaction + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.pbd.psi.R +import com.pbd.psi.databinding.ExpenseCardBinding +import com.pbd.psi.databinding.IncomeCardBinding +import com.pbd.psi.room.Category +import com.pbd.psi.room.TransactionEntity +import java.lang.IllegalArgumentException + +class TransactionViewAdapter : RecyclerView.Adapter<TransactionViewHolder>() { + + var transactionItems = arrayListOf<TransactionEntity>() + set(value) { + field = value + notifyDataSetChanged() + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TransactionViewHolder { + when(viewType){ + R.layout.income_card -> return TransactionViewHolder.IncomeViewHolder( + IncomeCardBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + + R.layout.expense_card -> return TransactionViewHolder.ExpenseViewHolder( + ExpenseCardBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + else -> throw IllegalArgumentException("Invalid ViewType Provided") + } + } + + override fun onBindViewHolder(holder: TransactionViewHolder, position: Int) { + when(holder){ + is TransactionViewHolder.IncomeViewHolder -> + holder.bind( + transactionItems[position].name, + transactionItems[position].date.toString(), + transactionItems[position].amount + ) + is TransactionViewHolder.ExpenseViewHolder -> + holder.bind( + transactionItems[position].name, + transactionItems[position].date.toString(), + transactionItems[position].amount, + transactionItems[position].location, + transactionItems[position].longitude, + transactionItems[position].latitude, + ) + } + } + + override fun getItemCount(): Int = transactionItems.size + + override fun getItemViewType(position: Int): Int { + return when(transactionItems[position].category) { + Category.INCOME -> R.layout.income_card + Category.EXPENSE -> R.layout.expense_card + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pbd/psi/ui/transaction/TransactionViewHolder.kt b/app/src/main/java/com/pbd/psi/ui/transaction/TransactionViewHolder.kt new file mode 100644 index 0000000..40085d3 --- /dev/null +++ b/app/src/main/java/com/pbd/psi/ui/transaction/TransactionViewHolder.kt @@ -0,0 +1,44 @@ +package com.pbd.psi.ui.transaction + +import android.content.Intent +import android.net.Uri +import android.widget.Toast +import androidx.recyclerview.widget.RecyclerView +import androidx.viewbinding.ViewBinding +import com.pbd.psi.databinding.ExpenseCardBinding +import com.pbd.psi.databinding.IncomeCardBinding + +sealed class TransactionViewHolder(binding: ViewBinding) : RecyclerView.ViewHolder(binding.root) { + class ExpenseViewHolder(private val binding: ExpenseCardBinding) : TransactionViewHolder(binding){ + fun bind(name: String, date: String, nominal: Int, location: String, longitude: Double, latitude: Double){ + binding.expenseName.text = name + binding.expenseDate.text = date + binding.expenseNominal.text = "-Rp".plus(nominal.formatDecimalSeparator()) + binding.expenseLocation.text = location + binding.expenseLocation.setOnClickListener { + val gmmIntentUri = Uri.parse("geo:0,0?q=" + latitude.toBigDecimal().toPlainString() + "," + longitude.toBigDecimal().toPlainString() + "(" + location +")") + val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri) + mapIntent.setPackage("com.google.android.apps.maps") + val locationContext = binding.expenseLocation.context + if (mapIntent.resolveActivity(locationContext.packageManager) != null) { + locationContext.startActivity(mapIntent) + } else { + Toast.makeText(locationContext, "Please install google maps to access location", Toast.LENGTH_SHORT).show(); + } + } + } + + } + + class IncomeViewHolder(private val binding: IncomeCardBinding) : TransactionViewHolder(binding) { + fun bind(name: String, date: String, nominal: Int){ + binding.incomeName.text = name + binding.incomeDate.text = date + binding.incomeNominal.text = "Rp".plus(nominal.formatDecimalSeparator()) + } + } + + protected fun Int.formatDecimalSeparator(): String { + return toString().reversed().chunked(3).joinToString(".").reversed() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pbd/psi/ui/transaction/TransactionViewModel.kt b/app/src/main/java/com/pbd/psi/ui/transaction/TransactionViewModel.kt index f92ec63..82d73e9 100644 --- a/app/src/main/java/com/pbd/psi/ui/transaction/TransactionViewModel.kt +++ b/app/src/main/java/com/pbd/psi/ui/transaction/TransactionViewModel.kt @@ -16,10 +16,6 @@ class TransactionViewModel( repository.getTransById(id) } - fun addTransaction(trans: TransactionEntity) = viewModelScope.launch { - repository.addTransaction(trans) - } - fun updateTransaction(trans: TransactionEntity) = viewModelScope.launch { repository.updateTransaction(trans) } @@ -28,7 +24,4 @@ class TransactionViewModel( repository.deleteTransaction(trans) } - companion object { - - } } \ No newline at end of file diff --git a/app/src/main/res/drawable/add_icon.xml b/app/src/main/res/drawable/add_icon.xml new file mode 100644 index 0000000..857c1c9 --- /dev/null +++ b/app/src/main/res/drawable/add_icon.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="48dp" + android:height="48dp" + android:viewportWidth="48" + android:viewportHeight="48"> + <path + android:fillColor="#2567F9" + android:pathData="M38,6L10,6c-2.21,0 -4,1.79 -4,4v28c0,2.21 1.79,4 4,4h28c2.21,0 4,-1.79 4,-4L42,10c0,-2.21 -1.79,-4 -4,-4zM34,26h-8v8h-4v-8h-8v-4h8v-8h4v8h8v4z"/> +</vector> diff --git a/app/src/main/res/drawable/expense_symbol.xml b/app/src/main/res/drawable/expense_symbol.xml new file mode 100644 index 0000000..a38c115 --- /dev/null +++ b/app/src/main/res/drawable/expense_symbol.xml @@ -0,0 +1,15 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="55dp" + android:height="55dp" + android:viewportWidth="55" + android:viewportHeight="55"> + <path + android:pathData="M27.5,27.5m-26.5,0a26.5,26.5 0,1 1,53 0a26.5,26.5 0,1 1,-53 0" + android:strokeWidth="2" + android:fillColor="#930000" + android:strokeColor="#DE7979"/> + <path + android:pathData="M35.761,17H33.825L32.98,20.23H28.151C27.249,20.23 26.647,21.311 26.801,22.579L26.915,23.522C26.693,23.492 26.466,23.476 26.236,23.476H24.624C21.999,23.476 19.846,25.5 19.641,28.072C18.694,28.339 18,29.209 18,30.242V30.608C18,31.657 18.716,32.538 19.685,32.79C20.06,35.18 22.129,37.009 24.624,37.009H26.236C27.087,37.009 27.889,36.796 28.59,36.421C28.809,36.782 29.202,37.025 29.623,37.025H35.186C35.776,37.025 36.313,36.545 36.388,35.932L38.008,22.579C38.162,21.311 37.561,20.23 36.657,20.23H34.916L35.761,17ZM29.227,27.987H21.666C22.005,26.505 23.331,25.4 24.915,25.4H25.978C27.562,25.4 28.888,26.505 29.227,27.987ZM32.893,30.242C32.893,29.197 32.182,28.318 31.218,28.062C31.087,26.464 30.204,25.078 28.924,24.26L28.663,22.167H36.083L34.47,35.087H30.276L30.262,34.973C30.725,34.344 31.045,33.604 31.173,32.799C32.16,32.559 32.893,31.669 32.893,30.608V30.242ZM21.772,32.863H29.121C28.663,34.157 27.429,35.085 25.978,35.085H24.915C23.464,35.085 22.229,34.157 21.772,32.863ZM30.484,29.911H20.409C20.159,29.911 19.957,30.112 19.957,30.362V30.454C19.957,30.703 20.159,30.906 20.409,30.906H30.484C30.734,30.906 30.936,30.703 30.936,30.454V30.362C30.936,30.112 30.734,29.911 30.484,29.911Z" + android:fillColor="#DE7979" + android:fillType="evenOdd"/> +</vector> diff --git a/app/src/main/res/drawable/income_symbol.xml b/app/src/main/res/drawable/income_symbol.xml new file mode 100644 index 0000000..0159210 --- /dev/null +++ b/app/src/main/res/drawable/income_symbol.xml @@ -0,0 +1,15 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="55dp" + android:height="55dp" + android:viewportWidth="55" + android:viewportHeight="55"> + <path + android:pathData="M27.5,27.5m-26.5,0a26.5,26.5 0,1 1,53 0a26.5,26.5 0,1 1,-53 0" + android:strokeWidth="2" + android:fillColor="#007F73" + android:strokeColor="#4CCD99"/> + <path + android:pathData="M28,19H36.334C37.254,19 38,19.746 38,20.666V27.167C38,28.088 37.254,28.834 36.334,28.834H28H19.666C18.746,28.834 18,28.088 18,27.167V20.666C18,19.746 18.746,19 19.666,19H28ZM24.125,20.817H19.858V27.017H24.125C23.427,26.171 23.008,25.092 23.008,23.917C23.008,22.742 23.427,21.663 24.125,20.817ZM31.875,27.017C32.573,26.171 32.992,25.092 32.992,23.917C32.992,22.742 32.573,21.663 31.875,20.817H36.143V27.017H31.875ZM28.016,20.817C29.738,20.817 31.135,22.205 31.135,23.917C31.135,25.628 29.738,27.017 28.016,27.017C26.295,27.017 24.899,25.628 24.899,23.917C24.899,22.205 26.295,20.817 28.016,20.817ZM27.997,23.004C27.859,23.004 27.791,23.054 27.791,23.153C27.791,23.231 27.835,23.289 27.923,23.33C28.01,23.372 28.151,23.419 28.342,23.47C28.582,23.536 28.781,23.604 28.939,23.671C29.097,23.739 29.236,23.845 29.354,23.991C29.473,24.136 29.532,24.327 29.532,24.563C29.532,24.87 29.433,25.114 29.235,25.295C29.037,25.475 28.776,25.59 28.453,25.638V26.391H27.657V25.624C27.43,25.585 27.21,25.522 26.997,25.434C26.784,25.346 26.596,25.239 26.434,25.115L26.846,24.276C27.016,24.423 27.228,24.549 27.483,24.652C27.74,24.756 27.954,24.809 28.127,24.809C28.21,24.809 28.275,24.793 28.323,24.763C28.371,24.733 28.395,24.685 28.395,24.622C28.395,24.544 28.349,24.484 28.258,24.442C28.167,24.398 28.024,24.352 27.829,24.305C27.593,24.244 27.395,24.18 27.236,24.115C27.079,24.049 26.942,23.948 26.827,23.81C26.712,23.673 26.654,23.489 26.654,23.258C26.654,22.981 26.743,22.747 26.92,22.561C27.098,22.374 27.343,22.25 27.657,22.189V21.455H28.453V22.174C28.657,22.2 28.855,22.247 29.048,22.314C29.239,22.381 29.409,22.46 29.556,22.553L29.153,23.403C28.971,23.297 28.768,23.204 28.544,23.125C28.32,23.044 28.138,23.004 27.997,23.004ZM20.75,30.1H35.25C35.743,30.1 36.143,30.499 36.143,30.992V31.056C36.143,31.55 35.743,31.949 35.25,31.949H20.75C20.257,31.949 19.858,31.55 19.858,31.056V30.992C19.858,30.499 20.257,30.1 20.75,30.1ZM33.408,33.183H22.626C22.141,33.183 21.748,33.576 21.748,34.061V34.122C21.748,34.607 22.141,35 22.626,35H33.408C33.892,35 34.285,34.607 34.285,34.122V34.061C34.285,33.576 33.892,33.183 33.408,33.183Z" + android:fillColor="#4CCD99" + android:fillType="evenOdd"/> +</vector> diff --git a/app/src/main/res/drawable/location_icon.xml b/app/src/main/res/drawable/location_icon.xml new file mode 100644 index 0000000..e83a497 --- /dev/null +++ b/app/src/main/res/drawable/location_icon.xml @@ -0,0 +1,12 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="15dp" + android:height="15dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#8E949A" + android:pathData="M12,0A10.011,10.011 0,0 0,2 10c0,5.282 8.4,12.533 9.354,13.343l0.646,0.546 0.646,-0.546C13.6,22.533 22,15.282 22,10A10.011,10.011 0,0 0,12 0ZM12,15a5,5 0,1 1,5 -5A5.006,5.006 0,0 1,12 15Z"/> + <path + android:fillColor="#8E949A" + android:pathData="M12,10m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0"/> +</vector> diff --git a/app/src/main/res/layout/activity_add_transaction.xml b/app/src/main/res/layout/activity_add_transaction.xml new file mode 100644 index 0000000..ef947c8 --- /dev/null +++ b/app/src/main/res/layout/activity_add_transaction.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:background="@color/primaryBlack" + xmlns:app="http://schemas.android.com/apk/res-auto" + tools:context=".ui.transaction.TransactionFragment"> + + <com.google.android.material.appbar.AppBarLayout + android:id="@+id/twibbon_header" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@color/primaryBlack" + app:layout_constraintTop_toTopOf="parent"> + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="wrap_content"> + <TextView + android:id="@+id/twibbon_header_text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:fontFamily="@font/montserrat" + android:text="@string/transaction_header" + android:textColor="@color/white" + android:textSize="20sp" + android:layout_marginVertical="8dp" + android:layout_gravity="center" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + </androidx.constraintlayout.widget.ConstraintLayout> + </com.google.android.material.appbar.AppBarLayout> + <FrameLayout + android:id="@+id/placeholderForm" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginStart="0dp" + android:layout_marginEnd="0dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent"> + </FrameLayout> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/expense_card.xml b/app/src/main/res/layout/expense_card.xml new file mode 100644 index 0000000..d439dee --- /dev/null +++ b/app/src/main/res/layout/expense_card.xml @@ -0,0 +1,84 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingHorizontal="10dp" + android:layout_marginBottom="20dp" + android:background="@color/primaryDarker" + xmlns:app="http://schemas.android.com/apk/res-auto" > + <RelativeLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + <ImageView + android:id="@+id/transaction_symbol" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="20dp" + android:contentDescription="@string/transaction_fragment" + android:src="@drawable/expense_symbol"/> + <TextView + android:id="@+id/expense_name" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/expense" + android:textColor="@color/white" + android:layout_toEndOf="@+id/transaction_symbol" + /> + <TextView + android:id="@+id/expense_date" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/transaction_fragment" + android:layout_below="@+id/expense_name" + android:textColor="@color/textGrey" + android:layout_toEndOf="@+id/transaction_symbol"/> + + </RelativeLayout> + + <RelativeLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + <TextView + android:id="@+id/expense_nominal" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textSize="15sp" + android:text="-Rp34.000" + android:textColor="@color/lightRed" /> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/expense_location_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@+id/expense_nominal"> + + <ImageView + android:id="@+id/location_icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/location_icon" + android:contentDescription="@string/expense" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"/> + + <TextView + android:id="@+id/expense_location" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/expense" + android:textSize="11sp" + android:textColor="@color/white" + android:layout_marginStart="5dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/location_icon" + app:layout_constraintTop_toTopOf="parent"/> + </androidx.constraintlayout.widget.ConstraintLayout> + + </RelativeLayout> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_add_trans.xml b/app/src/main/res/layout/fragment_add_trans.xml deleted file mode 100644 index 0027c73..0000000 --- a/app/src/main/res/layout/fragment_add_trans.xml +++ /dev/null @@ -1,97 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical" - android:background="@color/primaryBlack" - xmlns:app="http://schemas.android.com/apk/res-auto" - tools:context=".ui.transaction.TransactionFragment"> - - <com.google.android.material.appbar.AppBarLayout - android:id="@+id/twibbon_header" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/primaryBlack" - app:layout_constraintTop_toTopOf="parent"> - <androidx.constraintlayout.widget.ConstraintLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - <TextView - android:id="@+id/twibbon_header_text" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:fontFamily="@font/montserrat" - android:text="@string/transaction_header" - android:textColor="@color/white" - android:textSize="20sp" - android:layout_marginVertical="8dp" - android:layout_gravity="center" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - </androidx.constraintlayout.widget.ConstraintLayout> - </com.google.android.material.appbar.AppBarLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical" - android:gravity="center" - android:padding="15dp" - > - - <androidx.cardview.widget.CardView - android:id="@+id/cart_card_view" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="8dp" - app:cardBackgroundColor="@color/primaryDarker" - app:layout_constraintTop_toTopOf="parent" - app:cardCornerRadius="20dp"> - <androidx.constraintlayout.widget.ConstraintLayout - android:id="@+id/menu_data" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingHorizontal="10dp" - android:paddingTop="15dp" - android:paddingBottom="35dp"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent"> - - <EditText - android:id="@+id/title_input" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/white" - android:hint="@string/title_hint" - android:inputType="text" - android:padding="10dp" - app:layout_constraintBottom_toTopOf="@id/amount_input" - app:layout_constraintWidth="match_parent" - android:layout_marginBottom="20dp" - /> - - <EditText - android:id="@+id/amount_input" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/white" - android:hint="@string/amount_hint" - android:inputType="number" - android:padding="10dp" - app:layout_constraintTop_toBottomOf="@+id/title_input" /> - </LinearLayout> - - </androidx.constraintlayout.widget.ConstraintLayout> - </androidx.cardview.widget.CardView> - </LinearLayout> -</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_add_transaction.xml b/app/src/main/res/layout/fragment_add_transaction.xml new file mode 100644 index 0000000..bc5bf8d --- /dev/null +++ b/app/src/main/res/layout/fragment_add_transaction.xml @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:padding="15dp" + tools:context=".ui.add_transaction.AddTransactionFragment"> + + <androidx.cardview.widget.CardView + android:id="@+id/form_card_view" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="8dp" + app:cardBackgroundColor="@color/primaryDarker" + app:layout_constraintTop_toTopOf="parent" + app:cardCornerRadius="20dp"> + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/menu_data" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingHorizontal="10dp" + android:paddingTop="15dp" + android:paddingBottom="35dp"> + + + <EditText + android:id="@+id/title_input" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@color/white" + android:hint="@string/title_hint" + android:inputType="text" + android:padding="10dp" + app:layout_constraintBottom_toTopOf="@id/amount_input" + app:layout_constraintWidth="match_parent" + android:layout_marginBottom="20dp" + /> + + <EditText + android:id="@+id/amount_input" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@color/white" + android:hint="@string/amount_hint" + android:inputType="number" + android:padding="10dp" + android:layout_marginTop="20dp" + app:layout_constraintTop_toBottomOf="@+id/title_input" /> + </androidx.constraintlayout.widget.ConstraintLayout> + </androidx.cardview.widget.CardView> + + <Button + android:id="@+id/submit_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textSize="15sp" + app:layout_constraintTop_toBottomOf="@+id/form_card_view" + app:layout_constraintStart_toStartOf="parent" + android:text="Send"/> +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_expense.xml b/app/src/main/res/layout/fragment_expense.xml deleted file mode 100644 index 8cf66b2..0000000 --- a/app/src/main/res/layout/fragment_expense.xml +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent" - tools:context=".ui.add_transaction.ExpenseFragment"> - - <!-- TODO: Update blank fragment layout --> - <TextView - android:layout_width="match_parent" - android:layout_height="match_parent" - android:text="@string/hello_blank_fragment" /> - -</FrameLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_income.xml b/app/src/main/res/layout/fragment_income.xml deleted file mode 100644 index 04beaeb..0000000 --- a/app/src/main/res/layout/fragment_income.xml +++ /dev/null @@ -1,64 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent" - tools:context=".ui.add_transaction.IncomeFragment" - android:background="@color/primaryDarker" - xmlns:app="http://schemas.android.com/apk/res-auto"> - - <androidx.cardview.widget.CardView - android:id="@+id/cart_card_view" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="8dp" - app:cardBackgroundColor="@color/primaryDarker" - app:layout_constraintTop_toTopOf="parent" - app:cardCornerRadius="20dp"> - <androidx.constraintlayout.widget.ConstraintLayout - android:id="@+id/menu_data" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingHorizontal="10dp" - android:paddingTop="15dp" - android:paddingBottom="35dp"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent"> - - <EditText - android:id="@+id/title_input" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/white" - android:hint="@string/title_hint" - android:inputType="text" - android:padding="10dp" - app:layout_constraintBottom_toTopOf="@id/amount_input" - app:layout_constraintWidth="match_parent" - android:layout_marginBottom="20dp" - android:autofillHints="name" - /> - - <EditText - android:id="@+id/amount_input" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/white" - android:hint="@string/amount_hint" - android:inputType="number" - android:padding="10dp" - android:autofillHints="postalCode" - app:layout_constraintTop_toBottomOf="@+id/title_input" /> - </LinearLayout> - - </androidx.constraintlayout.widget.ConstraintLayout> - </androidx.cardview.widget.CardView> - -</FrameLayout> \ 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 793a68c..9d226de 100644 --- a/app/src/main/res/layout/fragment_transaction.xml +++ b/app/src/main/res/layout/fragment_transaction.xml @@ -71,11 +71,11 @@ </RelativeLayout> - <Button + <ImageView android:id="@+id/add_button" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@string/retake" + android:src="@drawable/add_icon" app:layout_constraintBottom_toBottomOf="@id/transaction_info" app:layout_constraintEnd_toEndOf="@id/transaction_info" app:layout_constraintStart_toEndOf="@+id/balance_info" @@ -89,7 +89,7 @@ android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintHorizontal_chainStyle="spread" - app:layout_constraintBottom_toTopOf="@+id/transaction_list" + app:layout_constraintBottom_toTopOf="@+id/transaction_card" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/transaction_info"> @@ -181,7 +181,7 @@ </androidx.constraintlayout.widget.ConstraintLayout> <androidx.cardview.widget.CardView - android:id="@+id/transaction_list" + android:id="@+id/transaction_card" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" @@ -197,10 +197,12 @@ app:layout_constraintTop_toBottomOf="@id/transaction_legend"> <androidx.recyclerview.widget.RecyclerView + android:id="@+id/transaction_list" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_margin="10dp" - app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> + android:layout_marginTop="15dp" + android:layout_marginHorizontal="10dp" + tools:listitem="@layout/expense_card" /> </androidx.cardview.widget.CardView> diff --git a/app/src/main/res/layout/income_card.xml b/app/src/main/res/layout/income_card.xml new file mode 100644 index 0000000..82db951 --- /dev/null +++ b/app/src/main/res/layout/income_card.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + xmlns:app="http://schemas.android.com/apk/res-auto" > + <RelativeLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + <ImageView + android:id="@+id/income_symbol" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:contentDescription="@string/transaction_fragment" + android:src="@drawable/income_symbol"/> + <TextView + android:id="@+id/income_name" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/expense" + android:layout_toEndOf="@+id/income_symbol" + /> + <TextView + android:id="@+id/income_date" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/transaction_fragment" + android:layout_below="@+id/income_name" + android:layout_toEndOf="@+id/income_symbol"/> + + </RelativeLayout> + <TextView + android:id="@+id/income_nominal" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + android:text="2000" + /> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 0004959..1b3c7e2 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -15,6 +15,7 @@ <color name="primaryBlueLight">#447CF8</color> <color name="fragmentBlue">#898989</color> <color name="grey">#888888</color> + <color name="textGrey">#8E949A</color> <color name="darkRed">#930000</color> <color name="red">#DD0000</color> <color name="lightRed">#DE7979</color> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ecf7e71..5185885 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -42,6 +42,4 @@ <string name="all">Semua</string> - - </resources> -- GitLab