Ver código fonte

show all measures for selected person and measureType
add refresh button and logic for it

MrOzOn 5 anos atrás
pai
commit
1939516b74

+ 2 - 2
core_api/src/main/java/com/mrozon/core_api/network/HealthDiaryService.kt

@@ -6,8 +6,8 @@ import retrofit2.http.*
 
 interface HealthDiaryService {
     companion object {
-//        const val ENDPOINT = "http://10.0.2.2:8000/"
-        const val ENDPOINT = "https://hdb.mr-ozon-1982.tk/"
+        const val ENDPOINT = "http://10.0.2.2:8000/"
+//        const val ENDPOINT = "https://hdb.mr-ozon-1982.tk/"
     }
 
     @POST("login/")

+ 2 - 0
feature_measure/src/main/java/com/mrozon/feature_measure/data/MeasureRepository.kt

@@ -12,4 +12,6 @@ interface MeasureRepository {
     fun loadProfilePersonAndMeasureTypes(id: Long): Flow<Result<Pair<Person,List<MeasureType>>>>
 
     fun loadMeasure(personId: Long, measureTypeId: Long): Flow<Result<MeasureHistory>>
+
+    fun loadMeasureOnlyNetwork(personId: Long, measureTypeId: Long): Flow<Result<List<Measure>>>
 }

+ 23 - 0
feature_measure/src/main/java/com/mrozon/feature_measure/data/MeasureRepositoryImpl.kt

@@ -66,5 +66,28 @@ class MeasureRepositoryImpl @Inject constructor(
         }
     }
 
+    override fun loadMeasureOnlyNetwork(personId: Long, measureTypeId: Long): Flow<Result<List<Measure>>> {
+        return  flow {
+            emit(Result.loading())
+            try {
+                val networkResult = dataSource.getMeasure(personId, measureTypeId)
+                if (networkResult.status == Result.Status.SUCCESS) {
+                    val data = networkResult.data!!
+                    val measureList = data.map { measureResponse ->
+                        measureResponse.toMeasure()
+                    }
+                    val measuresDb = mapperMeasure.map(measureList)
+                    dao.reloadMeasure(measuresDb)
+                    emit(Result.success(measureList))
+                } else if (networkResult.status == Result.Status.ERROR) {
+                    emit(Result.error(networkResult.message!!))
+                }
+            }
+            catch (e: Exception){
+                emit(Result.error(e.message!!))
+            }
+        }
+    }
+
 
 }

+ 54 - 4
feature_measure/src/main/java/com/mrozon/feature_measure/presentation/ListMeasureFragment.kt

@@ -2,17 +2,20 @@ package com.mrozon.feature_measure.presentation
 
 import android.content.Context
 import android.os.Bundle
-import android.view.View
+import android.view.*
 import android.widget.Toast
 import androidx.fragment.app.viewModels
 import androidx.lifecycle.Observer
 import androidx.lifecycle.ViewModelProvider
+import androidx.recyclerview.widget.DividerItemDecoration
 import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
 import com.mrozon.core_api.entity.Measure
 import com.mrozon.feature_measure.R
 import com.mrozon.feature_measure.databinding.FragmentListMeasureBinding
 import com.mrozon.feature_measure.di.TabMeasureFragmentComponent
 import com.mrozon.utils.base.BaseFragment
+import com.mrozon.utils.extension.hideKeyboard
 import com.mrozon.utils.extension.setTitleActionBar
 import com.mrozon.utils.extension.visible
 import com.mrozon.utils.network.Result
@@ -35,10 +38,39 @@ class ListMeasureFragment : BaseFragment<FragmentListMeasureBinding>() {
         }
     }
 
+    private var adapter: ListMeasureAdapter? = null
+
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        setHasOptionsMenu(true)
+        return super.onCreateView(inflater, container, savedInstanceState)
+    }
+
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
         val manager = LinearLayoutManager(context)
-        binding?.rvMeasure?.layoutManager = manager
+        binding?.rvMeasure?.apply {
+            layoutManager = manager
+            addItemDecoration(DividerItemDecoration(requireContext(),DividerItemDecoration.VERTICAL))
+        }
+    }
+
+    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
+        inflater.inflate(R.menu.list_measure_menu, menu)
+        return super.onCreateOptionsMenu(menu, inflater)
+    }
+
+    override fun onOptionsItemSelected(item: MenuItem): Boolean {
+        hideKeyboard()
+        when(item.itemId){
+            R.id.refreshMeasuresNetwork -> {
+                viewModel.refreshMeasuresNetwork()
+            }
+        }
+        return false
     }
 
     override fun onResume() {
@@ -79,7 +111,7 @@ class ListMeasureFragment : BaseFragment<FragmentListMeasureBinding>() {
                         val measureType = result.data?.second
                         val measures = result.data?.third
                         Timber.d("measures contains ${measures?.size} items")
-                        val adapter = ListMeasureAdapter(measureType!!, object:
+                        adapter = ListMeasureAdapter(measureType!!, object:
                             ListMeasureAdapter.ListMeasureClickListener {
                             override fun onClick(measure: Measure) {
 
@@ -90,7 +122,25 @@ class ListMeasureFragment : BaseFragment<FragmentListMeasureBinding>() {
                             }
                         })
                         binding?.rvMeasure?.adapter = adapter
-                        adapter.submitList(measures)
+                        adapter?.submitList(measures)
+                    }
+                    Result.Status.ERROR -> {
+                        binding?.progressBar?.visible(false)
+                        showError(result.message!!)
+                    }
+                }
+            }
+        })
+
+        viewModel.measures.observe(viewLifecycleOwner, Observer { event ->
+            event.peekContent().let { result ->
+                when (result.status) {
+                    Result.Status.LOADING -> {
+                        binding?.progressBar?.visible(true)
+                    }
+                    Result.Status.SUCCESS -> {
+                        binding?.progressBar?.visible(false)
+                        adapter?.submitList(result.data)
                     }
                     Result.Status.ERROR -> {
                         binding?.progressBar?.visible(false)

+ 19 - 0
feature_measure/src/main/java/com/mrozon/feature_measure/presentation/ListMeasureFragmentViewModel.kt

@@ -3,6 +3,7 @@ package com.mrozon.feature_measure.presentation
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.viewModelScope
+import com.mrozon.core_api.entity.Measure
 import com.mrozon.core_api.entity.MeasureHistory
 import com.mrozon.core_api.entity.MeasureType
 import com.mrozon.core_api.entity.Person
@@ -26,6 +27,10 @@ class ListMeasureFragmentViewModel @Inject constructor(
     val initialData: LiveData<Event<Result<MeasureHistory>>>
         get() = _initialData
 
+    private var _measures = MutableLiveData<Event<Result<List<Measure>>>>()
+    val measures: LiveData<Event<Result<List<Measure>>>>
+        get() = _measures
+
     fun initialLoadData(personId: Long, measureTypeId: Long) {
         if(_initialData.value == null) {
             viewModelScope.launch(coroutineContextProvider.IO) {
@@ -38,5 +43,19 @@ class ListMeasureFragmentViewModel @Inject constructor(
         }
     }
 
+    fun refreshMeasuresNetwork() {
+        if(_initialData.value == null)
+            return
+        val personId = _initialData.value?.peekContent()?.data?.first?.id?:-1
+        val measureTypeId = _initialData.value?.peekContent()?.data?.second?.id?:-1
+        viewModelScope.launch(coroutineContextProvider.IO) {
+            repository.loadMeasureOnlyNetwork(personId, measureTypeId).collect {
+                withContext(coroutineContextProvider.Main) {
+                    _measures.value = Event(it)
+                }
+            }
+        }
+    }
+
 
 }

+ 5 - 0
feature_measure/src/main/res/drawable/ic_refresh_24.xml

@@ -0,0 +1,5 @@
+<vector android:height="24dp" android:tint="#FFFFFF"
+    android:viewportHeight="24" android:viewportWidth="24"
+    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M17.65,6.35C16.2,4.9 14.21,4 12,4c-4.42,0 -7.99,3.58 -7.99,8s3.57,8 7.99,8c3.73,0 6.84,-2.55 7.73,-6h-2.08c-0.82,2.33 -3.04,4 -5.65,4 -3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6c1.66,0 3.14,0.69 4.22,1.78L13,11h7V4l-2.35,2.35z"/>
+</vector>

+ 11 - 0
feature_measure/src/main/res/menu/list_measure_menu.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item
+        android:id="@+id/refreshMeasuresNetwork"
+        android:icon="@drawable/ic_refresh_24"
+        android:title="@string/refresh"
+        app:showAsAction="ifRoom" />
+
+</menu>

+ 1 - 0
feature_measure/src/main/res/values/strings.xml

@@ -2,4 +2,5 @@
 <resources>
     <string name="ivTimeOfDay">Time of day</string>
     <string name="ivMeasureComment">comment</string>
+    <string name="refresh">Refresh</string>
 </resources>