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