feat(experimental): custom streaks expiration format

This commit is contained in:
rhunk
2024-04-18 00:59:17 +02:00
parent 68c61a0b73
commit c44c36dbd4
6 changed files with 97 additions and 0 deletions

View File

@ -35,6 +35,7 @@ class ClassMapper(
FriendingDataSourcesMapper(),
OperaViewerParamsMapper(),
MemoriesPresenterMapper(),
StreaksExpirationMapper(),
)
}

View File

@ -0,0 +1,47 @@
package me.rhunk.snapenhance.mapper.impl
import me.rhunk.snapenhance.mapper.AbstractClassMapper
import me.rhunk.snapenhance.mapper.ext.findConstString
import me.rhunk.snapenhance.mapper.ext.getClassName
import me.rhunk.snapenhance.mapper.ext.searchNextFieldReference
import java.lang.reflect.Modifier
class StreaksExpirationMapper: AbstractClassMapper("StreaksExpirationMapper") {
val hourGlassTimeRemainingField = string("hourGlassTimeRemainingField")
val expirationTimeField = string("expirationTimeField")
val streaksFormatterClass = string("streaksFormatterClass")
val formatStreaksTextMethod = string("formatStreaksTextMethod")
init {
mapper {
var streaksExpirationClassName: String? = null
for (clazz in classes) {
val toStringMethod = clazz.methods.firstOrNull { it.name == "toString" } ?: continue
if (toStringMethod.implementation?.findConstString("StreaksExpiration(", contains = true) != true) continue
streaksExpirationClassName = clazz.getClassName()
toStringMethod.implementation?.apply {
hourGlassTimeRemainingField.set(searchNextFieldReference("hourGlassTimeRemaining", contains = true)?.name)
expirationTimeField.set(searchNextFieldReference("expirationTime", contains = true)?.name)
}
break
}
if (streaksExpirationClassName == null) return@mapper
for (clazz in classes) {
val formatStreaksTextDexMethod = clazz.methods.firstOrNull { method ->
Modifier.isStatic(method.accessFlags) &&
method.returnType == "Ljava/lang/String;" &&
method.parameterTypes.let {
it.size >= 4 && it[0] == "Ljava/util/Map;" && it[2] == "Ljava/lang/Integer;" && it[3].contains(streaksExpirationClassName)
}
} ?: continue
streaksFormatterClass.set(clazz.getClassName())
formatStreaksTextMethod.set(formatStreaksTextDexMethod.name)
break
}
}
}
}