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

This commit is contained in:
Daisy 2024-06-11 17:55:05 +08:00
commit b3f0794f84
19 changed files with 344 additions and 216 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@ -1,115 +1,145 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.example.star_lock">
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation"/>
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />-->
<!-- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30" />-->
<!--允许访问网络,必选权限-->
<uses-permission android:name="android.permission.INTERNET"/>
<!--允许获取精确位置,精准定位必选-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--允许获取粗略位置,粗略定位必选-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!--允许获取设备和运营商信息用于问题排查和网络定位无gps情况下的定位若需网络定位功能则必选-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS"/>
<!--允许获取网络状态用于网络定位无gps情况下的定位若需网络定位功能则必选-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--允许获取wifi网络信息用于网络定位无gps情况下的定位若需网络定位功能则必选-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!--允许获取wifi状态改变用于网络定位无gps情况下的定位若需网络定位功能则必选-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!--允许写设备缓存,用于问题排查-->
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<!--允许读设备日志,用于问题排查-->
<uses-permission android:name="android.permission.READ_LOGS" />
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.star_lock">
<!--相机-->
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission
android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />-->
<!-- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30" />-->
<!--允许访问网络,必选权限-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允许获取精确位置,精准定位必选-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--允许获取粗略位置,粗略定位必选-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--允许获取设备和运营商信息用于问题排查和网络定位无gps情况下的定位若需网络定位功能则必选-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
<!--允许获取网络状态用于网络定位无gps情况下的定位若需网络定位功能则必选-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允许获取wifi网络信息用于网络定位无gps情况下的定位若需网络定位功能则必选-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允许获取wifi状态改变用于网络定位无gps情况下的定位若需网络定位功能则必选-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!--允许写设备缓存,用于问题排查-->
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<!--允许读设备日志,用于问题排查-->
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<!--相机-->
<uses-permission android:name="android.permission.CAMERA" />
<!--允许麦克风权限,用于录音发送-->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.REORDER_TASKS"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<!-- 相册权限 34适配 -->
<uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />
<!--允许麦克风权限,用于录音发送-->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.REORDER_TASKS" />
<!-- 相册权限 34适配 -->
<uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />
<application android:usesCleartextTraffic="true" android:label="@string/app_name" android:name="android.app.Application" android:icon="@mipmap/ic_launcher">
<meta-data
android:name="flutterEmbedding"
android:value="2" />
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="1"/> <!-- 将您的通知渠道ID替换为您的实际ID -->
<meta-data
<!-- 移除 QUERY_ALL_PACKAGES 权限 -->
<uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES"
tools:node="remove" />
<application
android:name="android.app.Application"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:usesCleartextTraffic="true">
<meta-data
android:name="flutterEmbedding"
android:value="2" />
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="1" /> <!-- 将您的通知渠道ID替换为您的实际ID -->
<meta-data
android:name="com.huawei.hms.client.appid"
android:value="110798531"/>
<meta-data
android:value="110798531" />
<meta-data
android:name="com.huawei.hms.client.cpid"
android:value="1406555529261648640"/>
<meta-data android:name="OPPO_APPKEY"
android:value="OP-47f668c9943248118502aa58d066393b" />
android:value="1406555529261648640" />
<meta-data
android:name="OPPO_APPKEY"
android:value="OP-47f668c9943248118502aa58d066393b" />
<meta-data android:name="OPPO_APPID"
<meta-data
android:name="OPPO_APPID"
android:value="OP-31726001" />
<meta-data android:name="OPPO_APPSECRET"
<meta-data
android:name="OPPO_APPSECRET"
android:value="OP-05723986bba64183a71530b496922450" />
<!-- 配置定位Service -->
<service android:name="com.amap.api.location.APSService"/>
<!-- since JPushv3.6.8 oppov2.1.0 oppo 核心功能-->
<service android:name="cn.jpush.android.service.PluginOppoPushService"
android:permission="com.coloros.mcs.permission.SEND_MCS_MESSAGE"
android:exported="true">
<intent-filter>
<action android:name="com.coloros.mcs.action.RECEIVE_MCS_MESSAGE" />
</intent-filter>
</service>
<!-- 配置定位Service -->
<service android:name="com.amap.api.location.APSService" />
<!-- since JPushv3.6.8 oppov2.1.0 oppo 核心功能-->
<service
android:name="cn.jpush.android.service.PluginOppoPushService"
android:exported="true"
android:permission="com.coloros.mcs.permission.SEND_MCS_MESSAGE">
<intent-filter>
<action android:name="com.coloros.mcs.action.RECEIVE_MCS_MESSAGE" />
</intent-filter>
</service>
<!-- since JPushv3.6.8 oppov2.1.0 oppo 核心功能-->
<service
android:name="com.heytap.msp.push.service.DataMessageCallbackService"
android:permission="com.heytap.mcs.permission.SEND_PUSH_MESSAGE"
android:exported="true">
<intent-filter>
<action android:name="com.heytap.mcs.action.RECEIVE_MCS_MESSAGE"/>
<action android:name="com.heytap.msp.push.RECEIVE_MCS_MESSAGE"/>
</intent-filter>
</service> <!--兼容Q版本-->
<activity android:name="com.skychip.lock.MainActivity" android:exported="true" android:screenOrientation="portrait" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme"/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="skysmartlock" />
</intent-filter>
<!-- since JPushv3.6.8 oppov2.1.0 oppo 核心功能-->
<service
android:name="com.heytap.msp.push.service.DataMessageCallbackService"
android:exported="true"
android:permission="com.heytap.mcs.permission.SEND_PUSH_MESSAGE">
</activity>
</application>
<intent-filter>
<action android:name="com.heytap.mcs.action.RECEIVE_MCS_MESSAGE" />
<action android:name="com.heytap.msp.push.RECEIVE_MCS_MESSAGE" />
</intent-filter>
</service> <!--兼容Q版本-->
<activity
android:name="com.skychip.lock.MainActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:exported="true"
android:hardwareAccelerated="true"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:theme="@style/LaunchTheme"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="skysmartlock" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@ -102,15 +102,14 @@ class StarLockLoginLogic extends BaseGetXController {
super.onClose();
}
@override
void onReady() {
super.onReady();
//
void flushedDeviceInfo(){
XSConstantMacro().getDeviceInfoData().then((Map<String, dynamic> data) {
state.deviceInfoMap.value = data;
}).catchError((error) {
}).catchError((dynamic error) {
//
AppLog.log('获取设备信息时出错: $error');
});
}
}

View File

@ -29,6 +29,7 @@ import '../../../tools/storage.dart';
import '../../../translations/trans_lib.dart';
import '../lockOperatingRecord/keyOperationRecord_entity.dart';
import '../lockOperatingRecord/lockOperatingRecordGetLastRecordTime_entity.dart';
import '../lockSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_entity.dart';
import 'lockDetail_state.dart';
import 'lockNetToken_entity.dart';
@ -195,7 +196,7 @@ class LockDetailLogic extends BaseGetXController {
case 0x00:
//
final int dataLength = (reply.data[5] << 8) + reply.data[6];
// AppLog.log("dataLength:$dataLength");
AppLog.log('dataLength:$dataLength');
if (dataLength > 0) {
reply.data.removeRange(0, 7);
// 17
@ -203,17 +204,18 @@ class LockDetailLogic extends BaseGetXController {
return;
}
final List<List<int>> getList = splitList(reply.data, 17);
// AppLog.log("getList:$getList");
AppLog.log('getList:$getList');
final List uploadList = [];
for (int i = 0; i < getList.length; i++) {
final List<int> indexList = getList[i];
// AppLog.log("indexList:$indexList");
AppLog.log('indexList:$indexList');
final Map indexMap = {};
indexMap['type'] = indexList[0].toString();
int operateDate = 0;
if (indexList[0] == 2) {
final List<int> passwordData = reply.data.sublist(7, 17);
final List<int> passwordData = indexList.sublist(7, 17);
final String password = utf8String(passwordData);
AppLog.log('passwordData:$passwordData password:$password');
indexMap['user'] = password.toString();
} else {
final int userNo = (indexList[1] * 256) + indexList[2];
@ -222,10 +224,10 @@ class LockDetailLogic extends BaseGetXController {
indexMap['success'] = '1';
final int time = ((0xff & indexList[(3)]) << 24 |
final int time = (0xff & indexList[3]) << 24 |
(0xff & indexList[4]) << 16 |
(0xff & indexList[5]) << 8 |
(0xFF & indexList[6]));
(0xFF & indexList[6]);
operateDate = time * 1000;
indexMap['date'] = '$operateDate';
uploadList.add(indexMap);
@ -384,7 +386,7 @@ class LockDetailLogic extends BaseGetXController {
//
Future<void> uploadElectricQuantityRequest() async {
final KeyOperationRecordEntity entity = await ApiRepository.to
final UploadElectricQuantityEntity entity = await ApiRepository.to
.uploadElectricQuantity(
electricQuantity: state.electricQuantity.value.toString(),
electricQuantityStandby:

View File

@ -23,7 +23,7 @@ class LockOperatingRecordLogic extends BaseGetXController {
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((reply) {
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
if (reply is SenderReferEventRecordTimeReply) {
_replyReferEventRecordTime(reply);
}
@ -33,12 +33,12 @@ class LockOperatingRecordLogic extends BaseGetXController {
//
Future<void> _replyReferEventRecordTime(Reply reply) async {
cancelBlueConnetctToastTimer();
int status = reply.data[2];
final int status = reply.data[2];
switch (status) {
case 0x00:
//
int dataLength = (reply.data[5] << 8) + reply.data[6];
AppLog.log("dataLength:$dataLength");
final int dataLength = (reply.data[5] << 8) + reply.data[6];
AppLog.log('dataLength:$dataLength');
// var dataLength = reply.data[5];
if (dataLength > 0) {
reply.data.removeRange(0, 7);
@ -46,32 +46,32 @@ class LockOperatingRecordLogic extends BaseGetXController {
if(reply.data.length < 17){
return;
}
var getList = splitList(reply.data, 17);
AppLog.log("getList:$getList");
var uploadList = [];
final List<List<int>> getList = splitList(reply.data, 17);
AppLog.log('getList:$getList');
final List uploadList = [];
for (int i = 0; i < getList.length; i++) {
var indexList = getList[i];
AppLog.log("indexList:$indexList");
var indexMap = {};
indexMap["type"] = indexList[0].toString();
final List<int> indexList = getList[i];
AppLog.log('indexList:$indexList');
final Map indexMap = {};
indexMap['type'] = indexList[0].toString();
if(indexList[0] == 2){
var passwordData = indexList.sublist(7, 17);
var password = utf8String(passwordData);
AppLog.log("password:$password passwordData:$passwordData");
indexMap["user"] = password;
final List<int> passwordData = indexList.sublist(7, 17);
final String password = utf8String(passwordData);
AppLog.log('password:$password passwordData:$passwordData');
indexMap['user'] = password;
}else{
int userNo = (indexList[1]*256) + indexList[2];
indexMap["user"] = userNo.toString();
final int userNo = (indexList[1]*256) + indexList[2];
indexMap['user'] = userNo.toString();
}
indexMap["success"] = "1";
indexMap['success'] = '1';
int time = ((0xff & indexList[(3)]) << 24 |
final int time = (0xff & indexList[3]) << 24 |
(0xff & indexList[4]) << 16 |
(0xff & indexList[5]) << 8 |
(0xFF & indexList[6]));
indexMap["date"] = "${time * 1000}";
(0xFF & indexList[6]);
indexMap['date'] = '${time * 1000}';
uploadList.add(indexMap);
}
lockRecordUploadData(uploadList);
@ -99,14 +99,14 @@ class LockOperatingRecordLogic extends BaseGetXController {
});
BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionStateState) async {
if (connectionStateState == BluetoothConnectionState.connected) {
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var token = await Storage.getStringList(saveBlueToken);
List<int> getTokenList = changeStringListToIntList(token!);
final List<String>? token = await Storage.getStringList(saveBlueToken);
final List<int> getTokenList = changeStringListToIntList(token!);
var publicKey = await Storage.getStringList(saveBluePublicKey);
List<int> getPublicKeyList = changeStringListToIntList(publicKey!);
final List<String>? publicKey = await Storage.getStringList(saveBluePublicKey);
final List<int> getPublicKeyList = changeStringListToIntList(publicKey!);
IoSenderManage.senderReferEventRecordTimeCommand(
keyID: BlueManage().connectDeviceName,
@ -131,7 +131,7 @@ class LockOperatingRecordLogic extends BaseGetXController {
//
Future<KeyOperationRecordEntity> mockNetworkDataRequest() async {
KeyOperationRecordEntity entity = await ApiRepository.to.lockRecordList(
final KeyOperationRecordEntity entity = await ApiRepository.to.lockRecordList(
lockId:CommonDataManage().currentKeyInfo.lockId.toString(),
pageNo:pageNo.toString(),
recordType:'',
@ -161,7 +161,7 @@ class LockOperatingRecordLogic extends BaseGetXController {
//
void getLockRecordLastUploadDataTime() async {
LockOperatingRecordGetLastRecordTimeEntity entity = await ApiRepository.to
final LockOperatingRecordGetLastRecordTimeEntity entity = await ApiRepository.to
.getLockRecordLastUploadDataTime(
lockId: CommonDataManage().currentKeyInfo.lockId.toString());
if (entity.errorCode!.codeIsSuccessful) {
@ -172,7 +172,7 @@ class LockOperatingRecordLogic extends BaseGetXController {
//
void lockRecordUploadData(List list) async {
KeyOperationRecordEntity entity = await ApiRepository.to
final KeyOperationRecordEntity entity = await ApiRepository.to
.lockRecordUploadData(lockId: CommonDataManage().currentKeyInfo.lockId.toString(), records: list);
if (entity.errorCode!.codeIsSuccessful) {
if(state.ifHaveNext == true){
@ -186,9 +186,9 @@ class LockOperatingRecordLogic extends BaseGetXController {
//
void clearOperationRecordRequest() async {
KeyOperationRecordEntity entity = await ApiRepository.to.clearOperationRecord(CommonDataManage().currentKeyInfo.lockId.toString());
final KeyOperationRecordEntity entity = await ApiRepository.to.clearOperationRecord(CommonDataManage().currentKeyInfo.lockId.toString());
if (entity.errorCode!.codeIsSuccessful) {
showToast("清除数据成功", something: (){
showToast('清除数据成功', something: (){
pageNo = 1;
mockNetworkDataRequest();
});
@ -201,7 +201,7 @@ class LockOperatingRecordLogic extends BaseGetXController {
super.onReady();
//
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
// _initReplySubscription();
@ -215,7 +215,7 @@ class LockOperatingRecordLogic extends BaseGetXController {
super.onInit();
//
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
getLockRecordLastUploadDataTime();
// senderReferEventRecordTime();
@ -230,7 +230,7 @@ class LockOperatingRecordLogic extends BaseGetXController {
super.onClose();
//
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
_replySubscription.cancel();
// _getDoorLockLogListRefreshUIEvent?.cancel();

View File

@ -0,0 +1,43 @@
class UploadElectricQuantityEntity {
UploadElectricQuantityEntity(
{this.errorCode, this.description, this.errorMsg, this.data});
UploadElectricQuantityEntity.fromJson(Map<String, dynamic> json) {
errorCode = json['errorCode'];
description = json['description'];
errorMsg = json['errorMsg'];
data = json['data'] != null ? Data.fromJson(json['data']) : null;
}
int? errorCode;
String? description;
String? errorMsg;
Data? data;
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['errorCode'] = errorCode;
data['description'] = description;
data['errorMsg'] = errorMsg;
if (this.data != null) {
data['data'] = this.data!.toJson();
}
return data;
}
}
class Data {
Data({this.electricQuantityDate});
Data.fromJson(Map<String, dynamic> json) {
electricQuantityDate = json['electricQuantityDate'];
}
int? electricQuantityDate;
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['electricQuantityDate'] = electricQuantityDate;
return data;
}
}

View File

@ -1,10 +1,9 @@
import 'dart:async';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/lockSet/lockTime/getServerDatetime_entity.dart';
import '../../../../../app_settings/app_settings.dart';
import '../../../../../blue/blue_manage.dart';
import '../../../../../blue/io_protocol/io_getStarLockStatusInfo.dart';
import '../../../../../blue/io_reply.dart';
@ -13,10 +12,10 @@ import '../../../../../blue/io_tool/manager_event_bus.dart';
import '../../../../../blue/sender_manage.dart';
import '../../../../../network/api_repository.dart';
import '../../../../../tools/baseGetXController.dart';
import '../../../../../tools/dateTool.dart';
import '../../../../../tools/eventBusEventManage.dart';
import '../../../../../tools/storage.dart';
import '../../../lockOperatingRecord/keyOperationRecord_entity.dart';
import 'uploadElectricQuantity_entity.dart';
import 'uploadElectricQuantity_state.dart';
class UploadElectricQuantityLogic extends BaseGetXController {
@ -25,13 +24,16 @@ class UploadElectricQuantityLogic extends BaseGetXController {
//
Future<void> uploadElectricQuantityRequest(
String electricQuantity, String electricQuantityStandby) async {
final KeyOperationRecordEntity entity = await ApiRepository.to
final UploadElectricQuantityEntity entity = await ApiRepository.to
.uploadElectricQuantity(
electricQuantity: electricQuantity,
electricQuantityStandby: electricQuantityStandby,
lockId: state.lockSetInfoData.value.lockId.toString(),
isUnShowLoading: false);
if (entity.errorCode!.codeIsSuccessful) {
state.uploadElectricQuantityDate.value = entity.data!.electricQuantityDate!;
state.lockSetInfoData.value.lockBasicInfo!.electricQuantityDate = state.uploadElectricQuantityDate.value;
showToast('锁电量更新成功'.tr, something: () {
eventBus
.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value));
@ -64,8 +66,8 @@ class UploadElectricQuantityLogic extends BaseGetXController {
IoSenderManage.senderGetStarLockStatuInfo(
lockID: BlueManage().connectDeviceName,
userID: await Storage.getUid(),
utcTimeStamp: state.serverTime,
unixTimeStamp: getLocalTime(),
utcTimeStamp: 0,
unixTimeStamp: 0,
isBeforeAddUser: false,
privateKey: getPrivateKeyList,
);
@ -114,10 +116,6 @@ class UploadElectricQuantityLogic extends BaseGetXController {
state.lockSetInfoData.value.lockBasicInfo!.electricQuantityStandby =
battRemCapStandby;
state.uploadElectricQuantityDate.value =
DateTime.now().millisecondsSinceEpoch;
state.lockSetInfoData.value.lockBasicInfo!.electricQuantityDate =
DateTime.now().millisecondsSinceEpoch;
uploadElectricQuantityRequest(
battRemCap.toString(), battRemCapStandby.toString());
break;
@ -130,8 +128,8 @@ class UploadElectricQuantityLogic extends BaseGetXController {
IoSenderManage.senderGetStarLockStatuInfo(
lockID: BlueManage().connectDeviceName,
userID: await Storage.getUid(),
utcTimeStamp: state.serverTime,
unixTimeStamp: getLocalTime(),
utcTimeStamp: 0,
unixTimeStamp: 0,
isBeforeAddUser: false,
privateKey: getPrivateKeyList,
);
@ -143,21 +141,21 @@ class UploadElectricQuantityLogic extends BaseGetXController {
}
}
//
Future<void> getServerDatetime() async {
final GetServerDatetimeEntity entity = await ApiRepository.to.getServerDatetimeData(isUnShowLoading:false);
if (entity.errorCode!.codeIsSuccessful) {
state.serverTime = entity.data!.date! ~/ 1000;
getStarLockStatus();
}
}
int getLocalTime(){
final DateTime now = DateTime.now();
final Duration timeZoneOffset = now.timeZoneOffset;
AppLog.log('timeZoneOffset.inSeconds:$timeZoneOffset.inSeconds');
return state.serverTime + timeZoneOffset.inSeconds;
}
// //
// Future<void> getServerDatetime() async {
// final GetServerDatetimeEntity entity = await ApiRepository.to.getServerDatetimeData(isUnShowLoading:false);
// if (entity.errorCode!.codeIsSuccessful) {
// state.serverTime = entity.data!.date! ~/ 1000;
// getStarLockStatus();
// }
// }
//
// int getLocalTime(){
// final DateTime now = DateTime.now();
// final Duration timeZoneOffset = now.timeZoneOffset;
// AppLog.log('timeZoneOffset.inSeconds:$timeZoneOffset.inSeconds');
// return state.serverTime + timeZoneOffset.inSeconds;
// }
@override
void onReady() {

View File

@ -94,7 +94,7 @@ class _UploadElectricQuantityPageState extends State<UploadElectricQuantityPage>
// margin: EdgeInsets.only(left: 03.w, right: 30.w, top: 20.w),
padding: EdgeInsets.only(top: 20.w, bottom: 20.w),
onClick: () {
logic.getServerDatetime();
logic.getStarLockStatus();
}),
],
),

View File

@ -23,5 +23,5 @@ class UploadElectricQuantityState {// 0普通状态可用 1不可用
RxBool ifCurrentScreen = true.obs; // ,
RxInt sureBtnState = 0.obs;
int serverTime = 0;// UTC+0
// int serverTime = 0;// UTC+0
}

View File

@ -64,8 +64,8 @@ class LockTimeLogic extends BaseGetXController{
IoSenderManage.senderGetStarLockStatuInfo(
lockID: BlueManage().connectDeviceName,
userID: await Storage.getUid(),
utcTimeStamp: 0,
unixTimeStamp: 0,
utcTimeStamp: state.serverTime,
unixTimeStamp: getLocalTime(),
isBeforeAddUser: false,
privateKey: getPrivateKeyList,
);
@ -82,7 +82,7 @@ class LockTimeLogic extends BaseGetXController{
switch(status){
case 0x00:
//
final String dataEime = DateTool().dateToYMDHNString('${state.differentialTime}');
final String dataEime = DateTool().dateToYMDHNString('${state.serverTime}');
state.dateTime.value = dataEime;
state.sureBtnState.value = 0;
@ -92,6 +92,24 @@ class LockTimeLogic extends BaseGetXController{
break;
case 0x06:
//
// final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
// final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
//
// final List<String>? token = await Storage.getStringList(saveBlueToken);
// final List<int> getTokenList = changeStringListToIntList(token!);
//
// final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
// final List<int> getSignKeyList = changeStringListToIntList(signKey!);
//
// IoSenderManage.senderTimingCommand(
// lockID:BlueManage().connectDeviceName,
// userID:await Storage.getUid(),
// nowTime: state.serverTime,
// token:getTokenList,
// needAuthor:1,
// signKey:getSignKeyList,
// privateKey:getPrivateKeyList,
// );
break;
default:
break;
@ -124,7 +142,7 @@ class LockTimeLogic extends BaseGetXController{
IoSenderManage.senderTimingCommand(
lockID:BlueManage().connectDeviceName,
userID:await Storage.getUid(),
nowTime: state.differentialTime,
nowTime: state.serverTime,
token:getTokenList,
needAuthor:1,
signKey:getSignKeyList,
@ -156,8 +174,8 @@ class LockTimeLogic extends BaseGetXController{
IoSenderManage.senderGetStarLockStatuInfo(
lockID: BlueManage().connectDeviceName,
userID: await Storage.getUid(),
utcTimeStamp: 0,
unixTimeStamp: 0,
utcTimeStamp: state.serverTime,
unixTimeStamp: getLocalTime(),
isBeforeAddUser: false,
privateKey: getPrivateKeyList,
);
@ -182,15 +200,26 @@ class LockTimeLogic extends BaseGetXController{
}
//
Future<void> getServerDatetime() async{
Future<void> getServerDatetime(bool isSendTime) async{
final GetServerDatetimeEntity entity = await ApiRepository.to.getServerDatetimeData(isUnShowLoading:false);
if(entity.errorCode!.codeIsSuccessful){
state.differentialTime = entity.data!.date! ~/ 1000;
state.serverTime = entity.data!.date! ~/ 1000;
// AppLog.log("entity.data!.date! ~/ 1000:${entity.data!.date! ~/ 1000} DateTime.now().millisecondsSinceEpoch ~/ 1000:${DateTime.now().millisecondsSinceEpoch ~/ 1000} 服务器时间差:${state.differentialTime}");
sendTiming();
if(isSendTime == false){
getStarLockStatus();
}else{
sendTiming();
}
}
}
int getLocalTime(){
final DateTime now = DateTime.now();
final Duration timeZoneOffset = now.timeZoneOffset;
AppLog.log('timeZoneOffset.inSeconds:$timeZoneOffset.inSeconds');
return state.serverTime + timeZoneOffset.inSeconds;
}
@override
void onReady() {
super.onReady();
@ -199,7 +228,8 @@ class LockTimeLogic extends BaseGetXController{
// getLockTimeFromGateway();
getStarLockStatus();
getServerDatetime(false);
}
@override

View File

@ -2,9 +2,9 @@ import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/lockSet/lockTime/lockTime_state.dart';
import '../../../../app_settings/app_colors.dart';
import '../../../../blue/blue_manage.dart';
import '../../../../tools/appRouteObserver.dart';
import '../../../../tools/submitBtn.dart';
import '../../../../tools/titleAppBar.dart';
@ -19,8 +19,8 @@ class LockTimePage extends StatefulWidget {
}
class _LockTimePageState extends State<LockTimePage> with RouteAware{
final logic = Get.put(LockTimeLogic());
final state = Get.find<LockTimeLogic>().state;
final LockTimeLogic logic = Get.put(LockTimeLogic());
final LockTimeState state = Get.find<LockTimeLogic>().state;
@override
Widget build(BuildContext context) {
@ -33,13 +33,13 @@ class _LockTimePageState extends State<LockTimePage> with RouteAware{
body: Container(
padding: EdgeInsets.all(30.w),
child: Column(
children: [
children: <Widget>[
SizedBox(
height: 50.h,
),
Obx(() => Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
children: <Widget>[
Text(state.dateTime.value,
style: TextStyle(
fontSize: 26.sp, color: AppColors.blackColor)),
@ -56,7 +56,7 @@ class _LockTimePageState extends State<LockTimePage> with RouteAware{
padding: EdgeInsets.only(top: 20.w, bottom: 20.w),
onClick: () {
// logic.sendTiming();
logic.getServerDatetime();
logic.getServerDatetime(true);
// logic.sendTiming();
}),
SizedBox(

View File

@ -10,7 +10,6 @@ class LockTimeState{// 0普通状态(可用) 1连接中(不可用)
}
Rx<LockSetInfoData> lockSetInfoData = LockSetInfoData().obs;
RxString dateTime = ''.obs;
int differentialTime = 0;
RxBool ifCurrentScreen = true.obs; // ,
RxInt sureBtnState = 0.obs;

View File

@ -73,6 +73,8 @@ class UploadDataLogic extends BaseGetXController{
state.uploadPasswordDataList.addAll(reply.data.sublist(9, reply.data.length));
if(dataLength == 10){
// 10
state.uploadPasswordPage = state.uploadPasswordPage + 1;
final List<int> token = reply.data.sublist(3, 7);
updataLockPasswordList(token, state.uploadPasswordPage);
}else{
@ -119,6 +121,8 @@ class UploadDataLogic extends BaseGetXController{
state.uploadCardDataList.addAll(reply.data.sublist(9, reply.data.length));
if(dataLength == 10){
// 10
state.uploadCardPage = state.uploadCardPage + 1;
final List<int> token = reply.data.sublist(3, 7);
updataLockCardList(token, state.uploadCardPage);
}else{
@ -163,6 +167,8 @@ class UploadDataLogic extends BaseGetXController{
state.uploadFingerprintDataList.addAll(reply.data.sublist(9, reply.data.length));
if(dataLength == 10){
// 10
state.uploadFingerprintPage = state.uploadFingerprintPage + 1;
final List<int> token = reply.data.sublist(3, 7);
updataLockFingerprintList(token, state.uploadFingerprintPage);
}else{
@ -207,6 +213,8 @@ class UploadDataLogic extends BaseGetXController{
state.uploadFaceDataList.addAll(reply.data.sublist(9, reply.data.length));
if(dataLength == 10){
// 10
state.uploadFacePage = state.uploadFacePage + 1;
final List<int> token = reply.data.sublist(3, 7);
updataLockFaceList(token, state.uploadFacePage);
}else{
@ -251,6 +259,8 @@ class UploadDataLogic extends BaseGetXController{
state.uploadPalmVeinDataList.addAll(reply.data.sublist(9, reply.data.length));
if(dataLength == 10){
// 10
state.uploadPalmVeinPage = state.uploadPalmVeinPage + 1;
final List<int> token = reply.data.sublist(3, 7);
updataLockPalmVeinList(token, state.uploadPalmVeinPage);
}else{

View File

@ -93,8 +93,7 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
TranslationLoader.lanKeys!.pleaseNameYourPassword!.tr,
state.nameController),
keyBottomWidget(
'密码生成后请在当日2359前使用一次进行激活否则过0点后未激活则失效。密码激活后有效期内不限次数使用。'
.tr)
'密码生成后请在当日2359前使用一次进行激活否则过0点后未激活则失效。密码激活后有效期内不限次数使用。'.tr)
],
),
);

View File

@ -52,6 +52,14 @@ class LockMainLogic extends BaseGetXController {
if (Get.isRegistered<LockListLogic>()) {
//
Get.find<LockListLogic>().setLockListInfoGroupEntity(entity);
} else {
//
Future<dynamic>.delayed(200.milliseconds, () {
if (Get.isRegistered<LockListLogic>()) {
//
Get.find<LockListLogic>().setLockListInfoGroupEntity(entity);
}
});
}
}

View File

@ -54,9 +54,7 @@ class _StarLockMainPageState extends State<StarLockMainPage>
if (clearScanDevices) {
BlueManage().scanDevices.clear();
}
WidgetsBinding.instance.addPostFrameCallback((_) async {
setState(() {});
});
setState(() {});
}
@override

View File

@ -60,6 +60,7 @@ import '../main/lockDetail/checkingIn/checkingInStaff/checkingInSetStaffList/che
import '../main/lockDetail/fingerprint/addFingerprint/addFingerprint_entity.dart';
import '../main/lockDetail/fingerprint/fingerprintList/fingerprintListData_entity.dart';
import '../main/lockDetail/lockOperatingRecord/keyOperationRecord_entity.dart';
import '../main/lockDetail/lockSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_entity.dart';
import '../main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifiEntity.dart';
import '../main/lockDetail/lockSet/lockSet/checkingInInfoData_entity.dart';
import '../main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart';
@ -341,14 +342,14 @@ class ApiRepository {
}
//
Future<KeyOperationRecordEntity> uploadElectricQuantity(
Future<UploadElectricQuantityEntity> uploadElectricQuantity(
{required String? electricQuantity,
required String? electricQuantityStandby,
required String? lockId,
required bool? isUnShowLoading}) async {
final res = await apiProvider.uploadElectricQuantity(
electricQuantity!, electricQuantityStandby!, lockId!, isUnShowLoading!);
return KeyOperationRecordEntity.fromJson(res.body);
return UploadElectricQuantityEntity.fromJson(res.body);
}
//

View File

@ -10,6 +10,7 @@ import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart';
import 'package:star_lock/flavors.dart';
import 'package:star_lock/login/login/app_get_version.dart';
import 'package:star_lock/login/login/starLock_login_logic.dart';
import 'package:star_lock/main.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/customer_tool.dart';
@ -30,6 +31,9 @@ class AppFirstEnterHandle {
}
getAppInfo();
await privacySDKInitialization();
if (Get.isRegistered<StarLockLoginLogic>()) {
Get.find<StarLockLoginLogic>().flushedDeviceInfo();
}
break;
case isAgreePosition: //
if (getFlag != isAgreePosition) {
@ -87,10 +91,11 @@ class AppFirstEnterHandle {
recognizer: TapGestureRecognizer()
..onTap = () {
//
Get.toNamed(Routers.webviewShowPage, arguments: <String, String>{
"url": XSConstantMacro.userAgreementURL,
"title": '用户协议'.tr
});
Get.toNamed(Routers.webviewShowPage,
arguments: <String, String>{
"url": XSConstantMacro.userAgreementURL,
"title": '用户协议'.tr
});
},
),
TextSpan(text: ''.tr),
@ -101,10 +106,11 @@ class AppFirstEnterHandle {
recognizer: TapGestureRecognizer()
..onTap = () {
//
Get.toNamed(Routers.webviewShowPage, arguments: <String, String>{
"url": XSConstantMacro.privacyPolicyURL,
"title": '隐私政策'.tr
});
Get.toNamed(Routers.webviewShowPage,
arguments: <String, String>{
"url": XSConstantMacro.privacyPolicyURL,
"title": '隐私政策'.tr
});
},
),
TextSpan(
@ -154,10 +160,11 @@ class AppFirstEnterHandle {
recognizer: TapGestureRecognizer()
..onTap = () {
//
Get.toNamed(Routers.webviewShowPage, arguments: <String, String>{
"url": XSConstantMacro.userAgreementURL,
"title": '用户协议'.tr
});
Get.toNamed(Routers.webviewShowPage,
arguments: <String, String>{
"url": XSConstantMacro.userAgreementURL,
"title": '用户协议'.tr
});
},
),
TextSpan(text: ''.tr),
@ -169,10 +176,11 @@ class AppFirstEnterHandle {
recognizer: TapGestureRecognizer()
..onTap = () {
//
Get.toNamed(Routers.webviewShowPage, arguments: <String, String>{
"url": XSConstantMacro.privacyPolicyURL,
"title": '隐私政策'.tr
});
Get.toNamed(Routers.webviewShowPage,
arguments: <String, String>{
"url": XSConstantMacro.privacyPolicyURL,
"title": '隐私政策'.tr
});
},
),
TextSpan(

View File

@ -67,8 +67,11 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# 1.0.57+2024060702xhj 线上环境,对外发布,提交测试
# 1.0.58+2024060702xhj 线上环境,对外发布,提交测试
# 1.0.59+2024060703xhj 线上环境,对外发布,提交测试
# 1.0.60+2024061101xhj 线上环境,对外发布,提交测试
# 1.0.60+2024061102xhj 线上环境,对外发布,提交测试
# 1.0.61+2024061103xhj 线上环境,对外发布,提交测试:处理华为拒审
version: 1.0.59+2024060703
version: 1.0.61+2024061103
environment:
sdk: '>=2.12.0 <3.0.0'