diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c661268957eb56058df4c347bcb3edc02b4c05b6..a1fd2442e6d4e8cc20603bd6cc8a0461dc9c6e94 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -47,6 +47,7 @@ dependencies { implementation("com.android.volley:volley:1.2.1") implementation("androidx.core:core-ktx:1.12.0") implementation("androidx.appcompat:appcompat:1.6.1") + implementation("com.github.PhilJay:MPAndroidChart:v3.1.0") implementation("com.google.android.material:material:1.11.0") implementation("androidx.constraintlayout:constraintlayout:2.1.4") testImplementation("junit:junit:4.13.2") 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 55768bf7c265c09097eb8f4c1c0ad305f85daab6..8eba3594b4d5a3cf449300f8a316cc6119c0ae5c 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 @@ -1,16 +1,26 @@ package com.example.nerbos.fragments.statistic +import android.graphics.Color +import android.graphics.Typeface import android.os.Bundle +import android.util.Log import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.lifecycle.ViewModelProvider import com.example.nerbos.R - -// TODO: Rename parameter arguments, choose names that match -// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER -private const val ARG_PARAM1 = "param1" -private const val ARG_PARAM2 = "param2" +import com.example.nerbos.databinding.FragmentStatisticBinding +import com.example.nerbos.model.TransactionCategory +import com.example.nerbos.viewmodel.TransactionViewModel +import com.example.nerbos.service.Authentication +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +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 +import com.github.mikephil.charting.utils.MPPointF /** * A simple [Fragment] subclass. @@ -18,43 +28,57 @@ private const val ARG_PARAM2 = "param2" * create an instance of this fragment. */ class StatisticFragment : Fragment() { - // TODO: Rename and change types of parameters - private var param1: String? = null - private var param2: String? = null + + private lateinit var transactionViewModel: TransactionViewModel + private lateinit var authentication: Authentication + private lateinit var pieChart: PieChart + private var sumIncome: Float = 0.0f + private var sumOutcome : Float = 0.0f override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) arguments?.let { - param1 = it.getString(ARG_PARAM1) - param2 = it.getString(ARG_PARAM2) + } } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { + ): View { // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_statistic, container, false) - } + val binding = FragmentStatisticBinding.inflate(inflater, container, false) + pieChart = binding.pieChart - companion object { - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment Statistic. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - StatisticFragment().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) + // Create an authentication object + authentication = Authentication(requireContext()) + // Set the view model for the transaction and set the user id + transactionViewModel = ViewModelProvider(this)[TransactionViewModel::class.java] + transactionViewModel.setReadDataUserId(authentication.getNim()) + + // log all the transactions + transactionViewModel.readAllData!!.observe(viewLifecycleOwner) { transactions -> + transactions.forEach { + Log.d("Transaction", it.toString()) + if (it.category == TransactionCategory.INCOME) { + sumIncome += it.nominal + } else { + sumOutcome += it.nominal } } + } + + // Set up the pie chart + pieChartSetup() + + + + return binding.root } + + // Display a pie chart of the income and outcome + private fun pieChartSetup() { + + } + } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_circle.xml b/app/src/main/res/drawable/ic_circle.xml new file mode 100644 index 0000000000000000000000000000000000000000..f974c6002e895d87f9ea13cdc3e4d052be61018c --- /dev/null +++ b/app/src/main/res/drawable/ic_circle.xml @@ -0,0 +1,5 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="15dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="15dp"> + + <path android:fillColor="@android:color/white" android:pathData="M12,2C6.47,2 2,6.47 2,12s4.47,10 10,10 10,-4.47 10,-10S17.53,2 12,2z"/> + +</vector> diff --git a/app/src/main/res/layout/fragment_statistic.xml b/app/src/main/res/layout/fragment_statistic.xml index c90a5c1c7ad6b85e52a6d0f3902bd80803bab3f1..7e562b036d83f4113f8e311614cc3b505f9b8d82 100644 --- a/app/src/main/res/layout/fragment_statistic.xml +++ b/app/src/main/res/layout/fragment_statistic.xml @@ -1,16 +1,82 @@ <?xml version="1.0" encoding="utf-8"?> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" +<FrameLayout + 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" android:layout_width="match_parent" android:layout_height="match_parent" + android:fillViewport="true" + android:background="@color/primary_bg" tools:context=".fragments.statistic.StatisticFragment"> - <!-- TODO: Update blank fragment layout --> - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="Statistic Fragment" - android:textSize="26dp" - android:layout_gravity="center" /> + <RelativeLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginTop="20dp" + tools:ignore="UselessParent"> + + <TextView + android:id="@+id/titleChart" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center" + android:padding="10dp" + android:text="@string/pie_chart" + android:textAlignment="center" + android:textColor="@color/chart_title" + android:textSize="25sp" + android:textStyle="bold" /> + + + <!--Ui component for our pie chart--> + <com.github.mikephil.charting.charts.PieChart + android:id="@+id/pieChart" + android:layout_width="300dp" + android:layout_height="300dp" + android:layout_below="@+id/titleChart" + android:layout_alignParentEnd="false" + android:layout_centerHorizontal="true" + android:layout_marginTop="20dp" + android:layout_marginBottom="5dp" /> + + <LinearLayout + android:layout_width="300dp" + android:layout_height="wrap_content" + android:layout_below="@+id/pieChart" + android:layout_marginTop="25dp" + android:orientation="horizontal" + android:layout_centerHorizontal="true" + android:weightSum="2"> + + <TextView + android:id="@+id/totalIncome" + 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" + app:drawableTint="@color/purple_200" + app:drawableLeftCompat="@drawable/ic_circle" /> + + <TextView + android:id="@+id/totalOutcome" + 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" + app:drawableLeftCompat="@drawable/ic_circle" + app:drawableTint="@color/red" /> + </LinearLayout> + + </RelativeLayout> </FrameLayout> \ 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 20f56ac656d92d996a3a20df82ea73e84d0f8d30..b9f39245f02ffbfb7aeeb029d7e07b644c1fc3ca 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -20,4 +20,15 @@ <color name="strong_blue_button">#0DA6C2</color> <color name="weak_blue_button">#800DA6C2</color> <color name="transparent">#00FFFFFF</color> + + <color name="purple_200">#0F9D58</color> + <color name="purple_500">#0F9D58</color> + <color name="purple_700">#0F9D58</color> + <color name="teal_200">#FF03DAC5</color> + <color name="teal_700">#FF018786</color> + <color name="grey">#aaa</color> + <color name="button_color">#1E573B</color> + <color name="yellow">#FFEB3B</color> + <color name="chart_title">#AEACCC</color> + </resources> \ 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 93156b4b00eeac9c58eece350969a1b530d0fa4a..343b4c377de55b935141ff6ae6d1579d790ea1b1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -48,5 +48,6 @@ <string name="outcome">Outcome</string> <string name="network_sensing_string">No Internet Connection Please check your connection and try again.</string> <string name="close_button">Close Button</string> + <string name="pie_chart">Pie Chart</string> </resources> \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index f4f7ca044d42341d3ea2d11ed06fa2983bcacc3f..f677740f90476b45d0068ed3e06d785a3e0b6271 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -9,6 +9,7 @@ dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() + maven { url = uri("https://jitpack.io") } mavenCentral() } }