diff --git a/lib/features/profile/profile_screen.dart b/lib/features/profile/profile_screen.dart index edb7705..2910e3c 100644 --- a/lib/features/profile/profile_screen.dart +++ b/lib/features/profile/profile_screen.dart @@ -4,6 +4,8 @@ import 'package:flutter/services.dart'; import 'package:kmobile/data/repositories/auth_repository.dart'; import 'package:kmobile/features/profile/change_password/change_password_screen.dart'; import 'package:kmobile/features/profile/logout_dialog.dart'; +import 'package:kmobile/security/secure_storage.dart'; +import 'package:local_auth/local_auth.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../di/injection.dart'; import '../../l10n/app_localizations.dart'; @@ -18,6 +20,21 @@ class ProfileScreen extends StatefulWidget { } class _ProfileScreenState extends State { + bool _isBiometricEnabled = false; + @override + void initState() { + super.initState(); + _loadBiometricStatus(); + } + + Future _loadBiometricStatus() async { + final storage = getIt(); + final isEnabled = await storage.read('biometric_enabled'); + setState(() { + _isBiometricEnabled = isEnabled == 'true'; + }); + } + Future _handleLogout(BuildContext context) async { final auth = getIt(); final prefs = await SharedPreferences.getInstance(); @@ -27,6 +44,90 @@ class _ProfileScreenState extends State { Navigator.pushNamedAndRemoveUntil(context, '/login', (route) => false); } + + Future _handleBiometricToggle(bool enable) async { + final localAuth = LocalAuthentication(); + final storage = getIt(); + final canCheck = await localAuth.canCheckBiometrics; + + if (!canCheck) { + // Optional: Show a snackbar or dialog if biometrics are not available + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(AppLocalizations.of(context).biometricsNotAvailable)), + ); + return; + } + + if (enable) { + // Show "Enable" dialog + final optIn = await showDialog( + context: context, + barrierDismissible: false, + builder: (ctx) => AlertDialog( + title: Text(AppLocalizations.of(context).enableFingerprintLogin), + content: Text(AppLocalizations.of(context).enableFingerprintMessage), + actions: [ + TextButton( + onPressed: () => Navigator.of(ctx).pop(false), + child: Text(AppLocalizations.of(context).no), + ), + TextButton( + onPressed: () => Navigator.of(ctx).pop(true), + child: Text(AppLocalizations.of(context).yes), + ), + ], + ), + ); + + if (optIn == true) { + try { + final didAuth = await localAuth.authenticate( + localizedReason: AppLocalizations.of(context).authenticateToEnable, + options: const AuthenticationOptions( + stickyAuth: true, + biometricOnly: true, + ), + ); + if (didAuth) { + await storage.write('biometric_enabled', 'true'); + setState(() { + _isBiometricEnabled = true; + }); + } + } catch (e) { + // Handle authentication errors + } + } + } else { + // Show "Disable" dialog + final optOut = await showDialog( + context: context, + barrierDismissible: false, + builder: (ctx) => AlertDialog( + title: Text(AppLocalizations.of(context).disableFingerprintLogin), + content: Text(AppLocalizations.of(context).disableFingerprintMessage), + actions: [ + TextButton( + onPressed: () => Navigator.of(ctx).pop(false), + child: Text(AppLocalizations.of(context).no), + ), + TextButton( + onPressed: () => Navigator.of(ctx).pop(true), + child: Text(AppLocalizations.of(context).yes), + ), + ], + ), + ); + + if (optOut == true) { + await storage.write('biometric_enabled', 'false'); + setState(() { + _isBiometricEnabled = false; + }); + } + } + } + @override Widget build(BuildContext context) { final loc = AppLocalizations.of(context); @@ -48,6 +149,14 @@ class _ProfileScreenState extends State { ); }, ), + SwitchListTile( + title: Text(AppLocalizations.of(context).enableFingerprintLogin), + value: _isBiometricEnabled, + onChanged: (bool value) { + _handleBiometricToggle(value); + }, + secondary: const Icon(Icons.fingerprint), + ), ListTile( leading: const Icon(Icons.password), title: Text(loc.changeLoginPassword), diff --git a/lib/features/service/screens/branch_locator_screen.dart b/lib/features/service/screens/branch_locator_screen.dart index 69ed9a6..e0080e6 100644 --- a/lib/features/service/screens/branch_locator_screen.dart +++ b/lib/features/service/screens/branch_locator_screen.dart @@ -1,3 +1,5 @@ +// ignore_for_file: unused_element + import 'package:flutter/material.dart'; import '../../../l10n/app_localizations.dart'; diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 65bb936..fbd9a20 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -328,5 +328,8 @@ "limitAmount": "Limit Amount", "save": "Save", "deregister": "De-Register", - "deregistercheck": "Are you sure you want to De-Register?" + "deregistercheck": "Are you sure you want to De-Register?", + "biometricsNotAvailable": "Biometrics not available on this device", + "disableFingerprintLogin": "Disable Fingerprint Login", + "disableFingerprintMessage": "Are you sure you want to disable fingerprint login?" } diff --git a/lib/l10n/app_hi.arb b/lib/l10n/app_hi.arb index 0b2d861..975478f 100644 --- a/lib/l10n/app_hi.arb +++ b/lib/l10n/app_hi.arb @@ -329,5 +329,8 @@ "limitAmount": "सीमा राशि", "save": "जमा करें", "deregister": "अपंजीकृत", - "deregistercheck": "क्या आप वाकई पंजीकरण रद्द करना चाहते हैं??" + "deregistercheck": "क्या आप वाकई पंजीकरण रद्द करना चाहते हैं??", + "biometricsNotAvailable": "इस डिवाइस पर बायोमेट्रिक्स उपलब्ध नहीं है", + "disableFingerprintLogin": "फ़िंगरप्रिंट लॉगिन अक्षम करें", + "disableFingerprintMessage": "क्या आप फ़िंगरप्रिंट लॉगिन अक्षम करना चाहते हैं?" }