From f9fc7b043f11cfaa42e8342a313c35f411db81b6 Mon Sep 17 00:00:00 2001 From: rayhanp1402 <rayhan.hanif14maulana@gmail.com> Date: Fri, 5 Apr 2024 07:38:04 +0700 Subject: [PATCH] feat: Graph functionality --- .../bondoyap/ui/graph/GraphFragment.kt | 86 +++++++++++-------- .../ui/transactions/TransactionsViewModel.kt | 2 + .../ui/transactions/data/TransactionsDao.kt | 6 ++ .../data/TransactionsRepository.kt | 8 ++ app/src/main/res/values/colors.xml | 1 + 5 files changed, 68 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/com/example/bondoyap/ui/graph/GraphFragment.kt b/app/src/main/java/com/example/bondoyap/ui/graph/GraphFragment.kt index b9d913d..cec5999 100644 --- a/app/src/main/java/com/example/bondoyap/ui/graph/GraphFragment.kt +++ b/app/src/main/java/com/example/bondoyap/ui/graph/GraphFragment.kt @@ -9,7 +9,11 @@ import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.core.content.ContextCompat +import androidx.lifecycle.Observer import com.example.bondoyap.R +import com.example.bondoyap.ui.transactions.TransactionsApplication +import com.example.bondoyap.ui.transactions.TransactionsViewModel +import com.example.bondoyap.ui.transactions.TransactionsViewModelFactory import com.github.mikephil.charting.charts.PieChart import com.github.mikephil.charting.components.Legend import com.github.mikephil.charting.data.PieData @@ -23,7 +27,11 @@ class GraphFragment : Fragment() { fun newInstance() = GraphFragment() } - private val viewModel: GraphViewModel by viewModels() + private val transactionsViewModel: TransactionsViewModel by viewModels { + TransactionsViewModelFactory((requireContext().applicationContext as TransactionsApplication).repository) + } + + private lateinit var pieChart: PieChart override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -36,40 +44,48 @@ class GraphFragment : Fragment() { savedInstanceState: Bundle? ): View { val root = inflater.inflate(R.layout.fragment_graph, container, false) - val pieChart: PieChart = root.findViewById(R.id.pieChart) - - val entries = listOf( - PieEntry(1f, "Entry 1"), - PieEntry(2f, "Entry 2"), - PieEntry(3f, "Entry 3") - ) - - val pieDataSet = PieDataSet(entries, "") - pieDataSet.colors = ColorTemplate.COLORFUL_COLORS.toList() - - val pieData = PieData(pieDataSet) - - pieChart.data = pieData - pieChart.description.isEnabled = false - - val legend = pieChart.legend - val orientation = resources.configuration.orientation - if (orientation == Configuration.ORIENTATION_LANDSCAPE) { - legend.horizontalAlignment = Legend.LegendHorizontalAlignment.RIGHT - legend.verticalAlignment = Legend.LegendVerticalAlignment.CENTER - } else { - legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER - legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM - } - legend.setDrawInside(false) - - if (isDarkTheme()) { - legend.textColor = ContextCompat.getColor(requireContext(), R.color.white) - } else { - legend.textColor = ContextCompat.getColor(requireContext(), R.color.black) - } - - pieChart.invalidate() + pieChart = root.findViewById(R.id.pieChart) + + transactionsViewModel.pemasukanCount.observe(viewLifecycleOwner, Observer { pemasukanCount -> + transactionsViewModel.pengeluaranCount.observe(viewLifecycleOwner, Observer { pengeluaranCount -> + val entries = listOf( + PieEntry(pemasukanCount.toFloat(), "Pemasukan"), + PieEntry(pengeluaranCount.toFloat(), "Pengeluaran") + ) + + val colors = mutableListOf<Int>() + colors.add(ContextCompat.getColor(requireContext(), R.color.green)) + colors.add(ContextCompat.getColor(requireContext(), R.color.red)) + + val pieDataSet = PieDataSet(entries, "") + pieDataSet.colors = colors + + val pieData = PieData(pieDataSet) + + pieChart.data = pieData + pieChart.description.isEnabled = false + + val legend = pieChart.legend + val orientation = resources.configuration.orientation + if (orientation == Configuration.ORIENTATION_LANDSCAPE) { + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.RIGHT + legend.verticalAlignment = Legend.LegendVerticalAlignment.CENTER + } else { + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + } + legend.setDrawInside(false) + + if (isDarkTheme()) { + legend.textColor = ContextCompat.getColor(requireContext(), R.color.white) + } else { + legend.textColor = ContextCompat.getColor(requireContext(), R.color.black) + } + + pieChart.invalidate() + }) + }) + return root } diff --git a/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsViewModel.kt b/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsViewModel.kt index e5d26b6..2e06e88 100644 --- a/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsViewModel.kt +++ b/app/src/main/java/com/example/bondoyap/ui/transactions/TransactionsViewModel.kt @@ -15,6 +15,8 @@ class TransactionsViewModel( private val repository: TransactionsRepository ): ViewModel() { val allTransactions: LiveData<List<Transactions>> = repository.allTransactions.asLiveData() + val pemasukanCount: LiveData<Int> = repository.getPemasukanCount().asLiveData() + val pengeluaranCount: LiveData<Int> = repository.getPengeluaranCount().asLiveData() fun upsert(transactions: Transactions) = viewModelScope.launch { repository.upsert(transactions) diff --git a/app/src/main/java/com/example/bondoyap/ui/transactions/data/TransactionsDao.kt b/app/src/main/java/com/example/bondoyap/ui/transactions/data/TransactionsDao.kt index a670187..f02276d 100644 --- a/app/src/main/java/com/example/bondoyap/ui/transactions/data/TransactionsDao.kt +++ b/app/src/main/java/com/example/bondoyap/ui/transactions/data/TransactionsDao.kt @@ -26,4 +26,10 @@ interface TransactionsDao { @Query("DELETE FROM transactions") suspend fun deleteAllTransactions() + + @Query("SELECT COUNT(transactions.id) FROM transactions WHERE transactions.is_pemasukan = 1") + fun getPemasukanCount(): Flow<Int> + + @Query("SELECT COUNT(transactions.id) FROM transactions WHERE transactions.is_pemasukan = 0") + fun getPengeluaranCount(): Flow<Int> } \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoyap/ui/transactions/data/TransactionsRepository.kt b/app/src/main/java/com/example/bondoyap/ui/transactions/data/TransactionsRepository.kt index 752e4e9..43b83a6 100644 --- a/app/src/main/java/com/example/bondoyap/ui/transactions/data/TransactionsRepository.kt +++ b/app/src/main/java/com/example/bondoyap/ui/transactions/data/TransactionsRepository.kt @@ -28,4 +28,12 @@ class TransactionsRepository(private val transactionsDao: TransactionsDao) { suspend fun deleteAllTransactions() { transactionsDao.deleteAllTransactions() } + + fun getPemasukanCount(): Flow<Int> { + return transactionsDao.getPemasukanCount() + } + + fun getPengeluaranCount(): Flow<Int> { + return transactionsDao.getPengeluaranCount() + } } \ 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 5b69a31..dca02c2 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -8,5 +8,6 @@ <color name="black">#FF000000</color> <color name="white">#FFFFFFFF</color> <color name="red">#FF0000</color> + <color name="green">#50C878</color> <color name="ic_launcher_background">#f6bc2b</color> </resources> \ No newline at end of file -- GitLab