fix MediaFilePicker on snap13.79 and added mapper

This commit is contained in:
RSR/
2026-02-16 20:31:42 +04:00
parent e3008e0c9c
commit 1ac1542384
4 changed files with 101 additions and 27 deletions

View File

@@ -40,6 +40,7 @@ class ClassMapper(
COFObservableMapper(),
FoldingLayoutMapper(),
PlatformClientAttestationMapper(),
ChatMediaDrawerMapper(),
)
}

View File

@@ -0,0 +1,48 @@
package me.eternal.purrfectsnap.mapper.impl
import me.eternal.purrfectsnap.mapper.AbstractClassMapper
import me.eternal.purrfectsnap.mapper.ext.getClassName
import me.eternal.purrfectsnap.mapper.ext.getSuperClassName
class ChatMediaDrawerMapper : AbstractClassMapper("ChatMediaDrawer") {
val chatMediaDrawerClass = classReference("chatMediaDrawerClass")
val actionHandlerClass = classReference("actionHandlerClass")
val sendItemsMethodName = string("sendItemsMethodName")
/** List element type for sendItems(List, List) second parameter — used when generic type is erased. */
val sendItemsListItemClass = classReference("sendItemsListItemClass")
init {
mapper {
val drawerClass = classes.firstOrNull { clazz ->
val name = clazz.getClassName()
val superName = clazz.getSuperClassName() ?: return@firstOrNull false
name.contains("ChatMediaDrawer") &&
!name.contains("ActionHandler") &&
superName.contains("ValdiGeneratedRootView")
} ?: return@mapper
val actionHandlerClazz = classes.firstOrNull { clazz ->
clazz.getClassName().contains("ChatMediaDrawerActionHandler")
} ?: return@mapper
val sendItemsMethod = actionHandlerClazz.methods.firstOrNull { method ->
method.name == "sendItems" && method.parameterTypes.size == 2
} ?: actionHandlerClazz.methods.firstOrNull { method ->
method.parameterTypes.size == 2 &&
method.parameterTypes[0].startsWith("Ljava/util/") &&
method.parameterTypes[1].startsWith("Ljava/util/")
} ?: return@mapper
chatMediaDrawerClass.set(drawerClass.getClassName().replace("/", "."))
actionHandlerClass.set(actionHandlerClazz.getClassName().replace("/", "."))
sendItemsMethodName.set(sendItemsMethod.name)
// Find the list item type (e.g. Azc) by structure: has _order and _item (Valdi schema)
val listItemClass = classes.firstOrNull { clazz ->
val fieldNames = clazz.fields.map { it.name }.toSet()
fieldNames.contains("_order") && fieldNames.contains("_item")
}
listItemClass?.let { sendItemsListItemClass.set(it.getClassName().replace("/", ".")) }
}
}
}