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:get/get.dart';
import 'package:star_lock/apm/apm_helper.dart';
@ -174,8 +176,10 @@ class StarLockLoginLogic extends BaseGetXController {
state.canNext.value = state.pwdIsOK && state.isEmailOrPhone;
}
late StreamSubscription _agreePrivacySubscription;
void _initEventListen() {
eventBus
_agreePrivacySubscription = eventBus
.on<AgreePrivacyAgreement>()
.listen((AgreePrivacyAgreement event) async {
await JverifyOneClickLoginManage();
@ -194,6 +198,8 @@ class StarLockLoginLogic extends BaseGetXController {
@override
void onClose() {
//
_agreePrivacySubscription.cancel();
state.onClose();
super.onClose();
}

View File

@ -106,7 +106,6 @@ Future<void> privacySDKInitialization() async {
//
final StarLockLoginLogic loginLogic = Get.put(StarLockLoginLogic());
await JverifyOneClickLoginManage();
loginLogic.oneClickLoginAction();
loginLogic.state.isCheckVerifyEnable.value =
await JverifyOneClickLoginManage().checkVerifyEnable();
eventBus.fire(AgreePrivacyAgreement());

View File

@ -80,7 +80,7 @@ class AddICCardLogic extends BaseGetXController {
final List<int> token = reply.data.sublist(5, 9);
final List<String> saveStrList = changeIntListToStringList(token);
Storage.setStringList(saveBlueToken, saveStrList);
// AppLog.log('添加卡token:$token');
AppLog.log('添加卡token:$token');
IoSenderManage.senderAddCardWithTimeCycleCoercionCommand(
keyID: '1',
@ -107,6 +107,14 @@ class AddICCardLogic extends BaseGetXController {
token: token,
isBeforeAddUser: false);
break;
case 0xFE:
case 12:
//
state.ifAddState.value = false;
showToast('管理员已满'.tr, something: () {
Get.back();
});
break;
default:
//
state.ifAddState.value = false;
@ -146,6 +154,7 @@ class AddICCardLogic extends BaseGetXController {
Get.close(1);
break;
case 0xFE:
case 0x12:
//
showToast('管理员已满'.tr);
Get.close(1);

View File

@ -28,6 +28,7 @@ class CardListLogic extends BaseGetXController {
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription =
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
@ -69,11 +70,15 @@ class CardListLogic extends BaseGetXController {
userID: (await Storage.getUid())!,
cardNo: state.deletCardNo,
useCountLimit: 0xffff,
operate: state.isDeletAll == true ? 3 : 2, // 0: 1 2: 3
operate: state.isDeletAll == true ? 3 : 2,
// 0: 1 2: 3
isAdmin: 0,
isForce: 0, //
isRound: 0, //
weekRound: 0, //
isForce: 0,
//
isRound: 0,
//
weekRound: 0,
//
startDate: 0x11223344,
endDate: 0x11223344,
startTime: '0',
@ -116,11 +121,15 @@ class CardListLogic extends BaseGetXController {
userID: (await Storage.getUid())!,
cardNo: state.deletCardNo,
useCountLimit: 0xffff,
operate: state.isDeletAll == true ? 3 : 2, // 0: 1 2: 3
operate: state.isDeletAll == true ? 3 : 2,
// 0: 1 2: 3
isAdmin: 0,
isForce: 0, //
isRound: 0, //
weekRound: 0, //
isForce: 0,
//
isRound: 0,
//
weekRound: 0,
//
startDate: 0x11223344,
endDate: 0x11223344,
startTime: '0',
@ -193,6 +202,7 @@ class CardListLogic extends BaseGetXController {
//
late StreamSubscription _teamEvent;
void _initRefreshAction() {
_teamEvent = eventBus
.on<OtherTypeRefreshListEvent>()
@ -240,6 +250,7 @@ class CardListLogic extends BaseGetXController {
_initRefreshAction();
}
await getICCardListData(isRefresh: true);
}
@override

View File

@ -31,24 +31,24 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
final CardListLogic logic = Get.put(CardListLogic());
final CardListState state = Get.find<CardListLogic>().state;
Future<void> getHttpData({required bool isRefresh}) async {
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
logic
.getICCardListData(isRefresh: isRefresh)
.then((FingerprintListDataEntity value) {
if (mounted) {
setState(() {});
}
});
}
}
// Future<void> logic.getICCardListData({required bool isRefresh}) async {
// final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
// if (isDemoMode == false) {
// logic
// .getICCardListData(isRefresh: isRefresh)
// .then((FingerprintListDataEntity value) {
// if (mounted) {
// setState(() {});
// }
// });
// }
// }
@override
void initState() {
super.initState();
getHttpData(isRefresh: true);
// logic.getICCardListData(isRefresh: true);
}
@override
@ -92,17 +92,17 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
),
body: EasyRefreshTool(
onRefresh: () {
getHttpData(isRefresh: true);
logic.getICCardListData(isRefresh: true);
},
onLoad: () {
getHttpData(isRefresh: false);
logic.getICCardListData(isRefresh: false);
},
child: Column(
children: <Widget>[
KeySearchWidget(
editingController: state.searchController,
onSubmittedAction: () {
getHttpData(isRefresh: true);
logic.getICCardListData(isRefresh: true);
},
),
SizedBox(height: 20.h),
@ -115,10 +115,10 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
'fromType': 1 // 1 2
})!
.then((value) {
getHttpData(isRefresh: true);
logic.getICCardListData(isRefresh: true);
});
// if (data != null) {
// getHttpData(isRefresh: true);
// logic.getICCardListData(isRefresh: true);
// }
},
),
@ -180,9 +180,9 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
arguments: <String, FingerprintItemData>{
'fingerprintItemData': fingerprintItemData,
})!
.then((value) => getHttpData(isRefresh: true));
.then((value) => logic.getICCardListData(isRefresh: true));
// 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];
// AppLog.log('人脸开始state.maxRegCount.value:${state.maxRegCount.value}');
AppLog.log('人脸开始state.maxRegCount.value:${state.maxRegCount.value}');
break;
case 0x06:
//
@ -89,6 +89,12 @@ class AddFaceLogic extends BaseGetXController {
isBeforeAddUser: false
);
break;
case 0xFE:
case 12:
//
showToast('管理员已满'.tr);
Get.close(1);
break;
default:
//
state.ifAddState.value = false;
@ -112,9 +118,9 @@ class AddFaceLogic extends BaseGetXController {
Get.close(1);
break;
case 0xFE:
case 12:
//
showToast('管理员已满'.tr);
state.ifAddState.value = false;
Get.close(1);
break;
case 0xFD:
@ -138,7 +144,7 @@ class AddFaceLogic extends BaseGetXController {
//
//
state.regIndex.value = reply.data[6];
// AppLog.log('注册人脸过程state.regIndex.value:${state.regIndex.value}');
AppLog.log('注册人脸过程state.regIndex.value:${state.regIndex.value}');
break;
}

View File

@ -106,6 +106,7 @@ class AddFingerprintLogic extends BaseGetXController {
isBeforeAddUser: false);
break;
case 0xFE:
case 12:
//
state.ifAddState.value = false;
showToast('管理员已满'.tr, something: () {
@ -139,10 +140,12 @@ class AddFingerprintLogic extends BaseGetXController {
Get.close(1);
break;
case 0xFE:
//
showToast('管理员已满'.tr);
case 12:
//
state.ifAddState.value = false;
Get.close(1);
showToast('管理员已满'.tr, something: () {
Get.back();
});
break;
case 0xFD:
//

View File

@ -404,8 +404,8 @@ class FingerprintListLogic extends BaseGetXController {
void _initRefreshAction() {
_teamEvent = eventBus
.on<OtherTypeRefreshListEvent>()
.listen((OtherTypeRefreshListEvent event) {
getFingerprintsListData(isRefresh: true);
.listen((OtherTypeRefreshListEvent event) async {
await getFingerprintsListData(isRefresh: true);
});
}
@ -460,7 +460,7 @@ class FingerprintListLogic extends BaseGetXController {
if (isDemoMode == false) {
_initReplySubscription();
_initRefreshAction();
// _initRefreshAction();
getFingerprintsListData(isRefresh: true);
}
}

View File

@ -814,7 +814,7 @@ class LockDetailLogic extends BaseGetXController {
}
});
eventBus
state.DetailLockInfo = eventBus
.on<PassCurrentLockInformationEvent>()
.listen((PassCurrentLockInformationEvent event) {
if (event.lockSetInfoData.lockSettingInfo != null &&
@ -839,7 +839,7 @@ class LockDetailLogic extends BaseGetXController {
}
});
eventBus
state.SuccessfulDistributionNetworkEvent = eventBus
.on<SuccessfulDistributionNetwork>()
.listen((SuccessfulDistributionNetwork event) {
//

View File

@ -14,6 +14,8 @@ class LockDetailState {
late StreamSubscription<Reply> replySubscription;
StreamSubscription? lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent;
StreamSubscription? LockSetChangeSetRefreshLockDetailWithTypeSubscription;
StreamSubscription? DetailLockInfo;
StreamSubscription? SuccessfulDistributionNetworkEvent;
String lockNetToken = '0';
int differentialTime = 0;//

View File

@ -90,6 +90,12 @@ class AddPalmLogic extends BaseGetXController {
isBeforeAddUser: false
);
break;
case 0xFE:
case 12:
//
showToast('管理员已满'.tr);
Get.close(1);
break;
default:
//
state.ifAddState.value = false;
@ -111,6 +117,7 @@ class AddPalmLogic extends BaseGetXController {
Get.close(1);
break;
case 0xFE:
case 12:
//
showToast('管理员已满'.tr);
Get.close(1);

View File

@ -152,6 +152,13 @@ class PasswordKeyDetailLogic extends BaseGetXController {
final List<String>? token = await Storage.getStringList(saveBlueToken);
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(
keyID: state.itemData.value.keyboardPwdId!.toString(),
userID: await Storage.getUid(),
@ -162,8 +169,8 @@ class PasswordKeyDetailLogic extends BaseGetXController {
? (state.isDeletPasswordKey.value == true ? 2 : 1)
: 3,
isAdmin: state.isAdministrator.value == true ? 1 : 0,
startTime: state.itemData.value.startDate! ~/ 1000,
endTime: state.itemData.value.endDate! ~/ 1000,
startTime: startTime,
endTime: endTime,
needAuthor: 1,
isBeforeAddUser: false,
signKey: signKeyDataList,

View File

@ -90,6 +90,13 @@ class AddRemoteControlLogic extends BaseGetXController{
isBeforeAddUser: false
);
break;
case 0xFE:
case 12:
//
showToast('管理员已满'.tr);
state.ifAddState.value = false;
Get.close(1);
break;
default:
//
state.ifAddState.value = false;
@ -110,6 +117,7 @@ class AddRemoteControlLogic extends BaseGetXController{
Get.close(1);
break;
case 0xFE:
case 0x12:
//
showToast('管理员已满'.tr);
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() {
BlueManage().disconnect();
BlueManage().stopScan();

View File

@ -2,7 +2,6 @@ import 'dart:async';
import 'package:star_lock/talk/starChart/proto/talk_data.pb.dart';
class TalkDataRepository {
//
TalkDataRepository._() {
_talkDataStreamController = StreamController<TalkData>.broadcast(
onListen: () {
@ -11,47 +10,26 @@ class TalkDataRepository {
onCancel: () {
_isListening = false;
},
sync: false, //
sync: false, //
);
}
// 使 _instance
static final TalkDataRepository _instance = TalkDataRepository._();
//
static TalkDataRepository get instance => _instance;
// StreamController
late final StreamController<TalkData> _talkDataStreamController;
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) {
if (_isListening) {
_talkDataStreamController.add(talkData);
}
}
// StreamController
void dispose() {
_talkDataStreamController.close();
}

View File

@ -595,27 +595,31 @@ class StartChartManage {
//
void startTalkRejectMessageTimer() async {
talkRejectTimer ??= Timer.periodic(
Duration(seconds: _defaultIntervalTime),
(Timer timer) async {
_sendTalkRejectMessage();
},
);
try {
talkRejectTimer ??= Timer.periodic(
Duration(seconds: _defaultIntervalTime),
(Timer timer) async {
_sendTalkRejectMessage();
},
);
} catch (e) {
AppLog.log("startTalkRejectMessageTimer e:${e}");
} finally {
//
StartChartTalkStatus.instance.setRejected();
//
AudioPlayerManager().stopRingtone();
//
stopTalkExpectMessageTimer();
stopTalkPingMessageTimer();
stopCallRequestMessageTimer();
stopSendingRbcuInfoMessages();
stopSendingRbcuProBeMessages();
//
//
StartChartTalkStatus.instance.setRejected();
//
AudioPlayerManager().stopRingtone();
//
stopTalkExpectMessageTimer();
stopTalkPingMessageTimer();
stopCallRequestMessageTimer();
stopSendingRbcuInfoMessages();
stopSendingRbcuProBeMessages();
//
talkePingOverTimeTimerManager.cancel();
talkDataOverTimeTimerManager.cancel();
talkePingOverTimeTimerManager.cancel();
talkDataOverTimeTimerManager.cancel();
}
}
//

View File

@ -38,8 +38,8 @@ class TalkViewLogic extends BaseGetXController {
final LockDetailState lockDetailState = Get.put(LockDetailLogic()).state;
final int minBufferSize = 2; // 2166ms
final int maxBufferSize = 8; // 8666ms
int bufferSize = 3; //
final int maxBufferSize = 20; // 8666ms
int bufferSize = 8; //
//
final int minAudioBufferSize = 1; // 1
final int maxAudioBufferSize = 3; // 3
@ -184,20 +184,18 @@ class TalkViewLogic extends BaseGetXController {
state.listData.value = Uint8List.fromList(oldestFrame.content);
state.videoBuffer.removeAt(oldestIndex); //
//
_frameCount++;
final currentTime = DateTime.now().millisecondsSinceEpoch;
final elapsed = currentTime - _lastFpsUpdateTime;
// //
// _frameCount++;
// final currentTime = DateTime.now().millisecondsSinceEpoch;
// 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 {
// AppLog.log('⚠️ 帧未找到缓存 - Key: $cacheKey');
state.videoBuffer.removeAt(oldestIndex); //
@ -499,6 +497,7 @@ class TalkViewLogic extends BaseGetXController {
_initAudioRecorder();
requestPermissions();
}
@override