import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart' as permission; import '../theme/app_colors.dart'; import '../widgets/glassmorphism_card.dart'; import '../routes/app_routes.dart'; import '../l10n/app_localizations.dart'; import '../services/sms_service.dart'; import '../utils/platform_helper.dart'; class SmsPermissionScreen extends StatefulWidget { const SmsPermissionScreen({super.key}); @override State createState() => _SmsPermissionScreenState(); } class _SmsPermissionScreenState extends State { bool _requesting = false; Future _handleRequest() async { if (_requesting) return; setState(() => _requesting = true); try { if (!PlatformHelper.isAndroid) { // iOS/Web은 권한 흐름 없이 메인으로 이동 if (mounted) { Navigator.of(context).pushReplacementNamed(AppRoutes.main); } return; } final status = await permission.Permission.sms.status; if (status.isGranted) { if (mounted) { Navigator.of(context).pushReplacementNamed(AppRoutes.main); } return; } // 권한 요청 final granted = await SMSService.requestSMSPermission(); if (mounted) { if (granted) { Navigator.of(context).pushReplacementNamed(AppRoutes.main); } else { final newStatus = await permission.Permission.sms.status; if (newStatus.isPermanentlyDenied) { // 설정 열기 유도 _showSettingsDialog(); } // 거부지만 영구 거부가 아니라면 그대로 대기 (사용자가 다시 시도 가능) } } } finally { if (mounted) setState(() => _requesting = false); } } void _showSettingsDialog() { final loc = AppLocalizations.of(context); showDialog( context: context, builder: (_) => AlertDialog( title: Text(loc.smsPermissionRequired), content: const Text('권한이 영구적으로 거부되었습니다. 설정에서 권한을 허용해주세요.'), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), child: const Text('닫기'), ), TextButton( onPressed: () async { await permission.openAppSettings(); if (mounted) Navigator.of(context).pop(); }, child: const Text('설정 열기'), ), ], ), ); } @override Widget build(BuildContext context) { final loc = AppLocalizations.of(context); return Scaffold( body: SafeArea( child: Center( child: Padding( padding: const EdgeInsets.all(16.0), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const Icon(Icons.sms, size: 64, color: AppColors.primaryColor), const SizedBox(height: 16), Text( 'SMS 권한 요청', style: Theme.of(context).textTheme.headlineSmall?.copyWith( color: AppColors.textPrimary, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 8), Text( loc.smsPermissionRequired, textAlign: TextAlign.center, style: const TextStyle(color: AppColors.textSecondary), ), const SizedBox(height: 16), GlassmorphismCard( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: const [ Text('이유:', style: TextStyle(fontWeight: FontWeight.bold)), SizedBox(height: 8), Text('문자 메시지에서 반복 결제 내역을 분석해 구독 서비스를 자동으로 탐지합니다.'), SizedBox(height: 12), Text('수집 범위:', style: TextStyle(fontWeight: FontWeight.bold)), SizedBox(height: 8), Text('결제 관련 문자 메시지(서비스명/금액/날짜 패턴)를 로컬에서만 처리합니다.'), ], ), ), const SizedBox(height: 24), SizedBox( width: double.infinity, child: ElevatedButton.icon( onPressed: _requesting ? null : _handleRequest, icon: const Icon(Icons.lock_open), label: Text(_requesting ? '요청 중...' : loc.requestPermission), ), ), const SizedBox(height: 8), TextButton( onPressed: () => Navigator.of(context) .pushReplacementNamed(AppRoutes.main), child: const Text('나중에 하기'), ) ], ), ), ), ), ); } }