@@ -4,6 +4,10 @@ import android.content.SharedPreferences
44import com.omega_r.base.enitity.Percent
55import com.omega_r.base.enitity.PercentModel
66import com.omega_r.base.enitity.toPercent
7+ import com.squareup.moshi.JsonAdapter
8+ import java.util.Date
9+ import kotlin.time.Duration
10+ import kotlin.time.Duration.Companion.milliseconds
711
812sealed class Setting <T >(
913 val key : String ,
@@ -29,6 +33,77 @@ sealed class Setting<T>(
2933
3034 }
3135
36+ open class IntSetting (key : String , defaultValue : Int , label : String , description : String ) :
37+ Setting <Int >(key = key, defaultValue = defaultValue, label = label, description = description) {
38+ override fun getValue (sharedPreferences : SharedPreferences ): Int {
39+ return sharedPreferences.getInt(key, defaultValue)
40+ }
41+
42+ override fun setValue (editor : SharedPreferences .Editor , value : Int ) {
43+ editor.putInt(key, value)
44+ }
45+ }
46+
47+ open class FloatSetting (key : String , defaultValue : Float , label : String , description : String ) :
48+ Setting <Float >(key = key, defaultValue = defaultValue, label = label, description = description) {
49+ override fun getValue (sharedPreferences : SharedPreferences ): Float {
50+ return sharedPreferences.getFloat(key, defaultValue)
51+ }
52+
53+ override fun setValue (editor : SharedPreferences .Editor , value : Float ) {
54+ editor.putFloat(key, value)
55+ }
56+ }
57+
58+ open class LongSetting (key : String , defaultValue : Long , label : String , description : String ) :
59+ Setting <Long >(key = key, defaultValue = defaultValue, label = label, description = description) {
60+ override fun getValue (sharedPreferences : SharedPreferences ): Long {
61+ return sharedPreferences.getLong(key, defaultValue)
62+ }
63+
64+ override fun setValue (editor : SharedPreferences .Editor , value : Long ) {
65+ editor.putLong(key, value)
66+ }
67+ }
68+
69+ open class DoubleSetting (key : String , defaultValue : Double , label : String , description : String ) :
70+ Setting <Double >(key = key, defaultValue = defaultValue, label = label, description = description) {
71+ override fun getValue (sharedPreferences : SharedPreferences ): Double {
72+ return java.lang.Double .longBitsToDouble(
73+ sharedPreferences.getLong(
74+ key,
75+ java.lang.Double .doubleToLongBits(defaultValue)
76+ )
77+ )
78+ }
79+
80+ override fun setValue (editor : SharedPreferences .Editor , value : Double ) {
81+ editor.putLong(key, java.lang.Double .doubleToLongBits(value))
82+ }
83+ }
84+
85+ open class DateSetting (key : String , defaultValue : Date , label : String , description : String ) :
86+ Setting <Date >(key = key, defaultValue = defaultValue, label = label, description = description) {
87+ override fun getValue (sharedPreferences : SharedPreferences ): Date {
88+ return Date (sharedPreferences.getLong(key, defaultValue.time))
89+ }
90+
91+ override fun setValue (editor : SharedPreferences .Editor , value : Date ) {
92+ editor.putLong(key, value.time)
93+ }
94+ }
95+
96+ open class DurationSetting (key : String , defaultValue : Duration , label : String , description : String ) :
97+ Setting <Duration >(key = key, defaultValue = defaultValue, label = label, description = description) {
98+ override fun getValue (sharedPreferences : SharedPreferences ): Duration {
99+ return sharedPreferences.getLong(key, defaultValue.inWholeMilliseconds).milliseconds
100+ }
101+
102+ override fun setValue (editor : SharedPreferences .Editor , value : Duration ) {
103+ editor.putLong(key, value.inWholeMilliseconds)
104+ }
105+ }
106+
32107 open class StringSetting (key : String , defaultValue : String , label : String , description : String ) :
33108 Setting <String >(key = key, defaultValue = defaultValue, label = label, description = description) {
34109 override fun getValue (sharedPreferences : SharedPreferences ): String {
@@ -43,9 +118,9 @@ sealed class Setting<T>(
43118 open class PercentSetting (key : String , defaultValue : Percent , label : String , description : String ) :
44119 Setting <Percent >(key = key, defaultValue = defaultValue, label = label, description = description) {
45120
46- private companion object {
47- private val percentModel = PercentModel (0f , 100f )
48- }
121+ private companion object {
122+ private val percentModel = PercentModel (0f , 100f )
123+ }
49124
50125 override fun getValue (sharedPreferences : SharedPreferences ): Percent {
51126 return sharedPreferences.getFloat(key, defaultValue.toFloat(percentModel)).toPercent(percentModel)
@@ -56,4 +131,27 @@ sealed class Setting<T>(
56131 }
57132 }
58133
134+
135+ open class AnyJsonSetting <T : Any ?>(
136+ key : String ,
137+ defaultValue : T ,
138+ label : String ,
139+ description : String ,
140+ private val jsonAdapter : JsonAdapter <T >
141+ ) : Setting<T>(key = key, defaultValue = defaultValue, label = label, description = description) {
142+
143+ private companion object {
144+ private const val DEFAULT_VALUE = " default_value"
145+ }
146+
147+ override fun getValue (sharedPreferences : SharedPreferences ): T {
148+ val json = sharedPreferences.getString(key, DEFAULT_VALUE )
149+ return if (json == DEFAULT_VALUE ) defaultValue else json?.let { jsonAdapter.fromJson(json) } as T
150+ }
151+
152+ override fun setValue (editor : SharedPreferences .Editor , value : T ) {
153+ editor.putString(key, jsonAdapter.toJson(value))
154+ }
155+ }
156+
59157}
0 commit comments