Skip to content

fix: use a fallback for empty screen names #505

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Sep 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 5 additions & 1 deletion lib/src/utils/instabug_navigator_observer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand All @@ -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(
Expand Down
3 changes: 3 additions & 0 deletions lib/src/utils/repro_steps_constants.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class ReproStepsConstants {
static const emptyScreenFallback = 'N/A';
}
5 changes: 2 additions & 3 deletions lib/src/utils/screen_loading/screen_loading_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
5 changes: 2 additions & 3 deletions lib/src/utils/screen_name_masker.dart
Original file line number Diff line number Diff line change
@@ -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);

Expand All @@ -14,8 +15,6 @@ class ScreenNameMasker {
/// Shorthand for [instance]
static ScreenNameMasker get I => instance;

static const emptyScreenNameFallback = "N/A";

ScreenNameMaskingCallback? _screenNameMaskingCallback;

@visibleForTesting
Expand All @@ -37,7 +36,7 @@ class ScreenNameMasker {
final maskedScreen = _screenNameMaskingCallback!(screen).trim();

if (maskedScreen.isEmpty) {
return emptyScreenNameFallback;
return ReproStepsConstants.emptyScreenFallback;
}

return maskedScreen;
Expand Down
19 changes: 19 additions & 0 deletions test/utils/instabug_navigator_observer_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down