diff --git a/dialer/lib/main_old.dart b/dialer/lib/main_old.dart deleted file mode 100644 index 5175346..0000000 --- a/dialer/lib/main_old.dart +++ /dev/null @@ -1,84 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:permission_handler/permission_handler.dart'; -import 'package:provider/provider.dart'; - -import 'services/call_service.dart'; -import 'services/cryptography/asymmetric_crypto_service.dart'; -import 'globals.dart' as globals; -import 'presentation/features/home/home_page.dart'; - -void main() async { - WidgetsFlutterBinding.ensureInitialized(); - - // Check for stealth mode - const stealthFlag = String.fromEnvironment('STEALTH', defaultValue: 'false'); - globals.isStealthMode = stealthFlag.toLowerCase() == 'true'; - - // Initialize cryptography service with error handling - final AsymmetricCryptoService cryptoService = AsymmetricCryptoService(); - try { - await cryptoService.initializeDefaultKeyPair(); - } catch (e) { - debugPrint('Error initializing cryptography: $e'); - // Continue app initialization even if crypto fails - } - - // Request permissions before running the app - await _requestPermissions(); - - // Initialize call service - CallService(); - - runApp( - MultiProvider( - providers: [ - Provider( - create: (_) => cryptoService, - ), - ], - child: const DialerApp(), - ), - ); -} - -Future _requestPermissions() async { - try { - Map statuses = await [ - Permission.phone, - Permission.contacts, - Permission.microphone, - ].request(); - - if (statuses.values.every((status) => status.isGranted)) { - debugPrint("All required permissions granted"); - const channel = MethodChannel('call_service'); - await channel.invokeMethod('permissionsGranted'); - } else { - debugPrint("Permissions denied: ${statuses.entries.where((e) => !e.value.isGranted).map((e) => e.key).join(', ')}"); - } - } catch (e) { - debugPrint("Error requesting permissions: $e"); - } -} - -class DialerApp extends StatelessWidget { - const DialerApp({super.key}); - - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Dialer App', - navigatorKey: CallService.navigatorKey, - theme: ThemeData.dark().copyWith( - scaffoldBackgroundColor: Colors.black, - primaryColor: Colors.blue, - appBarTheme: const AppBarTheme( - backgroundColor: Colors.black, - elevation: 0, - ), - ), - home: const MyHomePage(), - ); - } -} diff --git a/dialer/lib/presentation/features/settings/blocked/settings_blocked.dart b/dialer/lib/presentation/features/settings/blocked/settings_blocked.dart index 388f49e..77c3a85 100644 --- a/dialer/lib/presentation/features/settings/blocked/settings_blocked.dart +++ b/dialer/lib/presentation/features/settings/blocked/settings_blocked.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import '../../../../domain/services/block_service.dart'; +import 'package:shared_preferences/shared_preferences.dart'; class BlockedNumbersPage extends StatefulWidget { const BlockedNumbersPage({super.key}); @@ -9,108 +9,159 @@ class BlockedNumbersPage extends StatefulWidget { } class _BlockedNumbersPageState extends State { - List _blockedNumbers = []; - bool _loading = true; + bool _blockUnknownNumbers = false; // Toggle for blocking unknown numbers + List _blockedNumbers = []; // List of blocked numbers + final TextEditingController _numberController = TextEditingController(); @override void initState() { super.initState(); - _loadBlockedNumbers(); + _loadPreferences(); // Load data on initialization } - Future _loadBlockedNumbers() async { - final numbers = await BlockService().getBlockedNumbers(); + // Load preferences from local storage + Future _loadPreferences() async { + final prefs = await SharedPreferences.getInstance(); setState(() { - _blockedNumbers = numbers; - _loading = false; + _blockUnknownNumbers = prefs.getBool('blockUnknownNumbers') ?? false; + _blockedNumbers = prefs.getStringList('blockedNumbers') ?? []; }); } - Future _removeBlockedNumber(String number) async { - await BlockService().unblockNumber(number); - await _loadBlockedNumbers(); - } - - Future _addBlockedNumber(String number) async { - await BlockService().blockNumber(number); - await _loadBlockedNumbers(); + // Save preferences to local storage + Future _savePreferences() async { + final prefs = await SharedPreferences.getInstance(); + await prefs.setBool('blockUnknownNumbers', _blockUnknownNumbers); + await prefs.setStringList('blockedNumbers', _blockedNumbers); } @override Widget build(BuildContext context) { - if (_loading) { - return const Scaffold( - backgroundColor: Colors.black, - body: Center(child: CircularProgressIndicator()), - ); - } - return Scaffold( backgroundColor: Colors.black, appBar: AppBar( title: const Text('Blocked Numbers'), ), - body: _blockedNumbers.isEmpty - ? const Center( - child: Text( - 'No blocked numbers', - style: TextStyle(color: Colors.white70), - ), - ) - : ListView.builder( - itemCount: _blockedNumbers.length, - itemBuilder: (context, index) { - return ListTile( - title: Text( - _blockedNumbers[index], - style: const TextStyle(color: Colors.white), - ), - trailing: IconButton( - icon: const Icon(Icons.delete, color: Colors.red), - onPressed: () => _removeBlockedNumber(_blockedNumbers[index]), - ), - ); - }, + body: ListView( + padding: const EdgeInsets.all(16), + children: [ + SwitchListTile( + title: const Text( + 'Block Unknown Numbers', + style: TextStyle(color: Colors.white), ), - floatingActionButton: FloatingActionButton( - child: const Icon(Icons.add), - onPressed: () { - showDialog( - context: context, - builder: (BuildContext context) { - final TextEditingController controller = TextEditingController(); - return AlertDialog( - backgroundColor: Colors.grey[900], - title: const Text('Block a Number', style: TextStyle(color: Colors.white)), - content: TextField( - controller: controller, - style: const TextStyle(color: Colors.white), - decoration: const InputDecoration( - hintText: 'Enter phone number', - hintStyle: TextStyle(color: Colors.grey), - ), - keyboardType: TextInputType.phone, - ), - actions: [ - TextButton( - child: const Text('Cancel'), - onPressed: () => Navigator.of(context).pop(), - ), - TextButton( - child: const Text('Block'), - onPressed: () { - if (controller.text.trim().isNotEmpty) { - _addBlockedNumber(controller.text.trim()); - Navigator.of(context).pop(); - } - }, - ), - ], - ); + value: _blockUnknownNumbers, + onChanged: (bool value) { + setState(() { + _blockUnknownNumbers = value; + _savePreferences(); // Save the state to local storage + }); }, - ); - }, + ), + const SizedBox(height: 16), + ListTile( + title: const Text( + 'Blocked Numbers', + style: TextStyle(color: Colors.white, fontSize: 18, fontWeight: FontWeight.bold), + ), + subtitle: _blockedNumbers.isEmpty + ? const Text( + 'No blocked numbers', + style: TextStyle(color: Colors.grey), + ) + : null, + ), + ..._blockedNumbers.map( + (number) => ListTile( + title: Text( + number, + style: const TextStyle(color: Colors.white), + ), + trailing: IconButton( + icon: const Icon(Icons.delete, color: Colors.red), + onPressed: () => _unblockNumber(number), + ), + ), + ), + const Divider(color: Colors.grey), + ListTile( + title: const Text( + 'Block a Number', + style: TextStyle(color: Colors.white), + ), + trailing: const Icon(Icons.add, color: Colors.white), + onTap: () => _showBlockNumberDialog(), + ), + ], ), ); } + + // Function to block a number + void _blockNumber(String number) { + if (number.isNotEmpty && !_blockedNumbers.contains(number)) { + setState(() { + _blockedNumbers.add(number); + _savePreferences(); // Save the updated list + }); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('$number has been blocked')), + ); + } + } + + // Function to unblock a number + void _unblockNumber(String number) { + setState(() { + _blockedNumbers.remove(number); + _savePreferences(); // Save the updated list + }); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('$number has been unblocked')), + ); + } + + // Dialog for blocking a new number + void _showBlockNumberDialog() { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: Colors.grey[900], + title: const Text('Block a Number', style: TextStyle(color: Colors.white)), + content: TextField( + controller: _numberController, + keyboardType: TextInputType.phone, + decoration: const InputDecoration( + hintText: 'Enter number', + hintStyle: TextStyle(color: Colors.grey), + ), + style: const TextStyle(color: Colors.white), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: const Text('Cancel', style: TextStyle(color: Colors.white)), + ), + TextButton( + onPressed: () { + _blockNumber(_numberController.text); + _numberController.clear(); + Navigator.pop(context); + }, + child: const Text('Block', style: TextStyle(color: Colors.red)), + ), + ], + ); + }, + ); + } + + @override + void dispose() { + _numberController.dispose(); + super.dispose(); + } }