Merge branch 'develop_liyi' into 'canary_release'
Develop liyi See merge request StarlockTeam/app-starlock!19
This commit is contained in:
commit
e37415789d
@ -1,3 +1,5 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:star_lock/apm/apm_helper.dart';
|
import 'package:star_lock/apm/apm_helper.dart';
|
||||||
@ -174,8 +176,10 @@ class StarLockLoginLogic extends BaseGetXController {
|
|||||||
state.canNext.value = state.pwdIsOK && state.isEmailOrPhone;
|
state.canNext.value = state.pwdIsOK && state.isEmailOrPhone;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
late StreamSubscription _agreePrivacySubscription;
|
||||||
|
|
||||||
void _initEventListen() {
|
void _initEventListen() {
|
||||||
eventBus
|
_agreePrivacySubscription = eventBus
|
||||||
.on<AgreePrivacyAgreement>()
|
.on<AgreePrivacyAgreement>()
|
||||||
.listen((AgreePrivacyAgreement event) async {
|
.listen((AgreePrivacyAgreement event) async {
|
||||||
await JverifyOneClickLoginManage();
|
await JverifyOneClickLoginManage();
|
||||||
@ -194,6 +198,8 @@ class StarLockLoginLogic extends BaseGetXController {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
void onClose() {
|
void onClose() {
|
||||||
|
// 取消事件监听
|
||||||
|
_agreePrivacySubscription.cancel();
|
||||||
state.onClose();
|
state.onClose();
|
||||||
super.onClose();
|
super.onClose();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -106,7 +106,6 @@ Future<void> privacySDKInitialization() async {
|
|||||||
// 初始化一键登录服务
|
// 初始化一键登录服务
|
||||||
final StarLockLoginLogic loginLogic = Get.put(StarLockLoginLogic());
|
final StarLockLoginLogic loginLogic = Get.put(StarLockLoginLogic());
|
||||||
await JverifyOneClickLoginManage();
|
await JverifyOneClickLoginManage();
|
||||||
loginLogic.oneClickLoginAction();
|
|
||||||
loginLogic.state.isCheckVerifyEnable.value =
|
loginLogic.state.isCheckVerifyEnable.value =
|
||||||
await JverifyOneClickLoginManage().checkVerifyEnable();
|
await JverifyOneClickLoginManage().checkVerifyEnable();
|
||||||
eventBus.fire(AgreePrivacyAgreement());
|
eventBus.fire(AgreePrivacyAgreement());
|
||||||
|
|||||||
@ -80,7 +80,7 @@ class AddICCardLogic extends BaseGetXController {
|
|||||||
final List<int> token = reply.data.sublist(5, 9);
|
final List<int> token = reply.data.sublist(5, 9);
|
||||||
final List<String> saveStrList = changeIntListToStringList(token);
|
final List<String> saveStrList = changeIntListToStringList(token);
|
||||||
Storage.setStringList(saveBlueToken, saveStrList);
|
Storage.setStringList(saveBlueToken, saveStrList);
|
||||||
// AppLog.log('添加卡token:$token');
|
AppLog.log('添加卡token:$token');
|
||||||
|
|
||||||
IoSenderManage.senderAddCardWithTimeCycleCoercionCommand(
|
IoSenderManage.senderAddCardWithTimeCycleCoercionCommand(
|
||||||
keyID: '1',
|
keyID: '1',
|
||||||
@ -107,6 +107,14 @@ class AddICCardLogic extends BaseGetXController {
|
|||||||
token: token,
|
token: token,
|
||||||
isBeforeAddUser: false);
|
isBeforeAddUser: false);
|
||||||
break;
|
break;
|
||||||
|
case 0xFE:
|
||||||
|
case 12:
|
||||||
|
// 管理员已满
|
||||||
|
state.ifAddState.value = false;
|
||||||
|
showToast('管理员已满'.tr, something: () {
|
||||||
|
Get.back();
|
||||||
|
});
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
//失败
|
//失败
|
||||||
state.ifAddState.value = false;
|
state.ifAddState.value = false;
|
||||||
@ -146,6 +154,7 @@ class AddICCardLogic extends BaseGetXController {
|
|||||||
Get.close(1);
|
Get.close(1);
|
||||||
break;
|
break;
|
||||||
case 0xFE:
|
case 0xFE:
|
||||||
|
case 0x12:
|
||||||
// 管理员已满
|
// 管理员已满
|
||||||
showToast('管理员已满'.tr);
|
showToast('管理员已满'.tr);
|
||||||
Get.close(1);
|
Get.close(1);
|
||||||
|
|||||||
@ -28,6 +28,7 @@ class CardListLogic extends BaseGetXController {
|
|||||||
|
|
||||||
// 获取解析后的数据
|
// 获取解析后的数据
|
||||||
late StreamSubscription<Reply> _replySubscription;
|
late StreamSubscription<Reply> _replySubscription;
|
||||||
|
|
||||||
void _initReplySubscription() {
|
void _initReplySubscription() {
|
||||||
_replySubscription =
|
_replySubscription =
|
||||||
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
|
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
|
||||||
@ -69,11 +70,15 @@ class CardListLogic extends BaseGetXController {
|
|||||||
userID: (await Storage.getUid())!,
|
userID: (await Storage.getUid())!,
|
||||||
cardNo: state.deletCardNo,
|
cardNo: state.deletCardNo,
|
||||||
useCountLimit: 0xffff,
|
useCountLimit: 0xffff,
|
||||||
operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部
|
operate: state.isDeletAll == true ? 3 : 2,
|
||||||
|
// 0:注册 1:修改 2:删除 3:删除全部
|
||||||
isAdmin: 0,
|
isAdmin: 0,
|
||||||
isForce: 0, // 是否是胁迫
|
isForce: 0,
|
||||||
isRound: 0, // 是否是循环
|
// 是否是胁迫
|
||||||
weekRound: 0, // 周循环
|
isRound: 0,
|
||||||
|
// 是否是循环
|
||||||
|
weekRound: 0,
|
||||||
|
// 周循环
|
||||||
startDate: 0x11223344,
|
startDate: 0x11223344,
|
||||||
endDate: 0x11223344,
|
endDate: 0x11223344,
|
||||||
startTime: '0',
|
startTime: '0',
|
||||||
@ -116,11 +121,15 @@ class CardListLogic extends BaseGetXController {
|
|||||||
userID: (await Storage.getUid())!,
|
userID: (await Storage.getUid())!,
|
||||||
cardNo: state.deletCardNo,
|
cardNo: state.deletCardNo,
|
||||||
useCountLimit: 0xffff,
|
useCountLimit: 0xffff,
|
||||||
operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部
|
operate: state.isDeletAll == true ? 3 : 2,
|
||||||
|
// 0:注册 1:修改 2:删除 3:删除全部
|
||||||
isAdmin: 0,
|
isAdmin: 0,
|
||||||
isForce: 0, // 是否是胁迫
|
isForce: 0,
|
||||||
isRound: 0, // 是否是循环
|
// 是否是胁迫
|
||||||
weekRound: 0, // 周循环
|
isRound: 0,
|
||||||
|
// 是否是循环
|
||||||
|
weekRound: 0,
|
||||||
|
// 周循环
|
||||||
startDate: 0x11223344,
|
startDate: 0x11223344,
|
||||||
endDate: 0x11223344,
|
endDate: 0x11223344,
|
||||||
startTime: '0',
|
startTime: '0',
|
||||||
@ -193,6 +202,7 @@ class CardListLogic extends BaseGetXController {
|
|||||||
|
|
||||||
// 监听修改完详情之后刷新列表
|
// 监听修改完详情之后刷新列表
|
||||||
late StreamSubscription _teamEvent;
|
late StreamSubscription _teamEvent;
|
||||||
|
|
||||||
void _initRefreshAction() {
|
void _initRefreshAction() {
|
||||||
_teamEvent = eventBus
|
_teamEvent = eventBus
|
||||||
.on<OtherTypeRefreshListEvent>()
|
.on<OtherTypeRefreshListEvent>()
|
||||||
@ -240,6 +250,7 @@ class CardListLogic extends BaseGetXController {
|
|||||||
|
|
||||||
_initRefreshAction();
|
_initRefreshAction();
|
||||||
}
|
}
|
||||||
|
await getICCardListData(isRefresh: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@ -31,24 +31,24 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
|
|||||||
final CardListLogic logic = Get.put(CardListLogic());
|
final CardListLogic logic = Get.put(CardListLogic());
|
||||||
final CardListState state = Get.find<CardListLogic>().state;
|
final CardListState state = Get.find<CardListLogic>().state;
|
||||||
|
|
||||||
Future<void> getHttpData({required bool isRefresh}) async {
|
// Future<void> logic.getICCardListData({required bool isRefresh}) async {
|
||||||
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
|
// final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
|
||||||
if (isDemoMode == false) {
|
// if (isDemoMode == false) {
|
||||||
logic
|
// logic
|
||||||
.getICCardListData(isRefresh: isRefresh)
|
// .getICCardListData(isRefresh: isRefresh)
|
||||||
.then((FingerprintListDataEntity value) {
|
// .then((FingerprintListDataEntity value) {
|
||||||
if (mounted) {
|
// if (mounted) {
|
||||||
setState(() {});
|
// setState(() {});
|
||||||
}
|
// }
|
||||||
});
|
// });
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
|
|
||||||
getHttpData(isRefresh: true);
|
// logic.getICCardListData(isRefresh: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -92,17 +92,17 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
|
|||||||
),
|
),
|
||||||
body: EasyRefreshTool(
|
body: EasyRefreshTool(
|
||||||
onRefresh: () {
|
onRefresh: () {
|
||||||
getHttpData(isRefresh: true);
|
logic.getICCardListData(isRefresh: true);
|
||||||
},
|
},
|
||||||
onLoad: () {
|
onLoad: () {
|
||||||
getHttpData(isRefresh: false);
|
logic.getICCardListData(isRefresh: false);
|
||||||
},
|
},
|
||||||
child: Column(
|
child: Column(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
KeySearchWidget(
|
KeySearchWidget(
|
||||||
editingController: state.searchController,
|
editingController: state.searchController,
|
||||||
onSubmittedAction: () {
|
onSubmittedAction: () {
|
||||||
getHttpData(isRefresh: true);
|
logic.getICCardListData(isRefresh: true);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
SizedBox(height: 20.h),
|
SizedBox(height: 20.h),
|
||||||
@ -115,10 +115,10 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
|
|||||||
'fromType': 1 // 1从添加钥匙列表进入 2从考勤添加员工入口进入
|
'fromType': 1 // 1从添加钥匙列表进入 2从考勤添加员工入口进入
|
||||||
})!
|
})!
|
||||||
.then((value) {
|
.then((value) {
|
||||||
getHttpData(isRefresh: true);
|
logic.getICCardListData(isRefresh: true);
|
||||||
});
|
});
|
||||||
// if (data != null) {
|
// if (data != null) {
|
||||||
// getHttpData(isRefresh: true);
|
// logic.getICCardListData(isRefresh: true);
|
||||||
// }
|
// }
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
@ -180,9 +180,9 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
|
|||||||
arguments: <String, FingerprintItemData>{
|
arguments: <String, FingerprintItemData>{
|
||||||
'fingerprintItemData': fingerprintItemData,
|
'fingerprintItemData': fingerprintItemData,
|
||||||
})!
|
})!
|
||||||
.then((value) => getHttpData(isRefresh: true));
|
.then((value) => logic.getICCardListData(isRefresh: true));
|
||||||
// if (data != null) {
|
// if (data != null) {
|
||||||
// getHttpData(isRefresh: true);
|
// logic.getICCardListData(isRefresh: true);
|
||||||
// }
|
// }
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|||||||
@ -54,7 +54,7 @@ class AddFaceLogic extends BaseGetXController {
|
|||||||
|
|
||||||
// 最大图片数
|
// 最大图片数
|
||||||
state.maxRegCount.value = reply.data[11];
|
state.maxRegCount.value = reply.data[11];
|
||||||
// AppLog.log('人脸开始state.maxRegCount.value:${state.maxRegCount.value}');
|
AppLog.log('人脸开始state.maxRegCount.value:${state.maxRegCount.value}');
|
||||||
break;
|
break;
|
||||||
case 0x06:
|
case 0x06:
|
||||||
//无权限
|
//无权限
|
||||||
@ -89,6 +89,12 @@ class AddFaceLogic extends BaseGetXController {
|
|||||||
isBeforeAddUser: false
|
isBeforeAddUser: false
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
case 0xFE:
|
||||||
|
case 12:
|
||||||
|
// 管理员已满
|
||||||
|
showToast('管理员已满'.tr);
|
||||||
|
Get.close(1);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
//失败
|
//失败
|
||||||
state.ifAddState.value = false;
|
state.ifAddState.value = false;
|
||||||
@ -112,9 +118,9 @@ class AddFaceLogic extends BaseGetXController {
|
|||||||
Get.close(1);
|
Get.close(1);
|
||||||
break;
|
break;
|
||||||
case 0xFE:
|
case 0xFE:
|
||||||
|
case 12:
|
||||||
// 管理员已满
|
// 管理员已满
|
||||||
showToast('管理员已满'.tr);
|
showToast('管理员已满'.tr);
|
||||||
state.ifAddState.value = false;
|
|
||||||
Get.close(1);
|
Get.close(1);
|
||||||
break;
|
break;
|
||||||
case 0xFD:
|
case 0xFD:
|
||||||
@ -138,7 +144,7 @@ class AddFaceLogic extends BaseGetXController {
|
|||||||
// 添加人脸中
|
// 添加人脸中
|
||||||
// 当前注册数
|
// 当前注册数
|
||||||
state.regIndex.value = reply.data[6];
|
state.regIndex.value = reply.data[6];
|
||||||
// AppLog.log('注册人脸过程state.regIndex.value:${state.regIndex.value}');
|
AppLog.log('注册人脸过程state.regIndex.value:${state.regIndex.value}');
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -106,6 +106,7 @@ class AddFingerprintLogic extends BaseGetXController {
|
|||||||
isBeforeAddUser: false);
|
isBeforeAddUser: false);
|
||||||
break;
|
break;
|
||||||
case 0xFE:
|
case 0xFE:
|
||||||
|
case 12:
|
||||||
// 管理员已满
|
// 管理员已满
|
||||||
state.ifAddState.value = false;
|
state.ifAddState.value = false;
|
||||||
showToast('管理员已满'.tr, something: () {
|
showToast('管理员已满'.tr, something: () {
|
||||||
@ -139,10 +140,12 @@ class AddFingerprintLogic extends BaseGetXController {
|
|||||||
Get.close(1);
|
Get.close(1);
|
||||||
break;
|
break;
|
||||||
case 0xFE:
|
case 0xFE:
|
||||||
// 管理员已满
|
case 12:
|
||||||
showToast('管理员已满'.tr);
|
// 管理员已满
|
||||||
state.ifAddState.value = false;
|
state.ifAddState.value = false;
|
||||||
Get.close(1);
|
showToast('管理员已满'.tr, something: () {
|
||||||
|
Get.back();
|
||||||
|
});
|
||||||
break;
|
break;
|
||||||
case 0xFD:
|
case 0xFD:
|
||||||
// 用户已满
|
// 用户已满
|
||||||
|
|||||||
@ -404,8 +404,8 @@ class FingerprintListLogic extends BaseGetXController {
|
|||||||
void _initRefreshAction() {
|
void _initRefreshAction() {
|
||||||
_teamEvent = eventBus
|
_teamEvent = eventBus
|
||||||
.on<OtherTypeRefreshListEvent>()
|
.on<OtherTypeRefreshListEvent>()
|
||||||
.listen((OtherTypeRefreshListEvent event) {
|
.listen((OtherTypeRefreshListEvent event) async {
|
||||||
getFingerprintsListData(isRefresh: true);
|
await getFingerprintsListData(isRefresh: true);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -460,7 +460,7 @@ class FingerprintListLogic extends BaseGetXController {
|
|||||||
if (isDemoMode == false) {
|
if (isDemoMode == false) {
|
||||||
_initReplySubscription();
|
_initReplySubscription();
|
||||||
|
|
||||||
_initRefreshAction();
|
// _initRefreshAction();
|
||||||
getFingerprintsListData(isRefresh: true);
|
getFingerprintsListData(isRefresh: true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -814,7 +814,7 @@ class LockDetailLogic extends BaseGetXController {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
eventBus
|
state.DetailLockInfo = eventBus
|
||||||
.on<PassCurrentLockInformationEvent>()
|
.on<PassCurrentLockInformationEvent>()
|
||||||
.listen((PassCurrentLockInformationEvent event) {
|
.listen((PassCurrentLockInformationEvent event) {
|
||||||
if (event.lockSetInfoData.lockSettingInfo != null &&
|
if (event.lockSetInfoData.lockSettingInfo != null &&
|
||||||
@ -839,7 +839,7 @@ class LockDetailLogic extends BaseGetXController {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
eventBus
|
state.SuccessfulDistributionNetworkEvent = eventBus
|
||||||
.on<SuccessfulDistributionNetwork>()
|
.on<SuccessfulDistributionNetwork>()
|
||||||
.listen((SuccessfulDistributionNetwork event) {
|
.listen((SuccessfulDistributionNetwork event) {
|
||||||
// 配网成功获取一下配网信息
|
// 配网成功获取一下配网信息
|
||||||
|
|||||||
@ -14,6 +14,8 @@ class LockDetailState {
|
|||||||
late StreamSubscription<Reply> replySubscription;
|
late StreamSubscription<Reply> replySubscription;
|
||||||
StreamSubscription? lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent;
|
StreamSubscription? lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent;
|
||||||
StreamSubscription? LockSetChangeSetRefreshLockDetailWithTypeSubscription;
|
StreamSubscription? LockSetChangeSetRefreshLockDetailWithTypeSubscription;
|
||||||
|
StreamSubscription? DetailLockInfo;
|
||||||
|
StreamSubscription? SuccessfulDistributionNetworkEvent;
|
||||||
|
|
||||||
String lockNetToken = '0';
|
String lockNetToken = '0';
|
||||||
int differentialTime = 0;// 服务器时间与本地时间差值
|
int differentialTime = 0;// 服务器时间与本地时间差值
|
||||||
|
|||||||
@ -90,6 +90,12 @@ class AddPalmLogic extends BaseGetXController {
|
|||||||
isBeforeAddUser: false
|
isBeforeAddUser: false
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
case 0xFE:
|
||||||
|
case 12:
|
||||||
|
// 管理员已满
|
||||||
|
showToast('管理员已满'.tr);
|
||||||
|
Get.close(1);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
//失败
|
//失败
|
||||||
state.ifAddState.value = false;
|
state.ifAddState.value = false;
|
||||||
@ -111,6 +117,7 @@ class AddPalmLogic extends BaseGetXController {
|
|||||||
Get.close(1);
|
Get.close(1);
|
||||||
break;
|
break;
|
||||||
case 0xFE:
|
case 0xFE:
|
||||||
|
case 12:
|
||||||
// 管理员已满
|
// 管理员已满
|
||||||
showToast('管理员已满'.tr);
|
showToast('管理员已满'.tr);
|
||||||
Get.close(1);
|
Get.close(1);
|
||||||
|
|||||||
@ -152,6 +152,13 @@ class PasswordKeyDetailLogic extends BaseGetXController {
|
|||||||
final List<String>? token = await Storage.getStringList(saveBlueToken);
|
final List<String>? token = await Storage.getStringList(saveBlueToken);
|
||||||
final List<int> getTokenList = changeStringListToIntList(token!);
|
final List<int> getTokenList = changeStringListToIntList(token!);
|
||||||
|
|
||||||
|
int startTime = 0;
|
||||||
|
int endTime = 0;
|
||||||
|
if (state.itemData.value.keyboardPwdType != 2) {
|
||||||
|
startTime = state.itemData.value.startDate! ~/ 1000;
|
||||||
|
endTime = state.itemData.value.endDate! ~/ 1000;
|
||||||
|
}
|
||||||
|
|
||||||
IoSenderManage.senderCustomPasswordsCommand(
|
IoSenderManage.senderCustomPasswordsCommand(
|
||||||
keyID: state.itemData.value.keyboardPwdId!.toString(),
|
keyID: state.itemData.value.keyboardPwdId!.toString(),
|
||||||
userID: await Storage.getUid(),
|
userID: await Storage.getUid(),
|
||||||
@ -162,8 +169,8 @@ class PasswordKeyDetailLogic extends BaseGetXController {
|
|||||||
? (state.isDeletPasswordKey.value == true ? 2 : 1)
|
? (state.isDeletPasswordKey.value == true ? 2 : 1)
|
||||||
: 3,
|
: 3,
|
||||||
isAdmin: state.isAdministrator.value == true ? 1 : 0,
|
isAdmin: state.isAdministrator.value == true ? 1 : 0,
|
||||||
startTime: state.itemData.value.startDate! ~/ 1000,
|
startTime: startTime,
|
||||||
endTime: state.itemData.value.endDate! ~/ 1000,
|
endTime: endTime,
|
||||||
needAuthor: 1,
|
needAuthor: 1,
|
||||||
isBeforeAddUser: false,
|
isBeforeAddUser: false,
|
||||||
signKey: signKeyDataList,
|
signKey: signKeyDataList,
|
||||||
|
|||||||
@ -90,6 +90,13 @@ class AddRemoteControlLogic extends BaseGetXController{
|
|||||||
isBeforeAddUser: false
|
isBeforeAddUser: false
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
case 0xFE:
|
||||||
|
case 12:
|
||||||
|
// 管理员已满
|
||||||
|
showToast('管理员已满'.tr);
|
||||||
|
state.ifAddState.value = false;
|
||||||
|
Get.close(1);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
//失败
|
//失败
|
||||||
state.ifAddState.value = false;
|
state.ifAddState.value = false;
|
||||||
@ -110,6 +117,7 @@ class AddRemoteControlLogic extends BaseGetXController{
|
|||||||
Get.close(1);
|
Get.close(1);
|
||||||
break;
|
break;
|
||||||
case 0xFE:
|
case 0xFE:
|
||||||
|
case 0x12:
|
||||||
// 管理员已满
|
// 管理员已满
|
||||||
showToast('管理员已满'.tr);
|
showToast('管理员已满'.tr);
|
||||||
Get.close(1);
|
Get.close(1);
|
||||||
|
|||||||
@ -449,50 +449,6 @@ class NearbyLockLogic extends BaseGetXController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 判断 128-bit UUID 是否已配对
|
|
||||||
bool isPaired128Bit(String serviceUuid) {
|
|
||||||
if (serviceUuid.length != 36) return false; // 确保是 128-bit UUID
|
|
||||||
try {
|
|
||||||
String status = serviceUuid.substring(30, 32); // 获取第 31 和 32 位
|
|
||||||
return status == '01'; // '01' 表示已配对
|
|
||||||
} catch (e) {
|
|
||||||
return false; // 如果索引越界或其他错误,返回 false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// 判断 128-bit UUID 是否休眠
|
|
||||||
bool isSleeping128Bit(String serviceUuid) {
|
|
||||||
if (serviceUuid.length != 36) return false; // 确保是 128-bit UUID
|
|
||||||
try {
|
|
||||||
String status = serviceUuid.substring(32, 34); // 获取第 33 和 34 位
|
|
||||||
return status == '00'; // '00' 表示休眠
|
|
||||||
} catch (e) {
|
|
||||||
return false; // 如果索引越界或其他错误,返回 false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// 判断 32-bit UUID 是否已配对
|
|
||||||
bool isPaired32Bit(String serviceUuid) {
|
|
||||||
if (serviceUuid.length != 8) return false; // 确保是 32-bit UUID
|
|
||||||
try {
|
|
||||||
String status = serviceUuid.substring(3, 5); // 获取第 4 和 5 位
|
|
||||||
return status == '01'; // '01' 表示已配对
|
|
||||||
} catch (e) {
|
|
||||||
return false; // 如果索引越界或其他错误,返回 false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// 判断 32-bit UUID 是否休眠
|
|
||||||
bool isSleeping32Bit(String serviceUuid) {
|
|
||||||
if (serviceUuid.length != 8) return false; // 确保是 32-bit UUID
|
|
||||||
try {
|
|
||||||
String status = serviceUuid.substring(5, 7); // 获取第 6 和 7 位
|
|
||||||
return status == '00'; // '00' 表示休眠
|
|
||||||
} catch (e) {
|
|
||||||
return false; // 如果索引越界或其他错误,返回 false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void stopScanBlueList() {
|
void stopScanBlueList() {
|
||||||
BlueManage().disconnect();
|
BlueManage().disconnect();
|
||||||
BlueManage().stopScan();
|
BlueManage().stopScan();
|
||||||
|
|||||||
@ -2,7 +2,6 @@ import 'dart:async';
|
|||||||
import 'package:star_lock/talk/starChart/proto/talk_data.pb.dart';
|
import 'package:star_lock/talk/starChart/proto/talk_data.pb.dart';
|
||||||
|
|
||||||
class TalkDataRepository {
|
class TalkDataRepository {
|
||||||
// 创建一个私有的构造函数,防止外部创建实例
|
|
||||||
TalkDataRepository._() {
|
TalkDataRepository._() {
|
||||||
_talkDataStreamController = StreamController<TalkData>.broadcast(
|
_talkDataStreamController = StreamController<TalkData>.broadcast(
|
||||||
onListen: () {
|
onListen: () {
|
||||||
@ -11,47 +10,26 @@ class TalkDataRepository {
|
|||||||
onCancel: () {
|
onCancel: () {
|
||||||
_isListening = false;
|
_isListening = false;
|
||||||
},
|
},
|
||||||
sync: false, // 异步模式
|
sync: false, // 改为同步模式以提高实时性
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 使用 _instance 来保存单例对象
|
|
||||||
static final TalkDataRepository _instance = TalkDataRepository._();
|
static final TalkDataRepository _instance = TalkDataRepository._();
|
||||||
|
|
||||||
// 提供一个静态方法来获取单例实例
|
|
||||||
static TalkDataRepository get instance => _instance;
|
static TalkDataRepository get instance => _instance;
|
||||||
|
|
||||||
// 创建一个 StreamController
|
|
||||||
late final StreamController<TalkData> _talkDataStreamController;
|
late final StreamController<TalkData> _talkDataStreamController;
|
||||||
|
|
||||||
bool _isListening = false;
|
bool _isListening = false;
|
||||||
|
|
||||||
// 用于存储数据的缓冲区
|
// 直接返回原始流,不做转换
|
||||||
final List<TalkData> _buffer = [];
|
Stream<TalkData> get talkDataStream => _talkDataStreamController.stream;
|
||||||
|
|
||||||
// 提供一个方法来获取 Stream
|
|
||||||
Stream<TalkData> get talkDataStream =>
|
|
||||||
_talkDataStreamController.stream.transform(
|
|
||||||
StreamTransformer<TalkData, TalkData>.fromHandlers(
|
|
||||||
handleData: (TalkData data, EventSink<TalkData> sink) {
|
|
||||||
// 限制缓冲区大小为 100
|
|
||||||
if (_buffer.length >= 100) {
|
|
||||||
_buffer.removeAt(0); // 丢弃最旧的数据
|
|
||||||
}
|
|
||||||
_buffer.add(data);
|
|
||||||
sink.add(data);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
// 提供一个方法来添加 TalkData 到 Stream
|
|
||||||
void addTalkData(TalkData talkData) {
|
void addTalkData(TalkData talkData) {
|
||||||
if (_isListening) {
|
if (_isListening) {
|
||||||
_talkDataStreamController.add(talkData);
|
_talkDataStreamController.add(talkData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 提供一个方法来关闭 StreamController
|
|
||||||
void dispose() {
|
void dispose() {
|
||||||
_talkDataStreamController.close();
|
_talkDataStreamController.close();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -595,27 +595,31 @@ class StartChartManage {
|
|||||||
|
|
||||||
// 发送拒绝接听消息
|
// 发送拒绝接听消息
|
||||||
void startTalkRejectMessageTimer() async {
|
void startTalkRejectMessageTimer() async {
|
||||||
talkRejectTimer ??= Timer.periodic(
|
try {
|
||||||
Duration(seconds: _defaultIntervalTime),
|
talkRejectTimer ??= Timer.periodic(
|
||||||
(Timer timer) async {
|
Duration(seconds: _defaultIntervalTime),
|
||||||
_sendTalkRejectMessage();
|
(Timer timer) async {
|
||||||
},
|
_sendTalkRejectMessage();
|
||||||
);
|
},
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
AppLog.log("startTalkRejectMessageTimer e:${e}");
|
||||||
|
} finally {
|
||||||
|
// 设置状态为拒绝
|
||||||
|
StartChartTalkStatus.instance.setRejected();
|
||||||
|
// 停止播放铃声
|
||||||
|
AudioPlayerManager().stopRingtone();
|
||||||
|
// 停止发送通话保持消息、通话预期数据请求
|
||||||
|
stopTalkExpectMessageTimer();
|
||||||
|
stopTalkPingMessageTimer();
|
||||||
|
stopCallRequestMessageTimer();
|
||||||
|
stopSendingRbcuInfoMessages();
|
||||||
|
stopSendingRbcuProBeMessages();
|
||||||
|
// 取消定时器
|
||||||
|
|
||||||
// 设置状态为拒绝
|
talkePingOverTimeTimerManager.cancel();
|
||||||
StartChartTalkStatus.instance.setRejected();
|
talkDataOverTimeTimerManager.cancel();
|
||||||
// 停止播放铃声
|
}
|
||||||
AudioPlayerManager().stopRingtone();
|
|
||||||
// 停止发送通话保持消息、通话预期数据请求
|
|
||||||
stopTalkExpectMessageTimer();
|
|
||||||
stopTalkPingMessageTimer();
|
|
||||||
stopCallRequestMessageTimer();
|
|
||||||
stopSendingRbcuInfoMessages();
|
|
||||||
stopSendingRbcuProBeMessages();
|
|
||||||
// 取消定时器
|
|
||||||
|
|
||||||
talkePingOverTimeTimerManager.cancel();
|
|
||||||
talkDataOverTimeTimerManager.cancel();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送期望接受消息
|
// 发送期望接受消息
|
||||||
|
|||||||
@ -38,8 +38,8 @@ class TalkViewLogic extends BaseGetXController {
|
|||||||
final LockDetailState lockDetailState = Get.put(LockDetailLogic()).state;
|
final LockDetailState lockDetailState = Get.put(LockDetailLogic()).state;
|
||||||
|
|
||||||
final int minBufferSize = 2; // 最小缓冲2帧,约166ms
|
final int minBufferSize = 2; // 最小缓冲2帧,约166ms
|
||||||
final int maxBufferSize = 8; // 最大缓冲8帧,约666ms
|
final int maxBufferSize = 20; // 最大缓冲8帧,约666ms
|
||||||
int bufferSize = 3; // 初始化为默认大小
|
int bufferSize = 8; // 初始化为默认大小
|
||||||
// 修改音频相关的成员变量
|
// 修改音频相关的成员变量
|
||||||
final int minAudioBufferSize = 1; // 音频最小缓冲1帧
|
final int minAudioBufferSize = 1; // 音频最小缓冲1帧
|
||||||
final int maxAudioBufferSize = 3; // 音频最大缓冲3帧
|
final int maxAudioBufferSize = 3; // 音频最大缓冲3帧
|
||||||
@ -184,20 +184,18 @@ class TalkViewLogic extends BaseGetXController {
|
|||||||
state.listData.value = Uint8List.fromList(oldestFrame.content);
|
state.listData.value = Uint8List.fromList(oldestFrame.content);
|
||||||
state.videoBuffer.removeAt(oldestIndex); // 移除已播放的帧
|
state.videoBuffer.removeAt(oldestIndex); // 移除已播放的帧
|
||||||
|
|
||||||
// 更新帧率计算
|
// // 更新帧率计算
|
||||||
_frameCount++;
|
// _frameCount++;
|
||||||
final currentTime = DateTime.now().millisecondsSinceEpoch;
|
// final currentTime = DateTime.now().millisecondsSinceEpoch;
|
||||||
final elapsed = currentTime - _lastFpsUpdateTime;
|
// final elapsed = currentTime - _lastFpsUpdateTime;
|
||||||
|
//
|
||||||
|
// if (elapsed >= 1000) {
|
||||||
|
// // 每秒更新一次
|
||||||
|
// state.fps.value = (_frameCount * 1000 / elapsed).round();
|
||||||
|
// _frameCount = 0;
|
||||||
|
// _lastFpsUpdateTime = currentTime;
|
||||||
|
// }
|
||||||
|
|
||||||
if (elapsed >= 1000) {
|
|
||||||
// 每秒更新一次
|
|
||||||
state.fps.value = (_frameCount * 1000 / elapsed).round();
|
|
||||||
_frameCount = 0;
|
|
||||||
_lastFpsUpdateTime = currentTime;
|
|
||||||
}
|
|
||||||
// AppLog.log('🎬 播放帧 - 缓冲区剩余: ${state.videoBuffer.length}/${bufferSize}, '
|
|
||||||
// '播放延迟: ${currentTime - oldestFrame.durationMs}ms, '
|
|
||||||
// '帧时间戳: ${oldestFrame.durationMs}');
|
|
||||||
} else {
|
} else {
|
||||||
// AppLog.log('⚠️ 帧未找到缓存 - Key: $cacheKey');
|
// AppLog.log('⚠️ 帧未找到缓存 - Key: $cacheKey');
|
||||||
state.videoBuffer.removeAt(oldestIndex); // 移除无法播放的帧
|
state.videoBuffer.removeAt(oldestIndex); // 移除无法播放的帧
|
||||||
@ -499,6 +497,7 @@ class TalkViewLogic extends BaseGetXController {
|
|||||||
_initAudioRecorder();
|
_initAudioRecorder();
|
||||||
|
|
||||||
requestPermissions();
|
requestPermissions();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user