12 Commits

Author SHA1 Message Date
Mariya
2aabf57d8a BackLog file added for nagpur consignment for Online Registration code added, fixed all issues 2024-02-05 13:09:14 +05:30
Mariya
7c20657f40 BackLog file added for nagpur consignment for Online Registration code added 2024-02-02 15:03:32 +05:30
Mariya
0a8a4458b5 BackLog file added for nagpur consignment for Online Registration ,added app version 2024-02-02 13:46:16 +05:30
Mariya
43fa99df71 BackLog file added for nagpur consignment for Online Registration 2024-02-02 13:31:19 +05:30
Mariya
425bc61a50 fixing errors related to version 2023-12-14 13:26:54 +05:30
Mariya
2e824c1bed fixing errors related to version 2023-12-12 15:45:16 +05:30
Pritimay Sarkar
ccc50108d3 add app distribution auto update 2023-10-29 07:33:12 +05:30
Pritimay Sarkar
2bd6495612 remove key files 2023-10-24 14:09:53 +05:30
Pritimay Sarkar
143d90b028 fix empty list messages display 2023-10-24 14:07:08 +05:30
Pritimay Sarkar
3bda3f0d51 display app version 2023-10-24 14:05:07 +05:30
Pritimay Sarkar
b6a03e2ebf add search fields based on date partition
- optimize search based on current date partition
	- fix createdAt empty string in case of offline upload
2023-10-23 02:23:28 +05:30
Pritimay Sarkar
eec8867ddc show only current day registrations
- reduce database reads by fetching only current day registrations
	- sort users list in latest first order
2023-10-23 02:20:39 +05:30
14 changed files with 258 additions and 139 deletions

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 6
versionName "1.0" versionName "1.0.6"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }
@@ -42,9 +42,9 @@ android {
dependencies { 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 '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' implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
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'
@@ -58,24 +58,26 @@ dependencies {
implementation 'com.google.firebase:firebase-auth-ktx' implementation 'com.google.firebase:firebase-auth-ktx'
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.6.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'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1'
// Coroutine Lifecycle Scopes // Coroutine Lifecycle Scopes
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.1" implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.2"
//Dagger - Hilt //Dagger - Hilt
implementation "com.google.dagger:hilt-android:2.46" implementation "com.google.dagger:hilt-android:2.46"
kapt "com.google.dagger:hilt-android-compiler: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 // Navigation Component
implementation "androidx.navigation:navigation-fragment-ktx:2.7.0" implementation "androidx.navigation:navigation-fragment-ktx:2.7.5"
implementation "androidx.navigation:navigation-ui-ktx:2.7.0" implementation "androidx.navigation:navigation-ui-ktx:2.7.5"
// Retrofit + GSON // Retrofit + GSON
implementation "com.squareup.retrofit2:retrofit:2.9.0" implementation "com.squareup.retrofit2:retrofit:2.9.0"
@@ -85,16 +87,16 @@ dependencies {
implementation 'com.jakewharton.timber:timber:4.7.1' implementation 'com.jakewharton.timber:timber:4.7.1'
// Activity KTX for viewModels() // Activity KTX for viewModels()
implementation "androidx.activity:activity-ktx:1.7.2" implementation "androidx.activity:activity-ktx:1.8.1"
//image //image
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'
//Room //Room
implementation "androidx.room:room-ktx:2.6.0-alpha03" implementation "androidx.room:room-ktx:2.6.1"
implementation "androidx.room:room-runtime:2.6.0-alpha03" implementation "androidx.room:room-runtime:2.6.1"
kapt ("androidx.room:room-compiler:2.6.0-alpha03") 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'

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

@@ -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

@@ -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 = "",
@@ -31,7 +34,10 @@ 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 userAbhaRegistrationLog:String = "",
var userDetailsLog: String = "",
var appVersion: String = "",
){ ){
enum class Gender { enum class Gender {
MALE, MALE,

View File

@@ -27,4 +27,7 @@ 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

@@ -2,6 +2,10 @@ package com.example.hposregistration.ui.activities
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle 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 dagger.hilt.android.AndroidEntryPoint
import `in`.sminnovations.hposregistration.databinding.ActivityMainBinding import `in`.sminnovations.hposregistration.databinding.ActivityMainBinding
@@ -16,4 +20,44 @@ class MainActivity : AppCompatActivity() {
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

@@ -8,7 +8,6 @@ import android.os.Bundle
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.Toast import android.widget.Toast
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController 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.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() {
@@ -56,6 +58,11 @@ class UserListFragment : BaseFragment() {
} }
private fun setupViews() { private fun setupViews() {
val pInfo = requireActivity().packageManager.getPackageInfo(
requireActivity().packageName, 0
)
val version = pInfo.versionName
binding.appVersion.text = version
binding.btnRegisterUser.setOnClickListener { binding.btnRegisterUser.setOnClickListener {
findNavController().navigate(R.id.action_userListFragment_to_registrationFragment) findNavController().navigate(R.id.action_userListFragment_to_registrationFragment)
} }
@@ -160,7 +167,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()
@@ -176,6 +193,7 @@ class UserListFragment : BaseFragment() {
binding.noList.visibility = View.GONE binding.noList.visibility = View.GONE
binding.rvOrder.visibility = View.VISIBLE binding.rvOrder.visibility = View.VISIBLE
} else { } else {
binding.emptyRegistrations.visibility = View.GONE
if (userDataList.isEmpty()) { if (userDataList.isEmpty()) {
binding.noList.visibility = View.VISIBLE binding.noList.visibility = View.VISIBLE
binding.rvOrder.visibility = View.GONE binding.rvOrder.visibility = View.GONE

View File

@@ -1,10 +1,15 @@
package com.example.hposregistration.ui.fragments.registration package com.example.hposregistration.ui.fragments.registration
import android.annotation.SuppressLint
import android.content.Context
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.Toast import android.widget.Toast
import androidx.core.content.edit
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
@@ -29,6 +34,7 @@ class AbhaRegistrationFragment : BaseFragment() {
private val viewModel by viewModels<RegistrationViewModel>() private val viewModel by viewModels<RegistrationViewModel>()
private val args: AbhaRegistrationFragmentArgs by navArgs() private val args: AbhaRegistrationFragmentArgs by navArgs()
private var userData = UserData() private var userData = UserData()
private lateinit var sharedPreference:SharedPreferences
private val barcodeLauncher = private val barcodeLauncher =
registerForActivityResult(ScanContract()) { result: ScanIntentResult -> registerForActivityResult(ScanContract()) { result: ScanIntentResult ->
@@ -45,7 +51,11 @@ class AbhaRegistrationFragment : BaseFragment() {
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View { ): View {
_binding = FragmentAbhaRegistrationBinding.inflate(inflater, container, false) _binding = FragmentAbhaRegistrationBinding.inflate(inflater, container, false)
sharedPreference =
requireContext().getSharedPreferences("PREFERENCE_NAME", Context.MODE_PRIVATE)
return binding.root return binding.root
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@@ -53,6 +63,7 @@ class AbhaRegistrationFragment : BaseFragment() {
init() init()
} }
@SuppressLint("LogNotTimber", "CommitPrefEdits")
private fun init() { private fun init() {
binding.btnScanNow.setOnClickListener { binding.btnScanNow.setOnClickListener {
barcodeLauncher.launch(scanQR("Please Scan the Abha ID/Aadhar ID")) barcodeLauncher.launch(scanQR("Please Scan the Abha ID/Aadhar ID"))
@@ -78,17 +89,28 @@ class AbhaRegistrationFragment : BaseFragment() {
val userName = binding.etName.text.toString() val userName = binding.etName.text.toString()
val aadharIdInput = binding.aadharID.text.toString() val aadharIdInput = binding.aadharID.text.toString()
val centerName = binding.centerName.text.toString() val centerName = binding.centerName.text.toString()
if (validateInputs(abhaIdInput, aadharIdInput, userName, centerName)) { if (validateInputs(abhaIdInput, aadharIdInput, userName, centerName)) {
userData.apply { userData.apply {
name = userName name = userName
aadharId = aadharIdInput aadharId = aadharIdInput
abhaId = abhaIdInput abhaId = abhaIdInput
registrationCenterName = centerName registrationCenterName = centerName
_id = aadharId + userName.substring(0, 3).uppercase() + centerName.substring(0, 3).uppercase() _id = aadharId + userName.substring(0, 3).uppercase() + centerName.substring(0, 3)
} .uppercase()
userData.userAbhaRegistrationLog = "${userData.abhaId}," + "${userData.name}," +"${userData.aadharId}," + "${userData.registrationCenterName}"
Log.e(
"userAbhaRegistrationLog",
"Assigned userAbhaRegistrationLog: ${userData.userAbhaRegistrationLog}"
)
viewModel.insert(userData) sharedPreference.edit()
.putString("userAbhaRegistrationLog", userData.userAbhaRegistrationLog)
.apply()
Log.e("userAbhaRegistrationLog", sharedPreference.getString("userAbhaRegistrationLog","").toString())
}
viewModel.insert(userData)
// Make sure this provides a meaningful string representation of userData
navigateToUserDetailsFragment(userData._id) navigateToUserDetailsFragment(userData._id)
} }
@@ -109,6 +131,7 @@ class AbhaRegistrationFragment : BaseFragment() {
state = obj.getString("state name") state = obj.getString("state name")
district = obj.getString("district_name") district = obj.getString("district_name")
house = obj.getString("address") house = obj.getString("address")
userAbhaRegistrationLog = obj.getString("userAbhaRegistrationLog")
} }
if (userData.abhaId.isNotEmpty()) { if (userData.abhaId.isNotEmpty()) {

View File

@@ -4,6 +4,7 @@ import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
import android.net.Uri import android.net.Uri
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
@@ -47,12 +48,15 @@ class ReviewDetailsRegistrationFragment : BaseFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
init() init()
} }
private fun init() { private fun init() {
viewModel.getUserByID(args.userId) viewModel.getUserByID(args.userId)
viewModel.userData.observe(viewLifecycleOwner) { user -> viewModel.userData.observe(viewLifecycleOwner) { user ->
userData = user userData = user
userData.userAbhaRegistrationLog = sharedPreference.getString("userAbhaRegistrationLog", "").toString()
userData.userDetailsLog = sharedPreference.getString("userDetailslog", "").toString()
setUserData(user) setUserData(user)
} }
@@ -170,6 +174,18 @@ class ReviewDetailsRegistrationFragment : BaseFragment() {
R.string.sickle_cell_family_history, userData.sickleCellHistory R.string.sickle_cell_family_history, userData.sickleCellHistory
) )
} }
val pInfo = requireActivity().packageManager.getPackageInfo(
requireActivity().packageName, 0
)
val version = pInfo.versionName
userData.appVersion = version
userData.userAbhaRegistrationLog = "${userData.abhaId}," + "${userData.name}," +"${userData.aadharId}," + "${userData.registrationCenterName}"
userData.userAbhaRegistrationLog = sharedPreference.getString("userAbhaRegistrationLog", "").toString()
userData.userDetailsLog = sharedPreference.getString("userDetailslog", "").toString()
Log.e("userAbhaRegistrationLog",userData.userAbhaRegistrationLog)
Log.e("userAbhaRegistrationLog",userData.userDetailsLog)
} }
} }

View File

@@ -1,6 +1,10 @@
package com.example.hposregistration.ui.fragments.registration package com.example.hposregistration.ui.fragments.registration
import android.annotation.SuppressLint
import android.content.Context
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
@@ -24,6 +28,7 @@ class UserDetailsRegistrationFragment : Fragment() {
private val viewModel by viewModels<RegistrationViewModel>() private val viewModel by viewModels<RegistrationViewModel>()
private lateinit var userData: UserData private lateinit var userData: UserData
private lateinit var sharedPreference: SharedPreferences
private val args: UserDetailsRegistrationFragmentArgs by navArgs() private val args: UserDetailsRegistrationFragmentArgs by navArgs()
@@ -31,6 +36,9 @@ class UserDetailsRegistrationFragment : Fragment() {
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View { ): View {
_binding = FragmentUserDetailsRegistrationBinding.inflate(inflater, container, false) _binding = FragmentUserDetailsRegistrationBinding.inflate(inflater, container, false)
sharedPreference =
requireContext().getSharedPreferences("PREFERENCE_NAME", Context.MODE_PRIVATE)
return binding.root return binding.root
} }
@@ -111,16 +119,43 @@ class UserDetailsRegistrationFragment : Fragment() {
binding.tilFamilyHistory.visibility = binding.tilFamilyHistory.visibility =
if (binding.no1history.isChecked) View.GONE else View.VISIBLE if (binding.no1history.isChecked) View.GONE else View.VISIBLE
} }
} }
} }
@SuppressLint("LogNotTimber")
private fun setupSubmitButton() { private fun setupSubmitButton() {
binding.btnSubmit.setOnClickListener { binding.btnSubmit.setOnClickListener {
if (verifyUserDetails()) { if (verifyUserDetails()) {
userData._id = args.userId userData._id = args.userId
viewModel.insert(userData) viewModel.insert(userData)
userData.userDetailsLog = "${userData.birthYear}," +
"${userData.gender}," +
"${userData.phoneNumber}," +
"${userData.careOf}," +
"${userData.maritalStatus}," +
"${userData.category}," +
"${userData.caste}," +
"${userData.subCaste ?: ""}," + // Using Elvis operator for nullable fields
"${userData.appVersion}," +
"${userData.house}," +
"${userData.city}," +
"${userData.district}," +
"${userData.state}," +
"${userData.pinCode}," +
"${userData.bloodGroup}," +
"${userData.isUnderMedication ?: false}," + // Converting null to false
"${userData.isUnderTransfusion ?: false}," +
"${userData.sickleCellHistory ?: ""}," +
"${userData.userImageURL}," +
"${userData.registeredBy ?: ""}," +
"${userData.createdAt ?: ""}," +
"${userData.registrationCenterName ?: ""}," +
"${userData.testStatus},"
val userDataString = userData.userDetailsLog// Make sure this provides a meaningful string representation of userData
sharedPreference.edit()
.putString("userDetailslog", userData.userDetailsLog)
.apply()
Log.e("userAbhaRegistrationLog",userData.userDetailsLog)
navigateToCaptureUserImageFragment() navigateToCaptureUserImageFragment()
} else { } else {
showToast("Please enter all the details properly") showToast("Please enter all the details properly")

View File

@@ -1,7 +1,9 @@
package com.example.hposregistration.ui.viewmodels package com.example.hposregistration.ui.viewmodels
import android.content.Context import android.content.Context
import android.content.SharedPreferences
import android.net.Uri import android.net.Uri
import androidx.core.content.ContentProviderCompat.requireContext
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
@@ -13,6 +15,10 @@ import com.example.hposregistration.data.user.UserData
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.Calendar
import java.util.Date
import java.util.Locale
import javax.inject.Inject import javax.inject.Inject
@HiltViewModel @HiltViewModel
@@ -26,8 +32,11 @@ class RegistrationViewModel @Inject constructor(
val allUserData = mainRepository.allUsers val allUserData = mainRepository.allUsers
val fireBaseUpload = MutableLiveData<String>() val fireBaseUpload = MutableLiveData<String>()
private val sharedPreference =
context.getSharedPreferences("PREFERENCE_NAME", Context.MODE_PRIVATE)
fun addUserToDatabase(userData: UserData) = viewModelScope.launch { fun addUserToDatabase(userData: UserData) = viewModelScope.launch {
userData.userAbhaRegistrationLog = sharedPreference.getString("userAbhaRegistrationLog", "").toString()
userData.userDetailsLog = sharedPreference.getString("userDetailslog", "").toString()
val file = Uri.parse(userData.userImageURL) val file = Uri.parse(userData.userImageURL)
val storageRef = FirebaseStorage.getInstance().reference val storageRef = FirebaseStorage.getInstance().reference
val imageRef = storageRef.child("${userData._id}/${file.lastPathSegment}") val imageRef = storageRef.child("${userData._id}/${file.lastPathSegment}")
@@ -62,7 +71,28 @@ class RegistrationViewModel @Inject constructor(
val networkStatusLiveData: LiveData<Boolean> val networkStatusLiveData: LiveData<Boolean>
get() = _networkStatusLiveData get() = _networkStatusLiveData
fun insert(userData: UserData) = viewModelScope.launch { 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)
val useAbhaRegistrationLog = sharedPreference.getString("userAbhaRegistrationLog", "").toString()
val userDetailsLog = sharedPreference.getString("userDetailslog", "").toString()
userData.userAbhaRegistrationLog = sharedPreference.getString("userAbhaRegistrationLog", "").toString()
userData.userDetailsLog = sharedPreference.getString("userDetailslog", "").toString()
userData.userAbhaRegistrationLog= useAbhaRegistrationLog
userData.userDetailsLog = userDetailsLog
mainRepository.insert(userData) mainRepository.insert(userData)
} }

View File

@@ -16,6 +16,20 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical">
</LinearLayout> </LinearLayout>
<TextView
android:id="@+id/app_version"
style="@style/title2"
android:layout_width="57dp"
android:layout_height="15dp"
android:layout_marginTop="4dp"
android:gravity="center"
android:text="1.0.4"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.017"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:id="@+id/tv_title" android:id="@+id/tv_title"
style="@style/title1" style="@style/title1"
@@ -26,6 +40,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"

View File

@@ -55,6 +55,7 @@
<string name="edit">Edit</string> <string name="edit">Edit</string>
<string name="user_details">User Details</string> <string name="user_details">User Details</string>
<string name="internet_is_not_available_and_there_is_no_data_available_in_local_db">Internet is not available and there is no Data available in Local DB</string> <string name="internet_is_not_available_and_there_is_no_data_available_in_local_db">Internet is not available and there is no Data available in Local DB</string>
<string name="empty_registrations">No registrations are available for display</string>
<string name="user_id">User ID: %1$s</string> <string name="user_id">User ID: %1$s</string>
<string name="abha_number">Abha Number: %1$s</string> <string name="abha_number">Abha Number: %1$s</string>
<string name="aadhar_number_details">Aadhar Number: %1$s</string> <string name="aadhar_number_details">Aadhar Number: %1$s</string>