diff --git a/app/build.gradle b/app/build.gradle index 7c85870..138dab7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -52,6 +52,8 @@ android { } dependencies { + implementation "com.google.dagger:hilt-android:2.46" + kapt "com.google.dagger:hilt-android-compiler:2.46" implementation 'androidx.core:core-ktx:1.12.0' implementation 'androidx.appcompat:appcompat:1.6.1' @@ -75,6 +77,8 @@ dependencies { implementation 'com.google.android.things:androidthings:1.0' implementation 'com.google.firebase:firebase-appdistribution:16.0.0-beta11' implementation("com.google.firebase:firebase-appdistribution-api-ktx:16.0.0-beta11") + implementation 'androidx.preference:preference-ktx:1.2.1' + implementation 'androidx.preference:preference-ktx:1.2.1' // Testing @@ -86,14 +90,14 @@ dependencies { androidTestImplementation 'org.mockito:mockito-android:3.12.4' androidTestImplementation 'org.mockito:mockito-inline:3.12.4' testImplementation "androidx.arch.core:core-testing:2.2.0" - testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4' + testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.1' implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2" implementation 'com.opencsv:opencsv:4.6' implementation 'com.github.mik3y:usb-serial-for-android:3.5.1' - implementation "androidx.fragment:fragment-ktx:1.6.1" + implementation "androidx.fragment:fragment-ktx:1.6.2" // CSV read, write implementation 'com.opencsv:opencsv:4.6' @@ -105,9 +109,9 @@ dependencies { implementation 'com.google.android.gms:play-services-code-scanner:16.1.0' //Room - implementation "androidx.room:room-ktx:2.6.0-rc01" - implementation "androidx.room:room-runtime:2.6.0-rc01" - kapt ("androidx.room:room-compiler:2.6.0-rc01") + implementation "androidx.room:room-ktx:2.6.0" + implementation "androidx.room:room-runtime:2.6.0" + kapt ("androidx.room:room-compiler:2.6.0") //image implementation 'com.github.bumptech.glide:glide:4.13.2' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 83e3687..61c85a5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -61,7 +61,8 @@ android:name="com.example.hpostesting.presentation.dashboard.DashboardActivity" android:exported="false" android:label="@string/title_activity_dashboard" - android:theme="@style/Theme.HPOS.NoActionBar" /> + android:theme="@style/Theme.HPOS.NoActionBar" + tools:ignore="MissingClass" /> + when (menuItem.itemId) { + R.id.nav_settings -> { + // Open the settings fragment + openSettings() + drawerLayout.closeDrawers() // Close the drawer after selecting an item + true + } + + else -> false + } + } } override fun onCreateOptionsMenu(menu: Menu): Boolean { - // Inflate the menu; this adds items to the action bar if it is present. menuInflater.inflate(R.menu.dashboard, menu) return true } @@ -59,6 +69,13 @@ class DashboardActivity : AppCompatActivity() { return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp() } + // Add this function to open the settings fragment + private fun openSettings() { + supportFragmentManager.beginTransaction() + .replace(R.id.nav_host_fragment_content_dashboard, SlideshowSettingsFragment()) + .addToBackStack(null) + .commit() + } override fun onResume() { super.onResume() 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 f714436..d74f22d 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 d62d53b..31dce7d 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,44 +1,40 @@ package com.example.hpostesting.presentation.dashboard +import android.content.Context +import android.content.ContextWrapper +import android.content.SharedPreferences +import android.content.res.Configuration import android.os.Bundle +import android.preference.PreferenceManager import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.FrameLayout import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProvider -import com.example.hpostesting.presentation.dashboard.ui.slideshow.SlideshowViewModel +import androidx.preference.PreferenceFragmentCompat +import `in`.sminnovations.hpostesting.R import `in`.sminnovations.hpostesting.databinding.FragmentSlideshowBinding - +import java.util.Locale class SlideshowFragment : Fragment() { - private var _binding: FragmentSlideshowBinding? = null - - // This property is only valid between onCreateView and - // onDestroyView. private val binding get() = _binding!! - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?, + savedInstanceState: Bundle? ): View { - val slideshowViewModel = - ViewModelProvider(this).get(SlideshowViewModel::class.java) + val root = inflater.inflate(R.layout.fragment_slideshow, container, false) - _binding = FragmentSlideshowBinding.inflate(inflater, container, false) - val root: View = binding.root + // Find the FrameLayout and add the PreferenceFragmentCompat dynamically + val fragmentContainer = root.findViewById(R.id.fragment_container) + val settingsFragment = SlideshowSettingsFragment() + childFragmentManager.beginTransaction() + .replace(fragmentContainer.id, settingsFragment) + .commit() - val pInfo = requireActivity().packageManager.getPackageInfo( - requireActivity().packageName, 0 - ) - val version = pInfo.versionName - binding.textSlideshow.text = version + // Handle language selection logic if needed -// val textView: TextView = binding.textSlideshow -// slideshowViewModel.text.observe(viewLifecycleOwner) { -// textView.text = it -// } return root } @@ -46,4 +42,92 @@ class SlideshowFragment : Fragment() { super.onDestroyView() _binding = null } +} + +class SlideshowSettingsFragment : PreferenceFragmentCompat() { + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + setPreferencesFromResource(R.xml.settings, rootKey) + + val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) + sharedPreferences.registerOnSharedPreferenceChangeListener { _, key -> + if (key == "language_preference") { + val selectedLanguage = sharedPreferences.getString(key, "en") + if (selectedLanguage != null) { + setLocale(selectedLanguage) + } + restartActivity() + } + } + } + + private fun setLocale(languageCode: String) { + val newContext = LanguageHelper.wrap(requireContext(), languageCode) + LanguagePreference.setLanguage(newContext, languageCode) + + // Set the locale for the entire app, not just the context + val resources = newContext.resources + val configuration = resources.configuration + configuration.setLocale(Locale(languageCode)) + resources.updateConfiguration(configuration, resources.displayMetrics) + + requireActivity().recreate() // Restart the activity to apply language changes + } + + private fun restartActivity() { + requireActivity().recreate() + } + + override fun onDestroy() { + super.onDestroy() + val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) + sharedPreferences.unregisterOnSharedPreferenceChangeListener { _, _ -> } + } +} + +class LanguageHelper(base: Context) : ContextWrapper(base) { + + companion object { + fun wrap(context: Context, language: String): ContextWrapper { + var newContext = context + + val config = Configuration(context.resources.configuration) + val locale = Locale(language) + Locale.setDefault(locale) + config.setLocale(locale) + + newContext = context.createConfigurationContext(config) + + return LanguageHelper(newContext) + } + + fun updateBaseContextLocale(context: Context, language: String): Context { + val config = Configuration(context.resources.configuration) + val locale = Locale(language) + Locale.setDefault(locale) + config.setLocale(locale) + + return context.createConfigurationContext(config) + } + } +} + +class LanguagePreference(context: Context) { + + private val preferences: SharedPreferences = context.getSharedPreferences("LanguagePrefs", Context.MODE_PRIVATE) + + companion object { + private const val SELECTED_LANGUAGE = "selectedLanguage" + + fun getLanguage(context: Context): String? { + val preferences = context.getSharedPreferences("LanguagePrefs", Context.MODE_PRIVATE) + return preferences.getString(SELECTED_LANGUAGE, null) + } + + fun setLanguage(context: Context, language: String) { + val editor = context.getSharedPreferences("LanguagePrefs", Context.MODE_PRIVATE).edit() + editor.putString(SELECTED_LANGUAGE, language) + editor.apply() + } + } } \ No newline at end of file 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 8827fd1..ab00b81 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,5 +1,6 @@ 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 @@ -8,7 +9,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.FrameLayout import android.widget.Toast import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels @@ -19,8 +19,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 androidx.navigation.fragment.findNavController + 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/testRight/TestRightResults.kt b/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightResults.kt index a225428..f6bed53 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightResults.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightResults.kt @@ -1,5 +1,6 @@ package com.example.hpostesting.presentation.testRight +import com.example.hpostesting.presentation.dashboard.DashboardActivity import android.content.Context import android.content.Intent import android.content.SharedPreferences @@ -14,7 +15,6 @@ import com.example.hpostesting.data.DataHolder import com.example.hpostesting.data.constant.Constants import com.example.hpostesting.data.model.test.TestRightResultType import com.example.hpostesting.data.model.test.TestType -import com.example.hpostesting.presentation.dashboard.DashboardActivity import com.example.hpostesting.util.MyUtils.calculateAgeFromYOB import com.google.firebase.firestore.FirebaseFirestore import com.google.firebase.firestore.ktx.firestore diff --git a/app/src/main/res/layout/fragment_digital_card.xml b/app/src/main/res/layout/fragment_digital_card.xml index 4a6532a..7259d46 100644 --- a/app/src/main/res/layout/fragment_digital_card.xml +++ b/app/src/main/res/layout/fragment_digital_card.xml @@ -71,7 +71,8 @@ app:cardBackgroundColor="#FFFFFF" app:cardCornerRadius="5dp" app:layout_constraintTop_toBottomOf="@id/userImage" - app:cardElevation="0dp"> + app:cardElevation="0dp" + tools:ignore="MissingConstraints"> - + + tools:context="com.example.hpostesting.presentation.dashboard.SlideshowFragment"> - \ No newline at end of file + + + + + + + + diff --git a/app/src/main/res/layout/language_spinner_preference.xml b/app/src/main/res/layout/language_spinner_preference.xml new file mode 100644 index 0000000..123407c --- /dev/null +++ b/app/src/main/res/layout/language_spinner_preference.xml @@ -0,0 +1,23 @@ + + + + + + + + + diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml new file mode 100644 index 0000000..5b084c4 --- /dev/null +++ b/app/src/main/res/values/arrays.xml @@ -0,0 +1,16 @@ + + + + + English + Kannada + + + + + en + ka + + + + diff --git a/app/src/main/res/xml/settings.xml b/app/src/main/res/xml/settings.xml new file mode 100644 index 0000000..97bdc85 --- /dev/null +++ b/app/src/main/res/xml/settings.xml @@ -0,0 +1,15 @@ + + + + + + + + +