You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
poker-analytics/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt

190 lines
5.9 KiB

package net.pokeranalytics.android.util
import android.content.Context
import android.preference.PreferenceManager
import java.util.*
class Preferences {
interface PreferenceKey {
var identifier: String
}
enum class DBPatch(var key: String) : PreferenceKey {
LONE_COMPUTABLE_RESULTS("loneComputableResult");
override var identifier: String = ""
get() {
return "dbpatch." + this.key
}
}
enum class Keys(override var identifier: String) : PreferenceKey {
CURRENCY_CODE("CurrencyCode"),
LOCALE_CODE("LocaleCode"),
FIRST_LAUNCH("firstLaunch"),
STOP_SHOWING_DISCLAIMER("stopShowingDisclaimer"),
ACTIVE_FILTER_ID("ActiveFilterId"),
LATEST_PURCHASE("latestPurchase"),
PATCH_BREAK("patchBreaks"),
PATCH_TRANSACTION_TYPES_NAMES("patchTransactionTypesNames"),
PATCH_BLINDS_FORMAT("patchBlindFormat")
}
companion object {
fun setString(key: PreferenceKey, value: String, context: Context) {
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
val editor = preferences.edit()
editor.putString(key.identifier, value)
editor.apply()
}
private fun removeKey(key: Keys, context: Context) {
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
val editor = preferences.edit()
editor.remove(key.identifier)
editor.apply()
}
fun getString(key: Keys, context: Context) : String? {
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
return preferences.getString(key.identifier, null)
}
fun setBoolean(key: PreferenceKey, value: Boolean, context: Context) {
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
val editor = preferences.edit()
editor.putBoolean(key.identifier, value)
editor.apply()
}
fun getBoolean(key: PreferenceKey, context: Context, defaultValue: Boolean? = false) : Boolean {
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
return preferences.getBoolean(key.identifier, defaultValue ?: false)
}
fun setCurrencyCode(currencyCode: String, context: Context) {
setString(Keys.CURRENCY_CODE, currencyCode, context)
UserDefaults.setCurrencyValues(context)
}
fun setActiveFilterId(filterId: String, context: Context) {
setString(Keys.ACTIVE_FILTER_ID, filterId, context)
}
fun getActiveFilterId(context: Context) : String? {
return getString(Keys.ACTIVE_FILTER_ID, context)
}
fun removeActiveFilterId(context: Context) {
removeKey(Keys.ACTIVE_FILTER_ID, context)
}
private fun getCurrencyCode(context: Context) : String? {
return getString(Keys.CURRENCY_CODE, context)
}
fun getCurrencyLocale(context : Context) : Locale? {
getCurrencyCode(context)?.let { currencyCode ->
UserDefaults.availableCurrencyLocales.filter {
Currency.getInstance(it).currencyCode == currencyCode
}.firstOrNull()?.let {
return it
}
}
return null
}
fun getDefaultCurrency(context: Context) : Currency? {
getCurrencyLocale(context)?.let {
return Currency.getInstance(it)
}
return null
}
fun setStopShowingDisclaimer(context: Context) {
setBoolean(Keys.STOP_SHOWING_DISCLAIMER, true, context)
}
fun shouldShowDisclaimer(context: Context) : Boolean {
return !getBoolean(Keys.STOP_SHOWING_DISCLAIMER, context)
}
fun executeOnce(key: Keys, context: Context, executable: () -> Unit) {
if (!getBoolean(key, context)) {
executable.invoke()
setBoolean(key, true, context)
}
}
}
}
class UserDefaults private constructor(context: Context) {
init {
setCurrencyValues(context)
}
companion object : SingletonHolder<UserDefaults, Context>(::UserDefaults) {
lateinit var currency : Currency
fun setCurrencyValues(context: Context) {
currency = Preferences.getDefaultCurrency(context) ?: getLocaleCurrency()
}
val availableCurrencyLocales = Locale.getAvailableLocales().mapNotNull {
try {
Currency.getInstance(it)
it
} catch (e: Exception) {
null
}
}
/**
* Return the locale currency, or en_US if there
*/
fun getLocaleCurrency() : Currency {
return try {
Currency.getInstance(Locale.getDefault())
} catch (ex: Exception) {
when (Locale.getDefault().language) {
"en" -> Currency.getInstance(Locale("en", "US"))
"fr" -> Currency.getInstance(Locale("fr", "FR"))
"es" -> Currency.getInstance(Locale("es", "ES"))
"de" -> Currency.getInstance(Locale("de", "DE"))
"ja" -> Currency.getInstance(Locale("ja", "JP"))
"zh" -> Currency.getInstance(Locale("zh", "CN"))
else -> Currency.getInstance(Locale("en", "US"))
}
}
}
}
}
open class SingletonHolder<out T, in A>(creator: (A) -> T) {
private var creator: ((A) -> T)? = creator
@Volatile private var instance: T? = null
fun init(context: A): T {
val i = instance
if (i != null) {
return i
}
return synchronized(this) {
val i2 = instance
if (i2 != null) {
i2
} else {
val created = creator!!(context)
instance = created
creator = null
created
}
}
}
}