diff --git a/app/src/main/java/com/example/hpostesting/data/dao/HemoCubeDao.kt b/app/src/main/java/com/example/hpostesting/data/dao/HemoCubeDao.kt index c7cb63d..89d4306 100644 --- a/app/src/main/java/com/example/hpostesting/data/dao/HemoCubeDao.kt +++ b/app/src/main/java/com/example/hpostesting/data/dao/HemoCubeDao.kt @@ -23,4 +23,7 @@ interface HemoCubeDao { @Query("UPDATE hemo_cube_test_table SET localFlag = :newValue WHERE _id = :id") suspend fun updateFieldById(id: String, newValue: Boolean) + + @Query("UPDATE hemo_cube_test_table SET isCSVCreated = :newValue WHERE _id = :id") + suspend fun updateCSVFieldById(id: String, newValue: Boolean) } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpostesting/data/model/patient/HemoCubeTestData.kt b/app/src/main/java/com/example/hpostesting/data/model/patient/HemoCubeTestData.kt index 8bbf84b..2cc6dab 100644 --- a/app/src/main/java/com/example/hpostesting/data/model/patient/HemoCubeTestData.kt +++ b/app/src/main/java/com/example/hpostesting/data/model/patient/HemoCubeTestData.kt @@ -9,6 +9,9 @@ data class HemoCubeTestData( var _id: String = "", var name: String = "", var birthYear: String = "", + var gender: String = "", + var abhaId: String = "", + var state: String = "", var bloodGroup: String = "", var incubationTime: String = "", var userImageURL: String = "", @@ -33,5 +36,6 @@ data class HemoCubeTestData( var deviceRatio: Double? = null, var calculatedRatio: Double? = null, var coefficients: String? = "", - var classificationResult: String = "" + var classificationResult: String = "", + var isCSVCreated: Boolean = false ) diff --git a/app/src/main/java/com/example/hpostesting/data/model/patient/UserData.kt b/app/src/main/java/com/example/hpostesting/data/model/patient/UserData.kt index ee6f2ad..36ac6fa 100644 --- a/app/src/main/java/com/example/hpostesting/data/model/patient/UserData.kt +++ b/app/src/main/java/com/example/hpostesting/data/model/patient/UserData.kt @@ -10,7 +10,10 @@ data class UserData( var _id: String = "", var name: String = "", var incubationTime: String = "", + var gender: String = "", + var state: String = "", var birthYear: String = "", + var abhaId: String = "", var bloodGroup: String = "", var userImageURL: String = "", var location: Location? = null, @@ -44,6 +47,9 @@ fun UserData.toHemoCubeTestData() = HemoCubeTestData( name = name, bloodGroup = bloodGroup, birthYear = birthYear, + gender = gender, + state = state, + abhaId = abhaId, userImageURL = userImageURL, testStatus = testStatus, location = location diff --git a/app/src/main/java/com/example/hpostesting/data/repository/LocalFileRepository.kt b/app/src/main/java/com/example/hpostesting/data/repository/LocalFileRepository.kt index 6290bf0..054d84f 100644 --- a/app/src/main/java/com/example/hpostesting/data/repository/LocalFileRepository.kt +++ b/app/src/main/java/com/example/hpostesting/data/repository/LocalFileRepository.kt @@ -1,6 +1,12 @@ package com.example.hpostesting.data.repository +import android.os.Environment import com.example.hpostesting.data.datasource.LocalFileDataSource +import com.example.hpostesting.data.model.patient.HemoCubeTestData +import com.opencsv.CSVWriter +import java.io.File +import java.io.FileWriter +import java.io.IOException class LocalFileRepository(private val localFileDataSource: LocalFileDataSource) { fun saveCsvToDisk(filepath: String, contents: ArrayList>) = @@ -8,4 +14,106 @@ class LocalFileRepository(private val localFileDataSource: LocalFileDataSource) fun saveTextToDisk(filepath: String, contents: String) = localFileDataSource.saveTextToDisk(filepath, contents) + + + fun exportDataToCSV( + fileName: String, dataList: List + ): Boolean { + try { + val formattedFileName = fileName.replace(Regex("[^a-zA-Z0-9.-]"), "_") // Replace special characters with underscores + val filePath = File(getExternalStorageDirectory(), formattedFileName) + val writer = FileWriter(filePath) + val csvWriter = CSVWriter(writer) + // Write CSV header + val header = arrayOf( + "_id", + "name", + "incubationTime", + "bloodGroup", + "birthYear", // Include other fields from the data class + "state", + "abhaId", + "userImageURL", + "location", + "reportUploadTime", + "testType", + "testTime", + "testStatus", + "gender", + "localFlag", // Add more fields as necessary + "deviceId", + "appVersion", + "deviceSerialNumber", + "deviceType", + "kitSerial", + "resultData", + "led1Buffer", + "led2Buffer", + "led1Sample", + "led2Sample", + "led1Average", + "led2Average", + "deviceRatio", + "calculatedRatio", + "coefficients", + "classificationResult", + "errorMessages", + "batteryLevel" + ) + csvWriter.writeNext(header) + + // Write data rows + for (data in dataList) { + val row = arrayOf( + data._id, + data.name, + data.incubationTime, + data.bloodGroup, + data.birthYear, // Include other fields similarly + data.state, + data.abhaId, + data.userImageURL, + data.location?.toString(), + data.reportUploadTime ?: "", + data.testType ?: "", + data.testTime ?: "", + data.testStatus?.toString() ?: "", + data.gender, + data.localFlag.toString(), + data.deviceId ?: "", + data.appVersion ?: "", + data.deviceSerialNumber, + data.deviceType, + data.kitSerial, + data.resultData, + data.led1Buffer?.toString() ?: "", + data.led2Buffer?.toString() ?: "", + data.led1Sample?.toString() ?: "", + data.led2Sample?.toString() ?: "", + data.led1Average?.toString() ?: "", + data.led2Average?.toString() ?: "", + data.deviceRatio?.toString() ?: "", + data.calculatedRatio?.toString() ?: "", + data.coefficients ?: "", + data.classificationResult + ) + csvWriter.writeNext(row) + } + writer.close() + return true + } catch (e: IOException) { + e.printStackTrace() + return false + } + } + + private fun getExternalStorageDirectory(): File { + val folder = File(Environment.getExternalStorageDirectory(), "HposFolder") + + if (!folder.exists()) { + folder.mkdirs() + } + + return folder + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt index ac87e7b..1edc549 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt @@ -123,7 +123,7 @@ class HomeFragment : Fragment() { } binding.btnSaveLocal.setOnClickListener { - downloadCsv() + context?.let { it1 -> showDownloadDialog(context = it1) } } binding.btnNewKit.setOnClickListener { with(sharedPreference.edit()) { @@ -397,5 +397,49 @@ class HomeFragment : Fragment() { } + private fun showDownloadDialog(context: Context) { + val builder = AlertDialog.Builder(context) + builder.setTitle(R.string.download_db_registration_title) + builder.setMessage(R.string.download_db_registration_message) + + builder.setPositiveButton(R.string.downloadcsv) { dialog, _ -> + downloadLocalDBData(dialog) + } + + builder.setNegativeButton(R.string.cancel) { dialog, _ -> + dialog.dismiss() + } + + val dialog = builder.create() + dialog.show() + } + + + + + private fun downloadLocalDBData(dialog: DialogInterface) { + hemoCubeViewModel.allUserData.observe(viewLifecycleOwner) { userDataList -> + val downloadList = mutableListOf() + + userDataList.forEach { userData -> + if (!userData.isCSVCreated) { + downloadList.add(userData) // Add the userData to downloadList + } + } + + if (downloadList.isNotEmpty()) { + // Call ViewModel function to create CSV with filtered data + hemoCubeViewModel.createCSV(downloadList, requireContext()) + Toast.makeText(requireContext(), "CSV file downloaded successfully", Toast.LENGTH_SHORT).show() + } else { + Toast.makeText(requireContext(), "CSV file downloaing failed", Toast.LENGTH_SHORT).show() + } + + dialog.dismiss() + } + } + + + } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeViewModel.kt b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeViewModel.kt index 5f2318a..5f4d77e 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeViewModel.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeViewModel.kt @@ -12,6 +12,7 @@ import com.example.hpostesting.data.DataHolder import com.example.hpostesting.data.NetworkStatusLiveData import com.example.hpostesting.data.constant.Constants import com.example.hpostesting.data.dao.HemoCubeDao +import com.example.hpostesting.data.datasource.LocalFileDataSource import com.example.hpostesting.data.model.Response import com.example.hpostesting.data.model.patient.BufferCheckData import com.example.hpostesting.data.model.patient.DeviceData @@ -29,6 +30,7 @@ import javax.inject.Inject class HemoCubeViewModel @Inject constructor( private val hemoCubeDao: HemoCubeDao, private val repository: DatabaseRepository, + private val localFileDataSource: LocalFileDataSource, context: Context, ) : ViewModel() { var isServiceConnected = false @@ -229,4 +231,18 @@ class HemoCubeViewModel @Inject constructor( fun deleteById(userId: String) = viewModelScope.launch { hemoCubeDao.deleteById(id = userId) } + + fun createCSV(hemoCubeTestData: List, appContext: Context) = + viewModelScope.launch { + val fileName = "HPOS${getCurrentDate()}.csv" + if (localFileDataSource.exportDataToCSV(fileName, hemoCubeTestData)) { + hemoCubeTestData.forEach { data -> + data.localFlag = true + hemoCubeDao.updateCSVFieldById( + data._id, + true + ) + } + } + } } \ No newline at end of file