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

# Conflicts:
#	star_lock/images/lan/lan_en.json
#	star_lock/images/lan/lan_keys.json
#	star_lock/images/lan/lan_zh.json
合并代码
This commit is contained in:
Daisy 2024-04-30 11:27:27 +08:00
commit 5ce3cba26c
15 changed files with 705 additions and 634 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

File diff suppressed because it is too large Load Diff

View File

@ -807,5 +807,13 @@
"该功能是高级功能,请开通后再使用":"该功能是高级功能,请开通后再使用", "该功能是高级功能,请开通后再使用":"该功能是高级功能,请开通后再使用",
"常用程序":"常用程序", "常用程序":"常用程序",
"该锁已被重置":"该锁已被重置", "该锁已被重置":"该锁已被重置",
"需要访问读写权限才能使用手动升级固件":"需要访问读写权限才能使用手动升级固件",
"错误D固件请选择正确的文件":"错误固件,请选择正确的文件",
"非SYD固件请选择正确的文件":"非SYD固件请选择正确的文件",
"文件校验失败 0x01":"文件校验失败 0x01",
"解析元数据失败,请选择正确的文件":"解析元数据失败,请选择正确的文件",
"文件校验失败 0x02":"文件校验失败 0x02",
"文件校验失败 0x03":"文件校验失败 0x03",
"固件升级完成":"固件升级完成",
"记录":"记录" "记录":"记录"
} }

View File

@ -810,5 +810,13 @@
"该功能是高级功能,请开通后再使用":"该功能是高级功能,请开通后再使用", "该功能是高级功能,请开通后再使用":"该功能是高级功能,请开通后再使用",
"常用程序":"常用程序", "常用程序":"常用程序",
"该锁已被重置":"该锁已被重置", "该锁已被重置":"该锁已被重置",
"记录":"记录" "记录":"记录",
"需要访问读写权限才能使用手动升级固件":"需要访问读写权限才能使用手动升级固件",
"错误D固件请选择正确的文件":"错误固件,请选择正确的文件",
"非SYD固件请选择正确的文件":"非SYD固件请选择正确的文件",
"文件校验失败 0x01":"文件校验失败 0x01",
"解析元数据失败,请选择正确的文件":"解析元数据失败,请选择正确的文件",
"文件校验失败 0x02":"文件校验失败 0x02",
"文件校验失败 0x03":"文件校验失败 0x03",
"固件升级完成":"固件升级完成"
} }

View File

@ -316,7 +316,7 @@ SPEC CHECKSUMS:
flutter_native_contact_picker: bd430ba0fbf82768bb50c2c52a69a65759a8f907 flutter_native_contact_picker: bd430ba0fbf82768bb50c2c52a69a65759a8f907
flutter_pcm_sound: de0572ca4f99091cc2abfcc31601b8a4ddd33c0e flutter_pcm_sound: de0572ca4f99091cc2abfcc31601b8a4ddd33c0e
flutter_voice_processor: 2b89b93d69b02227ae3fd58589ee0bcfa3ca2a82 flutter_voice_processor: 2b89b93d69b02227ae3fd58589ee0bcfa3ca2a82
fluttertoast: 31b00dabfa7fb7bacd9e7dbee580d7a2ff4bf265 fluttertoast: 9f2f8e81bb5ce18facb9748d7855bf5a756fe3db
fluwx: daa284756ce53442b3d0417ceeda66e981906811 fluwx: daa284756ce53442b3d0417ceeda66e981906811
google_maps_flutter_ios: d1318b4ff711612cab16862d7a87e31a7403d458 google_maps_flutter_ios: d1318b4ff711612cab16862d7a87e31a7403d458
GoogleMaps: 20d7b12be49a14287f797e88e0e31bc4156aaeb4 GoogleMaps: 20d7b12be49a14287f797e88e0e31bc4156aaeb4

View File

@ -4,6 +4,8 @@ import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/blue/blue_manage.dart';
import 'package:star_lock/flavors.dart'; import 'package:star_lock/flavors.dart';
import 'package:star_lock/tools/app_manager.dart'; import 'package:star_lock/tools/app_manager.dart';
import 'package:star_lock/tools/bindings/app_binding.dart'; import 'package:star_lock/tools/bindings/app_binding.dart';
@ -115,8 +117,30 @@ class _MyAppState extends State<MyApp> with WidgetsBindingObserver, BaseWidget {
WidgetsBinding.instance.removeObserver(this); WidgetsBinding.instance.removeObserver(this);
super.dispose(); super.dispose();
} }
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
switch (state) {
case AppLifecycleState.inactive:
AppLog.log('App--->进入非活动状态');
break;
case AppLifecycleState.paused:
AppLog.log('App--->进入后台');
BlueManage().disconnect();
break;
case AppLifecycleState.resumed:
AppLog.log('App--->进入前台');
break;
case AppLifecycleState.detached:
AppLog.log('App--->挂起');
break;
case AppLifecycleState.hidden:
AppLog.log('App--->隐藏');
break;
}
}
}
Future<bool> getLoginStatus() async { Future<bool> getLoginStatus() async {
final data = await Storage.getString(saveUserLoginData); final data = await Storage.getString(saveUserLoginData);

View File

@ -97,7 +97,7 @@ class DoorLockLogLogic extends BaseGetXController {
} }
lockRecordUploadData(uploadList); lockRecordUploadData(uploadList);
if(dataLength == 20){ if(dataLength == state.logCountPage){
state.ifHaveNext = true; state.ifHaveNext = true;
} }
} }
@ -179,7 +179,7 @@ class DoorLockLogLogic extends BaseGetXController {
IoSenderManage.senderReferEventRecordTimeCommand( IoSenderManage.senderReferEventRecordTimeCommand(
keyID: BlueManage().connectDeviceName, keyID: BlueManage().connectDeviceName,
userID: await Storage.getUid(), userID: await Storage.getUid(),
logsCount: int.parse(pageSize), logsCount: state.logCountPage,
// time:DateTime.now().millisecondsSinceEpoch~/1000, // time:DateTime.now().millisecondsSinceEpoch~/1000,
time: state.operateDate, time: state.operateDate,
token: getTokenList, token: getTokenList,
@ -203,7 +203,7 @@ class DoorLockLogLogic extends BaseGetXController {
lockId: state.keyInfos.value.lockId!, lockId: state.keyInfos.value.lockId!,
lockEventType: state.dropdownValue.value, lockEventType: state.dropdownValue.value,
pageNo: 1, pageNo: 1,
pageSize: 20, pageSize: int.parse(pageSize),
startDate: state.startDate.value, startDate: state.startDate.value,
endDate: state.endDate.value); endDate: state.endDate.value);

View File

@ -49,6 +49,7 @@ class DoorLockLogState {
var ifCurrentScreen = true.obs; // , var ifCurrentScreen = true.obs; // ,
var operateDate = 0; // var operateDate = 0; //
var ifHaveNext = false; // var ifHaveNext = false; //
var logCountPage = 10; //
DoorLockLogState() { DoorLockLogState() {
keyInfos.value = Get.arguments["keyInfo"]; keyInfos.value = Get.arguments["keyInfo"];

View File

@ -191,7 +191,7 @@ class LockDetailLogic extends BaseGetXController {
} }
lockRecordUploadData(uploadList); lockRecordUploadData(uploadList);
if(dataLength == 20){ if(dataLength == state.logCountPage){
senderReferEventRecordTime(); senderReferEventRecordTime();
}else{ }else{
await BlueManage().disconnect(); await BlueManage().disconnect();
@ -383,7 +383,7 @@ class LockDetailLogic extends BaseGetXController {
IoSenderManage.senderReferEventRecordTimeCommand( IoSenderManage.senderReferEventRecordTimeCommand(
keyID: BlueManage().connectDeviceName, keyID: BlueManage().connectDeviceName,
userID: await Storage.getUid(), userID: await Storage.getUid(),
logsCount: 20, logsCount: state.logCountPage,
// time:DateTime.now().millisecondsSinceEpoch~/1000, // time:DateTime.now().millisecondsSinceEpoch~/1000,
time: state.operateDate, time: state.operateDate,
token: getTokenList, token: getTokenList,

View File

@ -127,7 +127,7 @@ class _LockDetailPageState extends State<LockDetailPage>
Storage.setStringList(saveBlueSignKey, saveSignKeyList); Storage.setStringList(saveBlueSignKey, saveSignKeyList);
bool ifHaveKey = await Storage.ifHaveKey(saveBlueToken); bool ifHaveKey = await Storage.ifHaveKey(saveBlueToken);
if(!ifHaveKey){ if (!ifHaveKey) {
var saveTokenList = changeIntListToStringList([0, 0, 0, 0]); var saveTokenList = changeIntListToStringList([0, 0, 0, 0]);
Storage.setStringList(saveBlueToken, saveTokenList); Storage.setStringList(saveBlueToken, saveTokenList);
} }
@ -172,7 +172,7 @@ class _LockDetailPageState extends State<LockDetailPage>
onTap: onTap, onTap: onTap,
child: Container( child: Container(
margin: EdgeInsets.symmetric(horizontal: 0.05.sw, vertical: 15.h), margin: EdgeInsets.symmetric(horizontal: 0.05.sw, vertical: 15.h),
padding: EdgeInsets.symmetric(horizontal: 0.05.sw, vertical: 20.h), padding: EdgeInsets.symmetric(horizontal: 0.05.sw, vertical: 30.h),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.circular(16.r), borderRadius: BorderRadius.circular(16.r),
@ -232,79 +232,78 @@ class _LockDetailPageState extends State<LockDetailPage>
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const Spacer(), const Spacer(),
Obx(() { GestureDetector(
return GestureDetector( onTap: state.openDoorBtnisUneable.value == true
onTap: state.openDoorBtnisUneable.value == true ? () {
? () { setState(() {
setState(() { startOpenLock();
startOpenLock(); });
}); }
} : null,
: null, onLongPressStart: state.openDoorBtnisUneable.value == true
onLongPressStart: state.openDoorBtnisUneable.value == true ? (details) {
? (details) { setState(() {
setState(() { startUnLock();
startUnLock(); });
}); }
} : null,
: null, child: Container(
child: Container( width: 100.r,
decoration: BoxDecoration( height: 100.r,
color: Colors.white.withOpacity(0.9), decoration: BoxDecoration(
borderRadius: BorderRadius.circular(100.w), color: Colors.white.withOpacity(0.9),
boxShadow: [ borderRadius: BorderRadius.circular(100.w),
BoxShadow( boxShadow: [
color: Colors.black.withOpacity(0.3), BoxShadow(
offset: Offset(0, 0), color: Colors.black.withOpacity(0.3),
blurRadius: 10.r, offset: Offset(0, 0),
spreadRadius: 0, blurRadius: 10.r,
), spreadRadius: 0,
]),
margin: EdgeInsets.only(left: 35.w, bottom: 15.h),
child: Stack(
children: [
FlavorsImg(
child: Image.asset(
state.openDoorBtnisUneable.value == false
? 'images/main/icon_main_openLockBtn_grey.png'
: (state.isOpenPassageMode.value == 1
? 'images/main/icon_main_normallyOpenMode_center.png'
: 'images/main/icon_main_openLockBtn_center.png'),
width: 96.r,
height: 96.r,
// color: AppColors.primaryTopColor,
),
), ),
state.openDoorBtnisUneable.value == false ]),
? Positioned( margin: EdgeInsets.only(left: 35.w, bottom: 15.h),
child: FlavorsImg( child: Stack(
alignment: AlignmentDirectional.center,
children: [
state.openDoorBtnisUneable.value == false
? Icon(
Icons.bluetooth_searching,
size: 48.r,
color: AppColors.mainColor,
)
: Image.asset(
state.isOpenPassageMode.value == 1
? 'images/icon_lock_err.png'
: 'images/icon_lock_fill.png',
width: 38.r,
height: 38.r,
color: AppColors.mainColor,
),
state.openDoorBtnisUneable.value == false
? Positioned(
child: Icon(
Icons.bluetooth_searching,
size: 96.r,
),
)
: state.openLockBtnState.value == 1
? xhjBuildRotationTransition(
width: 88.r,
height: 88.r,
)
: Positioned(
child: Image.asset( child: Image.asset(
'images/main/icon_main_openLockBtn_grey.png', 'images/icon_circle_dotted.png',
width: 96.r, width: 88.r,
height: 96.r, height: 88.r,
), color: state.isOpenPassageMode.value == 1
), ? Colors.red
) : AppColors.mainColor,
: state.openLockBtnState.value == 1 )),
? buildRotationTransition( ],
width: 96.r,
height: 96.r,
)
: Positioned(
child: FlavorsImg(
child: Image.asset(
state.isOpenPassageMode.value == 1
? 'images/main/icon_main_normallyOpenMode_circle.png'
: 'images/main/icon_main_openLockBtn_circle.png',
width: 96.r,
height: 96.r,
),
)),
],
),
), ),
); ),
}), ),
Padding( Padding(
padding: EdgeInsets.only(left: 15.w, right: 00.w, bottom: 15.h), padding: EdgeInsets.only(left: 15.w, right: 00.w, bottom: 15.h),
child: Row( child: Row(
@ -735,6 +734,28 @@ class _LockDetailPageState extends State<LockDetailPage>
); );
} }
//
Widget xhjBuildRotationTransition(
{required double width, required double height}) {
return Positioned(
child: RotationTransition(
//
alignment: Alignment.center,
//
turns: state.animationController!,
//view
child: Image.asset(
'images/icon_circle_dotted.png',
width: width,
height: height,
color: state.isOpenPassageMode.value == 1
? Colors.red
: AppColors.mainColor,
),
),
);
}
// //
Widget buildRotationTransition( Widget buildRotationTransition(
{required double width, required double height}) { {required double width, required double height}) {

View File

@ -47,7 +47,7 @@ class LockDetailState {
var currentPage = 0.obs; var currentPage = 0.obs;
var operateDate = 0; // var operateDate = 0; //
var logCountPage = 10; //
// LockDetailState() { // LockDetailState() {
// Map map = Get.arguments; // Map map = Get.arguments;
// lockCount = map["lockCount"]; // lockCount = map["lockCount"];

View File

@ -47,7 +47,7 @@ class LockEscalationLogic extends BaseGetXController {
// //
Future<void> otaUpdate() async { Future<void> otaUpdate() async {
var status = await PermissionDialog.request( var status = await PermissionDialog.request(
Permission.storage, '需要访问读写权限才能使用手动升级固件'); Permission.storage, '需要访问读写权限才能使用手动升级固件'.tr);
if (status != true) { if (status != true) {
return; return;
} }
@ -161,24 +161,52 @@ class LockEscalationLogic extends BaseGetXController {
// //
Future<Map?> getHeadFile(Uint8List data) async { Future<Map?> getHeadFile(Uint8List data) async {
if (data.length <= 16) {
showToast('错误固件,请选择正确的文件'.tr);
return null;
}
// //
String header = utf8.decode(data.sublist(0, 12)); String header;
try {
header = utf8.decode(data.sublist(0, 12));
} catch (e) {
showToast('非SYD固件请选择正确的文件'.tr);
return null;
}
if (header != 'SYD-BIN-DATA') { if (header != 'SYD-BIN-DATA') {
showToast('非SYD固件请选择正确的文件'); showToast('非SYD固件请选择正确的文件'.tr);
return null; return null;
} }
// //
Uint8List metaLenList = data.sublist(12, 16); Uint8List metaLenList;
int metaLen = ByteData.sublistView(metaLenList).getUint32(0); int metaLen;
try {
metaLenList = data.sublist(12, 16);
metaLen = ByteData.sublistView(metaLenList).getUint32(0);
} catch (e) {
showToast('文件校验失败 0x01'.tr);
return null;
}
if (metaLen < 2 || metaLen > 10240) { if (metaLen < 2 || metaLen > 10240) {
showToast('文件校验失败 0x01'); showToast('文件校验失败 0x01'.tr);
return null; return null;
} }
// //
Uint8List metaStrList = data.sublist(16, 16 + metaLen); Uint8List metaStrList;
String metaStr = utf8.decode(metaStrList); String metaStr;
try {
metaStrList = data.sublist(16, 16 + metaLen);
metaStr = utf8.decode(metaStrList);
} catch (e) {
showToast('解析元数据失败,请选择正确的文件'.tr);
return null;
}
AppLog.log(metaStr); AppLog.log(metaStr);
var meta = jsonDecode(metaStr); var meta = jsonDecode(metaStr);
if (meta is! Map) {
showToast('解析元数据失败,请选择正确的文件'.tr);
return null;
}
return meta..['metaLen'] = metaLen; return meta..['metaLen'] = metaLen;
} }
@ -191,11 +219,11 @@ class LockEscalationLogic extends BaseGetXController {
String md5Str = md5.convert(bin).toString().toUpperCase(); String md5Str = md5.convert(bin).toString().toUpperCase();
AppLog.log('---> $md5Str ${meta['fwMd5']}'); AppLog.log('---> $md5Str ${meta['fwMd5']}');
if (md5Str != meta['fwMd5']) { if (md5Str != meta['fwMd5']) {
showToast('文件校验失败 0x02'); showToast('文件校验失败 0x02'.tr);
return null; return null;
} }
if (bin.length != meta['fwSize']) { if (bin.length != meta['fwSize']) {
showToast('文件校验失败 0x03'); showToast('文件校验失败 0x03'.tr);
return null; return null;
} }
return bin; return bin;
@ -225,7 +253,7 @@ class LockEscalationLogic extends BaseGetXController {
processOtaUpgrade(); processOtaUpgrade();
} else if (reply is ConfirmationOTAUpgradeReply && reply.status == 0x00) { } else if (reply is ConfirmationOTAUpgradeReply && reply.status == 0x00) {
closeOTADAta(); closeOTADAta();
showToast('固件升级完成'); showToast('固件升级完成'.tr);
} }
}); });
} }

View File

@ -86,7 +86,8 @@ class _StarLockMainXHJPageState extends State<StarLockMainXHJPage>
], ],
), ),
bottomNavigationBar: Container( bottomNavigationBar: Container(
padding: EdgeInsets.only(top: 20.h), padding: EdgeInsets.only(
top: 20.h, bottom: GetPlatform.isAndroid ? 20.h : 0),
decoration: const BoxDecoration( decoration: const BoxDecoration(
color: Colors.transparent, color: Colors.transparent,
border: Border( border: Border(