120 lines
3.6 KiB
Dart
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;
|
|
}
|