Skip to content

Commit 55340b3

Browse files
Merge pull request #617 from Instabug/feat/screen-render-updates
feat/screen-render-updates
2 parents 67c817b + 2018d9f commit 55340b3

File tree

10 files changed

+118
-79
lines changed

10 files changed

+118
-79
lines changed

example/ios/Podfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ target 'Runner' do
3030

3131
use_frameworks!
3232
use_modular_headers!
33-
pod 'Instabug', :podspec => 'https://ios-releases.instabug.com/custom/faeture-screen_rendering-release/15.1.17/Instabug.podspec'
33+
pod 'Instabug', :podspec => 'https://ios-releases.instabug.com/custom/faeture-screen_rendering-release/15.1.23/Instabug.podspec'
3434
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
3535
end
3636

example/ios/Podfile.lock

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
PODS:
22
- Flutter (1.0.0)
3-
- Instabug (15.1.17)
3+
- Instabug (15.1.23)
44
- instabug_flutter (14.3.0):
55
- Flutter
6-
- Instabug (= 15.1.17)
6+
- Instabug (= 15.1.23)
77
- OCMock (3.6)
88

99
DEPENDENCIES:
1010
- Flutter (from `Flutter`)
11-
- Instabug (from `https://ios-releases.instabug.com/custom/faeture-screen_rendering-release/15.1.17/Instabug.podspec`)
11+
- Instabug (from `https://ios-releases.instabug.com/custom/faeture-screen_rendering-release/15.1.23/Instabug.podspec`)
1212
- instabug_flutter (from `.symlinks/plugins/instabug_flutter/ios`)
1313
- OCMock (= 3.6)
1414

@@ -20,16 +20,16 @@ EXTERNAL SOURCES:
2020
Flutter:
2121
:path: Flutter
2222
Instabug:
23-
:podspec: https://ios-releases.instabug.com/custom/faeture-screen_rendering-release/15.1.17/Instabug.podspec
23+
:podspec: https://ios-releases.instabug.com/custom/faeture-screen_rendering-release/15.1.23/Instabug.podspec
2424
instabug_flutter:
2525
:path: ".symlinks/plugins/instabug_flutter/ios"
2626

2727
SPEC CHECKSUMS:
2828
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
29-
Instabug: 316559a02c9b752a3854a6453c2fa414d36252f3
30-
instabug_flutter: 7ae7f3d1c47b9a699e76a7358b6a3e818a253ac3
29+
Instabug: b4659339dc6f67693cf9bd1224abc66831b8722f
30+
instabug_flutter: eeb2e13eefca00e94de1f9156df4889f5481506a
3131
OCMock: 5ea90566be239f179ba766fd9fbae5885040b992
3232

33-
PODFILE CHECKSUM: 8f3e14dab36cc02b0a8767c3086e109fadaa55f3
33+
PODFILE CHECKSUM: 6d8ca5577997736d9cc2249886c9f6d10238385d
3434

3535
COCOAPODS: 1.15.2

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((_) {

ios/instabug_flutter.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@ Pod::Spec.new do |s|
1717
s.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '-framework "Flutter" -framework "InstabugSDK"'}
1818

1919
s.dependency 'Flutter'
20-
s.dependency 'Instabug', '15.1.17'
20+
s.dependency 'Instabug', '15.1.23'
2121
end
2222

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: 42 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'dart:async';
2+
import 'dart:developer' show log;
23
import 'dart:ui' show TimingsCallback, FrameTiming, FramePhase;
34

45
import 'package:flutter/widgets.dart';
@@ -131,73 +132,68 @@ class InstabugScreenRenderManager {
131132
return;
132133
}
133134

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

150-
//Sync the captured screen render data of the Auto UI trace when starting new one
151139
if (type == UiTraceType.auto) {
152-
// Report only if the collector was active
153-
if (_screenRenderForAutoUiTrace.isActive) {
154-
_reportScreenRenderForAutoUiTrace(_screenRenderForAutoUiTrace);
155-
_screenRenderForAutoUiTrace.clear();
156-
}
157140
_screenRenderForAutoUiTrace.traceId = traceId;
158141
}
159142
} catch (error, stackTrace) {
160143
_logExceptionErrorAndStackTrace(error, stackTrace);
161144
}
162145
}
163146

164-
/// Stop screen render collector and sync the captured data.
165147
@internal
166-
void stopScreenRenderCollector() {
148+
void endScreenRenderCollector([
149+
UiTraceType type = UiTraceType.auto,
150+
]) {
167151
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
168158
if (_delayedFrames.isNotEmpty) {
169159
_saveCollectedData();
160+
_resetCachedFrameData();
170161
}
171162

172-
// Sync Screen Render data for custom ui trace if exists
173-
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) {
174166
_reportScreenRenderForCustomUiTrace(_screenRenderForCustomUiTrace);
167+
_screenRenderForCustomUiTrace.clear();
175168
}
176169

177-
// Sync Screen Render data for auto ui trace if exists
178-
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) {
179172
_reportScreenRenderForAutoUiTrace(_screenRenderForAutoUiTrace);
173+
_screenRenderForAutoUiTrace.clear();
180174
}
181175
} catch (error, stackTrace) {
182176
_logExceptionErrorAndStackTrace(error, stackTrace);
183177
}
184178
}
185179

186-
/// 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.
187181
@internal
188-
void endScreenRenderCollectorForCustomUiTrace() {
182+
void stopScreenRenderCollector() {
189183
try {
190-
if (!_screenRenderForCustomUiTrace.isActive) {
191-
return;
184+
if (_delayedFrames.isNotEmpty) {
185+
_saveCollectedData();
192186
}
193187

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

200-
_screenRenderForCustomUiTrace.clear();
193+
// Sync Screen Render data for auto ui trace if exists
194+
if (_screenRenderForAutoUiTrace.isActive) {
195+
_reportScreenRenderForAutoUiTrace(_screenRenderForAutoUiTrace);
196+
}
201197
} catch (error, stackTrace) {
202198
_logExceptionErrorAndStackTrace(error, stackTrace);
203199
}
@@ -300,6 +296,10 @@ class InstabugScreenRenderManager {
300296

301297
/// Save Slow/Frozen Frames data
302298
void _onDelayedFrameDetected(int startTime, int durationInMicroseconds) {
299+
log(
300+
"${durationInMicroseconds >= 700000 ? "🚨Frozen" : "⚠️Slow"} Frame Detected (startTime: $startTime, duration: $durationInMicroseconds µs)",
301+
name: tag,
302+
);
303303
_delayedFrames.add(
304304
InstabugFrameData(
305305
startTime,
@@ -315,6 +315,10 @@ class InstabugScreenRenderManager {
315315
InstabugScreenRenderData screenRenderData,
316316
) async {
317317
try {
318+
log(
319+
"reportScreenRenderForCustomUiTrace $screenRenderData",
320+
name: tag,
321+
);
318322
await APM.endScreenRenderForCustomUiTrace(screenRenderData);
319323
return true;
320324
} catch (error, stackTrace) {
@@ -332,6 +336,10 @@ class InstabugScreenRenderManager {
332336
try {
333337
// Save the end time for the running ui trace, it's only needed in Android SDK.
334338
screenRenderData.saveEndTime();
339+
log(
340+
"reportScreenRenderForAutoUiTrace $screenRenderData",
341+
name: tag,
342+
);
335343
await APM.endScreenRenderForAutoUiTrace(screenRenderData);
336344

337345
return true;

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: 50 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -55,25 +55,6 @@ void main() {
5555
); // the one form initForTesting()
5656
});
5757

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-
7758
test('should attach timing listener if it is not attached', () async {
7859
manager.stopScreenRenderCollector(); // this should detach listener safely
7960

@@ -272,7 +253,7 @@ void main() {
272253

273254
manager.setFrameData(frameTestData);
274255

275-
manager.endScreenRenderCollectorForCustomUiTrace();
256+
manager.endScreenRenderCollector();
276257

277258
expect(manager.screenRenderForCustomUiTrace.isActive, false);
278259
expect(manager.screenRenderForCustomUiTrace == frameTestData, false);
@@ -298,11 +279,11 @@ void main() {
298279

299280
manager.setFrameData(frameTestData);
300281

301-
manager.endScreenRenderCollectorForCustomUiTrace();
282+
manager.endScreenRenderCollector();
302283
});
303284

304285
test('should not remove timing callback listener', () {
305-
manager.endScreenRenderCollectorForCustomUiTrace();
286+
manager.endScreenRenderCollector();
306287

307288
verifyNever(mWidgetBinding.removeTimingsCallback(any));
308289
});
@@ -320,7 +301,7 @@ void main() {
320301

321302
manager.startScreenRenderCollectorForTraceId(0, UiTraceType.custom);
322303
manager.setFrameData(frameTestData);
323-
manager.endScreenRenderCollectorForCustomUiTrace();
304+
manager.endScreenRenderCollector(UiTraceType.custom);
324305
verify(mApmHost.endScreenRenderForCustomUiTrace(any)).called(1);
325306
});
326307
});
@@ -419,4 +400,50 @@ void main() {
419400
);
420401
});
421402
});
403+
404+
group('InstabugScreenRenderManager.endScreenRenderCollector', () {
405+
test('should save and reset cached data if delayed frames exist', () {
406+
final frameTestData = InstabugScreenRenderData(
407+
traceId: 123,
408+
frameData: [
409+
InstabugFrameData(10000, 200),
410+
InstabugFrameData(20000, 1000),
411+
],
412+
frozenFramesTotalDurationMicro: 1000,
413+
slowFramesTotalDurationMicro: 200,
414+
);
415+
manager.startScreenRenderCollectorForTraceId(1);
416+
manager.setFrameData(frameTestData);
417+
manager.endScreenRenderCollector();
418+
verify(mApmHost.endScreenRenderForAutoUiTrace(any)).called(1);
419+
expect(manager.screenRenderForAutoUiTrace.isEmpty, true);
420+
expect(manager.screenRenderForAutoUiTrace.isActive, false);
421+
});
422+
423+
test('should report and clear custom trace if type is custom and active',
424+
() {
425+
final frameTestData = InstabugScreenRenderData(
426+
traceId: 123,
427+
frameData: [
428+
InstabugFrameData(10000, 200),
429+
InstabugFrameData(20000, 1000),
430+
],
431+
frozenFramesTotalDurationMicro: 1000,
432+
slowFramesTotalDurationMicro: 200,
433+
);
434+
manager.startScreenRenderCollectorForTraceId(1, UiTraceType.custom);
435+
manager.setFrameData(frameTestData);
436+
manager.endScreenRenderCollector(UiTraceType.custom);
437+
verify(mApmHost.endScreenRenderForCustomUiTrace(any)).called(1);
438+
expect(manager.screenRenderForCustomUiTrace.isEmpty, true);
439+
expect(manager.screenRenderForCustomUiTrace.isActive, false);
440+
});
441+
442+
test('should return early if not enabled or timings not attached', () {
443+
manager.screenRenderEnabled = false;
444+
manager.endScreenRenderCollector();
445+
verifyNever(mApmHost.endScreenRenderForAutoUiTrace(any));
446+
verifyNever(mApmHost.endScreenRenderForCustomUiTrace(any));
447+
});
448+
});
422449
}

0 commit comments

Comments
 (0)