import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../models/saf_permission_state.dart'; class SafStorageService { static final SafStorageService _instance = SafStorageService._internal(); factory SafStorageService() => _instance; SafStorageService._internal(); static const MethodChannel _channel = MethodChannel( 'com.lxh.battery_health/saf', ); static const String _prefKeySafUri = 'saf_storage_uri'; String? _cachedUri; // 🟢 初始化时从 SharedPreferences 恢复 URI Future init() async { try { final prefs = await SharedPreferences.getInstance(); _cachedUri = prefs.getString(_prefKeySafUri); if (kDebugMode) { print('[SAF] 初始化,缓存 URI: $_cachedUri'); } } catch (e) { if (kDebugMode) { print('[SAF] 初始化失败: $e'); } _cachedUri = null; } } Future getPermissionState() async { if (_cachedUri == null || _cachedUri!.isEmpty) { return SafPermissionState.unauthorized; } // 🟢 直接返回 authorized,相信缓存 return SafPermissionState.authorized; } Future requestPermission() async { try { final String? uriString = await _channel.invokeMethod('selectFolder'); if (uriString == null || uriString.isEmpty) { return SafAuthorizationResult.denied(); } _cachedUri = uriString; await _saveUri(uriString); if (kDebugMode) { print('[SAF] 授权成功,URI: $uriString'); } return SafAuthorizationResult.success(uriString); } catch (e) { if (kDebugMode) { print('[SAF] 授权失败: $e'); } return SafAuthorizationResult.error('授权失败: $e'); } } Future logFileExists(String fileName) async { final state = await getPermissionState(); if (state != SafPermissionState.authorized) return false; try { final files = await _channel.invokeMethod('listFiles'); if (files is List) { return files.contains(fileName); } return false; } catch (e) { return false; } } Future> readLogFile(String fileName) async { final state = await getPermissionState(); if (state != SafPermissionState.authorized) return []; try { final String? content = await _channel.invokeMethod('readLogFile', { 'fileName': fileName, }); if (content == null || content.isEmpty) return []; return content.split('\n'); } catch (e) { if (kDebugMode) { print('[SAF] 读取文件失败: $e'); } return []; } } Future> listFiles() async { final state = await getPermissionState(); if (state != SafPermissionState.authorized) return []; try { final result = await _channel.invokeMethod('listFiles'); if (result is List) { return result.cast(); } return []; } catch (e) { if (kDebugMode) { print('[SAF] 列出文件失败: $e'); } return []; } } Future validatePermission() async { final state = await getPermissionState(); return state == SafPermissionState.authorized; } void _clearCache() { _cachedUri = null; _saveUri(null); } Future _saveUri(String? uri) async { try { final prefs = await SharedPreferences.getInstance(); if (uri != null && uri.isNotEmpty) { await prefs.setString(_prefKeySafUri, uri); if (kDebugMode) { print('[SAF] 保存 URI 成功: $uri'); } } else { await prefs.remove(_prefKeySafUri); if (kDebugMode) { print('[SAF] 清除 URI'); } } } catch (e) { if (kDebugMode) { print('[SAF] 保存 URI 失败: $e'); } } } String? get cachedUri => _cachedUri; }