monorepo/dialer/lib/features/favorites/favorites_page.dart
AlexisDanlos f3fa38b027
All checks were successful
/ mirror (push) Successful in 4s
feat: implement privacy mode to mask contact names and phone numbers
2025-01-20 20:12:19 +01:00

65 lines
1.8 KiB
Dart

import 'package:dialer/features/contacts/contact_state.dart';
import 'package:dialer/features/contacts/widgets/alphabet_scroll_page.dart';
import 'package:flutter/material.dart';
import 'package:dialer/widgets/loading_indicator.dart';
import 'package:flutter_contacts/flutter_contacts.dart';
const bool _privacyMode = bool.fromEnvironment('privacy-mode', defaultValue: false);
List<Contact> _maskContacts(List<Contact> original) {
if (!_privacyMode) return original;
return original.map((c) {
final maskedName = _maskName(c.displayName);
final phones = c.phones.map((p) => Phone(
_maskPhone(p.number),
label: p.label,
)).toList();
final masked = Contact()
..displayName = maskedName
..thumbnail = c.thumbnail
..phones = phones
..id = c.id;
return masked;
}).toList();
}
String _maskName(String name) {
final parts = name.split(' ');
return parts.map((part) {
if (part.length < 2) return part;
return '${part[0]}${'*' * (part.length - 1)}';
}).join(' ');
}
String _maskPhone(String phone) {
if (phone.length < 3) return phone;
return phone.substring(0, 2) + '*' * (phone.length - 2);
}
class FavoritesPage extends StatefulWidget {
const FavoritesPage({super.key});
@override
_FavoritesPageState createState() => _FavoritesPageState();
}
class _FavoritesPageState extends State<FavoritesPage> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
final contactState = ContactState.of(context);
return Scaffold(
body: contactState.loading
? const LoadingIndicatorWidget()
: AlphabetScrollPage(
scrollOffset: contactState.scrollOffset,
contacts: _maskContacts(contactState.favoriteContacts),
),
);
}
}