import 'package:flutter/animation.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_svga/flutter_svga.dart'; import 'package:yumi/shared/tools/sc_path_utils.dart'; import 'package:yumi/shared/data_sources/sources/local/file_cache_manager.dart'; import 'package:tancent_vap/widgets/vap_view.dart'; import 'package:yumi/shared/tools/sc_gift_vap_svga_manager.dart'; // class EntranceVapSvgaManager { // static EntranceVapSvgaManager? _instance; // // EntranceVapSvgaManager._internal(); // // factory EntranceVapSvgaManager() => // _instance ??= EntranceVapSvgaManager._internal(); // // // 使用 SCPriorityQueue 替代简单列表 // final SCPriorityQueue _taskQueue = SCPriorityQueue( // (a, b) => b.priority.compareTo(a.priority), // ); // VapController? _roomGiftvapController; // SVGAAnimationController? _roomGiftsvgaController; // bool _isPlaying = false; // bool _isDisposed = false; // // // 绑定控制器 // void bindEntranceVapController(VapController vapController) { // _isDisposed = false; // _roomGiftvapController = vapController; // _roomGiftvapController?.setAnimListener( // onVideoStart: () {}, // onVideoComplete: () { // _handleControllerState(); // }, // onFailed: (code, type, msg) { // _handleControllerState(); // }, // ); // } // // void bindEntranceSvgaController(SVGAAnimationController svgaController) { // _isDisposed = false; // _roomGiftsvgaController = svgaController; // _roomGiftsvgaController?.addStatusListener((AnimationStatus status) { // if (status.isCompleted) { // _isPlaying = false; // _roomGiftsvgaController?.reset(); // _playNext(); // } // }); // } // // // 播放任务 // void play( // String path, { // int priority = 0, // Map? customResources, // }) { // if (_isDisposed) return; // final task = SCVapTask( // path: path, // priority: priority, // customResources: customResources, // ); // // _taskQueue.add(task); // if (!_isPlaying) { // _playNext(); // } // } // // // 播放下一个任务 // Future _playNext() async { // if (_isDisposed || _taskQueue.isEmpty || _isPlaying) return; // // final task = _taskQueue.removeFirst(); // _isPlaying = true; // try { // final pathType = SCPathUtils.getPathType(task.path); // if (pathType == PathType.asset) { // await _playAsset(task); // } else if (pathType == PathType.file) { // await _playFile(task); // } else if (pathType == PathType.network) { // await _playNetwork(task); // } // } catch (e, s) { // print('VAP_SVGA播放失败: $e\n$s'); // _isPlaying = false; // } finally { // // 确保状态正确重置 // if (!_isDisposed) { // _playNext(); // } // } // } // // // 播放资源文件 // Future _playAsset(SCVapTask task) async { // if (_isDisposed) return; // if (SCPathUtils.getFileExtension(task.path).toLowerCase() == ".svga") { // MovieEntity entity; // if (SCGiftVapSvgaManager().videoItemCache.containsKey(task.path)) { // entity = SCGiftVapSvgaManager().videoItemCache[task.path]!; // } else { // entity = await SVGAParser.shared.decodeFromAssets(task.path); // SCGiftVapSvgaManager().videoItemCache[task.path] = entity; // } // _roomGiftsvgaController?.videoItem = entity; // _roomGiftsvgaController?.reset(); // _roomGiftsvgaController?.forward(); // } else { // await _roomGiftvapController?.playAsset(task.path); // } // } // // // 播放本地文件 // Future _playFile(SCVapTask task) async { // if (_isDisposed || _roomGiftvapController == null) return; // await _roomGiftvapController!.playFile(task.path); // } // // // 播放网络资源 // Future _playNetwork(SCVapTask task) async { // if (_isDisposed) return; // if (SCPathUtils.getFileExtension(task.path).toLowerCase() == ".svga") { // MovieEntity? entity; // if (SCGiftVapSvgaManager().videoItemCache.containsKey(task.path)) { // entity = SCGiftVapSvgaManager().videoItemCache[task.path]!; // entity.autorelease = false; // } else { // try { // entity = await SVGAParser.shared.decodeFromURL(task.path); // entity.autorelease = false; // SCGiftVapSvgaManager().videoItemCache[task.path] = entity; // } catch (e) { // _isPlaying = false; // print('svga解析出错:$e'); // } // } // if (entity != null) { // _roomGiftsvgaController?.videoItem = entity; // _roomGiftsvgaController?.reset(); // _roomGiftsvgaController?.forward(); // } // } else { // final file = await FileCacheManager.getInstance().getFile(url: task.path); // if (file != null && !_isDisposed) { // await _playFile( // SCVapTask( // path: file.path, // priority: task.priority, // customResources: task.customResources, // ), // ); // } // } // } // // // 处理控制器状态变化 // void _handleControllerState() { // if (_roomGiftvapController != null && !_isDisposed) { // _isPlaying = false; // // 延迟一小段时间后播放下一个,避免状态冲突 // Future.delayed(const Duration(milliseconds: 50), _playNext); // } // } // // // 释放资源 // void dispose() { // _isDisposed = true; // _isPlaying = false; // _taskQueue.clear(); // _roomGiftvapController?.stop(); // _roomGiftvapController?.dispose(); // _roomGiftvapController = null; // _roomGiftsvgaController?.stop(); // _roomGiftsvgaController?.dispose(); // _roomGiftsvgaController = null; // } // // // 清除所有任务 // void clearTasks() { // _taskQueue.clear(); // } // // // 获取当前队列状态 // VapQueueStatus get queueStatus { // return VapQueueStatus( // isPlaying: _isPlaying, // currentTask: _taskQueue.isNotEmpty ? _taskQueue.first : null, // queueLength: _taskQueue.length, // pendingTasks: List.unmodifiable(_taskQueue.unorderedElements), // ); // } // } // 任务模型 class SCVapTask implements Comparable { final String path; final int priority; // 优先级 (数值越高越优先) final Map? customResources; // 自定义资源 SCVapTask({required this.path, this.priority = 0, this.customResources}); @override int compareTo(SCVapTask other) { // 先按优先级排序 if (priority != other.priority) { return priority.compareTo(other.priority); } // 相同优先级按添加时间排序(先进先出) return hashCode.compareTo(other.hashCode); } } // 优先队列实现 class SCPriorityQueue { final List _els = []; final Comparator _cmp; SCPriorityQueue(this._cmp); void add(E element) { _els.add(element); _els.sort(_cmp); } E removeFirst() { if (isEmpty) throw StateError("No elements"); return _els.removeAt(0); } E? get first => isEmpty ? null : _els.first; bool get isEmpty => _els.isEmpty; bool get isNotEmpty => _els.isNotEmpty; int get length => _els.length; void clear() => _els.clear(); List get unorderedElements => List.from(_els); }