Feature: Added app language selection.

This commit is contained in:
HeCodes2Much
2024-11-25 17:30:53 +00:00
parent 2577e995bc
commit b4e56876d1
8 changed files with 181 additions and 16 deletions

View File

@@ -249,6 +249,22 @@ class PreferenceHelper @Inject constructor(@ApplicationContext context: Context)
get() = prefs.getString(Constants.DOUBLE_TAP_APP, "").toString()
set(value) = prefs.edit().putString(Constants.DOUBLE_TAP_APP, value).apply()
var appLanguage: Constants.Language
get() {
return try {
Constants.Language.valueOf(
prefs.getString(
Constants.PACKAGE_LANGUAGE,
Constants.Language.System.name
).toString()
)
} catch (_: Exception) {
Constants.Language.System
}
}
set(value) = prefs.edit().putString(Constants.PACKAGE_LANGUAGE, value.name).apply()
var weatherUnits: Constants.Units
get() {
return try {

View File

@@ -96,6 +96,15 @@ class MainActivity : AppCompatActivity() {
setupNavController()
setupOrientation()
setupLocationManager()
setLanguage()
}
@Suppress("DEPRECATION")
private fun setLanguage() {
val locale = preferenceHelper.appLanguage.locale()
val config = resources.configuration
config.locale = locale
resources.updateConfiguration(config, resources.displayMetrics)
}
private fun initializeDependencies() {

View File

@@ -54,7 +54,6 @@ import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.launch
import java.util.Locale
import javax.inject.Inject
@@ -299,7 +298,7 @@ class HomeFragment : Fragment(),
nestScrollView.hideKeyboard()
val is24HourFormat = DateFormat.is24HourFormat(requireContext())
val localLocale = Locale.getDefault()
val localLocale = preferenceHelper.appLanguage.timezone()
val best12 = DateFormat.getBestDateTimePattern(localLocale, "hmma")
val best24 = DateFormat.getBestDateTimePattern(localLocale, "HHmm")

View File

@@ -80,6 +80,7 @@ class SettingsFeaturesFragment : Fragment(),
binding.apply {
miscellaneousSearchEngineControl.text = preferenceHelper.searchEngines.getString(context)
miscellaneousAppLanguageControl.text = preferenceHelper.appLanguage.name
miscellaneousFilterStrengthControl.text = "${preferenceHelper.filterStrength}"
}
@@ -161,6 +162,10 @@ class SettingsFeaturesFragment : Fragment(),
miscellaneousFilterStrengthControl.setOnClickListener {
showFilterStrengthDialog()
}
miscellaneousAppLanguageControl.setOnClickListener {
showAppLanguageDialog()
}
}
}
@@ -192,6 +197,37 @@ class SettingsFeaturesFragment : Fragment(),
searchEngineDialog?.show()
}
private var appLanguageDialog: AlertDialog? = null
@RequiresApi(Build.VERSION_CODES.Q)
private fun showAppLanguageDialog() {
// Dismiss any existing dialog to prevent multiple dialogs open simultaneously
appLanguageDialog?.dismiss()
// Get the array of Language enum values
val items = Constants.Language.entries.toTypedArray()
// Map the enum values to their string representations using the `string()` method defined in Language enum
val itemStrings = items.map { it.string(context) }.toTypedArray()
val dialogBuilder = MaterialAlertDialogBuilder(context).apply {
setTitle(getString(R.string.settings_select_app_language))
setItems(itemStrings) { _, which ->
val selectedItem = items[which]
preferenceViewModel.setAppLanguage(selectedItem)
binding.miscellaneousAppLanguageControl.text = preferenceHelper.appLanguage.name
val feedbackType = "select"
appHelper.triggerHapticFeedback(context, feedbackType)
}
}
// Assign the created dialog to appLanguageDialog
appLanguageDialog = dialogBuilder.create()
appLanguageDialog?.show()
}
private var filterStrengthDialog: AlertDialog? = null
@RequiresApi(Build.VERSION_CODES.Q)

View File

@@ -4,21 +4,21 @@ import android.content.Context
import android.graphics.Typeface
import androidx.core.content.res.ResourcesCompat
import com.github.droidworksstudio.launcher.R
import java.util.Locale
object Constants {
const val PACKAGE_NAME = "app.easy.launcher"
const val PACKAGE_NAME_DEBUG = "$PACKAGE_NAME.debug"
const val PACKAGE_PREFS = "EasyLauncher.pref"
const val PACKAGE_LANGUAGE = "PACKAGE_LANGUAGE"
const val TIMERS_PREFS = "Timers.pref"
const val LAST_CHECK_TIME = "LAST_CHECK_TIME"
const val CACHED_DATA_TIMESTAMP = "CACHED_DATA_TIMESTAMP"
const val WIDGETS_COUNT = 2
const val WIDGET_WEATHER = "WIDGET_WEATHER"
const val WIDGET_BATTERY = "WIDGET_BATTERY"
const val WEATHER_PREFS = "EasyWeather.pref"
const val WEATHER_RESPONSE = "WEATHER_RESPONSE"
const val WEATHER_UNITS = "WEATHER_UNITS"
@@ -194,16 +194,10 @@ object Constants {
Bitter,
Dotness,
DroidSans,
// GreatVibes,
Lato,
// Lobster,
Merriweather,
Montserrat,
OpenSans,
// Pacifico,
Quicksand,
Raleway,
Roboto,
@@ -215,13 +209,10 @@ object Constants {
Bitter -> ResourcesCompat.getFont(context, R.font.bitter)
Dotness -> ResourcesCompat.getFont(context, R.font.dotness)
DroidSans -> ResourcesCompat.getFont(context, R.font.open_sans)
// GreatVibes -> ResourcesCompat.getFont(context, R.font.great_vibes)
Lato -> ResourcesCompat.getFont(context, R.font.lato)
// Lobster -> ResourcesCompat.getFont(context, R.font.lobster)
Merriweather -> ResourcesCompat.getFont(context, R.font.merriweather)
Montserrat -> ResourcesCompat.getFont(context, R.font.montserrat)
OpenSans -> ResourcesCompat.getFont(context, R.font.open_sans)
// Pacifico -> ResourcesCompat.getFont(context, R.font.pacifico)
Quicksand -> ResourcesCompat.getFont(context, R.font.quicksand)
Raleway -> ResourcesCompat.getFont(context, R.font.raleway)
Roboto -> ResourcesCompat.getFont(context, R.font.roboto)
@@ -235,13 +226,10 @@ object Constants {
Bitter -> context.getString(R.string.settings_font_bitter)
Dotness -> context.getString(R.string.settings_font_dotness)
DroidSans -> context.getString(R.string.settings_font_droidsans)
// GreatVibes -> context.getString(R.string.settings_font_greatvibes)
Lato -> context.getString(R.string.settings_font_lato)
// Lobster -> context.getString(R.string.settings_font_lobster)
Merriweather -> context.getString(R.string.settings_font_merriweather)
Montserrat -> context.getString(R.string.settings_font_montserrat)
OpenSans -> context.getString(R.string.settings_font_opensans)
// Pacifico -> context.getString(R.string.settings_font_pacifico)
Quicksand -> context.getString(R.string.settings_font_quicksand)
Raleway -> context.getString(R.string.settings_font_raleway)
Roboto -> context.getString(R.string.settings_font_roboto)
@@ -249,4 +237,79 @@ object Constants {
}
}
}
enum class Language {
System,
Czech,
Danish,
Dutch,
English,
German,
Hebrew,
Italian,
Lithuanian,
Slovak,
Turkish,
Ukrainian;
fun string(context: Context): String {
return when (this) {
System -> context.getString(R.string.app_system_language)
Czech -> "Czech"
Danish -> "Danish"
Dutch -> "Dutch"
English -> "English"
German -> "German"
Hebrew -> "Hebrew"
Italian -> "Italian"
Lithuanian -> "Lithuanian"
Slovak -> "Slovak"
Turkish -> "Turkish"
Ukrainian -> "Ukrainian"
}
}
fun locale(): Locale {
return Locale(value())
}
private fun value(): String {
return when (this) {
System -> Locale.getDefault().language
Czech -> "cs"
Danish -> "da"
Dutch -> "nl"
English -> "en"
German -> "de"
Hebrew -> "iw"
Italian -> "it"
Lithuanian -> "lt"
Slovak -> "sk"
Turkish -> "tr"
Ukrainian -> "uk"
}
}
fun timezone(): Locale {
return Locale(zone())
}
private fun zone(): String {
return when (this) {
System -> Locale.getDefault().toLanguageTag()
Czech -> "cs-CZ"
Danish -> "da-DK"
Dutch -> "nl-NL"
English -> "en-US"
German -> "de-DE"
Hebrew -> "he-IL"
Italian -> "it-IT"
Lithuanian -> "lt-LT"
Slovak -> "sk-SK"
Turkish -> "tr-TR"
Ukrainian -> "uk-UA"
}
}
}
}

View File

@@ -53,6 +53,7 @@ class PreferenceViewModel @Inject constructor(
private val batteryOrderNumberLiveData: MutableLiveData<Int> = MutableLiveData()
private val filterStrengthLiveData: MutableLiveData<Int> = MutableLiveData()
private val appLanguageLiveData: MutableLiveData<Constants.Language> = MutableLiveData()
private val searchEngineLiveData: MutableLiveData<Constants.SearchEngines> = MutableLiveData()
private val launcherFontLiveData: MutableLiveData<Constants.Fonts> = MutableLiveData()
private val doubleTapActionLiveData: MutableLiveData<Constants.Action> = MutableLiveData()
@@ -276,6 +277,11 @@ class PreferenceViewModel @Inject constructor(
lockSettingsLiveData.postValue((preferenceHelper.settingsLock))
}
fun setAppLanguage(appLanguage: Constants.Language) {
preferenceHelper.appLanguage = appLanguage
appLanguageLiveData.postValue((preferenceHelper.appLanguage))
}
fun setSearchEngine(searchEngine: Constants.SearchEngines) {
preferenceHelper.searchEngines = searchEngine
searchEngineLiveData.postValue((preferenceHelper.searchEngines))

View File

@@ -410,6 +410,38 @@
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="10dp"
android:orientation="horizontal"
tools:ignore="MissingConstraints">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/miscellaneous_appLanguage_text"
style="@style/TextDefaultStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="left|center"
android:text="@string/settings_app_language"
android:textSize="@dimen/text_large"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="RtlHardcoded" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/miscellaneous_appLanguage_control"
style="@style/TextDefaultStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left|center"
android:text="@string/settings_app_language"
android:textSize="@dimen/text_large"
tools:ignore="RtlHardcoded" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_system_language">System</string>
<!-- Strings used for basic parts of the launcher -->
<string name="favorite_apps">Favorite Apps</string>
<string name="hidden_apps">Hidden Apps</string>
@@ -132,6 +133,9 @@
<string name="settings_select_search_engine">Select a Search Engine</string>
<string name="settings_search_engine">Search Engine</string>
<string name="settings_select_app_language">Select a App Language</string>
<string name="settings_app_language">App Language</string>
<string name="settings_select_filter_strength">Select a Filter Strength</string>
<string name="settings_filter_strength">Filter Strength</string>