diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/helper/PreferenceHelper.kt b/app/src/main/java/com/github/droidworksstudio/launcher/helper/PreferenceHelper.kt index 74e07ec..62a95ad 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/helper/PreferenceHelper.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/helper/PreferenceHelper.kt @@ -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 { diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/activities/MainActivity.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/activities/MainActivity.kt index 553de48..2fa0973 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/activities/MainActivity.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/activities/MainActivity.kt @@ -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() { diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/home/HomeFragment.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/home/HomeFragment.kt index 6b860ea..a9a243f 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/home/HomeFragment.kt @@ -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") diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/settings/SettingsFeaturesFragment.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/settings/SettingsFeaturesFragment.kt index 93c0a8c..fdf56a9 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/settings/SettingsFeaturesFragment.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/settings/SettingsFeaturesFragment.kt @@ -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) diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/utils/Constants.kt b/app/src/main/java/com/github/droidworksstudio/launcher/utils/Constants.kt index 3489b35..ee6ef5e 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/utils/Constants.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/utils/Constants.kt @@ -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" + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/viewmodel/PreferenceViewModel.kt b/app/src/main/java/com/github/droidworksstudio/launcher/viewmodel/PreferenceViewModel.kt index 89e969e..ecc0c43 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/viewmodel/PreferenceViewModel.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/viewmodel/PreferenceViewModel.kt @@ -53,6 +53,7 @@ class PreferenceViewModel @Inject constructor( private val batteryOrderNumberLiveData: MutableLiveData = MutableLiveData() private val filterStrengthLiveData: MutableLiveData = MutableLiveData() + private val appLanguageLiveData: MutableLiveData = MutableLiveData() private val searchEngineLiveData: MutableLiveData = MutableLiveData() private val launcherFontLiveData: MutableLiveData = MutableLiveData() private val doubleTapActionLiveData: MutableLiveData = 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)) diff --git a/app/src/main/res/layout/fragment_settings_features.xml b/app/src/main/res/layout/fragment_settings_features.xml index f4f73ed..ebe5d17 100644 --- a/app/src/main/res/layout/fragment_settings_features.xml +++ b/app/src/main/res/layout/fragment_settings_features.xml @@ -410,6 +410,38 @@ + + + + + + + + + System Favorite Apps Hidden Apps @@ -132,6 +133,9 @@ Select a Search Engine Search Engine + Select a App Language + App Language + Select a Filter Strength Filter Strength