diff --git a/app/build.gradle b/app/build.gradle index 278728a..6cfcbda 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -133,4 +133,6 @@ dependencies { implementation "com.squareup.retrofit2:retrofit:2.9.0" implementation "com.squareup.retrofit2:converter-gson:2.9.0" + implementation "androidx.preference:preference-ktx:1.2.1" + } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpostesting/data/constant/LanguageManager.kt b/app/src/main/java/com/example/hpostesting/data/constant/LanguageManager.kt new file mode 100644 index 0000000..85d6a7c --- /dev/null +++ b/app/src/main/java/com/example/hpostesting/data/constant/LanguageManager.kt @@ -0,0 +1,30 @@ +package com.example.hpostesting.data.constant + +import android.content.Context +import android.content.SharedPreferences +import java.util.Locale + +object LanguageManager { + private const val LANGUAGE_PREF_KEY = "language_pref" + + fun setLocale(context: Context, languageCode: String) { + val locale = Locale(languageCode) + Locale.setDefault(locale) + + val resources = context.resources + val configuration = resources.configuration + configuration.setLocale(locale) + + context.createConfigurationContext(configuration) + } + + fun persistLanguagePreference(context: Context, languageCode: String) { + val prefs: SharedPreferences = context.getSharedPreferences("AppPrefs", Context.MODE_PRIVATE) + prefs.edit().putString(LANGUAGE_PREF_KEY, languageCode).apply() + } + + fun getSavedLanguage(context: Context): String { + val prefs: SharedPreferences = context.getSharedPreferences("AppPrefs", Context.MODE_PRIVATE) + return prefs.getString(LANGUAGE_PREF_KEY, "en") ?: "en" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/hpostesting/presentation/KitScanActivity.kt b/app/src/main/java/com/example/hpostesting/presentation/KitScanActivity.kt index a1420c1..3c52ec8 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/KitScanActivity.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/KitScanActivity.kt @@ -11,6 +11,7 @@ import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.example.hpostesting.data.DataHolder import com.example.hpostesting.data.constant.Constants +import com.example.hpostesting.data.constant.LanguageManager import com.example.hpostesting.presentation.hemocube.HemocubeActivity import com.example.hpostesting.presentation.testRight.TestRightActivity @@ -44,6 +45,12 @@ class KitScanActivity : AppCompatActivity() { binding.nameEditText.setText(contents) } + override fun attachBaseContext(newBase: Context?) { + val languageCode = LanguageManager.getSavedLanguage(newBase!!) + LanguageManager.setLocale(newBase, languageCode) + super.attachBaseContext(newBase) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/example/hpostesting/presentation/MainActivity.kt b/app/src/main/java/com/example/hpostesting/presentation/MainActivity.kt index 1381a56..85d5052 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/MainActivity.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/MainActivity.kt @@ -17,6 +17,7 @@ import androidx.core.content.ContextCompat import androidx.core.view.get import com.example.hpostesting.data.DataHolder import com.example.hpostesting.data.constant.Constants +import com.example.hpostesting.data.constant.LanguageManager import com.example.hpostesting.data.model.patient.UserData import com.example.hpostesting.data.model.test.TestType import com.google.android.gms.location.* @@ -44,6 +45,12 @@ class MainActivity : AppCompatActivity() { } } + override fun attachBaseContext(newBase: Context?) { + val languageCode = LanguageManager.getSavedLanguage(newBase!!) + LanguageManager.setLocale(newBase, languageCode) + super.attachBaseContext(newBase) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) diff --git a/app/src/main/java/com/example/hpostesting/presentation/SplashActivity.kt b/app/src/main/java/com/example/hpostesting/presentation/SplashActivity.kt index 41d77ba..c8e4a3a 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/SplashActivity.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/SplashActivity.kt @@ -2,6 +2,7 @@ package com.example.hpostesting.presentation import com.example.hpostesting.presentation.dashboard.DashboardActivity import android.Manifest +import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.os.Build @@ -14,6 +15,7 @@ import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import com.example.hpostesting.data.DataHolder +import com.example.hpostesting.data.constant.LanguageManager import com.example.hpostesting.util.MyUtils import `in`.sminnovations.hpostesting.R import `in`.sminnovations.hpostesting.databinding.ActivitySplashBinding @@ -32,6 +34,12 @@ class SplashActivity : AppCompatActivity() { private var allPermissionsGranted = false + override fun attachBaseContext(newBase: Context?) { + val languageCode = LanguageManager.getSavedLanguage(newBase!!) + LanguageManager.setLocale(newBase, languageCode) + super.attachBaseContext(newBase) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivitySplashBinding.inflate(layoutInflater) diff --git a/app/src/main/java/com/example/hpostesting/presentation/adapter/UserListAdapter.kt b/app/src/main/java/com/example/hpostesting/presentation/adapter/UserListAdapter.kt index af1dc97..e0034c0 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/adapter/UserListAdapter.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/adapter/UserListAdapter.kt @@ -94,13 +94,13 @@ class UserListAdapter( val builder = AlertDialog.Builder(context) .setView(dialogView) - .setTitle("Add Blood Group") + .setTitle(R.string.blood_group) val etBloodGroup = dialogView.findViewById(R.id.et_blood_group) - builder.setPositiveButton("OK") { dialog, which -> + builder.setPositiveButton(R.string.ok) { dialog, which -> val bloodGroup = etBloodGroup.text.toString() - if (bloodGroup.equals("Select Blood Group") || bloodGroup.isNullOrBlank()) { + if (bloodGroup.equals("Select Blood Group") ||bloodGroup.equals("ರಕ್ತ ಗುಂಪು ಆಯ್ಕೆಮಾಡಿ") || bloodGroup.isNullOrBlank()) { if (view != null) { etBloodGroup.error =view.context.getString(R.string.blood_group_error) } @@ -166,7 +166,7 @@ class UserListAdapter( // Handle the selected blood group here } - builder.setNegativeButton("Cancel") { dialog, which -> + builder.setNegativeButton(R.string.cancel) { dialog, which -> dialog.dismiss() } diff --git a/app/src/main/java/com/example/hpostesting/presentation/buffercheck/HemocubeBufferCheckActivity.kt b/app/src/main/java/com/example/hpostesting/presentation/buffercheck/HemocubeBufferCheckActivity.kt index 4f1a692..2b27d63 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/buffercheck/HemocubeBufferCheckActivity.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/buffercheck/HemocubeBufferCheckActivity.kt @@ -21,6 +21,7 @@ import androidx.core.content.ContextCompat import androidx.core.view.get import com.example.hpostesting.data.DataHolder import com.example.hpostesting.data.constant.Constants +import com.example.hpostesting.data.constant.LanguageManager import com.example.hpostesting.presentation.hemocube.HemoCubeViewModel import com.example.hpostesting.presentation.testRight.UsbService import com.hoho.android.usbserial.driver.UsbSerialDriver @@ -73,6 +74,12 @@ open class HemocubeBufferCheckActivity : AppCompatActivity() { } } + override fun attachBaseContext(newBase: Context?) { + val languageCode = LanguageManager.getSavedLanguage(newBase!!) + LanguageManager.setLocale(newBase, languageCode) + super.attachBaseContext(newBase) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityHemocubeBinding.inflate(layoutInflater) diff --git a/app/src/main/java/com/example/hpostesting/presentation/dashboard/DashboardActivity.kt b/app/src/main/java/com/example/hpostesting/presentation/dashboard/DashboardActivity.kt index fe96862..1117c9c 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/dashboard/DashboardActivity.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/dashboard/DashboardActivity.kt @@ -1,5 +1,6 @@ package com.example.hpostesting.presentation.dashboard +import android.content.Context import android.os.Bundle import android.view.Menu import android.widget.Toast @@ -10,7 +11,7 @@ import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.navigateUp import androidx.navigation.ui.setupActionBarWithNavController import androidx.navigation.ui.setupWithNavController -import com.example.hpostesting.presentation.dashboard.SlideshowSettingsFragment +import com.example.hpostesting.data.constant.LanguageManager import com.google.android.material.navigation.NavigationView import com.google.firebase.appdistribution.FirebaseAppDistribution import com.google.firebase.appdistribution.FirebaseAppDistributionException @@ -25,6 +26,12 @@ class DashboardActivity : AppCompatActivity() { private lateinit var appBarConfiguration: AppBarConfiguration private lateinit var binding: ActivityDashboardBinding + override fun attachBaseContext(newBase: Context?) { + val languageCode = LanguageManager.getSavedLanguage(newBase!!) + LanguageManager.setLocale(newBase, languageCode) + super.attachBaseContext(newBase) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt index d74f22d..f714436 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt @@ -162,10 +162,10 @@ class HomeFragment : Fragment() { val dateFormat = SimpleDateFormat("yyyy-MM-dd") val currentDate = Date() val formattedDate = dateFormat.format(currentDate) -// val query = Firebase.firestore.collection("patientData") -// .whereGreaterThanOrEqualTo("createdAt", formattedDate) -// .orderBy("createdAt", Query.Direction.DESCENDING) - val query = Firebase.firestore.collection("patientData").whereEqualTo("testStatus", false) + val query = Firebase.firestore.collection("patientData") + .whereGreaterThanOrEqualTo("createdAt", formattedDate) + .orderBy("createdAt", Query.Direction.DESCENDING) +// val query = Firebase.firestore.collection("patientData").whereEqualTo("testStatus", false) query.get().addOnSuccessListener { if (it.documents.isEmpty()) { binding.pendingTest.visibility = View.VISIBLE diff --git a/app/src/main/java/com/example/hpostesting/presentation/dashboard/SlideshowFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/dashboard/SlideshowFragment.kt index d8fa656..5b89238 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/dashboard/SlideshowFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/dashboard/SlideshowFragment.kt @@ -1,47 +1,66 @@ package com.example.hpostesting.presentation.dashboard + +import android.content.Context +import android.content.pm.PackageManager import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProvider -import com.example.hpostesting.presentation.dashboard.ui.slideshow.SlideshowViewModel +import android.widget.Toast +import androidx.preference.ListPreference +import androidx.preference.Preference +import androidx.preference.PreferenceFragmentCompat +import com.example.hpostesting.data.constant.LanguageManager +import `in`.sminnovations.hpostesting.R -import `in`.sminnovations.hpostesting.databinding.FragmentSlideshowBinding +private var isLanguageChanged = false -class SlideshowFragment : Fragment() { - private var _binding: FragmentSlideshowBinding? = null +class SlideshowFragment : PreferenceFragmentCompat() { + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + val preferenceScreen = preferenceManager.createPreferenceScreen(requireContext()) - // This property is only valid between onCreateView and - // onDestroyView. - private val binding get() = _binding!! + val languagePreference = ListPreference(requireContext()) + languagePreference.key = "language_preference" + languagePreference.title = getString(R.string.app_language) + languagePreference.summary = getString(R.string.select_language) + languagePreference.entries = arrayOf("English", "Kannada", "Hindi") + languagePreference.entryValues = arrayOf("en", "kn", "hi") + languagePreference.setDefaultValue("en") - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle?, - ): View { - val slideshowViewModel = - ViewModelProvider(this).get(SlideshowViewModel::class.java) + languagePreference.onPreferenceChangeListener = + Preference.OnPreferenceChangeListener { _, newValue -> + val languageCode = newValue as String + updateLanguage(requireContext(), languageCode) + true + } - _binding = FragmentSlideshowBinding.inflate(inflater, container, false) - val root: View = binding.root + preferenceScreen.addPreference(languagePreference) + setPreferenceScreen(preferenceScreen) - val pInfo = requireActivity().packageManager.getPackageInfo( - requireActivity().packageName, 0 - ) - val version = pInfo.versionName - binding.textSlideshow.text = version + // App Version Preference + val appVersionPreference = Preference(requireContext()) + appVersionPreference.title = "App Version" + appVersionPreference.summary = getAppVersion(requireContext()) -// val textView: TextView = binding.textSlideshow -// slideshowViewModel.text.observe(viewLifecycleOwner) { -// textView.text = it -// } - return root + preferenceScreen.addPreference(languagePreference) + preferenceScreen.addPreference(appVersionPreference) + setPreferenceScreen(preferenceScreen) + + if (isLanguageChanged) { + Toast.makeText(requireContext(), R.string.language_update, Toast.LENGTH_SHORT).show() + } } - override fun onDestroyView() { - super.onDestroyView() - _binding = null + private fun updateLanguage(context: Context, languageCode: String) { + LanguageManager.persistLanguagePreference(context, languageCode) + LanguageManager.setLocale(context, languageCode) + requireActivity().recreate() // Recreate activity to apply language changes + isLanguageChanged = true + } + + private fun getAppVersion(context: Context): String { + return try { + val pInfo = context.packageManager.getPackageInfo(context.packageName, 0) + pInfo.versionName + } catch (e: PackageManager.NameNotFoundException) { + "N/A" + } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsActivity.kt b/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsActivity.kt index df5d356..25b41b4 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsActivity.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsActivity.kt @@ -21,6 +21,7 @@ import androidx.core.content.ContextCompat import androidx.core.view.get import com.example.hpostesting.data.DataHolder import com.example.hpostesting.data.constant.Constants +import com.example.hpostesting.data.constant.LanguageManager import com.example.hpostesting.presentation.hemocube.HemoCubeFragment import com.example.hpostesting.presentation.hemocube.HemoCubeViewModel import com.example.hpostesting.presentation.testRight.UsbService @@ -77,6 +78,12 @@ class DiagnosticsActivity : AppCompatActivity() { } } + override fun attachBaseContext(newBase: Context?) { + val languageCode = LanguageManager.getSavedLanguage(newBase!!) + LanguageManager.setLocale(newBase, languageCode) + super.attachBaseContext(newBase) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityDiagnosticsBinding.inflate(layoutInflater) diff --git a/app/src/main/java/com/example/hpostesting/presentation/hemocube/DigitalCardActivity.kt b/app/src/main/java/com/example/hpostesting/presentation/hemocube/DigitalCardActivity.kt index 95c08d1..6e82bf7 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/hemocube/DigitalCardActivity.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/hemocube/DigitalCardActivity.kt @@ -14,6 +14,7 @@ import android.os.IBinder import android.view.Menu import androidx.activity.viewModels import com.example.hpostesting.data.DataHolder +import com.example.hpostesting.data.constant.LanguageManager import com.example.hpostesting.presentation.testRight.UsbService import com.hoho.android.usbserial.driver.UsbSerialDriver import `in`.sminnovations.hpostesting.R @@ -21,8 +22,15 @@ import `in`.sminnovations.hpostesting.databinding.ActivityDigitalCardBinding import `in`.sminnovations.hpostesting.databinding.ActivityHemocubeBinding class DigitalCardActivity : AppCompatActivity() { + private lateinit var binding: ActivityDigitalCardBinding + override fun attachBaseContext(newBase: Context?) { + val languageCode = LanguageManager.getSavedLanguage(newBase!!) + LanguageManager.setLocale(newBase, languageCode) + super.attachBaseContext(newBase) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityDigitalCardBinding.inflate(layoutInflater) diff --git a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt index 011da21..9dc327e 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt @@ -1,6 +1,5 @@ package com.example.hpostesting.presentation.hemocube -import com.example.hpostesting.presentation.dashboard.DashboardActivity import android.content.Context import android.content.Intent import android.content.SharedPreferences @@ -19,7 +18,7 @@ import com.example.hpostesting.data.constant.HemoCubeCommands import com.example.hpostesting.data.model.patient.DeviceData import com.example.hpostesting.data.model.patient.toHemoCubeTestData import com.example.hpostesting.presentation.UsbServiceListener - +import com.example.hpostesting.presentation.dashboard.DashboardActivity import com.example.hpostesting.presentation.utils.MyDialogListener import com.example.hpostesting.presentation.utils.UIUtils import com.google.firebase.crashlytics.ktx.crashlytics diff --git a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemocubeActivity.kt b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemocubeActivity.kt index fcc4110..ca197fe 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemocubeActivity.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemocubeActivity.kt @@ -21,6 +21,7 @@ import androidx.core.content.ContextCompat import androidx.core.view.get import com.example.hpostesting.data.DataHolder import com.example.hpostesting.data.constant.Constants +import com.example.hpostesting.data.constant.LanguageManager import com.example.hpostesting.presentation.testRight.UsbService import com.hoho.android.usbserial.driver.UsbSerialDriver import com.hoho.android.usbserial.driver.UsbSerialProber @@ -72,6 +73,12 @@ open class HemocubeActivity : AppCompatActivity() { viewModel.isServiceConnected = false } } + override fun attachBaseContext(newBase: Context?) { + val languageCode = LanguageManager.getSavedLanguage(newBase!!) + LanguageManager.setLocale(newBase, languageCode) + super.attachBaseContext(newBase) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/res/layout/fragment_slideshow.xml b/app/src/main/res/layout/fragment_slideshow.xml index dac927e..5757871 100644 --- a/app/src/main/res/layout/fragment_slideshow.xml +++ b/app/src/main/res/layout/fragment_slideshow.xml @@ -1,36 +1,9 @@ - - + - - - - - - - - - + \ No newline at end of file diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 28cf949..6c5189e 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -255,5 +255,9 @@ सैम्पल रखें अमान्य त्रुटि - + भाषा सफलतापूर्वक अपडेट की गई है + अपनी पसंदीदा भाषा का चयन करें + ऐप भाषा + रक्त समूह जोड़ें + ठीक है \ No newline at end of file diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-kn/strings.xml similarity index 97% rename from app/src/main/res/values-ka/strings.xml rename to app/src/main/res/values-kn/strings.xml index 1babc00..001b10c 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-kn/strings.xml @@ -255,5 +255,11 @@ ನಮೂನೆ ಇಟ್ಟುಕೊಳ್ಳಿ ಅಮಾನ್ಯ ದೋಷ + ಭಾಷೆ ಯಶಸ್ವಿಯಾಗಿ ನವೀಕರಿಸಲಾಗಿದೆ + ನಿಮ್ಮ ಆದರಿತ ಭಾಷೆಯನ್ನು ಆಯ್ಕೆ ಮಾಡಿ + ಅಪ್ಲಿಕೇಶನ್ ಭಾಷೆ + ರಕ್ತ ಗುಂಡನ್ನು ಸೇರಿಸಿ + ಸರಿ + \ 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 e8ef341..47fd564 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -155,6 +155,7 @@ Is Patient Married? (Yes/No) Category Blood Group + Add Blood Group Digital Counselling Card Patient Medical Records Patient Address Details @@ -255,5 +256,8 @@ Place Sample Invalid Error - + Language updated successfully + Select your preferred language + App Language + OK \ No newline at end of file