Merge branch 'develop_liyi' into 'canary_release'

Develop liyi

See merge request StarlockTeam/app-starlock!19
This commit is contained in:
李仪 2025-04-16 06:30:06 +00:00
commit e37415789d
17 changed files with 143 additions and 148 deletions

View File

@ -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();
} }

View File

@ -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());

View File

@ -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);

View File

@ -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

View File

@ -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);
// } // }
}), }),
); );

View File

@ -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;
} }

View File

@ -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:
// //

View File

@ -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);
} }
} }

View File

@ -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) {
// //

View File

@ -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;//

View File

@ -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);

View File

@ -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,

View File

@ -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);

View File

@ -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();

View File

@ -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();
} }

View File

@ -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();
} }
// //

View File

@ -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; // 2166ms final int minBufferSize = 2; // 2166ms
final int maxBufferSize = 8; // 8666ms final int maxBufferSize = 20; // 8666ms
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