From 7e5228bb35983dde2d2a11fb6905ab9dc2356bb6 Mon Sep 17 00:00:00 2001 From: Mariya Date: Tue, 6 Feb 2024 14:53:35 +0530 Subject: [PATCH] Added code for Device Diagnostics --- .../hpostesting/data/api/MolbioResultApi.kt | 6 ++ .../devicediagnostics/AdditionalDetails.kt | 15 +++ .../DeviceDiagnosticsResponse.kt | 12 +++ .../data/repository/DatabaseRepository.kt | 4 + .../hpostesting/data/repository/Repository.kt | 2 +- .../diagnostics/DiagnosticsFragment.kt | 58 ++++++++++++ .../diagnostics/DiagnosticsViewModel.kt | 91 ++++++++++++++++++- 7 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/example/hpostesting/data/model/devicediagnostics/AdditionalDetails.kt create mode 100644 app/src/main/java/com/example/hpostesting/data/model/devicediagnostics/DeviceDiagnosticsResponse.kt diff --git a/app/src/main/java/com/example/hpostesting/data/api/MolbioResultApi.kt b/app/src/main/java/com/example/hpostesting/data/api/MolbioResultApi.kt index 0b653bb..7ecad4a 100644 --- a/app/src/main/java/com/example/hpostesting/data/api/MolbioResultApi.kt +++ b/app/src/main/java/com/example/hpostesting/data/api/MolbioResultApi.kt @@ -36,4 +36,10 @@ interface MolbioResultApi { suspend fun uploadLogs( @Part logFile: MultipartBody.Part ): UploadLogsResponse + + + @POST("deviceService/device/uploadDeviceDiagnostics") + suspend fun deviceDiagnostics( + @Body deviceDiagnosticsRequest: DeviceDiagnosticsRequest + ): DeviceDiagnosticsResponse } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpostesting/data/model/devicediagnostics/AdditionalDetails.kt b/app/src/main/java/com/example/hpostesting/data/model/devicediagnostics/AdditionalDetails.kt new file mode 100644 index 0000000..7bf8d31 --- /dev/null +++ b/app/src/main/java/com/example/hpostesting/data/model/devicediagnostics/AdditionalDetails.kt @@ -0,0 +1,15 @@ +package com.example.hpostesting.data.model.devicediagnostics + +import com.google.gson.annotations.SerializedName + +data class AdditionalDetails( + @SerializedName("Data") + val data: DeviceDiagnosticsData?, + @SerializedName("Message") + val message: String? = "", + @SerializedName("Result") + val result: String? = "" +) +data class DeviceDiagnosticsRequest( + @SerializedName("additionalDetails") val additionalDetails: AdditionalDetails1 +) diff --git a/app/src/main/java/com/example/hpostesting/data/model/devicediagnostics/DeviceDiagnosticsResponse.kt b/app/src/main/java/com/example/hpostesting/data/model/devicediagnostics/DeviceDiagnosticsResponse.kt new file mode 100644 index 0000000..1c86153 --- /dev/null +++ b/app/src/main/java/com/example/hpostesting/data/model/devicediagnostics/DeviceDiagnosticsResponse.kt @@ -0,0 +1,12 @@ +package com.example.hpostesting.data.model.devicediagnostics + +import com.google.gson.annotations.SerializedName + +data class DeviceDiagnosticsResponse( + @SerializedName("Data") + val data: DeviceDiagnosticsData?, + @SerializedName("Message") + val message: String? = "", + @SerializedName("Result") + val result: String? = "" +) diff --git a/app/src/main/java/com/example/hpostesting/data/repository/DatabaseRepository.kt b/app/src/main/java/com/example/hpostesting/data/repository/DatabaseRepository.kt index bffe71e..00556b2 100644 --- a/app/src/main/java/com/example/hpostesting/data/repository/DatabaseRepository.kt +++ b/app/src/main/java/com/example/hpostesting/data/repository/DatabaseRepository.kt @@ -77,6 +77,10 @@ class DatabaseRepository @Inject constructor( return safeApiCall { molbioResultApi.deviceUpdate(deviceUpdateRequest) } } + override suspend fun deviceDiagnostics(deviceDiagnosticsRequest: DeviceDiagnosticsRequest): Result { + return safeApiCall { molbioAuthApi.deviceDiagnostics(deviceDiagnosticsRequest) } + } + override suspend fun uploadLogs(logFile: MultipartBody.Part): Result { return safeApiCall { molbioResultApi.uploadLogs(logFile) } } diff --git a/app/src/main/java/com/example/hpostesting/data/repository/Repository.kt b/app/src/main/java/com/example/hpostesting/data/repository/Repository.kt index cd3e9b5..94c61c0 100644 --- a/app/src/main/java/com/example/hpostesting/data/repository/Repository.kt +++ b/app/src/main/java/com/example/hpostesting/data/repository/Repository.kt @@ -44,6 +44,6 @@ interface Repository { suspend fun checkUpdate(checkUpdateRequest: CheckUpdateRequest): Result suspend fun deviceUpdate(deviceUpdateRequest: DeviceUpdateRequest): Result - + suspend fun deviceDiagnostics(deviceDiagnosticsRequest: DeviceDiagnosticsRequest): Result suspend fun uploadLogs(logFile: MultipartBody.Part): Result } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsFragment.kt index 5238824..874b949 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsFragment.kt @@ -13,6 +13,8 @@ import androidx.fragment.app.activityViewModels import androidx.lifecycle.MutableLiveData import com.example.hpostesting.data.constant.Constants import com.example.hpostesting.data.constant.HemoCubeCommands +import com.example.hpostesting.data.model.devicediagnostics.AdditionalDetails1 +import com.example.hpostesting.data.model.devicediagnostics.DeviceDiagnosticsRequest import com.example.hpostesting.data.model.diagnostics.DiagnosticsData import com.example.hpostesting.data.model.patient.DeviceData import com.example.hpostesting.presentation.UsbServiceListener @@ -56,6 +58,22 @@ class DiagnosticsFragment : Fragment() { binding.btnSubmit.setOnClickListener { binding.btnSubmit.visibility = View.GONE runDeviceDiagnostics() + val batteryLevel = diagnosticsViewModel.getBatteryLevel().toString() + val batteryCapacity = context?.let { diagnosticsViewModel.getBatteryCapacity(it).toString() } + val batteryMaxCapacity = context?.let { diagnosticsViewModel.getBatteryMaxCapacity(it).toString() } + val batteryTemperature = diagnosticsViewModel.getBatteryTemperature().toString() + val batteryVoltage = context?.let { diagnosticsViewModel.getBatteryVoltage(it).toString() } + + val additionalDetails = AdditionalDetails1( + batteryLevel = batteryLevel, + batteryCapacity = batteryCapacity!!, + batteryMaxCapacity = batteryMaxCapacity!!, + batteryTemperature = batteryTemperature, + batteryVoltage = batteryVoltage!! + ) + diagnosticsViewModel.deviceDiagnostics( + DeviceDiagnosticsRequest(additionalDetails = additionalDetails) + ) } } @@ -80,9 +98,49 @@ class DiagnosticsFragment : Fragment() { } binding.progressBar.visibility = View.GONE + + } + + diagnosticsViewModel.deviceDiagnosticsResponse.observe(viewLifecycleOwner) { response -> + when (response) { + is Result.Success-> { + + val result = response.data?.result + if (result == "Success") { + Toast.makeText( + activity, response.data?.message ?: "Device diagnostics uploaded successfully", Toast.LENGTH_LONG + ).show() + + response.data?.data?.let { diagnosticsData -> + + val batteryLevel = diagnosticsData.additionalDetails.batteryLevel + + } + } else { + Toast.makeText( + activity, + "Received success response but the result is not successful: ${response.data?.message}", + Toast.LENGTH_LONG + ).show() + } + } + is Result.Error -> { + // Handle the error scenario + Toast.makeText( + activity, + "An error occurred: ${response.exception.message}", + Toast.LENGTH_LONG + ).show() + } + is Result.Loading -> { + } + } } } + + + private fun getDeviceId() { diagnosticsViewModel.progressBar.postValue(true) (activity as DiagnosticsActivity).mService.sendAndListenToHemoCube( diff --git a/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsViewModel.kt b/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsViewModel.kt index 91b4c0b..1ef3899 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsViewModel.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsViewModel.kt @@ -1,5 +1,9 @@ package com.example.hpostesting.presentation.diagnostics +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.BatteryManager import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -12,7 +16,8 @@ import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel class DiagnosticsViewModel @Inject constructor( - private val repository: Repository + private val repository: Repository, + context: Context, ) : ViewModel() { var isServiceConnected = false val progressBar = MutableLiveData(false) @@ -20,6 +25,11 @@ class DiagnosticsViewModel @Inject constructor( val deviceData = MutableLiveData() val fireBaseUpload = MutableLiveData() + val deviceDiagnosticsResponse = MutableLiveData>() + private val batteryStatus: Intent? = + IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { ifilter -> + context.registerReceiver(null, ifilter) + } fun addDiagnosticsDataToDb(data: DiagnosticsData) { viewModelScope.launch { @@ -43,4 +53,83 @@ class DiagnosticsViewModel @Inject constructor( } } } + + + + fun deviceDiagnostics(deviceDiagnosticsRequest: DeviceDiagnosticsRequest) = viewModelScope.launch { + deviceDiagnosticsResponse.postValue(Result.Loading()) + repository.deviceDiagnostics(deviceDiagnosticsRequest).let { + deviceDiagnosticsResponse.postValue(it) + } + } + + + fun getBatteryLevel(): Float? { + val batteryPct: Float? = batteryStatus?.let { intent -> + val level: Int = + intent.getIntExtra( + BatteryManager.EXTRA_LEVEL, + -1 + ) + val scale: Int = + intent.getIntExtra( + BatteryManager.EXTRA_SCALE, + -1 + ) + level * 100 / scale.toFloat() + } + + return batteryPct + } + + fun getBatteryTemperature(): Float? { + val batteryTemp: Float? = batteryStatus?.let { intent -> + val temperature = intent.getIntExtra( + BatteryManager.EXTRA_TEMPERATURE, + 0 + ) + temperature.toFloat() / 10 + } + + return batteryTemp + } + + fun getBatteryVoltage(context: Context): Float { + val batteryIntent = + context.registerReceiver( + null, + IntentFilter(Intent.ACTION_BATTERY_CHANGED) + ) + val voltage = batteryIntent?.getIntExtra( + BatteryManager.EXTRA_VOLTAGE, + 0 + ) ?: 0 + + // milli-volts to volts + return voltage.toFloat() / 1000 + } + + + fun getBatteryCapacity(context: Context): Int { + val batteryManager = + context.getSystemService(Context.BATTERY_SERVICE) as BatteryManager + val currentCapacity = + batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER) + + return currentCapacity + } + + fun getBatteryMaxCapacity(context: Context): Float { + val batteryManager = context.getSystemService(Context.BATTERY_SERVICE) as BatteryManager + val designCapacity = + batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY) + val currentCapacity = + batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER) + + // Calculate the estimated maximum battery capacity in mAh + val maxCapacity = currentCapacity.toFloat() / designCapacity.toFloat() * 100 + + return maxCapacity + } + } \ No newline at end of file