diff --git a/images/lan/lan_en.json b/images/lan/lan_en.json index f0754730..630c677c 100755 --- a/images/lan/lan_en.json +++ b/images/lan/lan_en.json @@ -608,7 +608,7 @@ "卡详情": "Card details", "请输入": "Please enter", "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "After closing, the smart lock will be set to all-day open mode until manually closed", - "请输入小于1000的数字": "Please enter a number less than 1000", + "请输入小于或等于60的数字": "Please enter a number less than 60", "操作成功": "Operation success", "管理员密码相同,无需修改": "The administrator password is the same and does not need to be modified", "修改密码": "Modify password", diff --git a/images/lan/lan_keys.json b/images/lan/lan_keys.json index 9e5a1a1d..e470018b 100755 --- a/images/lan/lan_keys.json +++ b/images/lan/lan_keys.json @@ -633,7 +633,7 @@ "卡详情": "卡详情", "请输入": "请输入", "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "关闭后,智能锁将设置为全天常开模式,直到手动关闭", - "请输入小于1000的数字": "请输入小于1000的数字", + "请输入小于或等于60的数字": "请输入小于或等于60的数字", "操作成功": "操作成功", "管理员密码相同,无需修改": "管理员密码相同,无需修改", "修改密码": "修改密码", diff --git a/images/lan/lan_zh.json b/images/lan/lan_zh.json index 73152201..b83194c6 100755 --- a/images/lan/lan_zh.json +++ b/images/lan/lan_zh.json @@ -608,7 +608,7 @@ "卡详情": "卡详情", "请输入": "请输入", "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "关闭后,智能锁将设置为全天常开模式,直到手动关闭", - "请输入小于1000的数字": "请输入小于1000的数字", + "请输入小于或等于60的数字": "请输入小于或等于60的数字", "操作成功": "操作成功", "管理员密码相同,无需修改": "管理员密码相同,无需修改", "修改密码": "修改密码", diff --git a/lib/main/lockDetail/lockSet/automaticBlocking/automaticBlocking_logic.dart b/lib/main/lockDetail/lockSet/automaticBlocking/automaticBlocking_logic.dart index fafc4bc8..4dc59725 100755 --- a/lib/main/lockDetail/lockSet/automaticBlocking/automaticBlocking_logic.dart +++ b/lib/main/lockDetail/lockSet/automaticBlocking/automaticBlocking_logic.dart @@ -1,9 +1,10 @@ - import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:get/get.dart'; import 'package:star_lock/blue/io_protocol/io_setSupportFunctionsWithParameters.dart'; +import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import '../../../../blue/blue_manage.dart'; import '../../../../blue/io_reply.dart'; @@ -15,47 +16,50 @@ import '../../../../tools/eventBusEventManage.dart'; import '../../../../tools/storage.dart'; import 'automaticBlocking_state.dart'; -class AutomaticBlockingLogic extends BaseGetXController{ +class AutomaticBlockingLogic extends BaseGetXController { final AutomaticBlockingState state = AutomaticBlockingState(); - void setAutoUnLock() async{ + Future setAutoUnLock() async { String autoTime; - if(state.isOpen.value == false){ - autoTime = "0"; - }else{ - if(state.isCustomLockTime.value == true){ + if (state.isOpen.value == false) { + autoTime = '0'; + } else { + if (state.isCustomLockTime.value == true) { autoTime = state.timeController.text; - if(int.parse(autoTime) >= 1000){ - showToast("请输入小于1000的数字".tr); + if (int.parse(autoTime) > 60) { + showToast('请输入小于或等于60的数字'.tr); return; } - }else{ + } else { autoTime = state.autoLockTime.value; } } - var entity = await ApiRepository.to.setAutoUnlock( - lockId: state.lockSetInfoData.value.lockId!, - autoLock:state.isOpen.value == true ? 1 : 0, - autoLockSecond: int.parse(autoTime), + final LoginEntity entity = await ApiRepository.to.setAutoUnlock( + lockId: state.lockSetInfoData.value.lockId!, + autoLock: state.isOpen.value == true ? 1 : 0, + autoLockSecond: int.parse(autoTime), ); - if(entity.errorCode!.codeIsSuccessful){ - + if (entity.errorCode!.codeIsSuccessful) { state.autoLockTime.value = autoTime; - state.lockSetInfoData.value.lockSettingInfo!.autoLockSecond = int.parse(state.autoLockTime.value); - showToast("操作成功".tr, something: (){ + state.lockSetInfoData.value.lockSettingInfo!.autoLockSecond = + int.parse(state.autoLockTime.value); + showToast('操作成功'.tr, something: () { eventBus.fire(RefreshLockListInfoDataEvent()); - eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); + eventBus + .fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); Get.back(); - }); + }, maskType: EasyLoadingMaskType.clear); } } // 获取解析后的数据 late StreamSubscription _replySubscription; + void _initReplySubscription() { - _replySubscription = EventBusManager().eventBus!.on().listen((reply) { - if(reply is SetSupportFunctionsWithParametersReply) { + _replySubscription = + EventBusManager().eventBus!.on().listen((Reply reply) { + if (reply is SetSupportFunctionsWithParametersReply) { _replySetSupportFunctionsWithParameters(reply); } @@ -86,10 +90,10 @@ class AutomaticBlockingLogic extends BaseGetXController{ // 设置自动落锁数据解析 Future _replySetSupportFunctionsWithParameters(Reply reply) async { - int status = reply.data[2]; - switch(status){ + final int status = reply.data[2]; + switch (status) { case 0x00: - //成功 + //成功 state.sureBtnState.value = 0; cancelBlueConnetctToastTimer(); dismissEasyLoading(); @@ -106,34 +110,39 @@ class AutomaticBlockingLogic extends BaseGetXController{ // 设置支持功能(带参数) Future sendAutoLock() async { - if(state.sureBtnState.value == 1){ + if (state.sureBtnState.value == 1) { return; } state.sureBtnState.value = 1; showEasyLoading(); - showBlueConnetctToastTimer(action: (){ + showBlueConnetctToastTimer(action: () { dismissEasyLoading(); state.sureBtnState.value = 0; }); - BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { + BlueManage().blueSendData(BlueManage().connectDeviceName, + (BluetoothConnectionState connectionState) async { if (connectionState == BluetoothConnectionState.connected) { - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = + await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = + changeStringListToIntList(privateKey!); - var token = await Storage.getStringList(saveBlueToken); - List getTokenList = changeStringListToIntList(token!); + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); - var publicKey = await Storage.getStringList(saveBluePublicKey); - List getPublicKeyList = changeStringListToIntList(publicKey!); + final List? publicKey = + await Storage.getStringList(saveBluePublicKey); + final List getPublicKeyList = + changeStringListToIntList(publicKey!); String autoTime; - if(state.isOpen.value == false){ - autoTime = "0"; - }else{ - if(state.isCustomLockTime.value == true){ + if (state.isOpen.value == false) { + autoTime = '0'; + } else { + if (state.isCustomLockTime.value == true) { autoTime = state.timeController.text; - }else{ + } else { autoTime = state.autoLockTime.value; } } @@ -142,7 +151,7 @@ class AutomaticBlockingLogic extends BaseGetXController{ userID: await Storage.getUid(), featureBit: 29, featureParaLength: 2, - featureData: [int.parse(autoTime)], + featureData: [int.parse(autoTime)], token: getTokenList, needAuthor: 1, publicKey: getPublicKeyList, @@ -151,7 +160,7 @@ class AutomaticBlockingLogic extends BaseGetXController{ dismissEasyLoading(); cancelBlueConnetctToastTimer(); state.sureBtnState.value = 0; - if(state.ifCurrentScreen.value == true){ + if (state.ifCurrentScreen.value == true) { showBlueConnetctToast(); } } @@ -159,36 +168,42 @@ class AutomaticBlockingLogic extends BaseGetXController{ } void ifCanNext() { - if(((state.isOpen.value != (state.lockSetInfoData.value.lockSettingInfo!.autoLock! == 1 ? true : false)) && - (state.autoLockTime.value != state.lockSetInfoData.value.lockSettingInfo!.autoLockSecond!.toString()) && - (state.isJustForShow.value == false)) || ((state.isOpen.value = true) && (state.lockSetInfoData.value.lockSettingInfo!.autoLock! == 1) && - (state.autoLockTime.value != state.lockSetInfoData.value.lockSettingInfo!.autoLockSecond!.toString()) && - (state.isJustForShow.value == false))){ + final int autoLock = state.lockSetInfoData.value.lockSettingInfo!.autoLock!; + final String autoLockSecond = + state.lockSetInfoData.value.lockSettingInfo!.autoLockSecond!.toString(); + final bool openLock = autoLock == 1; + final bool isNotJustForShow = state.isJustForShow.value == false; + final bool isEditAutoLockSecond = + state.autoLockTime.value != autoLockSecond; + + if (!isNotJustForShow) { + //普通用户 + state.canNext.value = false; + return; + } + + if (state.isOpen.value != openLock || isEditAutoLockSecond) { state.canNext.value = true; - }else{ + } else { state.canNext.value = false; } } @override void onReady() { - // TODO: implement onReady super.onReady(); - _initReplySubscription(); + Storage.getAutomaticLockOffTime() + .then((String value) => state.timeController.text = value); } @override void onInit() { - // TODO: implement onInit super.onInit(); - - // _readSupportFunctionsWithParameters(); } @override void onClose() { - // TODO: implement onClose super.onClose(); _replySubscription.cancel(); } diff --git a/lib/main/lockDetail/lockSet/automaticBlocking/automaticBlocking_page.dart b/lib/main/lockDetail/lockSet/automaticBlocking/automaticBlocking_page.dart index 3d03acac..b559145d 100755 --- a/lib/main/lockDetail/lockSet/automaticBlocking/automaticBlocking_page.dart +++ b/lib/main/lockDetail/lockSet/automaticBlocking/automaticBlocking_page.dart @@ -4,9 +4,10 @@ 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/automaticBlocking/automaticBlocking_state.dart'; +import 'package:star_lock/tools/storage.dart'; import '../../../../app_settings/app_colors.dart'; -import '../../../../blue/blue_manage.dart'; import '../../../../tools/appRouteObserver.dart'; import '../../../../tools/commonItem.dart'; import '../../../../tools/showBottomSheetTool.dart'; @@ -22,9 +23,10 @@ class AutomaticBlockingPage extends StatefulWidget { State createState() => _AutomaticBlockingPageState(); } -class _AutomaticBlockingPageState extends State with RouteAware { - final logic = Get.put(AutomaticBlockingLogic()); - final state = Get.find().state; +class _AutomaticBlockingPageState extends State + with RouteAware { + final AutomaticBlockingLogic logic = Get.put(AutomaticBlockingLogic()); + final AutomaticBlockingState state = Get.find().state; @override Widget build(BuildContext context) { @@ -33,85 +35,90 @@ class _AutomaticBlockingPageState extends State with Rout appBar: TitleAppBar( barTitle: TranslationLoader.lanKeys!.automaticBlocking!.tr, haveBack: true, - actionsList: [ + actionsList: [ Obx(() => TextButton( - onPressed: state.canNext.value == false ? null :() { - // if(state.isJustForShow.value == true){ - // return; - // } - // if(state.isCustomLockTime.value == true && state.timeController.text.isEmpty){ - // logic.showToast("请输入自定义时间"); - // return; - // } - - if(state.isOpen.value == false){ - ShowTipView().showIosTipWithContentDialog('关闭后,智能锁将设置为全天常开模式,直到手动关闭'.tr, (){ - logic.sendAutoLock(); - }); - }else{ - logic.sendAutoLock(); - } - }, - child: Text( - state.canNext.value == false ? "" : TranslationLoader.lanKeys!.save!.tr, - style: TextStyle(color: Colors.white, fontSize: 24.sp), - ), - )), + onPressed: state.canNext.value == false + ? null + : () { + if (state.isOpen.value == false) { + ShowTipView().showIosTipWithContentDialog( + '关闭后,智能锁将设置为全天常开模式,直到手动关闭'.tr, + logic.sendAutoLock); + } else { + logic.sendAutoLock(); + } + }, + child: Text( + state.canNext.value == false + ? '' + : TranslationLoader.lanKeys!.save!.tr, + style: TextStyle(color: Colors.white, fontSize: 24.sp), + ), + )), ], backgroundColor: AppColors.mainColor), body: ListView( - children: [ - Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.automaticBlocking!.tr, - isHaveLine: false, - isHaveRightWidget: true, - rightWidget: - SizedBox(width: 60.w, height: 50.h, child: _switch())),), + children: [ + Obx( + () => CommonItem( + leftTitel: TranslationLoader.lanKeys!.automaticBlocking!.tr, + isHaveLine: false, + isHaveRightWidget: true, + rightWidget: + SizedBox(width: 60.w, height: 50.h, child: _switch())), + ), Visibility( - visible: state.isOpen.value == true ? true : false, + visible: state.isOpen.value == true, child: Column( - children: [ - Container(height: 10.h,), - Builder(builder: (context) { + children: [ + Container( + height: 10.h, + ), + Builder(builder: (BuildContext context) { return Obx(() => CommonItem( leftTitel: TranslationLoader.lanKeys!.delayTime!.tr, - rightTitle: state.isCustomLockTime.value == true ? "自定义".tr : (state.autoLockTime.value.isNotEmpty && state.autoLockTime.value != "0") ? "${state.autoLockTime}s" : "", + rightTitle: state.isCustomLockTime.value == true + ? '自定义'.tr + : (state.autoLockTime.value.isNotEmpty && + state.autoLockTime.value != '0') + ? '${state.autoLockTime}s' + : '', isHaveLine: false, isHaveDirection: true, action: () { - if(state.isJustForShow.value == true){ + if (state.isJustForShow.value == true) { return; } - var list = [ - "5", - "10", - "15", - "30", - "60", + final List list = [ + '5', + '10', + '15', + '30', + '60', TranslationLoader.lanKeys!.custom!.tr ]; ShowBottomSheetTool().showSingleRowPicker( - //上下文 + //上下文 context, //默认的索引 normalIndex: 0, title: TranslationLoader.lanKeys!.time!.tr, - cancelTitle: TranslationLoader.lanKeys!.cancel!.tr, + cancelTitle: + TranslationLoader.lanKeys!.cancel!.tr, sureTitle: TranslationLoader.lanKeys!.sure!.tr, //要显示的列表 - //可自定义数据适配器 - //adapter: PickerAdapter(), data: list, //选择事件的回调 - clickCallBack: (int index, var str) { - if(index != 5){ - state.isCustomLockTime.value = false; - state.autoLockTime.value = str.toString(); - }else{ - state.isCustomLockTime.value = true; - } - logic.ifCanNext(); - }); + clickCallBack: (int index, Object str) { + if (index != 5) { + state.isCustomLockTime.value = false; + state.autoLockTime.value = str.toString(); + Storage.saveAutomaticLockOffTime(str.toString()); + } else { + state.isCustomLockTime.value = true; + } + logic.ifCanNext(); + }); })); }), Container(height: 10.h), @@ -122,37 +129,37 @@ class _AutomaticBlockingPageState extends State with Rout padding: EdgeInsets.only( left: 30.w, top: 10.w, right: 30.w, bottom: 10.w), child: Column( - children: [ + children: [ Row( - children: [ + children: [ Text( - "${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.time!.tr}(S)", + '${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.time!.tr}(S)', style: TextStyle(fontSize: 24.sp), ), ], ), Obx(() => TextField( - //输入框一行 - maxLines: 1, - controller: state.timeController, - keyboardType: TextInputType.number, - autofocus: false, - readOnly: state.isJustForShow.value == true ? true : false, - onChanged: (value) { - state.autoLockTime.value = value; - logic.ifCanNext(); - }, - decoration: InputDecoration( - //输入里面输入文字内边距设置 - contentPadding: - const EdgeInsets.only(top: 12.0, bottom: 8.0), - hintText: - "${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.time!.tr}(S)", - hintStyle: TextStyle(fontSize: 24.sp), - //不需要输入框下划线 - border: InputBorder.none, - ), - )), + //输入框一行 + maxLines: 1, + controller: state.timeController, + keyboardType: TextInputType.number, + autofocus: false, + readOnly: state.isJustForShow.value == true, + onChanged: (String value) { + state.autoLockTime.value = value; + logic.ifCanNext(); + }, + decoration: InputDecoration( + //输入里面输入文字内边距设置 + contentPadding: const EdgeInsets.only( + top: 12.0, bottom: 8.0), + hintText: + '${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.time!.tr}(S)', + hintStyle: TextStyle(fontSize: 24.sp), + //不需要输入框下划线 + border: InputBorder.none, + ), + )), Container( height: 0.5.h, color: Colors.grey, @@ -167,7 +174,7 @@ class _AutomaticBlockingPageState extends State with Rout padding: EdgeInsets.all(30.w), child: Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ + children: [ Expanded( child: Text( TranslationLoader.lanKeys!.automaticBlockingTip!.tr, @@ -186,21 +193,19 @@ class _AutomaticBlockingPageState extends State with Rout trackColor: CupertinoColors.systemGrey5, thumbColor: CupertinoColors.white, value: state.isOpen.value, - onChanged: state.isJustForShow.value == true ? null : (value){ - setState(() { - state.isOpen.value = value; - if(state.isOpen.value == false){ - state.autoLockTime.value = ""; - } - logic.ifCanNext(); - }); - }, + onChanged: state.isJustForShow.value == true + ? null + : (bool value) { + setState(() { + state.isOpen.value = value; + logic.ifCanNext(); + }); + }, ); } @override void didChangeDependencies() { - // TODO: implement didChangeDependencies super.didChangeDependencies(); /// 路由订阅 @@ -209,7 +214,6 @@ class _AutomaticBlockingPageState extends State with Rout @override void dispose() { - // TODO: implement dispose /// 取消路由订阅 AppRouteObserver().routeObserver.unsubscribe(this); super.dispose(); @@ -227,7 +231,9 @@ class _AutomaticBlockingPageState extends State with Rout void didPop() { super.didPop(); logic.cancelBlueConnetctToastTimer(); - if (EasyLoading.isShow) EasyLoading.dismiss(animation: true); + if (EasyLoading.isShow) { + EasyLoading.dismiss(animation: true); + } state.ifCurrentScreen.value = false; state.sureBtnState.value = 0; } @@ -244,9 +250,10 @@ class _AutomaticBlockingPageState extends State with Rout void didPushNext() { super.didPushNext(); logic.cancelBlueConnetctToastTimer(); - if (EasyLoading.isShow) EasyLoading.dismiss(animation: true); + if (EasyLoading.isShow) { + EasyLoading.dismiss(animation: true); + } state.ifCurrentScreen.value = false; state.sureBtnState.value = 0; } - } diff --git a/lib/tools/baseGetXController.dart b/lib/tools/baseGetXController.dart index 4c04428c..b20208b3 100755 --- a/lib/tools/baseGetXController.dart +++ b/lib/tools/baseGetXController.dart @@ -98,8 +98,11 @@ class BaseGetXController extends GetxController { "${'操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。'.tr}${isContains == true ? "如果是全自动锁,请使屏幕变亮" : ""}"); } - void showToast(String status, {Function? something}) { - EasyLoading.showToast(status, duration: 2000.milliseconds); + void showToast(String status, + {Function? something, + EasyLoadingMaskType maskType = EasyLoadingMaskType.none}) { + EasyLoading.showToast(status, + duration: 2000.milliseconds, maskType: maskType); if (something != null) { delay(duration: 2100.milliseconds, something: something); } diff --git a/lib/tools/storage.dart b/lib/tools/storage.dart index fdfb542d..09cefe43 100755 --- a/lib/tools/storage.dart +++ b/lib/tools/storage.dart @@ -8,37 +8,35 @@ import 'package:shared_preferences/shared_preferences.dart'; import '../login/login/entity/LoginData.dart'; import '../main/lockMian/entity/lockListInfo_entity.dart'; -const saveBluePublicKey = "BluePublicKey"; -const saveBluePrivateKey = "BluePrivateKey"; -const saveBlueSignKey = "BlueSignKey"; -const saveBlueToken = "BlueGetToken"; -const currentConnectionLockId = "CurrentConnectionLockId"; -const currentConnectionMacAddress = "CurrentConnectionMacAddress"; -const ifIsDemoModeOrNot = "IfIsDemoModeOrNot"; -const isAgreePrivacy = "isAgreePrivacy"; //是否同意隐私协议弹窗 -const isAgreePosition = "isAgreePosition"; //是否同意获取位置弹窗 -const isAgreeCamera = "isAgreeCamera"; //是否同意获取相机/相册弹窗 +const String saveBluePublicKey = 'BluePublicKey'; +const String saveBluePrivateKey = 'BluePrivateKey'; +const String saveBlueSignKey = 'BlueSignKey'; +const String saveBlueToken = 'BlueGetToken'; +const String currentConnectionLockId = 'CurrentConnectionLockId'; +const String currentConnectionMacAddress = 'CurrentConnectionMacAddress'; +const String ifIsDemoModeOrNot = 'IfIsDemoModeOrNot'; +const String isAgreePrivacy = 'isAgreePrivacy'; //是否同意隐私协议弹窗 +const String isAgreePosition = 'isAgreePosition'; //是否同意获取位置弹窗 +const String isAgreeCamera = 'isAgreeCamera'; //是否同意获取相机/相册弹窗 -const isShowUpdateVersion = "isShowUpdateVersion"; //是否更新弹窗 -const saveLockAlias = "saveLockAlias"; //锁别名 -const pushDeviceID = 'pushDeviceID'; //推送设备ID -const saveIsVip = "saveIsVip"; //是否是VIP +const String isShowUpdateVersion = 'isShowUpdateVersion'; //是否更新弹窗 +const String saveLockAlias = 'saveLockAlias'; //锁别名 +const String pushDeviceID = 'pushDeviceID'; //推送设备ID +const String saveIsVip = 'saveIsVip'; //是否是VIP -const saveUserLoginData = "userLoginData"; -const saveLockMainListData = "lockMainListData"; -const isOpenDeBug = "isOpenDeBug"; //是否打开 debug +const String saveUserLoginData = 'userLoginData'; +const String saveLockMainListData = 'lockMainListData'; +const String isOpenDeBug = 'isOpenDeBug'; //是否打开 debug +const String automaticLockOffTime = 'automaticLockOffTime'; //自动关锁时间 class Storage { - Storage._internal(); - factory Storage() => _instance; + Storage._internal(); + static late final Storage _instance = Storage._internal(); - static late SharedPreferences _preferences; - static Future getInstance() async { - _preferences = await SharedPreferences.getInstance(); return _instance; } @@ -73,127 +71,124 @@ class Storage { // } // int - static Future setInt(key, value) async { - SharedPreferences sp = await SharedPreferences.getInstance(); + static Future setInt(String key, dynamic value) async { + final SharedPreferences sp = await SharedPreferences.getInstance(); sp.setInt(key, value); } - static Future getInt(key) async { - SharedPreferences sp = await SharedPreferences.getInstance(); + static Future getInt(String key) async { + final SharedPreferences sp = await SharedPreferences.getInstance(); return sp.getInt(key); } // bool - static Future setBool(key, value) async { - SharedPreferences sp = await SharedPreferences.getInstance(); + static Future setBool(String key, dynamic value) async { + final SharedPreferences sp = await SharedPreferences.getInstance(); sp.setBool(key, value); } - static Future getBool(key) async { - SharedPreferences sp = await SharedPreferences.getInstance(); + static Future getBool(String key) async { + final SharedPreferences sp = await SharedPreferences.getInstance(); return sp.getBool(key); } // double - static Future setDouble(key, value) async { - SharedPreferences sp = await SharedPreferences.getInstance(); + static Future setDouble(String key, dynamic value) async { + final SharedPreferences sp = await SharedPreferences.getInstance(); sp.setDouble(key, value); } - static Future getDouble(key) async { - SharedPreferences sp = await SharedPreferences.getInstance(); + static Future getDouble(String key) async { + final SharedPreferences sp = await SharedPreferences.getInstance(); return sp.getDouble(key); } // string - static Future setString(key, value) async { - SharedPreferences sp = await SharedPreferences.getInstance(); + static Future setString(String key, dynamic value) async { + final SharedPreferences sp = await SharedPreferences.getInstance(); sp.setString(key, value); } - static Future getString(key) async { - SharedPreferences sp = await SharedPreferences.getInstance(); + static Future getString(String key) async { + final SharedPreferences sp = await SharedPreferences.getInstance(); return sp.getString(key); } // 字符串数组 - static Future setStringList(key, value) async { - SharedPreferences sp = await SharedPreferences.getInstance(); + static Future setStringList(String key, dynamic value) async { + final SharedPreferences sp = await SharedPreferences.getInstance(); sp.setStringList(key, value); } - static Future?> getStringList(key) async { - SharedPreferences sp = await SharedPreferences.getInstance(); + static Future?> getStringList(String key) async { + final SharedPreferences sp = await SharedPreferences.getInstance(); return sp.getStringList(key); } // 判断本地是否包含某个key - static Future ifHaveKey(key) async { - SharedPreferences sp = await SharedPreferences.getInstance(); - bool isContainKey = sp.containsKey(key) ?? false; + static Future ifHaveKey(String key) async { + final SharedPreferences sp = await SharedPreferences.getInstance(); + final bool isContainKey = sp.containsKey(key); // AppLog.log(isContainKey); return isContainKey; } // 移除数据 - static Future removeData(key) async { - SharedPreferences sp = await SharedPreferences.getInstance(); + static Future removeData(String key) async { + final SharedPreferences sp = await SharedPreferences.getInstance(); sp.remove(key); } // 移除所有的键值对 static Future clearAll() async { - SharedPreferences sp = await SharedPreferences.getInstance(); + final SharedPreferences sp = await SharedPreferences.getInstance(); sp.clear(); - // 重新设置需要保留的数据 - if (isAgreePrivacy != null) { - //退出登录不清除隐私协议同意状态 - await setString(isAgreePrivacy, isAgreePrivacy); - } + //退出登录不清除隐私协议同意状态 + await setString(isAgreePrivacy, isAgreePrivacy); } static Future getUid() async { - LoginData? loginData = await getLoginData(); - String? uid = loginData!.uid.toString(); + final LoginData? loginData = await getLoginData(); + final String uid = loginData!.uid.toString(); // AppLog.log("pubUid:$uid"); return uid; } static Future getUserid() async { - LoginData? loginData = await getLoginData(); - String? userid = loginData!.userid.toString(); + final LoginData? loginData = await getLoginData(); + final String userid = loginData!.userid.toString(); // AppLog.log("pubUid:$uid"); return userid; } static Future getMobile() async { - LoginData? loginData = await getLoginData(); - String? mobile = loginData!.mobile; + final LoginData? loginData = await getLoginData(); + final String? mobile = loginData!.mobile; return mobile ?? ''; } static Future getEmail() async { - LoginData? loginData = await getLoginData(); - String? email = loginData!.email; + final LoginData? loginData = await getLoginData(); + final String? email = loginData!.email; return email; } static Future getNickname() async { - LoginData? loginData = await getLoginData(); - String? nickname = loginData!.nickname; + final LoginData? loginData = await getLoginData(); + final String? nickname = loginData!.nickname; return nickname; } static Future getHeadUrl() async { - LoginData? loginData = await getLoginData(); - String? headUrl = loginData!.headUrl; + final LoginData? loginData = await getLoginData(); + final String? headUrl = loginData!.headUrl; return headUrl; } static Future getLoginData() async { LoginData? loginData; - final data = await Storage.getString(saveUserLoginData); + final String? data = await Storage.getString(saveUserLoginData); if (data != null && data.isNotEmpty) { loginData = LoginData.fromJson(jsonDecode(data)); } @@ -211,11 +206,21 @@ class Storage { static Future getLockMainListData() async { LockListInfoGroupEntity? lockListInfoGroupEntity; - final data = await Storage.getString(saveLockMainListData); + final String? data = await Storage.getString(saveLockMainListData); if (data != null && data.isNotEmpty) { lockListInfoGroupEntity = LockListInfoGroupEntity.fromJson(jsonDecode(data)); } return lockListInfoGroupEntity; } + + //设置自动关锁时间 + static Future saveAutomaticLockOffTime(String data) async { + await Storage.setString(automaticLockOffTime, data); + } + + static Future getAutomaticLockOffTime() async { + final String data = await Storage.getString(automaticLockOffTime) ?? '0'; + return data; + } } diff --git a/lib/widget/permission/permission_dialog.dart b/lib/widget/permission/permission_dialog.dart index b2f413c0..50d7fab2 100755 --- a/lib/widget/permission/permission_dialog.dart +++ b/lib/widget/permission/permission_dialog.dart @@ -1,5 +1,4 @@ import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:star_lock/app_settings/app_settings.dart'; @@ -7,7 +6,7 @@ import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/translations/trans_lib.dart'; class PermissionDialog { - static Map titles = { + static Map titles = { Permission.camera: '相机'.tr, Permission.photos: '相册'.tr, Permission.storage: '读写'.tr, @@ -17,7 +16,7 @@ class PermissionDialog { Permission.bluetoothConnect: '蓝牙'.tr, }; - static Map contents = { + static Map contents = { Permission.camera: '需要访问相机权限才能拍照上传文件例如头像上传'.tr, Permission.photos: '需要访问相机权限才能使用相册图片上传文件上传头像'.tr, Permission.storage: '需要访问读写权限才能使用本地图片上传头像'.tr, @@ -32,18 +31,18 @@ class PermissionDialog { return false; } bool application = true; - List permissions = [ + final List permissions = [ Permission.bluetooth, Permission.bluetoothScan, Permission.bluetoothConnect, ]; Future getPermissionStatus(List permissions) async { bool isGranted = true; - List permissionStatus = []; - for (Permission per in permissions) { + final List permissionStatus = []; + for (final Permission per in permissions) { permissionStatus.add(await per.status); } - for (PermissionStatus per in permissionStatus) { + for (final PermissionStatus per in permissionStatus) { isGranted = isGranted && per.isGranted; } if (GetPlatform.isIOS) { @@ -52,19 +51,19 @@ class PermissionDialog { return isGranted; } - Permission permission = Permission.bluetoothScan; - dynamic cache = await Storage.getString(titles[permission]); - bool isGranted = await getPermissionStatus(permissions); + const Permission permission = Permission.bluetoothScan; + final dynamic cache = await Storage.getString(titles[permission]!); + final bool isGranted = await getPermissionStatus(permissions); if (GetPlatform.isAndroid && !isGranted && cache is! String) { application = await showCupertinoDialog( context: Get.context!, - builder: (context) { + builder: (BuildContext context) { return PopScope( canPop: false, child: CupertinoAlertDialog( title: Text('${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}'), content: Text(contents[permission] ?? ''), - actions: [ + actions: [ CupertinoDialogAction( child: Text('不允许'.tr), onPressed: () { @@ -83,12 +82,12 @@ class PermissionDialog { ); if (application) { - await Storage.setString(titles[permission], titles[permission]); + await Storage.setString(titles[permission]!, titles[permission]); } } else if (cache is! String) { - await Storage.setString(titles[permission], titles[permission]); + await Storage.setString(titles[permission]!, titles[permission]); } else { - bool isGranted = await getPermissionStatus(permissions); + final bool isGranted = await getPermissionStatus(permissions); if (!isGranted) { showSet(permission); return false; @@ -96,7 +95,7 @@ class PermissionDialog { } if (application) { await permissions.request(); - bool isGranted = await getPermissionStatus(permissions); + final bool isGranted = await getPermissionStatus(permissions); return isGranted; } return false; @@ -107,20 +106,20 @@ class PermissionDialog { if (Get.context == null) { return false; } - bool isAndroid33 = + final bool isAndroid33 = AppPlatform.isAndroid && AppPlatform.getSdkIntValue() >= 33; //通用的局部函数 List requestPermission() { List permissions; if (isAndroid33) { - permissions = [ + permissions = [ Permission.mediaLibrary, Permission.photos, Permission.videos, ]; } else { - permissions = [ + permissions = [ Permission.storage, ]; } @@ -129,7 +128,7 @@ class PermissionDialog { Future permissionStatus(List permissions) async { bool isGranted = true; - for (Permission permission in permissions) { + for (final Permission permission in permissions) { isGranted = isGranted && (await permission.status) == PermissionStatus.granted; } @@ -142,20 +141,20 @@ class PermissionDialog { } bool application = true; - Permission permission = Permission.photos; - List permissions = requestPermission(); - dynamic cache = await Storage.getString(titles[permission]); - bool isGranted = await permissionStatus(permissions); + const Permission permission = Permission.photos; + final List permissions = requestPermission(); + final dynamic cache = await Storage.getString(titles[permission]??''); + final bool isGranted = await permissionStatus(permissions); if (AppPlatform.isAndroid && !isGranted && cache is! String) { application = await showCupertinoDialog( context: Get.context!, - builder: (context) { + builder: (BuildContext context) { return PopScope( canPop: false, child: CupertinoAlertDialog( title: Text('${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}'), content: Text(contents[permission] ?? ''), - actions: [ + actions: [ CupertinoDialogAction( child: Text('不允许'.tr), onPressed: () { @@ -173,18 +172,18 @@ class PermissionDialog { }, ); if (application) { - await Storage.setString(titles[permission], titles[permission]); + await Storage.setString(titles[permission]!, titles[permission]); } } else if (cache is String) { - bool isDenied = !(await permissionStatus(permissions)); + final bool isDenied = !(await permissionStatus(permissions)); if (isDenied) { showSet(permission); return false; } } if (application) { - Map statuses = await permissions.request(); - bool isGranted = await permissionStatus(statuses.keys.toList()); + final Map statuses = await permissions.request(); + final bool isGranted = await permissionStatus(statuses.keys.toList()); return isGranted; } return false; @@ -195,14 +194,14 @@ class PermissionDialog { if (Get.context == null) { return false; } - bool isAndroid33 = + final bool isAndroid33 = AppPlatform.isAndroid && AppPlatform.getSdkIntValue() >= 33; //通用的局部函数 List requestPermission() { List permissions; if (isAndroid33) { - permissions = [ + permissions = [ Permission.mediaLibrary, Permission.photos, // Permission.audio, @@ -210,7 +209,7 @@ class PermissionDialog { Permission.manageExternalStorage, ]; } else { - permissions = [ + permissions = [ Permission.storage, ]; } @@ -219,7 +218,7 @@ class PermissionDialog { Future permissionStatus(List permissions) async { bool isGranted = true; - for (Permission permission in permissions) { + for (final Permission permission in permissions) { isGranted = isGranted && (await permission.status) == PermissionStatus.granted; } @@ -234,20 +233,20 @@ class PermissionDialog { } bool application = true; - Permission permission = Permission.photos; - List permissions = requestPermission(); - dynamic cache = await Storage.getString(titles[permission]); - bool isGranted = await permissionStatus(permissions); + const Permission permission = Permission.photos; + final List permissions = requestPermission(); + final dynamic cache = await Storage.getString(titles[permission]??''); + final bool isGranted = await permissionStatus(permissions); if (AppPlatform.isAndroid && !isGranted && cache is! String) { application = await showCupertinoDialog( context: Get.context!, - builder: (context) { + builder: (BuildContext context) { return PopScope( canPop: false, child: CupertinoAlertDialog( title: Text('${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}'), content: Text('需要访问读写权限才能使用手动升级固件'.tr), - actions: [ + actions: [ CupertinoDialogAction( child: Text('不允许'.tr), onPressed: () { @@ -265,18 +264,18 @@ class PermissionDialog { }, ); if (application) { - await Storage.setString(titles[permission], titles[permission]); + await Storage.setString(titles[permission]??'', titles[permission]); } } else if (cache is String) { - bool isDenied = !(await permissionStatus(permissions)); + final bool isDenied = !(await permissionStatus(permissions)); if (isDenied) { showSet(permission); return false; } } if (application) { - Map statuses = await permissions.request(); - bool isGranted = await permissionStatus(statuses.keys.toList()); + final Map statuses = await permissions.request(); + final bool isGranted = await permissionStatus(statuses.keys.toList()); return isGranted; } return false; @@ -288,18 +287,18 @@ class PermissionDialog { return false; } bool application = true; - PermissionStatus status = await permission.status; - dynamic cache = await Storage.getString(titles[permission]); + final PermissionStatus status = await permission.status; + final dynamic cache = await Storage.getString(titles[permission]??''); if (AppPlatform.isAndroid && !status.isGranted && cache is! String) { application = await showCupertinoDialog( context: Get.context!, - builder: (context) { + builder: (BuildContext context) { return PopScope( canPop: false, child: CupertinoAlertDialog( title: Text('${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}'), content: Text(content ?? contents[permission] ?? ''), - actions: [ + actions: [ CupertinoDialogAction( child: Text('不允许'.tr), onPressed: () { @@ -317,7 +316,7 @@ class PermissionDialog { }, ); if (application) { - await Storage.setString(titles[permission], titles[permission]); + await Storage.setString(titles[permission]??'', titles[permission]); } } else if (cache is String) { if (status.isDenied) { @@ -326,7 +325,7 @@ class PermissionDialog { } } if (application) { - PermissionStatus status = await permission.request(); + final PermissionStatus status = await permission.request(); return status.isGranted; } return false; @@ -339,14 +338,14 @@ class PermissionDialog { } showCupertinoDialog( context: Get.context!, - builder: (context) { + builder: (BuildContext context) { return PopScope( canPop: false, child: CupertinoAlertDialog( title: Text('${titles[permission] ?? ''}${'权限被拒绝'.tr}'), content: Text( '${contents[permission] ?? ''},${'请手动在系统设置中开启'.tr}${titles[permission]}${'权限以继续使用应用'.tr}'), - actions: [ + actions: [ CupertinoDialogAction( child: Text('去设置'.tr), onPressed: () {