Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 10 additions & 1 deletion app/src/main/java/me/tangobee/weathernaut/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@ import me.tangobee.weathernaut.data.repository.WeatherRepository
import me.tangobee.weathernaut.databinding.ActivityMainBinding
import me.tangobee.weathernaut.models.WeatherData.WeatherData
import me.tangobee.weathernaut.services.WeatherMusicService
import me.tangobee.weathernaut.utils.LanguageHelper.setLocale
import me.tangobee.weathernaut.utils.SharedPreferencesHelper
import me.tangobee.weathernaut.utils.WeatherHelper
import me.tangobee.weathernaut.viewmodels.WeatherViewModel
import me.tangobee.weathernaut.viewmodels.WeatherViewModelFactory
import java.net.UnknownHostException
import kotlin.system.exitProcess


class MainActivity : AppCompatActivity() {

private lateinit var binding: ActivityMainBinding
Expand All @@ -40,7 +42,8 @@ class MainActivity : AppCompatActivity() {
binding = ActivityMainBinding.inflate(layoutInflater)

sharedPreferencesHelper = SharedPreferencesHelper(this)

setLanguage()

val noInternetLiveData : MutableLiveData<Boolean> = MutableLiveData(false)

coroutineExceptionHandler = CoroutineExceptionHandler{_, throwable ->
Expand Down Expand Up @@ -69,6 +72,12 @@ class MainActivity : AppCompatActivity() {
setContentView(binding.root)
}

private fun setLanguage() {
val language = sharedPreferencesHelper.getLanguagePreference()
setLocale(this@MainActivity, language, resources)
Log.d("Weathernaut", "Language set to: $language")
}

private fun fetchData() {
val weatherService = RetrofitHelper.getInstance().create(WeatherService::class.java)
val weatherRepository = WeatherRepository(weatherService)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,94 @@ object WeatherCodes {
WeatherConstants(96, "Slight Thunderstorm"),
WeatherConstants(99, "Heavy Thunderstorm")
)
val weatherConstants_es = listOf(
WeatherConstants(0, "Despejado"),
WeatherConstants(1, "Despejado/Parcialmente Nublado"),
WeatherConstants(2, "Parcialmente Nublado"),
WeatherConstants(3, "Nublado"),
WeatherConstants(45, "Niebla"),
WeatherConstants(48, "Niebla con Escarcha"),
WeatherConstants(51, "Llovizna Ligera"),
WeatherConstants(53, "Llovizna Moderada"),
WeatherConstants(55, "Llovizna Fuerte"),
WeatherConstants(56, "Llovizna Ligera Helada"),
WeatherConstants(57, "Llovizna Fuerte Helada"),
WeatherConstants(61, "Lluvia Ligera"),
WeatherConstants(63, "Lluvia Moderada"),
WeatherConstants(65, "Lluvia Fuerte"),
WeatherConstants(66, "Lluvia Ligera Helada"),
WeatherConstants(67, "Lluvia Fuerte Helada"),
WeatherConstants(71, "Nieve Ligera"),
WeatherConstants(73, "Nieve Moderada"),
WeatherConstants(75, "Nieve Fuerte"),
WeatherConstants(77, "Granos de Nieve"),
WeatherConstants(80, "Chubascos de Lluvia Ligera"),
WeatherConstants(81, "Chubascos de Lluvia Moderada"),
WeatherConstants(82, "Chubascos de Lluvia Fuerte"),
WeatherConstants(85, "Chubascos de Nieve Ligera"),
WeatherConstants(86, "Chubascos de Nieve Fuerte"),
WeatherConstants(95, "Tormenta Ligera"),
WeatherConstants(96, "Tormenta Ligera"),
WeatherConstants(99, "Tormenta Fuerte")
)
val weatherConstants_fr = listOf(
WeatherConstants(0, "Clair"),
WeatherConstants(1, "Dégagé/Partiellement nuageux"),
WeatherConstants(2, "Partiellement nuageux"),
WeatherConstants(3, "Couvert"),
WeatherConstants(45, "Brouillard"),
WeatherConstants(48, "Brouillard de givre"),
WeatherConstants(51, "Légère bruine"),
WeatherConstants(53, "Bruine modérée"),
WeatherConstants(55, "Grosse bruine"),
WeatherConstants(56, "Légère bruine verglaçante"),
WeatherConstants(57, "Forte bruine verglaçante"),
WeatherConstants(61, "Légère pluie"),
WeatherConstants(63, "Pluie modérée"),
WeatherConstants(65, "Grosse pluie"),
WeatherConstants(66, "Légère pluie verglaçante"),
WeatherConstants(67, "Forte pluie verglaçante"),
WeatherConstants(71, "Légère neige"),
WeatherConstants(73, "Neige modérée"),
WeatherConstants(75, "Grosse neige"),
WeatherConstants(77, "Grains de neige"),
WeatherConstants(80, "Averses légères de pluie"),
WeatherConstants(81, "Averses modérées de pluie"),
WeatherConstants(82, "Gros averses de pluie"),
WeatherConstants(85, "Averses légères de neige"),
WeatherConstants(86, "Fortes chutes de neige"),
WeatherConstants(95, "Léger orage"),
WeatherConstants(96, "Léger orage"),
WeatherConstants(99, "Fort orage")
)
val weatherConstants_de = listOf(
WeatherConstants(0, "Klar"),
WeatherConstants(1, "Klar/Teilweise Bewölkt"),
WeatherConstants(2, "Teilweise Bewölkt"),
WeatherConstants(3, "Bedeckt"),
WeatherConstants(45, "Nebel"),
WeatherConstants(48, "Raureifnebel"),
WeatherConstants(51, "Leichter Nieselregen"),
WeatherConstants(53, "Mäßiger Nieselregen"),
WeatherConstants(55, "Starker Nieselregen"),
WeatherConstants(56, "Leichter Gefrierender Nieselregen"),
WeatherConstants(57, "Starker Gefrierender Nieselregen"),
WeatherConstants(61, "Leichter Regen"),
WeatherConstants(63, "Mäßiger Regen"),
WeatherConstants(65, "Starker Regen"),
WeatherConstants(66, "Leichter Gefrierender Regen"),
WeatherConstants(67, "Starker Gefrierender Regen"),
WeatherConstants(71, "Leichter Schnee"),
WeatherConstants(73, "Mäßiger Schnee"),
WeatherConstants(75, "Starker Schnee"),
WeatherConstants(77, "Schneegriesel"),
WeatherConstants(80, "Leichte Regenschauer"),
WeatherConstants(81, "Mäßige Regenschauer"),
WeatherConstants(82, "Starke Regenschauer"),
WeatherConstants(85, "Leichte Schneeschauer"),
WeatherConstants(86, "Starke Schneeschauer"),
WeatherConstants(95, "Leichtes Gewitter"),
WeatherConstants(96, "Leichtes Gewitter"),
WeatherConstants(99, "Starkes Gewitter")
)
}
12 changes: 11 additions & 1 deletion app/src/main/java/me/tangobee/weathernaut/ui/HomeFragment.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package me.tangobee.weathernaut.ui

import android.content.ContentValues.TAG
import android.os.Bundle
import android.text.SpannableString
import android.text.style.RelativeSizeSpan
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
Expand Down Expand Up @@ -119,7 +121,15 @@ class HomeFragment : Fragment() {
binding.currentWeatherTemperature.text = weatherData.current_weather.current.temperature_2m.toInt().toString()
binding.weatherUnit.text = weatherData.current_weather.current_units.temperature_2m
binding.weatherIcon.setImageResource(WeatherImageMapper.getImageForWeatherCode(weatherData.current_weather.current.weather_code))
binding.currentWeatherType.text = WeatherCodes.weatherConstants.first {it.code == weatherData.current_weather.current.weather_code}.description

val lang = requireContext().resources.configuration.locale.language
when(lang){
"en" -> binding.currentWeatherType.text = WeatherCodes.weatherConstants.first {it.code == weatherData.current_weather.current.weather_code}.description
"es" -> binding.currentWeatherType.text = WeatherCodes.weatherConstants_es.first {it.code == weatherData.current_weather.current.weather_code}.description
"fr" -> binding.currentWeatherType.text = WeatherCodes.weatherConstants_fr.first {it.code == weatherData.current_weather.current.weather_code}.description
"de" -> binding.currentWeatherType.text = WeatherCodes.weatherConstants_de.first {it.code == weatherData.current_weather.current.weather_code}.description
}
// binding.currentWeatherType.text = WeatherCodes.weatherConstants.first {it.code == weatherData.current_weather.current.weather_code}.description

val currentPressure = weatherData.current_weather.current.pressure_msl.toString() + weatherData.current_weather.current_units.pressure_msl
binding.pressureValue.text = currentPressure
Expand Down
12 changes: 12 additions & 0 deletions app/src/main/java/me/tangobee/weathernaut/ui/Next7DaysFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,18 @@ class Next7DaysFragment : Fragment() {
}

val days = arrayOf("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")
val days_es = arrayOf("Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado")
val days_fr = arrayOf("Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi")
val days_de = arrayOf("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag")

val lang = requireContext().resources.configuration.locale.language
when(lang){
"en" -> return days[calendar.get(Calendar.DAY_OF_WEEK) - 1]
"es" -> return days_es[calendar.get(Calendar.DAY_OF_WEEK) - 1]
"fr" -> return days_fr[calendar.get(Calendar.DAY_OF_WEEK) - 1]
"de" -> return days_de[calendar.get(Calendar.DAY_OF_WEEK) - 1]
}

return days[calendar.get(Calendar.DAY_OF_WEEK) - 1]
}

Expand Down
75 changes: 73 additions & 2 deletions app/src/main/java/me/tangobee/weathernaut/ui/SettingsFragment.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package me.tangobee.weathernaut.ui

import android.annotation.SuppressLint
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
Expand All @@ -12,13 +12,16 @@ import android.widget.ScrollView
import android.widget.Toast
import androidx.appcompat.widget.PopupMenu
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import me.tangobee.weathernaut.R
import me.tangobee.weathernaut.constants.UnitsMapper
import me.tangobee.weathernaut.databinding.FragmentSettingsBinding
import me.tangobee.weathernaut.models.SettingsModel
import me.tangobee.weathernaut.models.WeatherData.WeatherData
import me.tangobee.weathernaut.services.WeatherMusicService
import me.tangobee.weathernaut.utils.LanguageHelper.changeLanguage
import me.tangobee.weathernaut.utils.LanguageHelper.setLocale
import me.tangobee.weathernaut.utils.SharedPreferencesHelper
import me.tangobee.weathernaut.utils.WeatherHelper
import me.tangobee.weathernaut.viewmodels.WeatherViewModel
Expand All @@ -44,6 +47,7 @@ class SettingsFragment : Fragment() {
return binding.root
}

@SuppressLint("SetTextI18n")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
mainContainerView = requireActivity().findViewById(R.id.mainContainerView)
Expand All @@ -68,6 +72,11 @@ class SettingsFragment : Fragment() {
binding.temperatureUnit.setOnClickListener {showTemperatureUnitPopup(binding.temperatureSpinner)}
binding.windSpeedUnit.setOnClickListener {showWindSpeedUnitPopup(binding.windSpeedSpinner)}
binding.atmosphericPressureUnit.setOnClickListener {showAtmosphericPressureUnitPopup(binding.atmosphericPressureSpinner)}
binding.language.setOnClickListener {showLanguagePopup(binding.languageSpinner)}
binding.language.apply {
val lang = context.resources.configuration.locale.language
setUpLangSpinner(lang)
}

binding.backButton.setOnClickListener {
requireActivity().onBackPressedDispatcher.onBackPressed()
Expand Down Expand Up @@ -105,6 +114,27 @@ class SettingsFragment : Fragment() {
}
}

private fun setUpLangSpinner(lang: String) {
when(lang){
"en" -> {
binding.languageSpinner.text = resources.getString(R.string.english)
binding.flagIcon.setImageResource(R.drawable.country_flag_uk)
}
"es" -> {
binding.languageSpinner.text = resources.getString(R.string.spanish)
binding.flagIcon.setImageResource(R.drawable.country_flag_es)
}
"fr" -> {
binding.languageSpinner.text = resources.getString(R.string.french)
binding.flagIcon.setImageResource(R.drawable.country_flag_fr)
}
"de" -> {
binding.languageSpinner.text = resources.getString(R.string.german)
binding.flagIcon.setImageResource(R.drawable.country_flag_de)
}
}
}

private fun setSettingsUIDate() {
binding.temperatureSpinner.text = UnitsMapper.getShorthandUnit(settingsModel.tempUnit)
binding.windSpeedSpinner.text = UnitsMapper.getShorthandUnit(settingsModel.windSpeedUnit)
Expand Down Expand Up @@ -247,6 +277,44 @@ class SettingsFragment : Fragment() {

popup.show()
}
private fun showLanguagePopup(view: View) {
val popup = PopupMenu(requireContext(), view)
popup.inflate(R.menu.language_menu)
popup.setOnMenuItemClickListener { item: MenuItem? ->
when (item!!.itemId) {
R.id.english -> {
setLocale(requireContext(),"en", resources)
changeLanguage(sharedPreferencesHelper, "en")
binding.languageSpinner.text = item.title
binding.flagIcon.setImageResource(R.drawable.country_flag_uk)
requireActivity().onBackPressedDispatcher.onBackPressed()
}
R.id.spanish -> {
setLocale(requireContext(),"es", resources)
changeLanguage(sharedPreferencesHelper, "es")
binding.languageSpinner.text = item.title
binding.flagIcon.setImageResource(R.drawable.country_flag_es)
requireActivity().onBackPressedDispatcher.onBackPressed()
}
R.id.french -> {
setLocale(requireContext(),"fr", resources)
changeLanguage(sharedPreferencesHelper, "fr")
binding.languageSpinner.text = item.title
binding.flagIcon.setImageResource(R.drawable.country_flag_fr)
requireActivity().onBackPressedDispatcher.onBackPressed()
}
R.id.german -> {
setLocale(requireContext(),"de", resources)
changeLanguage(sharedPreferencesHelper, "de")
binding.languageSpinner.text = item.title
binding.flagIcon.setImageResource(R.drawable.country_flag_de)
requireActivity().onBackPressedDispatcher.onBackPressed()
}
}
true
}
popup.show()
}

private fun updateWeatherData(currentSettings: SettingsModel?) {
if(currentSettings != null) {
Expand All @@ -261,4 +329,7 @@ class SettingsFragment : Fragment() {
super.onDestroy()
mainContainerView.background = ContextCompat.getDrawable(requireContext(), R.drawable.home_background)
}
}


}

20 changes: 20 additions & 0 deletions app/src/main/java/me/tangobee/weathernaut/utils/LanguageHelper.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package me.tangobee.weathernaut.utils

import android.content.Context
import android.content.res.Resources
import java.util.Locale

object LanguageHelper {
fun setLocale(context: Context, languageCode: String, resources: Resources) {
val locale = Locale(languageCode)
Locale.setDefault(locale)

val config = resources.configuration
config.setLocale(locale)
context.resources.updateConfiguration(config, resources.displayMetrics)
}

fun changeLanguage(sharedPreferencesHelper: SharedPreferencesHelper, language: String){
sharedPreferencesHelper.saveLanguagePreference(language)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ class SharedPreferencesHelper(context: Context) {
private const val PREFS_NAME = "WeathernautPrefs"
private const val SETTINGS_KEY = "SettingsKey"
private const val GEOCODING_KEY = "GeocodingKey"
private const val LANGUAGE_PREF = "LanguagePreference"
}

private val sharedPreferences: SharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
Expand Down Expand Up @@ -51,5 +52,19 @@ class SharedPreferencesHelper(context: Context) {
null
}
}

fun saveLanguagePreference(language: String) {
val languageJson = gson.toJson(language)
sharedPreferences.edit().putString(LANGUAGE_PREF, languageJson).apply()
}

fun getLanguagePreference(): String {
val languageJson = sharedPreferences.getString(LANGUAGE_PREF, null)
return if(languageJson != null){
gson.fromJson(languageJson, String::class.java)
} else{
"en"
}
}
}

Loading