diff --git a/app/src/main/java/com/example/nerbos/fragments/statistic/StatisticFragment.kt b/app/src/main/java/com/example/nerbos/fragments/statistic/StatisticFragment.kt index 8eba3594b4d5a3cf449300f8a316cc6119c0ae5c..07900ca9410d8d501606d5555c422bd2669cf012 100644 --- a/app/src/main/java/com/example/nerbos/fragments/statistic/StatisticFragment.kt +++ b/app/src/main/java/com/example/nerbos/fragments/statistic/StatisticFragment.kt @@ -8,6 +8,7 @@ import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModelProvider import com.example.nerbos.R import com.example.nerbos.databinding.FragmentStatisticBinding @@ -32,6 +33,8 @@ class StatisticFragment : Fragment() { private lateinit var transactionViewModel: TransactionViewModel private lateinit var authentication: Authentication private lateinit var pieChart: PieChart + private lateinit var binding: FragmentStatisticBinding + private val liveDataReady = MutableLiveData<Boolean>() private var sumIncome: Float = 0.0f private var sumOutcome : Float = 0.0f @@ -47,7 +50,7 @@ class StatisticFragment : Fragment() { savedInstanceState: Bundle? ): View { // Inflate the layout for this fragment - val binding = FragmentStatisticBinding.inflate(inflater, container, false) + binding = FragmentStatisticBinding.inflate(inflater, container, false) pieChart = binding.pieChart // Create an authentication object @@ -66,19 +69,99 @@ class StatisticFragment : Fragment() { sumOutcome += it.nominal } } + // Notify the data is ready + liveDataReady.postValue(true) } // Set up the pie chart pieChartSetup() - + // Display the pie chart + displayPieChart() return binding.root } // Display a pie chart of the income and outcome private fun pieChartSetup() { + // Set the pie chart: percentage, description, extra offsets + pieChart.setUsePercentValues(true) + pieChart.description.isEnabled = false + pieChart.setExtraOffsets(5f, 10f, 5f, 5f) + + // Set the pie chart: drag deceleration, hole, hole color + pieChart.setDragDecelerationFrictionCoef(0.95f) + pieChart.isDrawHoleEnabled = true + pieChart.setHoleColor(requireContext().getColor(R.color.primary_bg)) + + // Set the pie chart: transparent circle, hole color, hole radius, draw center text + pieChart.setTransparentCircleColor(requireContext().getColor(R.color.primary_bg)) + pieChart.setTransparentCircleAlpha(110) + pieChart.holeRadius = 42f + pieChart.transparentCircleRadius = 48f + pieChart.setDrawCenterText(true) + + // Set the pie chart: rotation angle, rotation enabled, tap, animation + pieChart.setRotationAngle(0f) + pieChart.isRotationEnabled = true + pieChart.isHighlightPerTapEnabled = true + pieChart.animateY(1400, Easing.EaseInOutQuad) + + // Set the pie chart: legend and entry label + pieChart.legend.isEnabled = false + pieChart.setEntryLabelColor(Color.BLACK) + pieChart.setEntryLabelTextSize(12f) + + } + + private fun setPieData(){ + // Set the pie chart: data + val entries: ArrayList<PieEntry> = ArrayList() + entries.add(PieEntry(sumIncome, resources.getString(R.string.income))) + entries.add(PieEntry(sumOutcome, resources.getString(R.string.outcome))) + // Create a pie data set + val dataSet = PieDataSet(entries, resources.getString(R.string.pie_chart)) + + // Set the pie data set properties + dataSet.setDrawIcons(false) + dataSet.sliceSpace = 3f + dataSet.iconsOffset = MPPointF(0f, 40f) + dataSet.selectionShift = 5f + + // Set the pie data set: colors + val colors: ArrayList<Int> = ArrayList() + colors.add(requireContext().getColor(R.color.purple_200)) + colors.add(requireContext().getColor(R.color.red)) + dataSet.colors = colors + + // Set the pie data set: text size, text color, text typeface + val data = PieData(dataSet) + data.setValueFormatter(PercentFormatter()) + data.setValueTextSize(15f) + data.setValueTypeface(Typeface.DEFAULT_BOLD) + data.setValueTextColor(Color.BLACK) + pieChart.setData(data) + pieChart.highlightValues(null) + } + + private fun displayPieChart() { + // wait until the income and outcome are calculated + // Observe the LiveData object to update the pie chart when the data is ready + liveDataReady.observe(viewLifecycleOwner) { dataReady -> + if (dataReady) { + // Set the pie data + setPieData() + // Invalidate the pie chart (refresh) + pieChart.invalidate() + // Reset the sum of income and outcome + val incomeNumber = binding.totalIncomeNumber + val outcomeNumber = binding.totalOutcomeNumber + // make it to currency format with separetion 000 . and ,00 and give Rp in front + incomeNumber.text = "Rp " + String.format("%,.2f", sumIncome) + outcomeNumber.text = "Rp " + String.format("%,.2f", sumOutcome) + } + } } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_statistic.xml b/app/src/main/res/layout/fragment_statistic.xml index 7e562b036d83f4113f8e311614cc3b505f9b8d82..bdd26878da84bd34f9e72c604e70fb899e9d1bfd 100644 --- a/app/src/main/res/layout/fragment_statistic.xml +++ b/app/src/main/res/layout/fragment_statistic.xml @@ -40,6 +40,7 @@ android:layout_marginBottom="5dp" /> <LinearLayout + android:id="@+id/totalIncomeOutcome" android:layout_width="300dp" android:layout_height="wrap_content" android:layout_below="@+id/pieChart" @@ -77,6 +78,41 @@ app:drawableTint="@color/red" /> </LinearLayout> + <LinearLayout + android:layout_width="300dp" + android:layout_height="wrap_content" + android:layout_below="@+id/totalIncomeOutcome" + android:layout_marginTop="15dp" + android:orientation="horizontal" + android:layout_centerHorizontal="true" + android:weightSum="2"> + + <TextView + android:id="@+id/totalIncomeNumber" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_margin="3dp" + android:layout_weight="1" + android:gravity="center" + android:padding="4dp" + android:text="@string/income" + android:textAlignment="center" + android:textColor="@color/white" /> + + <TextView + android:id="@+id/totalOutcomeNumber" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_margin="3dp" + android:layout_weight="1" + android:gravity="center" + android:padding="4dp" + android:text="@string/outcome" + android:textAlignment="center" + android:textColor="@color/white" /> + + </LinearLayout> + </RelativeLayout> </FrameLayout> \ No newline at end of file