Skip to content

Commit 7064e0e

Browse files
chore: attach screen render collector to the app lifecycle and ui traces , add unit tests.
1 parent c5111cf commit 7064e0e

File tree

11 files changed

+638
-130
lines changed

11 files changed

+638
-130
lines changed

example/lib/main.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ part 'src/components/screen_render.dart';
4848

4949
part 'src/components/animated_box.dart';
5050

51+
part 'src/components/ui_traces_content.dart';
52+
5153
void main() {
5254
runZonedGuarded(
5355
() {
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
part of '../../main.dart';
2+
3+
class UITracesContent extends StatefulWidget {
4+
const UITracesContent({Key? key}) : super(key: key);
5+
6+
@override
7+
State<UITracesContent> createState() => _UITracesContentState();
8+
}
9+
10+
class _UITracesContentState extends State<UITracesContent> {
11+
final traceNameController = TextEditingController();
12+
13+
@override
14+
Widget build(BuildContext context) {
15+
final textTheme = Theme.of(context).textTheme;
16+
return Column(
17+
children: [
18+
InstabugTextField(
19+
label: 'UI Trace name',
20+
labelStyle: textTheme.labelMedium,
21+
controller: traceNameController,
22+
),
23+
SizedBox.fromSize(
24+
size: const Size.fromHeight(10.0),
25+
),
26+
Row(
27+
children: [
28+
Flexible(
29+
flex: 5,
30+
child: InstabugButton.smallFontSize(
31+
text: 'Start UI Trace',
32+
onPressed: () => _startTrace(traceNameController.text),
33+
margin: const EdgeInsetsDirectional.only(
34+
start: 20.0,
35+
end: 10.0,
36+
),
37+
),
38+
),
39+
Flexible(
40+
flex: 5,
41+
child: InstabugButton.smallFontSize(
42+
text: 'End UI Trace',
43+
onPressed: () => _endTrace(),
44+
margin: const EdgeInsetsDirectional.only(
45+
start: 10.0,
46+
end: 20.0,
47+
),
48+
),
49+
),
50+
],
51+
),
52+
53+
],
54+
);
55+
}
56+
57+
void _startTrace(
58+
String traceName, {
59+
int delayInMilliseconds = 0,
60+
}) {
61+
if (traceName.trim().isNotEmpty) {
62+
log('_startTrace — traceName: $traceName, delay in Milliseconds: $delayInMilliseconds');
63+
log('traceName: $traceName');
64+
Future.delayed(Duration(milliseconds: delayInMilliseconds),
65+
() => APM.startUITrace(traceName));
66+
} else {
67+
log('startUITrace - Please enter a trace name');
68+
}
69+
}
70+
71+
void _endTrace() {
72+
log('endUITrace - ');
73+
APM.endUITrace();
74+
}
75+
}

example/lib/src/screens/apm_page.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ class _ApmPageState extends State<ApmPage> {
4040
const TracesContent(),
4141
const SectionTitle('Flows'),
4242
const FlowsContent(),
43+
const SectionTitle('Custom UI Traces'),
44+
const UITracesContent(),
4345
const SectionTitle('Screen Loading'),
4446
SizedBox.fromSize(
4547
size: const Size.fromHeight(12),

lib/src/models/InstabugFrameData.dart

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1-
class InstabugFrameData{
1+
class InstabugFrameData {
22
int startTimeTimestamp;
33
int duration;
44

55
InstabugFrameData(this.startTimeTimestamp, this.duration);
66

77
@override
8-
String toString() => "startTime: $startTimeTimestamp, duration: $duration";
9-
}
8+
String toString() => "start time: $startTimeTimestamp, duration: $duration";
9+
10+
@override
11+
bool operator == (covariant InstabugFrameData other) {
12+
if (identical(this, other)) return true;
13+
return startTimeTimestamp == other.startTimeTimestamp &&
14+
duration == other.duration;
15+
}
16+
}
Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1+
import 'package:flutter/foundation.dart';
12
import 'package:instabug_flutter/src/models/InstabugFrameData.dart';
23

34
class InstabugScreenRenderData {
45
int traceId;
5-
int totalSlowFramesDurations;
6-
int totalFrozenFramesDurations;
6+
int slowFramesTotalDuration;
7+
int frozenFramesTotalDuration;
78
List<InstabugFrameData> frameData;
89

910
InstabugScreenRenderData({
10-
this.totalSlowFramesDurations = 0,
11-
this.totalFrozenFramesDurations = 0,
12-
required this.frameData ,
11+
this.slowFramesTotalDuration = 0,
12+
this.frozenFramesTotalDuration = 0,
13+
required this.frameData,
1314
this.traceId = -1,
1415
});
1516

@@ -19,14 +20,25 @@ class InstabugScreenRenderData {
1920

2021
void clear() {
2122
traceId = -1;
22-
totalFrozenFramesDurations = 0;
23-
totalSlowFramesDurations = 0;
23+
frozenFramesTotalDuration = 0;
24+
slowFramesTotalDuration = 0;
2425
frameData.clear();
2526
}
2627

2728
@override
28-
String toString() => '\nTraceId $traceId\n'
29-
'TotalSlowFramesDurations: $totalSlowFramesDurations\n'
30-
'TotalFrozenFramesDurations $totalFrozenFramesDurations\n'
31-
'FrameData[\n${frameData.map((element) => '\t\n$element')}\n]';
29+
String toString() => '\nTrace Id $traceId\n'
30+
'Slow Frames Total Duration: $slowFramesTotalDuration\n'
31+
'Frozen Frames Total Duration $frozenFramesTotalDuration\n'
32+
'Frame Data[\n${frameData.map((element) => '\t\n$element')}\n]';
33+
34+
@override
35+
bool operator ==(covariant InstabugScreenRenderData other) {
36+
if (identical(this, other)) return true;
37+
return traceId == other.traceId &&
38+
slowFramesTotalDuration == other.slowFramesTotalDuration &&
39+
frozenFramesTotalDuration == other.frozenFramesTotalDuration &&
40+
listEquals(frameData, other.frameData);
41+
}
42+
43+
3244
}

lib/src/modules/apm.dart

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import 'package:instabug_flutter/src/utils/ibg_build_info.dart';
1010
import 'package:instabug_flutter/src/utils/ibg_date_time.dart';
1111
import 'package:instabug_flutter/src/utils/instabug_logger.dart';
1212
import 'package:instabug_flutter/src/utils/screen_loading/screen_loading_manager.dart';
13+
import 'package:instabug_flutter/src/utils/screen_rendering/instabug_screen_render_manager.dart';
14+
import 'package:instabug_flutter/src/utils/ui_trace/flags_config.dart';
1315
import 'package:meta/meta.dart';
1416

1517
class APM {
@@ -189,14 +191,27 @@ class APM {
189191
/// Returns:
190192
/// The method is returning a `Future<void>`.
191193
static Future<void> startUITrace(String name) async {
192-
return _host.startUITrace(name);
194+
return _host.startUITrace(name).then(
195+
(_) async {
196+
// Start screen render collector for custom ui trace if enabled.
197+
if (await FlagsConfig.screenRendering.isEnabled()) {
198+
InstabugScreenRenderManager.I.startScreenRenderCollectorForTraceId(0 ,UiTraceType.custom);
199+
}
200+
},
201+
);
193202
}
194203

195204
/// The [endUITrace] function ends a UI trace.
196205
///
197206
/// Returns:
198207
/// The method is returning a `Future<void>`.
199208
static Future<void> endUITrace() async {
209+
// End screen render collector for custom ui trace if enabled.
210+
if (await FlagsConfig.screenRendering.isEnabled()) {
211+
return InstabugScreenRenderManager.I
212+
.endScreenRenderCollectorForCustomUiTrace();
213+
}
214+
200215
return _host.endUITrace();
201216
}
202217

@@ -353,7 +368,7 @@ class APM {
353368
/// Returns:
354369
/// A Future<bool> is being returned.
355370
@internal
356-
static Future<bool> isScreenRenderEnabled() async{
371+
static Future<bool> isScreenRenderEnabled() async {
357372
return _host.isScreenRenderEnabled();
358373
}
359374

lib/src/modules/instabug.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import 'dart:typed_data';
1111
import 'dart:ui';
1212

1313
import 'package:flutter/material.dart';
14+
1415
// to maintain supported versions prior to Flutter 3.3
1516
// ignore: unused_import
1617
import 'package:flutter/services.dart';
@@ -23,6 +24,7 @@ import 'package:instabug_flutter/src/utils/instabug_logger.dart';
2324
import 'package:instabug_flutter/src/utils/screen_name_masker.dart';
2425
import 'package:instabug_flutter/src/utils/screen_rendering/instabug_screen_render_manager.dart';
2526
import 'package:instabug_flutter/src/utils/screen_rendering/instabug_widget_binding_observer.dart';
27+
import 'package:instabug_flutter/src/utils/ui_trace/flags_config.dart';
2628
import 'package:meta/meta.dart';
2729

2830
enum InvocationEvent {
@@ -194,7 +196,10 @@ class Instabug {
194196
debugLogsLevel.toString(),
195197
);
196198

197-
await InstabugScreenRenderManager.I.init();
199+
if (await FlagsConfig.screenRendering.isEnabled()) {
200+
checkForWidgetBinding();
201+
await InstabugScreenRenderManager.I.init(WidgetsBinding.instance);
202+
}
198203

199204
return FeatureFlagsManager().registerW3CFlagsListener();
200205
}

lib/src/utils/screen_rendering/instabug_frame_tracking.dart

Lines changed: 0 additions & 43 deletions
This file was deleted.

0 commit comments

Comments
 (0)