diff --git a/src/plugins/fresco/index.js b/src/plugins/fresco/index.js index b4d8d2b6b..ea98e4cfa 100644 --- a/src/plugins/fresco/index.js +++ b/src/plugins/fresco/index.js @@ -38,6 +38,7 @@ type PersistedState = { images: ImagesList, events: Array, imagesMap: ImagesMap, + closeableReferenceLeaks: Array, }; type PluginState = { @@ -78,6 +79,7 @@ export default class extends FlipperPlugin { events: [], imagesMap: {}, surfaceList: new Set(), + closeableReferenceLeaks: [], }; static exportPersistedState = ( @@ -98,10 +100,10 @@ export default class extends FlipperPlugin { } const {levels, events, imageDataList} = data; let pluginData: PersistedState = { + ...FlipperPlugin.defaultPersistedState, images: [...levels.levels], - surfaceList: new Set(), - events: [], - imagesMap: {}, + closeableReferenceLeaks: + (persistedState && persistedState.closeableReferenceLeaks) || [], }; events.forEach((event: ImageEventWithId, index) => { @@ -133,11 +135,29 @@ export default class extends FlipperPlugin { }); }; + static persistedStateReducer = ( + persistedState: PersistedState, + method: string, + data: Object, + ): PersistedState => { + if (method == 'closeable_reference_leak_event') { + const event: AndroidCloseableReferenceLeakEvent = data; + return { + ...persistedState, + closeableReferenceLeaks: persistedState.closeableReferenceLeaks.concat( + event, + ), + }; + } + + return persistedState; + }; + static metricsReducer = ( persistedState: PersistedState, ): Promise => { - const {events, imagesMap} = persistedState; - let wastedBytes = events.reduce((acc, event) => { + const {events, imagesMap, closeableReferenceLeaks} = persistedState; + let wastedBytes = (events || []).reduce((acc, event) => { const {viewport, imageIds} = event; if (!viewport) { return acc; @@ -159,7 +179,10 @@ export default class extends FlipperPlugin { }, acc) ); }, 0); - return Promise.resolve({WASTED_BYTES: wastedBytes}); + return Promise.resolve({ + WASTED_BYTES: wastedBytes, + CLOSEABLE_REFERENCE_LEAKS: (closeableReferenceLeaks || []).length, + }); }; state: PluginState; @@ -235,13 +258,6 @@ export default class extends FlipperPlugin { this.setState({isDebugOverlayEnabled: event.enabled}); }, ); - this.client.subscribe( - 'closeable_reference_leak_event', - (event: AndroidCloseableReferenceLeakEvent) => { - // TODO(T45065440): Temporary log, to be turned into counter. - console.warn('CloseableReference leak detected:', event); - }, - ); this.imagePool = new ImagePool(this.getImage, (images: ImagesMap) => this.props.setPersistedState({imagesMap: images}), );