Skip to content

Commit 07bbc0d

Browse files
committed
add Enum support
1 parent f6eceee commit 07bbc0d

File tree

8 files changed

+103
-36
lines changed

8 files changed

+103
-36
lines changed

.idea/misc.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/src/main/kotlin/io/github/sgpublic/exsp/core/ConverterCompiler.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import javax.lang.model.element.Modifier
1010
import javax.lang.model.element.TypeElement
1111
import javax.lang.model.type.DeclaredType
1212
import javax.lang.model.type.TypeMirror
13-
import javax.tools.Diagnostic
1413

1514
object ConverterCompiler {
1615
private val converters: HashMap<String, TypeElement> = hashMapOf()
@@ -98,13 +97,11 @@ object ConverterCompiler {
9897

9998
val static = CodeBlock.builder()
10099
for (element: Element in env.getElementsAnnotatedWith(ExConverter::class.java)) {
101-
ExPreferenceProcessor.mMessager.printMessage(Diagnostic.Kind.WARNING, "element: ${element.javaClass}")
102100
if (element !is TypeElement) {
103101
continue
104102
}
105103
val typeParam = findTargetType(element)
106104
val name = (typeParam.first.asElement() as TypeElement).qualifiedName.toString()
107-
ExPreferenceProcessor.mMessager.printMessage(Diagnostic.Kind.WARNING, "name: $name")
108105
targets[name] = typeParam.second.asElement() as TypeElement
109106
converters[name] = element
110107
static.addStatement("\$T.registry.put(\$T.class, \$T.class)",

compiler/src/main/kotlin/io/github/sgpublic/exsp/core/PreferenceCompiler.kt

Lines changed: 44 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,14 @@ import com.squareup.javapoet.*
44
import io.github.sgpublic.exsp.ExPreferenceProcessor
55
import io.github.sgpublic.exsp.annotations.ExSharedPreference
66
import io.github.sgpublic.exsp.annotations.ExValue
7-
import io.github.sgpublic.exsp.util.SharedPreferenceType
8-
import io.github.sgpublic.exsp.util.getterName
9-
import io.github.sgpublic.exsp.util.setterName
10-
import io.github.sgpublic.exsp.util.supported
7+
import io.github.sgpublic.exsp.util.*
118
import java.util.*
129
import javax.annotation.processing.RoundEnvironment
1310
import javax.lang.model.element.Element
1411
import javax.lang.model.element.Modifier
1512
import javax.lang.model.element.TypeElement
1613
import javax.lang.model.element.VariableElement
14+
import javax.tools.Diagnostic
1715

1816
object PreferenceCompiler {
1917
fun apply(env: RoundEnvironment) {
@@ -87,7 +85,7 @@ object PreferenceCompiler {
8785
if (field.modifiers.contains(Modifier.FINAL)) {
8886
continue
8987
}
90-
val type = ClassName.get(field.asType())
88+
val type: TypeName = ClassName.get(field.asType())
9189

9290
val name = field.getAnnotation(ExValue::class.java).key.takeIf { it != "" }
9391
?: field.simpleName.toString().replaceFirstChar {
@@ -109,9 +107,14 @@ object PreferenceCompiler {
109107

110108

111109
var convertedType = type
110+
ExPreferenceProcessor.mMessager.printMessage(Diagnostic.Kind.WARNING, "field: ${field.asType()}")
112111
if (type.supported()) {
113112
setter.addStatement("\$T converted = value", type)
114113
getter.addStatement("\$T origin", type)
114+
} else if (field.isEnum()) {
115+
convertedType = StringTypeOrigin
116+
setter.addStatement("\$T converted = value.name()", convertedType)
117+
getter.addStatement("\$T origin", convertedType)
115118
} else {
116119
val convertedElement = ConverterCompiler.getTarget(ExPreferenceProcessor.asElement(field.asType())!!)
117120
setter.addStatement("\$T converted = \$T.toPreference(\$T.class, value)",
@@ -120,34 +123,47 @@ object PreferenceCompiler {
120123
getter.addStatement("\$T origin", convertedType)
121124
}
122125

123-
when (SharedPreferenceType.of(convertedType)) {
124-
SharedPreferenceType.BOOLEAN -> {
125-
getter.addStatement("origin = sp.getBoolean($conf, $defVal)")
126-
setter.addStatement("editor.putBoolean($conf, converted)")
127-
}
128-
SharedPreferenceType.INT -> {
129-
getter.addStatement("origin = sp.getInt($conf, $defVal)")
130-
setter.addStatement("editor.putInt($conf, converted)")
131-
}
132-
SharedPreferenceType.LONG -> {
133-
getter.addStatement("origin = sp.getLong($conf, $defVal)")
134-
setter.addStatement("editor.putLong($conf, converted)")
126+
try {
127+
when (SharedPreferenceType.of(convertedType)) {
128+
SharedPreferenceType.BOOLEAN -> {
129+
getter.addStatement("origin = sp.getBoolean($conf, $defVal)")
130+
setter.addStatement("editor.putBoolean($conf, converted)")
131+
}
132+
SharedPreferenceType.INT -> {
133+
getter.addStatement("origin = sp.getInt($conf, $defVal)")
134+
setter.addStatement("editor.putInt($conf, converted)")
135+
}
136+
SharedPreferenceType.LONG -> {
137+
getter.addStatement("origin = sp.getLong($conf, $defVal)")
138+
setter.addStatement("editor.putLong($conf, converted)")
139+
}
140+
SharedPreferenceType.FLOAT -> {
141+
getter.addStatement("origin = sp.getFloat($conf, $defVal)")
142+
setter.addStatement("editor.putFloat($conf, value)")
143+
}
144+
SharedPreferenceType.STRING -> {
145+
getter.addStatement("origin = sp.getString($conf, \"$defVal\")")
146+
setter.addStatement("editor.putString($conf, converted)")
147+
}
148+
SharedPreferenceType.STRING_SET -> {
149+
getter.addStatement("origin = sp.getStringSet($conf, \"$defVal\")")
150+
setter.addStatement("editor.putStringSet($conf, converted)")
151+
}
135152
}
136-
SharedPreferenceType.FLOAT -> {
137-
getter.addStatement("origin = sp.getFloat($conf, $defVal)")
138-
setter.addStatement("editor.putFloat($conf, value)")
139-
}
140-
SharedPreferenceType.STRING -> {
141-
getter.addStatement("origin = sp.getString($conf, \"$defVal\")")
142-
setter.addStatement("editor.putString($conf, converted)")
143-
}
144-
SharedPreferenceType.STRING_SET -> {
145-
getter.addStatement("origin = sp.getStringSet($conf, \"$defVal\")")
146-
setter.addStatement("editor.putStringSet($conf, converted)")
153+
} catch (e: Exception) {
154+
if (!field.isEnum()) {
155+
throw e
147156
}
148157
}
158+
149159
if (type.supported()) {
150160
getter.addStatement("return origin")
161+
} else if (field.isEnum()) {
162+
getter.beginControlFlow("try")
163+
getter.addStatement("return \$T.valueOf(origin)", type)
164+
getter.nextControlFlow("catch (\$T ignore)", IllegalArgumentException::class.java)
165+
getter.addStatement("return \$T.valueOf(\"$defVal\")", type)
166+
getter.endControlFlow()
151167
} else {
152168
getter.addStatement("return \$T.fromPreference(\$T.class, origin)",
153169
ExPreferenceProcessor.ExConverters, type)

compiler/src/main/kotlin/io/github/sgpublic/exsp/util/_Types.kt

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ package io.github.sgpublic.exsp.util
33
import com.squareup.javapoet.ClassName
44
import com.squareup.javapoet.ParameterizedTypeName
55
import com.squareup.javapoet.TypeName
6+
import io.github.sgpublic.exsp.ExPreferenceProcessor
67
import java.util.*
78
import javax.lang.model.element.VariableElement
9+
import javax.tools.Diagnostic
810

911
fun HashSet<TypeName>.andBoxed(): HashSet<TypeName> {
1012
val set = HashSet<TypeName>()
@@ -23,8 +25,8 @@ fun HashSet<TypeName>.andString(): HashSet<TypeName> {
2325
return this
2426
}
2527

26-
private val StringTypeOrigin: TypeName = ClassName.get("java.lang", "String")
27-
private val StringTypeSetOrigin: TypeName = ParameterizedTypeName.get(Set::class.java, String::class.java)
28+
val StringTypeOrigin: ClassName = ClassName.get("java.lang", "String")
29+
val StringTypeSetOrigin: TypeName = ParameterizedTypeName.get(Set::class.java, String::class.java)
2830

2931
private val BooleanType = hashSetOf(
3032
ClassName.BOOLEAN
@@ -75,6 +77,23 @@ fun VariableElement.setterName(): String {
7577
return "set$name"
7678
}
7779

80+
private val obj = ExPreferenceProcessor.getElement("java.lang.Object")
81+
private val enu = ExPreferenceProcessor.getElement("java.lang.Enum")
82+
fun VariableElement.isEnum(): Boolean {
83+
var asElement = ExPreferenceProcessor.asElement(asType()) ?: return false
84+
while (asElement.superclass != null) {
85+
ExPreferenceProcessor.mMessager.printMessage(Diagnostic.Kind.WARNING, "asElement: $asElement")
86+
if (asElement == enu) {
87+
return true
88+
}
89+
if (asElement == obj) {
90+
break
91+
}
92+
asElement = ExPreferenceProcessor.asElement(asElement.superclass) ?: break
93+
}
94+
return false
95+
}
96+
7897
enum class SharedPreferenceType {
7998
BOOLEAN, INT, LONG, FLOAT, STRING, STRING_SET;
8099

demo/src/main/java/io/github/sgpublic/exsp/demo/MainActivity.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package io.github.sgpublic.exsp.demo
33
import android.os.Bundle
44
import android.widget.Button
55
import android.widget.EditText
6+
import android.widget.RadioButton
67
import android.widget.Switch
78
import androidx.appcompat.app.AppCompatActivity
89
import io.github.sgpublic.exsp.ExPreference
@@ -17,6 +18,8 @@ class MainActivity : AppCompatActivity() {
1718
private lateinit var mdate: EditText
1819
private lateinit var mfloat: EditText
1920
private lateinit var mbool: Switch
21+
private lateinit var mtypea: RadioButton
22+
private lateinit var mtypeb: RadioButton
2023

2124
override fun onCreate(savedInstanceState: Bundle?) {
2225
super.onCreate(savedInstanceState)
@@ -31,6 +34,10 @@ class MainActivity : AppCompatActivity() {
3134
test.testLong = mlong.text.toString().toLong()
3235
test.isTestBool = mbool.isChecked
3336
test.testDate = SimpleDateFormat("yyyy.MM.dd").parse(mdate.text.toString())
37+
when {
38+
mtypea.isChecked -> test.testEnum = TestPreference.Type.TYPE_A
39+
mtypeb.isChecked -> test.testEnum = TestPreference.Type.TYPE_B
40+
}
3441
}
3542
}
3643

@@ -41,6 +48,8 @@ class MainActivity : AppCompatActivity() {
4148
mfloat = findViewById(R.id.mfloat)
4249
mbool = findViewById(R.id.mbool)
4350
mdate = findViewById(R.id.mdate)
51+
mtypea = findViewById(R.id.mtypea)
52+
mtypeb = findViewById(R.id.mtypeb)
4453
}
4554

4655
private fun onViewSetup() {
@@ -50,5 +59,9 @@ class MainActivity : AppCompatActivity() {
5059
mfloat.setText(test.testFloat.toString())
5160
mbool.isChecked = test.isTestBool
5261
mdate.setText(SimpleDateFormat("yyyy.MM.dd").format(test.testDate))
62+
when (test.testEnum) {
63+
TestPreference.Type.TYPE_A -> mtypea.isChecked = true
64+
TestPreference.Type.TYPE_B -> mtypeb.isChecked = true
65+
}
5366
}
5467
}

demo/src/main/java/io/github/sgpublic/exsp/demo/TestPreference.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,11 @@ public class TestPreference {
2626

2727
@ExValue(defVal = "-1")
2828
private Date testDate;
29+
30+
@ExValue(defVal = "TYPE_A")
31+
private Type testEnum;
32+
33+
public enum Type {
34+
TYPE_A, TYPE_B
35+
}
2936
}

demo/src/main/res/layout/activity_main.xml

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,25 @@
6868
android:layout_height="wrap_content"
6969
android:text="switch to change preference" />
7070

71+
<RadioGroup
72+
android:layout_width="match_parent"
73+
android:layout_height="wrap_content"
74+
android:orientation="horizontal">
75+
<RadioButton
76+
android:id="@+id/mtypea"
77+
android:layout_width="wrap_content"
78+
android:layout_height="wrap_content"
79+
android:text="TYPE_A"/>
80+
<RadioButton
81+
android:id="@+id/mtypeb"
82+
android:layout_width="wrap_content"
83+
android:layout_height="wrap_content"
84+
android:text="TYPE_B"/>
85+
</RadioGroup>
86+
7187
<Button
7288
android:id="@+id/msave"
7389
android:layout_width="match_parent"
7490
android:layout_height="wrap_content"
7591
android:text="save" />
76-
7792
</LinearLayout>

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
44
android.useAndroidX=true
55
android.nonTransitiveRClass=true
66

7-
exsp.version=1.0.0-alpha03
7+
exsp.version=1.0.0-alpha04

0 commit comments

Comments
 (0)