From 7e5228bb35983dde2d2a11fb6905ab9dc2356bb6 Mon Sep 17 00:00:00 2001 From: Mariya Date: Tue, 6 Feb 2024 14:53:35 +0530 Subject: [PATCH 1/6] 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 From 8bc9b1449f1123b7fa83c11a9f3819cb8c710999 Mon Sep 17 00:00:00 2001 From: Mariya Date: Tue, 6 Feb 2024 15:17:46 +0530 Subject: [PATCH 2/6] Added code for Device Diagnostics --- .../hpostesting/data/api/MolbioResultApi.kt | 2 + .../data/repository/DatabaseRepository.kt | 4 +- .../hpostesting/data/repository/Repository.kt | 2 + .../diagnostics/DiagnosticsFragment.kt | 71 ++++++++++--------- .../diagnostics/DiagnosticsViewModel.kt | 14 ++-- 5 files changed, 51 insertions(+), 42 deletions(-) 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 7ecad4a..189ddaf 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 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 00556b2..3c85e1a 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,7 +80,7 @@ class DatabaseRepository @Inject constructor( } override suspend fun deviceDiagnostics(deviceDiagnosticsRequest: DeviceDiagnosticsRequest): Result { - return safeApiCall { molbioAuthApi.deviceDiagnostics(deviceDiagnosticsRequest) } + return safeApiCall { molbioResultApi.deviceDiagnostics(deviceDiagnosticsRequest) } } override suspend fun uploadLogs(logFile: MultipartBody.Part): Result { 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 94c61c0..dfb5d33 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 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 874b949..7fb411f 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 @@ -11,6 +11,7 @@ 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.constant.Constants import com.example.hpostesting.data.constant.HemoCubeCommands import com.example.hpostesting.data.model.devicediagnostics.AdditionalDetails1 @@ -101,41 +102,41 @@ class DiagnosticsFragment : Fragment() { } - 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 -> { - } - } - } +// 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 -> { +// } +// } +// } } 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 1ef3899..031324c 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 @@ -8,6 +8,8 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope 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.diagnostics.DiagnosticsData import com.example.hpostesting.data.model.patient.DeviceData import com.example.hpostesting.data.repository.Repository @@ -56,12 +58,12 @@ class DiagnosticsViewModel @Inject constructor( - fun deviceDiagnostics(deviceDiagnosticsRequest: DeviceDiagnosticsRequest) = viewModelScope.launch { - deviceDiagnosticsResponse.postValue(Result.Loading()) - repository.deviceDiagnostics(deviceDiagnosticsRequest).let { - deviceDiagnosticsResponse.postValue(it) - } - } +// fun deviceDiagnostics(deviceDiagnosticsRequest: DeviceDiagnosticsRequest) = viewModelScope.launch { +// deviceDiagnosticsResponse.postValue(Result.Loading()) +// repository.deviceDiagnostics(deviceDiagnosticsRequest).let { +// deviceDiagnosticsResponse.postValue(it) +// } +// } fun getBatteryLevel(): Float? { From ab1208d9ee5953e0b5a45a54585ad40da362408f Mon Sep 17 00:00:00 2001 From: Mariya Date: Wed, 14 Feb 2024 15:53:38 +0530 Subject: [PATCH 3/6] Device Diagnostics Api structure done successfully --- app/build.gradle | 2 +- app/google-services.json | 186 ++++++++++++++++-- .../hpostesting/data/api/MolbioAuthApi.kt | 3 + .../hpostesting/data/api/MolbioResultApi.kt | 2 +- .../devicediagnostics/AdditionalDetails.kt | 21 +- .../DeviceDiagnosticsData.kt | 12 ++ .../DeviceDiagnosticsRequest.kt | 5 + .../DeviceDiagnosticsResponse.kt | 5 +- .../data/repository/DatabaseRepository.kt | 2 +- .../diagnostics/DiagnosticsFragment.kt | 89 +++++---- .../diagnostics/DiagnosticsViewModel.kt | 24 +-- 11 files changed, 267 insertions(+), 84 deletions(-) create mode 100644 app/src/main/java/com/example/hpostesting/data/model/devicediagnostics/DeviceDiagnosticsData.kt create mode 100644 app/src/main/java/com/example/hpostesting/data/model/devicediagnostics/DeviceDiagnosticsRequest.kt diff --git a/app/build.gradle b/app/build.gradle index c881eb0..def0375 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,7 +16,7 @@ android { // dev - development, quality - qc, uat - User Acceptance Test, preprod - preproduction, prod - production defaultConfig { - applicationId "in.sminnovations.hpostesting.quality" + applicationId "in.sminnovations.hpostesting.dev" minSdk 21 targetSdk 34 versionCode 101 diff --git a/app/google-services.json b/app/google-services.json index 7f4a67b..a73fe1e 100644 --- a/app/google-services.json +++ b/app/google-services.json @@ -1,45 +1,205 @@ { "project_info": { - "project_number": "1004619739289", - "project_id": "hpos-qa", - "storage_bucket": "hpos-qa.appspot.com" + "project_number": "650071678820", + "project_id": "hpos-af3cc", + "storage_bucket": "hpos-af3cc.appspot.com" }, "client": [ { "client_info": { - "mobilesdk_app_id": "1:1004619739289:android:f669b47552748433e5c808", + "mobilesdk_app_id": "1:650071678820:android:f1435a1c07f710036c6471", "android_client_info": { - "package_name": "in.sminnovations.hposregistration.quality" + "package_name": "com.example.hposconsentform" } }, - "oauth_client": [], + "oauth_client": [ + { + "client_id": "650071678820-to41afi9f0gi5r3k6v7pe1e5p96nupcs.apps.googleusercontent.com", + "client_type": 3 + } + ], "api_key": [ { - "current_key": "AIzaSyC4d4GhWHr_NMJAeBvnztQ_yQ3Qe9MAnLs" + "current_key": "AIzaSyAVdNGCev_AFX0qmuZJF6kxzRzXUTeAW5I" } ], "services": { "appinvite_service": { - "other_platform_oauth_client": [] + "other_platform_oauth_client": [ + { + "client_id": "650071678820-to41afi9f0gi5r3k6v7pe1e5p96nupcs.apps.googleusercontent.com", + "client_type": 3 + } + ] } } }, { "client_info": { - "mobilesdk_app_id": "1:1004619739289:android:8397cd1f0357bd89e5c808", + "mobilesdk_app_id": "1:650071678820:android:7865bef608cdee6f6c6471", "android_client_info": { - "package_name": "in.sminnovations.hpostesting.quality" + "package_name": "com.smi.counselling" } }, - "oauth_client": [], + "oauth_client": [ + { + "client_id": "650071678820-to41afi9f0gi5r3k6v7pe1e5p96nupcs.apps.googleusercontent.com", + "client_type": 3 + } + ], "api_key": [ { - "current_key": "AIzaSyC4d4GhWHr_NMJAeBvnztQ_yQ3Qe9MAnLs" + "current_key": "AIzaSyAVdNGCev_AFX0qmuZJF6kxzRzXUTeAW5I" } ], "services": { "appinvite_service": { - "other_platform_oauth_client": [] + "other_platform_oauth_client": [ + { + "client_id": "650071678820-to41afi9f0gi5r3k6v7pe1e5p96nupcs.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:650071678820:android:2925e9ce3417d2386c6471", + "android_client_info": { + "package_name": "in.sminnovations.hemocube" + } + }, + "oauth_client": [ + { + "client_id": "650071678820-srhm9spm9hjn4frcd3r6o02gdhdbtd15.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "in.sminnovations.hemocube", + "certificate_hash": "7714b9268a81d0cf0fb178b0af8dbb630f8fc70a" + } + }, + { + "client_id": "650071678820-to41afi9f0gi5r3k6v7pe1e5p96nupcs.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyAVdNGCev_AFX0qmuZJF6kxzRzXUTeAW5I" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "650071678820-to41afi9f0gi5r3k6v7pe1e5p96nupcs.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:650071678820:android:7569c1cad4fc99916c6471", + "android_client_info": { + "package_name": "in.sminnovations.hposregistration" + } + }, + "oauth_client": [ + { + "client_id": "650071678820-70kp5jvjda4r5diqch2kn4lc40p4f42g.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "in.sminnovations.hposregistration", + "certificate_hash": "7714b9268a81d0cf0fb178b0af8dbb630f8fc70a" + } + }, + { + "client_id": "650071678820-to41afi9f0gi5r3k6v7pe1e5p96nupcs.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyAVdNGCev_AFX0qmuZJF6kxzRzXUTeAW5I" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "650071678820-to41afi9f0gi5r3k6v7pe1e5p96nupcs.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:650071678820:android:f96be19e5d43102b6c6471", + "android_client_info": { + "package_name": "in.sminnovations.hpostesting" + } + }, + "oauth_client": [ + { + "client_id": "650071678820-l87dnr0bdj95get0khgnvfv2an1k6ogq.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "in.sminnovations.hpostesting", + "certificate_hash": "7714b9268a81d0cf0fb178b0af8dbb630f8fc70a" + } + }, + { + "client_id": "650071678820-to41afi9f0gi5r3k6v7pe1e5p96nupcs.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyAVdNGCev_AFX0qmuZJF6kxzRzXUTeAW5I" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "650071678820-to41afi9f0gi5r3k6v7pe1e5p96nupcs.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:650071678820:android:a53292637abb7c0d6c6471", + "android_client_info": { + "package_name": "in.sminnovations.hpostesting.dev" + } + }, + "oauth_client": [ + { + "client_id": "650071678820-to41afi9f0gi5r3k6v7pe1e5p96nupcs.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyAVdNGCev_AFX0qmuZJF6kxzRzXUTeAW5I" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "650071678820-to41afi9f0gi5r3k6v7pe1e5p96nupcs.apps.googleusercontent.com", + "client_type": 3 + } + ] } } } 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 1165024..50a76f0 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 189ddaf..45d89f7 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 @@ -40,7 +40,7 @@ interface MolbioResultApi { ): UploadLogsResponse - @POST("deviceService/device/uploadDeviceDiagnostics") + @PUT("deviceService/device/uploadDeviceDiagnostics") suspend fun deviceDiagnostics( @Body deviceDiagnosticsRequest: DeviceDiagnosticsRequest ): DeviceDiagnosticsResponse 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 index 7bf8d31..e72029c 100644 --- 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 @@ -1,15 +1,14 @@ 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 + 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 index 1c86153..55b66c8 100644 --- 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 @@ -2,11 +2,10 @@ package com.example.hpostesting.data.model.devicediagnostics import com.google.gson.annotations.SerializedName + data class DeviceDiagnosticsResponse( @SerializedName("Data") - val data: DeviceDiagnosticsData?, - @SerializedName("Message") + val data: DeviceDiagnosticsData? = DeviceDiagnosticsData(), 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 3c85e1a..cb279fd 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 @@ -80,7 +80,7 @@ class DatabaseRepository @Inject constructor( } override suspend fun deviceDiagnostics(deviceDiagnosticsRequest: DeviceDiagnosticsRequest): Result { - return safeApiCall { molbioResultApi.deviceDiagnostics(deviceDiagnosticsRequest) } + return safeApiCall { molbioResultApi.deviceDiagnostics(deviceDiagnosticsRequest) } } override suspend fun uploadLogs(logFile: MultipartBody.Part): Result { 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 7fb411f..ced0a6a 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 @@ -12,9 +14,10 @@ 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.AdditionalDetails1 +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 @@ -35,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 { @@ -65,7 +71,7 @@ class DiagnosticsFragment : Fragment() { val batteryTemperature = diagnosticsViewModel.getBatteryTemperature().toString() val batteryVoltage = context?.let { diagnosticsViewModel.getBatteryVoltage(it).toString() } - val additionalDetails = AdditionalDetails1( + val additionalDetails = AdditionalDetails( batteryLevel = batteryLevel, batteryCapacity = batteryCapacity!!, batteryMaxCapacity = batteryMaxCapacity!!, @@ -76,6 +82,8 @@ class DiagnosticsFragment : Fragment() { DeviceDiagnosticsRequest(additionalDetails = additionalDetails) ) } + + } @@ -99,49 +107,45 @@ 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 -> { -// } -// } -// } + 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, + "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( @@ -175,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 031324c..a31f62b 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 @@ -7,9 +7,12 @@ 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 @@ -18,7 +21,7 @@ import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel class DiagnosticsViewModel @Inject constructor( - private val repository: Repository, + private val respository: Repository, context: Context, ) : ViewModel() { var isServiceConnected = false @@ -27,16 +30,15 @@ class DiagnosticsViewModel @Inject constructor( val deviceData = MutableLiveData() val fireBaseUpload = MutableLiveData() - val deviceDiagnosticsResponse = 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") @@ -57,13 +59,12 @@ class DiagnosticsViewModel @Inject constructor( } - -// fun deviceDiagnostics(deviceDiagnosticsRequest: DeviceDiagnosticsRequest) = viewModelScope.launch { -// deviceDiagnosticsResponse.postValue(Result.Loading()) -// repository.deviceDiagnostics(deviceDiagnosticsRequest).let { -// deviceDiagnosticsResponse.postValue(it) -// } -// } + fun deviceDiagnostics(deviceDiagnosticsRequest: DeviceDiagnosticsRequest) = viewModelScope.launch { + deviceDiagnosticsResponse.postValue(Result.Loading()) + respository.deviceDiagnostics(deviceDiagnosticsRequest).let { + deviceDiagnosticsResponse.postValue(it) + } + } fun getBatteryLevel(): Float? { @@ -133,5 +134,4 @@ class DiagnosticsViewModel @Inject constructor( return maxCapacity } - } \ No newline at end of file From b5f605157ec243d52c94f40d7dc299da2e085fc7 Mon Sep 17 00:00:00 2001 From: Mariya Date: Wed, 14 Feb 2024 17:00:18 +0530 Subject: [PATCH 4/6] Device Diagnostics Api structure done successfully Added, --- .../hpostesting/presentation/diagnostics/DiagnosticsFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 ced0a6a..2924daf 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 @@ -125,7 +125,7 @@ class DiagnosticsFragment : Fragment() { } else { Toast.makeText( activity, - "Received success response but the result is not successful: ${response.data.message}", + "the result is not successful: ${response.data.message}", Toast.LENGTH_LONG ).show() } From fe3f17b71d606124352125516e526f91ea9fe694 Mon Sep 17 00:00:00 2001 From: Mariya Date: Wed, 14 Feb 2024 17:01:30 +0530 Subject: [PATCH 5/6] Message format is changed --- .../hpostesting/presentation/diagnostics/DiagnosticsFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 2924daf..b536cad 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 @@ -125,7 +125,7 @@ class DiagnosticsFragment : Fragment() { } else { Toast.makeText( activity, - "the result is not successful: ${response.data.message}", + "${response.data.message}", Toast.LENGTH_LONG ).show() } From 0858fc5da02e5d160f83a027b33b1fdd03f6ec8c Mon Sep 17 00:00:00 2001 From: Mariya Date: Wed, 14 Feb 2024 18:06:25 +0530 Subject: [PATCH 6/6] errors fixed in Repository file --- .../example/hpostesting/data/repository/DatabaseRepository.kt | 4 ++++ .../com/example/hpostesting/data/repository/Repository.kt | 1 + 2 files changed, 5 insertions(+) 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 acb2755..de83afa 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 @@ -84,6 +84,10 @@ class DatabaseRepository @Inject constructor( return safeApiCall { molbioResultApi.deviceDiagnostics(deviceDiagnosticsRequest) } } + override suspend fun downloadClientCertificate(): Result { + return safeApiCall { molbioResultApi.downloadClientCertificate() } + } + 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 243c494..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 @@ -52,5 +52,6 @@ interface Repository { 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