Merge branch 'release' of gitee.com:starlock-cn/app-starlock into release

This commit is contained in:
Daisy 2024-06-15 17:21:08 +08:00
commit 58b898980b
26 changed files with 507 additions and 282 deletions

View File

@ -885,5 +885,6 @@
"请输入时间(秒)": "Please enter the time (seconds)",
"加载数据失败": "Failed to load data",
"重试": "Retry",
"升级中,是否退出": "During the upgrade, whether to exit"
"升级中,是否退出": "During the upgrade, whether to exit",
"该已锁被删除": "The locked is deleted"
}

View File

@ -917,5 +917,6 @@
"请输入时间(秒)": "请输入时间(秒)",
"加载数据失败": "加载数据失败",
"重试": "重试",
"升级中,是否退出": "升级中,是否退出"
"升级中,是否退出": "升级中,是否退出",
"该已锁被删除": "该已锁被删除"
}

View File

@ -883,5 +883,6 @@
"请输入时间(秒)": "请输入时间(秒)",
"加载数据失败": "加载数据失败",
"重试": "重试",
"升级中,是否退出": "升级中,是否退出"
"升级中,是否退出": "升级中,是否退出",
"该已锁被删除": "该已锁被删除"
}

View File

@ -9,7 +9,7 @@ import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart';
import 'package:star_lock/login/login/entity/LoginEntity.dart';
import 'package:star_lock/mine/mine/starLockMine_state.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/xs_jPhush.dart';
import 'package:star_lock/tools/push/xs_jPhush.dart';
import '../../mine/mine/starLockMine_logic.dart';
import '../../network/api_repository.dart';
@ -48,7 +48,7 @@ class StarLockLoginLogic extends BaseGetXController {
password: state.pwd.value,
countryCode: state.countryCode.value,
username: state.emailOrPhone.value,
deviceInfo: state.deviceInfoMap.value);
deviceInfo: state.deviceInfoMap);
if (entity.errorCode!.codeIsSuccessful) {
Storage.saveLoginData(entity.data);
Storage.setBool(saveIsVip, entity.data!.isVip == 1);
@ -61,12 +61,13 @@ class StarLockLoginLogic extends BaseGetXController {
}
Future<void> checkIpAction() async {
final CheckIPEntity entity = await ApiRepository.to.checkIpAction(
ip: ''
);
final CheckIPEntity entity = await ApiRepository.to.checkIpAction(ip: '');
if (entity.errorCode!.codeIsSuccessful) {
if(state.countryName.value == entity.data!.name){
ShowTipView().showSureAlertDialog('国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续'.tr, tipTitle: '确认国家或地区'.tr, sureStr: '我知道了'.tr);
if (state.countryName.value == entity.data!.name) {
ShowTipView().showSureAlertDialog(
'国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续'.tr,
tipTitle: '确认国家或地区'.tr,
sureStr: '我知道了'.tr);
}
}
}
@ -103,7 +104,7 @@ class StarLockLoginLogic extends BaseGetXController {
}
//
void flushedDeviceInfo(){
void flushedDeviceInfo() {
XSConstantMacro().getDeviceInfoData().then((Map<String, dynamic> data) {
state.deviceInfoMap.value = data;
}).catchError((dynamic error) {
@ -111,5 +112,4 @@ class StarLockLoginLogic extends BaseGetXController {
AppLog.log('获取设备信息时出错: $error');
});
}
}

View File

@ -11,7 +11,7 @@ import 'package:star_lock/login/login/entity/LoginEntity.dart';
import 'package:star_lock/login/register/entity/SendValidationCodeEntity.dart';
import 'package:star_lock/tools/eventBusEventManage.dart';
import 'package:star_lock/tools/storage.dart';
import 'package:star_lock/tools/xs_jPhush.dart';
import 'package:star_lock/tools/push/xs_jPhush.dart';
import '../../network/api_repository.dart';
import '../../tools/baseGetXController.dart';

View File

@ -14,7 +14,7 @@ import 'package:star_lock/tools/device_info_service.dart';
import 'package:star_lock/tools/pay/wx_pay_tool.dart';
import 'package:star_lock/tools/platform_info_services.dart';
import 'package:star_lock/tools/storage.dart';
import 'package:star_lock/tools/xs_jPhush.dart';
import 'package:star_lock/tools/push/xs_jPhush.dart';
import 'package:star_lock/translations/trans_lib.dart';
import 'app.dart';

View File

@ -9,6 +9,7 @@ import 'package:permission_handler/permission_handler.dart';
import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyList/entity/ElectronicKeyListEntity.dart';
import 'package:star_lock/main/lockDetail/lockSet/lockTime/getServerDatetime_entity.dart';
import 'package:star_lock/main/lockMian/entity/lockListInfo_entity.dart';
import 'package:star_lock/tools/throttler.dart';
import 'package:star_lock/widget/permission/permission_dialog.dart';
@ -174,6 +175,66 @@ class LockDetailLogic extends BaseGetXController {
}
}
Future<void> loadData({ required LockListInfoItemEntity lockListInfoItemEntity,required bool isOnlyOneData}) async {
state.keyInfos.value = lockListInfoItemEntity;
CommonDataManage().currentLockUserNo = state.keyInfos.value.lockUserNo!;
CommonDataManage().currentKeyInfo = state.keyInfos.value;
state.lockUserNo = state.keyInfos.value.lockUserNo!;
if (state.keyInfos.value.keyStatus ==
XSConstantMacro.keyStatusWaitIneffective ||
state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusFrozen ||
state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusExpired ||
state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusDeleted ||
state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusReset) {
state.openDoorBtnisUneable.value = false;
state.bottomBtnisEable.value = false;
} else {
state.openDoorBtnisUneable.value = true;
state.bottomBtnisEable.value = true;
}
state.isOnlyOneData = isOnlyOneData;
state.senderUserId = state.keyInfos.value.senderUserId!;
state.isAttendance.value = state.keyInfos.value.lockSetting!.attendance!;
state.isOpenLockNeedOnline.value =
state.keyInfos.value.lockSetting!.appUnlockOnline!;
state.electricQuantity.value = state.keyInfos.value.electricQuantity!;
state.isOpenPassageMode.value = state.keyInfos.value.passageMode!;
state.lockAlias.value = state.keyInfos.value.lockAlias!;
Storage.setString(saveLockAlias, state.lockAlias.value);
BlueManage().connectDeviceName =
state.keyInfos.value.bluetooth!.bluetoothDeviceName!;
final List<int> publicKeyData =
state.keyInfos.value.bluetooth!.publicKey!.cast<int>();
final List<String> saveStrList = changeIntListToStringList(publicKeyData);
Storage.setStringList(saveBluePublicKey, saveStrList);
//
final List<int> privateKeyData =
state.keyInfos.value.bluetooth!.privateKey!.cast<int>();
final List<String> savePrivateKeyList =
changeIntListToStringList(privateKeyData);
Storage.setStringList(saveBluePrivateKey, savePrivateKeyList);
// signKey
final List<int> signKeyData =
state.keyInfos.value.bluetooth!.signKey!.cast<int>();
final List<String> saveSignKeyList = changeIntListToStringList(signKeyData);
Storage.setStringList(saveBlueSignKey, saveSignKeyList);
final bool ifHaveKey = await Storage.ifHaveKey(saveBlueToken);
if (!ifHaveKey) {
final List<String> saveTokenList =
changeIntListToStringList(<int>[0, 0, 0, 0]);
Storage.setStringList(saveBlueToken, saveTokenList);
}
}
//
void openDoorError() {
resetOpenDoorState();
@ -184,7 +245,7 @@ class LockDetailLogic extends BaseGetXController {
//
void closeLuckStatus() {
state.openLockBtnState.value = 0;
state.openDoorBtnisUneable.value = true;
// state.openDoorBtnisUneable.value = true;
state.animationController!.stop(canceled: true);
cancelBlueConnetctToastTimer();
}
@ -518,7 +579,7 @@ class LockDetailLogic extends BaseGetXController {
void resetOpenDoorState() {
state.openLockBtnState.value = 0;
state.openDoorBtnisUneable.value = false;
// state.openDoorBtnisUneable.value = false;
state.animationController?.reset();
state.animationController?.forward();
eventBus.fire(RefreshLockDetailInfoDataEvent());

View File

@ -46,6 +46,7 @@ class _LockDetailPageState extends State<LockDetailPage>
// with RouteAware
final LockDetailLogic logic = Get.put(LockDetailLogic());
final LockDetailState state = Get.find<LockDetailLogic>().state;
StreamSubscription<void>? _lockRefreshLockDetailInfoDataEvent;
@override
void initState() {
@ -60,6 +61,16 @@ class _LockDetailPageState extends State<LockDetailPage>
_initRefreshLockDetailInfoDataEventAction();
logic.initReplySubscription();
logic.initLockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceAction();
logic.loadData(
lockListInfoItemEntity: widget.lockListInfoItemEntity,
isOnlyOneData: widget.isOnlyOneData);
}
@override
void deactivate() {
Get.delete<LockDetailLogic>();
super.deactivate();
}
@override
@ -70,8 +81,6 @@ class _LockDetailPageState extends State<LockDetailPage>
AppRouteObserver().routeObserver.subscribe(this, ModalRoute.of(context)!);
}
StreamSubscription? _lockRefreshLockDetailInfoDataEvent;
void _initRefreshLockDetailInfoDataEventAction() {
// eventBus
_lockRefreshLockDetailInfoDataEvent = eventBus
@ -81,68 +90,8 @@ class _LockDetailPageState extends State<LockDetailPage>
});
}
Future<void> loadData() async {
state.keyInfos.value = widget.lockListInfoItemEntity;
CommonDataManage().currentLockUserNo = state.keyInfos.value.lockUserNo!;
CommonDataManage().currentKeyInfo = state.keyInfos.value;
state.lockUserNo = state.keyInfos.value.lockUserNo!;
if (state.keyInfos.value.keyStatus ==
XSConstantMacro.keyStatusWaitIneffective ||
state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusFrozen ||
state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusExpired ||
state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusDeleted ||
state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusReset) {
state.openDoorBtnisUneable.value = false;
state.bottomBtnisEable.value = false;
} else {
state.openDoorBtnisUneable.value = true;
state.bottomBtnisEable.value = true;
}
state.isOnlyOneData = widget.isOnlyOneData;
state.senderUserId = state.keyInfos.value.senderUserId!;
state.isAttendance.value = state.keyInfos.value.lockSetting!.attendance!;
state.isOpenLockNeedOnline.value =
state.keyInfos.value.lockSetting!.appUnlockOnline!;
state.electricQuantity.value = state.keyInfos.value.electricQuantity!;
state.isOpenPassageMode.value = state.keyInfos.value.passageMode!;
state.lockAlias.value = state.keyInfos.value.lockAlias!;
Storage.setString(saveLockAlias, state.lockAlias.value);
BlueManage().connectDeviceName =
state.keyInfos.value.bluetooth!.bluetoothDeviceName!;
final List<int> publicKeyData =
state.keyInfos.value.bluetooth!.publicKey!.cast<int>();
final List<String> saveStrList = changeIntListToStringList(publicKeyData);
Storage.setStringList(saveBluePublicKey, saveStrList);
//
final List<int> privateKeyData =
state.keyInfos.value.bluetooth!.privateKey!.cast<int>();
final List<String> savePrivateKeyList =
changeIntListToStringList(privateKeyData);
Storage.setStringList(saveBluePrivateKey, savePrivateKeyList);
// signKey
final List<int> signKeyData =
state.keyInfos.value.bluetooth!.signKey!.cast<int>();
final List<String> saveSignKeyList = changeIntListToStringList(signKeyData);
Storage.setStringList(saveBlueSignKey, saveSignKeyList);
final bool ifHaveKey = await Storage.ifHaveKey(saveBlueToken);
if (!ifHaveKey) {
final List<String> saveTokenList =
changeIntListToStringList(<int>[0, 0, 0, 0]);
Storage.setStringList(saveBlueToken, saveTokenList);
}
}
@override
Widget build(BuildContext context) {
loadData();
return F.sw(skyCall: skWidget, xhjCall: xhjWidget);
}
@ -175,10 +124,16 @@ class _LockDetailPageState extends State<LockDetailPage>
height: 35.h,
),
labelText('images/icon_slider_horizontal.png', '功能'.tr, () {
if (state.openDoorBtnisUneable.value == false) {
return;
}
Get.to(LockDetailListPage(
title: '功能'.tr, items: getBottomWidget()));
}),
labelText('images/icon_puzzlepiece_extension.png', '配件'.tr, () {
if (state.openDoorBtnisUneable.value == false) {
return;
}
Get.to(LockDetailListPage(
title: '配件'.tr, items: getAttachmentWidget()));
}),
@ -365,7 +320,7 @@ class _LockDetailPageState extends State<LockDetailPage>
Icon(
Icons.bluetooth_searching,
size: 78.r,
color: AppColors.mainColor.withOpacity(0.6),
color: AppColors.wifiDisableColor.withOpacity(0.7),
)
else
Image.asset(
@ -388,7 +343,7 @@ class _LockDetailPageState extends State<LockDetailPage>
width: 168.r,
height: 168.r,
color: state.openDoorBtnisUneable.value == false
? AppColors.mainColor.withOpacity(0.6)
? AppColors.wifiDisableColor.withOpacity(0.7)
: state.isOpenPassageMode.value == 1
? Colors.red
: AppColors.mainColor,
@ -407,8 +362,7 @@ class _LockDetailPageState extends State<LockDetailPage>
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Text(
TranslationLoader
.lanKeys!.clickUnlockAndHoldDownClose!.tr,
logic.getKeyStatusTextAndShow(),
style: TextStyle(
color: AppColors.darkGrayTextColor,
fontSize: 20.sp,
@ -677,6 +631,9 @@ class _LockDetailPageState extends State<LockDetailPage>
state.keyInfos.value.lockSetting!.remoteUnlock == 1,
child: GestureDetector(
onTap: () {
if (state.openDoorBtnisUneable.value == false) {
return;
}
ShowCupertinoAlertView().isToRemoteUnLockAlert(
remoteUnlockAction: () {
if (state.keyInfos.value.hasGateway != 1) {
@ -793,6 +750,9 @@ class _LockDetailPageState extends State<LockDetailPage>
const Spacer(),
GestureDetector(
onTap: () {
if (state.openDoorBtnisUneable.value == false) {
return;
}
Get.toNamed(Routers.selectLockTypePage);
},
child: Padding(
@ -926,6 +886,9 @@ class _LockDetailPageState extends State<LockDetailPage>
//
showWidgetArr.add(bottomItem('images/main/icon_main_addLock.png', '新增配件'.tr,
state.bottomBtnisEable.value, () {
if (state.openDoorBtnisUneable.value == false) {
return;
}
Navigator.pushNamed(context, Routers.accessoriesListPage);
}));
@ -965,6 +928,9 @@ class _LockDetailPageState extends State<LockDetailPage>
'images/main/icon_main_clockingIn.png',
TranslationLoader.lanKeys!.checkingIn!.tr,
state.bottomBtnisEable.value, () {
if (state.openDoorBtnisUneable.value == false) {
return;
}
Get.toNamed(Routers.checkingInListPage,
arguments: state.keyInfos.value);
}));
@ -974,6 +940,9 @@ class _LockDetailPageState extends State<LockDetailPage>
'images/main/icon_main_operatingRecord.png',
TranslationLoader.lanKeys!.operatingRecord!.tr,
state.bottomBtnisEable.value, () {
if (state.openDoorBtnisUneable.value == false) {
return;
}
Get.toNamed(Routers.doorLockLogPage,
arguments: <String, LockListInfoItemEntity>{
'keyInfo': state.keyInfos.value
@ -983,6 +952,9 @@ class _LockDetailPageState extends State<LockDetailPage>
//
showWidgetArr.add(bottomItem('images/main/icon_main_set.png',
TranslationLoader.lanKeys!.set!.tr, true, () {
if (state.openDoorBtnisUneable.value == false) {
return;
}
Get.toNamed(Routers.lockSetPage, arguments: <String, Object?>{
'lockId': state.keyInfos.value.lockId,
'isOnlyOneData': state.isOnlyOneData
@ -1001,6 +973,9 @@ class _LockDetailPageState extends State<LockDetailPage>
'images/main/icon_main_clockingIn.png',
TranslationLoader.lanKeys!.checkingIn!.tr,
state.bottomBtnisEable.value, () {
if (state.openDoorBtnisUneable.value == false) {
return;
}
Get.toNamed(Routers.checkingInListPage,
arguments: state.keyInfos.value);
}));
@ -1011,6 +986,9 @@ class _LockDetailPageState extends State<LockDetailPage>
'images/main/icon_main_electronicKey.png',
TranslationLoader.lanKeys!.electronicKey!.tr,
state.bottomBtnisEable.value, () {
if (state.openDoorBtnisUneable.value == false) {
return;
}
Get.toNamed(Routers.electronicKeyListPage);
}));
@ -1019,6 +997,9 @@ class _LockDetailPageState extends State<LockDetailPage>
'images/main/icon_main_password.png',
TranslationLoader.lanKeys!.password!.tr,
state.bottomBtnisEable.value, () {
if (state.openDoorBtnisUneable.value == false) {
return;
}
Get.toNamed(Routers.passwordKeyListPage,
arguments: <String, LockListInfoItemEntity>{
'keyInfo': state.keyInfos.value
@ -1031,6 +1012,9 @@ class _LockDetailPageState extends State<LockDetailPage>
'images/main/icon_main_icCard.png',
TranslationLoader.lanKeys!.card!.tr,
state.bottomBtnisEable.value, () {
if (state.openDoorBtnisUneable.value == false) {
return;
}
Get.toNamed(Routers.cardListPage, arguments: <String, int?>{
'lockId': state.keyInfos.value.lockId,
});
@ -1043,6 +1027,9 @@ class _LockDetailPageState extends State<LockDetailPage>
'images/main/icon_main_fingerprint.png',
TranslationLoader.lanKeys!.fingerprint!.tr,
state.bottomBtnisEable.value, () {
if (state.openDoorBtnisUneable.value == false) {
return;
}
Get.toNamed(Routers.fingerprintListPage, arguments: <String, int?>{
'lockId': state.keyInfos.value.lockId,
});
@ -1055,6 +1042,9 @@ class _LockDetailPageState extends State<LockDetailPage>
'images/main/icon_main_remoteControl.png',
TranslationLoader.lanKeys!.remoteControl!.tr,
state.bottomBtnisEable.value, () {
if (state.openDoorBtnisUneable.value == false) {
return;
}
Get.toNamed(Routers.remoteControlListPage);
}));
}
@ -1066,6 +1056,9 @@ class _LockDetailPageState extends State<LockDetailPage>
'images/main/icon_face.png',
TranslationLoader.lanKeys!.humanFace!.tr,
state.bottomBtnisEable.value, () {
if (state.openDoorBtnisUneable.value == false) {
return;
}
Get.toNamed(Routers.faceListPage, arguments: <String, int?>{
'lockId': state.keyInfos.value.lockId,
});
@ -1078,6 +1071,9 @@ class _LockDetailPageState extends State<LockDetailPage>
bottomItem(
'images/main/icon_iris.png', '虹膜'.tr, state.bottomBtnisEable.value,
() {
if (state.openDoorBtnisUneable.value == false) {
return;
}
Get.toNamed(Routers.irisListPage, arguments: <String, int?>{
'lockId': state.keyInfos.value.lockId,
});
@ -1090,6 +1086,9 @@ class _LockDetailPageState extends State<LockDetailPage>
bottomItem(
'images/main/icon_palm.png', '手掌'.tr, state.bottomBtnisEable.value,
() {
if (state.openDoorBtnisUneable.value == false) {
return;
}
Get.toNamed(Routers.palmListPage, arguments: <String, int?>{
'lockId': state.keyInfos.value.lockId,
});
@ -1104,6 +1103,9 @@ class _LockDetailPageState extends State<LockDetailPage>
'images/main/icon_catEyes.png',
TranslationLoader.lanKeys!.monitoring!.tr,
state.bottomBtnisEable.value, () {
if (state.openDoorBtnisUneable.value == false) {
return;
}
Get.toNamed(Routers.realTimePicturePage, arguments: <String, Object?>{
'lockName': state.keyInfos.value.lockName,
'isMonitoring': true
@ -1118,6 +1120,9 @@ class _LockDetailPageState extends State<LockDetailPage>
'images/main/icon_main_authorizedAdmin.png',
TranslationLoader.lanKeys!.authorizedAdmin!.tr,
state.bottomBtnisEable.value, () {
if (state.openDoorBtnisUneable.value == false) {
return;
}
Get.toNamed(Routers.authorizedAdminListPage,
arguments: <String, LockListInfoItemEntity>{
'keyInfo': state.keyInfos.value
@ -1132,6 +1137,9 @@ class _LockDetailPageState extends State<LockDetailPage>
'images/main/icon_main_operatingRecord.png',
TranslationLoader.lanKeys!.operatingRecord!.tr,
state.bottomBtnisEable.value, () {
if (state.openDoorBtnisUneable.value == false) {
return;
}
// Get.toNamed(Routers.lockOperatingRecordPage,
// arguments: {"keyInfo": state.keyInfos.value});
Get.toNamed(Routers.doorLockLogPage,
@ -1147,6 +1155,9 @@ class _LockDetailPageState extends State<LockDetailPage>
'images/main/icon_lockDetail_videoLog.png',
TranslationLoader.lanKeys!.videoLog!.tr,
state.bottomBtnisEable.value, () {
if (state.openDoorBtnisUneable.value == false) {
return;
}
Get.toNamed(Routers.videoLogPage, arguments: <String, int?>{
'lockId': state.keyInfos.value.lockId,
});
@ -1158,6 +1169,9 @@ class _LockDetailPageState extends State<LockDetailPage>
'images/main/icon_lockDetail_messageReminding.png',
TranslationLoader.lanKeys!.messageReminding!.tr,
state.bottomBtnisEable.value, () {
if (state.openDoorBtnisUneable.value == false) {
return;
}
Get.toNamed(Routers.msgNotificationPage, arguments: <String, int?>{
'lockId': state.keyInfos.value.lockId,
'isSupportCatEye': state.keyInfos.value.lockFeature!.isSupportCatEye,
@ -1170,6 +1184,9 @@ class _LockDetailPageState extends State<LockDetailPage>
bottomItem('images/main/icon_main_set.png',
TranslationLoader.lanKeys!.set!.tr, true, () {
// logic.clickItemBtnAction(10);
if (state.openDoorBtnisUneable.value == false) {
return;
}
Get.toNamed(Routers.lockSetPage, arguments: <String, Object?>{
'lockId': state.keyInfos.value.lockId,
'isOnlyOneData': state.isOnlyOneData,

View File

@ -17,7 +17,6 @@ import 'package:star_lock/blue/io_reply.dart';
import 'package:star_lock/blue/io_tool/io_tool.dart';
import 'package:star_lock/blue/io_tool/manager_event_bus.dart';
import 'package:star_lock/blue/sender_manage.dart';
import 'package:star_lock/main/lockDetail/lockSet/lockEscalation/updateLockInfo_entity.dart';
import 'package:star_lock/main/lockDetail/lockSet/lockEscalation/version_entity.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/baseGetXController.dart';
@ -351,10 +350,10 @@ class LockEscalationLogic extends BaseGetXController {
otaIndex++;
processOtaUpgrade();
} else if (reply is ConfirmationOTAUpgradeReply && reply.status == 0x00) {
closeOTADAta();
ApiRepository.to.getLockUpdateLockInfo(
lockId: CommonDataManage().currentKeyInfo.lockId ?? 0,
fwVersion: state.showNewVersion.value);
closeOTADAta();
showToast('固件升级完成'.tr);
} else if (reply is GetStarLockStatuInfoReply) {
_replyGetStarLockStatusInfo(reply);

View File

@ -30,6 +30,7 @@ class Data {
isUpdate = json['isUpdate'];
downloadUrl = json['downloadUrl'];
description = json['description'];
version = json['version'];
}
int? isUpdate;

View File

@ -143,6 +143,7 @@ class LockListInfoItemEntity {
int? hasGateway;
int? appUnlockOnline;
String? mac;
int? updateDate;
LockListInfoItemEntity({
this.keyId,
@ -180,6 +181,7 @@ class LockListInfoItemEntity {
this.hasGateway,
this.appUnlockOnline,
this.mac,
this.updateDate,
});
LockListInfoItemEntity.fromJson(Map<String, dynamic> json) {
@ -224,6 +226,7 @@ class LockListInfoItemEntity {
hasGateway = json['hasGateway'];
appUnlockOnline = json['appUnlockOnline'];
mac = json['mac'];
updateDate = json['updateDate'];
}
Map<String, dynamic> toJson() {
@ -269,6 +272,7 @@ class LockListInfoItemEntity {
data['hasGateway'] = hasGateway;
data['appUnlockOnline'] = appUnlockOnline;
data['mac'] = mac;
data['updateDate'] = updateDate;
return data;
}

View File

@ -182,7 +182,7 @@ class _LockListXHJPageState extends State<LockListXHJPage> with RouteAware {
isLast = true;
}
list.add(Slidable(
key: ValueKey<int?>(keyInfo.keyId),
key: ValueKey<String?>('${keyInfo.keyId}_${keyInfo.updateDate}'),
endActionPane: ActionPane(
extentRatio: 0.5,
motion: const ScrollMotion(),

View File

@ -1,10 +1,16 @@
import 'dart:async';
import 'dart:io';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:get/get.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:star_lock/appRouters.dart';
import 'package:star_lock/flavors.dart';
import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_logic.dart';
import 'package:star_lock/main/lockMian/lockList/lockList_logic.dart';
import 'package:star_lock/tools/eventBusEventManage.dart';
import 'package:star_lock/tools/showTipView.dart';
import '../../../app_settings/app_settings.dart';
@ -18,6 +24,8 @@ import 'lockMain_state.dart';
class LockMainLogic extends BaseGetXController {
final LockMainState state = LockMainState();
final List<StreamSubscription<void>> _subscriptions =
<StreamSubscription<void>>[];
Future<LockListInfoEntity> getStarLockInfo(
{bool isUnShowLoading = false}) async {
@ -29,13 +37,14 @@ class LockMainLogic extends BaseGetXController {
);
if (entity.errorCode!.codeIsSuccessful) {
loadMainDataLogic(entity.data!);
Storage.saveMainListData(entity.data!);
}
return entity;
}
void loadMainDataLogic(LockListInfoGroupEntity entity) {
if (entity.groupList!.isEmpty) {
final bool every = entity.groupList!.every((GroupList list) =>
(list.lockList ?? <LockListInfoItemEntity>[]).isEmpty);
if (entity.groupList!.isEmpty || every) {
state.dataLength.value = 0;
} else if (entity.groupList!.length == 1) {
final GroupList groupList = entity.groupList![0];
@ -61,12 +70,13 @@ class LockMainLogic extends BaseGetXController {
}
});
}
Storage.saveMainListData(entity);
}
///
void getConnectType() async {
Future<void> getConnectType() async {
final ConnectivityResult connectResult =
await (Connectivity().checkConnectivity());
await Connectivity().checkConnectivity();
if (connectResult == ConnectivityResult.mobile) {
// _netType = "4G";
state.networkConnectionStatus.value = 1;
@ -133,6 +143,109 @@ class LockMainLogic extends BaseGetXController {
}
}
//
Future<void> flushedStarLockInfo(int keyId, int lockId) async {
final LockListInfoEntity entity = await ApiRepository.to.getStarLockInfo(
keyId: keyId,
);
if (entity.errorCode!.codeIsSuccessful) {
state.lockListInfoGroupEntity.value.groupList ??= <GroupList>[];
final GroupList list = entity.data!.groupList!.first;
final LockListInfoItemEntity listItem =
entity.data!.groupList!.first.lockList!.first;
final int groupIndex = state.lockListInfoGroupEntity.value.groupList
?.indexWhere(
(GroupList group) => group.groupId == list.groupId) ??
-1;
if (groupIndex != -1) {
//
state.lockListInfoGroupEntity.value.groupList![groupIndex].lockList ??=
<LockListInfoItemEntity>[];
final List<LockListInfoItemEntity> lockList = state
.lockListInfoGroupEntity.value.groupList![groupIndex].lockList!;
list.lockList ??= <LockListInfoItemEntity>[];
final int keyIndex = lockList.indexWhere(
(LockListInfoItemEntity lock) => lock.keyId == keyId) ??
-1;
if (keyIndex != -1) {
//
lockList.removeAt(keyIndex);
lockList.insert(keyIndex, listItem);
if (Get.isRegistered<LockDetailLogic>()) {
final bool isOnlyOneData =
F.sw(xhjCall: () => false, skyCall: () => lockList.length > 1);
Get.find<LockDetailLogic>().loadData(
lockListInfoItemEntity: listItem, isOnlyOneData: isOnlyOneData);
}
} else {
//
lockList.insert(0, listItem);
}
} else {
//
state.lockListInfoGroupEntity.value.groupList!.insert(0, list);
}
state.lockListInfoGroupEntity.refresh();
loadMainDataLogic(state.lockListInfoGroupEntity.value);
}
update();
}
//
Future<void> deleteStarLockInfo(int keyId, int lockId) async {
state.lockListInfoGroupEntity.value.groupList
?.forEach((GroupList groupList) {
groupList.lockList
?.removeWhere((LockListInfoItemEntity lock) => lock.keyId == keyId);
});
state.lockListInfoGroupEntity.refresh();
loadMainDataLogic(state.lockListInfoGroupEntity.value);
if (Get.isRegistered<LockDetailLogic>()) {
final bool isKey =
Get.find<LockDetailLogic>().state.keyInfos.value.keyId == keyId;
if (isKey) {
//
EasyLoading.showToast('该已锁被删除'.tr, duration: 3.seconds);
Get.until((Route<dynamic> route) =>
route.settings.name == Routers.starLockMain);
}
}
update();
}
//
void _initSubscription() {
_subscriptions.add(eventBus
.on<RefreshLockInfoDataEvent>()
.listen((RefreshLockInfoDataEvent event) {
//
flushedStarLockInfo(
event.keyId,
event.lockId,
);
}));
_subscriptions.add(eventBus
.on<DeleteLockInfoDataEvent>()
.listen((DeleteLockInfoDataEvent event) {
//
deleteStarLockInfo(
event.keyId,
event.lockId,
);
}));
_subscriptions.add(eventBus
.on<RogerThatLockInfoDataEvent>()
.listen((RogerThatLockInfoDataEvent event) {
//
flushedStarLockInfo(
event.keyId,
event.lockId,
);
}));
}
@override
void onReady() {
super.onReady();
@ -145,10 +258,14 @@ class LockMainLogic extends BaseGetXController {
void onInit() {
super.onInit();
checkWhetherPushIsEnabled();
_initSubscription();
}
@override
void onClose() {
_subscriptions.forEach((StreamSubscription<void> subscription) {
subscription.cancel();
});
super.onClose();
}
}

View File

@ -75,60 +75,62 @@ class _StarLockMainPageState extends State<StarLockMainPage>
@override
Widget build(BuildContext context) {
Widget child = EasyRefreshTool(
onRefresh: () {
SchedulerBinding.instance.addPostFrameCallback((_) {
//
logic.pageNo = 1;
getHttpData();
});
},
// child: getDataReturnUI(state.dataLength.value));
child: getDataReturnUI(state.dataLength.value));
if (widget.showAppBar || widget.showDrawer) {
child = Scaffold(
backgroundColor: const Color(0xFFF5F5F5),
appBar: widget.showAppBar
? TitleAppBar(
barTitle: F.navTitle,
haveBack: false,
haveOtherLeftWidget: true,
leftWidget: Builder(
builder: (BuildContext context) => IconButton(
icon: Image.asset(
'images/main/mainLeft_menu_icon.png',
color: Colors.white,
width: 44.w,
height: 44.w,
),
onPressed: () {
Scaffold.of(context).openDrawer();
},
)),
backgroundColor: AppColors.mainColor,
)
: null,
drawer: widget.showDrawer
? Drawer(
width: 1.sw / 3 * 2,
child: const StarLockMinePage(),
)
: null,
body: child,
);
}
child = F.sw(
skyCall: () => child,
xhjCall: () => Container(
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage('images/xhj_main_bg.jpg'),
fit: BoxFit.cover,
return GetBuilder<LockMainLogic>(builder: (LockMainLogic logic) {
Widget child = EasyRefreshTool(
onRefresh: () {
SchedulerBinding.instance.addPostFrameCallback((_) {
//
logic.pageNo = 1;
getHttpData();
});
},
// child: getDataReturnUI(state.dataLength.value));
child: getDataReturnUI(state.dataLength.value));
if (widget.showAppBar || widget.showDrawer) {
child = Scaffold(
backgroundColor: const Color(0xFFF5F5F5),
appBar: widget.showAppBar
? TitleAppBar(
barTitle: F.navTitle,
haveBack: false,
haveOtherLeftWidget: true,
leftWidget: Builder(
builder: (BuildContext context) => IconButton(
icon: Image.asset(
'images/main/mainLeft_menu_icon.png',
color: Colors.white,
width: 44.w,
height: 44.w,
),
onPressed: () {
Scaffold.of(context).openDrawer();
},
)),
backgroundColor: AppColors.mainColor,
)
: null,
drawer: widget.showDrawer
? Drawer(
width: 1.sw / 3 * 2,
child: const StarLockMinePage(),
)
: null,
body: child,
);
}
child = F.sw(
skyCall: () => child,
xhjCall: () => Container(
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage('images/xhj_main_bg.jpg'),
fit: BoxFit.cover,
),
),
),
child: child,
));
return child;
child: child,
));
return child;
});
}
Widget getDataReturnUI(int type) {
@ -232,10 +234,6 @@ class _StarLockMainPageState extends State<StarLockMainPage>
);
}
void onShow() {}
void onHide() {}
late StreamSubscription _teamEvent;
void _initLoadDataAction() {

View File

@ -9,7 +9,7 @@ import 'package:star_lock/mine/mineSet/mineSet/userSettingInfoEntity.dart';
import 'package:star_lock/mine/mineSet/mineSet/weChatQRCodeEntity.dart';
import 'package:star_lock/tools/showCupertinoAlertView.dart';
import 'package:star_lock/tools/storage.dart';
import 'package:star_lock/tools/xs_jPhush.dart';
import 'package:star_lock/tools/push/xs_jPhush.dart';
import 'package:star_lock/versionUndate/versionUndate_entity.dart';
import '../../../../network/api_repository.dart';
import '../../../../tools/baseGetXController.dart';

View File

@ -1,11 +0,0 @@
import 'package:get/get.dart';
import 'navLogic.dart';
class NavBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut(() => NavLogic());
}
}

View File

@ -1,6 +0,0 @@
import '../tools/baseGetXController.dart';
class NavLogic extends BaseGetXController {
}

View File

@ -1,82 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:star_lock/mine/mine/starLockMine_page.dart';
import '../app_settings/app_colors.dart';
import '../main/lockMian/lockMain/lockMain_page.dart';
class NavPages extends StatefulWidget {
const NavPages({Key? key}) : super(key: key);
@override
State<NavPages> createState() => _NavPagesState();
}
class _NavPagesState extends State<NavPages> {
int _currentIndex = 0;
final List<Widget> _listPage = [
StarLockMainPage(),
// StarLockMinePage(key: starLockMineKey),
];
@override
Widget build(BuildContext context) {
var sp;
return Scaffold(
body: IndexedStack(
///
// index: _currentIndex,
children: _listPage,
),
// bottomNavigationBar: BottomNavigationBar(
// elevation: 0.0,
// selectedFontSize: 24.sp,
// unselectedFontSize: 24.sp,
// type: BottomNavigationBarType.fixed,
// selectedItemColor: AppColors.mainColor,
// backgroundColor: Colors.white,
// currentIndex: _currentIndex, ///
// onTap: (index) {
// //bottomNavigationBar的点击事件
// if (_currentIndex == index) {
// return;
// }
// setState(() {
// _currentIndex = index; //
// });
// if (_currentIndex == 0) {
// starLockMainKey.currentState?.onShow();
// starLockMineKey.currentState?.onHide();
// } else if (_currentIndex == 1) {
// starLockMainKey.currentState?.onHide();
// starLockMineKey.currentState?.onShow();
// }
// },
// items: [
// BottomNavigationBarItem(
// icon: SizedBox(
// width: 56.w,
// height: 56.w,
// child: Image.asset(
// _currentIndex == 0
// ? 'images/tabbar/icon_tab_main_select.png'
// : 'images/tabbar/icon_tab_main_unselect.png',
// fit: BoxFit.cover),
// ),
// label: '首页'),
// BottomNavigationBarItem(
// icon: SizedBox(
// width: 56.w,
// height: 56.w,
// child: Image.asset(
// _currentIndex == 1
// ? 'images/tabbar/icon_tab_my_select.png'
// : 'images/tabbar/icon_tab_my_unselect.png',
// fit: BoxFit.cover),
// ),
// label: '我的'),
// ],
// ),
);
}
}

View File

@ -389,12 +389,13 @@ class ApiProvider extends BaseProvider {
//
Future<Response> getStarLockListInfo(int pageNo, int pageSize,
{bool isUnShowLoading = true}) =>
{bool isUnShowLoading = true, int? keyId,}) =>
post(
getStarLockInfoURL.toUrl,
jsonEncode({
jsonEncode(<String, dynamic>{
'pageNo': pageNo,
'pageSize': pageSize,
'keyId': keyId,
}),
isUnShowLoading: isUnShowLoading);

View File

@ -457,6 +457,13 @@ class ApiRepository {
return LockListInfoEntity.fromJson(res.body);
}
//
Future<LockListInfoEntity> getStarLockInfo({required int keyId}) async {
final res = await apiProvider.getStarLockListInfo(1, 20,
isUnShowLoading: true, keyId: keyId);
return LockListInfoEntity.fromJson(res.body);
}
//
Future<LockSetInfoEntity> getLockSettingInfoData(
{required String lockId}) async {

View File

@ -19,7 +19,7 @@ import 'package:star_lock/tools/storage.dart';
import '../versionUndate/versionUndateTool.dart';
import 'bugly/bugly_tool.dart';
import 'xs_jPhush.dart';
import 'push/xs_jPhush.dart';
class AppFirstEnterHandle {
Future<void> getAppFirstEnter(String flagStr) async {

View File

@ -1,4 +1,3 @@
// CommonDataManage的单例使
import 'package:get/get.dart';
@ -6,9 +5,10 @@ import '../main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart';
import '../main/lockMian/entity/lockListInfo_entity.dart';
class CommonDataManage {
factory CommonDataManage() => shareManager()!;
CommonDataManage._init();
static CommonDataManage? _manager;
static CommonDataManage? shareManager() {
@ -16,27 +16,29 @@ class CommonDataManage {
// _manager!._initBlue();
return _manager;
}
CommonDataManage? get manager => shareManager();
//
final RxInt _mainLockCount = 0.obs;
set setMainLockCount(int v) => _mainLockCount.value = v;
get getMainLockCount => _mainLockCount;
RxInt get getMainLockCount => _mainLockCount;
//
LockListInfoItemEntity currentKeyInfo = LockListInfoItemEntity();
//
int currentLockUserNo = 0;
// set setCurrentLockUserNo(int v) => _currentLockUserNo = v;
// get getCurrentLockUserNo => _currentLockUserNo;
LockSetInfoData currentLockSetInfoData = LockSetInfoData();
int dayLatestTime = (86400-1)*1000;
int dayLatestTime = (86400 - 1) * 1000;
// 0-1-2-NFC无源锁3-4-5-6-7- 8-
int seletLockType = 0;
}

View File

@ -7,20 +7,20 @@ EventBus eventBus = EventBus();
///
class RefreshLockListInfoDataEvent {
RefreshLockListInfoDataEvent(
{this.clearScanDevices = false, this.isUnShowLoading = false});
//
bool clearScanDevices;
bool isUnShowLoading;
RefreshLockListInfoDataEvent(
{this.clearScanDevices = false, this.isUnShowLoading = false});
}
///
class LockAddUserSucceedEvent {
LockAddUserSucceedEvent(this.dataList, this.type);
int type; // 0 1token失效
List<int> dataList;
LockAddUserSucceedEvent(this.dataList, this.type);
}
///
@ -45,9 +45,9 @@ class RefreshCheckInListEvent {
///
class PassCurrentLockInformationEvent {
LockSetInfoData lockSetInfoData;
PassCurrentLockInformationEvent(this.lockSetInfoData);
LockSetInfoData lockSetInfoData;
}
///
@ -57,16 +57,16 @@ class OtherTypeRefreshListEvent {
/// number
class ChickInAddStaffCardAndFingerprintBlockNumberEvent {
String number;
ChickInAddStaffCardAndFingerprintBlockNumberEvent(this.number);
String number;
}
///
class ChangeLanguageBlockLastLanguageEvent {
String languageTitle;
ChangeLanguageBlockLastLanguageEvent(this.languageTitle);
String languageTitle;
}
///
@ -76,45 +76,45 @@ class LockGroupEditGroupLockRefreshEvent {
///
class LockSetChangeSetRefreshLockDetailWithType {
LockSetChangeSetRefreshLockDetailWithType(this.type, this.setResult);
int type; // 0 1 2 3 4 5
dynamic setResult;
LockSetChangeSetRefreshLockDetailWithType(this.type, this.setResult);
}
///
class GetTVDataRefreshUI {
List<int> tvList;
GetTVDataRefreshUI(this.tvList);
List<int> tvList;
}
/// UDP接收状态然后刷新界面
class GetUDPStatusRefreshUI {
int udpStatus;
GetUDPStatusRefreshUI(this.udpStatus);
int udpStatus;
}
/// UDP接收状态然后刷新监控界面
class GetUDPStatusMonitorUI {
int udpStatus;
GetUDPStatusMonitorUI(this.udpStatus);
int udpStatus;
}
///
class GetFirstFrameGoPush {
bool isFirstFrame;
GetFirstFrameGoPush(this.isFirstFrame);
bool isFirstFrame;
}
/// typeIndex
class GetPasswordTypeUpdateIndex {
int passwordType;
GetPasswordTypeUpdateIndex(this.passwordType);
int passwordType;
}
///
@ -144,9 +144,9 @@ class MineAuthorizedAdminPageRefreshUI {
///
class DoorLockLogListRefreshUI {
DateTime getDoorLockLogTime;
DoorLockLogListRefreshUI(this.getDoorLockLogTime);
DateTime getDoorLockLogTime;
}
///
@ -163,3 +163,27 @@ class AuthorizedAdministratorListPageRefreshUI {
class MineInfoChangeRefreshUI {
MineInfoChangeRefreshUI();
}
///
class RefreshLockInfoDataEvent {
RefreshLockInfoDataEvent({required this.keyId, required this.lockId});
int keyId;
int lockId;
}
///
class DeleteLockInfoDataEvent {
DeleteLockInfoDataEvent({required this.keyId, required this.lockId});
int keyId;
int lockId;
}
///
class RogerThatLockInfoDataEvent {
RogerThatLockInfoDataEvent({required this.keyId, required this.lockId});
int keyId;
int lockId;
}

View File

@ -0,0 +1,10 @@
class MessageConstant {
//
static const int keyStateChange = 10;
//
static const int keyDelete = 20;
//
static const int lockReceive = 30;
//+
static const int keyReceive = 40;
}

View File

@ -0,0 +1,78 @@
import 'dart:convert';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/tools/eventBusEventManage.dart';
import 'package:star_lock/tools/push/message_constant.dart';
class MessageManagement {
//
static Future<void> shunting(Map<String, dynamic> message) async {
if (message.isEmpty) {
return;
}
Map<String, dynamic> extra = <String, dynamic>{};
if (GetPlatform.isAndroid) {
extra = _androidAnalysis(message);
AppLog.log('MessageManagement.shunting GetPlatform.isAndroid: $extra');
} else if (GetPlatform.isIOS) {
extra = _iosAnalysis(message);
AppLog.log('MessageManagement.shunting GetPlatform.isIos: $extra');
} else {
return;
}
if (extra.isEmpty) {
return;
}
_shuntingBus(extra);
}
//android解析
static Map<String, dynamic> _androidAnalysis(Map<String, dynamic> data) {
// {alert: , extras: {cn.jpush.android.TYPE_PLATFORM: 0, cn.jpush.android.CONTENT_TYPE: , cn.jpush.android.MSG_ID: 18101501949885538, cn.jpush.android.EXTRA: {"eventNo":10,"keyId":530,"lockId":7}}, message: }
final Map<Object?, dynamic> extras = data['extras'];
final Map<String, dynamic> extra =
json.decode(extras['cn.jpush.android.EXTRA'] ?? '{}');
return extra;
}
//ios解析
static Map<String, dynamic> _iosAnalysis(Map<String, dynamic> data) {
// {content: , extras: {eventNo: 20, keyId: 580, lockId: 7}, _j_msgid: 18101504271412025}
final Map<Object?, Object?> extras = data['extras'];
final Map<String, dynamic> extra = <String, dynamic>{};
extras.forEach((Object? key, Object? value) {
extra[key!.toString()] = value;
});
return extra;
}
//
static void _shuntingBus(Map<String, dynamic> data) {
final int eventNo = data['eventNo'] ?? -1;
switch (eventNo) {
case MessageConstant.keyStateChange:
final int keyId = data['keyId'];
final int lockId = data['lockId'];
eventBus.fire(RefreshLockInfoDataEvent(keyId: keyId, lockId: lockId));
break;
case MessageConstant.keyDelete:
final int keyId = data['keyId'];
final int lockId = data['lockId'];
eventBus.fire(DeleteLockInfoDataEvent(keyId: keyId, lockId: lockId));
break;
case MessageConstant.lockReceive:
final int keyId = data['keyId'];
final int lockId = data['lockId'];
eventBus.fire(RogerThatLockInfoDataEvent(keyId: keyId, lockId: lockId));
break;
case MessageConstant.keyReceive:
final int keyId = data['keyId'];
final int lockId = data['lockId'];
eventBus.fire(RogerThatLockInfoDataEvent(keyId: keyId, lockId: lockId));
break;
default:
throw Exception('无法识别eventNo 参数:$eventNo');
}
}
}

View File

@ -7,9 +7,10 @@ import 'package:star_lock/flavors.dart';
import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_entity.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/push/message_management.dart';
import 'package:star_lock/tools/storage.dart';
import '../app_settings/app_settings.dart';
import '../../app_settings/app_settings.dart';
class XSJPushProvider {
final JPush jpush = JPush();
@ -34,7 +35,7 @@ class XSJPushProvider {
appKey: appKey,
channel: 'flutter_channel',
production: false,
debug: true,
debug: false,
);
jpush.applyPushAuthority(
@ -54,6 +55,7 @@ class XSJPushProvider {
}, onReceiveMessage: (Map<String, dynamic> message) async {
AppLog.log('onReceiveMessage: $message');
//
MessageManagement.shunting(message);
}, onReceiveNotificationAuthorization:
(Map<String, dynamic> message) async {
AppLog.log('onReceiveNotificationAuthorization: $message');