Remove concept of dynamic metadata

Summary:
Although conceptually it made sense, it creates an issue with registration.

### Let me explain

Effectively, as an engineer, what constitutes static and dynamic metadata and how can I ensure that is treated as such?

It may be trivial to answer those questions but there was a fundamental assumption for static metadata that no longer holds true.  Static metadata was registered when descriptors were first referenced, which most of the times happens when added to the descriptors registry.

This used worked fine until we introduced the concept of deferred attributes.
Deferred attributes, even though static, may register its metadata only when requested to.

The issue is even more fundamental as not all the objects that declare static metadata will be loaded into memory by the time the plugin is connected and sends this.

### Solution

To simplify, as the concept was never really used, there's only metadata.

There's only pending metadata which is metadata that is yet to be sent to Flipper Desktop.

Reviewed By: LukeDefeo

Differential Revision: D41614186

fbshipit-source-id: 85d62eeff81ff22ae6e969d7b5aed8628b336258
This commit is contained in:
Lorenzo Blasa
2022-11-30 07:23:29 -08:00
committed by Facebook GitHub Bot
parent 4b83135c6c
commit d954828bbc
8 changed files with 37 additions and 61 deletions

View File

@@ -107,7 +107,7 @@ object ComponentDataExtractor {
val metadata = MetadataRegister.get(namespace, key) val metadata = MetadataRegister.get(namespace, key)
val identifier = val identifier =
metadata?.id metadata?.id
?: MetadataRegister.registerDynamic( ?: MetadataRegister.register(
MetadataRegister.TYPE_ATTRIBUTE, namespace, key, mutable, possibleValues) MetadataRegister.TYPE_ATTRIBUTE, namespace, key, mutable, possibleValues)
return identifier return identifier
} }

View File

@@ -59,7 +59,7 @@ class UIDebuggerFlipperPlugin(
MetadataUpdateEvent.name, MetadataUpdateEvent.name,
Json.encodeToString( Json.encodeToString(
MetadataUpdateEvent.serializer(), MetadataUpdateEvent.serializer(),
MetadataUpdateEvent(MetadataRegister.staticMetadata()))) MetadataUpdateEvent(MetadataRegister.getPendingMetadata())))
context.treeObserverManager.start() context.treeObserverManager.start()
} }
@@ -69,7 +69,7 @@ class UIDebuggerFlipperPlugin(
this.context.connectionRef.connection = null this.context.connectionRef.connection = null
Log.i(LogTag, "Disconnected") Log.i(LogTag, "Disconnected")
MetadataRegister.clear() MetadataRegister.reset()
context.treeObserverManager.stop() context.treeObserverManager.stop()
context.bitmapPool.recycleAll() context.bitmapPool.recycleAll()

View File

@@ -54,7 +54,7 @@ class NativeScanScheduler(val context: Context) : Scheduler.Task<ScanResult> {
} }
private fun sendMetadata() { private fun sendMetadata() {
val metadata = MetadataRegister.dynamicMetadata() val metadata = MetadataRegister.getPendingMetadata()
if (metadata.size > 0) { if (metadata.size > 0) {
context.connectionRef.connection?.send( context.connectionRef.connection?.send(
MetadataUpdateEvent.name, MetadataUpdateEvent.name,

View File

@@ -42,8 +42,7 @@ class FragmentFrameworkDescriptor(val register: DescriptorRegister) :
for (key in args.keySet()) { for (key in args.keySet()) {
val metadata = MetadataRegister.get(NAMESPACE, key) val metadata = MetadataRegister.get(NAMESPACE, key)
val identifier = val identifier =
metadata?.id metadata?.id ?: MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, key)
?: MetadataRegister.registerDynamic(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, key)
when (val value = args[key]) { when (val value = args[key]) {
is Number -> props[identifier] = InspectableValue.Number(value) is Number -> props[identifier] = InspectableValue.Number(value)

View File

@@ -42,7 +42,7 @@ class FragmentSupportDescriptor(val register: DescriptorRegister) :
val metadata = MetadataRegister.get(NAMESPACE, key) val metadata = MetadataRegister.get(NAMESPACE, key)
val identifier = val identifier =
metadata?.id metadata?.id
?: MetadataRegister.registerDynamic(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, key) ?: MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, key)
when (val value = bundle[key]) { when (val value = bundle[key]) {
is Number -> props[identifier] = InspectableValue.Number(value) is Number -> props[identifier] = InspectableValue.Number(value)
is Boolean -> props[identifier] = InspectableValue.Boolean(value) is Boolean -> props[identifier] = InspectableValue.Boolean(value)

View File

@@ -24,29 +24,10 @@ object MetadataRegister {
const val TYPE_DOCUMENTATION = "documentation" const val TYPE_DOCUMENTATION = "documentation"
private var generator: MetadataId = 0 private var generator: MetadataId = 0
private val staticMetadata: MutableMap<String, Metadata> = mutableMapOf() private val register: MutableMap<String, Metadata> = mutableMapOf()
private val dynamicMetadata: MutableMap<String, Metadata> = mutableMapOf() private val pending: MutableSet<String> = mutableSetOf()
private val queried: MutableSet<MetadataId> = mutableSetOf()
fun key(namespace: String, name: String): String = "${namespace}_$name" private fun key(namespace: String, name: String): String = "${namespace}_$name"
private fun register(
metadata: MutableMap<String, Metadata>,
type: String,
namespace: String,
name: String,
mutable: Boolean,
possibleValues: Set<InspectableValue>?
): MetadataId {
val key = key(namespace, name)
metadata[key]?.let { m ->
return m.id
}
val identifier = ++generator
metadata[key] = Metadata(identifier, type, namespace, name, mutable, possibleValues)
return identifier
}
fun register( fun register(
type: String, type: String,
@@ -55,46 +36,43 @@ object MetadataRegister {
mutable: Boolean = false, mutable: Boolean = false,
possibleValues: Set<InspectableValue>? = emptySet() possibleValues: Set<InspectableValue>? = emptySet()
): MetadataId { ): MetadataId {
return register(staticMetadata, type, namespace, name, mutable, possibleValues) val key = key(namespace, name)
} register[key]?.let { m ->
return m.id
}
fun registerDynamic( val identifier = ++generator
type: String, val metadata = Metadata(identifier, type, namespace, name, mutable, possibleValues)
namespace: String,
name: String, register[key] = metadata
mutable: Boolean = false, pending.add(key)
possibleValues: Set<InspectableValue>? = emptySet()
): MetadataId { return identifier
return register(dynamicMetadata, type, namespace, name, mutable, possibleValues)
} }
fun get(namespace: String, name: String): Metadata? { fun get(namespace: String, name: String): Metadata? {
val key = key(namespace, name) val key = key(namespace, name)
staticMetadata[key]?.let { return register[key]
return it
}
return dynamicMetadata[key]
} }
fun staticMetadata(): Map<MetadataId, Metadata> { fun getMetadata(): Map<MetadataId, Metadata> {
val metadata: MutableMap<MetadataId, Metadata> = mutableMapOf() val metadata: MutableMap<MetadataId, Metadata> = mutableMapOf()
staticMetadata.forEach { entry -> metadata[entry.value.id] = entry.value } register.forEach { entry -> metadata[entry.value.id] = entry.value }
return metadata
}
fun dynamicMetadata(): Map<MetadataId, Metadata> {
val metadata: MutableMap<MetadataId, Metadata> = mutableMapOf()
dynamicMetadata.forEach { entry ->
if (!queried.contains(entry.value.id)) {
metadata[entry.value.id] = entry.value
queried.add(entry.value.id)
}
}
return metadata return metadata
} }
fun clear() { fun getPendingMetadata(): Map<MetadataId, Metadata> {
queried.clear() val pendingMetadata: MutableMap<MetadataId, Metadata> = mutableMapOf()
pending.forEach { key ->
register[key]?.let { metadata -> pendingMetadata[metadata.id] = metadata }
}
return pendingMetadata
}
fun reset() {
pending.clear()
register.forEach { entry -> pending.add(entry.key) }
} }
} }

View File

@@ -79,8 +79,7 @@ object WindowDescriptor : ChainedDescriptor<Window>() {
val metadata = MetadataRegister.get(NAMESPACE, name) val metadata = MetadataRegister.get(NAMESPACE, name)
val identifier = val identifier =
metadata?.id metadata?.id
?: MetadataRegister.registerDynamic( ?: MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, name)
MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, name)
when (typedValue.type) { when (typedValue.type) {
TypedValue.TYPE_STRING -> TypedValue.TYPE_STRING ->

View File

@@ -90,7 +90,7 @@ class TreeObserverManager(val context: Context) {
} }
private fun sendMetadata() { private fun sendMetadata() {
val metadata = MetadataRegister.dynamicMetadata() val metadata = MetadataRegister.getPendingMetadata()
if (metadata.size > 0) { if (metadata.size > 0) {
context.connectionRef.connection?.send( context.connectionRef.connection?.send(
MetadataUpdateEvent.name, MetadataUpdateEvent.name,