app-starlock/lib/talk/startChart/handle/impl/udp_talk_request_handler.dart

135 lines
4.8 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:convert';
import 'package:flutter/services.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:get/get.dart';
import 'package:star_lock/appRouters.dart';
import 'package:star_lock/talk/startChart/constant/message_type_constant.dart';
import 'package:star_lock/talk/startChart/constant/talk_status.dart';
import 'package:star_lock/talk/startChart/entity/scp_message.dart';
import 'package:star_lock/talk/startChart/handle/scp_message_base_handle.dart';
import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart';
import 'package:star_lock/talk/startChart/proto/gateway_reset.pb.dart';
import 'package:star_lock/talk/startChart/proto/generic.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_expect.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_request.pb.dart';
import 'package:star_lock/tools/storage.dart';
class UdpTalkRequestHandler extends ScpMessageBaseHandle
implements ScpMessageHandler {
@override
void handleReq(ScpMessage scpMessage) async {
// 判断是否登录账户
final loginData = await Storage.getLoginData();
if (loginData == null ||
talkStatus.status == TalkStatus.waitingAnswer ||
talkStatus.status == TalkStatus.answeredSuccessfully) {
// 如果已经是等待接听了,就不在处理剩下的请求
return;
}
// 回复成功
replySuccessMessage(scpMessage);
// 收到对讲请求
final TalkReq talkReq = scpMessage.Payload;
startChartManage.FromPeerId = scpMessage.ToPeerId!;
startChartManage.ToPeerId = scpMessage.FromPeerId!;
// 处理收到接听请求后的事件
_talkRequestEvent(talkObjectName: talkReq.callerName);
}
@override
void handleResp(ScpMessage scpMessage) {
// 收到对讲请求回复
final GenericResp genericResp = scpMessage.Payload;
if (genericResp.code == 0) {
print('发送对讲成功,已经收到对方的回复');
}
}
@override
void handleInvalidReq(ScpMessage scpMessage) {}
@override
void handleRealTimeData(ScpMessage scpMessage) {}
// 来电事件的处理
void _talkRequestEvent({required String talkObjectName}) {
// 发送预期数据、通知锁板需要获取视频数据
_handleSendExpect();
// 播放铃声
playRingtone();
// 显示状态栏弹窗
_showTalkRequestNotification(talkObjectName: talkObjectName);
// 设置为等待接听状态
talkStatus.setWaitingAnswer();
// 启动通话保持
_handleStartTalkPing();
// 启动对讲请求超时定时器
talkeRequestOverTimeTimerManager.start();
// 收到呼叫请求,跳转到接听页面
Get.toNamed(
Routers.starChartTalkView,
);
}
// 收到来电请求时进行本地通知
Future<void> _showTalkRequestNotification(
{required String talkObjectName}) async {
const AndroidNotificationDetails androidPlatformChannelSpecifics =
AndroidNotificationDetails('1', 'flutter_channel',
importance: Importance.max,
priority: Priority.high,
playSound: true,
ticker: 'ticker');
const NotificationDetails platformChannelSpecifics =
NotificationDetails(android: androidPlatformChannelSpecifics);
// 获取锁名
// String? getLockName = await Storage.getString(saveLockAlias);
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
// 执行本地通知
await flutterLocalNotificationsPlugin.show(0, '呼叫提醒'.tr,
'${'收到来自'.tr}($talkObjectName)${'锁的呼叫'.tr}', platformChannelSpecifics,
payload: 'item x');
}
@override
deserializePayload(
{required int payloadType,
required int messageType,
required List<int> byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId}) {
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp();
genericResp.mergeFromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.Req) {
final TalkReq talkReq = TalkReq();
talkReq.mergeFromBuffer(byte);
return talkReq;
} else {
String payload = utf8.decode(byte);
return payload;
}
}
void _handleSendExpect() {
// 修改预期数据并启动发送预期数据定时器,在收到回复时停止
startChartManage.sendOnlyImageVideoTalkExpectData();
}
// 启动通话保持判断x秒内是否收到通话保持
void _handleStartTalkPing() {
// 启动通话保持
startChartManage.startTalkPingMessageTimer();
// 启动通话保持监听定时器用来判断如果x秒内没有收到通话保持则执行的操作
talkePingOverTimeTimerManager.start();
}
}