Skip to content

Commit 2266836

Browse files
Merge pull request #610 from Instabug/feat/screen-render-testing
chore: update capture screen rendering logic
2 parents e07363c + d84e96f commit 2266836

File tree

6 files changed

+34
-44
lines changed

6 files changed

+34
-44
lines changed

android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ android {
5252
}
5353

5454
dependencies {
55-
api 'com.instabug.library:instabug:15.0.0.6969715-SNAPSHOT'
55+
api 'com.instabug.library:instabug:15.0.2.7020723-SNAPSHOT'
5656
testImplementation 'junit:junit:4.13.2'
5757
testImplementation "org.mockito:mockito-inline:3.12.1"
5858
testImplementation "io.mockk:mockk:1.13.13"

example/pubspec.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ packages:
107107
path: ".."
108108
relative: true
109109
source: path
110-
version: "14.3.0"
110+
version: "15.0.2"
111111
instabug_http_client:
112112
dependency: "direct main"
113113
description:

lib/src/utils/screen_loading/screen_loading_manager.dart

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,10 +148,6 @@ class ScreenLoadingManager {
148148
try {
149149
resetDidStartScreenLoading();
150150

151-
final isSDKBuilt =
152-
await _checkInstabugSDKBuilt("APM.InstabugCaptureScreenLoading");
153-
if (!isSDKBuilt) return null;
154-
155151
// TODO: On Android, FlagsConfig.apm.isEnabled isn't implemented correctly
156152
// so we skip the isApmEnabled check on Android and only check on iOS.
157153
// This is a temporary fix until we implement the isEnabled check correctly.

lib/src/utils/screen_rendering/instabug_screen_render_manager.dart

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,10 @@ class InstabugScreenRenderManager {
2626
late InstabugScreenRenderData _screenRenderForCustomUiTrace;
2727
int _slowFramesTotalDurationMs = 0;
2828
int _frozenFramesTotalDurationMs = 0;
29+
int? _epochOffset;
2930
bool _isTimingsListenerAttached = false;
3031
bool screenRenderEnabled = false;
31-
int? _epochOffset;
32+
bool _isWidgetBindingObserverAdded = false;
3233

3334
final List<InstabugFrameData> _delayedFrames = [];
3435

@@ -139,9 +140,8 @@ class InstabugScreenRenderManager {
139140

140141
//Sync the captured screen render data of the Custom UI trace when starting new one
141142
if (type == UiTraceType.custom) {
142-
// Report only if the collector was active and has captured data
143-
if (_screenRenderForCustomUiTrace.isActive &&
144-
_screenRenderForCustomUiTrace.isNotEmpty) {
143+
// Report only if the collector was active
144+
if (_screenRenderForCustomUiTrace.isActive) {
145145
_reportScreenRenderForCustomUiTrace(_screenRenderForCustomUiTrace);
146146
_screenRenderForCustomUiTrace.clear();
147147
}
@@ -150,9 +150,8 @@ class InstabugScreenRenderManager {
150150

151151
//Sync the captured screen render data of the Auto UI trace when starting new one
152152
if (type == UiTraceType.auto) {
153-
// Report only if the collector was active and has captured data
154-
if (_screenRenderForAutoUiTrace.isActive &&
155-
_screenRenderForAutoUiTrace.isNotEmpty) {
153+
// Report only if the collector was active
154+
if (_screenRenderForAutoUiTrace.isActive) {
156155
_reportScreenRenderForAutoUiTrace(_screenRenderForAutoUiTrace);
157156
_screenRenderForAutoUiTrace.clear();
158157
}
@@ -172,14 +171,12 @@ class InstabugScreenRenderManager {
172171
}
173172

174173
// Sync Screen Render data for custom ui trace if exists
175-
if (_screenRenderForCustomUiTrace.isActive &&
176-
_screenRenderForCustomUiTrace.isNotEmpty) {
174+
if (_screenRenderForCustomUiTrace.isActive) {
177175
_reportScreenRenderForCustomUiTrace(_screenRenderForCustomUiTrace);
178176
}
179177

180178
// Sync Screen Render data for auto ui trace if exists
181-
if (_screenRenderForAutoUiTrace.isActive &&
182-
_screenRenderForAutoUiTrace.isNotEmpty) {
179+
if (_screenRenderForAutoUiTrace.isActive) {
183180
_reportScreenRenderForAutoUiTrace(_screenRenderForAutoUiTrace);
184181
}
185182
} catch (error, stackTrace) {
@@ -211,6 +208,7 @@ class InstabugScreenRenderManager {
211208
void dispose() {
212209
_resetCachedFrameData();
213210
_removeFrameTimings();
211+
_removeWidgetBindingObserver();
214212
_widgetsBinding = null;
215213
screenRenderEnabled = false;
216214
}
@@ -244,8 +242,26 @@ class InstabugScreenRenderManager {
244242
APM.getDeviceRefreshRate();
245243

246244
/// add new [WidgetsBindingObserver] to track app lifecycle.
247-
void _addWidgetBindingObserver() =>
248-
_widgetsBinding?.addObserver(InstabugWidgetsBindingObserver.instance);
245+
void _addWidgetBindingObserver() {
246+
if (_widgetsBinding == null) {
247+
return;
248+
}
249+
if (!_isWidgetBindingObserverAdded) {
250+
_widgetsBinding!.addObserver(InstabugWidgetsBindingObserver.instance);
251+
_isWidgetBindingObserverAdded = true;
252+
}
253+
}
254+
255+
/// remove [WidgetsBindingObserver] from [WidgetsBinding]
256+
void _removeWidgetBindingObserver() {
257+
if (_widgetsBinding == null) {
258+
return;
259+
}
260+
if (_isWidgetBindingObserverAdded) {
261+
_widgetsBinding!.removeObserver(InstabugWidgetsBindingObserver.instance);
262+
_isWidgetBindingObserverAdded = false;
263+
}
264+
}
249265

250266
/// Initialize the static variables
251267
Future<void> _initStaticValues() async {

lib/src/utils/screen_rendering/instabug_widget_binding_observer.dart

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,9 @@ class InstabugWidgetsBindingObserver extends WidgetsBindingObserver {
2020
static const tag = "InstabugWidgetsBindingObserver";
2121

2222
static void dispose() {
23-
if (InstabugScreenRenderManager.I.screenRenderEnabled) {
24-
InstabugScreenRenderManager.I.dispose();
25-
}
26-
// For Flutter 2.10.5 version
27-
// ignore: invalid_null_aware_operator
28-
WidgetsBinding.instance?.removeObserver(_instance);
23+
// Always call dispose to ensure proper cleanup with tracking flags
24+
// The dispose method is safe to call multiple times due to state tracking
25+
InstabugScreenRenderManager.I.dispose();
2926
}
3027

3128
void _handleResumedState() {

test/utils/screen_loading/screen_loading_manager_test.dart

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -168,25 +168,6 @@ void main() {
168168
when(mDateTime.now()).thenReturn(time);
169169
});
170170

171-
test('[startUiTrace] with SDK not build should Log error', () async {
172-
mScreenLoadingManager.currentUiTrace = uiTrace;
173-
when(mInstabugHost.isBuilt()).thenAnswer((_) async => false);
174-
175-
await ScreenLoadingManager.I.startUiTrace(screenName);
176-
177-
final actualUiTrace = ScreenLoadingManager.I.currentUiTrace;
178-
expect(actualUiTrace, null);
179-
180-
verify(
181-
mInstabugLogger.e(
182-
'Instabug API {APM.InstabugCaptureScreenLoading} was called before the SDK is built. To build it, first by following the instructions at this link:\n'
183-
'https://docs.instabug.com/reference#showing-and-manipulating-the-invocation',
184-
tag: APM.tag,
185-
),
186-
).called(1);
187-
verifyNever(mApmHost.startCpUiTrace(any, any, any));
188-
});
189-
190171
test('[startUiTrace] with APM disabled on iOS Platform should Log error',
191172
() async {
192173
mScreenLoadingManager.currentUiTrace = uiTrace;

0 commit comments

Comments
 (0)