diff --git a/app/build.gradle b/app/build.gradle index 1f33c59..b408951 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,6 +57,7 @@ android { dependencies { implementation "com.google.dagger:hilt-android:2.46" + implementation 'androidx.fragment:fragment:1.6.2' kapt "com.google.dagger:hilt-android-compiler:2.46" implementation 'com.google.dagger:hilt-android:2.46' kapt 'com.google.dagger:hilt-android-compiler:2.46' diff --git a/app/src/main/java/com/smi/counselling/data/constant/HemoCubeCommands.kt b/app/src/main/java/com/smi/counselling/data/constant/HemoCubeCommands.kt deleted file mode 100644 index 280049f..0000000 --- a/app/src/main/java/com/smi/counselling/data/constant/HemoCubeCommands.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.example.hpostesting.data.constant - -enum class HemoCubeCommands(val command: String) { - startBuffer("B\r"), - AUTO_DAC_COMMAND("C\r"), - runDiagnostics("D\r"), - startSample("S\r"), - PRINT_COMMAND("P\r"), - getDeviceId("I\r"), - FIRST_GAIN_COMMAND("T\r"), - SECOND_GAIN_COMMAND("U\r"), - THIRD_GAIN_COMMAND("V\r"), - FORTH_GAIN_COMMAND("W\r"), -} \ No newline at end of file diff --git a/app/src/main/java/com/smi/counselling/data/constant/LanguageManager.kt b/app/src/main/java/com/smi/counselling/data/constant/LanguageManager.kt index 85d6a7c..5730b07 100644 --- a/app/src/main/java/com/smi/counselling/data/constant/LanguageManager.kt +++ b/app/src/main/java/com/smi/counselling/data/constant/LanguageManager.kt @@ -1,4 +1,4 @@ -package com.example.hpostesting.data.constant +package com.smi.counselling.data.constant import android.content.Context import android.content.SharedPreferences diff --git a/app/src/main/java/com/smi/counselling/data/constant/TestRightCommands.kt b/app/src/main/java/com/smi/counselling/data/constant/TestRightCommands.kt deleted file mode 100644 index ac5ec1f..0000000 --- a/app/src/main/java/com/smi/counselling/data/constant/TestRightCommands.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.example.hpostesting.data.constant - -enum class TestRightCommands(val command: String) { - led2Set50("led2 50\r"), - led2Set100("led2 100\r"), - read("read\r"), - autoset("autoset\r"), - run("run\r"), - printInRange("print 239 339\r"), - printAll("print\r"), - testByEnter("\n\r") -} \ No newline at end of file diff --git a/app/src/main/java/com/smi/counselling/data/dao/DeviceDao.kt b/app/src/main/java/com/smi/counselling/data/dao/DeviceDao.kt deleted file mode 100644 index 96b4eab..0000000 --- a/app/src/main/java/com/smi/counselling/data/dao/DeviceDao.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.hpostesting.data.dao - -import androidx.lifecycle.LiveData -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query -import com.example.hpostesting.data.model.patient.DeviceData -import com.example.hpostesting.data.model.patient.HemoCubeTestData -import com.example.hpostesting.data.model.patient.UserData -@Dao -interface DeviceDao { - @Query("SELECT * from device_table") - fun getAll(): LiveData> - - @Insert(onConflict = OnConflictStrategy.REPLACE) - suspend fun insertAll(deviceData: DeviceData) - - @Query("SELECT * FROM device_table WHERE deviceId = :id") - suspend fun getUserByID(id: String): HemoCubeTestData - - @Query("DELETE FROM device_table WHERE deviceId = :id") - suspend fun deleteById(id: String) -} \ No newline at end of file diff --git a/app/src/main/java/com/smi/counselling/data/dashboard/DashboardActivity.kt b/app/src/main/java/com/smi/counselling/data/dashboard/DashboardActivity.kt index 1147958..4ea7fbb 100644 --- a/app/src/main/java/com/smi/counselling/data/dashboard/DashboardActivity.kt +++ b/app/src/main/java/com/smi/counselling/data/dashboard/DashboardActivity.kt @@ -3,9 +3,11 @@ package com.smi.counselling.data.dashboard import android.content.Context import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import androidx.fragment.app.Fragment import androidx.navigation.ui.AppBarConfiguration -import com.example.hpostesting.data.constant.LanguageManager +import com.google.android.material.bottomnavigation.BottomNavigationView import com.smi.counselling.R +import com.smi.counselling.data.constant.LanguageManager import com.smi.counselling.databinding.ActivityDashboardBinding import dagger.hilt.android.AndroidEntryPoint @@ -23,13 +25,34 @@ class DashboardActivity : AppCompatActivity() { super.onCreate(savedInstanceState) binding = ActivityDashboardBinding.inflate(layoutInflater) setContentView(binding.root) - moveToNext() + setSupportActionBar(binding.appBarDashboard.toolbar) + // Load the default fragment (e.g., HomeFragment) + loadFragment(HomeFragment()) + + // Set up the BottomNavigationView + val bottomNavigationView: BottomNavigationView = findViewById(R.id.bottomNavigationView) + bottomNavigationView.setOnNavigationItemSelectedListener { + when (it.itemId) { + R.id.navigation_home -> loadFragment(HomeFragment()) + R.id.navigation_digital_card -> loadFragment(DigitalCardFragment()) + R.id.navigation_settings -> loadFragment(Settings()) + } + true + } } + private fun loadFragment(fragment: Fragment) { + // Check if the fragment is an instance of Settings + if (fragment is Settings) { + // Hide the toolbar + supportActionBar?.hide() + } else { + // Show the toolbar + supportActionBar?.show() + } - private fun moveToNext() { - if (supportFragmentManager.isDestroyed) return - supportFragmentManager.beginTransaction().replace(binding.fghemocube.id, HomeFragment()) + supportFragmentManager.beginTransaction() + .replace(R.id.fragmentContainer, fragment) .commit() } override fun onResume() { diff --git a/app/src/main/java/com/smi/counselling/data/dashboard/DigitalCardActivity.kt b/app/src/main/java/com/smi/counselling/data/dashboard/DigitalCardActivity.kt index f0a8971..ad6648d 100644 --- a/app/src/main/java/com/smi/counselling/data/dashboard/DigitalCardActivity.kt +++ b/app/src/main/java/com/smi/counselling/data/dashboard/DigitalCardActivity.kt @@ -3,7 +3,7 @@ package com.smi.counselling.data.dashboard import android.content.Context import androidx.appcompat.app.AppCompatActivity import android.os.Bundle -import com.example.hpostesting.data.constant.LanguageManager +import com.smi.counselling.data.constant.LanguageManager import com.smi.counselling.databinding.ActivityDigitalCardBinding import dagger.hilt.android.AndroidEntryPoint diff --git a/app/src/main/java/com/smi/counselling/data/dashboard/DigitalCardFragment.kt b/app/src/main/java/com/smi/counselling/data/dashboard/DigitalCardFragment.kt index 04637d6..cb18de2 100644 --- a/app/src/main/java/com/smi/counselling/data/dashboard/DigitalCardFragment.kt +++ b/app/src/main/java/com/smi/counselling/data/dashboard/DigitalCardFragment.kt @@ -12,7 +12,9 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ArrayAdapter +import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.activityViewModels +import androidx.lifecycle.LiveData import com.example.hpostesting.data.model.patient.HemoCubeTestData import com.example.hpostesting.data.model.patient.toHemoCubeTestData import com.google.firebase.crashlytics.ktx.crashlytics @@ -20,6 +22,7 @@ import com.google.firebase.firestore.ktx.firestore import com.google.firebase.ktx.Firebase import com.smi.counselling.R import com.smi.counselling.data.DataHolder +import com.smi.counselling.data.NetworkStatusLiveData import com.smi.counselling.databinding.FragmentDigitalCardBinding import dagger.hilt.android.AndroidEntryPoint import java.text.SimpleDateFormat @@ -30,31 +33,30 @@ import java.util.Locale @AndroidEntryPoint class DigitalCardFragment : Fragment() { private lateinit var binding: FragmentDigitalCardBinding - private val hemoCubeViewModel: HomeViewModel by activityViewModels() private lateinit var sharedPreferences: SharedPreferences - private val testDetails = DataHolder.selectedTest?.toHemoCubeTestData() + private lateinit var _networkStatusLiveData: NetworkStatusLiveData + private val networkStatusLiveData: LiveData + get() = _networkStatusLiveData override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?, ): View { binding = FragmentDigitalCardBinding.inflate(inflater, container, false) sharedPreferences = - requireContext().getSharedPreferences("PREFERENCE_NAME", Context.MODE_PRIVATE) + requireContext().getSharedPreferences("COUNSELLING", Context.MODE_PRIVATE) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - - initViews() } @SuppressLint("SetTextI18n") private fun initViews() { - - hemoCubeViewModel.networkStatusLiveData.observe(viewLifecycleOwner) { isConnected -> + _networkStatusLiveData = context?.let { NetworkStatusLiveData(it) } ?: return + networkStatusLiveData.observe(viewLifecycleOwner) { isConnected -> if (isConnected) { loadUserData() @@ -180,5 +182,9 @@ class DigitalCardFragment : Fragment() { } } + override fun onResume() { + super.onResume() + (activity as? AppCompatActivity)?.supportActionBar?.title = "Digital Card Fragment" + } } \ No newline at end of file diff --git a/app/src/main/java/com/smi/counselling/data/dashboard/HomeFragment.kt b/app/src/main/java/com/smi/counselling/data/dashboard/HomeFragment.kt index 6d165c0..f834fa6 100644 --- a/app/src/main/java/com/smi/counselling/data/dashboard/HomeFragment.kt +++ b/app/src/main/java/com/smi/counselling/data/dashboard/HomeFragment.kt @@ -14,8 +14,10 @@ import android.view.ViewGroup import android.widget.ArrayAdapter import android.widget.ImageView import android.widget.TextView +import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import androidx.lifecycle.LiveData import com.bumptech.glide.Glide import com.example.hpostesting.data.model.patient.HemoCubeTestData import com.example.hpostesting.data.model.patient.toHemoCubeTestData @@ -24,6 +26,7 @@ import com.google.firebase.firestore.ktx.firestore import com.google.firebase.ktx.Firebase import com.smi.counselling.R import com.smi.counselling.data.DataHolder +import com.smi.counselling.data.NetworkStatusLiveData import com.smi.counselling.databinding.FragmentHomeBinding import dagger.hilt.android.AndroidEntryPoint import java.util.Locale @@ -32,11 +35,13 @@ data class ClassificationResult(val imageResource: Int, val text: String,val ima class HomeFragment : Fragment() { private var _binding: FragmentHomeBinding? = null private val binding get() = _binding!! - private val hemoCubeViewModel: HomeViewModel by activityViewModels() private lateinit var sharedPreference: SharedPreferences private var maleresult: String = "" private var femaleresult: String = "" private val testDetails = DataHolder.selectedTest?.toHemoCubeTestData() + private lateinit var _networkStatusLiveData: NetworkStatusLiveData + private val networkStatusLiveData: LiveData + get() = _networkStatusLiveData override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -59,27 +64,15 @@ class HomeFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + _networkStatusLiveData = context?.let { NetworkStatusLiveData(it) } ?: return - - - - - hemoCubeViewModel.networkStatusLiveData.observe(viewLifecycleOwner) { isConnected -> + networkStatusLiveData.observe(viewLifecycleOwner) { isConnected -> if (isConnected) { loadUserData() } - - binding.btnDigital.setOnClickListener { - val i = Intent( - requireContext().applicationContext, DigitalCardActivity::class.java - ) - startActivity(i) - } - - activity?.runOnUiThread { binding.btnSubmit.setOnClickListener { when { @@ -368,16 +361,9 @@ class HomeFragment : Fragment() { _binding = null } - - private fun setImageResource(context: Context, imageResource: Int) { - when (context) { - is Fragment -> { - val imageView = context.view?.findViewById(R.id.resultImage) - imageView?.setImageResource(imageResource) - } - else -> throw IllegalArgumentException("Unsupported context type") - } + override fun onResume() { + super.onResume() + (activity as? AppCompatActivity)?.supportActionBar?.title = "Counselling App" } - } diff --git a/app/src/main/java/com/smi/counselling/data/dashboard/HomeViewModel.kt b/app/src/main/java/com/smi/counselling/data/dashboard/HomeViewModel.kt index 01684f9..e899726 100644 --- a/app/src/main/java/com/smi/counselling/data/dashboard/HomeViewModel.kt +++ b/app/src/main/java/com/smi/counselling/data/dashboard/HomeViewModel.kt @@ -3,19 +3,12 @@ package com.smi.counselling.data.dashboard import android.content.Context import android.content.SharedPreferences import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.example.hpostesting.data.dao.HemoCubeDao -import com.example.hpostesting.data.dao.UserDao -import com.example.hpostesting.data.model.patient.DeviceData import com.smi.counselling.data.NetworkStatusLiveData import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @HiltViewModel class HomeViewModel @Inject constructor( - private val hemoCubeDao: HemoCubeDao, - private val userdao: UserDao, context: Context, ) : ViewModel() { private val sharedPreference: SharedPreferences = @@ -23,11 +16,6 @@ class HomeViewModel @Inject constructor( // Get the device ID of the device you want to retrieve data for (e.g., the first device in the list) - private val _networkStatusLiveData = NetworkStatusLiveData(context) - val allUserData = hemoCubeDao.getAll() - val deviceData = MutableLiveData() - val networkStatusLiveData: LiveData - get() = _networkStatusLiveData } diff --git a/app/src/main/java/com/smi/counselling/data/dashboard/Settings.kt b/app/src/main/java/com/smi/counselling/data/dashboard/Settings.kt new file mode 100644 index 0000000..14990d9 --- /dev/null +++ b/app/src/main/java/com/smi/counselling/data/dashboard/Settings.kt @@ -0,0 +1,83 @@ +package com.smi.counselling.data.dashboard + +import android.content.Context +import android.content.pm.PackageManager +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import android.widget.Toolbar +import androidx.preference.ListPreference +import androidx.preference.Preference +import androidx.preference.PreferenceFragmentCompat +import com.smi.counselling.R +import com.smi.counselling.data.constant.LanguageManager + +private var isLanguageChanged = false + +class Settings : PreferenceFragmentCompat() { + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + val preferenceScreen = preferenceManager.createPreferenceScreen(requireContext()) + + 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") + + languagePreference.onPreferenceChangeListener = + Preference.OnPreferenceChangeListener { _, newValue -> + val languageCode = newValue as String + updateLanguage(requireContext(), languageCode) + true + } + + preferenceScreen.addPreference(languagePreference) + setPreferenceScreen(preferenceScreen) + + // App Version Preference + val appVersionPreference = Preference(requireContext()) + appVersionPreference.title = "App Version" + appVersionPreference.summary = getAppVersion(requireContext()) + " [ " + getAppEnvironment(requireContext()) + " ]" + + preferenceScreen.addPreference(languagePreference) + preferenceScreen.addPreference(appVersionPreference) + setPreferenceScreen(preferenceScreen) + + if (isLanguageChanged) { + Toast.makeText(requireContext(), R.string.language_update, Toast.LENGTH_SHORT).show() + } + } + + 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" + } + } + + private fun getAppEnvironment(context: Context): String { + return try { + val pInfo = context.packageManager.getPackageInfo(context.packageName, 0) + pInfo.packageName.substringAfterLast('.') + } catch (e: PackageManager.NameNotFoundException) { + "N/A" + } + } +} + + + diff --git a/app/src/main/res/drawable/digitalcard.xml b/app/src/main/res/drawable/digitalcard.xml new file mode 100644 index 0000000..3c6715b --- /dev/null +++ b/app/src/main/res/drawable/digitalcard.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/home.xml b/app/src/main/res/drawable/home.xml new file mode 100644 index 0000000..345ac53 --- /dev/null +++ b/app/src/main/res/drawable/home.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/drawable/settings.xml b/app/src/main/res/drawable/settings.xml new file mode 100644 index 0000000..298a5a1 --- /dev/null +++ b/app/src/main/res/drawable/settings.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_dashboard.xml b/app/src/main/res/layout/activity_dashboard.xml index 6b2e4b2..c6095b7 100644 --- a/app/src/main/res/layout/activity_dashboard.xml +++ b/app/src/main/res/layout/activity_dashboard.xml @@ -3,11 +3,20 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> + + + + + + - - - + + diff --git a/app/src/main/res/layout/app_bar_dashboard.xml b/app/src/main/res/layout/app_bar_dashboard.xml new file mode 100644 index 0000000..e375b4e --- /dev/null +++ b/app/src/main/res/layout/app_bar_dashboard.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_digital_card.xml b/app/src/main/res/layout/fragment_digital_card.xml index 65a44d9..3af0f6a 100644 --- a/app/src/main/res/layout/fragment_digital_card.xml +++ b/app/src/main/res/layout/fragment_digital_card.xml @@ -14,7 +14,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="24dp" - android:layout_marginTop="24dp" + android:layout_marginTop="60dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> @@ -33,7 +33,7 @@ android:id="@+id/userCard" android:layout_width="match_parent" android:layout_height="350dp" - android:layout_marginTop="24dp" + android:layout_marginTop="70dp" app:cardBackgroundColor="#C0C0C0" app:cardCornerRadius="25dp" app:cardElevation="0dp" diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 17fb0d1..cc1bdb6 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -5,20 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + + app:layout_constraintTop_toTopOf="parent"> @@ -57,7 +43,7 @@ android:id="@+id/abhaidtextfemale" android:layout_width="match_parent" android:layout_height="wrap_content" - android:hint="Select Abha Id for Female" + android:hint="@string/select_abha_card_female" android:inputType="text" android:labelFor="@id/abhaid" /> @@ -257,19 +243,4 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/btn_submit" app:srcCompat="@drawable/sicklecell_6" /> - - - -