146 lines
3.9 KiB
Dart
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;
|
|
}
|