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:
commit
5ce3cba26c
BIN
star_lock/images/icon_circle_dotted.png
Normal file
BIN
star_lock/images/icon_circle_dotted.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.3 KiB |
BIN
star_lock/images/icon_lock_err.png
Normal file
BIN
star_lock/images/icon_lock_err.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.3 KiB |
BIN
star_lock/images/icon_lock_fill.png
Normal file
BIN
star_lock/images/icon_lock_fill.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.8 KiB |
File diff suppressed because it is too large
Load Diff
@ -807,5 +807,13 @@
|
|||||||
"该功能是高级功能,请开通后再使用":"该功能是高级功能,请开通后再使用",
|
"该功能是高级功能,请开通后再使用":"该功能是高级功能,请开通后再使用",
|
||||||
"常用程序":"常用程序",
|
"常用程序":"常用程序",
|
||||||
"该锁已被重置":"该锁已被重置",
|
"该锁已被重置":"该锁已被重置",
|
||||||
|
"需要访问读写权限才能使用手动升级固件":"需要访问读写权限才能使用手动升级固件",
|
||||||
|
"错误D固件,请选择正确的文件":"错误固件,请选择正确的文件",
|
||||||
|
"非SYD固件,请选择正确的文件":"非SYD固件,请选择正确的文件",
|
||||||
|
"文件校验失败 0x01":"文件校验失败 0x01",
|
||||||
|
"解析元数据失败,请选择正确的文件":"解析元数据失败,请选择正确的文件",
|
||||||
|
"文件校验失败 0x02":"文件校验失败 0x02",
|
||||||
|
"文件校验失败 0x03":"文件校验失败 0x03",
|
||||||
|
"固件升级完成":"固件升级完成",
|
||||||
"记录":"记录"
|
"记录":"记录"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -810,5 +810,13 @@
|
|||||||
"该功能是高级功能,请开通后再使用":"该功能是高级功能,请开通后再使用",
|
"该功能是高级功能,请开通后再使用":"该功能是高级功能,请开通后再使用",
|
||||||
"常用程序":"常用程序",
|
"常用程序":"常用程序",
|
||||||
"该锁已被重置":"该锁已被重置",
|
"该锁已被重置":"该锁已被重置",
|
||||||
"记录":"记录"
|
"记录":"记录",
|
||||||
|
"需要访问读写权限才能使用手动升级固件":"需要访问读写权限才能使用手动升级固件",
|
||||||
|
"错误D固件,请选择正确的文件":"错误固件,请选择正确的文件",
|
||||||
|
"非SYD固件,请选择正确的文件":"非SYD固件,请选择正确的文件",
|
||||||
|
"文件校验失败 0x01":"文件校验失败 0x01",
|
||||||
|
"解析元数据失败,请选择正确的文件":"解析元数据失败,请选择正确的文件",
|
||||||
|
"文件校验失败 0x02":"文件校验失败 0x02",
|
||||||
|
"文件校验失败 0x03":"文件校验失败 0x03",
|
||||||
|
"固件升级完成":"固件升级完成"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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"];
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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}) {
|
||||||
|
|||||||
@ -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"];
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user