mirror of
https://github.com/rhunk/SnapEnhance.git
synced 2025-06-13 05:37:48 +02:00
wrapper enum delegate
This commit is contained in:
@ -2,10 +2,17 @@ package me.rhunk.snapenhance.data.wrapper
|
|||||||
|
|
||||||
import de.robv.android.xposed.XposedHelpers
|
import de.robv.android.xposed.XposedHelpers
|
||||||
import me.rhunk.snapenhance.util.CallbackBuilder
|
import me.rhunk.snapenhance.util.CallbackBuilder
|
||||||
|
import kotlin.reflect.KProperty
|
||||||
|
|
||||||
abstract class AbstractWrapper(
|
abstract class AbstractWrapper(
|
||||||
protected var instance: Any?
|
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 {
|
companion object {
|
||||||
fun newEmptyInstance(clazz: Class<*>): Any {
|
fun newEmptyInstance(clazz: Class<*>): Any {
|
||||||
return CallbackBuilder.createEmptyObject(clazz.constructors[0]) ?: throw NullPointerException()
|
return CallbackBuilder.createEmptyObject(clazz.constructors[0]) ?: throw NullPointerException()
|
||||||
@ -23,6 +30,8 @@ abstract class AbstractWrapper(
|
|||||||
return instance.toString()
|
return instance.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected fun <T> enum(fieldName: String, defaultValue: T) = EnumAccessor(fieldName, defaultValue)
|
||||||
|
|
||||||
fun <T : Enum<*>> getEnumValue(fieldName: String, defaultValue: T): T {
|
fun <T : Enum<*>> getEnumValue(fieldName: String, defaultValue: T): T {
|
||||||
val mContentType = XposedHelpers.getObjectField(instance, fieldName) as Enum<*>
|
val mContentType = XposedHelpers.getObjectField(instance, fieldName) as Enum<*>
|
||||||
return java.lang.Enum.valueOf(defaultValue::class.java, mContentType.name) as T
|
return java.lang.Enum.valueOf(defaultValue::class.java, mContentType.name) as T
|
||||||
|
@ -10,6 +10,5 @@ class Message(obj: Any?) : AbstractWrapper(obj) {
|
|||||||
val messageContent get() = MessageContent(instanceNonNull().getObjectField("mMessageContent"))
|
val messageContent get() = MessageContent(instanceNonNull().getObjectField("mMessageContent"))
|
||||||
val messageDescriptor get() = MessageDescriptor(instanceNonNull().getObjectField("mDescriptor"))
|
val messageDescriptor get() = MessageDescriptor(instanceNonNull().getObjectField("mDescriptor"))
|
||||||
val messageMetadata get() = MessageMetadata(instanceNonNull().getObjectField("mMetadata"))
|
val messageMetadata get() = MessageMetadata(instanceNonNull().getObjectField("mMetadata"))
|
||||||
var messageState get() = getEnumValue("mState", MessageState.COMMITTED)
|
var messageState by enum("mState", MessageState.COMMITTED)
|
||||||
set(value) = setEnumValue("mState", value)
|
|
||||||
}
|
}
|
@ -9,7 +9,5 @@ class MessageContent(obj: Any?) : AbstractWrapper(obj) {
|
|||||||
var content
|
var content
|
||||||
get() = instanceNonNull().getObjectField("mContent") as ByteArray
|
get() = instanceNonNull().getObjectField("mContent") as ByteArray
|
||||||
set(value) = instanceNonNull().setObjectField("mContent", value)
|
set(value) = instanceNonNull().setObjectField("mContent", value)
|
||||||
var contentType
|
var contentType by enum("mContentType", ContentType.UNKNOWN)
|
||||||
get() = getEnumValue("mContentType", ContentType.UNKNOWN)
|
|
||||||
set(value) = setEnumValue("mContentType", value)
|
|
||||||
}
|
}
|
@ -7,11 +7,7 @@ import me.rhunk.snapenhance.util.getObjectField
|
|||||||
class MessageMetadata(obj: Any?) : AbstractWrapper(obj){
|
class MessageMetadata(obj: Any?) : AbstractWrapper(obj){
|
||||||
val createdAt: Long get() = instanceNonNull().getObjectField("mCreatedAt") as Long
|
val createdAt: Long get() = instanceNonNull().getObjectField("mCreatedAt") as Long
|
||||||
val readAt: Long get() = instanceNonNull().getObjectField("mReadAt") as Long
|
val readAt: Long get() = instanceNonNull().getObjectField("mReadAt") as Long
|
||||||
var playableSnapState: PlayableSnapState
|
var playableSnapState by enum("mPlayableSnapState", PlayableSnapState.PLAYABLE)
|
||||||
get() = getEnumValue("mPlayableSnapState", PlayableSnapState.PLAYABLE)
|
|
||||||
set(value) {
|
|
||||||
setEnumValue("mPlayableSnapState", value)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getUUIDList(name: String): List<SnapUUID> {
|
private fun getUUIDList(name: String): List<SnapUUID> {
|
||||||
return (instanceNonNull().getObjectField(name) as List<*>).map { SnapUUID(it!!) }
|
return (instanceNonNull().getObjectField(name) as List<*>).map { SnapUUID(it!!) }
|
||||||
|
Reference in New Issue
Block a user