From fbd0da584e18eaa82c17ad6b7bdf556c28bf98b9 Mon Sep 17 00:00:00 2001 From: khal <32254816+kalyan-chokkam@users.noreply.github.com> Date: Tue, 12 Mar 2024 13:25:16 +0530 Subject: [PATCH 001/892] Update AppModule.kt remove prof url --- .../main/java/org/piramalswasthya/sakhi/di/AppModule.kt | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt b/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt index 655e61e74..39c0ad519 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt @@ -29,10 +29,7 @@ import javax.inject.Singleton object AppModule { private const val baseTmcUrl = -// "https://assamtmc.piramalswasthya.org/" -// "http://uatamrit.piramalswasthya.org:8080/" - "https://amritdemo.piramalswasthya.org/" -// "http://192.168.1.109:8080/" + "" private const val baseAbhaUrl = "https://healthidsbx.abdm.gov.in/api/" @@ -190,4 +187,4 @@ object AppModule { fun provideHBYCDao(database: InAppDb): HbycDao = database.hbycDao -} \ No newline at end of file +} From 7ff33b3003d7b49676772a63d8d68097408d0c77 Mon Sep 17 00:00:00 2001 From: khal <32254816+kalyan-chokkam@users.noreply.github.com> Date: Tue, 12 Mar 2024 14:04:27 +0530 Subject: [PATCH 002/892] Update README.md removed url --- README.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 7c93b0bd7..fc9ba9ea0 100644 --- a/README.md +++ b/README.md @@ -12,14 +12,11 @@ **Configurations:** - - In AppModule class there is a variable declared for base URL pointing to amrit demo or uat or production, we can use the URL we need and comment the rest for required APK + - In AppModule class there is a variable declared for base URL, set the value to amrit demo or uat or prod values based on requirement `object AppModule { - private const val baseTmcUrl = - // "https://assamtmc.piramalswasthya.org/" - // "http://uatamrit.piramalswasthya.org:8080/" - https://amritdemo.piramalswasthya.org/ + private const val baseTmcUrl = "" ` - In IconDataset class we have the list of modules that we show on UI, we can comment, or un-comment modules based on requirement @@ -56,4 +53,4 @@ - \ No newline at end of file + From ef18904fcc0198643922de62133034057d07d1fb Mon Sep 17 00:00:00 2001 From: kalyan Date: Tue, 12 Mar 2024 15:06:39 +0530 Subject: [PATCH 003/892] default url amrit demo --- app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt b/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt index 39c0ad519..b063ff5e0 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt @@ -29,7 +29,7 @@ import javax.inject.Singleton object AppModule { private const val baseTmcUrl = - "" + "https://amritdemo.piramalswasthya.org/" private const val baseAbhaUrl = "https://healthidsbx.abdm.gov.in/api/" From ba47d6520331897c492e6633a2f663703399fae7 Mon Sep 17 00:00:00 2001 From: kalyan Date: Tue, 12 Mar 2024 19:04:04 +0530 Subject: [PATCH 004/892] removing tokens --- README.md | 5 ++++- app/google-services.json | 14 +++++++------- .../org/piramalswasthya/sakhi/crypt/CryptoUtil.kt | 2 +- .../piramalswasthya/sakhi/network/JsonAdapters.kt | 6 ++---- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index fc9ba9ea0..73e03413d 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,8 @@ **Pre-Requesties:** - Clone the code repo into android studio and build the application - +**Password Encryption:** + - set passPhrase value in CryptoUtil file **Environments**: We can generate the application for below environments based on requirements - Amrit Demo - UAT @@ -22,6 +23,8 @@ - In AllBenFragment class we have a Boolean `showAbha` which can be used to toggle the visibility of abha button on beneficiary cards + - set ABHA client id and client secret in AbhaTokenRequest data class + **APK Variants:** We can generate signed and un-signed apk’s for the application - For amritdemo/UAT we generate unsigned apk’s diff --git a/app/google-services.json b/app/google-services.json index 66ae355ee..c28e3af0b 100644 --- a/app/google-services.json +++ b/app/google-services.json @@ -1,33 +1,33 @@ { "project_info": { - "project_number": "289134290963", - "project_id": "sakhi-1e7d2", - "storage_bucket": "sakhi-1e7d2.appspot.com" + "project_number": "##", + "project_id": "##", + "storage_bucket": "##" }, "client": [ { "client_info": { - "mobilesdk_app_id": "1:289134290963:android:6cd51e6329b3816144f7e6", + "mobilesdk_app_id": "##", "android_client_info": { "package_name": "org.piramalswasthya.sakhi" } }, "oauth_client": [ { - "client_id": "289134290963-lskch73k1ujvh2ca3vgs09i2l7rqa4pd.apps.googleusercontent.com", + "client_id": "##", "client_type": 3 } ], "api_key": [ { - "current_key": "AIzaSyBHMkDJkxWgtIZN_T0fQjh5EXFvvY-9DiA" + "current_key": "##" } ], "services": { "appinvite_service": { "other_platform_oauth_client": [ { - "client_id": "289134290963-lskch73k1ujvh2ca3vgs09i2l7rqa4pd.apps.googleusercontent.com", + "client_id": "##", "client_type": 3 } ] diff --git a/app/src/main/java/org/piramalswasthya/sakhi/crypt/CryptoUtil.kt b/app/src/main/java/org/piramalswasthya/sakhi/crypt/CryptoUtil.kt index 9ea31d40d..ec79dff70 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/crypt/CryptoUtil.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/crypt/CryptoUtil.kt @@ -13,7 +13,7 @@ class CryptoUtil { private val keySize = 256 private val ivSize = 128 private val iterationCount = 1989 - private val passPhrase = "Piramal12Piramal" + private val passPhrase = "##" private fun generateKey( salt: String, diff --git a/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt b/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt index a3b92c57b..574d5ad7b 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt @@ -105,11 +105,9 @@ data class BenAbhaResponse( @JsonClass(generateAdapter = true) data class AbhaTokenRequest( - val clientId: String = "SBX_001542", - val clientSecret: String = "87b7eb89-b236-43b6-82b0-6eef154a9b90", + val clientId: String = "##", + val clientSecret: String = "##", val grantType: String = "client_credentials" -// val clientId: String = "healthid-api", -// val clientSecret: String = "9042c774-f57b-46ba-bb11-796a4345ada1" ) @JsonClass(generateAdapter = true) From 4c91e4d4ba9e2914eda399c9d063c05348d92ead Mon Sep 17 00:00:00 2001 From: kalyan Date: Mon, 20 May 2024 16:11:03 +0530 Subject: [PATCH 005/892] added secrets.properties file with client secrets --- app/build.gradle | 9 +++++++-- .../java/org/piramalswasthya/sakhi/crypt/CryptoUtil.kt | 3 ++- .../org/piramalswasthya/sakhi/network/JsonAdapters.kt | 5 +++-- build.gradle | 2 +- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9f822daeb..9065be1f1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,7 +7,7 @@ plugins { id 'com.google.gms.google-services' id 'com.google.firebase.crashlytics' id 'kotlin-kapt' - + id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' } @@ -151,4 +151,9 @@ dependencies { implementation 'androidx.legacy:legacy-support-v4:1.0.0' -} \ No newline at end of file +} +secrets { + propertiesFileName = "secrets.properties" + ignoreList.add("keyToIgnore") + ignoreList.add("sdk.*") +} diff --git a/app/src/main/java/org/piramalswasthya/sakhi/crypt/CryptoUtil.kt b/app/src/main/java/org/piramalswasthya/sakhi/crypt/CryptoUtil.kt index ec79dff70..215caab88 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/crypt/CryptoUtil.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/crypt/CryptoUtil.kt @@ -1,6 +1,7 @@ package org.piramalswasthya.sakhi.crypt import android.util.Base64 +import org.piramalswasthya.sakhi.BuildConfig import java.util.Random import javax.crypto.Cipher import javax.crypto.SecretKeyFactory @@ -13,7 +14,7 @@ class CryptoUtil { private val keySize = 256 private val ivSize = 128 private val iterationCount = 1989 - private val passPhrase = "##" + private val passPhrase = BuildConfig.ENCRYPTED_PASS_KEY private fun generateKey( salt: String, diff --git a/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt b/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt index 574d5ad7b..6505c45ad 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt @@ -1,6 +1,7 @@ package org.piramalswasthya.sakhi.network import com.squareup.moshi.JsonClass +import org.piramalswasthya.sakhi.BuildConfig import org.piramalswasthya.sakhi.database.room.SyncState import org.piramalswasthya.sakhi.model.HRPNonPregnantAssessCache import org.piramalswasthya.sakhi.model.HRPNonPregnantTrackCache @@ -105,8 +106,8 @@ data class BenAbhaResponse( @JsonClass(generateAdapter = true) data class AbhaTokenRequest( - val clientId: String = "##", - val clientSecret: String = "##", + val clientId: String = BuildConfig.ABHA_CLIENT_ID, + val clientSecret: String = BuildConfig.ABHA_CLIENT_SECRET, val grantType: String = "client_credentials" ) diff --git a/build.gradle b/build.gradle index 8ec34568f..293827ae1 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version" classpath 'com.google.gms:google-services:4.3.15' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.4' - + classpath "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.1" } } From 3d8923d070358011ab21a7d0b39d5fb8f618393f Mon Sep 17 00:00:00 2001 From: kalyan Date: Mon, 20 May 2024 16:23:44 +0530 Subject: [PATCH 006/892] - exclude from recent - usesCleartextTraffic - pwd longClickable - root detection - encrypted shred pref - logs --- app/build.gradle | 5 ++-- app/src/main/AndroidManifest.xml | 1 - .../shared_preferences/PreferenceManager.kt | 13 +++++++-- .../sakhi/ui/home_activity/HomeActivity.kt | 28 ++++++++++++++++++- .../sakhi/ui/login_activity/LoginActivity.kt | 16 ++++++++++- .../login_activity/sign_in/SignInFragment.kt | 2 -- app/src/main/res/layout/activity_home.xml | 1 + app/src/main/res/layout/activity_login.xml | 1 + app/src/main/res/layout/fragment_sign_in.xml | 1 + 9 files changed, 58 insertions(+), 10 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9065be1f1..b1ad6be46 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,7 +17,7 @@ android { defaultConfig { applicationId "org.piramalswasthya.sakhi" - minSdk 21 + minSdk 23 targetSdk 33 versionCode 2 versionName "2.0" @@ -57,7 +57,8 @@ dependencies { implementation 'com.google.firebase:firebase-analytics-ktx' implementation 'androidx.room:room-testing:2.6.0' implementation 'androidx.test.ext:junit-ktx:1.1.5' - + implementation "androidx.security:security-crypto:1.0.0" + implementation "com.google.crypto.tink:tink-android:1.8.0" def nav_version = "2.5.3" def frag_version = "1.5.5" def room_version = "2.5.0" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 212c9f3b1..f9b4a0906 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,7 +23,6 @@ android:largeHeap="true" android:roundIcon="@mipmap/ic_launcher_round" android:theme="@style/Theme.Sakhi" - android:usesCleartextTraffic="true" tools:targetApi="31"> finish() } + .show() + } viewModel.navigateToLoginPage.observe(this) { if (it) { @@ -187,6 +197,17 @@ class HomeActivity : AppCompatActivity() { } } + override fun onResume() { + super.onResume() + if (isDeviceRootedOrEmulator()) { + AlertDialog.Builder(this) + .setTitle("Unsupported Device") + .setMessage("This app cannot run on rooted devices or emulators.") + .setCancelable(false) + .setPositiveButton("Exit") { dialog, id -> finish() } + .show() + } + } private fun setUpMenu() { val menu = object : MenuProvider { @@ -343,4 +364,9 @@ class HomeActivity : AppCompatActivity() { super.onDestroy() _binding = null } + + private fun isDeviceRootedOrEmulator(): Boolean { + return isRooted() || isEmulator() + } + } \ No newline at end of file diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt index 82f13f1d6..ebb4d147d 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt @@ -5,12 +5,15 @@ import android.app.NotificationManager import android.content.Context import android.os.Build import android.os.Bundle +import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity +import com.google.firebase.crashlytics.internal.common.CommonUtils import dagger.hilt.EntryPoint import dagger.hilt.InstallIn import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.EntryPointAccessors import dagger.hilt.components.SingletonComponent +import org.piramalswasthya.sakhi.BuildConfig import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.database.shared_preferences.PreferenceDao import org.piramalswasthya.sakhi.helpers.MyContextWrapper @@ -45,7 +48,14 @@ class LoginActivity : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) createSyncServiceNotificationChannel() - + if (!BuildConfig.DEBUG && isDeviceRootedOrEmulator()) { + AlertDialog.Builder(this) + .setTitle("Unsupported Device") + .setMessage("This app cannot run on rooted devices or emulators.") + .setCancelable(false) + .setPositiveButton("Exit") { dialog, id -> finish() } + .show() + } } private fun createSyncServiceNotificationChannel() { @@ -70,5 +80,9 @@ class LoginActivity : AppCompatActivity() { } } + private fun isDeviceRootedOrEmulator(): Boolean { + return CommonUtils.isRooted() || CommonUtils.isEmulator() + } + } \ No newline at end of file diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/sign_in/SignInFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/sign_in/SignInFragment.kt index e15b9ea48..a7420186e 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/sign_in/SignInFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/sign_in/SignInFragment.kt @@ -189,8 +189,6 @@ class SignInFragment : Fragment() { val username = binding.etUsername.text.toString() val password = binding.etPassword.text.toString() - Timber.d("Username : $username \n Password : $password") - val loggedInUser = viewModel.getLoggedInUser() if (loggedInUser == null) { diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index c3861c1f5..afb5b4fb8 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -2,6 +2,7 @@ diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5ec041614..27773cd36 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,6 +2,7 @@ diff --git a/app/src/main/res/layout/fragment_sign_in.xml b/app/src/main/res/layout/fragment_sign_in.xml index 9440618ae..3e7411b16 100644 --- a/app/src/main/res/layout/fragment_sign_in.xml +++ b/app/src/main/res/layout/fragment_sign_in.xml @@ -191,6 +191,7 @@ android:layout_height="match_parent" android:drawablePadding="@dimen/padding_normal" android:inputType="textPassword" + android:longClickable="false" android:singleLine="true" android:textAppearance="@style/TextAppearance.Material3.BodyLarge" /> From 35c93e7160aebd218f4770c40d477e4c61c26253 Mon Sep 17 00:00:00 2001 From: kalyan Date: Mon, 20 May 2024 17:18:22 +0530 Subject: [PATCH 007/892] - exclude from recent - pwd longClickable --- .../piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt | 4 +++- .../piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt | 2 ++ app/src/main/res/layout/fragment_sign_in.xml | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt index c7bb0a61c..05baa5f60 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt @@ -7,6 +7,7 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View +import android.view.WindowManager import android.widget.ImageView import android.widget.TextView import androidx.activity.result.PickVisualMediaRequest @@ -171,6 +172,7 @@ class HomeActivity : AppCompatActivity() { } override fun onCreate(savedInstanceState: Bundle?) { + window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); super.onCreate(savedInstanceState) _binding = ActivityHomeBinding.inflate(layoutInflater) setContentView(binding.root) @@ -198,6 +200,7 @@ class HomeActivity : AppCompatActivity() { } override fun onResume() { + window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); super.onResume() if (isDeviceRootedOrEmulator()) { AlertDialog.Builder(this) @@ -209,7 +212,6 @@ class HomeActivity : AppCompatActivity() { } } private fun setUpMenu() { - val menu = object : MenuProvider { override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { menuInflater.inflate(R.menu.home_toolbar, menu) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt index ebb4d147d..445add678 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt @@ -5,6 +5,7 @@ import android.app.NotificationManager import android.content.Context import android.os.Build import android.os.Bundle +import android.view.WindowManager import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import com.google.firebase.crashlytics.internal.common.CommonUtils @@ -45,6 +46,7 @@ class LoginActivity : AppCompatActivity() { } override fun onCreate(savedInstanceState: Bundle?) { + window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) createSyncServiceNotificationChannel() diff --git a/app/src/main/res/layout/fragment_sign_in.xml b/app/src/main/res/layout/fragment_sign_in.xml index 3e7411b16..cd541b295 100644 --- a/app/src/main/res/layout/fragment_sign_in.xml +++ b/app/src/main/res/layout/fragment_sign_in.xml @@ -179,6 +179,7 @@ style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_width="match_parent" android:layout_height="wrap_content" + android:longClickable="false" android:hint="@string/til_password_hint_text" android:paddingTop="@dimen/padding_normal" android:paddingBottom="@dimen/padding_normal" @@ -192,6 +193,7 @@ android:drawablePadding="@dimen/padding_normal" android:inputType="textPassword" android:longClickable="false" + android:textIsSelectable="false" android:singleLine="true" android:textAppearance="@style/TextAppearance.Material3.BodyLarge" /> From 3cda33686a499dd7a2e1bc5dbafa9e18d093ed30 Mon Sep 17 00:00:00 2001 From: kalyan Date: Fri, 24 May 2024 18:43:07 +0530 Subject: [PATCH 008/892] - obfuscation using proguard-rules.pro --- app/build.gradle | 14 ++++++++---- app/proguard-rules.pro | 52 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b1ad6be46..d6e323548 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,8 +26,12 @@ android { } buildTypes { + debug { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } release { - minifyEnabled false + minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } @@ -38,11 +42,11 @@ android { kotlinOptions { jvmTarget = '1.8' } - dataBinding{ - enabled=true + dataBinding { + enabled = true } - viewBinding{ - enabled=true + viewBinding { + enabled = true } buildFeatures { viewBinding true diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 481bb4348..96934284d 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -18,4 +18,54 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file +#-renamesourcefileattribute SourceFile +-keep class com.squareup.moshi.** { *; } +-keep class retrofit2.** { *; } +-keep class okhttp3.** { *; } +-keep class androidx.legacy.** { *; } +-keep class com.google.firebase.** { *; } +-keep class com.google.android.gms.** { *; } +-keep class androidx.lifecycle.** { *; } +-keepclassmembers class androidx.lifecycle.** { *; } +-keep class androidx.work.** { *; } +-keep class androidx.startup.** { *; } +-keep class org.bouncycastle.** { *; } +-dontwarn org.conscrypt.** +-dontwarn org.bouncycastle.** +-dontwarn org.openjsse.** +-dontnote com.google.gson.** +-keepattributes Signature +-keepattributes *Annotation* + +# Application classes that will be serialized/deserialized over Gson +-keep class com.google.gson.examples.android.model.** { *; } +-keepclassmembers class org.piramalswasthya.**.databinding.** { + public ; +} +-keep class org.piramalswasthya.sakhi.model.** {*;} +-keep class org.piramalswasthya.sakhi.network.** {*;} +-keep class org.piramalswasthya.sakhi.repositories.** {*;} +-dontusemixedcaseclassnames +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +# Keep all members in kotlinx.coroutines +-keep class kotlinx.coroutines.** { *; } + +# Keep all methods in kotlinx.coroutines +-keepclassmembers class kotlinx.coroutines.** { *; } + +# Keep Kotlin standard library functions +-keep class kotlin.** { *; } +-keepclassmembers class kotlin.** { *; } + +# Keep coroutines continuation classes and methods +-keepclassmembers class kotlin.coroutines.Continuation { + *; +} + +# Prevent warning for kotlinx.coroutines internal classes +-dontwarn kotlinx.coroutines.internal.** + +# Prevent warning for kotlinx.coroutines implementation details +-dontwarn kotlinx.coroutines.** From 11a609b7601063cb593d8d97bee18aafd225b187 Mon Sep 17 00:00:00 2001 From: kalyan Date: Fri, 24 May 2024 19:02:56 +0530 Subject: [PATCH 009/892] -version 7.1.36 --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 132bbfc9e..b7773fb43 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -165,7 +165,7 @@ No Household records found. Please start registering households by clicking on the button below. Something went wrong !\nUnable to connect to server !\nTry again later! Try Again! - APK Version 7.1.35 + APK Version 7.1.36 Enter PIN From 46baff47b91e9a64d712a218d167963ae9f70df8 Mon Sep 17 00:00:00 2001 From: kalyan Date: Fri, 14 Jun 2024 17:09:50 +0530 Subject: [PATCH 010/892] removed minify enabled in debug --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d6e323548..2aa635360 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { buildTypes { debug { - minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' +// minifyEnabled true +// proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } release { minifyEnabled true From 81700a887d705e64c6a76beb5d5ecf5913a82ef8 Mon Sep 17 00:00:00 2001 From: kalyan Date: Fri, 14 Jun 2024 17:15:36 +0530 Subject: [PATCH 011/892] secrets file --- README.md | 6 ++---- secrets.properties | 3 +++ 2 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 secrets.properties diff --git a/README.md b/README.md index 73e03413d..6c82a7f40 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,8 @@ **Pre-Requesties:** - Clone the code repo into android studio and build the application -**Password Encryption:** - - set passPhrase value in CryptoUtil file +**Secrets:** + - set ENCRYPTED_PASS_KEY, ABHA_CLIENT_ID, ABHA_CLIENT_SECRET values in secrets.properties file **Environments**: We can generate the application for below environments based on requirements - Amrit Demo - UAT @@ -23,8 +23,6 @@ - In AllBenFragment class we have a Boolean `showAbha` which can be used to toggle the visibility of abha button on beneficiary cards - - set ABHA client id and client secret in AbhaTokenRequest data class - **APK Variants:** We can generate signed and un-signed apk’s for the application - For amritdemo/UAT we generate unsigned apk’s diff --git a/secrets.properties b/secrets.properties new file mode 100644 index 000000000..114411f26 --- /dev/null +++ b/secrets.properties @@ -0,0 +1,3 @@ +ENCRYPTED_PASS_KEY="" +ABHA_CLIENT_ID="" +ABHA_CLIENT_SECRET="" From 7d90351225bcae8477ebe3e0e92f3107d432fffc Mon Sep 17 00:00:00 2001 From: HP Date: Thu, 11 Jul 2024 11:51:07 +0530 Subject: [PATCH 012/892] Eligible couple tracking bugs done --- .../sakhi/configuration/Dataset.kt | 25 +++ .../EligibleCoupleRegistrationDataset.kt | 2 +- .../EligibleCoupleTrackingDataset.kt | 147 ++++++++++++++++-- .../PregnantWomanRegistrationDataset.kt | 16 ++ 4 files changed, 173 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt index 30f00b00e..3a2a0e968 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt @@ -247,6 +247,31 @@ abstract class Dataset(context: Context, currentLanguage: Languages) { } } + + protected fun triggerforHide( + source: FormElement, + passedIndex: Int, + triggerIndex: Int, + target: FormElement, + targetSideEffect: List? = null + ): Int { + + val anyRemoved = list.remove( + target + ) + return if (anyRemoved) { + target.value = null + targetSideEffect?.let { sideEffectList -> + list.removeAll(sideEffectList) + sideEffectList.forEach { it.value = null } + } + list.indexOf(source) + } else -1 + + + } + + protected fun triggerDependants( age: Int, // ageUnit: FormElement, diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleRegistrationDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleRegistrationDataset.kt index d8df66614..239979fe1 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleRegistrationDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleRegistrationDataset.kt @@ -157,7 +157,7 @@ class EligibleCoupleRegistrationDataset(context: Context, language: Languages) : required = false, etInputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_VARIATION_NORMAL, isMobileNumber = true, - etMaxLength = 18, + etMaxLength = 20, max = 999999999999999999L, min = 0L ) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleTrackingDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleTrackingDataset.kt index 84099366a..35c9c175a 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleTrackingDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleTrackingDataset.kt @@ -1,6 +1,8 @@ package org.piramalswasthya.sakhi.configuration import android.content.Context +import android.util.Log +import android.widget.Toast import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.database.room.SyncState import org.piramalswasthya.sakhi.helpers.Languages @@ -112,7 +114,7 @@ class EligibleCoupleTrackingDataset( financialYear, month, isPregnancyTestDone, - isPregnant, +// isPregnant, // usingFamilyPlanning, ) if (saved == null) { @@ -149,6 +151,9 @@ class EligibleCoupleTrackingDataset( pregnancyTestResult.value = saved.pregnancyTestResult } isPregnant.value = getLocalValueInArray(R.array.yes_no, saved.isPregnant) + + + if (isPregnant.value == resources.getStringArray(R.array.yes_no)[1]) { list.add(usingFamilyPlanning) saved.usingFamilyPlanning?.let { @@ -190,37 +195,147 @@ class EligibleCoupleTrackingDataset( isPregnancyTestDone.id -> { isPregnant.isEnabled = true - triggerDependants( - source = isPregnancyTestDone, - passedIndex = index, - triggerIndex = 0, - target = pregnancyTestResult - ) + + if (isPregnant.value==resources.getStringArray(R.array.yes_no_donno)[0]) + { + triggerDependants( + source = isPregnancyTestDone, + passedIndex = index, + triggerIndex = 0, + target = pregnancyTestResult + ) + } + else if (isPregnant.value==resources.getStringArray(R.array.yes_no_donno)[1]) + { + triggerDependants( + source = isPregnancyTestDone, + passedIndex = index, + triggerIndex = 0, + target = pregnancyTestResult + ) + triggerforHide( + source = isPregnancyTestDone, + passedIndex = index, + triggerIndex = 1, + target = isPregnant, + targetSideEffect = listOf(isPregnant,usingFamilyPlanning,methodOfContraception) + ) + + } + else{ + triggerDependants( + source = isPregnancyTestDone, + passedIndex = index, + triggerIndex = 0, + target = pregnancyTestResult + ) + + triggerforHide( + source = isPregnancyTestDone, + passedIndex = index, + triggerIndex = 1, + target = isPregnant, + targetSideEffect = listOf(isPregnant,usingFamilyPlanning,methodOfContraception) + ) + } + return 0 + + } pregnancyTestResult.id -> { + + if (pregnancyTestResult.value == resources.getStringArray(R.array.ectdset_po_neg)[0]) { isPregnant.value = resources.getStringArray(R.array.yes_no)[0] isPregnant.isEnabled = false - } else { + Log.e("Positive","$index ${pregnancyTestResult.value}") + + + triggerDependants( + source = pregnancyTestResult, + passedIndex = index, + triggerIndex = 0, + target = isPregnant, + targetSideEffect = listOf(isPregnant,usingFamilyPlanning,methodOfContraception, anyOtherMethod) + ) + triggerforHide( + source = pregnancyTestResult, + passedIndex = index, + triggerIndex = 1, + target = usingFamilyPlanning, + targetSideEffect = listOf(usingFamilyPlanning,methodOfContraception) + ) + } + else if (pregnancyTestResult.value == resources.getStringArray(R.array.ectdset_po_neg)[1]) { + isPregnant.isEnabled = true + isPregnant.value = resources.getStringArray(R.array.yes_no)[1] + triggerDependants( + source = pregnancyTestResult, + passedIndex = index, + triggerIndex = 1, + target = isPregnant, + targetSideEffect = listOf(isPregnant,usingFamilyPlanning,methodOfContraception, anyOtherMethod) + ) + triggerDependants( + source = isPregnant, + passedIndex = index, + triggerIndex = 1, + target = usingFamilyPlanning, + targetSideEffect = listOf(methodOfContraception, anyOtherMethod) + ) + + + + + Log.e("PositiveB","$index ${pregnancyTestResult.value}") + + } + else { isPregnant.value = null isPregnant.isEnabled = true } - handleListOnValueChanged(isPregnant.id, 0) + return 0 } isPregnant.id -> { - triggerDependants( - source = isPregnant, - passedIndex = index, - triggerIndex = 1, - target = usingFamilyPlanning, - targetSideEffect = listOf(methodOfContraception, anyOtherMethod) - ) + if (isPregnant.value==resources.getStringArray(R.array.yes_no_donno)[0]) + { + triggerDependants( + source = isPregnant, + passedIndex = index, + triggerIndex = 1, + target = usingFamilyPlanning, + targetSideEffect = listOf(methodOfContraception, anyOtherMethod) + ) + } + else if (isPregnant.value==resources.getStringArray(R.array.yes_no_donno)[1]) + { + triggerDependants( + source = isPregnant, + passedIndex = index, + triggerIndex = 1, + target = usingFamilyPlanning, + targetSideEffect = listOf(methodOfContraception, anyOtherMethod) + ) + } + else{ + triggerDependants( + source = isPregnant, + passedIndex = index, + triggerIndex = 2, + target = usingFamilyPlanning, + targetSideEffect = listOf(methodOfContraception, anyOtherMethod) + ) + } + return 0 + + } usingFamilyPlanning.id -> { + Log.e("INDEX",index.toString()) triggerDependants( source = usingFamilyPlanning, passedIndex = index, diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanRegistrationDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanRegistrationDataset.kt index 23e9f4486..16588d058 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanRegistrationDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanRegistrationDataset.kt @@ -1,6 +1,7 @@ package org.piramalswasthya.sakhi.configuration import android.content.Context +import android.util.Log import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.database.room.SyncState import org.piramalswasthya.sakhi.helpers.Konstants @@ -22,11 +23,20 @@ class PregnantWomanRegistrationDataset( ) : Dataset(context, currentLanguage) { companion object { + var registrationDate:Long = 0 private fun getMinLmpMillis(): Long { val cal = Calendar.getInstance() cal.add(Calendar.DAY_OF_YEAR, -1 * 280) return cal.timeInMillis } + + private fun pwRegisterBeforeoneYear(): Long { + Log.e("RegstrationDate:-" , registrationDate.toString()) + return registrationDate-TimeUnit.DAYS.toMillis(365) + /* val calendar = Calendar.getInstance() + calendar.add(Calendar.YEAR, -1)*/ + + } } private val dateOfReg = FormElement( @@ -160,6 +170,7 @@ class PregnantWomanRegistrationDataset( title = resources.getString(R.string.pwrdst_vdrl_tst_done), arrayId = -1, required = false, + min=pwRegisterBeforeoneYear(), max = System.currentTimeMillis(), ) private val hivTestResult = FormElement( @@ -435,6 +446,7 @@ class PregnantWomanRegistrationDataset( multiplePregnancy, isHrpCase ) + dateOfReg.value = getDateFromLong(System.currentTimeMillis()) dateOfReg.value?.let { val long = getLongFromDate(it) @@ -443,6 +455,7 @@ class PregnantWomanRegistrationDataset( dateOfhbsAgTestDone.min = long } + ben?.let { dateOfReg.min = it.regDate.also { dateOfVdrlTestDone.min = it @@ -545,7 +558,9 @@ class PregnantWomanRegistrationDataset( dateOfReg.apply { value = getDateFromLong(it.dateOfRegistration) inputType = InputType.TEXT_VIEW + } + it.dateOfRegistration.let { lmp.max = it lmp.min = it - TimeUnit.DAYS.toMillis(280) @@ -553,6 +568,7 @@ class PregnantWomanRegistrationDataset( dateOfhivTestDone.min = it dateOfhbsAgTestDone.min = it + } val eddFromLmp = getEddFromLmp(it.lmpDate) minOf(System.currentTimeMillis(), eddFromLmp).let { maxDate -> From 63f5c344535ddd7a2fc2895d241b17a39abd1cf0 Mon Sep 17 00:00:00 2001 From: Ritik Date: Thu, 11 Jul 2024 18:09:06 +0530 Subject: [PATCH 013/892] ECM code clean up --- .../sakhi/adapters/FormInputAdapter.kt | 5 +--- .../sakhi/configuration/Dataset.kt | 5 +--- .../EligibleCoupleTrackingDataset.kt | 24 +------------------ .../PregnantWomanRegistrationDataset.kt | 7 +----- .../EligibleCoupleTrackingFormFragment.kt | 1 - 5 files changed, 4 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapter.kt b/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapter.kt index 949fd361b..63c827904 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapter.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapter.kt @@ -70,10 +70,7 @@ class FormInputAdapter( private val isEnabled: Boolean = true ) : ListAdapter(FormInputDiffCallBack) { - // @Inject -// lateinit var preferenceDao: PreferenceDao -// @Inject -// lateinit var context: Context + object FormInputDiffCallBack : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: FormElement, newItem: FormElement) = oldItem.id == newItem.id diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt index 3a2a0e968..025a0797c 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt @@ -255,10 +255,7 @@ abstract class Dataset(context: Context, currentLanguage: Languages) { target: FormElement, targetSideEffect: List? = null ): Int { - - val anyRemoved = list.remove( - target - ) + val anyRemoved = list.remove(target) return if (anyRemoved) { target.value = null targetSideEffect?.let { sideEffectList -> diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleTrackingDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleTrackingDataset.kt index 35c9c175a..1cbb9d820 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleTrackingDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleTrackingDataset.kt @@ -1,8 +1,6 @@ package org.piramalswasthya.sakhi.configuration import android.content.Context -import android.util.Log -import android.widget.Toast import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.database.room.SyncState import org.piramalswasthya.sakhi.helpers.Languages @@ -114,8 +112,6 @@ class EligibleCoupleTrackingDataset( financialYear, month, isPregnancyTestDone, -// isPregnant, -// usingFamilyPlanning, ) if (saved == null) { dateOfVisit.value = getDateFromLong(System.currentTimeMillis()) @@ -151,9 +147,6 @@ class EligibleCoupleTrackingDataset( pregnancyTestResult.value = saved.pregnancyTestResult } isPregnant.value = getLocalValueInArray(R.array.yes_no, saved.isPregnant) - - - if (isPregnant.value == resources.getStringArray(R.array.yes_no)[1]) { list.add(usingFamilyPlanning) saved.usingFamilyPlanning?.let { @@ -188,14 +181,11 @@ class EligibleCoupleTrackingDataset( return when (formId) { dateOfVisit.id -> { financialYear.value = Companion.getFinancialYear(dateOfVisit.value) - month.value = - resources.getStringArray(R.array.visit_months)[Companion.getMonth(dateOfVisit.value)!!] + month.value = resources.getStringArray(R.array.visit_months)[Companion.getMonth(dateOfVisit.value)!!] -1 } - isPregnancyTestDone.id -> { isPregnant.isEnabled = true - if (isPregnant.value==resources.getStringArray(R.array.yes_no_donno)[0]) { triggerDependants( @@ -229,7 +219,6 @@ class EligibleCoupleTrackingDataset( triggerIndex = 0, target = pregnancyTestResult ) - triggerforHide( source = isPregnancyTestDone, passedIndex = index, @@ -244,14 +233,9 @@ class EligibleCoupleTrackingDataset( } pregnancyTestResult.id -> { - - if (pregnancyTestResult.value == resources.getStringArray(R.array.ectdset_po_neg)[0]) { isPregnant.value = resources.getStringArray(R.array.yes_no)[0] isPregnant.isEnabled = false - Log.e("Positive","$index ${pregnancyTestResult.value}") - - triggerDependants( source = pregnancyTestResult, passedIndex = index, @@ -285,11 +269,6 @@ class EligibleCoupleTrackingDataset( targetSideEffect = listOf(methodOfContraception, anyOtherMethod) ) - - - - Log.e("PositiveB","$index ${pregnancyTestResult.value}") - } else { isPregnant.value = null @@ -335,7 +314,6 @@ class EligibleCoupleTrackingDataset( } usingFamilyPlanning.id -> { - Log.e("INDEX",index.toString()) triggerDependants( source = usingFamilyPlanning, passedIndex = index, diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanRegistrationDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanRegistrationDataset.kt index 16588d058..b4ba7f444 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanRegistrationDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanRegistrationDataset.kt @@ -1,7 +1,6 @@ package org.piramalswasthya.sakhi.configuration import android.content.Context -import android.util.Log import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.database.room.SyncState import org.piramalswasthya.sakhi.helpers.Konstants @@ -29,12 +28,8 @@ class PregnantWomanRegistrationDataset( cal.add(Calendar.DAY_OF_YEAR, -1 * 280) return cal.timeInMillis } - private fun pwRegisterBeforeoneYear(): Long { - Log.e("RegstrationDate:-" , registrationDate.toString()) return registrationDate-TimeUnit.DAYS.toMillis(365) - /* val calendar = Calendar.getInstance() - calendar.add(Calendar.YEAR, -1)*/ } } @@ -170,7 +165,7 @@ class PregnantWomanRegistrationDataset( title = resources.getString(R.string.pwrdst_vdrl_tst_done), arrayId = -1, required = false, - min=pwRegisterBeforeoneYear(), + min= pwRegisterBeforeoneYear(), max = System.currentTimeMillis(), ) private val hivTestResult = FormElement( diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/eligible_couple/tracking/form/EligibleCoupleTrackingFormFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/eligible_couple/tracking/form/EligibleCoupleTrackingFormFragment.kt index e53004017..559ea55df 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/eligible_couple/tracking/form/EligibleCoupleTrackingFormFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/eligible_couple/tracking/form/EligibleCoupleTrackingFormFragment.kt @@ -38,7 +38,6 @@ class EligibleCoupleTrackingFormFragment : Fragment() { super.onViewCreated(view, savedInstanceState) viewModel.recordExists.observe(viewLifecycleOwner) { notIt -> notIt?.let { recordExists -> -// binding.fabEdit.visibility = if(recordExists) View.VISIBLE else View.GONE val adapter = FormInputAdapter( formValueListener = FormInputAdapter.FormValueListener { formId, index -> viewModel.updateListOnValueChanged(formId, index) From 820ee71f8e522d8611950773d24b781214017b37 Mon Sep 17 00:00:00 2001 From: Sushant Date: Thu, 11 Jul 2024 23:07:04 +0530 Subject: [PATCH 014/892] Date Validations in HIV/HBSAG/VDRL --- .../PregnantWomanRegistrationDataset.kt | 28 +++++++++---------- .../sakhi/ui/home_activity/HomeActivity.kt | 4 +++ .../sakhi/ui/login_activity/LoginActivity.kt | 2 ++ 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanRegistrationDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanRegistrationDataset.kt index 23e9f4486..eadc7c29e 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanRegistrationDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanRegistrationDataset.kt @@ -438,15 +438,15 @@ class PregnantWomanRegistrationDataset( dateOfReg.value = getDateFromLong(System.currentTimeMillis()) dateOfReg.value?.let { val long = getLongFromDate(it) - dateOfhivTestDone.min = long - dateOfVdrlTestDone.min = long - dateOfhbsAgTestDone.min = long + dateOfhivTestDone.min = long - TimeUnit.DAYS.toMillis(365) + dateOfVdrlTestDone.min = long - TimeUnit.DAYS.toMillis(365) + dateOfhbsAgTestDone.min = long - TimeUnit.DAYS.toMillis(365) } ben?.let { dateOfReg.min = it.regDate.also { - dateOfVdrlTestDone.min = it - dateOfhivTestDone.min = it + dateOfVdrlTestDone.min = it - TimeUnit.DAYS.toMillis(365) + dateOfhivTestDone.min = it - TimeUnit.DAYS.toMillis(365) hbsAgTestResult.min = it } rchId.value = ben.rchId @@ -549,9 +549,9 @@ class PregnantWomanRegistrationDataset( it.dateOfRegistration.let { lmp.max = it lmp.min = it - TimeUnit.DAYS.toMillis(280) - dateOfVdrlTestDone.min = it - dateOfhivTestDone.min = it - dateOfhbsAgTestDone.min = it + dateOfVdrlTestDone.min = it - TimeUnit.DAYS.toMillis(365) + dateOfhivTestDone.min = it - TimeUnit.DAYS.toMillis(365) + dateOfhbsAgTestDone.min = it - TimeUnit.DAYS.toMillis(365) } val eddFromLmp = getEddFromLmp(it.lmpDate) @@ -692,9 +692,9 @@ class PregnantWomanRegistrationDataset( val dateOfRegLong = getLongFromDate(it) lmp.max = dateOfRegLong lmp.min = getMinFromMaxForLmp(lmp.max!!) - dateOfVdrlTestDone.min = dateOfRegLong - dateOfhivTestDone.min = dateOfRegLong - dateOfhbsAgTestDone.min = dateOfRegLong + dateOfVdrlTestDone.min = dateOfRegLong - TimeUnit.DAYS.toMillis(365) + dateOfhivTestDone.min = dateOfRegLong - TimeUnit.DAYS.toMillis(365) + dateOfhbsAgTestDone.min = dateOfRegLong - TimeUnit.DAYS.toMillis(365) updateAgeCheck(dateOfBirth, dateOfRegLong) return handleListOnValueChanged(isHrpCase.id, 0) } @@ -723,9 +723,9 @@ class PregnantWomanRegistrationDataset( } edd.value = eddLong?.let { getDateFromLong(it) } regLong?.let { - dateOfhivTestDone.min = it - dateOfVdrlTestDone.min = it - dateOfhbsAgTestDone.min = it + dateOfhivTestDone.min = it - TimeUnit.DAYS.toMillis(365) + dateOfVdrlTestDone.min = it - TimeUnit.DAYS.toMillis(365) + dateOfhbsAgTestDone.min = it - TimeUnit.DAYS.toMillis(365) } eddLong?.let { val max = minOf(it, System.currentTimeMillis()) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt index 05baa5f60..d4ee86a7c 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt @@ -172,6 +172,8 @@ class HomeActivity : AppCompatActivity() { } override fun onCreate(savedInstanceState: Bundle?) { + // This will block user to cast app screen + // Toggle screencast mode for staging & production builds window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); super.onCreate(savedInstanceState) _binding = ActivityHomeBinding.inflate(layoutInflater) @@ -200,6 +202,8 @@ class HomeActivity : AppCompatActivity() { } override fun onResume() { + // This will block user to cast app screen + // Toggle screencast mode for staging & production builds window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); super.onResume() if (isDeviceRootedOrEmulator()) { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt index 445add678..a19ff4a33 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt @@ -46,6 +46,8 @@ class LoginActivity : AppCompatActivity() { } override fun onCreate(savedInstanceState: Bundle?) { + // This will block user to cast app screen + // Toggle screencast mode for staging & production builds window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) From 2c0018dbc1018f4f075ef8449e699eb5046ab682 Mon Sep 17 00:00:00 2001 From: Sushant Date: Sun, 14 Jul 2024 18:30:39 +0530 Subject: [PATCH 015/892] Environment Set for Staging, UAT & Production --- app/build.gradle | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 2aa635360..92c0611d0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -35,6 +35,25 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + + flavorDimensions "default" + + productFlavors { + staging { + applicationIdSuffix ".staging" + applicationId "org.piramalswasthya.sakhi" + resValue "string", "app_native_name", "উৎপ্ৰেৰণা-Stag" + } + uat { + applicationIdSuffix ".uat" + applicationId "org.piramalswasthya.sakhi" + resValue "string", "app_native_name", "উৎপ্ৰেৰণা-Uat" + } + production { + applicationId "org.piramalswasthya.sakhi" + } + } + compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 From 6aab9bbf8c45e3fa41118d280db4f2bceebb2521 Mon Sep 17 00:00:00 2001 From: Sushant Date: Tue, 16 Jul 2024 14:42:42 +0530 Subject: [PATCH 016/892] ABHA Environment Set --- .../org/piramalswasthya/sakhi/di/AppModule.kt | 10 +++++++++- .../sakhi/network/AbhaApiService.kt | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt b/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt index b063ff5e0..aae90f64c 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt @@ -28,10 +28,18 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) object AppModule { +// Staging Base URL private const val baseTmcUrl = "https://amritdemo.piramalswasthya.org/" - private const val baseAbhaUrl = "https://healthidsbx.abdm.gov.in/api/" + // Production Base URL +// private const val baseTmcUrl = +// "https://assamtmc.piramalswasthya.org/" + + // Staging ABHA URL +// private const val baseAbhaUrl = "https://healthidsbx.abdm.gov.in/api/" + // Production ABHA URL + private const val baseAbhaUrl = "https://healthid.abdm.gov.in/api/" private val baseClient = OkHttpClient.Builder() diff --git a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt index 7fe9dac1f..1a1c06c7f 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt @@ -6,6 +6,7 @@ import retrofit2.http.* interface AbhaApiService { + // Staging @Headers("No-Auth: true") @POST suspend fun getToken( @@ -13,12 +14,23 @@ interface AbhaApiService { @Body request: AbhaTokenRequest = AbhaTokenRequest() ): Response + // Production +// @Headers("No-Auth: true") +// @POST +// suspend fun getToken( +// @Url url: String = "https://live.abdm.gov.in/gateway/v0.5/sessions", +// @Body request: AbhaTokenRequest = AbhaTokenRequest() +// ): Response + @POST("v1/registration/aadhaar/generateOtp") suspend fun generateAadhaarOtp(@Body aadhaar: AbhaGenerateAadhaarOtpRequest): Response @POST("v2/registration/aadhaar/generateOtp") suspend fun generateAadhaarOtpV2(@Body aadhaar: AbhaGenerateAadhaarOtpRequest): Response + @POST("v3/enrollment/request/otp") + suspend fun generateAadhaarOtpV3(@Body aadhaar: AbhaGenerateAadhaarOtpRequest, @Header("REQUEST_ID") requestId: String, @Header("TIMESTAMP") timestamp: String): Response + @POST("v1/registration/aadhaar/resendAadhaarOtp") suspend fun resendAadhaarOtp(@Body aadhaar: AbhaResendAadhaarOtpRequest): Response @@ -46,11 +58,18 @@ interface AbhaApiService { @GET("v1/account/getPngCard") suspend fun getPngCard(): Response + // Staging RES Encryption API @GET suspend fun getAuthCert( @Url url: String = "https://healthidsbx.abdm.gov.in/api/v2/auth/cert" ): Response + // Production RES Encryption API +// @GET +// suspend fun getAuthCert( +// @Url url: String = "https://healthid.abdm.gov.in/api/v2/auth/cert" +// ): Response + @GET("v2/ha/lgd/states") suspend fun getStateAndDistricts(): Response From ae3863865aab13664a7dddd223057f5bc685b52f Mon Sep 17 00:00:00 2001 From: kalyan Date: Thu, 25 Jul 2024 17:26:28 +0530 Subject: [PATCH 017/892] root detection --- app/src/main/AndroidManifest.xml | 1 + .../sakhi/ui/home_activity/HomeActivity.kt | 4 +- .../sakhi/ui/login_activity/LoginActivity.kt | 3 +- .../piramalswasthya/sakhi/utils/RootedUtil.kt | 83 +++++++++++++++++++ 4 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/org/piramalswasthya/sakhi/utils/RootedUtil.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f9b4a0906..016e281ee 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ + diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt index 05baa5f60..6930852a5 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt @@ -30,6 +30,7 @@ import dagger.hilt.InstallIn import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.EntryPointAccessors import dagger.hilt.components.SingletonComponent +import org.piramalswasthya.sakhi.BuildConfig import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.database.shared_preferences.PreferenceDao import org.piramalswasthya.sakhi.databinding.ActivityHomeBinding @@ -41,6 +42,7 @@ import org.piramalswasthya.sakhi.ui.home_activity.home.HomeViewModel import org.piramalswasthya.sakhi.ui.home_activity.sync.SyncBottomSheetFragment import org.piramalswasthya.sakhi.ui.login_activity.LoginActivity import org.piramalswasthya.sakhi.ui.service_location_activity.ServiceLocationActivity +import org.piramalswasthya.sakhi.utils.RootedUtil import org.piramalswasthya.sakhi.work.WorkerUtils import java.util.* import javax.inject.Inject @@ -368,7 +370,7 @@ class HomeActivity : AppCompatActivity() { } private fun isDeviceRootedOrEmulator(): Boolean { - return isRooted() || isEmulator() + return isRooted() || isEmulator() || RootedUtil().isDeviceRooted(applicationContext) } } \ No newline at end of file diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt index 445add678..9232b98f4 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt @@ -18,6 +18,7 @@ import org.piramalswasthya.sakhi.BuildConfig import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.database.shared_preferences.PreferenceDao import org.piramalswasthya.sakhi.helpers.MyContextWrapper +import org.piramalswasthya.sakhi.utils.RootedUtil import java.util.* @@ -83,7 +84,7 @@ class LoginActivity : AppCompatActivity() { } private fun isDeviceRootedOrEmulator(): Boolean { - return CommonUtils.isRooted() || CommonUtils.isEmulator() + return CommonUtils.isRooted() || CommonUtils.isEmulator() || RootedUtil().isDeviceRooted(applicationContext) } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/utils/RootedUtil.kt b/app/src/main/java/org/piramalswasthya/sakhi/utils/RootedUtil.kt new file mode 100644 index 000000000..4a1aaf491 --- /dev/null +++ b/app/src/main/java/org/piramalswasthya/sakhi/utils/RootedUtil.kt @@ -0,0 +1,83 @@ +package org.piramalswasthya.sakhi.utils + +import android.content.Context +import java.io.BufferedReader +import java.io.File +import java.io.InputStreamReader + +class RootedUtil { + // Check if the device is rooted + fun isDeviceRooted(applicationContext: Context): Boolean { + return checkRootMethod1() || checkRootMethod2(applicationContext) || checkRootMethod3() || checkRootMethod4() + } + + // Method 1: Check for the presence of su binary + private fun checkRootMethod1(): Boolean { + val paths = arrayOf( + "/sbin/su", + "/system/bin/su", + "/system/xbin/su", + "/data/local/xbin/su", + "/data/local/bin/su", + "/system/sd/xbin/su", + "/system/bin/failsafe/su", + "/data/local/su" + ) + for (path in paths) { + if (File(path).exists()) { + return true + } + } + return false + } + + // Method 2: Check for root management apps + private fun checkRootMethod2(applicationContext: Context): Boolean { + val packages = arrayOf( + "eu.chainfire.supersu", + "com.noshufou.android.su", + "com.thirdparty.superuser", + "com.yellowes.su" + ) + for (packageName in packages) { + try { + val pm = applicationContext.packageManager + pm.getPackageInfo(packageName, 0) + return true + } catch (e: Exception) { + // Package not found + } + } + return false + } + + // Method 3: Check for dangerous props + private fun checkRootMethod3(): Boolean { + var reader: BufferedReader? = null + return try { + val process = Runtime.getRuntime().exec("getprop") + reader = BufferedReader(InputStreamReader(process.inputStream)) + val prop: String = reader.readLine() + while (prop.isNotEmpty()) { + if (prop.contains("[ro.debuggable]=[1]") || prop.contains("[ro.secure]=[0]")) { + return true + } + } + false + } catch (e: Exception) { + false + } finally { + reader?.close() + } + } + + // Method 4: Check for the presence of BusyBox binary + private fun checkRootMethod4(): Boolean { + return try { + Runtime.getRuntime().exec("busybox").destroy() + true + } catch (e: Exception) { + false + } + } +} From c4724271336392e466c13ff780996c618e8f1727 Mon Sep 17 00:00:00 2001 From: kalyan Date: Thu, 25 Jul 2024 17:36:00 +0530 Subject: [PATCH 018/892] shrink resources --- app/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/app/build.gradle b/app/build.gradle index 2aa635360..89fe44f1a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -32,6 +32,7 @@ android { } release { minifyEnabled true + shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } From 66ade7d013d92b34a2ce6facbe39b7b4b8392655 Mon Sep 17 00:00:00 2001 From: kalyan Date: Thu, 25 Jul 2024 17:59:44 +0530 Subject: [PATCH 019/892] updated method names --- .../org/piramalswasthya/sakhi/utils/RootedUtil.kt | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/utils/RootedUtil.kt b/app/src/main/java/org/piramalswasthya/sakhi/utils/RootedUtil.kt index 4a1aaf491..8d2c055c5 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/utils/RootedUtil.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/utils/RootedUtil.kt @@ -6,13 +6,12 @@ import java.io.File import java.io.InputStreamReader class RootedUtil { - // Check if the device is rooted fun isDeviceRooted(applicationContext: Context): Boolean { - return checkRootMethod1() || checkRootMethod2(applicationContext) || checkRootMethod3() || checkRootMethod4() + return checkSUBinary() || checkRootManagement(applicationContext) || checkProps() || checkBusyBox() } // Method 1: Check for the presence of su binary - private fun checkRootMethod1(): Boolean { + private fun checkSUBinary(): Boolean { val paths = arrayOf( "/sbin/su", "/system/bin/su", @@ -31,8 +30,7 @@ class RootedUtil { return false } - // Method 2: Check for root management apps - private fun checkRootMethod2(applicationContext: Context): Boolean { + private fun checkRootManagement(applicationContext: Context): Boolean { val packages = arrayOf( "eu.chainfire.supersu", "com.noshufou.android.su", @@ -51,8 +49,7 @@ class RootedUtil { return false } - // Method 3: Check for dangerous props - private fun checkRootMethod3(): Boolean { + private fun checkProps(): Boolean { var reader: BufferedReader? = null return try { val process = Runtime.getRuntime().exec("getprop") @@ -71,8 +68,7 @@ class RootedUtil { } } - // Method 4: Check for the presence of BusyBox binary - private fun checkRootMethod4(): Boolean { + private fun checkBusyBox(): Boolean { return try { Runtime.getRuntime().exec("busybox").destroy() true From fb352cdbcda2c3b8f82a8f81354fb8cbf8394dec Mon Sep 17 00:00:00 2001 From: Ritik Date: Mon, 29 Jul 2024 19:21:58 +0530 Subject: [PATCH 020/892] micro birth plan and pnc visit task done --- .gradle/buildOutputCleanup/cache.properties | 2 +- app/build.gradle | 4 +- .../sakhi/adapters/HRPAdapter.kt | 31 +- .../sakhi/adapters/PncVisitListAdapter.kt | 5 +- .../configuration/HRPMicroBirthPlanDataset.kt | 39 ++- .../list/PregnantListFragment.kt | 14 +- .../HRPMicroBirthPlanViewModel.kt | 19 +- .../HRPMicroBirthPlanTable.kt | 176 +++++++++++ .../EligibleCoupleTrackingFormFragment.kt | 1 + app/src/main/res/drawable/border_line.xml | 21 ++ .../main/res/drawable/horizontal_border.xml | 20 ++ .../fragment_h_r_p_micro_birth_plan_table.xml | 295 ++++++++++++++++++ app/src/main/res/navigation/nav_home.xml | 17 + app/src/main/res/values-as/strings_hrp.xml | 12 +- app/src/main/res/values/strings.xml | 31 +- app/src/main/res/values/strings_hrp.xml | 9 +- build.gradle | 4 +- settings.gradle | 1 + 18 files changed, 664 insertions(+), 37 deletions(-) create mode 100644 app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt create mode 100644 app/src/main/res/drawable/border_line.xml create mode 100644 app/src/main/res/drawable/horizontal_border.xml create mode 100644 app/src/main/res/layout/fragment_h_r_p_micro_birth_plan_table.xml diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties index c7d36898b..0ef254846 100644 --- a/.gradle/buildOutputCleanup/cache.properties +++ b/.gradle/buildOutputCleanup/cache.properties @@ -1,2 +1,2 @@ -#Thu Aug 24 13:03:32 IST 2023 +#Tue Jun 04 18:07:34 IST 2024 gradle.version=8.0 diff --git a/app/build.gradle b/app/build.gradle index 2aa635360..d87d82a96 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,6 +11,8 @@ plugins { } + + android { namespace 'org.piramalswasthya.sakhi' compileSdk 34 @@ -147,13 +149,13 @@ dependencies { // implementation 'org.bouncycastle:bcpkix-jdk15on:1.68' + testImplementation "com.google.truth:truth:1.1.3" androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' //Image compressor implementation 'id.zelory:compressor:3.0.1' - implementation 'androidx.legacy:legacy-support-v4:1.0.0' } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/adapters/HRPAdapter.kt b/app/src/main/java/org/piramalswasthya/sakhi/adapters/HRPAdapter.kt index 640e5724f..2088ba152 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/adapters/HRPAdapter.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/adapters/HRPAdapter.kt @@ -4,6 +4,7 @@ import android.os.Build import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView @@ -82,6 +83,10 @@ class HRPAdapter( var hasForm: Boolean = false var completelyFilled: Boolean = false var formEnabled: Boolean = false + (binding.btnForm2.layoutParams as LinearLayout.LayoutParams).weight=1.2f + (binding.btnForm1.layoutParams as LinearLayout.LayoutParams).weight=0.9f + (binding.btnForm3.layoutParams as LinearLayout.LayoutParams).weight=0.9f + val formButton = when (formNumber) { 1 -> { binding.btnForm1.also { @@ -112,13 +117,29 @@ class HRPAdapter( 3 -> { binding.btnForm3.also { // hasForm = item.assess.noOfDeliveries.form3Filled -// formEnabled = item.ben.form3Enabled + hasForm = item.mbp != null + if (hasForm) { + + formEnabled = true + (binding.btnForm2.layoutParams as LinearLayout.LayoutParams).weight=1.2f + (binding.btnForm1.layoutParams as LinearLayout.LayoutParams).weight=0.9f + (binding.btnForm3.layoutParams as LinearLayout.LayoutParams).weight=0.9f + + } else { + + formEnabled = false + (binding.btnForm2.layoutParams as LinearLayout.LayoutParams).weight=1.8f + (binding.btnForm1.layoutParams as LinearLayout.LayoutParams).weight=1.2f + + } + } } else -> throw IllegalStateException("FormNumber>3") } - formButton.visibility = if (formEnabled) View.VISIBLE else View.INVISIBLE + formButton.visibility = if (formEnabled) View.VISIBLE else View.GONE + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (hasForm) { @@ -137,6 +158,12 @@ class HRPAdapter( ) ) } + binding.btnForm3.setBackgroundColor( + binding.btnForm3.resources.getColor( + android.R.color.holo_purple, + binding.root.context.theme + ) + ) } else { formButton.setBackgroundColor( diff --git a/app/src/main/java/org/piramalswasthya/sakhi/adapters/PncVisitListAdapter.kt b/app/src/main/java/org/piramalswasthya/sakhi/adapters/PncVisitListAdapter.kt index 76005d1f5..2fa07d122 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/adapters/PncVisitListAdapter.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/adapters/PncVisitListAdapter.kt @@ -1,8 +1,10 @@ package org.piramalswasthya.sakhi.adapters +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Toast import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView @@ -37,11 +39,12 @@ class PncVisitListAdapter(private val clickListener: PncVisitClickListener? = nu fun bind( item: BenPncDomain, clickListener: PncVisitClickListener? ) { + binding.visit = item binding.btnViewVisits.visibility = if (item.savedPncRecords.isEmpty()) View.INVISIBLE else View.VISIBLE binding.btnAddPnc.visibility = - if (item.allowFill) View.INVISIBLE else View.VISIBLE + if (item.allowFill) View.VISIBLE else View.INVISIBLE binding.clickListener = clickListener binding.executePendingBindings() diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/HRPMicroBirthPlanDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/HRPMicroBirthPlanDataset.kt index 70a6c18e6..30c84ff2a 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/HRPMicroBirthPlanDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/HRPMicroBirthPlanDataset.kt @@ -1,6 +1,7 @@ package org.piramalswasthya.sakhi.configuration import android.content.Context +import android.util.Log import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.model.BenRegCache @@ -44,6 +45,7 @@ class HRPMicroBirthPlanDataset( title = resources.getString(R.string.contact_number_1), arrayId = -1, required = true, + isEnabled = false, etInputType = android.text.InputType.TYPE_CLASS_NUMBER or android.text.InputType.TYPE_NUMBER_VARIATION_NORMAL, isMobileNumber = true, etMaxLength = 10, @@ -56,7 +58,7 @@ class HRPMicroBirthPlanDataset( inputType = InputType.EDIT_TEXT, title = resources.getString(R.string.contact_number_2), arrayId = -1, - required = true, + required = false, etInputType = android.text.InputType.TYPE_CLASS_NUMBER or android.text.InputType.TYPE_NUMBER_VARIATION_NORMAL, isMobileNumber = true, etMaxLength = 10, @@ -69,6 +71,7 @@ class HRPMicroBirthPlanDataset( title = resources.getString(R.string.sc_hwc_tg_hosp), arrayId = -1, required = true, + etMaxLength = 100, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) private val block = FormElement( @@ -77,6 +80,8 @@ class HRPMicroBirthPlanDataset( title = resources.getString(R.string.block), arrayId = -1, required = true, + + etMaxLength = 100, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) @@ -99,6 +104,7 @@ class HRPMicroBirthPlanDataset( title = resources.getString(R.string.nearest_24x7_phc), arrayId = -1, required = true, + etMaxLength = 100, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) @@ -108,6 +114,7 @@ class HRPMicroBirthPlanDataset( title = resources.getString(R.string.nearest_fru), arrayId = -1, required = true, + etMaxLength = 100, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) @@ -117,6 +124,7 @@ class HRPMicroBirthPlanDataset( title = resources.getString(R.string.blood_donors_identified_1), arrayId = -1, required = true, + etMaxLength = 50, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) @@ -126,6 +134,7 @@ class HRPMicroBirthPlanDataset( title = resources.getString(R.string.blood_donors_identified_2), arrayId = -1, required = true, + etMaxLength = 50, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) @@ -135,6 +144,7 @@ class HRPMicroBirthPlanDataset( title = resources.getString(R.string.birth_companion), arrayId = -1, required = true, + etMaxLength = 50, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) @@ -144,6 +154,8 @@ class HRPMicroBirthPlanDataset( title = resources.getString(R.string.person_who_will_take_care_of_children_if_any_when_the_pw_is_admitted_for_delivery), arrayId = -1, required = true, + etMaxLength = 50, + etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) @@ -153,6 +165,7 @@ class HRPMicroBirthPlanDataset( title = resources.getString(R.string.name_of_vhsnd_community_member_for_support_during_emergency), arrayId = -1, required = true, + etMaxLength = 100, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) @@ -174,6 +187,7 @@ class HRPMicroBirthPlanDataset( title = resources.getString(R.string.mode_of_transportation_in_case_of_labour_pain), arrayId = -1, required = true, + etMaxLength = 100, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) private val usg = FormElement( @@ -182,6 +196,7 @@ class HRPMicroBirthPlanDataset( title = resources.getString(R.string.nearest_usg_centre), arrayId = -1, required = true, + etMaxLength = 100, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) @@ -193,6 +208,16 @@ class HRPMicroBirthPlanDataset( required = false ) + private val husbandName = FormElement( + id = 20, + inputType = InputType.EDIT_TEXT, + title = resources.getString(R.string.nearest_sc_hwc), + arrayId = -1, + required = true, + isEnabled = false, + etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS + ) + suspend fun setUpPage(ben: BenRegCache?, saved: HRPMicroBirthPlanCache?) { val list = mutableListOf( mbp_label, @@ -203,23 +228,27 @@ class HRPMicroBirthPlanDataset( scHosp, usg, block, + husbandName, bankac, nearestPhc, nearestFru, bloodDonors1, bloodDonors2, birthCompanion, -// careTaker, -// communityMember, -// communityMemberContact, + careTaker, + communityMember, + communityMemberContact, modeOfTransportation ) + + contactNumber1.value=ben?.contactNumber.toString() + husbandName.value= ben?.genDetails?.spouseName.toString() saved?.let { nearestSc.value = it.nearestSc bloodGroup.value = getLocalValueInArray(R.array.maternal_health_blood_group, it.bloodGroup) - contactNumber1.value = it.contactNumber1 + contactNumber1.value = ben?.contactNumber?.toString() contactNumber2.value = it.contactNumber2 scHosp.value = it.scHosp block.value = it.block diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/list/PregnantListFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/list/PregnantListFragment.kt index 725bad82c..b967e2d15 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/list/PregnantListFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/list/PregnantListFragment.kt @@ -1,5 +1,6 @@ package org.piramalswasthya.sakhi.ui.home_activity.cho.beneficiary.pregnant_women.list +import android.content.pm.ActivityInfo import android.os.Bundle import android.text.Editable import android.text.TextWatcher @@ -32,6 +33,7 @@ class PregnantListFragment : Fragment() { savedInstanceState: Bundle? ): View { _binding = FragmentDisplaySearchRvButtonBinding.inflate(layoutInflater, container, false) + requireActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); return binding.root } @@ -56,10 +58,20 @@ class PregnantListFragment : Fragment() { benId ) ) + }, + { _, benId -> + findNavController().navigate( + PregnantListFragmentDirections.actionPregnantListFragmentToHRPMicroBirthPlanTable( + benId + ) + ) }), + formButtonText = arrayOf( resources.getString(R.string.assess), - resources.getString(R.string.micro) + resources.getString(R.string.micro), + resources.getString(R.string.share), + ), role = 1 ) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan/HRPMicroBirthPlanViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan/HRPMicroBirthPlanViewModel.kt index d2563663d..ad71a3486 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan/HRPMicroBirthPlanViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan/HRPMicroBirthPlanViewModel.kt @@ -11,6 +11,7 @@ import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.launch import org.piramalswasthya.sakhi.configuration.HRPMicroBirthPlanDataset import org.piramalswasthya.sakhi.database.shared_preferences.PreferenceDao +import org.piramalswasthya.sakhi.model.BenRegGen import org.piramalswasthya.sakhi.model.HRPMicroBirthPlanCache import org.piramalswasthya.sakhi.repositories.BenRepo import org.piramalswasthya.sakhi.repositories.HRPRepo @@ -39,6 +40,11 @@ constructor( private val _benName = MutableLiveData() val benName: LiveData get() = _benName + + private var _benDetails =BenRegGen() + val benDetails: BenRegGen + get() = _benDetails + private val _benAgeGender = MutableLiveData() val benAgeGender: LiveData get() = _benAgeGender @@ -54,7 +60,7 @@ constructor( var isHighRisk: Boolean = false - private lateinit var microBirthPlanCache: HRPMicroBirthPlanCache + lateinit var _microBirthPlanCache: HRPMicroBirthPlanCache init { viewModelScope.launch { @@ -62,13 +68,14 @@ constructor( _benName.value = "${ben.firstName} ${if (ben.lastName == null) "" else ben.lastName}" _benAgeGender.value = "${ben.age} ${ben.ageUnit?.name} | ${ben.gender?.name}" - microBirthPlanCache = HRPMicroBirthPlanCache( + _benDetails= ben.genDetails!! + _microBirthPlanCache = HRPMicroBirthPlanCache( benId = ben.beneficiaryId, ) } hrpReo.getMicroBirthPlan(benId)?.let { - microBirthPlanCache = it + _microBirthPlanCache = it _recordExists.value = true } ?: run { _recordExists.value = false @@ -76,7 +83,7 @@ constructor( dataset.setUpPage( ben, - if (recordExists.value == true) microBirthPlanCache else null + if (recordExists.value == true) _microBirthPlanCache else null ) @@ -95,8 +102,8 @@ constructor( try { _state.postValue(State.SAVING) - dataset.mapValues(microBirthPlanCache, 1) - hrpReo.saveRecord(microBirthPlanCache) + dataset.mapValues(_microBirthPlanCache, 1) + hrpReo.saveRecord(_microBirthPlanCache) isHighRisk = true if (isHighRisk) { // save diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt new file mode 100644 index 000000000..e5be9bc5f --- /dev/null +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt @@ -0,0 +1,176 @@ +package org.piramalswasthya.sakhi.ui.home_activity.cho.beneficiary.pregnant_women.micro_birth_plan_table + +import android.annotation.SuppressLint +import android.content.ContentValues +import android.content.Intent +import android.content.pm.ActivityInfo +import android.graphics.Bitmap +import android.graphics.Canvas +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.os.Environment +import android.provider.MediaStore +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.lifecycle.lifecycleScope +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch +import org.piramalswasthya.sakhi.R +import org.piramalswasthya.sakhi.databinding.FragmentHRPMicroBirthPlanTableBinding +import org.piramalswasthya.sakhi.ui.home_activity.HomeActivity +import org.piramalswasthya.sakhi.ui.home_activity.cho.beneficiary.pregnant_women.micro_birth_plan.HRPMicroBirthPlanViewModel +import java.io.File +import java.io.FileOutputStream +import java.io.OutputStream + + +@AndroidEntryPoint +class HRPMicroBirthPlanTable : Fragment() { + + + private var _binding: FragmentHRPMicroBirthPlanTableBinding? = null + + private val binding: FragmentHRPMicroBirthPlanTableBinding + get() = _binding!! + + private val viewModel: HRPMicroBirthPlanViewModel by viewModels() + + + + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + + _binding = FragmentHRPMicroBirthPlanTableBinding.inflate(inflater, container, false) + requireActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + + return binding.root + } + + @SuppressLint("SetTextI18n") + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + + binding.btnShare.setOnClickListener { + val bitmap = getScreenShotFromView(binding.tableLayout) + if (bitmap != null) { + saveMediaToStorage(bitmap) + } + + } + + + viewModel.benName.observe(viewLifecycleOwner) { + binding.namePw.text = "${resources.getString(R.string.pw_name)} $it" + } + + + + viewModel.benAgeGender.observe(viewLifecycleOwner) { + binding.age.text = "${resources.getString(R.string.b_age)} $it" + } + + viewModel.recordExists.observe(viewLifecycleOwner) { + lifecycleScope.launch { + + if (viewModel._microBirthPlanCache != null){ + + binding.contactNo.text = "${resources.getString(R.string.c_no)} ${viewModel._microBirthPlanCache.contactNumber1}\n2- ${viewModel._microBirthPlanCache.contactNumber2}" + binding.scHwc.text = "${resources.getString(R.string.sc_hwc_tg_hosp)}:\n${viewModel._microBirthPlanCache.scHosp}" + binding.husbandName.text = "${resources.getString(R.string.husband_s_name)}:\n${viewModel.benDetails.spouseName}" + binding.lmp.text = "${resources.getString(R.string.lmp)}:\n${viewModel.benDetails.lastMenstrualPeriod}" + binding.nrScHwc.text = "${resources.getString(R.string.lmp)}:\n${viewModel._microBirthPlanCache.nearestSc}" + binding.block.text = "${resources.getString(R.string.block)}:\n${viewModel._microBirthPlanCache.block}" + binding.edd.text = "${resources.getString(R.string.edd)}:\n${viewModel.benDetails.marriageDate}" + binding.nrPhc.text = "${resources.getString(R.string.nearest_24x7_phc)}:\n${viewModel._microBirthPlanCache.nearestPhc}" + binding.bankAccNo.text = "${resources.getString(R.string.bank_acc_no)}:\n${viewModel._microBirthPlanCache.bankac}" + binding.nrFru.text = "${resources.getString(R.string.nearest_fru)}:\n${viewModel._microBirthPlanCache.nearestFru}" + binding.nrUsg.text = "${resources.getString(R.string.nearest_usg_centre)}:\n${viewModel._microBirthPlanCache.usg}" + binding.bloodGrp.text = "${resources.getString(R.string.blood_group)}:\n${viewModel._microBirthPlanCache.bloodGroup}" + binding.bloodDonr.text = "${resources.getString(R.string.b_blood_donor)} ${viewModel._microBirthPlanCache.bloodDonors1}\n2: " + "${viewModel._microBirthPlanCache.bloodDonors2}" + binding.birthComp.text = "${resources.getString(R.string.birth_companion)}:\n${viewModel._microBirthPlanCache.birthCompanion}" + binding.prsonTkCare.text = "${resources.getString(R.string.person_who_will_take_care_of_children_if_any_when_the_pw_is_admitted_for_delivery)}:\n${viewModel._microBirthPlanCache.careTaker}" + binding.nameOfContNo.text = "${resources.getString(R.string.name_of_vhsnd_community_member_for_support_during_emergency)}:\n${viewModel._microBirthPlanCache.communityMember}" + binding.modeOfTrasp.text = "${resources.getString(R.string.mode_of_transportation_in_case_of_labour_pain)}:\n${viewModel._microBirthPlanCache.modeOfTransportation}" + + } + + } + } + + + } + + override fun onStart() { + super.onStart() + activity?.let { + (it as HomeActivity).updateActionBar( + R.drawable.ic__pregnancy, + getString(R.string.micro_birth_plan) + ) + } + } + + private fun getScreenShotFromView(v: View): Bitmap? { + var screenshot: Bitmap? = null + try { + screenshot = Bitmap.createBitmap(v.measuredWidth, v.measuredHeight, Bitmap.Config.ARGB_8888) + val canvas = Canvas(screenshot) + v.draw(canvas) + } catch (e: Exception) { + + } + return screenshot + } + + private fun saveMediaToStorage(bitmap: Bitmap) { + val filename = "${System.currentTimeMillis()}.jpg" + var fos: OutputStream? = null + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + activity?.contentResolver?.also { resolver -> + + val contentValues = ContentValues().apply { + put(MediaStore.MediaColumns.DISPLAY_NAME, filename) + put(MediaStore.MediaColumns.MIME_TYPE, "image/jpg") + put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES) + } + + val imageUri: Uri? = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues) + shareImage(imageUri!!) + fos = imageUri?.let { resolver.openOutputStream(it) } + } + } else { + val imagesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + val image = File(imagesDir, filename) + var uriFile=Uri.fromFile(image) + shareImage(uriFile) + fos = FileOutputStream(image) + } + + fos?.use { + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, it) + Toast.makeText(activity , "Captured View and saved to Gallery" , Toast.LENGTH_SHORT).show() + } + } + + private fun shareImage(imageUri: Uri) { + + val intent = Intent(Intent.ACTION_SEND) + intent.putExtra(Intent.EXTRA_STREAM, imageUri) + intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.micro_birth_plan)) + intent.putExtra(Intent.EXTRA_SUBJECT, "Subject Here") + intent.setType("image/png") + startActivity(Intent.createChooser(intent, "Share Via")) + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/eligible_couple/tracking/form/EligibleCoupleTrackingFormFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/eligible_couple/tracking/form/EligibleCoupleTrackingFormFragment.kt index e53004017..ba9cd9624 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/eligible_couple/tracking/form/EligibleCoupleTrackingFormFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/eligible_couple/tracking/form/EligibleCoupleTrackingFormFragment.kt @@ -72,6 +72,7 @@ class EligibleCoupleTrackingFormFragment : Fragment() { EligibleCoupleTrackingFormViewModel.State.SAVE_SUCCESS -> { navigateToNextScreen() WorkerUtils.triggerAmritPushWorker(requireContext()) + } else -> {} diff --git a/app/src/main/res/drawable/border_line.xml b/app/src/main/res/drawable/border_line.xml new file mode 100644 index 000000000..b244d4105 --- /dev/null +++ b/app/src/main/res/drawable/border_line.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/horizontal_border.xml b/app/src/main/res/drawable/horizontal_border.xml new file mode 100644 index 000000000..8652ea651 --- /dev/null +++ b/app/src/main/res/drawable/horizontal_border.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_h_r_p_micro_birth_plan_table.xml b/app/src/main/res/layout/fragment_h_r_p_micro_birth_plan_table.xml new file mode 100644 index 000000000..a0a98944c --- /dev/null +++ b/app/src/main/res/layout/fragment_h_r_p_micro_birth_plan_table.xml @@ -0,0 +1,295 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_home.xml b/app/src/main/res/navigation/nav_home.xml index f26be3dba..4470c1435 100644 --- a/app/src/main/res/navigation/nav_home.xml +++ b/app/src/main/res/navigation/nav_home.xml @@ -937,7 +937,23 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-as/strings_hrp.xml b/app/src/main/res/values-as/strings_hrp.xml index b20ee614f..609d50840 100644 --- a/app/src/main/res/values-as/strings_hrp.xml +++ b/app/src/main/res/values-as/strings_hrp.xml @@ -38,6 +38,7 @@ অগৰ্ভৱতী মহিলাৰ উচ্চ বিপদজনক অৱস্থাৰ বাবে মূল্যায়ন কৰা শাৰীৰিক ৰূপ অনুসৰি ৰক্তহীনতাৰ দৃশ্যমান লক্ষণ ক্লিনিকেল মূল্যায়নৰ বাবে (ANM ৰ সৈতে পৰামৰ্শ কৰি পূৰণ কৰা হ’ব) + (এ এন এমৰ সৈতে পৰামৰ্শ কৰি পূৰণ কৰা হ’ব) উচ্চ ৰক্তচাপ ৰিস্কৰ অৱস্থা মিছড পিৰিয়ড @@ -53,6 +54,8 @@ ডেলিভাৰীৰ আনুমানিক তাৰিখ গৰ্ভৱতী মহিলাৰ উচ্চ বিপদজনক অৱস্থাৰ বাবে মূল্যায়ন কৰা PMSAৰ তারিখ + আৰ ডি ডেংগু + আৰ ডি ফিলাৰিয়া গৰ্ভাৱস্থাৰ ফলত হোৱা উচ্চ ৰক্তচাপ HIV/শিফিলিছ/হেপ B দোষ প্ৰদৰ্শন @@ -76,7 +79,7 @@ "দিন যোগ দি" অনুসৰণ ইতিহাস - মাইক্ৰ’ + মাইক্ৰ’ জন্ম পৰিকল্পনা 1ম এএনসি 1ম পিএমএসএমএ 2য় পিএমএসএমএ @@ -103,6 +106,13 @@ Issued quantity of IFA or Folic Acid supplement Using 75 gm OGTT After 2 Hours (mg/dL) + Pregnant Women (PW) section + Micro Birth Plan Table + Share + PW name: + Age: + Contact no:\n1- + Blood donor identified\n1: RBS diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b7773fb43..82567a0cb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -59,9 +59,6 @@ Advise the mother to provide extra warmth to the baby and feed the baby more frequently. If the baby (low birth weight or normal) is not gaining weight then refer to SNCU at the nearest health facility. - - - HomeActivity Navigation header @@ -166,8 +163,8 @@ Something went wrong !\nUnable to connect to server !\nTry again later! Try Again! APK Version 7.1.36 - - + + Enter PIN Sync in progress ... Full Name @@ -264,7 +261,7 @@ HBYC Hbyc Month List Immunization - + Pregnancy Registration Form ANC Visit Eligible Couple List @@ -280,22 +277,22 @@ Delivery Outcome List Infant Reg List Infant Reg - - + + Communicable Diseases Dashboard Sign In Service Location - - - - - - - - - + + + + + + + + + Save Successful Something wend wong! Contact testing! diff --git a/app/src/main/res/values/strings_hrp.xml b/app/src/main/res/values/strings_hrp.xml index 922601b43..8a086c5a3 100644 --- a/app/src/main/res/values/strings_hrp.xml +++ b/app/src/main/res/values/strings_hrp.xml @@ -79,7 +79,7 @@ "Visit On " Follow Up History - Micro + Micro Birth Plan 1st ANC 1st PMSMA 2nd PMSMA @@ -107,6 +107,13 @@ Using 75 gm OGTT After 2 Hours (mg/dL) Pregnant Women (PW) section + Micro Birth Plan Table + Share + PW name: + Age: + Contact no:\n1- + Blood donor identified\n1: + RBS diff --git a/build.gradle b/build.gradle index 293827ae1..6cc858346 100644 --- a/build.gradle +++ b/build.gradle @@ -13,9 +13,11 @@ buildscript { } } + + plugins { id 'com.android.application' version '8.0.0' apply false id 'com.android.library' version '8.0.0' apply false id 'org.jetbrains.kotlin.android' version '1.7.20' apply false id "com.google.dagger.hilt.android" version "2.42" apply false -} \ No newline at end of file +} diff --git a/settings.gradle b/settings.gradle index e7afc8526..7dc7adf05 100644 --- a/settings.gradle +++ b/settings.gradle @@ -3,6 +3,7 @@ pluginManagement { gradlePluginPortal() google() mavenCentral() + maven { url 'https://jitpack.io' } } } dependencyResolutionManagement { From 1a64fe7277a19145678ae82ad4a45c5f2d0c94da Mon Sep 17 00:00:00 2001 From: Ritik Date: Tue, 30 Jul 2024 16:44:16 +0530 Subject: [PATCH 021/892] Antra injection dose 1,2,3,4 add into ect module --- .../EligibleCoupleTrackingDataset.kt | 113 +++++++++++++----- .../res/values/strings_maternal_health.xml | 7 ++ 2 files changed, 87 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleTrackingDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleTrackingDataset.kt index 1cbb9d820..1fe44d080 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleTrackingDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleTrackingDataset.kt @@ -89,8 +89,19 @@ class EligibleCoupleTrackingDataset( ) - private val anyOtherMethod = FormElement( + private val antraDoses = FormElement( id = 9, + inputType = InputType.DROPDOWN, + title = "Antra injection", + arrayId = R.array.antra_doses, + entries = resources.getStringArray(R.array.antra_doses), + required = false, + hasDependants = true + + ) + + private val anyOtherMethod = FormElement( + id = 10, inputType = InputType.EDIT_TEXT, title = resources.getString(R.string.ectdset_other_mthd), required = true, @@ -164,11 +175,21 @@ class EligibleCoupleTrackingDataset( if (saved.methodOfContraception in resources.getStringArray(R.array.method_of_contraception)) { methodOfContraception.value = saved.methodOfContraception } else if (saved.methodOfContraception != null) { - methodOfContraception.value = - resources.getStringArray(R.array.method_of_contraception).last() - list.add(anyOtherMethod) - anyOtherMethod.value = saved.methodOfContraception + if (saved.methodOfContraception!!.split("/")[0] == resources.getStringArray(R.array.method_of_contraception)[1]) { + methodOfContraception.value = + resources.getStringArray(R.array.method_of_contraception)[1] + list.add(antraDoses) + antraDoses.value = saved.methodOfContraception!!.split("/")[1] + } + else { + methodOfContraception.value = + resources.getStringArray(R.array.method_of_contraception).last() + list.add(anyOtherMethod) + anyOtherMethod.value = saved.methodOfContraception + } + } + } } @@ -186,8 +207,7 @@ class EligibleCoupleTrackingDataset( } isPregnancyTestDone.id -> { isPregnant.isEnabled = true - if (isPregnant.value==resources.getStringArray(R.array.yes_no_donno)[0]) - { + if (isPregnant.value == resources.getStringArray(R.array.yes_no_donno)[0]) { triggerDependants( source = isPregnancyTestDone, passedIndex = index, @@ -195,8 +215,7 @@ class EligibleCoupleTrackingDataset( target = pregnancyTestResult ) } - else if (isPregnant.value==resources.getStringArray(R.array.yes_no_donno)[1]) - { + else if (isPregnant.value == resources.getStringArray(R.array.yes_no_donno)[1]) { triggerDependants( source = isPregnancyTestDone, passedIndex = index, @@ -208,11 +227,11 @@ class EligibleCoupleTrackingDataset( passedIndex = index, triggerIndex = 1, target = isPregnant, - targetSideEffect = listOf(isPregnant,usingFamilyPlanning,methodOfContraception) + targetSideEffect = listOf(isPregnant,usingFamilyPlanning,methodOfContraception,antraDoses,anyOtherMethod) ) } - else{ + else { triggerDependants( source = isPregnancyTestDone, passedIndex = index, @@ -224,7 +243,7 @@ class EligibleCoupleTrackingDataset( passedIndex = index, triggerIndex = 1, target = isPregnant, - targetSideEffect = listOf(isPregnant,usingFamilyPlanning,methodOfContraception) + targetSideEffect = listOf(isPregnant,usingFamilyPlanning,methodOfContraception,antraDoses,anyOtherMethod) ) } return 0 @@ -248,7 +267,7 @@ class EligibleCoupleTrackingDataset( passedIndex = index, triggerIndex = 1, target = usingFamilyPlanning, - targetSideEffect = listOf(usingFamilyPlanning,methodOfContraception) + targetSideEffect = listOf(usingFamilyPlanning,methodOfContraception,antraDoses,anyOtherMethod) ) } else if (pregnancyTestResult.value == resources.getStringArray(R.array.ectdset_po_neg)[1]) { @@ -259,14 +278,14 @@ class EligibleCoupleTrackingDataset( passedIndex = index, triggerIndex = 1, target = isPregnant, - targetSideEffect = listOf(isPregnant,usingFamilyPlanning,methodOfContraception, anyOtherMethod) + targetSideEffect = listOf(isPregnant,usingFamilyPlanning,methodOfContraception, anyOtherMethod,antraDoses) ) triggerDependants( source = isPregnant, passedIndex = index, triggerIndex = 1, target = usingFamilyPlanning, - targetSideEffect = listOf(methodOfContraception, anyOtherMethod) + targetSideEffect = listOf(methodOfContraception, anyOtherMethod,antraDoses) ) } @@ -279,33 +298,31 @@ class EligibleCoupleTrackingDataset( } isPregnant.id -> { - if (isPregnant.value==resources.getStringArray(R.array.yes_no_donno)[0]) - { + if (isPregnant.value == resources.getStringArray(R.array.yes_no_donno)[0]) { triggerDependants( source = isPregnant, passedIndex = index, triggerIndex = 1, target = usingFamilyPlanning, - targetSideEffect = listOf(methodOfContraception, anyOtherMethod) + targetSideEffect = listOf(methodOfContraception, anyOtherMethod,antraDoses) ) } - else if (isPregnant.value==resources.getStringArray(R.array.yes_no_donno)[1]) - { + else if (isPregnant.value == resources.getStringArray(R.array.yes_no_donno)[1]) { triggerDependants( source = isPregnant, passedIndex = index, triggerIndex = 1, target = usingFamilyPlanning, - targetSideEffect = listOf(methodOfContraception, anyOtherMethod) + targetSideEffect = listOf(methodOfContraception, anyOtherMethod,antraDoses) ) } - else{ + else { triggerDependants( source = isPregnant, passedIndex = index, triggerIndex = 2, target = usingFamilyPlanning, - targetSideEffect = listOf(methodOfContraception, anyOtherMethod) + targetSideEffect = listOf(methodOfContraception, anyOtherMethod,antraDoses) ) } return 0 @@ -319,17 +336,45 @@ class EligibleCoupleTrackingDataset( passedIndex = index, triggerIndex = 0, target = methodOfContraception, - targetSideEffect = listOf(anyOtherMethod) + targetSideEffect = listOf(anyOtherMethod,antraDoses) ) } methodOfContraception.id -> { - triggerDependants( - source = methodOfContraception, - passedIndex = index, - triggerIndex = methodOfContraception.entries!!.lastIndex, - target = anyOtherMethod - ) + + if (methodOfContraception.value == resources.getStringArray(R.array.method_of_contraception)[1]) { + triggerDependants( + source = methodOfContraception, + passedIndex = index, + triggerIndex = 1, + target = antraDoses + ) + triggerforHide( + source = methodOfContraception, + passedIndex = index, + triggerIndex = 1, + target = anyOtherMethod, + targetSideEffect = listOf(anyOtherMethod) + ) + } + else { + triggerDependants( + source = methodOfContraception, + passedIndex = index, + triggerIndex = methodOfContraception.entries!!.lastIndex, + target = anyOtherMethod + ) + triggerforHide( + source = methodOfContraception, + passedIndex = index, + triggerIndex = 1, + target = antraDoses, + targetSideEffect = listOf(antraDoses) + ) + } + + return 0 + } anyOtherMethod.id -> { @@ -346,13 +391,15 @@ class EligibleCoupleTrackingDataset( form.isPregnancyTestDone = isPregnancyTestDone.value form.pregnancyTestResult = pregnancyTestResult.value form.isPregnant = isPregnant.value - form.usingFamilyPlanning = - usingFamilyPlanning.value?.let { it == resources.getStringArray(R.array.yes_no)[0] } + form.usingFamilyPlanning = usingFamilyPlanning.value?.let { it == resources.getStringArray(R.array.yes_no)[0] } if (methodOfContraception.value == resources.getStringArray(R.array.method_of_contraception) .last() ) { form.methodOfContraception = anyOtherMethod.value - } else { + } else if (methodOfContraception.value == resources.getStringArray(R.array.method_of_contraception)[1]) { + form.methodOfContraception = "${methodOfContraception.value}/${antraDoses.value}" + } + else { form.methodOfContraception = methodOfContraception.value } } diff --git a/app/src/main/res/values/strings_maternal_health.xml b/app/src/main/res/values/strings_maternal_health.xml index 48faeec5a..f8be04b62 100644 --- a/app/src/main/res/values/strings_maternal_health.xml +++ b/app/src/main/res/values/strings_maternal_health.xml @@ -102,6 +102,13 @@ Any Other Method + + Dose 1 + Dose 2 + Dose 3 + Dose 4 + + Induced From bbbd109087687f02ac82fffda787205379ef510c Mon Sep 17 00:00:00 2001 From: Sushant Date: Wed, 31 Jul 2024 13:49:54 +0530 Subject: [PATCH 022/892] ABHA v3 M1 APIs Integrated --- .../org/piramalswasthya/sakhi/di/AppModule.kt | 3 +- .../sakhi/network/AbhaApiService.kt | 10 +- .../sakhi/network/JsonAdapters.kt | 111 +++++++++++++++++- .../sakhi/repositories/AbhaIdRepo.kt | 41 ++++++- .../aadhaar_id/AadhaarIdFragment.kt | 2 +- .../AadhaarNumberAshaFragment.kt | 22 +++- .../AadhaarNumberAshaViewModel.kt | 11 +- .../aadhaar_otp/AadhaarOtpFragment.kt | 41 +++++-- .../aadhaar_otp/AadhaarOtpViewModel.kt | 70 ++++++++++- .../VerifyMobileOtpViewModel.kt | 9 +- .../main/res/layout/fragment_aadhaar_id.xml | 2 +- .../layout/fragment_aadhaar_number_asha.xml | 48 +++++++- .../main/res/layout/fragment_aadhaar_otp.xml | 1 + app/src/main/res/navigation/nav_abha_id.xml | 9 ++ app/src/main/res/values/strings_abha.xml | 3 +- 15 files changed, 346 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt b/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt index aae90f64c..eab975c75 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt @@ -38,8 +38,9 @@ object AppModule { // Staging ABHA URL // private const val baseAbhaUrl = "https://healthidsbx.abdm.gov.in/api/" + private const val baseAbhaUrl = "https://abhasbx.abdm.gov.in/abha/api/" // Production ABHA URL - private const val baseAbhaUrl = "https://healthid.abdm.gov.in/api/" +// private const val baseAbhaUrl = "https://healthid.abdm.gov.in/api/" private val baseClient = OkHttpClient.Builder() diff --git a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt index 1a1c06c7f..f18b61113 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt @@ -29,7 +29,7 @@ interface AbhaApiService { suspend fun generateAadhaarOtpV2(@Body aadhaar: AbhaGenerateAadhaarOtpRequest): Response @POST("v3/enrollment/request/otp") - suspend fun generateAadhaarOtpV3(@Body aadhaar: AbhaGenerateAadhaarOtpRequest, @Header("REQUEST_ID") requestId: String, @Header("TIMESTAMP") timestamp: String): Response + suspend fun generateAadhaarOtpV3(@Body aadhaar: AbhaGenerateAadhaarOtpRequest, @Header("REQUEST-ID") requestId: String, @Header("TIMESTAMP") timestamp: String): Response @POST("v1/registration/aadhaar/resendAadhaarOtp") suspend fun resendAadhaarOtp(@Body aadhaar: AbhaResendAadhaarOtpRequest): Response @@ -37,6 +37,9 @@ interface AbhaApiService { @POST("v1/registration/aadhaar/verifyOTP") suspend fun verifyAadhaarOtp(@Body request: AbhaVerifyAadhaarOtpRequest): Response + @POST("v3/enrollment/enrol/byAadhaar") + suspend fun verifyAadhaarOtp3(@Body request: AbhaVerifyAadhaarOtpRequest, @Header("REQUEST-ID") requestId: String, @Header("TIMESTAMP") timestamp: String): Response + @POST("v1/registration/aadhaar/generateMobileOTP") suspend fun generateMobileOtp(@Body mobile: AbhaGenerateMobileOtpRequest): Response @@ -46,6 +49,9 @@ interface AbhaApiService { @POST("v1/registration/aadhaar/verifyMobileOTP") suspend fun verifyMobileOtp(@Body request: AbhaVerifyMobileOtpRequest): Response + @POST("v3/enrollment/auth/byAbdm") + suspend fun verifyMobileOtp3(@Body request: AbhaVerifyMobileOtpRequest, @Header("REQUEST-ID") requestId: String, @Header("TIMESTAMP") timestamp: String): Response + @POST("v1/registration/aadhaar/createHealthIdWithPreVerified") suspend fun createAbhaId(@Body request: CreateAbhaIdRequest): Response @@ -61,7 +67,7 @@ interface AbhaApiService { // Staging RES Encryption API @GET suspend fun getAuthCert( - @Url url: String = "https://healthidsbx.abdm.gov.in/api/v2/auth/cert" + @Url url: String = "https://healthidsbx.abdm.gov.in/api/v1/auth/cert" ): Response // Production RES Encryption API diff --git a/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt b/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt index 6505c45ad..0955b8569 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt @@ -120,9 +120,21 @@ data class AbhaTokenResponse( val tokenType: String ) +// ABHA v1/v2 request +//@JsonClass(generateAdapter = true) +//data class AbhaGenerateAadhaarOtpRequest( +// var aadhaar: String +//) + +// ABHA v3 request @JsonClass(generateAdapter = true) data class AbhaGenerateAadhaarOtpRequest( - var aadhaar: String +// var aadhaar: String + val txnId: String, + val scope: List, + val loginHint: String, + var loginId: String, + var otpSystem: String ) @JsonClass(generateAdapter = true) @@ -148,19 +160,85 @@ data class AbhaResendAadhaarOtpRequest( val txnId: String ) +// ABHA v1/v2 request +//@JsonClass(generateAdapter = true) +//data class AbhaVerifyAadhaarOtpRequest( +// val otp: String, +// val txnId: String +//) +// ABHA v3 request @JsonClass(generateAdapter = true) data class AbhaVerifyAadhaarOtpRequest( - val otp: String, - val txnId: String + val authData: AuthData, + val consent: Consent ) +@JsonClass(generateAdapter = true) +data class AuthData( + val authMethods: List, + val otp: Otp +) +@JsonClass(generateAdapter = true) +data class Consent( + val code: String, + val version: String +) + +@JsonClass(generateAdapter = true) +data class Otp( + var timeStamp: String, + val txnId: String, + var otpValue: String, + var mobile: String +) + +// ABHA v1/v2 request +//@JsonClass(generateAdapter = true) +//data class AbhaVerifyAadhaarOtpResponse( +// val txnId: String +//) + +// ABHA v3 request @JsonClass(generateAdapter = true) data class AbhaVerifyAadhaarOtpResponse( - val txnId: String + val message: String, + val txnId: String, + val tokens: Tokens, + val ABHAProfile: ABHAProfile, + val isNew: Boolean ) +@JsonClass(generateAdapter = true) +data class Tokens( + val token: String, + val expiresIn: Int, + val refreshToken: String, + val refreshExpiresIn: Int +) + +@JsonClass(generateAdapter = true) +data class ABHAProfile( + val firstName: String, + val middleName: String, + val lastName: String, + val dob: String, + val gender: String, + val photo: String, + val mobile: String? = null, + val email: String? = null, + val phrAddress: List, + val address: String, + val districtCode: String, + val stateCode: String, + val pinCode: String, + val abhaType: String, + val stateName: String, + val districtName: String, + val aBHANumber: String, + val abhaStatus: String +) @JsonClass(generateAdapter = true) data class AbhaGenerateMobileOtpRequest( @@ -179,10 +257,31 @@ data class AbhaCheckAndGenerateMobileOtpResponse( ) +// ABHA v1/v2 request +//@JsonClass(generateAdapter = true) +//data class AbhaVerifyMobileOtpRequest( +// val otp: String, +// val txnId: String +//) + +// ABHA v3 request @JsonClass(generateAdapter = true) data class AbhaVerifyMobileOtpRequest( - val otp: String, - val txnId: String + val scope: List, + val authData: AuthData2 +) + +@JsonClass(generateAdapter = true) +data class AuthData2( + val authMethods: List, + val otp: Otp2 +) + +@JsonClass(generateAdapter = true) +data class Otp2( + var timeStamp: String, + val txnId: String, + var otpValue: String ) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/repositories/AbhaIdRepo.kt b/app/src/main/java/org/piramalswasthya/sakhi/repositories/AbhaIdRepo.kt index 5d6a44188..6d7be52e2 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/repositories/AbhaIdRepo.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/repositories/AbhaIdRepo.kt @@ -39,6 +39,10 @@ import java.io.IOException import java.net.SocketTimeoutException import java.security.KeyFactory import java.security.spec.X509EncodedKeySpec +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale +import java.util.UUID import javax.crypto.Cipher import javax.inject.Inject @@ -129,8 +133,14 @@ class AbhaIdRepo @Inject constructor( suspend fun generateOtpForAadhaarV2(req: AbhaGenerateAadhaarOtpRequest): NetworkResult { return withContext(Dispatchers.IO) { try { - req.aadhaar = encryptData(req.aadhaar) - val response = abhaApiService.generateAadhaarOtpV2(req) + // ABHA v1/v2 encryption technique +// req.aadhaar = encryptData(req.aadhaar) + // ABHA v3 encryption technique + req.loginId = encryptData(req.loginId) + // ABHA v1/v2 API +// val response = abhaApiService.generateAadhaarOtpV2(req) + // ABHA v3 API + val response = abhaApiService.generateAadhaarOtpV3(req, generateUUID(), getCurrentTimestamp()) if (response.isSuccessful) { val responseBody = response.body()?.string() val result = @@ -152,6 +162,14 @@ class AbhaIdRepo @Inject constructor( } } + private fun generateUUID(): String { + return UUID.randomUUID().toString() + } + + private fun getCurrentTimestamp(): String { + return SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH).format(Date()) as String + } + private fun encryptData(txt: String): String { var encryptedTextBase64 = "" val publicKeyString = prefDao.getPublicKeyForAbha()!! @@ -162,7 +180,10 @@ class AbhaIdRepo @Inject constructor( val publicKeySpec = X509EncodedKeySpec(publicKeyBytes) val publicKey = keyFactory.generatePublic(publicKeySpec) - val cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding") + // Cipher used in ABHA v1/v2 APIs +// val cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding") + // Cipher used in ABHA v3 APIs + val cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding") cipher.init(Cipher.ENCRYPT_MODE, publicKey) val encryptedText = cipher.doFinal(txt.toByteArray()) encryptedTextBase64 = @@ -201,7 +222,12 @@ class AbhaIdRepo @Inject constructor( suspend fun verifyOtpForAadhaar(req: AbhaVerifyAadhaarOtpRequest): NetworkResult { return withContext(Dispatchers.IO) { try { - val response = abhaApiService.verifyAadhaarOtp(req) + req.authData.otp.otpValue = encryptData(req.authData.otp.otpValue) + req.authData.otp.timeStamp = getCurrentTimestamp() + // ABHA v1/v2 API +// val response = abhaApiService.verifyAadhaarOtp(req) + // ABHA v3 API + val response = abhaApiService.verifyAadhaarOtp3(req, generateUUID(), getCurrentTimestamp()) if (response.isSuccessful) { val responseBody = response.body()?.string() val result = @@ -255,7 +281,12 @@ class AbhaIdRepo @Inject constructor( suspend fun verifyOtpForMobileNumber(req: AbhaVerifyMobileOtpRequest): NetworkResult { return withContext(Dispatchers.IO) { try { - val response = abhaApiService.verifyMobileOtp(req) + req.authData.otp.otpValue = encryptData(req.authData.otp.otpValue) + req.authData.otp.timeStamp = getCurrentTimestamp() + // ABHA v1/v2 API +// val response = abhaApiService.verifyMobileOtp(req) + // ABHA v3 API + val response = abhaApiService.verifyMobileOtp3(req, generateUUID(), getCurrentTimestamp()) if (response.isSuccessful) { val responseBody = response.body()?.string() val result = diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/AadhaarIdFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/AadhaarIdFragment.kt index 4e1181077..9e99a0603 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/AadhaarIdFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/AadhaarIdFragment.kt @@ -108,7 +108,7 @@ class AadhaarIdFragment : Fragment() { } else if (viewModel.verificationType.value == "FP") { findNavController().navigate( AadhaarIdFragmentDirections.actionAadhaarIdFragmentToGenerateMobileOtpFragment( - viewModel.txnId + viewModel.txnId, viewModel.mobileNumber ) ) } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/aadhaar_num_asha/AadhaarNumberAshaFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/aadhaar_num_asha/AadhaarNumberAshaFragment.kt index 0e3b9aab5..7abea720d 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/aadhaar_num_asha/AadhaarNumberAshaFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/aadhaar_num_asha/AadhaarNumberAshaFragment.kt @@ -76,6 +76,7 @@ class AadhaarNumberAshaFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) var isValidAadhaar = false + var isValidMobile = false parentViewModel.verificationType.observe(viewLifecycleOwner) { when (it) { @@ -127,7 +128,7 @@ class AadhaarNumberAshaFragment : Fragment() { } binding.aadharConsentCheckBox.setOnCheckedChangeListener { _, ischecked -> - binding.btnVerifyAadhaar.isEnabled = isValidAadhaar && ischecked + binding.btnVerifyAadhaar.isEnabled = isValidAadhaar && isValidMobile && ischecked } binding.aadharDisclaimer.setOnClickListener { @@ -143,7 +144,24 @@ class AadhaarNumberAshaFragment : Fragment() { override fun afterTextChanged(s: Editable?) { isValidAadhaar = (s != null) && (s.length == 12) - binding.btnVerifyAadhaar.isEnabled = isValidAadhaar + binding.btnVerifyAadhaar.isEnabled = isValidAadhaar && isValidMobile + && binding.aadharConsentCheckBox.isChecked + } + + }) + + binding.tietMobileNumber.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { + } + + override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { + } + + override fun afterTextChanged(s: Editable?) { + isValidMobile = (s != null) && (s.length == 10) + if (isValidMobile) + parentViewModel.setMobileNumber(s.toString()) + binding.btnVerifyAadhaar.isEnabled = isValidAadhaar && isValidMobile && binding.aadharConsentCheckBox.isChecked } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/aadhaar_num_asha/AadhaarNumberAshaViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/aadhaar_num_asha/AadhaarNumberAshaViewModel.kt index a95fc6365..82119040b 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/aadhaar_num_asha/AadhaarNumberAshaViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/aadhaar_num_asha/AadhaarNumberAshaViewModel.kt @@ -64,10 +64,17 @@ class AadhaarNumberAshaViewModel @Inject constructor( private fun generateAadhaarOtp(aadhaarNo: String) { viewModelScope.launch { when (val result = - abhaIdRepo.generateOtpForAadhaarV2(AbhaGenerateAadhaarOtpRequest(aadhaarNo))) { +// abhaIdRepo.generateOtpForAadhaarV2(AbhaGenerateAadhaarOtpRequest(aadhaarNo))) { + abhaIdRepo.generateOtpForAadhaarV2(AbhaGenerateAadhaarOtpRequest( + "", + listOf("abha-enrol"), + "aadhaar", + aadhaarNo, + "aadhaar" + ))) { is NetworkResult.Success -> { _txnId.value = result.data.txnId - _mobileNumber.value = result.data.mobileNumber +// _mobileNumber.value = result.data.mobileNumber _state.value = AadhaarIdViewModel.State.SUCCESS } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt index 59bb70401..9194b5683 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt @@ -15,7 +15,9 @@ import dagger.hilt.android.AndroidEntryPoint import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.databinding.FragmentAadhaarOtpBinding import org.piramalswasthya.sakhi.ui.abha_id_activity.AbhaIdActivity +import org.piramalswasthya.sakhi.ui.abha_id_activity.aadhaar_id.AadhaarIdViewModel import org.piramalswasthya.sakhi.ui.abha_id_activity.aadhaar_otp.AadhaarOtpViewModel.State +import org.piramalswasthya.sakhi.ui.abha_id_activity.generate_mobile_otp.GenerateMobileOtpFragmentDirections @AndroidEntryPoint class AadhaarOtpFragment : Fragment() { @@ -26,6 +28,8 @@ class AadhaarOtpFragment : Fragment() { private val viewModel: AadhaarOtpViewModel by viewModels() + private val parentViewModel: AadhaarIdViewModel by viewModels({ requireActivity() }) + val args: AadhaarOtpFragmentArgs by lazy { AadhaarOtpFragmentArgs.fromBundle(requireArguments()) } @@ -56,7 +60,7 @@ class AadhaarOtpFragment : Fragment() { super.onViewCreated(view, savedInstanceState) startResendTimer() binding.btnVerifyOTP.setOnClickListener { - viewModel.verifyOtpClicked(binding.tietAadhaarOtp.text.toString()) + viewModel.verifyOtpClicked(binding.tietAadhaarOtp.text.toString(), parentViewModel.mobileNumber) } binding.resendOtp.setOnClickListener { viewModel.resendOtp() @@ -94,11 +98,11 @@ class AadhaarOtpFragment : Fragment() { viewModel.state.observe(viewLifecycleOwner) { state -> when (state!!) { State.IDLE -> { - binding.tvOtpMsg.text = String.format( - "%s%s", - resources.getString(R.string.otp_sent_to), - args.mobileNumber - ) +// binding.tvOtpMsg.text = String.format( +// "%s%s", +// resources.getString(R.string.otp_sent_to), +// args.mobileNumber +// ) binding.tvOtpMsg.visibility = View.VISIBLE } @@ -109,9 +113,22 @@ class AadhaarOtpFragment : Fragment() { } State.OTP_VERIFY_SUCCESS -> { + if (parentViewModel.mobileNumber == viewModel.mobileNumber) { + findNavController().navigate( + AadhaarOtpFragmentDirections.actionAadhaarOtpFragmentToCreateAbhaFragment( + viewModel.txnId + ) + ) + } else { + viewModel.generateOtpClicked() + } + viewModel.resetState() + } + + State.SUCCESS -> { findNavController().navigate( - AadhaarOtpFragmentDirections.actionAadhaarOtpFragmentToGenerateMobileOtpFragment( - viewModel.txnId + AadhaarOtpFragmentDirections.actionAadhaarOtpFragmentToVerifyMobileOtpFragment( + viewModel.txnId, viewModel.mobileNumber ) ) viewModel.resetState() @@ -151,6 +168,14 @@ class AadhaarOtpFragment : Fragment() { viewModel.resetErrorMessage() } } + + // Mobile Number observation for ABHA v1 +// viewModel.mobileNumber.observe(viewLifecycleOwner) { +// it?.let { +// parentViewModel.setMobileNumber(it) +// } +// } + } private fun startResendTimer() { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt index ada7d81c7..e2ba515d4 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt @@ -7,10 +7,16 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch +import org.piramalswasthya.sakhi.network.AbhaGenerateAadhaarOtpRequest import org.piramalswasthya.sakhi.network.AbhaResendAadhaarOtpRequest import org.piramalswasthya.sakhi.network.AbhaVerifyAadhaarOtpRequest +import org.piramalswasthya.sakhi.network.AuthData +import org.piramalswasthya.sakhi.network.Consent import org.piramalswasthya.sakhi.network.NetworkResult +import org.piramalswasthya.sakhi.network.Otp import org.piramalswasthya.sakhi.repositories.AbhaIdRepo +import org.piramalswasthya.sakhi.ui.abha_id_activity.aadhaar_id.AadhaarIdViewModel +import timber.log.Timber import javax.inject.Inject @HiltViewModel @@ -24,11 +30,13 @@ class AadhaarOtpViewModel @Inject constructor( LOADING, ERROR_SERVER, ERROR_NETWORK, + SUCCESS, OTP_VERIFY_SUCCESS, OTP_GENERATED_SUCCESS } private var txnIdFromArgs = AadhaarOtpFragmentArgs.fromSavedStateHandle(savedStateHandle).txnId + private var mobileFromArgs = AadhaarOtpFragmentArgs.fromSavedStateHandle(savedStateHandle).mobileNumber private val _state = MutableLiveData(State.IDLE) val state: LiveData get() = _state @@ -45,9 +53,13 @@ class AadhaarOtpViewModel @Inject constructor( val txnId: String get() = _txnId!! - fun verifyOtpClicked(otp: String) { + private var _mobileNumber: String? = null + val mobileNumber: String + get() = _mobileNumber!! + + fun verifyOtpClicked(otp: String, mobile: String) { _state.value = State.LOADING - verifyAadhaarOtp(otp) + verifyAadhaarOtp(otp, mobile) } fun resetState() { @@ -58,17 +70,29 @@ class AadhaarOtpViewModel @Inject constructor( _errorMessage.value = null } - private fun verifyAadhaarOtp(otp: String) { + private fun verifyAadhaarOtp(otp: String, mobile: String) { viewModelScope.launch { val result = abhaIdRepo.verifyOtpForAadhaar( AbhaVerifyAadhaarOtpRequest( - otp, - txnIdFromArgs + AuthData( + listOf("otp"), + Otp( + "", + txnIdFromArgs, + otp, + mobile + ) + ), + Consent( + "abha-enrollment", + "1.4" + ) ) ) when (result) { is NetworkResult.Success -> { _txnId = result.data.txnId + _mobileNumber = result.data.ABHAProfile.mobile _state.value = State.OTP_VERIFY_SUCCESS } @@ -88,6 +112,42 @@ class AadhaarOtpViewModel @Inject constructor( } } + fun generateOtpClicked() { + _state.value = State.LOADING + generateAadhaarOtp() + } + + private fun generateAadhaarOtp() { + viewModelScope.launch { + when (val result = +// abhaIdRepo.generateOtpForAadhaarV2(AbhaGenerateAadhaarOtpRequest(aadhaarNo))) { + abhaIdRepo.generateOtpForAadhaarV2( + AbhaGenerateAadhaarOtpRequest( + txnId, + listOf("abha-enrol", "mobile-verify"), + "mobile", + mobileFromArgs, + "abdm" + ) + )) { + is NetworkResult.Success -> { + _txnId = result.data.txnId + _state.value = State.SUCCESS + } + + is NetworkResult.Error -> { + _errorMessage.value = result.message + _state.value = State.ERROR_SERVER + } + + is NetworkResult.NetworkError -> { + Timber.i(result.toString()) + _state.value = State.ERROR_NETWORK + } + } + } + } + fun resendOtp() { _state.value = State.LOADING viewModelScope.launch { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/verify_mobile_otp/VerifyMobileOtpViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/verify_mobile_otp/VerifyMobileOtpViewModel.kt index 15e5bdd85..b071970b7 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/verify_mobile_otp/VerifyMobileOtpViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/verify_mobile_otp/VerifyMobileOtpViewModel.kt @@ -9,9 +9,11 @@ import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import org.piramalswasthya.sakhi.network.AbhaGenerateMobileOtpRequest import org.piramalswasthya.sakhi.network.AbhaVerifyMobileOtpRequest +import org.piramalswasthya.sakhi.network.AuthData2 import org.piramalswasthya.sakhi.network.CreateAbhaIdRequest import org.piramalswasthya.sakhi.network.CreateAbhaIdResponse import org.piramalswasthya.sakhi.network.NetworkResult +import org.piramalswasthya.sakhi.network.Otp2 import org.piramalswasthya.sakhi.network.interceptors.TokenInsertAbhaInterceptor import org.piramalswasthya.sakhi.repositories.AbhaIdRepo import javax.inject.Inject @@ -72,8 +74,11 @@ class VerifyMobileOtpViewModel @Inject constructor( viewModelScope.launch { val result = abhaIdRepo.verifyOtpForMobileNumber( AbhaVerifyMobileOtpRequest( - otp, - txnIdFromArgs + listOf("abha-enrol", "mobile-verify"), + AuthData2( + listOf("otp"), + Otp2("timestamp", txnIdFromArgs, otp) + ) ) ) when (result) { diff --git a/app/src/main/res/layout/fragment_aadhaar_id.xml b/app/src/main/res/layout/fragment_aadhaar_id.xml index c9cfe3316..2782fd457 100644 --- a/app/src/main/res/layout/fragment_aadhaar_id.xml +++ b/app/src/main/res/layout/fragment_aadhaar_id.xml @@ -34,7 +34,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:orientation="vertical" - app:layout_constraintHeight_percent=".75" + app:layout_constraintHeight_percent=".9" > + + + + + + + + + + app:layout_constraintTop_toBottomOf="@+id/til_mobile_number" /> + + @@ -48,6 +54,9 @@ + diff --git a/app/src/main/res/values/strings_abha.xml b/app/src/main/res/values/strings_abha.xml index d5dd1ddf0..ebc903a50 100644 --- a/app/src/main/res/values/strings_abha.xml +++ b/app/src/main/res/values/strings_abha.xml @@ -51,7 +51,8 @@ Individual’s consent for creation of ABHA Number. Validate FP Generating ABHA for: - "OTP sent to " + + "OTP sent to Aadhaar linked mobile number" OTP was resent. Do you want to go back? Downloading abha card From 9a078a392be4fbf5d614ca24d1b87248a1848934 Mon Sep 17 00:00:00 2001 From: Sushant Date: Wed, 31 Jul 2024 18:19:44 +0530 Subject: [PATCH 023/892] Updated gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 754ddaff4..624db1d6d 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,6 @@ *.lock /app/build/* /app/release/* +local.properties +secrets.properties +/app/google-services.json \ No newline at end of file From c9741c4e51c5ee65a25651542fbff39e83898d77 Mon Sep 17 00:00:00 2001 From: Ritik Date: Thu, 1 Aug 2024 12:25:46 +0530 Subject: [PATCH 024/892] assamese language translation --- app/src/main/res/values-as/strings_ben.xml | 6 ++ .../res/values-as/strings_death_reports.xml | 6 ++ app/src/main/res/values-as/strings_ecr.xml | 64 +++++++++++++++++++ app/src/main/res/values-as/strings_ect.xml | 11 ++++ app/src/main/res/values-as/strings_hh.xml | 11 ++-- app/src/main/res/values-as/strings_home.xml | 27 +++++--- app/src/main/res/values-as/strings_hrp.xml | 24 ++++--- .../res/values-as/strings_immunization.xml | 15 +++++ .../main/res/values-as/strings_incentives.xml | 14 +++- app/src/main/res/values-as/strings_kid.xml | 6 ++ .../res/values-as/strings_maternal_health.xml | 9 +++ app/src/main/res/values-hi/strings_pwr.xml | 32 ++++++++++ app/src/main/res/values/strings_home.xml | 7 +- 13 files changed, 202 insertions(+), 30 deletions(-) create mode 100644 app/src/main/res/values-as/strings_death_reports.xml create mode 100644 app/src/main/res/values-as/strings_ecr.xml create mode 100644 app/src/main/res/values-as/strings_ect.xml create mode 100644 app/src/main/res/values-as/strings_immunization.xml create mode 100644 app/src/main/res/values-hi/strings_pwr.xml diff --git a/app/src/main/res/values-as/strings_ben.xml b/app/src/main/res/values-as/strings_ben.xml index d392e38be..cf4419a33 100644 --- a/app/src/main/res/values-as/strings_ben.xml +++ b/app/src/main/res/values-as/strings_ben.xml @@ -203,4 +203,10 @@ হয় + বছৰ + বছৰবোৰ + মাহ + মাহ + দিন + দিন diff --git a/app/src/main/res/values-as/strings_death_reports.xml b/app/src/main/res/values-as/strings_death_reports.xml new file mode 100644 index 000000000..6d18679c1 --- /dev/null +++ b/app/src/main/res/values-as/strings_death_reports.xml @@ -0,0 +1,6 @@ + + + চিডিআৰ ফৰ্ম + মাতৃৰ + অমাতৃৰ + \ No newline at end of file diff --git a/app/src/main/res/values-as/strings_ecr.xml b/app/src/main/res/values-as/strings_ecr.xml new file mode 100644 index 000000000..534d1dad4 --- /dev/null +++ b/app/src/main/res/values-as/strings_ecr.xml @@ -0,0 +1,64 @@ + + + পঞ্জীয়নৰ তাৰিখ + মহিলাৰ আৰ চি এইচ আই ডি নং + মহিলাৰ নাম + স্বামীৰ নাম + মহিলাৰ বৰ্তমান বয়স + বিবাহৰ সময়ত মহিলাৰ বয়স + মহিলাৰ সবিশেষ + আধাৰ মহিলাৰ সংখ্যা + বেংক এচি নং বা ডাকঘৰৰ এচি নং + বেংকৰ নাম + শাখাৰ নাম + আই এফ এছ চি ক\'ড + জন্ম হোৱা শিশুৰ মুঠ সংখ্যা + জীৱন্ত শিশুৰ সংখ্যা + পুৰুষ + মহিলা + ১ম শিশুৰ সবিশেষ + ১ম সন্তান জন্ম তাৰিখ + ১ম শিশু বয়স ( বছৰত) + ১ম শিশুৰ যৌন সম্পৰ্ক + বিবাহৰ তাৰিখ আৰু ১ম সন্তানৰ মাজৰ ব্যৱধান + ২য় শিশুৰ সবিশেষ + ২য় সন্তান জন্ম তাৰিখ + ২য় শিশু বয়স ( বছৰত) + ২য় শিশুৰ যৌন সম্পৰ্ক + ১ম শিশু আৰু ২য় শিশুৰ মাজৰ ব্যৱধান + ৩য় শিশুৰ সবিশেষ + তৃতীয় সন্তান জন্ম তাৰিখ + ৩য় শিশু বয়স ( বছৰত) + ৩য় শিশুৰ যৌন সম্পৰ্ক + ২য় সন্তান আৰু ৩য় সন্তানৰ মাজৰ ব্যৱধান + ৪ৰ্থ শিশুৰ সবিশেষ + ৪ৰ্থ সন্তান জন্ম তাৰিখ + ৪ৰ্থ শিশু বয়স ( বছৰত) + ৪ৰ্থ শিশুৰ যৌন সম্পৰ্ক + ৩য় শিশু আৰু ৪ৰ্থ শিশুৰ মাজৰ ব্যৱধান + ৫ম শিশুৰ সবিশেষ + ৫ম সন্তান জন্ম তাৰিখ + ৫ম শিশু বয়স ( বছৰত) + ৫ম শিশুৰ যৌন সম্পৰ্ক + ৪ৰ্থ শিশু আৰু ৫ম শিশুৰ মাজৰ ব্যৱধান + ৬ষ্ঠ শিশুৰ সবিশেষ + ৬ষ্ঠ সন্তান জন্ম তাৰিখ + ৬ষ্ঠ শিশু বয়স ( বছৰত) + ৬ষ্ঠ শিশুৰ যৌন সম্পৰ্ক + ৫ম শিশু আৰু ৬ষ্ঠ শিশুৰ মাজৰ ব্যৱধান + ৭ম শিশুৰ সবিশেষ + ৭ম সন্তান জন্ম তাৰিখ + ৭ম শিশু বয়স ( বছৰত) + ৭ম শিশুৰ যৌন সম্পৰ্ক + ৬ষ্ঠ সন্তান আৰু ৭ম শিশুৰ মাজৰ ব্যৱধান + ৮ম শিশুৰ সবিশেষ + ৮ম সন্তান জন্ম তাৰিখ + ৮ম শিশু বয়স ( বছৰত) + ৮ম শিশুৰ যৌন সম্পৰ্ক + ৭ম শিশু আৰু ৮ম শিশুৰ মাজৰ ব্যৱধান + নৱম শিশুৰ সবিশেষ + নৱম সন্তান জন্ম তাৰিখ + নৱম শিশু বয়স ( বছৰত) + ৯ম শিশুৰ যৌন সম্পৰ্ক + ৮ম শিশু আৰু ৯ম শিশুৰ মাজৰ ব্যৱধান + \ No newline at end of file diff --git a/app/src/main/res/values-as/strings_ect.xml b/app/src/main/res/values-as/strings_ect.xml new file mode 100644 index 000000000..97928d4d5 --- /dev/null +++ b/app/src/main/res/values-as/strings_ect.xml @@ -0,0 +1,11 @@ + + + বিত্তীয় বৰ্ষ + মাহ + গৰ্ভাৱস্থা পৰীক্ষা কৰা হয়নে? + গৰ্ভাৱস্থা পৰীক্ষাৰ ফলাফল + মহিলাগৰাকী গৰ্ভৱতী নেকি? + আপুনি পৰিয়াল পৰিকল্পনা পদ্ধতি ব্যৱহাৰ কৰিছেনে? + গৰ্ভনিৰোধৰ পদ্ধতি + অন্য যিকোনো পদ্ধতি + \ No newline at end of file diff --git a/app/src/main/res/values-as/strings_hh.xml b/app/src/main/res/values-as/strings_hh.xml index 5a5c901b7..754fd6e40 100644 --- a/app/src/main/res/values-as/strings_hh.xml +++ b/app/src/main/res/values-as/strings_hh.xml @@ -133,13 +133,14 @@ @string/nhhr_avail_toilet_6 আৱাসিক এলেকাৰ প্ৰকাৰ দাখিল কৰক - Other Type of fuel used for Cooking - Other Primary Source of Water - Other availability of Electricity - Other Availability of Toilet + অন্যান্য ৰন্ধা-বঢ়াৰ বাবে ব্যৱহাৰ কৰা ইন্ধনৰ প্ৰকাৰ + পানীৰ অন্যান্য প্ৰাথমিক উৎস + বিদ্যুতৰ অন্যান্য উপলব্ধতা + শৌচাগাৰৰ অন্যান্য উপলব্ধতা হিতাধিকাৰীৰ পঞ্জীকৰন জাৰি ৰাখক অনুগ্ৰহ কৰি সম্মতি পত্ৰ পৰীক্ষা কৰক - ADD Head-of-Family + এডিডি পৰিয়ালৰ মুৰব্বী + ঘৰুৱা খালী! Would you like to add %1s as a Head-of-Family Beneficiary? diff --git a/app/src/main/res/values-as/strings_home.xml b/app/src/main/res/values-as/strings_home.xml index 45286946d..812f64b4e 100644 --- a/app/src/main/res/values-as/strings_home.xml +++ b/app/src/main/res/values-as/strings_home.xml @@ -1,9 +1,9 @@ + ঘৰ ঘৰ সূচীকাৰক - সমস্ত পাৰিবাৰিক তালিকা সমস্ত হিতাধিকাৰীৰ তালিকা উপযুক্ত দম্পতিৰ তালিকা @@ -20,6 +20,14 @@ নৱজাতকৰ তালিকা শিশুৰ তালিকা কিশোৰ তালিকা + গৰ্ভৱতী মহিলাৰ পঞ্জীয়ন + এ এন চি ভ্ৰমণ + পিএমএছএমএ + ডেলিভাৰীৰ ফলাফল + শিশুৰ পঞ্জীয়ন + শিশু পঞ্জীয়ন + যোগ্য দম্পতী পঞ্জীয়ন + যোগ্য দম্পতী অনুসৰণ প্ৰসবাৱস্থাৰ তালিকা প্ৰসৱোত্তৰ মাত্ৰীৰ তালিকা প্ৰজননৰ আয়ুস তালিকা @@ -30,15 +38,18 @@ জৰীপ পঞ্জী টি.বি. স্ক্ৰীনিং সন্দেহিত টি.বি. মৰাত কেছব -উচ্চ ঝুঁকি\nগর্ভবতী মহিলা -উচ্চ ঝুঁকি\nগর্ভাবস্থা নহয়ে মহিলা -উচ্চ ঝুঁকি মূল্যায়ন কৰক -উচ্চ ঝুঁকি অনুসৰণ কৰক -উচ্চ ঝুঁকি মূল্যায়ন কৰক -উচ্চ ঝুঁকি নহয়ে গৰ্ভাবস্থা নহয়ে মহিলা অনুসৰণ কৰক - + উচ্চ ঝুঁকি\nগর্ভবতী মহিলা + উচ্চ ঝুঁকি\nগর্ভাবস্থা নহয়ে মহিলা + উচ্চ ঝুঁকি মূল্যায়ন কৰক + উচ্চ ঝুঁকি অনুসৰণ কৰক + উচ্চ ঝুঁকি মূল্যায়ন কৰক + উচ্চ ঝুঁকি নহয়ে গৰ্ভাবস্থা নহয়ে মহিলা অনুসৰণ কৰক %1d%% ডাউনলোড হৈছে অবৈধ ব্যৱহাৰকাৰীনাম / পাছৱৰ্ড! সাৰ্ভাৰ সময় অতিবাহিত, পুনৰ চেষ্টা কৰক! নেটওৱাৰ্কলৈ সংযোগ কৰিব পৰা হোৱা নাই! + প্ৰক্ৰিয়াকৃত নহয় + সকলো ৰেকৰ্ড ছিংক কৰা হৈছে + আপুনি নিশ্চিতভাৱে লগআউট কৰিবনে? + \ No newline at end of file diff --git a/app/src/main/res/values-as/strings_hrp.xml b/app/src/main/res/values-as/strings_hrp.xml index b20ee614f..b6d548cff 100644 --- a/app/src/main/res/values-as/strings_hrp.xml +++ b/app/src/main/res/values-as/strings_hrp.xml @@ -90,19 +90,19 @@ High risk conditions Beneficiaries ৰক্তচাপ (BP) - Systolic (mm Hg) - Diastolic (mm Hg) - Blood Glucose (Sugar) Test - Random blood Sugar (RBG) (mg/dL) - Fasting Blood Sugar Test (FBG) (mg/dL) - Post-Prandial Blood Sugar Test (PPBG) (mg/dL) + চিষ্টোলিক (মিমি Hg) + ডায়েষ্টোলিক (মিমি Hg) + তেজৰ গ্লুক’জ (চেনি) পৰীক্ষা + ৰেণ্ডম ব্লাড চুগাৰ (RBG) (mg/dL) + উপবাসৰ সময়ত তেজৰ চেনি পৰীক্ষা (FBG) (mg/dL) + খাদ্যৰ পিছৰ তেজৰ চেনি পৰীক্ষা (PPBG) (mg/dL) হিম’গ্লবিন (Hb) পৰীক্ষা (g/dl) আই এফ এ পৰিপূৰক প্ৰদান কৰা হৈছেনে? আই এফ এৰ পৰিপূৰক জাৰি কৰা পৰিমাণ - Whether IFA or Folic Acid supplement is provided? - Issued quantity of IFA or Folic Acid supplement - Using 75 gm OGTT - After 2 Hours (mg/dL) + আই এফ এ বা ফলিক এচিডৰ পৰিপূৰক দিয়া হয় নেকি? + জাৰি কৰা পৰিমাণৰ আই এফ এ বা ফলিক এচিড পৰিপূৰক + ৭৫ গ্ৰাম অ’জিটিটি ব্যৱহাৰ কৰি + ২ ঘণ্টাৰ পিছত (mg/dL) RBS @@ -114,4 +114,8 @@ FBS & PPBS OGTT + (এএনএমৰ সৈতে পৰামৰ্শ কৰি পূৰণ কৰা হ’ব) + আৰ ডি ডেংগু + আৰ ডি ফিলাৰিয়া + গৰ্ভৱতী মহিলা (PW) অংশ \ No newline at end of file diff --git a/app/src/main/res/values-as/strings_immunization.xml b/app/src/main/res/values-as/strings_immunization.xml new file mode 100644 index 000000000..4856ceae3 --- /dev/null +++ b/app/src/main/res/values-as/strings_immunization.xml @@ -0,0 +1,15 @@ + + + নাম + শেষ টিকাকৰণৰ তাৰিখ + গ্ৰহণ কৰা মাত্ৰাৰ সংখ্যা + বৰ্তমান ভেকচিনৰ সবিশেষ + ভেকচিনৰ নাম + ড’জ নম্বৰ + আশা কৰা তাৰিখ + টিকাকৰণৰ তাৰিখ + টিকাকৰণ স্থান + টিকাকৃত স্থান + টিকাকৰণ কৰা হৈছে + টিকাকৰণৰ তাৰিখ + \ No newline at end of file diff --git a/app/src/main/res/values-as/strings_incentives.xml b/app/src/main/res/values-as/strings_incentives.xml index a6b3daec9..5a811f344 100644 --- a/app/src/main/res/values-as/strings_incentives.xml +++ b/app/src/main/res/values-as/strings_incentives.xml @@ -1,2 +1,14 @@ - \ No newline at end of file + + প্ৰৰোচনা + কাৰ্য্যকলাপ: %1s + শেষবাৰৰ বাবে %1s ত আপডেইট কৰা হৈছে + আশা প্ৰৰোচনামূলক মাষ্টাৰ দাবী প্ৰ-পত্ৰ + SDM&HO বা i/c ব্লক PHC + Sub: ৰ পৰা সময়ছোৱাৰ বাবে আশা প্ৰৰোচনামূলক দাবী দাখিল কৰা + ৰ পৰা সময়ছোৱাৰ বাবে + তলত উল্লেখ কৰা বিবৃতি অনুসৰি। + ওপৰত উল্লেখ কৰা বিষয়টোৰ সন্দৰ্ভত মই আশাৰ প্ৰৰোচনামূলক দাবী দাখিল কৰাৰ গৌৰৱ লাভ কৰিছো + তলত উল্লেখ কৰা বিবৃতি অনুসৰি। + ছাৰ/মেডাম, + \ No newline at end of file diff --git a/app/src/main/res/values-as/strings_kid.xml b/app/src/main/res/values-as/strings_kid.xml index ad9c080b2..11406fc46 100644 --- a/app/src/main/res/values-as/strings_kid.xml +++ b/app/src/main/res/values-as/strings_kid.xml @@ -140,4 +140,10 @@ হেপাটাইটিছ OPV + ডাটাবেছত Mdsr সংৰক্ষণ কৰা ব্যৰ্থ! + এইচ বি ৱাই চি ফৰ্ম + hbnc part II ডাটাবেছত সংৰক্ষণ কৰা ব্যৰ্থ! + প্ৰথম খণ্ড + দ্বিতীয় খণ্ড + এইচ বি এন চি ফৰ্ম diff --git a/app/src/main/res/values-as/strings_maternal_health.xml b/app/src/main/res/values-as/strings_maternal_health.xml index 7c7b42a79..c36d96c0e 100644 --- a/app/src/main/res/values-as/strings_maternal_health.xml +++ b/app/src/main/res/values-as/strings_maternal_health.xml @@ -59,6 +59,14 @@ + ANC %1d ভ্ৰমণ কৰক + %1d দিনত পিএনচি ভ্ৰমণ + পঞ্জীয়ন কৰা + ট্ৰেকিং ফৰ্ম সফলতাৰে পূৰণ কৰা হৈছে + পিএমএছএমএ প্ৰ-পত্ৰ + জেনেৰেল অ’ পি + pmsma ক ডাটাবেছত সংৰক্ষণ কৰা ব্যৰ্থ! + এইচ আৰ পি কেছ, অনুগ্ৰহ কৰি ওচৰৰ এইচ ডব্লিউ চিলৈ যাওক বা ১০৪ নম্বৰত ফোন কৰক MCTS নম্বৰ / RCH নম্বৰ লাভকাৰীক কোৰকৈ এটি মুখ্যীয়া স্বাস্থ্য কাৰ্ড আছে? এটি মুখ্যীয়া স্বাস্থ্য কাৰ্ড প্ৰদান কৰা হৈছে @@ -90,6 +98,7 @@ কেলচিয়াম সুপ্লিমেণ্টেচন টেটেনাছ ট’কচইড LMP (আদি মাসিকৰ দিন) + প্ৰত্যাশিত ডেলিভাৰী শেষ মাসিকৰ সময় পৰামিতা ডেলিভাৰীৰ তাৰিখ উচ্চ আপাতকাৰী সাঁচ diff --git a/app/src/main/res/values-hi/strings_pwr.xml b/app/src/main/res/values-hi/strings_pwr.xml new file mode 100644 index 000000000..deaf9fef9 --- /dev/null +++ b/app/src/main/res/values-hi/strings_pwr.xml @@ -0,0 +1,32 @@ + + + RCH ID + MCP Card No + Name of Pregnant Women + Name of Husband + Current Age of Woman + LMP Date + Weeks of Pregnancy at the time of Registration + EDD + Blood Group + Weight of PW (Kg) at time Registration + Height of PW (Cm) + VDRL/RPR Test result + Date of VDRL Test done + HIV Test result + Date of HIV Test done + HBsAg Test result + Date of HbsAg Test done + Past Illness + other + Is this your 1st pregnancy? + Total no. of previous Pregnancy + Any complications in Last Pregnancy + Any other Complication + Is Identified as HRP cases? + + Yes + No + + Who had identified as HRP? + \ No newline at end of file diff --git a/app/src/main/res/values/strings_home.xml b/app/src/main/res/values/strings_home.xml index 5e74cb843..3d0f3537a 100644 --- a/app/src/main/res/values/strings_home.xml +++ b/app/src/main/res/values/strings_home.xml @@ -1,5 +1,6 @@ + Open navigation drawer Close navigation drawer Select Village @@ -9,12 +10,10 @@ Block Village Continue - Home Home Scheduler Selected Village - All\nHousehold All\nBeneficiaries Eligible\nCouple List @@ -28,7 +27,6 @@ Menopause Stage List Death Reports Village Level Forms - Infant List Child List Adolescent List @@ -43,7 +41,6 @@ Delivery Stage List PNC Mother List Reproductive Age List - NCD List NCD Eligible List NCD Non-Eligible List @@ -56,9 +53,7 @@ Follow-up of HRP Women Assess High Risk in Non-PW Follow-up of High Risk Cases - Survey Register - %1d%% downloaded Invalid Username / password ! Server timed out, try again! From cce8f022ec073afc4561cf2e964c0364186f99ad Mon Sep 17 00:00:00 2001 From: Sushant Date: Fri, 2 Aug 2024 15:24:05 +0530 Subject: [PATCH 025/892] Prod RSA Encryption API Endpoint Updated --- .../java/org/piramalswasthya/sakhi/network/AbhaApiService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt index f18b61113..2fd9b9b2c 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt @@ -73,7 +73,7 @@ interface AbhaApiService { // Production RES Encryption API // @GET // suspend fun getAuthCert( -// @Url url: String = "https://healthid.abdm.gov.in/api/v2/auth/cert" +// @Url url: String = "https://healthid.abdm.gov.in/api/v1/auth/cert" // ): Response @GET("v2/ha/lgd/states") From 89136f0a7b836166968d1463c0ecc00811e8f78f Mon Sep 17 00:00:00 2001 From: Sushant Date: Tue, 6 Aug 2024 16:17:49 +0530 Subject: [PATCH 026/892] ABHA v3 M1 Migration Complete --- .../sakhi/network/JsonAdapters.kt | 2 +- .../aadhaar_id/AadhaarIdFragment.kt | 2 +- .../aadhaar_otp/AadhaarOtpFragment.kt | 4 ++-- .../aadhaar_otp/AadhaarOtpViewModel.kt | 10 ++++++++++ .../create_abha_id/CreateAbhaFragment.kt | 16 +++++++++++++++- .../create_abha_id/CreateAbhaViewModel.kt | 2 +- .../GenerateMobileOtpFragment.kt | 6 +++--- .../verify_mobile_otp/VerifyMobileOtpFragment.kt | 9 +++++++-- app/src/main/res/navigation/nav_abha_id.xml | 12 ++++++++++++ 9 files changed, 52 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt b/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt index 0955b8569..6d3a83a96 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt @@ -236,7 +236,7 @@ data class ABHAProfile( val abhaType: String, val stateName: String, val districtName: String, - val aBHANumber: String, + val ABHANumber: String, val abhaStatus: String ) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/AadhaarIdFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/AadhaarIdFragment.kt index 9e99a0603..6868e3340 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/AadhaarIdFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/AadhaarIdFragment.kt @@ -135,7 +135,7 @@ class AadhaarIdFragment : Fragment() { State.ABHA_GENERATED_SUCCESS -> { findNavController().navigate( AadhaarIdFragmentDirections.actionAadhaarIdFragmentToCreateAbhaFragment( - viewModel.txnId + viewModel.txnId, "", "" ) ) } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt index 9194b5683..a75b87375 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt @@ -116,7 +116,7 @@ class AadhaarOtpFragment : Fragment() { if (parentViewModel.mobileNumber == viewModel.mobileNumber) { findNavController().navigate( AadhaarOtpFragmentDirections.actionAadhaarOtpFragmentToCreateAbhaFragment( - viewModel.txnId + viewModel.txnId, viewModel.name, viewModel.abhaNumber ) ) } else { @@ -128,7 +128,7 @@ class AadhaarOtpFragment : Fragment() { State.SUCCESS -> { findNavController().navigate( AadhaarOtpFragmentDirections.actionAadhaarOtpFragmentToVerifyMobileOtpFragment( - viewModel.txnId, viewModel.mobileNumber + viewModel.txnId, viewModel.mobileNumber, viewModel.name, viewModel.abhaNumber ) ) viewModel.resetState() diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt index e2ba515d4..182100d6c 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt @@ -53,6 +53,14 @@ class AadhaarOtpViewModel @Inject constructor( val txnId: String get() = _txnId!! + private var _name: String? = null + val name: String + get() = _name!! + + private var _abhaNumber: String? = null + val abhaNumber: String + get() = _abhaNumber!! + private var _mobileNumber: String? = null val mobileNumber: String get() = _mobileNumber!! @@ -93,6 +101,8 @@ class AadhaarOtpViewModel @Inject constructor( is NetworkResult.Success -> { _txnId = result.data.txnId _mobileNumber = result.data.ABHAProfile.mobile + _name = result.data.ABHAProfile.firstName + _abhaNumber = result.data.ABHAProfile.ABHANumber _state.value = State.OTP_VERIFY_SUCCESS } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt index 922cb03cb..a44813c17 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt @@ -33,6 +33,7 @@ import dagger.hilt.android.AndroidEntryPoint import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.databinding.FragmentCreateAbhaBinding import org.piramalswasthya.sakhi.ui.abha_id_activity.AbhaIdActivity +import org.piramalswasthya.sakhi.ui.abha_id_activity.aadhaar_otp.AadhaarOtpFragmentArgs import org.piramalswasthya.sakhi.ui.abha_id_activity.create_abha_id.CreateAbhaViewModel.State import org.piramalswasthya.sakhi.work.WorkerUtils import timber.log.Timber @@ -52,6 +53,10 @@ class CreateAbhaFragment : Fragment() { private val channelId = "download abha card" + val args: CreateAbhaFragmentArgs by lazy { + CreateAbhaFragmentArgs.fromBundle(requireArguments()) + } + private var timer = object : CountDownTimer(30000, 1000) { override fun onTick(millisUntilFinished: Long) { @@ -120,7 +125,16 @@ class CreateAbhaFragment : Fragment() { val benId = intent.getLongExtra("benId", 0) val benRegId = intent.getLongExtra("benRegId", 0) - viewModel.createHID(benId, benRegId) +// viewModel.createHID(benId, benRegId) + + binding.pbCai.visibility = View.INVISIBLE + binding.clCreateAbhaId.visibility = View.VISIBLE + binding.clVerifyMobileOtp.visibility = View.INVISIBLE + binding.clError.visibility = View.INVISIBLE + binding.clDownloadAbha.visibility = View.GONE + + binding.textView2.text = args.name + binding.textView4.text = args.abhaNumber viewModel.benMapped.observe(viewLifecycleOwner) { it?.let { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt index 584128e92..058084b25 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt @@ -54,7 +54,7 @@ class CreateAbhaViewModel @Inject constructor( get() = _errorMessage init { - _state.value = State.LOADING +// _state.value = State.LOADING } fun createHID(benId: Long, benRegId: Long) { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/generate_mobile_otp/GenerateMobileOtpFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/generate_mobile_otp/GenerateMobileOtpFragment.kt index 075974ffc..86b96aa13 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/generate_mobile_otp/GenerateMobileOtpFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/generate_mobile_otp/GenerateMobileOtpFragment.kt @@ -113,14 +113,14 @@ class GenerateMobileOtpFragment : Fragment() { if (viewModel.apiResponse.mobileLinked) { navController.navigate( GenerateMobileOtpFragmentDirections.actionGenerateMobileOtpFragmentToCreateAbhaFragment( - viewModel.txnIdFromArgs + viewModel.txnIdFromArgs, "", "" ) ) } else { navController.navigate( GenerateMobileOtpFragmentDirections.actionGenerateMobileOtpFragmentToVerifyMobileOtpFragment( viewModel.apiResponse.txnId, - binding.tietMobileNumber.text!!.toString() + binding.tietMobileNumber.text!!.toString(), "", "" ) ) } @@ -143,7 +143,7 @@ class GenerateMobileOtpFragment : Fragment() { State.ABHA_GENERATED_SUCCESS -> { navController.navigate( GenerateMobileOtpFragmentDirections.actionGenerateMobileOtpFragmentToCreateAbhaFragment( - viewModel.txnIdFromArgs + viewModel.txnIdFromArgs, "", "" ) ) } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/verify_mobile_otp/VerifyMobileOtpFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/verify_mobile_otp/VerifyMobileOtpFragment.kt index 87b6bdf58..0540fa177 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/verify_mobile_otp/VerifyMobileOtpFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/verify_mobile_otp/VerifyMobileOtpFragment.kt @@ -16,6 +16,7 @@ import dagger.hilt.android.AndroidEntryPoint import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.databinding.FragmentVerifyMobileOtpBinding import org.piramalswasthya.sakhi.ui.abha_id_activity.AbhaIdActivity +import org.piramalswasthya.sakhi.ui.abha_id_activity.aadhaar_otp.AadhaarOtpFragmentArgs import org.piramalswasthya.sakhi.ui.abha_id_activity.verify_mobile_otp.VerifyMobileOtpViewModel.State @AndroidEntryPoint @@ -29,6 +30,10 @@ class VerifyMobileOtpFragment : Fragment() { private val viewModel: VerifyMobileOtpViewModel by viewModels() + val args: VerifyMobileOtpFragmentArgs by lazy { + VerifyMobileOtpFragmentArgs.fromBundle(requireArguments()) + } + private var timer = object : CountDownTimer(30000, 1000) { override fun onTick(millisUntilFinished: Long) { @@ -102,7 +107,7 @@ class VerifyMobileOtpFragment : Fragment() { State.OTP_VERIFY_SUCCESS -> { findNavController().navigate( VerifyMobileOtpFragmentDirections.actionVerifyMobileOtpFragmentToCreateAbhaFragment( - viewModel.txnID + viewModel.txnID, args.name, args.abhaNumber ) ) viewModel.resetState() @@ -136,7 +141,7 @@ class VerifyMobileOtpFragment : Fragment() { State.ABHA_GENERATED_SUCCESS -> { findNavController().navigate( VerifyMobileOtpFragmentDirections.actionVerifyMobileOtpFragmentToCreateAbhaFragment( - viewModel.txnID + viewModel.txnID, args.name, args.abhaNumber ) ) viewModel.resetState() diff --git a/app/src/main/res/navigation/nav_abha_id.xml b/app/src/main/res/navigation/nav_abha_id.xml index 500e0d128..26a68c2d2 100644 --- a/app/src/main/res/navigation/nav_abha_id.xml +++ b/app/src/main/res/navigation/nav_abha_id.xml @@ -77,6 +77,12 @@ + + + + \ No newline at end of file From 9a9fef1a36cf6a5d6356a699a59031e0dc7cdd89 Mon Sep 17 00:00:00 2001 From: Ritik Date: Wed, 7 Aug 2024 11:49:09 +0530 Subject: [PATCH 027/892] Incentive done , pdf download issue is resolved --- app/src/main/AndroidManifest.xml | 2 + .../incentives/IncentivesFragment.kt | 47 ++++++++++++++++++- app/src/main/res/values/strings.xml | 4 +- .../res/values/strings_maternal_health.xml | 8 ++-- local.properties | 2 +- 5 files changed, 54 insertions(+), 9 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f9b4a0906..41a72e92f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ + @@ -19,6 +20,7 @@ android:fullBackupContent="@xml/backup_rules" android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher" + android:requestLegacyExternalStorage="true" android:label="@string/app_native_name" android:largeHeap="true" android:roundIcon="@mipmap/ic_launcher_round" diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/incentives/IncentivesFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/incentives/IncentivesFragment.kt index e6dd93ec1..08f6e4be5 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/incentives/IncentivesFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/incentives/IncentivesFragment.kt @@ -1,11 +1,15 @@ package org.piramalswasthya.sakhi.ui.home_activity.incentives +import android.Manifest +import android.content.Context import android.content.Intent +import android.content.pm.PackageManager import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.pdf.PdfDocument import android.net.Uri +import android.os.Build import android.os.Bundle import android.os.Environment import android.text.Layout @@ -17,6 +21,7 @@ import android.widget.ArrayAdapter import android.widget.LinearLayout import android.widget.Spinner import android.widget.Toast +import androidx.core.content.ContextCompat import androidx.core.net.toUri import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels @@ -42,6 +47,7 @@ import java.io.File import java.io.FileOutputStream import java.io.IOException import java.util.Calendar +import java.util.Objects @AndroidEntryPoint @@ -59,6 +65,9 @@ class IncentivesFragment : Fragment() { var selectedMonth: String = "" var selectedYear: String = "" + + private val PERMISSION_REQUEST_CODE = 792 + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -169,7 +178,7 @@ class IncentivesFragment : Fragment() { } binding.tvTotalPending.setOnClickListener { - downloadPdf() + askPermissions() } binding.et1.setOnClickListener { @@ -927,5 +936,39 @@ class IncentivesFragment : Fragment() { } + private fun askPermissions() { + + val sdkversion = Build.VERSION.SDK_INT + + if (sdkversion >= 33) { + + downloadPdf() + + } else { + val permissions = arrayOf( + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + for (permission in permissions) { + if (ContextCompat.checkSelfPermission( + Objects.requireNonNull( + requireContext() + ) as Context, permission + ) == PackageManager.PERMISSION_DENIED + ) { + requestPermissions( + permissions, + PERMISSION_REQUEST_CODE + ) + return + } else { + downloadPdf() + } + } + + } + } + +} + -} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 82567a0cb..247f36cd0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,7 +15,7 @@ Locale.Helper.Selected.Language DP_URI_cat - %s * + %s * %s ** Date of Visit MDSR @@ -41,7 +41,7 @@ Cause of death to be reported to ANM/MPW/PHC for infant death review. - If child is born in less than 35 weeks, pay attention. + If child is born in less than 35 weeks, pay attention. Report to ANM/PHC for maternal death review. If yes, refer immediately to a hospital. If the mother does not eat full stomach or eat less than 4 times, advise mother to do so. diff --git a/app/src/main/res/values/strings_maternal_health.xml b/app/src/main/res/values/strings_maternal_health.xml index f8be04b62..d8e22a421 100644 --- a/app/src/main/res/values/strings_maternal_health.xml +++ b/app/src/main/res/values/strings_maternal_health.xml @@ -103,10 +103,10 @@ - Dose 1 - Dose 2 - Dose 3 - Dose 4 + Dose-1 + Dose-2 + Dose-3 + Dose-4 diff --git a/local.properties b/local.properties index 63967b134..783d9f839 100644 --- a/local.properties +++ b/local.properties @@ -4,4 +4,4 @@ # Location of the SDK. This is only used by Gradle. # For customization when using a Version Control System, please read the # header note. -sdk.dir=/home/beehyv/Android/Sdk \ No newline at end of file +sdk.dir=C\:\\Users\\Tyagi\\AppData\\Local\\Android\\Sdk From 9f3692201f7c691bdc85f3d9cc24e2185c76a482 Mon Sep 17 00:00:00 2001 From: Ritik Date: Mon, 12 Aug 2024 19:06:48 +0530 Subject: [PATCH 028/892] Immunization module enhancement UI and functionality both are done. --- .../adapters/ImmunizationBenListAdapter.kt | 4 + .../ImmunizationBirthDoseCategoryAdapter.kt | 69 ++++++++++++ .../configuration/ImmunizationDataset.kt | 4 +- .../sakhi/helpers/CommonUtils.kt | 99 +++++++++++++++++ .../piramalswasthya/sakhi/ui/BindingUtils.kt | 5 +- .../sakhi/ui/home_activity/HomeActivity.kt | 4 +- .../list/ChildImmunizationListFragment.kt | 24 +++- .../list/ChildImmunizationListViewModel.kt | 61 ++++++++-- app/src/main/res/drawable/tab_selection.xml | 8 ++ app/src/main/res/drawable/tab_unselection.xml | 5 + .../fragment_child_immunization_list.xml | 11 ++ .../main/res/layout/rv_item_imm_vaccine.xml | 105 +++++++++++------- app/src/main/res/layout/rv_tab.xml | 43 +++++++ app/src/main/res/values/colors.xml | 1 + 14 files changed, 386 insertions(+), 57 deletions(-) create mode 100644 app/src/main/java/org/piramalswasthya/sakhi/adapters/ImmunizationBirthDoseCategoryAdapter.kt create mode 100644 app/src/main/res/drawable/tab_selection.xml create mode 100644 app/src/main/res/drawable/tab_unselection.xml create mode 100644 app/src/main/res/layout/rv_tab.xml diff --git a/app/src/main/java/org/piramalswasthya/sakhi/adapters/ImmunizationBenListAdapter.kt b/app/src/main/java/org/piramalswasthya/sakhi/adapters/ImmunizationBenListAdapter.kt index c5c5d3623..323bb83f2 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/adapters/ImmunizationBenListAdapter.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/adapters/ImmunizationBenListAdapter.kt @@ -38,6 +38,7 @@ class ImmunizationBenListAdapter( fun bind( item: ImmunizationDetailsDomain, clickListener: VaccinesClickListener? ) { + binding.temp = item.ben binding.clickListener = clickListener binding.executePendingBindings() @@ -45,12 +46,15 @@ class ImmunizationBenListAdapter( } } + + override fun onCreateViewHolder( parent: ViewGroup, viewType: Int ): BenVaccineViewHolder = BenVaccineViewHolder.from(parent) override fun onBindViewHolder(holder: BenVaccineViewHolder, position: Int) { holder.bind(getItem(position), clickListener) + } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/adapters/ImmunizationBirthDoseCategoryAdapter.kt b/app/src/main/java/org/piramalswasthya/sakhi/adapters/ImmunizationBirthDoseCategoryAdapter.kt new file mode 100644 index 000000000..f0d3e8d23 --- /dev/null +++ b/app/src/main/java/org/piramalswasthya/sakhi/adapters/ImmunizationBirthDoseCategoryAdapter.kt @@ -0,0 +1,69 @@ +package org.piramalswasthya.sakhi.adapters + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import org.piramalswasthya.sakhi.R +import org.piramalswasthya.sakhi.databinding.RvTabBinding +import org.piramalswasthya.sakhi.ui.home_activity.immunization_due.child_immunization.list.ChildImmunizationListViewModel + + +class ImmunizationBirthDoseCategoryAdapter( + private val catDataList: ArrayList, + private val clickListener: CategoryClickListener? = null, + var viewModel: ChildImmunizationListViewModel +) : RecyclerView.Adapter(){ + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = + CategoryViewHolder.from(parent) + + + override fun onBindViewHolder( + holder: CategoryViewHolder, + position: Int, + ) { + + holder.bind(catDataList[position]) + holder.binding.cMainLayout.setOnClickListener { + viewModel.selectedPosition = position + clickListener?.onClicked(catDataList[position]) + notifyDataSetChanged() + + } + if (viewModel.selectedPosition == position) { + holder.binding.cMainLayout.setBackgroundResource(R.drawable.tab_selection) + } else { + holder.binding.cMainLayout.setBackgroundResource(R.drawable.tab_unselection) + } + + } + + + class CategoryViewHolder private constructor(val binding: RvTabBinding) : + RecyclerView.ViewHolder(binding.root) { + companion object { + fun from(parent: ViewGroup): CategoryViewHolder { + val layoutInflater = LayoutInflater.from(parent.context) + val binding = RvTabBinding.inflate(layoutInflater, parent, false) + return CategoryViewHolder(binding) + } + } + + fun bind( + catDataList: String, + ) { + + binding.monthText.text = catDataList + + } + + } + override fun getItemCount(): Int { + return catDataList.size + } + + fun interface CategoryClickListener + { + fun onClicked(catDataList: String) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/ImmunizationDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/ImmunizationDataset.kt index 8fd36623e..b8154b506 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/ImmunizationDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/ImmunizationDataset.kt @@ -107,7 +107,7 @@ class ImmunizationDataset(context: Context, language: Languages) : Dataset(conte vaccineName.value = vaccine.vaccineName.dropLastWhile { it.isDigit() } doseNumber.value = vaccine.vaccineName.takeLastWhile { it.isDigit() } expectedDate.value = - getDateFromLong(ben.dob + vaccine.minAllowedAgeInMillis + vaccine.overdueDurationSinceMinInMillis) + getDateFromLong(ben.dob + vaccine.maxAllowedAgeInMillis) dateOfVaccination.value = getDateFromLong(System.currentTimeMillis()) dateOfVaccination.min = ben.dob + vaccine.minAllowedAgeInMillis if (System.currentTimeMillis() > ben.dob + vaccine.maxAllowedAgeInMillis) { @@ -139,4 +139,6 @@ class ImmunizationDataset(context: Context, language: Languages) : Dataset(conte } + + } \ No newline at end of file diff --git a/app/src/main/java/org/piramalswasthya/sakhi/helpers/CommonUtils.kt b/app/src/main/java/org/piramalswasthya/sakhi/helpers/CommonUtils.kt index 09ac4c970..78e698a11 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/helpers/CommonUtils.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/helpers/CommonUtils.kt @@ -15,6 +15,7 @@ import org.piramalswasthya.sakhi.model.BenWithHRPTListDomain import org.piramalswasthya.sakhi.model.BenWithPwrDomain import org.piramalswasthya.sakhi.model.BenWithTbScreeningDomain import org.piramalswasthya.sakhi.model.BenWithTbSuspectedDomain +import org.piramalswasthya.sakhi.model.ImmunizationDetailsDomain import org.piramalswasthya.sakhi.model.InfantRegDomain import org.piramalswasthya.sakhi.model.PregnantWomenVisitDomain import java.text.SimpleDateFormat @@ -34,6 +35,7 @@ fun filterBenList(list: List, text: String): List, text: String): List { + if (text == "") + return list + else { + var filterText = text.lowercase() + var firstVal = "" + var secondVal = "" + var thirdVal = "" + var fourthVal = "" + var fifthVal = "" + var sixthVal = "" + var seventhVal = "" + var eighthVal = "" + + if (filterText.contains("5-6 years")) { + firstVal = "${filterText.split("-")[0]} years" + filterText = filterText.split("-")[1] + + } else if (filterText.contains("16-24 months")) { + firstVal = "1 years" + /*secondVal = "17 months" + thirdVal = "18 months" + fourthVal = "19 months" + fifthVal = "20 months" + sixthVal = "21 months" + seventhVal = "22 months" + eighthVal = "23 months"*/ + filterText = "2 years" + + } + else if (filterText.contains("9-12 months")) { + firstVal = "${filterText.split("-")[0]} months" + secondVal = "10 months" + thirdVal = "11 months" + filterText = filterText.split("-")[1] + + } + else if (filterText.contains("6 weeks")) { + firstVal = "1 months" + filterText = "2 months" + + } + else if (filterText.contains("10 weeks")) { + + filterText = "3 months" + + } + else if (filterText.contains("14 weeks")) { + + filterText = "4 months" + + } + return list.filter { + + filterForImm( + it, + filterText, + firstVal, + secondVal, + thirdVal, + fourthVal, + fifthVal, + sixthVal, + seventhVal, + eighthVal + ) + + } + } +} + +fun filterForImm( + imm: ImmunizationDetailsDomain, + filterText: String, + firstVal: String, + secondVal: String, + thirdVal: String, + fourthVal: String, + fifthVal: String, + sixthVal: String, + seventhVal: String, + eighthVal: String +) = (imm.ben.age.lowercase() == filterText || + imm.ben.age.lowercase() == firstVal || + imm.ben.age.lowercase() == secondVal || + imm.ben.age.lowercase() == thirdVal || + imm.ben.age.lowercase() == fourthVal || + imm.ben.age.lowercase() == fifthVal || + imm.ben.age.lowercase() == sixthVal || + imm.ben.age.lowercase() == seventhVal || + imm.ben.age.lowercase() == eighthVal + ) + + + + fun filterBenHRNPTFormList( list: List, text: String diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/BindingUtils.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/BindingUtils.kt index 2f8708e65..14c5355a8 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/BindingUtils.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/BindingUtils.kt @@ -57,7 +57,10 @@ fun Button.setVaccineState(syncState: VaccineState?) { syncState?.let { visibility = View.VISIBLE when (it) { - PENDING, + PENDING -> { + text = "FILL" + } + OVERDUE -> { text = "FILL" } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt index d4ee86a7c..76e43b3c4 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt @@ -174,7 +174,7 @@ class HomeActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // This will block user to cast app screen // Toggle screencast mode for staging & production builds - window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); +// window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); super.onCreate(savedInstanceState) _binding = ActivityHomeBinding.inflate(layoutInflater) setContentView(binding.root) @@ -204,7 +204,7 @@ class HomeActivity : AppCompatActivity() { override fun onResume() { // This will block user to cast app screen // Toggle screencast mode for staging & production builds - window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); +// window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); super.onResume() if (isDeviceRootedOrEmulator()) { AlertDialog.Builder(this) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/immunization_due/child_immunization/list/ChildImmunizationListFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/immunization_due/child_immunization/list/ChildImmunizationListFragment.kt index f137570c4..09bd6f5e9 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/immunization_due/child_immunization/list/ChildImmunizationListFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/immunization_due/child_immunization/list/ChildImmunizationListFragment.kt @@ -11,12 +11,13 @@ import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.adapters.ImmunizationBenListAdapter +import org.piramalswasthya.sakhi.adapters.ImmunizationBirthDoseCategoryAdapter import org.piramalswasthya.sakhi.databinding.FragmentChildImmunizationListBinding import org.piramalswasthya.sakhi.ui.home_activity.HomeActivity import timber.log.Timber @AndroidEntryPoint -class ChildImmunizationListFragment : Fragment() { +class ChildImmunizationListFragment : Fragment(),ImmunizationBirthDoseCategoryAdapter.CategoryClickListener{ private var _binding: FragmentChildImmunizationListBinding? = null private val binding: FragmentChildImmunizationListBinding @@ -24,6 +25,7 @@ class ChildImmunizationListFragment : Fragment() { private val viewModel: ChildImmunizationListViewModel by viewModels() + private var catTxt = "" private val bottomSheet: ChildImmunizationVaccineBottomSheetFragment by lazy { ChildImmunizationVaccineBottomSheetFragment() } override fun onCreateView( @@ -36,6 +38,8 @@ class ChildImmunizationListFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + binding.rvCat.adapter = ImmunizationBirthDoseCategoryAdapter(viewModel.categoryData(),this,viewModel) + binding.rvList.adapter = ImmunizationBenListAdapter(ImmunizationBenListAdapter.VaccinesClickListener { viewModel.updateBottomSheetData(it) @@ -43,8 +47,9 @@ class ChildImmunizationListFragment : Fragment() { bottomSheet.show(childFragmentManager, "ImM") }) + lifecycleScope.launch { - viewModel.benWithVaccineDetails.collect { + viewModel.immunizationBenList.collect { Timber.d("Collecting list : $it") binding.rvList.apply { (adapter as ImmunizationBenListAdapter).submitList(it) @@ -64,5 +69,20 @@ class ChildImmunizationListFragment : Fragment() { } } + override fun onClicked(catDataList: String) { + + if (catDataList.contains("ALL")) { + viewModel.filterText("") + } + else { + catTxt = catDataList + viewModel.filterText(catTxt) + + } + + + + } + } \ No newline at end of file diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/immunization_due/child_immunization/list/ChildImmunizationListViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/immunization_due/child_immunization/list/ChildImmunizationListViewModel.kt index dcdda8bca..86e182354 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/immunization_due/child_immunization/list/ChildImmunizationListViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/immunization_due/child_immunization/list/ChildImmunizationListViewModel.kt @@ -10,6 +10,8 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.piramalswasthya.sakhi.database.room.dao.ImmunizationDao +import org.piramalswasthya.sakhi.helpers.filterBenList +import org.piramalswasthya.sakhi.helpers.filterImmunList import org.piramalswasthya.sakhi.model.ImmunizationCategory import org.piramalswasthya.sakhi.model.ImmunizationDetailsDomain import org.piramalswasthya.sakhi.model.Vaccine @@ -36,6 +38,10 @@ class ChildImmunizationListViewModel @Inject constructor( ) private lateinit var vaccinesList: List + private val filter = MutableStateFlow("") + + var selectedPosition = 0 + val benWithVaccineDetails = pastRecords.map { vaccineIdList -> vaccineIdList.map { cache -> val ageMillis = System.currentTimeMillis() - cache.ben.dob @@ -48,17 +54,19 @@ class ChildImmunizationListViewModel @Inject constructor( vaccine.vaccineName, vaccine.immunizationService, if (cache.givenVaccines.any { it.vaccineId == vaccine.vaccineId }) VaccineState.DONE - else if (ageMillis < (vaccine.maxAllowedAgeInMillis)) { - vaccine.dependantVaccineId?.let { dep -> - - val isDepThere = - cache.givenVaccines.any { it.vaccineId == vaccine.dependantVaccineId } - if (isDepThere) - VaccineState.PENDING - else VaccineState.MISSED - } - ?: run { VaccineState.PENDING } - } else VaccineState.MISSED + else if (ageMillis <= (vaccine.minAllowedAgeInMillis)) { + + VaccineState.PENDING + + } + else if (ageMillis <= (vaccine.maxAllowedAgeInMillis)) { + + VaccineState.OVERDUE + + } + + else VaccineState.MISSED + ) @@ -66,6 +74,17 @@ class ChildImmunizationListViewModel @Inject constructor( } } + val immunizationBenList = benWithVaccineDetails.combine(filter) { list, filter -> + filterImmunList(list, filter) + } + + fun filterText(text: String) { + viewModelScope.launch { + filter.emit(text) + } + + } + private val clickedBenId = MutableStateFlow(0L) val bottomSheetContent = clickedBenId.combine(benWithVaccineDetails) { a, b -> @@ -88,6 +107,25 @@ class ChildImmunizationListViewModel @Inject constructor( } + private val catList = ArrayList() + + fun categoryData() : ArrayList { + + catList.clear() + catList.add("ALL") + catList.add("6 WEEKS") + catList.add("10 WEEKS") + catList.add("14 WEEKS") + catList.add("9-12 MONTHS") + catList.add("16-24 MONTHS") + catList.add("5-6 YEARS") + catList.add("10 YEARS") + catList.add("16 YEARS") + + return catList + + } + private fun navigateForClicked(benId: Long, vaccineId: Int) { Timber.d("Hello Me! clicked for $benId, vaccineId : $vaccineId") } @@ -96,4 +134,5 @@ class ChildImmunizationListViewModel @Inject constructor( return clickedBenId.value } + } \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_selection.xml b/app/src/main/res/drawable/tab_selection.xml new file mode 100644 index 000000000..d74969fff --- /dev/null +++ b/app/src/main/res/drawable/tab_selection.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_unselection.xml b/app/src/main/res/drawable/tab_unselection.xml new file mode 100644 index 000000000..356724814 --- /dev/null +++ b/app/src/main/res/drawable/tab_unselection.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_child_immunization_list.xml b/app/src/main/res/layout/fragment_child_immunization_list.xml index 9ee389959..af1d07201 100644 --- a/app/src/main/res/layout/fragment_child_immunization_list.xml +++ b/app/src/main/res/layout/fragment_child_immunization_list.xml @@ -27,10 +27,21 @@ + + diff --git a/app/src/main/res/layout/rv_item_imm_vaccine.xml b/app/src/main/res/layout/rv_item_imm_vaccine.xml index 290462dd8..ffce3f89c 100644 --- a/app/src/main/res/layout/rv_item_imm_vaccine.xml +++ b/app/src/main/res/layout/rv_item_imm_vaccine.xml @@ -18,53 +18,78 @@ - - - + + app:cardCornerRadius="@dimen/padding_normal" + app:cardElevation="@dimen/padding_small"> - - - - - - - - - + android:gravity="center_horizontal" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + + + + + + + + + + + + + + + + + + - \ No newline at end of file diff --git a/app/src/main/res/layout/rv_tab.xml b/app/src/main/res/layout/rv_tab.xml new file mode 100644 index 000000000..1d55920d2 --- /dev/null +++ b/app/src/main/res/layout/rv_tab.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 265cda654..3c28583df 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -16,6 +16,7 @@ #BA1A1A #FFDAD6 #FFFFFF + #A7A7A7 #410002 #FCFCFF #1A1C1E From 7ae087d5c5c0f0e5be1dd47112428251940e18ae Mon Sep 17 00:00:00 2001 From: Ritik Date: Tue, 13 Aug 2024 11:02:31 +0530 Subject: [PATCH 029/892] Immunization module enhancement UI and functionality both are done. --- .../child_immunization/list/ChildImmunizationListViewModel.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/immunization_due/child_immunization/list/ChildImmunizationListViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/immunization_due/child_immunization/list/ChildImmunizationListViewModel.kt index 86e182354..78da62ccf 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/immunization_due/child_immunization/list/ChildImmunizationListViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/immunization_due/child_immunization/list/ChildImmunizationListViewModel.kt @@ -10,7 +10,6 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.piramalswasthya.sakhi.database.room.dao.ImmunizationDao -import org.piramalswasthya.sakhi.helpers.filterBenList import org.piramalswasthya.sakhi.helpers.filterImmunList import org.piramalswasthya.sakhi.model.ImmunizationCategory import org.piramalswasthya.sakhi.model.ImmunizationDetailsDomain From 29e212fa07034e4fcd083e04de99087480af81fa Mon Sep 17 00:00:00 2001 From: Ritik Date: Tue, 13 Aug 2024 12:01:25 +0530 Subject: [PATCH 030/892] Immunization module enhancement UI and functionality both are done. --- .../sakhi/helpers/CommonUtils.kt | 83 +++++-------------- .../list/ChildImmunizationListViewModel.kt | 14 +--- 2 files changed, 21 insertions(+), 76 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/helpers/CommonUtils.kt b/app/src/main/java/org/piramalswasthya/sakhi/helpers/CommonUtils.kt index 78e698a11..c054e928b 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/helpers/CommonUtils.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/helpers/CommonUtils.kt @@ -320,68 +320,37 @@ fun filterImmunList(list: List, text: String): List, diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/immunization_due/child_immunization/list/ChildImmunizationListViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/immunization_due/child_immunization/list/ChildImmunizationListViewModel.kt index 78da62ccf..83d186dbe 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/immunization_due/child_immunization/list/ChildImmunizationListViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/immunization_due/child_immunization/list/ChildImmunizationListViewModel.kt @@ -54,21 +54,11 @@ class ChildImmunizationListViewModel @Inject constructor( vaccine.immunizationService, if (cache.givenVaccines.any { it.vaccineId == vaccine.vaccineId }) VaccineState.DONE else if (ageMillis <= (vaccine.minAllowedAgeInMillis)) { - VaccineState.PENDING - - } - else if (ageMillis <= (vaccine.maxAllowedAgeInMillis)) { - + } else if (ageMillis <= (vaccine.maxAllowedAgeInMillis)) { VaccineState.OVERDUE - - } - - else VaccineState.MISSED - - + } else VaccineState.MISSED ) - }) } } From b5218cd053b27c631b07f9cd267a03bc1dfd4567 Mon Sep 17 00:00:00 2001 From: Ritik Date: Tue, 13 Aug 2024 12:36:36 +0530 Subject: [PATCH 031/892] Immunization module enhancement UI and functionality both are done. --- app/src/main/res/values-as/strings_hrp.xml | 6 +--- app/src/main/res/values-as/strings_pwr.xml | 33 ++++++++++++++++++++++ 2 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/values-as/strings_pwr.xml diff --git a/app/src/main/res/values-as/strings_hrp.xml b/app/src/main/res/values-as/strings_hrp.xml index b00d8f878..497de5747 100644 --- a/app/src/main/res/values-as/strings_hrp.xml +++ b/app/src/main/res/values-as/strings_hrp.xml @@ -106,13 +106,13 @@ Issued quantity of IFA or Folic Acid supplement Using 75 gm OGTT After 2 Hours (mg/dL) - Pregnant Women (PW) section Micro Birth Plan Table Share PW name: Age: Contact no:\n1- Blood donor identified\n1: + গৰ্ভৱতী মহিলা (PW) অংশ RBS @@ -124,8 +124,4 @@ FBS & PPBS OGTT - (এএনএমৰ সৈতে পৰামৰ্শ কৰি পূৰণ কৰা হ’ব) - আৰ ডি ডেংগু - আৰ ডি ফিলাৰিয়া - গৰ্ভৱতী মহিলা (PW) অংশ \ No newline at end of file diff --git a/app/src/main/res/values-as/strings_pwr.xml b/app/src/main/res/values-as/strings_pwr.xml new file mode 100644 index 000000000..3a124d03a --- /dev/null +++ b/app/src/main/res/values-as/strings_pwr.xml @@ -0,0 +1,33 @@ + + + RCH ID + এমচিপি কাৰ্ড নং + স্বামীৰ নাম + মহিলাৰ বৰ্তমান বয়স + LMP Date + পঞ্জীয়নৰ সময়ত গৰ্ভাৱস্থাৰ সপ্তাহ + EDD + গৰ্ভৱতী মহিলাৰ নাম + ব্লাড গ্ৰুপ + সময়ত PW (Kg) ৰ ওজন পঞ্জীয়ন + পিডব্লিউৰ উচ্চতা (চে.মি.) + VDRL/RPR পৰীক্ষাৰ ফলাফল + VDRL পৰীক্ষা কৰা তাৰিখ + এইচ আই ভি পৰীক্ষাৰ ফলাফল + এইচ আই ভি পৰীক্ষা কৰা তাৰিখ + HBsAg পৰীক্ষাৰ ফলাফল + HbsAg পৰীক্ষা কৰা তাৰিখ + অতীতৰ অসুস্থতা + অন্যান্য + এইটো আপোনাৰ ১ম গৰ্ভাৱস্থা নেকি? + মুঠ নং। পূৰ্বৰ গৰ্ভাৱস্থাৰ + Last Pregnancy ত যিকোনো জটিলতা + আন যিকোনো জটিলতা + + Yes + No + + এইচ আৰ পি কেছ হিচাপে চিনাক্ত কৰা হৈছেনে? + কোনে এইচ আৰ পি বুলি চিনাক্ত কৰিছিল? + + \ No newline at end of file From 2892c51a1a457eb39d059af8174b12f96aad7d77 Mon Sep 17 00:00:00 2001 From: Ritik Date: Tue, 20 Aug 2024 08:24:00 +0530 Subject: [PATCH 032/892] crashes issues resolved --- .../sakhi/ui/home_activity/HomeActivity.kt | 3 ++- .../ben_form/NewBenRegFragment.kt | 20 ++++++++++++++++--- .../sakhi/ui/login_activity/LoginActivity.kt | 3 ++- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt index 6ee10046a..cf5ca54d6 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt @@ -374,7 +374,8 @@ class HomeActivity : AppCompatActivity() { } private fun isDeviceRootedOrEmulator(): Boolean { - return isRooted() || isEmulator() || RootedUtil().isDeviceRooted(applicationContext) + return isRooted() || isEmulator() + /*|| RootedUtil().isDeviceRooted(applicationContext)*/ } } \ No newline at end of file diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/all_ben/new_ben_registration/ben_form/NewBenRegFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/all_ben/new_ben_registration/ben_form/NewBenRegFragment.kt index 32e99fbe9..0b7d097e1 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/all_ben/new_ben_registration/ben_form/NewBenRegFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/all_ben/new_ben_registration/ben_form/NewBenRegFragment.kt @@ -113,7 +113,11 @@ class NewBenRegFragment : Fragment() { alertDialog.setNegativeButton( resources.getString(R.string.cancel) ) { dialog, _ -> - findNavController().navigateUp() + try { + findNavController().navigateUp() + } catch (e:Exception){ + dialog.cancel() + } dialog.cancel() } alertDialog.show() @@ -140,7 +144,12 @@ class NewBenRegFragment : Fragment() { alertDialog.setNegativeButton( resources.getString(R.string.cancel) ) { dialog, _ -> - findNavController().navigateUp() + try { + findNavController().navigateUp() + } catch (e:Exception) { + dialog.cancel() + } + dialog.cancel() } alertDialog.show() @@ -156,7 +165,12 @@ class NewBenRegFragment : Fragment() { .create() alertBinding.btnNegative.setOnClickListener { alertDialog.dismiss() - findNavController().navigateUp() + try { + findNavController().navigateUp() + }catch (e:Exception){ + alertDialog.dismiss() + } + } alertBinding.btnPositive.setOnClickListener { if (alertBinding.checkBox.isChecked) { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt index 35642f0f3..abc1d7d5e 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt @@ -86,7 +86,8 @@ class LoginActivity : AppCompatActivity() { } private fun isDeviceRootedOrEmulator(): Boolean { - return CommonUtils.isRooted() || CommonUtils.isEmulator() || RootedUtil().isDeviceRooted(applicationContext) + return CommonUtils.isRooted() || CommonUtils.isEmulator() +// || RootedUtil().isDeviceRooted(applicationContext) } From b8777ae651265fb87242c107ea24555df77b3f38 Mon Sep 17 00:00:00 2001 From: Ritik Date: Tue, 27 Aug 2024 18:14:45 +0530 Subject: [PATCH 033/892] some modification on share button (UI). --- .../sakhi/adapters/HRPAdapter.kt | 12 +++++----- .../HRPMicroBirthPlanTable.kt | 5 ++--- app/src/main/res/drawable/icon_whatsapp.xml | 22 +++++++++++++++++++ .../fragment_h_r_p_micro_birth_plan_table.xml | 2 ++ .../res/layout/rv_item_ben_with_hrpa_form.xml | 7 ++++++ 5 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 app/src/main/res/drawable/icon_whatsapp.xml diff --git a/app/src/main/java/org/piramalswasthya/sakhi/adapters/HRPAdapter.kt b/app/src/main/java/org/piramalswasthya/sakhi/adapters/HRPAdapter.kt index 2088ba152..c6e094192 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/adapters/HRPAdapter.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/adapters/HRPAdapter.kt @@ -8,6 +8,7 @@ import android.widget.LinearLayout import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView +import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.databinding.RvItemBenWithHrpaFormBinding import org.piramalswasthya.sakhi.model.BenWithHRPADomain @@ -84,8 +85,10 @@ class HRPAdapter( var completelyFilled: Boolean = false var formEnabled: Boolean = false (binding.btnForm2.layoutParams as LinearLayout.LayoutParams).weight=1.2f - (binding.btnForm1.layoutParams as LinearLayout.LayoutParams).weight=0.9f - (binding.btnForm3.layoutParams as LinearLayout.LayoutParams).weight=0.9f + (binding.btnForm1.layoutParams as LinearLayout.LayoutParams).weight=0.8f + (binding.btnForm3.layoutParams as LinearLayout.LayoutParams).weight=1.0f + binding.btnForm3.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.icon_whatsapp, 0); + val formButton = when (formNumber) { 1 -> { @@ -116,14 +119,13 @@ class HRPAdapter( 3 -> { binding.btnForm3.also { -// hasForm = item.assess.noOfDeliveries.form3Filled hasForm = item.mbp != null if (hasForm) { formEnabled = true (binding.btnForm2.layoutParams as LinearLayout.LayoutParams).weight=1.2f - (binding.btnForm1.layoutParams as LinearLayout.LayoutParams).weight=0.9f - (binding.btnForm3.layoutParams as LinearLayout.LayoutParams).weight=0.9f + (binding.btnForm1.layoutParams as LinearLayout.LayoutParams).weight=0.8f + (binding.btnForm3.layoutParams as LinearLayout.LayoutParams).weight=1.0f } else { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt index e5be9bc5f..84a40304b 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt @@ -67,7 +67,6 @@ class HRPMicroBirthPlanTable : Fragment() { } - viewModel.benName.observe(viewLifecycleOwner) { binding.namePw.text = "${resources.getString(R.string.pw_name)} $it" } @@ -162,13 +161,13 @@ class HRPMicroBirthPlanTable : Fragment() { } private fun shareImage(imageUri: Uri) { - val intent = Intent(Intent.ACTION_SEND) intent.putExtra(Intent.EXTRA_STREAM, imageUri) intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.micro_birth_plan)) intent.putExtra(Intent.EXTRA_SUBJECT, "Subject Here") + intent.setPackage("com.whatsapp") intent.setType("image/png") - startActivity(Intent.createChooser(intent, "Share Via")) + startActivity(intent) } diff --git a/app/src/main/res/drawable/icon_whatsapp.xml b/app/src/main/res/drawable/icon_whatsapp.xml new file mode 100644 index 000000000..67a649abb --- /dev/null +++ b/app/src/main/res/drawable/icon_whatsapp.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/app/src/main/res/layout/fragment_h_r_p_micro_birth_plan_table.xml b/app/src/main/res/layout/fragment_h_r_p_micro_birth_plan_table.xml index a0a98944c..18e103cd1 100644 --- a/app/src/main/res/layout/fragment_h_r_p_micro_birth_plan_table.xml +++ b/app/src/main/res/layout/fragment_h_r_p_micro_birth_plan_table.xml @@ -282,6 +282,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" + android:drawableRight="@drawable/icon_whatsapp" android:layout_margin="@dimen/margin_normal" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -289,6 +290,7 @@ android:textColor="?attr/colorOnPrimary" android:text="Share" /> + diff --git a/app/src/main/res/layout/rv_item_ben_with_hrpa_form.xml b/app/src/main/res/layout/rv_item_ben_with_hrpa_form.xml index 4b330b6dd..460ba94b3 100644 --- a/app/src/main/res/layout/rv_item_ben_with_hrpa_form.xml +++ b/app/src/main/res/layout/rv_item_ben_with_hrpa_form.xml @@ -310,6 +310,8 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" + android:paddingLeft="5dp" + android:paddingRight="5dp" android:layout_margin="@dimen/margin_small" android:visibility="invisible" android:onClick="@{()-> clickListener.onClickForm3(benWithhrpa)}" @@ -322,6 +324,9 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" + android:paddingLeft="5dp" + android:paddingRight="5dp" + android:singleLine="true" android:layout_margin="@dimen/margin_small" android:visibility="invisible" android:onClick="@{()-> clickListener.onClickForm2(benWithhrpa)}" @@ -336,6 +341,8 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" + android:paddingLeft="5dp" + android:paddingRight="5dp" android:onClick="@{()-> clickListener.onClickForm1(benWithhrpa)}" android:layout_margin="@dimen/margin_small" android:visibility="invisible" From d60e39d8af6ac3eac92288114d6e3cd811d35295 Mon Sep 17 00:00:00 2001 From: sushant-bitbucket Date: Thu, 29 Aug 2024 20:03:23 +0530 Subject: [PATCH 034/892] Fundal Height Validations Corrected --- .../sakhi/configuration/PregnantWomanAncVisitDataset.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt index 08288c3a5..36e00331a 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt @@ -153,6 +153,8 @@ class PregnantWomanAncVisitDataset( title = "Fundal Height / Size of the Uterus weeks", etInputType = android.text.InputType.TYPE_CLASS_NUMBER or android.text.InputType.TYPE_NUMBER_VARIATION_NORMAL, etMaxLength = 2, + min = 1, + max = 99, required = false, ) private val urineAlbumin = FormElement( @@ -630,6 +632,8 @@ class PregnantWomanAncVisitDataset( weight.id -> validateIntMinMax(weight) + fundalHeight.id -> validateIntMinMax(fundalHeight) + hb.id -> { validateDoubleUpto1DecimalPlaces(hb) if (hb.errorText == null) validateDoubleMinMax(hb) From 7ec539b006a480cf53699567eca377519d6cbb8c Mon Sep 17 00:00:00 2001 From: sushant-bitbucket Date: Thu, 29 Aug 2024 20:08:17 +0530 Subject: [PATCH 035/892] Pulse Rate Validations Corrected --- .../sakhi/configuration/PregnantWomanAncVisitDataset.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt index 36e00331a..70c3fbcaf 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt @@ -133,6 +133,8 @@ class PregnantWomanAncVisitDataset( etInputType = android.text.InputType.TYPE_CLASS_NUMBER or android.text.InputType.TYPE_NUMBER_VARIATION_NORMAL, etMaxLength = 3, title = "Pulse Rate", + min = 1, + max = 999, required = false, ) @@ -634,6 +636,8 @@ class PregnantWomanAncVisitDataset( fundalHeight.id -> validateIntMinMax(fundalHeight) + pulseRate.id -> validateIntMinMax(pulseRate) + hb.id -> { validateDoubleUpto1DecimalPlaces(hb) if (hb.errorText == null) validateDoubleMinMax(hb) From 5b099e8dc96430b0a9a6cceb4958de8766a95418 Mon Sep 17 00:00:00 2001 From: Ritik Date: Fri, 30 Aug 2024 12:45:17 +0530 Subject: [PATCH 036/892] Added ASHA worker name and subcenter information in caption, when sharing on whatsapp --- .../sakhi/adapters/HRPAdapter.kt | 15 +++---- .../HRPMicroBirthPlanViewModel.kt | 4 ++ .../HRPMicroBirthPlanTable.kt | 42 +++++++++++-------- .../fragment_h_r_p_micro_birth_plan_table.xml | 1 - app/src/main/res/values/strings_hrp.xml | 10 ++--- 5 files changed, 41 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/adapters/HRPAdapter.kt b/app/src/main/java/org/piramalswasthya/sakhi/adapters/HRPAdapter.kt index c6e094192..6aaa18f0d 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/adapters/HRPAdapter.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/adapters/HRPAdapter.kt @@ -84,9 +84,7 @@ class HRPAdapter( var hasForm: Boolean = false var completelyFilled: Boolean = false var formEnabled: Boolean = false - (binding.btnForm2.layoutParams as LinearLayout.LayoutParams).weight=1.2f - (binding.btnForm1.layoutParams as LinearLayout.LayoutParams).weight=0.8f - (binding.btnForm3.layoutParams as LinearLayout.LayoutParams).weight=1.0f + buttonFlexibleWidth() binding.btnForm3.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.icon_whatsapp, 0); @@ -123,9 +121,7 @@ class HRPAdapter( if (hasForm) { formEnabled = true - (binding.btnForm2.layoutParams as LinearLayout.LayoutParams).weight=1.2f - (binding.btnForm1.layoutParams as LinearLayout.LayoutParams).weight=0.8f - (binding.btnForm3.layoutParams as LinearLayout.LayoutParams).weight=1.0f + buttonFlexibleWidth() } else { @@ -194,6 +190,12 @@ class HRPAdapter( ) } + + private fun buttonFlexibleWidth() { + (binding.btnForm2.layoutParams as LinearLayout.LayoutParams).weight=1.2f + (binding.btnForm1.layoutParams as LinearLayout.LayoutParams).weight=0.8f + (binding.btnForm3.layoutParams as LinearLayout.LayoutParams).weight=1.0f + } } override fun onCreateViewHolder( @@ -214,7 +216,6 @@ class HRPAdapter( private val clickedForm3: ((hhId: Long, benId: Long) -> Unit)? = null ) { - // fun onClickedBen(item: HRPAViewHolder) = clickedBen?.let { it() }(item.benId) fun onClickForm1(item: BenWithHRPADomain) = clickedForm1?.let { it(item.ben.hhId, item.ben.benId) } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan/HRPMicroBirthPlanViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan/HRPMicroBirthPlanViewModel.kt index ad71a3486..31ddee160 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan/HRPMicroBirthPlanViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan/HRPMicroBirthPlanViewModel.kt @@ -45,6 +45,10 @@ constructor( val benDetails: BenRegGen get() = _benDetails + val currentUser = preferenceDao.getLoggedInUser() + + val currentLocation = preferenceDao.getLocationRecord() + private val _benAgeGender = MutableLiveData() val benAgeGender: LiveData get() = _benAgeGender diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt index 84a40304b..bade31de8 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt @@ -72,6 +72,10 @@ class HRPMicroBirthPlanTable : Fragment() { } + viewModel.currentLocation?.let { + binding.scHwc.text = "${resources.getString(R.string.sc_hwc_tg_hosp)} :\n${it.village.name}" + + } viewModel.benAgeGender.observe(viewLifecycleOwner) { binding.age.text = "${resources.getString(R.string.b_age)} $it" @@ -82,23 +86,22 @@ class HRPMicroBirthPlanTable : Fragment() { if (viewModel._microBirthPlanCache != null){ - binding.contactNo.text = "${resources.getString(R.string.c_no)} ${viewModel._microBirthPlanCache.contactNumber1}\n2- ${viewModel._microBirthPlanCache.contactNumber2}" - binding.scHwc.text = "${resources.getString(R.string.sc_hwc_tg_hosp)}:\n${viewModel._microBirthPlanCache.scHosp}" - binding.husbandName.text = "${resources.getString(R.string.husband_s_name)}:\n${viewModel.benDetails.spouseName}" - binding.lmp.text = "${resources.getString(R.string.lmp)}:\n${viewModel.benDetails.lastMenstrualPeriod}" - binding.nrScHwc.text = "${resources.getString(R.string.lmp)}:\n${viewModel._microBirthPlanCache.nearestSc}" - binding.block.text = "${resources.getString(R.string.block)}:\n${viewModel._microBirthPlanCache.block}" - binding.edd.text = "${resources.getString(R.string.edd)}:\n${viewModel.benDetails.marriageDate}" - binding.nrPhc.text = "${resources.getString(R.string.nearest_24x7_phc)}:\n${viewModel._microBirthPlanCache.nearestPhc}" - binding.bankAccNo.text = "${resources.getString(R.string.bank_acc_no)}:\n${viewModel._microBirthPlanCache.bankac}" - binding.nrFru.text = "${resources.getString(R.string.nearest_fru)}:\n${viewModel._microBirthPlanCache.nearestFru}" - binding.nrUsg.text = "${resources.getString(R.string.nearest_usg_centre)}:\n${viewModel._microBirthPlanCache.usg}" - binding.bloodGrp.text = "${resources.getString(R.string.blood_group)}:\n${viewModel._microBirthPlanCache.bloodGroup}" - binding.bloodDonr.text = "${resources.getString(R.string.b_blood_donor)} ${viewModel._microBirthPlanCache.bloodDonors1}\n2: " + "${viewModel._microBirthPlanCache.bloodDonors2}" - binding.birthComp.text = "${resources.getString(R.string.birth_companion)}:\n${viewModel._microBirthPlanCache.birthCompanion}" - binding.prsonTkCare.text = "${resources.getString(R.string.person_who_will_take_care_of_children_if_any_when_the_pw_is_admitted_for_delivery)}:\n${viewModel._microBirthPlanCache.careTaker}" - binding.nameOfContNo.text = "${resources.getString(R.string.name_of_vhsnd_community_member_for_support_during_emergency)}:\n${viewModel._microBirthPlanCache.communityMember}" - binding.modeOfTrasp.text = "${resources.getString(R.string.mode_of_transportation_in_case_of_labour_pain)}:\n${viewModel._microBirthPlanCache.modeOfTransportation}" + binding.contactNo.text = "${resources.getString(R.string.c_no)} ${viewModel._microBirthPlanCache.contactNumber1}\n2 - ${viewModel._microBirthPlanCache.contactNumber2}" + binding.husbandName.text = "${resources.getString(R.string.husband_s_name)} :\n${viewModel.benDetails.spouseName}" + binding.lmp.text = "${resources.getString(R.string.lmp)} :\n${viewModel.benDetails.lastMenstrualPeriod}" + binding.nrScHwc.text = "${resources.getString(R.string.lmp)} :\n${viewModel._microBirthPlanCache.nearestSc}" + binding.block.text = "${resources.getString(R.string.block)} :\n${viewModel._microBirthPlanCache.block}" + binding.edd.text = "${resources.getString(R.string.edd)} :\n${viewModel.benDetails.marriageDate}" + binding.nrPhc.text = "${resources.getString(R.string.nearest_24x7_phc)} :\n${viewModel._microBirthPlanCache.nearestPhc}" + binding.bankAccNo.text = "${resources.getString(R.string.bank_acc_no)} :\n${viewModel._microBirthPlanCache.bankac}" + binding.nrFru.text = "${resources.getString(R.string.nearest_fru)} :\n${viewModel._microBirthPlanCache.nearestFru}" + binding.nrUsg.text = "${resources.getString(R.string.nearest_usg_centre)} :\n${viewModel._microBirthPlanCache.usg}" + binding.bloodGrp.text = "${resources.getString(R.string.blood_group)} :\n${viewModel._microBirthPlanCache.bloodGroup}" + binding.bloodDonr.text = "${resources.getString(R.string.b_blood_donor)} ${viewModel._microBirthPlanCache.bloodDonors1}\n2 - " + "${viewModel._microBirthPlanCache.bloodDonors2}" + binding.birthComp.text = "${resources.getString(R.string.birth_companion)} :\n${viewModel._microBirthPlanCache.birthCompanion}" + binding.prsonTkCare.text = "${resources.getString(R.string.person_who_will_take_care_of_children_if_any_when_the_pw_is_admitted_for_delivery)} :\n${viewModel._microBirthPlanCache.careTaker}" + binding.nameOfContNo.text = "${resources.getString(R.string.name_of_vhsnd_community_member_for_support_during_emergency)} :\n${viewModel._microBirthPlanCache.communityMember}" + binding.modeOfTrasp.text = "${resources.getString(R.string.mode_of_transportation_in_case_of_labour_pain)} :\n${viewModel._microBirthPlanCache.modeOfTransportation}" } @@ -161,9 +164,12 @@ class HRPMicroBirthPlanTable : Fragment() { } private fun shareImage(imageUri: Uri) { + val captionText = " ${getString(R.string.micro_birth_plan)} " + + "\n ASHA Name :- ${viewModel.currentUser!!.name} " + + "\n Sub-center :- ${viewModel.currentLocation!!.village.name}" val intent = Intent(Intent.ACTION_SEND) intent.putExtra(Intent.EXTRA_STREAM, imageUri) - intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.micro_birth_plan)) + intent.putExtra(Intent.EXTRA_TEXT, captionText) intent.putExtra(Intent.EXTRA_SUBJECT, "Subject Here") intent.setPackage("com.whatsapp") intent.setType("image/png") diff --git a/app/src/main/res/layout/fragment_h_r_p_micro_birth_plan_table.xml b/app/src/main/res/layout/fragment_h_r_p_micro_birth_plan_table.xml index 18e103cd1..2463d06bf 100644 --- a/app/src/main/res/layout/fragment_h_r_p_micro_birth_plan_table.xml +++ b/app/src/main/res/layout/fragment_h_r_p_micro_birth_plan_table.xml @@ -24,7 +24,6 @@ app:layout_constraintTop_toTopOf="parent" android:layout_alignParentTop="true" > - diff --git a/app/src/main/res/values/strings_hrp.xml b/app/src/main/res/values/strings_hrp.xml index 8a086c5a3..6b7021603 100644 --- a/app/src/main/res/values/strings_hrp.xml +++ b/app/src/main/res/values/strings_hrp.xml @@ -15,7 +15,7 @@ Bank Acc No Nearest 24x7 PHC Nearest FRU - Nearest USG centre: + Nearest USG centre Nearest SC/HWC Blood donors identified 1 Blood donors identified 2 @@ -109,10 +109,10 @@ Pregnant Women (PW) section Micro Birth Plan Table Share - PW name: - Age: - Contact no:\n1- - Blood donor identified\n1: + PW name : + Age : + Contact no :\n1 - + Blood donor identified\n1 - From f3c9b8b85a0a153b2632ba0e3221408fc75f4e0b Mon Sep 17 00:00:00 2001 From: Ritik Date: Fri, 30 Aug 2024 12:57:57 +0530 Subject: [PATCH 037/892] dash removed only. --- .../micro_birth_plan_table/HRPMicroBirthPlanTable.kt | 4 ++-- app/src/main/res/drawable/light_border.xml | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/drawable/light_border.xml diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt index bade31de8..ca6cc883b 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt @@ -165,8 +165,8 @@ class HRPMicroBirthPlanTable : Fragment() { private fun shareImage(imageUri: Uri) { val captionText = " ${getString(R.string.micro_birth_plan)} " + - "\n ASHA Name :- ${viewModel.currentUser!!.name} " + - "\n Sub-center :- ${viewModel.currentLocation!!.village.name}" + "\n ASHA Name : ${viewModel.currentUser!!.name} " + + "\n Sub-center : ${viewModel.currentLocation!!.village.name}" val intent = Intent(Intent.ACTION_SEND) intent.putExtra(Intent.EXTRA_STREAM, imageUri) intent.putExtra(Intent.EXTRA_TEXT, captionText) diff --git a/app/src/main/res/drawable/light_border.xml b/app/src/main/res/drawable/light_border.xml new file mode 100644 index 000000000..1a17d5b1c --- /dev/null +++ b/app/src/main/res/drawable/light_border.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file From c1bad0aacd85224eb0d2ed56ecdd3de0dacc31a4 Mon Sep 17 00:00:00 2001 From: Ritik Date: Tue, 3 Sep 2024 11:52:28 +0530 Subject: [PATCH 038/892] incentive pdf enhancement and added all the data . --- .../sakhi/ui/home_activity/HomeActivity.kt | 7 +- .../incentives/IncentivesFragment.kt | 199 +++++++++++++++--- .../incentives/IncentivesViewModel.kt | 5 + .../sakhi/ui/login_activity/LoginActivity.kt | 3 +- 4 files changed, 178 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt index 6ee10046a..c87224f93 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt @@ -176,7 +176,7 @@ class HomeActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // This will block user to cast app screen // Toggle screencast mode for staging & production builds -// window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); + window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); super.onCreate(savedInstanceState) _binding = ActivityHomeBinding.inflate(layoutInflater) setContentView(binding.root) @@ -206,7 +206,7 @@ class HomeActivity : AppCompatActivity() { override fun onResume() { // This will block user to cast app screen // Toggle screencast mode for staging & production builds -// window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); + window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); super.onResume() if (isDeviceRootedOrEmulator()) { AlertDialog.Builder(this) @@ -374,7 +374,8 @@ class HomeActivity : AppCompatActivity() { } private fun isDeviceRootedOrEmulator(): Boolean { - return isRooted() || isEmulator() || RootedUtil().isDeviceRooted(applicationContext) +// return isRooted() || isEmulator() || RootedUtil().isDeviceRooted(applicationContext) + return isRooted() || isEmulator() } } \ No newline at end of file diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/incentives/IncentivesFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/incentives/IncentivesFragment.kt index 08f6e4be5..06f96af53 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/incentives/IncentivesFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/incentives/IncentivesFragment.kt @@ -46,7 +46,9 @@ import org.piramalswasthya.sakhi.utils.MonthYearPickerDialog import java.io.File import java.io.FileOutputStream import java.io.IOException +import java.text.SimpleDateFormat import java.util.Calendar +import java.util.Locale import java.util.Objects @@ -214,18 +216,13 @@ class IncentivesFragment : Fragment() { val document = PdfDocument() - val pageNumber = 1 - - incentiveDomainList.forEach { - - } - val pageWidth = 300 + val pageWidth = 345 val pageHeight = 400 var pageInfo = PdfDocument.PageInfo.Builder(pageWidth, pageHeight, 1).create() var page = document.startPage(pageInfo) - val canvas = page.canvas + var canvas = page.canvas val paint = Paint() // paint.isAntiAlias = true paint.isSubpixelText = false @@ -235,7 +232,7 @@ class IncentivesFragment : Fragment() { val textPaint = TextPaint() textPaint.color = Color.BLACK textPaint.textSize = 6f - textPaint.letterSpacing = 0.1f + textPaint.letterSpacing = 0.2f val boxPaint = Paint() @@ -247,8 +244,8 @@ class IncentivesFragment : Fragment() { var x = 10 var y = 50 - val columnWidth = 100 - val rowHeight = 15 + val columnWidth = 130 + val rowHeight = 20 var maxPages = incentiveDomainList.size / 20 + 2 @@ -275,13 +272,6 @@ class IncentivesFragment : Fragment() { paint ) - canvas.drawLine( - x.toFloat(), (pageHeight - lineGap).toFloat(), - (pageWidth - 2 * x).toFloat(), (pageHeight - lineGap).toFloat(), - paint - ) - - // MASTER CLAIM FORMAT FOR ASHAs y += lineGap canvas.drawText( "MASTER CLAIM FORMAT FOR ASHAs", @@ -323,7 +313,7 @@ class IncentivesFragment : Fragment() { //Name of the ASHA:_____________________________ canvas.drawText( - "Name of the ASHA:_____________________________", + "Name of the ASHA: ${viewModel.currentUser?.name}", (x + columnWidth).toFloat(), y.toFloat(), paint @@ -395,7 +385,9 @@ class IncentivesFragment : Fragment() { y += lineGap //Claim from: _______________ to ___________________ canvas.drawText( - "Claim from: _______________ to ___________________", + "Claim from: 01 - $selectedMonth - $selectedYear to ${ + getCurrentDateString() + }", (x + columnWidth).toFloat(), y.toFloat(), paint @@ -438,18 +430,146 @@ class IncentivesFragment : Fragment() { x = 10 val items: List = viewModel.mapToView(incentiveDomainList) + val activityItems = ArrayList() + activityItems.add(0,addDataIntoIncentiveDomain("CHILD HEALTH","Providing HBNC up to 42 days after birth / discharge from SNCU")) + activityItems.add(1,addDataIntoIncentiveDomain("CHILD HEALTH","Incentive to ASHA for quarterly visits of HBYC")) + activityItems.add(2,addDataIntoIncentiveDomain("CHILD HEALTH","Incentive to ASHA for follow up of SNCU discharge babies and for follow up of LBW babies")) + activityItems.add(3,addDataIntoIncentiveDomain("CHILD HEALTH","ASHA incentive for referral of SAM cases to NRC and for follow up of discharged SAM children from NRC")) + activityItems.add(4,addDataIntoIncentiveDomain("CHILD HEALTH","Child Death Reporting")) + activityItems.add(5,addDataIntoIncentiveDomain("CHILD HEALTH","Incentive for quarterly mothers' meeting under MAA")) + activityItems.add(6,addDataIntoIncentiveDomain("CHILD HEALTH","Incentive for National Deworming Day for mobilising out of school children")) + activityItems.add(7,addDataIntoIncentiveDomain("CHILD HEALTH","Incentive for IDCF for prophylactic distribution of ORS to family with under-five children")) + activityItems.add(8,addDataIntoIncentiveDomain("CHILD HEALTH","National Iron Plus Incentive for mobilizing WRA (non pregnant & non lactating Women 20-49 years)")) + activityItems.add(9,addDataIntoIncentiveDomain("CHILD HEALTH","NIPI Incentive for mobilizing children and/or ensuring compliance and reporting (6-59 months")) + activityItems.add(10,addDataIntoIncentiveDomain("IMMUNIZATION","ASHA incentive for ensuring for full immunization(0-1 year)")) + activityItems.add(11,addDataIntoIncentiveDomain("IMMUNIZATION","Ensuring for complete immunization (1 - 2 years)")) + activityItems.add(12,addDataIntoIncentiveDomain("IMMUNIZATION","Ensuring for DPT immunization(5 years)")) + activityItems.add(13,addDataIntoIncentiveDomain("IMMUNIZATION","mobilization of children in every session site")) + activityItems.add(14,addDataIntoIncentiveDomain("MATERNAL HEALTH","ASHA incentive for ANC registration within 1st Trimester")) + activityItems.add(15,addDataIntoIncentiveDomain("MATERNAL HEALTH","ASHA incentive for ensuring Full ANC")) + activityItems.add(16,addDataIntoIncentiveDomain("MATERNAL HEALTH","ASHA incentive for Comprehensive Abortion Care")) + activityItems.add(17,addDataIntoIncentiveDomain("MATERNAL HEALTH","ASHA incentive for Community Based Distribution of Misoprostol")) + activityItems.add(18,addDataIntoIncentiveDomain("MATERNAL HEALTH","ASHA incentive for ensuring Institutional delivery of identified HRP")) + activityItems.add(19,addDataIntoIncentiveDomain("MATERNAL HEALTH","EPMSMA - instt delivery")) + activityItems.add(20,addDataIntoIncentiveDomain("MATERNAL HEALTH","EPMSMA - IF HRPW identified at PMSMA Site")) + activityItems.add(21,addDataIntoIncentiveDomain("MATERNAL HEALTH","ASHA Incentive for maternal death reporting ")) + activityItems.add(22,addDataIntoIncentiveDomain("MATERNAL HEALTH","For ensuring early registration of pregnancy and opening of bank account of beneficiary")) + activityItems.add(23,addDataIntoIncentiveDomain("MATERNAL HEALTH","Rs. 100/ for ensuring one ANC by MO in the third trimester")) + activityItems.add(24,addDataIntoIncentiveDomain("MATERNAL HEALTH","For motivating Institutional delivery of the beneficiary")) + activityItems.add(25,addDataIntoIncentiveDomain("ASHA Incentive under JSY","JSY incentive for ASHA for 1st Delivery(Rural) for Antenatal Component")) + activityItems.add(26,addDataIntoIncentiveDomain("ASHA Incentive under JSY","JSY incentive for ASHA for 1st Delivery(Rural) for facilitating Institutional Delivery")) + activityItems.add(27,addDataIntoIncentiveDomain("ASHA Incentive under JSY","JSY incentive for ASHA for 2nd Delivery(Rural) for Antenatal Component")) + activityItems.add(28,addDataIntoIncentiveDomain("ASHA Incentive under JSY","JSY incentive for ASHA for 2nd Delivery(Rural) for facilitating Institutional Delivery")) + activityItems.add(29,addDataIntoIncentiveDomain("ASHA Incentive under JSY","JSY incentive for ASHA for 3rd Delivery(Rural) for Antenatal Component")) + activityItems.add(30,addDataIntoIncentiveDomain("ASHA Incentive under JSY","JSY incentive for ASHA for 3rd Delivery(Rural) for facilitating Institutional Delivery")) + activityItems.add(31,addDataIntoIncentiveDomain("ASHA Incentive under JSY","JSY incentive for ASHA for 4th Delivery(Rural) for Antenatal Component")) + activityItems.add(32,addDataIntoIncentiveDomain("ASHA Incentive under JSY","JSY incentive for ASHA for 4th Delivery(Rural) for facilitating Institutional Delivery")) + activityItems.add(33,addDataIntoIncentiveDomain("ASHA Incentive under JSY","JSY incentive(Urban) for Antenatal Component")) + activityItems.add(34,addDataIntoIncentiveDomain("ASHA Incentive under JSY","JSY incentive (Urban)for facilitating Institutional Delivery")) + activityItems.add(35,addDataIntoIncentiveDomain("FAMILY PLANNING","ASHA incentive for accompanying the client for Injectable MPA(Antara Prog)administration")) + activityItems.add(36,addDataIntoIncentiveDomain("FAMILY PLANNING","ASHA incentive for accompanying the client for Injectable MPA(Antara Prog)administration")) + activityItems.add(37,addDataIntoIncentiveDomain("FAMILY PLANNING","ASHA incentive for accompanying the client for Injectable MPA(Antara Prog)administration")) + activityItems.add(38,addDataIntoIncentiveDomain("FAMILY PLANNING","ASHA incentive for accompanying the client for Injectable MPA(Antara Prog)administration")) + activityItems.add(39,addDataIntoIncentiveDomain("FAMILY PLANNING","Ensuring 3 years gap between 1st and 2nd child birth")) + activityItems.add(40,addDataIntoIncentiveDomain("FAMILY PLANNING","Ensuring delaying 2 years for first child birth after marriage")) + activityItems.add(41,addDataIntoIncentiveDomain("FAMILY PLANNING","Ensuring limiting after 2 child")) + activityItems.add(42,addDataIntoIncentiveDomain("FAMILY PLANNING","For motivating a woman for PPIUCD insertion ")) + activityItems.add(43,addDataIntoIncentiveDomain("FAMILY PLANNING","For motivating PAIUCD")) + activityItems.add(44,addDataIntoIncentiveDomain("FAMILY PLANNING","Home Delivery Contraceptive-Condom")) + activityItems.add(45,addDataIntoIncentiveDomain("FAMILY PLANNING","Home Delivery Contraceptive-Oral Pills")) + activityItems.add(46,addDataIntoIncentiveDomain("FAMILY PLANNING","Home Delivery Contraceptive-EC")) + activityItems.add(47,addDataIntoIncentiveDomain("FAMILY PLANNING","For motivating Female sterilization")) + activityItems.add(48,addDataIntoIncentiveDomain("FAMILY PLANNING","For motivating a woman for PPS")) + activityItems.add(49,addDataIntoIncentiveDomain("FAMILY PLANNING","For Motivating Minilap")) + activityItems.add(50,addDataIntoIncentiveDomain("FAMILY PLANNING","For motivating Male sterilization")) + activityItems.add(51,addDataIntoIncentiveDomain("FAMILY PLANNING","ASHA incentive for updation of EC survey before each MPV campaign")) + activityItems.add(52,addDataIntoIncentiveDomain("FAMILY PLANNING","Incentive to mobilize Saas Bahu Sammelan")) + activityItems.add(53,addDataIntoIncentiveDomain("FAMILY PLANNING","Incentive for Distributing Naye Pahel Kit")) + activityItems.add(54,addDataIntoIncentiveDomain("ADOLESCENT HEALTH","Menstrual Hygiene – For selling sanitary napkin.")) + activityItems.add(55,addDataIntoIncentiveDomain("ADOLESCENT HEALTH","Incentive for selection and support of Peer Educator")) + activityItems.add(56,addDataIntoIncentiveDomain("ADOLESCENT HEALTH","Incentive for mobilizing adolescents and community for AHD")) + activityItems.add(57,addDataIntoIncentiveDomain("ASHA Monthly Routine Activities","a) Mobilizing and attending Village Health and Nutrition Day")) + activityItems.add(58,addDataIntoIncentiveDomain("ASHA Monthly Routine Activities","b) Convening and guiding monthly Village Health Sanitation and Nutrition meeting")) + activityItems.add(59,addDataIntoIncentiveDomain("ASHA Monthly Routine Activities","c)Attending PHC Review meeting")) + activityItems.add(60,addDataIntoIncentiveDomain("ASHA Monthly Routine Activities","Activities Like:\n" + + "I) Line listing of household done at beginning of the year and \n" + + "updated after every six months. \n" + + "II) Maintaining village health register and supporting universal \n" + + "registration of births and deaths")) + activityItems.add(61,addDataIntoIncentiveDomain("Umbrella Programmes","NPCB - For ensuring Treatment of Cataract surgery in Govt. facility")) + activityItems.add(62,addDataIntoIncentiveDomain("Umbrella Programmes","NPCB - For ensuring Treatment of Cataract surgery in Private facility")) + activityItems.add(63,addDataIntoIncentiveDomain("Umbrella Programmes","Incentive for completion of 6 month treatment of DSTB")) + activityItems.add(64,addDataIntoIncentiveDomain("Umbrella Programmes","Incentive for completion of 18 month treatment of DRTB")) + activityItems.add(65,addDataIntoIncentiveDomain("Umbrella Programmes","Informant incentive for active case finding")) + activityItems.add(66,addDataIntoIncentiveDomain("Umbrella Programmes","NLEP – Sensitization ASHA Incentive for training on Leprosy")) + activityItems.add(67,addDataIntoIncentiveDomain("Umbrella Programmes","NLEP - Incentive for case detection")) + activityItems.add(68,addDataIntoIncentiveDomain("Umbrella Programmes","NLEP - for ensuring complete treatment of PB cases.")) + activityItems.add(69,addDataIntoIncentiveDomain("Umbrella Programmes","NLEP - for ensuring complete treatment of MB cases.")) + activityItems.add(70,addDataIntoIncentiveDomain("Umbrella Programmes","Partial Incentives to the ASHAs for Leprosy suspects")) + activityItems.add(71,addDataIntoIncentiveDomain("Umbrella Programmes","NVBDCP -For malaria slide collection.")) + activityItems.add(72,addDataIntoIncentiveDomain("Umbrella Programmes","NVBDCP -For ensuring treatment of Malaria positive cases")) + activityItems.add(73,addDataIntoIncentiveDomain("Umbrella Programmes","ASHA incentive for referral of AES/JE cases to the nearest CHC/DH/Medical College")) + activityItems.add(74,addDataIntoIncentiveDomain("Umbrella Programmes","ASHA Incentive for Dengue and Chikungunya")) + activityItems.add(75,addDataIntoIncentiveDomain("Umbrella Programmes","NIDDCP – For testing 50 salt samples per month")) + activityItems.add(76,addDataIntoIncentiveDomain("NCD","Incentive for population enumeration,CBAC filling and mobilizing for NCD screening ")) + activityItems.add(77,addDataIntoIncentiveDomain("NCD","Incentive for follow up and treatment compliance for 6 months for patients diagnosed with Hypertension,Diabetes,Mellitus & 3 common cancers(Oral, Breast,Carvical)")) + activityItems.add(78,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","a) Line Listing of Adolscent and linkage with WIFS")) + activityItems.add(79,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","b) Line Listing of Adolscent and linkage with WIFS")) + activityItems.add(80,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","c)Line Listing of Screened children under RBSK by Mobile Health Team in her are")) + activityItems.add(81,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","d)Facilitation of High Risk Pregnancy identification and line listing")) + activityItems.add(82,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","e)Follow up of Full ANC with complete routine examination of each pregnant women")) + activityItems.add(83,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","f)Mobilizing for screening of HIV of all pregnant women")) + activityItems.add(84,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","g)Identification of Malaria/Dengue/JE cases and line listing")) + activityItems.add(85,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","h)Identification of TB Cases and line listing")) + activityItems.add(86,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","i)Updating of MCP Card and ensuring opening of bank A/C of beneficiary registered in her area")) + activityItems.add(87,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","j)Participating in NCD Screening in her area")) + activityItems.add(88,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","k)Ensuring supplement of IFA to under 5 children and line listing")) + activityItems.add(89,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","l)Follow-up of full immunization with JE,MR,Rota Virus, Vitamin A, etc and line listing")) + activityItems.add(90,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","m)Identification of number of under 5 children with diarrhea traced and distributed ORS during the month and line listing")) + + + for(i in activityItems.indices) { + + for(j in items.indices) { + if (items[j].group == activityItems[i].group && items[j].description == activityItems[i].description) { + activityItems[i] = items[j] + } + } + } + var currentGroup = "" var slNo = 1 y += rowHeight + + var total = 0L - items.forEach { - if (y > pageHeight) { + activityItems.forEach { + if (y > pageHeight-15) { document.finishPage(page) currentPage++ pageInfo = PdfDocument.PageInfo.Builder(pageWidth, pageHeight, currentPage).create() page = document.startPage(pageInfo) + canvas = page.canvas y = rowHeight + canvas.drawLine( + x.toFloat(), y.toFloat(), + (pageWidth - 2 * x).toFloat(), y.toFloat(), + paint + ) + + canvas.drawLine( + x.toFloat(), y.toFloat(), + x.toFloat(), (pageHeight - lineGap).toFloat(), + paint + ) + + canvas.drawLine( + (pageWidth - 2 * x).toFloat(), y.toFloat(), + (pageWidth - 2 * x).toFloat(), (pageHeight - lineGap).toFloat(), + paint + ) + } else { if (currentGroup.contentEquals(it.group)) { // @@ -463,7 +583,7 @@ class IncentivesFragment : Fragment() { y = y.toFloat(), start = 0 ) - y += rowHeight + y += 10 } drawItemBox( @@ -480,12 +600,16 @@ class IncentivesFragment : Fragment() { it.amountClaimed.toString(), "", it.fmrCode ?: "", - "lia" + "" ) total += it.amountClaimed - y += rowHeight currentGroup = it.group - slNo += 1 + y += rowHeight + if (slNo != 75) { + slNo += 1 + } + + } } @@ -571,7 +695,7 @@ class IncentivesFragment : Fragment() { y += rowHeight canvas1.drawMultilineText( - text = "Name of the ASHA", + text = "Name of the ASHA : ${viewModel.currentUser?.name}", textPaint = textPaint, alignment = Layout.Alignment.ALIGN_NORMAL, width = pageWidth - 2 * x, @@ -614,7 +738,7 @@ class IncentivesFragment : Fragment() { ) y += rowHeight canvas1.drawMultilineText( - text = "Village:", + text = "Village: ${viewModel.locationRecord!!.village.name}", textPaint = textPaint, alignment = Layout.Alignment.ALIGN_NORMAL, width = pageWidth - 2 * x, @@ -712,6 +836,7 @@ class IncentivesFragment : Fragment() { Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) val file = File(directory, fileName) + try { document.writeTo(FileOutputStream(file)) val snackbar = Snackbar.make(binding.root, "$fileName downloaded", Snackbar.LENGTH_LONG) @@ -729,6 +854,10 @@ class IncentivesFragment : Fragment() { } + private fun addDataIntoIncentiveDomain(groupName: String,description: String): IncentiveDomainDTO { + return IncentiveDomainDTO(0,groupName,"",description,"",0,0,0,"") + } + private fun showFile(uri: Uri) { // Create an Intent to open the file val openFileIntent = Intent(Intent.ACTION_VIEW) @@ -766,7 +895,7 @@ class IncentivesFragment : Fragment() { s8: String ) { val colWidth = 15 - val rowHeight = 15 + val rowHeight = 20 var x = 10 canvas.drawMultilineText( text = s, @@ -791,8 +920,8 @@ class IncentivesFragment : Fragment() { canvas.drawMultilineText( text = s1, textPaint = textPaint, - width = 5 * colWidth, - alignment = Layout.Alignment.ALIGN_CENTER, + width = 8 * colWidth, + alignment = Layout.Alignment.ALIGN_NORMAL, x = x.toFloat(), y = y.toFloat(), start = 0 @@ -800,11 +929,11 @@ class IncentivesFragment : Fragment() { canvas.drawRect( x.toFloat(), y.toFloat(), - (x + 5 * colWidth).toFloat(), + (x + 8 * colWidth).toFloat(), (y + rowHeight).toFloat(), boxPaint ) - x += 5 * colWidth + x += 8 * colWidth canvas.drawMultilineText( @@ -971,4 +1100,10 @@ class IncentivesFragment : Fragment() { } +private fun getCurrentDateString(): String { + val calendar = Calendar.getInstance() + val mdFormat = SimpleDateFormat("dd - MMMM - yyyy", Locale.ENGLISH) + return mdFormat.format(calendar.time) +} + diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/incentives/IncentivesViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/incentives/IncentivesViewModel.kt index c93139bff..23ddd61a8 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/incentives/IncentivesViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/incentives/IncentivesViewModel.kt @@ -12,6 +12,7 @@ import org.piramalswasthya.sakhi.database.shared_preferences.PreferenceDao import org.piramalswasthya.sakhi.helpers.setToStartOfTheDay import org.piramalswasthya.sakhi.model.IncentiveDomain import org.piramalswasthya.sakhi.model.IncentiveDomainDTO +import org.piramalswasthya.sakhi.model.LocationRecord import org.piramalswasthya.sakhi.model.getDateStrFromLong import org.piramalswasthya.sakhi.repositories.IncentiveRepo import java.util.Calendar @@ -50,6 +51,10 @@ class IncentivesViewModel @Inject constructor( private val range = MutableStateFlow(Pair(initStart, initEnd)) + val currentUser = pref.getLoggedInUser() + + val locationRecord: LocationRecord? = pref.getLocationRecord() + val incentiveList: Flow> = sourceIncentiveList.combine(range) { list, range -> diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt index 35642f0f3..89b2fe7b2 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt @@ -86,7 +86,8 @@ class LoginActivity : AppCompatActivity() { } private fun isDeviceRootedOrEmulator(): Boolean { - return CommonUtils.isRooted() || CommonUtils.isEmulator() || RootedUtil().isDeviceRooted(applicationContext) +// return CommonUtils.isRooted() || CommonUtils.isEmulator() || RootedUtil().isDeviceRooted(applicationContext) + return CommonUtils.isRooted() || CommonUtils.isEmulator() } From 7bf72ad793d65e1199f7f6c89ced8019e73200c2 Mon Sep 17 00:00:00 2001 From: sushant-bitbucket Date: Mon, 9 Sep 2024 12:35:03 +0530 Subject: [PATCH 039/892] ABHA v3 M1 Migration Complete --- .../create_abha_id/CreateAbhaFragment.kt | 16 ++++++++-------- .../create_abha_id/CreateAbhaViewModel.kt | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt index a44813c17..bc044877f 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt @@ -125,16 +125,16 @@ class CreateAbhaFragment : Fragment() { val benId = intent.getLongExtra("benId", 0) val benRegId = intent.getLongExtra("benRegId", 0) -// viewModel.createHID(benId, benRegId) + viewModel.createHID(benId, benRegId) - binding.pbCai.visibility = View.INVISIBLE - binding.clCreateAbhaId.visibility = View.VISIBLE - binding.clVerifyMobileOtp.visibility = View.INVISIBLE - binding.clError.visibility = View.INVISIBLE - binding.clDownloadAbha.visibility = View.GONE +// binding.pbCai.visibility = View.INVISIBLE +// binding.clCreateAbhaId.visibility = View.VISIBLE +// binding.clVerifyMobileOtp.visibility = View.INVISIBLE +// binding.clError.visibility = View.INVISIBLE +// binding.clDownloadAbha.visibility = View.GONE - binding.textView2.text = args.name - binding.textView4.text = args.abhaNumber +// binding.textView2.text = args.name +// binding.textView4.text = args.abhaNumber viewModel.benMapped.observe(viewLifecycleOwner) { it?.let { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt index 058084b25..584128e92 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt @@ -54,7 +54,7 @@ class CreateAbhaViewModel @Inject constructor( get() = _errorMessage init { -// _state.value = State.LOADING + _state.value = State.LOADING } fun createHID(benId: Long, benRegId: Long) { From 0bb55101a46e503401da27262cddfbc6dc239343 Mon Sep 17 00:00:00 2001 From: nikhil_a Date: Fri, 13 Sep 2024 12:21:18 +0530 Subject: [PATCH 040/892] Change in README.md file : Added steps required to set up project initially --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6c82a7f40..1c8fb4349 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,11 @@ - Information for the steps followed during the generation of APK’s for Sakhi Application from code **Pre-Requesties:** - - Clone the code repo into android studio and build the application + - Clone the code of updated repo into android studio and build the application. **Secrets:** - - set ENCRYPTED_PASS_KEY, ABHA_CLIENT_ID, ABHA_CLIENT_SECRET values in secrets.properties file + - set ENCRYPTED_PASS_KEY, ABHA_CLIENT_ID, ABHA_CLIENT_SECRET values in secrets.properties file. +**google-json** + - set google json file of required variant ie. uat, staging or production. **Environments**: We can generate the application for below environments based on requirements - Amrit Demo - UAT From 892d353f971ea9676d8e217dc4ccb2142e445e45 Mon Sep 17 00:00:00 2001 From: sushant-bitbucket Date: Fri, 13 Sep 2024 15:44:46 +0530 Subject: [PATCH 041/892] Made BASE URL dynamic --- app/build.gradle | 4 ++++ app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt | 6 ++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 92c0611d0..134e79588 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,6 +23,7 @@ android { versionName "2.0" resConfigs "en", "hi", "as" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + buildConfigField "String", "BASE_TMC_URL", "\"https://amritdemo.piramalswasthya.org/\"" } buildTypes { @@ -43,14 +44,17 @@ android { applicationIdSuffix ".staging" applicationId "org.piramalswasthya.sakhi" resValue "string", "app_native_name", "উৎপ্ৰেৰণা-Stag" + buildConfigField "String", "BASE_TMC_URL", "\"https://amritdemo.piramalswasthya.org/\"" } uat { applicationIdSuffix ".uat" applicationId "org.piramalswasthya.sakhi" resValue "string", "app_native_name", "উৎপ্ৰেৰণা-Uat" + buildConfigField "String", "BASE_TMC_URL", "\"https://amritdemo.piramalswasthya.org/\"" } production { applicationId "org.piramalswasthya.sakhi" + buildConfigField "String", "BASE_TMC_URL", "\"https://assamtmc.piramalswasthya.org/\"" } } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt b/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt index b063ff5e0..1e143b421 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt @@ -10,6 +10,7 @@ import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor +import org.piramalswasthya.sakhi.BuildConfig import org.piramalswasthya.sakhi.database.room.InAppDb import org.piramalswasthya.sakhi.database.room.dao.* import org.piramalswasthya.sakhi.database.shared_preferences.PreferenceDao @@ -28,9 +29,6 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) object AppModule { - private const val baseTmcUrl = - "https://amritdemo.piramalswasthya.org/" - private const val baseAbhaUrl = "https://healthidsbx.abdm.gov.in/api/" private val baseClient = @@ -83,7 +81,7 @@ object AppModule { return Retrofit.Builder() .addConverterFactory(MoshiConverterFactory.create(moshi)) //.addConverterFactory(GsonConverterFactory.create()) - .baseUrl(baseTmcUrl) + .baseUrl(BuildConfig.BASE_TMC_URL) .client(httpClient) .build() .create(AmritApiService::class.java) From 2626e993ce7c1aa5ce4d0ac0e1cf9fd32e156fb8 Mon Sep 17 00:00:00 2001 From: sushant-bitbucket Date: Fri, 13 Sep 2024 19:07:51 +0530 Subject: [PATCH 042/892] Made ABHA BASE URLs dynamic --- app/build.gradle | 14 ++++++++++++++ .../java/org/piramalswasthya/sakhi/di/AppModule.kt | 4 +--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 134e79588..d745064f8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -24,6 +24,10 @@ android { resConfigs "en", "hi", "as" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" buildConfigField "String", "BASE_TMC_URL", "\"https://amritdemo.piramalswasthya.org/\"" + // ABHA v2 Base URL +// buildConfigField "String", "BASE_ABHA_URL", "\"https://healthidsbx.abdm.gov.in/api/\"" + // ABHA v3 Base URL + buildConfigField "String", "BASE_ABHA_URL", "\"https://abhasbx.abdm.gov.in/abha/api/\"" } buildTypes { @@ -45,16 +49,26 @@ android { applicationId "org.piramalswasthya.sakhi" resValue "string", "app_native_name", "উৎপ্ৰেৰণা-Stag" buildConfigField "String", "BASE_TMC_URL", "\"https://amritdemo.piramalswasthya.org/\"" + // ABHA v2 Base URL +// buildConfigField "String", "BASE_ABHA_URL", "\"https://healthidsbx.abdm.gov.in/api/\"" + // ABHA v3 Base URL + buildConfigField "String", "BASE_ABHA_URL", "\"https://abhasbx.abdm.gov.in/abha/api/\"" } uat { applicationIdSuffix ".uat" applicationId "org.piramalswasthya.sakhi" resValue "string", "app_native_name", "উৎপ্ৰেৰণা-Uat" buildConfigField "String", "BASE_TMC_URL", "\"https://amritdemo.piramalswasthya.org/\"" + // ABHA v2 Base URL +// buildConfigField "String", "BASE_ABHA_URL", "\"https://healthidsbx.abdm.gov.in/api/\"" + // ABHA v3 Base URL + buildConfigField "String", "BASE_ABHA_URL", "\"https://abhasbx.abdm.gov.in/abha/api/\"" } production { applicationId "org.piramalswasthya.sakhi" buildConfigField "String", "BASE_TMC_URL", "\"https://assamtmc.piramalswasthya.org/\"" + // ABHA v3 Base URL + buildConfigField "String", "BASE_ABHA_URL", "\"https://healthid.abdm.gov.in/api/\"" } } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt b/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt index 1e143b421..98b2550ae 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt @@ -29,8 +29,6 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) object AppModule { - private const val baseAbhaUrl = "https://healthidsbx.abdm.gov.in/api/" - private val baseClient = OkHttpClient.Builder() .addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) @@ -96,7 +94,7 @@ object AppModule { return Retrofit.Builder() .addConverterFactory(MoshiConverterFactory.create(moshi)) //.addConverterFactory(GsonConverterFactory.create()) - .baseUrl(baseAbhaUrl) + .baseUrl(BuildConfig.BASE_ABHA_URL) .client(httpClient) .build() .create(AbhaApiService::class.java) From 81e8c49a0ca6272a8395558cee4eef08867e3cb1 Mon Sep 17 00:00:00 2001 From: Ritik Date: Sun, 15 Sep 2024 18:37:04 +0530 Subject: [PATCH 043/892] CBAC added none of these field along with the functinality --- .../cbac/CbacFragment.kt | 56 +++++++++++++++++++ .../cbac/CbacViewModel.kt | 2 +- app/src/main/res/layout/fragment_cbac.xml | 56 +++++++++++++++++-- app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings_ncd.xml | 2 +- 5 files changed, 109 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt index efad03d0f..57df9aab5 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt @@ -3,6 +3,7 @@ package org.piramalswasthya.sakhi.ui.home_activity.non_communicable_diseases.cba import android.app.AlertDialog import android.app.DatePickerDialog import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -36,6 +37,8 @@ class CbacFragment : Fragment() { viewModel.cbacId == 0 } + private var isnoneOfThese = false + private var totalScorePopupShown: Boolean = false private var ed1PopupShown: Boolean = false @@ -83,6 +86,54 @@ class CbacFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + binding.noneCheck.setOnCheckedChangeListener { buttonView, isChecked -> + isnoneOfThese = isChecked + if (isChecked) { + binding.cbacHistb.rbNo.isChecked = isChecked + binding.cbacCoughing.rbNo.isChecked = isChecked + binding.cbacBlsputum.rbNo.isChecked = isChecked + binding.cbacFeverwks.rbNo.isChecked = isChecked + binding.cbacLsweight.rbNo.isChecked = isChecked + binding.cbacNtswets.rbNo.isChecked = isChecked + binding.cbacFhTb.rbNo.isChecked = isChecked + binding.cbacTakingTbDrug.rbNo.isChecked = isChecked + binding.cbacRecurrentUlceration.rbNo.isChecked = isChecked + binding.cbacRecurrentTingling.rbNo.isChecked = isChecked + binding.cbacRecurrentCloudy.rbNo.isChecked = isChecked + binding.cbacRecurrentDiffcultyReading.rbNo.isChecked = isChecked + binding.cbacRecurrentPainEyes.rbNo.isChecked = isChecked + binding.cbacRecurrentRednessEyes.rbNo.isChecked = isChecked + binding.cbacRecurrentDiffHearing.rbNo.isChecked = isChecked + binding.cbacBreath.rbNo.isChecked = isChecked + binding.cbacHifits.rbNo.isChecked = isChecked + binding.cbacDifmouth.rbNo.isChecked = isChecked + binding.cbacHeald.rbNo.isChecked = isChecked + binding.cbacVoice.rbNo.isChecked = isChecked + binding.cbacAnyGrowth.rbNo.isChecked = isChecked + binding.cbacAnyWhite.rbNo.isChecked = isChecked + binding.cbacAnyThickendSkin.rbNo.isChecked = isChecked + binding.cbacAnyNodulesSkin.rbNo.isChecked = isChecked + binding.cbacRecurrentNumbness.rbNo.isChecked = isChecked + binding.cbacPainWhileChewing.rbNo.isChecked = isChecked + binding.cbacAnyHyperPigmented.rbNo.isChecked = isChecked + binding.cbacClawingOfFingers.rbNo.isChecked = isChecked + binding.cbacTinglingOrNumbness.rbNo.isChecked = isChecked + binding.cbacInabilityCloseEyelid.rbNo.isChecked = isChecked + binding.cbacDiffHoldingObjects.rbNo.isChecked = isChecked + binding.cbacWeeknessInFeet.rbNo.isChecked = isChecked + binding.cbacLumpbrest.rbNo.isChecked = isChecked + binding.cbacNipple.rbNo.isChecked = isChecked + binding.cbacBreast.rbNo.isChecked = isChecked + binding.cbacBlperiods.rbNo.isChecked = isChecked + binding.cbacBlmenopause.rbNo.isChecked = isChecked + binding.cbacBlintercorse.rbNo.isChecked = isChecked + binding.cbacFouldis.rbNo.isChecked = isChecked + } + + + } + + viewModel.state.observe(viewLifecycleOwner) { when (it) { @@ -131,6 +182,9 @@ class CbacFragment : Fragment() { } } } + + binding.benId.text = viewModel.benId.toString() + viewModel.benName.observe(viewLifecycleOwner) { binding.tvBenName.text = it } @@ -293,6 +347,8 @@ class CbacFragment : Fragment() { private fun setUpView() { binding.btnSave.visibility = View.GONE + binding.noneCheck.visibility = View.GONE + binding.nonTxt.visibility = View.GONE viewModel.filledCbac.observe(viewLifecycleOwner) { cbac -> binding.etDate.setText(getDateFromLong(cbac.fillDate)) setupRaView(cbac) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacViewModel.kt index 2c704033e..80a179658 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacViewModel.kt @@ -106,7 +106,7 @@ class CbacViewModel @Inject constructor( cbac.cbac_age_posi = it + 1 text } - private val benId = CbacFragmentArgs.fromSavedStateHandle(state).benId + val benId = CbacFragmentArgs.fromSavedStateHandle(state).benId val cbacId = CbacFragmentArgs.fromSavedStateHandle(state).cbacId private val ashaId = CbacFragmentArgs.fromSavedStateHandle(state).ashaId private lateinit var cbac: CbacCache diff --git a/app/src/main/res/layout/fragment_cbac.xml b/app/src/main/res/layout/fragment_cbac.xml index 913d94e47..4f7bea855 100644 --- a/app/src/main/res/layout/fragment_cbac.xml +++ b/app/src/main/res/layout/fragment_cbac.xml @@ -41,11 +41,9 @@ android:id="@+id/tv_ben_name" android:layout_width="0dp" android:layout_height="wrap_content" - android:gravity="center" android:padding="@dimen/padding_normal" android:textAppearance="@style/TextAppearance.Material3.TitleMedium" android:textColor="@android:color/white" - app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/tv_age_gender" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -63,6 +61,30 @@ app:layout_constraintEnd_toEndOf="parent" tools:text="36 Years | Male" /> + + + @@ -95,7 +117,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/margin_normal" - android:backgroundTint="?attr/colorOnPrimary" + android:backgroundTint="@color/wood_lightest" android:elevation="@dimen/padding_normal" app:cardCornerRadius="@dimen/padding_normal" app:cardElevation="@dimen/padding_normal"> @@ -448,7 +470,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/margin_normal" - android:backgroundTint="?attr/colorOnPrimary" + android:backgroundTint="@color/md_theme_light_inverseOnSurface" android:elevation="@dimen/padding_normal" app:cardCornerRadius="@dimen/padding_normal" app:cardElevation="@dimen/padding_normal"> @@ -773,6 +795,26 @@ app:fieldName="@{@string/cbac_fouldis}" app:numAsterisk="@{0}" /> + + + + + + + + + @@ -831,7 +875,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/margin_normal" - android:backgroundTint="?attr/colorOnPrimary" + android:backgroundTint="@color/md_theme_light_errorContainer" android:elevation="@dimen/padding_normal" app:cardCornerRadius="@dimen/padding_normal" app:cardElevation="@dimen/padding_normal"> @@ -929,7 +973,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/margin_normal" - android:backgroundTint="?attr/colorOnPrimary" + android:backgroundTint="@color/md_theme_dark_onSurfaceVariant" android:elevation="@dimen/padding_normal" app:cardCornerRadius="@dimen/padding_normal" app:cardElevation="@dimen/padding_normal"> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 3c28583df..901b97678 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -68,4 +68,5 @@ #D8D8D8 #0027FF #E6BF83 + #FBF0D8 diff --git a/app/src/main/res/values/strings_ncd.xml b/app/src/main/res/values/strings_ncd.xml index 0baa99cb9..963af8576 100644 --- a/app/src/main/res/values/strings_ncd.xml +++ b/app/src/main/res/values/strings_ncd.xml @@ -57,7 +57,7 @@ Bleeding after menopause Bleeding after intercourse Foul smelling vaginal discharge - + None of these ** * From d3c1934467d81fb966619b20ab3173ebd22e66fc Mon Sep 17 00:00:00 2001 From: Ritik Date: Sun, 15 Sep 2024 19:54:19 +0530 Subject: [PATCH 044/892] benificiary id title added --- app/src/main/res/layout/fragment_cbac.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/fragment_cbac.xml b/app/src/main/res/layout/fragment_cbac.xml index 4f7bea855..4ea6c9c33 100644 --- a/app/src/main/res/layout/fragment_cbac.xml +++ b/app/src/main/res/layout/fragment_cbac.xml @@ -72,7 +72,7 @@ app:layout_constraintEnd_toStartOf="@+id/tv_age_gender" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/tv_ben_name" - tools:text="@string/beneficiary_id" /> + android:text="@string/beneficiary_id" /> Date: Sun, 15 Sep 2024 20:15:20 +0530 Subject: [PATCH 045/892] last name is editable when adding spouse --- .../piramalswasthya/sakhi/configuration/BenRegFormDataset.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt index 5b4a27c4d..2694fac7b 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt @@ -1160,7 +1160,7 @@ class BenRegFormDataset(context: Context, language: Languages) : Dataset(context firstName.value = hoFSpouse.genDetails?.spouseName firstName.inputType = TEXT_VIEW lastName.value = hoFSpouse.lastName - lastName.inputType = TEXT_VIEW + lastName.inputType = EDIT_TEXT } if (hoFSpouse.gender == FEMALE) { wifeName.value = "${hoFSpouse.firstName} ${hoFSpouse.lastName ?: ""}" From f68454b69f6cddd8f4af10994805d7bf8c783ad9 Mon Sep 17 00:00:00 2001 From: Ritik Date: Sun, 15 Sep 2024 20:34:45 +0530 Subject: [PATCH 046/892] removed unused import. --- .../non_communicable_diseases/cbac/CbacFragment.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt index 57df9aab5..fc0bc5fb4 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt @@ -3,7 +3,6 @@ package org.piramalswasthya.sakhi.ui.home_activity.non_communicable_diseases.cba import android.app.AlertDialog import android.app.DatePickerDialog import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -86,7 +85,7 @@ class CbacFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - binding.noneCheck.setOnCheckedChangeListener { buttonView, isChecked -> + binding.noneCheck.setOnCheckedChangeListener { _, isChecked -> isnoneOfThese = isChecked if (isChecked) { binding.cbacHistb.rbNo.isChecked = isChecked From 32f79fbed3e0031cdf2d70b2a463e9ddc6065a42 Mon Sep 17 00:00:00 2001 From: Ritik Date: Sun, 15 Sep 2024 22:34:39 +0530 Subject: [PATCH 047/892] In child infant registration change weight kg to gram. --- .../piramalswasthya/sakhi/configuration/Dataset.kt | 13 +++++++++++++ .../configuration/InfantRegistrationDataset.kt | 13 ++++++------- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt index 025a0797c..93af21d9b 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt @@ -714,6 +714,19 @@ abstract class Dataset(context: Context, currentLanguage: Languages) { return -1 } + protected fun validateWeightOnEditText(formElement: FormElement): Int { + + formElement.value?.takeIf { it.isNotEmpty() }?.let { + if (it.all { it == '0' }) + formElement.errorText = "Weight Cannot be 0" + else if(it.toInt() > 7000) + formElement.errorText = "Weight Should not be greater than 7000 gram" + else + formElement.errorText = null + } ?: kotlin.run { formElement.errorText = null } + return -1 + } + protected fun validateMcpOnEditText(formElement: FormElement): Int { formElement.errorText = formElement.value?.takeIf { it.isNotEmpty() }?.let { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/InfantRegistrationDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/InfantRegistrationDataset.kt index f762e0366..313d2e6fc 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/InfantRegistrationDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/InfantRegistrationDataset.kt @@ -111,12 +111,13 @@ class InfantRegistrationDataset( private var weight = FormElement( id = 11, inputType = InputType.EDIT_TEXT, - title = "Weight at Birth(kg)", + title = "Weight at Birth(gram)", required = false, hasDependants = false, - minDecimal = 0.5, - maxDecimal = 7.0, - etInputType = android.text.InputType.TYPE_NUMBER_FLAG_DECIMAL, + etMaxLength = 5, + min = 1, + max = 7000, + etInputType = android.text.InputType.TYPE_CLASS_NUMBER, ) private var breastFeedingStarted = FormElement( @@ -301,9 +302,7 @@ class InfantRegistrationDataset( } weight.id -> { - validateDoubleUpto1DecimalPlaces(weight) - if (weight.errorText == null) validateDoubleMinMax(weight) - -1 + validateWeightOnEditText(weight) } From 663bdcfe6d9fbaaafbfc401f770445e0f8004852 Mon Sep 17 00:00:00 2001 From: Ritik Date: Mon, 16 Sep 2024 13:11:10 +0530 Subject: [PATCH 048/892] Change Age group for HBYC and HBNC --- .../org/piramalswasthya/sakhi/database/room/dao/BenDao.kt | 4 ++-- .../java/org/piramalswasthya/sakhi/helpers/Konstants.kt | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/database/room/dao/BenDao.kt b/app/src/main/java/org/piramalswasthya/sakhi/database/room/dao/BenDao.kt index 5f27cdafa..ffc711d01 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/database/room/dao/BenDao.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/database/room/dao/BenDao.kt @@ -203,12 +203,12 @@ interface BenDao { maxPncDate: Long = Konstants.pncEcGap ): Flow> - @Query("SELECT * FROM BEN_BASIC_CACHE WHERE CAST((strftime('%s','now') - dob/1000)/60/60/24/365 AS INTEGER) <= :max and villageId=:selectedVillage") + @Query("SELECT * FROM BEN_BASIC_CACHE WHERE CAST(((strftime('%s','now') - dob/1000)/60/60/24) AS INTEGER) <= :max and villageId=:selectedVillage") fun getAllInfantList( selectedVillage: Int, max: Int = Konstants.maxAgeForInfant ): Flow> - @Query("SELECT * FROM BEN_BASIC_CACHE WHERE CAST((strftime('%s','now') - dob/1000)/60/60/24/365 AS INTEGER) BETWEEN :min and :max and villageId=:selectedVillage") + @Query("SELECT * FROM BEN_BASIC_CACHE WHERE CAST(((strftime('%s','now') - dob/1000)/60/60/24) AS INTEGER) BETWEEN :min and :max and villageId=:selectedVillage") fun getAllChildList( selectedVillage: Int, min: Int = Konstants.minAgeForChild, diff --git a/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt b/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt index e4cb21b2f..2bd87366c 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt @@ -26,9 +26,9 @@ object Konstants { const val minAgeForNcd: Int = 30 const val minAgeForReproductiveAge: Int = 15 const val maxAgeForReproductiveAge: Int = 49 - const val maxAgeForInfant: Int = 1 - const val minAgeForChild: Int = 2 - const val maxAgeForChild: Int = 5 + const val maxAgeForInfant: Int = 42 + const val minAgeForChild: Int = 92 + const val maxAgeForChild: Int = 456 const val minAgeForAdolescent: Int = 6 const val maxAgeForAdolescent: Int = 14 const val maxAgeForCdr: Int = 14 From cfb04420400f09ac11b0fb3022be6b139e7b811f Mon Sep 17 00:00:00 2001 From: Ritik Date: Mon, 16 Sep 2024 16:27:00 +0530 Subject: [PATCH 049/892] some validation changes in microBirthPlan --- .../EligibleCoupleRegistrationDataset.kt | 4 +- .../configuration/HRPMicroBirthPlanDataset.kt | 56 ++++++------------- 2 files changed, 20 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleRegistrationDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleRegistrationDataset.kt index d8df66614..35b6af452 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleRegistrationDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleRegistrationDataset.kt @@ -159,7 +159,7 @@ class EligibleCoupleRegistrationDataset(context: Context, language: Languages) : isMobileNumber = true, etMaxLength = 18, max = 999999999999999999L, - min = 0L + min = 10000000L ) private val bankName = FormElement( @@ -1142,7 +1142,7 @@ class EligibleCoupleRegistrationDataset(context: Context, language: Languages) : } bankAccount.id -> { - validateAllZerosOnEditText(bankAccount) + validateIntMinMax(bankAccount) } bankName.id -> { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/HRPMicroBirthPlanDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/HRPMicroBirthPlanDataset.kt index 30c84ff2a..8a4db5943 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/HRPMicroBirthPlanDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/HRPMicroBirthPlanDataset.kt @@ -16,7 +16,6 @@ class HRPMicroBirthPlanDataset( id = 1, inputType = InputType.EDIT_TEXT, title = resources.getString(R.string.name_of_the_pw), - arrayId = -1, required = true, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) @@ -25,8 +24,7 @@ class HRPMicroBirthPlanDataset( id = 2, inputType = InputType.EDIT_TEXT, title = resources.getString(R.string.nearest_sc_hwc), - arrayId = -1, - required = true, + required = false, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) @@ -43,7 +41,6 @@ class HRPMicroBirthPlanDataset( id = 4, inputType = InputType.EDIT_TEXT, title = resources.getString(R.string.contact_number_1), - arrayId = -1, required = true, isEnabled = false, etInputType = android.text.InputType.TYPE_CLASS_NUMBER or android.text.InputType.TYPE_NUMBER_VARIATION_NORMAL, @@ -57,7 +54,6 @@ class HRPMicroBirthPlanDataset( id = 5, inputType = InputType.EDIT_TEXT, title = resources.getString(R.string.contact_number_2), - arrayId = -1, required = false, etInputType = android.text.InputType.TYPE_CLASS_NUMBER or android.text.InputType.TYPE_NUMBER_VARIATION_NORMAL, isMobileNumber = true, @@ -69,8 +65,7 @@ class HRPMicroBirthPlanDataset( id = 6, inputType = InputType.EDIT_TEXT, title = resources.getString(R.string.sc_hwc_tg_hosp), - arrayId = -1, - required = true, + required = false, etMaxLength = 100, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) @@ -78,9 +73,7 @@ class HRPMicroBirthPlanDataset( id = 7, inputType = InputType.EDIT_TEXT, title = resources.getString(R.string.block), - arrayId = -1, - required = true, - + required = false, etMaxLength = 100, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) @@ -89,21 +82,19 @@ class HRPMicroBirthPlanDataset( id = 8, inputType = InputType.EDIT_TEXT, title = resources.getString(R.string.bank_acc_no), - arrayId = -1, - required = true, + required = false, etInputType = android.text.InputType.TYPE_CLASS_NUMBER or android.text.InputType.TYPE_NUMBER_VARIATION_NORMAL, isMobileNumber = true, - etMaxLength = 12, - max = 999999999999, - min = 100000000000 + etMaxLength = 18, + max = 999999999999999999L, + min = 10000000L ) private val nearestPhc = FormElement( id = 9, inputType = InputType.EDIT_TEXT, title = resources.getString(R.string.nearest_24x7_phc), - arrayId = -1, - required = true, + required = false, etMaxLength = 100, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) @@ -112,8 +103,7 @@ class HRPMicroBirthPlanDataset( id = 10, inputType = InputType.EDIT_TEXT, title = resources.getString(R.string.nearest_fru), - arrayId = -1, - required = true, + required = false, etMaxLength = 100, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) @@ -122,8 +112,7 @@ class HRPMicroBirthPlanDataset( id = 11, inputType = InputType.EDIT_TEXT, title = resources.getString(R.string.blood_donors_identified_1), - arrayId = -1, - required = true, + required = false, etMaxLength = 50, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) @@ -132,8 +121,7 @@ class HRPMicroBirthPlanDataset( id = 12, inputType = InputType.EDIT_TEXT, title = resources.getString(R.string.blood_donors_identified_2), - arrayId = -1, - required = true, + required = false, etMaxLength = 50, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) @@ -142,8 +130,7 @@ class HRPMicroBirthPlanDataset( id = 13, inputType = InputType.EDIT_TEXT, title = resources.getString(R.string.birth_companion), - arrayId = -1, - required = true, + required = false, etMaxLength = 50, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) @@ -152,8 +139,7 @@ class HRPMicroBirthPlanDataset( id = 14, inputType = InputType.EDIT_TEXT, title = resources.getString(R.string.person_who_will_take_care_of_children_if_any_when_the_pw_is_admitted_for_delivery), - arrayId = -1, - required = true, + required = false, etMaxLength = 50, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS @@ -163,8 +149,7 @@ class HRPMicroBirthPlanDataset( id = 15, inputType = InputType.EDIT_TEXT, title = resources.getString(R.string.name_of_vhsnd_community_member_for_support_during_emergency), - arrayId = -1, - required = true, + required = false, etMaxLength = 100, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) @@ -173,8 +158,7 @@ class HRPMicroBirthPlanDataset( id = 16, inputType = InputType.EDIT_TEXT, title = resources.getString(R.string.contact_number_of_vhsnd_community_member_for_support_during_emergency), - arrayId = -1, - required = true, + required = false, etInputType = android.text.InputType.TYPE_CLASS_NUMBER or android.text.InputType.TYPE_NUMBER_VARIATION_NORMAL, isMobileNumber = true, etMaxLength = 10, @@ -185,8 +169,7 @@ class HRPMicroBirthPlanDataset( id = 17, inputType = InputType.EDIT_TEXT, title = resources.getString(R.string.mode_of_transportation_in_case_of_labour_pain), - arrayId = -1, - required = true, + required = false, etMaxLength = 100, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) @@ -194,8 +177,7 @@ class HRPMicroBirthPlanDataset( id = 18, inputType = InputType.EDIT_TEXT, title = resources.getString(R.string.nearest_usg_centre), - arrayId = -1, - required = true, + required = false, etMaxLength = 100, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) @@ -204,15 +186,13 @@ class HRPMicroBirthPlanDataset( id = 19, inputType = InputType.HEADLINE, title = resources.getString(R.string.micro_birth_plan_for_all_pregnant_women), - arrayId = -1, required = false ) private val husbandName = FormElement( id = 20, inputType = InputType.EDIT_TEXT, - title = resources.getString(R.string.nearest_sc_hwc), - arrayId = -1, + title = resources.getString(R.string.husband_s_name), required = true, isEnabled = false, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS From 408f654470cf06a5d0810b10d07e9bfadb4a2ec7 Mon Sep 17 00:00:00 2001 From: Ritik Date: Mon, 16 Sep 2024 16:36:50 +0530 Subject: [PATCH 050/892] removed unused import --- .../sakhi/configuration/HRPMicroBirthPlanDataset.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/HRPMicroBirthPlanDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/HRPMicroBirthPlanDataset.kt index 8a4db5943..5c65af4aa 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/HRPMicroBirthPlanDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/HRPMicroBirthPlanDataset.kt @@ -1,7 +1,6 @@ package org.piramalswasthya.sakhi.configuration import android.content.Context -import android.util.Log import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.model.BenRegCache @@ -170,7 +169,7 @@ class HRPMicroBirthPlanDataset( inputType = InputType.EDIT_TEXT, title = resources.getString(R.string.mode_of_transportation_in_case_of_labour_pain), required = false, - etMaxLength = 100, + etMaxLength = 20, etInputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ) private val usg = FormElement( @@ -311,9 +310,6 @@ class HRPMicroBirthPlanDataset( validateMobileNumberOnEditText(communityMemberContact) } - modeOfTransportation.id -> { - validateAllAlphabetsSpaceOnEditText(modeOfTransportation) - } else -> { -1 From b1df69d48dddafeacd16c7aa02d2aa32a7786ca1 Mon Sep 17 00:00:00 2001 From: Ritik Date: Tue, 17 Sep 2024 11:36:44 +0530 Subject: [PATCH 051/892] Auto-Move Beneficiary to TB Suspected List Post-Suspected TB under NCD Screening --- .../cbac/CbacFragment.kt | 26 +++++++++++++++++ .../form/TBScreeningFormViewModel.kt | 28 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt index efad03d0f..1ce4acd2c 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt @@ -8,6 +8,7 @@ import android.view.View import android.view.ViewGroup import android.widget.ArrayAdapter import android.widget.RadioGroup +import android.widget.Toast import androidx.core.view.children import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels @@ -18,6 +19,7 @@ import org.piramalswasthya.sakhi.databinding.FragmentCbacBinding import org.piramalswasthya.sakhi.model.CbacCache import org.piramalswasthya.sakhi.model.Gender import org.piramalswasthya.sakhi.ui.home_activity.HomeActivity +import org.piramalswasthya.sakhi.ui.home_activity.non_communicable_diseases.tb_screening.form.TBScreeningFormViewModel import org.piramalswasthya.sakhi.work.WorkerUtils import timber.log.Timber import java.text.SimpleDateFormat @@ -42,6 +44,10 @@ class CbacFragment : Fragment() { private var ed2PopupShown: Boolean = false + private var isSuspected: Boolean = false + + private val viewModelTbScreening: TBScreeningFormViewModel by viewModels() + private val alertDialog by lazy { AlertDialog.Builder(requireContext()).setTitle(getString(R.string.missing_field)).create() } @@ -83,6 +89,20 @@ class CbacFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + viewModelTbScreening.state.observe(viewLifecycleOwner) { + when (it) { + TBScreeningFormViewModel.State.SAVE_SUCCESS -> { + Toast.makeText( + requireContext(), + resources.getString(R.string.tb_screening_submitted), Toast.LENGTH_SHORT + ).show() + WorkerUtils.triggerAmritPushWorker(requireContext()) + } + + else -> {} + } + } + viewModel.state.observe(viewLifecycleOwner) { when (it) { @@ -244,10 +264,13 @@ class CbacFragment : Fragment() { binding.cbacLsweight.rbYes.isChecked || binding.cbacNtswets.rbYes.isChecked ) { + isSuspected = true ast1AlertDialog.setMessage( resources.getString(R.string.refer_to_mo_and_collect_the_sputum_sample) ) ast1AlertDialog.show() + } else { + isSuspected = false } } @@ -323,6 +346,9 @@ class CbacFragment : Fragment() { binding.btnSave.setOnClickListener { viewModel.setFillDate(getLongFromDate(binding.etDate.text.toString())) viewModel.submitForm() + if (isSuspected) { + viewModelTbScreening.saveFormDirectlyfromCbac() + } } binding.etDate.setText(getDateFromLong(System.currentTimeMillis())) val today = Calendar.getInstance() diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/tb_screening/form/TBScreeningFormViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/tb_screening/form/TBScreeningFormViewModel.kt index a3472b3d3..0ec0d5fa5 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/tb_screening/form/TBScreeningFormViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/tb_screening/form/TBScreeningFormViewModel.kt @@ -115,6 +115,34 @@ class TBScreeningFormViewModel @Inject constructor( } } + fun saveFormDirectlyfromCbac() { + viewModelScope.launch { + withContext(Dispatchers.IO) { + try { + saveValues() + _state.postValue(State.SAVING) + tbRepo.saveTBScreening(tbScreeningCache) + _state.postValue(State.SAVE_SUCCESS) + } catch (e: Exception) { + Timber.d("saving tb screening data failed!!") + _state.postValue(State.SAVE_FAILED) + } + } + } + } + + private suspend fun saveValues() { + tbScreeningCache = TBScreeningCache( + benId = benRepo.getBenFromId(benId)!!.beneficiaryId, + coughMoreThan2Weeks = true, + lossOfWeight = true, + feverMoreThan2Weeks = true, + nightSweats = true, + bloodInSputum = true, + historyOfTb = true, + ) + } + fun resetState() { _state.value = State.IDLE } From 98a063f6b5cca11467a2a6560154781908497701 Mon Sep 17 00:00:00 2001 From: Ritik Date: Tue, 17 Sep 2024 12:16:28 +0530 Subject: [PATCH 052/892] duplicate strings are removed --- .../sakhi/helpers/Konstants.kt | 21 ++ .../incentives/IncentivesFragment.kt | 192 +++++++++--------- 2 files changed, 122 insertions(+), 91 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt b/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt index e4cb21b2f..fa8385a26 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt @@ -62,4 +62,25 @@ object Konstants { const val defaultTimeStamp = 1577817001000L + + const val childHealth = "CHILD HEALTH" + + const val immunization = "IMMUNIZATION" + + const val maternalHealth = "MATERNAL HEALTH" + + const val ashaIncetiveJSY = "ASHA Incentive under JSY" + + const val familyPlanning = "FAMILY PLANNING" + + const val adolescentHealth = "ADOLESCENT HEALTH" + + const val ashaMonthlyRActivity = "ASHA Monthly Routine Activities" + + const val umbrellaProgrames = "Umbrella Programmes" + + const val ncd = "NCD" + + const val additionalIncentivetoAshaSGovt = "ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET" + } \ No newline at end of file diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/incentives/IncentivesFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/incentives/IncentivesFragment.kt index 06f96af53..e680f1f68 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/incentives/IncentivesFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/incentives/IncentivesFragment.kt @@ -36,6 +36,16 @@ import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.adapters.IncentiveListAdapter import org.piramalswasthya.sakhi.databinding.FragmentIncentivesBinding import org.piramalswasthya.sakhi.helpers.Konstants +import org.piramalswasthya.sakhi.helpers.Konstants.additionalIncentivetoAshaSGovt +import org.piramalswasthya.sakhi.helpers.Konstants.adolescentHealth +import org.piramalswasthya.sakhi.helpers.Konstants.ashaIncetiveJSY +import org.piramalswasthya.sakhi.helpers.Konstants.ashaMonthlyRActivity +import org.piramalswasthya.sakhi.helpers.Konstants.childHealth +import org.piramalswasthya.sakhi.helpers.Konstants.familyPlanning +import org.piramalswasthya.sakhi.helpers.Konstants.immunization +import org.piramalswasthya.sakhi.helpers.Konstants.maternalHealth +import org.piramalswasthya.sakhi.helpers.Konstants.ncd +import org.piramalswasthya.sakhi.helpers.Konstants.umbrellaProgrames import org.piramalswasthya.sakhi.helpers.setToEndOfTheDay import org.piramalswasthya.sakhi.helpers.setToStartOfTheDay import org.piramalswasthya.sakhi.model.IncentiveDomain @@ -431,101 +441,101 @@ class IncentivesFragment : Fragment() { x = 10 val items: List = viewModel.mapToView(incentiveDomainList) val activityItems = ArrayList() - activityItems.add(0,addDataIntoIncentiveDomain("CHILD HEALTH","Providing HBNC up to 42 days after birth / discharge from SNCU")) - activityItems.add(1,addDataIntoIncentiveDomain("CHILD HEALTH","Incentive to ASHA for quarterly visits of HBYC")) - activityItems.add(2,addDataIntoIncentiveDomain("CHILD HEALTH","Incentive to ASHA for follow up of SNCU discharge babies and for follow up of LBW babies")) - activityItems.add(3,addDataIntoIncentiveDomain("CHILD HEALTH","ASHA incentive for referral of SAM cases to NRC and for follow up of discharged SAM children from NRC")) - activityItems.add(4,addDataIntoIncentiveDomain("CHILD HEALTH","Child Death Reporting")) - activityItems.add(5,addDataIntoIncentiveDomain("CHILD HEALTH","Incentive for quarterly mothers' meeting under MAA")) - activityItems.add(6,addDataIntoIncentiveDomain("CHILD HEALTH","Incentive for National Deworming Day for mobilising out of school children")) - activityItems.add(7,addDataIntoIncentiveDomain("CHILD HEALTH","Incentive for IDCF for prophylactic distribution of ORS to family with under-five children")) - activityItems.add(8,addDataIntoIncentiveDomain("CHILD HEALTH","National Iron Plus Incentive for mobilizing WRA (non pregnant & non lactating Women 20-49 years)")) - activityItems.add(9,addDataIntoIncentiveDomain("CHILD HEALTH","NIPI Incentive for mobilizing children and/or ensuring compliance and reporting (6-59 months")) - activityItems.add(10,addDataIntoIncentiveDomain("IMMUNIZATION","ASHA incentive for ensuring for full immunization(0-1 year)")) - activityItems.add(11,addDataIntoIncentiveDomain("IMMUNIZATION","Ensuring for complete immunization (1 - 2 years)")) - activityItems.add(12,addDataIntoIncentiveDomain("IMMUNIZATION","Ensuring for DPT immunization(5 years)")) - activityItems.add(13,addDataIntoIncentiveDomain("IMMUNIZATION","mobilization of children in every session site")) - activityItems.add(14,addDataIntoIncentiveDomain("MATERNAL HEALTH","ASHA incentive for ANC registration within 1st Trimester")) - activityItems.add(15,addDataIntoIncentiveDomain("MATERNAL HEALTH","ASHA incentive for ensuring Full ANC")) - activityItems.add(16,addDataIntoIncentiveDomain("MATERNAL HEALTH","ASHA incentive for Comprehensive Abortion Care")) - activityItems.add(17,addDataIntoIncentiveDomain("MATERNAL HEALTH","ASHA incentive for Community Based Distribution of Misoprostol")) - activityItems.add(18,addDataIntoIncentiveDomain("MATERNAL HEALTH","ASHA incentive for ensuring Institutional delivery of identified HRP")) - activityItems.add(19,addDataIntoIncentiveDomain("MATERNAL HEALTH","EPMSMA - instt delivery")) - activityItems.add(20,addDataIntoIncentiveDomain("MATERNAL HEALTH","EPMSMA - IF HRPW identified at PMSMA Site")) - activityItems.add(21,addDataIntoIncentiveDomain("MATERNAL HEALTH","ASHA Incentive for maternal death reporting ")) - activityItems.add(22,addDataIntoIncentiveDomain("MATERNAL HEALTH","For ensuring early registration of pregnancy and opening of bank account of beneficiary")) - activityItems.add(23,addDataIntoIncentiveDomain("MATERNAL HEALTH","Rs. 100/ for ensuring one ANC by MO in the third trimester")) - activityItems.add(24,addDataIntoIncentiveDomain("MATERNAL HEALTH","For motivating Institutional delivery of the beneficiary")) - activityItems.add(25,addDataIntoIncentiveDomain("ASHA Incentive under JSY","JSY incentive for ASHA for 1st Delivery(Rural) for Antenatal Component")) - activityItems.add(26,addDataIntoIncentiveDomain("ASHA Incentive under JSY","JSY incentive for ASHA for 1st Delivery(Rural) for facilitating Institutional Delivery")) - activityItems.add(27,addDataIntoIncentiveDomain("ASHA Incentive under JSY","JSY incentive for ASHA for 2nd Delivery(Rural) for Antenatal Component")) - activityItems.add(28,addDataIntoIncentiveDomain("ASHA Incentive under JSY","JSY incentive for ASHA for 2nd Delivery(Rural) for facilitating Institutional Delivery")) - activityItems.add(29,addDataIntoIncentiveDomain("ASHA Incentive under JSY","JSY incentive for ASHA for 3rd Delivery(Rural) for Antenatal Component")) - activityItems.add(30,addDataIntoIncentiveDomain("ASHA Incentive under JSY","JSY incentive for ASHA for 3rd Delivery(Rural) for facilitating Institutional Delivery")) - activityItems.add(31,addDataIntoIncentiveDomain("ASHA Incentive under JSY","JSY incentive for ASHA for 4th Delivery(Rural) for Antenatal Component")) - activityItems.add(32,addDataIntoIncentiveDomain("ASHA Incentive under JSY","JSY incentive for ASHA for 4th Delivery(Rural) for facilitating Institutional Delivery")) - activityItems.add(33,addDataIntoIncentiveDomain("ASHA Incentive under JSY","JSY incentive(Urban) for Antenatal Component")) - activityItems.add(34,addDataIntoIncentiveDomain("ASHA Incentive under JSY","JSY incentive (Urban)for facilitating Institutional Delivery")) - activityItems.add(35,addDataIntoIncentiveDomain("FAMILY PLANNING","ASHA incentive for accompanying the client for Injectable MPA(Antara Prog)administration")) - activityItems.add(36,addDataIntoIncentiveDomain("FAMILY PLANNING","ASHA incentive for accompanying the client for Injectable MPA(Antara Prog)administration")) - activityItems.add(37,addDataIntoIncentiveDomain("FAMILY PLANNING","ASHA incentive for accompanying the client for Injectable MPA(Antara Prog)administration")) - activityItems.add(38,addDataIntoIncentiveDomain("FAMILY PLANNING","ASHA incentive for accompanying the client for Injectable MPA(Antara Prog)administration")) - activityItems.add(39,addDataIntoIncentiveDomain("FAMILY PLANNING","Ensuring 3 years gap between 1st and 2nd child birth")) - activityItems.add(40,addDataIntoIncentiveDomain("FAMILY PLANNING","Ensuring delaying 2 years for first child birth after marriage")) - activityItems.add(41,addDataIntoIncentiveDomain("FAMILY PLANNING","Ensuring limiting after 2 child")) - activityItems.add(42,addDataIntoIncentiveDomain("FAMILY PLANNING","For motivating a woman for PPIUCD insertion ")) - activityItems.add(43,addDataIntoIncentiveDomain("FAMILY PLANNING","For motivating PAIUCD")) - activityItems.add(44,addDataIntoIncentiveDomain("FAMILY PLANNING","Home Delivery Contraceptive-Condom")) - activityItems.add(45,addDataIntoIncentiveDomain("FAMILY PLANNING","Home Delivery Contraceptive-Oral Pills")) - activityItems.add(46,addDataIntoIncentiveDomain("FAMILY PLANNING","Home Delivery Contraceptive-EC")) - activityItems.add(47,addDataIntoIncentiveDomain("FAMILY PLANNING","For motivating Female sterilization")) - activityItems.add(48,addDataIntoIncentiveDomain("FAMILY PLANNING","For motivating a woman for PPS")) - activityItems.add(49,addDataIntoIncentiveDomain("FAMILY PLANNING","For Motivating Minilap")) - activityItems.add(50,addDataIntoIncentiveDomain("FAMILY PLANNING","For motivating Male sterilization")) - activityItems.add(51,addDataIntoIncentiveDomain("FAMILY PLANNING","ASHA incentive for updation of EC survey before each MPV campaign")) - activityItems.add(52,addDataIntoIncentiveDomain("FAMILY PLANNING","Incentive to mobilize Saas Bahu Sammelan")) - activityItems.add(53,addDataIntoIncentiveDomain("FAMILY PLANNING","Incentive for Distributing Naye Pahel Kit")) - activityItems.add(54,addDataIntoIncentiveDomain("ADOLESCENT HEALTH","Menstrual Hygiene – For selling sanitary napkin.")) - activityItems.add(55,addDataIntoIncentiveDomain("ADOLESCENT HEALTH","Incentive for selection and support of Peer Educator")) - activityItems.add(56,addDataIntoIncentiveDomain("ADOLESCENT HEALTH","Incentive for mobilizing adolescents and community for AHD")) - activityItems.add(57,addDataIntoIncentiveDomain("ASHA Monthly Routine Activities","a) Mobilizing and attending Village Health and Nutrition Day")) - activityItems.add(58,addDataIntoIncentiveDomain("ASHA Monthly Routine Activities","b) Convening and guiding monthly Village Health Sanitation and Nutrition meeting")) - activityItems.add(59,addDataIntoIncentiveDomain("ASHA Monthly Routine Activities","c)Attending PHC Review meeting")) - activityItems.add(60,addDataIntoIncentiveDomain("ASHA Monthly Routine Activities","Activities Like:\n" + + activityItems.add(0,addDataIntoIncentiveDomain(childHealth,"Providing HBNC up to 42 days after birth / discharge from SNCU")) + activityItems.add(1,addDataIntoIncentiveDomain(childHealth,"Incentive to ASHA for quarterly visits of HBYC")) + activityItems.add(2,addDataIntoIncentiveDomain(childHealth,"Incentive to ASHA for follow up of SNCU discharge babies and for follow up of LBW babies")) + activityItems.add(3,addDataIntoIncentiveDomain(childHealth,"ASHA incentive for referral of SAM cases to NRC and for follow up of discharged SAM children from NRC")) + activityItems.add(4,addDataIntoIncentiveDomain(childHealth,"Child Death Reporting")) + activityItems.add(5,addDataIntoIncentiveDomain(childHealth,"Incentive for quarterly mothers' meeting under MAA")) + activityItems.add(6,addDataIntoIncentiveDomain(childHealth,"Incentive for National Deworming Day for mobilising out of school children")) + activityItems.add(7,addDataIntoIncentiveDomain(childHealth,"Incentive for IDCF for prophylactic distribution of ORS to family with under-five children")) + activityItems.add(8,addDataIntoIncentiveDomain(childHealth,"National Iron Plus Incentive for mobilizing WRA (non pregnant & non lactating Women 20-49 years)")) + activityItems.add(9,addDataIntoIncentiveDomain(childHealth,"NIPI Incentive for mobilizing children and/or ensuring compliance and reporting (6-59 months")) + activityItems.add(10,addDataIntoIncentiveDomain(immunization,"ASHA incentive for ensuring for full immunization(0-1 year)")) + activityItems.add(11,addDataIntoIncentiveDomain(immunization,"Ensuring for complete immunization (1 - 2 years)")) + activityItems.add(12,addDataIntoIncentiveDomain(immunization,"Ensuring for DPT immunization(5 years)")) + activityItems.add(13,addDataIntoIncentiveDomain(immunization,"mobilization of children in every session site")) + activityItems.add(14,addDataIntoIncentiveDomain(maternalHealth,"ASHA incentive for ANC registration within 1st Trimester")) + activityItems.add(15,addDataIntoIncentiveDomain(maternalHealth,"ASHA incentive for ensuring Full ANC")) + activityItems.add(16,addDataIntoIncentiveDomain(maternalHealth,"ASHA incentive for Comprehensive Abortion Care")) + activityItems.add(17,addDataIntoIncentiveDomain(maternalHealth,"ASHA incentive for Community Based Distribution of Misoprostol")) + activityItems.add(18,addDataIntoIncentiveDomain(maternalHealth,"ASHA incentive for ensuring Institutional delivery of identified HRP")) + activityItems.add(19,addDataIntoIncentiveDomain(maternalHealth,"EPMSMA - instt delivery")) + activityItems.add(20,addDataIntoIncentiveDomain(maternalHealth,"EPMSMA - IF HRPW identified at PMSMA Site")) + activityItems.add(21,addDataIntoIncentiveDomain(maternalHealth,"ASHA Incentive for maternal death reporting ")) + activityItems.add(22,addDataIntoIncentiveDomain(maternalHealth,"For ensuring early registration of pregnancy and opening of bank account of beneficiary")) + activityItems.add(23,addDataIntoIncentiveDomain(maternalHealth,"Rs. 100/ for ensuring one ANC by MO in the third trimester")) + activityItems.add(24,addDataIntoIncentiveDomain(maternalHealth,"For motivating Institutional delivery of the beneficiary")) + activityItems.add(25,addDataIntoIncentiveDomain(ashaIncetiveJSY,"JSY incentive for ASHA for 1st Delivery(Rural) for Antenatal Component")) + activityItems.add(26,addDataIntoIncentiveDomain(ashaIncetiveJSY,"JSY incentive for ASHA for 1st Delivery(Rural) for facilitating Institutional Delivery")) + activityItems.add(27,addDataIntoIncentiveDomain(ashaIncetiveJSY,"JSY incentive for ASHA for 2nd Delivery(Rural) for Antenatal Component")) + activityItems.add(28,addDataIntoIncentiveDomain(ashaIncetiveJSY,"JSY incentive for ASHA for 2nd Delivery(Rural) for facilitating Institutional Delivery")) + activityItems.add(29,addDataIntoIncentiveDomain(ashaIncetiveJSY,"JSY incentive for ASHA for 3rd Delivery(Rural) for Antenatal Component")) + activityItems.add(30,addDataIntoIncentiveDomain(ashaIncetiveJSY,"JSY incentive for ASHA for 3rd Delivery(Rural) for facilitating Institutional Delivery")) + activityItems.add(31,addDataIntoIncentiveDomain(ashaIncetiveJSY,"JSY incentive for ASHA for 4th Delivery(Rural) for Antenatal Component")) + activityItems.add(32,addDataIntoIncentiveDomain(ashaIncetiveJSY,"JSY incentive for ASHA for 4th Delivery(Rural) for facilitating Institutional Delivery")) + activityItems.add(33,addDataIntoIncentiveDomain(ashaIncetiveJSY,"JSY incentive(Urban) for Antenatal Component")) + activityItems.add(34,addDataIntoIncentiveDomain(ashaIncetiveJSY,"JSY incentive (Urban)for facilitating Institutional Delivery")) + activityItems.add(35,addDataIntoIncentiveDomain(familyPlanning,"ASHA incentive for accompanying the client for Injectable MPA(Antara Prog)administration")) + activityItems.add(36,addDataIntoIncentiveDomain(familyPlanning,"ASHA incentive for accompanying the client for Injectable MPA(Antara Prog)administration")) + activityItems.add(37,addDataIntoIncentiveDomain(familyPlanning,"ASHA incentive for accompanying the client for Injectable MPA(Antara Prog)administration")) + activityItems.add(38,addDataIntoIncentiveDomain(familyPlanning,"ASHA incentive for accompanying the client for Injectable MPA(Antara Prog)administration")) + activityItems.add(39,addDataIntoIncentiveDomain(familyPlanning,"Ensuring 3 years gap between 1st and 2nd child birth")) + activityItems.add(40,addDataIntoIncentiveDomain(familyPlanning,"Ensuring delaying 2 years for first child birth after marriage")) + activityItems.add(41,addDataIntoIncentiveDomain(familyPlanning,"Ensuring limiting after 2 child")) + activityItems.add(42,addDataIntoIncentiveDomain(familyPlanning,"For motivating a woman for PPIUCD insertion ")) + activityItems.add(43,addDataIntoIncentiveDomain(familyPlanning,"For motivating PAIUCD")) + activityItems.add(44,addDataIntoIncentiveDomain(familyPlanning,"Home Delivery Contraceptive-Condom")) + activityItems.add(45,addDataIntoIncentiveDomain(familyPlanning,"Home Delivery Contraceptive-Oral Pills")) + activityItems.add(46,addDataIntoIncentiveDomain(familyPlanning,"Home Delivery Contraceptive-EC")) + activityItems.add(47,addDataIntoIncentiveDomain(familyPlanning,"For motivating Female sterilization")) + activityItems.add(48,addDataIntoIncentiveDomain(familyPlanning,"For motivating a woman for PPS")) + activityItems.add(49,addDataIntoIncentiveDomain(familyPlanning,"For Motivating Minilap")) + activityItems.add(50,addDataIntoIncentiveDomain(familyPlanning,"For motivating Male sterilization")) + activityItems.add(51,addDataIntoIncentiveDomain(familyPlanning,"ASHA incentive for updation of EC survey before each MPV campaign")) + activityItems.add(52,addDataIntoIncentiveDomain(familyPlanning,"Incentive to mobilize Saas Bahu Sammelan")) + activityItems.add(53,addDataIntoIncentiveDomain(familyPlanning,"Incentive for Distributing Naye Pahel Kit")) + activityItems.add(54,addDataIntoIncentiveDomain(adolescentHealth,"Menstrual Hygiene – For selling sanitary napkin.")) + activityItems.add(55,addDataIntoIncentiveDomain(adolescentHealth,"Incentive for selection and support of Peer Educator")) + activityItems.add(56,addDataIntoIncentiveDomain(adolescentHealth,"Incentive for mobilizing adolescents and community for AHD")) + activityItems.add(57,addDataIntoIncentiveDomain(ashaMonthlyRActivity,"a) Mobilizing and attending Village Health and Nutrition Day")) + activityItems.add(58,addDataIntoIncentiveDomain(ashaMonthlyRActivity,"b) Convening and guiding monthly Village Health Sanitation and Nutrition meeting")) + activityItems.add(59,addDataIntoIncentiveDomain(ashaMonthlyRActivity,"c)Attending PHC Review meeting")) + activityItems.add(60,addDataIntoIncentiveDomain(ashaMonthlyRActivity,"Activities Like:\n" + "I) Line listing of household done at beginning of the year and \n" + "updated after every six months. \n" + "II) Maintaining village health register and supporting universal \n" + "registration of births and deaths")) - activityItems.add(61,addDataIntoIncentiveDomain("Umbrella Programmes","NPCB - For ensuring Treatment of Cataract surgery in Govt. facility")) - activityItems.add(62,addDataIntoIncentiveDomain("Umbrella Programmes","NPCB - For ensuring Treatment of Cataract surgery in Private facility")) - activityItems.add(63,addDataIntoIncentiveDomain("Umbrella Programmes","Incentive for completion of 6 month treatment of DSTB")) - activityItems.add(64,addDataIntoIncentiveDomain("Umbrella Programmes","Incentive for completion of 18 month treatment of DRTB")) - activityItems.add(65,addDataIntoIncentiveDomain("Umbrella Programmes","Informant incentive for active case finding")) - activityItems.add(66,addDataIntoIncentiveDomain("Umbrella Programmes","NLEP – Sensitization ASHA Incentive for training on Leprosy")) - activityItems.add(67,addDataIntoIncentiveDomain("Umbrella Programmes","NLEP - Incentive for case detection")) - activityItems.add(68,addDataIntoIncentiveDomain("Umbrella Programmes","NLEP - for ensuring complete treatment of PB cases.")) - activityItems.add(69,addDataIntoIncentiveDomain("Umbrella Programmes","NLEP - for ensuring complete treatment of MB cases.")) - activityItems.add(70,addDataIntoIncentiveDomain("Umbrella Programmes","Partial Incentives to the ASHAs for Leprosy suspects")) - activityItems.add(71,addDataIntoIncentiveDomain("Umbrella Programmes","NVBDCP -For malaria slide collection.")) - activityItems.add(72,addDataIntoIncentiveDomain("Umbrella Programmes","NVBDCP -For ensuring treatment of Malaria positive cases")) - activityItems.add(73,addDataIntoIncentiveDomain("Umbrella Programmes","ASHA incentive for referral of AES/JE cases to the nearest CHC/DH/Medical College")) - activityItems.add(74,addDataIntoIncentiveDomain("Umbrella Programmes","ASHA Incentive for Dengue and Chikungunya")) - activityItems.add(75,addDataIntoIncentiveDomain("Umbrella Programmes","NIDDCP – For testing 50 salt samples per month")) - activityItems.add(76,addDataIntoIncentiveDomain("NCD","Incentive for population enumeration,CBAC filling and mobilizing for NCD screening ")) - activityItems.add(77,addDataIntoIncentiveDomain("NCD","Incentive for follow up and treatment compliance for 6 months for patients diagnosed with Hypertension,Diabetes,Mellitus & 3 common cancers(Oral, Breast,Carvical)")) - activityItems.add(78,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","a) Line Listing of Adolscent and linkage with WIFS")) - activityItems.add(79,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","b) Line Listing of Adolscent and linkage with WIFS")) - activityItems.add(80,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","c)Line Listing of Screened children under RBSK by Mobile Health Team in her are")) - activityItems.add(81,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","d)Facilitation of High Risk Pregnancy identification and line listing")) - activityItems.add(82,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","e)Follow up of Full ANC with complete routine examination of each pregnant women")) - activityItems.add(83,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","f)Mobilizing for screening of HIV of all pregnant women")) - activityItems.add(84,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","g)Identification of Malaria/Dengue/JE cases and line listing")) - activityItems.add(85,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","h)Identification of TB Cases and line listing")) - activityItems.add(86,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","i)Updating of MCP Card and ensuring opening of bank A/C of beneficiary registered in her area")) - activityItems.add(87,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","j)Participating in NCD Screening in her area")) - activityItems.add(88,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","k)Ensuring supplement of IFA to under 5 children and line listing")) - activityItems.add(89,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","l)Follow-up of full immunization with JE,MR,Rota Virus, Vitamin A, etc and line listing")) - activityItems.add(90,addDataIntoIncentiveDomain("ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET","m)Identification of number of under 5 children with diarrhea traced and distributed ORS during the month and line listing")) + activityItems.add(61,addDataIntoIncentiveDomain(umbrellaProgrames,"NPCB - For ensuring Treatment of Cataract surgery in Govt. facility")) + activityItems.add(62,addDataIntoIncentiveDomain(umbrellaProgrames,"NPCB - For ensuring Treatment of Cataract surgery in Private facility")) + activityItems.add(63,addDataIntoIncentiveDomain(umbrellaProgrames,"Incentive for completion of 6 month treatment of DSTB")) + activityItems.add(64,addDataIntoIncentiveDomain(umbrellaProgrames,"Incentive for completion of 18 month treatment of DRTB")) + activityItems.add(65,addDataIntoIncentiveDomain(umbrellaProgrames,"Informant incentive for active case finding")) + activityItems.add(66,addDataIntoIncentiveDomain(umbrellaProgrames,"NLEP – Sensitization ASHA Incentive for training on Leprosy")) + activityItems.add(67,addDataIntoIncentiveDomain(umbrellaProgrames,"NLEP - Incentive for case detection")) + activityItems.add(68,addDataIntoIncentiveDomain(umbrellaProgrames,"NLEP - for ensuring complete treatment of PB cases.")) + activityItems.add(69,addDataIntoIncentiveDomain(umbrellaProgrames,"NLEP - for ensuring complete treatment of MB cases.")) + activityItems.add(70,addDataIntoIncentiveDomain(umbrellaProgrames,"Partial Incentives to the ASHAs for Leprosy suspects")) + activityItems.add(71,addDataIntoIncentiveDomain(umbrellaProgrames,"NVBDCP -For malaria slide collection.")) + activityItems.add(72,addDataIntoIncentiveDomain(umbrellaProgrames,"NVBDCP -For ensuring treatment of Malaria positive cases")) + activityItems.add(73,addDataIntoIncentiveDomain(umbrellaProgrames,"ASHA incentive for referral of AES/JE cases to the nearest CHC/DH/Medical College")) + activityItems.add(74,addDataIntoIncentiveDomain(umbrellaProgrames,"ASHA Incentive for Dengue and Chikungunya")) + activityItems.add(75,addDataIntoIncentiveDomain(umbrellaProgrames,"NIDDCP – For testing 50 salt samples per month")) + activityItems.add(76,addDataIntoIncentiveDomain(ncd,"Incentive for population enumeration,CBAC filling and mobilizing for NCD screening ")) + activityItems.add(77,addDataIntoIncentiveDomain(ncd,"Incentive for follow up and treatment compliance for 6 months for patients diagnosed with Hypertension,Diabetes,Mellitus & 3 common cancers(Oral, Breast,Carvical)")) + activityItems.add(78,addDataIntoIncentiveDomain(additionalIncentivetoAshaSGovt,"a) Line Listing of Adolscent and linkage with WIFS")) + activityItems.add(79,addDataIntoIncentiveDomain(additionalIncentivetoAshaSGovt,"b) Line Listing of Adolscent and linkage with WIFS")) + activityItems.add(80,addDataIntoIncentiveDomain(additionalIncentivetoAshaSGovt,"c)Line Listing of Screened children under RBSK by Mobile Health Team in her are")) + activityItems.add(81,addDataIntoIncentiveDomain(additionalIncentivetoAshaSGovt,"d)Facilitation of High Risk Pregnancy identification and line listing")) + activityItems.add(82,addDataIntoIncentiveDomain(additionalIncentivetoAshaSGovt,"e)Follow up of Full ANC with complete routine examination of each pregnant women")) + activityItems.add(83,addDataIntoIncentiveDomain(additionalIncentivetoAshaSGovt,"f)Mobilizing for screening of HIV of all pregnant women")) + activityItems.add(84,addDataIntoIncentiveDomain(additionalIncentivetoAshaSGovt,"g)Identification of Malaria/Dengue/JE cases and line listing")) + activityItems.add(85,addDataIntoIncentiveDomain(additionalIncentivetoAshaSGovt,"h)Identification of TB Cases and line listing")) + activityItems.add(86,addDataIntoIncentiveDomain(additionalIncentivetoAshaSGovt,"i)Updating of MCP Card and ensuring opening of bank A/C of beneficiary registered in her area")) + activityItems.add(87,addDataIntoIncentiveDomain(additionalIncentivetoAshaSGovt,"j)Participating in NCD Screening in her area")) + activityItems.add(88,addDataIntoIncentiveDomain(additionalIncentivetoAshaSGovt,"k)Ensuring supplement of IFA to under 5 children and line listing")) + activityItems.add(89,addDataIntoIncentiveDomain(additionalIncentivetoAshaSGovt,"l)Follow-up of full immunization with JE,MR,Rota Virus, Vitamin A, etc and line listing")) + activityItems.add(90,addDataIntoIncentiveDomain(additionalIncentivetoAshaSGovt,"m)Identification of number of under 5 children with diarrhea traced and distributed ORS during the month and line listing")) for(i in activityItems.indices) { From 7ab05d1ceecbcfe271b585f34e0a745ef76aa387 Mon Sep 17 00:00:00 2001 From: Ritik Date: Tue, 17 Sep 2024 12:39:48 +0530 Subject: [PATCH 053/892] duplicate strings are removed again --- .../java/org/piramalswasthya/sakhi/helpers/Konstants.kt | 2 ++ .../ui/home_activity/incentives/IncentivesFragment.kt | 9 +++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt b/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt index fa8385a26..62a7d34f5 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt @@ -83,4 +83,6 @@ object Konstants { const val additionalIncentivetoAshaSGovt = "ADDITIONAL INCENTIVE TO ASHA UNDER STATE GOVT. BUDGET" + const val antaraProg = "ASHA incentive for accompanying the client for Injectable MPA(Antara Prog)administration" + } \ No newline at end of file diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/incentives/IncentivesFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/incentives/IncentivesFragment.kt index e680f1f68..202a8e0b8 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/incentives/IncentivesFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/incentives/IncentivesFragment.kt @@ -38,6 +38,7 @@ import org.piramalswasthya.sakhi.databinding.FragmentIncentivesBinding import org.piramalswasthya.sakhi.helpers.Konstants import org.piramalswasthya.sakhi.helpers.Konstants.additionalIncentivetoAshaSGovt import org.piramalswasthya.sakhi.helpers.Konstants.adolescentHealth +import org.piramalswasthya.sakhi.helpers.Konstants.antaraProg import org.piramalswasthya.sakhi.helpers.Konstants.ashaIncetiveJSY import org.piramalswasthya.sakhi.helpers.Konstants.ashaMonthlyRActivity import org.piramalswasthya.sakhi.helpers.Konstants.childHealth @@ -476,10 +477,10 @@ class IncentivesFragment : Fragment() { activityItems.add(32,addDataIntoIncentiveDomain(ashaIncetiveJSY,"JSY incentive for ASHA for 4th Delivery(Rural) for facilitating Institutional Delivery")) activityItems.add(33,addDataIntoIncentiveDomain(ashaIncetiveJSY,"JSY incentive(Urban) for Antenatal Component")) activityItems.add(34,addDataIntoIncentiveDomain(ashaIncetiveJSY,"JSY incentive (Urban)for facilitating Institutional Delivery")) - activityItems.add(35,addDataIntoIncentiveDomain(familyPlanning,"ASHA incentive for accompanying the client for Injectable MPA(Antara Prog)administration")) - activityItems.add(36,addDataIntoIncentiveDomain(familyPlanning,"ASHA incentive for accompanying the client for Injectable MPA(Antara Prog)administration")) - activityItems.add(37,addDataIntoIncentiveDomain(familyPlanning,"ASHA incentive for accompanying the client for Injectable MPA(Antara Prog)administration")) - activityItems.add(38,addDataIntoIncentiveDomain(familyPlanning,"ASHA incentive for accompanying the client for Injectable MPA(Antara Prog)administration")) + activityItems.add(35,addDataIntoIncentiveDomain(familyPlanning,antaraProg)) + activityItems.add(36,addDataIntoIncentiveDomain(familyPlanning,antaraProg)) + activityItems.add(37,addDataIntoIncentiveDomain(familyPlanning,antaraProg)) + activityItems.add(38,addDataIntoIncentiveDomain(familyPlanning,antaraProg)) activityItems.add(39,addDataIntoIncentiveDomain(familyPlanning,"Ensuring 3 years gap between 1st and 2nd child birth")) activityItems.add(40,addDataIntoIncentiveDomain(familyPlanning,"Ensuring delaying 2 years for first child birth after marriage")) activityItems.add(41,addDataIntoIncentiveDomain(familyPlanning,"Ensuring limiting after 2 child")) From a9111e674503b101801edc85c2f98e57031ab020 Mon Sep 17 00:00:00 2001 From: Ritik Date: Tue, 17 Sep 2024 13:20:07 +0530 Subject: [PATCH 054/892] removed hardcoded dispacher --- .../non_communicable_diseases/cbac/CbacFragment.kt | 5 +++-- .../tb_screening/form/TBScreeningFormViewModel.kt | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt index 1ce4acd2c..ac1d98042 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt @@ -98,8 +98,9 @@ class CbacFragment : Fragment() { ).show() WorkerUtils.triggerAmritPushWorker(requireContext()) } - - else -> {} + else -> { + Timber.d("IDLE!") + } } } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/tb_screening/form/TBScreeningFormViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/tb_screening/form/TBScreeningFormViewModel.kt index 0ec0d5fa5..07e81ace4 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/tb_screening/form/TBScreeningFormViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/tb_screening/form/TBScreeningFormViewModel.kt @@ -8,6 +8,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -60,6 +61,8 @@ class TBScreeningFormViewModel @Inject constructor( private lateinit var tbScreeningCache: TBScreeningCache + private val defaultDispatcher: CoroutineDispatcher = Dispatchers.IO + init { viewModelScope.launch { val ben = benRepo.getBenFromId(benId)?.also { ben -> @@ -117,7 +120,7 @@ class TBScreeningFormViewModel @Inject constructor( fun saveFormDirectlyfromCbac() { viewModelScope.launch { - withContext(Dispatchers.IO) { + withContext(defaultDispatcher) { try { saveValues() _state.postValue(State.SAVING) From f4acf27607e9bafb47260dc290a86aefb8c212ea Mon Sep 17 00:00:00 2001 From: Sushant Date: Tue, 17 Sep 2024 15:35:13 +0530 Subject: [PATCH 055/892] Added ABHA v1/v2 Environment --- app/build.gradle | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d745064f8..20ff65d27 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,11 +23,12 @@ android { versionName "2.0" resConfigs "en", "hi", "as" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + // TMC Server Staging API Base URL buildConfigField "String", "BASE_TMC_URL", "\"https://amritdemo.piramalswasthya.org/\"" - // ABHA v2 Base URL -// buildConfigField "String", "BASE_ABHA_URL", "\"https://healthidsbx.abdm.gov.in/api/\"" - // ABHA v3 Base URL - buildConfigField "String", "BASE_ABHA_URL", "\"https://abhasbx.abdm.gov.in/abha/api/\"" + // ABHA v1/v2 Staging Base URL + buildConfigField "String", "BASE_ABHA_URL", "\"https://healthidsbx.abdm.gov.in/api/\"" + // ABHA v3 Staging Base URL +// buildConfigField "String", "BASE_ABHA_URL", "\"https://abhasbx.abdm.gov.in/abha/api/\"" } buildTypes { @@ -48,26 +49,29 @@ android { applicationIdSuffix ".staging" applicationId "org.piramalswasthya.sakhi" resValue "string", "app_native_name", "উৎপ্ৰেৰণা-Stag" + // TMC Server Staging API Base URL buildConfigField "String", "BASE_TMC_URL", "\"https://amritdemo.piramalswasthya.org/\"" - // ABHA v2 Base URL -// buildConfigField "String", "BASE_ABHA_URL", "\"https://healthidsbx.abdm.gov.in/api/\"" - // ABHA v3 Base URL - buildConfigField "String", "BASE_ABHA_URL", "\"https://abhasbx.abdm.gov.in/abha/api/\"" + // ABHA v1/v2 Staging Base URL + buildConfigField "String", "BASE_ABHA_URL", "\"https://healthidsbx.abdm.gov.in/api/\"" + // ABHA v3 Staging Base URL +// buildConfigField "String", "BASE_ABHA_URL", "\"https://abhasbx.abdm.gov.in/abha/api/\"" } uat { applicationIdSuffix ".uat" applicationId "org.piramalswasthya.sakhi" resValue "string", "app_native_name", "উৎপ্ৰেৰণা-Uat" + // TMC Server Staging API Base URL buildConfigField "String", "BASE_TMC_URL", "\"https://amritdemo.piramalswasthya.org/\"" - // ABHA v2 Base URL -// buildConfigField "String", "BASE_ABHA_URL", "\"https://healthidsbx.abdm.gov.in/api/\"" - // ABHA v3 Base URL - buildConfigField "String", "BASE_ABHA_URL", "\"https://abhasbx.abdm.gov.in/abha/api/\"" + // ABHA v1/v2 Staging Base URL + buildConfigField "String", "BASE_ABHA_URL", "\"https://healthidsbx.abdm.gov.in/api/\"" + // ABHA v3 Staging Base URL +// buildConfigField "String", "BASE_ABHA_URL", "\"https://abhasbx.abdm.gov.in/abha/api/\"" } production { applicationId "org.piramalswasthya.sakhi" + // TMC Server Production API Base URL buildConfigField "String", "BASE_TMC_URL", "\"https://assamtmc.piramalswasthya.org/\"" - // ABHA v3 Base URL + // ABHA v3 Production Base URL buildConfigField "String", "BASE_ABHA_URL", "\"https://healthid.abdm.gov.in/api/\"" } } From cdf4380b0bd23fd942367fa002244aa88c84ade2 Mon Sep 17 00:00:00 2001 From: Sushant Date: Tue, 17 Sep 2024 16:23:04 +0530 Subject: [PATCH 056/892] Added Comments --- .../sakhi/network/AbhaApiService.kt | 20 +++++++++++++++---- .../sakhi/repositories/AbhaIdRepo.kt | 2 ++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt index 2fd9b9b2c..09a80be19 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt @@ -6,7 +6,7 @@ import retrofit2.http.* interface AbhaApiService { - // Staging + // Staging (v1/v2/v3) @Headers("No-Auth: true") @POST suspend fun getToken( @@ -14,7 +14,7 @@ interface AbhaApiService { @Body request: AbhaTokenRequest = AbhaTokenRequest() ): Response - // Production + // Production (v1/v2/v3) // @Headers("No-Auth: true") // @POST // suspend fun getToken( @@ -22,21 +22,26 @@ interface AbhaApiService { // @Body request: AbhaTokenRequest = AbhaTokenRequest() // ): Response + // Generate OTP (v1) @POST("v1/registration/aadhaar/generateOtp") suspend fun generateAadhaarOtp(@Body aadhaar: AbhaGenerateAadhaarOtpRequest): Response + // Generate OTP (v2) @POST("v2/registration/aadhaar/generateOtp") suspend fun generateAadhaarOtpV2(@Body aadhaar: AbhaGenerateAadhaarOtpRequest): Response + // Generate OTP (v3) @POST("v3/enrollment/request/otp") suspend fun generateAadhaarOtpV3(@Body aadhaar: AbhaGenerateAadhaarOtpRequest, @Header("REQUEST-ID") requestId: String, @Header("TIMESTAMP") timestamp: String): Response @POST("v1/registration/aadhaar/resendAadhaarOtp") suspend fun resendAadhaarOtp(@Body aadhaar: AbhaResendAadhaarOtpRequest): Response + // Verify OTP (v1/v2) @POST("v1/registration/aadhaar/verifyOTP") suspend fun verifyAadhaarOtp(@Body request: AbhaVerifyAadhaarOtpRequest): Response + // Verify OTP (v3) @POST("v3/enrollment/enrol/byAadhaar") suspend fun verifyAadhaarOtp3(@Body request: AbhaVerifyAadhaarOtpRequest, @Header("REQUEST-ID") requestId: String, @Header("TIMESTAMP") timestamp: String): Response @@ -49,6 +54,7 @@ interface AbhaApiService { @POST("v1/registration/aadhaar/verifyMobileOTP") suspend fun verifyMobileOtp(@Body request: AbhaVerifyMobileOtpRequest): Response + // Verify Updated Mobile OTP (v3) @POST("v3/enrollment/auth/byAbdm") suspend fun verifyMobileOtp3(@Body request: AbhaVerifyMobileOtpRequest, @Header("REQUEST-ID") requestId: String, @Header("TIMESTAMP") timestamp: String): Response @@ -64,13 +70,19 @@ interface AbhaApiService { @GET("v1/account/getPngCard") suspend fun getPngCard(): Response - // Staging RES Encryption API + // Staging RES Encryption API (v1/v2) +// @GET +// suspend fun getAuthCert( +// @Url url: String = "https://healthidsbx.abdm.gov.in/api/v2/auth/cert" +// ): Response + + // Staging RES Encryption API (v3) @GET suspend fun getAuthCert( @Url url: String = "https://healthidsbx.abdm.gov.in/api/v1/auth/cert" ): Response - // Production RES Encryption API + // Production RES Encryption API (v3) // @GET // suspend fun getAuthCert( // @Url url: String = "https://healthid.abdm.gov.in/api/v1/auth/cert" diff --git a/app/src/main/java/org/piramalswasthya/sakhi/repositories/AbhaIdRepo.kt b/app/src/main/java/org/piramalswasthya/sakhi/repositories/AbhaIdRepo.kt index 6d7be52e2..ed0a0d095 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/repositories/AbhaIdRepo.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/repositories/AbhaIdRepo.kt @@ -222,6 +222,7 @@ class AbhaIdRepo @Inject constructor( suspend fun verifyOtpForAadhaar(req: AbhaVerifyAadhaarOtpRequest): NetworkResult { return withContext(Dispatchers.IO) { try { + // ABHA v3 req.authData.otp.otpValue = encryptData(req.authData.otp.otpValue) req.authData.otp.timeStamp = getCurrentTimestamp() // ABHA v1/v2 API @@ -281,6 +282,7 @@ class AbhaIdRepo @Inject constructor( suspend fun verifyOtpForMobileNumber(req: AbhaVerifyMobileOtpRequest): NetworkResult { return withContext(Dispatchers.IO) { try { + // ABHA v3 req.authData.otp.otpValue = encryptData(req.authData.otp.otpValue) req.authData.otp.timeStamp = getCurrentTimestamp() // ABHA v1/v2 API From b7be0f0e9d20e6658e8238bc17c3a3d823b095c1 Mon Sep 17 00:00:00 2001 From: nikhil_a Date: Wed, 18 Sep 2024 14:12:11 +0530 Subject: [PATCH 057/892] Change in README.md file : -Added App Description -Added steps required to set up project initially --- README.md | 112 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 88 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 1c8fb4349..cc347e11c 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,90 @@ -# **Generating APK:** - - - Information for the steps followed during the generation of APK’s for Sakhi Application from code - -**Pre-Requesties:** - - Clone the code of updated repo into android studio and build the application. -**Secrets:** - - set ENCRYPTED_PASS_KEY, ABHA_CLIENT_ID, ABHA_CLIENT_SECRET values in secrets.properties file. -**google-json** - - set google json file of required variant ie. uat, staging or production. -**Environments**: We can generate the application for below environments based on requirements - - Amrit Demo - - UAT - - Production +# FLW Mobile App + +## Overview + +
    +
  • The FLW Mobile App is designed for Healthcare programs and consultation services render by ASHAs’ to serve pregnant women, mothers and newborns in India. This +ultimately eliminates pen and paper work by ASHAs and carry out entering beneficiaries’ data in a digitalized +process with increased ease and accuracy of data. We named it as SAKHI for Bihar State and Utprerona for +Assam State.
  • + +
  • This application provides below functional modules.
  • + 1. Household List + 2. New Household Registration + 3. All Beneficiaries List + 4. Beneficiary Registration + 5. Eligible Couple List + 6. Mother Care + • Pregnancy List (PMSMA Form: Pradhan Mantri Surakshit Matritva Abhiyan) + • Delivery stage List + • PNC Mother List + • Reproductive Age List + 7. Child Care + • Infant List + • Child List + • Adolescent List + 8. NCD + • NCD List + • NCD Eligible List + • NCD Priority List + • NCD Non-Eligible List + 9. Immunization due List + 10. HRP Cases + 11. General OP Care List + 12. Menopause Stage List + 13. Death Reports + 14. Village Level Forms + 15. ASHA Dashboard + • Total ANC Women + • Delivery due list + • Total Delivery Women + • Total PNC Women + 16. ASHA To-do List (Scheduler) +
+ +## Features + +- **User Authentication**: Secure login. +- **Real-time Data**: Access to up-to-date information about beneficiaries. +- **User-Friendly Interface**: Intuitive design for easy navigation. +- **Offline Access**: Ability to use the app without an internet connection. +- **Multilingual Support**: Ability to use app in different languages like English, Hindi, Assamese. + +## Technologies & Tools Used + +- **IDE**: Android Studio. +- **Database**: Room +- **Languages**: XML, Kotlin, SQL +- **Architecture & Architectural Components**: MVVM, Android Architectural Components +- **SDK**: Android SDK 23-34 + +## Installation + +Make sure you have the following installed: + +- [Android Studio](https://developer.android.com/studio) + +To run this project, Follow these steps: + +1. Clone the repository to your local machine using `git clone https://github.com/PSMRI/FLW-Mobile-App`. +2. Open Android Studio. +3. Click on 'Open an existing Android Studio project'. +4. Navigate to the directory where you cloned the project and select the root folder. +5. Wait for Android Studio to sync the project and download the dependencies. +6. Once the sync is done, you can run the project on an emulator or a physical device. + +### Prerequisites +
    +
  • **Secrets:** + - set ENCRYPTED_PASS_KEY, ABHA_CLIENT_ID, ABHA_CLIENT_SECRET values in secrets.properties file.
  • +
  • **google-json** + - set Google JSON file of required variant ie. UAT, STAGING or PRODUCTION. +
  • **Environments**: + -We can generate the application for below environments based on requirements + - Amrit Demo + - UAT + - Production +
**Configurations:** @@ -25,6 +98,7 @@ - In AllBenFragment class we have a Boolean `showAbha` which can be used to toggle the visibility of abha button on beneficiary cards + **APK Variants:** We can generate signed and un-signed apk’s for the application - For amritdemo/UAT we generate unsigned apk’s @@ -47,13 +121,3 @@ + Once the APK is generated android studio will notify with the location of APK, generally in release folder - - - - - - - - - - From 932e3b63b941629d8c111ece19e857f71a3bc6f3 Mon Sep 17 00:00:00 2001 From: nikhil_a Date: Wed, 18 Sep 2024 14:26:37 +0530 Subject: [PATCH 058/892] Change in README.md file : -Formatting change added next line tag --- README.md | 71 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 37 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index cc347e11c..1c558aa7d 100644 --- a/README.md +++ b/README.md @@ -7,39 +7,41 @@ ultimately eliminates pen and paper work by ASHAs and carry out entering beneficiaries’ data in a digitalized process with increased ease and accuracy of data. We named it as SAKHI for Bihar State and Utprerona for Assam State. + -
  • This application provides below functional modules.
  • - 1. Household List - 2. New Household Registration - 3. All Beneficiaries List - 4. Beneficiary Registration - 5. Eligible Couple List - 6. Mother Care - • Pregnancy List (PMSMA Form: Pradhan Mantri Surakshit Matritva Abhiyan) - • Delivery stage List - • PNC Mother List - • Reproductive Age List - 7. Child Care - • Infant List - • Child List - • Adolescent List - 8. NCD - • NCD List - • NCD Eligible List - • NCD Priority List - • NCD Non-Eligible List - 9. Immunization due List - 10. HRP Cases - 11. General OP Care List - 12. Menopause Stage List - 13. Death Reports - 14. Village Level Forms - 15. ASHA Dashboard - • Total ANC Women - • Delivery due list - • Total Delivery Women - • Total PNC Women - 16. ASHA To-do List (Scheduler) +
      +This application provides below functional modules. +
    • 1. Household List
    • +
    • 2. New Household Registration
    • +
    • 3. All Beneficiaries List
    • +
    • 4. Beneficiary Registration
    • +
    • 5. Eligible Couple List
    • +
    • 6. Mother Care
    • + • Pregnancy List (PMSMA Form: Pradhan Mantri Surakshit Matritva Abhiyan) + • Delivery stage List + • PNC Mother List + • Reproductive Age List +
    • 7. Child Care
    • + • Infant List + • Child List + • Adolescent List +
    • 8. NCD
    • + • NCD List + • NCD Eligible List + • NCD Priority List + • NCD Non-Eligible List +
    • 9. Immunization due List
    • +
    • 10. HRP Cases
    • +
    • 11. General OP Care List
    • +
    • 12. Menopause Stage List
    • +
    • 13. Death Reports
    • +
    • 14. Village Level Forms
    • +
    • 15. ASHA Dashboard
    • + • Total ANC Women + • Delivery due list + • Total Delivery Women + • Total PNC Women +
    • 16. ASHA To-do List (Scheduler)
    ## Features @@ -66,7 +68,8 @@ Make sure you have the following installed: To run this project, Follow these steps: -1. Clone the repository to your local machine using `git clone https://github.com/PSMRI/FLW-Mobile-App`. +1. Clone the repository to your local machine + using `git clone https://github.com/PSMRI/FLW-Mobile-App`. 2. Open Android Studio. 3. Click on 'Open an existing Android Studio project'. 4. Navigate to the directory where you cloned the project and select the root folder. @@ -74,6 +77,7 @@ To run this project, Follow these steps: 6. Once the sync is done, you can run the project on an emulator or a physical device. ### Prerequisites +
    • **Secrets:** - set ENCRYPTED_PASS_KEY, ABHA_CLIENT_ID, ABHA_CLIENT_SECRET values in secrets.properties file.
    • @@ -98,7 +102,6 @@ To run this project, Follow these steps: - In AllBenFragment class we have a Boolean `showAbha` which can be used to toggle the visibility of abha button on beneficiary cards - **APK Variants:** We can generate signed and un-signed apk’s for the application - For amritdemo/UAT we generate unsigned apk’s From 0138828f7ee0ac204d9700792504123b5f8ab6b3 Mon Sep 17 00:00:00 2001 From: nikhil_a Date: Wed, 18 Sep 2024 14:39:17 +0530 Subject: [PATCH 059/892] Change in README.md file : -Formatting change added next line tag --- README.md | 51 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 1c558aa7d..452e907df 100644 --- a/README.md +++ b/README.md @@ -9,40 +9,55 @@ process with increased ease and accuracy of data. We named it as SAKHI for Bihar Assam State.
    -
      + This application provides below functional modules. -
    • 1. Household List
    • -
    • 2. New Household Registration
    • -
    • 3. All Beneficiaries List
    • -
    • 4. Beneficiary Registration
    • -
    • 5. Eligible Couple List
    • -
    • 6. Mother Care
    • +1. Household List + +2. New Household Registration + +3. All Beneficiaries List + +4. Beneficiary Registration + +5. Eligible Couple List + +6. Mother Care • Pregnancy List (PMSMA Form: Pradhan Mantri Surakshit Matritva Abhiyan) • Delivery stage List • PNC Mother List • Reproductive Age List -
    • 7. Child Care
    • + +7. Child Care • Infant List • Child List • Adolescent List -
    • 8. NCD
    • + +8. NCD • NCD List • NCD Eligible List • NCD Priority List • NCD Non-Eligible List -
    • 9. Immunization due List
    • -
    • 10. HRP Cases
    • -
    • 11. General OP Care List
    • -
    • 12. Menopause Stage List
    • -
    • 13. Death Reports
    • -
    • 14. Village Level Forms
    • -
    • 15. ASHA Dashboard
    • + +9. Immunization due List + +10. HRP Cases + +11. General OP Care List + +12. Menopause Stage List + +13. Death Reports + +14. Village Level Forms + +15. ASHA Dashboard • Total ANC Women • Delivery due list • Total Delivery Women • Total PNC Women -
    • 16. ASHA To-do List (Scheduler)
    • -
    + +16. ASHA To-do List (Scheduler) + ## Features From b61aaf22709b5a81a9e8311b502093d080d277af Mon Sep 17 00:00:00 2001 From: Ritik Date: Wed, 18 Sep 2024 15:04:13 +0530 Subject: [PATCH 060/892] Cbac enhancement and Alert and notification changes --- .../sakhi/adapters/NCDCategoryAdapter.kt | 68 +++++++++ .../NcdEligibleListFragment.kt | 36 ++++- .../NcdEligibleListViewModel.kt | 43 ++++++ app/src/main/res/drawable/blue_border.xml | 7 + .../res/layout/fragment_ncd_eligible_list.xml | 133 +++++++++++++++++- .../res/layout/fragment_new_ben_reg_type.xml | 2 +- app/src/main/res/values-as/strings_ben.xml | 4 +- app/src/main/res/values/strings_ben.xml | 4 +- 8 files changed, 283 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/org/piramalswasthya/sakhi/adapters/NCDCategoryAdapter.kt create mode 100644 app/src/main/res/drawable/blue_border.xml diff --git a/app/src/main/java/org/piramalswasthya/sakhi/adapters/NCDCategoryAdapter.kt b/app/src/main/java/org/piramalswasthya/sakhi/adapters/NCDCategoryAdapter.kt new file mode 100644 index 000000000..2bf889eed --- /dev/null +++ b/app/src/main/java/org/piramalswasthya/sakhi/adapters/NCDCategoryAdapter.kt @@ -0,0 +1,68 @@ +package org.piramalswasthya.sakhi.adapters + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import org.piramalswasthya.sakhi.R +import org.piramalswasthya.sakhi.databinding.RvTabBinding +import org.piramalswasthya.sakhi.ui.home_activity.non_communicable_diseases.ncd_eligible_list.NcdEligibleListViewModel + +class NCDCategoryAdapter( + private val catDataList: ArrayList, + private val clickListener: CategoryClickListener? = null, + var viewModel: NcdEligibleListViewModel +) : RecyclerView.Adapter(){ + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = + CategoryViewHolder.from(parent) + + + override fun onBindViewHolder( + holder: CategoryViewHolder, + position: Int, + ) { + + holder.bind(catDataList[position]) + holder.binding.cMainLayout.setOnClickListener { + viewModel.selectedPosition = position + clickListener?.onClicked(catDataList[position]) + notifyDataSetChanged() + + } + if (viewModel.selectedPosition == position) { + holder.binding.cMainLayout.setBackgroundResource(R.drawable.tab_selection) + } else { + holder.binding.cMainLayout.setBackgroundResource(R.drawable.tab_unselection) + } + + } + + + class CategoryViewHolder private constructor(val binding: RvTabBinding) : + RecyclerView.ViewHolder(binding.root) { + companion object { + fun from(parent: ViewGroup): CategoryViewHolder { + val layoutInflater = LayoutInflater.from(parent.context) + val binding = RvTabBinding.inflate(layoutInflater, parent, false) + return CategoryViewHolder(binding) + } + } + + fun bind( + catDataList: String, + ) { + + binding.monthText.text = catDataList + + } + + } + override fun getItemCount(): Int { + return catDataList.size + } + + fun interface CategoryClickListener + { + fun onClicked(catDataList: String) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/ncd_eligible_list/NcdEligibleListFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/ncd_eligible_list/NcdEligibleListFragment.kt index 906a08b4e..cdaf682e9 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/ncd_eligible_list/NcdEligibleListFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/ncd_eligible_list/NcdEligibleListFragment.kt @@ -6,6 +6,8 @@ import android.text.TextWatcher import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.ArrayAdapter import android.widget.EditText import android.widget.Toast import androidx.fragment.app.Fragment @@ -15,18 +17,20 @@ import androidx.navigation.fragment.findNavController import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import org.piramalswasthya.sakhi.R +import org.piramalswasthya.sakhi.adapters.NCDCategoryAdapter import org.piramalswasthya.sakhi.adapters.NcdCbacBenListAdapter -import org.piramalswasthya.sakhi.databinding.FragmentDisplaySearchRvButtonBinding +import org.piramalswasthya.sakhi.databinding.FragmentNcdEligibleListBinding import org.piramalswasthya.sakhi.model.getDateStrFromLong import org.piramalswasthya.sakhi.ui.home_activity.HomeActivity import timber.log.Timber @AndroidEntryPoint -class NcdEligibleListFragment : Fragment() { +class NcdEligibleListFragment : Fragment() , NCDCategoryAdapter.CategoryClickListener { - private val binding: FragmentDisplaySearchRvButtonBinding by lazy { - FragmentDisplaySearchRvButtonBinding.inflate(layoutInflater) + + private val binding: FragmentNcdEligibleListBinding by lazy { + FragmentNcdEligibleListBinding.inflate(layoutInflater) } private val viewModel: NcdEligibleListViewModel by viewModels() @@ -45,6 +49,12 @@ class NcdEligibleListFragment : Fragment() { binding.btnNextPage.visibility = View.GONE + + val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_dropdown_item, viewModel.yearsList()) + binding.tilRvDropdown.setAdapter(adapter) + + binding.rvCat.adapter = NCDCategoryAdapter(viewModel.categoryData(),this,viewModel) + val benAdapter = NcdCbacBenListAdapter( clickListener = NcdCbacBenListAdapter.CbacFormClickListener( @@ -105,6 +115,19 @@ class NcdEligibleListFragment : Fragment() { } } + binding.tilRvDropdown.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) { + val selectedItem = parent.getItemAtPosition(position).toString() + if (selectedItem != "Select Years") { + viewModel.filterText(selectedItem) + } + + } + + override fun onNothingSelected(parent: AdapterView<*>) { + + } + } binding.searchView.setOnFocusChangeListener { searchView, b -> if (b) (searchView as EditText).addTextChangedListener(searchTextWatcher) @@ -114,6 +137,7 @@ class NcdEligibleListFragment : Fragment() { } } + override fun onStart() { super.onStart() activity?.let { @@ -124,4 +148,8 @@ class NcdEligibleListFragment : Fragment() { } } + override fun onClicked(catDataList: String) { + viewModel.selectedText = catDataList + } + } \ No newline at end of file diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/ncd_eligible_list/NcdEligibleListViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/ncd_eligible_list/NcdEligibleListViewModel.kt index 23757a9e7..fd069578f 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/ncd_eligible_list/NcdEligibleListViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/ncd_eligible_list/NcdEligibleListViewModel.kt @@ -22,14 +22,25 @@ class NcdEligibleListViewModel @Inject constructor( ) { private lateinit var asha: User + var selectedPosition = 0 + var selectedText = "ALL" + private val allBenList = recordsRepo.getNcdEligibleList private val filter = MutableStateFlow("") private val selectedBenId = MutableStateFlow(0L) + val benList = allBenList.combine(filter) { cacheList, filter -> val list = cacheList.map { it.asDomainModel() } val benBasicDomainList = list.map { it.ben } val filteredBenBasicDomainList = filterBenList(benBasicDomainList, filter) list.filter { it.ben.benId in filteredBenBasicDomainList.map { it.benId } } + if (selectedText == "Screened"){ + list.filter { it.savedCbacRecords.isNotEmpty() } + } else if (selectedText == "Not Screened") { + list.filter { it.savedCbacRecords.isEmpty() } + } else { + list.filter { it.ben.benId in filteredBenBasicDomainList.map { it.benId } } + } } @@ -64,4 +75,36 @@ class NcdEligibleListViewModel @Inject constructor( fun getAshaId(): Int = asha.userId + private val catList = ArrayList() + + fun categoryData() : ArrayList { + + catList.clear() + catList.add("ALL") + catList.add("Screened") + catList.add("Not Screened") + return catList + + } + + private val yearsData = ArrayList() + + fun yearsList() : ArrayList { + + yearsData.clear() + yearsData.add("Select Years") + yearsData.add("35 YEARS") + yearsData.add("40 YEARS") + yearsData.add("45 YEARS") + yearsData.add("50 YEARS") + yearsData.add("55 YEARS") + yearsData.add("60 YEARS") + yearsData.add("65 YEARS") + yearsData.add("70 YEARS") + yearsData.add("75 YEARS") + yearsData.add("80 YEARS") + return yearsData + + } + } \ No newline at end of file diff --git a/app/src/main/res/drawable/blue_border.xml b/app/src/main/res/drawable/blue_border.xml new file mode 100644 index 000000000..835bd104c --- /dev/null +++ b/app/src/main/res/drawable/blue_border.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_ncd_eligible_list.xml b/app/src/main/res/layout/fragment_ncd_eligible_list.xml index 5cedd3d13..46f748e77 100644 --- a/app/src/main/res/layout/fragment_ncd_eligible_list.xml +++ b/app/src/main/res/layout/fragment_ncd_eligible_list.xml @@ -1,13 +1,136 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:layout_height="wrap_content" + android:layout_margin="@dimen/margin_normal" + android:padding="@dimen/padding_normal" + android:text="@string/btn_text_frag_home_nhhr" + android:textAppearance="@style/TextAppearance.Material3.BodyLarge" + app:layout_constraintBottom_toBottomOf="parent" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_new_ben_reg_type.xml b/app/src/main/res/layout/fragment_new_ben_reg_type.xml index 41a736fda..4fe2ba311 100644 --- a/app/src/main/res/layout/fragment_new_ben_reg_type.xml +++ b/app/src/main/res/layout/fragment_new_ben_reg_type.xml @@ -62,7 +62,7 @@ android:textColor="@android:color/holo_red_light" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toBottomOf="@id/rg_ben_type" - tools:text="Warning : ID running low, connect to internet at the earliest" /> + tools:text="Warning : Poor Internet Connectivity" /> \ No newline at end of file diff --git a/app/src/main/res/values-as/strings_ben.xml b/app/src/main/res/values-as/strings_ben.xml index cf4419a33..c0643df3f 100644 --- a/app/src/main/res/values-as/strings_ben.xml +++ b/app/src/main/res/values-as/strings_ben.xml @@ -41,8 +41,8 @@ আপনি কি পূর্ববর্তী ফর্ম সঙ্গে চালিয়ে যেতে চান, অথবা পূর্ববর্তী ফর্ম ত্যাগ করে নতুন ফর্ম তৈরি করতে চান? ড্রাফট খোলুন নতুন তৈরি করুন - সতর্কবার্তা: আইডি ঘাটতি হচ্ছে, সহযোগিতা ত্রৈমাসিক সংযোগ করুন - ত্রুটি: আর কোন সুবিধানুগত আইডি প্রাপ্ত নেই। কিছু পেতে ইন্টারনেট সংযোগ করুন। + সতর্কবার্তা: ইণ্টাৰনেট সংযোগৰ অৱস্থা বেয়া + ত্রুটি: বেন আইডি পাবলৈ ইন্টাৰনেট সংযোগ পৰীক্ষা কৰক সুবিধানুগতের ধরন নির্বাচন করুন নতুন জন্ম / শিশু / শিশু / কিশোর\n( 0 - 15 বছর বয়সের মধ্যে ) সাধারণ নিবন্ধন\n( 15 বছর এবং তার উপর ) diff --git a/app/src/main/res/values/strings_ben.xml b/app/src/main/res/values/strings_ben.xml index cb61d6417..7964b73c2 100644 --- a/app/src/main/res/values/strings_ben.xml +++ b/app/src/main/res/values/strings_ben.xml @@ -40,8 +40,8 @@ Do you want to continue with previous form, or create a new form and discard the previous form? OPEN DRAFT CREATE NEW - Warning : ID running low, connect to internet at the earliest - Error : No more ben Ids available. Connect to internet to get some. + Warning : Poor Internet Connectivity + Error : Check Internet Connectivity to get Ben id. Please select type of beneficiary New Born / Infant / Child / Adolescent\n( 0 - less than 15 years of age ) General Registration \n( 15 years and above ) From 910f94bfdf5197943dc3aa3ae2b37e6fd9d3676e Mon Sep 17 00:00:00 2001 From: Ritik Date: Wed, 18 Sep 2024 15:31:24 +0530 Subject: [PATCH 061/892] removed duplicacy --- .../sakhi/adapters/NCDCategoryAdapter.kt | 32 +++++++++---------- .../NcdEligibleListFragment.kt | 2 +- .../NcdEligibleListViewModel.kt | 2 +- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/adapters/NCDCategoryAdapter.kt b/app/src/main/java/org/piramalswasthya/sakhi/adapters/NCDCategoryAdapter.kt index 2bf889eed..27652e0f8 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/adapters/NCDCategoryAdapter.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/adapters/NCDCategoryAdapter.kt @@ -8,28 +8,28 @@ import org.piramalswasthya.sakhi.databinding.RvTabBinding import org.piramalswasthya.sakhi.ui.home_activity.non_communicable_diseases.ncd_eligible_list.NcdEligibleListViewModel class NCDCategoryAdapter( - private val catDataList: ArrayList, - private val clickListener: CategoryClickListener? = null, + private val dataList: ArrayList, + private val listener: ClickListener? = null, var viewModel: NcdEligibleListViewModel -) : RecyclerView.Adapter(){ +) : RecyclerView.Adapter(){ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = - CategoryViewHolder.from(parent) + ViewHolder.from(parent) override fun onBindViewHolder( - holder: CategoryViewHolder, + holder: ViewHolder, position: Int, ) { - holder.bind(catDataList[position]) + holder.bind(dataList[position]) holder.binding.cMainLayout.setOnClickListener { - viewModel.selectedPosition = position - clickListener?.onClicked(catDataList[position]) + viewModel.clickedPosition = position + listener?.onClicked(dataList[position]) notifyDataSetChanged() } - if (viewModel.selectedPosition == position) { + if (viewModel.clickedPosition == position) { holder.binding.cMainLayout.setBackgroundResource(R.drawable.tab_selection) } else { holder.binding.cMainLayout.setBackgroundResource(R.drawable.tab_unselection) @@ -38,30 +38,30 @@ class NCDCategoryAdapter( } - class CategoryViewHolder private constructor(val binding: RvTabBinding) : + class ViewHolder private constructor(val binding: RvTabBinding) : RecyclerView.ViewHolder(binding.root) { companion object { - fun from(parent: ViewGroup): CategoryViewHolder { + fun from(parent: ViewGroup): ViewHolder { val layoutInflater = LayoutInflater.from(parent.context) val binding = RvTabBinding.inflate(layoutInflater, parent, false) - return CategoryViewHolder(binding) + return ViewHolder(binding) } } fun bind( - catDataList: String, + dataObject: String, ) { - binding.monthText.text = catDataList + binding.monthText.text = dataObject } } override fun getItemCount(): Int { - return catDataList.size + return dataList.size } - fun interface CategoryClickListener + fun interface ClickListener { fun onClicked(catDataList: String) } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/ncd_eligible_list/NcdEligibleListFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/ncd_eligible_list/NcdEligibleListFragment.kt index cdaf682e9..4e6fabc2f 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/ncd_eligible_list/NcdEligibleListFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/ncd_eligible_list/NcdEligibleListFragment.kt @@ -25,7 +25,7 @@ import org.piramalswasthya.sakhi.ui.home_activity.HomeActivity import timber.log.Timber @AndroidEntryPoint -class NcdEligibleListFragment : Fragment() , NCDCategoryAdapter.CategoryClickListener { +class NcdEligibleListFragment : Fragment() , NCDCategoryAdapter.ClickListener { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/ncd_eligible_list/NcdEligibleListViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/ncd_eligible_list/NcdEligibleListViewModel.kt index fd069578f..115afed2d 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/ncd_eligible_list/NcdEligibleListViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/ncd_eligible_list/NcdEligibleListViewModel.kt @@ -22,7 +22,7 @@ class NcdEligibleListViewModel @Inject constructor( ) { private lateinit var asha: User - var selectedPosition = 0 + var clickedPosition = 0 var selectedText = "ALL" private val allBenList = recordsRepo.getNcdEligibleList From cdb9e8773b9bafced401ec68f98da5208b615250 Mon Sep 17 00:00:00 2001 From: Ritik Date: Wed, 18 Sep 2024 15:43:58 +0530 Subject: [PATCH 062/892] removed empty block --- .../ncd_eligible_list/NcdEligibleListFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/ncd_eligible_list/NcdEligibleListFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/ncd_eligible_list/NcdEligibleListFragment.kt index 4e6fabc2f..3dd683b87 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/ncd_eligible_list/NcdEligibleListFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/ncd_eligible_list/NcdEligibleListFragment.kt @@ -125,7 +125,7 @@ class NcdEligibleListFragment : Fragment() , NCDCategoryAdapter.ClickListener { } override fun onNothingSelected(parent: AdapterView<*>) { - + Timber.d("Called here!") } } binding.searchView.setOnFocusChangeListener { searchView, b -> From 4914e2aa0087b99308476462456350d5ae94bed3 Mon Sep 17 00:00:00 2001 From: Ritik Date: Wed, 18 Sep 2024 18:09:55 +0530 Subject: [PATCH 063/892] Added Option to type Name Fileds in Hindi/Assamese --- .../configuration/BenGenRegFormDataset.kt | 33 ++++++++++++++----- .../sakhi/configuration/BenRegCHODataset.kt | 12 +++++-- .../sakhi/configuration/BenRegFormDataset.kt | 32 +++++++++++++----- .../configuration/ChildRegistrationDataset.kt | 16 +++++++-- .../configuration/HouseholdFormDataset.kt | 13 ++++++-- .../sakhi/configuration/PMSMAFormDataset.kt | 9 +++-- .../sakhi/helpers/Konstants.kt | 1 + 7 files changed, 89 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenGenRegFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenGenRegFormDataset.kt index f8d4cc351..436144b9f 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenGenRegFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenGenRegFormDataset.kt @@ -5,6 +5,7 @@ import android.net.Uri import android.text.InputType import androidx.core.text.isDigitsOnly import org.piramalswasthya.sakhi.R +import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Konstants.maxAgeForGenBen import org.piramalswasthya.sakhi.helpers.Konstants.minAgeForGenBen import org.piramalswasthya.sakhi.helpers.Konstants.minAgeForMarriage @@ -24,7 +25,7 @@ import java.text.SimpleDateFormat import java.util.Calendar import java.util.Locale -class BenGenRegFormDataset(context: Context, language: Languages) : Dataset(context, language) { +class BenGenRegFormDataset(context: Context,val language: Languages) : Dataset(context, language) { companion object { private fun getCurrentDateString(): String { @@ -517,11 +518,16 @@ class BenGenRegFormDataset(context: Context, language: Languages) : Dataset(cont return when (formId) { firstName.id -> { validateEmptyOnEditText(firstName) - validateAllCapsOrSpaceOnEditText(firstName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(firstName) + } else -1 + } lastName.id -> { - validateAllCapsOrSpaceOnEditText(lastName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(lastName) + } else -1 } dob.id -> { @@ -685,27 +691,38 @@ class BenGenRegFormDataset(context: Context, language: Languages) : Dataset(cont fatherName.id -> { validateEmptyOnEditText(fatherName) - validateAllCapsOrSpaceOnEditText(fatherName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(fatherName) + } else -1 + } motherName.id -> { validateEmptyOnEditText(motherName) - validateAllCapsOrSpaceOnEditText(motherName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(motherName) + } else -1 } husbandName.id -> { validateEmptyOnEditText(husbandName) - validateAllCapsOrSpaceOnEditText(husbandName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(husbandName) + } else -1 } wifeName.id -> { validateEmptyOnEditText(wifeName) - validateAllCapsOrSpaceOnEditText(wifeName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(wifeName) + } else -1 } spouseName.id -> { validateEmptyOnEditText(spouseName) - validateAllCapsOrSpaceOnEditText(spouseName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(spouseName) + } else -1 } contactNumber.id -> { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegCHODataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegCHODataset.kt index 614f586b5..254c7ec63 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegCHODataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegCHODataset.kt @@ -2,6 +2,7 @@ package org.piramalswasthya.sakhi.configuration import android.content.Context import org.piramalswasthya.sakhi.R +import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.model.AgeUnit import org.piramalswasthya.sakhi.model.BenRegCache @@ -12,7 +13,7 @@ import java.util.Calendar import java.util.concurrent.TimeUnit class BenRegCHODataset( - context: Context, currentLanguage: Languages + context: Context, val currentLanguage: Languages ) : Dataset(context, currentLanguage) { private val dateOfReg = FormElement( @@ -131,11 +132,16 @@ class BenRegCHODataset( } name.id -> { - validateAllCapsOrSpaceOnEditText(name) + if (currentLanguage.toString() == english) { + validateAllCapsOrSpaceOnEditText(name) + } else -1 } husbandName.id -> { - validateAllCapsOrSpaceOnEditText(husbandName) + if (currentLanguage.toString() == english) { + validateAllCapsOrSpaceOnEditText(husbandName) + } else -1 + } age.id -> { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt index 5b4a27c4d..365976963 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt @@ -7,6 +7,7 @@ import android.util.Range import android.widget.LinearLayout import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.helpers.Konstants +import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.helpers.setToStartOfTheDay import org.piramalswasthya.sakhi.model.AgeUnit @@ -30,7 +31,7 @@ import java.util.Calendar import java.util.Locale import java.util.concurrent.TimeUnit -class BenRegFormDataset(context: Context, language: Languages) : Dataset(context, language) { +class BenRegFormDataset(context: Context,val language: Languages) : Dataset(context, language) { companion object { @@ -1473,11 +1474,16 @@ class BenRegFormDataset(context: Context, language: Languages) : Dataset(context return when (formId) { firstName.id -> { validateEmptyOnEditText(firstName) - validateAllCapsOrSpaceOnEditText(firstName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(firstName) + } else -1 + } lastName.id -> { - validateAllCapsOrSpaceOnEditText(lastName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(lastName) + } else -1 } agePopup.id -> { @@ -1661,27 +1667,37 @@ class BenRegFormDataset(context: Context, language: Languages) : Dataset(context fatherName.id -> { validateEmptyOnEditText(fatherName) - validateAllCapsOrSpaceOnEditText(fatherName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(fatherName) + } else -1 } motherName.id -> { validateEmptyOnEditText(motherName) - validateAllCapsOrSpaceOnEditText(motherName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(motherName) + } else -1 } husbandName.id -> { validateEmptyOnEditText(husbandName) - validateAllCapsOrSpaceOnEditText(husbandName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(husbandName) + } else -1 } wifeName.id -> { validateEmptyOnEditText(wifeName) - validateAllCapsOrSpaceOnEditText(wifeName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(wifeName) + } else -1 } spouseName.id -> { validateEmptyOnEditText(spouseName) - validateAllCapsOrSpaceOnEditText(spouseName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(spouseName) + } else -1 } contactNumber.id -> { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/ChildRegistrationDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/ChildRegistrationDataset.kt index 14971a939..cf343b439 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/ChildRegistrationDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/ChildRegistrationDataset.kt @@ -3,6 +3,8 @@ package org.piramalswasthya.sakhi.configuration import android.content.Context import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.database.room.SyncState +import org.piramalswasthya.sakhi.helpers.Konstants +import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.model.BenBasicCache import org.piramalswasthya.sakhi.model.BenRegCache @@ -16,7 +18,7 @@ import org.piramalswasthya.sakhi.model.LocationRecord import org.piramalswasthya.sakhi.model.User class ChildRegistrationDataset( - context: Context, currentLanguage: Languages + context: Context, var currentLanguage: Languages ) : Dataset(context, currentLanguage) { private val dateOfReg = FormElement( @@ -233,11 +235,19 @@ class ChildRegistrationDataset( override suspend fun handleListOnValueChanged(formId: Int, index: Int): Int { return when (formId) { - childName.id -> validateAllCapsOrSpaceOnEditText(childName) + childName.id -> { + if (currentLanguage.toString() == english) { + validateAllCapsOrSpaceOnEditText(childName) + } else -1 + } rchId.id -> validateRchIdOnEditText(rchId) rchIdMother.id -> validateRchIdOnEditText(rchIdMother) mobileNumber.id -> validateMobileNumberOnEditText(mobileNumber) - fatherName.id -> validateAllCapsOrSpaceOnEditText(fatherName) + fatherName.id -> { + if (currentLanguage.toString() == english) { + validateAllCapsOrSpaceOnEditText(fatherName) + } else -1 + } weightAtBirth.id -> validateDoubleMinMax(weightAtBirth) birthCertificateNo.id -> validateNoAlphabetSpaceOnEditText(birthCertificateNo) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/HouseholdFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/HouseholdFormDataset.kt index 96f422f6d..05fcc2e75 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/HouseholdFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/HouseholdFormDataset.kt @@ -4,6 +4,7 @@ package org.piramalswasthya.sakhi.configuration import android.content.Context import android.text.InputType import org.piramalswasthya.sakhi.R +import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.model.FormElement import org.piramalswasthya.sakhi.model.HouseholdAmenities @@ -20,7 +21,7 @@ import java.util.Calendar import java.util.Date import java.util.Locale -class HouseholdFormDataset(context: Context, language: Languages) : Dataset(context, language) { +class HouseholdFormDataset(context: Context, val language: Languages) : Dataset(context, language) { companion object { private fun getCurrentDate(): String { val calendar = Calendar.getInstance() @@ -435,10 +436,16 @@ class HouseholdFormDataset(context: Context, language: Languages) : Dataset(cont return when (formId) { firstNameHeadOfFamily.id -> { validateEmptyOnEditText(firstNameHeadOfFamily) - validateAllCapsOrSpaceOnEditText(firstNameHeadOfFamily) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(firstNameHeadOfFamily) + } else -1 } - lastNameHeadOfFamily.id -> validateAllCapsOrSpaceOnEditText(lastNameHeadOfFamily) + lastNameHeadOfFamily.id -> { + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(lastNameHeadOfFamily) + } else -1 + } mobileNoHeadOfFamily.id -> { validateEmptyOnEditText(mobileNoHeadOfFamily) validateMobileNumberOnEditText(mobileNoHeadOfFamily) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PMSMAFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PMSMAFormDataset.kt index 294409a96..6df42b2a7 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PMSMAFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PMSMAFormDataset.kt @@ -3,6 +3,7 @@ package org.piramalswasthya.sakhi.configuration import android.content.Context import android.text.InputType import org.piramalswasthya.sakhi.R +import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.helpers.setToStartOfTheDay import org.piramalswasthya.sakhi.model.BenRegCache @@ -21,7 +22,7 @@ import java.util.Locale import java.util.concurrent.TimeUnit class PMSMAFormDataset( - context: Context, currentLanguage: Languages + context: Context, val currentLanguage: Languages ) : Dataset(context, currentLanguage) { companion object { @@ -478,7 +479,11 @@ class PMSMAFormDataset( } mobileNumber.id -> validateMobileNumberOnEditText(mobileNumber) - husbandName.id -> validateAllCapsOrSpaceOnEditText(husbandName) + husbandName.id -> { + if (currentLanguage.toString() == english) { + validateAllCapsOrSpaceOnEditText(husbandName) + } else -1 + } bp.id -> validateForBp(bp) weight.id -> validateIntMinMax(weight) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt b/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt index e4cb21b2f..71918a91a 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt @@ -51,6 +51,7 @@ object Konstants { const val minAnc4Week = 36 const val maxAnc4Week = 40 + const val english = "ENGLISH" const val minWeekToShowDelivered = 23 From 9de2945ea9a70ef5df24e330c06a64d2cbb4496f Mon Sep 17 00:00:00 2001 From: Sushant Date: Wed, 18 Sep 2024 18:26:31 +0530 Subject: [PATCH 064/892] Revert "ABHA v3 M1 Migration Complete" This reverts commit 7bf72ad793d65e1199f7f6c89ced8019e73200c2. --- .../create_abha_id/CreateAbhaFragment.kt | 16 ++++++++-------- .../create_abha_id/CreateAbhaViewModel.kt | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt index bc044877f..a44813c17 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt @@ -125,16 +125,16 @@ class CreateAbhaFragment : Fragment() { val benId = intent.getLongExtra("benId", 0) val benRegId = intent.getLongExtra("benRegId", 0) - viewModel.createHID(benId, benRegId) +// viewModel.createHID(benId, benRegId) -// binding.pbCai.visibility = View.INVISIBLE -// binding.clCreateAbhaId.visibility = View.VISIBLE -// binding.clVerifyMobileOtp.visibility = View.INVISIBLE -// binding.clError.visibility = View.INVISIBLE -// binding.clDownloadAbha.visibility = View.GONE + binding.pbCai.visibility = View.INVISIBLE + binding.clCreateAbhaId.visibility = View.VISIBLE + binding.clVerifyMobileOtp.visibility = View.INVISIBLE + binding.clError.visibility = View.INVISIBLE + binding.clDownloadAbha.visibility = View.GONE -// binding.textView2.text = args.name -// binding.textView4.text = args.abhaNumber + binding.textView2.text = args.name + binding.textView4.text = args.abhaNumber viewModel.benMapped.observe(viewLifecycleOwner) { it?.let { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt index 584128e92..058084b25 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt @@ -54,7 +54,7 @@ class CreateAbhaViewModel @Inject constructor( get() = _errorMessage init { - _state.value = State.LOADING +// _state.value = State.LOADING } fun createHID(benId: Long, benRegId: Long) { From 99d4079209783ff1b1abf98249ca8712314cbc2c Mon Sep 17 00:00:00 2001 From: Sushant Date: Wed, 18 Sep 2024 18:29:02 +0530 Subject: [PATCH 065/892] Revert "ABHA v3 M1 Migration Complete" This reverts commit 89136f0a7b836166968d1463c0ecc00811e8f78f. --- .../sakhi/network/JsonAdapters.kt | 2 +- .../aadhaar_id/AadhaarIdFragment.kt | 2 +- .../aadhaar_otp/AadhaarOtpFragment.kt | 4 ++-- .../aadhaar_otp/AadhaarOtpViewModel.kt | 10 ---------- .../create_abha_id/CreateAbhaFragment.kt | 16 +--------------- .../create_abha_id/CreateAbhaViewModel.kt | 2 +- .../GenerateMobileOtpFragment.kt | 6 +++--- .../verify_mobile_otp/VerifyMobileOtpFragment.kt | 9 ++------- app/src/main/res/navigation/nav_abha_id.xml | 12 ------------ 9 files changed, 11 insertions(+), 52 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt b/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt index 6d3a83a96..0955b8569 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt @@ -236,7 +236,7 @@ data class ABHAProfile( val abhaType: String, val stateName: String, val districtName: String, - val ABHANumber: String, + val aBHANumber: String, val abhaStatus: String ) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/AadhaarIdFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/AadhaarIdFragment.kt index 6868e3340..9e99a0603 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/AadhaarIdFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/AadhaarIdFragment.kt @@ -135,7 +135,7 @@ class AadhaarIdFragment : Fragment() { State.ABHA_GENERATED_SUCCESS -> { findNavController().navigate( AadhaarIdFragmentDirections.actionAadhaarIdFragmentToCreateAbhaFragment( - viewModel.txnId, "", "" + viewModel.txnId ) ) } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt index a75b87375..9194b5683 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt @@ -116,7 +116,7 @@ class AadhaarOtpFragment : Fragment() { if (parentViewModel.mobileNumber == viewModel.mobileNumber) { findNavController().navigate( AadhaarOtpFragmentDirections.actionAadhaarOtpFragmentToCreateAbhaFragment( - viewModel.txnId, viewModel.name, viewModel.abhaNumber + viewModel.txnId ) ) } else { @@ -128,7 +128,7 @@ class AadhaarOtpFragment : Fragment() { State.SUCCESS -> { findNavController().navigate( AadhaarOtpFragmentDirections.actionAadhaarOtpFragmentToVerifyMobileOtpFragment( - viewModel.txnId, viewModel.mobileNumber, viewModel.name, viewModel.abhaNumber + viewModel.txnId, viewModel.mobileNumber ) ) viewModel.resetState() diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt index 182100d6c..e2ba515d4 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt @@ -53,14 +53,6 @@ class AadhaarOtpViewModel @Inject constructor( val txnId: String get() = _txnId!! - private var _name: String? = null - val name: String - get() = _name!! - - private var _abhaNumber: String? = null - val abhaNumber: String - get() = _abhaNumber!! - private var _mobileNumber: String? = null val mobileNumber: String get() = _mobileNumber!! @@ -101,8 +93,6 @@ class AadhaarOtpViewModel @Inject constructor( is NetworkResult.Success -> { _txnId = result.data.txnId _mobileNumber = result.data.ABHAProfile.mobile - _name = result.data.ABHAProfile.firstName - _abhaNumber = result.data.ABHAProfile.ABHANumber _state.value = State.OTP_VERIFY_SUCCESS } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt index a44813c17..922cb03cb 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt @@ -33,7 +33,6 @@ import dagger.hilt.android.AndroidEntryPoint import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.databinding.FragmentCreateAbhaBinding import org.piramalswasthya.sakhi.ui.abha_id_activity.AbhaIdActivity -import org.piramalswasthya.sakhi.ui.abha_id_activity.aadhaar_otp.AadhaarOtpFragmentArgs import org.piramalswasthya.sakhi.ui.abha_id_activity.create_abha_id.CreateAbhaViewModel.State import org.piramalswasthya.sakhi.work.WorkerUtils import timber.log.Timber @@ -53,10 +52,6 @@ class CreateAbhaFragment : Fragment() { private val channelId = "download abha card" - val args: CreateAbhaFragmentArgs by lazy { - CreateAbhaFragmentArgs.fromBundle(requireArguments()) - } - private var timer = object : CountDownTimer(30000, 1000) { override fun onTick(millisUntilFinished: Long) { @@ -125,16 +120,7 @@ class CreateAbhaFragment : Fragment() { val benId = intent.getLongExtra("benId", 0) val benRegId = intent.getLongExtra("benRegId", 0) -// viewModel.createHID(benId, benRegId) - - binding.pbCai.visibility = View.INVISIBLE - binding.clCreateAbhaId.visibility = View.VISIBLE - binding.clVerifyMobileOtp.visibility = View.INVISIBLE - binding.clError.visibility = View.INVISIBLE - binding.clDownloadAbha.visibility = View.GONE - - binding.textView2.text = args.name - binding.textView4.text = args.abhaNumber + viewModel.createHID(benId, benRegId) viewModel.benMapped.observe(viewLifecycleOwner) { it?.let { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt index 058084b25..584128e92 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt @@ -54,7 +54,7 @@ class CreateAbhaViewModel @Inject constructor( get() = _errorMessage init { -// _state.value = State.LOADING + _state.value = State.LOADING } fun createHID(benId: Long, benRegId: Long) { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/generate_mobile_otp/GenerateMobileOtpFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/generate_mobile_otp/GenerateMobileOtpFragment.kt index 86b96aa13..075974ffc 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/generate_mobile_otp/GenerateMobileOtpFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/generate_mobile_otp/GenerateMobileOtpFragment.kt @@ -113,14 +113,14 @@ class GenerateMobileOtpFragment : Fragment() { if (viewModel.apiResponse.mobileLinked) { navController.navigate( GenerateMobileOtpFragmentDirections.actionGenerateMobileOtpFragmentToCreateAbhaFragment( - viewModel.txnIdFromArgs, "", "" + viewModel.txnIdFromArgs ) ) } else { navController.navigate( GenerateMobileOtpFragmentDirections.actionGenerateMobileOtpFragmentToVerifyMobileOtpFragment( viewModel.apiResponse.txnId, - binding.tietMobileNumber.text!!.toString(), "", "" + binding.tietMobileNumber.text!!.toString() ) ) } @@ -143,7 +143,7 @@ class GenerateMobileOtpFragment : Fragment() { State.ABHA_GENERATED_SUCCESS -> { navController.navigate( GenerateMobileOtpFragmentDirections.actionGenerateMobileOtpFragmentToCreateAbhaFragment( - viewModel.txnIdFromArgs, "", "" + viewModel.txnIdFromArgs ) ) } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/verify_mobile_otp/VerifyMobileOtpFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/verify_mobile_otp/VerifyMobileOtpFragment.kt index 0540fa177..87b6bdf58 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/verify_mobile_otp/VerifyMobileOtpFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/verify_mobile_otp/VerifyMobileOtpFragment.kt @@ -16,7 +16,6 @@ import dagger.hilt.android.AndroidEntryPoint import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.databinding.FragmentVerifyMobileOtpBinding import org.piramalswasthya.sakhi.ui.abha_id_activity.AbhaIdActivity -import org.piramalswasthya.sakhi.ui.abha_id_activity.aadhaar_otp.AadhaarOtpFragmentArgs import org.piramalswasthya.sakhi.ui.abha_id_activity.verify_mobile_otp.VerifyMobileOtpViewModel.State @AndroidEntryPoint @@ -30,10 +29,6 @@ class VerifyMobileOtpFragment : Fragment() { private val viewModel: VerifyMobileOtpViewModel by viewModels() - val args: VerifyMobileOtpFragmentArgs by lazy { - VerifyMobileOtpFragmentArgs.fromBundle(requireArguments()) - } - private var timer = object : CountDownTimer(30000, 1000) { override fun onTick(millisUntilFinished: Long) { @@ -107,7 +102,7 @@ class VerifyMobileOtpFragment : Fragment() { State.OTP_VERIFY_SUCCESS -> { findNavController().navigate( VerifyMobileOtpFragmentDirections.actionVerifyMobileOtpFragmentToCreateAbhaFragment( - viewModel.txnID, args.name, args.abhaNumber + viewModel.txnID ) ) viewModel.resetState() @@ -141,7 +136,7 @@ class VerifyMobileOtpFragment : Fragment() { State.ABHA_GENERATED_SUCCESS -> { findNavController().navigate( VerifyMobileOtpFragmentDirections.actionVerifyMobileOtpFragmentToCreateAbhaFragment( - viewModel.txnID, args.name, args.abhaNumber + viewModel.txnID ) ) viewModel.resetState() diff --git a/app/src/main/res/navigation/nav_abha_id.xml b/app/src/main/res/navigation/nav_abha_id.xml index 26a68c2d2..500e0d128 100644 --- a/app/src/main/res/navigation/nav_abha_id.xml +++ b/app/src/main/res/navigation/nav_abha_id.xml @@ -77,12 +77,6 @@ - - - - \ No newline at end of file From 39339ba4dbd1e97aa882bd29faa2c230cdb67bd2 Mon Sep 17 00:00:00 2001 From: Sushant Date: Wed, 18 Sep 2024 18:29:29 +0530 Subject: [PATCH 066/892] Revert "Prod RSA Encryption API Endpoint Updated" This reverts commit cce8f022ec073afc4561cf2e964c0364186f99ad. --- .../java/org/piramalswasthya/sakhi/network/AbhaApiService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt index 2fd9b9b2c..f18b61113 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt @@ -73,7 +73,7 @@ interface AbhaApiService { // Production RES Encryption API // @GET // suspend fun getAuthCert( -// @Url url: String = "https://healthid.abdm.gov.in/api/v1/auth/cert" +// @Url url: String = "https://healthid.abdm.gov.in/api/v2/auth/cert" // ): Response @GET("v2/ha/lgd/states") From 6ac40a246d027d01de9aea9822e8d81ce10c0739 Mon Sep 17 00:00:00 2001 From: Sushant Date: Wed, 18 Sep 2024 18:29:57 +0530 Subject: [PATCH 067/892] Revert "Updated gitignore" This reverts commit 9a078a392be4fbf5d614ca24d1b87248a1848934. --- .gitignore | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitignore b/.gitignore index 624db1d6d..754ddaff4 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,3 @@ *.lock /app/build/* /app/release/* -local.properties -secrets.properties -/app/google-services.json \ No newline at end of file From 1a939209154a1fc79b669565f8cb41606d19e2c5 Mon Sep 17 00:00:00 2001 From: Sushant Date: Wed, 18 Sep 2024 18:30:06 +0530 Subject: [PATCH 068/892] Revert "ABHA v3 M1 APIs Integrated" This reverts commit bbbd109087687f02ac82fffda787205379ef510c. --- .../org/piramalswasthya/sakhi/di/AppModule.kt | 3 +- .../sakhi/network/AbhaApiService.kt | 10 +- .../sakhi/network/JsonAdapters.kt | 111 +----------------- .../sakhi/repositories/AbhaIdRepo.kt | 41 +------ .../aadhaar_id/AadhaarIdFragment.kt | 2 +- .../AadhaarNumberAshaFragment.kt | 22 +--- .../AadhaarNumberAshaViewModel.kt | 11 +- .../aadhaar_otp/AadhaarOtpFragment.kt | 41 ++----- .../aadhaar_otp/AadhaarOtpViewModel.kt | 70 +---------- .../VerifyMobileOtpViewModel.kt | 9 +- .../main/res/layout/fragment_aadhaar_id.xml | 2 +- .../layout/fragment_aadhaar_number_asha.xml | 48 +------- .../main/res/layout/fragment_aadhaar_otp.xml | 1 - app/src/main/res/navigation/nav_abha_id.xml | 9 -- app/src/main/res/values/strings_abha.xml | 3 +- 15 files changed, 37 insertions(+), 346 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt b/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt index eab975c75..aae90f64c 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt @@ -38,9 +38,8 @@ object AppModule { // Staging ABHA URL // private const val baseAbhaUrl = "https://healthidsbx.abdm.gov.in/api/" - private const val baseAbhaUrl = "https://abhasbx.abdm.gov.in/abha/api/" // Production ABHA URL -// private const val baseAbhaUrl = "https://healthid.abdm.gov.in/api/" + private const val baseAbhaUrl = "https://healthid.abdm.gov.in/api/" private val baseClient = OkHttpClient.Builder() diff --git a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt index f18b61113..1a1c06c7f 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt @@ -29,7 +29,7 @@ interface AbhaApiService { suspend fun generateAadhaarOtpV2(@Body aadhaar: AbhaGenerateAadhaarOtpRequest): Response @POST("v3/enrollment/request/otp") - suspend fun generateAadhaarOtpV3(@Body aadhaar: AbhaGenerateAadhaarOtpRequest, @Header("REQUEST-ID") requestId: String, @Header("TIMESTAMP") timestamp: String): Response + suspend fun generateAadhaarOtpV3(@Body aadhaar: AbhaGenerateAadhaarOtpRequest, @Header("REQUEST_ID") requestId: String, @Header("TIMESTAMP") timestamp: String): Response @POST("v1/registration/aadhaar/resendAadhaarOtp") suspend fun resendAadhaarOtp(@Body aadhaar: AbhaResendAadhaarOtpRequest): Response @@ -37,9 +37,6 @@ interface AbhaApiService { @POST("v1/registration/aadhaar/verifyOTP") suspend fun verifyAadhaarOtp(@Body request: AbhaVerifyAadhaarOtpRequest): Response - @POST("v3/enrollment/enrol/byAadhaar") - suspend fun verifyAadhaarOtp3(@Body request: AbhaVerifyAadhaarOtpRequest, @Header("REQUEST-ID") requestId: String, @Header("TIMESTAMP") timestamp: String): Response - @POST("v1/registration/aadhaar/generateMobileOTP") suspend fun generateMobileOtp(@Body mobile: AbhaGenerateMobileOtpRequest): Response @@ -49,9 +46,6 @@ interface AbhaApiService { @POST("v1/registration/aadhaar/verifyMobileOTP") suspend fun verifyMobileOtp(@Body request: AbhaVerifyMobileOtpRequest): Response - @POST("v3/enrollment/auth/byAbdm") - suspend fun verifyMobileOtp3(@Body request: AbhaVerifyMobileOtpRequest, @Header("REQUEST-ID") requestId: String, @Header("TIMESTAMP") timestamp: String): Response - @POST("v1/registration/aadhaar/createHealthIdWithPreVerified") suspend fun createAbhaId(@Body request: CreateAbhaIdRequest): Response @@ -67,7 +61,7 @@ interface AbhaApiService { // Staging RES Encryption API @GET suspend fun getAuthCert( - @Url url: String = "https://healthidsbx.abdm.gov.in/api/v1/auth/cert" + @Url url: String = "https://healthidsbx.abdm.gov.in/api/v2/auth/cert" ): Response // Production RES Encryption API diff --git a/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt b/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt index 0955b8569..6505c45ad 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/network/JsonAdapters.kt @@ -120,21 +120,9 @@ data class AbhaTokenResponse( val tokenType: String ) -// ABHA v1/v2 request -//@JsonClass(generateAdapter = true) -//data class AbhaGenerateAadhaarOtpRequest( -// var aadhaar: String -//) - -// ABHA v3 request @JsonClass(generateAdapter = true) data class AbhaGenerateAadhaarOtpRequest( -// var aadhaar: String - val txnId: String, - val scope: List, - val loginHint: String, - var loginId: String, - var otpSystem: String + var aadhaar: String ) @JsonClass(generateAdapter = true) @@ -160,85 +148,19 @@ data class AbhaResendAadhaarOtpRequest( val txnId: String ) -// ABHA v1/v2 request -//@JsonClass(generateAdapter = true) -//data class AbhaVerifyAadhaarOtpRequest( -// val otp: String, -// val txnId: String -//) -// ABHA v3 request @JsonClass(generateAdapter = true) data class AbhaVerifyAadhaarOtpRequest( - val authData: AuthData, - val consent: Consent -) - -@JsonClass(generateAdapter = true) -data class AuthData( - val authMethods: List, - val otp: Otp -) - -@JsonClass(generateAdapter = true) -data class Consent( - val code: String, - val version: String -) - -@JsonClass(generateAdapter = true) -data class Otp( - var timeStamp: String, - val txnId: String, - var otpValue: String, - var mobile: String + val otp: String, + val txnId: String ) -// ABHA v1/v2 request -//@JsonClass(generateAdapter = true) -//data class AbhaVerifyAadhaarOtpResponse( -// val txnId: String -//) -// ABHA v3 request @JsonClass(generateAdapter = true) data class AbhaVerifyAadhaarOtpResponse( - val message: String, - val txnId: String, - val tokens: Tokens, - val ABHAProfile: ABHAProfile, - val isNew: Boolean -) - -@JsonClass(generateAdapter = true) -data class Tokens( - val token: String, - val expiresIn: Int, - val refreshToken: String, - val refreshExpiresIn: Int + val txnId: String ) -@JsonClass(generateAdapter = true) -data class ABHAProfile( - val firstName: String, - val middleName: String, - val lastName: String, - val dob: String, - val gender: String, - val photo: String, - val mobile: String? = null, - val email: String? = null, - val phrAddress: List, - val address: String, - val districtCode: String, - val stateCode: String, - val pinCode: String, - val abhaType: String, - val stateName: String, - val districtName: String, - val aBHANumber: String, - val abhaStatus: String -) @JsonClass(generateAdapter = true) data class AbhaGenerateMobileOtpRequest( @@ -257,31 +179,10 @@ data class AbhaCheckAndGenerateMobileOtpResponse( ) -// ABHA v1/v2 request -//@JsonClass(generateAdapter = true) -//data class AbhaVerifyMobileOtpRequest( -// val otp: String, -// val txnId: String -//) - -// ABHA v3 request @JsonClass(generateAdapter = true) data class AbhaVerifyMobileOtpRequest( - val scope: List, - val authData: AuthData2 -) - -@JsonClass(generateAdapter = true) -data class AuthData2( - val authMethods: List, - val otp: Otp2 -) - -@JsonClass(generateAdapter = true) -data class Otp2( - var timeStamp: String, - val txnId: String, - var otpValue: String + val otp: String, + val txnId: String ) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/repositories/AbhaIdRepo.kt b/app/src/main/java/org/piramalswasthya/sakhi/repositories/AbhaIdRepo.kt index 6d7be52e2..5d6a44188 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/repositories/AbhaIdRepo.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/repositories/AbhaIdRepo.kt @@ -39,10 +39,6 @@ import java.io.IOException import java.net.SocketTimeoutException import java.security.KeyFactory import java.security.spec.X509EncodedKeySpec -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale -import java.util.UUID import javax.crypto.Cipher import javax.inject.Inject @@ -133,14 +129,8 @@ class AbhaIdRepo @Inject constructor( suspend fun generateOtpForAadhaarV2(req: AbhaGenerateAadhaarOtpRequest): NetworkResult { return withContext(Dispatchers.IO) { try { - // ABHA v1/v2 encryption technique -// req.aadhaar = encryptData(req.aadhaar) - // ABHA v3 encryption technique - req.loginId = encryptData(req.loginId) - // ABHA v1/v2 API -// val response = abhaApiService.generateAadhaarOtpV2(req) - // ABHA v3 API - val response = abhaApiService.generateAadhaarOtpV3(req, generateUUID(), getCurrentTimestamp()) + req.aadhaar = encryptData(req.aadhaar) + val response = abhaApiService.generateAadhaarOtpV2(req) if (response.isSuccessful) { val responseBody = response.body()?.string() val result = @@ -162,14 +152,6 @@ class AbhaIdRepo @Inject constructor( } } - private fun generateUUID(): String { - return UUID.randomUUID().toString() - } - - private fun getCurrentTimestamp(): String { - return SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH).format(Date()) as String - } - private fun encryptData(txt: String): String { var encryptedTextBase64 = "" val publicKeyString = prefDao.getPublicKeyForAbha()!! @@ -180,10 +162,7 @@ class AbhaIdRepo @Inject constructor( val publicKeySpec = X509EncodedKeySpec(publicKeyBytes) val publicKey = keyFactory.generatePublic(publicKeySpec) - // Cipher used in ABHA v1/v2 APIs -// val cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding") - // Cipher used in ABHA v3 APIs - val cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding") + val cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding") cipher.init(Cipher.ENCRYPT_MODE, publicKey) val encryptedText = cipher.doFinal(txt.toByteArray()) encryptedTextBase64 = @@ -222,12 +201,7 @@ class AbhaIdRepo @Inject constructor( suspend fun verifyOtpForAadhaar(req: AbhaVerifyAadhaarOtpRequest): NetworkResult { return withContext(Dispatchers.IO) { try { - req.authData.otp.otpValue = encryptData(req.authData.otp.otpValue) - req.authData.otp.timeStamp = getCurrentTimestamp() - // ABHA v1/v2 API -// val response = abhaApiService.verifyAadhaarOtp(req) - // ABHA v3 API - val response = abhaApiService.verifyAadhaarOtp3(req, generateUUID(), getCurrentTimestamp()) + val response = abhaApiService.verifyAadhaarOtp(req) if (response.isSuccessful) { val responseBody = response.body()?.string() val result = @@ -281,12 +255,7 @@ class AbhaIdRepo @Inject constructor( suspend fun verifyOtpForMobileNumber(req: AbhaVerifyMobileOtpRequest): NetworkResult { return withContext(Dispatchers.IO) { try { - req.authData.otp.otpValue = encryptData(req.authData.otp.otpValue) - req.authData.otp.timeStamp = getCurrentTimestamp() - // ABHA v1/v2 API -// val response = abhaApiService.verifyMobileOtp(req) - // ABHA v3 API - val response = abhaApiService.verifyMobileOtp3(req, generateUUID(), getCurrentTimestamp()) + val response = abhaApiService.verifyMobileOtp(req) if (response.isSuccessful) { val responseBody = response.body()?.string() val result = diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/AadhaarIdFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/AadhaarIdFragment.kt index 9e99a0603..4e1181077 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/AadhaarIdFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/AadhaarIdFragment.kt @@ -108,7 +108,7 @@ class AadhaarIdFragment : Fragment() { } else if (viewModel.verificationType.value == "FP") { findNavController().navigate( AadhaarIdFragmentDirections.actionAadhaarIdFragmentToGenerateMobileOtpFragment( - viewModel.txnId, viewModel.mobileNumber + viewModel.txnId ) ) } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/aadhaar_num_asha/AadhaarNumberAshaFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/aadhaar_num_asha/AadhaarNumberAshaFragment.kt index 7abea720d..0e3b9aab5 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/aadhaar_num_asha/AadhaarNumberAshaFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/aadhaar_num_asha/AadhaarNumberAshaFragment.kt @@ -76,7 +76,6 @@ class AadhaarNumberAshaFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) var isValidAadhaar = false - var isValidMobile = false parentViewModel.verificationType.observe(viewLifecycleOwner) { when (it) { @@ -128,7 +127,7 @@ class AadhaarNumberAshaFragment : Fragment() { } binding.aadharConsentCheckBox.setOnCheckedChangeListener { _, ischecked -> - binding.btnVerifyAadhaar.isEnabled = isValidAadhaar && isValidMobile && ischecked + binding.btnVerifyAadhaar.isEnabled = isValidAadhaar && ischecked } binding.aadharDisclaimer.setOnClickListener { @@ -144,24 +143,7 @@ class AadhaarNumberAshaFragment : Fragment() { override fun afterTextChanged(s: Editable?) { isValidAadhaar = (s != null) && (s.length == 12) - binding.btnVerifyAadhaar.isEnabled = isValidAadhaar && isValidMobile - && binding.aadharConsentCheckBox.isChecked - } - - }) - - binding.tietMobileNumber.addTextChangedListener(object : TextWatcher { - override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { - } - - override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { - } - - override fun afterTextChanged(s: Editable?) { - isValidMobile = (s != null) && (s.length == 10) - if (isValidMobile) - parentViewModel.setMobileNumber(s.toString()) - binding.btnVerifyAadhaar.isEnabled = isValidAadhaar && isValidMobile + binding.btnVerifyAadhaar.isEnabled = isValidAadhaar && binding.aadharConsentCheckBox.isChecked } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/aadhaar_num_asha/AadhaarNumberAshaViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/aadhaar_num_asha/AadhaarNumberAshaViewModel.kt index 82119040b..a95fc6365 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/aadhaar_num_asha/AadhaarNumberAshaViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/aadhaar_num_asha/AadhaarNumberAshaViewModel.kt @@ -64,17 +64,10 @@ class AadhaarNumberAshaViewModel @Inject constructor( private fun generateAadhaarOtp(aadhaarNo: String) { viewModelScope.launch { when (val result = -// abhaIdRepo.generateOtpForAadhaarV2(AbhaGenerateAadhaarOtpRequest(aadhaarNo))) { - abhaIdRepo.generateOtpForAadhaarV2(AbhaGenerateAadhaarOtpRequest( - "", - listOf("abha-enrol"), - "aadhaar", - aadhaarNo, - "aadhaar" - ))) { + abhaIdRepo.generateOtpForAadhaarV2(AbhaGenerateAadhaarOtpRequest(aadhaarNo))) { is NetworkResult.Success -> { _txnId.value = result.data.txnId -// _mobileNumber.value = result.data.mobileNumber + _mobileNumber.value = result.data.mobileNumber _state.value = AadhaarIdViewModel.State.SUCCESS } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt index 9194b5683..59bb70401 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt @@ -15,9 +15,7 @@ import dagger.hilt.android.AndroidEntryPoint import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.databinding.FragmentAadhaarOtpBinding import org.piramalswasthya.sakhi.ui.abha_id_activity.AbhaIdActivity -import org.piramalswasthya.sakhi.ui.abha_id_activity.aadhaar_id.AadhaarIdViewModel import org.piramalswasthya.sakhi.ui.abha_id_activity.aadhaar_otp.AadhaarOtpViewModel.State -import org.piramalswasthya.sakhi.ui.abha_id_activity.generate_mobile_otp.GenerateMobileOtpFragmentDirections @AndroidEntryPoint class AadhaarOtpFragment : Fragment() { @@ -28,8 +26,6 @@ class AadhaarOtpFragment : Fragment() { private val viewModel: AadhaarOtpViewModel by viewModels() - private val parentViewModel: AadhaarIdViewModel by viewModels({ requireActivity() }) - val args: AadhaarOtpFragmentArgs by lazy { AadhaarOtpFragmentArgs.fromBundle(requireArguments()) } @@ -60,7 +56,7 @@ class AadhaarOtpFragment : Fragment() { super.onViewCreated(view, savedInstanceState) startResendTimer() binding.btnVerifyOTP.setOnClickListener { - viewModel.verifyOtpClicked(binding.tietAadhaarOtp.text.toString(), parentViewModel.mobileNumber) + viewModel.verifyOtpClicked(binding.tietAadhaarOtp.text.toString()) } binding.resendOtp.setOnClickListener { viewModel.resendOtp() @@ -98,11 +94,11 @@ class AadhaarOtpFragment : Fragment() { viewModel.state.observe(viewLifecycleOwner) { state -> when (state!!) { State.IDLE -> { -// binding.tvOtpMsg.text = String.format( -// "%s%s", -// resources.getString(R.string.otp_sent_to), -// args.mobileNumber -// ) + binding.tvOtpMsg.text = String.format( + "%s%s", + resources.getString(R.string.otp_sent_to), + args.mobileNumber + ) binding.tvOtpMsg.visibility = View.VISIBLE } @@ -113,22 +109,9 @@ class AadhaarOtpFragment : Fragment() { } State.OTP_VERIFY_SUCCESS -> { - if (parentViewModel.mobileNumber == viewModel.mobileNumber) { - findNavController().navigate( - AadhaarOtpFragmentDirections.actionAadhaarOtpFragmentToCreateAbhaFragment( - viewModel.txnId - ) - ) - } else { - viewModel.generateOtpClicked() - } - viewModel.resetState() - } - - State.SUCCESS -> { findNavController().navigate( - AadhaarOtpFragmentDirections.actionAadhaarOtpFragmentToVerifyMobileOtpFragment( - viewModel.txnId, viewModel.mobileNumber + AadhaarOtpFragmentDirections.actionAadhaarOtpFragmentToGenerateMobileOtpFragment( + viewModel.txnId ) ) viewModel.resetState() @@ -168,14 +151,6 @@ class AadhaarOtpFragment : Fragment() { viewModel.resetErrorMessage() } } - - // Mobile Number observation for ABHA v1 -// viewModel.mobileNumber.observe(viewLifecycleOwner) { -// it?.let { -// parentViewModel.setMobileNumber(it) -// } -// } - } private fun startResendTimer() { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt index e2ba515d4..ada7d81c7 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt @@ -7,16 +7,10 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch -import org.piramalswasthya.sakhi.network.AbhaGenerateAadhaarOtpRequest import org.piramalswasthya.sakhi.network.AbhaResendAadhaarOtpRequest import org.piramalswasthya.sakhi.network.AbhaVerifyAadhaarOtpRequest -import org.piramalswasthya.sakhi.network.AuthData -import org.piramalswasthya.sakhi.network.Consent import org.piramalswasthya.sakhi.network.NetworkResult -import org.piramalswasthya.sakhi.network.Otp import org.piramalswasthya.sakhi.repositories.AbhaIdRepo -import org.piramalswasthya.sakhi.ui.abha_id_activity.aadhaar_id.AadhaarIdViewModel -import timber.log.Timber import javax.inject.Inject @HiltViewModel @@ -30,13 +24,11 @@ class AadhaarOtpViewModel @Inject constructor( LOADING, ERROR_SERVER, ERROR_NETWORK, - SUCCESS, OTP_VERIFY_SUCCESS, OTP_GENERATED_SUCCESS } private var txnIdFromArgs = AadhaarOtpFragmentArgs.fromSavedStateHandle(savedStateHandle).txnId - private var mobileFromArgs = AadhaarOtpFragmentArgs.fromSavedStateHandle(savedStateHandle).mobileNumber private val _state = MutableLiveData(State.IDLE) val state: LiveData get() = _state @@ -53,13 +45,9 @@ class AadhaarOtpViewModel @Inject constructor( val txnId: String get() = _txnId!! - private var _mobileNumber: String? = null - val mobileNumber: String - get() = _mobileNumber!! - - fun verifyOtpClicked(otp: String, mobile: String) { + fun verifyOtpClicked(otp: String) { _state.value = State.LOADING - verifyAadhaarOtp(otp, mobile) + verifyAadhaarOtp(otp) } fun resetState() { @@ -70,29 +58,17 @@ class AadhaarOtpViewModel @Inject constructor( _errorMessage.value = null } - private fun verifyAadhaarOtp(otp: String, mobile: String) { + private fun verifyAadhaarOtp(otp: String) { viewModelScope.launch { val result = abhaIdRepo.verifyOtpForAadhaar( AbhaVerifyAadhaarOtpRequest( - AuthData( - listOf("otp"), - Otp( - "", - txnIdFromArgs, - otp, - mobile - ) - ), - Consent( - "abha-enrollment", - "1.4" - ) + otp, + txnIdFromArgs ) ) when (result) { is NetworkResult.Success -> { _txnId = result.data.txnId - _mobileNumber = result.data.ABHAProfile.mobile _state.value = State.OTP_VERIFY_SUCCESS } @@ -112,42 +88,6 @@ class AadhaarOtpViewModel @Inject constructor( } } - fun generateOtpClicked() { - _state.value = State.LOADING - generateAadhaarOtp() - } - - private fun generateAadhaarOtp() { - viewModelScope.launch { - when (val result = -// abhaIdRepo.generateOtpForAadhaarV2(AbhaGenerateAadhaarOtpRequest(aadhaarNo))) { - abhaIdRepo.generateOtpForAadhaarV2( - AbhaGenerateAadhaarOtpRequest( - txnId, - listOf("abha-enrol", "mobile-verify"), - "mobile", - mobileFromArgs, - "abdm" - ) - )) { - is NetworkResult.Success -> { - _txnId = result.data.txnId - _state.value = State.SUCCESS - } - - is NetworkResult.Error -> { - _errorMessage.value = result.message - _state.value = State.ERROR_SERVER - } - - is NetworkResult.NetworkError -> { - Timber.i(result.toString()) - _state.value = State.ERROR_NETWORK - } - } - } - } - fun resendOtp() { _state.value = State.LOADING viewModelScope.launch { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/verify_mobile_otp/VerifyMobileOtpViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/verify_mobile_otp/VerifyMobileOtpViewModel.kt index b071970b7..15e5bdd85 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/verify_mobile_otp/VerifyMobileOtpViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/verify_mobile_otp/VerifyMobileOtpViewModel.kt @@ -9,11 +9,9 @@ import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import org.piramalswasthya.sakhi.network.AbhaGenerateMobileOtpRequest import org.piramalswasthya.sakhi.network.AbhaVerifyMobileOtpRequest -import org.piramalswasthya.sakhi.network.AuthData2 import org.piramalswasthya.sakhi.network.CreateAbhaIdRequest import org.piramalswasthya.sakhi.network.CreateAbhaIdResponse import org.piramalswasthya.sakhi.network.NetworkResult -import org.piramalswasthya.sakhi.network.Otp2 import org.piramalswasthya.sakhi.network.interceptors.TokenInsertAbhaInterceptor import org.piramalswasthya.sakhi.repositories.AbhaIdRepo import javax.inject.Inject @@ -74,11 +72,8 @@ class VerifyMobileOtpViewModel @Inject constructor( viewModelScope.launch { val result = abhaIdRepo.verifyOtpForMobileNumber( AbhaVerifyMobileOtpRequest( - listOf("abha-enrol", "mobile-verify"), - AuthData2( - listOf("otp"), - Otp2("timestamp", txnIdFromArgs, otp) - ) + otp, + txnIdFromArgs ) ) when (result) { diff --git a/app/src/main/res/layout/fragment_aadhaar_id.xml b/app/src/main/res/layout/fragment_aadhaar_id.xml index 2782fd457..c9cfe3316 100644 --- a/app/src/main/res/layout/fragment_aadhaar_id.xml +++ b/app/src/main/res/layout/fragment_aadhaar_id.xml @@ -34,7 +34,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:orientation="vertical" - app:layout_constraintHeight_percent=".9" + app:layout_constraintHeight_percent=".75" > - - - - - - - - - + app:layout_constraintTop_toBottomOf="@+id/til_aadhaar_number" /> - - @@ -54,9 +48,6 @@ - diff --git a/app/src/main/res/values/strings_abha.xml b/app/src/main/res/values/strings_abha.xml index ebc903a50..d5dd1ddf0 100644 --- a/app/src/main/res/values/strings_abha.xml +++ b/app/src/main/res/values/strings_abha.xml @@ -51,8 +51,7 @@ Individual’s consent for creation of ABHA Number. Validate FP Generating ABHA for: - - "OTP sent to Aadhaar linked mobile number" + "OTP sent to " OTP was resent. Do you want to go back? Downloading abha card From c867ba7057249d9cc201bb69e951279bc651cef3 Mon Sep 17 00:00:00 2001 From: Sushant Date: Wed, 18 Sep 2024 18:30:43 +0530 Subject: [PATCH 069/892] Revert "ABHA Environment Set" This reverts commit 6aab9bbf8c45e3fa41118d280db4f2bceebb2521. --- .../org/piramalswasthya/sakhi/di/AppModule.kt | 10 +--------- .../sakhi/network/AbhaApiService.kt | 19 ------------------- 2 files changed, 1 insertion(+), 28 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt b/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt index aae90f64c..b063ff5e0 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt @@ -28,18 +28,10 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) object AppModule { -// Staging Base URL private const val baseTmcUrl = "https://amritdemo.piramalswasthya.org/" - // Production Base URL -// private const val baseTmcUrl = -// "https://assamtmc.piramalswasthya.org/" - - // Staging ABHA URL -// private const val baseAbhaUrl = "https://healthidsbx.abdm.gov.in/api/" - // Production ABHA URL - private const val baseAbhaUrl = "https://healthid.abdm.gov.in/api/" + private const val baseAbhaUrl = "https://healthidsbx.abdm.gov.in/api/" private val baseClient = OkHttpClient.Builder() diff --git a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt index 1a1c06c7f..7fe9dac1f 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt @@ -6,7 +6,6 @@ import retrofit2.http.* interface AbhaApiService { - // Staging @Headers("No-Auth: true") @POST suspend fun getToken( @@ -14,23 +13,12 @@ interface AbhaApiService { @Body request: AbhaTokenRequest = AbhaTokenRequest() ): Response - // Production -// @Headers("No-Auth: true") -// @POST -// suspend fun getToken( -// @Url url: String = "https://live.abdm.gov.in/gateway/v0.5/sessions", -// @Body request: AbhaTokenRequest = AbhaTokenRequest() -// ): Response - @POST("v1/registration/aadhaar/generateOtp") suspend fun generateAadhaarOtp(@Body aadhaar: AbhaGenerateAadhaarOtpRequest): Response @POST("v2/registration/aadhaar/generateOtp") suspend fun generateAadhaarOtpV2(@Body aadhaar: AbhaGenerateAadhaarOtpRequest): Response - @POST("v3/enrollment/request/otp") - suspend fun generateAadhaarOtpV3(@Body aadhaar: AbhaGenerateAadhaarOtpRequest, @Header("REQUEST_ID") requestId: String, @Header("TIMESTAMP") timestamp: String): Response - @POST("v1/registration/aadhaar/resendAadhaarOtp") suspend fun resendAadhaarOtp(@Body aadhaar: AbhaResendAadhaarOtpRequest): Response @@ -58,18 +46,11 @@ interface AbhaApiService { @GET("v1/account/getPngCard") suspend fun getPngCard(): Response - // Staging RES Encryption API @GET suspend fun getAuthCert( @Url url: String = "https://healthidsbx.abdm.gov.in/api/v2/auth/cert" ): Response - // Production RES Encryption API -// @GET -// suspend fun getAuthCert( -// @Url url: String = "https://healthid.abdm.gov.in/api/v2/auth/cert" -// ): Response - @GET("v2/ha/lgd/states") suspend fun getStateAndDistricts(): Response From 1a0eb232afa69d9a1c313ad65f5785fd27ce12f7 Mon Sep 17 00:00:00 2001 From: Ritik Date: Wed, 18 Sep 2024 19:09:08 +0530 Subject: [PATCH 070/892] duplicacy removed --- .../configuration/BenGenRegFormDataset.kt | 33 +++++-------------- .../sakhi/configuration/BenRegCHODataset.kt | 12 ++----- .../sakhi/configuration/BenRegFormDataset.kt | 32 +++++------------- .../configuration/ChildRegistrationDataset.kt | 16 ++------- .../sakhi/configuration/Dataset.kt | 19 ++++++----- .../configuration/HouseholdFormDataset.kt | 13 ++------ .../sakhi/configuration/PMSMAFormDataset.kt | 2 +- 7 files changed, 37 insertions(+), 90 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenGenRegFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenGenRegFormDataset.kt index 436144b9f..f8d4cc351 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenGenRegFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenGenRegFormDataset.kt @@ -5,7 +5,6 @@ import android.net.Uri import android.text.InputType import androidx.core.text.isDigitsOnly import org.piramalswasthya.sakhi.R -import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Konstants.maxAgeForGenBen import org.piramalswasthya.sakhi.helpers.Konstants.minAgeForGenBen import org.piramalswasthya.sakhi.helpers.Konstants.minAgeForMarriage @@ -25,7 +24,7 @@ import java.text.SimpleDateFormat import java.util.Calendar import java.util.Locale -class BenGenRegFormDataset(context: Context,val language: Languages) : Dataset(context, language) { +class BenGenRegFormDataset(context: Context, language: Languages) : Dataset(context, language) { companion object { private fun getCurrentDateString(): String { @@ -518,16 +517,11 @@ class BenGenRegFormDataset(context: Context,val language: Languages) : Dataset(c return when (formId) { firstName.id -> { validateEmptyOnEditText(firstName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(firstName) - } else -1 - + validateAllCapsOrSpaceOnEditText(firstName) } lastName.id -> { - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(lastName) - } else -1 + validateAllCapsOrSpaceOnEditText(lastName) } dob.id -> { @@ -691,38 +685,27 @@ class BenGenRegFormDataset(context: Context,val language: Languages) : Dataset(c fatherName.id -> { validateEmptyOnEditText(fatherName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(fatherName) - } else -1 - + validateAllCapsOrSpaceOnEditText(fatherName) } motherName.id -> { validateEmptyOnEditText(motherName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(motherName) - } else -1 + validateAllCapsOrSpaceOnEditText(motherName) } husbandName.id -> { validateEmptyOnEditText(husbandName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(husbandName) - } else -1 + validateAllCapsOrSpaceOnEditText(husbandName) } wifeName.id -> { validateEmptyOnEditText(wifeName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(wifeName) - } else -1 + validateAllCapsOrSpaceOnEditText(wifeName) } spouseName.id -> { validateEmptyOnEditText(spouseName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(spouseName) - } else -1 + validateAllCapsOrSpaceOnEditText(spouseName) } contactNumber.id -> { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegCHODataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegCHODataset.kt index 254c7ec63..614f586b5 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegCHODataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegCHODataset.kt @@ -2,7 +2,6 @@ package org.piramalswasthya.sakhi.configuration import android.content.Context import org.piramalswasthya.sakhi.R -import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.model.AgeUnit import org.piramalswasthya.sakhi.model.BenRegCache @@ -13,7 +12,7 @@ import java.util.Calendar import java.util.concurrent.TimeUnit class BenRegCHODataset( - context: Context, val currentLanguage: Languages + context: Context, currentLanguage: Languages ) : Dataset(context, currentLanguage) { private val dateOfReg = FormElement( @@ -132,16 +131,11 @@ class BenRegCHODataset( } name.id -> { - if (currentLanguage.toString() == english) { - validateAllCapsOrSpaceOnEditText(name) - } else -1 + validateAllCapsOrSpaceOnEditText(name) } husbandName.id -> { - if (currentLanguage.toString() == english) { - validateAllCapsOrSpaceOnEditText(husbandName) - } else -1 - + validateAllCapsOrSpaceOnEditText(husbandName) } age.id -> { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt index 365976963..5b4a27c4d 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt @@ -7,7 +7,6 @@ import android.util.Range import android.widget.LinearLayout import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.helpers.Konstants -import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.helpers.setToStartOfTheDay import org.piramalswasthya.sakhi.model.AgeUnit @@ -31,7 +30,7 @@ import java.util.Calendar import java.util.Locale import java.util.concurrent.TimeUnit -class BenRegFormDataset(context: Context,val language: Languages) : Dataset(context, language) { +class BenRegFormDataset(context: Context, language: Languages) : Dataset(context, language) { companion object { @@ -1474,16 +1473,11 @@ class BenRegFormDataset(context: Context,val language: Languages) : Dataset(cont return when (formId) { firstName.id -> { validateEmptyOnEditText(firstName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(firstName) - } else -1 - + validateAllCapsOrSpaceOnEditText(firstName) } lastName.id -> { - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(lastName) - } else -1 + validateAllCapsOrSpaceOnEditText(lastName) } agePopup.id -> { @@ -1667,37 +1661,27 @@ class BenRegFormDataset(context: Context,val language: Languages) : Dataset(cont fatherName.id -> { validateEmptyOnEditText(fatherName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(fatherName) - } else -1 + validateAllCapsOrSpaceOnEditText(fatherName) } motherName.id -> { validateEmptyOnEditText(motherName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(motherName) - } else -1 + validateAllCapsOrSpaceOnEditText(motherName) } husbandName.id -> { validateEmptyOnEditText(husbandName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(husbandName) - } else -1 + validateAllCapsOrSpaceOnEditText(husbandName) } wifeName.id -> { validateEmptyOnEditText(wifeName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(wifeName) - } else -1 + validateAllCapsOrSpaceOnEditText(wifeName) } spouseName.id -> { validateEmptyOnEditText(spouseName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(spouseName) - } else -1 + validateAllCapsOrSpaceOnEditText(spouseName) } contactNumber.id -> { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/ChildRegistrationDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/ChildRegistrationDataset.kt index cf343b439..14971a939 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/ChildRegistrationDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/ChildRegistrationDataset.kt @@ -3,8 +3,6 @@ package org.piramalswasthya.sakhi.configuration import android.content.Context import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.database.room.SyncState -import org.piramalswasthya.sakhi.helpers.Konstants -import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.model.BenBasicCache import org.piramalswasthya.sakhi.model.BenRegCache @@ -18,7 +16,7 @@ import org.piramalswasthya.sakhi.model.LocationRecord import org.piramalswasthya.sakhi.model.User class ChildRegistrationDataset( - context: Context, var currentLanguage: Languages + context: Context, currentLanguage: Languages ) : Dataset(context, currentLanguage) { private val dateOfReg = FormElement( @@ -235,19 +233,11 @@ class ChildRegistrationDataset( override suspend fun handleListOnValueChanged(formId: Int, index: Int): Int { return when (formId) { - childName.id -> { - if (currentLanguage.toString() == english) { - validateAllCapsOrSpaceOnEditText(childName) - } else -1 - } + childName.id -> validateAllCapsOrSpaceOnEditText(childName) rchId.id -> validateRchIdOnEditText(rchId) rchIdMother.id -> validateRchIdOnEditText(rchIdMother) mobileNumber.id -> validateMobileNumberOnEditText(mobileNumber) - fatherName.id -> { - if (currentLanguage.toString() == english) { - validateAllCapsOrSpaceOnEditText(fatherName) - } else -1 - } + fatherName.id -> validateAllCapsOrSpaceOnEditText(fatherName) weightAtBirth.id -> validateDoubleMinMax(weightAtBirth) birthCertificateNo.id -> validateNoAlphabetSpaceOnEditText(birthCertificateNo) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt index 025a0797c..3318cd39a 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt @@ -7,6 +7,7 @@ import androidx.annotation.StringRes import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import org.piramalswasthya.sakhi.R +import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.helpers.setToStartOfTheDay import org.piramalswasthya.sakhi.model.FormElement @@ -24,7 +25,7 @@ import java.util.concurrent.TimeUnit * Base class to be extended to use as a sandwich between viewModel and repository objects. * @see org.piramalswasthya.sakhi.adapters.FormInputAdapter */ -abstract class Dataset(context: Context, currentLanguage: Languages) { +abstract class Dataset(context: Context, val currentLanguage: Languages) { /** * Resource object of currently selected language. To be used to get language specific strings from strings.xml. @@ -509,13 +510,15 @@ abstract class Dataset(context: Context, currentLanguage: Languages) { ?: false protected fun validateAllCapsOrSpaceOnEditText(formElement: FormElement): Int { - if (formElement.allCaps) { - formElement.value?.takeIf { it.isNotEmpty() }?.isAllUppercaseOrSpace()?.let { - Timber.d("Is ok : $it") - formElement.errorText = if (it) null - else resources.getString(R.string.form_input_upper_case_error) - } ?: run { - if (!formElement.required) formElement.errorText = null + if (currentLanguage.toString() == english) { + if (formElement.allCaps) { + formElement.value?.takeIf { it.isNotEmpty() }?.isAllUppercaseOrSpace()?.let { + Timber.d("Is ok : $it") + formElement.errorText = if (it) null + else resources.getString(R.string.form_input_upper_case_error) + } ?: run { + if (!formElement.required) formElement.errorText = null + } } } return -1 diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/HouseholdFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/HouseholdFormDataset.kt index 05fcc2e75..96f422f6d 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/HouseholdFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/HouseholdFormDataset.kt @@ -4,7 +4,6 @@ package org.piramalswasthya.sakhi.configuration import android.content.Context import android.text.InputType import org.piramalswasthya.sakhi.R -import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.model.FormElement import org.piramalswasthya.sakhi.model.HouseholdAmenities @@ -21,7 +20,7 @@ import java.util.Calendar import java.util.Date import java.util.Locale -class HouseholdFormDataset(context: Context, val language: Languages) : Dataset(context, language) { +class HouseholdFormDataset(context: Context, language: Languages) : Dataset(context, language) { companion object { private fun getCurrentDate(): String { val calendar = Calendar.getInstance() @@ -436,16 +435,10 @@ class HouseholdFormDataset(context: Context, val language: Languages) : Dataset( return when (formId) { firstNameHeadOfFamily.id -> { validateEmptyOnEditText(firstNameHeadOfFamily) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(firstNameHeadOfFamily) - } else -1 + validateAllCapsOrSpaceOnEditText(firstNameHeadOfFamily) } - lastNameHeadOfFamily.id -> { - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(lastNameHeadOfFamily) - } else -1 - } + lastNameHeadOfFamily.id -> validateAllCapsOrSpaceOnEditText(lastNameHeadOfFamily) mobileNoHeadOfFamily.id -> { validateEmptyOnEditText(mobileNoHeadOfFamily) validateMobileNumberOnEditText(mobileNoHeadOfFamily) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PMSMAFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PMSMAFormDataset.kt index 6df42b2a7..a5eab2666 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PMSMAFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PMSMAFormDataset.kt @@ -22,7 +22,7 @@ import java.util.Locale import java.util.concurrent.TimeUnit class PMSMAFormDataset( - context: Context, val currentLanguage: Languages + context: Context, currentLanguage: Languages ) : Dataset(context, currentLanguage) { companion object { From 293d2d680176ce54f20bf3b4ea921c8cfa1cb900 Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Thu, 19 Sep 2024 10:54:34 +0530 Subject: [PATCH 071/892] Change in README.md file : -Formatting change added next line tag for prerequisite --- README.md | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 452e907df..a01dba61b 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Assam State. -This application provides below functional modules. +**This application provides below functional modules:-** 1. Household List 2. New Household Registration @@ -93,17 +93,15 @@ To run this project, Follow these steps: ### Prerequisites -
      -
    • **Secrets:** - - set ENCRYPTED_PASS_KEY, ABHA_CLIENT_ID, ABHA_CLIENT_SECRET values in secrets.properties file.
    • -
    • **google-json** - - set Google JSON file of required variant ie. UAT, STAGING or PRODUCTION. -
    • **Environments**: - -We can generate the application for below environments based on requirements - - Amrit Demo - - UAT - - Production -
    +- **Secrets**:- set ENCRYPTED_PASS_KEY, ABHA_CLIENT_ID, ABHA_CLIENT_SECRET values in secrets.properties file. + +- **google-json**:- set Google JSON file of required variant ie. UAT, STAGING or PRODUCTION. + +- **Environments**:- We can generate the application for below environments based on requirements + 1.Amrit Demo. + 2.UAT. + 3.Production. + **Configurations:** From 7c4577ffb45f33017ff79409fc339bee6b353280 Mon Sep 17 00:00:00 2001 From: Ritik Date: Wed, 18 Sep 2024 18:09:55 +0530 Subject: [PATCH 072/892] Added Option to type Name Fileds in Hindi/Assamese --- .../configuration/BenGenRegFormDataset.kt | 33 ++++++++++++++----- .../sakhi/configuration/BenRegCHODataset.kt | 12 +++++-- .../sakhi/configuration/BenRegFormDataset.kt | 32 +++++++++++++----- .../configuration/ChildRegistrationDataset.kt | 16 +++++++-- .../configuration/HouseholdFormDataset.kt | 13 ++++++-- .../sakhi/configuration/PMSMAFormDataset.kt | 9 +++-- .../sakhi/helpers/Konstants.kt | 1 + 7 files changed, 89 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenGenRegFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenGenRegFormDataset.kt index f8d4cc351..436144b9f 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenGenRegFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenGenRegFormDataset.kt @@ -5,6 +5,7 @@ import android.net.Uri import android.text.InputType import androidx.core.text.isDigitsOnly import org.piramalswasthya.sakhi.R +import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Konstants.maxAgeForGenBen import org.piramalswasthya.sakhi.helpers.Konstants.minAgeForGenBen import org.piramalswasthya.sakhi.helpers.Konstants.minAgeForMarriage @@ -24,7 +25,7 @@ import java.text.SimpleDateFormat import java.util.Calendar import java.util.Locale -class BenGenRegFormDataset(context: Context, language: Languages) : Dataset(context, language) { +class BenGenRegFormDataset(context: Context,val language: Languages) : Dataset(context, language) { companion object { private fun getCurrentDateString(): String { @@ -517,11 +518,16 @@ class BenGenRegFormDataset(context: Context, language: Languages) : Dataset(cont return when (formId) { firstName.id -> { validateEmptyOnEditText(firstName) - validateAllCapsOrSpaceOnEditText(firstName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(firstName) + } else -1 + } lastName.id -> { - validateAllCapsOrSpaceOnEditText(lastName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(lastName) + } else -1 } dob.id -> { @@ -685,27 +691,38 @@ class BenGenRegFormDataset(context: Context, language: Languages) : Dataset(cont fatherName.id -> { validateEmptyOnEditText(fatherName) - validateAllCapsOrSpaceOnEditText(fatherName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(fatherName) + } else -1 + } motherName.id -> { validateEmptyOnEditText(motherName) - validateAllCapsOrSpaceOnEditText(motherName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(motherName) + } else -1 } husbandName.id -> { validateEmptyOnEditText(husbandName) - validateAllCapsOrSpaceOnEditText(husbandName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(husbandName) + } else -1 } wifeName.id -> { validateEmptyOnEditText(wifeName) - validateAllCapsOrSpaceOnEditText(wifeName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(wifeName) + } else -1 } spouseName.id -> { validateEmptyOnEditText(spouseName) - validateAllCapsOrSpaceOnEditText(spouseName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(spouseName) + } else -1 } contactNumber.id -> { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegCHODataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegCHODataset.kt index 614f586b5..254c7ec63 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegCHODataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegCHODataset.kt @@ -2,6 +2,7 @@ package org.piramalswasthya.sakhi.configuration import android.content.Context import org.piramalswasthya.sakhi.R +import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.model.AgeUnit import org.piramalswasthya.sakhi.model.BenRegCache @@ -12,7 +13,7 @@ import java.util.Calendar import java.util.concurrent.TimeUnit class BenRegCHODataset( - context: Context, currentLanguage: Languages + context: Context, val currentLanguage: Languages ) : Dataset(context, currentLanguage) { private val dateOfReg = FormElement( @@ -131,11 +132,16 @@ class BenRegCHODataset( } name.id -> { - validateAllCapsOrSpaceOnEditText(name) + if (currentLanguage.toString() == english) { + validateAllCapsOrSpaceOnEditText(name) + } else -1 } husbandName.id -> { - validateAllCapsOrSpaceOnEditText(husbandName) + if (currentLanguage.toString() == english) { + validateAllCapsOrSpaceOnEditText(husbandName) + } else -1 + } age.id -> { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt index 2694fac7b..873335c9c 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt @@ -7,6 +7,7 @@ import android.util.Range import android.widget.LinearLayout import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.helpers.Konstants +import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.helpers.setToStartOfTheDay import org.piramalswasthya.sakhi.model.AgeUnit @@ -30,7 +31,7 @@ import java.util.Calendar import java.util.Locale import java.util.concurrent.TimeUnit -class BenRegFormDataset(context: Context, language: Languages) : Dataset(context, language) { +class BenRegFormDataset(context: Context,val language: Languages) : Dataset(context, language) { companion object { @@ -1473,11 +1474,16 @@ class BenRegFormDataset(context: Context, language: Languages) : Dataset(context return when (formId) { firstName.id -> { validateEmptyOnEditText(firstName) - validateAllCapsOrSpaceOnEditText(firstName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(firstName) + } else -1 + } lastName.id -> { - validateAllCapsOrSpaceOnEditText(lastName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(lastName) + } else -1 } agePopup.id -> { @@ -1661,27 +1667,37 @@ class BenRegFormDataset(context: Context, language: Languages) : Dataset(context fatherName.id -> { validateEmptyOnEditText(fatherName) - validateAllCapsOrSpaceOnEditText(fatherName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(fatherName) + } else -1 } motherName.id -> { validateEmptyOnEditText(motherName) - validateAllCapsOrSpaceOnEditText(motherName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(motherName) + } else -1 } husbandName.id -> { validateEmptyOnEditText(husbandName) - validateAllCapsOrSpaceOnEditText(husbandName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(husbandName) + } else -1 } wifeName.id -> { validateEmptyOnEditText(wifeName) - validateAllCapsOrSpaceOnEditText(wifeName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(wifeName) + } else -1 } spouseName.id -> { validateEmptyOnEditText(spouseName) - validateAllCapsOrSpaceOnEditText(spouseName) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(spouseName) + } else -1 } contactNumber.id -> { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/ChildRegistrationDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/ChildRegistrationDataset.kt index 14971a939..cf343b439 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/ChildRegistrationDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/ChildRegistrationDataset.kt @@ -3,6 +3,8 @@ package org.piramalswasthya.sakhi.configuration import android.content.Context import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.database.room.SyncState +import org.piramalswasthya.sakhi.helpers.Konstants +import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.model.BenBasicCache import org.piramalswasthya.sakhi.model.BenRegCache @@ -16,7 +18,7 @@ import org.piramalswasthya.sakhi.model.LocationRecord import org.piramalswasthya.sakhi.model.User class ChildRegistrationDataset( - context: Context, currentLanguage: Languages + context: Context, var currentLanguage: Languages ) : Dataset(context, currentLanguage) { private val dateOfReg = FormElement( @@ -233,11 +235,19 @@ class ChildRegistrationDataset( override suspend fun handleListOnValueChanged(formId: Int, index: Int): Int { return when (formId) { - childName.id -> validateAllCapsOrSpaceOnEditText(childName) + childName.id -> { + if (currentLanguage.toString() == english) { + validateAllCapsOrSpaceOnEditText(childName) + } else -1 + } rchId.id -> validateRchIdOnEditText(rchId) rchIdMother.id -> validateRchIdOnEditText(rchIdMother) mobileNumber.id -> validateMobileNumberOnEditText(mobileNumber) - fatherName.id -> validateAllCapsOrSpaceOnEditText(fatherName) + fatherName.id -> { + if (currentLanguage.toString() == english) { + validateAllCapsOrSpaceOnEditText(fatherName) + } else -1 + } weightAtBirth.id -> validateDoubleMinMax(weightAtBirth) birthCertificateNo.id -> validateNoAlphabetSpaceOnEditText(birthCertificateNo) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/HouseholdFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/HouseholdFormDataset.kt index 96f422f6d..05fcc2e75 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/HouseholdFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/HouseholdFormDataset.kt @@ -4,6 +4,7 @@ package org.piramalswasthya.sakhi.configuration import android.content.Context import android.text.InputType import org.piramalswasthya.sakhi.R +import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.model.FormElement import org.piramalswasthya.sakhi.model.HouseholdAmenities @@ -20,7 +21,7 @@ import java.util.Calendar import java.util.Date import java.util.Locale -class HouseholdFormDataset(context: Context, language: Languages) : Dataset(context, language) { +class HouseholdFormDataset(context: Context, val language: Languages) : Dataset(context, language) { companion object { private fun getCurrentDate(): String { val calendar = Calendar.getInstance() @@ -435,10 +436,16 @@ class HouseholdFormDataset(context: Context, language: Languages) : Dataset(cont return when (formId) { firstNameHeadOfFamily.id -> { validateEmptyOnEditText(firstNameHeadOfFamily) - validateAllCapsOrSpaceOnEditText(firstNameHeadOfFamily) + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(firstNameHeadOfFamily) + } else -1 } - lastNameHeadOfFamily.id -> validateAllCapsOrSpaceOnEditText(lastNameHeadOfFamily) + lastNameHeadOfFamily.id -> { + if (language.toString() == english) { + validateAllCapsOrSpaceOnEditText(lastNameHeadOfFamily) + } else -1 + } mobileNoHeadOfFamily.id -> { validateEmptyOnEditText(mobileNoHeadOfFamily) validateMobileNumberOnEditText(mobileNoHeadOfFamily) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PMSMAFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PMSMAFormDataset.kt index 294409a96..6df42b2a7 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PMSMAFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PMSMAFormDataset.kt @@ -3,6 +3,7 @@ package org.piramalswasthya.sakhi.configuration import android.content.Context import android.text.InputType import org.piramalswasthya.sakhi.R +import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.helpers.setToStartOfTheDay import org.piramalswasthya.sakhi.model.BenRegCache @@ -21,7 +22,7 @@ import java.util.Locale import java.util.concurrent.TimeUnit class PMSMAFormDataset( - context: Context, currentLanguage: Languages + context: Context, val currentLanguage: Languages ) : Dataset(context, currentLanguage) { companion object { @@ -478,7 +479,11 @@ class PMSMAFormDataset( } mobileNumber.id -> validateMobileNumberOnEditText(mobileNumber) - husbandName.id -> validateAllCapsOrSpaceOnEditText(husbandName) + husbandName.id -> { + if (currentLanguage.toString() == english) { + validateAllCapsOrSpaceOnEditText(husbandName) + } else -1 + } bp.id -> validateForBp(bp) weight.id -> validateIntMinMax(weight) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt b/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt index f21a6e8ba..7d70e0023 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt @@ -51,6 +51,7 @@ object Konstants { const val minAnc4Week = 36 const val maxAnc4Week = 40 + const val english = "ENGLISH" const val minWeekToShowDelivered = 23 From 95df49c83fa67dd34344fb0bcaebb1e0fe749e08 Mon Sep 17 00:00:00 2001 From: Ritik Date: Wed, 18 Sep 2024 19:09:08 +0530 Subject: [PATCH 073/892] duplicacy removed --- .../configuration/BenGenRegFormDataset.kt | 33 +++++-------------- .../sakhi/configuration/BenRegCHODataset.kt | 12 ++----- .../sakhi/configuration/BenRegFormDataset.kt | 32 +++++------------- .../configuration/ChildRegistrationDataset.kt | 16 ++------- .../sakhi/configuration/Dataset.kt | 19 ++++++----- .../configuration/HouseholdFormDataset.kt | 13 ++------ .../sakhi/configuration/PMSMAFormDataset.kt | 2 +- 7 files changed, 37 insertions(+), 90 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenGenRegFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenGenRegFormDataset.kt index 436144b9f..f8d4cc351 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenGenRegFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenGenRegFormDataset.kt @@ -5,7 +5,6 @@ import android.net.Uri import android.text.InputType import androidx.core.text.isDigitsOnly import org.piramalswasthya.sakhi.R -import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Konstants.maxAgeForGenBen import org.piramalswasthya.sakhi.helpers.Konstants.minAgeForGenBen import org.piramalswasthya.sakhi.helpers.Konstants.minAgeForMarriage @@ -25,7 +24,7 @@ import java.text.SimpleDateFormat import java.util.Calendar import java.util.Locale -class BenGenRegFormDataset(context: Context,val language: Languages) : Dataset(context, language) { +class BenGenRegFormDataset(context: Context, language: Languages) : Dataset(context, language) { companion object { private fun getCurrentDateString(): String { @@ -518,16 +517,11 @@ class BenGenRegFormDataset(context: Context,val language: Languages) : Dataset(c return when (formId) { firstName.id -> { validateEmptyOnEditText(firstName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(firstName) - } else -1 - + validateAllCapsOrSpaceOnEditText(firstName) } lastName.id -> { - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(lastName) - } else -1 + validateAllCapsOrSpaceOnEditText(lastName) } dob.id -> { @@ -691,38 +685,27 @@ class BenGenRegFormDataset(context: Context,val language: Languages) : Dataset(c fatherName.id -> { validateEmptyOnEditText(fatherName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(fatherName) - } else -1 - + validateAllCapsOrSpaceOnEditText(fatherName) } motherName.id -> { validateEmptyOnEditText(motherName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(motherName) - } else -1 + validateAllCapsOrSpaceOnEditText(motherName) } husbandName.id -> { validateEmptyOnEditText(husbandName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(husbandName) - } else -1 + validateAllCapsOrSpaceOnEditText(husbandName) } wifeName.id -> { validateEmptyOnEditText(wifeName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(wifeName) - } else -1 + validateAllCapsOrSpaceOnEditText(wifeName) } spouseName.id -> { validateEmptyOnEditText(spouseName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(spouseName) - } else -1 + validateAllCapsOrSpaceOnEditText(spouseName) } contactNumber.id -> { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegCHODataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegCHODataset.kt index 254c7ec63..614f586b5 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegCHODataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegCHODataset.kt @@ -2,7 +2,6 @@ package org.piramalswasthya.sakhi.configuration import android.content.Context import org.piramalswasthya.sakhi.R -import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.model.AgeUnit import org.piramalswasthya.sakhi.model.BenRegCache @@ -13,7 +12,7 @@ import java.util.Calendar import java.util.concurrent.TimeUnit class BenRegCHODataset( - context: Context, val currentLanguage: Languages + context: Context, currentLanguage: Languages ) : Dataset(context, currentLanguage) { private val dateOfReg = FormElement( @@ -132,16 +131,11 @@ class BenRegCHODataset( } name.id -> { - if (currentLanguage.toString() == english) { - validateAllCapsOrSpaceOnEditText(name) - } else -1 + validateAllCapsOrSpaceOnEditText(name) } husbandName.id -> { - if (currentLanguage.toString() == english) { - validateAllCapsOrSpaceOnEditText(husbandName) - } else -1 - + validateAllCapsOrSpaceOnEditText(husbandName) } age.id -> { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt index 873335c9c..2694fac7b 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt @@ -7,7 +7,6 @@ import android.util.Range import android.widget.LinearLayout import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.helpers.Konstants -import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.helpers.setToStartOfTheDay import org.piramalswasthya.sakhi.model.AgeUnit @@ -31,7 +30,7 @@ import java.util.Calendar import java.util.Locale import java.util.concurrent.TimeUnit -class BenRegFormDataset(context: Context,val language: Languages) : Dataset(context, language) { +class BenRegFormDataset(context: Context, language: Languages) : Dataset(context, language) { companion object { @@ -1474,16 +1473,11 @@ class BenRegFormDataset(context: Context,val language: Languages) : Dataset(cont return when (formId) { firstName.id -> { validateEmptyOnEditText(firstName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(firstName) - } else -1 - + validateAllCapsOrSpaceOnEditText(firstName) } lastName.id -> { - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(lastName) - } else -1 + validateAllCapsOrSpaceOnEditText(lastName) } agePopup.id -> { @@ -1667,37 +1661,27 @@ class BenRegFormDataset(context: Context,val language: Languages) : Dataset(cont fatherName.id -> { validateEmptyOnEditText(fatherName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(fatherName) - } else -1 + validateAllCapsOrSpaceOnEditText(fatherName) } motherName.id -> { validateEmptyOnEditText(motherName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(motherName) - } else -1 + validateAllCapsOrSpaceOnEditText(motherName) } husbandName.id -> { validateEmptyOnEditText(husbandName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(husbandName) - } else -1 + validateAllCapsOrSpaceOnEditText(husbandName) } wifeName.id -> { validateEmptyOnEditText(wifeName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(wifeName) - } else -1 + validateAllCapsOrSpaceOnEditText(wifeName) } spouseName.id -> { validateEmptyOnEditText(spouseName) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(spouseName) - } else -1 + validateAllCapsOrSpaceOnEditText(spouseName) } contactNumber.id -> { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/ChildRegistrationDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/ChildRegistrationDataset.kt index cf343b439..14971a939 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/ChildRegistrationDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/ChildRegistrationDataset.kt @@ -3,8 +3,6 @@ package org.piramalswasthya.sakhi.configuration import android.content.Context import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.database.room.SyncState -import org.piramalswasthya.sakhi.helpers.Konstants -import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.model.BenBasicCache import org.piramalswasthya.sakhi.model.BenRegCache @@ -18,7 +16,7 @@ import org.piramalswasthya.sakhi.model.LocationRecord import org.piramalswasthya.sakhi.model.User class ChildRegistrationDataset( - context: Context, var currentLanguage: Languages + context: Context, currentLanguage: Languages ) : Dataset(context, currentLanguage) { private val dateOfReg = FormElement( @@ -235,19 +233,11 @@ class ChildRegistrationDataset( override suspend fun handleListOnValueChanged(formId: Int, index: Int): Int { return when (formId) { - childName.id -> { - if (currentLanguage.toString() == english) { - validateAllCapsOrSpaceOnEditText(childName) - } else -1 - } + childName.id -> validateAllCapsOrSpaceOnEditText(childName) rchId.id -> validateRchIdOnEditText(rchId) rchIdMother.id -> validateRchIdOnEditText(rchIdMother) mobileNumber.id -> validateMobileNumberOnEditText(mobileNumber) - fatherName.id -> { - if (currentLanguage.toString() == english) { - validateAllCapsOrSpaceOnEditText(fatherName) - } else -1 - } + fatherName.id -> validateAllCapsOrSpaceOnEditText(fatherName) weightAtBirth.id -> validateDoubleMinMax(weightAtBirth) birthCertificateNo.id -> validateNoAlphabetSpaceOnEditText(birthCertificateNo) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt index 93af21d9b..94ddcb4d5 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt @@ -7,6 +7,7 @@ import androidx.annotation.StringRes import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import org.piramalswasthya.sakhi.R +import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.helpers.setToStartOfTheDay import org.piramalswasthya.sakhi.model.FormElement @@ -24,7 +25,7 @@ import java.util.concurrent.TimeUnit * Base class to be extended to use as a sandwich between viewModel and repository objects. * @see org.piramalswasthya.sakhi.adapters.FormInputAdapter */ -abstract class Dataset(context: Context, currentLanguage: Languages) { +abstract class Dataset(context: Context, val currentLanguage: Languages) { /** * Resource object of currently selected language. To be used to get language specific strings from strings.xml. @@ -509,13 +510,15 @@ abstract class Dataset(context: Context, currentLanguage: Languages) { ?: false protected fun validateAllCapsOrSpaceOnEditText(formElement: FormElement): Int { - if (formElement.allCaps) { - formElement.value?.takeIf { it.isNotEmpty() }?.isAllUppercaseOrSpace()?.let { - Timber.d("Is ok : $it") - formElement.errorText = if (it) null - else resources.getString(R.string.form_input_upper_case_error) - } ?: run { - if (!formElement.required) formElement.errorText = null + if (currentLanguage.toString() == english) { + if (formElement.allCaps) { + formElement.value?.takeIf { it.isNotEmpty() }?.isAllUppercaseOrSpace()?.let { + Timber.d("Is ok : $it") + formElement.errorText = if (it) null + else resources.getString(R.string.form_input_upper_case_error) + } ?: run { + if (!formElement.required) formElement.errorText = null + } } } return -1 diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/HouseholdFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/HouseholdFormDataset.kt index 05fcc2e75..96f422f6d 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/HouseholdFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/HouseholdFormDataset.kt @@ -4,7 +4,6 @@ package org.piramalswasthya.sakhi.configuration import android.content.Context import android.text.InputType import org.piramalswasthya.sakhi.R -import org.piramalswasthya.sakhi.helpers.Konstants.english import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.model.FormElement import org.piramalswasthya.sakhi.model.HouseholdAmenities @@ -21,7 +20,7 @@ import java.util.Calendar import java.util.Date import java.util.Locale -class HouseholdFormDataset(context: Context, val language: Languages) : Dataset(context, language) { +class HouseholdFormDataset(context: Context, language: Languages) : Dataset(context, language) { companion object { private fun getCurrentDate(): String { val calendar = Calendar.getInstance() @@ -436,16 +435,10 @@ class HouseholdFormDataset(context: Context, val language: Languages) : Dataset( return when (formId) { firstNameHeadOfFamily.id -> { validateEmptyOnEditText(firstNameHeadOfFamily) - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(firstNameHeadOfFamily) - } else -1 + validateAllCapsOrSpaceOnEditText(firstNameHeadOfFamily) } - lastNameHeadOfFamily.id -> { - if (language.toString() == english) { - validateAllCapsOrSpaceOnEditText(lastNameHeadOfFamily) - } else -1 - } + lastNameHeadOfFamily.id -> validateAllCapsOrSpaceOnEditText(lastNameHeadOfFamily) mobileNoHeadOfFamily.id -> { validateEmptyOnEditText(mobileNoHeadOfFamily) validateMobileNumberOnEditText(mobileNoHeadOfFamily) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PMSMAFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PMSMAFormDataset.kt index 6df42b2a7..a5eab2666 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PMSMAFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PMSMAFormDataset.kt @@ -22,7 +22,7 @@ import java.util.Locale import java.util.concurrent.TimeUnit class PMSMAFormDataset( - context: Context, val currentLanguage: Languages + context: Context, currentLanguage: Languages ) : Dataset(context, currentLanguage) { companion object { From be09194092ef40917168b879aeecb8a3b6af38f8 Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Thu, 19 Sep 2024 17:09:11 +0530 Subject: [PATCH 074/892] Change in README.md file : -Improve gramatical changes and formatting --- README.md | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index a01dba61b..83d02f303 100644 --- a/README.md +++ b/README.md @@ -2,15 +2,16 @@ ## Overview -
      -
    • The FLW Mobile App is designed for Healthcare programs and consultation services render by ASHAs’ to serve pregnant women, mothers and newborns in India. This -ultimately eliminates pen and paper work by ASHAs and carry out entering beneficiaries’ data in a digitalized + +The FLW Mobile App is designed for healthcare programs and consultation services rendered by ASHAs’ to serve pregnant women, mothers, and newborns in India. This eliminates pen and paperwork by ASHAs and allows them to enter beneficiaries data in a digital process with increased ease and accuracy of data. We named it as SAKHI for Bihar State and Utprerona for -Assam State.
    • -
    +Assam State. + + + +## Functional Modules -**This application provides below functional modules:-** 1. Household List 2. New Household Registration @@ -83,8 +84,8 @@ Make sure you have the following installed: To run this project, Follow these steps: -1. Clone the repository to your local machine - using `git clone https://github.com/PSMRI/FLW-Mobile-App`. +1. Clone the repository to your local machine, + using: `git clone https://github.com/PSMRI/FLW-Mobile-App`. 2. Open Android Studio. 3. Click on 'Open an existing Android Studio project'. 4. Navigate to the directory where you cloned the project and select the root folder. @@ -95,7 +96,7 @@ To run this project, Follow these steps: - **Secrets**:- set ENCRYPTED_PASS_KEY, ABHA_CLIENT_ID, ABHA_CLIENT_SECRET values in secrets.properties file. -- **google-json**:- set Google JSON file of required variant ie. UAT, STAGING or PRODUCTION. +- **google-json**:- set Google JSON file of required variant, i.e. UAT, STAGING or PRODUCTION. - **Environments**:- We can generate the application for below environments based on requirements 1.Amrit Demo. @@ -136,4 +137,4 @@ To run this project, Follow these steps: + https://developer.android.com/studio/publish/app-signing + Once the APK is generated android studio will notify with the location of APK, - generally in release folder + generally in release folder From 9a0873009fe7b200211dda0a001ca60fb8d14d20 Mon Sep 17 00:00:00 2001 From: Ritik Date: Mon, 30 Sep 2024 18:05:48 +0530 Subject: [PATCH 075/892] HBNC - Due List and Overdue List management --- .../sakhi/adapters/InfantListAdapter.kt | 17 ++++++++++++++++- .../piramalswasthya/sakhi/helpers/Konstants.kt | 2 +- .../java/org/piramalswasthya/sakhi/model/Ben.kt | 3 +++ .../layout/rv_item_ben_child_care_infant.xml | 9 +++++++++ 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/adapters/InfantListAdapter.kt b/app/src/main/java/org/piramalswasthya/sakhi/adapters/InfantListAdapter.kt index 19706c8a5..f3cd42403 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/adapters/InfantListAdapter.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/adapters/InfantListAdapter.kt @@ -1,12 +1,14 @@ package org.piramalswasthya.sakhi.adapters import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import org.piramalswasthya.sakhi.databinding.RvItemBenChildCareInfantBinding import org.piramalswasthya.sakhi.model.BenBasicDomain +import java.util.concurrent.TimeUnit class InfantListAdapter( @@ -44,8 +46,20 @@ class InfantListAdapter( binding.ben = item binding.clickListener = clickListener binding.executePendingBindings() - + setOverDueStatus(item.dob) } + + private fun setOverDueStatus(dob: Long) { + + val diffLong = System.currentTimeMillis() - dob + if (TimeUnit.MILLISECONDS.toDays(diffLong).toInt() > 42) { + binding.dueIcon.visibility = View.VISIBLE + } else { + binding.dueIcon.visibility = View.GONE + } + + } + } override fun onCreateViewHolder( @@ -54,6 +68,7 @@ class InfantListAdapter( override fun onBindViewHolder(holder: BenViewHolder, position: Int) { holder.bind(getItem(position), clickListener, showSyncIcon) + } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt b/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt index f21a6e8ba..3711e905a 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/helpers/Konstants.kt @@ -26,7 +26,7 @@ object Konstants { const val minAgeForNcd: Int = 30 const val minAgeForReproductiveAge: Int = 15 const val maxAgeForReproductiveAge: Int = 49 - const val maxAgeForInfant: Int = 42 + const val maxAgeForInfant: Int = 61 const val minAgeForChild: Int = 92 const val maxAgeForChild: Int = 456 const val minAgeForAdolescent: Int = 6 diff --git a/app/src/main/java/org/piramalswasthya/sakhi/model/Ben.kt b/app/src/main/java/org/piramalswasthya/sakhi/model/Ben.kt index 30996f16b..cb2e5cc34 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/model/Ben.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/model/Ben.kt @@ -202,6 +202,8 @@ data class BenBasicCache( } + + private fun getDiffYears(a: Calendar, b: Calendar): Int { var diff = b.get(Calendar.YEAR) - a.get(Calendar.YEAR) if (a.get(Calendar.MONTH) > b.get(Calendar.MONTH) || a.get(Calendar.MONTH) == b.get( @@ -699,6 +701,7 @@ data class BenBasicDomain( var syncState: SyncState? ) + data class BenBasicDomainForForm( val benId: Long, val hhId: Long, diff --git a/app/src/main/res/layout/rv_item_ben_child_care_infant.xml b/app/src/main/res/layout/rv_item_ben_child_care_infant.xml index 0f0e26237..7387a7dc6 100644 --- a/app/src/main/res/layout/rv_item_ben_child_care_infant.xml +++ b/app/src/main/res/layout/rv_item_ben_child_care_infant.xml @@ -84,6 +84,15 @@ app:cornerRadius="@dimen/padding_normal" app:layout_constraintBottom_toBottomOf="@+id/tv_hh_id" /> + + Date: Thu, 3 Oct 2024 19:03:58 +0530 Subject: [PATCH 076/892] ProviderServiceMapId Uncommented --- app/src/main/java/org/piramalswasthya/sakhi/model/Ben.kt | 4 ++-- .../main/java/org/piramalswasthya/sakhi/model/Household.kt | 6 +++--- app/src/main/java/org/piramalswasthya/sakhi/model/User.kt | 6 +++--- .../java/org/piramalswasthya/sakhi/repositories/BenRepo.kt | 4 ++-- .../non_communicable_diseases/cbac/CbacViewModel.kt | 3 +++ 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/model/Ben.kt b/app/src/main/java/org/piramalswasthya/sakhi/model/Ben.kt index 30996f16b..e275ccb7c 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/model/Ben.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/model/Ben.kt @@ -1292,7 +1292,7 @@ data class BenRegCache( return TimeUnit.MILLISECONDS.toDays(cal.timeInMillis - millisCurrent).toInt() } - fun asKidNetworkModel(): BenRegKidNetwork { + fun asKidNetworkModel(user: User): BenRegKidNetwork { return BenRegKidNetwork( benficieryid = beneficiaryId, childName = firstName, @@ -1342,7 +1342,7 @@ data class BenRegCache( Processed = processed, serverUpdatedStatus = serverUpdatedStatus, VanID = 4, -// ProviderServiceMapID = user.serviceMapId, + ProviderServiceMapID = user.serviceMapId, Countyid = locationRecord.country.id, stateid = locationRecord.state.id, districtid = locationRecord.district.id, diff --git a/app/src/main/java/org/piramalswasthya/sakhi/model/Household.kt b/app/src/main/java/org/piramalswasthya/sakhi/model/Household.kt index 125bd77b8..0c3634d95 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/model/Household.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/model/Household.kt @@ -80,11 +80,11 @@ data class HouseholdCache( ) : FormDataModel { - fun asNetworkModel(): HouseholdNetwork { + fun asNetworkModel(user: User): HouseholdNetwork { return HouseholdNetwork( Countyid = locationRecord.country.id, Processed = processed, -// ProviderServiceMapID = userCache.serviceMapId, + ProviderServiceMapID = user.serviceMapId, // VanID = userCache.vanId, ashaId = ashaId, availabilityOfToilet = amenities?.availabilityOfToilet, @@ -235,7 +235,7 @@ data class HouseholdNetwork( @Json(name = "updatedDate") val updatedDate: String? = null, -// @Json(name = "ProviderServiceMapID") val ProviderServiceMapID: Int, + @Json(name = "ProviderServiceMapID") val ProviderServiceMapID: Int, // @Json(name = "VanID") val VanID: Int, diff --git a/app/src/main/java/org/piramalswasthya/sakhi/model/User.kt b/app/src/main/java/org/piramalswasthya/sakhi/model/User.kt index 529b6c700..bf232f763 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/model/User.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/model/User.kt @@ -18,8 +18,8 @@ data class UserCache( @ColumnInfo(name = "Password") val password: String, -// @ColumnInfo(name = "service_map_id") -// val serviceMapId : Int, + @ColumnInfo(name = "service_map_id") + val serviceMapId : Int, // @ColumnInfo(name = "service_id") // val serviceId : Int, @@ -211,7 +211,7 @@ data class UserNetwork( userId = userId, userName = userName, password = password, -// serviceMapId = serviceMapId, + serviceMapId = serviceMapId, // servicePointId = servicePointId, // serviceId = serviceId, // servicePointName = servicePointName?:"", diff --git a/app/src/main/java/org/piramalswasthya/sakhi/repositories/BenRepo.kt b/app/src/main/java/org/piramalswasthya/sakhi/repositories/BenRepo.kt index 60f402f61..f2e3dc83b 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/repositories/BenRepo.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/repositories/BenRepo.kt @@ -240,10 +240,10 @@ class BenRepo @Inject constructor( benDao.setSyncState(it.householdId, it.beneficiaryId, SyncState.SYNCING) benNetworkPostList.add(it.asNetworkPostModel(context, user)) householdNetworkPostList.add( - householdDao.getHousehold(it.householdId)!!.asNetworkModel() + householdDao.getHousehold(it.householdId)!!.asNetworkModel(user) ) try { - if (it.ageUnitId != 3 || it.age < 15) kidNetworkPostList.add(it.asKidNetworkModel()) + if (it.ageUnitId != 3 || it.age < 15) kidNetworkPostList.add(it.asKidNetworkModel(user)) } catch (e: java.lang.Exception) { Timber.d("caught error in adding kidDetails : $e") } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacViewModel.kt index 80a179658..cefd9dceb 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacViewModel.kt @@ -151,6 +151,8 @@ class CbacViewModel @Inject constructor( private val _minDate = MutableLiveData() + val user = preferenceDao.getLoggedInUser() + val minDate: LiveData get() = _minDate @@ -593,6 +595,7 @@ class CbacViewModel @Inject constructor( // cbac.districtname = ben.locationRecord cbac.villageid = ben.locationRecord.village.id cbac.cbac_reg_id = ben.benRegId + cbac.ProviderServiceMapID = user!!.serviceMapId viewModelScope.launch { val result = cbacRepo.saveCbacData(cbac, ben) From 3f042ff4568a88d6fd8f061be01f7f5a6bd8f7a8 Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Mon, 7 Oct 2024 12:05:07 +0530 Subject: [PATCH 077/892] Removed unwanted bullet point --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 83d02f303..57a9cd507 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,11 @@ ## Overview - The FLW Mobile App is designed for healthcare programs and consultation services rendered by ASHAs’ to serve pregnant women, mothers, and newborns in India. This eliminates pen and paperwork by ASHAs and allows them to enter beneficiaries data in a digital process with increased ease and accuracy of data. We named it as SAKHI for Bihar State and Utprerona for Assam State. - ## Functional Modules From 410dbf815571e091008308adb0e3afb086ffa8fb Mon Sep 17 00:00:00 2001 From: Sushant Date: Mon, 7 Oct 2024 15:12:16 +0530 Subject: [PATCH 078/892] Attributes Corrected --- .../main/java/org/piramalswasthya/sakhi/model/Household.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/model/Household.kt b/app/src/main/java/org/piramalswasthya/sakhi/model/Household.kt index 0c3634d95..a8feac28e 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/model/Household.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/model/Household.kt @@ -84,7 +84,7 @@ data class HouseholdCache( return HouseholdNetwork( Countyid = locationRecord.country.id, Processed = processed, - ProviderServiceMapID = user.serviceMapId, + providerServiceMapID = user.serviceMapId, // VanID = userCache.vanId, ashaId = ashaId, availabilityOfToilet = amenities?.availabilityOfToilet, @@ -235,7 +235,7 @@ data class HouseholdNetwork( @Json(name = "updatedDate") val updatedDate: String? = null, - @Json(name = "ProviderServiceMapID") val ProviderServiceMapID: Int, + @Json(name = "ProviderServiceMapID") val providerServiceMapID: Int, // @Json(name = "VanID") val VanID: Int, From 61b518a23958e5d42c719200714e06c96bfe747f Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Wed, 16 Oct 2024 12:49:47 +0530 Subject: [PATCH 079/892] Removed unwanted bullet point --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index 57a9cd507..1df5303c6 100644 --- a/README.md +++ b/README.md @@ -21,20 +21,31 @@ Assam State. 5. Eligible Couple List 6. Mother Care + • Pregnancy List (PMSMA Form: Pradhan Mantri Surakshit Matritva Abhiyan) + • Delivery stage List + • PNC Mother List + • Reproductive Age List 7. Child Care + • Infant List + • Child List + • Adolescent List 8. NCD + • NCD List + • NCD Eligible List + • NCD Priority List + • NCD Non-Eligible List 9. Immunization due List @@ -50,9 +61,13 @@ Assam State. 14. Village Level Forms 15. ASHA Dashboard + • Total ANC Women + • Delivery due list + • Total Delivery Women + • Total PNC Women 16. ASHA To-do List (Scheduler) From a0f112fb7a7acc5b9613e49587d93c7af7454b3b Mon Sep 17 00:00:00 2001 From: Sushant Date: Thu, 24 Oct 2024 10:29:44 +0530 Subject: [PATCH 080/892] Resolved Unit Changes --- .../sakhi/configuration/InfantRegistrationDataset.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/InfantRegistrationDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/InfantRegistrationDataset.kt index 313d2e6fc..49c098e1a 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/InfantRegistrationDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/InfantRegistrationDataset.kt @@ -111,7 +111,7 @@ class InfantRegistrationDataset( private var weight = FormElement( id = 11, inputType = InputType.EDIT_TEXT, - title = "Weight at Birth(gram)", + title = "Weight at Birth(kg)", required = false, hasDependants = false, etMaxLength = 5, From fe3c0cbcc4022844bb036fae4475749e6efb430e Mon Sep 17 00:00:00 2001 From: Sushant Date: Thu, 24 Oct 2024 17:09:19 +0530 Subject: [PATCH 081/892] Changed Spouse Sur Name in case of Women HoF & Delivery Outcome Changes --- .../piramalswasthya/sakhi/configuration/BenRegFormDataset.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt index 2694fac7b..469c966d9 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt @@ -1159,7 +1159,9 @@ class BenRegFormDataset(context: Context, language: Languages) : Dataset(context if (hoFSpouse1.isEmpty()) { firstName.value = hoFSpouse.genDetails?.spouseName firstName.inputType = TEXT_VIEW - lastName.value = hoFSpouse.lastName + if (hoFSpouse.gender == Gender.MALE) { + lastName.value = hoFSpouse.lastName + } lastName.inputType = EDIT_TEXT } if (hoFSpouse.gender == FEMALE) { From 5de79c8a6a8055d494469ba1f9a8fd41ccd05021 Mon Sep 17 00:00:00 2001 From: ShaanOnDev Date: Wed, 6 Nov 2024 17:11:02 +0530 Subject: [PATCH 082/892] Spouse Sur Name Field Correction --- .../piramalswasthya/sakhi/configuration/BenRegFormDataset.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt index 469c966d9..2694fac7b 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt @@ -1159,9 +1159,7 @@ class BenRegFormDataset(context: Context, language: Languages) : Dataset(context if (hoFSpouse1.isEmpty()) { firstName.value = hoFSpouse.genDetails?.spouseName firstName.inputType = TEXT_VIEW - if (hoFSpouse.gender == Gender.MALE) { - lastName.value = hoFSpouse.lastName - } + lastName.value = hoFSpouse.lastName lastName.inputType = EDIT_TEXT } if (hoFSpouse.gender == FEMALE) { From 8354801132596173213f9f7396f744cda753041c Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Thu, 7 Nov 2024 18:48:50 +0530 Subject: [PATCH 083/892] Removed unwanted bullet point --- app/build.gradle | 3 + app/google-services.json | 37 +++++--- .../sakhi/adapters/FormInputAdapter.kt | 8 +- .../PregnantWomanAncVisitDataset.kt | 81 ++++++++++++++++-- .../org/piramalswasthya/sakhi/di/AppModule.kt | 4 +- .../sakhi/model/FormElement.kt | 6 +- .../sakhi/network/AmritApiService.kt | 2 +- app/src/main/res/color/box_stroke_color.xml | 6 ++ app/src/main/res/drawable/ic_anc_date.xml | 59 +++++++++++++ app/src/main/res/drawable/ic_bg_circular.xml | 12 +++ .../main/res/drawable/ic_blood_pressure.xml | 9 ++ app/src/main/res/drawable/ic_pw_weight.xml | 24 ++++++ app/src/main/res/drawable/ic_referral.xml | 26 ++++++ app/src/main/res/drawable/ic_tablets.xml | 9 ++ app/src/main/res/font/roboto_black.ttf | Bin 0 -> 168060 bytes app/src/main/res/font/roboto_bold.ttf | Bin 0 -> 167336 bytes app/src/main/res/font/roboto_italic.ttf | Bin 0 -> 170504 bytes app/src/main/res/font/roboto_light.ttf | Bin 0 -> 167000 bytes app/src/main/res/font/roboto_medium.ttf | Bin 0 -> 168644 bytes app/src/main/res/font/roboto_regular.ttf | Bin 0 -> 168260 bytes app/src/main/res/font/roboto_thin.ttf | Bin 0 -> 168488 bytes app/src/main/res/layout/fragment_new_form.xml | 1 - app/src/main/res/layout/rv_input_form.xml | 1 - .../res/layout/rv_item_form_datepicker_v2.xml | 28 +++++- .../res/layout/rv_item_form_dropdown_v2.xml | 52 ++++++++++- .../res/layout/rv_item_form_edit_text_v2.xml | 27 ++++++ .../main/res/layout/rv_item_form_radio_v2.xml | 4 + .../res/layout/rv_item_form_text_view_v2.xml | 28 ++++++ .../res/layout/rv_item_form_timepicker_v2.xml | 30 ++++++- app/src/main/res/values/styles.xml | 16 ++++ local.properties | 3 +- secrets.properties | 17 +++- 32 files changed, 457 insertions(+), 36 deletions(-) create mode 100644 app/src/main/res/color/box_stroke_color.xml create mode 100644 app/src/main/res/drawable/ic_anc_date.xml create mode 100644 app/src/main/res/drawable/ic_bg_circular.xml create mode 100644 app/src/main/res/drawable/ic_blood_pressure.xml create mode 100644 app/src/main/res/drawable/ic_pw_weight.xml create mode 100644 app/src/main/res/drawable/ic_referral.xml create mode 100644 app/src/main/res/drawable/ic_tablets.xml create mode 100644 app/src/main/res/font/roboto_black.ttf create mode 100644 app/src/main/res/font/roboto_bold.ttf create mode 100644 app/src/main/res/font/roboto_italic.ttf create mode 100644 app/src/main/res/font/roboto_light.ttf create mode 100644 app/src/main/res/font/roboto_medium.ttf create mode 100644 app/src/main/res/font/roboto_regular.ttf create mode 100644 app/src/main/res/font/roboto_thin.ttf diff --git a/app/build.gradle b/app/build.gradle index 3ed72cd48..23bb38e44 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -178,6 +178,9 @@ dependencies { implementation 'id.zelory:compressor:3.0.1' implementation 'androidx.legacy:legacy-support-v4:1.0.0' + //Dimens Library + implementation 'com.intuit.sdp:sdp-android:1.1.0' + } secrets { propertiesFileName = "secrets.properties" diff --git a/app/google-services.json b/app/google-services.json index c28e3af0b..4bb35d694 100644 --- a/app/google-services.json +++ b/app/google-services.json @@ -1,36 +1,45 @@ { "project_info": { - "project_number": "##", - "project_id": "##", - "storage_bucket": "##" + "project_number": "904378085373", + "project_id": "saksham-assam", + "storage_bucket": "saksham-assam.appspot.com" }, "client": [ { "client_info": { - "mobilesdk_app_id": "##", + "mobilesdk_app_id": "1:904378085373:android:12b5e159aafe40543f3394", "android_client_info": { "package_name": "org.piramalswasthya.sakhi" } }, - "oauth_client": [ + "oauth_client": [], + "api_key": [ { - "client_id": "##", - "client_type": 3 + "current_key": "AIzaSyCLl34y0YsHdh7ueHjfozVe1VguekUYUR8" } ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:904378085373:android:4cc1633bcf1d2b543f3394", + "android_client_info": { + "package_name": "org.piramalswasthya.sakhi.staging" + } + }, + "oauth_client": [], "api_key": [ { - "current_key": "##" + "current_key": "AIzaSyCLl34y0YsHdh7ueHjfozVe1VguekUYUR8" } ], "services": { "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "##", - "client_type": 3 - } - ] + "other_platform_oauth_client": [] } } } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapter.kt b/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapter.kt index 63c827904..b25936f1e 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapter.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapter.kt @@ -152,7 +152,7 @@ class FormInputAdapter( binding.tilEditText.isErrorEnabled = item.errorText != null binding.tilEditText.error = item.errorText } -// binding.tilEditText.error = null +// binding.tilEditText.error = null // else if(item.errorText!= null && binding.tilEditText.error==null) // binding.tilEditText.error = item.errorText @@ -297,7 +297,13 @@ class FormInputAdapter( } if (!isEnabled) { binding.tilRvDropdown.visibility = View.GONE + binding.ivIconBg.visibility = View.GONE + binding.ivIconTemperature.visibility = View.GONE + binding.tilEditText.visibility = View.VISIBLE + binding.ivIconBg1.visibility = View.VISIBLE + binding.ivIconTemperature1.visibility = View.VISIBLE + binding.et.isFocusable = false binding.et.isClickable = false binding.executePendingBindings() diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt index 70c3fbcaf..478f2703c 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt @@ -28,12 +28,18 @@ class PregnantWomanAncVisitDataset( title = "ANC Date", required = true, hasDependants = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_anc_date, + showDrawable = true ) private val weekOfPregnancy = FormElement( id = 2, inputType = InputType.TEXT_VIEW, title = "Weeks of Pregnancy", required = false, + showDrawable = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_bmi, ) private val ancVisit = FormElement( @@ -41,6 +47,9 @@ class PregnantWomanAncVisitDataset( inputType = InputType.DROPDOWN, title = "ANC Period", required = true, + showDrawable = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_bmi, ) private val isAborted = FormElement( id = 4, @@ -49,7 +58,7 @@ class PregnantWomanAncVisitDataset( arrayId = R.array.anc_confirmation_array1, entries = resources.getStringArray(R.array.anc_confirmation_array1), required = false, - hasDependants = true + hasDependants = true, ) private val abortionType = FormElement( id = 5, @@ -58,7 +67,7 @@ class PregnantWomanAncVisitDataset( arrayId = R.array.anc_abortion_type_array, entries = resources.getStringArray(R.array.anc_abortion_type_array), required = true, - hasDependants = true + hasDependants = true, ) private val abortionFacility = FormElement( id = 6, @@ -67,7 +76,7 @@ class PregnantWomanAncVisitDataset( arrayId = R.array.anc_abortion_facility_array, entries = resources.getStringArray(R.array.anc_abortion_facility_array), required = true, - hasDependants = true + hasDependants = true, ) private val abortionDate = FormElement( id = 7, @@ -75,6 +84,9 @@ class PregnantWomanAncVisitDataset( title = "Abortion Date", required = true, max = System.currentTimeMillis(), + showDrawable = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_bmi, ) private val weight = FormElement( @@ -86,7 +98,10 @@ class PregnantWomanAncVisitDataset( etMaxLength = 3, required = false, min = 30, - max = 200 + max = 200, + showDrawable = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_pw_weight, ) private val bp = FormElement( id = 9, @@ -95,6 +110,9 @@ class PregnantWomanAncVisitDataset( // etInputType = android.text.InputType.TYPE_CLASS_NUMBER or android.text.InputType.TYPE_NUMBER_VARIATION_NORMAL, etMaxLength = 7, required = false, + showDrawable = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_blood_pressure, ) // private val bpDiastolic = FormElement( // id = 10, @@ -136,6 +154,9 @@ class PregnantWomanAncVisitDataset( min = 1, max = 999, required = false, + showDrawable = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_bmi, ) private val hb = FormElement( @@ -147,6 +168,9 @@ class PregnantWomanAncVisitDataset( minDecimal = 2.0, maxDecimal = 15.0, required = false, + showDrawable = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_bmi, ) private val fundalHeight = FormElement( @@ -158,6 +182,9 @@ class PregnantWomanAncVisitDataset( min = 1, max = 99, required = false, + showDrawable = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_bmi, ) private val urineAlbumin = FormElement( id = 14, @@ -166,6 +193,7 @@ class PregnantWomanAncVisitDataset( arrayId = R.array.anc_urine_albumin_array, entries = resources.getStringArray(R.array.anc_urine_albumin_array), required = false, + showDrawable = true ) private val randomBloodSugarTest = FormElement( id = 15, @@ -174,6 +202,7 @@ class PregnantWomanAncVisitDataset( arrayId = R.array.anc_random_blood_sugar_test_array, entries = resources.getStringArray(R.array.anc_random_blood_sugar_test_array), required = false, + showDrawable = true ) private val dateOfTTOrTd1 = FormElement( id = 16, @@ -182,6 +211,9 @@ class PregnantWomanAncVisitDataset( required = false, hasDependants = true, max = System.currentTimeMillis(), + showDrawable = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_bmi, ) private val dateOfTTOrTd2 = FormElement( id = 17, @@ -189,6 +221,9 @@ class PregnantWomanAncVisitDataset( title = "Date of Td TT (2nd Dose)", required = false, max = System.currentTimeMillis(), + showDrawable = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_bmi, ) private val dateOfTTOrTdBooster = FormElement( id = 18, @@ -198,6 +233,9 @@ class PregnantWomanAncVisitDataset( hasDependants = true, max = System.currentTimeMillis(), + showDrawable = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_bmi, ) private val numFolicAcidTabGiven = FormElement( id = 19, @@ -207,7 +245,10 @@ class PregnantWomanAncVisitDataset( etMaxLength = 2, required = false, min = 0, - max = 60 + max = 60, + showDrawable = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_tablets, ) private val numIfaAcidTabGiven = FormElement( id = 20, @@ -217,7 +258,10 @@ class PregnantWomanAncVisitDataset( etMaxLength = 3, required = false, min = 0, - max = 400 + max = 400, + showDrawable = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_tablets, ) private val anyHighRisk = FormElement( id = 21, @@ -232,13 +276,19 @@ class PregnantWomanAncVisitDataset( id = 22, inputType = InputType.DROPDOWN, title = "High Risk Conditions", arrayId = R.array.anc_high_risk_array, entries = resources.getStringArray(R.array.anc_high_risk_array), - required = false, hasDependants = true + required = false, hasDependants = true, + showDrawable = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_bmi, ) private val otherHighRiskCondition = FormElement( id = 23, inputType = InputType.EDIT_TEXT, title = "Any other High Risk conditions", required = true, + showDrawable = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_bmi, ) private val highRiskReferralFacility = FormElement( id = 24, @@ -247,6 +297,9 @@ class PregnantWomanAncVisitDataset( arrayId = R.array.anc_referral_facility_array, entries = resources.getStringArray(R.array.anc_referral_facility_array), required = false, + showDrawable = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_referral, ) private val hrpConfirm = FormElement( id = 25, inputType = InputType.RADIO, title = "Is HRP Confirmed?", @@ -261,6 +314,9 @@ class PregnantWomanAncVisitDataset( arrayId = R.array.anc_confirmed_by_array, entries = resources.getStringArray(R.array.anc_confirmed_by_array), required = true, + showDrawable = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_bmi, ) private val maternalDeath = FormElement( id = 27, inputType = InputType.RADIO, title = "Maternal Death", @@ -275,13 +331,19 @@ class PregnantWomanAncVisitDataset( arrayId = R.array.anc_death_cause_array, entries = resources.getStringArray(R.array.anc_death_cause_array), required = true, - hasDependants = true + hasDependants = true, + showDrawable = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_bmi, ) private val otherMaternalDeathProbableCause = FormElement( id = 29, inputType = InputType.EDIT_TEXT, title = "Other Death Cause", required = true, + showDrawable = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_bmi, ) private val maternalDateOfDeath = FormElement( id = 30, @@ -289,6 +351,9 @@ class PregnantWomanAncVisitDataset( title = "Death Date", required = true, max = System.currentTimeMillis(), + showDrawable = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_bmi, ) private val deliveryDone = FormElement( diff --git a/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt b/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt index b063ff5e0..53ecd066b 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt @@ -28,8 +28,8 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) object AppModule { - private const val baseTmcUrl = - "https://amritdemo.piramalswasthya.org/" + private const val baseTmcUrl ="https://uatamrit.piramalswasthya.org/" + // "https://amritdemo.piramalswasthya.org/" private const val baseAbhaUrl = "https://healthidsbx.abdm.gov.in/api/" diff --git a/app/src/main/java/org/piramalswasthya/sakhi/model/FormElement.kt b/app/src/main/java/org/piramalswasthya/sakhi/model/FormElement.kt index 1dc869e55..a596d5a9e 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/model/FormElement.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/model/FormElement.kt @@ -1,6 +1,7 @@ package org.piramalswasthya.sakhi.model import androidx.annotation.ArrayRes +import androidx.annotation.DrawableRes data class FormElement( val id: Int, @@ -8,7 +9,7 @@ data class FormElement( var required: Boolean, var title: String, val subtitle: String? = null, - @ArrayRes var arrayId: Int = -1, + @ArrayRes var arrayId: Int = -1, var entries: Array? = null, var doubleStar: Boolean = false, val hasDependants: Boolean = false, @@ -32,4 +33,7 @@ data class FormElement( var isEnabled: Boolean = true, var headingLine: Boolean = true, val showYearFirstInDatePicker: Boolean = false, + val backgroundDrawable: Int? = null, + val iconDrawableRes: Int? = null, + val showDrawable: Boolean? = false ) \ No newline at end of file diff --git a/app/src/main/java/org/piramalswasthya/sakhi/network/AmritApiService.kt b/app/src/main/java/org/piramalswasthya/sakhi/network/AmritApiService.kt index cc986b1a6..e15403962 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/network/AmritApiService.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/network/AmritApiService.kt @@ -8,7 +8,7 @@ import retrofit2.http.* interface AmritApiService { @Headers("No-Auth: true") - @POST("commonapi-v1.0/user/userAuthenticate/") + @POST("commonapi-v1.0/user/userAuthenticate") suspend fun getJwtToken(@Body json: TmcAuthUserRequest): Response @GET("flw-0.0.1/user/getUserDetail") diff --git a/app/src/main/res/color/box_stroke_color.xml b/app/src/main/res/color/box_stroke_color.xml new file mode 100644 index 000000000..5372db94a --- /dev/null +++ b/app/src/main/res/color/box_stroke_color.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_anc_date.xml b/app/src/main/res/drawable/ic_anc_date.xml new file mode 100644 index 000000000..eed34d29e --- /dev/null +++ b/app/src/main/res/drawable/ic_anc_date.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_bg_circular.xml b/app/src/main/res/drawable/ic_bg_circular.xml new file mode 100644 index 000000000..f87f2e59a --- /dev/null +++ b/app/src/main/res/drawable/ic_bg_circular.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_blood_pressure.xml b/app/src/main/res/drawable/ic_blood_pressure.xml new file mode 100644 index 000000000..a123854f2 --- /dev/null +++ b/app/src/main/res/drawable/ic_blood_pressure.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_pw_weight.xml b/app/src/main/res/drawable/ic_pw_weight.xml new file mode 100644 index 000000000..05a7d99ad --- /dev/null +++ b/app/src/main/res/drawable/ic_pw_weight.xml @@ -0,0 +1,24 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_referral.xml b/app/src/main/res/drawable/ic_referral.xml new file mode 100644 index 000000000..0fbd18114 --- /dev/null +++ b/app/src/main/res/drawable/ic_referral.xml @@ -0,0 +1,26 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_tablets.xml b/app/src/main/res/drawable/ic_tablets.xml new file mode 100644 index 000000000..daca97d2e --- /dev/null +++ b/app/src/main/res/drawable/ic_tablets.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/font/roboto_black.ttf b/app/src/main/res/font/roboto_black.ttf new file mode 100644 index 0000000000000000000000000000000000000000..58fa175b563ef12256e211fc0e9a400b2a426ef5 GIT binary patch literal 168060 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öhdi8zSmfb2yl0J#I^XU+uGoxonD_Su=BatGcC-KdM?%%V^69g-!Q zAGU_#S+JmAhep5X|5FmQ;8ARZYOH_1?#49PE_P(eA-h~uH-qECDUN&CIq(p|S8Iqq zL*)Uqu&~ZFSucZ%6YSC}xh-t6O@3|@-|Ifew=wn`i`@f67A1GX(3Wg*(WmbHtT{i7 zjJj%F`32HIlAwXaV%!myd8%xP`U(w0AFPn}`i03??p>yTnQFQ-Pz?zc73{Fpdi>vP zHJnd0TN8RG6lQ42$|qC#zDe)!kt~}Ru&rP8Ww`^sWLx>Z609*FKy}b`lN!P8Pu0+L zvs>NoVwQD)TYn!pCJC08)p${ps*$rel={R3S0%23V<#EXLgM{I(qKH&OyWVqW#d!h zk;J6HxsT&o)|d6K29=G+OXTH^HhkPwmShhOFLD_WG9(|gAY_6LH5hLxsF$lIEgU(G z@B90sAB#G-eTP4|^ci4VavQg8&}iCZo6scFbq3*=aVazj(k{iR+6y=`0lcy+D%@74JYUf5|-$VXxPS zc8Ei4!LJ6Q`<}&v=|yxPgpmGwrX@E0xbBKmZIY;*LP<*x8w9Z-H1w`&U zeRrb<{v>1Fc@}NFrwG2J*zpn=Taq}Bup|v0C&9DyvFXaakRv*SCI!-HNrDLo4j&k*Bs6O1??idk$8sh=@bE9jB*ky@R`#p5R#r;x^5O)T zIH}+U`lxh)CPrm)f9PsI^3X&YlLva<&j&q^vB?QC@dR0Uz_#*C%n)o`E2IJ8bE@pu+s>8BkA@l*OBguK-+bVhGhF|-)|M6kEW{Y(8f6Jl#4)DZ2L z{T+C2G}0h$iJ(0Hlz0#n@(WllOJVKMwQvM>t{bD619fL1IyPr6|Bu7?&&*{d87Am= z0JQwl!=&;3(fIx_@%>cIp?jC~@ApzClA#T88uFfrW_$Yh!}uqkQL+)$!TwmSk~ z1|=asne1V`T^X27Sg77iMTCv4A+GeS(3E&`C)qX7SI@PqP-#wpREo*0YBc+tXG8(J>*izrvy1m+TOwI3@V@vRS&}-) z{HuilY@rtRHQo?h2|C z%K&>0!=M|O@(#}0xmml%A)YnBI*2A0`0Z}|n7sjhJJ{070-yy!;HFjo@1OrKdtRi5 zdwzmZFiq0OT#z&+6}`e zf$Ou~Pw!d&D<*K0+krK+gyip&;k#OQZlh0wTgR6Y8Yxv)uKCH}M*M z&_>JMJWfM6=&5Da7nvEyXdatyT*$o=+83djj4+{@m;{bafyB=Z%vX)FX#lfPkTQ*; z+DAdkNKwL4itt$x`M^*O_l;f+jUa4RjM}4dd75H*`ZptTo}SF^&E+SbeDXVU^4qry zAF?{l8m(~Lxf3S0TwL%gGB6$m74dV|KFjU-&7nf9E$nk!1LTiUz5Y5+44D#FbkB~7 zp_x(vbWLAShtAYh7D8M~!_94k7~}q>Y%_%&`?Jx8=p$GS3X>U%u#86lu>?b=90ef_ zMk8$%HL$k0T$HzwsG0C0rCCe!VqXkRWPx8?XAvbCzkcs5|05=kv?-Raw*}kz(ItNC zR-MQE?2SU+9W-{{+ZYThQ4v&D(sQ=^tBU5ILov0!5+;sg(y+YRW|&3zQo~R{@7qJw zE{lX_oOg5PD7YSMbq8fICuSj?)s>Ehtv013&!2vb=U?nQ1erhca~rH#o(*&E$;XIB zt!C@1tn9P(3z<(r>dB*)$Srvvh&t2_F&=hKgouz^faNXr#I$w3eVdw4`ss-)M>G)2Zd*EXX>}8Y&f=YBV<7(oVmN8*BI0f zL>PQ!rZhr5OkqB7qLb@HbRLZ?C}r3lS%Wo1PN88wsv{~woV5Sy@Cs)c0T4>D&*<^m zq786qc~ObB|7!F)aMGc{gd7Mh-bVIy1Tvq-ss37}4eVnbCBsB(I!6DkSS69Y<7rg(9;70tR^vMzx=5E{Nm=rP9HRD6zeF*$USy-YTddMRND{bGrRM@WKY=y?&JTo$gJLk{7BGxZ6`3xFnE%X&7dJLz~k-k zbgU76Bwg4DB~`!BXZe)m2`0bNM5-TF8(Byr2ipQ~S!&sg2M>50Wivb_T0yFYlSgvc zz*9l3Bw@X4A;hhB5!epWW6U&bx*7^ls-~@ zktMK~f2iqOC>BC0189a>1{UA4=fQJY3Yg>?dWWX_inF1|XoYmuFHAWi&m4+s7lrJ` zFawSQ4N7<)snpCOB3^JfVw~i647KM?f3V^Dv?;&-#m^z|b$p+d^>}Z;g4jaMHCHFC zS;K;F$)6R~e|Say7Wco&Uz4_6e9N{RvnYeH+YEh1P3PLAFN(42&Du6=2=TY>7yfX; z0_Oj#)X%;2;^?VlMo%40kCYd9i?l9VG)`}{WsDjvGUbpio-f1VBNJ1cQQZry@3k5h zOmzlGz%tXT_Ns_tQ86mgJCLY>5SH;=BD8Hjmx%gPO`PCRXaR^rDr*{Ag0$`8Th~}9 ze{hvs=FeyCE?$I|mao+2H-9*M@B&k6A7ionXLmXNbL*zBV?X*9|86g5{TMNb8EP33 zgV5%XfRxw-oqWWq>lbnOOPsz1dgiPe3~d~<0|Lh}AaGFiCXS#Xq5|wj)Bcn;=TRYZ zLxiK#!z^*J7MC7%(GunmhtU%1WD%TTM|VU6Z$LucTy})Wn;Z8^02{#<`c0Vr@)U*j zvM=X%_aM{xz3}aPGwUf21W0vDe&fNcFHF3p_Y3Sfm&bHYvnZ}zaProROzm(P2K#xDELD58p6OkYd#WkpX5Fk5Hq)+SMlRBzj zkVs+$@R7kMPQ?a>4Ob(Ag#$9!qcjNhPE;QdimwLm>uIm9YkLQVM>7Aj)JZ*eUYimu zkpF3K-O3|@&+~^7!%5+jrhfl`x~lgWe(Z$-)N1|ji@ZJ#BP0^i46Ng^8o)V2WJAm8 zhhhUqv_=o&tm!1+b(?q{D*9UJI=vb!`WB1exv%#emO~BI8ybu39C&=wH7JC1S)Nj# z|6Y9-f1N#fPgdSzZoYum`gK9-ref#;mJsy47ROEuQQx8e z9-{7hPy@BvefR;GPwAm-B5mv>DA1LKf=2W&Jtf61oo{%gY7XDd=CT*q9KM4eS2Gh5 zQ2+OsZbB9PeBa8IG`{ihvTwqAMnKNZQ-igN8SJO7$B6Oi>uDSkyCzB~*lKr~x zT4f^P1nN#fs9~iMlZQeBRsyYplGnwXFeQDx#Ze+9TRT$eGCED9v9ehBBaHLcXJace zX7L4!eiOKrOaGZ9O^`DQnL^(VZA*$iXVWlSVD{OlONIlna1TDdn4rEJCVl3aJY39H zx1_~|SL9nlNV$P-1M(>dGHeytCE_QTU^t-Z3RPDa9Y4&GU{e7jqHUf&L2Mr@_~(kY zak&lOO~XF+E+8XY$`ZTy8B*Ck*7p)x>LbX3C7#_xp99-Y>}C|QPbaF;TJ|Y8KE-Gi{()1{@XD6)F7RE+}M$l=o$*=cGLgDpaGjcc8btxt<4|8o}Z*wuW+f;=@2HIL%Wli}wQr6m z@}Up-A4+%k*F(OR`bK|o=)>bZJ4t*#8=Kqf<4+HL8p+P_7QbU&vn>|?VC-L6@c2~* z1c`Xh{)scE@1NK*{X*y^I(IW^P9iF%|HX^H>Tee&Ejof2BMMr84`m9l1aTT;wKu_T zH287hG7m+HKjw^on619k3ErK?7E8wyip7cigD z`G2`0y8l}B571X6!m#^MaASJ{pK6Tu4lGAmBOQPQ%*$aS3Q&WzCHA2>z-{<_r5nHV zu7NgKvmsv}9oddUM(|Yj6;FAJI;0t(i{f8-1Nn%3E-KMeEw8IFRnv&k0N0@+=mPbn zl|Z+kdXxI&Wx|l_#)Ok3MO4`*r53~+(ojmoC(&0z`7sm-sKLN;&94-apIVro3Usg3 zvZ*lAQYxj=Tgw%qq!ot%EssLe6)1UjQuGq2G}Q%I(`0I$DPrJpqy)-3)SOiHJ^l~y zIQ%X#7r*r=tN+ll?e`p%-p_B@Zy4uu7a#BCgQ8O$^Q;3aj_C8)|%;Ct+IQHpg>yw+5H=LU#>Rh#dgS2+`hW*fRR70Q(HG|>{~18ZeQTT zz42Op%SJm^?vXlot+BhpN7JXhT0iZTBTc2Z^`(MWnflSSK|W6?WMB+%6$7<;bO6J_ z^u&FXhu4@4Go6PTQ&rT`fkHZzPTfDO^u*E#tT}yaM1D_0hgD1+;7cNLhmdJR$_^SJ zWWfRBh?k*8TidMT7mvKlf8OYUT}oWf+_NSv^ml*b|JtC`GcEA(AD8jlP!RIO!MO(O81TXpkvlP#`cGF&I$^ zXS0*~>R^94>SrBW)F3gcMoPngPoTN(X9HegtzTpbNAp8a{#LK58{NO%uR>OKEPln> z#+HDZgJeqw)h6&cFkyHDG+oD(#HiCRDPlonEtu+}AnmaC2|j)Z@ggV|LOmfP*&=6z zSVTu-i-VAq@S06_hPX1)1zKvGIZw8o_!GU$S(&>hidbcdzd5MyiA}a$CwdQ*-aW}b zIpTQf$NCDla}zE_e44=BT@^K;69^Ra__wc^J+@ICE1_l^5uKk4Jui>ISc#@nFZ z1k_T<8cMmS8`NfHa@Obzj7TfOaddc*l0yLp!%Pr_HL!G?ZdBQzGLVQ>>(We#Tawnf zIfYTfFEKyVR$_kD?|;4Q%!*ebIph=g&|MN2k-ka@5iRLLZMUMBYn&l5kn173Qa9a%w?!Un|V~w2=H-h55Bo^XnJp*C$bj$VI4VG@?0~P^KOV@NRO`kgEv~ z89)Vb0DmP}Ks10%s)Nzdnx<1;jWz8dOOg5akIqk-a_#~DUS=u(9M9_tZ&Xw3-V-Or z*gLISTciA->A&T&ay+%6yrU0Vc>!&fSG>vZy#6{1yvn}4#lrZ#yF7E!i&t0&zWd5O z_Q@Ugcy_tk&LP3^7sm4i?dlB9OB-JnYd-)Uth(0Ir~;{J$;R6IH)>344;2r>2=@(* zYp)+!lL7P}Yaixad!M_2*4_ZQt(FNB-h()?_D~hzE~;LLKBUlCAd?Hq8+T#>fTNzioS+|ZC0y?c)mr;JujH@|V{#s)B0o+i0X~QL6 zv}iHPxJtu0aDY2 z399oqum1-&4a(k-3~UVjz`tsMSi=nBLQ&x^Izz--bd(QpAXmCPgl{UmJCDI3AIQRC zX1$O%V)(${`FhqVk!AhKs^+txH~5pHSBGrb#J_m+Ee466!&fU#XiF|a9`RJQQ=Kiw zD7?Y?7J0`A|89uk%wu$hfSW!#I-3Rv5*k|;-*@yp3%m36eSWf8cIPhb+uubbv|B8T zxf%jkksF_M=r(WPin%hzgkmdYp|u|5pTmpbpbKyOg4LcRCpeO_tm2j~<67#>;+pfH z4(z+kFEwLHpYn?>Si(EIe`QIn_|NRb?x{QZ3ASL@)Lm@wuIam2Q~vy}DLa8VJ5AYC z+`;NbMwiwzRQ8=1{E#yxD=x+5bXO~2QamfL#!hB;hOrCy++?e(cs$UELJ2Vzxhyab zfp-hN0zJ$vzVDzQRiN(@Us=sb5&?CpD3i~qR!`#d?#vxpF>~$Kfo;Zp-@@j+5Fau) zyjF$TrP>5T-*OjN%kb^CF~|ZgDat6V$kw7GoRMyK+1&+4S*={_g_S#pG{$>(;Jq94 z_Y(RpN~!3*DOoA$PWO{`wb}dDGL47qTxs!pTnCAX=dAnit$bf8UYw2MbYMElm zZ<3ndJ~h8jYJLrk3UudRfxki^ym9AC{na(UiO@2dgcP(gyyz;-Z!bU^+J_W$GrW%D z*oVwi+!y2-UawY|Un8WTzV8(bmcV_{88{ibsS_7OM4l@T;5V-R^{1yl<@=EDEAS!T zH_*4c%a1-fW@LKRD(URvn4Z1IzL-&^a<%4Td-fhPGNVU2{|v9;S(VD^?zZ|H-L1!X zKEf~RZ_L0G@!53ceuu$>J5@Dp89wh@6WzL#6v;utY*)YfmbMnkW=GQVU!SBajDe&WNoWVo+07> zD&wg_5Ss{d7l16#`yFzM15VT|t1}5_C&S9Jl3Z41x27b?DRP#Bxg2(xuLzjXr)jN{ zxRc5Rvetatld*yD$90q6lvsnt{KumE5R2~ma@UnCwt+{o+H54-^Ad3>r1?__lWdp_B67oSSDY#fLFu9gsa^i!W9 z4kkY1jfQ25XxO-CM8iyC*iXv;UWX*gald3y9rA zIJan&77l}*KsDmmVVDKO)7w@prFnXRCZ~9`I$B{xsCEHpX(f^U?X0Hx>kO{03wn6&+!$l<+jUagimvlqL=!>swQ z{IclBX_GrF&SFC<*BLZ{@g60YbR^5BuLqmU0i>HDYD~PqIfM^OuSpSxtS)j)T7eLl zy2D0SN>%?5p@$;v)F6aV()N@iIz*d;fa8pFfvbdtCh3jzFdbK>^4zrE{d#pB@NMLPigln?YbumU(xxwiQ&X?fSqUmu;=TO4&mR7P{Wlu?h@@6yX z`{D1F7g@(aRvEFu^~LhaXBe@DeZ?1hzE)nuOJQ=qv0N?TnAOF14&$qo&p|;>_<&?l z6{3yVq=D*@0H5MQ$OnYz<})!>Ib0Z8kULOc0(>4ZN&q(K3t~L!RLBcYP)0SvY!F^# z1=!{5(UQ0B5?-AD=iFJFH6U}om4D8EJIsHZ|A2Me{kEIB)>0N_~)+i0T>Q=QUHI`?-9nBZ218^$u8yEk^76+llYtV zJ$Os9<&O5c4KYEyK8(L9P!p1+O4{oR8cE>wv3Q-3_L434wAW=s1u%0|KU!Cd{TiU! z4Ey!pwuImTy60c_a;f1K%FqXJUxCfAhs;KKiDZ^Tl@2EF2i3L62~b%ySARNkZPOjr z(fm~_TgB_$PTAcO_^^Fi?hd;QAO0A*=zFQw&p*3?8|wa;$=oeb1_<>ad?)%{}Wv$+KjEdv^iz; zH(#1Q1U_~@_fa-s^Jc9k9cr!r>*RZO==oZ8b6(pvtRWWRRrM(=2hOHxIs(z9vKm_{a|7oa*T4K2J z2voZ8$lc?4Og7}M<%DvHM%26>aJ;Ja?tWCj_aMUS;C;qW7 zB&+v>=`Vd25-&S zWMKLrd=1QBZe(WrCw%Ds-S}-AvdnN^_0HuM7+qq>BBrD7fH$T?)b7haaEibe@(+v| zcL??x3~ns$zr_FzR!OPEDzkdJAh=Qi%S{zLUr0MmvY?w@(IZ(p!T;7A9)J`}x@D0X zQ9XlLL$>B@*AtieK&jPh+Yj(uipIaf<`&q(qv#-Vge9M(#y?zxN_v2 zA7AEwMV`oe{qD)^cDd%;bZr8+-mMQ=BZ4hWZ?VVU9> z-UADT(a5Xe#y~{cfZaJ}mlLNTMh1 zGkQ4|)^!%7QM6ds%i8)WFN$@|!ForCb$z70E~AXz!|55`@3Q2mih*~UbS{&Epr-~Q zPgNkZfj?nAVU-vZVL%6f(U98?Iu&49Xic?96RNt{JI}S=)u$;T5p`>|>ks}|LJ*+I zp#C981(J<>9JotyLGcYM^@<>0e4gsmeDTQWDdXWTrZ}N@ zX=1fTs_4RE5N5QMu|#{sWDWfw>981rY~UTRa)57(K6fqvRJd^E6i`@M4x3E|E2XR< zc@uw^zp?7A9|y{tSE9GkpEVt>EnVr^K}@X|NlU6r;2?3D2( zeE;rkXoq>VOhqMs^USi7=g|!JAnJVq{4*Ms^?bFoW?2L6ff*%@&Of~~j0qH*AA`=l zF{v?tM))J97!T^P7{Ww|LFPK{Miqn_V)~dq40dh$29JU2atfmga>2&+C?w$RJozIWBA>9A2~j1>s00Y*w|<%w$h-A1TEBfBIuN|7RcjU79%sogiTx zbw+*V$8r~iNg|O6|GoAvvY9?Y|8-FTWfb-eJrV**p5w7FTLIQMyZASJx~;R8lF=U zF_UoQ&X@Ff8oVRcPm@WE{l|#I$ljg^#SJwt)ZI*$9Oz*7e;9ohqMI4o=%MVhcIQ6m z(jo{IS5(UalNJT)Pu~4PG(2Z(sbrn@XE^qUa4kJ{7xrg@*dOwohKv0Xb{Bl6BgN}@ zzkRxRf10*$){ElxvG|@P;{EqM`+NsJR_aZC)7zW6uj;4urUoX6j!|jaSFtcqXwiZ} zRK1W6fX(vpcUlZ1KmAwo5OGkPxfJ57BI(`^hy#&8MD3{uvCeGzR{o=EY*Xzx!a8W} zsjVNO8{-FC-s5L>Fkh!?d-jvIT7zn4X$-uashE9f)TEUZzEp!@r^_o{v(r>^0XUYpzgj9l47yZmL6mQNsH^_*?tl z=Vu=;|7!+oH>hKuv9HXWEoU<2JYST2``Cv!h8&&Nv{(Puvu3appwS4Nu+4(z3V?x^ zEF}ZG!!C7TYe^?7<~&;_T#97N?be74NXf-xigOtKy>{{6&@9yTfOJrE=x!wLs;1!^ z6>u5qT%+sF9pGxC(-44PIxN0R)0;a;#GNEdL+DO#;{Al})J|1|SB)%>V2|W9=_|TZ zO0_WIK|?qf`l^uwfv63Zu!jQyh6@%%VwQu_ph2xJxi0JNzO|D-T(XEM+dep$H)Zl5 z`3Lsh$(K0BPUuz42cms{Rj!x<` zU=po-r{Zh2ML?)33%}58HA?Fvg~GQAo_Pt!iC&vz;<9=QvoL79bv;&Dpz$FO-B`pD zQkrng)oAUH*eyeY0y>oCj0T?6 zQdV9>pWx3h8gJNELvs){SoC{ERj)C^qejQmM`1u|#aJoeMwG#8Ra{P+KKBT1?lQG$ z$p3osh)>`Q>%~g4()=@4!OkL`xgD&Sd6(#llJwexwS0qv^=&IPV~*}UXIq&=KKscZ z{WAW_iK!?pnR?`WzfbeFKc4Bw`Zw+}5Hqb>UXyNOFryNv9ULacH9< z(s5mKMX7$Z8nV)WwX7V;lyV^L>rEiVmwt^k(w=T+DI?yvV{N5Mrvje zw0eiHAFe}=t42vrm;?du0)h+$37Dci1!$jfVwx{V%=z8$JpO?{z{6!$?$-4243BI~ z*PS&gS$R=y>o-yrrtI%Fj43xhzm%7>^VQDZkG|6?XLO&QRZb50mU1!%LAET!ZpC6o zR!@f-PcDneg|B;K)RLmk5y=rIKOv$<2B0uC+Fye%NAD5ejF7QFBNzJ-Y7l zXS8I}hnv=Qt+)027ZH9TY~)+^McADaF=M#NCcE6GeFv@g_ALS_PM(T*1~1?6-6Y*g^D&+~f{;C!U~efQ^bWotI;N(XDk zwI$#EEGuhyDK|g+x({*w$*m0%TQ=q3PdHcLC7)8Za9#KtU&AgvJu{O(+B+H2WWCdb zwqoQVn3;ixh?)8LBxXkYhM6VEk}bglHHC@kj6-9Zn3;5AcSz`ahw`k6*;I92qd|@O zjU+l=;nihn{C9IM-C%MW|D@RRn9!)!?PR~YpUci+(?=aR-R#|oYpzcG>=W9t5yjW+ z0Axir*+kXxbS19N6-})l^pXxCA@o3Cf#TE0RR2(+{gg&RC#mM8skvHdQq4;{kjK71 zy>ugy&hGmJ$?~UWNNj`*4EkqHuUfu!4oQNpBnhV7Sa#-OfcufCfUyHi_Ul^D2{s7U zzx|)t%9mfiPeumW9W=vi$U;I#DFaDZ$}mH5o^);~bZGrTsC2rA*jv|W7bS}mVb;RZ zK;QHI{q3Xen2v0B(8E&uW;~d78a_{h{-TCOd%{xsyx^D8w^bupOj`OFKud(mQ4NKf zjWX*u5-gLbb=-GzzP%d6)}uLREk2AbbGK-aBTXB%@5`RY`o8(wMCFrjXtt@)weP|& z9&5=~0aA($&`zL<^V6`2hN#{)TO;lmdBaMe&pK?;^>n{0}76#D44ZLHG! zm*&=+yK(OJ?Q;hXmEjufoC14-f9_n*O7CU%eXR8QuDtPwE4X|42hyPK3qRc2xzi6% zXuLHr-tzFS#GnVg!+=*|3ODO)&Nl*iwLx#YiQN9Bya%8A0dmhCYErxyJRtX zvSwbWQ$cdDmSrU6=I2HH)SO2f-|bVS_v^h!PP{LrR~g!MLW|wUSk*@{D;~X;U2Lhf zdV2gTt1-?p&>lwMoJ1lY#4hR{o?*iXR{{|Z`FwrkO^z*CEePEh`_KhNka0jfOc41~ zq@c*`AkR~#@^LJ!LaTN}1)WQmmq7eWd2g4pmO1$EMK|lT0pTCIFzD1E5WXMVLMz&! z_?q%N=-ovlHF#BZLq(ihZxHI4-f74ZLn(n87*6NeG*XZLhBhsrS=NI8Ezjp?SpAw) zZ5Zft5oxlOyTAJGT7X=gYAJc!`nifaXJM_GUB0-dd|rrA=3?LPgHFq%&N!k%#b?uL z3KW(U(#Bl=DR>9kG!mw0PveHGawKsXqGW@BK+3tXgR`g|$%0J<)K|*9iPO^H!d(LV zRirr!L{$aIU%9iVjGDx1Gsh|>E#w&Z#UxvV4@c^t923@330P6% zu|LTc;llxf8bui-OIu}xbliFl8Hqu#MkxObG-HKoQy2w5P9zoBh%`tz9#Q6t-EgEk zXM#pQDsH0 zNVb~A5cEMv$mY8w(#a72*r7{ekl2IQ6cKE#|6v`ZNothUsCS*z!5mc8>9^{t~p`8q6RT|6>=FHxD;Y{D3TIQ@;bn)9h z=P{3Ju-&OvHh?hYNSzT9QdbCsZljCKXXip7S;?sN2o~sNA%f+ht>0nvb9)ac4!Nwk zT&d`+TnR?(OMD)FKM(nAjq&>qiwA*NC|dgOn|@MQGWuWym(%^4UO7h-(Di3i#0#MX zgZG)%O@rM<3@i-Q68BSbS0OezbG4e5%(RRmFldOB;wQNp&&iax5ImFAg&*Ag(1$>@aUSwaf zYjPA;I?5a2qWF-_o0LrKv!0Y*Ek<&N!(xxGBE49uTH^{88doc&KT2a0>r{%2tW+n_ z^N6G$)M?zdzl_+B6Z|a2QXT%FHkMZ{R7c=Rt2ODBx)VCzkn&BHEy&wPuR%C3Vhd4a zK~;ej?cSjg-$^rEqTHoMA=MVu!<$12ni&3s=47pWmmoz-f~J&3YK@7tCqG1Th9|FC z+l>tPgI!u9-7HOHScQkeb0NUhsHO|bg;TC@V8ODSc8eDs*uQW|`w!%+ND@9uQi}E!B4yjX&??6eOnW0pcQafvf-)Wa?gTL-^bO`;lkktcQ<@)#-=UEA4J(#D5Y;;e-d2b)OHO({aINABrR@Q za(^7bPE*MdDn$C;h1luyB55D^O2|xJiNGp?ztben!j!_Mf(H9il zC8NU5K|7{@aqa3yYqw3`0YM}~N3+<5fftv8KQY1bwi>DVNr4Da7R?KNoe)hqPr`1} zw@nXGh@H|s{i-!W#4DiV2$crzH0XAcPi@FYNvlDNpwKAzGWda26iG;eM>DaGxQ`UC zm!>T7{21{Z3sXQG>k-M-;W#M7mrbY@6 zBdtzCp+@lkUL9R#3AcfM;nmEEsD+#(g984K|3#N)6@d;?hU3g}bwrhc7hEQlERYl* zQ4;--Jy$KuDOg`<0@Qh09_Yx>j45qWKnx(1XWQkLW=LzC@QlVN-`&npZxSeDYXOVC(u>l{2r zs^W@ppLV*GQ#WpG7`~zCnpD*duopbNapMN}A3l6I|8vKV?b}I%?2GjVQV}eTGM3S* zMT;-$AWwqf>f|WAJ^IBnSD3s8M%-TH6d4_nwh|(J9U$+aVInjVN`i&3dqH8zh=SmO z5z$c#B?>4j3G%KbyW8?TO0P^l5Yh4vp&ri79;mQ(yZC`)O0AqdoB4TGb3&j(Js5y) z{wc2|2TYQ7x%-WJ=SA@Ej_AW8T+fCG#acZgmf278g5A(HV5#fEySpa1yMs8 z%{f7cUd}j3*wfZotNORDIBPnv%Z~YN-MV$V1BohOLnl{k({Axb4BV~ zFy(4_coEcVR9WHRV1Z&%HCYJR4IFbEG&NC_c}#?^7>R`gU3k_@<4q81ba+52jub3f z5}fe~qSvAn&o{2de^Qh8SXAwk8yVa9QBD5m>8~XI9Q-LQS)Zy+Z(;>MyIO_nX=M9` z8XH*J`Xw96l-e+3Is3Y7jq`Dg4+8usgT`u6&^!w@rc>2Wy~Y$g*`x({PXxrY5kCx< zMpRLaUM!9f&`Un_TR5%444FSRtc4&gO2zj@T+~33icfr+-17+tJuqh+Lue%{jsg&I z$St|}S*5_!Sxa4St!B&lTr@Afy|4nWm&ImOn#%7tkoPDTn|1wqets$s43?5k$TPm~ ztuVASvy?|x(@Mc{muQE>l+>e}6RIOrD3Oj-;(o5w{W-2a=!07jX}}l*L)5ez7v(1) zkCEgwCKzsb4;Uzp4-8Wr2y8s)KuB>@QG1M4q&dY9dk`5wC@QjNWM$wM8t2S%+UbTS z;aM5V%FRGCIkaIV{$sti;J-NwnDi+7TmH_zaA|6Vixr09#{9NcxmaZwZoHIy;k%}^ zr!{ags2g|$&>ytUpW5V23C_Bq=u=Zk0+Tq_V`gf&Ncn;GmT!R$2ZhroRk0YDK!n8s zoT3m)e77MxEh96GtZ#Y5C1#cQzBk1GY}}7ak?Gg1CPyFGU2n4Zv8Y1Gc#)r5vm>9y z9!i*s( zMwCE4Q*a45v5%EFL(l7%0M@j@=a-Ki!~3zHkYLcP5W_I_h#e$``CtP0eBf5Ar zJ>73S`Yi$%^tN>cyn@ltp)yd5xl=7wt2SvgsJ+8VN5n%UU2y?5zQtkbuclydUWGxygNzfP)Q*L zm3;3bjjWpQ5?e0pcS>jWmey(j3YkyYlrDn_iONvsk`8Z~|LXQF^IzZcebsWEQ!6A_ zMbvre8~Jg(o4%XEo?St+w$>=)o0hM)~H&dyXM?2n-({n zyJhnNt7aM2t?m}q7wE^Y80f25(MUwDda6vzUWB$xI7FUgVckoj+O?cTR9f47Gb7Fn z32*SR6A#CsN5IZR64uznj0~#1&O*dMv#J4ng2~FB9CxSmkl)}x^lsOs>rWrN_4%D6 zc`uxuRlZb1=dGWD0*(Z-zP~c*va4v4r&ndVs$Z&V*QxcOf}L?7N=s??gosDLuHe zk8mGCTHNg8ton&#tJj>^*E6SW_nvLr^h9^s*U@og7aPMmB3X0GQmORD&p+EyZNukZ zY_;_p|MI|$zT?Lad{Q94R5TB`5%c7iu-_Bq#h#p-a8&zI}pS0KPCVnP@EclDc zoWh1>XeR1U3Btgh7cWp#U8cp)Lx{73B?zv5zSM=TsP!R69!PjUqE3ua2O97LhXZbP zm=^d4G%o+X?fWj>KXmN&r99&0?bF$2`Ne%UPmm* zDKf<*t?CwPc7$hNOK~n`9;A(2>P|%~|x%%vrz8l--tbt55Fci&jjKN{{X}YAs_+7czPM z{QHaQ@x#L>$Q35=TP)^9@^}n|$L)c2B_OIkF8)!PjmKpu$A-^NN|bBC-U-q6MF?4} zzR0brUHkx@BoA0pq_UPUX_@%UUe9N~^?gRK%@Ut!kI#&QY)FyfERpc6(C=*YeC9ph zXY@2H@tI!uOe^bVd?vw?DlHJ7p)e_pZL#k&zOi9nC{~kaD*>*Yhzf{stw$jo5rntm zX*Z%VvU=f1l0?*qB!^KBft47NNJw_Z`lJ+2O*I!XV&d(TW04+fak#<}1s7pF z3yYVj(H%0srL;Apk~WU*RikO$s^eb=0C2UEZ0enL_xLp!>;Z?AcaAhw!k*9H?~J(| zS(6Xrua7vzPwilFkAkiNC9H@)j(NheCJuu>u!;Yv+`?i)HJrI zp>s{=7AZZq&)DRt`>Nsl0J?~bw=4_cR?s2yI?f?zB;Q=~tz6a%hq(t`xWw*OB+aoo1@8v}+q_3r8%i&?B3WYgRw)_w= z8W~x8f@Ar9LmRF9uxPP7Lds@-cy~Iq+LjohpQWxUd!j9#tZ1E1#He*uLQls7volnR z&^Re68{Pt`74v@pP=a$Ce@7>aD#~<#!~O>MG{(~l)_!T6=Sb+%nU)t-dsYqb7UHn6 z!VpLW{m=@T6fUpJ16(B(E(^p>Q&oEe1#VP_cpw38NUno3tRTste*q2yc|6r=Ew%j5 z6l5jEQ&(g115){wML2F@Z)PN?fY@w69V6TjyE6t(?o7YZGyhz(=uU2@n+xvni!=XN z!{Yb0zq9BL=x6SPLGyYiDc15m<_(x&O&dRGUXSutYmZU&2ThQ|*B8%Qy>RJrR-IYb z7tiOv&R@(wmA<|$;>pFU`E$})TLgGreN{5l8w(ZF zl$nQMhABpYkcBC4)GD0Ul*J6ei`j`ty_0?Y?a59pf-6;iMY(XM@qoyxnKPqKpA9W8 z`I>U@-OrqlO3Whda-ij!QVCg{5$NuL>f9(DZv_fH944^FpfG|+gM2m#sY?#SB^)!@ zA}FMq8HXp>Tj)j!hWEhpUe0g{`?(@^hqfY68NDpjnXJo)iZy3D4kfT@;NN{sUVaQEKvRa9Hw`0SZeLJDc5(LzWdfIxs0 zx}i%^AcQ6@(xekWkS3sjC{0up6{U+JQci|Qv!G&^60g{?d(~^hdIiau^ZTwfv**l& zc<=MPzt8*6YdOg|XJ^maYp=cfT6;6R&AcB43=T}HJT=^UqK1*ce#F7xC zLk0E((x;1I+rkos4A1b?51yKOTi@5kfKkQ}we`f?dY&>4j1mV#owHZpBRq$M=cU5i zjmkqLA6hB}+CI-w+ydPI9QWNWO8d>ij|l7G;O~@qTY@xp{RVou6)()SOYs+o2_Y7xZ!~Uf@p0y_7iT=)n))S`DS09>L}`wh|o8Jaboi)k&866jGJ- z2>w9}1v^4QTVf*m>opTM;F!OIM8$vaed2NC*JKBqs_%)F#x2HDv7FX5N72RCUh1Nf z5DF^Kf~(@E_7R{Npgy3s^0Ws}uzM`9{FaU-JDvz>4?Q2T1ndRfy@n#RT&NPcm-p=x z`Fr=O4~U({7_k!qOKBLIDF%poSYKU=cN}iuZRPFa)kc@!?cMH$na%UGYMlZ}l8>5o zpYMfjwcC6y`rkXS<(Ng+_Z|8wAdZH0H4@#18sj!~@<;Yn=i;ZT!~uJcVV%Y&Hk{rjA&X4oMhB6LdiC zMc0RcLp#3o_S?pREnCE;Z+DBEjQ!q7|3g;;KtSB<#kZ6G;vE2-{=R@S8=UF5Udy~y z4?0IvYX=w}3AQVP+12TUTlC8vXa*g>nSA5gj!b-$N!mZHy9wSjp*L0b2GzyP7oAC6 zlI zjJfVh$^yo+s=*jUha&-wa8=L2P=PBT3a&`F{IYElci}3Ja0RM~cMwxXybDqHE;;uo zsOSL5>L33gL^)8@?VYJ3Ku;jB2Md|NDiLnL8Gx4|7qrz#dBBw)&8wA2agk9SEU=Em z1Fu%Tu@5p)j;*_7#a$7u(ZYvZVP7943?kIdhPMzeu&Zm+;i(ds!OSwwby~?o6Mjk*4a`nEgx_4B|6&UO?&xGU%crn-^c_>K07_}O;4hPe7K9l zd_hlYNwwps^lFJ8ftFAy!tPH!y*7V}bjgNcpP`;@e%d~+tYdg0^hYb};y`7`xIpiU zKp#RGDRHO(L6QQ6KB*QYIfX9>gEsqhbv9QBY7&#=siDe9h1GJUjfF zo_*8mq!|ZR=l34|LZ9D_OK+|Ha1n)2`}OQOqVmz9|9-W&cgr8nd>hpD)}3hsj56Qa zwVwO>4IbF5in zcUG)SOi-2YAZLacbNt_W4N9ML&!&xT*C!XMW(Cjc$5WksMRI=ni*?HpIuDQs*9 zI>!a3RRktg1jbiTc1EYT!1Rj1jSHbhG2_{J6l%iol|{!0i=*#c_cO$#o)H2WoQlUGYG&Jg)8d4CWErIn+W zP8#>7NDht^Nx@NQ2Ob&z{h84>cjz>_@|W5CkH29l|0B+gTex7%ypmfMj4=+Wjrv?S zxIs*>77vTwJ^T0XIg4Jz0Ap4E(M8203z}EHE;_z3d-fZ~%f56`Z|)OM%r(AzqVn() z#e+Or-?{wHrFQ20+DikQ);Hd+T>4jK(xs*552#tnsNg&P_abhB4p~JU(c{*C4$Y?dqFqhpXDR z8$B}TjW^!t=kcf>k8e&n*J*Z@2wB4U6z~IC9kAY*HPDw+#9^s6S)<3 z6Wi13F=UOTC?oXmgUQ`TWT{H$OJyo+8nAW3c&gFBG z7xh~*6&);<4Nz+9YYE8lDKHs5`*$RGcF51;*2VftM#<8Ol?M=}1&Jn>zpufy{X9ZMrhsFnReUvxG zz3JgWj8nXs@ofqUve7u%l1S>tu~UzqzV*Fj?_cy70b_r|EsOe$>7Ui5dxt*aaL-qs zz3J6ie|$9FIB7huBI-EwkEV+U_ZZvnZt|e?2>q;GuvXFpw@W9Qes5T*h{@oUE@2@4 z&yHNVBAINXXPXz;XXof=vk~eUkX@3k&USk8bv2dps`Z-LoNWYkt-eD)Lkur7{Fe3w zB~Vsk9L|{~Lg{*Y61HHAS{|;az%Sa{yM|A?{K1F8$-{U5c>3)3#v3c!_3hWbL+`p3 zc?CCWMUNFXT|0JXS^2hcYnl#u^kKa$xL|5-+x*U*)u@t^mekp-2^RmgXFce(gD(7( zCFCGmxlT#80i+2zI{xX3myB4z3)>ZHwf41vCUN59;G^1e+WVDFwABJ9S4FMT&z?xn z9?0GdrO2F~ bV2Ky-b;ppI{`_0}Jh>|!XybwkX-4+i=18tw*I;o(LEC?Cg%z(}e zmPEe8S}WpL}iMhb#YOT=MP`eLnr?#8$nEI}Y~jF)rmy9x}Az@T}w0E_^cj zWzp!-;P{SL59xP(;cdWA0qEij;HNJ10ww^qrmuh;lZDuSp?!J%+|~yR zaMXV2iAk)m)vZlz33hlQq?ltljT_@OHrA+cI{Ob+FB{4A=Jb2@wYhKIwd9kf0`|+Q zu3a}z&R1KjqbiR!K2bjJxhbQzj~m&m_~CruzAg6mGT@Iw2Fftq%bm!ujflLM%VEAD zmm}SSx`^cTZA8ah7H9=oT`0Yc;KUuhCXd1n!1f}^n+*w!-?iln7b4rZUW)ij6a{}i zf%yMl-+ue9`kFsDRwMwY^?}nran`bN2TX$|O>LTEm%D^TmdENMhK~#)CLy}37pZHr z^=)`5FBQw^BHwh8Bh)z*By+e;^%`ba1wFkQJ9Z$kF|%Fd3^;t@dc6jXO)@r>1{|^s z;`}Jq^O@J1uwKgtk2p=HShDQ?K3&_P9pB~GzY?CQ6TURQ`D*p&bHw10y?XZ>+W&U- z>4h!ZHOts^?9d}aZq4d=?%`*~JU+8U_ihEf+LI(}fj#*a>rYcggnMd(w=jd0>$fGD zBOVAY!u4KS9HRu>)0t8oM?Nz&z^3+QEXdHYzb*3&EJvOXh%)Wl${WPJ>uRYBJM=XU z%ssQ>n}4@ox^ss3^aC+*NlDzSq21=3nD$a&z_MHCO#rm_0b0N3PH>2>f6pN#v}hv0 zX$&OT!W>OkHTsl*iuXdeX?}3$kJVvywS*4;J`O7F35xj9vjx&Ejij4-dmE&i?84xp zQkQfKKZI0fM+a5nq9iY}*;SjI(ukxR8z2R3wIBce@%fA5k5A73i5!8IOFW&f>Cs6Q zFMj&l&z}n4Cx89bOy7(JTy3q{SIWSpUBKqWsY2Yt2+US zVaG=4(Ge8*27ut1NV|Z0ABwH`No`VD?;1^f6MRkkjyg~77~@e_31CH_Pk`c?0th0M z*5;#`BTG`@SgU+vpJ7GN8OBr4=Md&B?nr4_A*LZnbHJD@rm82znP9XrN$gg?#TrAX zknzl7K2coF6I}S0PhfV)&xRR_=miH3eC7{Lp{S-_10^sL1_Uv1HwwULuvgp$zu5v~ z_A|P%Odzr&mTFDKgy3_*rvTvnYCp9bu#Rq)-U`M#s&yS$XJ?sQEhkjTH!h^uR6KkA`{5ysiC;$2IEF!r7;C*u)Pvv zwSJdx!nD9ZG2~_s{2Gr4lE-mVjZ1j44kDi_x5nuV!t&yAp%vsJsK8`m@hGdfc;S2F zH&ql5E*>%fi%LH8&#zxme+edyDJmMHevhZu#rpc<>3-Zr#aqotluwf6jzG1O;^9p; z=^D?<@bpDkeLt@4ZKLOx_2~i*JvNG(1|E)% ztsC1sRvWE9MVFr9u8xGT!$MExF?y!?7eg||=)>p}o{7@l(G(|X93Bb~^ICdLP10l6 zsKJS0DP6LUiF$6-H(PFOHSeuuUx}K=f$Mt|_8&0e(wl#M_`pxMiQ>^SI`-J+MWs67jZVTR41U!}ik2Rqs-=HgIZw{GM#2a=6 zPKjh$7!u9Id03Z-b45_}D1{|7H3ST^K&;EkDkjl|yeLi*%FI-o+-@9DwJ(J-?xvt| zpAjg#7dIy?H(Rz znn37$()jbPb)v?;ri9B4M)2_(z~!+_6PKtN1umBWmo=20=GkWsCh640a-`&E79p9g zu6kKf@$(Oo`;0-nc$PploX>UFt3{FeSa1ZG&j|G~;&*te_XwYq8(ckeUHs0af7{5S z6Cw>Rz~~`-6Gf)LF^N~>e)~}wkfur!8$#~c?JV#TkS~}NWN=IZb6(44F#yt(h7QMMK5>b#cAZ2PiG7Qi=L%WROc}U*NTDSsL>mk!}XSg zHL_}FLW@sFH^zDmG9aEz;9PP{ZW->}C-)uVXx*><;RXvA?zN8)n zn;Rhw8!_K(lY?59cFVh?CK3o0pGo^_p6D z%{9d$rLttd(AJ$kH@MICO&uQHn7-k2lNPlnfZ-ZSxBo!bdJUC@P7OD+q#}>-f+WF1 zrOnWm8yUs{ZFul6@u`Kp%F~3qf>0tdzHfqNy-=^k)hFg-U3=L8u69Zk)YS%D&Hz7p zOobj7$;p2;;-COPudWrA>c~%{uMq1&s7uf0KhlT7AA?KvFc=}AX5qmA(^LWIQZq1i zS*UI)0ep{~q-skI_@r$6)2G8)z#GT5pZdOv7I4?|H9z<`^_h)fMc|%8@t=PlfA(?G z1%%QYeDy|1g1XAhx^VPozXOyb%Ab2mZ;kY6YwK%1aW*$Ab~%Z8e`R^ z^lmh-!J?6|;}FcWH)z@k>PF8Xc*C+ss&r z=A6d}AuENnid&Gql^Wpi1Lry-bHXm!4IqGm_b3#G#{!xCun3VY4Ie}bX_?5$hmYA$ z#T?{)z`s=M0UP6;*vpdybx%|D$jAXtewQLLs5{#t{o5l3xqy}^ju7ZUZ&DI&^Z6g%lTil3e}SN z)v`X_%iZjpU29l&W@y>CR}u}xi^T)tmS;5WaWM>x=(*U$;IrVSQoqokVK!8z=@Hzm z$;?5aS9uevi^`<5)U|l>`tdgC-8FDS$NGqV92a+CGIu62$u{qQRzx(-I3c=^UvkuXBD{h}DDH9(};Y;6Cxrg_$1zDesB zn+Qw}0yR&^22%D+6g=9VXuj|hx*D>d@mj-~A1lwRlsQf@qWdH1q2vK{HiC9L0!&$x z4IEN_lQzBbYpwRk;3MjUk@TDJoD-h?pBQqLrSy&tY-9^gSujoSxc%m(J;x8J5({+RCs@RG&Ys zwyJC@ni}tEuLXZRp$<3p8I=!;SH*+KuQWae&RaqMBVTJgVm$Sb#Tf3!iBk_cu5Fzi zmknamacmsdxW-bYh+ZRtoBX3SgAet<(4@nhpS;Yq9dD6TmqcZTILp*L&f^6$$;v_l z69gIsT~LCo#cWi=Xyqajo$fv{euoD8r|~WntOWQs&w6g2d0vb7XzFZFYV3tG?_5rp zIyLsM_s;whH#hj~jZ31$8_6%dlx(z(T8Mq571BPYph6(Z5yNtwOimw>#O2~bEFMWB zDyDx{aor~Z-cNFXa+m~)cfjRUTrY}@4n@N&UvI9hA788@x5fDFFXO;p#;=+v7DLCP z|504*s)HyRc@GTp^;F{z5tWKE_843s`RX{ zxM5d56!L};;MC%e;>U4e4FOV|f{e&jbav;0joF|ADLp3e9MK`;FolE_wew&XCR#7U zltdb!dhg(YV&=5>297W?UYoS^uF7q{hz^UUoi)-$bn~rCJ1$>q{Hy65Tbdici-;a? zFRj1)vs;aC->J3eAH9u>SW8{1e!)JZDl>JjLu$FWi7Vm6UKl+6P6o-@b0~e~);P%I z#8P7&#D!Dgw$E`Qpc#<`O!1w3ZhJ>b@UR>YY8QImQ4TGlTFtYnzL{hyqDeXBrAf=sV7YuiQb`ip zWfvxiIp#-m%0ErIKp&k&8)p3keSRS+l%&pax>w0Wc3hN-U4wE;U2Uauik8yojUCUG znAx5ZpK<HJ^4D!Yiu8EgKQw*ZwtBeX@%yMzB`BaRLlKYoa|I;5a`=x>XK@J7_^zjLej%Gmjt@!*$gw(-I6u2&BVwpqAlHAr%~#Vyg*q5K@sEXPNSt>mc@s;4k(mBr?c09xe8Z5gb&`$6NL6} zFMQEsZgHNx^Y6e8?LJ|cdGd;keIDW)QMgAzW8HuX0T?8gchqIaxM)&(ESv!WG^_~A zWr7j1`5`E-bKx%7iF*k5iNT)ravpQ{j?E9VEx zL_gyxb%1*N65|-jwggn^ZvwPQ%6+&WC`^H_ScA(==aSe=s3ho|u?82R>Txy5i+c-V ze5vIt;x@+7NsQ}`AFc(X3M|p&Mo2k;SqGuWY4GILMF#_TbWrhy^M~Mp$nac0$~ZWB zmvN&=N1S5C){*FTzg4U-4AB6e?J`Ew|LTokFGb=Y{U7{12u~?GyFz}%K$2%ce$?d} zBU6&QR?CIDv?gdz4(6$6)}S~wu4XPT&0LlVPO>c%vDoy?oJ@6&9)ibf$^WXtn z0F0AAbpoCpjohV3hi2_M0xmV%^=#YM=QABJs5o}!Nknoq3!t#`-=YpR8L7Hr(9L_q z65~7334JU<4KNys4&DzwOc;S=^{fF@@$i@bZG1_3%9)(QiR!L=2ci*2yJ|qf^y-k7 zo;AjSA0kOQw)STX=$07~&sLX1B>HOh-=m9D1Xl{G;5GxUIHiXU(QL~DmrsGyzT~!r z<9m#XD!|~hAVVZGTjNjzyrK(U5u=Q0gY|_y^S!A#1wHB*d1A7BvDE)y~h8P-`gzS!E)&^6PFk8PY|1;e?1TUvzGBPoK9(sFq%UZvsDDvzBE(o%#7C# zLe;uS{nXUEej-itDK;Bew-gF#mc|FDzyS~Pc>!xz1Pc z)*v$rUHdH8V0o%g4MadYo6^8N=~5whkKG`vQ-a@0Me(PB6DAHk0={H{JG6V3{>BGH zca0#WhQZ3IquilKS~o!u-MJ*M%o1`TG$P(ivV(|V1;!|H6A6>f6_|d5N_5|-h=x5&@ zkjLb`yG@TXy>}4((%<1)G3&uq>DtAd^_tv~{1)V%r|PT}hSSon;?n~)y1ENk zfkoVtOlK2)bFg{tXl=gl4)W%mH$KR^o1!%9>WZtraE2Hs-DE}>e|y_N27%GyW8rhg z7!PcsRX2h3X#skqJ1fTPQLJ^rSheZS#Zn~Q@j|6qtH*PC2`Iw3Pe@+lih4M{T&E{j zAdfODmll<&B_iyMthI)|CPF-+{2EerRjbjeGmT9o9IMl5Swb04d0=}$Us!JI z3sy(+ydbVH9cly45{fc-SI<5@L;slXw#Jl_6@t&Ef<+d z1>3Zh2vRgT{G0LXZ^vzQOr2I~cScVcHwfECUe>Gi{6Tg~?)9`zKrM5leCH zNoQmF@vEL}&u0B6@4aU#l495C)1+8p4P?ikz;88`WxC?H^VW5eT?VQ=E=-A%Ea6R~ z1AGet`dC9mcW`iB1D`Hm5wQ`!yT}ZO+~HrZ=00M!l(gA%p_tEBKZiDKE@T?f5{pS& zAErEw?|n(0GH~IR$}J}Pxg1TN8>vMww2~v~Y8?)WLLouZ9BydhynKy>eU)2H8-|?{ z@Ly2NP71DbcD&)z^#>PI}jd2FvF-ylc zow~ur@aKf}{3LjkybjNU>zKG$xlMSnW{3&J^N#R)K;zB$KIYD2;Y@5Y{cQ%p1h!-m9!jLLW@{>+g)i-EUz+(P(|>?le_YJ2$VOUwCIBnHjyfE*kjWvPt01r_}Vz!7JszW1@QRScUjEZKmy ztzQxB4x$srKx`DG6gsu|D$W@5K6& z5cT@oJLu%Wk{GXY2c3hbK(}z@K||qiJF*3>g_=J$P&DffI^3g}NSZCUjEd_!#VG9| zSg-^(34C9HYukp(cw2zleqgjR_CbOhrBiK zpR3|3f|jm*BaGkf*=79o!>7nw7^D^tUi-v7pBONK-ZTD8J#xnrFFwDgRl5ai)QZ;; zWDQ5r&FJG&-DCFZMAR33^zbU<4K6pJEfRobhqkFF#gI@iFST5ew2|U0xk=sWM2=b%Hn1!!OlEo@3;89YqDxGAdQN&_ z`hfJ3^wM7S-wNJrA{L41hQSJuFp&BEu=S8@1kolomr zsDn`#>frAW))AvIGsJIUodI=9>Xg>;%`T@O&;=BHN3s@&7=p95V=^SaB-AF&yh}<{ zLY;)G5;`XIOBk6jEn#uO+JuJ_o=k`utv{Q9ykPS?ZMOaq-sx}PC4hQB2Pu}HNIsj4 zXB8#`n3815zRIQE&s0K6StgFe86R3dXCQkfiBoGfL}n)5u~Y1L#P_dr@BUyMXj{;( ztyhdS_NoGD2UBa+MPm(5jV4E;S{^z5`{`$|?L2PGk+cR!YNr^LI6b|QiT9dk2l(7s zb351zTlLuJ4Y3{i*@gf;L@%-QQbI3<4FT>3`mF(80uABzcc2GH$61sSK(YskF9@-Q zR41>OV1M)t^b(?%LfXi)^qWF24e&y|6E1k{VSUHE=pW>!U%dodq!(f%%TLrfi#@|J z%^;ss3UURr?2fFkpXsUwiW5=_kG9k}mbIbR@>+8zR~Y}weDJQj9zu5JTcxv;uI=6S zu1s+a8ng`&Q|8qUrN3N$q}$P_Pc;lBMy@#84Tc%%&;GA~ISragJyaGws@LbrB4pBm zNa+=-FJ7frBNL>ZDG}QkZyL)tE^Srjp|gC;z_1K*iTf-?kEDqP3(rwv2|keMcnkfs zcKEH{Ad}MA^+x;y34KUf60&n$1KGGvmNUW^Mm7Xq{0D*u)uP~SCq%*X&lzvLaBxKN zz~L%)uG{8Jr~PfCIJN26(MR$&9XTrp#)VIusBbsitsr5QcTT!8>BbV}UNsZDP%W5Fy9zNkn$M=Zh zpuq|-hg^DNUH z+jJu5@TcN}2nqDKIUyk5XCKCefucFylQ{J`cGRvj3uICSJ*BYe3Akwz4%if&6356o z)~1_{JIRA2>x-$#3!x>2zHQB%dO2;iaq9*$6gw<`iP${l-VcyR| z1%6==18__r*bKWpB8tm*Vt5n|FY@e?kYJjPR%E&Pe)XmS13otn#fnj%8~3k?69e=u zTka9x7#&Vfb^`kAsZRlhG*`u>gg_d3uzZ}Q&*+FLD<)GMogTfWZ^3=2^!P;bIOu6; zBS3jwiOz~iMkD-mRKe}Pww-C&8_l~DlZw+Xne{JuP*}C0T?X@O{wAc-u z?pk#7mR%2YuK2;|(4<-W+`=Zqh{AIK{t@8YhmLa$H#;*V-0}p&qg&<)1BTLFQcwU8 zv~O@B^@#E8kD{kBUcFO&I5<(A7yu_VYtA!(lX~djg05w@`&G^^3qbTNKerUl$|=vu zD$G*n9FESao7FrE*l-k_qy1VIZCrE~_s*xTo?(b6)v!VMEg(Y?v~@1>WC^r}T{SC4 z%-;|Z+*^9>$%_^k zeR}uKYT8tc>)N#!cD!roSMDcJ3tVuj9$|7pMAGGrw5({$g|b>invfdHp>s9oaI{)i zZLWeNKy!!>15SjU6eeNv^f^|EW${Tj+hEZ0GV|Rv?BZPEwYT1Rbmhj!)qj4IFts?h zTW-A;In7#&X07g6w&01!@9*}(`v=lGJyvf}`<6XhjU@_LqpsB^a9_eSU3jR{(rix{ z=Dv6=Hd&hxY^;8$u04UhUF(^kd3>MYw`l0<4{}dNmHMzAKB%5h&thHWC2FY(7kR8I z=1`}!Ipy??I=ehpO~;QeF@*@A)0k!I2Gs}c4nrufOUdaH6APT?pri5tr9|P^1z3iO4B0j2HlC4(Y*hj@~0=yM*5o*xt;?+Ref9;tlcsJ5=mpRPM*) zL*K&}o{1ifO;MBGL)oSKd-lRkk)t$+vl}{An4qyTB3u5j{zsQAHI@xv6kE*rlN$2` zIeJY$$K=t|yda!=rk4~z39C~;^{RThpT|N?%L$Lbvt1p38poA&3xA81Wl~FBSXS9+ zJCKq>9b2dZ0lAUflYp*yBaeEU6vS7}Qwgg$JF_9*=%nrB@rjd~j`-*ioMa zUb!!%Z2QLeYVyQpb7#yKQJ;<(B&Gy&Al9ZV&TaK_Ti?)YdJGx3X`r@!*o@@uZ^zV1 zE%b?<8^#>G@!^HnEp67O-;6%3_DoLReY)1=Q}sILb?uzn2*uy8b?DQlQ?2%W`m`rb z-U-p;k-&2tB1bdy+8j9w)HX9uh=H;HN#d8;x_l!KIa7#aoanR4Z9}5?hcg+9G#pn7 z9QC+`&n^y5I@~Cs!D|%56wCB(KD1NFqHm#OuIQ=F>U57qCxWucDEPi6m zHqr26GA=-Ay<>gwi{MwP&-mB!IRjSRi`7hrPu1t8+YmDlB}p~w@lwOFAx_7YEr(sP zdfO$OW|p|6fvUq!Mmo<_2%5{F&gn0mj2*pHc-L*^7(ek>pW5JmzJkl<4gU_XE2W_@E=itig1u zi(k8t@4Ved2rL~FH=>#20b`I)soXEt8_B_dg`I3*CsHYf4n|pQCX!sc%)Cn?$+hKS z*Q!YtKX9T3U&09h@Ah2H zygLcilepcFm>x2=qbz>O&y~iT^!`=NYJ{W7<%(njBLUn^ML{Q}aFWrLT_koqCTc!- zpK)==nCq9!)Joz1yvGP`ZMww>Z4}z-;G(4ucX@Ob0xEV6Zf*E&qc~5~+$mSUiSa{P zL#&x}>n{DG6k3N52>tLW_JnP!CX-h4lkEGOJlgUYF=BQ#Ikd*F*YCRzIkXz%uoG|? z10Q33Eaten()nw$K8QVXc=l)qU433Go6zix zv>))%^@+%fuzU8;EZ z?Y22nJnxA7{K7n|Mu)TlKTiKpD=&*|Q?Er?%$g)+xlTWy0@~OJF3#pqm9r0_9>t%N zh40V6fy2L4!qeO+=?Q8-iF+7NA-@wDr^~#aQ>Q2uO6X#8axLOW^F3|EKA)eV;!fG5 zQh_RPA*VkxKTde|bl21$ef~b{W^Y&^B5*>+cwW%D_{KxKiKPljT*MGdt{qr&zML*K zVtwhp9ABZ&Gnxo4f{Uv%-mmjJyD{MV!S$!G%8^@%$_Yd=qI0^$$3~||=R_Aq4~Q;_ zE{$Fm9YIPiJVa@fQUFkD`QWU8v5FmNl$(;Nb$Q(gync4*gF}olpRYLRJv4pQs_FS1 zJLU(DDr)5>&(p?FzWJ~sQj}%ftJ?%DRsuG_M~($QfrlI^$_|B!72|-@to%wwsaSGO zYL`Tlyb6CzJ*!@IbZQsSZhG7l3Jy;mem5}XeOEh$PvkA$YFJn?VZgU zIMGlx?t3wQD(T)~U9;K^*NpDjd~>t3%w?Y*+UH$)?Ub&qvl{oE)}?jUsiUM@to2;* z9PurHtre*Z;kBUhg>R0nM(x#o%u1`Hle_Ny-eyh6l4doFQkngPXf|5Dad~RA0-6DGP@7&*>78NBaoKfxqVgd8%^w{|s`JxN}7> z7QnbG-w?Si66R8f?s_3S!bFNMj2sY2cfc%*q;C&Kf*d(Q3_^`bkI9KCj2RG95>pzp zEC%0z^O&cQ+#L?`NAh;E<1I3SQz=+)ZctnH9KkA<1f6eTA!W~jUU@B7Wi=}8mX~#3 zgT{=A)7^((-K#;j5uN)>tLQjx4fUh)QTw~9GHD#qp>&u*0Dx^Cl;TW56%?u;)l~0G z!I!Q2NARTQY@T!jVfcT=lfaOe9{vMEs!7;N1JkO)kmxvv8PdYfpE~FbNPct({D`?_ zkv|%;u#S^kG8KYb@<}Z8o7^(efp-{cymw@=nZPm6(F;*$>)bCrwkG+d^xCmxc}bol zeS3|FWHT*_P11_qIJp1xxgkZ@4L80^x#M>K;iCh)djr!}u9)7sUE4O9<2}vu<`ng5 z(b3-u8GPN<_3G2!qv&A%Dv0<&a8y=}IaEygU>wMTx`P*}58@us{kUnOfpZ*dhcu4w z0mZnEnC~ebm%-!W%=uUez&P%QUWhSgyw78W;Oa=ASS4{yF~U;R0Fn8F?J-*UwHc#vGJ~d))zlsHZC0$J>P5lzPRp?@pI+9(|&%t z^(Wt>G&l@(17(~Z%{5IXGOC9<-Gn+F5*mPq?KM3vor9tTfA~|5&o~WvZXED;>wvpG z!<#+8_;CO0#&b_$Db1e+g|$mH_Q%{dWy488*s4o|-4X>!fc{;kjt{Me*@xjHh1nzhPW{H}h*9(!*~VX6nBK_e3>-vs2A`$KqK(d|-T8H1Z|m^b^_> zBKPH!B6puKb{^dH&=dO}d|;n?=9ux`_%la?NykLLw=&)lgP%TT9C+LF!R3p;e0<3u znqCD{Bh$04iYHns&~n?WZxP4oD&BbXhRZ}mt6W{0uEmWN%EvTsS6G0(ksq6i>It*+ zsd-jhv1&QJvsa|9rf@=m7RyE>wS091u%lwlY=acL^DD|`&CahG0KEm zek^MLVDF)*4vYWn*Wbq7yl%GYds(dOJvwK8areWYAK5wn(HmyYAXsCKU7ifs6lths zOR%ytt($w;f&eyLjsmNi#A{xK3RM#1=O}Lqz-^!ENPdq!i|s6*t9|E)u0wN?qISeh!_-n2v=cyk$dv7$gI$gYn2PdS>Sc5vCT6OP}WiU>#0^YIC^Un zZV<2awt0WcBcQraE~eqDQD2vqCaBAr>y=N-Y8){?O#|PY?aJYVi+a?_4g_tlEGx57->SXP~h{8aV;T zLXbAz8GSd~_5c@T9HJIuNbqxGzZw(l;mOe6zwGhsqso8MR-Vzi`M$&Mq$?}_*LsxG zwnG+6LQa?1*o5?ioP@%J0SP4ur3tXQVA&xgo5c6Mr#bW;oR+$dx43U69TL}R`z2bs zr_-9!x}7r0Pn{j|Nbw4nNtK%E4a{7%YG#|ZZQF=MhhYVr4M)@1CzMa&r@*~RNM+_Y zglRb7fj|!2cStig9#N6cN}dbX@Kj7x7AdK?km;gDb?F z0X^iDJMwvm!X0(ogfM*K$QKE~wNs^B*lRcE@?r@TBS^~dwvEqjNM-H5S-~zwnQYG` z2CA=6z<`1Wmw(y1{rt>0yE#`J!Usm>JBbnM=1A_)MO4wxc*Qf-vmF_6jg`TA9lkl8 zQep@P*hwNf8x8RJI}Rs`RQNP{bIR(3j{zYeBa8&3zriDh!+;ChxN~SiigizD+vMcL zaKGhbacSP2DGPVL{KfKrZP<2ct-9X$GjR8T!fS@DU)+D<^@C=V6l~Z!MAZCt!_TYN z8lgQ~e>Zj=Df}fZQM`HektO#(IDPS*;F+QIxH9$?(Nu{>O#s~oNZ_+LrVE*zS7jpS zk3AHi3T`{aXEi@wyz<`3p?zxRwVI3W5^tV9kGq#16$PY2=7Agc@~js=^;#&AmVPVw zFzdHN!B;xbc~$%WK!4F0=XXB8zpggD?*iF#4XDkh_CxtLbZdM+%(D(N4uFnf%_t8z z&)6FAhnqax@D~#+=`Z>tBW?mDx=*Qnncfe?-j!nSd}^_m-Vet2*YfwspT_&skfKxh z34O1r_6ea!fv@wpWX7jFLVr>9y|NfcJ>%)1`jqwjeGsiB>3w5*kH32Kt4KV@H43MY z?w;%Kd4zK;GdRc6l(MdN6f&s5d(;5=Fw~&QX&35|4cM87I}liGaZevyN8<3lqE8dW zP_c<&snxbIIb|Rd%)qE@f1OR2R<-VUNk+(?tc zL2yb7Xn(E{541lV3;QC&1a4x;>DlB%_RL>-ao5hj?pXQPt{s=|Fb>Wx8C|NCjw_id z)WW02ANSlPVqQKfqS3tYx1IMtx@BGO`ybnN4`~g^+wjCge|E?4rJBbAj(~$Q@Sj9T zeDD&?@W|j??ITa6B|=nXEa+xKO3Lk`pedTpwX4_ zk~+Nio*41-bv*-Li=0r+?Uif3du`wtqocw12NRra8PByTQfKyVK%~wCJo`*MvlS{q zwv~5#2Y__ltI^reBl(Am6oF(%v;b)@R184vQ8KcbQ+r8~Z%g<0_}cya`aR>2ZunvH zlwGg>EQ%%$o7^^U%CJdlc2G2%t!DnEEV@gy4o0kgXplHkw3$vzJ7cJ)E#DxRiRz6E zzRNw3LAkFc7jS{@3Ief+r4Ti(gP8>p59Fakjn!+$^A!xWe9RoGT;+t7xrC3oGNkaL z2`Tik6lN2&#zu}M{`BU-G4W_ngXCU)VWVC>u3Nrr?0ql)DvBlypV6lE^y??0ow8^) ze|%-V-;Lj{{yL@B(zVk?t3U627_z3%!&q?(?AJ7`I2Jl(Ph5>rkMu>PCnQ=cW(g!W ziFs~+{M|Swil&brJALNZl9_7u zHe-!(HWa=6@>T?*7ZEP)CKGE&SVj1aJSh6_9;GhSc5sRSxnr^vBe z-n?KO9Dn`noHnzDk5d!32G>nDBD^0?SYVtpLjILouQdvA(pi@N{ex+XExJ9H4tUi z7MO(zRF|O6{>yk}@eez{5)r|1nZI^-8C-F)QN1s6 z^0hH9)!vJB<>B_dWlmDB3f-Wz)G^qE%FPiY%K4q$Mm{ zGaV|T@$nF$7hi@BG#k1W?lOklO?s2!r2XMB@*wX!(Hg^ELH5G;7~1 zH+O8eg5%yUeUbwAuA9`U)26iOli09j!}P22f;UAU z(V7(G{^=PUFK)Kl`F#KIE1(@~2aZ{fY#=QG}=G}U9x)@Z1T za#%g!>n=!31b6<%QAAMjLuOhB&AjJEP*h72+ISg7Q<1-mO473!kPltb0#@(5Oq|Ivc zI91`pujc4+=5Oc$?kGqn6Vze3QhgPI;%46z%A1y*sZeA!^`5U589#kFfl@6d_ZvDC zeI_7!BvJT zH7~t(BB@z=9sUu(l{Sv(z24CLGSkoQYWQFpInTOCMnw{}vqn^}ZDY;sXr0nF7er5& zTgEra%Vt}lt#)yfpwjbwD~Imibf2Ks)=#V$cA)aNnxd%Sy7S^_oN+L(7#*&)i(5iU zQ|c*s-P|{DgE;rO?mstJIxJ7T)Y>@ayRMVbsTCTBt4c>?B-O*-P<;9U-OFA10_cAr zTeQ2*x~sz4;QiG##86X{(VsVqW+@(8`f() ztW`Di1@?#T*Cjh{kqNMjD)Gse>^JOJE{}yUgP1M#K+MK^kiJ?-zisnC;4Z`4GU3<) z6t7@CPHP5MmQyf6C9I1r;QK`>HO};f_!DtgF0uzGH4eY6+q+l1^Mc6R4_DRcXN%ri z^uW%Y58wQjy7+{8^FiZ&K17>uJO?S%PSM1ldxxd!WK$HpW_(I z3!dz7>_`dq$`~50r^T@zL8*)3Ez?yG=U{`UJG=^XRN&%-f=nSvk(mUw z6>%td6j*VUM<-X^^4|14hYqX8fnI|rUu7KBby4)5=jlK0Ja;xYMBO#Cs9WVl&(kMX zA($ahHKKU_$+Xwsq&z+Y(k_?hA2NrF7f9xW!Gz&QzEvNUyEx+xaA8>on(JKXki_R| z72Ay+AAMvLdtNa5ZCBq8wouE>xH6jjKA4vM3j4H=Xp#&KkN%AC69V^HaF>vb-@BH!|XmKm5$ z81h@8y^wdlzW{zIIOl{PS=Elx_ObuIOcE0Y*mg_ zGh?i4bUXX`yOq~OYiq_@t}$`u7-ULJRh}0GHtg%{zuhG!i9_&U5;V2W17qY1v|#>H z{((QH)EXrG1adolVG$LOsgG_sZSV9y<4jV2a)2ELlcbe|SM80tU}(mK5@{j{rX z7{cAkm*%b_xRz+a)f4?+3;9X87M?@lC$YdMxYGY-^gMB@n$ZpZX7pC&ng2SPpfw@c zt(-QYMbI$YH6yJQV|XuK=9Nx?HEQk!65sj!d>($1&8g&?tB#&05TKUWwR12mx>u@> z-l}X3kGAJdwjeY|6NG?-A$;6EC6SEh&J3Z8LhYo0C~Fq-$e^VUX6cF1KBdPHMZ(7_ zC$YK4)sFQm^F%{D+2S4CFM&o&3|5_aYl1!2p1G-OX3d6TcV^`k^EPpg^?qoMg%vrq z4rwsv(}r3z_?2DCi^>uu*<{%E^IDz{v}P`0jXz+`;#aekvd|gKlV>#1E_(Xoa|8l_ z)rA6h!RPFS@Ckh0$HdcMAtAIK5cMqx-D3$)8IWrhp6t<*(%qwd%GUTR$7VQZ_I_kS zL2Iuq!13TF5of$V;8VmJh$cf5LqEvp@foIlk^BKM2({cE?NjEpw#V8o2gw~)VC-3Y ztY6t0YFN$8k~^%y=o8*oOgNZ3Tow8OxEl_hneC(99mKfX-M^AJKH3Gt!w z`lby1^;Mx~OO2pUux4(bi81t-Nw%io`vTZ7HHBHqlcJRi&&01SO~E`*-u)PD@{w7-%W|xJ z`Yb+TN$9W+utUKe&vLY_gGd=_o@~{gc?S-rwcGa0%o||01dS5!eCUqJ(1PddX{N^$ z>ZxK`(QLO6*tY*)8d`R|hrVH6MphRRm$>GhBWlp;V7SER=&1_V8mGF#)p{C#3N=$? z;!0**q|KH0a4faOJ$GoPgRA&PtF@=~@7}3?cH=&yXWl+%kdZ#vSgj`45bd{k1Ah(7 zz9#qTggwpYj$2+Ve8$h-KxL`81Z%m4QR0b*r?4qx(Sa%)jlh*oAzqd1!um#t7B-?K zq85wwQRwlUC>hB==+<;N4Qhsi(zxn{aySl;iklvHOB@OkpNTt#hPhp8M90;QYaZ7r z4mp~Q;G>j|G;;DdZg?TJJ16W}MZl*q1xmOHTrQ>g;LevUY6XoNrz%*YE*tq601w-9 ziBY2;f9PG|xj6Z@1#o#siLF0tYV)>X)J-icP8b)sTFY)b@7TIPdHefs-ty8L0VCu7 z0r55xmx(3?4fk(t*&Zj9bdM;OiO~JPA?FEbl#+^U-9u^<;6~a-J~JRS9u1pBjcH=*8%o~75x(Kggl-kMNHW3&nNPDt|< zIoh6E%5oFxw)WiHpod=xwS(^gYLb35w@=yD{7R^$jDlw9`Pxr2quU^`w=MMV@XWUU z;o#=pM|}c073hwF4w=W1$@3LjsASq=J#aB7q)WMVf z)&2;+udX{8KFJe;e`-Gl=crB8DaLN&SNrtdGQb;v9ex@r1@c3da|9?$xk}llXEbj? zD?pr7`bL@Mk&q>XunbMH-XwtkB@iQrUjT_Lc6Nl`B!RDmZjw`8(xkKr3arzcMMi_ zRZmj;QZ0;%)*l!bWeh1{(b(-HjMwi&1W6sbcTk?N5i_!LifHg*eJi9ia`G(k-AlEL zt|vXjq(3@&CjD(w9;k-0AcGo40r<{gTITi7#8K4i{JFq<>)7;)vy&0I6n zX*6fvDGr5Cqdl`6ZO%;GlV+yVm=flme3Xd5TFJSCL2okq5->M$E%BGJ0XtyM@}itY z%@b{vr>|Ihb88mtmp6y83U-QTZdKk6W0mzg!m9KRpz(w!+rJTWL*M1miDDyZa`8C< z%O(uzI4(!n4hI*;nBAdnre%vxiPB%Q3uE?pf5JSbwXi#s8~TRkag6y8WA0||YtAz( z)F{k-ZLff3QH0*a=-a#x+B41yC5OJ2tFCH)gkGZOJ7C-qx-qSRmGDCCw-iUwH$71aL!>eUxpt2z>ev?;rT|I`h*DbXv&S_?4gN!(8J|rD2#p zY&fLfXI1D2-y-l|>G^1>PUX2rLBIBU|G?)ow_oY6!e4;dvv6WOytggQ-4esXtF)z{ z)WByO{nTgK&U(Zg9f}LDk|jM+pFFuUjW*s~UM2dFF!eoYyo6_tHR^hnv6LQQeLmGV zfX|69v|?Cr7ZRvqo{}Gi#rEr4R-7`6_h$w0GSC{`NUV^%$rd72A6ph8fxIrkEiLInkT*pub$;Boib_1n6@hU zL&#PoO_BE1v{t2`W+qO5OI|Z(2!sBYC(g5eHJv)R`j>sr-&F}$K1TPYj|%58h-UR-gC@C zpDQixJ@@dQo3LzCCR789<)sLH3s?s5$t75@=VezyB2Rx8VC5O6=eE`=cZO%Sy@XP} zX2O;^&#Q#|V4OsRS82E9kiNC5b8l7d{U6T_Tjr7twLPWav+P-X$1xj)#Oj&Sxw$_?vS)KF=_2r}2yxI%6hQwkdl7IVc+@ zZVPM2OjAu&b#l?cAY|w@ z7>Co!yZ#14mu0jG|2?l}jY4_9(MA*a-0bnnLgkPtC2*4e$yCD6Q?@C0hw*K51}TH0 zv6oAHw}Zo3PgPrbCu4Tg6HGc3Ji*xG-O52z>LdOn?JU!iM0Sknqq2NkNRpK2o@Zh1 zVa_rOdvE)DY`SuJrkIbI^AR7h&b{rKl0L7h@a=HwIrhxbE;1n{j$+R2;3)RYk`tRV zQ$)ywd6(#qh>*o0?3wGF57aj~ggG~PiD_=~68``%F(OEe2c%puA2DYoK4s4O7_tOy zK4s6EdY+@6z(37u@+osx7oT$Y^f*EVTW*T+qz76GGCs!Yb+`wXDgIpEDejL){ECbk z?zSt98uofox|5d3b?vCiWd{x$V{qrVOXuR%D-4nbN2CtYr>XC$5tZkPp!PN{e=a0Xh*P)>tT~NMNWJ=d~LNI>tLHy+GF)# zg4L667c$GS25O73t zY_2nN(y0nZ4;3Wldjh-~{KgUhpG){`D?{o(ND0$E;MI(=M%NCn#y)>?v^h8F(B|Ab z#Z>4^;JT;*lbphwkt{27#+^zfEGzdIa~|T}<~%MwXu~LFu{k60ahef)yrGR18$vl2 zEZ*Odwfx)6^{8c{n_RukVI}W@P3*g$O9^ z>ybBA{%P8UG_*7>O zgTRA3N7TmReWE<9Fd?)UaVZpCdtUX`#~Mt1uLmsL`Vv39VoJZW{QOspo+qY-N6Ts- zsgG3|jgv9*%9*VbYK?7R!QoSOPfxRSUa3(tq~43>2#SDAsBgnR*M@(Wh*BPw(#3{9 z`8*1RIrG3=?GHr&s+1!TqsHuFZfIm&YFpzCfH-dUT4{BV9F%y zNZIcmOLj@;Fm{;g9k}F~KV;0CGjDBCpH>VhC%p+Y-y6JQjGz@4(2DN_9LMPI#FtE? zJwk)RPhp#wo+2ZOlVK_Duty`3Sl@=9?L-=D*@+=oXX-QdSc)XZRx`7VB+kd^eFPoB z0X=GJC{+P`v@XvQA9hlF!Wi4Vgm==BWx)4x^K(8nSDCnm3C6s<`KL`jG!I3fmT?IzVtm9{`V~SZx2Jn zvWMW8ytV4+dBU+@oL@krrMBcA4fwm+@Y^%X>;fLk&;bsDt{>6IpTPeVhVE^KZl1U* z3>`}(dY+VC=BawaIzK*T)&SeTZJ!?Z>6d5Juk29n4$o|lX6i+p?{{b()I};8{_vX} zbs9CDaXtctlqZIZb13mfI>PxImd>P(R1@SwTV42f`8J-i1V?}j1;_Zjx-cJSDBBW=PPaxw#!kC(W-9^~dKOf1wU5S)}YRl6VELJ%uc74Ecuf6 zz{J|No>yW`YOGg-#%A&<{wMF()@t@v(t$aa_!y0)bGf}5dX&*kb2RqD8og7D4)2Fe zV>0XKYD4wRB)LeV*{4!w+-Gt5r3~L!CVZpqwb+u*l4GH}At~->iC{{s-Ju4E{X^C{ zyxB)FW+qXeCDmqy9FexFQZ2L-qgOd*+!5*#Ua>t|dYlX3TRzLW4@oL`oa>PVF&S_l zBf8`#`jnkvEZ8$h$zB(`aW}8_3&!wP<;(E%*hV7Klsvr1@Of77^FFt5R?B$M+W##) z%V&(Uc}X_TY~4wEc#90LwuR@wSjKy*@qnDeb1$H#Imr7_uFZ4#W&sIX$aL-;GvM59 z2oAS)ZV5v{@|m=hTf%E$Un{LeS`S6Ri>pUO4++C= zpDpS4bB~5(2=fDbtn`Z&z&DrV*@9;2=OCEqiGV454(&NwTI;H7M22ku zrkw%CBkVb=NuD#jn4UAX6?mPn6==>vn@;VWwNHkTAD)xpYNx~iE>n-8T_ha|x>Yfs zc!#&k)Lw`t%n`E+Y?`pC(5*v-XWKE~hRD{6q0N{w+T4SXk-XQ;=$t2)bErFw7u>Ji0*i-$ns1d|?qqeb&>W~x%3*3q9F zSN{wqjVUS`qkfOwA%92()9E|B=B>)-VLD}vixy&?-YOa;=(LWFeS4=YdN9YbP73Xl zbkZ!+m=QbmB=htB!Oxo~^25)w=~QwHb2M>gb2Pw(V^l?N3c2+oEE8#2ZKPdUCqe2%B^=cS>b z`MLOt$0IIjeoo^P@|-bnuZxHTUB zDSSRU^oQp6eTwIvWPBYoE{48`4bK`elN0$k($1q$jw(AEnzn5avmvt%6+&1YuugHj zclmu|`#thg@I6+E@2|%9aOB}Vely3T1tq=5YVn@@D-@~qQS{aNo?@Clx?90~??ZQF zyoVlaeNQnrAH~q{o?}UfC-^9qWPb1YmcP&A_gQ#8dGdYa$;YY*{z!h`nZNhoeG0$t z#NR&zsb5WIyZLw3c-5%m`K`R$Pcs$|CBrHn3Xf!;;*gN3-gf;p?c(m;< zm3q+#)NME6(Jxq|agyZRc8;#(UsG|5#u8r(Yd?L;fv3NhW0}Jc9Mb9^52zdXe#cnE z>_N{5;}yB{_Sp3E)D#ex4mB~Q+Reb^aqet#7h{eieu&ukDB=gquLQKq_*EJU16AvP6oLC!w1%ujVw%!3X`%6_RiUwJLtF=X51Y}?;qcwMt07^Ib+(@ zeGM(b=N!yh)hxNjbWgtt^NxsR!P>^cQ7OL5epTzeZetf?I&8apM)-cI4Vqd5%%9*a z5S%2O)TyDXLc{?H%W0fX3oH|#>OpuhBc((Gz#C-20mZSaY~j-SW!^H+!8AZSMWfG! zX~5nq$)~!)Z#jfVpD{lFSC(HPU@M}-Fucvjiz)MC} zU?P#*0lu& zoO-5GBXTc(8h?J>_WNJk6F)z3%uPLt&P4s2>~=LkMWqej-n#RTlczm0Wcq`Pz%%V3 zqPCq*9&`i`da-?8!lS~B5%C{qCezFFDd)XT{LyyTaJtBz7wI=AZ_Xx8U}ij3Br#8- z2eEfHhi&pca(AL;)>gz_Mc$eGT^(p^;8(xUUsbb{ueu$;p6qqzg3KmHCbRiNMYyomR+@l z80*xR3C2Pnpz$wu#>h?t6!s0Zl(}WZ!hHjln)G}BAb(|*r+tRCUMfS;t0xR&4%!~dE_`f3TTGF1A+ZA+$r@9gkWeY{2KZF#` zM7-Jy;b$1Z{hY})Vx0<4a0autOrtZOs1<@+Eh8>!4{E>T^z8e$Cv(JG5t$?V>sgr5 z8!0Oj4D_mmqs|60=X&IQETVO4ZSP0mVJQavN5{)0a{_ciV_-~=T+su))Pkf0S`d0T zkDok+3ME!kXdNl>V_HXIGf(Jt+&6dL|5l!u)>j@di@p*%z$rUdPGecjeINze;(m(! ztci~ZKjun*g>B4O*t@7N&MJox+xlQ0=rp$#&KucPtUG$Ea9@SUJ;Z^kas%HPUr)o! zD(GhOYLOW??tsUj5oy0b7N!S__}ww_xZ*7A0GlZ}J;Z(qF8?4d4IT}DkI}siyhZ*5 zwJ>)j`bWf_GP{E_&@VQy^dFkL3jJf^gVXuB=--fAi2myM;B-bF`iDw?8;jn9Pv9W( z<2U?%!LBV5e!z6@b#HOJYyFwYJo4Nlvu>lq`hm2=xtHwH(CWQpZrmx!-pv$zi?q$> zw}1yT`#ohinNiQD?FP)$5y)f#mzX6*-7yCJusN9(i5V?Akvs5G@`V2FU_92ho+G^y zByvcvgzqmGVoYu)Vi7-pbV15V=Yy&UbdH8?d|+@ED0qMrvCaJnZK1mY8I5MHL_=b( z-%WUtHNh^>T+xhl(koiWNg5s5 zW<_(AhK-;_TNU$$I-+#U=uj`_9*#vC(OfEQo6%H zFR^lDIF{4Utd~ivlpNDm={!^naj{{}DmA;Y$tM(!O^5Wu@8>bb6#J#s?%K+gkpmxT zZIrK@Ukab_OQBUV5j_np@mTun53A}#v$>t4yYs_~+{L`g=zQ>&>qayNAES%890h zZ{hDT`ulq;P}x+=>JrYA%x-V)xnre`z3Z;Ly{j=SGke$S)ZSI(H3ogX9!>*11#Vz9 zV07!kN_Di|HQXu9N~F%7ycy8Y3j!T1&F!(!E`PG0u^n2$iR+7&THO8#-tSehIIMxmz+j6MSx3di)WHML*HbS$Yn1OpD2rpX_hg4y*$mO z1pAQou~(zcXy(N-mG`L^BvxcqDj%V&@nZ^QI)&)y)d#$uN zo7Kis7upvOA-4OlMxW4go1Ga)A+ij#l(25nxhd?!yj$AA-pNM$=CIEO$EUClJGfo! z#wREo_%*eXroG0yseSBP=kfe7Cc4YfUemoT_FgVSLi1O&lEyxKf3$0x-<(c<=CBWM zhjw7^ulYzxvgagEw9;ZVl=26OvUBeEZ||5XXN;i)_eCppQTz?0&Hl#Cg3Y0ZHR_Ko z5*dUyK%^?OCXqq6!w1IKxB$>K(G`GRVW3y$KC-w8EhiTT9WPT~a6JIG$bDux<^H_5 zUTt$(VbXsE*U6Z88J@~|9@w>2))@98e097KFJj305vxqr)jiBq&{mw#4tSwG9F)+` zv%l<_dHFYy?8m?&(80Q7Kj!)u+U>bQa4)885;r9OkBRg++!b!d#J0$B#}w?4{IPCN zbGUo9Z0e)u*8}#GQrL&3cl$JUvr?7-``8rrVJEkXU3-kQhlY}`X|F*QCud7I?C>_2 zl_Ipy<9@7ZuNl=AJ3Oluns&`~k$jDPc)PR%yYXVsrsjUEu@7&Dc3?M|N0b3dKCpWt z`KTv^*`h31NpoYc(FK$c?#K9sNd5?!Vakd9jhh8~&p#G(@N&^ejN_M-hdQ+dk)7r& z;=W*_f@$+-`32lT19zPohc6juhug+46ymN`K|8pumX&itf*aAOi`rtgBh{FH>!@BA z9;>P?9gb>aRT`>A<~7ypg2&pCd8-RFZt;t1jy&Z3MGb3%+wOLnYRPL6+}J%%cbWf= zAJz*u7AyPZs7zz#3f{++eLPlnHn>;gVE@m!vMy!s@ETP2d5&Jy~sP+tIyql?2T-v!w}W82LBv; zT(&C0|5p_u)DNfMzVZF(3^;#+kLzdjm!rQcdGU?#0{tD>zbw8#9K_w3XK(ah&;Id% zKb-J;HN3ip{g?TpTj*)@DgsoyTKE*B-??WAb2cMo>Y4~-NmZ- zgSf`w4{GYvxi_ljWV>~+RcO}~RH4oKoy8w2QHscM!UHS1^sGF2lRP3Op3&|}6V6Z6 zfIL2cqtmN!wKe&YvQ$L%pV;wuqv}u}KNs(A{bJQBb^eYWO_$uT@bX~fjn}-f{Ehgl zU}SSsQ|sn<*0nRIU0yJ@1^?%5DNi+~8eXisH zRuC;|Q$ZAAQ>fF4`tPa2&%%7fM%nVAgZ;;M#%u4sJM-7pTX*^^Tj%*JoBdfRSh4}% ze@wh<$cxMWzG#^5>-*gY`!~N8Z`iQG-xp7LOFbKpR?jx8-^BZ#!h+5{f%DQ-jK9pg zv7PbfNvvfCDWgIb&Xj7-lvXtjEiQOgeEHUu1Sr> zzJKo2Uz)K6WAV8LOREa#XD?om|M%$cqFo@jw zdF!RX8w_V>J9LtdriLNgs!;Acl<8q)BRvbK7aOMP#d@!1JD5L6wd#byWGw2WfBQmw z|E3?ux2o$@i8@d%h;O;XSFJf;HT$2p-sWH1+8Hw98E*+{zE8@Qb}J)YNQ4#w+)gWv zJbyQDpd??SnB~NZu|g8cvZbNC7mONdDErl?h^wVP){CmZb8nz)>GM$#Z}f|@SI2)- zv)4DM3*+s#l$9ZVdTm*AW=?C3|A&3|f->Xv_quqqHLLQt!%SGqw>;@3aU#84I&xj3 z(0r;ga5m7rMSSnH_|XkR*28NfMUDeNwID0hvL$9Db~FS#cT`3QcJF)8z{!V z`2WF~+b`S`|L0?m#J}1zdGaUff?qzMX8ipEymwx$M#aBXFE^`=@#|_}JVAEi>9F%B z!T%OXEE;ym?Vx@HchrI0IV*G1;vdLP=#LJ!Wlr->RU0K6@uG`H$*)fY^aRFi^x(c* z1#G&ly%O^GIlv~bJPZ7I{QWex4`F)_+BfKzxyt14bJ0Fuzr@A%S!kcic2B~?%ERBE zhcBRvf1e1;HeHEG&Py&v$w`W}`130f$$1I>Yiswp^MQ@KlY6Fgr4X@$9d38eVQ<#Y z!AQkYu$4k;y(I~5=b<)Hdgk7>FQ9S%2TN*wa1U@7-Y(*HS{@X}to#n+?!vk^xcL+K zjCimNytCjdTQ&{U=iw?)bFO%Q^-U1)OKg#WceIzZaCrj%bHIOm_)oyg9hu3Ig&w0~H z|B=K$wJrVb^yj?w@p+)Xj?uiY&X%*phStltKID#0q5>*mt4n`l@Gx(&X5mabj?#IG z?hlK3h7tIW2|vKVpFsF(oN2`?W$N(Bt%bo~l)y8tKQa|Dq*UA{{G)HGt5L5b^?T%w zT*!(T_#WeaZIp9kcr3qnHt5i+N9=5&`(F0T8vL#pxml3)#k`%t*#dK4r~U+9mwJdI zMMO?^W+x#Eb8>n7bh=IwzR`jg>T;-))R3-|g#OiDZ^GB7YZ;+m^Kz!#6p}aa2nwy{ zrVwLeJY1#3C`*6%y5W6&bR%yH5xc_v_x0FteoWO3l5-__e2(yf@DuZRq3^g}v1`H~ z8thb4tPHv}f!jarV_;m%C%hv-3^e&N1Lt_$rK8gBLFVq1ac<$ifD>_UglR%tefqvh z${|j<|Z-@C55yKWg1GifREroTHV>C?iem zmc6fLymGh~Fw+1dr{OR2A#lF056>VMfQ3}AK63ql&y^vY<=(J2`rpCfUGVoK{@a1)A@;v!;O~?E9Cq+v74hsg@W;q^ zbv{0FpdwQ%4XXt2fl6D)_M8AM$s?*_-%PaE{s`OukA3JC(cR9fTN?`y^A+$9V$KYf*2{<;U=7 zCeSu2 zzu?zlXSE{(%!fv*}HEk?!F2|Ysq;iz;__O>|U#_lf>Rnz{?q8W*BOSSN?7f}ve@$1E zFBaI1fY^LcQmhouU9r9?>Q@)PiYnHdyCoUysNcM~S8|lcc>;N0@`6<)?}k+(em+9{ z{E%unyWu|)USGi%Vl#WspEB#>|Nd3HarIg?$sd2}eGjktdHu@ceiS$Ed;Q~YG8de) z;>bRC&RqIv&$v{5b;PEnM-5waedbTsTsElUzF$8Cp5Qg<@ajNb8k@`LSsA}env({t zW-x=Cq0uUw>6j@7`xfGqd~nm?jwg3S^^==AuEKxv-f_Z_6xV2Y(Jt?KF4Us6&p1i_ z*}>t}@y4&?I=+a6r<=aPE7-H;(I(_kSE()gCW6W;R8d5=4zH&-C0lAz5 zfi|zj6FD!ao4;K1nd;pIXXZ;UXev?De)>Ow`o-$4m2tV+F-Z0LXy7JQeCOX^oOoXR z<<#}}G(ai~HIr8nmqv#KsJ7_ibSAf=nd2CP$+g6cXjw~$(3;dXKhmCaxXPKkFRL7| z7dlwC#;s4|Sgg7axr)BvDw&)6JlupCXC5?mst^4mq+h=|Cl-}|6?dvSAAT&XD!zs$ z`o|Y*TP!=&<3RsVSeK~`Ralo7(YnMLG|4pte68wB_`?1=^+nRp48m>1{~z8?>DPRt z-h)QRS+jPA^tQ%x^CGhv)NLj*t1d4xs{x)WL}tO>yf`oNq5;)7r25-PM5d-AFB;^T ydEhryEHGMVL{Q(L;Kc|0gm?}$AFCR$ACHuxpLQti0ez;T9cpbiSLK2gSN<2w@ct(N literal 0 HcmV?d00001 diff --git a/app/src/main/res/font/roboto_bold.ttf b/app/src/main/res/font/roboto_bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e64db796d1fc0d6f05566dc394fc8640804fcf06 GIT binary patch literal 167336 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

    `L@n3YVYMK9%I*^^KX33%aiLnSjMy%H~v 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 CY@#gy literal 0 HcmV?d00001 diff --git a/app/src/main/res/font/roboto_regular.ttf b/app/src/main/res/font/roboto_regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2d116d920580367caf6a179155f344ede856bf31 GIT binary patch literal 168260 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∾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 TwL*XSfJ*Ay literal 0 HcmV?d00001 diff --git a/app/src/main/res/font/roboto_thin.ttf b/app/src/main/res/font/roboto_thin.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ab68508d14a22d6edd000542bd92275c32a74e5f GIT binary patch literal 168488 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 z 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 z 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/fragment_new_form.xml b/app/src/main/res/layout/fragment_new_form.xml index e99afbb06..97683bac2 100644 --- a/app/src/main/res/layout/fragment_new_form.xml +++ b/app/src/main/res/layout/fragment_new_form.xml @@ -15,7 +15,6 @@ android:padding="@dimen/padding_normal"> - + @@ -18,6 +19,7 @@ style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginStart="@dimen/_15sdp" asteriskRequired="@{form.required}" hintText="@{form.title}" app:layout_constraintEnd_toEndOf="parent" @@ -31,12 +33,36 @@ android:drawableEnd="@drawable/ic_calendar" android:focusable="false" android:singleLine="true" + android:paddingLeft="@dimen/_20sdp" android:text="@{form.value}" android:textAppearance="@style/TextAppearance.Material3.BodyLarge" /> - + + + + + diff --git a/app/src/main/res/layout/rv_item_form_dropdown_v2.xml b/app/src/main/res/layout/rv_item_form_dropdown_v2.xml index 0ab50b2bf..316327f98 100644 --- a/app/src/main/res/layout/rv_item_form_dropdown_v2.xml +++ b/app/src/main/res/layout/rv_item_form_dropdown_v2.xml @@ -4,6 +4,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> + @@ -20,6 +21,7 @@ style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginStart="@dimen/_15sdp" asteriskRequired="@{form.required}" hintText="@{form.title}" android:labelFor="@id/actv_rv_dropdown" @@ -33,6 +35,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="none" + android:paddingLeft="@dimen/_20sdp" android:text="@{form.value}" app:listItems="@{form.entries}" tools:ignore="SpeakableTextPresentCheck" /> @@ -40,6 +43,29 @@ + + + + + - + + + + diff --git a/app/src/main/res/layout/rv_item_form_edit_text_v2.xml b/app/src/main/res/layout/rv_item_form_edit_text_v2.xml index 34413a03d..4432c570a 100644 --- a/app/src/main/res/layout/rv_item_form_edit_text_v2.xml +++ b/app/src/main/res/layout/rv_item_form_edit_text_v2.xml @@ -4,6 +4,7 @@ xmlns:tools="http://schemas.android.com/tools"> + @@ -31,6 +32,7 @@ style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginStart="@dimen/_15sdp" asteriskRequired="@{form.required}" hintText="@{form.title}" app:endIconMode="custom" @@ -45,6 +47,7 @@ android:layout_height="wrap_content" android:imeOptions="actionDone" android:hint="" + android:paddingLeft="@dimen/_20sdp" android:inputType="@{form.etInputType}" android:maxLength="@{form.etMaxLength}" android:singleLine="true" @@ -54,6 +57,30 @@ + + + + + diff --git a/app/src/main/res/layout/rv_item_form_radio_v2.xml b/app/src/main/res/layout/rv_item_form_radio_v2.xml index b2d02d5c7..55ecfa89f 100644 --- a/app/src/main/res/layout/rv_item_form_radio_v2.xml +++ b/app/src/main/res/layout/rv_item_form_radio_v2.xml @@ -42,6 +42,7 @@ android:layout_height="wrap_content" android:paddingVertical="@dimen/padding_small" android:text="@{form.title}" + android:layout_marginStart="@dimen/_15sdp" android:textAppearance="@style/TextAppearance.Material3.BodyLarge" app:required="@{!form.required}" app:layout_constraintEnd_toStartOf="@id/tv_nullable_hr" @@ -59,6 +60,7 @@ app:layout_constraintStart_toEndOf="@id/tv_title_hr" app:layout_constraintTop_toTopOf="@id/cl_text_hr" android:paddingStart="@dimen/padding_small" + android:text="@{(form.doubleStar? @string/radio_title_ds(form.title) : @string/radio_title(form.title))}" android:textAppearance="@style/TextAppearance.AppCompat.Medium" app:required="@{form.required}" /> @@ -113,6 +115,7 @@ android:paddingVertical="@dimen/padding_small" android:text="@{form.title}" android:maxWidth="300dp" + android:layout_marginStart="@dimen/_15sdp" android:textAppearance="@style/TextAppearance.Material3.BodyLarge" app:layout_constraintEnd_toStartOf="@id/tv_nullable_hr" app:layout_constraintStart_toStartOf="parent" @@ -150,6 +153,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" + android:layout_marginStart="@dimen/_15sdp" android:backgroundTint="@{form.enabled ? @color/read_only : @color/md_theme_light_onPrimary}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toBottomOf="@id/tv_title"> diff --git a/app/src/main/res/layout/rv_item_form_text_view_v2.xml b/app/src/main/res/layout/rv_item_form_text_view_v2.xml index 9cd862d65..36bef49a3 100644 --- a/app/src/main/res/layout/rv_item_form_text_view_v2.xml +++ b/app/src/main/res/layout/rv_item_form_text_view_v2.xml @@ -4,6 +4,7 @@ xmlns:tools="http://schemas.android.com/tools"> + @@ -19,6 +20,7 @@ style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginStart="@dimen/_15sdp" asteriskRequired="@{form.required}" hintText="@{form.title}" android:labelFor="@id/et" @@ -35,12 +37,38 @@ android:focusable="false" android:inputType="none" android:singleLine="true" + android:paddingLeft="@dimen/_20sdp" android:text="@{form.value}" android:textAppearance="@style/TextAppearance.Material3.BodyLarge" tools:text="Woo hoo" /> + + + + + + diff --git a/app/src/main/res/layout/rv_item_form_timepicker_v2.xml b/app/src/main/res/layout/rv_item_form_timepicker_v2.xml index 633ca7997..19edaa022 100644 --- a/app/src/main/res/layout/rv_item_form_timepicker_v2.xml +++ b/app/src/main/res/layout/rv_item_form_timepicker_v2.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> + @@ -18,6 +19,7 @@ style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginStart="@dimen/_15sdp" asteriskRequired="@{form.required}" hintText="@{form.title}" app:layout_constraintEnd_toEndOf="parent" @@ -30,13 +32,39 @@ android:layout_height="match_parent" android:drawableEnd="@drawable/ic_clock" android:focusable="false" + android:paddingLeft="@dimen/_20sdp" android:singleLine="true" android:text="@{form.value}" android:textAppearance="@style/TextAppearance.Material3.BodyLarge" /> - + + + + + + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index e2a4c118d..8b4e0aa56 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -83,4 +83,20 @@ ?attr/colorPrimary ?attr/colorOnPrimary + + + + \ No newline at end of file diff --git a/local.properties b/local.properties index 783d9f839..71f9c3693 100644 --- a/local.properties +++ b/local.properties @@ -4,4 +4,5 @@ # Location of the SDK. This is only used by Gradle. # For customization when using a Version Control System, please read the # header note. -sdk.dir=C\:\\Users\\Tyagi\\AppData\\Local\\Android\\Sdk +#Thu Sep 12 16:36:22 IST 2024 +sdk.dir=C\:\\Users\\nikhil_a\\AppData\\Local\\Android\\Sdk diff --git a/secrets.properties b/secrets.properties index 114411f26..42e4a60e1 100644 --- a/secrets.properties +++ b/secrets.properties @@ -1,3 +1,14 @@ -ENCRYPTED_PASS_KEY="" -ABHA_CLIENT_ID="" -ABHA_CLIENT_SECRET="" +#ENCRYPTED_PASS_KEY="" +#ABHA_CLIENT_ID="" +#ABHA_CLIENT_SECRET="" + +ENCRYPTED_PASS_KEY="Piramal12Piramal" + +#Staging +ABHA_CLIENT_ID="PIRSWASTH_953256" +ABHA_CLIENT_SECRET="c3631213-60ea-4a10-8e30-43523d3e0253" + +#Production +#ABHA_CLIENT_ID="PSMRI_001" +#ABHA_CLIENT_SECRET="a1fbc194-e7b9-45b1-b991-3bd4beead78d" + From fb4713909a4a2e2040a578ba1139f598a279be08 Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Mon, 11 Nov 2024 13:35:26 +0530 Subject: [PATCH 084/892] Eligibility Couple Registration UI Icon Changes and Base URL change --- app/build.gradle | 3 +- .../EligibleCoupleRegistrationDataset.kt | 73 ++++++++++-- .../res/drawable/ic__reproductive_age.xml | 4 +- .../drawable/ic_age_of_women_at_marriage.xml | 9 ++ app/src/main/res/drawable/ic_bank_acc_no.xml | 9 ++ app/src/main/res/drawable/ic_bank_name.xml | 9 ++ app/src/main/res/drawable/ic_bmi.xml | 10 ++ app/src/main/res/drawable/ic_branch_name.xml | 30 +++++ app/src/main/res/drawable/ic_female.xml | 13 +++ .../drawable/ic_gap_bet_marriage_child.xml | 27 +++++ app/src/main/res/drawable/ic_husbund.xml | 106 ++++++++++++++++++ app/src/main/res/drawable/ic_ifsc_code.xml | 37 ++++++ app/src/main/res/drawable/ic_male.xml | 13 +++ .../main/res/drawable/ic_no_of_child_sex.xml | 9 ++ .../main/res/drawable/ic_no_of_live_child.xml | 9 ++ app/src/main/res/drawable/ic_rch_id_no.xml | 41 +++++++ .../res/drawable/ic_total_no_child_born.xml | 23 ++++ app/src/main/res/drawable/ic_women.xml | 15 +++ 18 files changed, 427 insertions(+), 13 deletions(-) create mode 100644 app/src/main/res/drawable/ic_age_of_women_at_marriage.xml create mode 100644 app/src/main/res/drawable/ic_bank_acc_no.xml create mode 100644 app/src/main/res/drawable/ic_bank_name.xml create mode 100644 app/src/main/res/drawable/ic_bmi.xml create mode 100644 app/src/main/res/drawable/ic_branch_name.xml create mode 100644 app/src/main/res/drawable/ic_female.xml create mode 100644 app/src/main/res/drawable/ic_gap_bet_marriage_child.xml create mode 100644 app/src/main/res/drawable/ic_husbund.xml create mode 100644 app/src/main/res/drawable/ic_ifsc_code.xml create mode 100644 app/src/main/res/drawable/ic_male.xml create mode 100644 app/src/main/res/drawable/ic_no_of_child_sex.xml create mode 100644 app/src/main/res/drawable/ic_no_of_live_child.xml create mode 100644 app/src/main/res/drawable/ic_rch_id_no.xml create mode 100644 app/src/main/res/drawable/ic_total_no_child_born.xml create mode 100644 app/src/main/res/drawable/ic_women.xml diff --git a/app/build.gradle b/app/build.gradle index d6ff4ee43..a928cc83f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -73,7 +73,8 @@ android { production { applicationId "org.piramalswasthya.sakhi" // TMC Server Production API Base URL - buildConfigField "String", "BASE_TMC_URL", "\"https://assamtmc.piramalswasthya.org/\"" + buildConfigField "String", "BASE_TMC_URL", "\"https://uatamrit.piramalswasthya.org/\"" + // ABHA v3 Production Base URL buildConfigField "String", "BASE_ABHA_URL", "\"https://healthid.abdm.gov.in/api/\"" } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleRegistrationDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleRegistrationDataset.kt index 79398c8ae..76b858a51 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleRegistrationDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/EligibleCoupleRegistrationDataset.kt @@ -63,7 +63,10 @@ class EligibleCoupleRegistrationDataset(context: Context, language: Languages) : required = true, max = System.currentTimeMillis(), min = 0L, - hasDependants = true + hasDependants = true, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_anc_date, + showDrawable = true ) private val rchId = FormElement( @@ -76,7 +79,10 @@ class EligibleCoupleRegistrationDataset(context: Context, language: Languages) : isMobileNumber = true, etMaxLength = 12, max = 999999999999L, - min = 0L + min = 0L, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_rch_id_no, + showDrawable = true ) private val name = FormElement( @@ -88,7 +94,10 @@ class EligibleCoupleRegistrationDataset(context: Context, language: Languages) : allCaps = true, hasSpeechToText = false, etInputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, - isEnabled = false + isEnabled = false, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_women, + showDrawable = true ) private val husbandName = FormElement( @@ -100,7 +109,10 @@ class EligibleCoupleRegistrationDataset(context: Context, language: Languages) : allCaps = true, hasSpeechToText = false, etInputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, - isEnabled = false + isEnabled = false, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_husbund, + showDrawable = true ) private val age = FormElement( @@ -113,6 +125,9 @@ class EligibleCoupleRegistrationDataset(context: Context, language: Languages) : etMaxLength = 2, max = Konstants.maxAgeForGenBen.toLong(), min = Konstants.minAgeForGenBen.toLong(), + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic__reproductive_age, + showDrawable = true ) private val ageAtMarriage = FormElement( @@ -125,7 +140,10 @@ class EligibleCoupleRegistrationDataset(context: Context, language: Languages) : etMaxLength = 2, max = Konstants.maxAgeForGenBen.toLong(), min = Konstants.minAgeForGenBen.toLong(), - isEnabled = false + isEnabled = false, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_age_of_women_at_marriage, + showDrawable = true ) private val womanDetails = FormElement( @@ -159,7 +177,10 @@ class EligibleCoupleRegistrationDataset(context: Context, language: Languages) : isMobileNumber = true, etMaxLength = 20, max = 999999999999999999L, - min = 10000000L + min = 10000000L, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_bank_acc_no, + showDrawable = true ) private val bankName = FormElement( @@ -168,7 +189,10 @@ class EligibleCoupleRegistrationDataset(context: Context, language: Languages) : title = resources.getString(R.string.ecrdset_bank_name), arrayId = -1, required = false, - etMaxLength = 50 + etMaxLength = 50, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_bank_name, + showDrawable = true ) private val branchName = FormElement( @@ -177,7 +201,10 @@ class EligibleCoupleRegistrationDataset(context: Context, language: Languages) : title = resources.getString(R.string.ecrdset_branch_name), arrayId = -1, required = false, - etMaxLength = 50 + etMaxLength = 50, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_branch_name, + showDrawable = true ) private val ifsc = FormElement( @@ -187,6 +214,9 @@ class EligibleCoupleRegistrationDataset(context: Context, language: Languages) : arrayId = -1, required = false, etMaxLength = 11, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_ifsc_code, + showDrawable = true ) private val noOfChildren = FormElement( @@ -199,6 +229,9 @@ class EligibleCoupleRegistrationDataset(context: Context, language: Languages) : etMaxLength = 1, max = 9, min = 0, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_total_no_child_born, + showDrawable = true ) private val noOfLiveChildren = FormElement( @@ -210,7 +243,10 @@ class EligibleCoupleRegistrationDataset(context: Context, language: Languages) : etInputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_VARIATION_NORMAL, etMaxLength = 1, max = 9, - min = 0 + min = 0, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_no_of_live_child, + showDrawable = true ) private val numMale = FormElement( @@ -223,6 +259,9 @@ class EligibleCoupleRegistrationDataset(context: Context, language: Languages) : etMaxLength = 1, max = 9, min = 0, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_male, + showDrawable = true ) private val numFemale = FormElement( @@ -235,6 +274,10 @@ class EligibleCoupleRegistrationDataset(context: Context, language: Languages) : etMaxLength = 1, max = 9, min = 0, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_female, + showDrawable = true + ) private val firstChildDetails = FormElement( @@ -242,7 +285,8 @@ class EligibleCoupleRegistrationDataset(context: Context, language: Languages) : inputType = HEADLINE, title = resources.getString(R.string.ecrdset_dls_1_child), arrayId = -1, - required = false + required = false, + ) private val dob1 = FormElement( @@ -254,6 +298,9 @@ class EligibleCoupleRegistrationDataset(context: Context, language: Languages) : hasDependants = true, max = getMaxDobMillis(), min = getMinDobMillis(), + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_anc_date, + showDrawable = true ) private val age1 = FormElement( @@ -267,6 +314,9 @@ class EligibleCoupleRegistrationDataset(context: Context, language: Languages) : etMaxLength = 2, max = Konstants.maxAgeForAdolescent.toLong(), min = 0, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_no_of_live_child, + showDrawable = true ) private val gender1 = FormElement( @@ -289,6 +339,9 @@ class EligibleCoupleRegistrationDataset(context: Context, language: Languages) : etMaxLength = 2, max = 99, min = 0, + backgroundDrawable=R.drawable.ic_bg_circular, + iconDrawableRes=R.drawable.ic_gap_bet_marriage_child, + showDrawable = true ) private val secondChildDetails = FormElement( diff --git a/app/src/main/res/drawable/ic__reproductive_age.xml b/app/src/main/res/drawable/ic__reproductive_age.xml index af8c636e6..b26248080 100644 --- a/app/src/main/res/drawable/ic__reproductive_age.xml +++ b/app/src/main/res/drawable/ic__reproductive_age.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_bank_acc_no.xml b/app/src/main/res/drawable/ic_bank_acc_no.xml new file mode 100644 index 000000000..83cf67b43 --- /dev/null +++ b/app/src/main/res/drawable/ic_bank_acc_no.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bank_name.xml b/app/src/main/res/drawable/ic_bank_name.xml new file mode 100644 index 000000000..b8e7fdd5e --- /dev/null +++ b/app/src/main/res/drawable/ic_bank_name.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bmi.xml b/app/src/main/res/drawable/ic_bmi.xml new file mode 100644 index 000000000..2b831d39d --- /dev/null +++ b/app/src/main/res/drawable/ic_bmi.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/ic_branch_name.xml b/app/src/main/res/drawable/ic_branch_name.xml new file mode 100644 index 000000000..97ddfb906 --- /dev/null +++ b/app/src/main/res/drawable/ic_branch_name.xml @@ -0,0 +1,30 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_female.xml b/app/src/main/res/drawable/ic_female.xml new file mode 100644 index 000000000..891fc858e --- /dev/null +++ b/app/src/main/res/drawable/ic_female.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/ic_gap_bet_marriage_child.xml b/app/src/main/res/drawable/ic_gap_bet_marriage_child.xml new file mode 100644 index 000000000..754200252 --- /dev/null +++ b/app/src/main/res/drawable/ic_gap_bet_marriage_child.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_husbund.xml b/app/src/main/res/drawable/ic_husbund.xml new file mode 100644 index 000000000..49b16ad22 --- /dev/null +++ b/app/src/main/res/drawable/ic_husbund.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_ifsc_code.xml b/app/src/main/res/drawable/ic_ifsc_code.xml new file mode 100644 index 000000000..ca9040d1d --- /dev/null +++ b/app/src/main/res/drawable/ic_ifsc_code.xml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_male.xml b/app/src/main/res/drawable/ic_male.xml new file mode 100644 index 000000000..feb8806ec --- /dev/null +++ b/app/src/main/res/drawable/ic_male.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/ic_no_of_child_sex.xml b/app/src/main/res/drawable/ic_no_of_child_sex.xml new file mode 100644 index 000000000..577c1fdf7 --- /dev/null +++ b/app/src/main/res/drawable/ic_no_of_child_sex.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_no_of_live_child.xml b/app/src/main/res/drawable/ic_no_of_live_child.xml new file mode 100644 index 000000000..b001f6860 --- /dev/null +++ b/app/src/main/res/drawable/ic_no_of_live_child.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_rch_id_no.xml b/app/src/main/res/drawable/ic_rch_id_no.xml new file mode 100644 index 000000000..8dc93fd3c --- /dev/null +++ b/app/src/main/res/drawable/ic_rch_id_no.xml @@ -0,0 +1,41 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_total_no_child_born.xml b/app/src/main/res/drawable/ic_total_no_child_born.xml new file mode 100644 index 000000000..f17ea43b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_total_no_child_born.xml @@ -0,0 +1,23 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_women.xml b/app/src/main/res/drawable/ic_women.xml new file mode 100644 index 000000000..f198e7a0f --- /dev/null +++ b/app/src/main/res/drawable/ic_women.xml @@ -0,0 +1,15 @@ + + + + + From 97ea163581c16c6142d4dca5ada908acb58ff50b Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Mon, 11 Nov 2024 13:53:42 +0530 Subject: [PATCH 085/892] Eligibility Couple Registration UI Icon Changes and Base URL change --- app/google-services.json | 37 ++++++++++++++----------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/app/google-services.json b/app/google-services.json index 4bb35d694..c28e3af0b 100644 --- a/app/google-services.json +++ b/app/google-services.json @@ -1,45 +1,36 @@ { "project_info": { - "project_number": "904378085373", - "project_id": "saksham-assam", - "storage_bucket": "saksham-assam.appspot.com" + "project_number": "##", + "project_id": "##", + "storage_bucket": "##" }, "client": [ { "client_info": { - "mobilesdk_app_id": "1:904378085373:android:12b5e159aafe40543f3394", + "mobilesdk_app_id": "##", "android_client_info": { "package_name": "org.piramalswasthya.sakhi" } }, - "oauth_client": [], - "api_key": [ + "oauth_client": [ { - "current_key": "AIzaSyCLl34y0YsHdh7ueHjfozVe1VguekUYUR8" + "client_id": "##", + "client_type": 3 } ], - "services": { - "appinvite_service": { - "other_platform_oauth_client": [] - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:904378085373:android:4cc1633bcf1d2b543f3394", - "android_client_info": { - "package_name": "org.piramalswasthya.sakhi.staging" - } - }, - "oauth_client": [], "api_key": [ { - "current_key": "AIzaSyCLl34y0YsHdh7ueHjfozVe1VguekUYUR8" + "current_key": "##" } ], "services": { "appinvite_service": { - "other_platform_oauth_client": [] + "other_platform_oauth_client": [ + { + "client_id": "##", + "client_type": 3 + } + ] } } } From 163a1d2b81d82d75ac82c6ebf08458fa6257b770 Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Mon, 11 Nov 2024 14:03:26 +0530 Subject: [PATCH 086/892] Eligibility Couple Registration UI Icon Changes and Base URL change --- secrets.properties | 8 -------- 1 file changed, 8 deletions(-) diff --git a/secrets.properties b/secrets.properties index 42e4a60e1..6c9746b65 100644 --- a/secrets.properties +++ b/secrets.properties @@ -2,13 +2,5 @@ #ABHA_CLIENT_ID="" #ABHA_CLIENT_SECRET="" -ENCRYPTED_PASS_KEY="Piramal12Piramal" -#Staging -ABHA_CLIENT_ID="PIRSWASTH_953256" -ABHA_CLIENT_SECRET="c3631213-60ea-4a10-8e30-43523d3e0253" - -#Production -#ABHA_CLIENT_ID="PSMRI_001" -#ABHA_CLIENT_SECRET="a1fbc194-e7b9-45b1-b991-3bd4beead78d" From 479b835747539b450b5e35996eaef73751378e60 Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Mon, 11 Nov 2024 18:56:30 +0530 Subject: [PATCH 087/892] Added icons for Fundal Height Blood test pulse rate --- .../PregnantWomanAncVisitDataset.kt | 6 ++-- app/src/main/res/drawable/ic_blood_test.xml | 15 ++++++++ .../main/res/drawable/ic_fundal_height.xml | 36 +++++++++++++++++++ app/src/main/res/drawable/ic_pulse_rate.xml | 12 +++++++ 4 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/drawable/ic_blood_test.xml create mode 100644 app/src/main/res/drawable/ic_fundal_height.xml create mode 100644 app/src/main/res/drawable/ic_pulse_rate.xml diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt index 478f2703c..6c64adb84 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt @@ -156,7 +156,7 @@ class PregnantWomanAncVisitDataset( required = false, showDrawable = true, backgroundDrawable=R.drawable.ic_bg_circular, - iconDrawableRes=R.drawable.ic_bmi, + iconDrawableRes=R.drawable.ic_pulse_rate, ) private val hb = FormElement( @@ -170,7 +170,7 @@ class PregnantWomanAncVisitDataset( required = false, showDrawable = true, backgroundDrawable=R.drawable.ic_bg_circular, - iconDrawableRes=R.drawable.ic_bmi, + iconDrawableRes=R.drawable.ic_blood_test, ) private val fundalHeight = FormElement( @@ -184,7 +184,7 @@ class PregnantWomanAncVisitDataset( required = false, showDrawable = true, backgroundDrawable=R.drawable.ic_bg_circular, - iconDrawableRes=R.drawable.ic_bmi, + iconDrawableRes=R.drawable.ic_fundal_height, ) private val urineAlbumin = FormElement( id = 14, diff --git a/app/src/main/res/drawable/ic_blood_test.xml b/app/src/main/res/drawable/ic_blood_test.xml new file mode 100644 index 000000000..0c8b7d657 --- /dev/null +++ b/app/src/main/res/drawable/ic_blood_test.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_fundal_height.xml b/app/src/main/res/drawable/ic_fundal_height.xml new file mode 100644 index 000000000..c283aa938 --- /dev/null +++ b/app/src/main/res/drawable/ic_fundal_height.xml @@ -0,0 +1,36 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_pulse_rate.xml b/app/src/main/res/drawable/ic_pulse_rate.xml new file mode 100644 index 000000000..6f5c0e0f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_pulse_rate.xml @@ -0,0 +1,12 @@ + + + + From 9a6ccdcc4f6024536eb8644d8057df82cb47d529 Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Wed, 13 Nov 2024 09:59:10 +0530 Subject: [PATCH 088/892] Added Seperate Adapter and layout to remove conflicr --- .gitignore | 2 + app/build.gradle | 5 +- .../sakhi/adapters/FormInputAdapter.kt | 6 - .../adapters/FormInputAdapterWithBgIcon.kt | 827 ++++++++++++++++++ .../sakhi/model/FormElement.kt | 4 +- .../EligibleCoupleRegFragment.kt | 8 +- .../form/PwAncFormFragment.kt | 8 +- .../res/layout/rv_item_form_datepicker_v2.xml | 24 - .../rv_item_form_datepicker_with_bg_icon.xml | 66 ++ .../res/layout/rv_item_form_dropdown_v2.xml | 46 - .../rv_item_form_dropdown_with_bg_icon.xml | 118 +++ .../res/layout/rv_item_form_edit_text_v2.xml | 9 +- .../rv_item_form_edit_text_with_bg_icon.xml | 84 ++ .../rv_item_form_image_view_with_bg_icon.xml | 76 ++ .../main/res/layout/rv_item_form_radio_v2.xml | 4 - .../rv_item_form_radio_with_bg_icon.xml | 167 ++++ .../res/layout/rv_item_form_text_view_v2.xml | 26 - .../rv_item_form_text_view_with_bg_icon.xml | 71 ++ .../res/layout/rv_item_form_timepicker_v2.xml | 23 - .../rv_item_form_timepicker_with_bg_icon.xml | 66 ++ 20 files changed, 1494 insertions(+), 146 deletions(-) create mode 100644 app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapterWithBgIcon.kt create mode 100644 app/src/main/res/layout/rv_item_form_datepicker_with_bg_icon.xml create mode 100644 app/src/main/res/layout/rv_item_form_dropdown_with_bg_icon.xml create mode 100644 app/src/main/res/layout/rv_item_form_edit_text_with_bg_icon.xml create mode 100644 app/src/main/res/layout/rv_item_form_image_view_with_bg_icon.xml create mode 100644 app/src/main/res/layout/rv_item_form_radio_with_bg_icon.xml create mode 100644 app/src/main/res/layout/rv_item_form_text_view_with_bg_icon.xml create mode 100644 app/src/main/res/layout/rv_item_form_timepicker_with_bg_icon.xml diff --git a/.gitignore b/.gitignore index 754ddaff4..57f8c338a 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ *.lock /app/build/* /app/release/* +**/google-services.json +/app/src/staging/google-services.json diff --git a/app/build.gradle b/app/build.gradle index a928cc83f..d7851de35 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,7 +64,8 @@ android { applicationId "org.piramalswasthya.sakhi" resValue "string", "app_native_name", "উৎপ্ৰেৰণা-Uat" // TMC Server Staging API Base URL - buildConfigField "String", "BASE_TMC_URL", "\"https://amritdemo.piramalswasthya.org/\"" + buildConfigField "String", "BASE_TMC_URL", "\"https://uatamrit.piramalswasthya.org/\"" + // ABHA v1/v2 Staging Base URL buildConfigField "String", "BASE_ABHA_URL", "\"https://healthidsbx.abdm.gov.in/api/\"" // ABHA v3 Staging Base URL @@ -73,7 +74,7 @@ android { production { applicationId "org.piramalswasthya.sakhi" // TMC Server Production API Base URL - buildConfigField "String", "BASE_TMC_URL", "\"https://uatamrit.piramalswasthya.org/\"" + buildConfigField "String", "BASE_TMC_URL", "\"https://assamtmc.piramalswasthya.org/\"" // ABHA v3 Production Base URL buildConfigField "String", "BASE_ABHA_URL", "\"https://healthid.abdm.gov.in/api/\"" diff --git a/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapter.kt b/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapter.kt index b25936f1e..75ca20717 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapter.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapter.kt @@ -297,13 +297,7 @@ class FormInputAdapter( } if (!isEnabled) { binding.tilRvDropdown.visibility = View.GONE - binding.ivIconBg.visibility = View.GONE - binding.ivIconTemperature.visibility = View.GONE - binding.tilEditText.visibility = View.VISIBLE - binding.ivIconBg1.visibility = View.VISIBLE - binding.ivIconTemperature1.visibility = View.VISIBLE - binding.et.isFocusable = false binding.et.isClickable = false binding.executePendingBindings() diff --git a/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapterWithBgIcon.kt b/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapterWithBgIcon.kt new file mode 100644 index 000000000..e12b89ab6 --- /dev/null +++ b/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapterWithBgIcon.kt @@ -0,0 +1,827 @@ +package org.piramalswasthya.sakhi.adapters + +import android.app.DatePickerDialog +import android.app.TimePickerDialog +import android.content.Context.INPUT_METHOD_SERVICE +import android.content.res.ColorStateList +import android.content.res.Resources +import android.graphics.Color +import android.os.Build +import android.text.Editable +import android.text.Spannable +import android.text.SpannableString +import android.text.TextWatcher +import android.text.style.ForegroundColorSpan +import android.view.Gravity +import android.view.KeyEvent +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.inputmethod.InputMethodManager +import android.widget.CheckBox +import android.widget.LinearLayout +import android.widget.RadioButton +import android.widget.RadioGroup +import androidx.appcompat.content.res.AppCompatResources +import androidx.core.view.children +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView.ViewHolder +import org.piramalswasthya.sakhi.R +import org.piramalswasthya.sakhi.databinding.RvItemFormAgePickerViewV2Binding +import org.piramalswasthya.sakhi.databinding.RvItemFormCheckV2Binding +import org.piramalswasthya.sakhi.databinding.RvItemFormDatepickerWithBgIconBinding +import org.piramalswasthya.sakhi.databinding.RvItemFormDropdownWithBgIconBinding +import org.piramalswasthya.sakhi.databinding.RvItemFormEditTextWithBgIconBinding +import org.piramalswasthya.sakhi.databinding.RvItemFormHeadlineV2Binding +import org.piramalswasthya.sakhi.databinding.RvItemFormImageViewV2Binding +import org.piramalswasthya.sakhi.databinding.RvItemFormImageViewWithBgIconBinding +import org.piramalswasthya.sakhi.databinding.RvItemFormRadioWithBgIconBinding +import org.piramalswasthya.sakhi.databinding.RvItemFormTextViewWithBgIconBinding +import org.piramalswasthya.sakhi.databinding.RvItemFormTimepickerWithBgIconBinding +import org.piramalswasthya.sakhi.helpers.Konstants +import org.piramalswasthya.sakhi.helpers.getDateString +import org.piramalswasthya.sakhi.model.AgeUnitDTO +import org.piramalswasthya.sakhi.model.FormElement +import org.piramalswasthya.sakhi.model.InputType.AGE_PICKER +import org.piramalswasthya.sakhi.model.InputType.CHECKBOXES +import org.piramalswasthya.sakhi.model.InputType.DATE_PICKER +import org.piramalswasthya.sakhi.model.InputType.DROPDOWN +import org.piramalswasthya.sakhi.model.InputType.EDIT_TEXT +import org.piramalswasthya.sakhi.model.InputType.HEADLINE +import org.piramalswasthya.sakhi.model.InputType.IMAGE_VIEW +import org.piramalswasthya.sakhi.model.InputType.RADIO +import org.piramalswasthya.sakhi.model.InputType.TEXT_VIEW +import org.piramalswasthya.sakhi.model.InputType.TIME_PICKER +import org.piramalswasthya.sakhi.model.InputType.values +import org.piramalswasthya.sakhi.ui.home_activity.all_ben.new_ben_registration.AgePickerDialog +import org.piramalswasthya.sakhi.utils.HelperUtil.getAgeStrFromAgeUnit +import org.piramalswasthya.sakhi.utils.HelperUtil.getDobFromAge +import org.piramalswasthya.sakhi.utils.HelperUtil.getLongFromDate +import org.piramalswasthya.sakhi.utils.HelperUtil.updateAgeDTO +import timber.log.Timber +import java.util.Calendar + +class FormInputAdapterWithBgIcon ( + private val imageClickListener: ImageClickListener? = null, + private val ageClickListener: AgeClickListener? = null, + private val formValueListener: FormValueListener? = null, + private val isEnabled: Boolean = true +) : ListAdapter(FormInputDiffCallBack) { + + + object FormInputDiffCallBack : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: FormElement, newItem: FormElement) = + oldItem.id == newItem.id + + override fun areContentsTheSame(oldItem: FormElement, newItem: FormElement): Boolean { + Timber.d("${oldItem.id} ${oldItem.errorText} ${newItem.errorText}") + return oldItem.errorText == newItem.errorText + } + } + + + class EditTextInputViewHolder private constructor(private val binding: RvItemFormEditTextWithBgIconBinding) : + ViewHolder(binding.root) { + companion object { + fun from(parent: ViewGroup): ViewHolder { + val layoutInflater = LayoutInflater.from(parent.context) + val binding = RvItemFormEditTextWithBgIconBinding.inflate(layoutInflater, parent, false) + return EditTextInputViewHolder(binding) + } + } + + fun bind(item: FormElement, isEnabled: Boolean, formValueListener: FormValueListener?) { + Timber.d("binding triggered!!! $isEnabled ${item.id}") + if (!isEnabled) { + binding.et.isClickable = false + binding.et.isFocusable = false + handleHintLength(item) + binding.form = item + binding.et.setText(item.value) + binding.executePendingBindings() + return + } else { + binding.et.isClickable = true + binding.et.isFocusable = true + } + binding.form = item + if (item.errorText == null) binding.tilEditText.isErrorEnabled = false + Timber.d("Bound EditText item ${item.title} with ${item.required}") + binding.tilEditText.error = item.errorText + handleHintLength(item) + if (item.hasSpeechToText) { + binding.tilEditText.endIconDrawable = + AppCompatResources.getDrawable(binding.root.context, R.drawable.ic_mic) + binding.tilEditText.setEndIconOnClickListener { + formValueListener?.onValueChanged(item, Konstants.micClickIndex) + } + } else { + binding.tilEditText.endIconDrawable = null + binding.tilEditText.setEndIconOnClickListener(null) + } + + + val textWatcher = object : TextWatcher { + override fun beforeTextChanged( + s: CharSequence?, start: Int, count: Int, after: Int + ) { + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + } + + override fun afterTextChanged(editable: Editable?) { + + item.value = editable?.toString() + Timber.d("editable : $editable Current value : ${item.value} isNull: ${item.value == null} isEmpty: ${item.value == ""}") + formValueListener?.onValueChanged(item, -1) + if (item.errorText != binding.tilEditText.error) { + binding.tilEditText.isErrorEnabled = item.errorText != null + binding.tilEditText.error = item.errorText + } + + } + } + binding.et.setOnFocusChangeListener { _, hasFocus -> + if (hasFocus) binding.et.addTextChangedListener(textWatcher) + else { + binding.et.removeTextChangedListener(textWatcher) + val imm = + binding.root.context.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager? + imm!!.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0) + } + } + binding.et.setOnKeyListener(View.OnKeyListener { v, keyCode, event -> + if (keyCode == KeyEvent.KEYCODE_ENTER && (event.action == KeyEvent.ACTION_UP || event.action == KeyEvent.ACTION_DOWN)) { + return@OnKeyListener true + } + false + }) + + binding.executePendingBindings() + } + + private fun handleHintLength(item: FormElement) { + if (item.title.length > Konstants.editTextHintLimit) { + binding.tvHint.visibility = View.VISIBLE + binding.et.hint = null + binding.tilEditText.hint = null + binding.tilEditText.isHintEnabled = false + } else { + binding.tvHint.visibility = View.GONE + binding.tilEditText.isHintEnabled = true + } + } + } + + class DropDownInputViewHolder private constructor(private val binding: RvItemFormDropdownWithBgIconBinding) : + ViewHolder(binding.root) { + companion object { + fun from(parent: ViewGroup): ViewHolder { + val layoutInflater = LayoutInflater.from(parent.context) + val binding = RvItemFormDropdownWithBgIconBinding.inflate(layoutInflater, parent, false) + return DropDownInputViewHolder(binding) + } + } + + fun bind(item: FormElement, isEnabled: Boolean, formValueListener: FormValueListener?) { + binding.form = item + if (item.errorText == null) { + binding.tilRvDropdown.error = null + binding.tilRvDropdown.isErrorEnabled = false + } + if (!isEnabled) { + binding.tilRvDropdown.visibility = View.GONE +// binding.ivIconBg.visibility = View.GONE +// binding.ivIconTemperature.visibility = View.GONE + + binding.tilEditText.visibility = View.VISIBLE + binding.ivIconBg1.visibility = View.VISIBLE + binding.ivIconTemperature1.visibility = View.VISIBLE + + binding.et.isFocusable = false + binding.et.isClickable = false + binding.executePendingBindings() + return + } + + binding.actvRvDropdown.setOnItemClickListener { _, _, index, _ -> + item.value = item.entries?.get(index) + Timber.d("Item DD : $item") + formValueListener?.onValueChanged(item, index) + binding.tilRvDropdown.isErrorEnabled = item.errorText != null + binding.tilRvDropdown.error = item.errorText + } + + item.errorText?.let { binding.tilRvDropdown.error = it } + binding.executePendingBindings() + + } + } + + class RadioInputViewHolder private constructor(private val binding: RvItemFormRadioWithBgIconBinding) : + ViewHolder(binding.root) { + companion object { + fun from(parent: ViewGroup): ViewHolder { + val layoutInflater = LayoutInflater.from(parent.context) + val binding = RvItemFormRadioWithBgIconBinding.inflate(layoutInflater, parent, false) + return RadioInputViewHolder(binding) + } + } + + fun bind( + item: FormElement, isEnabled: Boolean, formValueListener: FormValueListener? + ) { + if (!isEnabled) { + binding.rg.isClickable = false + binding.rg.isFocusable = false + } + binding.invalidateAll() + binding.form = item + + binding.rg.removeAllViews() + + binding.rg.apply { + item.entries?.let { items -> + orientation = item.orientation ?: LinearLayout.HORIZONTAL + weightSum = items.size.toFloat() + items.forEach { + val rdBtn = RadioButton(this.context) + rdBtn.layoutParams = RadioGroup.LayoutParams( + RadioGroup.LayoutParams.WRAP_CONTENT, + RadioGroup.LayoutParams.WRAP_CONTENT, + 1.0F + ).apply { + gravity = Gravity.CENTER_HORIZONTAL + } + rdBtn.id = View.generateViewId() + val colorStateList = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + ColorStateList( + arrayOf( + intArrayOf(-android.R.attr.state_checked), + intArrayOf(android.R.attr.state_checked) + ), intArrayOf( + binding.root.resources.getColor( + android.R.color.darker_gray, + binding.root.context.theme + ), // disabled + binding.root.resources.getColor( + android.R.color.darker_gray, + binding.root.context.theme + ) // enabled + ) + ) + } else { + ColorStateList( + arrayOf( + intArrayOf(-android.R.attr.state_checked), + intArrayOf(android.R.attr.state_checked) + ), intArrayOf( + binding.root.resources.getColor( + android.R.color.darker_gray, + ), // disabled + binding.root.resources.getColor( + android.R.color.darker_gray, + ) // enabled + ) + ) + } + + if (!isEnabled) rdBtn.buttonTintList = colorStateList + rdBtn.text = it + addView(rdBtn) + if (item.value == it) rdBtn.isChecked = true + rdBtn.setOnCheckedChangeListener { _, b -> + if (b) { + item.value = it + if (item.hasDependants || item.hasAlertError) { + Timber.d( + "listener trigger : ${item.id} ${ + item.entries!!.indexOf( + it + ) + } $it" + ) + formValueListener?.onValueChanged( + item, item.entries!!.indexOf(it) + ) + } + } + item.errorText = null + binding.llContent.setBackgroundResource(0) + } + } + } + } + + if (!isEnabled) { + binding.rg.children.forEach { + it.isClickable = false + } + } + if (item.errorText != null) binding.llContent.setBackgroundResource(R.drawable.state_errored) + else binding.llContent.setBackgroundResource(0) + + binding.executePendingBindings() + val str = binding.tvNullable.text + val spannableString = SpannableString(str) + + val colorSpan = ForegroundColorSpan(Color.parseColor("#B00020")) + + if (item.required && item.doubleStar) { + spannableString.setSpan( + colorSpan, + str.length - 2, + str.length, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ) + binding.tvNullable.text = spannableString + binding.tvNullableHr.text = spannableString + } else if (item.required) { + spannableString.setSpan( + colorSpan, + str.length - 1, + str.length, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ) + binding.tvNullableHr.text = spannableString + binding.tvNullable.text = spannableString + } + + } + } + + class CheckBoxesInputViewHolder private constructor(private val binding: RvItemFormCheckV2Binding) : + ViewHolder(binding.root) { + companion object { + fun from(parent: ViewGroup): ViewHolder { + val layoutInflater = LayoutInflater.from(parent.context) + val binding = RvItemFormCheckV2Binding.inflate(layoutInflater, parent, false) + return CheckBoxesInputViewHolder(binding) + } + } + + fun bind( + item: FormElement, isEnabled: Boolean, formValueListener: FormValueListener? + ) { + binding.form = item + + if (item.errorText != null) binding.clRi.setBackgroundResource(R.drawable.state_errored) + else binding.clRi.setBackgroundResource(0) + binding.llChecks.removeAllViews() + binding.llChecks.apply { + item.entries?.let { items -> + orientation = item.orientation ?: LinearLayout.VERTICAL + weightSum = items.size.toFloat() + items.forEachIndexed { index, it -> + val cbx = CheckBox(this.context) + cbx.layoutParams = RadioGroup.LayoutParams( + RadioGroup.LayoutParams.MATCH_PARENT, + RadioGroup.LayoutParams.WRAP_CONTENT, + 1.0F + ) + if (!isEnabled) { + cbx.isClickable = false + cbx.isFocusable = false + } + cbx.id = View.generateViewId() + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) cbx.setTextAppearance( + context, android.R.style.TextAppearance_Material_Medium + ) + else cbx.setTextAppearance(android.R.style.TextAppearance_Material_Subhead) + cbx.text = it + addView(cbx) + if (item.value?.contains(it) == true) cbx.isChecked = true + cbx.setOnCheckedChangeListener { _, b -> + if (b) { + if (item.value != null) item.value = item.value + it + else item.value = it + if (item.hasDependants || item.hasAlertError) { + Timber.d( + "listener trigger : ${item.id} ${ + item.entries!!.indexOf( + it + ) + } $it" + ) + } + } else { + if (item.value?.contains(it) == true) { + item.value = item.value?.replace(it, "") + } + } + formValueListener?.onValueChanged( + item, index * (if (b) 1 else -1) + ) + if (item.value.isNullOrBlank()) { + item.value = null + } else { + Timber.d("Called here!") + item.errorText = null + binding.clRi.setBackgroundResource(0) + } + Timber.d("Checkbox value : ${item.value}") + + } + } + } + } + binding.executePendingBindings() + + } + } + + class DatePickerInputViewHolder private constructor(private val binding: RvItemFormDatepickerWithBgIconBinding) : + ViewHolder(binding.root) { + companion object { + fun from(parent: ViewGroup): ViewHolder { + val layoutInflater = LayoutInflater.from(parent.context) + val binding = RvItemFormDatepickerWithBgIconBinding.inflate(layoutInflater, parent, false) + return DatePickerInputViewHolder(binding) + } + } + + fun bind( + item: FormElement, isEnabled: Boolean, formValueListener: FormValueListener? + ) { + binding.form = item + binding.invalidateAll() + if (!isEnabled) { + binding.et.isFocusable = false + binding.et.isClickable = false + binding.executePendingBindings() + return + } + val today = Calendar.getInstance() + var thisYear = today.get(Calendar.YEAR) + var thisMonth = today.get(Calendar.MONTH) + var thisDay = today.get(Calendar.DAY_OF_MONTH) + + item.errorText?.also { binding.tilEditText.error = it } + ?: run { binding.tilEditText.error = null } + binding.et.setOnClickListener { + item.value?.let { value -> + thisYear = value.substring(6).toInt() + thisMonth = value.substring(3, 5).trim().toInt() - 1 + thisDay = value.substring(0, 2).trim().toInt() + } + val datePickerDialog = DatePickerDialog( + it.context, { _, year, month, day -> + val millis = Calendar.getInstance().apply { + set(Calendar.YEAR, year) + set(Calendar.MONTH, month) + set(Calendar.DAY_OF_MONTH, day) + }.timeInMillis + if (item.min != null && millis < item.min!!) { + item.value = getDateString(item.min) + } else if (item.max != null && millis > item.max!!) + item.value = getDateString(item.max) + else + item.value = getDateString(millis) +// "${if (day > 9) day else "0$day"}-${if (month > 8) month + 1 else "0${month + 1}"}-$year" + binding.invalidateAll() + if (item.hasDependants) formValueListener?.onValueChanged(item, -1) + }, thisYear, thisMonth, thisDay + ) + item.errorText = null + binding.tilEditText.error = null + datePickerDialog.datePicker.maxDate = item.max ?: 0 + datePickerDialog.datePicker.minDate = item.min ?: 0 + if (item.showYearFirstInDatePicker) + datePickerDialog.datePicker.touchables[0].performClick() + datePickerDialog.show() + } + binding.executePendingBindings() + + } + } + + class TimePickerInputViewHolder private constructor(private val binding: RvItemFormTimepickerWithBgIconBinding) : + ViewHolder(binding.root) { + companion object { + fun from(parent: ViewGroup): ViewHolder { + val layoutInflater = LayoutInflater.from(parent.context) + val binding = RvItemFormTimepickerWithBgIconBinding.inflate(layoutInflater, parent, false) + return TimePickerInputViewHolder(binding) + } + } + + fun bind( + item: FormElement, isEnabled: Boolean + ) { + binding.form = item + binding.et.isEnabled = isEnabled + binding.et.setOnClickListener { + val hour: Int + val minute: Int + if (item.value == null) { + val currentTime = Calendar.getInstance() + hour = currentTime.get(Calendar.HOUR_OF_DAY) + minute = currentTime.get(Calendar.MINUTE) + } else { + hour = item.value!!.substringBefore(":").toInt() + minute = item.value!!.substringAfter(":").toInt() + Timber.d("Time picker hour min : $hour $minute") + } + val mTimePicker = TimePickerDialog(it.context, { _, hourOfDay, minuteOfHour -> + item.value = "$hourOfDay:$minuteOfHour" + binding.invalidateAll() + + }, hour, minute, false) + mTimePicker.setTitle("Select Time") + mTimePicker.show() + } + binding.executePendingBindings() + + } + } + + class TextViewInputViewHolder private constructor(private val binding: RvItemFormTextViewWithBgIconBinding) : + ViewHolder(binding.root) { + companion object { + fun from(parent: ViewGroup): ViewHolder { + val layoutInflater = LayoutInflater.from(parent.context) + val binding = RvItemFormTextViewWithBgIconBinding.inflate(layoutInflater, parent, false) + return TextViewInputViewHolder(binding) + } + } + + fun bind(item: FormElement) { + binding.form = item + binding.executePendingBindings() + } + } + + class ImageViewInputViewHolder private constructor(private val binding: RvItemFormImageViewWithBgIconBinding) : + ViewHolder(binding.root) { + companion object { + fun from(parent: ViewGroup): ViewHolder { + val layoutInflater = LayoutInflater.from(parent.context) + val binding = RvItemFormImageViewWithBgIconBinding.inflate(layoutInflater, parent, false) + return ImageViewInputViewHolder(binding) + } + } + + fun bind( + item: FormElement, clickListener: ImageClickListener?, isEnabled: Boolean + ) { + binding.form = item + if (isEnabled) { + binding.clickListener = clickListener + if (item.errorText != null) binding.clRi.setBackgroundResource(R.drawable.state_errored) + else binding.clRi.setBackgroundResource(0) + } + binding.executePendingBindings() + + } + } + + class AgePickerViewInputViewHolder private constructor(private val binding: RvItemFormAgePickerViewV2Binding) : + ViewHolder(binding.root) { + companion object { + fun from(parent: ViewGroup): ViewHolder { + val layoutInflater = LayoutInflater.from(parent.context) + val binding = + RvItemFormAgePickerViewV2Binding.inflate(layoutInflater, parent, false) + return AgePickerViewInputViewHolder(binding) + } + } + + fun bind( + item: FormElement, isEnabled: Boolean, formValueListener: FormValueListener? + ) { + binding.form = item + binding.invalidateAll() + val agePicker = AgePickerDialog(binding.root.context) + + val calDob = Calendar.getInstance() + val ageUnitDTO = AgeUnitDTO(0, 0, 0) + val isOk = true + item.value?.let { + calDob.timeInMillis = getLongFromDate(it) + updateAgeDTO(ageUnitDTO, calDob) + binding.etNum.setText(getAgeStrFromAgeUnit(ageUnitDTO)) + + } + + if (isEnabled) { + binding.etNum.setOnClickListener { + val calNow = Calendar.getInstance() + val calMin = Calendar.getInstance() + val calMax = Calendar.getInstance() + item.min?.let { + calMin.timeInMillis = it + } + item.max?.let { + calMax.timeInMillis = it + } + + agePicker.setLimitsAndShow( + calNow.get(Calendar.YEAR) - calMax.get(Calendar.YEAR), + calNow.get(Calendar.YEAR) - calMin.get(Calendar.YEAR), + 0, + 11, + 0, + 30, + ageUnitDTO, + isOk + ) + } + agePicker.setOnDismissListener { + binding.etNum.setText(getAgeStrFromAgeUnit(ageUnitDTO)) + calDob.timeInMillis = + getDobFromAge(ageUnitDTO) + binding.etDate.setText(getDateString(calDob.timeInMillis)) + item.value = getDateString(calDob.timeInMillis) + if (item.hasDependants) formValueListener?.onValueChanged(item, -1) + } + } + + + if (!isEnabled) { + binding.etDate.isFocusable = false + binding.etNum.isFocusable = false + binding.etDate.isClickable = false + binding.etNum.isClickable = false + binding.executePendingBindings() + return + } + val today = Calendar.getInstance() + var thisYear = today.get(Calendar.YEAR) + var thisMonth = today.get(Calendar.MONTH) + var thisDay = today.get(Calendar.DAY_OF_MONTH) + + item.errorText?.also { binding.tilEditTextDate.error = it } + ?: run { binding.tilEditTextDate.error = null } + binding.etDate.setOnClickListener { + item.value?.let { value -> + thisYear = value.substring(6).toInt() + thisMonth = value.substring(3, 5).trim().toInt() - 1 + thisDay = value.substring(0, 2).trim().toInt() + } + val datePickerDialog = DatePickerDialog( + it.context, { _, year, month, day -> + val millisCal = Calendar.getInstance().apply { + set(Calendar.YEAR, year) + set(Calendar.MONTH, month) + set(Calendar.DAY_OF_MONTH, day) + } + val millis = millisCal.timeInMillis + if (item.min != null && millis < item.min!!) { + item.value = getDateString(item.min) + } else if (item.max != null && millis > item.max!!) + item.value = getDateString(item.max) + else + item.value = getDateString(millis) + + updateAgeDTO(ageUnitDTO, millisCal) + binding.etNum.setText(getAgeStrFromAgeUnit(ageUnitDTO)) + binding.invalidateAll() + if (item.hasDependants) formValueListener?.onValueChanged(item, -1) + }, thisYear, thisMonth, thisDay + ) + item.errorText = null + binding.tilEditTextDate.error = null + datePickerDialog.datePicker.maxDate = item.max ?: 0 + datePickerDialog.datePicker.minDate = item.min ?: 0 + if (item.showYearFirstInDatePicker) + datePickerDialog.datePicker.touchables[0].performClick() + datePickerDialog.show() + } + binding.executePendingBindings() + + } + + } + + class HeadlineViewHolder private constructor(private val binding: RvItemFormHeadlineV2Binding) : + ViewHolder(binding.root) { + companion object { + fun from(parent: ViewGroup): ViewHolder { + val layoutInflater = LayoutInflater.from(parent.context) + val binding = RvItemFormHeadlineV2Binding.inflate(layoutInflater, parent, false) + return HeadlineViewHolder(binding) + } + } + + fun bind( + item: FormElement, + formValueListener: FormValueListener?, + ) { + binding.form = item + if (item.subtitle == null) + binding.textView8.visibility = View.GONE + formValueListener?.onValueChanged(item, -1) + binding.executePendingBindings() + + } + } + + class ImageClickListener(private val imageClick: (formId: Int) -> Unit) { + + fun onImageClick(form: FormElement) = imageClick(form.id) + + } + + class AgeClickListener(private val ageClick: (formId: Int) -> Unit) { + + fun onAgeClick(form: FormElement) = ageClick(form.id) + + } + + class FormValueListener(private val valueChanged: (id: Int, value: Int) -> Unit) { + + fun onValueChanged(form: FormElement, index: Int) { + valueChanged(form.id, index) + + } + + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val inputTypes = values() + return when (inputTypes[viewType]) { + EDIT_TEXT -> EditTextInputViewHolder.from(parent) + DROPDOWN -> DropDownInputViewHolder.from(parent) + RADIO -> RadioInputViewHolder.from(parent) + DATE_PICKER -> DatePickerInputViewHolder.from(parent) + TEXT_VIEW -> TextViewInputViewHolder.from(parent) + IMAGE_VIEW -> ImageViewInputViewHolder.from(parent) + CHECKBOXES -> CheckBoxesInputViewHolder.from(parent) + TIME_PICKER -> TimePickerInputViewHolder.from(parent) + HEADLINE -> HeadlineViewHolder.from(parent) + AGE_PICKER -> AgePickerViewInputViewHolder.from(parent) + } + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val item = getItem(position) + val isEnabled = if (isEnabled) item.isEnabled else false + when (item.inputType) { + EDIT_TEXT -> (holder as EditTextInputViewHolder).bind( + item, isEnabled, formValueListener + ) + + DROPDOWN -> (holder as DropDownInputViewHolder).bind(item, isEnabled, formValueListener) + RADIO -> (holder as RadioInputViewHolder).bind(item, isEnabled, formValueListener) + DATE_PICKER -> (holder as DatePickerInputViewHolder).bind( + item, isEnabled, formValueListener + ) + + TEXT_VIEW -> (holder as TextViewInputViewHolder).bind(item) + IMAGE_VIEW -> (holder as ImageViewInputViewHolder).bind( + item, imageClickListener, isEnabled + ) + + CHECKBOXES -> (holder as CheckBoxesInputViewHolder).bind( + item, + isEnabled, + formValueListener + ) + + TIME_PICKER -> (holder as TimePickerInputViewHolder).bind(item, isEnabled) + HEADLINE -> (holder as HeadlineViewHolder).bind(item, formValueListener) + AGE_PICKER -> (holder as AgePickerViewInputViewHolder).bind( + item, + isEnabled, + formValueListener + ) + } + } + + override fun getItemViewType(position: Int) = getItem(position).inputType.ordinal + + /** + * Validation Result : -1 -> all good + * else index of element creating trouble + */ + fun validateInput(resources: Resources): Int { + var retVal = -1 + if (!isEnabled) return retVal + currentList.forEachIndexed { index, it -> + Timber.d("Error text for ${it.title} ${it.errorText}") + if (it.inputType != TEXT_VIEW && it.errorText != null) { + retVal = index + return@forEachIndexed + } + } + Timber.d("Validation : $retVal") + if (retVal != -1) return retVal + currentList.forEachIndexed { index, it -> + if (it.inputType != TEXT_VIEW && it.required) { + if (it.value.isNullOrBlank()) { + Timber.d("validateInput called for item $it, with index ${index}") + it.errorText = resources.getString(R.string.form_input_empty_error) + notifyItemChanged(index) + if (retVal == -1) retVal = index + } + } + } + return retVal + } + + + +} \ No newline at end of file diff --git a/app/src/main/java/org/piramalswasthya/sakhi/model/FormElement.kt b/app/src/main/java/org/piramalswasthya/sakhi/model/FormElement.kt index a596d5a9e..2d6009911 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/model/FormElement.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/model/FormElement.kt @@ -33,7 +33,7 @@ data class FormElement( var isEnabled: Boolean = true, var headingLine: Boolean = true, val showYearFirstInDatePicker: Boolean = false, - val backgroundDrawable: Int? = null, - val iconDrawableRes: Int? = null, + @DrawableRes val backgroundDrawable: Int? = null, + @DrawableRes val iconDrawableRes: Int? = null, val showDrawable: Boolean? = false ) \ No newline at end of file diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/eligible_couple/registration/eligible_couple_reg/EligibleCoupleRegFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/eligible_couple/registration/eligible_couple_reg/EligibleCoupleRegFragment.kt index e4598ee0f..e3c9f9352 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/eligible_couple/registration/eligible_couple_reg/EligibleCoupleRegFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/eligible_couple/registration/eligible_couple_reg/EligibleCoupleRegFragment.kt @@ -11,7 +11,7 @@ import androidx.navigation.fragment.findNavController import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import org.piramalswasthya.sakhi.R -import org.piramalswasthya.sakhi.adapters.FormInputAdapter +import org.piramalswasthya.sakhi.adapters.FormInputAdapterWithBgIcon import org.piramalswasthya.sakhi.databinding.FragmentNewFormBinding import org.piramalswasthya.sakhi.ui.home_activity.HomeActivity import org.piramalswasthya.sakhi.work.WorkerUtils @@ -42,8 +42,8 @@ class EligibleCoupleRegFragment : Fragment() { notIt?.let { recordExists -> // binding.fabEdit.visibility = if(recordExists) View.VISIBLE else View.GONE binding.btnSubmit.visibility = if (recordExists) View.GONE else View.VISIBLE - val adapter = FormInputAdapter( - formValueListener = FormInputAdapter.FormValueListener { formId, index -> + val adapter = FormInputAdapterWithBgIcon( + formValueListener = FormInputAdapterWithBgIcon.FormValueListener { formId, index -> viewModel.updateListOnValueChanged(formId, index) hardCodedListUpdate(formId) }, isEnabled = !recordExists @@ -88,7 +88,7 @@ class EligibleCoupleRegFragment : Fragment() { fun validate(): Boolean { val result = binding.form.rvInputForm.adapter?.let { - (it as FormInputAdapter).validateInput(resources) + (it as FormInputAdapterWithBgIcon).validateInput(resources) } Timber.d("Validation : $result") return if (result == -1) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/maternal_health/pregnant_woment_anc_visits/form/PwAncFormFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/maternal_health/pregnant_woment_anc_visits/form/PwAncFormFragment.kt index 60ffbe9bf..5dd1adab7 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/maternal_health/pregnant_woment_anc_visits/form/PwAncFormFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/maternal_health/pregnant_woment_anc_visits/form/PwAncFormFragment.kt @@ -12,7 +12,7 @@ import androidx.navigation.fragment.findNavController import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import org.piramalswasthya.sakhi.R -import org.piramalswasthya.sakhi.adapters.FormInputAdapter +import org.piramalswasthya.sakhi.adapters.FormInputAdapterWithBgIcon import org.piramalswasthya.sakhi.databinding.FragmentNewFormBinding import org.piramalswasthya.sakhi.ui.home_activity.HomeActivity import org.piramalswasthya.sakhi.ui.home_activity.maternal_health.pregnant_woment_anc_visits.form.PwAncFormViewModel.State @@ -42,8 +42,8 @@ class PwAncFormFragment : Fragment() { notIt?.let { recordExists -> binding.fabEdit.visibility = /*if (recordExists) View.VISIBLE else */View.GONE binding.btnSubmit.visibility = if (recordExists) View.GONE else View.VISIBLE - val adapter = FormInputAdapter( - formValueListener = FormInputAdapter.FormValueListener { formId, index -> + val adapter = FormInputAdapterWithBgIcon( + formValueListener = FormInputAdapterWithBgIcon.FormValueListener { formId, index -> viewModel.updateListOnValueChanged(formId, index) hardCodedListUpdate(formId) }, isEnabled = !recordExists @@ -109,7 +109,7 @@ class PwAncFormFragment : Fragment() { private fun validateCurrentPage(): Boolean { val result = binding.form.rvInputForm.adapter?.let { - (it as FormInputAdapter).validateInput(resources) + (it as FormInputAdapterWithBgIcon).validateInput(resources) } Timber.d("Validation : $result") return if (result == -1) true diff --git a/app/src/main/res/layout/rv_item_form_datepicker_v2.xml b/app/src/main/res/layout/rv_item_form_datepicker_v2.xml index e4a28f14a..3226b8a20 100644 --- a/app/src/main/res/layout/rv_item_form_datepicker_v2.xml +++ b/app/src/main/res/layout/rv_item_form_datepicker_v2.xml @@ -19,7 +19,6 @@ style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/_15sdp" asteriskRequired="@{form.required}" hintText="@{form.title}" app:layout_constraintEnd_toEndOf="parent" @@ -39,29 +38,6 @@ - - - - diff --git a/app/src/main/res/layout/rv_item_form_datepicker_with_bg_icon.xml b/app/src/main/res/layout/rv_item_form_datepicker_with_bg_icon.xml new file mode 100644 index 000000000..5abe45cb0 --- /dev/null +++ b/app/src/main/res/layout/rv_item_form_datepicker_with_bg_icon.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/rv_item_form_dropdown_v2.xml b/app/src/main/res/layout/rv_item_form_dropdown_v2.xml index 316327f98..fa8661df9 100644 --- a/app/src/main/res/layout/rv_item_form_dropdown_v2.xml +++ b/app/src/main/res/layout/rv_item_form_dropdown_v2.xml @@ -21,7 +21,6 @@ style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/_15sdp" asteriskRequired="@{form.required}" hintText="@{form.title}" android:labelFor="@id/actv_rv_dropdown" @@ -43,30 +42,6 @@ - - - - - - - - diff --git a/app/src/main/res/layout/rv_item_form_dropdown_with_bg_icon.xml b/app/src/main/res/layout/rv_item_form_dropdown_with_bg_icon.xml new file mode 100644 index 000000000..fdcf68001 --- /dev/null +++ b/app/src/main/res/layout/rv_item_form_dropdown_with_bg_icon.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/rv_item_form_edit_text_v2.xml b/app/src/main/res/layout/rv_item_form_edit_text_v2.xml index 4432c570a..40836220a 100644 --- a/app/src/main/res/layout/rv_item_form_edit_text_v2.xml +++ b/app/src/main/res/layout/rv_item_form_edit_text_v2.xml @@ -32,7 +32,6 @@ style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/_15sdp" asteriskRequired="@{form.required}" hintText="@{form.title}" app:endIconMode="custom" @@ -57,7 +56,7 @@ - - +<!– android:src="@drawable/ic_bg_circular"–> - + app:layout_constraintTop_toTopOf="@+id/ivIconBg" />--> + diff --git a/app/src/main/res/layout/rv_item_form_edit_text_with_bg_icon.xml b/app/src/main/res/layout/rv_item_form_edit_text_with_bg_icon.xml new file mode 100644 index 000000000..71edd1e1a --- /dev/null +++ b/app/src/main/res/layout/rv_item_form_edit_text_with_bg_icon.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/rv_item_form_image_view_with_bg_icon.xml b/app/src/main/res/layout/rv_item_form_image_view_with_bg_icon.xml new file mode 100644 index 000000000..860ca29f7 --- /dev/null +++ b/app/src/main/res/layout/rv_item_form_image_view_with_bg_icon.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/rv_item_form_radio_v2.xml b/app/src/main/res/layout/rv_item_form_radio_v2.xml index 55ecfa89f..b2d02d5c7 100644 --- a/app/src/main/res/layout/rv_item_form_radio_v2.xml +++ b/app/src/main/res/layout/rv_item_form_radio_v2.xml @@ -42,7 +42,6 @@ android:layout_height="wrap_content" android:paddingVertical="@dimen/padding_small" android:text="@{form.title}" - android:layout_marginStart="@dimen/_15sdp" android:textAppearance="@style/TextAppearance.Material3.BodyLarge" app:required="@{!form.required}" app:layout_constraintEnd_toStartOf="@id/tv_nullable_hr" @@ -60,7 +59,6 @@ app:layout_constraintStart_toEndOf="@id/tv_title_hr" app:layout_constraintTop_toTopOf="@id/cl_text_hr" android:paddingStart="@dimen/padding_small" - android:text="@{(form.doubleStar? @string/radio_title_ds(form.title) : @string/radio_title(form.title))}" android:textAppearance="@style/TextAppearance.AppCompat.Medium" app:required="@{form.required}" /> @@ -115,7 +113,6 @@ android:paddingVertical="@dimen/padding_small" android:text="@{form.title}" android:maxWidth="300dp" - android:layout_marginStart="@dimen/_15sdp" android:textAppearance="@style/TextAppearance.Material3.BodyLarge" app:layout_constraintEnd_toStartOf="@id/tv_nullable_hr" app:layout_constraintStart_toStartOf="parent" @@ -153,7 +150,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" - android:layout_marginStart="@dimen/_15sdp" android:backgroundTint="@{form.enabled ? @color/read_only : @color/md_theme_light_onPrimary}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toBottomOf="@id/tv_title"> diff --git a/app/src/main/res/layout/rv_item_form_radio_with_bg_icon.xml b/app/src/main/res/layout/rv_item_form_radio_with_bg_icon.xml new file mode 100644 index 000000000..6b7a67ba1 --- /dev/null +++ b/app/src/main/res/layout/rv_item_form_radio_with_bg_icon.xml @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/rv_item_form_text_view_v2.xml b/app/src/main/res/layout/rv_item_form_text_view_v2.xml index 36bef49a3..8b2a9da6e 100644 --- a/app/src/main/res/layout/rv_item_form_text_view_v2.xml +++ b/app/src/main/res/layout/rv_item_form_text_view_v2.xml @@ -20,7 +20,6 @@ style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/_15sdp" asteriskRequired="@{form.required}" hintText="@{form.title}" android:labelFor="@id/et" @@ -44,31 +43,6 @@ - - - - - - diff --git a/app/src/main/res/layout/rv_item_form_text_view_with_bg_icon.xml b/app/src/main/res/layout/rv_item_form_text_view_with_bg_icon.xml new file mode 100644 index 000000000..86f085095 --- /dev/null +++ b/app/src/main/res/layout/rv_item_form_text_view_with_bg_icon.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/rv_item_form_timepicker_v2.xml b/app/src/main/res/layout/rv_item_form_timepicker_v2.xml index 19edaa022..facfeb531 100644 --- a/app/src/main/res/layout/rv_item_form_timepicker_v2.xml +++ b/app/src/main/res/layout/rv_item_form_timepicker_v2.xml @@ -19,7 +19,6 @@ style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/_15sdp" asteriskRequired="@{form.required}" hintText="@{form.title}" app:layout_constraintEnd_toEndOf="parent" @@ -39,28 +38,6 @@ - - - diff --git a/app/src/main/res/layout/rv_item_form_timepicker_with_bg_icon.xml b/app/src/main/res/layout/rv_item_form_timepicker_with_bg_icon.xml new file mode 100644 index 000000000..011b9893d --- /dev/null +++ b/app/src/main/res/layout/rv_item_form_timepicker_with_bg_icon.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From cfc97793b7bb4fad56d63e5dd9fa5a70a11fc6ab Mon Sep 17 00:00:00 2001 From: ShaanOnDev Date: Wed, 20 Nov 2024 18:38:35 +0530 Subject: [PATCH 089/892] Spouse Sur Name Added --- .../piramalswasthya/sakhi/configuration/BenRegFormDataset.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt index 2694fac7b..175cef374 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt @@ -1161,6 +1161,9 @@ class BenRegFormDataset(context: Context, language: Languages) : Dataset(context firstName.inputType = TEXT_VIEW lastName.value = hoFSpouse.lastName lastName.inputType = EDIT_TEXT + } else { + lastName.value = hoFSpouse.lastName + lastName.inputType = EDIT_TEXT } if (hoFSpouse.gender == FEMALE) { wifeName.value = "${hoFSpouse.firstName} ${hoFSpouse.lastName ?: ""}" From f50fe474f6ebe96e7804c2a2234bd6c5be9e4bf2 Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Thu, 21 Nov 2024 16:25:17 +0530 Subject: [PATCH 090/892] FLW-76 The CBAC form should include a "None of These" field and based on select should select all below field selected no --- .../cbac/CbacFragment.kt | 193 ++++++++++++++++++ app/src/main/res/layout/fragment_cbac.xml | 19 ++ 2 files changed, 212 insertions(+) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt index ed7a0f0bb..1d7ac66ac 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt @@ -3,6 +3,7 @@ package org.piramalswasthya.sakhi.ui.home_activity.non_communicable_diseases.cba import android.app.AlertDialog import android.app.DatePickerDialog import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -26,6 +27,7 @@ import java.text.SimpleDateFormat import java.util.Calendar import java.util.Locale + @AndroidEntryPoint class CbacFragment : Fragment() { @@ -190,6 +192,197 @@ class CbacFragment : Fragment() { } + binding.cbNoneOfThese.setOnCheckedChangeListener { buttonView, isChecked -> + if (isChecked) { + binding.cbacHistb.rbNo.isChecked = true + viewModel.setHisTb(2) + binding.cbacCoughing.rbNo.isChecked = true + viewModel.setCoughing(2) + binding.cbacBlsputum.rbNo.isChecked = true + viewModel.setBloodSputum(2) + binding.cbacFeverwks.rbNo.isChecked = true + viewModel.setFeverWks(2) + binding.cbacLsweight.rbNo.isChecked = true + viewModel.setLsWt(2) + binding.cbacNtswets.rbNo.isChecked = true + viewModel.setNtSwets(2) + + + binding.cbacRecurrentUlceration.rbNo.isChecked = true + viewModel.setRecurrentUlceration(2) + binding.cbacRecurrentCloudy.rbNo.isChecked = true + viewModel.setRecurrentCloudy(2) + binding.cbacRecurrentDiffcultyReading.rbNo.isChecked = true + viewModel.setDiffReading(2) + binding.cbacRecurrentPainEyes.rbNo.isChecked = true + viewModel.setPainEyes(2) + binding.cbacRecurrentRednessEyes.rbNo.isChecked = true + viewModel.setRedEyes(2) + binding.cbacRecurrentDiffHearing.rbNo.isChecked = true + viewModel.setDiffHearing(2) + binding.cbacBreath.rbNo.isChecked = true + viewModel.setBreathe(2) + binding.cbacRecurrentTingling.rbNo.isChecked = true + viewModel.setTing(2) + binding.cbacHifits.rbNo.isChecked = true + viewModel.setHisFits(2) + binding.cbacDifmouth.rbNo.isChecked = true + viewModel.setDiffMouth(2) + binding.cbacHeald.rbNo.isChecked = true + viewModel.setHealed(2) + binding.cbacVoice.rbNo.isChecked = true + viewModel.setVoice(2) + binding.cbacAnyGrowth.rbNo.isChecked = true + viewModel.setAnyGrowth(2) + binding.cbacAnyWhite.rbNo.isChecked = true + viewModel.setAnyWhite(2) + binding.cbacPainWhileChewing.rbNo.isChecked = true + viewModel.setPainChew(2) + binding.cbacAnyHyperPigmented.rbNo.isChecked = true + viewModel.setHyperPig(2) + binding.cbacAnyThickendSkin.rbNo.isChecked = true + viewModel.setThickSkin(2) + binding.cbacAnyNodulesSkin.rbNo.isChecked = true + viewModel.setNoduleSkin(2) + binding.cbacRecurrentNumbness.rbNo.isChecked = true + viewModel.setNumb(2) + binding.cbacClawingOfFingers.rbNo.isChecked = true + viewModel.setClaw(2) + binding.cbacTinglingOrNumbness.rbNo.isChecked = true + viewModel.setTingNumb(2) + binding.cbacInabilityCloseEyelid.rbNo.isChecked = true + viewModel.setCloseEyelid(2) + binding.cbacDiffHoldingObjects.rbNo.isChecked = true + viewModel.setHoldObj(2) + binding.cbacWeeknessInFeet.rbNo.isChecked = true + viewModel.setWeakFeet(2) + binding.cbacLumpbrest.rbNo.isChecked = true + viewModel.setLumpB(2) + binding.cbacNipple.rbNo.isChecked = true + viewModel.setNipple(2) + binding.cbacBreast.rbNo.isChecked = true + viewModel.setBreast(2) + binding.cbacBlperiods.rbNo.isChecked = true + viewModel.setBlP(2) + + binding.cbacBlmenopause.rbNo.isChecked = true + viewModel.setBlM(2) + binding.tvBlMenopause.visibility = View.GONE + + binding.cbacBlintercorse.rbNo.isChecked = true + viewModel.setBlI(2) + binding.cbacFouldis.rbNo.isChecked = true + viewModel.setFoulD(2) + binding.cbacUnsteady.rbNo.isChecked = true + viewModel.setUnsteady(2) + binding.cbacPdRm.rbNo.isChecked = true + viewModel.setPdRm(2) + binding.cbacNhop.rbNo.isChecked = true + viewModel.setNhop(2) + binding.cbacForgetNames.rbNo.isChecked = true + viewModel.setForgetNames(2) + + binding.cbacFhTb.rbNo.isChecked = true + viewModel.setFhTb(2) + binding.cbacTakingTbDrug.rbNo.isChecked = true + viewModel.setTakingTbDrug(2) + }else{ + binding.cbacHistb.cbacEdRg.clearCheck() + viewModel.setHisTb(0) + binding.cbacCoughing.cbacEdRg.clearCheck() + viewModel.setCoughing(0) + binding.cbacBlsputum.cbacEdRg.clearCheck() + viewModel.setBloodSputum(0) + binding.cbacFeverwks.cbacEdRg.clearCheck() + viewModel.setFeverWks(0) + binding.cbacLsweight.cbacEdRg.clearCheck() + viewModel.setLsWt(0) + binding.cbacNtswets.cbacEdRg.clearCheck() + viewModel.setNtSwets(0) + + binding.cbacRecurrentUlceration.cbacEdRg.clearCheck() + viewModel.setRecurrentUlceration(0) + binding.cbacRecurrentCloudy.cbacEdRg.clearCheck() + viewModel.setRecurrentCloudy(0) + binding.cbacRecurrentDiffcultyReading.cbacEdRg.clearCheck() + viewModel.setDiffReading(0) + binding.cbacRecurrentPainEyes.cbacEdRg.clearCheck() + viewModel.setPainEyes(0) + binding.cbacRecurrentRednessEyes.cbacEdRg.clearCheck() + viewModel.setRedEyes(0) + binding.cbacRecurrentDiffHearing.cbacEdRg.clearCheck() + viewModel.setDiffHearing(0) + binding.cbacBreath.cbacEdRg.clearCheck() + viewModel.setBreathe(0) + binding.cbacRecurrentTingling.cbacEdRg.clearCheck() + viewModel.setTing(0) + binding.cbacHifits.cbacEdRg.clearCheck() + viewModel.setHisFits(0) + binding.cbacDifmouth.cbacEdRg.clearCheck() + viewModel.setDiffMouth(0) + binding.cbacHeald.cbacEdRg.clearCheck() + viewModel.setHealed(0) + binding.cbacVoice.cbacEdRg.clearCheck() + viewModel.setVoice(0) + binding.cbacAnyGrowth.cbacEdRg.clearCheck() + viewModel.setAnyGrowth(0) + binding.cbacAnyWhite.cbacEdRg.clearCheck() + viewModel.setAnyWhite(0) + binding.cbacPainWhileChewing.cbacEdRg.clearCheck() + viewModel.setPainChew(0) + binding.cbacAnyHyperPigmented.cbacEdRg.clearCheck() + viewModel.setHyperPig(0) + binding.cbacAnyThickendSkin.cbacEdRg.clearCheck() + viewModel.setThickSkin(0) + binding.cbacAnyNodulesSkin.cbacEdRg.clearCheck() + viewModel.setNoduleSkin(0) + binding.cbacRecurrentNumbness.cbacEdRg.clearCheck() + viewModel.setNumb(0) + binding.cbacClawingOfFingers.cbacEdRg.clearCheck() + viewModel.setClaw(0) + binding.cbacTinglingOrNumbness.cbacEdRg.clearCheck() + viewModel.setTingNumb(0) + binding.cbacInabilityCloseEyelid.cbacEdRg.clearCheck() + viewModel.setCloseEyelid(0) + binding.cbacDiffHoldingObjects.cbacEdRg.clearCheck() + viewModel.setHoldObj(0) + binding.cbacWeeknessInFeet.cbacEdRg.clearCheck() + viewModel.setWeakFeet(0) + binding.cbacLumpbrest.cbacEdRg.clearCheck() + viewModel.setLumpB(0) + binding.cbacNipple.cbacEdRg.clearCheck() + viewModel.setNipple(0) + binding.cbacBreast.cbacEdRg.clearCheck() + viewModel.setBreast(0) + binding.cbacBlperiods.cbacEdRg.clearCheck() + viewModel.setBlP(0) + + binding.cbacBlmenopause.cbacEdRg.clearCheck() + viewModel.setBlM(0) + binding.tvBlMenopause.visibility = View.GONE + + binding.cbacBlintercorse.cbacEdRg.clearCheck() + viewModel.setBlI(0) + binding.cbacFouldis.cbacEdRg.clearCheck() + viewModel.setFoulD(0) + binding.cbacUnsteady.cbacEdRg.clearCheck() + viewModel.setUnsteady(0) + binding.cbacPdRm.cbacEdRg.clearCheck() + viewModel.setPdRm(0) + binding.cbacNhop.cbacEdRg.clearCheck() + viewModel.setNhop(0) + binding.cbacForgetNames.cbacEdRg.clearCheck() + viewModel.setForgetNames(0) + + binding.cbacFhTb.cbacEdRg.clearCheck() + viewModel.setFhTb(0) + binding.cbacTakingTbDrug.cbacEdRg.clearCheck() + viewModel.setTakingTbDrug(0) + + } + } + + } private fun handleRaScoreAlert(score: Int) { diff --git a/app/src/main/res/layout/fragment_cbac.xml b/app/src/main/res/layout/fragment_cbac.xml index 4ea6c9c33..6c02b4008 100644 --- a/app/src/main/res/layout/fragment_cbac.xml +++ b/app/src/main/res/layout/fragment_cbac.xml @@ -526,6 +526,25 @@ android:textAppearance="@style/TextAppearance.Material3.TitleSmall" android:textColor="@android:color/holo_red_light" /> + + + + + + Date: Fri, 22 Nov 2024 10:48:00 +0530 Subject: [PATCH 091/892] FLW-105 Set "Date of Registration" Field to Null by Default in "Pregnant Women Registration"but Mandatory --- .../sakhi/configuration/PregnantWomanRegistrationDataset.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanRegistrationDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanRegistrationDataset.kt index 3691677a3..8972950a4 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanRegistrationDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanRegistrationDataset.kt @@ -25,7 +25,7 @@ class PregnantWomanRegistrationDataset( var registrationDate:Long = 0 private fun getMinLmpMillis(): Long { val cal = Calendar.getInstance() - cal.add(Calendar.DAY_OF_YEAR, -1 * 280) + cal.add(Calendar.DAY_OF_YEAR, -1 * 400) //before it is 280 return cal.timeInMillis } private fun pwRegisterBeforeoneYear(): Long { @@ -442,7 +442,7 @@ class PregnantWomanRegistrationDataset( isHrpCase ) - dateOfReg.value = getDateFromLong(System.currentTimeMillis()) + // dateOfReg.value = getDateFromLong(System.currentTimeMillis()) dateOfReg.value?.let { val long = getLongFromDate(it) dateOfhivTestDone.min = long - TimeUnit.DAYS.toMillis(365) @@ -558,7 +558,7 @@ class PregnantWomanRegistrationDataset( it.dateOfRegistration.let { lmp.max = it - lmp.min = it - TimeUnit.DAYS.toMillis(280) + lmp.min = it - TimeUnit.DAYS.toMillis(400) dateOfVdrlTestDone.min = it - TimeUnit.DAYS.toMillis(365) dateOfhivTestDone.min = it - TimeUnit.DAYS.toMillis(365) dateOfhbsAgTestDone.min = it - TimeUnit.DAYS.toMillis(365) From ec9200b6b4917b33d9e1eac8fd11b6b3aaf69a20 Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Fri, 22 Nov 2024 15:52:08 +0530 Subject: [PATCH 092/892] FLW-81 Auto-Move Beneficiary to TB Suspected List Post-Suspected TB under NCD Screening --- .../piramalswasthya/sakhi/adapters/TbScreeningListAdapter.kt | 4 ++++ .../java/org/piramalswasthya/sakhi/configuration/Dataset.kt | 2 +- .../non_communicable_diseases/cbac/CbacFragment.kt | 4 ++-- app/src/main/res/layout/fragment_cbac.xml | 4 ++-- app/src/main/res/values/strings_home.xml | 4 ++-- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/adapters/TbScreeningListAdapter.kt b/app/src/main/java/org/piramalswasthya/sakhi/adapters/TbScreeningListAdapter.kt index c7dcda306..88c608e1e 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/adapters/TbScreeningListAdapter.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/adapters/TbScreeningListAdapter.kt @@ -43,6 +43,10 @@ class TbScreeningListAdapter( ) { binding.benWithTb = item + if(item.tb?.historyOfTb == true){ + binding.cvContent.visibility = View.GONE + } + binding.ivSyncState.visibility = if (item.tb == null) View.INVISIBLE else View.VISIBLE if (item.ben.spouseName == "Not Available" && item.ben.fatherName == "Not Available") { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt index 94ddcb4d5..ddff8988c 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/Dataset.kt @@ -391,7 +391,7 @@ abstract class Dataset(context: Context, val currentLanguage: Languages) { Calendar.getInstance().apply { timeInMillis = lmp - add(Calendar.WEEK_OF_YEAR, -40) + add(Calendar.WEEK_OF_YEAR, -57) }.timeInMillis diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt index 1d7ac66ac..9a4c3d242 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/non_communicable_diseases/cbac/CbacFragment.kt @@ -515,8 +515,8 @@ class CbacFragment : Fragment() { private fun setUpView() { binding.btnSave.visibility = View.GONE - binding.noneCheck.visibility = View.GONE - binding.nonTxt.visibility = View.GONE +// binding.noneCheck.visibility = View.GONE +// binding.nonTxt.visibility = View.GONE viewModel.filledCbac.observe(viewLifecycleOwner) { cbac -> binding.etDate.setText(getDateFromLong(cbac.fillDate)) setupRaView(cbac) diff --git a/app/src/main/res/layout/fragment_cbac.xml b/app/src/main/res/layout/fragment_cbac.xml index 6c02b4008..e8b8fb181 100644 --- a/app/src/main/res/layout/fragment_cbac.xml +++ b/app/src/main/res/layout/fragment_cbac.xml @@ -815,7 +815,7 @@ app:numAsterisk="@{0}" /> - - + --> Invalid Username / password ! Server timed out, try again! Unable to connect to network! - " not Processed" + " Records Not Synced!" All records synced - " Are you sure to logout?" + " Are you sure you want to logout?" \ No newline at end of file From 0e88fcc30ed3d921f171ff1294e0df86defa2779 Mon Sep 17 00:00:00 2001 From: ShaanOnDev Date: Fri, 22 Nov 2024 17:14:19 +0530 Subject: [PATCH 093/892] Added ANC (5 ,6 ,7 ,8) in the system --- .../configuration/PregnantWomanAncVisitDataset.kt | 11 ++++++----- .../piramalswasthya/sakhi/model/MaternalHealth.kt | 15 +++++++++++---- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt index 70c3fbcaf..656081b82 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt @@ -355,18 +355,19 @@ class PregnantWomanAncVisitDataset( ben?.let { ancDate.min = regis.lmpDate + TimeUnit.DAYS.toMillis(7 * Konstants.minAnc1Week.toLong() + 1) - ancVisit.entries = arrayOf("1", "2", "3", "4") + ancVisit.entries = arrayOf("1", "2", "3", "4", "5", "6", "7", "8") lastAnc?.let { last -> ancDate.min = last.ancDate + TimeUnit.DAYS.toMillis(4 * 7) - ancVisit.entries = arrayOf(2, 3, 4).filter { + ancVisit.entries = arrayOf(2, 3, 4, 5, 6, 7 ,8).filter { it > last.visitNumber }.map { it.toString() }.toTypedArray() lastAncVisitDate = last.ancDate } - ancDate.max = - minOf(getEddFromLmp(regis.lmpDate), System.currentTimeMillis()) - ancDate.value = getDateFromLong(ancDate.max!!) +// ancDate.max = +// minOf(getEddFromLmp(regis.lmpDate), System.currentTimeMillis()) + ancDate.max = System.currentTimeMillis() +// ancDate.value = getDateFromLong(ancDate.max!!) maternalDateOfDeath.min = maxOf(regis.lmpDate, lastAncVisitDate) + TimeUnit.DAYS.toMillis(1) maternalDateOfDeath.max = diff --git a/app/src/main/java/org/piramalswasthya/sakhi/model/MaternalHealth.kt b/app/src/main/java/org/piramalswasthya/sakhi/model/MaternalHealth.kt index e74431976..4a2c737e3 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/model/MaternalHealth.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/model/MaternalHealth.kt @@ -538,14 +538,21 @@ data class BenWithAncVisitCache( TimeUnit.MILLISECONDS.toDays( getTodayMillis() - activePwrRecrod.lmpDate ) >= Konstants.minAnc1Week * 7 +// else +// lastAncRecord != null && +// (activePwrRecrod.lmpDate + TimeUnit.DAYS.toMillis(280)) > (lastAncRecord.ancDate + TimeUnit.DAYS.toMillis( +// 28 +// )) && +// lastAncRecord.visitNumber < 4 && TimeUnit.MILLISECONDS.toDays( +// getTodayMillis() - lastAncRecord.ancDate +// ) > 28, else lastAncRecord != null && - (activePwrRecrod.lmpDate + TimeUnit.DAYS.toMillis(280)) > (lastAncRecord.ancDate + TimeUnit.DAYS.toMillis( + (activePwrRecrod.lmpDate + TimeUnit.DAYS.toMillis(840)) > (lastAncRecord.ancDate + TimeUnit.DAYS.toMillis( 28 )) && - lastAncRecord.visitNumber < 4 && TimeUnit.MILLISECONDS.toDays( - getTodayMillis() - lastAncRecord.ancDate - ) > 28, + lastAncRecord.visitNumber < 8 && + lastAncRecord.ancDate + TimeUnit.DAYS.toMillis(28) < getTodayMillis(), syncState = if (activePmsma == null && savedAncRecords.isEmpty()) null else if (activePmsma?.syncState == SyncState.UNSYNCED || savedAncRecords.any { it.syncState != SyncState.SYNCED }) SyncState.UNSYNCED else SyncState.SYNCED ) From 2fc212b6478f4009f7bcce706173ac7142e504bd Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Mon, 25 Nov 2024 17:09:45 +0530 Subject: [PATCH 094/892] ReadMe file changed after adding product flavours to app --- README.md | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 1df5303c6..1ea1d2989 100644 --- a/README.md +++ b/README.md @@ -103,28 +103,30 @@ To run this project, Follow these steps: 3. Click on 'Open an existing Android Studio project'. 4. Navigate to the directory where you cloned the project and select the root folder. 5. Wait for Android Studio to sync the project and download the dependencies. -6. Once the sync is done, you can run the project on an emulator or a physical device. +6. Once the sync is done, select build variant you want to work on like uatDebug, statingDebug or productionDebug +7. create folder in \app\src named production, uat or staging as per build variant you want to work and add google JSON file in it. +7. Clean Project and Rebuild and run project +8. you can run the project on an emulator or a physical device. +9. Try to login with valid Credentials if everything is fine you able to login successfully ### Prerequisites - **Secrets**:- set ENCRYPTED_PASS_KEY, ABHA_CLIENT_ID, ABHA_CLIENT_SECRET values in secrets.properties file. -- **google-json**:- set Google JSON file of required variant, i.e. UAT, STAGING or PRODUCTION. +- **Environments**:- We can generate the application for below environments (using Build Varients) based on requirements + 1.Amrit Demo.(stagingDebug, stagingRelease) + 2.UAT. (uatDebug, uatRelease) + 3.Production.(productionDebug, productionRelease) + +- **google-json**:-As per build variant, you want to work add folder in \app\src named production, uat or staging and add Google JSON file of required variant in it. -- **Environments**:- We can generate the application for below environments based on requirements - 1.Amrit Demo. - 2.UAT. - 3.Production. -**Configurations:** - - In AppModule class there is a variable declared for base URL, set the value to amrit demo or uat or prod values based on requirement +**Configurations:** - `object AppModule { + - In App level build.gradle file productFlavors added. Based on which varient you want to work select build varient - private const val baseTmcUrl = "" - ` - In IconDataset class we have the list of modules that we show on UI, we can comment, or un-comment modules based on requirement - In AllBenFragment class we have a Boolean `showAbha` which can be used to toggle the visibility of abha button on beneficiary cards From 4ab755f0bba4483f21f51bf3b5c93572f1bd4ac1 Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Mon, 25 Nov 2024 17:12:55 +0530 Subject: [PATCH 095/892] ReadMe file changed after adding product flavours to app --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 1ea1d2989..f3e8aed3b 100644 --- a/README.md +++ b/README.md @@ -114,8 +114,11 @@ To run this project, Follow these steps: - **Secrets**:- set ENCRYPTED_PASS_KEY, ABHA_CLIENT_ID, ABHA_CLIENT_SECRET values in secrets.properties file. - **Environments**:- We can generate the application for below environments (using Build Varients) based on requirements + 1.Amrit Demo.(stagingDebug, stagingRelease) + 2.UAT. (uatDebug, uatRelease) + 3.Production.(productionDebug, productionRelease) - **google-json**:-As per build variant, you want to work add folder in \app\src named production, uat or staging and add Google JSON file of required variant in it. From ef1d76c37f2fc5c364dc88904cc27c7629577aa7 Mon Sep 17 00:00:00 2001 From: ShaanOnDev Date: Mon, 25 Nov 2024 17:57:12 +0530 Subject: [PATCH 096/892] Forced Name Fields to be in Upper Case --- .../sakhi/adapters/FormInputAdapter.kt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapter.kt b/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapter.kt index 75ca20717..0cbc4f075 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapter.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapter.kt @@ -8,6 +8,9 @@ import android.content.res.Resources import android.graphics.Color import android.os.Build import android.text.Editable +import android.text.InputFilter +import android.text.InputFilter.AllCaps +import android.text.InputType import android.text.Spannable import android.text.SpannableString import android.text.TextWatcher @@ -106,6 +109,22 @@ class FormInputAdapter( binding.et.isClickable = true binding.et.isFocusable = true } + if (item.title.contains("first name", true) || + item.title.contains("last name", true) || + item.title.contains("father's name", true) || + item.title.contains("mother's name", true) + ) { +// edittext.setFilters(arrayOf(AllCaps())) + val editFilters = binding.et.filters + var newFilters = arrayOfNulls(editFilters.size + 1) + editFilters.forEachIndexed { index, inputFilter -> + newFilters[index] = editFilters[index] + } + newFilters[editFilters.size] = AllCaps() +// newFilters.set(editFilters.size, AllCaps()) +// binding.et.filters = arrayOf(AllCaps()) + binding.et.filters = newFilters + } binding.form = item if (item.errorText == null) binding.tilEditText.isErrorEnabled = false Timber.d("Bound EditText item ${item.title} with ${item.required}") From 12e9237945a2471c306ef0edf72581ccdef48de1 Mon Sep 17 00:00:00 2001 From: ShaanOnDev Date: Wed, 27 Nov 2024 16:06:16 +0530 Subject: [PATCH 097/892] Added ABHA Environment for Production (v1/v2) --- .../sakhi/network/AbhaApiService.kt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt index 7fe9dac1f..3378c6653 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt @@ -6,6 +6,7 @@ import retrofit2.http.* interface AbhaApiService { + // Token Fetching for Staging (v1/v2) @Headers("No-Auth: true") @POST suspend fun getToken( @@ -13,6 +14,14 @@ interface AbhaApiService { @Body request: AbhaTokenRequest = AbhaTokenRequest() ): Response + // Token Fetching for Production (v1/v2) +// @Headers("No-Auth: true") +// @POST +// suspend fun getToken( +// @Url url: String = "https://live.abdm.gov.in/gateway/v0.5/sessions", +// @Body request: AbhaTokenRequest = AbhaTokenRequest() +// ): Response + @POST("v1/registration/aadhaar/generateOtp") suspend fun generateAadhaarOtp(@Body aadhaar: AbhaGenerateAadhaarOtpRequest): Response @@ -46,11 +55,18 @@ interface AbhaApiService { @GET("v1/account/getPngCard") suspend fun getPngCard(): Response + // Authentication Certificate for Staging (v1/v2) @GET suspend fun getAuthCert( @Url url: String = "https://healthidsbx.abdm.gov.in/api/v2/auth/cert" ): Response + // Authentication Certificate for Staging (v1/v2) +// @GET +// suspend fun getAuthCert( +// @Url url: String = "https://healthid.abdm.gov.in/api/v2/auth/cert" +// ): Response + @GET("v2/ha/lgd/states") suspend fun getStateAndDistricts(): Response From adeae1bce0c934d01bb05e89409ce5081eecf43f Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Thu, 28 Nov 2024 16:46:53 +0530 Subject: [PATCH 098/892] FLW 78- Edittext not properly behaving not able to edit and add value FLW-106-Whats app share issue also not sharing correct data In ANC Visits IFA tab displays multiple time --- .../sakhi/adapters/FormInputAdapter.kt | 12 +- .../PregnantWomanAncVisitDataset.kt | 26 +-- .../sakhi/ui/home_activity/HomeActivity.kt | 4 +- .../HRPMicroBirthPlanViewModel.kt | 5 + .../HRPMicroBirthPlanTable.kt | 175 ++++++++++++++---- .../fragment_h_r_p_micro_birth_plan_table.xml | 4 +- app/src/main/res/values/strings_home.xml | 2 +- 7 files changed, 172 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapter.kt b/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapter.kt index 0cbc4f075..c88fe4c5c 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapter.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapter.kt @@ -10,7 +10,6 @@ import android.os.Build import android.text.Editable import android.text.InputFilter import android.text.InputFilter.AllCaps -import android.text.InputType import android.text.Spannable import android.text.SpannableString import android.text.TextWatcher @@ -108,6 +107,7 @@ class FormInputAdapter( } else { binding.et.isClickable = true binding.et.isFocusable = true + binding.et.isFocusableInTouchMode = true } if (item.title.contains("first name", true) || item.title.contains("last name", true) || @@ -256,9 +256,15 @@ class FormInputAdapter( } } binding.et.setOnFocusChangeListener { _, hasFocus -> - if (hasFocus) binding.et.addTextChangedListener(textWatcher) - else { + if (hasFocus){ + binding.et.requestFocus() + binding.et.addTextChangedListener(textWatcher) + val imm = + binding.root.context.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager? + imm!!.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0) + } else { binding.et.removeTextChangedListener(textWatcher) + binding.et.clearFocus() val imm = binding.root.context.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager? imm!!.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt index bc3041931..ad6d80b96 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt @@ -237,7 +237,7 @@ class PregnantWomanAncVisitDataset( backgroundDrawable=R.drawable.ic_bg_circular, iconDrawableRes=R.drawable.ic_bmi, ) - private val numFolicAcidTabGiven = FormElement( + /* private val numFolicAcidTabGiven = FormElement( id = 19, inputType = InputType.EDIT_TEXT, title = "No. of Folic Acid Tabs given", @@ -249,7 +249,7 @@ class PregnantWomanAncVisitDataset( showDrawable = true, backgroundDrawable=R.drawable.ic_bg_circular, iconDrawableRes=R.drawable.ic_tablets, - ) + )*/ private val numIfaAcidTabGiven = FormElement( id = 20, inputType = InputType.EDIT_TEXT, @@ -397,7 +397,7 @@ class PregnantWomanAncVisitDataset( dateOfTTOrTd1, dateOfTTOrTd2, dateOfTTOrTdBooster, - numFolicAcidTabGiven, + // numFolicAcidTabGiven, numIfaAcidTabGiven, anyHighRisk, highRiskReferralFacility, @@ -451,7 +451,8 @@ class PregnantWomanAncVisitDataset( list.remove(fundalHeight) list.remove(numIfaAcidTabGiven) } else { - list.remove(numFolicAcidTabGiven) + // list.remove(numFolicAcidTabGiven) + list.remove(numIfaAcidTabGiven) } weeks.toString() } @@ -466,7 +467,8 @@ class PregnantWomanAncVisitDataset( list.remove(fundalHeight) list.remove(numIfaAcidTabGiven) } else { - list.remove(numFolicAcidTabGiven) + // list.remove(numFolicAcidTabGiven) + // list.remove(numIfaAcidTabGiven) } if (woP >= Konstants.minWeekToShowDelivered) { if (!list.contains(deliveryDone)) list.add(deliveryDone) @@ -499,7 +501,7 @@ class PregnantWomanAncVisitDataset( dateOfTTOrTd1.value = regis.tt1?.let { getDateFromLong(it) } dateOfTTOrTd2.value = regis.tt2?.let { getDateFromLong(it) } dateOfTTOrTdBooster.value = regis.ttBooster?.let { getDateFromLong(it) } - numFolicAcidTabGiven.value = savedAnc.numFolicAcidTabGiven.toString() + // numFolicAcidTabGiven.value = savedAnc.numFolicAcidTabGiven.toString() numIfaAcidTabGiven.value = savedAnc.numIfaAcidTabGiven.toString() savedAnc.anyHighRisk?.let { anyHighRisk.value = @@ -609,14 +611,14 @@ class PregnantWomanAncVisitDataset( val listChanged2 = if (weeks <= 12) triggerDependants( source = ancVisit, - addItems = listOf(numFolicAcidTabGiven), + addItems = listOf(numIfaAcidTabGiven), removeItems = listOf(fundalHeight, numIfaAcidTabGiven), position = getIndexById(dateOfTTOrTdBooster.id) + 1 ) else { triggerDependants( source = ancVisit, - removeItems = listOf(numFolicAcidTabGiven), + removeItems = listOf(numIfaAcidTabGiven), addItems = listOf(fundalHeight), position = getIndexById(hb.id) + 1 ) @@ -642,14 +644,14 @@ class PregnantWomanAncVisitDataset( if (ancVisit.value == "1") triggerDependants( source = ancVisit, - addItems = listOf(numFolicAcidTabGiven), + addItems = listOf(numIfaAcidTabGiven), removeItems = listOf(fundalHeight, numIfaAcidTabGiven), position = getIndexById(dateOfTTOrTdBooster.id) + 1 ) else { triggerDependants( source = ancVisit, - removeItems = listOf(numFolicAcidTabGiven), + removeItems = listOf(numIfaAcidTabGiven), addItems = listOf(fundalHeight), position = getIndexById(hb.id) + 1 ) @@ -710,7 +712,7 @@ class PregnantWomanAncVisitDataset( -1 } - numFolicAcidTabGiven.id -> validateIntMinMax(numFolicAcidTabGiven) + // numFolicAcidTabGiven.id -> validateIntMinMax(numFolicAcidTabGiven) numIfaAcidTabGiven.id -> validateIntMinMax(numIfaAcidTabGiven) anyHighRisk.id -> triggerDependants( source = anyHighRisk, @@ -804,7 +806,7 @@ class PregnantWomanAncVisitDataset( cache.randomBloodSugarTest = randomBloodSugarTest.value cache.randomBloodSugarTestId = randomBloodSugarTest.getPosition() updateRegistrationForTdX() - cache.numFolicAcidTabGiven = numFolicAcidTabGiven.value?.toInt() ?: 0 + // cache.numFolicAcidTabGiven = numFolicAcidTabGiven.value?.toInt() ?: 0 cache.numIfaAcidTabGiven = numIfaAcidTabGiven.value?.toInt() ?: 0 anyHighRisk.value?.let { cache.anyHighRisk = it == anyHighRisk.entries!!.last() diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt index 5814a1971..58781088a 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt @@ -176,7 +176,7 @@ class HomeActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // This will block user to cast app screen // Toggle screencast mode for staging & production builds - window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); + // window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); super.onCreate(savedInstanceState) _binding = ActivityHomeBinding.inflate(layoutInflater) setContentView(binding.root) @@ -206,7 +206,7 @@ class HomeActivity : AppCompatActivity() { override fun onResume() { // This will block user to cast app screen // Toggle screencast mode for staging & production builds - window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); + // window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); super.onResume() if (isDeviceRootedOrEmulator()) { AlertDialog.Builder(this) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan/HRPMicroBirthPlanViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan/HRPMicroBirthPlanViewModel.kt index 31ddee160..6ffb560b1 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan/HRPMicroBirthPlanViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan/HRPMicroBirthPlanViewModel.kt @@ -13,6 +13,7 @@ import org.piramalswasthya.sakhi.configuration.HRPMicroBirthPlanDataset import org.piramalswasthya.sakhi.database.shared_preferences.PreferenceDao import org.piramalswasthya.sakhi.model.BenRegGen import org.piramalswasthya.sakhi.model.HRPMicroBirthPlanCache +import org.piramalswasthya.sakhi.model.HRPPregnantAssessCache import org.piramalswasthya.sakhi.repositories.BenRepo import org.piramalswasthya.sakhi.repositories.HRPRepo import timber.log.Timber @@ -65,6 +66,8 @@ constructor( var isHighRisk: Boolean = false lateinit var _microBirthPlanCache: HRPMicroBirthPlanCache + var _hRPPregnantAssessCache: HRPPregnantAssessCache?=null + init { viewModelScope.launch { @@ -77,6 +80,8 @@ constructor( benId = ben.beneficiaryId, ) } + _hRPPregnantAssessCache = HRPPregnantAssessCache(benId = benId) + _hRPPregnantAssessCache= hrpReo.getPregnantAssess(benId) hrpReo.getMicroBirthPlan(benId)?.let { _microBirthPlanCache = it diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt index ca6cc883b..d75fa4e6d 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt @@ -2,6 +2,7 @@ package org.piramalswasthya.sakhi.ui.home_activity.cho.beneficiary.pregnant_wome import android.annotation.SuppressLint import android.content.ContentValues +import android.content.Context import android.content.Intent import android.content.pm.ActivityInfo import android.graphics.Bitmap @@ -11,6 +12,7 @@ import android.os.Build import android.os.Bundle import android.os.Environment import android.provider.MediaStore +import android.text.format.DateFormat import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -27,6 +29,7 @@ import org.piramalswasthya.sakhi.ui.home_activity.cho.beneficiary.pregnant_women import java.io.File import java.io.FileOutputStream import java.io.OutputStream +import java.util.Date @AndroidEntryPoint @@ -39,8 +42,8 @@ class HRPMicroBirthPlanTable : Fragment() { get() = _binding!! private val viewModel: HRPMicroBirthPlanViewModel by viewModels() - - + var lastMenstrualPeriodString="" + var marriageDateString="" override fun onCreateView( @@ -73,7 +76,8 @@ class HRPMicroBirthPlanTable : Fragment() { viewModel.currentLocation?.let { - binding.scHwc.text = "${resources.getString(R.string.sc_hwc_tg_hosp)} :\n${it.village.name}" + binding.scHwc.text = + "${resources.getString(R.string.sc_hwc_tg_hosp)} :\n${it.village.name}" } @@ -84,24 +88,104 @@ class HRPMicroBirthPlanTable : Fragment() { viewModel.recordExists.observe(viewLifecycleOwner) { lifecycleScope.launch { - if (viewModel._microBirthPlanCache != null){ - - binding.contactNo.text = "${resources.getString(R.string.c_no)} ${viewModel._microBirthPlanCache.contactNumber1}\n2 - ${viewModel._microBirthPlanCache.contactNumber2}" - binding.husbandName.text = "${resources.getString(R.string.husband_s_name)} :\n${viewModel.benDetails.spouseName}" - binding.lmp.text = "${resources.getString(R.string.lmp)} :\n${viewModel.benDetails.lastMenstrualPeriod}" - binding.nrScHwc.text = "${resources.getString(R.string.lmp)} :\n${viewModel._microBirthPlanCache.nearestSc}" - binding.block.text = "${resources.getString(R.string.block)} :\n${viewModel._microBirthPlanCache.block}" - binding.edd.text = "${resources.getString(R.string.edd)} :\n${viewModel.benDetails.marriageDate}" - binding.nrPhc.text = "${resources.getString(R.string.nearest_24x7_phc)} :\n${viewModel._microBirthPlanCache.nearestPhc}" - binding.bankAccNo.text = "${resources.getString(R.string.bank_acc_no)} :\n${viewModel._microBirthPlanCache.bankac}" - binding.nrFru.text = "${resources.getString(R.string.nearest_fru)} :\n${viewModel._microBirthPlanCache.nearestFru}" - binding.nrUsg.text = "${resources.getString(R.string.nearest_usg_centre)} :\n${viewModel._microBirthPlanCache.usg}" - binding.bloodGrp.text = "${resources.getString(R.string.blood_group)} :\n${viewModel._microBirthPlanCache.bloodGroup}" - binding.bloodDonr.text = "${resources.getString(R.string.b_blood_donor)} ${viewModel._microBirthPlanCache.bloodDonors1}\n2 - " + "${viewModel._microBirthPlanCache.bloodDonors2}" - binding.birthComp.text = "${resources.getString(R.string.birth_companion)} :\n${viewModel._microBirthPlanCache.birthCompanion}" - binding.prsonTkCare.text = "${resources.getString(R.string.person_who_will_take_care_of_children_if_any_when_the_pw_is_admitted_for_delivery)} :\n${viewModel._microBirthPlanCache.careTaker}" - binding.nameOfContNo.text = "${resources.getString(R.string.name_of_vhsnd_community_member_for_support_during_emergency)} :\n${viewModel._microBirthPlanCache.communityMember}" - binding.modeOfTrasp.text = "${resources.getString(R.string.mode_of_transportation_in_case_of_labour_pain)} :\n${viewModel._microBirthPlanCache.modeOfTransportation}" + if (viewModel._microBirthPlanCache != null) { + + binding.contactNo.text = + "${resources.getString(R.string.c_no)} ${viewModel._microBirthPlanCache.contactNumber1 ?: ""}\n2 - ${viewModel._microBirthPlanCache.contactNumber2 ?: ""}" + binding.husbandName.text = + "${resources.getString(R.string.husband_s_name)} :\n${viewModel.benDetails.spouseName ?: ""}" + + + val lastMenstrualPeriodLong = viewModel.benDetails.lastMenstrualPeriod + if(viewModel.benDetails.lastMenstrualPeriod!=null){ + lastMenstrualPeriodString = + DateFormat.format("dd/MM/yyyy", lastMenstrualPeriodLong?.let { it1 -> Date(it1) }) + .toString() + } + + if (viewModel._hRPPregnantAssessCache != null) { + if (viewModel._hRPPregnantAssessCache?.lmpDate != null) { + val lmpDateLong = viewModel._hRPPregnantAssessCache?.lmpDate + val lmpDateString: String = + DateFormat.format("dd/MM/yyyy", lmpDateLong?.let { it1 -> Date(it1) }) + .toString() + binding.lmp.text = + "${resources.getString(R.string.lmp)} :\n${lmpDateString ?: ""}" + binding.tvLmpDate.text = + "${resources.getString(R.string.lmp)}:${lmpDateString ?: ""}" + } else { + binding.lmp.text = + "${resources.getString(R.string.lmp)} :\n${lastMenstrualPeriodString?: ""}" + binding.tvLmpDate.text = "${resources.getString(R.string.lmp)}:${lastMenstrualPeriodString ?: ""}" + } + }else{ + binding.lmp.text = + "${resources.getString(R.string.lmp)} :\n${lastMenstrualPeriodString ?: ""}" + binding.tvLmpDate.text = "${resources.getString(R.string.lmp)}:${lastMenstrualPeriodString ?: ""}" + } + + +// binding.lmp.text = +// "${resources.getString(R.string.lmp)} :\n${viewModel.benDetails.lastMenstrualPeriod ?: ""}" + binding.nrScHwc.text = + "${resources.getString(R.string.nearest_sc_hwc)} :\n${viewModel._microBirthPlanCache.nearestSc ?: ""}" + binding.block.text = + "${resources.getString(R.string.block)} :\n${viewModel._microBirthPlanCache.block ?: ""}" + + if(viewModel.benDetails.marriageDate!=null){ + val marriageDateLong = viewModel.benDetails.marriageDate + marriageDateString = + DateFormat.format("dd/MM/yyyy", marriageDateLong?.let { it1 -> Date(it1) }) + .toString() + } + + + if (viewModel._hRPPregnantAssessCache != null) { + if (viewModel._hRPPregnantAssessCache?.edd != null) { + val eddDateLong = viewModel._hRPPregnantAssessCache?.edd + val eddDateString: String = + DateFormat.format("dd/MM/yyyy", eddDateLong?.let { it1 -> Date(it1) }) + .toString() + binding.edd.text = + "${resources.getString(R.string.edd)} :\n${eddDateString ?: ""}" + binding.tvEddDate.text = + "${resources.getString(R.string.edd)}:${eddDateString ?: ""}" + } else { + + binding.edd.text = + "${resources.getString(R.string.edd)} :\n${marriageDateString ?: ""}" + binding.tvEddDate.text = + "${resources.getString(R.string.edd)} :\n${marriageDateString ?: ""}" + } + }else{ + binding.tvEddDate.text = + "${resources.getString(R.string.edd)} :\n${marriageDateString ?: ""}" + binding.edd.text = + "${resources.getString(R.string.edd)} :\n${marriageDateString?: ""}" + } + + + + binding.nrPhc.text = + "${resources.getString(R.string.nearest_24x7_phc)} :\n${viewModel._microBirthPlanCache.nearestPhc ?: ""}" + binding.bankAccNo.text = + "${resources.getString(R.string.bank_acc_no)} :\n${viewModel._microBirthPlanCache.bankac ?: ""}" + binding.nrFru.text = + "${resources.getString(R.string.nearest_fru)} :\n${viewModel._microBirthPlanCache.nearestFru ?: ""}" + binding.nrUsg.text = + "${resources.getString(R.string.nearest_usg_centre)} :\n${viewModel._microBirthPlanCache.usg ?: ""}" + binding.bloodGrp.text = + "${resources.getString(R.string.blood_group)} :\n${viewModel._microBirthPlanCache.bloodGroup ?: ""}" + binding.bloodDonr.text = + "${resources.getString(R.string.b_blood_donor)} ${viewModel._microBirthPlanCache.bloodDonors1 ?: ""}\n2 - " + "${viewModel._microBirthPlanCache.bloodDonors2 ?: ""}" + binding.birthComp.text = + "${resources.getString(R.string.birth_companion)} :\n${viewModel._microBirthPlanCache.birthCompanion ?: ""}" + binding.prsonTkCare.text = + "${resources.getString(R.string.person_who_will_take_care_of_children_if_any_when_the_pw_is_admitted_for_delivery)} :\n${viewModel._microBirthPlanCache.careTaker ?: ""}" + binding.nameOfContNo.text = + "${resources.getString(R.string.name_of_vhsnd_community_member_for_support_during_emergency)} :\n${viewModel._microBirthPlanCache.communityMember ?: ""}" + binding.modeOfTrasp.text = + "${resources.getString(R.string.mode_of_transportation_in_case_of_labour_pain)} :\n${viewModel._microBirthPlanCache.modeOfTransportation ?: ""}" } @@ -124,7 +208,8 @@ class HRPMicroBirthPlanTable : Fragment() { private fun getScreenShotFromView(v: View): Bitmap? { var screenshot: Bitmap? = null try { - screenshot = Bitmap.createBitmap(v.measuredWidth, v.measuredHeight, Bitmap.Config.ARGB_8888) + screenshot = + Bitmap.createBitmap(v.measuredWidth, v.measuredHeight, Bitmap.Config.ARGB_8888) val canvas = Canvas(screenshot) v.draw(canvas) } catch (e: Exception) { @@ -145,36 +230,52 @@ class HRPMicroBirthPlanTable : Fragment() { put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES) } - val imageUri: Uri? = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues) + val imageUri: Uri? = + resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues) shareImage(imageUri!!) fos = imageUri?.let { resolver.openOutputStream(it) } } } else { - val imagesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + val imagesDir = + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) val image = File(imagesDir, filename) - var uriFile=Uri.fromFile(image) + var uriFile = Uri.fromFile(image) shareImage(uriFile) fos = FileOutputStream(image) } fos?.use { bitmap.compress(Bitmap.CompressFormat.JPEG, 100, it) - Toast.makeText(activity , "Captured View and saved to Gallery" , Toast.LENGTH_SHORT).show() - } + Toast.makeText(activity, "Captured View and saved to Gallery", Toast.LENGTH_SHORT) + .show() } + } private fun shareImage(imageUri: Uri) { - val captionText = " ${getString(R.string.micro_birth_plan)} " + - "\n ASHA Name : ${viewModel.currentUser!!.name} " + - "\n Sub-center : ${viewModel.currentLocation!!.village.name}" - val intent = Intent(Intent.ACTION_SEND) - intent.putExtra(Intent.EXTRA_STREAM, imageUri) - intent.putExtra(Intent.EXTRA_TEXT, captionText) - intent.putExtra(Intent.EXTRA_SUBJECT, "Subject Here") - intent.setPackage("com.whatsapp") - intent.setType("image/png") - startActivity(intent) + if (isPackageExist(requireContext(), "com.whatsapp")) { + val captionText = " ${getString(R.string.micro_birth_plan)} " + + "\n ASHA Name : ${viewModel.currentUser!!.name} " + + "\n Sub-center : ${viewModel.currentLocation!!.village.name}" + val intent = Intent(Intent.ACTION_SEND) + intent.putExtra(Intent.EXTRA_STREAM, imageUri) + intent.putExtra(Intent.EXTRA_TEXT, captionText) + intent.putExtra(Intent.EXTRA_SUBJECT, "Subject Here") + intent.setPackage("com.whatsapp") + intent.setType("image/png") + startActivity(intent) + + } else { + Toast.makeText( + requireContext(), + "Whats App is not installed in phone!", + Toast.LENGTH_SHORT + ).show() + } + } + fun isPackageExist(context: Context, target: String): Boolean { + return context.packageManager.getInstalledApplications(0) + .find { info -> info.packageName == target } != null } diff --git a/app/src/main/res/layout/fragment_h_r_p_micro_birth_plan_table.xml b/app/src/main/res/layout/fragment_h_r_p_micro_birth_plan_table.xml index 2463d06bf..3c06b5f03 100644 --- a/app/src/main/res/layout/fragment_h_r_p_micro_birth_plan_table.xml +++ b/app/src/main/res/layout/fragment_h_r_p_micro_birth_plan_table.xml @@ -34,11 +34,12 @@ android:text="@string/micro_birth_plan" android:gravity="center" android:background="@color/md_theme_dark_error" - android:layout_weight="2" + android:layout_weight="1" android:textStyle="bold" android:padding="8dp"/> Continue Home Home - Scheduler + Dashboard Selected Village All\nHousehold All\nBeneficiaries From 37a530480e9bba52082bb439a047e0cc250ade48 Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Thu, 28 Nov 2024 16:51:51 +0530 Subject: [PATCH 099/892] Enabled screen sharing flag --- .../piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt index 58781088a..5814a1971 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt @@ -176,7 +176,7 @@ class HomeActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // This will block user to cast app screen // Toggle screencast mode for staging & production builds - // window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); + window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); super.onCreate(savedInstanceState) _binding = ActivityHomeBinding.inflate(layoutInflater) setContentView(binding.root) @@ -206,7 +206,7 @@ class HomeActivity : AppCompatActivity() { override fun onResume() { // This will block user to cast app screen // Toggle screencast mode for staging & production builds - // window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); + window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); super.onResume() if (isDeviceRootedOrEmulator()) { AlertDialog.Builder(this) From 9513406c827098fe4584eb7fe0f2914f83736d3a Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Mon, 2 Dec 2024 14:36:14 +0530 Subject: [PATCH 100/892] FLW 132-Validation Enhancement for MCP Card Number Field to Allow Special Characters --- .../configuration/HouseholdFormDataset.kt | 8 +- .../InfantRegistrationDataset.kt | 94 +++++++++---------- .../PregnantWomanAncVisitDataset.kt | 26 +++-- .../PregnantWomanRegistrationDataset.kt | 12 +-- 4 files changed, 70 insertions(+), 70 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/HouseholdFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/HouseholdFormDataset.kt index 96f422f6d..51547ad97 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/HouseholdFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/HouseholdFormDataset.kt @@ -435,10 +435,12 @@ class HouseholdFormDataset(context: Context, language: Languages) : Dataset(cont return when (formId) { firstNameHeadOfFamily.id -> { validateEmptyOnEditText(firstNameHeadOfFamily) - validateAllCapsOrSpaceOnEditText(firstNameHeadOfFamily) + // validateAllCapsOrSpaceOnEditText(firstNameHeadOfFamily) } - - lastNameHeadOfFamily.id -> validateAllCapsOrSpaceOnEditText(lastNameHeadOfFamily) + /*These validations commented because Hindi and Asamese language name and sirname should store in db + * + * */ + lastNameHeadOfFamily.id -> validateEmptyOnEditText(firstNameHeadOfFamily)// validateAllCapsOrSpaceOnEditText(lastNameHeadOfFamily) mobileNoHeadOfFamily.id -> { validateEmptyOnEditText(mobileNoHeadOfFamily) validateMobileNumberOnEditText(mobileNoHeadOfFamily) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/InfantRegistrationDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/InfantRegistrationDataset.kt index 49c098e1a..d7b936fba 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/InfantRegistrationDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/InfantRegistrationDataset.kt @@ -129,45 +129,45 @@ class InfantRegistrationDataset( hasDependants = false, ) - private val opv0Dose = FormElement( - id = 13, - inputType = InputType.DATE_PICKER, - title = "OPV0 Dose", - arrayId = -1, - required = false, - max = System.currentTimeMillis(), - hasDependants = true - ) +// private val opv0Dose = FormElement( +// id = 13, +// inputType = InputType.DATE_PICKER, +// title = "OPV0 Dose", +// arrayId = -1, +// required = false, +// max = System.currentTimeMillis(), +// hasDependants = true +// ) - private val bcgDose = FormElement( - id = 14, - inputType = InputType.DATE_PICKER, - title = "BCG Dose", - arrayId = -1, - required = false, - max = System.currentTimeMillis(), - hasDependants = true - ) +// private val bcgDose = FormElement( +// id = 14, +// inputType = InputType.DATE_PICKER, +// title = "BCG Dose", +// arrayId = -1, +// required = false, +// max = System.currentTimeMillis(), +// hasDependants = true +// ) - private val hepBDose = FormElement( - id = 15, - inputType = InputType.DATE_PICKER, - title = "HEP B-0 Dose", - arrayId = -1, - required = false, - max = System.currentTimeMillis(), - hasDependants = true - ) +// private val hepBDose = FormElement( +// id = 15, +// inputType = InputType.DATE_PICKER, +// title = "HEP B-0 Dose", +// arrayId = -1, +// required = false, +// max = System.currentTimeMillis(), +// hasDependants = true +// ) - private val vitkDose = FormElement( - id = 16, - inputType = InputType.DATE_PICKER, - title = "VITK Dose", - arrayId = -1, - required = false, - max = System.currentTimeMillis(), - hasDependants = true - ) +// private val vitkDose = FormElement( +// id = 16, +// inputType = InputType.DATE_PICKER, +// title = "VITK Dose", +// arrayId = -1, +// required = false, +// max = System.currentTimeMillis(), +// hasDependants = true +// ) suspend fun setUpPage( @@ -184,10 +184,10 @@ class InfantRegistrationDataset( hadBirthDefect, // birthDefect, // otherDefect, - weight, breastFeedingStarted, opv0Dose, bcgDose, hepBDose, vitkDose + weight, breastFeedingStarted, //opv0Dose, bcgDose, hepBDose, vitkDose ) if (deliveryOutcomeCache != null) { - opv0Dose.min = deliveryOutcomeCache.dateOfDelivery + /* opv0Dose.min = deliveryOutcomeCache.dateOfDelivery bcgDose.min = deliveryOutcomeCache.dateOfDelivery hepBDose.min = deliveryOutcomeCache.dateOfDelivery vitkDose.min = deliveryOutcomeCache.dateOfDelivery @@ -206,7 +206,7 @@ class InfantRegistrationDataset( vitkDose.max = it + TimeUnit.DAYS.toMillis(1) } } - } + }*/ } if (pwrCache != null && deliveryOutcomeCache != null) { val weeksOfPregnancy = deliveryOutcomeCache.dateOfDelivery?.let { @@ -241,10 +241,10 @@ class InfantRegistrationDataset( otherDefect, weight, breastFeedingStarted, - opv0Dose, + /* opv0Dose, bcgDose, hepBDose, - vitkDose + vitkDose*/ ) babyName.value = saved.babyName infantTerm.value = saved.infantTerm @@ -258,10 +258,10 @@ class InfantRegistrationDataset( otherDefect.value = saved.otherDefect weight.value = saved.weight.toString() breastFeedingStarted.value = if (saved.breastFeedingStarted == true) "Yes" else "No" - opv0Dose.value = saved.opv0Dose?.let { getDateFromLong(it) } - bcgDose.value = saved.bcgDose?.let { getDateFromLong(it) } - hepBDose.value = saved.hepBDose?.let { getDateFromLong(it) } - vitkDose.value = saved.vitkDose?.let { getDateFromLong(it) } +// opv0Dose.value = saved.opv0Dose?.let { getDateFromLong(it) } +// bcgDose.value = saved.bcgDose?.let { getDateFromLong(it) } +// hepBDose.value = saved.hepBDose?.let { getDateFromLong(it) } +// vitkDose.value = saved.vitkDose?.let { getDateFromLong(it) } } setUpPage(list) @@ -326,10 +326,10 @@ class InfantRegistrationDataset( form.otherDefect = otherDefect.value form.weight = weight.value?.toDouble() form.breastFeedingStarted = breastFeedingStarted.value == "Yes" - form.opv0Dose = getLongFromDate(opv0Dose.value) + /* form.opv0Dose = getLongFromDate(opv0Dose.value) form.bcgDose = getLongFromDate(bcgDose.value) form.hepBDose = getLongFromDate(hepBDose.value) - form.vitkDose = getLongFromDate(vitkDose.value) + form.vitkDose = getLongFromDate(vitkDose.value)*/ } } } \ No newline at end of file diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt index ad6d80b96..bc3041931 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt @@ -237,7 +237,7 @@ class PregnantWomanAncVisitDataset( backgroundDrawable=R.drawable.ic_bg_circular, iconDrawableRes=R.drawable.ic_bmi, ) - /* private val numFolicAcidTabGiven = FormElement( + private val numFolicAcidTabGiven = FormElement( id = 19, inputType = InputType.EDIT_TEXT, title = "No. of Folic Acid Tabs given", @@ -249,7 +249,7 @@ class PregnantWomanAncVisitDataset( showDrawable = true, backgroundDrawable=R.drawable.ic_bg_circular, iconDrawableRes=R.drawable.ic_tablets, - )*/ + ) private val numIfaAcidTabGiven = FormElement( id = 20, inputType = InputType.EDIT_TEXT, @@ -397,7 +397,7 @@ class PregnantWomanAncVisitDataset( dateOfTTOrTd1, dateOfTTOrTd2, dateOfTTOrTdBooster, - // numFolicAcidTabGiven, + numFolicAcidTabGiven, numIfaAcidTabGiven, anyHighRisk, highRiskReferralFacility, @@ -451,8 +451,7 @@ class PregnantWomanAncVisitDataset( list.remove(fundalHeight) list.remove(numIfaAcidTabGiven) } else { - // list.remove(numFolicAcidTabGiven) - list.remove(numIfaAcidTabGiven) + list.remove(numFolicAcidTabGiven) } weeks.toString() } @@ -467,8 +466,7 @@ class PregnantWomanAncVisitDataset( list.remove(fundalHeight) list.remove(numIfaAcidTabGiven) } else { - // list.remove(numFolicAcidTabGiven) - // list.remove(numIfaAcidTabGiven) + list.remove(numFolicAcidTabGiven) } if (woP >= Konstants.minWeekToShowDelivered) { if (!list.contains(deliveryDone)) list.add(deliveryDone) @@ -501,7 +499,7 @@ class PregnantWomanAncVisitDataset( dateOfTTOrTd1.value = regis.tt1?.let { getDateFromLong(it) } dateOfTTOrTd2.value = regis.tt2?.let { getDateFromLong(it) } dateOfTTOrTdBooster.value = regis.ttBooster?.let { getDateFromLong(it) } - // numFolicAcidTabGiven.value = savedAnc.numFolicAcidTabGiven.toString() + numFolicAcidTabGiven.value = savedAnc.numFolicAcidTabGiven.toString() numIfaAcidTabGiven.value = savedAnc.numIfaAcidTabGiven.toString() savedAnc.anyHighRisk?.let { anyHighRisk.value = @@ -611,14 +609,14 @@ class PregnantWomanAncVisitDataset( val listChanged2 = if (weeks <= 12) triggerDependants( source = ancVisit, - addItems = listOf(numIfaAcidTabGiven), + addItems = listOf(numFolicAcidTabGiven), removeItems = listOf(fundalHeight, numIfaAcidTabGiven), position = getIndexById(dateOfTTOrTdBooster.id) + 1 ) else { triggerDependants( source = ancVisit, - removeItems = listOf(numIfaAcidTabGiven), + removeItems = listOf(numFolicAcidTabGiven), addItems = listOf(fundalHeight), position = getIndexById(hb.id) + 1 ) @@ -644,14 +642,14 @@ class PregnantWomanAncVisitDataset( if (ancVisit.value == "1") triggerDependants( source = ancVisit, - addItems = listOf(numIfaAcidTabGiven), + addItems = listOf(numFolicAcidTabGiven), removeItems = listOf(fundalHeight, numIfaAcidTabGiven), position = getIndexById(dateOfTTOrTdBooster.id) + 1 ) else { triggerDependants( source = ancVisit, - removeItems = listOf(numIfaAcidTabGiven), + removeItems = listOf(numFolicAcidTabGiven), addItems = listOf(fundalHeight), position = getIndexById(hb.id) + 1 ) @@ -712,7 +710,7 @@ class PregnantWomanAncVisitDataset( -1 } - // numFolicAcidTabGiven.id -> validateIntMinMax(numFolicAcidTabGiven) + numFolicAcidTabGiven.id -> validateIntMinMax(numFolicAcidTabGiven) numIfaAcidTabGiven.id -> validateIntMinMax(numIfaAcidTabGiven) anyHighRisk.id -> triggerDependants( source = anyHighRisk, @@ -806,7 +804,7 @@ class PregnantWomanAncVisitDataset( cache.randomBloodSugarTest = randomBloodSugarTest.value cache.randomBloodSugarTestId = randomBloodSugarTest.getPosition() updateRegistrationForTdX() - // cache.numFolicAcidTabGiven = numFolicAcidTabGiven.value?.toInt() ?: 0 + cache.numFolicAcidTabGiven = numFolicAcidTabGiven.value?.toInt() ?: 0 cache.numIfaAcidTabGiven = numIfaAcidTabGiven.value?.toInt() ?: 0 anyHighRisk.value?.let { cache.anyHighRisk = it == anyHighRisk.entries!!.last() diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanRegistrationDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanRegistrationDataset.kt index 8972950a4..6d686a972 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanRegistrationDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanRegistrationDataset.kt @@ -54,7 +54,7 @@ class PregnantWomanRegistrationDataset( isMobileNumber = true, etMaxLength = 12 ) - private val mcpCardNumber = FormElement( +/* private val mcpCardNumber = FormElement( id = 3, inputType = InputType.EDIT_TEXT, title = resources.getString(R.string.pwrdst_mcp_card_no), @@ -62,7 +62,7 @@ class PregnantWomanRegistrationDataset( etInputType = android.text.InputType.TYPE_CLASS_NUMBER or android.text.InputType.TYPE_NUMBER_VARIATION_NORMAL, isMobileNumber = true, etMaxLength = 12 - ) + )*/ private val name = FormElement( id = 4, inputType = InputType.TEXT_VIEW, @@ -409,7 +409,7 @@ class PregnantWomanRegistrationDataset( val list = mutableListOf( dateOfReg, rchId, - mcpCardNumber, + // mcpCardNumber, name, husbandName, age, @@ -571,7 +571,7 @@ class PregnantWomanRegistrationDataset( dateOfhivTestDone.max = maxDate dateOfhbsAgTestDone.max = maxDate } - mcpCardNumber.value = it.mcpCardNumber.toString() + // mcpCardNumber.value = it.mcpCardNumber.toString() lmp.value = getDateFromLong(it.lmpDate) if (it.lmpDate > 0) { lmp.isEnabled = false @@ -697,7 +697,7 @@ class PregnantWomanRegistrationDataset( override suspend fun handleListOnValueChanged(formId: Int, index: Int): Int { return when (formId) { rchId.id -> validateRchIdOnEditText(rchId) - mcpCardNumber.id -> validateMcpOnEditText(mcpCardNumber) + // mcpCardNumber.id -> validateMcpOnEditText(mcpCardNumber) dateOfReg.id -> { dateOfReg.value?.let { val dateOfRegLong = getLongFromDate(it) @@ -940,7 +940,7 @@ class PregnantWomanRegistrationDataset( override fun mapValues(cacheModel: FormDataModel, pageNumber: Int) { (cacheModel as PregnantWomanRegistrationCache).let { form -> form.dateOfRegistration = getLongFromDate(dateOfReg.value) - form.mcpCardNumber = mcpCardNumber.value?.takeIf { it.isNotEmpty() }?.toLong() ?: 0 + // form.mcpCardNumber = mcpCardNumber.value?.takeIf { it.isNotEmpty() }?.toLong() ?: 0 form.rchId = rchId.value?.takeIf { it.isNotEmpty() }?.toLong() ?: 0 form.lmpDate = getLongFromDate(lmp.value) form.bloodGroup = From 8cb7140ced0a44608b8c7f8d38803d22c648e924 Mon Sep 17 00:00:00 2001 From: ayushbisaria123 <109733040+ayushbisaria123@users.noreply.github.com> Date: Tue, 3 Dec 2024 18:20:22 +0530 Subject: [PATCH 101/892] Update build.gradle --- app/build.gradle | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d7851de35..078711bf7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,8 +64,7 @@ android { applicationId "org.piramalswasthya.sakhi" resValue "string", "app_native_name", "উৎপ্ৰেৰণা-Uat" // TMC Server Staging API Base URL - buildConfigField "String", "BASE_TMC_URL", "\"https://uatamrit.piramalswasthya.org/\"" - + buildConfigField "String", "BASE_TMC_URL", "\"https://amritdemo.piramalswasthya.org/\"" // ABHA v1/v2 Staging Base URL buildConfigField "String", "BASE_ABHA_URL", "\"https://healthidsbx.abdm.gov.in/api/\"" // ABHA v3 Staging Base URL @@ -74,8 +73,8 @@ android { production { applicationId "org.piramalswasthya.sakhi" // TMC Server Production API Base URL - buildConfigField "String", "BASE_TMC_URL", "\"https://assamtmc.piramalswasthya.org/\"" - + // buildConfigField "String", "BASE_TMC_URL", "\"https://assamtmc.piramalswasthya.org/\"" + buildConfigField "String", "BASE_TMC_URL", "\"https://amritdemo.piramalswasthya.org/\"" // ABHA v3 Production Base URL buildConfigField "String", "BASE_ABHA_URL", "\"https://healthid.abdm.gov.in/api/\"" } @@ -127,6 +126,7 @@ dependencies { implementation 'com.google.android.material:material:1.8.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation "androidx.recyclerview:recyclerview:1.3.1" + implementation 'com.google.android.material:material:1.3.0-alpha02' //Navigation implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" @@ -202,9 +202,6 @@ dependencies { implementation 'id.zelory:compressor:3.0.1' implementation 'androidx.legacy:legacy-support-v4:1.0.0' - //Dimens Library - implementation 'com.intuit.sdp:sdp-android:1.1.0' - } secrets { propertiesFileName = "secrets.properties" From a0dae60cc79ef9602b58c382696651acfd616038 Mon Sep 17 00:00:00 2001 From: ayushbisaria123 <109733040+ayushbisaria123@users.noreply.github.com> Date: Tue, 3 Dec 2024 18:22:37 +0530 Subject: [PATCH 102/892] Update AndroidManifest.xml --- app/src/main/AndroidManifest.xml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 09d69b521..56a588467 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,7 +9,7 @@ - + @@ -21,9 +21,9 @@ android:fullBackupContent="@xml/backup_rules" android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher" - android:requestLegacyExternalStorage="true" android:label="@string/app_native_name" android:largeHeap="true" + android:requestLegacyExternalStorage="true" android:roundIcon="@mipmap/ic_launcher_round" android:theme="@style/Theme.Sakhi" tools:targetApi="31"> @@ -42,6 +42,7 @@ android:exported="false" android:label="@string/title_activity_home" android:screenOrientation="portrait" + android:windowSoftInputMode="adjustPan" tools:ignore="LockedOrientationActivity"> - \ No newline at end of file + From c5d4be07d575c7711d0f727f47dbe9bd7cc369bb Mon Sep 17 00:00:00 2001 From: ayushbisaria123 <109733040+ayushbisaria123@users.noreply.github.com> Date: Tue, 3 Dec 2024 18:25:04 +0530 Subject: [PATCH 103/892] Update HomeActivity.kt --- .../sakhi/ui/home_activity/HomeActivity.kt | 115 +++++++++++++++++- 1 file changed, 109 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt index 5814a1971..fbd5033ba 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt @@ -2,13 +2,19 @@ package org.piramalswasthya.sakhi.ui.home_activity import android.content.Context import android.content.Intent +import android.graphics.Bitmap +import android.os.Build import android.os.Bundle import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.view.WindowManager +import android.webkit.WebResourceRequest +import android.webkit.WebView +import android.webkit.WebViewClient import android.widget.ImageView +import android.widget.ProgressBar import android.widget.TextView import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts @@ -22,6 +28,8 @@ import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.NavigationUI import androidx.navigation.ui.setupWithNavController import com.bumptech.glide.Glide +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.firebase.crashlytics.internal.common.CommonUtils.isEmulator import com.google.firebase.crashlytics.internal.common.CommonUtils.isRooted @@ -30,7 +38,6 @@ import dagger.hilt.InstallIn import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.EntryPointAccessors import dagger.hilt.components.SingletonComponent -import org.piramalswasthya.sakhi.BuildConfig import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.database.shared_preferences.PreferenceDao import org.piramalswasthya.sakhi.databinding.ActivityHomeBinding @@ -42,7 +49,6 @@ import org.piramalswasthya.sakhi.ui.home_activity.home.HomeViewModel import org.piramalswasthya.sakhi.ui.home_activity.sync.SyncBottomSheetFragment import org.piramalswasthya.sakhi.ui.login_activity.LoginActivity import org.piramalswasthya.sakhi.ui.service_location_activity.ServiceLocationActivity -import org.piramalswasthya.sakhi.utils.RootedUtil import org.piramalswasthya.sakhi.work.WorkerUtils import java.util.* import javax.inject.Inject @@ -78,6 +84,7 @@ class HomeActivity : AppCompatActivity() { } + private val viewModel: HomeViewModel by viewModels() private val langChooseAlert by lazy { @@ -116,7 +123,6 @@ class HomeActivity : AppCompatActivity() { }.create() } - private val logoutAlert by lazy { var str = "" if (viewModel.unprocessedRecords > 0) { @@ -176,7 +182,7 @@ class HomeActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // This will block user to cast app screen // Toggle screencast mode for staging & production builds - window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); + window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE) super.onCreate(savedInstanceState) _binding = ActivityHomeBinding.inflate(layoutInflater) setContentView(binding.root) @@ -184,6 +190,15 @@ class HomeActivity : AppCompatActivity() { setUpNavHeader() setUpFirstTimePullWorker() setUpMenu() + binding.addFab.setOnClickListener { this } + + window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); + + binding.addFab.setOnClickListener { + + displaychatdialog() + + } if (isDeviceRootedOrEmulator()) { AlertDialog.Builder(this) @@ -203,10 +218,89 @@ class HomeActivity : AppCompatActivity() { } } + private fun displaychatdialog() { + + val dialog = BottomSheetDialog(this) + + // on below line we are inflating a layout file which we have created. + val view = layoutInflater.inflate(R.layout.bottomsheet_chat_window, null) + + val web = view.findViewById(R.id.webv) + val progress = view.findViewById(R.id.progressBarv) + + + +// Enable JavaScript + web.settings.javaScriptEnabled = true + web.settings.javaScriptCanOpenWindowsAutomatically = true + web.isVerticalScrollBarEnabled = true + + + + +// Load URL + web.loadUrl("https://aibot.helloyubo.com/piramal_bot_rag") + + +// Handle WebView events + web.webViewClient = object : WebViewClient() { + override fun shouldOverrideUrlLoading( + view: WebView, + request: WebResourceRequest + ): Boolean { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + view.loadUrl(request.url.toString()) + } + return true + } + + override fun onPageStarted(webview: WebView, url: String, favicon: Bitmap?) { + super.onPageStarted(webview, url, favicon) + // Show ProgressBar when the page starts loading + progress.visibility = View.VISIBLE + web.visibility = View.GONE + } + + override fun onPageFinished(webview: WebView, url: String) { + super.onPageFinished(webview, url) + // Hide ProgressBar when the page finishes loading + progress.visibility = View.GONE + web.visibility = View.VISIBLE + } + } + + + // on below line we are creating a variable for our button + // which we are using to dismiss our dialog. + // on below line we are adding on click listener + // for our dismissing the dialog button. + + // below line is use to set cancelable to avoid + // closing of dialog box when clicking on the screen. + dialog.setCancelable(true) + + // on below line we are setting + // content view to our view. + dialog.setContentView(view) + dialog.behavior.setPeekHeight(6000) + + + // on below line we are calling + // a show method to display a dialog. + + + dialog.show() + + + } + + + + override fun onResume() { // This will block user to cast app screen // Toggle screencast mode for staging & production builds - window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); + window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE) super.onResume() if (isDeviceRootedOrEmulator()) { AlertDialog.Builder(this) @@ -350,6 +444,15 @@ class HomeActivity : AppCompatActivity() { true } + + binding.navView.menu.findItem(R.id.ChatFragment).setOnMenuItemClickListener { + displaychatdialog() + /*navController.popBackStack(R.id.homeFragment, false) + startActivity(Intent(this, ChatSupport::class.java))*/ + binding.drawerLayout.close() + true + + } } @@ -380,4 +483,4 @@ class HomeActivity : AppCompatActivity() { } -} \ No newline at end of file +} From 1ad16d32726341de3eb7b2e9f9710db25ffc5dd6 Mon Sep 17 00:00:00 2001 From: ayushbisaria123 <109733040+ayushbisaria123@users.noreply.github.com> Date: Tue, 3 Dec 2024 18:28:02 +0530 Subject: [PATCH 104/892] Add files via upload --- app/src/main/res/drawable/baseline_chat_24.xml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 app/src/main/res/drawable/baseline_chat_24.xml diff --git a/app/src/main/res/drawable/baseline_chat_24.xml b/app/src/main/res/drawable/baseline_chat_24.xml new file mode 100644 index 000000000..956385a9b --- /dev/null +++ b/app/src/main/res/drawable/baseline_chat_24.xml @@ -0,0 +1,5 @@ + + + From 060250ddbe9bb2e5e43ce9d30de78a633c92c198 Mon Sep 17 00:00:00 2001 From: ayushbisaria123 <109733040+ayushbisaria123@users.noreply.github.com> Date: Tue, 3 Dec 2024 18:29:56 +0530 Subject: [PATCH 105/892] Add files via upload --- app/src/main/res/drawable/rounded_dialog.xml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 app/src/main/res/drawable/rounded_dialog.xml diff --git a/app/src/main/res/drawable/rounded_dialog.xml b/app/src/main/res/drawable/rounded_dialog.xml new file mode 100644 index 000000000..c812680d3 --- /dev/null +++ b/app/src/main/res/drawable/rounded_dialog.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file From 60a6dee0c8d74a6125ab66aeba03a49e647fc9ae Mon Sep 17 00:00:00 2001 From: ayushbisaria123 <109733040+ayushbisaria123@users.noreply.github.com> Date: Tue, 3 Dec 2024 18:32:31 +0530 Subject: [PATCH 106/892] Add files via upload --- .../res/layout/bottomsheet_chat_window.xml | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 app/src/main/res/layout/bottomsheet_chat_window.xml diff --git a/app/src/main/res/layout/bottomsheet_chat_window.xml b/app/src/main/res/layout/bottomsheet_chat_window.xml new file mode 100644 index 000000000..1a9e41a9b --- /dev/null +++ b/app/src/main/res/layout/bottomsheet_chat_window.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 27c9135824bca675e37a5f01b84e4a105e31b899 Mon Sep 17 00:00:00 2001 From: ayushbisaria123 <109733040+ayushbisaria123@users.noreply.github.com> Date: Tue, 3 Dec 2024 18:35:28 +0530 Subject: [PATCH 107/892] Update activity_home.xml --- app/src/main/res/layout/activity_home.xml | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index afb5b4fb8..52d7dc113 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -51,6 +51,7 @@ + + + + + + + + + - \ No newline at end of file + From 2d88e783bed88226597c7929caa819359b0168e8 Mon Sep 17 00:00:00 2001 From: ayushbisaria123 <109733040+ayushbisaria123@users.noreply.github.com> Date: Tue, 3 Dec 2024 18:36:36 +0530 Subject: [PATCH 108/892] Update activity_home_drawer.xml --- app/src/main/res/menu/activity_home_drawer.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/menu/activity_home_drawer.xml b/app/src/main/res/menu/activity_home_drawer.xml index e7234b340..4041806c2 100644 --- a/app/src/main/res/menu/activity_home_drawer.xml +++ b/app/src/main/res/menu/activity_home_drawer.xml @@ -39,6 +39,10 @@ android:id="@+id/incentivesFragment" android:icon="@drawable/ic__incentive" android:title="@string/incentive_fragment_title" /> + @@ -73,4 +77,4 @@ - \ No newline at end of file + From 5a8412c3a219338f2c64fbe38ef595c2df254ce2 Mon Sep 17 00:00:00 2001 From: ayushbisaria123 <109733040+ayushbisaria123@users.noreply.github.com> Date: Tue, 3 Dec 2024 18:37:54 +0530 Subject: [PATCH 109/892] Update styles.xml --- app/src/main/res/values/styles.xml | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 8b4e0aa56..969896856 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -84,19 +84,17 @@ ?attr/colorOnPrimary - - - \ No newline at end of file + + + From a2d9314fe9f12ab1f44b6f06a8209aa3d1410bd9 Mon Sep 17 00:00:00 2001 From: ShaanOnDev Date: Thu, 5 Dec 2024 13:28:07 +0530 Subject: [PATCH 110/892] Made Build Configurations Dynamic --- .gitignore | 2 ++ app/build.gradle | 18 ++++++++++++---- .../sakhi/network/AbhaApiService.kt | 21 +++---------------- .../sakhi/ui/home_activity/HomeActivity.kt | 18 ++++++++++++---- .../sakhi/ui/login_activity/LoginActivity.kt | 8 +++++-- app/src/main/res/layout/activity_home.xml | 3 ++- 6 files changed, 41 insertions(+), 29 deletions(-) diff --git a/.gitignore b/.gitignore index 57f8c338a..83031d71a 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ /app/release/* **/google-services.json /app/src/staging/google-services.json +/app/src/uat/google-services.json +/app/src/production/google-services.json \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index d7851de35..9304fb0b1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -22,7 +22,7 @@ android { minSdk 23 targetSdk 33 versionCode 2 - versionName "2.0" + versionName "2.0.0" resConfigs "en", "hi", "as" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" // TMC Server Staging API Base URL @@ -58,6 +58,10 @@ android { buildConfigField "String", "BASE_ABHA_URL", "\"https://healthidsbx.abdm.gov.in/api/\"" // ABHA v3 Staging Base URL // buildConfigField "String", "BASE_ABHA_URL", "\"https://abhasbx.abdm.gov.in/abha/api/\"" + // ABHA v1/v2 Staging Session/Token URL + buildConfigField "String", "ABHA_TOKEN_URL", "\"https://dev.abdm.gov.in/gateway/v0.5/sessions\"" + // ABHA v1/v2 Staging Auth Cert URL + buildConfigField "String", "ABHA_AUTH_URL", "\"https://healthidsbx.abdm.gov.in/api/v2/auth/cert\"" } uat { applicationIdSuffix ".uat" @@ -65,19 +69,25 @@ android { resValue "string", "app_native_name", "উৎপ্ৰেৰণা-Uat" // TMC Server Staging API Base URL buildConfigField "String", "BASE_TMC_URL", "\"https://uatamrit.piramalswasthya.org/\"" - // ABHA v1/v2 Staging Base URL buildConfigField "String", "BASE_ABHA_URL", "\"https://healthidsbx.abdm.gov.in/api/\"" // ABHA v3 Staging Base URL // buildConfigField "String", "BASE_ABHA_URL", "\"https://abhasbx.abdm.gov.in/abha/api/\"" + // ABHA v1/v2 UAT Session/Token URL + buildConfigField "String", "ABHA_TOKEN_URL", "\"https://dev.abdm.gov.in/gateway/v0.5/sessions\"" + // ABHA v1/v2 UAT Auth Cert URL + buildConfigField "String", "ABHA_AUTH_URL", "\"https://healthidsbx.abdm.gov.in/api/v2/auth/cert\"" } production { applicationId "org.piramalswasthya.sakhi" // TMC Server Production API Base URL buildConfigField "String", "BASE_TMC_URL", "\"https://assamtmc.piramalswasthya.org/\"" - - // ABHA v3 Production Base URL + // ABHA v1/v2/v3 Production Base URL buildConfigField "String", "BASE_ABHA_URL", "\"https://healthid.abdm.gov.in/api/\"" + // ABHA v1/v2 Production Session/Token URL + buildConfigField "String", "ABHA_TOKEN_URL", "\"https://live.abdm.gov.in/gateway/v0.5/sessions\"" + // ABHA v1/v2 Production Auth Cert URL + buildConfigField "String", "ABHA_AUTH_URL", "\"https://healthid.abdm.gov.in/api/v2/auth/cert\"" } } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt index 3378c6653..0e8e51f0a 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt @@ -1,27 +1,19 @@ package org.piramalswasthya.sakhi.network import okhttp3.ResponseBody +import org.piramalswasthya.sakhi.BuildConfig import retrofit2.Response import retrofit2.http.* interface AbhaApiService { - // Token Fetching for Staging (v1/v2) @Headers("No-Auth: true") @POST suspend fun getToken( - @Url url: String = "https://dev.abdm.gov.in/gateway/v0.5/sessions", + @Url url: String = BuildConfig.ABHA_TOKEN_URL, @Body request: AbhaTokenRequest = AbhaTokenRequest() ): Response - // Token Fetching for Production (v1/v2) -// @Headers("No-Auth: true") -// @POST -// suspend fun getToken( -// @Url url: String = "https://live.abdm.gov.in/gateway/v0.5/sessions", -// @Body request: AbhaTokenRequest = AbhaTokenRequest() -// ): Response - @POST("v1/registration/aadhaar/generateOtp") suspend fun generateAadhaarOtp(@Body aadhaar: AbhaGenerateAadhaarOtpRequest): Response @@ -55,18 +47,11 @@ interface AbhaApiService { @GET("v1/account/getPngCard") suspend fun getPngCard(): Response - // Authentication Certificate for Staging (v1/v2) @GET suspend fun getAuthCert( - @Url url: String = "https://healthidsbx.abdm.gov.in/api/v2/auth/cert" + @Url url: String = BuildConfig.ABHA_AUTH_URL ): Response - // Authentication Certificate for Staging (v1/v2) -// @GET -// suspend fun getAuthCert( -// @Url url: String = "https://healthid.abdm.gov.in/api/v2/auth/cert" -// ): Response - @GET("v2/ha/lgd/states") suspend fun getStateAndDistricts(): Response diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt index 5814a1971..e3963079e 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt @@ -175,8 +175,12 @@ class HomeActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // This will block user to cast app screen - // Toggle screencast mode for staging & production builds - window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); + if (BuildConfig.FLAVOR.equals("production", true)) { + window.setFlags( + WindowManager.LayoutParams.FLAG_SECURE, + WindowManager.LayoutParams.FLAG_SECURE + ) + } super.onCreate(savedInstanceState) _binding = ActivityHomeBinding.inflate(layoutInflater) setContentView(binding.root) @@ -201,12 +205,17 @@ class HomeActivity : AppCompatActivity() { finish() } } + binding.versionName.text = "APK Version ${BuildConfig.VERSION_NAME}" } override fun onResume() { // This will block user to cast app screen - // Toggle screencast mode for staging & production builds - window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); + if (BuildConfig.FLAVOR.equals("production", true)) { + window.setFlags( + WindowManager.LayoutParams.FLAG_SECURE, + WindowManager.LayoutParams.FLAG_SECURE + ) + } super.onResume() if (isDeviceRootedOrEmulator()) { AlertDialog.Builder(this) @@ -216,6 +225,7 @@ class HomeActivity : AppCompatActivity() { .setPositiveButton("Exit") { dialog, id -> finish() } .show() } + binding.versionName.text = "APK Version ${BuildConfig.VERSION_NAME}" } private fun setUpMenu() { val menu = object : MenuProvider { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt index 2fc8c5b93..bf4db44a0 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt @@ -48,8 +48,12 @@ class LoginActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // This will block user to cast app screen - // Toggle screencast mode for staging & production builds - window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); + if (BuildConfig.FLAVOR.equals("production", true)) { + window.setFlags( + WindowManager.LayoutParams.FLAG_SECURE, + WindowManager.LayoutParams.FLAG_SECURE + ) + } super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) createSyncServiceNotificationChannel() diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index afb5b4fb8..d32c9adac 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -71,12 +71,13 @@ app:menu="@menu/activity_home_drawer"> From 3f893c60de1e27ea2a9e0222c76b362a691ff42e Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Mon, 9 Dec 2024 11:44:05 +0530 Subject: [PATCH 111/892] FLW-133 FLW-127 FLW-129 FLW-130 FLW-135 --- .../PregnantWomanAncVisitDataset.kt | 6 +- .../sakhi/helpers/CommonUtils.kt | 16 +++- .../adolescent_list/AdolescentListFragment.kt | 19 +++- .../HRPMicroBirthPlanFragment.kt | 8 +- .../list/ChildImmunizationListFragment.kt | 37 +++++++- .../fragment_child_immunization_list.xml | 91 ++++++++++++------- app/src/main/res/layout/rv_item_ben.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 8 files changed, 136 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt index bc3041931..b0c6d20a2 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt @@ -419,7 +419,7 @@ class PregnantWomanAncVisitDataset( setUpTdX() ben?.let { ancDate.min = - regis.lmpDate + TimeUnit.DAYS.toMillis(7 * Konstants.minAnc1Week.toLong() + 1) + regis.lmpDate + TimeUnit.DAYS.toMillis(7 * Konstants.maxAnc4Week.toLong() + 1) ancVisit.entries = arrayOf("1", "2", "3", "4", "5", "6", "7", "8") lastAnc?.let { last -> ancDate.min = last.ancDate + TimeUnit.DAYS.toMillis(4 * 7) @@ -437,6 +437,10 @@ class PregnantWomanAncVisitDataset( maxOf(regis.lmpDate, lastAncVisitDate) + TimeUnit.DAYS.toMillis(1) maternalDateOfDeath.max = minOf(getEddFromLmp(regis.lmpDate), System.currentTimeMillis()) + + isAborted.value = resources.getStringArray(R.array.yes_no)[1] + maternalDeath.value = resources.getStringArray(R.array.yes_no)[1] + } // ancDate.value = getDateFromLong(System.currentTimeMillis()) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/helpers/CommonUtils.kt b/app/src/main/java/org/piramalswasthya/sakhi/helpers/CommonUtils.kt index c054e928b..c635ab7d8 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/helpers/CommonUtils.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/helpers/CommonUtils.kt @@ -342,6 +342,19 @@ fun filterImmunList(list: List, text: String): List, diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/child_care/adolescent_list/AdolescentListFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/child_care/adolescent_list/AdolescentListFragment.kt index 7f42e5180..fdae73786 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/child_care/adolescent_list/AdolescentListFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/child_care/adolescent_list/AdolescentListFragment.kt @@ -14,6 +14,7 @@ import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.adapters.BenListAdapter +import org.piramalswasthya.sakhi.contracts.SpeechToTextContract import org.piramalswasthya.sakhi.databinding.FragmentDisplaySearchRvButtonBinding import org.piramalswasthya.sakhi.ui.home_activity.HomeActivity import org.piramalswasthya.sakhi.ui.home_activity.home.HomeViewModel @@ -31,6 +32,12 @@ class AdolescentListFragment : Fragment() { private val homeViewModel: HomeViewModel by viewModels({ requireActivity() }) + private val sttContract = registerForActivityResult(SpeechToTextContract()) { value -> + binding.searchView.setText(value) + binding.searchView.setSelection(value.length) + viewModel.filterText(value) + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -52,16 +59,18 @@ class AdolescentListFragment : Fragment() { }, { _, _ -> } - ), true) + ), showBeneficiaries = true) binding.rvAny.adapter = benAdapter lifecycleScope.launch { viewModel.benList.collect { - if (it.isEmpty()) + if (it.isEmpty()){ binding.flEmpty.visibility = View.VISIBLE - else + } else{ binding.flEmpty.visibility = View.GONE - benAdapter.submitList(it) + benAdapter.submitList(it.filter { it.ageInt in 10..19 }) + } + } } val searchTextWatcher = object : TextWatcher { @@ -85,6 +94,8 @@ class AdolescentListFragment : Fragment() { (searchView as EditText).removeTextChangedListener(searchTextWatcher) } + + binding.ibSearch.setOnClickListener { sttContract.launch(Unit) } } override fun onStart() { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan/HRPMicroBirthPlanFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan/HRPMicroBirthPlanFragment.kt index 923a00d9f..98a7cb9c5 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan/HRPMicroBirthPlanFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan/HRPMicroBirthPlanFragment.kt @@ -44,9 +44,9 @@ class HRPMicroBirthPlanFragment : Fragment() { formValueListener = FormInputAdapter.FormValueListener { formId, index -> viewModel.updateListOnValueChanged(formId, index) hardCodedListUpdate(formId) - }, isEnabled = !it + }/*, isEnabled = !it*/ ) - binding.btnSubmit.isEnabled = !it + // binding.btnSubmit.isEnabled = !it binding.form.rvInputForm.adapter = adapter lifecycleScope.launch { viewModel.formList.collect { list -> @@ -94,9 +94,9 @@ class HRPMicroBirthPlanFragment : Fragment() { } private fun submitTrackingForm() { - if (validateCurrentPage()) { + // if (validateCurrentPage()) { viewModel.saveForm() - } + //} } private fun validateCurrentPage(): Boolean { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/immunization_due/child_immunization/list/ChildImmunizationListFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/immunization_due/child_immunization/list/ChildImmunizationListFragment.kt index 09bd6f5e9..1f267240b 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/immunization_due/child_immunization/list/ChildImmunizationListFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/immunization_due/child_immunization/list/ChildImmunizationListFragment.kt @@ -1,9 +1,12 @@ package org.piramalswasthya.sakhi.ui.home_activity.immunization_due.child_immunization.list import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.EditText import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope @@ -12,6 +15,7 @@ import kotlinx.coroutines.launch import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.adapters.ImmunizationBenListAdapter import org.piramalswasthya.sakhi.adapters.ImmunizationBirthDoseCategoryAdapter +import org.piramalswasthya.sakhi.contracts.SpeechToTextContract import org.piramalswasthya.sakhi.databinding.FragmentChildImmunizationListBinding import org.piramalswasthya.sakhi.ui.home_activity.HomeActivity import timber.log.Timber @@ -27,6 +31,12 @@ class ChildImmunizationListFragment : Fragment(),ImmunizationBirthDoseCategoryAd private val viewModel: ChildImmunizationListViewModel by viewModels() private var catTxt = "" + private val sttContract = registerForActivityResult(SpeechToTextContract()) { value -> + binding.searchView.setText(value) + binding.searchView.setSelection(value.length) + viewModel.filterText(value) + } + private val bottomSheet: ChildImmunizationVaccineBottomSheetFragment by lazy { ChildImmunizationVaccineBottomSheetFragment() } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -51,12 +61,37 @@ class ChildImmunizationListFragment : Fragment(),ImmunizationBirthDoseCategoryAd lifecycleScope.launch { viewModel.immunizationBenList.collect { Timber.d("Collecting list : $it") + binding.rvList.apply { - (adapter as ImmunizationBenListAdapter).submitList(it) + (adapter as ImmunizationBenListAdapter).submitList(it.sortedByDescending { it.ben.regDate }) } } } + val searchTextWatcher = object : TextWatcher { + override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { + + } + + override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { + + } + + override fun afterTextChanged(p0: Editable?) { + viewModel.filterText(p0?.toString() ?: "") + } + + } + binding.searchView.setOnFocusChangeListener { searchView, b -> + if (b) + (searchView as EditText).addTextChangedListener(searchTextWatcher) + else + (searchView as EditText).removeTextChangedListener(searchTextWatcher) + + } + + binding.ibSearch.setOnClickListener { sttContract.launch(Unit) } + } override fun onStart() { diff --git a/app/src/main/res/layout/fragment_child_immunization_list.xml b/app/src/main/res/layout/fragment_child_immunization_list.xml index af1d07201..e068b5cb5 100644 --- a/app/src/main/res/layout/fragment_child_immunization_list.xml +++ b/app/src/main/res/layout/fragment_child_immunization_list.xml @@ -4,50 +4,77 @@ xmlns:tools="http://schemas.android.com/tools"> - - - - - + + + - - - - - - - - + + - - + + + android:background="?attr/colorPrimary" + tools:visibility="visible"> + + + + - + \ No newline at end of file diff --git a/app/src/main/res/layout/rv_item_ben.xml b/app/src/main/res/layout/rv_item_ben.xml index 93ac409f1..fd4b57769 100644 --- a/app/src/main/res/layout/rv_item_ben.xml +++ b/app/src/main/res/layout/rv_item_ben.xml @@ -391,7 +391,7 @@ android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical" - android:padding="@dimen/padding_small"> + android:padding="@dimen/padding_small"/> No Household records found. Please start registering households by clicking on the button below. Something went wrong !\nUnable to connect to server !\nTry again later! Try Again! - APK Version 7.1.36 + APK Version 2.0.0 Enter PIN From aa531ff63067891ac925b622c8a5a6a089aaef3d Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Wed, 11 Dec 2024 10:09:13 +0530 Subject: [PATCH 112/892] FLW-136 FLW-138 FLW-140 --- app/src/main/AndroidManifest.xml | 5 ++++- .../piramalswasthya/sakhi/configuration/BenRegFormDataset.kt | 2 +- .../sakhi/configuration/PregnantWomanAncVisitDataset.kt | 5 +++-- .../new_ben_registration/ben_form/NewBenRegViewModel.kt | 4 ++-- .../micro_birth_plan_table/HRPMicroBirthPlanTable.kt | 4 ++-- app/src/main/res/layout/rv_item_pregnancy_visit.xml | 2 +- app/src/main/res/values/strings_maternal_health.xml | 1 + 7 files changed, 14 insertions(+), 9 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 09d69b521..4f08bde1b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,5 +78,8 @@ android:resource="@xml/provider_paths" /> - + + + + \ No newline at end of file diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt index 175cef374..157b77332 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/BenRegFormDataset.kt @@ -1197,7 +1197,7 @@ class BenRegFormDataset(context: Context, language: Languages) : Dataset(context } - private fun isKid(): Boolean { + fun isKid(): Boolean { return ((getAgeFromDob(getLongFromDate(agePopup.value))) < 15) } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt index b0c6d20a2..132156680 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt @@ -419,7 +419,7 @@ class PregnantWomanAncVisitDataset( setUpTdX() ben?.let { ancDate.min = - regis.lmpDate + TimeUnit.DAYS.toMillis(7 * Konstants.maxAnc4Week.toLong() + 1) + regis.lmpDate + TimeUnit.DAYS.toMillis(7 * Konstants.minAnc1Week.toLong() + 1) ancVisit.entries = arrayOf("1", "2", "3", "4", "5", "6", "7", "8") lastAnc?.let { last -> ancDate.min = last.ancDate + TimeUnit.DAYS.toMillis(4 * 7) @@ -431,7 +431,8 @@ class PregnantWomanAncVisitDataset( } // ancDate.max = // minOf(getEddFromLmp(regis.lmpDate), System.currentTimeMillis()) - ancDate.max = System.currentTimeMillis() + + ancDate.max = minOf(regis.lmpDate + TimeUnit.DAYS.toMillis(7 * Konstants.maxAnc4Week.toLong() + 1),System.currentTimeMillis()) // ancDate.value = getDateFromLong(ancDate.max!!) maternalDateOfDeath.min = maxOf(regis.lmpDate, lastAncVisitDate) + TimeUnit.DAYS.toMillis(1) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/all_ben/new_ben_registration/ben_form/NewBenRegViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/all_ben/new_ben_registration/ben_form/NewBenRegViewModel.kt index 54e9ee16e..a8d1f9a08 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/all_ben/new_ben_registration/ben_form/NewBenRegViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/all_ben/new_ben_registration/ben_form/NewBenRegViewModel.kt @@ -168,9 +168,9 @@ class NewBenRegViewModel @Inject constructor( beneficiaryId = benIdToSet, householdId = hhId, isAdult = false, - isKid = false, + isKid = dataset.isKid(), isDraft = true, - kidDetails = BenRegKid(), + kidDetails = if(dataset.isKid()) BenRegKid() else null, genDetails = BenRegGen(), syncState = SyncState.UNSYNCED, locationRecord = locationRecord diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt index d75fa4e6d..d5bc87b92 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/cho/beneficiary/pregnant_women/micro_birth_plan_table/HRPMicroBirthPlanTable.kt @@ -252,7 +252,7 @@ class HRPMicroBirthPlanTable : Fragment() { } private fun shareImage(imageUri: Uri) { - if (isPackageExist(requireContext(), "com.whatsapp")) { + if (isPackageExist(requireContext(), "com.whatsapp") || isPackageExist(requireContext(), "com.whatsapp.w4b")) { val captionText = " ${getString(R.string.micro_birth_plan)} " + "\n ASHA Name : ${viewModel.currentUser!!.name} " + "\n Sub-center : ${viewModel.currentLocation!!.village.name}" @@ -273,7 +273,7 @@ class HRPMicroBirthPlanTable : Fragment() { } } - fun isPackageExist(context: Context, target: String): Boolean { + private fun isPackageExist(context: Context, target: String): Boolean { return context.packageManager.getInstalledApplications(0) .find { info -> info.packageName == target } != null } diff --git a/app/src/main/res/layout/rv_item_pregnancy_visit.xml b/app/src/main/res/layout/rv_item_pregnancy_visit.xml index 4cd94590b..2bfb06254 100644 --- a/app/src/main/res/layout/rv_item_pregnancy_visit.xml +++ b/app/src/main/res/layout/rv_item_pregnancy_visit.xml @@ -273,7 +273,7 @@ diff --git a/app/src/main/res/values/strings_maternal_health.xml b/app/src/main/res/values/strings_maternal_health.xml index d8e22a421..3b1fa6a61 100644 --- a/app/src/main/res/values/strings_maternal_health.xml +++ b/app/src/main/res/values/strings_maternal_health.xml @@ -200,6 +200,7 @@ Tetanus toxoid LMP Expected Delivery + EDD Last Menstrual Period Expected Date of Delivery Identification of high-risk factors From e25e562ad5d4538ebad9164f96f54aee567fcfe2 Mon Sep 17 00:00:00 2001 From: ayushbisaria123 <109733040+ayushbisaria123@users.noreply.github.com> Date: Fri, 13 Dec 2024 20:15:22 +0530 Subject: [PATCH 113/892] Update build.gradle --- app/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 078711bf7..b9d28ddf0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -31,6 +31,8 @@ android { buildConfigField "String", "BASE_ABHA_URL", "\"https://healthidsbx.abdm.gov.in/api/\"" // ABHA v3 Staging Base URL // buildConfigField "String", "BASE_ABHA_URL", "\"https://abhasbx.abdm.gov.in/abha/api/\"" + + buildConfigField "String", "CHAT_URL", "\"https://aibot.helloyubo.com/piramal_bot_rag\"" } buildTypes { From 84a95fa9910a2729cb9683ddf75e02733c5189cb Mon Sep 17 00:00:00 2001 From: ayushbisaria123 <109733040+ayushbisaria123@users.noreply.github.com> Date: Fri, 13 Dec 2024 20:18:30 +0530 Subject: [PATCH 114/892] Update HomeActivity.kt --- .../sakhi/ui/home_activity/HomeActivity.kt | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt index fbd5033ba..5dfc502c2 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt @@ -53,10 +53,11 @@ import org.piramalswasthya.sakhi.work.WorkerUtils import java.util.* import javax.inject.Inject - @AndroidEntryPoint class HomeActivity : AppCompatActivity() { + var isChatSupportEnabled : Boolean = true + @EntryPoint @InstallIn(SingletonComponent::class) @@ -190,15 +191,26 @@ class HomeActivity : AppCompatActivity() { setUpNavHeader() setUpFirstTimePullWorker() setUpMenu() - binding.addFab.setOnClickListener { this } - window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); + if (isChatSupportEnabled) + { + binding.addFab.visibility = View.VISIBLE + binding.addFab.setOnClickListener { this } + + window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); - binding.addFab.setOnClickListener { + binding.addFab.setOnClickListener { - displaychatdialog() + displaychatdialog() + + } } + else + { + binding.addFab.visibility = View.GONE + } + if (isDeviceRootedOrEmulator()) { AlertDialog.Builder(this) @@ -239,7 +251,7 @@ class HomeActivity : AppCompatActivity() { // Load URL - web.loadUrl("https://aibot.helloyubo.com/piramal_bot_rag") + web.loadUrl(BuildConfig.CHAT_URL) // Handle WebView events @@ -445,13 +457,16 @@ class HomeActivity : AppCompatActivity() { } - binding.navView.menu.findItem(R.id.ChatFragment).setOnMenuItemClickListener { - displaychatdialog() - /*navController.popBackStack(R.id.homeFragment, false) + if (isChatSupportEnabled) { + binding.navView.menu.findItem(R.id.ChatFragment).setVisible(true) + binding.navView.menu.findItem(R.id.ChatFragment).setOnMenuItemClickListener { + displaychatdialog() + /*navController.popBackStack(R.id.homeFragment, false) startActivity(Intent(this, ChatSupport::class.java))*/ - binding.drawerLayout.close() - true + binding.drawerLayout.close() + true + } } } From 86f5caeda4ae143486590100a3ea87862937ebf7 Mon Sep 17 00:00:00 2001 From: ayushbisaria123 <109733040+ayushbisaria123@users.noreply.github.com> Date: Fri, 13 Dec 2024 20:28:09 +0530 Subject: [PATCH 115/892] Update activity_home_drawer.xml --- app/src/main/res/menu/activity_home_drawer.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/menu/activity_home_drawer.xml b/app/src/main/res/menu/activity_home_drawer.xml index 4041806c2..b6178bfdc 100644 --- a/app/src/main/res/menu/activity_home_drawer.xml +++ b/app/src/main/res/menu/activity_home_drawer.xml @@ -42,6 +42,7 @@ From b6b5efac3f353f84a9364e2bc298f7aeed50d4c2 Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Tue, 17 Dec 2024 11:22:32 +0530 Subject: [PATCH 116/892] FLW-143 --- .../sakhi/helpers/CommonUtils.kt | 23 +++++++++++++++++++ .../sakhi/model/MaternalHealth.kt | 3 ++- .../sakhi/repositories/MaternalHealthRepo.kt | 4 ++++ .../ben_form/NewBenRegFragment.kt | 4 ++-- .../NewHouseholdFragment.kt | 2 +- .../ui/home_activity/home/HomeViewModel.kt | 15 ++++++++---- 6 files changed, 43 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/helpers/CommonUtils.kt b/app/src/main/java/org/piramalswasthya/sakhi/helpers/CommonUtils.kt index c635ab7d8..ee37f7b94 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/helpers/CommonUtils.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/helpers/CommonUtils.kt @@ -1,5 +1,10 @@ package org.piramalswasthya.sakhi.helpers +import android.app.Activity +import android.content.Context.CONNECTIVITY_SERVICE +import android.net.ConnectivityManager +import android.net.NetworkCapabilities +import android.os.Build import androidx.core.text.isDigitsOnly import org.piramalswasthya.sakhi.model.AncStatus import org.piramalswasthya.sakhi.model.BenBasicDomain @@ -24,6 +29,7 @@ import java.util.Date import java.util.Locale import java.util.concurrent.TimeUnit + fun filterBenList(list: List, text: String): List { if (text == "") return list @@ -497,3 +503,20 @@ fun getDateString(dateLong: Long?): String? { } +@Suppress("deprecation") +fun isInternetAvailable(activity: Activity): Boolean { + val conMgr = activity.getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + val network = conMgr.activeNetwork + val networkCapabilities = conMgr.getNetworkCapabilities(network) + return networkCapabilities?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + ?: false + } else { + // below API Level 23 + return (conMgr.activeNetworkInfo != null && conMgr.activeNetworkInfo!!.isAvailable + && conMgr.activeNetworkInfo!!.isConnected) + } +} + + diff --git a/app/src/main/java/org/piramalswasthya/sakhi/model/MaternalHealth.kt b/app/src/main/java/org/piramalswasthya/sakhi/model/MaternalHealth.kt index 4a2c737e3..86aea932c 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/model/MaternalHealth.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/model/MaternalHealth.kt @@ -434,7 +434,8 @@ data class ANCPost( val createdDate: String? = null, val createdBy: String, val updatedDate: String? = null, - val updatedBy: String + val updatedBy: String, + var providerServiceMapID :String?=null ) { fun toAncCache(): PregnantWomanAncCache { return PregnantWomanAncCache( diff --git a/app/src/main/java/org/piramalswasthya/sakhi/repositories/MaternalHealthRepo.kt b/app/src/main/java/org/piramalswasthya/sakhi/repositories/MaternalHealthRepo.kt index 34bfde8e1..f36bf4883 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/repositories/MaternalHealthRepo.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/repositories/MaternalHealthRepo.kt @@ -163,6 +163,10 @@ class MaternalHealthRepo @Inject constructor( ?: throw IllegalStateException("No user logged in!!") try { +// Commented this below line for short time after changes in server +// ancPostList.forEach{ +// it.providerServiceMapID = user.serviceMapId.toString() +// } val response = amritApiService.postAncForm(ancPostList.toList()) val statusCode = response.code() diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/all_ben/new_ben_registration/ben_form/NewBenRegFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/all_ben/new_ben_registration/ben_form/NewBenRegFragment.kt index 0b7d097e1..8567256b1 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/all_ben/new_ben_registration/ben_form/NewBenRegFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/all_ben/new_ben_registration/ben_form/NewBenRegFragment.kt @@ -175,7 +175,7 @@ class NewBenRegFragment : Fragment() { alertBinding.btnPositive.setOnClickListener { if (alertBinding.checkBox.isChecked) { viewModel.setConsentAgreed() - requestLocationPermission() + //requestLocationPermission() alertDialog.dismiss() } else Toast.makeText( @@ -368,7 +368,7 @@ class NewBenRegFragment : Fragment() { override fun onStart() { super.onStart() - requestLocationPermission() + // requestLocationPermission() activity?.let { (it as HomeActivity).updateActionBar( R.drawable.ic__ben, diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/all_household/new_household_registration/NewHouseholdFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/all_household/new_household_registration/NewHouseholdFragment.kt index d5213a29d..fef2282ec 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/all_household/new_household_registration/NewHouseholdFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/all_household/new_household_registration/NewHouseholdFragment.kt @@ -102,7 +102,7 @@ class NewHouseholdFragment : Fragment() { alertBinding.btnPositive.setOnClickListener { if (alertBinding.checkBox.isChecked) { viewModel.setConsentAgreed() - requestLocationPermission() + // requestLocationPermission() alertDialog.dismiss() } else Toast.makeText( diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/home/HomeViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/home/HomeViewModel.kt index e277e2546..ad0a9e745 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/home/HomeViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/home/HomeViewModel.kt @@ -1,6 +1,7 @@ package org.piramalswasthya.sakhi.ui.home_activity.home import android.net.Uri +import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel @@ -11,8 +12,10 @@ import kotlinx.coroutines.launch import org.piramalswasthya.sakhi.database.room.InAppDb import org.piramalswasthya.sakhi.database.room.SyncState import org.piramalswasthya.sakhi.database.shared_preferences.PreferenceDao +import org.piramalswasthya.sakhi.helpers.isInternetAvailable import org.piramalswasthya.sakhi.model.LocationRecord import org.piramalswasthya.sakhi.repositories.UserRepo +import org.piramalswasthya.sakhi.work.WorkerUtils import javax.inject.Inject @HiltViewModel @@ -38,9 +41,13 @@ class HomeViewModel @Inject constructor( val scope: CoroutineScope get() = viewModelScope - private var _unprocessedRecords: Int = 0 - val unprocessedRecords: Int - get() = _unprocessedRecords +// private var _unprocessedRecords: Int = 0 +// val unprocessedRecords: Int +// get() = _unprocessedRecords + + private var _unprocessedRecordsCount: MutableLiveData = MutableLiveData(0) + val unprocessedRecordsCount: LiveData + get() = _unprocessedRecordsCount val locationRecord: LocationRecord? = pref.getLocationRecord() @@ -55,7 +62,7 @@ class HomeViewModel @Inject constructor( // _user = pref.getLoggedInUser()!! launch { userRepo.unProcessedRecordCount.collect { value -> - _unprocessedRecords = + _unprocessedRecordsCount.value = value.filter { it.syncState != SyncState.SYNCED }.sumOf { it.count } } } From 42646de5acb79303856fbdc9dd2c9f41dc047590 Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Tue, 17 Dec 2024 11:22:42 +0530 Subject: [PATCH 117/892] FLW-143 --- .../sakhi/ui/home_activity/HomeActivity.kt | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt index e3963079e..9c2902ac6 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt @@ -3,6 +3,7 @@ package org.piramalswasthya.sakhi.ui.home_activity import android.content.Context import android.content.Intent import android.os.Bundle +import android.util.Log import android.view.Menu import android.view.MenuInflater import android.view.MenuItem @@ -37,14 +38,14 @@ import org.piramalswasthya.sakhi.databinding.ActivityHomeBinding import org.piramalswasthya.sakhi.helpers.ImageUtils import org.piramalswasthya.sakhi.helpers.Languages import org.piramalswasthya.sakhi.helpers.MyContextWrapper +import org.piramalswasthya.sakhi.helpers.isInternetAvailable import org.piramalswasthya.sakhi.ui.abha_id_activity.AbhaIdActivity import org.piramalswasthya.sakhi.ui.home_activity.home.HomeViewModel import org.piramalswasthya.sakhi.ui.home_activity.sync.SyncBottomSheetFragment import org.piramalswasthya.sakhi.ui.login_activity.LoginActivity import org.piramalswasthya.sakhi.ui.service_location_activity.ServiceLocationActivity -import org.piramalswasthya.sakhi.utils.RootedUtil import org.piramalswasthya.sakhi.work.WorkerUtils -import java.util.* +import java.util.Locale import javax.inject.Inject @@ -119,8 +120,8 @@ class HomeActivity : AppCompatActivity() { private val logoutAlert by lazy { var str = "" - if (viewModel.unprocessedRecords > 0) { - str += viewModel.unprocessedRecords + if (viewModel.unprocessedRecordsCount.value!! > 0) { + str += viewModel.unprocessedRecordsCount.value!! str += resources.getString(R.string.not_processed) } else { str += resources.getString(R.string.all_records_synced) @@ -205,6 +206,14 @@ class HomeActivity : AppCompatActivity() { finish() } } + viewModel.unprocessedRecordsCount.observe(this) { + if (it>0) { + if (isInternetAvailable(this)){ + Log.d("====12345@@","triggerAmritPushWorker called") + WorkerUtils.triggerAmritPushWorker(this) + } + } + } binding.versionName.text = "APK Version ${BuildConfig.VERSION_NAME}" } From 962bf2207035b018fdba045eb8a4a35c0cdf2a12 Mon Sep 17 00:00:00 2001 From: ayushbisaria123 <109733040+ayushbisaria123@users.noreply.github.com> Date: Mon, 23 Dec 2024 11:56:30 +0530 Subject: [PATCH 118/892] Update build.gradle --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index b9d28ddf0..ec74c7232 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -32,7 +32,7 @@ android { // ABHA v3 Staging Base URL // buildConfigField "String", "BASE_ABHA_URL", "\"https://abhasbx.abdm.gov.in/abha/api/\"" - buildConfigField "String", "CHAT_URL", "\"https://aibot.helloyubo.com/piramal_bot_rag\"" + buildConfigField "String", "CHAT_URL", "\"https://piramalvoicebot.yugasa.org/\"" } buildTypes { From 801ff2fd3ddb9540abb512ea652acee1a82e00b2 Mon Sep 17 00:00:00 2001 From: ayushbisaria123 <109733040+ayushbisaria123@users.noreply.github.com> Date: Mon, 23 Dec 2024 11:57:48 +0530 Subject: [PATCH 119/892] Update AndroidManifest.xml --- app/src/main/AndroidManifest.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 56a588467..149eb4ffb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,8 +7,10 @@ + - + + From f85f98496534ad09680dc8d2b0eda19eb7387b5e Mon Sep 17 00:00:00 2001 From: ayushbisaria123 <109733040+ayushbisaria123@users.noreply.github.com> Date: Mon, 23 Dec 2024 12:01:21 +0530 Subject: [PATCH 120/892] Update HomeActivity.kt --- .../sakhi/ui/home_activity/HomeActivity.kt | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt index 5dfc502c2..b0e288634 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt @@ -1,5 +1,6 @@ package org.piramalswasthya.sakhi.ui.home_activity +import android.Manifest import android.content.Context import android.content.Intent import android.graphics.Bitmap @@ -10,6 +11,8 @@ import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.view.WindowManager +import android.webkit.PermissionRequest +import android.webkit.WebChromeClient import android.webkit.WebResourceRequest import android.webkit.WebView import android.webkit.WebViewClient @@ -21,6 +24,7 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity +import androidx.core.app.ActivityCompat import androidx.core.view.GravityCompat import androidx.core.view.MenuProvider import androidx.navigation.fragment.NavHostFragment @@ -28,7 +32,6 @@ import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.NavigationUI import androidx.navigation.ui.setupWithNavController import com.bumptech.glide.Glide -import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.firebase.crashlytics.internal.common.CommonUtils.isEmulator @@ -38,6 +41,7 @@ import dagger.hilt.InstallIn import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.EntryPointAccessors import dagger.hilt.components.SingletonComponent +import org.piramalswasthya.sakhi.BuildConfig import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.database.shared_preferences.PreferenceDao import org.piramalswasthya.sakhi.databinding.ActivityHomeBinding @@ -53,12 +57,14 @@ import org.piramalswasthya.sakhi.work.WorkerUtils import java.util.* import javax.inject.Inject + @AndroidEntryPoint class HomeActivity : AppCompatActivity() { var isChatSupportEnabled : Boolean = true + @EntryPoint @InstallIn(SingletonComponent::class) interface WrapperEntryPoint { @@ -192,6 +198,21 @@ class HomeActivity : AppCompatActivity() { setUpFirstTimePullWorker() setUpMenu() + val permissions = arrayOf( + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.INTERNET, + Manifest.permission.RECORD_AUDIO, + Manifest.permission.CAMERA + ) + + ActivityCompat.requestPermissions( + this, + permissions, + 1010 + ) + + if (isChatSupportEnabled) { binding.addFab.visibility = View.VISIBLE @@ -230,6 +251,8 @@ class HomeActivity : AppCompatActivity() { } } + + private fun displaychatdialog() { val dialog = BottomSheetDialog(this) @@ -241,6 +264,13 @@ class HomeActivity : AppCompatActivity() { val progress = view.findViewById(R.id.progressBarv) + web.setWebChromeClient(object : WebChromeClient() { + override fun onPermissionRequest(request: PermissionRequest) { + request.grant(request.resources) + } + }) + + // Enable JavaScript web.settings.javaScriptEnabled = true @@ -461,8 +491,6 @@ class HomeActivity : AppCompatActivity() { binding.navView.menu.findItem(R.id.ChatFragment).setVisible(true) binding.navView.menu.findItem(R.id.ChatFragment).setOnMenuItemClickListener { displaychatdialog() - /*navController.popBackStack(R.id.homeFragment, false) - startActivity(Intent(this, ChatSupport::class.java))*/ binding.drawerLayout.close() true From f152665c1b73399ebea5456c927a4c7319c2b7df Mon Sep 17 00:00:00 2001 From: ayushbisaria123 <109733040+ayushbisaria123@users.noreply.github.com> Date: Mon, 23 Dec 2024 18:25:31 +0530 Subject: [PATCH 121/892] Update HomeActivity.kt --- .../sakhi/ui/home_activity/HomeActivity.kt | 50 ++++++++++++++----- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt index b0e288634..8485a78aa 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt @@ -13,12 +13,14 @@ import android.view.View import android.view.WindowManager import android.webkit.PermissionRequest import android.webkit.WebChromeClient +import android.webkit.WebResourceError import android.webkit.WebResourceRequest import android.webkit.WebView import android.webkit.WebViewClient import android.widget.ImageView import android.widget.ProgressBar import android.widget.TextView +import android.widget.Toast import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels @@ -54,6 +56,7 @@ import org.piramalswasthya.sakhi.ui.home_activity.sync.SyncBottomSheetFragment import org.piramalswasthya.sakhi.ui.login_activity.LoginActivity import org.piramalswasthya.sakhi.ui.service_location_activity.ServiceLocationActivity import org.piramalswasthya.sakhi.work.WorkerUtils +import java.net.URI import java.util.* import javax.inject.Inject @@ -212,11 +215,9 @@ class HomeActivity : AppCompatActivity() { 1010 ) - if (isChatSupportEnabled) { binding.addFab.visibility = View.VISIBLE - binding.addFab.setOnClickListener { this } window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); @@ -285,16 +286,33 @@ class HomeActivity : AppCompatActivity() { // Handle WebView events - web.webViewClient = object : WebViewClient() { - override fun shouldOverrideUrlLoading( - view: WebView, - request: WebResourceRequest - ): Boolean { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - view.loadUrl(request.url.toString()) - } - return true - } + web.webViewClient = object : WebViewClient() { + override fun shouldOverrideUrlLoading( + view: WebView, + request: WebResourceRequest + ): Boolean { + return if (request.url.host == URI(BuildConfig.CHAT_URL).host) { + false // Let WebView handle same-origin URLs + } else { + startActivity(Intent(Intent.ACTION_VIEW, request.url)) + true + } + } + + override fun onReceivedError( + view: WebView?, + request: WebResourceRequest?, + error: WebResourceError? + ) { + super.onReceivedError(view, request, error) + progress.visibility = View.GONE + // Show error view + Toast.makeText( + this@HomeActivity, + R.string.chat_error, + Toast.LENGTH_SHORT + ).show() + } override fun onPageStarted(webview: WebView, url: String, favicon: Bitmap?) { super.onPageStarted(webview, url, favicon) @@ -324,7 +342,11 @@ class HomeActivity : AppCompatActivity() { // on below line we are setting // content view to our view. dialog.setContentView(view) - dialog.behavior.setPeekHeight(6000) + // dialog.behavior.setPeekHeight(6000) + + val displayMetrics = resources.displayMetrics + val screenHeight = displayMetrics.heightPixels + dialog.behavior.setPeekHeight((screenHeight * 0.85).toInt()) // on below line we are calling @@ -491,6 +513,8 @@ class HomeActivity : AppCompatActivity() { binding.navView.menu.findItem(R.id.ChatFragment).setVisible(true) binding.navView.menu.findItem(R.id.ChatFragment).setOnMenuItemClickListener { displaychatdialog() + /*navController.popBackStack(R.id.homeFragment, false) + startActivity(Intent(this, ChatSupport::class.java))*/ binding.drawerLayout.close() true From 476cc0ffb8d62bb8e4dbc419dd284d82b4219545 Mon Sep 17 00:00:00 2001 From: ayushbisaria123 <109733040+ayushbisaria123@users.noreply.github.com> Date: Mon, 23 Dec 2024 18:27:08 +0530 Subject: [PATCH 122/892] Update strings.xml --- app/src/main/res/values/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 247f36cd0..6f3da8d59 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -94,6 +94,7 @@ NCD Status TB Status SYNC STATE + There is some error in loading your chat bot 2.0.0 @@ -337,4 +338,4 @@ Female - \ No newline at end of file + From e60a0886acf9463ceb8b5685acf7e4b19d84dfa3 Mon Sep 17 00:00:00 2001 From: ayushbisaria123 <109733040+ayushbisaria123@users.noreply.github.com> Date: Mon, 23 Dec 2024 18:30:27 +0530 Subject: [PATCH 123/892] Update styles.xml --- app/src/main/res/values/styles.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 969896856..7c154f425 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -88,8 +88,8 @@ @style/AppBottomSheetDialogTheme - From 00b6ee7adb0d72f520d7dfc0fbc924604e2bc1b2 Mon Sep 17 00:00:00 2001 From: ayushbisaria123 <109733040+ayushbisaria123@users.noreply.github.com> Date: Mon, 23 Dec 2024 18:32:13 +0530 Subject: [PATCH 124/892] Update build.gradle --- app/build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index ec74c7232..51b393cfd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -128,7 +128,6 @@ dependencies { implementation 'com.google.android.material:material:1.8.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation "androidx.recyclerview:recyclerview:1.3.1" - implementation 'com.google.android.material:material:1.3.0-alpha02' //Navigation implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" From 8d95bdd80ec1c3c651e1377b421b310f8a26483f Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Tue, 31 Dec 2024 10:18:42 +0530 Subject: [PATCH 125/892] FLW 133 - App crashing issue fixed due to Null Pointer Exception --- .../sakhi/adapters/FormInputAdapterWithBgIcon.kt | 8 +++++++- .../sakhi/configuration/PregnantWomanAncVisitDataset.kt | 2 +- .../sakhi/repositories/MaternalHealthRepo.kt | 3 ++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapterWithBgIcon.kt b/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapterWithBgIcon.kt index e12b89ab6..a7e368386 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapterWithBgIcon.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/adapters/FormInputAdapterWithBgIcon.kt @@ -22,6 +22,7 @@ import android.widget.CheckBox import android.widget.LinearLayout import android.widget.RadioButton import android.widget.RadioGroup +import android.widget.Toast import androidx.appcompat.content.res.AppCompatResources import androidx.core.view.children import androidx.recyclerview.widget.DiffUtil @@ -490,7 +491,12 @@ class FormInputAdapterWithBgIcon ( datePickerDialog.datePicker.minDate = item.min ?: 0 if (item.showYearFirstInDatePicker) datePickerDialog.datePicker.touchables[0].performClick() - datePickerDialog.show() + if (item.max!!> item.min!!){ + datePickerDialog.show() + }else{ + Toast.makeText(binding.root.context,"Something went wrong",Toast.LENGTH_SHORT).show() + } + } binding.executePendingBindings() diff --git a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt index 132156680..e387d1eee 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/configuration/PregnantWomanAncVisitDataset.kt @@ -432,7 +432,7 @@ class PregnantWomanAncVisitDataset( // ancDate.max = // minOf(getEddFromLmp(regis.lmpDate), System.currentTimeMillis()) - ancDate.max = minOf(regis.lmpDate + TimeUnit.DAYS.toMillis(7 * Konstants.maxAnc4Week.toLong() + 1),System.currentTimeMillis()) + ancDate.max = minOf(getEddFromLmp(regis.lmpDate),System.currentTimeMillis()) // ancDate.value = getDateFromLong(ancDate.max!!) maternalDateOfDeath.min = maxOf(regis.lmpDate, lastAncVisitDate) + TimeUnit.DAYS.toMillis(1) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/repositories/MaternalHealthRepo.kt b/app/src/main/java/org/piramalswasthya/sakhi/repositories/MaternalHealthRepo.kt index f36bf4883..e3eccc624 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/repositories/MaternalHealthRepo.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/repositories/MaternalHealthRepo.kt @@ -163,7 +163,8 @@ class MaternalHealthRepo @Inject constructor( ?: throw IllegalStateException("No user logged in!!") try { -// Commented this below line for short time after changes in server +// FLW-144 - Implementing API change for addition of ProviderServiceMapID in ANC API +// This change will go one Tools upgrade builds to Production // ancPostList.forEach{ // it.providerServiceMapID = user.serviceMapId.toString() // } From 8957e2926128d82125e2bb95d861341fd7e932a5 Mon Sep 17 00:00:00 2001 From: ShaanOnDev Date: Tue, 31 Dec 2024 15:32:19 +0530 Subject: [PATCH 126/892] Added build configs for different projects --- .gitignore | 7 +++---- app/build.gradle | 39 ++++++++++++++++++++++++++++++++++----- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 83031d71a..f107d8861 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,6 @@ *.lock /app/build/* /app/release/* -**/google-services.json -/app/src/staging/google-services.json -/app/src/uat/google-services.json -/app/src/production/google-services.json \ No newline at end of file +/local.properties +/secrets.properties +**/google-services.json \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 9304fb0b1..f348b734a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -48,8 +48,9 @@ android { flavorDimensions "default" productFlavors { - staging { - applicationIdSuffix ".staging" + + sakshamStag { + applicationIdSuffix ".saksham.stag" applicationId "org.piramalswasthya.sakhi" resValue "string", "app_native_name", "উৎপ্ৰেৰণা-Stag" // TMC Server Staging API Base URL @@ -63,8 +64,8 @@ android { // ABHA v1/v2 Staging Auth Cert URL buildConfigField "String", "ABHA_AUTH_URL", "\"https://healthidsbx.abdm.gov.in/api/v2/auth/cert\"" } - uat { - applicationIdSuffix ".uat" + sakshamUat { + applicationIdSuffix ".saksham.uat" applicationId "org.piramalswasthya.sakhi" resValue "string", "app_native_name", "উৎপ্ৰেৰণা-Uat" // TMC Server Staging API Base URL @@ -78,7 +79,34 @@ android { // ABHA v1/v2 UAT Auth Cert URL buildConfigField "String", "ABHA_AUTH_URL", "\"https://healthidsbx.abdm.gov.in/api/v2/auth/cert\"" } - production { + sakshamProd { + applicationIdSuffix ".saksham" + applicationId "org.piramalswasthya.sakhi" + // TMC Server Production API Base URL + buildConfigField "String", "BASE_TMC_URL", "\"https://assamtmc.piramalswasthya.org/\"" + // ABHA v1/v2/v3 Production Base URL + buildConfigField "String", "BASE_ABHA_URL", "\"https://healthid.abdm.gov.in/api/\"" + // ABHA v1/v2 Production Session/Token URL + buildConfigField "String", "ABHA_TOKEN_URL", "\"https://live.abdm.gov.in/gateway/v0.5/sessions\"" + // ABHA v1/v2 Production Auth Cert URL + buildConfigField "String", "ABHA_AUTH_URL", "\"https://healthid.abdm.gov.in/api/v2/auth/cert\"" + } + + niramayProd { + applicationIdSuffix ".niramay" + applicationId "org.piramalswasthya.sakhi" + // TMC Server Production API Base URL + buildConfigField "String", "BASE_TMC_URL", "\"https://assamtmc.piramalswasthya.org/\"" + // ABHA v1/v2/v3 Production Base URL + buildConfigField "String", "BASE_ABHA_URL", "\"https://healthid.abdm.gov.in/api/\"" + // ABHA v1/v2 Production Session/Token URL + buildConfigField "String", "ABHA_TOKEN_URL", "\"https://live.abdm.gov.in/gateway/v0.5/sessions\"" + // ABHA v1/v2 Production Auth Cert URL + buildConfigField "String", "ABHA_AUTH_URL", "\"https://healthid.abdm.gov.in/api/v2/auth/cert\"" + } + + xushrukhaProd { + applicationIdSuffix ".xushrukha" applicationId "org.piramalswasthya.sakhi" // TMC Server Production API Base URL buildConfigField "String", "BASE_TMC_URL", "\"https://assamtmc.piramalswasthya.org/\"" @@ -89,6 +117,7 @@ android { // ABHA v1/v2 Production Auth Cert URL buildConfigField "String", "ABHA_AUTH_URL", "\"https://healthid.abdm.gov.in/api/v2/auth/cert\"" } + } compileOptions { From 60f2da6e33558ed00f1d9a1012ac7d1965c07a2d Mon Sep 17 00:00:00 2001 From: ShaanOnDev Date: Tue, 31 Dec 2024 17:57:06 +0530 Subject: [PATCH 127/892] ABHA Generation & Printing ABHA Card --- .../sakhi/network/AbhaApiService.kt | 3 + .../TokenInsertAbhaInterceptor.kt | 2 +- .../sakhi/repositories/AbhaIdRepo.kt | 24 +++ .../ui/abha_id_activity/AbhaIdActivity.kt | 1 + .../aadhaar_id/AadhaarIdFragment.kt | 2 +- .../aadhaar_otp/AadhaarOtpFragment.kt | 4 +- .../aadhaar_otp/AadhaarOtpViewModel.kt | 13 +- .../create_abha_id/CreateAbhaFragment.kt | 142 ++++++++++-------- .../create_abha_id/CreateAbhaViewModel.kt | 54 ++++++- .../GenerateMobileOtpFragment.kt | 6 +- .../VerifyMobileOtpFragment.kt | 4 +- .../sakhi/ui/login_activity/LoginActivity.kt | 2 +- .../main/res/layout/fragment_create_abha.xml | 6 +- app/src/main/res/navigation/nav_abha_id.xml | 6 + 14 files changed, 190 insertions(+), 79 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt index 09a80be19..bf386ed4e 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt @@ -45,6 +45,9 @@ interface AbhaApiService { @POST("v3/enrollment/enrol/byAadhaar") suspend fun verifyAadhaarOtp3(@Body request: AbhaVerifyAadhaarOtpRequest, @Header("REQUEST-ID") requestId: String, @Header("TIMESTAMP") timestamp: String): Response + @GET("v3/profile/account/abha-card") + suspend fun printAbhaCard(@Header("REQUEST-ID") requestId: String, @Header("TIMESTAMP") timestamp: String): Response + @POST("v1/registration/aadhaar/generateMobileOTP") suspend fun generateMobileOtp(@Body mobile: AbhaGenerateMobileOtpRequest): Response diff --git a/app/src/main/java/org/piramalswasthya/sakhi/network/interceptors/TokenInsertAbhaInterceptor.kt b/app/src/main/java/org/piramalswasthya/sakhi/network/interceptors/TokenInsertAbhaInterceptor.kt index 1b8f9a3f5..b896f67d6 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/network/interceptors/TokenInsertAbhaInterceptor.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/network/interceptors/TokenInsertAbhaInterceptor.kt @@ -37,7 +37,7 @@ class TokenInsertAbhaInterceptor : Interceptor { .build() } val url = request.url.toString() - if (url.contains("getCard") || url.contains("getPngCard")) { + if (url.contains("getCard") || url.contains("getPngCard") || url.contains("abha-card")) { request = request .newBuilder() .addHeader( diff --git a/app/src/main/java/org/piramalswasthya/sakhi/repositories/AbhaIdRepo.kt b/app/src/main/java/org/piramalswasthya/sakhi/repositories/AbhaIdRepo.kt index ed0a0d095..337c7191c 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/repositories/AbhaIdRepo.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/repositories/AbhaIdRepo.kt @@ -251,6 +251,30 @@ class AbhaIdRepo @Inject constructor( } + suspend fun printAbhaCard(): NetworkResult { + return withContext(Dispatchers.IO) { + try { + val response = abhaApiService.printAbhaCard(generateUUID(), getCurrentTimestamp()) + val responseBody = response.body()?.bytes() + if (response.isSuccessful) { + NetworkResult.Success( + responseBody.toString()) + } else { + sendErrorResponse(response) + } + } catch (e: IOException) { + NetworkResult.Error(-1, "Unable to connect to Internet!") + } catch (e: JSONException) { + NetworkResult.Error(-2, "Invalid response! Please try again!") + } catch (e: SocketTimeoutException) { + NetworkResult.Error(-3, "Request Timed out! Please try again!") + } catch (e: java.lang.Exception) { + NetworkResult.Error(-4, e.message ?: "Unknown Error") + } + } + + } + suspend fun checkAndGenerateOtpForMobileNumber(req: AbhaGenerateMobileOtpRequest): NetworkResult { return withContext(Dispatchers.IO) { try { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/AbhaIdActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/AbhaIdActivity.kt index f96af0f5d..322819719 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/AbhaIdActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/AbhaIdActivity.kt @@ -166,6 +166,7 @@ class AbhaIdActivity : AppCompatActivity() { override fun onDestroy() { super.onDestroy() TokenInsertAbhaInterceptor.setToken("") + TokenInsertAbhaInterceptor.setXToken("") intent.removeExtra("benId") intent.removeExtra("benRegId") countDownTimer?.cancel() diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/AadhaarIdFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/AadhaarIdFragment.kt index 6868e3340..2da2f2a1e 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/AadhaarIdFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_id/AadhaarIdFragment.kt @@ -135,7 +135,7 @@ class AadhaarIdFragment : Fragment() { State.ABHA_GENERATED_SUCCESS -> { findNavController().navigate( AadhaarIdFragmentDirections.actionAadhaarIdFragmentToCreateAbhaFragment( - viewModel.txnId, "", "" + viewModel.txnId, "", "", "" ) ) } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt index a75b87375..902fad196 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt @@ -116,7 +116,7 @@ class AadhaarOtpFragment : Fragment() { if (parentViewModel.mobileNumber == viewModel.mobileNumber) { findNavController().navigate( AadhaarOtpFragmentDirections.actionAadhaarOtpFragmentToCreateAbhaFragment( - viewModel.txnId, viewModel.name, viewModel.abhaNumber + viewModel.txnId, viewModel.name, viewModel.phrAddress, viewModel.abhaNumber ) ) } else { @@ -128,7 +128,7 @@ class AadhaarOtpFragment : Fragment() { State.SUCCESS -> { findNavController().navigate( AadhaarOtpFragmentDirections.actionAadhaarOtpFragmentToVerifyMobileOtpFragment( - viewModel.txnId, viewModel.mobileNumber, viewModel.name, viewModel.abhaNumber + viewModel.txnId, viewModel.mobileNumber, viewModel.name, viewModel.phrAddress, viewModel.abhaNumber ) ) viewModel.resetState() diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt index 182100d6c..eb31683c9 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt @@ -14,6 +14,7 @@ import org.piramalswasthya.sakhi.network.AuthData import org.piramalswasthya.sakhi.network.Consent import org.piramalswasthya.sakhi.network.NetworkResult import org.piramalswasthya.sakhi.network.Otp +import org.piramalswasthya.sakhi.network.interceptors.TokenInsertAbhaInterceptor import org.piramalswasthya.sakhi.repositories.AbhaIdRepo import org.piramalswasthya.sakhi.ui.abha_id_activity.aadhaar_id.AadhaarIdViewModel import timber.log.Timber @@ -61,6 +62,10 @@ class AadhaarOtpViewModel @Inject constructor( val abhaNumber: String get() = _abhaNumber!! + private var _phrAddress: String? = null + val phrAddress: String + get() = _phrAddress!! + private var _mobileNumber: String? = null val mobileNumber: String get() = _mobileNumber!! @@ -99,9 +104,15 @@ class AadhaarOtpViewModel @Inject constructor( ) when (result) { is NetworkResult.Success -> { + TokenInsertAbhaInterceptor.setXToken(result.data.tokens.token) _txnId = result.data.txnId _mobileNumber = result.data.ABHAProfile.mobile - _name = result.data.ABHAProfile.firstName + if (result.data.ABHAProfile.middleName.isNotEmpty()) { + _name = result.data.ABHAProfile.firstName + " " + result.data.ABHAProfile.middleName + " " + result.data.ABHAProfile.lastName + } else { + _name = result.data.ABHAProfile.firstName + " " + result.data.ABHAProfile.lastName + } + _phrAddress = result.data.ABHAProfile.phrAddress[0] _abhaNumber = result.data.ABHAProfile.ABHANumber _state.value = State.OTP_VERIFY_SUCCESS } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt index bc044877f..d44143074 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt @@ -125,7 +125,12 @@ class CreateAbhaFragment : Fragment() { val benId = intent.getLongExtra("benId", 0) val benRegId = intent.getLongExtra("benRegId", 0) - viewModel.createHID(benId, benRegId) +// viewModel.createHID(benId, benRegId) + + viewModel.mapBeneficiaryToHealthId(benId, benRegId) + + binding.textView2.text = args.name + binding.textView4.text = args.abhaNumber // binding.pbCai.visibility = View.INVISIBLE // binding.clCreateAbhaId.visibility = View.VISIBLE @@ -172,67 +177,67 @@ class CreateAbhaFragment : Fragment() { onBackPressedCallback ) - viewModel.state.observe(viewLifecycleOwner) { state -> - when (state) { - State.IDLE -> {} - State.LOADING -> { - binding.pbCai.visibility = View.VISIBLE - binding.clCreateAbhaId.visibility = View.INVISIBLE - binding.clError.visibility = View.INVISIBLE - } - - State.ERROR_NETWORK -> { - binding.pbCai.visibility = View.INVISIBLE - binding.clCreateAbhaId.visibility = View.INVISIBLE - binding.clError.visibility = View.VISIBLE - } - - State.ERROR_SERVER -> { - binding.pbCai.visibility = View.INVISIBLE - binding.clError.visibility = View.INVISIBLE - binding.tvErrorText.visibility = View.VISIBLE - } - - State.ABHA_GENERATE_SUCCESS -> { - binding.pbCai.visibility = View.INVISIBLE - binding.clCreateAbhaId.visibility = View.VISIBLE - binding.clVerifyMobileOtp.visibility = View.INVISIBLE - binding.clError.visibility = View.INVISIBLE - } - - State.OTP_GENERATE_SUCCESS -> { - binding.clVerifyMobileOtp.visibility = View.VISIBLE - binding.clDownloadAbha.visibility = View.GONE - binding.clError.visibility = View.INVISIBLE - startResendTimer() - } - - State.OTP_VERIFY_SUCCESS -> { - binding.pbCai.visibility = View.INVISIBLE - binding.clCreateAbhaId.visibility = View.VISIBLE - binding.clDownloadAbha.visibility = View.GONE - binding.clVerifyMobileOtp.visibility = View.INVISIBLE - binding.clError.visibility = View.INVISIBLE - } - - State.DOWNLOAD_SUCCESS -> { - binding.pbCai.visibility = View.INVISIBLE - binding.clCreateAbhaId.visibility = View.VISIBLE - binding.clError.visibility = View.INVISIBLE - } - - State.DOWNLOAD_ERROR -> { - binding.pbCai.visibility = View.INVISIBLE - binding.clCreateAbhaId.visibility = View.VISIBLE - binding.clDownloadAbha.visibility = View.GONE - binding.clVerifyMobileOtp.visibility = View.VISIBLE - binding.tvErrorTextVerify.visibility = View.VISIBLE - startResendTimer() - } - - State.ERROR_INTERNAL -> {} - } - } +// viewModel.state.observe(viewLifecycleOwner) { state -> +// when (state) { +// State.IDLE -> {} +// State.LOADING -> { +// binding.pbCai.visibility = View.VISIBLE +// binding.clCreateAbhaId.visibility = View.INVISIBLE +// binding.clError.visibility = View.INVISIBLE +// } +// +// State.ERROR_NETWORK -> { +// binding.pbCai.visibility = View.INVISIBLE +// binding.clCreateAbhaId.visibility = View.INVISIBLE +// binding.clError.visibility = View.VISIBLE +// } +// +// State.ERROR_SERVER -> { +// binding.pbCai.visibility = View.INVISIBLE +// binding.clError.visibility = View.INVISIBLE +// binding.tvErrorText.visibility = View.VISIBLE +// } +// +// State.ABHA_GENERATE_SUCCESS -> { +// binding.pbCai.visibility = View.INVISIBLE +// binding.clCreateAbhaId.visibility = View.VISIBLE +// binding.clVerifyMobileOtp.visibility = View.INVISIBLE +// binding.clError.visibility = View.INVISIBLE +// } +// +// State.OTP_GENERATE_SUCCESS -> { +// binding.clVerifyMobileOtp.visibility = View.VISIBLE +// binding.clDownloadAbha.visibility = View.GONE +// binding.clError.visibility = View.INVISIBLE +// startResendTimer() +// } +// +// State.OTP_VERIFY_SUCCESS -> { +// binding.pbCai.visibility = View.INVISIBLE +// binding.clCreateAbhaId.visibility = View.VISIBLE +// binding.clDownloadAbha.visibility = View.GONE +// binding.clVerifyMobileOtp.visibility = View.INVISIBLE +// binding.clError.visibility = View.INVISIBLE +// } +// +// State.DOWNLOAD_SUCCESS -> { +// binding.pbCai.visibility = View.INVISIBLE +// binding.clCreateAbhaId.visibility = View.VISIBLE +// binding.clError.visibility = View.INVISIBLE +// } +// +// State.DOWNLOAD_ERROR -> { +// binding.pbCai.visibility = View.INVISIBLE +// binding.clCreateAbhaId.visibility = View.VISIBLE +// binding.clDownloadAbha.visibility = View.GONE +// binding.clVerifyMobileOtp.visibility = View.VISIBLE +// binding.tvErrorTextVerify.visibility = View.VISIBLE +// startResendTimer() +// } +// +// State.ERROR_INTERNAL -> {} +// } +// } viewModel.errorMessage.observe(viewLifecycleOwner) { it?.let { @@ -247,9 +252,15 @@ class CreateAbhaFragment : Fragment() { showFileNotification(it) } } + viewModel.byteImage.observe(viewLifecycleOwner) { + it?.let { + showFileNotification(it) + } + } binding.btnDownloadAbhaYes.setOnClickListener { - viewModel.generateOtp() - binding.clDownloadAbha.visibility = View.GONE + viewModel.printAbhaCard() +// viewModel.generateOtp() +// binding.clDownloadAbha.visibility = View.GONE } binding.resendOtp.setOnClickListener { @@ -280,7 +291,8 @@ class CreateAbhaFragment : Fragment() { val directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) val file = File(directory, fileName) - val data: ByteArray = Base64.decode(fileStr, 0) +// val data: ByteArray = Base64.decode(fileStr, 0) + val data: ByteArray = fileStr.toByteArray() FileOutputStream(file).use { stream -> stream.write(data) } MediaScannerConnection.scanFile( requireContext(), diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt index 584128e92..6ae0802b3 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt @@ -7,21 +7,28 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch +import org.piramalswasthya.sakhi.database.shared_preferences.PreferenceDao import org.piramalswasthya.sakhi.model.BenHealthIdDetails +import org.piramalswasthya.sakhi.network.AbhaVerifyAadhaarOtpRequest +import org.piramalswasthya.sakhi.network.AuthData +import org.piramalswasthya.sakhi.network.Consent import org.piramalswasthya.sakhi.network.CreateAbhaIdResponse import org.piramalswasthya.sakhi.network.CreateHIDResponse import org.piramalswasthya.sakhi.network.CreateHealthIdRequest import org.piramalswasthya.sakhi.network.GenerateOtpHid import org.piramalswasthya.sakhi.network.MapHIDtoBeneficiary import org.piramalswasthya.sakhi.network.NetworkResult +import org.piramalswasthya.sakhi.network.Otp import org.piramalswasthya.sakhi.network.ValidateOtpHid import org.piramalswasthya.sakhi.repositories.AbhaIdRepo import org.piramalswasthya.sakhi.repositories.BenRepo +import org.piramalswasthya.sakhi.ui.abha_id_activity.aadhaar_otp.AadhaarOtpViewModel.State import timber.log.Timber import javax.inject.Inject @HiltViewModel class CreateAbhaViewModel @Inject constructor( + private val pref: PreferenceDao, private val abhaIdRepo: AbhaIdRepo, private val benRepo: BenRepo, savedStateHandle: SavedStateHandle @@ -45,10 +52,18 @@ class CreateAbhaViewModel @Inject constructor( private val txnId = CreateAbhaFragmentArgs.fromSavedStateHandle(savedStateHandle).txnId + private val hID = + CreateAbhaFragmentArgs.fromSavedStateHandle(savedStateHandle).phrAddress + + private val healthIdNumber = + CreateAbhaFragmentArgs.fromSavedStateHandle(savedStateHandle).abhaNumber + val otpTxnID = MutableLiveData(null) val cardBase64 = MutableLiveData(null) + val byteImage = MutableLiveData(null) + private val _errorMessage = MutableLiveData(null) val errorMessage: LiveData get() = _errorMessage @@ -57,6 +72,43 @@ class CreateAbhaViewModel @Inject constructor( _state.value = State.LOADING } + fun printAbhaCard() { + viewModelScope.launch { + val result = abhaIdRepo.printAbhaCard() + when (result) { + is NetworkResult.Success -> { + byteImage.value = result.data + _state.value = State.ABHA_GENERATE_SUCCESS + } + + is NetworkResult.Error -> { + _errorMessage.value = result.message + _state.value = State.ERROR_SERVER + } + + is NetworkResult.NetworkError -> { + Timber.i(result.toString()) + _state.value = State.ERROR_NETWORK + } + } + } + } + + fun mapBeneficiaryToHealthId(benId: Long, benRegId: Long) { + viewModelScope.launch { + if ((benId != 0L) or (benRegId != 0L)) { + mapBeneficiary( + benId, + if (benRegId != 0L) benRegId else null, + hID, + healthIdNumber + ) + } else { + _state.value = State.ABHA_GENERATE_SUCCESS + } + } + } + fun createHID(benId: Long, benRegId: Long) { viewModelScope.launch { when (val result = @@ -64,7 +116,7 @@ class CreateAbhaViewModel @Inject constructor( CreateHealthIdRequest( "", txnId, "", "", "", "", "", "", "", "", "", "", "", - "", "", 0, "", 34, "" + "", "", 0, "", pref.getLoggedInUser()?.serviceMapId, "" ) )) { is NetworkResult.Success -> { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/generate_mobile_otp/GenerateMobileOtpFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/generate_mobile_otp/GenerateMobileOtpFragment.kt index 86b96aa13..6c268c307 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/generate_mobile_otp/GenerateMobileOtpFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/generate_mobile_otp/GenerateMobileOtpFragment.kt @@ -113,14 +113,14 @@ class GenerateMobileOtpFragment : Fragment() { if (viewModel.apiResponse.mobileLinked) { navController.navigate( GenerateMobileOtpFragmentDirections.actionGenerateMobileOtpFragmentToCreateAbhaFragment( - viewModel.txnIdFromArgs, "", "" + viewModel.txnIdFromArgs, "", "", "" ) ) } else { navController.navigate( GenerateMobileOtpFragmentDirections.actionGenerateMobileOtpFragmentToVerifyMobileOtpFragment( viewModel.apiResponse.txnId, - binding.tietMobileNumber.text!!.toString(), "", "" + binding.tietMobileNumber.text!!.toString(), "", "", "" ) ) } @@ -143,7 +143,7 @@ class GenerateMobileOtpFragment : Fragment() { State.ABHA_GENERATED_SUCCESS -> { navController.navigate( GenerateMobileOtpFragmentDirections.actionGenerateMobileOtpFragmentToCreateAbhaFragment( - viewModel.txnIdFromArgs, "", "" + viewModel.txnIdFromArgs, "", "", "" ) ) } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/verify_mobile_otp/VerifyMobileOtpFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/verify_mobile_otp/VerifyMobileOtpFragment.kt index 0540fa177..a0d1ae2e4 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/verify_mobile_otp/VerifyMobileOtpFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/verify_mobile_otp/VerifyMobileOtpFragment.kt @@ -107,7 +107,7 @@ class VerifyMobileOtpFragment : Fragment() { State.OTP_VERIFY_SUCCESS -> { findNavController().navigate( VerifyMobileOtpFragmentDirections.actionVerifyMobileOtpFragmentToCreateAbhaFragment( - viewModel.txnID, args.name, args.abhaNumber + viewModel.txnID, args.name, args.phrAddress, args.abhaNumber ) ) viewModel.resetState() @@ -141,7 +141,7 @@ class VerifyMobileOtpFragment : Fragment() { State.ABHA_GENERATED_SUCCESS -> { findNavController().navigate( VerifyMobileOtpFragmentDirections.actionVerifyMobileOtpFragmentToCreateAbhaFragment( - viewModel.txnID, args.name, args.abhaNumber + viewModel.txnID, args.name, args.phrAddress, args.abhaNumber ) ) viewModel.resetState() diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt index 445add678..00288b7fb 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt @@ -46,7 +46,7 @@ class LoginActivity : AppCompatActivity() { } override fun onCreate(savedInstanceState: Bundle?) { - window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); +// window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) createSyncServiceNotificationChannel() diff --git a/app/src/main/res/layout/fragment_create_abha.xml b/app/src/main/res/layout/fragment_create_abha.xml index 1d8f40cca..439d7b04e 100644 --- a/app/src/main/res/layout/fragment_create_abha.xml +++ b/app/src/main/res/layout/fragment_create_abha.xml @@ -83,8 +83,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" - android:text="@{viewModel.hidResponse.name}" android:textSize="14sp" /> + + @@ -148,6 +148,7 @@ android:layout_height="wrap_content" android:paddingLeft="50dp" android:paddingRight="50dp" + android:visibility="visible" app:layout_constraintTop_toBottomOf="@id/ll_abha_ben_mapped"> + @@ -95,6 +98,9 @@ + From aeb48a5e72b011091727dfc0d567e36e3b7b2b69 Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Thu, 2 Jan 2025 11:37:47 +0530 Subject: [PATCH 128/892] missing string from PR40 added in strings.xml file --- app/src/main/res/values/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f22409b79..09292b9e2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -95,6 +95,7 @@ TB Status SYNC STATE There is some error in loading your chat bot + Help & Support 2.0.0 From c10796695a5ad081b18de07fb89c2b9d63fdaa7b Mon Sep 17 00:00:00 2001 From: ShaanOnDev Date: Tue, 7 Jan 2025 12:48:54 +0530 Subject: [PATCH 129/892] Download ABHA Card Done --- .../sakhi/repositories/AbhaIdRepo.kt | 6 ++--- .../create_abha_id/CreateAbhaFragment.kt | 22 +++++++------------ .../create_abha_id/CreateAbhaViewModel.kt | 3 ++- 3 files changed, 13 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/repositories/AbhaIdRepo.kt b/app/src/main/java/org/piramalswasthya/sakhi/repositories/AbhaIdRepo.kt index 337c7191c..988af0966 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/repositories/AbhaIdRepo.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/repositories/AbhaIdRepo.kt @@ -251,14 +251,14 @@ class AbhaIdRepo @Inject constructor( } - suspend fun printAbhaCard(): NetworkResult { + suspend fun printAbhaCard(): NetworkResult { return withContext(Dispatchers.IO) { try { val response = abhaApiService.printAbhaCard(generateUUID(), getCurrentTimestamp()) - val responseBody = response.body()?.bytes() + val responseBody = response.body() if (response.isSuccessful) { NetworkResult.Success( - responseBody.toString()) + responseBody!!) } else { sendErrorResponse(response) } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt index d44143074..9adba54c1 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt @@ -14,7 +14,6 @@ import android.os.CountDownTimer import android.os.Environment import android.text.Editable import android.text.TextWatcher -import android.util.Base64 import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -30,16 +29,16 @@ import androidx.work.Operation import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint +import okhttp3.ResponseBody import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.databinding.FragmentCreateAbhaBinding import org.piramalswasthya.sakhi.ui.abha_id_activity.AbhaIdActivity -import org.piramalswasthya.sakhi.ui.abha_id_activity.aadhaar_otp.AadhaarOtpFragmentArgs -import org.piramalswasthya.sakhi.ui.abha_id_activity.create_abha_id.CreateAbhaViewModel.State import org.piramalswasthya.sakhi.work.WorkerUtils import timber.log.Timber import java.io.File import java.io.FileOutputStream + @AndroidEntryPoint class CreateAbhaFragment : Fragment() { @@ -53,6 +52,8 @@ class CreateAbhaFragment : Fragment() { private val channelId = "download abha card" + private var benId: Long = 0 + val args: CreateAbhaFragmentArgs by lazy { CreateAbhaFragmentArgs.fromBundle(requireArguments()) } @@ -122,7 +123,7 @@ class CreateAbhaFragment : Fragment() { val intent = requireActivity().intent - val benId = intent.getLongExtra("benId", 0) + benId = intent.getLongExtra("benId", 0) val benRegId = intent.getLongExtra("benRegId", 0) // viewModel.createHID(benId, benRegId) @@ -247,11 +248,6 @@ class CreateAbhaFragment : Fragment() { } } - viewModel.cardBase64.observe(viewLifecycleOwner) { - it?.let { - showFileNotification(it) - } - } viewModel.byteImage.observe(viewLifecycleOwner) { it?.let { showFileNotification(it) @@ -276,9 +272,9 @@ class CreateAbhaFragment : Fragment() { _binding = null } - private fun showFileNotification(fileStr: String) { + private fun showFileNotification(fileStr: ResponseBody) { val fileName = - "${viewModel.hidResponse.value?.name}_${System.currentTimeMillis()}.png" + "${benId}_${System.currentTimeMillis()}.png" val notificationManager = requireContext().getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { @@ -291,9 +287,7 @@ class CreateAbhaFragment : Fragment() { val directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) val file = File(directory, fileName) -// val data: ByteArray = Base64.decode(fileStr, 0) - val data: ByteArray = fileStr.toByteArray() - FileOutputStream(file).use { stream -> stream.write(data) } + FileOutputStream(file).use { stream -> stream.write(fileStr.bytes()) } MediaScannerConnection.scanFile( requireContext(), arrayOf(file.toString()), diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt index 6ae0802b3..b9fd14873 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt @@ -7,6 +7,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch +import okhttp3.ResponseBody import org.piramalswasthya.sakhi.database.shared_preferences.PreferenceDao import org.piramalswasthya.sakhi.model.BenHealthIdDetails import org.piramalswasthya.sakhi.network.AbhaVerifyAadhaarOtpRequest @@ -62,7 +63,7 @@ class CreateAbhaViewModel @Inject constructor( val cardBase64 = MutableLiveData(null) - val byteImage = MutableLiveData(null) + val byteImage = MutableLiveData(null) private val _errorMessage = MutableLiveData(null) val errorMessage: LiveData From 2b3eec4a0f81a5f1046fae6b4399e8927da54d13 Mon Sep 17 00:00:00 2001 From: ShaanOnDev Date: Tue, 7 Jan 2025 13:15:46 +0530 Subject: [PATCH 130/892] Removed unnecessary comments --- .../aadhaar_otp/AadhaarOtpViewModel.kt | 4 +- .../create_abha_id/CreateAbhaFragment.kt | 66 ------------------- .../create_abha_id/CreateAbhaViewModel.kt | 2 +- .../sakhi/ui/login_activity/LoginActivity.kt | 2 +- .../main/res/layout/fragment_create_abha.xml | 2 - 5 files changed, 4 insertions(+), 72 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt index eb31683c9..02393b4cc 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt @@ -62,9 +62,9 @@ class AadhaarOtpViewModel @Inject constructor( val abhaNumber: String get() = _abhaNumber!! - private var _phrAddress: String? = null + private var _phrAddress: String = "" val phrAddress: String - get() = _phrAddress!! + get() = _phrAddress private var _mobileNumber: String? = null val mobileNumber: String diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt index 9adba54c1..f8855e79c 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaFragment.kt @@ -126,8 +126,6 @@ class CreateAbhaFragment : Fragment() { benId = intent.getLongExtra("benId", 0) val benRegId = intent.getLongExtra("benRegId", 0) -// viewModel.createHID(benId, benRegId) - viewModel.mapBeneficiaryToHealthId(benId, benRegId) binding.textView2.text = args.name @@ -178,68 +176,6 @@ class CreateAbhaFragment : Fragment() { onBackPressedCallback ) -// viewModel.state.observe(viewLifecycleOwner) { state -> -// when (state) { -// State.IDLE -> {} -// State.LOADING -> { -// binding.pbCai.visibility = View.VISIBLE -// binding.clCreateAbhaId.visibility = View.INVISIBLE -// binding.clError.visibility = View.INVISIBLE -// } -// -// State.ERROR_NETWORK -> { -// binding.pbCai.visibility = View.INVISIBLE -// binding.clCreateAbhaId.visibility = View.INVISIBLE -// binding.clError.visibility = View.VISIBLE -// } -// -// State.ERROR_SERVER -> { -// binding.pbCai.visibility = View.INVISIBLE -// binding.clError.visibility = View.INVISIBLE -// binding.tvErrorText.visibility = View.VISIBLE -// } -// -// State.ABHA_GENERATE_SUCCESS -> { -// binding.pbCai.visibility = View.INVISIBLE -// binding.clCreateAbhaId.visibility = View.VISIBLE -// binding.clVerifyMobileOtp.visibility = View.INVISIBLE -// binding.clError.visibility = View.INVISIBLE -// } -// -// State.OTP_GENERATE_SUCCESS -> { -// binding.clVerifyMobileOtp.visibility = View.VISIBLE -// binding.clDownloadAbha.visibility = View.GONE -// binding.clError.visibility = View.INVISIBLE -// startResendTimer() -// } -// -// State.OTP_VERIFY_SUCCESS -> { -// binding.pbCai.visibility = View.INVISIBLE -// binding.clCreateAbhaId.visibility = View.VISIBLE -// binding.clDownloadAbha.visibility = View.GONE -// binding.clVerifyMobileOtp.visibility = View.INVISIBLE -// binding.clError.visibility = View.INVISIBLE -// } -// -// State.DOWNLOAD_SUCCESS -> { -// binding.pbCai.visibility = View.INVISIBLE -// binding.clCreateAbhaId.visibility = View.VISIBLE -// binding.clError.visibility = View.INVISIBLE -// } -// -// State.DOWNLOAD_ERROR -> { -// binding.pbCai.visibility = View.INVISIBLE -// binding.clCreateAbhaId.visibility = View.VISIBLE -// binding.clDownloadAbha.visibility = View.GONE -// binding.clVerifyMobileOtp.visibility = View.VISIBLE -// binding.tvErrorTextVerify.visibility = View.VISIBLE -// startResendTimer() -// } -// -// State.ERROR_INTERNAL -> {} -// } -// } - viewModel.errorMessage.observe(viewLifecycleOwner) { it?.let { binding.tvErrorTextVerify.text = it @@ -255,8 +191,6 @@ class CreateAbhaFragment : Fragment() { } binding.btnDownloadAbhaYes.setOnClickListener { viewModel.printAbhaCard() -// viewModel.generateOtp() -// binding.clDownloadAbha.visibility = View.GONE } binding.resendOtp.setOnClickListener { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt index b9fd14873..ccc2b440c 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/create_abha_id/CreateAbhaViewModel.kt @@ -97,7 +97,7 @@ class CreateAbhaViewModel @Inject constructor( fun mapBeneficiaryToHealthId(benId: Long, benRegId: Long) { viewModelScope.launch { - if ((benId != 0L) or (benRegId != 0L)) { + if ((benId != 0L) || (benRegId != 0L)) { mapBeneficiary( benId, if (benRegId != 0L) benRegId else null, diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt index 00288b7fb..445add678 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/LoginActivity.kt @@ -46,7 +46,7 @@ class LoginActivity : AppCompatActivity() { } override fun onCreate(savedInstanceState: Bundle?) { -// window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); + window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) createSyncServiceNotificationChannel() diff --git a/app/src/main/res/layout/fragment_create_abha.xml b/app/src/main/res/layout/fragment_create_abha.xml index 439d7b04e..2f3183354 100644 --- a/app/src/main/res/layout/fragment_create_abha.xml +++ b/app/src/main/res/layout/fragment_create_abha.xml @@ -84,7 +84,6 @@ android:layout_height="wrap_content" android:layout_weight="1" android:textSize="14sp" /> - - From fad14d7ef62bebbd6f5f47e84d510f4b1b559f75 Mon Sep 17 00:00:00 2001 From: ShaanOnDev Date: Tue, 7 Jan 2025 18:39:20 +0530 Subject: [PATCH 131/892] Updated URLs --- app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt | 2 +- .../java/org/piramalswasthya/sakhi/network/AbhaApiService.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt b/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt index eab975c75..32a0a3db2 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt @@ -40,7 +40,7 @@ object AppModule { // private const val baseAbhaUrl = "https://healthidsbx.abdm.gov.in/api/" private const val baseAbhaUrl = "https://abhasbx.abdm.gov.in/abha/api/" // Production ABHA URL -// private const val baseAbhaUrl = "https://healthid.abdm.gov.in/api/" +// private const val baseAbhaUrl = "https://abha.abdm.gov.in/api/abha/" private val baseClient = OkHttpClient.Builder() diff --git a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt index bf386ed4e..b1767ae76 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/network/AbhaApiService.kt @@ -82,13 +82,13 @@ interface AbhaApiService { // Staging RES Encryption API (v3) @GET suspend fun getAuthCert( - @Url url: String = "https://healthidsbx.abdm.gov.in/api/v1/auth/cert" + @Url url: String = "https://abhasbx.abdm.gov.in/abha/api/v3/profile/public/certificate" ): Response // Production RES Encryption API (v3) // @GET // suspend fun getAuthCert( -// @Url url: String = "https://healthid.abdm.gov.in/api/v1/auth/cert" +// @Url url: String = "https://abha.abdm.gov.in/api/abha/v3/profile/public/certificate" // ): Response @GET("v2/ha/lgd/states") From 84269952549d60b147e3257975a2a892877d969a Mon Sep 17 00:00:00 2001 From: ShaanOnDev Date: Wed, 8 Jan 2025 00:00:37 +0530 Subject: [PATCH 132/892] Resend OTP Issue Resolved --- .../ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt | 2 +- .../abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt index 902fad196..7240543df 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpFragment.kt @@ -63,7 +63,7 @@ class AadhaarOtpFragment : Fragment() { viewModel.verifyOtpClicked(binding.tietAadhaarOtp.text.toString(), parentViewModel.mobileNumber) } binding.resendOtp.setOnClickListener { - viewModel.resendOtp() + viewModel.generateOtpClicked("") startResendTimer() } diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt index 02393b4cc..73ed08fe6 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/abha_id_activity/aadhaar_otp/AadhaarOtpViewModel.kt @@ -42,6 +42,10 @@ class AadhaarOtpViewModel @Inject constructor( val state: LiveData get() = _state + private val _state2 = MutableLiveData(AadhaarIdViewModel.State.IDLE) + val state2: LiveData + get() = _state2 + private val _errorMessage = MutableLiveData(null) val errorMessage: LiveData get() = _errorMessage @@ -169,6 +173,10 @@ class AadhaarOtpViewModel @Inject constructor( } } + fun generateOtpClicked(aadhaarNo: String) { + _state2.value = AadhaarIdViewModel.State.LOADING + } + fun resendOtp() { _state.value = State.LOADING viewModelScope.launch { From 616c839ab1b398c147eff721b507dd77dc358f10 Mon Sep 17 00:00:00 2001 From: Nikhil Fegade Date: Thu, 9 Jan 2025 12:33:45 +0530 Subject: [PATCH 133/892] Translation changes done hide chat feature for playstore added delete account flow --- app/src/main/AndroidManifest.xml | 1 + .../sakhi/ui/home_activity/HomeActivity.kt | 23 ++++- .../login_activity/sign_in/SignInFragment.kt | 41 ++++++-- .../main/res/drawable/ic_delete_account.xml | 16 ++++ app/src/main/res/layout/fragment_sign_in.xml | 17 +++- .../main/res/menu/activity_home_drawer.xml | 5 + app/src/main/res/values-as/strings_ben.xml | 94 +++++++++---------- app/src/main/res/values-as/strings_home.xml | 5 +- app/src/main/res/values-as/strings_kid.xml | 2 +- app/src/main/res/values-as/strings_login.xml | 3 + app/src/main/res/values-as/strings_ncd.xml | 23 +++-- app/src/main/res/values/strings.xml | 1 + app/src/main/res/values/strings_login.xml | 2 + 13 files changed, 162 insertions(+), 71 deletions(-) create mode 100644 app/src/main/res/drawable/ic_delete_account.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2ae041327..7d3b2fdf5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -25,6 +25,7 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_native_name" android:largeHeap="true" + android:networkSecurityConfig="@xml/network_security_config" android:requestLegacyExternalStorage="true" android:roundIcon="@mipmap/ic_launcher_round" android:theme="@style/Theme.Sakhi" diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt index ced0b4c26..e14350e2b 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/HomeActivity.kt @@ -4,7 +4,7 @@ import android.Manifest import android.content.Context import android.content.Intent import android.graphics.Bitmap -import android.os.Build +import android.net.Uri import android.os.Bundle import android.util.Log import android.view.Menu @@ -59,7 +59,6 @@ import org.piramalswasthya.sakhi.ui.login_activity.LoginActivity import org.piramalswasthya.sakhi.ui.service_location_activity.ServiceLocationActivity import org.piramalswasthya.sakhi.work.WorkerUtils import java.net.URI -import java.util.* import java.util.Locale import javax.inject.Inject @@ -67,7 +66,7 @@ import javax.inject.Inject @AndroidEntryPoint class HomeActivity : AppCompatActivity() { - var isChatSupportEnabled : Boolean = true + var isChatSupportEnabled : Boolean = false @@ -529,6 +528,24 @@ class HomeActivity : AppCompatActivity() { binding.drawerLayout.close() true + } + binding.navView.menu.findItem(R.id.menu_delete_account).setOnMenuItemClickListener { + var url = "" + if (BuildConfig.FLAVOR.equals("production", true)) { + url = "https://forms.office.com/r/HkE3c0tGr6" + } else { + url = + "https://forms.office.com/Pages/ResponsePage.aspx?id=jQ49md0HKEGgbxRJvtPnRISY9UjAA01KtsFKYKhp1nNURUpKQzNJUkE1OUc0SllXQ0IzRFVJNlM2SC4u" + } + + if (url.isNotEmpty()){ + val i = Intent(Intent.ACTION_VIEW) + i.setData(Uri.parse(url)) + startActivity(i) + } + binding.drawerLayout.close() + true + } if (isChatSupportEnabled) { diff --git a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/sign_in/SignInFragment.kt b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/sign_in/SignInFragment.kt index a7420186e..f74660ca0 100644 --- a/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/sign_in/SignInFragment.kt +++ b/app/src/main/java/org/piramalswasthya/sakhi/ui/login_activity/sign_in/SignInFragment.kt @@ -3,7 +3,9 @@ package org.piramalswasthya.sakhi.ui.login_activity.sign_in import android.app.AlertDialog import android.content.Context import android.content.Intent +import android.net.Uri import android.os.Bundle +import android.text.Html import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -15,6 +17,7 @@ import androidx.navigation.fragment.findNavController import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch +import org.piramalswasthya.sakhi.BuildConfig import org.piramalswasthya.sakhi.R import org.piramalswasthya.sakhi.database.shared_preferences.PreferenceDao import org.piramalswasthya.sakhi.databinding.FragmentSignInBinding @@ -25,7 +28,6 @@ import org.piramalswasthya.sakhi.helpers.Languages.HINDI import org.piramalswasthya.sakhi.helpers.NetworkResponse import org.piramalswasthya.sakhi.ui.login_activity.LoginActivity import org.piramalswasthya.sakhi.work.WorkerUtils -import timber.log.Timber import javax.inject.Inject @@ -49,16 +51,26 @@ class SignInFragment : Fragment() { } private val userChangeAlert by lazy { - var str = "previously logged in with " + viewModel.getLoggedInUser()?.userName + " do you" + - " want to override? " +// var str = "previously logged in with " + viewModel.getLoggedInUser()?.userName + " do you" + +// " want to override? " + + var username = "${viewModel.getLoggedInUser()?.userName}" + var name = "${viewModel.getLoggedInUser()?.name}" + // var str = "You are previously logged in with Username: $username as $name, Do you want to Log in with another User?" + + var str = + getString(R.string.login_diff_user).replace("@username", username).replace("asha", name) + viewModel.unprocessedRecordsCount.value?.let { if (it > 0) { - str += "there are" + viewModel.unprocessedRecordsCount.value + " unprocessed records, wait till records are synced" + var count = viewModel.unprocessedRecordsCount.value + str += getString(R.string.unsync_record_count).replace(oldValue = "@count", newValue = count.toString()) + //"there are" + viewModel.unprocessedRecordsCount.value + " unprocessed records, wait till records are synced" } } MaterialAlertDialogBuilder(requireContext()).setTitle(resources.getString(R.string.logout)) - .setMessage(str) + .setMessage(Html.fromHtml(str)) .setPositiveButton(resources.getString(R.string.yes)) { dialog, _ -> viewModel.unprocessedRecordsCount.value?.let { if (it > 0) { @@ -120,6 +132,23 @@ class SignInFragment : Fragment() { } + binding.tvDeleteAccount?.setOnClickListener { + var url = "" + + if (BuildConfig.FLAVOR.equals("production", true)) { + url = "https://forms.office.com/r/HkE3c0tGr6" + } else { + url = + "https://forms.office.com/Pages/ResponsePage.aspx?id=jQ49md0HKEGgbxRJvtPnRISY9UjAA01KtsFKYKhp1nNURUpKQzNJUkE1OUc0SllXQ0IzRFVJNlM2SC4u" + } + + if (url.isNotEmpty()){ + val i = Intent(Intent.ACTION_VIEW) + i.setData(Uri.parse(url)) + startActivity(i) + } + } + viewModel.state.observe(viewLifecycleOwner) { state -> when (state) { @@ -212,4 +241,4 @@ class SignInFragment : Fragment() { super.onDestroy() _binding = null } -} \ No newline at end of file +} diff --git a/app/src/main/res/drawable/ic_delete_account.xml b/app/src/main/res/drawable/ic_delete_account.xml new file mode 100644 index 000000000..47ba91a00 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete_account.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/app/src/main/res/layout/fragment_sign_in.xml b/app/src/main/res/layout/fragment_sign_in.xml index cd541b295..5fde1e7ff 100644 --- a/app/src/main/res/layout/fragment_sign_in.xml +++ b/app/src/main/res/layout/fragment_sign_in.xml @@ -26,7 +26,7 @@ android:layout_marginTop="40dp" android:contentDescription="@string/cd_assam_nhm_logo" android:src="@drawable/logo_circle" - /> + /> + +

    h@1%y)=IK&oxvR~$>Ot<+@7QME(<8>#rq-*| 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 f8Xxqt^%b;3?P-n3oYj+dMLHlCP22Z%z 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 W-?th8o?_*AR~!A}WQcZ-mH#hI$bohM literal 0 HcmV?d00001 diff --git a/app/src/main/res/font/roboto_light.ttf b/app/src/main/res/font/roboto_light.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a7e02843a764de221b3d92231f0d6a268b6a8824 GIT binary patch literal 167000 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 T6Ya~mQ-IwiI|w<^4ubyy%V3BS literal 0 HcmV?d00001 diff --git a/app/src/main/res/font/roboto_medium.ttf b/app/src/main/res/font/roboto_medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0707e15c3ae09c0e97cc716cf329063a95f5d168 GIT binary patch literal 168644 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⪚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