Skip to content

Commit d882ac9

Browse files
Merge remote-tracking branch 'origin/feat/screen-render-to-dev' into feat/screen-render-tolerance
# Conflicts: # example/ios/Podfile # example/ios/Podfile.lock # ios/instabug_flutter.podspec
2 parents 61522cf + 55340b3 commit d882ac9

File tree

7 files changed

+850
-65
lines changed

7 files changed

+850
-65
lines changed

example/lib/main.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import 'src/widget/section_title.dart';
2020

2121
part 'src/components/animated_box.dart';
2222
part 'src/components/apm_switch.dart';
23+
2324
part 'src/components/fatal_crashes_content.dart';
2425
part 'src/components/flows_content.dart';
2526
part 'src/components/network_content.dart';
@@ -44,6 +45,7 @@ void main() {
4445

4546
Instabug.init(
4647
token: 'ed6f659591566da19b67857e1b9d40ab',
48+
// token: '4d75635ae06e5afb4360c04cfcf1987c',
4749
invocationEvents: [InvocationEvent.floatingButton],
4850
debugLogsLevel: LogLevel.verbose,
4951
).then((_) {

lib/src/modules/apm.dart

Lines changed: 4 additions & 2 deletions
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
}
@@ -210,8 +213,7 @@ class APM {
210213
static Future<void> endUITrace() async {
211214
// End screen render collector for custom ui trace if enabled.
212215
if (InstabugScreenRenderManager.I.screenRenderEnabled) {
213-
return InstabugScreenRenderManager.I
214-
.endScreenRenderCollectorForCustomUiTrace();
216+
return InstabugScreenRenderManager.I.endScreenRenderCollector();
215217
}
216218

217219
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
@@ -129,73 +129,68 @@ class InstabugScreenRenderManager {
129129
return;
130130
}
131131

132-
//Save the memory cached data to be sent to native side
133-
if (_delayedFrames.isNotEmpty) {
134-
_saveCollectedData();
135-
_resetCachedFrameData();
136-
}
137-
138-
//Sync the captured screen render data of the Custom UI trace when starting new one
139132
if (type == UiTraceType.custom) {
140-
// Report only if the collector was active
141-
if (_screenRenderForCustomUiTrace.isActive) {
142-
_reportScreenRenderForCustomUiTrace(_screenRenderForCustomUiTrace);
143-
_screenRenderForCustomUiTrace.clear();
144-
}
145133
_screenRenderForCustomUiTrace.traceId = traceId;
146134
}
147135

148-
//Sync the captured screen render data of the Auto UI trace when starting new one
149136
if (type == UiTraceType.auto) {
150-
// Report only if the collector was active
151-
if (_screenRenderForAutoUiTrace.isActive) {
152-
_reportScreenRenderForAutoUiTrace(_screenRenderForAutoUiTrace);
153-
_screenRenderForAutoUiTrace.clear();
154-
}
155137
_screenRenderForAutoUiTrace.traceId = traceId;
156138
}
157139
} catch (error, stackTrace) {
158140
_logExceptionErrorAndStackTrace(error, stackTrace);
159141
}
160142
}
161143

162-
/// Stop screen render collector and sync the captured data.
163144
@internal
164-
void stopScreenRenderCollector() {
145+
void endScreenRenderCollector([
146+
UiTraceType type = UiTraceType.auto,
147+
]) {
165148
try {
149+
// Return if frameTimingListener not attached
150+
if (!screenRenderEnabled || !_isTimingsListenerAttached) {
151+
return;
152+
}
153+
154+
//Save the memory cached data to be sent to native side
166155
if (_delayedFrames.isNotEmpty) {
167156
_saveCollectedData();
157+
_resetCachedFrameData();
168158
}
169159

170-
// Sync Screen Render data for custom ui trace if exists
171-
if (_screenRenderForCustomUiTrace.isActive) {
160+
//Sync the captured screen render data of the Custom UI trace if the collector was active
161+
if (type == UiTraceType.custom &&
162+
_screenRenderForCustomUiTrace.isActive) {
172163
_reportScreenRenderForCustomUiTrace(_screenRenderForCustomUiTrace);
164+
_screenRenderForCustomUiTrace.clear();
173165
}
174166

175-
// Sync Screen Render data for auto ui trace if exists
176-
if (_screenRenderForAutoUiTrace.isActive) {
167+
//Sync the captured screen render data of the Auto UI trace if the collector was active
168+
if (type == UiTraceType.auto && _screenRenderForAutoUiTrace.isActive) {
177169
_reportScreenRenderForAutoUiTrace(_screenRenderForAutoUiTrace);
170+
_screenRenderForAutoUiTrace.clear();
178171
}
179172
} catch (error, stackTrace) {
180173
_logExceptionErrorAndStackTrace(error, stackTrace);
181174
}
182175
}
183176

184-
/// Sync the capture screen render data of the custom UI trace without stopping the collector.
177+
/// Stop screen render collector and sync the captured data.
185178
@internal
186-
void endScreenRenderCollectorForCustomUiTrace() {
179+
void stopScreenRenderCollector() {
187180
try {
188-
if (!_screenRenderForCustomUiTrace.isActive) {
189-
return;
181+
if (_delayedFrames.isNotEmpty) {
182+
_saveCollectedData();
190183
}
191184

192-
// Save the captured screen rendering data to be synced
193-
_updateCustomUiData();
194-
195-
// Sync the saved screen rendering data
196-
_reportScreenRenderForCustomUiTrace(_screenRenderForCustomUiTrace);
185+
// Sync Screen Render data for custom ui trace if exists
186+
if (_screenRenderForCustomUiTrace.isActive) {
187+
_reportScreenRenderForCustomUiTrace(_screenRenderForCustomUiTrace);
188+
}
197189

198-
_screenRenderForCustomUiTrace.clear();
190+
// Sync Screen Render data for auto ui trace if exists
191+
if (_screenRenderForAutoUiTrace.isActive) {
192+
_reportScreenRenderForAutoUiTrace(_screenRenderForAutoUiTrace);
193+
}
199194
} catch (error, stackTrace) {
200195
_logExceptionErrorAndStackTrace(error, stackTrace);
201196
}

test/apm_test.dart

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -349,13 +349,10 @@ void main() {
349349
() async {
350350
when(mHost.isScreenRenderEnabled()).thenAnswer((_) async => true);
351351
when(mScreenRenderManager.screenRenderEnabled).thenReturn(true);
352-
const traceName = "traceNameTest";
353-
await APM.startUITrace(traceName);
354352
await APM.endUITrace();
355353

356-
verify(mHost.startUITrace(traceName)).called(1);
357354
verify(
358-
mScreenRenderManager.endScreenRenderCollectorForCustomUiTrace(),
355+
mScreenRenderManager.endScreenRenderCollector(),
359356
).called(1);
360357
verifyNever(mHost.endUITrace());
361358
});
@@ -374,7 +371,7 @@ void main() {
374371
mHost.endUITrace(),
375372
).called(1);
376373
verifyNever(
377-
mScreenRenderManager.endScreenRenderCollectorForCustomUiTrace(),
374+
mScreenRenderManager.endScreenRenderCollector(),
378375
);
379376
});
380377
});

test/utils/screen_render/instabug_screen_render_manager_test.dart

Lines changed: 51 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import 'package:instabug_flutter/src/utils/screen_rendering/instabug_screen_rend
99
import 'package:mockito/annotations.dart';
1010
import 'package:mockito/mockito.dart';
1111

12-
import 'instabug_screen_render_manager_test.mocks.dart';
12+
import 'instabug_screen_render_manager_test_manual_mocks.dart';
1313

1414
@GenerateMocks([ApmHostApi, FrameTiming, WidgetsBinding])
1515
void main() {
@@ -93,25 +93,6 @@ void main() {
9393
); // the one form initForTesting()
9494
});
9595

96-
test(
97-
'should report data to native when starting new trace from the same type',
98-
() async {
99-
final frameTestData = InstabugScreenRenderData(
100-
traceId: 123,
101-
frameData: [
102-
InstabugFrameData(10000, 200),
103-
InstabugFrameData(20000, 1000),
104-
],
105-
frozenFramesTotalDurationMicro: 1000,
106-
slowFramesTotalDurationMicro: 200,
107-
);
108-
109-
manager.startScreenRenderCollectorForTraceId(frameTestData.traceId);
110-
manager.setFrameData(frameTestData);
111-
manager.startScreenRenderCollectorForTraceId(2);
112-
verify(mApmHost.endScreenRenderForAutoUiTrace(any)).called(1);
113-
});
114-
11596
test('should attach timing listener if it is not attached', () async {
11697
manager.stopScreenRenderCollector(); // this should detach listener safely
11798

@@ -310,7 +291,7 @@ void main() {
310291

311292
manager.setFrameData(frameTestData);
312293

313-
manager.endScreenRenderCollectorForCustomUiTrace();
294+
manager.endScreenRenderCollector();
314295

315296
expect(manager.screenRenderForCustomUiTrace.isActive, false);
316297
expect(manager.screenRenderForCustomUiTrace == frameTestData, false);
@@ -336,11 +317,11 @@ void main() {
336317

337318
manager.setFrameData(frameTestData);
338319

339-
manager.endScreenRenderCollectorForCustomUiTrace();
320+
manager.endScreenRenderCollector();
340321
});
341322

342323
test('should not remove timing callback listener', () {
343-
manager.endScreenRenderCollectorForCustomUiTrace();
324+
manager.endScreenRenderCollector();
344325

345326
verifyNever(mWidgetBinding.removeTimingsCallback(any));
346327
});
@@ -358,7 +339,7 @@ void main() {
358339

359340
manager.startScreenRenderCollectorForTraceId(0, UiTraceType.custom);
360341
manager.setFrameData(frameTestData);
361-
manager.endScreenRenderCollectorForCustomUiTrace();
342+
manager.endScreenRenderCollector(UiTraceType.custom);
362343
verify(mApmHost.endScreenRenderForCustomUiTrace(any)).called(1);
363344
});
364345
});
@@ -457,4 +438,50 @@ void main() {
457438
);
458439
});
459440
});
441+
442+
group('InstabugScreenRenderManager.endScreenRenderCollector', () {
443+
test('should save and reset cached data if delayed frames exist', () {
444+
final frameTestData = InstabugScreenRenderData(
445+
traceId: 123,
446+
frameData: [
447+
InstabugFrameData(10000, 200),
448+
InstabugFrameData(20000, 1000),
449+
],
450+
frozenFramesTotalDurationMicro: 1000,
451+
slowFramesTotalDurationMicro: 200,
452+
);
453+
manager.startScreenRenderCollectorForTraceId(1);
454+
manager.setFrameData(frameTestData);
455+
manager.endScreenRenderCollector();
456+
verify(mApmHost.endScreenRenderForAutoUiTrace(any)).called(1);
457+
expect(manager.screenRenderForAutoUiTrace.isEmpty, true);
458+
expect(manager.screenRenderForAutoUiTrace.isActive, false);
459+
});
460+
461+
test('should report and clear custom trace if type is custom and active',
462+
() {
463+
final frameTestData = InstabugScreenRenderData(
464+
traceId: 123,
465+
frameData: [
466+
InstabugFrameData(10000, 200),
467+
InstabugFrameData(20000, 1000),
468+
],
469+
frozenFramesTotalDurationMicro: 1000,
470+
slowFramesTotalDurationMicro: 200,
471+
);
472+
manager.startScreenRenderCollectorForTraceId(1, UiTraceType.custom);
473+
manager.setFrameData(frameTestData);
474+
manager.endScreenRenderCollector(UiTraceType.custom);
475+
verify(mApmHost.endScreenRenderForCustomUiTrace(any)).called(1);
476+
expect(manager.screenRenderForCustomUiTrace.isEmpty, true);
477+
expect(manager.screenRenderForCustomUiTrace.isActive, false);
478+
});
479+
480+
test('should return early if not enabled or timings not attached', () {
481+
manager.screenRenderEnabled = false;
482+
manager.endScreenRenderCollector();
483+
verifyNever(mApmHost.endScreenRenderForAutoUiTrace(any));
484+
verifyNever(mApmHost.endScreenRenderForCustomUiTrace(any));
485+
});
486+
});
460487
}

0 commit comments

Comments
 (0)