Files
MEIZU-Battery-Healthy/lib/services/saf_storage_service.dart
T

146 lines
3.9 KiB
Dart

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<void> 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<SafPermissionState> getPermissionState() async {
if (_cachedUri == null || _cachedUri!.isEmpty) {
return SafPermissionState.unauthorized;
}
// 🟢 简化:直接返回 authorized,相信本地缓存的 URI
return SafPermissionState.authorized;
}
Future<SafAuthorizationResult> 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<bool> 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<List<String>> 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<List<String>> 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<String>();
}
return [];
} catch (e) {
if (kDebugMode) {
print('[SAF] 列出文件失败: $e');
}
return [];
}
}
Future<bool> validatePermission() async {
final state = await getPermissionState();
return state == SafPermissionState.authorized;
}
void _clearCache() {
_cachedUri = null;
_saveUri(null);
}
Future<void> _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;
}