diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 40dd2cd9471830b545e5d48baf5c6967aea8212a..82eb6647a6a2659f89516714c79f5722838a46b3 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -138,7 +138,7 @@ dependencies { implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2") - val cameraxVersion = "1.3.0-rc01" + val cameraxVersion = "1.3.2" implementation("androidx.camera:camera-core:$cameraxVersion") implementation("androidx.camera:camera-camera2:$cameraxVersion") @@ -152,7 +152,7 @@ dependencies { implementation("org.apache.poi:poi-ooxml:5.2.5") implementation("androidx.core:core-splashscreen:1.0.1") - implementation("com.androidplot:androidplot-core:1.5.10") + implementation("com.github.PhilJay:MPAndroidChart:v3.1.0") } diff --git a/app/src/main/java/com/example/pbd_jwr/ui/dashboard/DashboardFragment.kt b/app/src/main/java/com/example/pbd_jwr/ui/dashboard/DashboardFragment.kt index ca8cc7fa84035731323c4ba230edb924cb2d599b..e518c7a8642989047e94238f9b9a7e97a54e73cc 100644 --- a/app/src/main/java/com/example/pbd_jwr/ui/dashboard/DashboardFragment.kt +++ b/app/src/main/java/com/example/pbd_jwr/ui/dashboard/DashboardFragment.kt @@ -1,42 +1,80 @@ package com.example.pbd_jwr.ui.dashboard +import android.graphics.Color import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.TextView import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider -import com.example.pbd_jwr.databinding.FragmentDashboardBinding +import com.example.pbd_jwr.R +import com.example.pbd_jwr.data.entity.Transaction +import com.example.pbd_jwr.ui.transaction.TransactionViewModel +import com.github.mikephil.charting.animation.Easing -class DashboardFragment : Fragment() { +import com.github.mikephil.charting.charts.PieChart +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.utils.ColorTemplate +import java.util.Locale - private var _binding: FragmentDashboardBinding? = null +class DashboardFragment : Fragment() { - // This property is only valid between onCreateView and - // onDestroyView. - private val binding get() = _binding!! + private lateinit var pieChart: PieChart + private lateinit var viewModel: TransactionViewModel override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - val dashboardViewModel = - ViewModelProvider(this)[DashboardViewModel::class.java] + ): View? { + val view = inflater.inflate(R.layout.fragment_dashboard, container, false) + + pieChart = view.findViewById(R.id.pieChart) + viewModel = ViewModelProvider(this)[TransactionViewModel::class.java] - _binding = FragmentDashboardBinding.inflate(inflater, container, false) - val root: View = binding.root + return view + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) - val textView: TextView = binding.textDashboard - dashboardViewModel.text.observe(viewLifecycleOwner) { - textView.text = it + viewModel.getAllTransactions().observe(viewLifecycleOwner) { transactions -> + loadPieChartData(transactions) } - return root } - override fun onDestroyView() { - super.onDestroyView() - _binding = null + private fun loadPieChartData(transactions: List<Transaction>) { + + val totalPerCategory = transactions.groupBy { it.category } + .mapValues { entry -> + entry.value.sumOf { it.amount } + } + + val entries = ArrayList<PieEntry>() + for ((category, total) in totalPerCategory) { + entries.add(PieEntry(total.toFloat(), + category.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.ROOT) else it.toString() })) + } + + val dataSet = PieDataSet(entries, "Categories") + dataSet.setColors(*ColorTemplate.MATERIAL_COLORS) // Atur warna + dataSet.valueTextSize = 12f + dataSet.valueTextColor = Color.BLACK + + val data = PieData(dataSet) + pieChart.data = data + pieChart.invalidate() // refresh chart + pieChart.animateY(1400, Easing.EaseInOutQuad) + + pieChart.description.isEnabled = false + pieChart.isDrawHoleEnabled = true + pieChart.setEntryLabelColor(Color.BLACK) + pieChart.setEntryLabelTextSize(12f) + pieChart.legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + pieChart.centerText = "Transactions\nCategory Amount" + pieChart.setCenterTextSize(20F) } -} \ No newline at end of file +} + diff --git a/app/src/main/res/layout/fragment_dashboard.xml b/app/src/main/res/layout/fragment_dashboard.xml index dd4238dd9d29ae2b34101781e10132b85ecbaee9..feed448c4aac31ab15bf7ced37bf9e323ab9f82f 100644 --- a/app/src/main/res/layout/fragment_dashboard.xml +++ b/app/src/main/res/layout/fragment_dashboard.xml @@ -1,14 +1,13 @@ <?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" +<RelativeLayout 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.dashboard.DashboardFragment"> + tools:context=".ui.dashboard.DashboardFragment"> - <com.androidplot.pie.PieChart + <com.github.mikephil.charting.charts.PieChart android:id="@+id/pieChart" android:layout_width="match_parent" - android:layout_height="match_parent" /> + android:layout_height="600dp" /> -</androidx.constraintlayout.widget.ConstraintLayout> +</RelativeLayout> diff --git a/build.gradle.kts b/build.gradle.kts index 5cf2105177c3d52e19649d5c35bf3ec5593ad14e..0871bc044ec7162bdc48ff9ee15db80fdf366b11 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,6 +2,8 @@ buildscript { repositories { google() + mavenCentral() + maven (url = "https://jitpack.io") } dependencies { diff --git a/settings.gradle.kts b/settings.gradle.kts index 06a181712081f24b027ac117313326414cc05a6a..7e8557db7b6d36fd6bdc5c5f2a0d913258ea0874 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -10,6 +10,7 @@ dependencyResolutionManagement { repositories { google() mavenCentral() + maven { url = uri("https://jitpack.io") } } }