11package com.example.f4diwrotatorapp.ui.settings
22
33import android.content.Context
4+ import android.content.pm.PackageManager
45import android.os.Bundle
56import android.view.LayoutInflater
67import android.view.View
78import android.view.ViewGroup
9+ import android.widget.Toast
810import androidx.appcompat.app.AppCompatDelegate
11+ import androidx.core.app.ActivityCompat
912import androidx.core.os.LocaleListCompat
1013import androidx.fragment.app.Fragment
1114import com.example.f4diwrotatorapp.R
1215import com.example.f4diwrotatorapp.databinding.FragmentSettingsBinding
16+ import com.example.f4diwrotatorapp.utils.GeoUtils
17+ import com.google.android.gms.location.LocationServices
1318import com.google.android.material.dialog.MaterialAlertDialogBuilder
19+ import java.text.SimpleDateFormat
20+ import java.util.Date
21+ import java.util.Locale
1422
1523class SettingsFragment : Fragment () {
1624
@@ -28,6 +36,8 @@ class SettingsFragment : Fragment() {
2836 override fun onViewCreated (view : View , savedInstanceState : Bundle ? ) {
2937 super .onViewCreated(view, savedInstanceState)
3038
39+ loadSavedPosition()
40+
3141 binding.cardBluetooth.setOnClickListener {
3242 parentFragmentManager.beginTransaction()
3343 .replace(R .id.fragmentContainer, BluetoothSettingsFragment ())
@@ -45,6 +55,72 @@ class SettingsFragment : Fragment() {
4555 binding.cardLanguage.setOnClickListener {
4656 showLanguageDialog()
4757 }
58+
59+ binding.btnGpsUpdate.setOnClickListener {
60+ updatePositionGps()
61+ }
62+ }
63+
64+ private fun loadSavedPosition () {
65+ val prefs = requireContext().getSharedPreferences(" settings" , Context .MODE_PRIVATE )
66+ val lat = prefs.getFloat(" station_lat" , 0f ).toDouble()
67+ val lon = prefs.getFloat(" station_lon" , 0f ).toDouble()
68+ val lastUpdate = prefs.getString(" station_last_update" , " --/-- --:--" )
69+
70+ updateUiWithPosition(lat, lon, lastUpdate)
71+ }
72+
73+ private fun updatePositionGps () {
74+ if (ActivityCompat .checkSelfPermission(requireContext(), android.Manifest .permission.ACCESS_FINE_LOCATION ) != PackageManager .PERMISSION_GRANTED &&
75+ ActivityCompat .checkSelfPermission(requireContext(), android.Manifest .permission.ACCESS_COARSE_LOCATION ) != PackageManager .PERMISSION_GRANTED ) {
76+
77+ // On demande la permission si elle est manquante
78+ ActivityCompat .requestPermissions(requireActivity(),
79+ arrayOf(android.Manifest .permission.ACCESS_FINE_LOCATION , android.Manifest .permission.ACCESS_COARSE_LOCATION ),
80+ 2 )
81+ return
82+ }
83+
84+ val fusedLocationClient = LocationServices .getFusedLocationProviderClient(requireActivity())
85+
86+ // On essaie d'abord de récupérer la dernière position connue (rapide)
87+ fusedLocationClient.lastLocation.addOnSuccessListener { location ->
88+ if (location != null ) {
89+ saveAndDisplayLocation(location.latitude, location.longitude)
90+ } else {
91+ // Si la dernière position est nulle, on demande une mise à jour fraîche (plus lent mais précis)
92+ Toast .makeText(requireContext(), " Recherche du signal GPS..." , Toast .LENGTH_SHORT ).show()
93+ val priority = com.google.android.gms.location.Priority .PRIORITY_HIGH_ACCURACY
94+ fusedLocationClient.getCurrentLocation(priority, null ).addOnSuccessListener { freshLocation ->
95+ if (freshLocation != null ) {
96+ saveAndDisplayLocation(freshLocation.latitude, freshLocation.longitude)
97+ } else {
98+ Toast .makeText(requireContext(), " GPS indisponible. Vérifiez qu'il est activé." , Toast .LENGTH_SHORT ).show()
99+ }
100+ }
101+ }
102+ }
103+ }
104+
105+ private fun saveAndDisplayLocation (lat : Double , lon : Double ) {
106+ val sdf = SimpleDateFormat (" dd/MM HH:mm" , Locale .getDefault())
107+ val lastUpdate = sdf.format(Date ())
108+
109+ val prefs = requireContext().getSharedPreferences(" settings" , Context .MODE_PRIVATE )
110+ prefs.edit()
111+ .putFloat(" station_lat" , lat.toFloat())
112+ .putFloat(" station_lon" , lon.toFloat())
113+ .putString(" station_last_update" , lastUpdate)
114+ .apply ()
115+
116+ updateUiWithPosition(lat, lon, lastUpdate)
117+ Toast .makeText(requireContext(), " Position mise à jour" , Toast .LENGTH_SHORT ).show()
118+ }
119+
120+ private fun updateUiWithPosition (lat : Double , lon : Double , lastUpdate : String? ) {
121+ binding.tvLatLon.text = getString(R .string.label_lat_lon, lat, lon)
122+ binding.tvQth.text = getString(R .string.label_qth, GeoUtils .getQTHLocator(lat, lon))
123+ binding.tvLastUpdate.text = getString(R .string.label_last_update, lastUpdate ? : " --/-- --:--" )
48124 }
49125
50126 private fun showLanguageDialog () {
@@ -60,13 +136,15 @@ class SettingsFragment : Fragment() {
60136 }
61137
62138 private fun setLocale (languageCode : String ) {
63- // Méthode moderne recommandée par Android pour changer la langue sans redémarrage manuel complexe
64139 val appLocale: LocaleListCompat = LocaleListCompat .forLanguageTags(languageCode)
65140 AppCompatDelegate .setApplicationLocales(appLocale)
66141
67- // Sauvegarde dans les préférences pour persistance (optionnel car géré par AppCompatDelegate sur API récentes)
142+ // On sauvegarde manuellement pour la persistance
68143 val prefs = requireContext().getSharedPreferences(" settings" , Context .MODE_PRIVATE )
69144 prefs.edit().putString(" language_code" , languageCode).apply ()
145+
146+ // Force la recréation pour appliquer les changements immédiatement sur tous les écrans
147+ requireActivity().recreate()
70148 }
71149
72150 override fun onDestroyView () {
0 commit comments