Feature: Added app language selection.
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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))
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user