Merge branch 'Export_registration_data_to_CSV' into Make_the_Registration_app_work_only_locally_and_Export_registration_data_to_CSV_i

This commit is contained in:
Mariya
2023-12-15 19:17:15 +05:30
23 changed files with 382 additions and 139 deletions

4
.idea/shelf/Changes3.xml generated Normal file
View File

@@ -0,0 +1,4 @@
<changelist name="Changes3" date="1701681803133" recycled="false">
<option name="PATH" value="$PROJECT_DIR$/.idea/shelf/Changes3/shelved.patch" />
<option name="DESCRIPTION" value="Changes" />
</changelist>

View File

@@ -1,4 +0,0 @@
<changelist name="Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm_[Changes]" date="1701681655205" recycled="true" deleted="true">
<option name="PATH" value="$PROJECT_DIR$/.idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm_[Changes]/shelved.patch" />
<option name="DESCRIPTION" value="Uncommitted changes before Checkout at 04-12-2023 02:50 pm [Changes]" />
</changelist>

3
app/.gitignore vendored
View File

@@ -1 +1,2 @@
/build /build
/google-services*

View File

@@ -16,8 +16,8 @@ android {
applicationId "in.sminnovations.hposregistration" applicationId "in.sminnovations.hposregistration"
minSdk 26 minSdk 26
targetSdk 34 targetSdk 34
versionCode 1 versionCode 8
versionName "1.0" versionName "1.0.8"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }
@@ -46,6 +46,7 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.10.0' implementation 'com.google.android.material:material:1.10.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.preference:preference-ktx:1.2.1'
testImplementation 'junit:junit:4.13.2' testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
@@ -59,6 +60,8 @@ dependencies {
implementation 'com.google.firebase:firebase-storage-ktx' implementation 'com.google.firebase:firebase-storage-ktx'
implementation 'com.firebaseui:firebase-ui-firestore:8.0.2' implementation 'com.firebaseui:firebase-ui-firestore:8.0.2'
implementation 'com.google.android.gms:play-services-auth:20.7.0' implementation 'com.google.android.gms:play-services-auth:20.7.0'
implementation 'com.google.firebase:firebase-appdistribution:16.0.0-beta11'
implementation("com.google.firebase:firebase-appdistribution-api-ktx:16.0.0-beta11")
// Coroutines // Coroutines
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1'
@@ -91,14 +94,15 @@ dependencies {
implementation 'com.github.bumptech.glide:glide:4.13.2' implementation 'com.github.bumptech.glide:glide:4.13.2'
annotationProcessor 'com.github.bumptech.glide:compiler:4.13.2' annotationProcessor 'com.github.bumptech.glide:compiler:4.13.2'
implementation 'com.opencsv:opencsv:5.5'
//Room //Room
implementation "androidx.room:room-ktx:2.6.0" implementation "androidx.room:room-ktx:2.6.1"
implementation "androidx.room:room-runtime:2.6.0" implementation "androidx.room:room-runtime:2.6.1"
kapt ("androidx.room:room-compiler:2.6.0") kapt ("androidx.room:room-compiler:2.6.1")
// Barcode scanner // Barcode scanner
implementation 'com.journeyapps:zxing-android-embedded:4.3.0' implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
implementation 'androidx.preference:preference-ktx:1.2.1'
implementation 'androidx.preference:preference-ktx:1.2.1'
} }

View File

@@ -1,113 +0,0 @@
{
"project_info": {
"project_number": "650071678820",
"project_id": "hpos-af3cc",
"storage_bucket": "hpos-af3cc.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:650071678820:android:f1435a1c07f710036c6471",
"android_client_info": {
"package_name": "com.example.hposconsentform"
}
},
"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
}
]
}
}
},
{
"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
}
]
}
}
}
],
"configuration_version": "1"
}

View File

@@ -7,7 +7,9 @@
android:required="false" /> android:required="false" />
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
@@ -43,7 +45,7 @@
</activity> </activity>
<activity <activity
android:name="com.journeyapps.barcodescanner.CaptureActivity" android:name="com.journeyapps.barcodescanner.CaptureActivity"
android:screenOrientation="portrait" android:screenOrientation="fullSensor"
android:stateNotNeeded="true" android:stateNotNeeded="true"
tools:replace="android:screenOrientation" /> tools:replace="android:screenOrientation" />
</application> </application>

View File

@@ -1,11 +1,36 @@
package com.example.hposregistration.dao package com.example.hposregistration.dao
import android.content.Context
import androidx.room.Database import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase import androidx.room.RoomDatabase
import androidx.room.TypeConverters import androidx.room.TypeConverters
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
import com.example.hposregistration.data.user.UserData import com.example.hposregistration.data.user.UserData
@Database(entities = [UserData::class], version = 1, exportSchema = false) @Database(entities = [UserData::class], version = 3, exportSchema = false)
abstract class MyDatabase : RoomDatabase() { abstract class MyDatabase : RoomDatabase() {
abstract fun userDao(): UserDao abstract fun userDao(): UserDao
}
companion object {
val MIGRATION_2_3: Migration = object : Migration(2, 3) {
override fun migrate(database: SupportSQLiteDatabase) {
// Define the necessary SQL statements for migration from version 2 to 3
// For example, you can alter tables or create new ones
database.execSQL("ALTER TABLE user_table ADD COLUMN aadharIdSearch TEXT")
}
}
fun getInstance(context: Context): MyDatabase {
return Room.databaseBuilder(
context.applicationContext,
MyDatabase::class.java,
"my_database"
)
.addMigrations(MIGRATION_2_3)
.build()
}
}
}

View File

@@ -20,4 +20,7 @@ interface UserDao {
@Query("DELETE FROM user_table WHERE _id = :id") @Query("DELETE FROM user_table WHERE _id = :id")
suspend fun deleteById(id: String) suspend fun deleteById(id: String)
@Query("UPDATE user_table SET isCSVCreated = :newValue WHERE _id = :id")
suspend fun updateCSVFieldById(id: String, newValue: Boolean)
} }

View File

@@ -30,4 +30,8 @@ class MainRepository @Inject constructor(
return userFireBaseDao.addUserToDatabase(userData) return userFireBaseDao.addUserToDatabase(userData)
} }
suspend fun updateCSVFieldById(id: String, isCSVCreated: Boolean) {
userDao.updateCSVFieldById(id, isCSVCreated)
}
} }

View File

@@ -0,0 +1,124 @@
package com.example.hpostesting.data.datasource
import android.os.Environment
import com.example.hposregistration.data.user.UserData
import com.opencsv.CSVWriter
import java.io.File
import java.io.FileWriter
import java.io.IOException
class LocalFileDataSource {
fun saveCsvToDisk(filepath: String, contents: ArrayList<Array<String>>){
val writer = CSVWriter(FileWriter(filepath))
writer.writeAll(contents) // data is adding to csv
writer.close()
}
fun saveTextToDisk(filepath: String, contents: String){
val writer = FileWriter(File(filepath))
writer.append(contents)
writer.flush()
writer.close()
}
fun exportDataToCSV(
fileName: String, dataList: List<UserData>
): 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",
"bloodGroup",
"birthYear", // Include other fields from the data class
"state",
"abhaId",
"userImageURL",
"testStatus", // Assuming testStatus is a boolean field
"gender",
"appVersion",
"phoneNumber",
"careOf",
"maritalStatus",
"category",
"caste",
"subCaste",
"house",
"city",
"district",
"state",
"pinCode",
"isUnderMedication",
"isUnderTransfusion",
"sickleCellHistory",
"userImageURL",
"registeredBy",
"createdAt",
"registrationCenterName"
)
csvWriter.writeNext(header)
// Write data rows
for (data in dataList) {
val row = arrayOf(
data._id,
data.name,
data.bloodGroup,
data.birthYear ?: "", // Replace with the actual birthYear field
data.state,
data.abhaId,
data.userImageURL,
data.testStatus?.toString() ?: "",
data.gender,
data.appVersion ?: "",
data.phoneNumber,
data.careOf,
data.maritalStatus,
data.category,
data.caste,
data.subCaste ?: "",
data.house,
data.city,
data.district,
data.state,
data.pinCode,
data.isUnderMedication?.toString() ?: "",
data.isUnderTransfusion?.toString() ?: "",
data.sickleCellHistory ?: "",
data.userImageURL,
data.registeredBy ?: "",
data.createdAt ?: "",
data.registrationCenterName ?: ""
)
csvWriter.writeNext(row)
}
writer.close()
return true
} catch (e: IOException) {
e.printStackTrace()
return false
}
}
private fun getExternalStorageDirectory(): File {
val folder = File(Environment.getExternalStorageDirectory(), "HPOSRegistration")
if (!folder.exists()) {
folder.mkdirs()
}
return folder
}
}

View File

@@ -7,8 +7,11 @@ import androidx.room.PrimaryKey
data class UserData( data class UserData(
@PrimaryKey @PrimaryKey
var _id: String = "", var _id: String = "",
var _idSearch: String = "",
var abhaId: String = "", var abhaId: String = "",
var abhaIdSearch: String = "",
var aadharId: String = "", var aadharId: String = "",
var aadharIdSearch: String = "",
var name: String = "", var name: String = "",
var birthYear: String = "", var birthYear: String = "",
var gender: String = "", var gender: String = "",
@@ -32,7 +35,9 @@ data class UserData(
var registeredBy: String? = "", var registeredBy: String? = "",
var createdAt: String? = "", var createdAt: String? = "",
var registrationCenterName: String? = "", var registrationCenterName: String? = "",
var testStatus: Boolean = false var testStatus: Boolean = false,
var isCSVCreated: Boolean = false,
var localFlag: Boolean = false,
){ ){
enum class Gender { enum class Gender {
MALE, MALE,

View File

@@ -5,6 +5,7 @@ import android.content.Context
import androidx.room.Room import androidx.room.Room
import com.example.hposregistration.dao.MyDatabase import com.example.hposregistration.dao.MyDatabase
import com.example.hposregistration.dao.UserDao import com.example.hposregistration.dao.UserDao
import com.example.hpostesting.data.datasource.LocalFileDataSource
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
@@ -41,4 +42,10 @@ object AppModule {
fun provideContext(application: Application): Context { fun provideContext(application: Application): Context {
return application.applicationContext return application.applicationContext
} }
@Provides
@Singleton
fun provideLocalFileDataSource(): LocalFileDataSource {
return LocalFileDataSource()
}
} }

View File

@@ -1,5 +1,6 @@
package com.example.hposregistration.network package com.example.hposregistration.network
import androidx.room.Query
import com.example.hposregistration.data.Response import com.example.hposregistration.data.Response
import com.example.hposregistration.data.user.UserData import com.example.hposregistration.data.user.UserData
import com.google.firebase.firestore.FirebaseFirestore import com.google.firebase.firestore.FirebaseFirestore
@@ -24,7 +25,12 @@ class UserDao {
} }
} }
// suspend fun getPatientList(): List<UserData> { // suspend fun getPatientList(): List<UserData> {
// return patientCollection.get().await().toObjects(UserData::class.java) // return patientCollection.get().await().toObjects(UserData::class.java)
// } // }
} }

View File

@@ -3,7 +3,11 @@ package com.example.hposregistration.ui.activities
import android.content.Context import android.content.Context
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle import android.os.Bundle
import android.widget.Toast
import com.example.hposregistration.data.LanguageManager import com.example.hposregistration.data.LanguageManager
import com.google.firebase.appdistribution.FirebaseAppDistribution
import com.google.firebase.appdistribution.FirebaseAppDistributionException
import com.google.firebase.crashlytics.FirebaseCrashlytics
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import `in`.sminnovations.hposregistration.databinding.ActivityMainBinding import `in`.sminnovations.hposregistration.databinding.ActivityMainBinding
@@ -11,17 +15,58 @@ import `in`.sminnovations.hposregistration.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding private lateinit var binding: ActivityMainBinding
override fun attachBaseContext(newBase: Context?) { override fun attachBaseContext(newBase: Context?) {
val languageCode = LanguageManager.getSavedLanguage(newBase!!) val languageCode = LanguageManager.getSavedLanguage(newBase!!)
LanguageManager.setLocale(newBase, languageCode) LanguageManager.setLocale(newBase, languageCode)
super.attachBaseContext(newBase) super.attachBaseContext(newBase)
} }
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater) binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
} }
override fun onResume() {
super.onResume()
val firebaseAppDistribution = FirebaseAppDistribution.getInstance()
firebaseAppDistribution.updateIfNewReleaseAvailable()
.addOnProgressListener { updateProgress ->
if (updateProgress.apkBytesDownloaded > 0) {
Toast.makeText(
this,
"${updateProgress.updateStatus}. ${updateProgress.apkBytesDownloaded / 1048576} /${updateProgress.apkFileTotalBytes / 1048576} MB",
Toast.LENGTH_SHORT
).show()
}
}
.addOnFailureListener { e ->
// (Optional) Handle errors.
if (e is FirebaseAppDistributionException) {
when (e.errorCode) {
FirebaseAppDistributionException.Status.NOT_IMPLEMENTED -> {
// SDK did nothing. This is expected when building for Play.
}
else -> {
// Handle other errors.
Toast.makeText(
this,
"AppDistribution error, status: ${e.errorCode}",
Toast.LENGTH_SHORT
).show()
}
}
FirebaseCrashlytics.getInstance().recordException(e)
}
}
.addOnSuccessListener {
// Toast.makeText(this, "App Update: Success!", Toast.LENGTH_SHORT).show()
}
}
} }

View File

@@ -3,14 +3,10 @@ package com.example.hposregistration.ui.fragments
import android.content.Context import android.content.Context
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.os.Bundle import android.os.Bundle
import android.preference.ListPreference
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import android.widget.Toast
import com.example.hposregistration.data.LanguageManager import com.example.hposregistration.data.LanguageManager
import `in`.sminnovations.hposregistration.R import `in`.sminnovations.hposregistration.R

View File

@@ -5,11 +5,13 @@ import android.content.Context
import android.content.DialogInterface import android.content.DialogInterface
import android.content.SharedPreferences import android.content.SharedPreferences
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Button import android.widget.Button
import android.widget.Toast import android.widget.Toast
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import com.example.hposregistration.adapters.UserListOfflineAdapter import com.example.hposregistration.adapters.UserListOfflineAdapter
@@ -18,11 +20,14 @@ import com.example.hposregistration.data.Constant
import com.example.hposregistration.data.user.UserData import com.example.hposregistration.data.user.UserData
import com.example.hposregistration.ui.viewmodels.RegistrationViewModel import com.example.hposregistration.ui.viewmodels.RegistrationViewModel
import com.firebase.ui.firestore.FirestoreRecyclerOptions import com.firebase.ui.firestore.FirestoreRecyclerOptions
import com.google.firebase.firestore.Query
import com.google.firebase.firestore.ktx.firestore import com.google.firebase.firestore.ktx.firestore
import com.google.firebase.ktx.Firebase import com.google.firebase.ktx.Firebase
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import `in`.sminnovations.hposregistration.R import `in`.sminnovations.hposregistration.R
import `in`.sminnovations.hposregistration.databinding.FragmentUserListBinding import `in`.sminnovations.hposregistration.databinding.FragmentUserListBinding
import java.text.SimpleDateFormat
import java.util.Date
@AndroidEntryPoint @AndroidEntryPoint
class UserListFragment : BaseFragment() { class UserListFragment : BaseFragment() {
@@ -30,7 +35,7 @@ class UserListFragment : BaseFragment() {
private var _binding: FragmentUserListBinding? = null private var _binding: FragmentUserListBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
private val viewModel by viewModels<RegistrationViewModel>() private val viewModel:RegistrationViewModel by activityViewModels()
private var isOnline = false private var isOnline = false
@@ -80,6 +85,10 @@ class UserListFragment : BaseFragment() {
showUploadDialog(requireContext()) showUploadDialog(requireContext())
} }
binding.btnSaveLocal.setOnClickListener {
showDownloadDialog(requireContext())
}
binding.btnsettings.setOnClickListener{ binding.btnsettings.setOnClickListener{
findNavController().navigate(R.id.action_userListFragment_to_languageSettingsFragment) findNavController().navigate(R.id.action_userListFragment_to_languageSettingsFragment)
@@ -164,7 +173,17 @@ class UserListFragment : BaseFragment() {
private fun fetchFromServer() { private fun fetchFromServer() {
binding.noList.visibility = View.GONE binding.noList.visibility = View.GONE
binding.rvOrder.visibility = View.VISIBLE binding.rvOrder.visibility = View.VISIBLE
val dateFormat = SimpleDateFormat("yyyy-MM-dd")
val currentDate = Date()
val today = dateFormat.format(currentDate)
val query = Firebase.firestore.collection("patientData") val query = Firebase.firestore.collection("patientData")
.whereGreaterThanOrEqualTo("createdAt", today)
.orderBy("createdAt", Query.Direction.DESCENDING)
query.get().addOnSuccessListener {
if (it.documents.isEmpty() && isOnline) {
binding.emptyRegistrations.visibility = View.VISIBLE
}
}
val recyclerViewOptions = val recyclerViewOptions =
FirestoreRecyclerOptions.Builder<UserData>().setQuery(query, UserData::class.java) FirestoreRecyclerOptions.Builder<UserData>().setQuery(query, UserData::class.java)
.build() .build()
@@ -173,6 +192,25 @@ class UserListFragment : BaseFragment() {
adapter.startListening() adapter.startListening()
} }
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 fetchFromLocalDB() { private fun fetchFromLocalDB() {
binding.uploadData.visibility = View.GONE binding.uploadData.visibility = View.GONE
viewModel.allUserData.observe(viewLifecycleOwner) { userDataList -> viewModel.allUserData.observe(viewLifecycleOwner) { userDataList ->
@@ -195,6 +233,38 @@ class UserListFragment : BaseFragment() {
} }
} }
private fun downloadLocalDBData(dialog: DialogInterface) {
viewModel.allUserData.observe(viewLifecycleOwner) { userDataList ->
try {
val downloadList = mutableListOf<UserData>()
userDataList.forEach { userData ->
Log.d("DownloadDebug", "userData: $userData, isCSVCreated: ${userData.isCSVCreated}")
if (!userData.isCSVCreated) {
downloadList.add(userData)
}
}
// Log the size of downloadList for debugging
Log.d("DownloadDebug", "downloadList size: ${downloadList.size}")
if (downloadList.isNotEmpty()) {
// Call ViewModel function to create CSV with filtered data
viewModel.createCSV(downloadList, requireContext())
Toast.makeText(requireContext(), "CSV file downloaded successfully", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(requireContext(), "No data to download", Toast.LENGTH_SHORT).show()
}
} catch (e: Exception) {
e.printStackTrace()
Toast.makeText(requireContext(), "Error downloading CSV file", Toast.LENGTH_SHORT).show()
} finally {
dialog.dismiss()
}
}
}
private fun deteleIncompleteRegistration(userDataList: List<UserData>) { private fun deteleIncompleteRegistration(userDataList: List<UserData>) {
userDataList.forEach { userDataList.forEach {
if (it.userImageURL.isEmpty()) { if (it.userImageURL.isEmpty()) {

View File

@@ -10,14 +10,21 @@ import com.example.hposregistration.data.MainRepository
import com.example.hposregistration.data.NetworkStatusLiveData import com.example.hposregistration.data.NetworkStatusLiveData
import com.example.hposregistration.data.Response import com.example.hposregistration.data.Response
import com.example.hposregistration.data.user.UserData import com.example.hposregistration.data.user.UserData
import com.example.hposregistration.dao.UserDao
import com.example.hpostesting.data.datasource.LocalFileDataSource
import com.google.firebase.storage.FirebaseStorage import com.google.firebase.storage.FirebaseStorage
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
import javax.inject.Inject import javax.inject.Inject
@HiltViewModel @HiltViewModel
class RegistrationViewModel @Inject constructor( class RegistrationViewModel @Inject constructor(
private val mainRepository: MainRepository, private val mainRepository: MainRepository,
private val userdao: UserDao,
private val localFileDataSource: LocalFileDataSource,
context: Context context: Context
) : ViewModel() { ) : ViewModel() {
@@ -73,4 +80,25 @@ class RegistrationViewModel @Inject constructor(
fun deleteById(userId: String) = viewModelScope.launch { fun deleteById(userId: String) = viewModelScope.launch {
mainRepository.deleteById(id = userId) mainRepository.deleteById(id = userId)
} }
fun createCSV(userData: List<UserData>, appContext: Context) =
viewModelScope.launch {
val fileName = "${getCurrentDateTime()}.csv"
if (localFileDataSource.exportDataToCSV(fileName, userData)) {
userData.forEach { data ->
data.localFlag = true
mainRepository.updateCSVFieldById(
data._id,
true
)
}
}
}
private fun getCurrentDateTime(): String {
val dateFormat = SimpleDateFormat("dd-MM-yy HH:mm:ss", Locale.getDefault())
val currentDateTime = Date()
return dateFormat.format(currentDateTime)
}
} }

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="@color/primary"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/primary" android:pathData="M19,9h-4V3H9v6H5l7,7 7,-7zM5,18v2h14v-2H5z"/>
</vector>

View File

@@ -34,6 +34,20 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/emptyRegistrations"
style="@style/title1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/empty_registrations"
android:textColor="@color/black"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:id="@+id/noList" android:id="@+id/noList"
style="@style/title1" style="@style/title1"
@@ -80,6 +94,15 @@
app:layout_constraintTop_toBottomOf="@+id/tv_title" app:layout_constraintTop_toBottomOf="@+id/tv_title"
tools:listitem="@layout/user_item_view" /> tools:listitem="@layout/user_item_view" />
<ImageView
android:id="@+id/btnSaveLocal"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginEnd="10dp"
android:src="@drawable/downloads"
app:layout_constraintBottom_toBottomOf="@+id/rv_order"
app:layout_constraintStart_toStartOf="parent" />
<com.google.android.material.floatingactionbutton.FloatingActionButton <com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/btnRegisterUser" android:id="@+id/btnRegisterUser"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View File

@@ -125,7 +125,7 @@
<string name="upload_local_db_to_cloud">क्या आप स्थानीय डीबी को क्लाउड पर अपलोड करना चाहते हैं?</string> <string name="upload_local_db_to_cloud">क्या आप स्थानीय डीबी को क्लाउड पर अपलोड करना चाहते हैं?</string>
<string name="upload">अपलोड</string> <string name="upload">अपलोड</string>
<string name="upload_done_successfully">अपलोड सफलतापूर्वक हुआ</string> <string name="upload_done_successfully">अपलोड सफलतापूर्वक हुआ</string>
<string name="empty_registrations">प्रदर्शन के लिए कोई पंजीकरण उपलब्ध नहीं है</string>
<string name="enter_proper_login_id">कृपया सही लॉगिन आईडी दर्ज करें</string> <string name="enter_proper_login_id">कृपया सही लॉगिन आईडी दर्ज करें</string>
<string name="enter_proper_password">कृपया सही पासवर्ड दर्ज करें</string> <string name="enter_proper_password">कृपया सही पासवर्ड दर्ज करें</string>
<string name="wrong_password">गलत पासवर्ड</string> <string name="wrong_password">गलत पासवर्ड</string>

View File

@@ -129,6 +129,7 @@
<string name="wrong_password">ತಪ್ಪಾದ ಪಾಸ್‌ವರ್ಡ್</string> <string name="wrong_password">ತಪ್ಪಾದ ಪಾಸ್‌ವರ್ಡ್</string>
<string name="wrong_user_id">ತಪ್ಪಾದ ಬಳಕೆದಾರ ಐಡಿ</string> <string name="wrong_user_id">ತಪ್ಪಾದ ಬಳಕೆದಾರ ಐಡಿ</string>
<string name="scanned_aadhar_id">ನೀವು ಆಧಾರ್ ಐಡನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿದ್ದೀರಿ, ದಯವಿಟ್ಟು ಆಧಾರ್ ಐಡನ್ನು ನೀವು ಸ್ಕ್ಯಾನ್ ಮಾಡಿದ ಮತ್ತು ಅಭಾ ಐಡನ್ನು ಕೈಯಾರೆ ನಮೂದಿಸಿ</string> <string name="scanned_aadhar_id">ನೀವು ಆಧಾರ್ ಐಡನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿದ್ದೀರಿ, ದಯವಿಟ್ಟು ಆಧಾರ್ ಐಡನ್ನು ನೀವು ಸ್ಕ್ಯಾನ್ ಮಾಡಿದ ಮತ್ತು ಅಭಾ ಐಡನ್ನು ಕೈಯಾರೆ ನಮೂದಿಸಿ</string>
<string name="empty_registrations">ಪ್ರದರ್ಶಿಸಲಿರುವ ಯಾವ ನೋಂದಾಯಿಗಳೂ ಲಭ್ಯವಿಲ್ಲ</string>
<string name="scanned_abha_id">ನೀವು ಅಭಾ ಐಡಿಯನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿದ್ದೀರಿ</string> <string name="scanned_abha_id">ನೀವು ಅಭಾ ಐಡಿಯನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿದ್ದೀರಿ</string>
<string name="scanned_aadharid">ನೀವು ಆಧಾರ್ ಐಡನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿದಿರಿ</string> <string name="scanned_aadharid">ನೀವು ಆಧಾರ್ ಐಡನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿದಿರಿ</string>

View File

@@ -136,11 +136,18 @@
<string name="userid">User Id</string> <string name="userid">User Id</string>
<string name="name">Name</string> <string name="name">Name</string>
<string name="ok">OK</string> <string name="ok">OK</string>
<string name="empty_registrations">No registrations available for display</string>
<string name="add_blood_group">Add Blood Group</string> <string name="add_blood_group">Add Blood Group</string>
<string name="scanned_aadhar_id">You have scanned the Aadhar ID, need to enter Aadhar ID number you have scanned and Abha ID manually</string> <string name="scanned_aadhar_id">You have scanned the Aadhar ID, need to enter Aadhar ID number you have scanned and Abha ID manually</string>
<string name="scanned_abha_id">You have scanned the Abha ID</string> <string name="scanned_abha_id">You have scanned the Abha ID</string>
<string name="scanned_aadharid">You have scanned the Aadhar ID</string> <string name="scanned_aadharid">You have scanned the Aadhar ID</string>
<string name="downloadcsv">Download CSV</string>
<string name="download_db_registration_title">Download DB Tests</string>
<string name="download_db_registration_message">Do you want to download the local DB tests in CSV format?</string>
<string name="upload_success_message">Upload done successfully</string>
<string-array name="category"> <string-array name="category">
<item>NT-A</item> <item>NT-A</item>
<item>NT-B</item> <item>NT-B</item>