Merge branch 'talk_flutter' of gitee.com:starlock-cn/app-starlock into talk_flutter
# Conflicts: # star_lock/lib/talk/call/callTalk.dart
This commit is contained in:
commit
9ad097c00c
@ -97,6 +97,7 @@ static bool isVedioStop;
|
|||||||
[arecord AudioEnd];
|
[arecord AudioEnd];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 保持连接
|
||||||
- (void)connect_ini {
|
- (void)connect_ini {
|
||||||
_connect_reg_time = [Sformat timestamp];
|
_connect_reg_time = [Sformat timestamp];
|
||||||
Byte connect_bb[512];
|
Byte connect_bb[512];
|
||||||
@ -642,22 +643,24 @@ static bool isVedioStop;
|
|||||||
|
|
||||||
isVedioStop= NO;
|
isVedioStop= NO;
|
||||||
|
|
||||||
|
// 呼叫应答,呼叫成功
|
||||||
memcpy(bbsend, bb, 62);
|
memcpy(bbsend, bb, 62);
|
||||||
bbsend[7] = 1;
|
bbsend[7] = 1;
|
||||||
bbsend[8] = 4;
|
bbsend[8] = 4;
|
||||||
NSLog(@"replay talk ip=%@;port=%d", ip, port);
|
NSLog(@"replay talk ip=%@;port=%d", ip, port);
|
||||||
[[Pub getApp].udp sendDataInMain:bbsend length:512 toHost:ip toPort:port];
|
[[Pub getApp].udp sendDataInMain:bbsend length:512 toHost:ip toPort:port];
|
||||||
|
|
||||||
|
// 门锁发送视频
|
||||||
memcpy(bbsend, bb, 62);
|
memcpy(bbsend, bb, 62);
|
||||||
bbsend[7] = 1;
|
bbsend[7] = 1;
|
||||||
bbsend[8] = 5;
|
bbsend[8] = 5;
|
||||||
NSLog(@"replay talk ip=%@;port=%d", ip, port);
|
NSLog(@"replay talk ip=%@;port=%d", ip, port);
|
||||||
[[Pub getApp].udp sendDataInMain:bbsend length:512 toHost:ip toPort:port];
|
[[Pub getApp].udp sendDataInMain:bbsend length:512 toHost:ip toPort:port];
|
||||||
|
|
||||||
//定时报告
|
// 定时报告
|
||||||
[self connect_ini];
|
[self connect_ini];
|
||||||
[self connect];
|
[self connect];
|
||||||
|
// 设置定时器,得到连接时间
|
||||||
timer = [NSTimer scheduledTimerWithTimeInterval:1
|
timer = [NSTimer scheduledTimerWithTimeInterval:1
|
||||||
target:self selector:@selector(connect)
|
target:self selector:@selector(connect)
|
||||||
userInfo:nil repeats:YES];
|
userInfo:nil repeats:YES];
|
||||||
@ -855,13 +858,19 @@ static char cnt;
|
|||||||
}
|
}
|
||||||
else{//视频数据
|
else{//视频数据
|
||||||
NSData *data1 = [[NSData alloc] initWithBytes:bb length:60+32];
|
NSData *data1 = [[NSData alloc] initWithBytes:bb length:60+32];
|
||||||
|
// 音视频数据开始下标
|
||||||
BAGLEN = [Pub getShortFromByte:bb at:POS_blen + 2];
|
BAGLEN = [Pub getShortFromByte:bb at:POS_blen + 2];
|
||||||
|
// 获取帧序号 63
|
||||||
iframe_index = [Pub getShortFromByte:bb at:POS_iframe_index];
|
iframe_index = [Pub getShortFromByte:bb at:POS_iframe_index];
|
||||||
|
// 获取帧长度 65
|
||||||
alen = [Pub getShortFromByte:bb at:POS_alen];
|
alen = [Pub getShortFromByte:bb at:POS_alen];
|
||||||
blen = [Pub getShortFromByte:bb at:POS_blen];
|
// 当前包号 71
|
||||||
bag_index = bb[POS_bag_index]&0xff ;
|
bag_index = bb[POS_bag_index]&0xff ;
|
||||||
|
// 总包数 69
|
||||||
bag_num = bb[POS_bag_num]&0xff;
|
bag_num = bb[POS_bag_num]&0xff;
|
||||||
|
// 数据长度 73
|
||||||
|
blen = [Pub getShortFromByte:bb at:POS_blen];
|
||||||
|
|
||||||
if(iframe_index != iframe.iframe_index){
|
if(iframe_index != iframe.iframe_index){
|
||||||
iframe = [[IframeInfo alloc] init];
|
iframe = [[IframeInfo alloc] init];
|
||||||
iframe.iframe_index = iframe_index;
|
iframe.iframe_index = iframe_index;
|
||||||
|
|||||||
@ -129,9 +129,9 @@ class _MyAppState extends State<MyApp> with WidgetsBindingObserver, BaseWidget {
|
|||||||
|
|
||||||
// playLocalAudio();
|
// playLocalAudio();
|
||||||
|
|
||||||
Uint8List uint8List = Uint8List.fromList([]);
|
// Uint8List uint8List = Uint8List.fromList([]);
|
||||||
CallTalk talkClass = CallTalk();
|
// CallTalk talkClass = CallTalk();
|
||||||
talkClass.getAVData(uint8List, 90);
|
// talkClass.getAVData(uint8List, 90);
|
||||||
}
|
}
|
||||||
|
|
||||||
//初始化阿里云推送
|
//初始化阿里云推送
|
||||||
|
|||||||
@ -1,9 +1,43 @@
|
|||||||
|
|
||||||
|
import 'dart:async';
|
||||||
|
|
||||||
import '../../../../tools/baseGetXController.dart';
|
import '../../../../tools/baseGetXController.dart';
|
||||||
|
import '../../../../tools/eventBusEventManage.dart';
|
||||||
import 'lockMonitoring_state.dart';
|
import 'lockMonitoring_state.dart';
|
||||||
|
|
||||||
class LockMonitoringLogic extends BaseGetXController {
|
class LockMonitoringLogic extends BaseGetXController {
|
||||||
final LockMonitoringState state = LockMonitoringState();
|
final LockMonitoringState state = LockMonitoringState();
|
||||||
|
|
||||||
|
/// 收到视频流数据
|
||||||
|
StreamSubscription? _getTVDataRefreshUIEvent;
|
||||||
|
void _getTVDataRefreshUIAction() {
|
||||||
|
// 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus
|
||||||
|
_getTVDataRefreshUIEvent = eventBus.on<GetTVDataRefreshUI>().listen((event) {
|
||||||
|
state.listData.value = event.tvList;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onReady() {
|
||||||
|
// TODO: implement onReady
|
||||||
|
super.onReady();
|
||||||
|
print("onReady()");
|
||||||
|
|
||||||
|
_getTVDataRefreshUIAction();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onInit() {
|
||||||
|
// TODO: implement onInit
|
||||||
|
super.onInit();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onClose() {
|
||||||
|
// TODO: implement onClose
|
||||||
|
print("锁详情界面销毁了");
|
||||||
|
_getTVDataRefreshUIEvent!.cancel();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1,4 +1,5 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
@ -28,9 +29,9 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
|
|||||||
Stack(
|
Stack(
|
||||||
// alignment: Alignment.bottomCenter,
|
// alignment: Alignment.bottomCenter,
|
||||||
children: [
|
children: [
|
||||||
// Image.asset("images/icon_test20231113.png", width: 1.sw, height: 1.sh, fit: BoxFit.cover),
|
state.listData.value.isEmpty ? Image.asset("images/icon_test20231113.png", width: 1.sw, height: 1.sh, fit: BoxFit.cover) :
|
||||||
Image.memory(
|
Image.memory(
|
||||||
state.imageData,
|
Uint8List.fromList(state.listData.value),
|
||||||
width: 1.sw,
|
width: 1.sw,
|
||||||
height: 1.sh,
|
height: 1.sh,
|
||||||
fit: BoxFit.cover,
|
fit: BoxFit.cover,
|
||||||
|
|||||||
@ -5,7 +5,9 @@ import 'package:get/get.dart';
|
|||||||
class LockMonitoringState {
|
class LockMonitoringState {
|
||||||
var isOpenVoice = false.obs;
|
var isOpenVoice = false.obs;
|
||||||
|
|
||||||
Uint8List imageData = Uint8List.fromList([
|
var listData = <int>[].obs;
|
||||||
|
|
||||||
|
Uint8List imageData = Uint8List.fromList([
|
||||||
255,
|
255,
|
||||||
216,
|
216,
|
||||||
255,
|
255,
|
||||||
|
|||||||
@ -8,6 +8,8 @@ import 'package:star_lock/main/lockDetail/monitoring/monitoring/lockMonitoring_p
|
|||||||
import 'package:star_lock/talk/call/g711Decoder.dart';
|
import 'package:star_lock/talk/call/g711Decoder.dart';
|
||||||
import 'package:star_lock/talk/call/iFrameInfo.dart';
|
import 'package:star_lock/talk/call/iFrameInfo.dart';
|
||||||
|
|
||||||
|
import '../../tools/eventBusEventManage.dart';
|
||||||
|
|
||||||
class CallTalk {
|
class CallTalk {
|
||||||
static int POS_iframe_index = 63;
|
static int POS_iframe_index = 63;
|
||||||
static int POS_alen = 65;
|
static int POS_alen = 65;
|
||||||
@ -29,9 +31,9 @@ class CallTalk {
|
|||||||
// '5858584349449601075439415f396333613730323264346364a5a5a5a5c0a809a3503138363832313530323337000000000000000030303030420e000002000000b33300001f000100b301b301ffd8ffe000114a4649460001010000';
|
// '5858584349449601075439415f396333613730323264346364a5a5a5a5c0a809a3503138363832313530323337000000000000000030303030420e000002000000b33300001f000100b301b301ffd8ffe000114a4649460001010000';
|
||||||
// Uint8List bb = Uint8List.fromList(hex.decode(hexData));
|
// Uint8List bb = Uint8List.fromList(hex.decode(hexData));
|
||||||
//音频数据
|
//音频数据
|
||||||
String hexData =
|
// String hexData =
|
||||||
'5858584349449601075439415f396333613730323264346364a5a5a5a5c0a809a3503138363832313530323337000000000000000030303030e02900000100050080020000010001004001b30145444444444444444445454444444444444444444444434343434443434344444444444544454545444444444444454545454545454545454445444545454545454545444444444343434344444443434344444444444343434343434343434443434343434343424343434343434242424242424242424243434343434242424242424343434342424343434242424242434243434343434344454344444444444444444444444444454545454544444444444444444445454545454545454545454545454546454545454545454545454545454545454646464646464645454545464646454545454545454545454545454544444444444444444443434343434343434343434343434343434343434242424242424242424242424242424343434242434343434343434343434343434343434343434444444343434343430000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024001d044000000000001d080001000000001d18c03000000000';
|
// '5858584349449601075439415f396333613730323264346364a5a5a5a5c0a809a3503138363832313530323337000000000000000030303030e02900000100050080020000010001004001b30145444444444444444445454444444444444444444444434343434443434344444444444544454545444444444444454545454545454545454445444545454545454545444444444343434344444443434344444444444343434343434343434443434343434343424343434343434242424242424242424243434343434242424242424343434342424343434242424242434243434343434344454344444444444444444444444444454545454544444444444444444445454545454545454545454545454546454545454545454545454545454545454646464646464645454545464646454545454545454545454545454544444444444444444443434343434343434343434343434343434343434242424242424242424242424242424343434242434343434343434343434343434343434343434444444343434343430000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024001d044000000000001d080001000000001d18c03000000000';
|
||||||
Uint8List bb = Uint8List.fromList(hex.decode(hexData));
|
// Uint8List bb = Uint8List.fromList(hex.decode(hexData));
|
||||||
|
|
||||||
// 音频数据
|
// 音频数据
|
||||||
if (bb[61] == 1) {
|
if (bb[61] == 1) {
|
||||||
@ -69,16 +71,24 @@ class CallTalk {
|
|||||||
iframe.bb = Uint8List(end);
|
iframe.bb = Uint8List(end);
|
||||||
}
|
}
|
||||||
|
|
||||||
copyBytes(iframe!.bb!, start, bb, POS_data, blen);
|
print('bbbbbb111: ${bb}');
|
||||||
|
iframe.bb!.addAll(bb.sublist(76, bb.length));
|
||||||
|
|
||||||
|
// copyBytes(iframe!.bb!, start, bb, POS_data, blen);
|
||||||
// 打印输出看看字节数组的内容
|
// 打印输出看看字节数组的内容
|
||||||
print('Copied Bytes: ${iframe.bb}');
|
print('Copied Bytes: ${iframe.bb}');
|
||||||
|
|
||||||
Uint8List data = iframe.bb!.sublist(0, iframe.cur_len);
|
if (iframe.bagNum == iframe.bagReceive) {
|
||||||
|
Uint8List data = iframe.bb!.sublist(0, iframe.cur_len);
|
||||||
|
print('播放第%d帧:${iframe.iframeIndex} 一帧图片的Data: $data');
|
||||||
|
eventBus.fire(GetTVDataRefreshUI(data));
|
||||||
|
}
|
||||||
|
|
||||||
Get.toNamed(Routers.lockMonitoringPage,
|
// Get.toNamed(Routers.lockMonitoringPage, arguments: {
|
||||||
arguments: {"lockId": widget.lockListInfoItemEntity.lockId});
|
// "lockId": "111"
|
||||||
|
// });
|
||||||
// 打印拷贝后的目标数据
|
// 打印拷贝后的目标数据
|
||||||
print(iframe.bb);
|
// print(iframe.bb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -68,7 +68,7 @@ class UDPManage{
|
|||||||
if(event == RawSocketEvent.read){
|
if(event == RawSocketEvent.read){
|
||||||
Datagram? dg = socket.receive();
|
Datagram? dg = socket.receive();
|
||||||
try {
|
try {
|
||||||
print('Did received data on the stream (length --> ${dg!.data.length}) dg!.data:${dg!.data}');
|
// print('Did received data on the stream (length --> ${dg!.data.length}) dg!.data:${dg!.data}');
|
||||||
// EventBusManager().eventBusFir(EventReceiveModel(data: dg?.data,sendChannel: DataChannel.udp));
|
// EventBusManager().eventBusFir(EventReceiveModel(data: dg?.data,sendChannel: DataChannel.udp));
|
||||||
CommandUDPReciverManager.appDataReceive(dg!.data);
|
CommandUDPReciverManager.appDataReceive(dg!.data);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -87,7 +87,7 @@ class UDPManage{
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
print("sendData:$data");
|
// print("sendData:$data");
|
||||||
var result = _udpSocket?.send(data, InternetAddress(host!), port!);
|
var result = _udpSocket?.send(data, InternetAddress(host!), port!);
|
||||||
if(result != data.length) {
|
if(result != data.length) {
|
||||||
print('❌Udp ----> send data $result ${data.length}');
|
print('❌Udp ----> send data $result ${data.length}');
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import '../../tools/toast.dart';
|
import '../../tools/toast.dart';
|
||||||
|
import '../call/callTalk.dart';
|
||||||
import 'udp_talkClass.dart';
|
import 'udp_talkClass.dart';
|
||||||
|
|
||||||
class CommandUDPReciverManager {
|
class CommandUDPReciverManager {
|
||||||
@ -15,7 +16,7 @@ class CommandUDPReciverManager {
|
|||||||
if(dataSize < 4){
|
if(dataSize < 4){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// print("appDataReceiveData:$data");
|
print("appDataReceiveData:$data");
|
||||||
|
|
||||||
Uint8List data1 = Uint8List.fromList(data);
|
Uint8List data1 = Uint8List.fromList(data);
|
||||||
if(data1.length==1){
|
if(data1.length==1){
|
||||||
@ -27,7 +28,7 @@ class CommandUDPReciverManager {
|
|||||||
|
|
||||||
if (data[6] == 4) {
|
if (data[6] == 4) {
|
||||||
if(data[7] == 2){
|
if(data[7] == 2){
|
||||||
print("心跳包反馈 在线状态");
|
// print("心跳包反馈 在线状态");
|
||||||
} else if(data[7]==3) {
|
} else if(data[7]==3) {
|
||||||
[Toast.show(msg: "您已在其他设备登录")];
|
[Toast.show(msg: "您已在其他设备登录")];
|
||||||
}
|
}
|
||||||
@ -38,9 +39,8 @@ class CommandUDPReciverManager {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
// 对讲命令
|
// 对讲命令
|
||||||
// var beiCallType = data[8] & 0xff;
|
var beiCallType = data[8] & 0xff;
|
||||||
var beiCallType = 1 & 0xff;
|
print("被呼叫类型$beiCallType");
|
||||||
print("被呼叫2 类型$beiCallType");
|
|
||||||
switch (beiCallType) {
|
switch (beiCallType) {
|
||||||
case 1:{
|
case 1:{
|
||||||
//被叫
|
//被叫
|
||||||
@ -57,8 +57,9 @@ class CommandUDPReciverManager {
|
|||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
case 8:{//音视频数据
|
case 8:{//音视频数据
|
||||||
//print("音视频数据");
|
print("音视频数据");
|
||||||
|
CallTalk cllTalk = CallTalk();
|
||||||
|
cllTalk.getAVData(data1, data1.length);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 9:{
|
case 9:{
|
||||||
@ -66,8 +67,7 @@ class CommandUDPReciverManager {
|
|||||||
//print("对方保持连接");
|
//print("对方保持连接");
|
||||||
data[7] = 2;
|
data[7] = 2;
|
||||||
|
|
||||||
}
|
} else{
|
||||||
else{
|
|
||||||
//print("保持连接反馈");
|
//print("保持连接反馈");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,18 +19,16 @@ class UDPTalkClass{
|
|||||||
factory UDPTalkClass() => _share();
|
factory UDPTalkClass() => _share();
|
||||||
UDPTalkClass get manager => _share();
|
UDPTalkClass get manager => _share();
|
||||||
|
|
||||||
UDPTalkClass._init() {
|
UDPTalkClass._init();
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
var status = 0;// 0空闲
|
var status = 0;// 0空闲
|
||||||
var remoteEquid;
|
var remoteEquid;// 手机号
|
||||||
late Timer timer;
|
late Timer timer;
|
||||||
// 该字段是为了判断是否跳转到接听界面 挂断或者退出接听界面要记得变更状态
|
// 该字段是为了判断是否跳转到接听界面 挂断或者退出接听界面要记得变更状态
|
||||||
var isBeCall = false;
|
var isBeCall = false;
|
||||||
|
|
||||||
beCallW({List<int>? data, String? ip, int? port}) async {
|
beCallW({List<int>? data, String? ip, int? port}) async {
|
||||||
print("beCall");
|
// print("beCall");
|
||||||
// if (await isCallMe(data)) {
|
// if (await isCallMe(data)) {
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
@ -42,10 +40,12 @@ class UDPTalkClass{
|
|||||||
remoteEquid = getEquidFrombb(data, 9);
|
remoteEquid = getEquidFrombb(data, 9);
|
||||||
status = 6;
|
status = 6;
|
||||||
|
|
||||||
|
// 呼叫应答,呼叫成功
|
||||||
data![7] = 1;
|
data![7] = 1;
|
||||||
data[8] = 4;
|
data[8] = 4;
|
||||||
UDPManage().sendData(data);
|
UDPManage().sendData(data);
|
||||||
|
|
||||||
|
// 门锁发送视频
|
||||||
data[7] = 1;
|
data[7] = 1;
|
||||||
data[8] = 5;
|
data[8] = 5;
|
||||||
UDPManage().sendData(data);
|
UDPManage().sendData(data);
|
||||||
@ -59,6 +59,7 @@ class UDPTalkClass{
|
|||||||
|
|
||||||
if(UDPTalkClass().isBeCall == false){
|
if(UDPTalkClass().isBeCall == false){
|
||||||
UDPTalkClass().isBeCall = true;
|
UDPTalkClass().isBeCall = true;
|
||||||
|
// 保持连接
|
||||||
timer = Timer.periodic(1.seconds, (timer) {
|
timer = Timer.periodic(1.seconds, (timer) {
|
||||||
data[7] = 1;
|
data[7] = 1;
|
||||||
data[8] = 9;
|
data[8] = 9;
|
||||||
|
|||||||
@ -54,4 +54,10 @@ class LockSetChangeSetRefreshLockDetailWithType{
|
|||||||
int type;// 0 考勤 1开锁时是否需联网
|
int type;// 0 考勤 1开锁时是否需联网
|
||||||
int setResult;
|
int setResult;
|
||||||
LockSetChangeSetRefreshLockDetailWithType(this.type, this.setResult);
|
LockSetChangeSetRefreshLockDetailWithType(this.type, this.setResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 获取到视频流数据然后刷新界面
|
||||||
|
class GetTVDataRefreshUI{
|
||||||
|
List<int> tvList;
|
||||||
|
GetTVDataRefreshUI(this.tvList);
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user