commit 55f6627d72cd6797f2737f7db5de6dfa165f4346 parent c227dff7348337356d1d479d8df07d9963a258bf Author: rhunk <101876869+rhunk@users.noreply.github.com> Date: Sat, 5 Aug 2023 10:33:51 +0200 wrapper enum delegate Diffstat:
4 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/data/wrapper/AbstractWrapper.kt b/core/src/main/kotlin/me/rhunk/snapenhance/data/wrapper/AbstractWrapper.kt @@ -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 diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/data/wrapper/impl/Message.kt b/core/src/main/kotlin/me/rhunk/snapenhance/data/wrapper/impl/Message.kt @@ -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) } \ No newline at end of file diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/data/wrapper/impl/MessageContent.kt b/core/src/main/kotlin/me/rhunk/snapenhance/data/wrapper/impl/MessageContent.kt @@ -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) } \ No newline at end of file diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/data/wrapper/impl/MessageMetadata.kt b/core/src/main/kotlin/me/rhunk/snapenhance/data/wrapper/impl/MessageMetadata.kt @@ -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!!) }