diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 0c0c3383890637b4721df1f49d0b229e55c0f361..a66b819ba559ff9fdfae0152fb801e344d77af1e 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -3,7 +3,20 @@ <component name="deploymentTargetDropDown"> <value> <entry key="app"> - <State /> + <State> + <targetSelectedWithDropDown> + <Target> + <type value="QUICK_BOOT_TARGET" /> + <deviceKey> + <Key> + <type value="VIRTUAL_DEVICE_PATH" /> + <value value="C:\Users\alilo\.android\avd\Medium_Phone_API_34.avd" /> + </Key> + </deviceKey> + </Target> + </targetSelectedWithDropDown> + <timeTargetWasSelectedWithDropDown value="2024-03-31T12:50:50.834909800Z" /> + </State> </entry> </value> </component> diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 04056f64ca88cadbf3a5f930e66e19ab323d9bf5..c10d88c9eea0c196636a610e5db54b854efdd1ee 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -3,6 +3,7 @@ plugins { id("org.jetbrains.kotlin.android") id("kotlin-android") id("kotlin-kapt") + id("kotlin-parcelize") } android { @@ -43,11 +44,12 @@ android { dependencies { val navVersion = "2.7.7" + implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0") implementation("androidx.core:core-ktx:1.12.0") implementation("androidx.appcompat:appcompat:1.6.1") implementation("androidx.navigation:navigation-fragment-ktx:$navVersion") implementation("androidx.navigation:navigation-ui-ktx:$navVersion") - implementation("com.google.android.material:material:1.9.0") + implementation("com.google.android.material:material:1.11.0") implementation("com.squareup.retrofit2:retrofit:2.9.0") implementation("com.squareup.retrofit2:converter-gson:2.9.0") testImplementation("junit:junit:4.13.2") @@ -55,26 +57,13 @@ dependencies { androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") implementation("androidx.room:room-runtime:2.6.1") - annotationProcessor("androidx.room:room-compiler:2.6.1") + kapt("androidx.room:room-compiler:2.6.1") kapt("androidx.room:room-compiler:2.6.1") implementation("org.apache.poi:poi:5.2.2") implementation("org.apache.poi:poi-ooxml:5.2.2") - - - - - - - - - - - - - - - + // Graph + implementation("com.github.PhilJay:MPAndroidChart:v3.1.0") } \ No newline at end of file diff --git a/app/src/main/java/com/atm/bondowowo/adapter/TransactionAdapter.kt b/app/src/main/java/com/atm/bondowowo/adapter/TransactionAdapter.kt index d1c5c5ca5b066e8631b919b59ef2a57e05753258..4e11c819090a74697c44e55bb435c518aaa8b52e 100644 --- a/app/src/main/java/com/atm/bondowowo/adapter/TransactionAdapter.kt +++ b/app/src/main/java/com/atm/bondowowo/adapter/TransactionAdapter.kt @@ -6,8 +6,8 @@ import android.view.ViewGroup import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.atm.bondowowo.R -import com.atm.bondowowo.data.entity.Transaction -class TransactionAdapter(var list: List<Transaction>) : RecyclerView.Adapter<TransactionAdapter.ViewHolder>() { +import com.atm.bondowowo.data.local.entity.TransactionEntity +class TransactionAdapter(var list: List<TransactionEntity>) : RecyclerView.Adapter<TransactionAdapter.ViewHolder>() { private lateinit var dialog: Dialog diff --git a/app/src/main/java/com/atm/bondowowo/data/dao/TransactionDao.kt b/app/src/main/java/com/atm/bondowowo/data/dao/TransactionDao.kt deleted file mode 100644 index bc0dd890c52b99ea23a13a83507a3c90d58b22ab..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/atm/bondowowo/data/dao/TransactionDao.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.atm.bondowowo.data.dao - -import androidx.room.Dao -import androidx.room.Delete -import androidx.room.Insert -import androidx.room.Query -import androidx.room.Update -import com.atm.bondowowo.data.entity.Transaction - -@Dao -interface TransactionDao { - @Query("SELECT * FROM `Transaction`") - fun getAll(): List<Transaction> - - @Insert - fun insertAll(vararg transactions: Transaction) - - @Delete - fun delete(transaction: Transaction) - - @Query("SELECT * FROM `Transaction` WHERE id = :id") - fun get(id: Int): Transaction - - @Update - fun update(transaction: Transaction) -} \ No newline at end of file diff --git a/app/src/main/java/com/atm/bondowowo/data/local/dao/TransactionDao.kt b/app/src/main/java/com/atm/bondowowo/data/local/dao/TransactionDao.kt new file mode 100644 index 0000000000000000000000000000000000000000..666f838100b9dbefa4e788d9ee71bc1293abbe4b --- /dev/null +++ b/app/src/main/java/com/atm/bondowowo/data/local/dao/TransactionDao.kt @@ -0,0 +1,26 @@ +package com.atm.bondowowo.data.local.dao + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.Query +import androidx.room.Update +import com.atm.bondowowo.data.local.entity.TransactionEntity + +@Dao +interface TransactionDao { + @Query("SELECT * FROM TransactionEntity") + fun getAll(): List<TransactionEntity> + + @Insert + fun insertAll(vararg transactionEntities: TransactionEntity) + + @Delete + fun delete(transactionEntity: TransactionEntity) + + @Query("SELECT * FROM TransactionEntity WHERE id = :id") + fun get(id: Int): TransactionEntity + + @Update + fun update(transactionEntity: TransactionEntity) +} \ No newline at end of file diff --git a/app/src/main/java/com/atm/bondowowo/data/AppDatabase.kt b/app/src/main/java/com/atm/bondowowo/data/local/database/AppDatabase.kt similarity index 68% rename from app/src/main/java/com/atm/bondowowo/data/AppDatabase.kt rename to app/src/main/java/com/atm/bondowowo/data/local/database/AppDatabase.kt index 37884407c02db6d46dc72c9fd1754f0a9a9cdc1a..12f533b9520501adc9e78950475646c67c6deb7a 100644 --- a/app/src/main/java/com/atm/bondowowo/data/AppDatabase.kt +++ b/app/src/main/java/com/atm/bondowowo/data/local/database/AppDatabase.kt @@ -1,14 +1,15 @@ -package com.atm.bondowowo.data +package com.atm.bondowowo.data.local.database import android.content.Context import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase import androidx.room.TypeConverters -import com.atm.bondowowo.data.dao.TransactionDao -import com.atm.bondowowo.data.entity.Transaction +import com.atm.bondowowo.data.local.dao.TransactionDao +import com.atm.bondowowo.data.local.entity.TransactionEntity +import com.atm.bondowowo.utils.Converters -@Database(entities = [Transaction::class], version = 1) +@Database(entities = [TransactionEntity::class], version = 2) @TypeConverters(Converters::class) abstract class AppDatabase: RoomDatabase() { abstract fun transactionDao(): TransactionDao @@ -16,7 +17,7 @@ abstract class AppDatabase: RoomDatabase() { companion object{ private var instance: AppDatabase? = null - fun getInstance(context: Context): AppDatabase{ + fun getInstance(context: Context): AppDatabase { if(instance == null){ instance = Room.databaseBuilder(context, AppDatabase::class.java, name = "app-database") .fallbackToDestructiveMigration() diff --git a/app/src/main/java/com/atm/bondowowo/data/entity/Transaction.kt b/app/src/main/java/com/atm/bondowowo/data/local/entity/TransactionEntity.kt similarity index 83% rename from app/src/main/java/com/atm/bondowowo/data/entity/Transaction.kt rename to app/src/main/java/com/atm/bondowowo/data/local/entity/TransactionEntity.kt index 70a4641819fa22c54f2bdbd3fa74deaba41dc1ff..85737264f17d64a336bdf7f2fd66ff0b41af908e 100644 --- a/app/src/main/java/com/atm/bondowowo/data/entity/Transaction.kt +++ b/app/src/main/java/com/atm/bondowowo/data/local/entity/TransactionEntity.kt @@ -1,4 +1,4 @@ -package com.atm.bondowowo.data.entity +package com.atm.bondowowo.data.local.entity import android.os.Parcel import android.os.Parcelable @@ -8,7 +8,7 @@ import androidx.room.PrimaryKey import java.time.LocalDateTime @Entity -data class Transaction( +data class TransactionEntity( @PrimaryKey(autoGenerate = true) var id: Int? = null, @ColumnInfo(name = "date") var date: LocalDateTime?, @ColumnInfo(name = "nama") var nama: String?, @@ -38,12 +38,12 @@ data class Transaction( return 0 } - companion object CREATOR : Parcelable.Creator<Transaction> { - override fun createFromParcel(parcel: Parcel): Transaction { - return Transaction(parcel) + companion object CREATOR : Parcelable.Creator<TransactionEntity> { + override fun createFromParcel(parcel: Parcel): TransactionEntity { + return TransactionEntity(parcel) } - override fun newArray(size: Int): Array<Transaction?> { + override fun newArray(size: Int): Array<TransactionEntity?> { return arrayOfNulls(size) } } diff --git a/app/src/main/java/com/atm/bondowowo/data/model/Transaction.kt b/app/src/main/java/com/atm/bondowowo/data/model/Transaction.kt new file mode 100644 index 0000000000000000000000000000000000000000..0f95946d338492464212a4c52cf7eefd026df617 --- /dev/null +++ b/app/src/main/java/com/atm/bondowowo/data/model/Transaction.kt @@ -0,0 +1,15 @@ +package com.atm.bondowowo.data.model + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize +import java.time.LocalDateTime + +@Parcelize +data class Transaction( + val id: Int? = null, + val date: LocalDateTime?, + val nama: String?, + val kategori: String?, + val nominal: Double?, + val lokasi: String? +) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/atm/bondowowo/data/repository/TransactionRepository.kt b/app/src/main/java/com/atm/bondowowo/data/repository/TransactionRepository.kt new file mode 100644 index 0000000000000000000000000000000000000000..138c1355357aa4945b607a83c835343202a416ed --- /dev/null +++ b/app/src/main/java/com/atm/bondowowo/data/repository/TransactionRepository.kt @@ -0,0 +1,55 @@ +package com.atm.bondowowo.data.repository + +import com.atm.bondowowo.data.local.dao.TransactionDao +import com.atm.bondowowo.data.local.database.AppDatabase +import com.atm.bondowowo.data.local.entity.TransactionEntity +import com.atm.bondowowo.data.model.Transaction + +class TransactionRepository(private val database: AppDatabase) { + + fun getAllTransactions(): List<Transaction> { + return database.transactionDao().getAll().map { it.toTransaction() } + } + + fun insertTransaction(transaction: Transaction) { + database.transactionDao().insertAll(transaction.toTransactionEntity()) + } + + fun insertTransactions(transactions: List<Transaction>) { + database.transactionDao().insertAll(*transactions.map { it.toTransactionEntity() }.toTypedArray()) + } + + fun deleteTransaction(transaction: Transaction) { + database.transactionDao().delete(transaction.toTransactionEntity()) + } + + fun getTransaction(id: Int): Transaction { + return database.transactionDao().get(id).toTransaction() + } + + fun updateTransaction(transaction: Transaction) { + database.transactionDao().update(transaction.toTransactionEntity()) + } + + private fun TransactionEntity.toTransaction(): Transaction { + return Transaction( + id = this.id, + date = this.date, + nama = this.nama, + kategori = this.kategori, + nominal = this.nominal, + lokasi = this.lokasi + ) + } + + private fun Transaction.toTransactionEntity(): TransactionEntity { + return TransactionEntity( + id = this.id, + date = this.date, + nama = this.nama, + kategori = this.kategori, + nominal = this.nominal, + lokasi = this.lokasi + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/atm/bondowowo/ui/graph/ChartView.kt b/app/src/main/java/com/atm/bondowowo/ui/graph/ChartView.kt new file mode 100644 index 0000000000000000000000000000000000000000..7e150c1255d6f2239d27ddc2a896b7369443c8bc --- /dev/null +++ b/app/src/main/java/com/atm/bondowowo/ui/graph/ChartView.kt @@ -0,0 +1,83 @@ +package com.atm.bondowowo.ui.graph + +import android.content.Context +import android.graphics.Color +import android.view.View +import android.widget.TextView +import androidx.lifecycle.LiveData +import com.atm.bondowowo.R +import com.atm.bondowowo.data.model.Transaction +import com.github.mikephil.charting.charts.PieChart +import androidx.lifecycle.Observer +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.components.Legend +import com.github.mikephil.charting.data.PieData +import com.github.mikephil.charting.data.PieDataSet +import com.github.mikephil.charting.data.PieEntry +import com.github.mikephil.charting.formatter.PercentFormatter + +class ChartView(context: Context) : View(context) { + + lateinit var pieChart: PieChart + + override fun onFinishInflate() { + super.onFinishInflate() + pieChart = findViewById(R.id.pieChart) + + } + + private val observer = Observer<List<Transaction>> { newData -> + newData.let { + updateChart(it) + } + } + + fun setChartData(data: LiveData<List<Transaction>>) { + data.observeForever(observer) + } + + private fun updateChart(transactions: List<Transaction>) { + val groupedTransactions = transactions.groupBy { it.kategori } + val entries = groupedTransactions.map { (group, transactions) -> + val totalQuantity = transactions.sumOf { it.nominal?.toInt() ?: 0 } + PieEntry(totalQuantity.toFloat(), group) + } + + + if (entries.isNotEmpty()) { +// pieChart.visibility = VISIBLE + pieChart.description.text = "Amount each Category" + pieChart.description.textSize = 20f + pieChart.description.textColor = Color.BLACK + pieChart.holeRadius = 40f + + val pieDataSet = PieDataSet(entries, "") + pieDataSet.colors = listOf(Color.RED, Color.GREEN, Color.BLUE) + pieDataSet.valueTextSize = 24f + pieDataSet.valueTextColor = Color.WHITE + pieDataSet.valueFormatter = PercentFormatter() + pieDataSet.sliceSpace = 3f + pieDataSet.selectionShift = 15f + + pieChart.legend.isEnabled = true + pieChart.legend.orientation = Legend.LegendOrientation.VERTICAL + pieChart.legend.horizontalAlignment = Legend.LegendHorizontalAlignment.RIGHT + pieChart.legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + pieChart.legend.textSize = 32f + pieChart.legend.textColor = Color.BLACK + pieChart.animateY(1500, Easing.EaseInOutQuad) + pieChart.animateX(1500, Easing.EaseInOutQuad) + pieChart.isHighlightPerTapEnabled = true + pieChart.isRotationEnabled = true + pieChart.setEntryLabelColor(Color.WHITE) + pieChart.setEntryLabelTextSize(24f) + + val pieData = PieData(pieDataSet) + pieChart.data = pieData + pieChart.invalidate() + } else { +// pieChart.visibility = GONE + } + } + +} diff --git a/app/src/main/java/com/atm/bondowowo/ui/graph/GraphFragment.kt b/app/src/main/java/com/atm/bondowowo/ui/graph/GraphFragment.kt index 45c25f900da09ffce345b2d3fc9629c9c109458a..317d9f22436814fbcd82d462be8dc259a686c1b9 100644 --- a/app/src/main/java/com/atm/bondowowo/ui/graph/GraphFragment.kt +++ b/app/src/main/java/com/atm/bondowowo/ui/graph/GraphFragment.kt @@ -1,6 +1,36 @@ package com.atm.bondowowo.ui.graph +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import com.atm.bondowowo.R +import com.atm.bondowowo.data.local.database.AppDatabase +import com.atm.bondowowo.data.repository.TransactionRepository +class GraphFragment : Fragment() { + private lateinit var graphViewModel: GraphViewModel -class GraphFragment : Fragment() + private lateinit var pieChart: ChartView + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.fragment_graph, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val database = AppDatabase.getInstance(requireContext()) + val transactionRepository = TransactionRepository(database) + val graphViewModelFactory = GraphViewModelFactory(transactionRepository) + graphViewModel = ViewModelProvider(this, graphViewModelFactory)[GraphViewModel::class.java] + + pieChart = ChartView(requireContext()) + pieChart.pieChart = view.findViewById(R.id.pieChart) + pieChart.setChartData(graphViewModel.transactionData) + } +} diff --git a/app/src/main/java/com/atm/bondowowo/ui/graph/GraphViewModel.kt b/app/src/main/java/com/atm/bondowowo/ui/graph/GraphViewModel.kt new file mode 100644 index 0000000000000000000000000000000000000000..749260e48c6b9f85dd0d9b1a9cf6c850046f27c4 --- /dev/null +++ b/app/src/main/java/com/atm/bondowowo/ui/graph/GraphViewModel.kt @@ -0,0 +1,40 @@ +package com.atm.bondowowo.ui.graph + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.atm.bondowowo.data.repository.TransactionRepository +import com.atm.bondowowo.data.model.Transaction +import kotlinx.coroutines.launch + +class GraphViewModel( + private val transactionRepository: TransactionRepository +) : ViewModel() { + + + private val _transactionData = MutableLiveData<List<Transaction>>() + val transactionData: LiveData<List<Transaction>> = _transactionData + private val toastMessage = MutableLiveData<String>() + + init { + loadTransactionData() + } + + private fun loadTransactionData() { + viewModelScope.launch { + try { + val transactions = transactionRepository.getAllTransactions() + _transactionData.postValue(transactions) + } catch (e: Exception) { + showToast(e.message ?: "Failed to load transaction data") + } finally { + } + } + } + + fun showToast(message: String) { + toastMessage.value = message + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/atm/bondowowo/ui/graph/GraphViewModelFactory.kt b/app/src/main/java/com/atm/bondowowo/ui/graph/GraphViewModelFactory.kt new file mode 100644 index 0000000000000000000000000000000000000000..8f69586b7402f954dd2e5ca175eecfaf1a6b0395 --- /dev/null +++ b/app/src/main/java/com/atm/bondowowo/ui/graph/GraphViewModelFactory.kt @@ -0,0 +1,18 @@ +package com.atm.bondowowo.ui.graph + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import com.atm.bondowowo.data.repository.TransactionRepository + +class GraphViewModelFactory( + private val transactionRepository: TransactionRepository +) : ViewModelProvider.Factory { + + override fun <T : ViewModel> create(modelClass: Class<T>): T { + if (modelClass.isAssignableFrom(GraphViewModel::class.java)) { + @Suppress("UNCHECKED_CAST") + return GraphViewModel(transactionRepository) as T + } + throw IllegalArgumentException("Unknown ViewModel class") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/atm/bondowowo/ui/settings/ExportToFileActivity.kt b/app/src/main/java/com/atm/bondowowo/ui/settings/ExportToFileActivity.kt index b7d354f06916bd5c460c86658869a1d45b4e9771..c31d778915540b087ed8ec9ba3c9b640c8fe25ad 100644 --- a/app/src/main/java/com/atm/bondowowo/ui/settings/ExportToFileActivity.kt +++ b/app/src/main/java/com/atm/bondowowo/ui/settings/ExportToFileActivity.kt @@ -3,8 +3,7 @@ package com.atm.bondowowo.ui.settings import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity -import com.atm.bondowowo.R -import com.atm.bondowowo.data.entity.Transaction +import com.atm.bondowowo.data.local.entity.TransactionEntity import org.apache.poi.xssf.usermodel.XSSFWorkbook import java.io.File import java.io.FileOutputStream @@ -14,16 +13,16 @@ class ExportToFileActivity : AppCompatActivity() { super.onCreate(savedInstanceState) // setContentView(R.layout.fragment_transaction) - val transactions: ArrayList<Transaction>? = intent.getSerializableExtra("transactions") as? ArrayList<Transaction> + val transactionEntities: ArrayList<TransactionEntity>? = intent.getSerializableExtra("transactions") as? ArrayList<TransactionEntity> - if (transactions != null) { - exportDataToFile(transactions) + if (transactionEntities != null) { + exportDataToFile(transactionEntities) } else { Toast.makeText(this, "No transaction data available", Toast.LENGTH_SHORT).show() } } - private fun exportDataToFile(transactions: List<Transaction>) { + private fun exportDataToFile(transactionEntities: List<TransactionEntity>) { val workbook = XSSFWorkbook() val sheet = workbook.createSheet("Transaction Data") @@ -36,7 +35,7 @@ class ExportToFileActivity : AppCompatActivity() { cell.setCellValue(headerText) } - transactions.forEachIndexed { rowIndex, transaction -> + transactionEntities.forEachIndexed { rowIndex, transaction -> val dataRow = sheet.createRow(rowIndex + 1) // dataRow.createCell(0).setCellValue(transaction.id ?: -1) dataRow.createCell(0).setCellValue(transaction.date.toString()) diff --git a/app/src/main/java/com/atm/bondowowo/ui/settings/SettingsFragment.kt b/app/src/main/java/com/atm/bondowowo/ui/settings/SettingsFragment.kt index 7b21b7158353d53cca86fc7da16d90288e4dad34..34b88565e0c2c6b78956156e9177b5b82d7ac39e 100644 --- a/app/src/main/java/com/atm/bondowowo/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/atm/bondowowo/ui/settings/SettingsFragment.kt @@ -9,7 +9,7 @@ import android.widget.Button import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.atm.bondowowo.R -import com.atm.bondowowo.data.AppDatabase +import com.atm.bondowowo.data.local.database.AppDatabase class SettingsFragment : Fragment(){ diff --git a/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionFragment.kt b/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionFragment.kt index 41cf1c5c2db8ea686a7729b483d2aa315a0d3f77..024da2b21172c97f0151b5abb55d0d77ccbcb314 100644 --- a/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionFragment.kt +++ b/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionFragment.kt @@ -1,20 +1,19 @@ package com.atm.bondowowo.ui.transaction import android.app.AlertDialog -import android.content.DialogInterface import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment -import com.atm.bondowowo.R import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.atm.bondowowo.R import com.atm.bondowowo.adapter.TransactionAdapter -import com.atm.bondowowo.data.AppDatabase -import com.atm.bondowowo.data.entity.Transaction +import com.atm.bondowowo.data.local.database.AppDatabase +import com.atm.bondowowo.data.local.entity.TransactionEntity import com.google.android.material.floatingactionbutton.FloatingActionButton @@ -22,7 +21,7 @@ class TransactionFragment : Fragment() { private lateinit var recyclerView: RecyclerView private lateinit var fab: FloatingActionButton - private var list = mutableListOf<Transaction>() + private var list = mutableListOf<TransactionEntity>() private lateinit var adapter: TransactionAdapter private lateinit var database: AppDatabase private lateinit var listener: TransactionInteractionListener @@ -50,7 +49,8 @@ class TransactionFragment : Fragment() { override fun onClick(position: Int) { val dialog = AlertDialog.Builder(requireContext()) dialog.setTitle(list[position].nama) - dialog.setItems(R.array.transaction_option + dialog.setItems( + R.array.transaction_option ) { dialog, which -> if (which == 0) { val intent = diff --git a/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionInputFragment.kt b/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionInputFragment.kt index 4ecbf1f361e9c6b6fe717426b67a2f6a5172b1e3..c5389afb8991242846b7c3be9ba8306c15f11dcf 100644 --- a/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionInputFragment.kt +++ b/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionInputFragment.kt @@ -1,8 +1,6 @@ package com.atm.bondowowo.ui.transaction -import android.content.Intent import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,11 +8,9 @@ import android.widget.Button import android.widget.EditText import android.widget.Toast import androidx.fragment.app.Fragment -import androidx.navigation.fragment.findNavController -import com.atm.bondowowo.MainActivity import com.atm.bondowowo.R -import com.atm.bondowowo.data.AppDatabase -import com.atm.bondowowo.data.entity.Transaction +import com.atm.bondowowo.data.local.database.AppDatabase +import com.atm.bondowowo.data.local.entity.TransactionEntity import java.time.LocalDateTime class TransactionInputFragment : Fragment() { @@ -60,7 +56,7 @@ class TransactionInputFragment : Fragment() { if (nama_transaksi.text.isNotEmpty() && nominal_transaksi.text.isNotEmpty() && kategori_transaksi.text.isNotEmpty() && lokasi_transaksi.text.isNotEmpty()) { if (args != null) { database.transactionDao().update( - Transaction( + TransactionEntity( args.getInt("id", 0), LocalDateTime.now(), nama_transaksi.text.toString(), @@ -69,9 +65,10 @@ class TransactionInputFragment : Fragment() { lokasi_transaksi.text.toString() ) ) + listener.onTransactionSubmitted() } else { database.transactionDao().insertAll( - Transaction( + TransactionEntity( null, LocalDateTime.now(), nama_transaksi.text.toString(), diff --git a/app/src/main/java/com/atm/bondowowo/data/Converters.kt b/app/src/main/java/com/atm/bondowowo/utils/ConvertersUtils.kt similarity index 91% rename from app/src/main/java/com/atm/bondowowo/data/Converters.kt rename to app/src/main/java/com/atm/bondowowo/utils/ConvertersUtils.kt index 49e875102c36ae663a8da798dbf3049319c6bda4..cf23604d752358dd5330330ed75de02c6ca5494f 100644 --- a/app/src/main/java/com/atm/bondowowo/data/Converters.kt +++ b/app/src/main/java/com/atm/bondowowo/utils/ConvertersUtils.kt @@ -1,4 +1,4 @@ -package com.atm.bondowowo.data +package com.atm.bondowowo.utils import androidx.room.TypeConverter import java.time.LocalDateTime diff --git a/app/src/main/res/layout/fragment_graph.xml b/app/src/main/res/layout/fragment_graph.xml index ea6389a9f1b11a731add532fc7ea5ace60afe744..f6e9ebc7f0a051c11e6fb04b7396d69ad63a16f5 100644 --- a/app/src/main/res/layout/fragment_graph.xml +++ b/app/src/main/res/layout/fragment_graph.xml @@ -1,10 +1,9 @@ <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" + xmlns:chart="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" - android:layout_height="match_parent" - tools:context="com.atm.bondowowo.ui.scan.ScanFragment"> + android:layout_height="match_parent"> <com.google.android.material.appbar.AppBarLayout android:id="@+id/header" @@ -24,5 +23,17 @@ android:textStyle="bold" /> </com.google.android.material.appbar.AppBarLayout> + <com.github.mikephil.charting.charts.PieChart + android:id="@+id/pieChart" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginStart="20dp" + android:layout_marginTop="70dp" + android:layout_marginEnd="20dp" + android:layout_marginBottom="30dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> -</androidx.constraintlayout.widget.ConstraintLayout> +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5cc739c92f594ecffb54970a2b231c4a7debca03..99ab9a4ca9140f4938bdb47c93f4242692426563 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,6 +6,7 @@ <string name="pengaturan">Pengaturan</string> <string name="add">+</string> <string name="capture">Capture</string> + <string name="no_data_to_display">Empty :( Please fill transaction</string> <string-array name="transaction_option"> <item>Edit</item> <item>Delete</item> diff --git a/settings.gradle.kts b/settings.gradle.kts index a166835a10904b5765bb52544763026579db581d..3fd94ef69f37af6fea3947a69af56df295f834c8 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -10,6 +10,9 @@ dependencyResolutionManagement { repositories { google() mavenCentral() + maven { + url = uri("https://jitpack.io") + } } }