Files
xianyan/lib/core/services/smart_mode_service.dart
Developer c44457f94c style: 修复文件头部注释的多余BOM头字符
移除所有文件头部的不可见BOM前缀字符,统一文件头部注释格式,确保跨平台编译一致性
2026-05-27 08:05:47 +08:00

120 lines
3.6 KiB
Dart

/// ============================================================
/// 闲言APP — 智能模式切换服务
/// 创建时间: 2026-05-10
/// 更新时间: 2026-05-10
/// 作用: 根据网络状态自动切换浏览模式(高清/标准/省流)
/// 上次更新: 初始创建
/// ============================================================
import 'dart:async';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../storage/kv_storage.dart';
import '../utils/logger.dart';
import 'network/connectivity_service.dart';
enum BrowseMode { hd, standard, saver }
class SmartModeService {
SmartModeService._();
static const _keyAutoMode = 'smart_mode_auto';
static const _keyManualMode = 'smart_mode_manual';
static bool _autoMode = true;
static BrowseMode _currentMode = BrowseMode.standard;
static StreamSubscription<NetworkType>? _subscription;
static BrowseMode get currentMode => _currentMode;
static bool get isAutoMode => _autoMode;
static bool get isHd => _currentMode == BrowseMode.hd;
static bool get isSaver => _currentMode == BrowseMode.saver;
static Future<void> init() async {
_autoMode = KvStorage.getBool(_keyAutoMode) ?? true;
final saved = KvStorage.getUserPref(_keyManualMode);
if (saved != null) {
_currentMode = _parseMode(saved);
}
if (_autoMode) {
_updateModeByNetwork(ConnectivityService.currentType);
_subscription = ConnectivityService.onTypeChange.listen(
_updateModeByNetwork,
);
}
Log.i('SmartModeService: 初始化完成 (mode=$_currentMode, auto=$_autoMode)');
}
static void _updateModeByNetwork(NetworkType type) {
if (!_autoMode) return;
final newMode = switch (type) {
NetworkType.wifi => BrowseMode.hd,
NetworkType.ethernet => BrowseMode.hd,
NetworkType.mobile => BrowseMode.standard,
NetworkType.vpn => BrowseMode.standard,
NetworkType.none => BrowseMode.saver,
NetworkType.other => BrowseMode.standard,
};
if (newMode != _currentMode) {
Log.i('SmartModeService: 自动切换 ${_currentMode.name}${newMode.name}');
_currentMode = newMode;
}
}
static Future<void> setAutoMode(bool auto) async {
_autoMode = auto;
await KvStorage.setBool(_keyAutoMode, auto);
if (auto) {
_updateModeByNetwork(ConnectivityService.currentType);
_subscription ??= ConnectivityService.onTypeChange.listen(
_updateModeByNetwork,
);
} else {
_subscription?.cancel();
_subscription = null;
}
Log.i('SmartModeService: 自动模式 ${auto ? "开启" : "关闭"}');
}
static Future<void> setManualMode(BrowseMode mode) async {
_currentMode = mode;
await KvStorage.setUserPref(_keyManualMode, mode.name);
Log.i('SmartModeService: 手动设置模式 ${mode.name}');
}
static BrowseMode _parseMode(String name) {
return BrowseMode.values.firstWhere(
(m) => m.name == name,
orElse: () => BrowseMode.standard,
);
}
static void dispose() {
_subscription?.cancel();
_subscription = null;
}
}
final browseModeProvider = NotifierProvider<BrowseModeNotifier, BrowseMode>(
BrowseModeNotifier.new,
);
class BrowseModeNotifier extends Notifier<BrowseMode> {
@override
BrowseMode build() => SmartModeService.currentMode;
set state(BrowseMode value) => super.state = value;
}
final isAutoModeProvider = NotifierProvider<IsAutoModeNotifier, bool>(
IsAutoModeNotifier.new,
);
class IsAutoModeNotifier extends Notifier<bool> {
@override
bool build() => SmartModeService.isAutoMode;
set state(bool value) => super.state = value;
}