From f37c6de28b014af0cdbf278986a668030f54cc55 Mon Sep 17 00:00:00 2001 From: Isidro Henoch Date: Mon, 27 Dec 2021 14:27:17 -0600 Subject: Implements the report functionality, UI is missing --- .../android/details/reports/UnitReportsFragment.kt | 32 ++++- .../details/reports/UnitReportsViewModel.kt | 142 +++++++++++++++++++++ 2 files changed, 171 insertions(+), 3 deletions(-) create mode 100644 androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsViewModel.kt (limited to 'androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports') diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt index a2faec8..dfc0493 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt @@ -1,17 +1,22 @@ package mx.trackermap.TrackerMap.android.details.reports import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import mx.trackermap.TrackerMap.android.databinding.UnitDetailsReportsBinding import mx.trackermap.TrackerMap.android.details.UnitDetailsAdapter +import org.koin.androidx.viewmodel.ext.android.viewModel + +class UnitReportsFragment : Fragment() { -class UnitReportsFragment: Fragment() { private var _binding: UnitDetailsReportsBinding? = null private val binding get() = _binding!! + private val unitReportsViewModel: UnitReportsViewModel by viewModel() + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -23,12 +28,33 @@ class UnitReportsFragment: Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val id = arguments?.getInt(UnitDetailsAdapter.DEVICE_ID_ARG) - binding.unitReportsText.text = "COMMANDS for ID - $id" + + unitReportsViewModel.deviceId.value = + arguments?.getInt(UnitDetailsAdapter.DEVICE_ID_ARG) ?: 0 + setupEvents() + setupObservers() } override fun onDestroyView() { super.onDestroyView() _binding = null } + + private fun setupEvents() { + binding.reportType.setOnPositionChangedListener { position -> + unitReportsViewModel.reportType.value = when (position) { + 0 -> UnitReportsViewModel.ReportType.POSITIONS + 1 -> UnitReportsViewModel.ReportType.EVENTS + else -> UnitReportsViewModel.ReportType.STOPS + } + } + unitReportsViewModel.reportPeriod.value = UnitReportsViewModel.ReportPeriod.DAY + unitReportsViewModel.reportType.value = UnitReportsViewModel.ReportType.POSITIONS + } + + private fun setupObservers() { + unitReportsViewModel.report.observe(this) { report -> + Log.d("UnitReportsFragment", "Report available: $report") + } + } } \ No newline at end of file diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsViewModel.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsViewModel.kt new file mode 100644 index 0000000..808bdda --- /dev/null +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsViewModel.kt @@ -0,0 +1,142 @@ +package mx.trackermap.TrackerMap.android.details.reports + +import android.util.Log +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.ViewModel +import androidx.lifecycle.asFlow +import androidx.lifecycle.viewModelScope +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Date +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.launch +import mx.trackermap.TrackerMap.client.apis.ReportsApi +import mx.trackermap.TrackerMap.client.models.Event +import mx.trackermap.TrackerMap.client.models.Position +import mx.trackermap.TrackerMap.client.models.Stop +import org.koin.core.component.KoinComponent + +class UnitReportsViewModel( + private val reportsApi: ReportsApi, + savedStateHandle: SavedStateHandle +) : ViewModel(), KoinComponent { + + sealed class Report { + class PositionsReport(positions: Array) : Report() + class EventsReport(events: Array) : Report() + class StopsReport(stops: Array) : Report() + } + + enum class ReportType { + POSITIONS, EVENTS, STOPS + } + + enum class ReportPeriod { + DAY, WEEK, MONTH + } + + var deviceId = savedStateHandle.getLiveData("deviceId", 0) + val reportType: MutableLiveData = savedStateHandle.getLiveData("reportType", null) + val reportPeriod: MutableLiveData = + savedStateHandle.getLiveData("reportPeriod", null) + val report: MutableLiveData = MutableLiveData() + + val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") + + init { + viewModelScope.launch { + setupTypeObserver() + } + viewModelScope.launch { + setupPeriodObserver() + } + } + + private suspend fun setupTypeObserver() { + reportType.asFlow().collect { + fetchReport() + } + } + + private suspend fun setupPeriodObserver() { + reportPeriod.asFlow().collect { + fetchReport() + } + } + + private fun fetchReport() { + if (reportType.value == null || reportPeriod.value == null) { + return + } + + val (currentDate, previousDate) = getDates() + Log.d("UnitReportsVM", "Current report type: ${reportType.value.toString()}") + Log.d("UnitReportsVM", "Current report period: ${reportPeriod.value.toString()}") + Log.d("UnitReportsVM", "Current date:${dateFormat.format(currentDate)}") + Log.d("UnitReportsVM", "Previous date:${dateFormat.format(previousDate)}") + + viewModelScope.launch { + when (reportType.value!!) { + ReportType.POSITIONS -> fetchPositions(previousDate, currentDate) + ReportType.EVENTS -> fetchEvents(previousDate, currentDate) + ReportType.STOPS -> fetchStops(previousDate, currentDate) + } + } + } + + private fun getDates(): Pair { + val calendar = Calendar.getInstance() + val currentDate = calendar.time + + calendar.add( + Calendar.DATE, when (reportPeriod.value!!) { + ReportPeriod.DAY -> -1 + ReportPeriod.WEEK -> -7 + ReportPeriod.MONTH -> -30 + } + ) + val previousDate = calendar.time + + return Pair(currentDate, previousDate) + } + + private suspend fun fetchPositions(from: Date, to: Date) { + Log.d("UnitReportsVM", "Fetching positions") + + val result = reportsApi.reportsRouteGet( + dateFormat.format(from), + dateFormat.format(to), + deviceId.value!! + ) + + Log.d("UnitReportsVM", "Positions report: $result") + report.postValue(Report.PositionsReport(result)) + } + + private suspend fun fetchEvents(from: Date, to: Date) { + Log.d("UnitReportsVM", "Fetching events") + + val result = reportsApi.reportsEventsGet( + dateFormat.format(from), + dateFormat.format(to), + deviceId.value!! + ) + + Log.d("UnitReportsVM", "Events report: $result") + report.postValue(Report.EventsReport(result)) + } + + private suspend fun fetchStops(from: Date, to: Date) { + Log.d("UnitReportsVM", "Fetching stops") + + val result = reportsApi.reportsStopsGet( + dateFormat.format(from), + dateFormat.format(to), + deviceId.value!! + ) + + Log.d("UnitReportsVM", "Stops report: $result") + report.postValue(Report.StopsReport(result)) + } +} \ No newline at end of file -- cgit v1.2.3