diff --git a/dialer/lib/features/composition/composition.dart b/dialer/lib/features/composition/composition.dart index 5be09be..bb134d3 100644 --- a/dialer/lib/features/composition/composition.dart +++ b/dialer/lib/features/composition/composition.dart @@ -4,7 +4,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_contacts/flutter_contacts.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../services/contact_service.dart'; +import '../../services/obfuscate_service.dart'; // Import ObfuscateService import '../contacts/widgets/add_contact_button.dart'; +import '../../globals.dart' as globals; class CompositionPage extends StatefulWidget { const CompositionPage({super.key}); @@ -19,6 +21,9 @@ class _CompositionPageState extends State { List _filteredContacts = []; final ContactService _contactService = ContactService(); + // Instantiate the ObfuscateService + final ObfuscateService _obfuscateService = ObfuscateService(); + @override void initState() { super.initState(); @@ -114,16 +119,12 @@ class _CompositionPageState extends State { : 'No phone number'; return ListTile( title: Text( - '${contact.displayName.isNotEmpty ? contact.displayName[0] : ''}...${contact.displayName.isNotEmpty ? contact.displayName[contact.displayName.length - 1] : ''}', - // contact.displayName - style: - const TextStyle(color: Colors.white), + _obfuscateService.obfuscateData(contact.displayName), + style: const TextStyle(color: Colors.white), ), subtitle: Text( - '${phoneNumber.isNotEmpty ? phoneNumber[0] : ''}...${phoneNumber.isNotEmpty ? phoneNumber[phoneNumber.length - 1] : ''}', - // phoneNumber, - style: - const TextStyle(color: Colors.grey), + _obfuscateService.obfuscateData(phoneNumber), + style: const TextStyle(color: Colors.grey), ), trailing: Row( mainAxisSize: MainAxisSize.min, diff --git a/dialer/lib/globals.dart b/dialer/lib/globals.dart new file mode 100644 index 0000000..2750ab2 --- /dev/null +++ b/dialer/lib/globals.dart @@ -0,0 +1 @@ +bool isStealthMode = false; \ No newline at end of file diff --git a/dialer/lib/main.dart b/dialer/lib/main.dart index a9ca957..1c14689 100644 --- a/dialer/lib/main.dart +++ b/dialer/lib/main.dart @@ -1,13 +1,16 @@ import 'package:dialer/features/home/home_page.dart'; import 'package:flutter/material.dart'; import 'package:dialer/features/contacts/contact_state.dart'; +import 'globals.dart' as globals; void main() { - runApp(const MyApp()); + globals.isStealthMode = String.fromEnvironment('STEALTH', defaultValue: 'false') == 'true'; + + runApp(const Dialer()); } -class MyApp extends StatelessWidget { - const MyApp({super.key}); +class Dialer extends StatelessWidget { + const Dialer({super.key}); @override Widget build(BuildContext context) { diff --git a/dialer/lib/services/obfuscate_service.dart b/dialer/lib/services/obfuscate_service.dart new file mode 100644 index 0000000..2eec708 --- /dev/null +++ b/dialer/lib/services/obfuscate_service.dart @@ -0,0 +1,38 @@ +// lib/services/obfuscate_service.dart + +import '../../globals.dart' as globals; + +class ObfuscateService { + // Private constructor + ObfuscateService._privateConstructor(); + + // Singleton instance + static final ObfuscateService _instance = ObfuscateService._privateConstructor(); + + // Factory constructor to return the same instance + factory ObfuscateService() { + return _instance; + } + + // Public method to obfuscate data + String obfuscateData(String data) { + if (globals.isStealthMode) { + return _obfuscateData(data); + } else { + return data; + } + } + + // Private helper method for obfuscation logic + String _obfuscateData(String data) { + if (data.isNotEmpty) { + // Ensure the string has at least two characters to obfuscate + if (data.length == 1) { + return '${data[0]}'; + } else { + return '${data[0]}...${data[data.length - 1]}'; + } + } + return ''; + } +} diff --git a/dialer/test/widget_test.dart b/dialer/test/widget_test.dart index 7b0e078..fd77291 100644 --- a/dialer/test/widget_test.dart +++ b/dialer/test/widget_test.dart @@ -13,7 +13,7 @@ import 'package:dialer/main.dart'; void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); + await tester.pumpWidget(const Dialer(stealthMode: false,)); // Verify that our counter starts at 0. expect(find.text('0'), findsOneWidget);