diff --git a/app/src/main/java/com/example/hpostesting/data/api/MolbioAuthApi.kt b/app/src/main/java/com/example/hpostesting/data/api/MolbioAuthApi.kt index b192d44..1c5af49 100644 --- a/app/src/main/java/com/example/hpostesting/data/api/MolbioAuthApi.kt +++ b/app/src/main/java/com/example/hpostesting/data/api/MolbioAuthApi.kt @@ -1,5 +1,7 @@ package com.example.hpostesting.data.api +import com.example.hpostesting.data.model.devicediagnostics.DeviceDiagnosticsRequest +import com.example.hpostesting.data.model.devicediagnostics.DeviceDiagnosticsResponse import com.example.hpostesting.data.model.deviceprovision.DeviceProvisionRequest import com.example.hpostesting.data.model.deviceprovision.DeviceProvisionResponse import com.example.hpostesting.data.model.login.LoginRequest @@ -18,4 +20,5 @@ interface MolbioAuthApi { suspend fun login( @Body loginRequest: LoginRequest, ): LoginResponse + } \ No newline at end of file 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 57d8625..55ba38b 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 @@ -1,5 +1,7 @@ package com.example.hpostesting.data.api +import com.example.hpostesting.data.model.devicediagnostics.DeviceDiagnosticsRequest +import com.example.hpostesting.data.model.devicediagnostics.DeviceDiagnosticsResponse import com.example.hpostesting.data.model.log.UploadLogsResponse import com.example.hpostesting.data.model.molbioresult.MolbioV2ResultRequest import com.example.hpostesting.data.model.molbioresult.MolbioV2ResultResponse @@ -41,4 +43,10 @@ interface MolbioResultApi { suspend fun uploadLogs( @Part logFile: MultipartBody.Part, ): UploadLogsResponse + + + @PUT("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..e72029c --- /dev/null +++ b/app/src/main/java/com/example/hpostesting/data/model/devicediagnostics/AdditionalDetails.kt @@ -0,0 +1,14 @@ +package com.example.hpostesting.data.model.devicediagnostics + +data class AdditionalDetails( + val batteryLevel: String? = "", + val batteryCapacity: String? = "", + val batteryMaxCapacity: String? = "", + val batteryTemperature: String? = "", + val batteryVoltage: String? = "", +) + + + + + diff --git a/app/src/main/java/com/example/hpostesting/data/model/devicediagnostics/DeviceDiagnosticsData.kt b/app/src/main/java/com/example/hpostesting/data/model/devicediagnostics/DeviceDiagnosticsData.kt new file mode 100644 index 0000000..6effb6a --- /dev/null +++ b/app/src/main/java/com/example/hpostesting/data/model/devicediagnostics/DeviceDiagnosticsData.kt @@ -0,0 +1,12 @@ +package com.example.hpostesting.data.model.devicediagnostics + +data class DeviceDiagnosticsData( + val id: String? = "", + val deviceId: String? = "", + val additionalDetails: AdditionalDetails?= AdditionalDetails(), + val createdBy: String? = "", + val updatedBy: String? = "", + val updatedAt: String? = "", + val createdAt: String? = "", +) + diff --git a/app/src/main/java/com/example/hpostesting/data/model/devicediagnostics/DeviceDiagnosticsRequest.kt b/app/src/main/java/com/example/hpostesting/data/model/devicediagnostics/DeviceDiagnosticsRequest.kt new file mode 100644 index 0000000..27218ae --- /dev/null +++ b/app/src/main/java/com/example/hpostesting/data/model/devicediagnostics/DeviceDiagnosticsRequest.kt @@ -0,0 +1,5 @@ +package com.example.hpostesting.data.model.devicediagnostics + +data class DeviceDiagnosticsRequest( + val additionalDetails: AdditionalDetails?= AdditionalDetails() +) 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..55b66c8 --- /dev/null +++ b/app/src/main/java/com/example/hpostesting/data/model/devicediagnostics/DeviceDiagnosticsResponse.kt @@ -0,0 +1,11 @@ +package com.example.hpostesting.data.model.devicediagnostics + +import com.google.gson.annotations.SerializedName + + +data class DeviceDiagnosticsResponse( + @SerializedName("Data") + val data: DeviceDiagnosticsData? = DeviceDiagnosticsData(), + val message: String? = "", + 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 f4b35b5..4c49cc8 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 @@ -6,6 +6,8 @@ import com.example.hpostesting.data.api.MolbioAuthApi import com.example.hpostesting.data.api.MolbioResultApi import com.example.hpostesting.data.model.PendingUploads import com.example.hpostesting.data.model.Response +import com.example.hpostesting.data.model.devicediagnostics.DeviceDiagnosticsRequest +import com.example.hpostesting.data.model.devicediagnostics.DeviceDiagnosticsResponse import com.example.hpostesting.data.model.deviceprovision.DeviceProvisionRequest import com.example.hpostesting.data.model.deviceprovision.DeviceProvisionResponse import com.example.hpostesting.data.model.diagnostics.DiagnosticsData @@ -78,6 +80,10 @@ class DatabaseRepository @Inject constructor( return safeApiCall { molbioResultApi.deviceUpdate(deviceUpdateRequest) } } + override suspend fun deviceDiagnostics(deviceDiagnosticsRequest: DeviceDiagnosticsRequest): Result { + return safeApiCall { molbioResultApi.deviceDiagnostics(deviceDiagnosticsRequest) } + } + override suspend fun downloadClientCertificate(): Result { return safeApiCall { molbioResultApi.downloadClientCertificate() } } 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 3a35715..8c3f995 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 @@ -2,6 +2,8 @@ package com.example.hpostesting.data.repository import com.example.hpostesting.data.Result import com.example.hpostesting.data.model.Response +import com.example.hpostesting.data.model.devicediagnostics.DeviceDiagnosticsRequest +import com.example.hpostesting.data.model.devicediagnostics.DeviceDiagnosticsResponse import com.example.hpostesting.data.model.deviceprovision.DeviceProvisionRequest import com.example.hpostesting.data.model.deviceprovision.DeviceProvisionResponse import com.example.hpostesting.data.model.diagnostics.DiagnosticsData @@ -49,7 +51,7 @@ interface Repository { suspend fun checkUpdate(checkUpdateRequest: CheckUpdateRequest): Result suspend fun deviceUpdate(deviceUpdateRequest: DeviceUpdateRequest): Result - + suspend fun deviceDiagnostics(deviceDiagnosticsRequest: DeviceDiagnosticsRequest): Result suspend fun downloadClientCertificate(): 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 9344881..29789e5 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 @@ -1,6 +1,8 @@ package com.example.hpostesting.presentation.diagnostics import android.content.Context +import android.content.Intent +import android.content.IntentFilter import android.content.SharedPreferences import android.os.Bundle import android.util.Log @@ -11,8 +13,12 @@ import android.widget.Toast import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.lifecycle.MutableLiveData +import com.example.hpostesting.data.Result +import com.example.hpostesting.data.Result.Success import com.example.hpostesting.data.constant.Constants import com.example.hpostesting.data.constant.HemoCubeCommands +import com.example.hpostesting.data.model.devicediagnostics.AdditionalDetails +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 @@ -32,7 +38,10 @@ class DiagnosticsFragment : Fragment() { private var resultData: String = "" private val messages = MutableLiveData() private var startListening = MutableLiveData(false) - + private val batteryStatus: Intent? = + IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { ifilter -> + context?.registerReceiver(null, ifilter) + } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?, ): View { @@ -56,7 +65,25 @@ 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 = AdditionalDetails( + batteryLevel = batteryLevel, + batteryCapacity = batteryCapacity!!, + batteryMaxCapacity = batteryMaxCapacity!!, + batteryTemperature = batteryTemperature, + batteryVoltage = batteryVoltage!! + ) + diagnosticsViewModel.deviceDiagnostics( + DeviceDiagnosticsRequest(additionalDetails = additionalDetails) + ) } + + } @@ -81,6 +108,42 @@ class DiagnosticsFragment : Fragment() { binding.progressBar.visibility = View.GONE } + + diagnosticsViewModel.deviceDiagnosticsResponse.observe(viewLifecycleOwner) { response -> + when (response) { + is Success -> { + if (response.data.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, + "${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() { @@ -116,6 +179,7 @@ class DiagnosticsFragment : Fragment() { }) } + private fun listenToHemoCube() { val fullReadOutput = StringBuilder() 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 4aff9a6..df8b52e 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,9 +1,18 @@ 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 +import com.example.hpostesting.data.Result import com.example.hpostesting.data.model.Response +import com.example.hpostesting.data.model.devicediagnostics.DeviceDiagnosticsRequest +import com.example.hpostesting.data.model.devicediagnostics.DeviceDiagnosticsResponse +import com.example.hpostesting.data.model.deviceprovision.DeviceProvisionRequest +import com.example.hpostesting.data.model.deviceprovision.DeviceProvisionResponse import com.example.hpostesting.data.model.diagnostics.DiagnosticsData import com.example.hpostesting.data.model.patient.DeviceData import com.example.hpostesting.data.repository.Repository @@ -13,7 +22,8 @@ import javax.inject.Inject @HiltViewModel class DiagnosticsViewModel @Inject constructor( - private val repository: Repository, + private val respository: Repository, + context: Context, ) : ViewModel() { var isServiceConnected = false val progressBar = MutableLiveData(false) @@ -21,11 +31,15 @@ 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 { try { - when (val response = repository.addDiagnostics(data)) { + when (val response = respository.addDiagnostics(data)) { is Response.Success -> { // Log.i("Testdb", "Data uploaded to Firestore successfully") fireBaseUpload.postValue("Success") @@ -44,4 +58,81 @@ class DiagnosticsViewModel @Inject constructor( } } } + + + fun deviceDiagnostics(deviceDiagnosticsRequest: DeviceDiagnosticsRequest) = viewModelScope.launch { + deviceDiagnosticsResponse.postValue(Result.Loading()) + respository.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