From eec8867ddc33262807b03893c0c696e657f7fcab Mon Sep 17 00:00:00 2001 From: Pritimay Sarkar Date: Mon, 23 Oct 2023 02:20:39 +0530 Subject: [PATCH 01/16] show only current day registrations - reduce database reads by fetching only current day registrations - sort users list in latest first order --- .../ui/fragments/UserListFragment.kt | 16 +++++++++++++++- app/src/main/res/layout/fragment_user_list.xml | 14 ++++++++++++++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt b/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt index ea1f623..c30f743 100644 --- a/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt +++ b/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt @@ -8,7 +8,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Button import android.widget.Toast import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController @@ -18,11 +17,14 @@ import com.example.hposregistration.data.Constant import com.example.hposregistration.data.user.UserData import com.example.hposregistration.ui.viewmodels.RegistrationViewModel import com.firebase.ui.firestore.FirestoreRecyclerOptions +import com.google.firebase.firestore.Query import com.google.firebase.firestore.ktx.firestore import com.google.firebase.ktx.Firebase import dagger.hilt.android.AndroidEntryPoint import `in`.sminnovations.hposregistration.R import `in`.sminnovations.hposregistration.databinding.FragmentUserListBinding +import java.text.SimpleDateFormat +import java.util.Date @AndroidEntryPoint class UserListFragment : BaseFragment() { @@ -160,7 +162,19 @@ class UserListFragment : BaseFragment() { private fun fetchFromServer() { binding.noList.visibility = View.GONE 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") + .whereGreaterThanOrEqualTo("createdAt", today) + .orderBy("createdAt", Query.Direction.DESCENDING) + query.get().addOnSuccessListener { + if (it.documents.isEmpty()) { + binding.emptyRegistrations.visibility = View.VISIBLE + } else { + binding.emptyRegistrations.visibility = View.GONE + } + } val recyclerViewOptions = FirestoreRecyclerOptions.Builder().setQuery(query, UserData::class.java) .build() diff --git a/app/src/main/res/layout/fragment_user_list.xml b/app/src/main/res/layout/fragment_user_list.xml index 53e02b3..06a70f4 100644 --- a/app/src/main/res/layout/fragment_user_list.xml +++ b/app/src/main/res/layout/fragment_user_list.xml @@ -26,6 +26,20 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + Edit User Details Internet is not available and there is no Data available in Local DB + No registrations are available for display User ID: %1$s Abha Number: %1$s Aadhar Number: %1$s From b6a03e2ebffbaf7b1590cb751ab874381383cd70 Mon Sep 17 00:00:00 2001 From: Pritimay Sarkar Date: Mon, 23 Oct 2023 02:23:28 +0530 Subject: [PATCH 02/16] add search fields based on date partition - optimize search based on current date partition - fix createdAt empty string in case of offline upload --- .../example/hposregistration/data/user/UserData.kt | 3 +++ .../ui/viewmodels/RegistrationViewModel.kt | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/app/src/main/java/com/example/hposregistration/data/user/UserData.kt b/app/src/main/java/com/example/hposregistration/data/user/UserData.kt index caa78f6..a2c7849 100644 --- a/app/src/main/java/com/example/hposregistration/data/user/UserData.kt +++ b/app/src/main/java/com/example/hposregistration/data/user/UserData.kt @@ -7,8 +7,11 @@ import androidx.room.PrimaryKey data class UserData( @PrimaryKey var _id: String = "", + var _idSearch: String = "", var abhaId: String = "", + var abhaIdSearch: String = "", var aadharId: String = "", + var aadharIdSearch: String = "", var name: String = "", var birthYear: String = "", var gender: String = "", diff --git a/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt b/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt index 930e4ca..f56bbaa 100644 --- a/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt +++ b/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt @@ -13,6 +13,10 @@ import com.example.hposregistration.data.user.UserData import com.google.firebase.storage.FirebaseStorage import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Date +import java.util.Locale import javax.inject.Inject @HiltViewModel @@ -63,6 +67,15 @@ class RegistrationViewModel @Inject constructor( get() = _networkStatusLiveData fun insert(userData: UserData) = viewModelScope.launch { + val currentDate = Date() + val dateFormat = SimpleDateFormat("yyyyMMdd") + val partition = dateFormat.format(currentDate) + userData._idSearch = partition + userData._id + userData.abhaIdSearch = partition + userData.abhaId + userData.aadharIdSearch = partition + userData.aadharId + userData.createdAt = SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss", Locale.getDefault() + ).format(Calendar.getInstance().time) mainRepository.insert(userData) } From 3bda3f0d513f795b1d28d0d862c114e37d1ee4dd Mon Sep 17 00:00:00 2001 From: Pritimay Sarkar Date: Tue, 24 Oct 2023 14:05:07 +0530 Subject: [PATCH 03/16] display app version --- .../ui/fragments/UserListFragment.kt | 5 +++++ app/src/main/res/layout/fragment_user_list.xml | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt b/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt index c30f743..a00f5d3 100644 --- a/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt +++ b/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt @@ -58,6 +58,11 @@ class UserListFragment : BaseFragment() { } private fun setupViews() { + val pInfo = requireActivity().packageManager.getPackageInfo( + requireActivity().packageName, 0 + ) + val version = pInfo.versionName + binding.appVersion.text = version binding.btnRegisterUser.setOnClickListener { findNavController().navigate(R.id.action_userListFragment_to_registrationFragment) } diff --git a/app/src/main/res/layout/fragment_user_list.xml b/app/src/main/res/layout/fragment_user_list.xml index 06a70f4..8b08c4f 100644 --- a/app/src/main/res/layout/fragment_user_list.xml +++ b/app/src/main/res/layout/fragment_user_list.xml @@ -16,6 +16,20 @@ android:layout_height="match_parent" android:orientation="vertical"> + + + Date: Tue, 24 Oct 2023 14:07:08 +0530 Subject: [PATCH 04/16] fix empty list messages display --- .../hposregistration/ui/fragments/UserListFragment.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt b/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt index a00f5d3..4e2565e 100644 --- a/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt +++ b/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt @@ -174,10 +174,8 @@ class UserListFragment : BaseFragment() { .whereGreaterThanOrEqualTo("createdAt", today) .orderBy("createdAt", Query.Direction.DESCENDING) query.get().addOnSuccessListener { - if (it.documents.isEmpty()) { + if (it.documents.isEmpty() && isOnline) { binding.emptyRegistrations.visibility = View.VISIBLE - } else { - binding.emptyRegistrations.visibility = View.GONE } } val recyclerViewOptions = @@ -195,6 +193,7 @@ class UserListFragment : BaseFragment() { binding.noList.visibility = View.GONE binding.rvOrder.visibility = View.VISIBLE } else { + binding.emptyRegistrations.visibility = View.GONE if (userDataList.isEmpty()) { binding.noList.visibility = View.VISIBLE binding.rvOrder.visibility = View.GONE From 2bd6495612d728613411ee1796c14ad9666a4c94 Mon Sep 17 00:00:00 2001 From: Pritimay Sarkar Date: Tue, 24 Oct 2023 14:09:53 +0530 Subject: [PATCH 05/16] remove key files --- app/.gitignore | 3 +- app/google-services.json | 113 --------------------------------------- 2 files changed, 2 insertions(+), 114 deletions(-) delete mode 100644 app/google-services.json diff --git a/app/.gitignore b/app/.gitignore index 42afabf..ebe0879 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ -/build \ No newline at end of file +/build +/google-services* \ No newline at end of file diff --git a/app/google-services.json b/app/google-services.json deleted file mode 100644 index a593d99..0000000 --- a/app/google-services.json +++ /dev/null @@ -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" -} \ No newline at end of file From ccc50108d3ac257649d88337fd6cc4a53792adfb Mon Sep 17 00:00:00 2001 From: Pritimay Sarkar Date: Sun, 29 Oct 2023 07:33:12 +0530 Subject: [PATCH 06/16] add app distribution auto update --- app/build.gradle | 6 ++- .../ui/activities/MainActivity.kt | 44 +++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 368fba3..5b2fa60 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { applicationId "in.sminnovations.hposregistration" minSdk 26 targetSdk 34 - versionCode 1 - versionName "1.0" + versionCode 6 + versionName "1.0.6" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -59,6 +59,8 @@ dependencies { implementation 'com.google.firebase:firebase-storage-ktx' implementation 'com.firebaseui:firebase-ui-firestore:8.0.2' implementation 'com.google.android.gms:play-services-auth:20.6.0' + implementation 'com.google.firebase:firebase-appdistribution:16.0.0-beta10' + implementation("com.google.firebase:firebase-appdistribution-api-ktx:16.0.0-beta10") // Coroutines implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1' diff --git a/app/src/main/java/com/example/hposregistration/ui/activities/MainActivity.kt b/app/src/main/java/com/example/hposregistration/ui/activities/MainActivity.kt index 51c0221..013bdf0 100644 --- a/app/src/main/java/com/example/hposregistration/ui/activities/MainActivity.kt +++ b/app/src/main/java/com/example/hposregistration/ui/activities/MainActivity.kt @@ -2,6 +2,10 @@ package com.example.hposregistration.ui.activities import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.widget.Toast +import com.google.firebase.appdistribution.FirebaseAppDistribution +import com.google.firebase.appdistribution.FirebaseAppDistributionException +import com.google.firebase.crashlytics.FirebaseCrashlytics import dagger.hilt.android.AndroidEntryPoint import `in`.sminnovations.hposregistration.databinding.ActivityMainBinding @@ -16,4 +20,44 @@ class MainActivity : AppCompatActivity() { 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() + } + } } \ No newline at end of file From 2e824c1bed36fc575419fe245a7915be43ea017a Mon Sep 17 00:00:00 2001 From: Mariya Date: Tue, 12 Dec 2023 15:45:16 +0530 Subject: [PATCH 07/16] fixing errors related to version --- app/build.gradle | 28 +++++++++--------- .../hposregistration/dao/MyDataBase.kt | 29 +++++++++++++++++-- .../hposregistration/network/UserDao.kt | 3 ++ 3 files changed, 44 insertions(+), 16 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 5b2fa60..89d7cc8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -42,9 +42,9 @@ android { dependencies { - implementation 'androidx.core:core-ktx:1.10.1' + implementation 'androidx.core:core-ktx:1.12.0' implementation 'androidx.appcompat:appcompat:1.6.1' - implementation 'com.google.android.material:material:1.9.0' + implementation 'com.google.android.material:material:1.10.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' @@ -58,26 +58,26 @@ dependencies { implementation 'com.google.firebase:firebase-auth-ktx' implementation 'com.google.firebase:firebase-storage-ktx' implementation 'com.firebaseui:firebase-ui-firestore:8.0.2' - implementation 'com.google.android.gms:play-services-auth:20.6.0' - implementation 'com.google.firebase:firebase-appdistribution:16.0.0-beta10' - implementation("com.google.firebase:firebase-appdistribution-api-ktx:16.0.0-beta10") + 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 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1' // Coroutine Lifecycle Scopes - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1" - implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2" + implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.2" //Dagger - Hilt implementation "com.google.dagger:hilt-android:2.46" kapt "com.google.dagger:hilt-android-compiler:2.46" - kapt "androidx.hilt:hilt-compiler:1.0.0" + kapt "androidx.hilt:hilt-compiler:1.1.0" // Navigation Component - implementation "androidx.navigation:navigation-fragment-ktx:2.7.0" - implementation "androidx.navigation:navigation-ui-ktx:2.7.0" + implementation "androidx.navigation:navigation-fragment-ktx:2.7.5" + implementation "androidx.navigation:navigation-ui-ktx:2.7.5" // Retrofit + GSON implementation "com.squareup.retrofit2:retrofit:2.9.0" @@ -87,16 +87,16 @@ dependencies { implementation 'com.jakewharton.timber:timber:4.7.1' // Activity KTX for viewModels() - implementation "androidx.activity:activity-ktx:1.7.2" + implementation "androidx.activity:activity-ktx:1.8.1" //image implementation 'com.github.bumptech.glide:glide:4.13.2' annotationProcessor 'com.github.bumptech.glide:compiler:4.13.2' //Room - implementation "androidx.room:room-ktx:2.6.0-alpha03" - implementation "androidx.room:room-runtime:2.6.0-alpha03" - kapt ("androidx.room:room-compiler:2.6.0-alpha03") + implementation "androidx.room:room-ktx:2.6.1" + implementation "androidx.room:room-runtime:2.6.1" + kapt ("androidx.room:room-compiler:2.6.1") // Barcode scanner implementation 'com.journeyapps:zxing-android-embedded:4.3.0' diff --git a/app/src/main/java/com/example/hposregistration/dao/MyDataBase.kt b/app/src/main/java/com/example/hposregistration/dao/MyDataBase.kt index cdcf480..b2ff720 100644 --- a/app/src/main/java/com/example/hposregistration/dao/MyDataBase.kt +++ b/app/src/main/java/com/example/hposregistration/dao/MyDataBase.kt @@ -1,11 +1,36 @@ package com.example.hposregistration.dao +import android.content.Context import androidx.room.Database +import androidx.room.Room import androidx.room.RoomDatabase import androidx.room.TypeConverters +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase 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 fun userDao(): UserDao -} \ No newline at end of file + + 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() + } + } +} diff --git a/app/src/main/java/com/example/hposregistration/network/UserDao.kt b/app/src/main/java/com/example/hposregistration/network/UserDao.kt index a05f0bf..06fdfdc 100644 --- a/app/src/main/java/com/example/hposregistration/network/UserDao.kt +++ b/app/src/main/java/com/example/hposregistration/network/UserDao.kt @@ -27,4 +27,7 @@ class UserDao { // suspend fun getPatientList(): List { // return patientCollection.get().await().toObjects(UserData::class.java) // } + + + } \ No newline at end of file From 425bc61a502df5e49ddccdf9fcf933a684790593 Mon Sep 17 00:00:00 2001 From: Mariya Date: Thu, 14 Dec 2023 13:26:54 +0530 Subject: [PATCH 08/16] fixing errors related to version --- .idea/shelf/Changes3.xml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .idea/shelf/Changes3.xml diff --git a/.idea/shelf/Changes3.xml b/.idea/shelf/Changes3.xml new file mode 100644 index 0000000..15b4ce4 --- /dev/null +++ b/.idea/shelf/Changes3.xml @@ -0,0 +1,4 @@ + + \ No newline at end of file From 8c1e30764c9333132f911bed1af9d31557f42a79 Mon Sep 17 00:00:00 2001 From: Mariya Date: Fri, 15 Dec 2023 11:41:54 +0530 Subject: [PATCH 09/16] UserListFragment changed --- .../ui/fragments/UserListFragment.kt | 20 +---------- .../main/res/layout/fragment_user_list.xml | 34 ++++--------------- 2 files changed, 8 insertions(+), 46 deletions(-) diff --git a/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt b/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt index e10cd67..5b303e2 100644 --- a/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt +++ b/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt @@ -8,6 +8,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Button import android.widget.Toast import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController @@ -17,14 +18,11 @@ import com.example.hposregistration.data.Constant import com.example.hposregistration.data.user.UserData import com.example.hposregistration.ui.viewmodels.RegistrationViewModel import com.firebase.ui.firestore.FirestoreRecyclerOptions -import com.google.firebase.firestore.Query import com.google.firebase.firestore.ktx.firestore import com.google.firebase.ktx.Firebase import dagger.hilt.android.AndroidEntryPoint import `in`.sminnovations.hposregistration.R import `in`.sminnovations.hposregistration.databinding.FragmentUserListBinding -import java.text.SimpleDateFormat -import java.util.Date @AndroidEntryPoint class UserListFragment : BaseFragment() { @@ -58,11 +56,6 @@ class UserListFragment : BaseFragment() { } private fun setupViews() { - val pInfo = requireActivity().packageManager.getPackageInfo( - requireActivity().packageName, 0 - ) - val version = pInfo.versionName - binding.appVersion.text = version binding.btnRegisterUser.setOnClickListener { findNavController().navigate(R.id.action_userListFragment_to_registrationFragment) } @@ -171,17 +164,7 @@ class UserListFragment : BaseFragment() { private fun fetchFromServer() { binding.noList.visibility = View.GONE 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") - .whereGreaterThanOrEqualTo("createdAt", today) - .orderBy("createdAt", Query.Direction.DESCENDING) - query.get().addOnSuccessListener { - if (it.documents.isEmpty() && isOnline) { - binding.emptyRegistrations.visibility = View.VISIBLE - } - } val recyclerViewOptions = FirestoreRecyclerOptions.Builder().setQuery(query, UserData::class.java) .build() @@ -197,7 +180,6 @@ class UserListFragment : BaseFragment() { binding.noList.visibility = View.GONE binding.rvOrder.visibility = View.VISIBLE } else { - binding.emptyRegistrations.visibility = View.GONE if (userDataList.isEmpty()) { binding.noList.visibility = View.VISIBLE binding.rvOrder.visibility = View.GONE diff --git a/app/src/main/res/layout/fragment_user_list.xml b/app/src/main/res/layout/fragment_user_list.xml index 8b08c4f..4c3db74 100644 --- a/app/src/main/res/layout/fragment_user_list.xml +++ b/app/src/main/res/layout/fragment_user_list.xml @@ -16,20 +16,14 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - + app:layout_constraintTop_toTopOf="@+id/tv_title" /> - - Date: Fri, 15 Dec 2023 11:43:22 +0530 Subject: [PATCH 10/16] UserListFragment merged --- .../ui/fragments/UserListFragment.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt b/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt index 5b303e2..7e34f64 100644 --- a/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt +++ b/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt @@ -18,11 +18,14 @@ import com.example.hposregistration.data.Constant import com.example.hposregistration.data.user.UserData import com.example.hposregistration.ui.viewmodels.RegistrationViewModel import com.firebase.ui.firestore.FirestoreRecyclerOptions +import com.google.firebase.firestore.Query import com.google.firebase.firestore.ktx.firestore import com.google.firebase.ktx.Firebase import dagger.hilt.android.AndroidEntryPoint import `in`.sminnovations.hposregistration.R import `in`.sminnovations.hposregistration.databinding.FragmentUserListBinding +import java.text.SimpleDateFormat +import java.util.Date @AndroidEntryPoint class UserListFragment : BaseFragment() { @@ -164,7 +167,17 @@ class UserListFragment : BaseFragment() { private fun fetchFromServer() { binding.noList.visibility = View.GONE 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") + .whereGreaterThanOrEqualTo("createdAt", today) + .orderBy("createdAt", Query.Direction.DESCENDING) + query.get().addOnSuccessListener { + if (it.documents.isEmpty() && isOnline) { + binding.emptyRegistrations.visibility = View.VISIBLE + } + } val recyclerViewOptions = FirestoreRecyclerOptions.Builder().setQuery(query, UserData::class.java) .build() From 4e5df74cea06b10a19dd6d6bf467c445bed96765 Mon Sep 17 00:00:00 2001 From: Mariya Date: Fri, 15 Dec 2023 12:20:35 +0530 Subject: [PATCH 11/16] merged with preprod branch --- .../shelved.patch | 0 ...e_Checkout_at_04-12-2023_02_50_pm__Changes_.xml | 4 ---- app/build.gradle | 5 +++-- .../hposregistration/ui/activities/MainActivity.kt | 9 +++++++++ .../ui/fragments/LanguageSettingsFragment.kt | 8 ++------ app/src/main/res/layout/fragment_user_list.xml | 14 ++++++++++++++ app/src/main/res/values-hi/strings.xml | 1 + app/src/main/res/values-kn/strings.xml | 1 + 8 files changed, 30 insertions(+), 12 deletions(-) delete mode 100644 .idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm_[Changes]/shelved.patch delete mode 100644 .idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm__Changes_.xml diff --git a/.idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm_[Changes]/shelved.patch b/.idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm_[Changes]/shelved.patch deleted file mode 100644 index e69de29..0000000 diff --git a/.idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm__Changes_.xml b/.idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm__Changes_.xml deleted file mode 100644 index 536290a..0000000 --- a/.idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm__Changes_.xml +++ /dev/null @@ -1,4 +0,0 @@ - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 89d7cc8..ae7582e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { applicationId "in.sminnovations.hposregistration" minSdk 26 targetSdk 34 - versionCode 6 - versionName "1.0.6" + versionCode 8 + versionName "1.0.8" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -46,6 +46,7 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.10.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation 'androidx.preference:preference-ktx:1.2.1' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' diff --git a/app/src/main/java/com/example/hposregistration/ui/activities/MainActivity.kt b/app/src/main/java/com/example/hposregistration/ui/activities/MainActivity.kt index 013bdf0..85c53af 100644 --- a/app/src/main/java/com/example/hposregistration/ui/activities/MainActivity.kt +++ b/app/src/main/java/com/example/hposregistration/ui/activities/MainActivity.kt @@ -1,8 +1,10 @@ package com.example.hposregistration.ui.activities +import android.content.Context import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Toast +import com.example.hposregistration.data.LanguageManager import com.google.firebase.appdistribution.FirebaseAppDistribution import com.google.firebase.appdistribution.FirebaseAppDistributionException import com.google.firebase.crashlytics.FirebaseCrashlytics @@ -14,6 +16,13 @@ class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding + + override fun attachBaseContext(newBase: Context?) { + val languageCode = LanguageManager.getSavedLanguage(newBase!!) + LanguageManager.setLocale(newBase, languageCode) + super.attachBaseContext(newBase) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) diff --git a/app/src/main/java/com/example/hposregistration/ui/fragments/LanguageSettingsFragment.kt b/app/src/main/java/com/example/hposregistration/ui/fragments/LanguageSettingsFragment.kt index 6533bbe..87de1a4 100644 --- a/app/src/main/java/com/example/hposregistration/ui/fragments/LanguageSettingsFragment.kt +++ b/app/src/main/java/com/example/hposregistration/ui/fragments/LanguageSettingsFragment.kt @@ -3,14 +3,10 @@ package com.example.hposregistration.ui.fragments import android.content.Context import android.content.pm.PackageManager 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.PreferenceFragmentCompat + +import android.widget.Toast import com.example.hposregistration.data.LanguageManager import `in`.sminnovations.hposregistration.R diff --git a/app/src/main/res/layout/fragment_user_list.xml b/app/src/main/res/layout/fragment_user_list.xml index 4c3db74..bc89f5e 100644 --- a/app/src/main/res/layout/fragment_user_list.xml +++ b/app/src/main/res/layout/fragment_user_list.xml @@ -34,6 +34,20 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + पिता / पति का नाम दर्ज करें क्या आप ऐप्लिकेशन से लॉग आउट करना चाहते हैं? लॉग आउट + प्रदर्शन के लिए कोई पंजीकरण उपलब्ध नहीं हैं डीबी पंजीकरण अपलोड करें क्या आप स्थानीय डीबी को क्लाउड पर अपलोड करना चाहते हैं? diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml index 0bdd11e..d984f3a 100644 --- a/app/src/main/res/values-kn/strings.xml +++ b/app/src/main/res/values-kn/strings.xml @@ -129,6 +129,7 @@ ತಪ್ಪಾದ ಪಾಸ್‌ವರ್ಡ್ ತಪ್ಪಾದ ಬಳಕೆದಾರ ಐಡಿ ನೀವು ಆಧಾರ್ ಐಡನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿದ್ದೀರಿ, ದಯವಿಟ್ಟು ಆಧಾರ್ ಐಡನ್ನು ನೀವು ಸ್ಕ್ಯಾನ್ ಮಾಡಿದ ಮತ್ತು ಅಭಾ ಐಡನ್ನು ಕೈಯಾರೆ ನಮೂದಿಸಿ + ಪ್ರದರ್ಶಿಸಲಿರುವ ಯಾವ ನೋಂದಾಯಿಗಳೂ ಲಭ್ಯವಿಲ್ಲ ನೀವು ಅಭಾ ಐಡಿಯನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿದ್ದೀರಿ ನೀವು ಆಧಾರ್ ಐಡನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿದಿರಿ From 23850d4bfe642abbc910d1dea70bf358a280cb2f Mon Sep 17 00:00:00 2001 From: Mariya Date: Fri, 15 Dec 2023 16:52:20 +0530 Subject: [PATCH 12/16] csv --- .../shelved.patch | 0 ...ckout_at_04-12-2023_02_50_pm__Changes_.xml | 4 - app/build.gradle | 8 +- app/src/main/AndroidManifest.xml | 4 +- .../hposregistration/dao/MyDataBase.kt | 2 +- .../example/hposregistration/dao/UserDao.kt | 3 + .../hposregistration/data/MainRepository.kt | 4 + .../data/datasource/LocalFileDataSource.kt | 124 ++++++++++++++++++ .../hposregistration/data/user/UserData.kt | 4 +- .../example/hposregistration/di/AppModule.kt | 7 + .../hposregistration/network/UserDao.kt | 3 + .../ui/fragments/UserListFragment.kt | 61 ++++++++- .../ui/viewmodels/RegistrationViewModel.kt | 27 ++++ app/src/main/res/drawable/downloads.xml | 5 + .../main/res/layout/fragment_user_list.xml | 9 ++ app/src/main/res/values/strings.xml | 5 +- 16 files changed, 258 insertions(+), 12 deletions(-) delete mode 100644 .idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm_[Changes]/shelved.patch delete mode 100644 .idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm__Changes_.xml create mode 100644 app/src/main/java/com/example/hposregistration/data/datasource/LocalFileDataSource.kt create mode 100644 app/src/main/res/drawable/downloads.xml diff --git a/.idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm_[Changes]/shelved.patch b/.idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm_[Changes]/shelved.patch deleted file mode 100644 index e69de29..0000000 diff --git a/.idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm__Changes_.xml b/.idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm__Changes_.xml deleted file mode 100644 index 536290a..0000000 --- a/.idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm__Changes_.xml +++ /dev/null @@ -1,4 +0,0 @@ - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 07b1ee5..afed6c1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,10 +91,12 @@ dependencies { implementation 'com.github.bumptech.glide:glide:4.13.2' annotationProcessor 'com.github.bumptech.glide:compiler:4.13.2' + implementation 'com.opencsv:opencsv:5.5' + //Room - implementation "androidx.room:room-ktx:2.6.0" - implementation "androidx.room:room-runtime:2.6.0" - kapt ("androidx.room:room-compiler:2.6.0") + implementation "androidx.room:room-ktx:2.6.1" + implementation "androidx.room:room-runtime:2.6.1" + kapt ("androidx.room:room-compiler:2.6.1") // Barcode scanner implementation 'com.journeyapps:zxing-android-embedded:4.3.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 14f9ab4..9cda14d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,9 @@ android:required="false" /> + + @@ -43,7 +45,7 @@ diff --git a/app/src/main/java/com/example/hposregistration/dao/MyDataBase.kt b/app/src/main/java/com/example/hposregistration/dao/MyDataBase.kt index cdcf480..607b9f5 100644 --- a/app/src/main/java/com/example/hposregistration/dao/MyDataBase.kt +++ b/app/src/main/java/com/example/hposregistration/dao/MyDataBase.kt @@ -5,7 +5,7 @@ import androidx.room.RoomDatabase import androidx.room.TypeConverters 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 fun userDao(): UserDao } \ No newline at end of file diff --git a/app/src/main/java/com/example/hposregistration/dao/UserDao.kt b/app/src/main/java/com/example/hposregistration/dao/UserDao.kt index bdff697..3028322 100644 --- a/app/src/main/java/com/example/hposregistration/dao/UserDao.kt +++ b/app/src/main/java/com/example/hposregistration/dao/UserDao.kt @@ -20,4 +20,7 @@ interface UserDao { @Query("DELETE FROM user_table WHERE _id = :id") suspend fun deleteById(id: String) + + @Query("UPDATE user_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/hposregistration/data/MainRepository.kt b/app/src/main/java/com/example/hposregistration/data/MainRepository.kt index 715827d..7151662 100644 --- a/app/src/main/java/com/example/hposregistration/data/MainRepository.kt +++ b/app/src/main/java/com/example/hposregistration/data/MainRepository.kt @@ -30,4 +30,8 @@ class MainRepository @Inject constructor( return userFireBaseDao.addUserToDatabase(userData) } + suspend fun updateCSVFieldById(id: String, isCSVCreated: Boolean) { + userDao.updateCSVFieldById(id, isCSVCreated) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/example/hposregistration/data/datasource/LocalFileDataSource.kt b/app/src/main/java/com/example/hposregistration/data/datasource/LocalFileDataSource.kt new file mode 100644 index 0000000..829bf9e --- /dev/null +++ b/app/src/main/java/com/example/hposregistration/data/datasource/LocalFileDataSource.kt @@ -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>){ + 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 + ): 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 + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/hposregistration/data/user/UserData.kt b/app/src/main/java/com/example/hposregistration/data/user/UserData.kt index 5ecc79d..7afb5f5 100644 --- a/app/src/main/java/com/example/hposregistration/data/user/UserData.kt +++ b/app/src/main/java/com/example/hposregistration/data/user/UserData.kt @@ -32,7 +32,9 @@ data class UserData( var registeredBy: String? = "", var createdAt: String? = "", var registrationCenterName: String? = "", - var testStatus: Boolean = false + var testStatus: Boolean = false, + var isCSVCreated: Boolean = false, + var localFlag: Boolean = false, ){ enum class Gender { MALE, diff --git a/app/src/main/java/com/example/hposregistration/di/AppModule.kt b/app/src/main/java/com/example/hposregistration/di/AppModule.kt index 9f0bdf2..bda8c90 100644 --- a/app/src/main/java/com/example/hposregistration/di/AppModule.kt +++ b/app/src/main/java/com/example/hposregistration/di/AppModule.kt @@ -5,6 +5,7 @@ import android.content.Context import androidx.room.Room import com.example.hposregistration.dao.MyDatabase import com.example.hposregistration.dao.UserDao +import com.example.hpostesting.data.datasource.LocalFileDataSource import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -41,4 +42,10 @@ object AppModule { fun provideContext(application: Application): Context { return application.applicationContext } + + @Provides + @Singleton + fun provideLocalFileDataSource(): LocalFileDataSource { + return LocalFileDataSource() + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/hposregistration/network/UserDao.kt b/app/src/main/java/com/example/hposregistration/network/UserDao.kt index a05f0bf..c7a548d 100644 --- a/app/src/main/java/com/example/hposregistration/network/UserDao.kt +++ b/app/src/main/java/com/example/hposregistration/network/UserDao.kt @@ -1,5 +1,6 @@ package com.example.hposregistration.network +import androidx.room.Query import com.example.hposregistration.data.Response import com.example.hposregistration.data.user.UserData import com.google.firebase.firestore.FirebaseFirestore @@ -24,6 +25,8 @@ class UserDao { } } + + // suspend fun getPatientList(): List { // return patientCollection.get().await().toObjects(UserData::class.java) // } diff --git a/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt b/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt index b125f3d..ad574fe 100644 --- a/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt +++ b/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt @@ -5,11 +5,13 @@ import android.content.Context import android.content.DialogInterface import android.content.SharedPreferences import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Button import android.widget.Toast +import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import com.example.hposregistration.adapters.UserListOfflineAdapter @@ -30,7 +32,7 @@ class UserListFragment : BaseFragment() { private var _binding: FragmentUserListBinding? = null private val binding get() = _binding!! - private val viewModel by viewModels() + private val viewModel:RegistrationViewModel by activityViewModels() private var isOnline = false @@ -81,6 +83,10 @@ class UserListFragment : BaseFragment() { showUploadDialog(requireContext()) } + binding.btnSaveLocal.setOnClickListener { + showDownloadDialog(requireContext()) + } + binding.btnsettings.setOnClickListener{ findNavController().navigate(R.id.action_userListFragment_to_languageSettingsFragment) @@ -174,6 +180,25 @@ class UserListFragment : BaseFragment() { 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() { binding.uploadData.visibility = View.GONE viewModel.allUserData.observe(viewLifecycleOwner) { userDataList -> @@ -196,6 +221,40 @@ class UserListFragment : BaseFragment() { } } + + private fun downloadLocalDBData(dialog: DialogInterface) { + viewModel.allUserData.observe(viewLifecycleOwner) { userDataList -> + try { + val downloadList = mutableListOf() + + userDataList.forEach { userData -> + // Log details for debugging + 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) { userDataList.forEach { if (it.userImageURL.isEmpty()) { diff --git a/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt b/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt index 930e4ca..f9ead41 100644 --- a/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt +++ b/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt @@ -10,14 +10,21 @@ import com.example.hposregistration.data.MainRepository import com.example.hposregistration.data.NetworkStatusLiveData import com.example.hposregistration.data.Response 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 dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale import javax.inject.Inject @HiltViewModel class RegistrationViewModel @Inject constructor( private val mainRepository: MainRepository, + private val userdao: UserDao, + private val localFileDataSource: LocalFileDataSource, context: Context ) : ViewModel() { @@ -73,4 +80,24 @@ class RegistrationViewModel @Inject constructor( fun deleteById(userId: String) = viewModelScope.launch { mainRepository.deleteById(id = userId) } + + fun createCSV(userData: List, appContext: Context) = + viewModelScope.launch { + val fileName = "${getCurrentDate()}.csv" + if (localFileDataSource.exportDataToCSV(fileName, userData)) { + userData.forEach { data -> + data.localFlag = true + mainRepository.updateCSVFieldById( + data._id, + true + ) + } + } + } + + private fun getCurrentDate(): String { + val dateFormat = SimpleDateFormat("dd-MM-yy", Locale.getDefault()) + val currentDate = Date() + return dateFormat.format(currentDate) + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/downloads.xml b/app/src/main/res/drawable/downloads.xml new file mode 100644 index 0000000..17e7f58 --- /dev/null +++ b/app/src/main/res/drawable/downloads.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/fragment_user_list.xml b/app/src/main/res/layout/fragment_user_list.xml index dd10574..5c5c18f 100644 --- a/app/src/main/res/layout/fragment_user_list.xml +++ b/app/src/main/res/layout/fragment_user_list.xml @@ -80,6 +80,15 @@ app:layout_constraintTop_toBottomOf="@+id/tv_title" tools:listitem="@layout/user_item_view" /> + + You have scanned the Aadhar ID, need to enter Aadhar ID number you have scanned and Abha ID manually You have scanned the Abha ID You have scanned the Aadhar ID - + Download CSV + Download DB Tests + Do you want to download the local DB tests in CSV format? + Upload done successfully NT-A NT-B From aeb70990fb4b932ece50a64a96b42008cb72c211 Mon Sep 17 00:00:00 2001 From: Mariya Date: Fri, 15 Dec 2023 17:43:42 +0530 Subject: [PATCH 13/16] uncommitted changes --- app/src/main/res/values-hi/strings.xml | 2 +- app/src/main/res/values/strings.xml | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 3b7f5df..688cbb3 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -122,7 +122,7 @@ क्या आप स्थानीय डीबी को क्लाउड पर अपलोड करना चाहते हैं? अपलोड अपलोड सफलतापूर्वक हुआ - + प्रदर्शन के लिए कोई पंजीकरण उपलब्ध नहीं है कृपया सही लॉगिन आईडी दर्ज करें कृपया सही पासवर्ड दर्ज करें गलत पासवर्ड diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fee1fe5..fed9529 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -140,6 +140,10 @@ User Id Name OK + + No registrations available for display + + Add Blood Group You have scanned the Aadhar ID, need to enter Aadhar ID number you have scanned and Abha ID manually You have scanned the Abha ID From c0782b85a0e53ea169215980d9d50c2944d9d502 Mon Sep 17 00:00:00 2001 From: Mariya Date: Fri, 15 Dec 2023 17:57:04 +0530 Subject: [PATCH 14/16] Committing local changes before revert --- .../shelved.patch | 0 ...ckout_at_04-12-2023_02_50_pm__Changes_.xml | 4 + app/build.gradle | 8 +- app/src/main/AndroidManifest.xml | 4 +- .../hposregistration/dao/MyDataBase.kt | 2 +- .../example/hposregistration/dao/UserDao.kt | 3 - .../hposregistration/data/MainRepository.kt | 4 - .../data/datasource/LocalFileDataSource.kt | 124 ------------------ .../hposregistration/data/user/UserData.kt | 4 +- .../example/hposregistration/di/AppModule.kt | 7 - .../hposregistration/network/UserDao.kt | 3 - .../ui/fragments/UserListFragment.kt | 61 +-------- .../ui/viewmodels/RegistrationViewModel.kt | 27 ---- app/src/main/res/drawable/downloads.xml | 5 - .../main/res/layout/fragment_user_list.xml | 9 -- app/src/main/res/values/strings.xml | 5 +- 16 files changed, 12 insertions(+), 258 deletions(-) create mode 100644 .idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm_[Changes]/shelved.patch create mode 100644 .idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm__Changes_.xml delete mode 100644 app/src/main/java/com/example/hposregistration/data/datasource/LocalFileDataSource.kt delete mode 100644 app/src/main/res/drawable/downloads.xml diff --git a/.idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm_[Changes]/shelved.patch b/.idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm_[Changes]/shelved.patch new file mode 100644 index 0000000..e69de29 diff --git a/.idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm__Changes_.xml b/.idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm__Changes_.xml new file mode 100644 index 0000000..536290a --- /dev/null +++ b/.idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm__Changes_.xml @@ -0,0 +1,4 @@ + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 4e0ca32..2031141 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -94,12 +94,10 @@ dependencies { implementation 'com.github.bumptech.glide:glide:4.13.2' annotationProcessor 'com.github.bumptech.glide:compiler:4.13.2' - implementation 'com.opencsv:opencsv:5.5' - //Room - implementation "androidx.room:room-ktx:2.6.1" - implementation "androidx.room:room-runtime:2.6.1" - kapt ("androidx.room:room-compiler:2.6.1") + implementation "androidx.room:room-ktx:2.6.0" + implementation "androidx.room:room-runtime:2.6.0" + kapt ("androidx.room:room-compiler:2.6.0") // Barcode scanner implementation 'com.journeyapps:zxing-android-embedded:4.3.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9cda14d..14f9ab4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,9 +7,7 @@ android:required="false" /> - - @@ -45,7 +43,7 @@ diff --git a/app/src/main/java/com/example/hposregistration/dao/MyDataBase.kt b/app/src/main/java/com/example/hposregistration/dao/MyDataBase.kt index b2ff720..649ff6a 100644 --- a/app/src/main/java/com/example/hposregistration/dao/MyDataBase.kt +++ b/app/src/main/java/com/example/hposregistration/dao/MyDataBase.kt @@ -9,7 +9,7 @@ import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase import com.example.hposregistration.data.user.UserData -@Database(entities = [UserData::class], version = 3, exportSchema = false) +@Database(entities = [UserData::class], version = 1, exportSchema = false) abstract class MyDatabase : RoomDatabase() { abstract fun userDao(): UserDao diff --git a/app/src/main/java/com/example/hposregistration/dao/UserDao.kt b/app/src/main/java/com/example/hposregistration/dao/UserDao.kt index 3028322..bdff697 100644 --- a/app/src/main/java/com/example/hposregistration/dao/UserDao.kt +++ b/app/src/main/java/com/example/hposregistration/dao/UserDao.kt @@ -20,7 +20,4 @@ interface UserDao { @Query("DELETE FROM user_table WHERE _id = :id") suspend fun deleteById(id: String) - - @Query("UPDATE user_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/hposregistration/data/MainRepository.kt b/app/src/main/java/com/example/hposregistration/data/MainRepository.kt index 7151662..715827d 100644 --- a/app/src/main/java/com/example/hposregistration/data/MainRepository.kt +++ b/app/src/main/java/com/example/hposregistration/data/MainRepository.kt @@ -30,8 +30,4 @@ class MainRepository @Inject constructor( return userFireBaseDao.addUserToDatabase(userData) } - suspend fun updateCSVFieldById(id: String, isCSVCreated: Boolean) { - userDao.updateCSVFieldById(id, isCSVCreated) - } - } \ No newline at end of file diff --git a/app/src/main/java/com/example/hposregistration/data/datasource/LocalFileDataSource.kt b/app/src/main/java/com/example/hposregistration/data/datasource/LocalFileDataSource.kt deleted file mode 100644 index 829bf9e..0000000 --- a/app/src/main/java/com/example/hposregistration/data/datasource/LocalFileDataSource.kt +++ /dev/null @@ -1,124 +0,0 @@ -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>){ - 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 - ): 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 - } - - -} \ No newline at end of file diff --git a/app/src/main/java/com/example/hposregistration/data/user/UserData.kt b/app/src/main/java/com/example/hposregistration/data/user/UserData.kt index 8ba7c60..0b40ebc 100644 --- a/app/src/main/java/com/example/hposregistration/data/user/UserData.kt +++ b/app/src/main/java/com/example/hposregistration/data/user/UserData.kt @@ -35,9 +35,7 @@ data class UserData( var registeredBy: String? = "", var createdAt: String? = "", var registrationCenterName: String? = "", - var testStatus: Boolean = false, - var isCSVCreated: Boolean = false, - var localFlag: Boolean = false, + var testStatus: Boolean = false ){ enum class Gender { MALE, diff --git a/app/src/main/java/com/example/hposregistration/di/AppModule.kt b/app/src/main/java/com/example/hposregistration/di/AppModule.kt index bda8c90..9f0bdf2 100644 --- a/app/src/main/java/com/example/hposregistration/di/AppModule.kt +++ b/app/src/main/java/com/example/hposregistration/di/AppModule.kt @@ -5,7 +5,6 @@ import android.content.Context import androidx.room.Room import com.example.hposregistration.dao.MyDatabase import com.example.hposregistration.dao.UserDao -import com.example.hpostesting.data.datasource.LocalFileDataSource import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -42,10 +41,4 @@ object AppModule { fun provideContext(application: Application): Context { return application.applicationContext } - - @Provides - @Singleton - fun provideLocalFileDataSource(): LocalFileDataSource { - return LocalFileDataSource() - } } \ No newline at end of file diff --git a/app/src/main/java/com/example/hposregistration/network/UserDao.kt b/app/src/main/java/com/example/hposregistration/network/UserDao.kt index b993bec..06fdfdc 100644 --- a/app/src/main/java/com/example/hposregistration/network/UserDao.kt +++ b/app/src/main/java/com/example/hposregistration/network/UserDao.kt @@ -1,6 +1,5 @@ package com.example.hposregistration.network -import androidx.room.Query import com.example.hposregistration.data.Response import com.example.hposregistration.data.user.UserData import com.google.firebase.firestore.FirebaseFirestore @@ -25,8 +24,6 @@ class UserDao { } } - - // suspend fun getPatientList(): List { // return patientCollection.get().await().toObjects(UserData::class.java) // } diff --git a/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt b/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt index cc9bb56..78cb135 100644 --- a/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt +++ b/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt @@ -5,13 +5,11 @@ import android.content.Context import android.content.DialogInterface import android.content.SharedPreferences import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Button import android.widget.Toast -import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import com.example.hposregistration.adapters.UserListOfflineAdapter @@ -35,7 +33,7 @@ class UserListFragment : BaseFragment() { private var _binding: FragmentUserListBinding? = null private val binding get() = _binding!! - private val viewModel:RegistrationViewModel by activityViewModels() + private val viewModel by viewModels() private var isOnline = false @@ -86,10 +84,6 @@ class UserListFragment : BaseFragment() { showUploadDialog(requireContext()) } - binding.btnSaveLocal.setOnClickListener { - showDownloadDialog(requireContext()) - } - binding.btnsettings.setOnClickListener{ findNavController().navigate(R.id.action_userListFragment_to_languageSettingsFragment) @@ -193,25 +187,6 @@ class UserListFragment : BaseFragment() { 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() { binding.uploadData.visibility = View.GONE viewModel.allUserData.observe(viewLifecycleOwner) { userDataList -> @@ -234,40 +209,6 @@ class UserListFragment : BaseFragment() { } } - - private fun downloadLocalDBData(dialog: DialogInterface) { - viewModel.allUserData.observe(viewLifecycleOwner) { userDataList -> - try { - val downloadList = mutableListOf() - - userDataList.forEach { userData -> - // Log details for debugging - 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) { userDataList.forEach { if (it.userImageURL.isEmpty()) { diff --git a/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt b/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt index f9ead41..930e4ca 100644 --- a/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt +++ b/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt @@ -10,21 +10,14 @@ import com.example.hposregistration.data.MainRepository import com.example.hposregistration.data.NetworkStatusLiveData import com.example.hposregistration.data.Response 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 dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale import javax.inject.Inject @HiltViewModel class RegistrationViewModel @Inject constructor( private val mainRepository: MainRepository, - private val userdao: UserDao, - private val localFileDataSource: LocalFileDataSource, context: Context ) : ViewModel() { @@ -80,24 +73,4 @@ class RegistrationViewModel @Inject constructor( fun deleteById(userId: String) = viewModelScope.launch { mainRepository.deleteById(id = userId) } - - fun createCSV(userData: List, appContext: Context) = - viewModelScope.launch { - val fileName = "${getCurrentDate()}.csv" - if (localFileDataSource.exportDataToCSV(fileName, userData)) { - userData.forEach { data -> - data.localFlag = true - mainRepository.updateCSVFieldById( - data._id, - true - ) - } - } - } - - private fun getCurrentDate(): String { - val dateFormat = SimpleDateFormat("dd-MM-yy", Locale.getDefault()) - val currentDate = Date() - return dateFormat.format(currentDate) - } } \ No newline at end of file diff --git a/app/src/main/res/drawable/downloads.xml b/app/src/main/res/drawable/downloads.xml deleted file mode 100644 index 17e7f58..0000000 --- a/app/src/main/res/drawable/downloads.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/layout/fragment_user_list.xml b/app/src/main/res/layout/fragment_user_list.xml index c1b59d2..9cfb963 100644 --- a/app/src/main/res/layout/fragment_user_list.xml +++ b/app/src/main/res/layout/fragment_user_list.xml @@ -94,15 +94,6 @@ app:layout_constraintTop_toBottomOf="@+id/tv_title" tools:listitem="@layout/user_item_view" /> - - You have scanned the Aadhar ID, need to enter Aadhar ID number you have scanned and Abha ID manually You have scanned the Abha ID You have scanned the Aadhar ID - Download CSV - Download DB Tests - Do you want to download the local DB tests in CSV format? - Upload done successfully + NT-A NT-B From 83dbadef004744f176ea7da24146cdd2099e19b6 Mon Sep 17 00:00:00 2001 From: Mariya Date: Fri, 15 Dec 2023 17:57:50 +0530 Subject: [PATCH 15/16] Revert uncommitted changes --- .../shelved.patch | 0 ...ckout_at_04-12-2023_02_50_pm__Changes_.xml | 4 - app/build.gradle | 8 +- app/src/main/AndroidManifest.xml | 4 +- .../hposregistration/dao/MyDataBase.kt | 2 +- .../example/hposregistration/dao/UserDao.kt | 3 + .../hposregistration/data/MainRepository.kt | 4 + .../data/datasource/LocalFileDataSource.kt | 124 ++++++++++++++++++ .../hposregistration/data/user/UserData.kt | 4 +- .../example/hposregistration/di/AppModule.kt | 7 + .../hposregistration/network/UserDao.kt | 3 + .../ui/fragments/UserListFragment.kt | 61 ++++++++- .../ui/viewmodels/RegistrationViewModel.kt | 27 ++++ app/src/main/res/drawable/downloads.xml | 5 + .../main/res/layout/fragment_user_list.xml | 9 ++ app/src/main/res/values/strings.xml | 5 +- 16 files changed, 258 insertions(+), 12 deletions(-) delete mode 100644 .idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm_[Changes]/shelved.patch delete mode 100644 .idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm__Changes_.xml create mode 100644 app/src/main/java/com/example/hposregistration/data/datasource/LocalFileDataSource.kt create mode 100644 app/src/main/res/drawable/downloads.xml diff --git a/.idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm_[Changes]/shelved.patch b/.idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm_[Changes]/shelved.patch deleted file mode 100644 index e69de29..0000000 diff --git a/.idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm__Changes_.xml b/.idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm__Changes_.xml deleted file mode 100644 index 536290a..0000000 --- a/.idea/shelf/Uncommitted_changes_before_Checkout_at_04-12-2023_02_50_pm__Changes_.xml +++ /dev/null @@ -1,4 +0,0 @@ - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 2031141..4e0ca32 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -94,10 +94,12 @@ dependencies { implementation 'com.github.bumptech.glide:glide:4.13.2' annotationProcessor 'com.github.bumptech.glide:compiler:4.13.2' + implementation 'com.opencsv:opencsv:5.5' + //Room - implementation "androidx.room:room-ktx:2.6.0" - implementation "androidx.room:room-runtime:2.6.0" - kapt ("androidx.room:room-compiler:2.6.0") + implementation "androidx.room:room-ktx:2.6.1" + implementation "androidx.room:room-runtime:2.6.1" + kapt ("androidx.room:room-compiler:2.6.1") // Barcode scanner implementation 'com.journeyapps:zxing-android-embedded:4.3.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 14f9ab4..9cda14d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,9 @@ android:required="false" /> + + @@ -43,7 +45,7 @@ diff --git a/app/src/main/java/com/example/hposregistration/dao/MyDataBase.kt b/app/src/main/java/com/example/hposregistration/dao/MyDataBase.kt index 649ff6a..b2ff720 100644 --- a/app/src/main/java/com/example/hposregistration/dao/MyDataBase.kt +++ b/app/src/main/java/com/example/hposregistration/dao/MyDataBase.kt @@ -9,7 +9,7 @@ import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase 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 fun userDao(): UserDao diff --git a/app/src/main/java/com/example/hposregistration/dao/UserDao.kt b/app/src/main/java/com/example/hposregistration/dao/UserDao.kt index bdff697..3028322 100644 --- a/app/src/main/java/com/example/hposregistration/dao/UserDao.kt +++ b/app/src/main/java/com/example/hposregistration/dao/UserDao.kt @@ -20,4 +20,7 @@ interface UserDao { @Query("DELETE FROM user_table WHERE _id = :id") suspend fun deleteById(id: String) + + @Query("UPDATE user_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/hposregistration/data/MainRepository.kt b/app/src/main/java/com/example/hposregistration/data/MainRepository.kt index 715827d..7151662 100644 --- a/app/src/main/java/com/example/hposregistration/data/MainRepository.kt +++ b/app/src/main/java/com/example/hposregistration/data/MainRepository.kt @@ -30,4 +30,8 @@ class MainRepository @Inject constructor( return userFireBaseDao.addUserToDatabase(userData) } + suspend fun updateCSVFieldById(id: String, isCSVCreated: Boolean) { + userDao.updateCSVFieldById(id, isCSVCreated) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/example/hposregistration/data/datasource/LocalFileDataSource.kt b/app/src/main/java/com/example/hposregistration/data/datasource/LocalFileDataSource.kt new file mode 100644 index 0000000..829bf9e --- /dev/null +++ b/app/src/main/java/com/example/hposregistration/data/datasource/LocalFileDataSource.kt @@ -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>){ + 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 + ): 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 + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/hposregistration/data/user/UserData.kt b/app/src/main/java/com/example/hposregistration/data/user/UserData.kt index 0b40ebc..8ba7c60 100644 --- a/app/src/main/java/com/example/hposregistration/data/user/UserData.kt +++ b/app/src/main/java/com/example/hposregistration/data/user/UserData.kt @@ -35,7 +35,9 @@ data class UserData( var registeredBy: String? = "", var createdAt: String? = "", var registrationCenterName: String? = "", - var testStatus: Boolean = false + var testStatus: Boolean = false, + var isCSVCreated: Boolean = false, + var localFlag: Boolean = false, ){ enum class Gender { MALE, diff --git a/app/src/main/java/com/example/hposregistration/di/AppModule.kt b/app/src/main/java/com/example/hposregistration/di/AppModule.kt index 9f0bdf2..bda8c90 100644 --- a/app/src/main/java/com/example/hposregistration/di/AppModule.kt +++ b/app/src/main/java/com/example/hposregistration/di/AppModule.kt @@ -5,6 +5,7 @@ import android.content.Context import androidx.room.Room import com.example.hposregistration.dao.MyDatabase import com.example.hposregistration.dao.UserDao +import com.example.hpostesting.data.datasource.LocalFileDataSource import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -41,4 +42,10 @@ object AppModule { fun provideContext(application: Application): Context { return application.applicationContext } + + @Provides + @Singleton + fun provideLocalFileDataSource(): LocalFileDataSource { + return LocalFileDataSource() + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/hposregistration/network/UserDao.kt b/app/src/main/java/com/example/hposregistration/network/UserDao.kt index 06fdfdc..b993bec 100644 --- a/app/src/main/java/com/example/hposregistration/network/UserDao.kt +++ b/app/src/main/java/com/example/hposregistration/network/UserDao.kt @@ -1,5 +1,6 @@ package com.example.hposregistration.network +import androidx.room.Query import com.example.hposregistration.data.Response import com.example.hposregistration.data.user.UserData import com.google.firebase.firestore.FirebaseFirestore @@ -24,6 +25,8 @@ class UserDao { } } + + // suspend fun getPatientList(): List { // return patientCollection.get().await().toObjects(UserData::class.java) // } diff --git a/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt b/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt index 78cb135..cc9bb56 100644 --- a/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt +++ b/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt @@ -5,11 +5,13 @@ import android.content.Context import android.content.DialogInterface import android.content.SharedPreferences import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Button import android.widget.Toast +import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import com.example.hposregistration.adapters.UserListOfflineAdapter @@ -33,7 +35,7 @@ class UserListFragment : BaseFragment() { private var _binding: FragmentUserListBinding? = null private val binding get() = _binding!! - private val viewModel by viewModels() + private val viewModel:RegistrationViewModel by activityViewModels() private var isOnline = false @@ -84,6 +86,10 @@ class UserListFragment : BaseFragment() { showUploadDialog(requireContext()) } + binding.btnSaveLocal.setOnClickListener { + showDownloadDialog(requireContext()) + } + binding.btnsettings.setOnClickListener{ findNavController().navigate(R.id.action_userListFragment_to_languageSettingsFragment) @@ -187,6 +193,25 @@ class UserListFragment : BaseFragment() { 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() { binding.uploadData.visibility = View.GONE viewModel.allUserData.observe(viewLifecycleOwner) { userDataList -> @@ -209,6 +234,40 @@ class UserListFragment : BaseFragment() { } } + + private fun downloadLocalDBData(dialog: DialogInterface) { + viewModel.allUserData.observe(viewLifecycleOwner) { userDataList -> + try { + val downloadList = mutableListOf() + + userDataList.forEach { userData -> + // Log details for debugging + 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) { userDataList.forEach { if (it.userImageURL.isEmpty()) { diff --git a/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt b/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt index 930e4ca..f9ead41 100644 --- a/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt +++ b/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt @@ -10,14 +10,21 @@ import com.example.hposregistration.data.MainRepository import com.example.hposregistration.data.NetworkStatusLiveData import com.example.hposregistration.data.Response 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 dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale import javax.inject.Inject @HiltViewModel class RegistrationViewModel @Inject constructor( private val mainRepository: MainRepository, + private val userdao: UserDao, + private val localFileDataSource: LocalFileDataSource, context: Context ) : ViewModel() { @@ -73,4 +80,24 @@ class RegistrationViewModel @Inject constructor( fun deleteById(userId: String) = viewModelScope.launch { mainRepository.deleteById(id = userId) } + + fun createCSV(userData: List, appContext: Context) = + viewModelScope.launch { + val fileName = "${getCurrentDate()}.csv" + if (localFileDataSource.exportDataToCSV(fileName, userData)) { + userData.forEach { data -> + data.localFlag = true + mainRepository.updateCSVFieldById( + data._id, + true + ) + } + } + } + + private fun getCurrentDate(): String { + val dateFormat = SimpleDateFormat("dd-MM-yy", Locale.getDefault()) + val currentDate = Date() + return dateFormat.format(currentDate) + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/downloads.xml b/app/src/main/res/drawable/downloads.xml new file mode 100644 index 0000000..17e7f58 --- /dev/null +++ b/app/src/main/res/drawable/downloads.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/fragment_user_list.xml b/app/src/main/res/layout/fragment_user_list.xml index 9cfb963..c1b59d2 100644 --- a/app/src/main/res/layout/fragment_user_list.xml +++ b/app/src/main/res/layout/fragment_user_list.xml @@ -94,6 +94,15 @@ app:layout_constraintTop_toBottomOf="@+id/tv_title" tools:listitem="@layout/user_item_view" /> + + You have scanned the Aadhar ID, need to enter Aadhar ID number you have scanned and Abha ID manually You have scanned the Abha ID You have scanned the Aadhar ID - + Download CSV + Download DB Tests + Do you want to download the local DB tests in CSV format? + Upload done successfully NT-A NT-B From ba981e2b8228ed6dea37e5b02d6038e1a239d739 Mon Sep 17 00:00:00 2001 From: Mariya Date: Fri, 15 Dec 2023 18:35:41 +0530 Subject: [PATCH 16/16] date format is changes --- .../hposregistration/ui/fragments/UserListFragment.kt | 4 +--- .../ui/viewmodels/RegistrationViewModel.kt | 11 ++++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt b/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt index cc9bb56..9ee2c8d 100644 --- a/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt +++ b/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt @@ -241,10 +241,8 @@ class UserListFragment : BaseFragment() { val downloadList = mutableListOf() userDataList.forEach { userData -> - // Log details for debugging Log.d("DownloadDebug", "userData: $userData, isCSVCreated: ${userData.isCSVCreated}") - - if (userData.isCSVCreated) { + if (!userData.isCSVCreated) { downloadList.add(userData) } } diff --git a/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt b/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt index f9ead41..e1fa3a9 100644 --- a/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt +++ b/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt @@ -83,7 +83,7 @@ class RegistrationViewModel @Inject constructor( fun createCSV(userData: List, appContext: Context) = viewModelScope.launch { - val fileName = "${getCurrentDate()}.csv" + val fileName = "${getCurrentDateTime()}.csv" if (localFileDataSource.exportDataToCSV(fileName, userData)) { userData.forEach { data -> data.localFlag = true @@ -95,9 +95,10 @@ class RegistrationViewModel @Inject constructor( } } - private fun getCurrentDate(): String { - val dateFormat = SimpleDateFormat("dd-MM-yy", Locale.getDefault()) - val currentDate = Date() - return dateFormat.format(currentDate) + private fun getCurrentDateTime(): String { + val dateFormat = SimpleDateFormat("dd-MM-yy HH:mm:ss", Locale.getDefault()) + val currentDateTime = Date() + return dateFormat.format(currentDateTime) } + } \ No newline at end of file