diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f1aae8a9d8231e3a1e7e12b6685382cc9fe6e23f..49883f8e1dfab006da4e993018430689c9af63b1 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 0000000000000000000000000000000000000000..953c18b4ed1ce2ab660e74d5ab376544227dd29b --- /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 04d804a612f177eccb6647906f9348cfc4b4b626..7a02105f48f9369f12d04a1605ade6a964ade56e 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 dee6eeb59ff0d2ab4d2c4c24d36001166e70fc86..0beca3e4d1686c63a4a6c1d7ebe4d619aefaeef2 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 f4e7024aa214c21e7ce583ba06f73be5039f2910..cf094ecab6419944aa1b1c0ab076f12f3ff6a455 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 e7a721a54a9aa8db1df8d3fda0fbf90f21a389b9..4c2bcbe46222ed145179549dd8664ef399a164b9 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 4ab80d9261917c4af65dcd0a31ec639fa1383499..0000000000000000000000000000000000000000 --- 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 0000000000000000000000000000000000000000..ccf7199ec3e8dc63f1c8a4bd644d7d484acc1dfe --- /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 0000000000000000000000000000000000000000..692dcdee42b29a7ccf3271e928196b086e62598b --- /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 f35255f9aa184292cff87344670661b0b5bf30af..0000000000000000000000000000000000000000 --- 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 7c0bf65a82c9b666ca592046a7bf6702bbca789a..0000000000000000000000000000000000000000 --- 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 8165a500d4e4f2104dede992a7f5251960896c5c..0000000000000000000000000000000000000000 --- 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 cc70303f4966c30279e4bc21c3397d43dbe4a935..87353e69098860de1d005649526dc9428a5a4dff 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 0000000000000000000000000000000000000000..00ee32701eda0351bbc8aee7b71ba5e235f8a4ee --- /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 0000000000000000000000000000000000000000..40085d38eeb2907a145fda793e7e834f33cb1942 --- /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 f92ec63319a7416d0f9de8c86180d3a7f207be09..82d73e99e87706ecb12f6f712c0819e71fb5b854 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 0000000000000000000000000000000000000000..857c1c9b3c0c4a144441b1720d8e0486dccf497d --- /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 0000000000000000000000000000000000000000..a38c1153e0992d03a3574756923562af95294f9f --- /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 0000000000000000000000000000000000000000..01592105297fc21687bec6141c488fc0294ed8aa --- /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 0000000000000000000000000000000000000000..e83a497c0ff3975e720211b5e7236ed3096a9ab0 --- /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 0000000000000000000000000000000000000000..ef947c88ac720d24d6458d9e6b957940953df088 --- /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 0000000000000000000000000000000000000000..d439dee7930ef9aa334ec58e84bc973bae3b3a34 --- /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 0027c7358abf40df4421f9b3fdb69e730c727c3e..0000000000000000000000000000000000000000 --- 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 0000000000000000000000000000000000000000..bc5bf8dcbb924dc5e7064502bebc181eaf32692e --- /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 8cf66b24a54ff3dc48417323f6e31a58571a2007..0000000000000000000000000000000000000000 --- 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 04beaeb378c24fd5f0c5b70e02b0dd8130e003da..0000000000000000000000000000000000000000 --- 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 793a68c847c10d61678d1b5d99af648bf520c4f1..9d226de3b09c1192d7aa9b98d88e417e20df123c 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 0000000000000000000000000000000000000000..82db951a281f3aa620e413027477ac4db176f402 --- /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 00049594dd91aeabef140e626a37ec611a02c57e..1b3c7e234a8fab293289390ac21b7c7887dde84c 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 ecf7e71f56d22f5f398063aed142da7187f1cfdc..5185885b0eb4cda02452e41dbc4b4df3d091f0cd 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>