From 88c407a4eb26dbcdf6bde1c3f9965e91c6af0fd4 Mon Sep 17 00:00:00 2001 From: "Moch. Sofyan Firdaus" <13521083@std.stei.itb.ac.id> Date: Mon, 1 Apr 2024 17:17:28 +0700 Subject: [PATCH] feat: add transaction --- app/src/main/AndroidManifest.xml | 8 +++++--- .../bondoman/AddTransactionActivity.kt | 15 ++++++++++----- .../bondoman/room/TransactionEntity.kt | 8 ++++++-- .../ui/transaction/TransactionFragment.kt | 11 +++++++---- .../ui/transaction/TransactionViewModel.kt | 4 ++-- .../TransactionViewModelFactory.kt | 17 +++++++++++++++++ .../onionsquad/bondoman/util/DateConverter.kt | 19 +++++++++++++++++++ .../main/res/navigation/mobile_navigation.xml | 12 ++++++------ 8 files changed, 72 insertions(+), 22 deletions(-) create mode 100644 app/src/main/java/com/onionsquad/bondoman/ui/transaction/TransactionViewModelFactory.kt create mode 100644 app/src/main/java/com/onionsquad/bondoman/util/DateConverter.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4a51b78..497e69a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,17 +11,19 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Bondoman" - tools:targetApi="31"> + > <activity android:name=".MainActivity" - android:exported="true" - android:label="@string/app_name"> + android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> + <activity + android:name=".AddTransactionActivity" + android:exported="false"/> </application> </manifest> \ No newline at end of file diff --git a/app/src/main/java/com/onionsquad/bondoman/AddTransactionActivity.kt b/app/src/main/java/com/onionsquad/bondoman/AddTransactionActivity.kt index 7f8e861..3408874 100644 --- a/app/src/main/java/com/onionsquad/bondoman/AddTransactionActivity.kt +++ b/app/src/main/java/com/onionsquad/bondoman/AddTransactionActivity.kt @@ -6,14 +6,18 @@ import android.widget.Button import android.widget.EditText import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModelProvider +import com.onionsquad.bondoman.repository.TransactionRepository +import com.onionsquad.bondoman.room.TransactionDatabase import com.onionsquad.bondoman.room.TransactionEntity import com.onionsquad.bondoman.ui.transaction.TransactionViewModel -import java.text.SimpleDateFormat +import com.onionsquad.bondoman.ui.transaction.TransactionViewModelFactory import java.util.Date -import java.util.Locale class AddTransactionActivity : AppCompatActivity() { - private lateinit var viewModel: TransactionViewModel + + private val database by lazy { TransactionDatabase.getInstance(this) } + private val repository by lazy { TransactionRepository(database.transactionDao()) } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_add_transaction) @@ -23,7 +27,8 @@ class AddTransactionActivity : AppCompatActivity() { val categoryEditText: EditText = findViewById(R.id.categoryEditText) val locationEditText: EditText = findViewById(R.id.locationEditText) - viewModel = ViewModelProvider(this).get(TransactionViewModel::class.java) + val factory = TransactionViewModelFactory(repository) + val viewModel = ViewModelProvider(this, factory)[TransactionViewModel::class.java] val saveButton: Button = findViewById(R.id.saveButton) saveButton.setOnClickListener { @@ -33,7 +38,7 @@ class AddTransactionActivity : AppCompatActivity() { val location = locationEditText.text.toString() // Dapatkan tanggal saat ini - val currentDate = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(Date()) + val currentDate = Date() val transaction = TransactionEntity( title = title, diff --git a/app/src/main/java/com/onionsquad/bondoman/room/TransactionEntity.kt b/app/src/main/java/com/onionsquad/bondoman/room/TransactionEntity.kt index 8245254..66c1766 100644 --- a/app/src/main/java/com/onionsquad/bondoman/room/TransactionEntity.kt +++ b/app/src/main/java/com/onionsquad/bondoman/room/TransactionEntity.kt @@ -3,8 +3,12 @@ package com.onionsquad.bondoman.room import androidx.room.Entity import androidx.room.PrimaryKey import androidx.room.ColumnInfo +import androidx.room.TypeConverters +import com.onionsquad.bondoman.util.DateConverter +import java.util.Date @Entity(tableName = "transactions") +@TypeConverters(DateConverter::class) data class TransactionEntity( @PrimaryKey(autoGenerate = true) val id: Int = 0, @@ -18,8 +22,8 @@ data class TransactionEntity( @ColumnInfo(name = "category") val category: String, - @ColumnInfo(name = "date") - val date: String, + @ColumnInfo(name = "date", defaultValue = "CURRENT_TIMESTAMP") + val date: Date, @ColumnInfo(name = "location") val location: String diff --git a/app/src/main/java/com/onionsquad/bondoman/ui/transaction/TransactionFragment.kt b/app/src/main/java/com/onionsquad/bondoman/ui/transaction/TransactionFragment.kt index 915ec66..4ff1ccc 100644 --- a/app/src/main/java/com/onionsquad/bondoman/ui/transaction/TransactionFragment.kt +++ b/app/src/main/java/com/onionsquad/bondoman/ui/transaction/TransactionFragment.kt @@ -5,12 +5,12 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Button import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.onionsquad.bondoman.AddTransactionActivity -import com.onionsquad.bondoman.R import com.onionsquad.bondoman.databinding.FragmentTransactionBinding +import com.onionsquad.bondoman.repository.TransactionRepository +import com.onionsquad.bondoman.room.TransactionDatabase class TransactionFragment : Fragment() { @@ -20,13 +20,16 @@ class TransactionFragment : Fragment() { // onDestroyView. private val binding get() = _binding!! + private val database by lazy { TransactionDatabase.getInstance(requireContext().applicationContext) } + private val repository by lazy { TransactionRepository(database.transactionDao()) } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { - val transactionViewModel = - ViewModelProvider(this).get(TransactionViewModel::class.java) + val factory = TransactionViewModelFactory(repository) + val transactionViewModel = ViewModelProvider(this, factory)[TransactionViewModel::class.java] _binding = FragmentTransactionBinding.inflate(inflater, container, false) diff --git a/app/src/main/java/com/onionsquad/bondoman/ui/transaction/TransactionViewModel.kt b/app/src/main/java/com/onionsquad/bondoman/ui/transaction/TransactionViewModel.kt index a4e10ab..cf96283 100644 --- a/app/src/main/java/com/onionsquad/bondoman/ui/transaction/TransactionViewModel.kt +++ b/app/src/main/java/com/onionsquad/bondoman/ui/transaction/TransactionViewModel.kt @@ -3,9 +3,9 @@ package com.onionsquad.bondoman.ui.transaction import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.launch -import com.onionsquad.bondoman.room.* import com.onionsquad.bondoman.repository.TransactionRepository +import com.onionsquad.bondoman.room.TransactionEntity +import kotlinx.coroutines.launch class TransactionViewModel(private val repository : TransactionRepository) : ViewModel() { var listTransactions: LiveData<List<TransactionEntity>> = repository.listTransactions diff --git a/app/src/main/java/com/onionsquad/bondoman/ui/transaction/TransactionViewModelFactory.kt b/app/src/main/java/com/onionsquad/bondoman/ui/transaction/TransactionViewModelFactory.kt new file mode 100644 index 0000000..d318bad --- /dev/null +++ b/app/src/main/java/com/onionsquad/bondoman/ui/transaction/TransactionViewModelFactory.kt @@ -0,0 +1,17 @@ +package com.onionsquad.bondoman.ui.transaction + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import com.onionsquad.bondoman.repository.TransactionRepository + +class TransactionViewModelFactory(private val repository: TransactionRepository) : + ViewModelProvider.Factory { + + override fun <T : ViewModel> create(modelClass: Class<T>): T { + if (modelClass.isAssignableFrom(TransactionViewModel::class.java)) { + @Suppress("UNCHECKED_CAST") + return TransactionViewModel(repository) as T + } + throw IllegalArgumentException("Unknown ViewModel class") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/onionsquad/bondoman/util/DateConverter.kt b/app/src/main/java/com/onionsquad/bondoman/util/DateConverter.kt new file mode 100644 index 0000000..408d43f --- /dev/null +++ b/app/src/main/java/com/onionsquad/bondoman/util/DateConverter.kt @@ -0,0 +1,19 @@ +package com.onionsquad.bondoman.util + +import androidx.room.TypeConverter +import java.util.Date + +object DateConverter { + + @TypeConverter + @JvmStatic + fun fromTimestamp(value: Long?): Date? { + return value?.let { Date(it) } + } + + @TypeConverter + @JvmStatic + fun dateToTimestamp(value: Date?): Long? { + return value?.time + } +} \ No newline at end of file diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index fc575e8..f7d84c6 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -7,21 +7,21 @@ <fragment android:id="@+id/navigation_transaction" - android:name="com.onionsquad.bondoman.ui.graph.GraphFragment" + android:name="com.onionsquad.bondoman.ui.transaction.TransactionFragment" android:label="@string/title_transaction" - tools:layout="@layout/fragment_graph" /> + tools:layout="@layout/fragment_transaction" /> <fragment android:id="@+id/navigation_scan" - android:name="com.onionsquad.bondoman.ui.transaction.TransactionFragment" + android:name="com.onionsquad.bondoman.ui.scan.ScanFragment" android:label="@string/title_scan" - tools:layout="@layout/fragment_transaction" /> + tools:layout="@layout/fragment_scan" /> <fragment android:id="@+id/navigation_graph" - android:name="com.onionsquad.bondoman.ui.scan.ScanFragment" + android:name="com.onionsquad.bondoman.ui.graph.GraphFragment" android:label="@string/title_graph" - tools:layout="@layout/fragment_scan" /> + tools:layout="@layout/fragment_graph" /> <fragment android:id="@+id/navigation_settings" android:name="com.onionsquad.bondoman.ui.settings.SettingsFragment" -- GitLab