Skip to content

Commit 7f301c1

Browse files
chore: separate the start and end methods of screenRenderCollector
1 parent e7c05cf commit 7f301c1

File tree

6 files changed

+95
-63
lines changed

6 files changed

+95
-63
lines changed

example/lib/main.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ void main() {
4444

4545
Instabug.init(
4646
token: 'ed6f659591566da19b67857e1b9d40ab',
47+
// token: '4d75635ae06e5afb4360c04cfcf1987c',
4748
invocationEvents: [InvocationEvent.floatingButton],
4849
debugLogsLevel: LogLevel.verbose,
4950
).then((_) {

lib/src/modules/apm.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,9 @@ class APM {
196196
(_) async {
197197
// Start screen render collector for custom ui trace if enabled.
198198
if (await FlagsConfig.screenRendering.isEnabled()) {
199+
InstabugScreenRenderManager.I.endScreenRenderCollector();
200+
201+
// final uiTraceId = IBGDateTime.I.now().millisecondsSinceEpoch;
199202
InstabugScreenRenderManager.I
200203
.startScreenRenderCollectorForTraceId(0, UiTraceType.custom);
201204
}
@@ -211,7 +214,7 @@ class APM {
211214
// End screen render collector for custom ui trace if enabled.
212215
if (InstabugScreenRenderManager.I.screenRenderEnabled) {
213216
return InstabugScreenRenderManager.I
214-
.endScreenRenderCollectorForCustomUiTrace();
217+
.endScreenRenderCollector();
215218
}
216219

217220
return _host.endUITrace();

lib/src/utils/instabug_navigator_observer.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'dart:async';
2+
import 'dart:developer';
23

34
import 'package:flutter/material.dart';
45
import 'package:instabug_flutter/instabug_flutter.dart';
@@ -27,6 +28,7 @@ class InstabugNavigatorObserver extends NavigatorObserver {
2728
name: maskedScreenName,
2829
);
2930

31+
InstabugScreenRenderManager.I.endScreenRenderCollector();
3032
ScreenLoadingManager.I
3133
.startUiTrace(maskedScreenName, screenName)
3234
.then(_startScreenRenderCollector);
@@ -67,6 +69,7 @@ class InstabugNavigatorObserver extends NavigatorObserver {
6769

6870
FutureOr<void> _startScreenRenderCollector(int? uiTraceId) async {
6971
final isScreenRenderEnabled = await FlagsConfig.screenRendering.isEnabled();
72+
log("isScreenRenderEnabled $isScreenRenderEnabled" , name: "Andrew");
7073
await _checkForScreenRenderInitialization(isScreenRenderEnabled);
7174
if (uiTraceId != null && isScreenRenderEnabled) {
7275
InstabugScreenRenderManager.I

lib/src/utils/screen_rendering/instabug_screen_render_manager.dart

Lines changed: 29 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -132,73 +132,68 @@ class InstabugScreenRenderManager {
132132
return;
133133
}
134134

135-
//Save the memory cached data to be sent to native side
136-
if (_delayedFrames.isNotEmpty) {
137-
_saveCollectedData();
138-
_resetCachedFrameData();
139-
}
140-
141-
//Sync the captured screen render data of the Custom UI trace when starting new one
142135
if (type == UiTraceType.custom) {
143-
// Report only if the collector was active
144-
if (_screenRenderForCustomUiTrace.isActive) {
145-
_reportScreenRenderForCustomUiTrace(_screenRenderForCustomUiTrace);
146-
_screenRenderForCustomUiTrace.clear();
147-
}
148136
_screenRenderForCustomUiTrace.traceId = traceId;
149137
}
150138

151-
//Sync the captured screen render data of the Auto UI trace when starting new one
152139
if (type == UiTraceType.auto) {
153-
// Report only if the collector was active
154-
if (_screenRenderForAutoUiTrace.isActive) {
155-
_reportScreenRenderForAutoUiTrace(_screenRenderForAutoUiTrace);
156-
_screenRenderForAutoUiTrace.clear();
157-
}
158140
_screenRenderForAutoUiTrace.traceId = traceId;
159141
}
160142
} catch (error, stackTrace) {
161143
_logExceptionErrorAndStackTrace(error, stackTrace);
162144
}
163145
}
164146

165-
/// Stop screen render collector and sync the captured data.
166147
@internal
167-
void stopScreenRenderCollector() {
148+
void endScreenRenderCollector([
149+
UiTraceType type = UiTraceType.auto,
150+
]) {
168151
try {
152+
// Return if frameTimingListener not attached
153+
if (!screenRenderEnabled || !_isTimingsListenerAttached) {
154+
return;
155+
}
156+
157+
//Save the memory cached data to be sent to native side
169158
if (_delayedFrames.isNotEmpty) {
170159
_saveCollectedData();
160+
_resetCachedFrameData();
171161
}
172162

173-
// Sync Screen Render data for custom ui trace if exists
174-
if (_screenRenderForCustomUiTrace.isActive) {
163+
//Sync the captured screen render data of the Custom UI trace if the collector was active
164+
if (type == UiTraceType.custom &&
165+
_screenRenderForCustomUiTrace.isActive) {
175166
_reportScreenRenderForCustomUiTrace(_screenRenderForCustomUiTrace);
167+
_screenRenderForCustomUiTrace.clear();
176168
}
177169

178-
// Sync Screen Render data for auto ui trace if exists
179-
if (_screenRenderForAutoUiTrace.isActive) {
170+
//Sync the captured screen render data of the Auto UI trace if the collector was active
171+
if (type == UiTraceType.auto && _screenRenderForAutoUiTrace.isActive) {
180172
_reportScreenRenderForAutoUiTrace(_screenRenderForAutoUiTrace);
173+
_screenRenderForAutoUiTrace.clear();
181174
}
182175
} catch (error, stackTrace) {
183176
_logExceptionErrorAndStackTrace(error, stackTrace);
184177
}
185178
}
186179

187-
/// Sync the capture screen render data of the custom UI trace without stopping the collector.
180+
/// Stop screen render collector and sync the captured data.
188181
@internal
189-
void endScreenRenderCollectorForCustomUiTrace() {
182+
void stopScreenRenderCollector() {
190183
try {
191-
if (!_screenRenderForCustomUiTrace.isActive) {
192-
return;
184+
if (_delayedFrames.isNotEmpty) {
185+
_saveCollectedData();
193186
}
194187

195-
// Save the captured screen rendering data to be synced
196-
_updateCustomUiData();
197-
198-
// Sync the saved screen rendering data
199-
_reportScreenRenderForCustomUiTrace(_screenRenderForCustomUiTrace);
188+
// Sync Screen Render data for custom ui trace if exists
189+
if (_screenRenderForCustomUiTrace.isActive) {
190+
_reportScreenRenderForCustomUiTrace(_screenRenderForCustomUiTrace);
191+
}
200192

201-
_screenRenderForCustomUiTrace.clear();
193+
// Sync Screen Render data for auto ui trace if exists
194+
if (_screenRenderForAutoUiTrace.isActive) {
195+
_reportScreenRenderForAutoUiTrace(_screenRenderForAutoUiTrace);
196+
}
202197
} catch (error, stackTrace) {
203198
_logExceptionErrorAndStackTrace(error, stackTrace);
204199
}

test/apm_test.dart

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -346,13 +346,10 @@ void main() {
346346
() async {
347347
when(mHost.isScreenRenderEnabled()).thenAnswer((_) async => true);
348348
when(mScreenRenderManager.screenRenderEnabled).thenReturn(true);
349-
const traceName = "traceNameTest";
350-
await APM.startUITrace(traceName);
351349
await APM.endUITrace();
352350

353-
verify(mHost.startUITrace(traceName)).called(1);
354351
verify(
355-
mScreenRenderManager.endScreenRenderCollectorForCustomUiTrace(),
352+
mScreenRenderManager.endScreenRenderCollector(),
356353
).called(1);
357354
verifyNever(mHost.endUITrace());
358355
});
@@ -371,7 +368,7 @@ void main() {
371368
mHost.endUITrace(),
372369
).called(1);
373370
verifyNever(
374-
mScreenRenderManager.endScreenRenderCollectorForCustomUiTrace(),
371+
mScreenRenderManager.endScreenRenderCollector(),
375372
);
376373
});
377374
});

test/utils/screen_render/instabug_screen_render_manager_test.dart

Lines changed: 56 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
1+
import 'dart:ui' show FrameTiming;
2+
3+
import 'package:flutter/widgets.dart';
14
import 'package:flutter_test/flutter_test.dart';
25
import 'package:instabug_flutter/instabug_flutter.dart';
6+
import 'package:instabug_flutter/src/generated/apm.api.g.dart';
37
import 'package:instabug_flutter/src/models/instabug_frame_data.dart';
48
import 'package:instabug_flutter/src/models/instabug_screen_render_data.dart';
59
import 'package:instabug_flutter/src/utils/screen_rendering/instabug_screen_render_manager.dart';
10+
import 'package:mockito/annotations.dart';
611
import 'package:mockito/mockito.dart';
712

813
import 'instabug_screen_render_manager_test.mocks.dart';
914

15+
@GenerateMocks([ApmHostApi, WidgetsBinding, FrameTiming])
1016
void main() {
1117
TestWidgetsFlutterBinding.ensureInitialized();
1218

@@ -55,25 +61,6 @@ void main() {
5561
); // the one form initForTesting()
5662
});
5763

58-
test(
59-
'should report data to native when starting new trace from the same type',
60-
() async {
61-
final frameTestData = InstabugScreenRenderData(
62-
traceId: 123,
63-
frameData: [
64-
InstabugFrameData(10000, 200),
65-
InstabugFrameData(20000, 1000),
66-
],
67-
frozenFramesTotalDurationMicro: 1000,
68-
slowFramesTotalDurationMicro: 200,
69-
);
70-
71-
manager.startScreenRenderCollectorForTraceId(frameTestData.traceId);
72-
manager.setFrameData(frameTestData);
73-
manager.startScreenRenderCollectorForTraceId(2);
74-
verify(mApmHost.endScreenRenderForAutoUiTrace(any)).called(1);
75-
});
76-
7764
test('should attach timing listener if it is not attached', () async {
7865
manager.stopScreenRenderCollector(); // this should detach listener safely
7966

@@ -272,7 +259,7 @@ void main() {
272259

273260
manager.setFrameData(frameTestData);
274261

275-
manager.endScreenRenderCollectorForCustomUiTrace();
262+
manager.endScreenRenderCollector();
276263

277264
expect(manager.screenRenderForCustomUiTrace.isActive, false);
278265
expect(manager.screenRenderForCustomUiTrace == frameTestData, false);
@@ -298,11 +285,11 @@ void main() {
298285

299286
manager.setFrameData(frameTestData);
300287

301-
manager.endScreenRenderCollectorForCustomUiTrace();
288+
manager.endScreenRenderCollector();
302289
});
303290

304291
test('should not remove timing callback listener', () {
305-
manager.endScreenRenderCollectorForCustomUiTrace();
292+
manager.endScreenRenderCollector();
306293

307294
verifyNever(mWidgetBinding.removeTimingsCallback(any));
308295
});
@@ -320,7 +307,7 @@ void main() {
320307

321308
manager.startScreenRenderCollectorForTraceId(0, UiTraceType.custom);
322309
manager.setFrameData(frameTestData);
323-
manager.endScreenRenderCollectorForCustomUiTrace();
310+
manager.endScreenRenderCollector(UiTraceType.custom);
324311
verify(mApmHost.endScreenRenderForCustomUiTrace(any)).called(1);
325312
});
326313
});
@@ -419,4 +406,50 @@ void main() {
419406
);
420407
});
421408
});
409+
410+
group('InstabugScreenRenderManager.endScreenRenderCollector', () {
411+
test('should save and reset cached data if delayed frames exist', () {
412+
final frameTestData = InstabugScreenRenderData(
413+
traceId: 123,
414+
frameData: [
415+
InstabugFrameData(10000, 200),
416+
InstabugFrameData(20000, 1000),
417+
],
418+
frozenFramesTotalDurationMicro: 1000,
419+
slowFramesTotalDurationMicro: 200,
420+
);
421+
manager.startScreenRenderCollectorForTraceId(1);
422+
manager.setFrameData(frameTestData);
423+
manager.endScreenRenderCollector();
424+
verify(mApmHost.endScreenRenderForAutoUiTrace(any)).called(1);
425+
expect(manager.screenRenderForAutoUiTrace.isEmpty, true);
426+
expect(manager.screenRenderForAutoUiTrace.isActive, false);
427+
});
428+
429+
test('should report and clear custom trace if type is custom and active',
430+
() {
431+
final frameTestData = InstabugScreenRenderData(
432+
traceId: 123,
433+
frameData: [
434+
InstabugFrameData(10000, 200),
435+
InstabugFrameData(20000, 1000),
436+
],
437+
frozenFramesTotalDurationMicro: 1000,
438+
slowFramesTotalDurationMicro: 200,
439+
);
440+
manager.startScreenRenderCollectorForTraceId(1, UiTraceType.custom);
441+
manager.setFrameData(frameTestData);
442+
manager.endScreenRenderCollector(UiTraceType.custom);
443+
verify(mApmHost.endScreenRenderForCustomUiTrace(any)).called(1);
444+
expect(manager.screenRenderForCustomUiTrace.isEmpty, true);
445+
expect(manager.screenRenderForCustomUiTrace.isActive, false);
446+
});
447+
448+
test('should return early if not enabled or timings not attached', () {
449+
manager.screenRenderEnabled = false;
450+
manager.endScreenRenderCollector();
451+
verifyNever(mApmHost.endScreenRenderForAutoUiTrace(any));
452+
verifyNever(mApmHost.endScreenRenderForCustomUiTrace(any));
453+
});
454+
});
422455
}

0 commit comments

Comments
 (0)