import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import '../services/app_lock_service.dart'; /// First-time setup screen for App Lock. /// User enters PIN twice, then optionally enables biometrics. class AppLockSetupScreen extends StatefulWidget { const AppLockSetupScreen({super.key}); @override State createState() => _AppLockSetupScreenState(); } class _AppLockSetupScreenState extends State { final _pinController = TextEditingController(); final _confirmController = TextEditingController(); bool _obscurePin = true; bool _obscureConfirm = true; String? _error; @override void dispose() { _pinController.dispose(); _confirmController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Set App Lock PIN'), centerTitle: true), body: Padding( padding: const EdgeInsets.all(24), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 16), const Text( 'Choose a 4-digit PIN to lock FocusGram.', style: TextStyle(fontSize: 15, height: 1.5), ), const SizedBox(height: 32), // PIN field TextField( controller: _pinController, obscureText: _obscurePin, maxLength: 4, keyboardType: TextInputType.number, decoration: InputDecoration( labelText: 'Enter PIN', counterText: '', suffixIcon: IconButton( icon: Icon( _obscurePin ? Icons.visibility_off : Icons.visibility, ), onPressed: () => setState(() => _obscurePin = !_obscurePin), ), border: const OutlineInputBorder(), ), onChanged: (_) => setState(() => _error = null), ), const SizedBox(height: 16), // Confirm PIN field TextField( controller: _confirmController, obscureText: _obscureConfirm, maxLength: 4, keyboardType: TextInputType.number, decoration: InputDecoration( labelText: 'Confirm PIN', counterText: '', suffixIcon: IconButton( icon: Icon( _obscureConfirm ? Icons.visibility_off : Icons.visibility, ), onPressed: () => setState(() => _obscureConfirm = !_obscureConfirm), ), border: const OutlineInputBorder(), ), onChanged: (_) => setState(() => _error = null), ), // Error if (_error != null) Padding( padding: const EdgeInsets.only(top: 8), child: Text( _error!, style: const TextStyle(color: Colors.redAccent), ), ), const Spacer(), // Save button SizedBox( width: double.infinity, height: 52, child: ElevatedButton( onPressed: _savePin, style: ElevatedButton.styleFrom( backgroundColor: Colors.blueAccent, foregroundColor: Colors.white, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(14), ), ), child: const Text( 'Enable App Lock', style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600), ), ), ), const SizedBox(height: 24), ], ), ), ); } Future _savePin() async { final pin = _pinController.text.trim(); final confirm = _confirmController.text.trim(); if (pin.length != 4) { setState(() => _error = 'PIN must be exactly 4 digits.'); return; } if (pin != confirm) { setState(() => _error = 'PINs do not match.'); return; } if (pin == pin.split('').toSet().join('') && pin.length == 4) { // Allow any 4-digit PIN } final appLock = context.read(); // Set both PINs to the same value for simplicity await appLock.setPin(pin, forAppWide: true); await appLock.setPin(pin, forAppWide: false); HapticFeedback.heavyImpact(); if (mounted) { Navigator.pop(context, true); } } }