From b0947760c450ee9c7d9e7450d4d884b1ec166dd9 Mon Sep 17 00:00:00 2001 From: Ahmed Mahmoud Date: Thu, 5 Sep 2024 16:54:10 +0300 Subject: [PATCH 1/3] fix: fallback to N/A when for empty screen names --- lib/src/utils/instabug_navigator_observer.dart | 6 +++++- lib/src/utils/repro_steps_constants.dart | 3 +++ lib/src/utils/screen_loading/screen_loading_manager.dart | 5 ++--- lib/src/utils/screen_name_masker.dart | 5 ++--- 4 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 lib/src/utils/repro_steps_constants.dart diff --git a/lib/src/utils/instabug_navigator_observer.dart b/lib/src/utils/instabug_navigator_observer.dart index 57550765c..d9d6b02db 100644 --- a/lib/src/utils/instabug_navigator_observer.dart +++ b/lib/src/utils/instabug_navigator_observer.dart @@ -3,6 +3,7 @@ import 'package:instabug_flutter/instabug_flutter.dart'; import 'package:instabug_flutter/src/models/instabug_route.dart'; import 'package:instabug_flutter/src/modules/instabug.dart'; import 'package:instabug_flutter/src/utils/instabug_logger.dart'; +import 'package:instabug_flutter/src/utils/repro_steps_constants.dart'; import 'package:instabug_flutter/src/utils/screen_loading/screen_loading_manager.dart'; import 'package:instabug_flutter/src/utils/screen_name_masker.dart'; @@ -11,7 +12,10 @@ class InstabugNavigatorObserver extends NavigatorObserver { void screenChanged(Route newRoute) { try { - final screenName = newRoute.settings.name.toString(); + final rawScreenName = newRoute.settings.name.toString().trim(); + final screenName = rawScreenName.isEmpty + ? ReproStepsConstants.emptyScreenFallback + : rawScreenName; final maskedScreenName = ScreenNameMasker.I.mask(screenName); final route = InstabugRoute( diff --git a/lib/src/utils/repro_steps_constants.dart b/lib/src/utils/repro_steps_constants.dart new file mode 100644 index 000000000..c26dc205c --- /dev/null +++ b/lib/src/utils/repro_steps_constants.dart @@ -0,0 +1,3 @@ +class ReproStepsConstants { + static const emptyScreenFallback = 'N/A'; +} diff --git a/lib/src/utils/screen_loading/screen_loading_manager.dart b/lib/src/utils/screen_loading/screen_loading_manager.dart index e95543ee9..816ffebef 100644 --- a/lib/src/utils/screen_loading/screen_loading_manager.dart +++ b/lib/src/utils/screen_loading/screen_loading_manager.dart @@ -110,16 +110,15 @@ class ScreenLoadingManager { @internal String sanitizeScreenName(String screenName) { const characterToBeRemoved = '/'; - final lastIndex = screenName.length - 1; var sanitizedScreenName = screenName; if (screenName == characterToBeRemoved) { return 'ROOT_PAGE'; } - if (screenName[0] == characterToBeRemoved) { + if (screenName.startsWith(characterToBeRemoved)) { sanitizedScreenName = sanitizedScreenName.substring(1); } - if (screenName[lastIndex] == characterToBeRemoved) { + if (screenName.endsWith(characterToBeRemoved)) { sanitizedScreenName = sanitizedScreenName.substring(0, sanitizedScreenName.length - 1); } diff --git a/lib/src/utils/screen_name_masker.dart b/lib/src/utils/screen_name_masker.dart index ef228697f..1c2c4a972 100644 --- a/lib/src/utils/screen_name_masker.dart +++ b/lib/src/utils/screen_name_masker.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:instabug_flutter/src/utils/repro_steps_constants.dart'; typedef ScreenNameMaskingCallback = String Function(String screen); @@ -14,8 +15,6 @@ class ScreenNameMasker { /// Shorthand for [instance] static ScreenNameMasker get I => instance; - static const emptyScreenNameFallback = "N/A"; - ScreenNameMaskingCallback? _screenNameMaskingCallback; @visibleForTesting @@ -37,7 +36,7 @@ class ScreenNameMasker { final maskedScreen = _screenNameMaskingCallback!(screen).trim(); if (maskedScreen.isEmpty) { - return emptyScreenNameFallback; + return ReproStepsConstants.emptyScreenFallback; } return maskedScreen; From cad915d377df489779fc58415939423c16f9de3c Mon Sep 17 00:00:00 2001 From: Ahmed Mahmoud Date: Thu, 5 Sep 2024 17:00:16 +0300 Subject: [PATCH 2/3] test: add test for empty screen fallback --- .../instabug_navigator_observer_test.dart | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/utils/instabug_navigator_observer_test.dart b/test/utils/instabug_navigator_observer_test.dart index f7a6f6a7f..ebf541137 100644 --- a/test/utils/instabug_navigator_observer_test.dart +++ b/test/utils/instabug_navigator_observer_test.dart @@ -92,6 +92,25 @@ void main() { }); }); + test('should fallback to "N/A" when the screen name is empty', () { + fakeAsync((async) { + final route = createRoute(''); + const fallback = 'N/A'; + + observer.didPush(route, previousRoute); + + async.elapse(const Duration(milliseconds: 1000)); + + verify( + mScreenLoadingManager.startUiTrace(fallback, fallback), + ).called(1); + + verify( + mHost.reportScreenChange(fallback), + ).called(1); + }); + }); + test('should mask screen name when masking callback is set', () { const maskedScreen = 'maskedScreen'; From 99eac5fd0a418b0c5bce7b53f57e05e6c69cbf0f Mon Sep 17 00:00:00 2001 From: Ahmed Mahmoud Date: Thu, 5 Sep 2024 17:07:51 +0300 Subject: [PATCH 3/3] chore: add changelog item --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 34e09b698..49278fba8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ - Add support for masking screen names captured by Instabug through the `Instabug.setScreenNameMaskingCallback` API ([#500](https://github.com/Instabug/Instabug-Flutter/pull/500)). +### Fixed + +- Fixed an issue with empty screen names captured in `InstabugNavigatorObserver` and fallback to `N/A` when the screen name is empty ([#505](https://github.com/Instabug/Instabug-Flutter/pull/505)), closes [#504](https://github.com/Instabug/Instabug-Flutter/issues/504). + ## [13.3.0](https://github.com/Instabug/Instabug-Flutter/compare/v13.2.0...v13.3.0) (August 5, 2024) ### Added