From 2f90da537b7a2cfcb2a7d23a6e9f255a2b926fc1 Mon Sep 17 00:00:00 2001
From: farhanfahreezy <mohdfarhanfahrezy@gmail.com>
Date: Fri, 5 Apr 2024 09:41:48 +0700
Subject: [PATCH] feat: calling transaction from db

---
 .idea/deploymentTargetDropDown.xml            | 12 ++++
 .../java/com/example/bondoman/MainActivity.kt |  6 ++
 .../example/bondoman/models/Transaction.kt    |  1 +
 .../example/bondoman/room/TransactionDao.kt   |  2 +-
 .../example/bondoman/ui/chart/ChartEvent.kt   |  5 ++
 .../bondoman/ui/chart/ChartFragment.kt        | 64 +++++++++++--------
 .../example/bondoman/ui/chart/ChartState.kt   |  7 ++
 .../bondoman/ui/chart/ChartViewModel.kt       | 50 +++++++++++++++
 .../bondoman/ui/settings/SettingsFragment.kt  | 12 +---
 9 files changed, 122 insertions(+), 37 deletions(-)
 create mode 100644 app/src/main/java/com/example/bondoman/ui/chart/ChartEvent.kt
 create mode 100644 app/src/main/java/com/example/bondoman/ui/chart/ChartState.kt
 create mode 100644 app/src/main/java/com/example/bondoman/ui/chart/ChartViewModel.kt

diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml
index da20441..2632a8f 100644
--- a/.idea/deploymentTargetDropDown.xml
+++ b/.idea/deploymentTargetDropDown.xml
@@ -4,6 +4,18 @@
     <value>
       <entry key="app">
         <State>
+          <runningDeviceTargetSelectedWithDropDown>
+            <Target>
+              <type value="RUNNING_DEVICE_TARGET" />
+              <deviceKey>
+                <Key>
+                  <type value="SERIAL_NUMBER" />
+                  <value value="RR8R202MELK" />
+                </Key>
+              </deviceKey>
+            </Target>
+          </runningDeviceTargetSelectedWithDropDown>
+          <timeTargetWasSelectedWithDropDown value="2024-04-05T01:18:14.127059300Z" />
           <runningDeviceTargetsSelectedWithDialog>
             <Target>
               <type value="RUNNING_DEVICE_TARGET" />
diff --git a/app/src/main/java/com/example/bondoman/MainActivity.kt b/app/src/main/java/com/example/bondoman/MainActivity.kt
index 2b31907..d1cc0b0 100644
--- a/app/src/main/java/com/example/bondoman/MainActivity.kt
+++ b/app/src/main/java/com/example/bondoman/MainActivity.kt
@@ -26,6 +26,7 @@ import androidx.activity.viewModels
 import com.example.bondoman.models.TransactionViewModel
 import com.example.bondoman.room.BondomanDatabase
 import com.example.bondoman.services.LocationDefault
+import com.example.bondoman.ui.chart.ChartViewModel
 import com.example.bondoman.ui.nointernet.NoInternetFragment
 import com.google.android.gms.location.LocationServices
 import retrofit2.HttpException
@@ -44,11 +45,16 @@ class MainActivity : AppCompatActivity() {
         TransactionViewModel.provideFactory(db.dao,LocationDefault(this,LocationServices.getFusedLocationProviderClient(this)),applicationContext,this)
     }
 
+    private val chartViewModel: ChartViewModel by viewModels {
+        ChartViewModel.provideFactory(db.dao,applicationContext,this)
+    }
+
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         locationPermission()
         d("OKE",viewModel.state.value.toString())
+        d("DONT DELETE",chartViewModel.toString())
         binding = ActivityMainBinding.inflate(layoutInflater)
         setContentView(binding.root)
         replaceFragment(CartFragment(), NoInternetFragment(), "Cart")
diff --git a/app/src/main/java/com/example/bondoman/models/Transaction.kt b/app/src/main/java/com/example/bondoman/models/Transaction.kt
index 6a2900e..e8b1dee 100644
--- a/app/src/main/java/com/example/bondoman/models/Transaction.kt
+++ b/app/src/main/java/com/example/bondoman/models/Transaction.kt
@@ -32,4 +32,5 @@ data class Transaction(
 data class TransactionStats(
     val kategori: Transaction.Category,
     val total: Float,
+    val count: Float,
 )
diff --git a/app/src/main/java/com/example/bondoman/room/TransactionDao.kt b/app/src/main/java/com/example/bondoman/room/TransactionDao.kt
index d288436..8e946a4 100644
--- a/app/src/main/java/com/example/bondoman/room/TransactionDao.kt
+++ b/app/src/main/java/com/example/bondoman/room/TransactionDao.kt
@@ -33,7 +33,7 @@ interface TransactionDao {
     @Query("DELETE FROM `transaction`")
     suspend fun deleteAll()
 
-    @Query("SELECT kategori, SUM(nominal) AS total FROM `transaction` GROUP BY kategori")
+    @Query("SELECT kategori, SUM(nominal) AS total, COUNT() as count FROM `transaction` GROUP BY kategori")
     fun getTransactionStats(): Flow<List<TransactionStats>>
 
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/example/bondoman/ui/chart/ChartEvent.kt b/app/src/main/java/com/example/bondoman/ui/chart/ChartEvent.kt
new file mode 100644
index 0000000..a0bc829
--- /dev/null
+++ b/app/src/main/java/com/example/bondoman/ui/chart/ChartEvent.kt
@@ -0,0 +1,5 @@
+package com.example.bondoman.ui.chart
+
+sealed interface ChartEvent {
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/bondoman/ui/chart/ChartFragment.kt b/app/src/main/java/com/example/bondoman/ui/chart/ChartFragment.kt
index 3aca81f..2e491f9 100644
--- a/app/src/main/java/com/example/bondoman/ui/chart/ChartFragment.kt
+++ b/app/src/main/java/com/example/bondoman/ui/chart/ChartFragment.kt
@@ -2,22 +2,31 @@ package com.example.bondoman.ui.chart
 
 import android.graphics.Color
 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 android.widget.Button
+import androidx.fragment.app.activityViewModels
 import com.example.bondoman.R
 import com.example.bondoman.databinding.FragmentChartBinding
-import com.example.bondoman.databinding.FragmentLoginBinding
 import com.example.bondoman.models.Transaction
 import com.example.bondoman.models.TransactionStats
-import com.example.bondoman.services.TransactionEvent
 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.utils.ColorTemplate
+import android.util.Log.d
+import androidx.lifecycle.lifecycleScope
+import com.example.bondoman.models.TransactionViewModel
+import com.example.bondoman.services.TransactionEvent
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.collect
 
 class ChartFragment : Fragment() {
 
@@ -29,6 +38,8 @@ class ChartFragment : Fragment() {
 
     private var transactionsStats : ArrayList<TransactionStats> = ArrayList()
 
+    private val chartViewModel by activityViewModels<ChartViewModel>()
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
     }
@@ -50,31 +61,38 @@ class ChartFragment : Fragment() {
         sortValueButton = binding.sortByValueButton
         sortCountButton = binding.sortByCountButton
 
-        // TODO : FETCH DATA FROM ROOM
-        initDummy()
+        d("GEDEBUGEMING", "breakpoint 1")
+        d("GEDEBUGEMING",chartViewModel.transactionStats.value.toString())
+        d("GEDEBUGEMING", "breakpoint 10")
 
-        generateChart(true,"Sorted by Value")
+        runningBackgroundUpdateUI(true)
 
         sortValueButton.setOnClickListener{
-
-
+            runningBackgroundUpdateUI(true)
         }
 
         sortCountButton.setOnClickListener {
-            generateChart(false, "Sorted by Count")
+            runningBackgroundUpdateUI(false)
+        }
+    }
+    private fun runningBackgroundUpdateUI(isSortedByValue: Boolean){
+        CoroutineScope(Dispatchers.Main).launch {
+            chartViewModel.transactionStats.value.collect { stats ->
+                transactionsStats.clear()
+                transactionsStats.addAll(stats)
+                generateChart(transactionsStats,isSortedByValue)
+            }
         }
-
-
     }
 
-    fun generateChart(sortByValue: Boolean, chartTitle: String){
+    private fun generateChart(transactionStats: List<TransactionStats>, isSortedByValue: Boolean){
         val list:ArrayList<PieEntry> = ArrayList()
 
-        for(transaction in transactionsStats){
-            if(sortByValue){
-                list.add(PieEntry(transaction.total, transaction.kategori))
+        for(stats in transactionStats){
+            if(isSortedByValue){
+                list.add(PieEntry(stats.total, stats.kategori.toString()))
             } else {
-                list.add(PieEntry(transaction.total, transaction.kategori))
+                list.add(PieEntry(stats.count, stats.kategori.toString()))
             }
         }
 
@@ -90,18 +108,12 @@ class ChartFragment : Fragment() {
 
         pieChart.description.text= "Pie Chart"
 
-        pieChart.centerText=chartTitle
+        if(isSortedByValue){
+            pieChart.centerText = "Sorted by Value"
+        } else {
+            pieChart.centerText = "Sorted by Count"
+        }
 
         pieChart.animateY(1000)
     }
-
-    fun initDummy(){
-        transactionsStats.add(
-            TransactionStats(kategori = Transaction.Category.PEMBELIAN, total = 6868f)
-        )
-
-        transactionsStats.add(
-            TransactionStats(kategori = Transaction.Category.PENJUALAN, total = 7878f)
-        )
-    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/example/bondoman/ui/chart/ChartState.kt b/app/src/main/java/com/example/bondoman/ui/chart/ChartState.kt
new file mode 100644
index 0000000..aa630cd
--- /dev/null
+++ b/app/src/main/java/com/example/bondoman/ui/chart/ChartState.kt
@@ -0,0 +1,7 @@
+package com.example.bondoman.ui.chart
+
+import com.example.bondoman.models.TransactionStats
+
+data class ChartState(
+    val transactionStats : List<TransactionStats> = emptyList(),
+)
diff --git a/app/src/main/java/com/example/bondoman/ui/chart/ChartViewModel.kt b/app/src/main/java/com/example/bondoman/ui/chart/ChartViewModel.kt
new file mode 100644
index 0000000..9f5a8e1
--- /dev/null
+++ b/app/src/main/java/com/example/bondoman/ui/chart/ChartViewModel.kt
@@ -0,0 +1,50 @@
+package com.example.bondoman.ui.chart
+
+import android.content.Context
+import android.os.Bundle
+import androidx.lifecycle.AbstractSavedStateViewModelFactory
+import androidx.lifecycle.SavedStateHandle
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import androidx.savedstate.SavedStateRegistryOwner
+import com.example.bondoman.models.Transaction
+import com.example.bondoman.models.TransactionStats
+import com.example.bondoman.room.TransactionDao
+import com.example.bondoman.services.LocationClient
+import com.example.bondoman.services.TransactionState
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.flow.collectLatest
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.flow.stateIn
+
+@OptIn(ExperimentalCoroutinesApi::class)
+class ChartViewModel(private val dao: TransactionDao, private val context: Context): ViewModel() {
+    private val _state = MutableStateFlow(ChartState())
+    private val _transactionStats = MutableStateFlow(dao.getTransactionStats() )
+    val transactionStats = _transactionStats.asStateFlow()
+
+    // Define ViewModel factory in a companion object
+    companion object {
+        fun provideFactory(
+            dao: TransactionDao,
+            context: Context,
+            owner: SavedStateRegistryOwner,
+            defaultArgs: Bundle? = null,
+        ): AbstractSavedStateViewModelFactory =
+            object : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
+                @Suppress("UNCHECKED_CAST")
+                override fun <T : ViewModel> create(
+                    key: String,
+                    modelClass: Class<T>,
+                    handle: SavedStateHandle
+                ): T {
+                    return ChartViewModel(dao, context) as T
+                }
+            }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/bondoman/ui/settings/SettingsFragment.kt b/app/src/main/java/com/example/bondoman/ui/settings/SettingsFragment.kt
index 86d7830..f72fad6 100644
--- a/app/src/main/java/com/example/bondoman/ui/settings/SettingsFragment.kt
+++ b/app/src/main/java/com/example/bondoman/ui/settings/SettingsFragment.kt
@@ -13,22 +13,14 @@ import com.example.bondoman.R
 import com.example.bondoman.databinding.FragmentChartBinding
 import com.example.bondoman.databinding.FragmentSettingsBinding
 
-// 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"
-
-/**
- * A simple [Fragment] subclass.
- * Use the [SettingsFragment.newInstance] factory method to
- * create an instance of this fragment.
- */
 class SettingsFragment : Fragment() {
     private lateinit var binding: FragmentSettingsBinding
     private lateinit var saveButton: Button
     private lateinit var sendButton: Button
     private lateinit var logoutButton: Button
 
+
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
     }
-- 
GitLab