wrapper enum delegate

This commit is contained in:
rhunk
2023-08-05 10:33:51 +02:00
parent c227dff734
commit 55f6627d72
4 changed files with 12 additions and 10 deletions

View File

@ -2,10 +2,17 @@ package me.rhunk.snapenhance.data.wrapper
import de.robv.android.xposed.XposedHelpers
import me.rhunk.snapenhance.util.CallbackBuilder
import kotlin.reflect.KProperty
abstract class AbstractWrapper(
protected var instance: Any?
) {
@Suppress("UNCHECKED_CAST")
inner class EnumAccessor<T>(private val fieldName: String, private val defaultValue: T) {
operator fun getValue(obj: Any, property: KProperty<*>): T = getEnumValue(fieldName, defaultValue as Enum<*>) as T
operator fun setValue(obj: Any, property: KProperty<*>, value: Any) = setEnumValue(fieldName, value as Enum<*>)
}
companion object {
fun newEmptyInstance(clazz: Class<*>): Any {
return CallbackBuilder.createEmptyObject(clazz.constructors[0]) ?: throw NullPointerException()
@ -23,6 +30,8 @@ abstract class AbstractWrapper(
return instance.toString()
}
protected fun <T> enum(fieldName: String, defaultValue: T) = EnumAccessor(fieldName, defaultValue)
fun <T : Enum<*>> getEnumValue(fieldName: String, defaultValue: T): T {
val mContentType = XposedHelpers.getObjectField(instance, fieldName) as Enum<*>
return java.lang.Enum.valueOf(defaultValue::class.java, mContentType.name) as T

View File

@ -10,6 +10,5 @@ class Message(obj: Any?) : AbstractWrapper(obj) {
val messageContent get() = MessageContent(instanceNonNull().getObjectField("mMessageContent"))
val messageDescriptor get() = MessageDescriptor(instanceNonNull().getObjectField("mDescriptor"))
val messageMetadata get() = MessageMetadata(instanceNonNull().getObjectField("mMetadata"))
var messageState get() = getEnumValue("mState", MessageState.COMMITTED)
set(value) = setEnumValue("mState", value)
var messageState by enum("mState", MessageState.COMMITTED)
}

View File

@ -9,7 +9,5 @@ class MessageContent(obj: Any?) : AbstractWrapper(obj) {
var content
get() = instanceNonNull().getObjectField("mContent") as ByteArray
set(value) = instanceNonNull().setObjectField("mContent", value)
var contentType
get() = getEnumValue("mContentType", ContentType.UNKNOWN)
set(value) = setEnumValue("mContentType", value)
var contentType by enum("mContentType", ContentType.UNKNOWN)
}

View File

@ -7,11 +7,7 @@ import me.rhunk.snapenhance.util.getObjectField
class MessageMetadata(obj: Any?) : AbstractWrapper(obj){
val createdAt: Long get() = instanceNonNull().getObjectField("mCreatedAt") as Long
val readAt: Long get() = instanceNonNull().getObjectField("mReadAt") as Long
var playableSnapState: PlayableSnapState
get() = getEnumValue("mPlayableSnapState", PlayableSnapState.PLAYABLE)
set(value) {
setEnumValue("mPlayableSnapState", value)
}
var playableSnapState by enum("mPlayableSnapState", PlayableSnapState.PLAYABLE)
private fun getUUIDList(name: String): List<SnapUUID> {
return (instanceNonNull().getObjectField(name) as List<*>).map { SnapUUID(it!!) }