import 'package:agora_token_generator/agora_token_generator.dart'; import 'package:dating_touchme_app/model/rtc/rtc_channel_data.dart'; import 'package:dating_touchme_app/network/network_service.dart'; import 'package:dating_touchme_app/rtc/rtc_manager.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:permission_handler/permission_handler.dart'; /// 直播房间相关控制器 class RoomController extends GetxController { RoomController({NetworkService? networkService}) : _networkService = networkService ?? Get.find(); final NetworkService _networkService; /// 当前频道信息 final Rxn rtcChannel = Rxn(); /// 是否正在创建 final RxBool isLoading = false.obs; /// 调用接口创建 RTC 频道 Future createRtcChannel() async { if (isLoading.value) return; final granted = await _ensureRtcPermissions(); if (!granted) return; try { isLoading.value = true; final response = await _networkService.rtcApi.createRtcChannel(); final base = response.data; if (base.isSuccess && base.data != null) { rtcChannel.value = base.data; GetStorage storage = GetStorage(); String userId = storage.read('userId') ?? ''; String tokens = RtmTokenBuilder.buildToken( appId: '4c2ea9dcb4c5440593a418df0fdd512d', appCertificate: '16f34b45181a4fae8acdb1a28762fcfa', userId: userId, tokenExpireSeconds: 3600, ); await _joinRtcChannel(base.data!.token, base.data!.channelId, base.data!.uid); } else { final message = base.message.isNotEmpty ? base.message : '创建频道失败'; SmartDialog.showToast(message); } } catch (e) { SmartDialog.showToast('创建频道异常:$e'); } finally { isLoading.value = false; } } Future _joinRtcChannel( String token, String channelName, int uid, ) async { try { await RTCManager.instance.joinChannel( token: token, channelId: channelName, uid: uid, ); } catch (e) { SmartDialog.showToast('加入频道失败:$e'); } } Future sendMessage(String message) async { await RTCManager.instance.sendMessage(message); } Future _ensureRtcPermissions() async { final statuses = await [Permission.camera, Permission.microphone].request(); final allGranted = statuses.values.every((status) => status.isGranted); if (allGranted) { return true; } final permanentlyDenied = statuses.values.any((status) => status.isPermanentlyDenied); if (permanentlyDenied) { SmartDialog.showToast('请在系统设置中开启摄像头和麦克风权限'); await openAppSettings(); } else { SmartDialog.showToast('请允许摄像头和麦克风权限以进入房间'); } return false; } Future disposeRtcResources() async { await RTCManager.instance.dispose(); } }